source: trunk/libs/newlib/src/newlib/libc/sys/a29khif/sys/fpsymbol.h @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 97.8 KB
Line 
1; @(#)fpsymbol.h        1.4 90/10/14 20:55:59, Copyright 1989, 1990 AMD
2; start of fpsymbol.h file
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4; Copyright 1989, 1990 Advanced Micro Devices, Inc.
5;
6; This software is the property of Advanced Micro Devices, Inc  (AMD)  which
7; specifically  grants the user the right to modify, use and distribute this
8; software provided this notice is not removed or altered.  All other rights
9; are reserved by AMD.
10;
11; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS
12; SOFTWARE.  IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL
13; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR
14; USE OF THIS SOFTWARE.
15;
16; So that all may benefit from your experience, please report  any  problems
17; or  suggestions about this software to the 29K Technical Support Center at
18; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131  in  the  UK,  or
19; 0031-11-1129 in Japan, toll free.  The direct dial number is 512-462-4118.
20;
21; Advanced Micro Devices, Inc.
22; 29K Support Products
23; Mail Stop 573
24; 5900 E. Ben White Blvd.
25; Austin, TX 78741
26; 800-292-9263
27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
28; 
29; ______________________________________________________________________
30;|______________________________________________________________________|
31;|                                                                      |
32;|             SYMBOLS FOR DEFINING THE INSTRUCTION WORD                |
33;|                                                                      |
34;|______________________________________________________________________|
35;|______________________________________________________________________|
36;
37;
38; Revision Information:
39;------------------------------------------------------------------------
40; Date: March 31, 1989
41; Author: Roy Carlson per Bob Perlman and Richard Relph
42;
43; The symbols section describing transactions was modified to contain
44; several new symbol values.  The reason for the change was to force the
45; CA bit to be set--and remain set--once code accesses the coprocessor. 
46;
47; Future operating systems will use the Coprocessor Active (CA) bit in
48; the Old Processor Status Register to determine whether or not to save
49; coprocessor state, etc..  This means that the instruction control field
50; Set Coprocessor Active (SA) bit should be used as follows:
51; 
52;       (1) any coprocessor STORE must have its SA bit set to 1, 
53;               so as to set CA,
54; 
55; and   (2) any coprocessor LOAD must have its SA bit set to 0, 
56;               so as to prevent clearing CA.
57;------------------------------------------------------------------------
58; Date: 89/01/30 12:32:13;  author: jim;  lines added/del: 5/4
59; Corrected CP_IEEE_GRADUAL_UFLOW_MODE and CP_RMS_MASK.
60; Added CP_EXCPS_POSITION, the ls bit of the CP_XXX_EXCP ensemble.
61; fixed a few typos in comments.
62;------------------------------------------------------------------------
63; Date: 89/01/23 18:00:26;  author: jim;  lines added/del: 488/468
64; Richard O. Parker
65; January 5, 1989
66; 
67; 1) The _cp_prec_field in the "cp_build_inst", "cp_build_inst_h"
68;    and "cp_build_inst_l" macros was not being defined in the case
69;    of Am29K-supported floating-point instructions (e.g., FADD, FSUB,
70;    DADD, etc.).
71; 
72; 2) The multiplexor select codes in the opcode table entries
73;    associated with the "cp_build_inst", "cp_build_inst_h" and
74;    "cp_build_inst_l" macros, pertaining to the CONVERT_F_TO_D
75;    and CONVERT_D_TO_F instructions were incorrect.
76;------------------------------------------------------------------------
77; Date: 88/12/20 14:28:26;  author: jim;  lines added/del: 1/1
78; Larry Westerman corrected definition of CP_MOVE_P.
79; Version required for Release 1.1 of the Intrinsics shipped 12/12/88.
80;------------------------------------------------------------------------
81; Date: 88/11/18 15:44:45;  author: law; 
82; Initial revision
83;
84;
85;========================================================================
86;
87; The following mnemonics are used to specify the 14 LSBs of the
88; instruction word (fields SIP, SIQ, SIT, SIF, IF, and CO).
89;
90;========================================================================
91;
92;  floating point operation codes.
93;
94   .equ  CP_PASS_P,               0x00000000  ;  pass P
95   .equ  CP_MINUSP,               0x00000040  ; -P
96   .equ  CP_ABSP,                 0x00000080  ; |P|
97   .equ  CP_SIGNT_TIMES_ABSP,     0x00000C00  ; SIGN(T) * |P|
98;
99   .equ  CP_P_PLUS_T,             0x00000001  ;  P + T
100   .equ  CP_P_MINUS_T,            0x00000101  ;  P - T
101   .equ  CP_MINUSP_PLUS_T,        0x00001001  ; -P + T
102   .equ  CP_MINUSP_MINUS_T,       0x00001101  ; -P - T
103   .equ  CP_ABS_P_PLUS_T,         0x00000081  ; |P + T|
104   .equ  CP_ABS_P_MINUS_T,        0x00000181  ; |P - T|
105   .equ  CP_ABSP_PLUS_ABST,       0x00002201  ; |P| + |T|
106   .equ  CP_ABSP_MINUS_ABST,      0x00002301  ; |P| - |T|
107   .equ  CP_ABS_ABSP_MINUS_ABST,  0x00002381  ; ||P| - |T||
108;
109   .equ  CP_P_TIMES_Q,            0x00000002  ;  P * Q
110   .equ  CP_MINUSP_TIMES_Q,       0x00001002  ; -P * Q
111   .equ  CP_ABS_P_TIMES_Q,        0x00000082  ; |P * Q|
112;
113   .equ  CP_COMPARE_P_AND_T,      0x00000103  ; compare P and T
114;
115   .equ  CP_MAX_P_AND_T,          0x00000104  ; max P,T
116   .equ  CP_MAX_ABSP_AND_ABST,    0x00002304  ; max |P|, |T|
117;
118   .equ  CP_MIN_P_AND_T,          0x00001005  ; min P,T
119   .equ  CP_MIN_ABSP_AND_ABST,    0x00003205  ; min |P|,|T|
120   .equ  CP_LIMIT_P_TO_MAGT,      0x00003A05  ; limit P to magnitude of T
121;
122   .equ  CP_CONVERT_T_TO_INT,     0x00000006  ; convert T to integer
123;
124   .equ  CP_SCALE_T_TO_INT_BY_Q,  0x00000007  ; scale T to integer by Q
125;
126   .equ  CP_PQ_PLUS_T,            0x00000008  ; (P * Q) + T
127   .equ  CP_MINUSPQ_PLUS_T,       0x00001008  ; (-P * Q) + T
128   .equ  CP_PQ_MINUS_T,           0x00000108  ; (P * Q) - T
129   .equ  CP_MINUSPQ_MINUS_T,      0x00001108  ; (-P * Q) - T
130   .equ  CP_ABSPQ_PLUS_ABST,      0x00002A08  ; |(P * Q)| + T
131   .equ  CP_MINUSABSPQ_PLUS_ABST, 0x00003A08  ;-|(P * Q)| + T
132   .equ  CP_ABSPQ_MINUS_ABST,     0x00002B08  ; |(P * Q)| - |T|
133;
134   .equ  CP_ROUND_T_TO_INT,       0x00000009  ; round T to integral value
135;
136   .equ  CP_RECIPROCAL_OF_P,      0x0000000A  ; reciprocal of P
137;
138   .equ  CP_CONVERT_T_TO_ALT,     0x0000000B  ; convert T to alt. f.p. format
139   .equ  CP_CONVERT_T_FROM_ALT,   0x0000000C  ; convert T to alt. f.p. format
140;
141;
142;  integer operation codes.
143;
144   .equ  CP_I_PASS_P,             0x00000020  ; integer pass P
145   .equ  CP_I_MINUSP,             0x00000060  ; integer -P
146   .equ  CP_I_ABSP,               0x000000A0  ; integer |P|
147   .equ  CP_I_SIGNT_TIMES_ABSP,   0x00000C20  ; integer SIGN(T) * |P|
148;
149   .equ  CP_I_P_PLUS_T,           0x00000021  ; integer P + T
150   .equ  CP_I_P_MINUS_T,          0x00000121  ; integer P - T
151   .equ  CP_I_MINUSP_PLUS_T,      0x00001021  ; integer -P + T
152   .equ  CP_I_ABS_P_PLUS_T,       0x000000A1  ; integer |P + T|
153   .equ  CP_I_ABS_P_MINUS_T,      0x000001A1  ; integer |P - T|
154;
155   .equ  CP_I_P_TIMES_Q,          0x00000022  ; integer P * Q
156;
157   .equ  CP_I_COMPARE_P_AND_T,    0x00000123  ; integer compare P and T
158;
159   .equ  CP_I_MAX_P_AND_T,        0x00000124  ; integer max P,T
160;
161   .equ  CP_I_MIN_P_AND_T,        0x00001025  ; integer min P,T
162;
163   .equ  CP_I_CONVERT_T_TO_FLOAT, 0x00000026  ; integer convert T to f.p.
164;
165   .equ  CP_I_SCALE_T_TO_FLOAT_BY_Q, 0x00000027  ; integer scale T to f.p. by Q
166;
167   .equ  CP_I_P_OR_T,             0x00000030  ; integer P OR T
168;
169   .equ  CP_I_P_AND_T,            0x00000031  ; integer P AND T
170;
171   .equ  CP_I_P_XOR_T,            0x00000032  ; integer P XOR T
172;
173   .equ  CP_I_NOT_T,              0x00000032  ; integer NOT T
174;
175   .equ  CP_I_LSHIFT_P_BY_Q,      0x00000033  ; integer logical shift P by Q
176;                                               places
177;
178   .equ  CP_I_ASHIFT_P_BY_Q,      0x00000034  ; integer arith. shift P by Q
179;                                               places
180;
181   .equ  CP_I_FSHIFT_PT_BY_Q,     0x00000035  ; integer funnel shift PT by Q
182;                                               places
183;
184;
185; move instruction (f.p. or integer)
186;
187   .equ  CP_MOVE_P,               0x00000018  ; move operand P
188;
189;
190;========================================================================
191;
192;  precision codes for the the operands in registers R and S, and for
193;  the result (instruction word fields IPR, RPR).
194;
195;========================================================================
196;
197;
198   .equ  CP_D_S,                  0x00008000  ;Double result, single input(s)
199   .equ  CP_S_D,                  0x00004000  ;Single result, double input(s)
200   .equ  CP_D_D,                  0x00000000  ;Double result, double input(s)
201   .equ  CP_S_S,                  0x0000C000  ;Single result, single input(s)
202;
203;========================================================================
204;
205; The following mnemonics are used to specify the 16 LSBs of an Am29027
206; instruction word for floating-point instructions supported by the
207; Am29000 instruction set.
208;
209;========================================================================
210;
211   .equ  CP_FADD,                 0x0000C001
212   .equ  CP_DADD,                 0x00000001
213   .equ  CP_FSUB,                 0x0000C101
214   .equ  CP_DSUB,                 0x00000101
215   .equ  CP_FMUL,                 0x0000C002
216   .equ  CP_DMUL,                 0x00000002
217   .equ  CP_FEQ,                  0x0000C103
218   .equ  CP_DEQ,                  0x00000103
219   .equ  CP_FGE,                  0x0000C103
220   .equ  CP_DGE,                  0x00000103
221   .equ  CP_FGT,                  0x0000C103
222   .equ  CP_DGT,                  0x00000103
223   .equ  CP_CONVERT_I_TO_F,       0x0000C026  ; CONVERT (int -> s.p.)
224   .equ  CP_CONVERT_I_TO_D,       0x00008026  ; CONVERT (int -> d.p.)
225   .equ  CP_CONVERT_F_TO_I,       0x0000C006  ; CONVERT (s.p.-> int)
226   .equ  CP_CONVERT_D_TO_I,       0x00004006  ; CONVERT (d.p.-> int)
227   .equ  CP_CONVERT_F_TO_D,       0x00008000  ; CONVERT (s.p.-> d.p.)
228   .equ  CP_CONVERT_D_TO_F,       0x00004000  ; CONVERT (d.p.-> s.p.)
229;
230;
231;========================================================================
232;
233;  operand select codes (instruction word fields PMS, QMS, TMS).
234;
235;========================================================================
236;
237;
238   .equ  CP_P_EQ_R,               0x00000000
239   .equ  CP_P_EQ_S,               0x01000000
240   .equ  CP_P_EQ_0,               0x02000000
241   .equ  CP_P_EQ_ONE_HALF,        0x03000000
242   .equ  CP_P_EQ_IMINUS1,         0x03000000
243   .equ  CP_P_EQ_1,               0x04000000
244   .equ  CP_P_EQ_2,               0x05000000
245   .equ  CP_P_EQ_3,               0x06000000
246   .equ  CP_P_EQ_PI,              0x07000000
247   .equ  CP_P_EQ_IMINUSMAX,       0x07000000
248   .equ  CP_P_EQ_RF0,             0x08000000
249   .equ  CP_P_EQ_RF1,             0x09000000
250   .equ  CP_P_EQ_RF2,             0x0A000000
251   .equ  CP_P_EQ_RF3,             0x0B000000
252   .equ  CP_P_EQ_RF4,             0x0C000000
253   .equ  CP_P_EQ_RF5,             0x0D000000
254   .equ  CP_P_EQ_RF6,             0x0E000000
255   .equ  CP_P_EQ_RF7,             0x0F000000
256;
257   .equ  CP_Q_EQ_R,               0x00000000
258   .equ  CP_Q_EQ_S,               0x00100000
259   .equ  CP_Q_EQ_0,               0x00200000
260   .equ  CP_Q_EQ_ONE_HALF,        0x00300000
261   .equ  CP_Q_EQ_IMINUS1,         0x00300000
262   .equ  CP_Q_EQ_1,               0x00400000
263   .equ  CP_Q_EQ_2,               0x00500000
264   .equ  CP_Q_EQ_3,               0x00600000
265   .equ  CP_Q_EQ_PI,              0x00700000
266   .equ  CP_Q_EQ_IMINUSMAX,       0x00700000
267   .equ  CP_Q_EQ_RF0,             0x00800000
268   .equ  CP_Q_EQ_RF1,             0x00900000
269   .equ  CP_Q_EQ_RF2,             0x00A00000
270   .equ  CP_Q_EQ_RF3,             0x00B00000
271   .equ  CP_Q_EQ_RF4,             0x00C00000
272   .equ  CP_Q_EQ_RF5,             0x00D00000
273   .equ  CP_Q_EQ_RF6,             0x00E00000
274   .equ  CP_Q_EQ_RF7,             0x00F00000
275;
276   .equ  CP_T_EQ_R,               0x00000000
277   .equ  CP_T_EQ_S,               0x00010000
278   .equ  CP_T_EQ_0,               0x00020000
279   .equ  CP_T_EQ_ONE_HALF,        0x00030000
280   .equ  CP_T_EQ_IMINUS1,         0x00030000
281   .equ  CP_T_EQ_1,               0x00040000
282   .equ  CP_T_EQ_2,               0x00050000
283   .equ  CP_T_EQ_3,               0x00060000
284   .equ  CP_T_EQ_PI,              0x00070000
285   .equ  CP_T_EQ_IMINUSMAX,       0x00070000
286   .equ  CP_T_EQ_RF0,             0x00080000
287   .equ  CP_T_EQ_RF1,             0x00090000
288   .equ  CP_T_EQ_RF2,             0x000A0000
289   .equ  CP_T_EQ_RF3,             0x000B0000
290   .equ  CP_T_EQ_RF4,             0x000C0000
291   .equ  CP_T_EQ_RF5,             0x000D0000
292   .equ  CP_T_EQ_RF6,             0x000E0000
293   .equ  CP_T_EQ_RF7,             0x000F0000
294;
295;
296;========================================================================
297;
298;  destination select codes (instruction word fields RF, RFS)
299;
300;========================================================================
301;
302;
303   .equ  CP_DEST_EQ_GP,           0x00000000
304   .equ  CP_DEST_EQ_RF0,          0x80000000
305   .equ  CP_DEST_EQ_RF1,          0x90000000
306   .equ  CP_DEST_EQ_RF2,          0xA0000000
307   .equ  CP_DEST_EQ_RF3,          0xB0000000
308   .equ  CP_DEST_EQ_RF4,          0xC0000000
309   .equ  CP_DEST_EQ_RF5,          0xD0000000
310   .equ  CP_DEST_EQ_RF6,          0xE0000000
311   .equ  CP_DEST_EQ_RF7,          0xF0000000
312;
313;
314; ______________________________________________________________________
315;|______________________________________________________________________|
316;|                                                                      |
317;|    SYMBOLS FOR DEFINING THE MODE REGISTER DOUBLE WORD                |
318;|                                                                      |
319;|______________________________________________________________________|
320;|______________________________________________________________________|
321;
322;
323;
324    .equ  CP_PFF_MASK,            0x00000003  ; primary f.p. format mask
325    .equ  CP_PFF_EQ_IEEE,         0x00000000  ; primary f.p. format = IEEE
326    .equ  CP_PFF_EQ_DECD,         0x00000001  ; primary f.p. format = DEC D
327    .equ  CP_PFF_EQ_DECG,         0x00000002  ; primary f.p. format = DEC G
328    .equ  CP_PFF_EQ_IBM,          0x00000003  ; primary f.p. format = IBM
329    .equ  CP_PFF_POSITION,        0
330;
331    .equ  CP_AFF_MASK,            0x0000000C  ; alternate f.p. format mask
332    .equ  CP_AFF_EQ_IEEE,         0x00000000  ; alternate f.p. format = IEEE
333    .equ  CP_AFF_EQ_DECD,         0x00000004  ; alternate f.p. format = DEC D
334    .equ  CP_AFF_EQ_DECG,         0x00000008  ; alternate f.p. format = DEC G
335    .equ  CP_AFF_EQ_IBM,          0x0000000C  ; alternate f.p. format = IBM
336    .equ  CP_AFF_POSITION,        2
337;
338    .equ  CP_SAT_MASK,            0x00000010  ; saturate mode (SAT) mask
339    .equ  CP_SATURATE_MODE,       0x00000010  ; enable saturate mode (SAT=1)
340    .equ  CP_SAT_POSITION,        4
341;
342    .equ  CP_AP_MASK,             0x00000020  ; affine/proj. mode (AP) mask
343    .equ  CP_AFFINE_MODE,         0x00000020  ; enable affine mode (AP=1)
344    .equ  CP_PROJECTIVE_MODE,     0x00000000  ; enable projective mode (AP=0)
345    .equ  CP_AP_POSITION,         5
346;
347    .equ  CP_TRP_MASK,            0x00000040  ; IEEE trap mode (TRP) mask
348    .equ  CP_IEEE_TRAPS_ENABLED,  0x00000040  ; IEEE trap mode enabled (TRP=1)
349    .equ  CP_IEEE_TRAPS_DISABLED, 0x00000000  ; IEEE trap mode disabled (TRP=0)
350    .equ  CP_TRP_POSITION,        6
351;
352    .equ  CP_SU_MASK,                0x00000080  ; IEEE sud. uflow (SU) mask
353    .equ  CP_IEEE_SUDDEN_UFLOW_MODE, 0x00000080  ; IEEE sud. uflow mode (SU=1)
354    .equ  CP_IEEE_GRADUAL_UFLOW_MODE,0x00000000  ; IEEE grad uflow mode (SU=0)
355    .equ  CP_SU_POSITION,            7
356;
357    .equ  CP_BS_MASK,             0x00000100  ; IBM sig. mask (BS)
358    .equ  CP_BS_POSITION,         8
359;
360    .equ  CP_BU_MASK,             0x00000200  ; IBM underflow mask (BU)
361    .equ  CP_BU_POSITION,         9
362;
363    .equ  CP_MS_MASK,                0x00000800  ; signed int. mpy (MS) mask
364    .equ  CP_SIGNED_INT_MPY_MODE,    0x00000800  ; signed int. mpy mode (MS=1)
365    .equ  CP_UNSIGNED_INT_MPY_MODE,  0x00000000  ; unsigned int. mpy mode (MS=0)
366    .equ  CP_MS_POSITION,            11
367;
368    .equ  CP_MF_MASK,             0x00003000  ; int. mult. fmt. mode (MF) mask
369    .equ  CP_MF_EQ_LSBS,          0x00000000  ; int. mult. fmt. = LSBs
370    .equ  CP_MF_EQ_LSBSFA,        0x00001000  ; int. mult. fmt. = LSBs,fmt. adj.
371    .equ  CP_MF_EQ_MSBS,          0x00002000  ; int. mult. fmt. = MSBs
372    .equ  CP_MF_EQ_MSBSFA,        0x00003000  ; int. mult. fmt. = MSBs,fmt. adj.
373    .equ  CP_MF_POSITION,         12
374;
375    .equ  CP_RMS_MASK,            0x0001C000  ; round mode (RMS) mask
376    .equ  CP_RMS_EQ_NEAREST,      0x00000000  ; round mode = to nearest
377    .equ  CP_RMS_EQ_MINUS_INF,    0x00004000  ; round mode = toward -oo
378    .equ  CP_RMS_EQ_PLUS_INF,     0x00008000  ; round mode = toward +oo
379    .equ  CP_RMS_EQ_ZERO,         0x0000C000  ; round mode = toward zero
380    .equ  CP_RMS_POSITION,        14
381;
382    .equ  CP_PL_MASK,             0x00100000  ; pipeline mode (PL) mask
383    .equ  CP_FLOWTHROUGH_MODE,    0x00000000  ; select flow-through mode
384    .equ  CP_PIPELINE_MODE,       0x00100000  ; select pipeline mode
385    .equ  CP_PL_POSITION,         20
386;
387    .equ  CP_INVALID_OP_EXCP_MASK, 0x00400000  ; invalid operation excp. mask(IM)
388    .equ  CP_RESERVED_OP_EXCP_MASK,0x00800000  ; reserved operand excp. mask(RM)
389    .equ  CP_OVERFLOW_EXCP_MASK,   0x01000000  ; overflow exception mask (VM)
390    .equ  CP_UNDERFLOW_EXCP_MASK,  0x02000000  ; underflow exception mask(UM)
391    .equ  CP_INEXACT_EXCP_MASK,    0x04000000  ; inexact result excp. mask(XM)
392    .equ  CP_ZERO_EXCP_MASK,       0x08000000  ; zero result exception mask (ZM)
393    .equ  CP_EXCPS_POSITION,       22
394;
395    .equ  CP_PLTC_MASK,           0x0000000F  ; pipeline timer count (PLTC) mask
396    .equ  CP_PLTC_EQ_2,           0x00000002  ; pipeline timer count = 2
397    .equ  CP_PLTC_EQ_3,           0x00000003  ; pipeline timer count = 3
398    .equ  CP_PLTC_EQ_4,           0x00000004  ; pipeline timer count = 4
399    .equ  CP_PLTC_EQ_5,           0x00000005  ; pipeline timer count = 5
400    .equ  CP_PLTC_EQ_6,           0x00000006  ; pipeline timer count = 6
401    .equ  CP_PLTC_EQ_7,           0x00000007  ; pipeline timer count = 7
402    .equ  CP_PLTC_EQ_8,           0x00000008  ; pipeline timer count = 8
403    .equ  CP_PLTC_EQ_9,           0x00000009  ; pipeline timer count = 9
404    .equ  CP_PLTC_EQ_10,          0x0000000A  ; pipeline timer count = 10
405    .equ  CP_PLTC_EQ_11,          0x0000000B  ; pipeline timer count = 11
406    .equ  CP_PLTC_EQ_12,          0x0000000C  ; pipeline timer count = 12
407    .equ  CP_PLTC_EQ_13,          0x0000000D  ; pipeline timer count = 13
408    .equ  CP_PLTC_EQ_14,          0x0000000E  ; pipeline timer count = 14
409    .equ  CP_PLTC_EQ_15,          0x0000000F  ; pipeline timer count = 15
410    .equ  CP_PLTC_POSITION,       0
411;
412    .equ  CP_MATC_MASK,           0x000000F0  ; mpy-acc timer count (MATC) mask
413    .equ  CP_MATC_EQ_2,           0x00000020  ; mpy-acc timer count = 2
414    .equ  CP_MATC_EQ_3,           0x00000030  ; mpy-acc timer count = 3
415    .equ  CP_MATC_EQ_4,           0x00000040  ; mpy-acc timer count = 4
416    .equ  CP_MATC_EQ_5,           0x00000050  ; mpy-acc timer count = 5
417    .equ  CP_MATC_EQ_6,           0x00000060  ; mpy-acc timer count = 6
418    .equ  CP_MATC_EQ_7,           0x00000070  ; mpy-acc timer count = 7
419    .equ  CP_MATC_EQ_8,           0x00000080  ; mpy-acc timer count = 8
420    .equ  CP_MATC_EQ_9,           0x00000090  ; mpy-acc timer count = 9
421    .equ  CP_MATC_EQ_10,          0x000000A0  ; mpy-acc timer count = 10
422    .equ  CP_MATC_EQ_11,          0x000000B0  ; mpy-acc timer count = 11
423    .equ  CP_MATC_EQ_12,          0x000000C0  ; mpy-acc timer count = 12
424    .equ  CP_MATC_EQ_13,          0x000000D0  ; mpy-acc timer count = 13
425    .equ  CP_MATC_EQ_14,          0x000000E0  ; mpy-acc timer count = 14
426    .equ  CP_MATC_EQ_15,          0x000000F0  ; mpy-acc timer count = 15
427    .equ  CP_MATC_POSITION,       4
428;
429    .equ  CP_MVTC_MASK,           0x00000F00  ; MOVE P timer count (MVTC) mask
430    .equ  CP_MVTC_EQ_2,           0x00000200  ; MOVE P timer count = 2
431    .equ  CP_MVTC_EQ_3,           0x00000300  ; MOVE P timer count = 3
432    .equ  CP_MVTC_EQ_4,           0x00000400  ; MOVE P timer count = 4
433    .equ  CP_MVTC_EQ_5,           0x00000500  ; MOVE P timer count = 5
434    .equ  CP_MVTC_EQ_6,           0x00000600  ; MOVE P timer count = 6
435    .equ  CP_MVTC_EQ_7,           0x00000700  ; MOVE P timer count = 7
436    .equ  CP_MVTC_EQ_8,           0x00000800  ; MOVE P timer count = 8
437    .equ  CP_MVTC_EQ_9,           0x00000900  ; MOVE P timer count = 9
438    .equ  CP_MVTC_EQ_10,          0x00000A00  ; MOVE P timer count = 10
439    .equ  CP_MVTC_EQ_11,          0x00000B00  ; MOVE P timer count = 11
440    .equ  CP_MVTC_EQ_12,          0x00000C00  ; MOVE P timer count = 12
441    .equ  CP_MVTC_EQ_13,          0x00000D00  ; MOVE P timer count = 13
442    .equ  CP_MVTC_EQ_14,          0x00000E00  ; MOVE P timer count = 14
443    .equ  CP_MVTC_EQ_15,          0x00000F00  ; MOVE P timer count = 15
444    .equ  CP_MVTC_POSITION,       8
445;
446    .equ  CP_AD_MASK,             0x00001000  ;
447    .equ  CP_ADVANCE_DRDY_MODE,   0x00001000  ;
448    .equ  CP_NORMAL_DRDY_MODE,    0x00000000  ;
449    .equ  CP_AD_POSITION,         12
450;
451    .equ  CP_HE_MASK,               0x00002000  ; Halt-on-error mask (HE)
452    .equ  CP_HALT_ON_ERROR_ENABLED, 0x00002000  ; Halt-on-error enabled (HE=1)
453    .equ  CP_HALT_ON_ERROR_DISABLED,0x00000000  ; Halt-on-error disabled (HE=0)
454    .equ  CP_HE_POSITION,           13
455;
456    .equ  CP_EX_MASK,             0x00004000  ; EXCP enable mask (EX)
457    .equ  CP_EXCP_ENABLED,        0x00004000  ; EXCP enabled (EX=1)
458    .equ  CP_EXCP_DISABLED,       0x00000000  ; EXCP disabled (EX=0)
459    .equ  CP_EX_POSITION,         14
460;
461;
462;
463; ______________________________________________________________________
464;|______________________________________________________________________|
465;|                                                                      |
466;|      SYMBOLS FOR DEFINING THE STATUS REGISTER WORD                   |
467;|                                                                      |
468;|______________________________________________________________________|
469;|______________________________________________________________________|
470;
471;
472   .equ CP_INVALID_OP_EXCP,           0x00000001
473   .equ CP_INVALID_OP_EXCP_POSITION,  0
474;
475   .equ CP_RESERVED_OP_EXCP,          0x00000002
476   .equ CP_RESERVED_OP_EXCP_POSITION, 1
477;
478   .equ CP_OVERFLOW_EXCP,             0x00000004
479   .equ CP_OVERFLOW_EXCP_POSITION,    2
480;
481   .equ CP_UNDERFLOW_EXCP,            0x00000008
482   .equ CP_UNDERFLOW_EXCP_POSITION,   3
483;
484   .equ CP_INEXACT_EXCP,              0x00000010
485   .equ CP_INEXACT_EXCP_POSITION,     4
486;
487   .equ CP_ZERO_EXCP,                 0x00000020
488   .equ CP_ZERO_EXCP_POSITION,        5
489;
490   .equ CP_EXCP_STATUS_MASK,          0x00000040
491   .equ CP_EXCP_STATUS_FLAG_POSITION, 6
492;
493   .equ CP_R_TEMP_VALID_MASK,         0x00000080
494   .equ R_TEMP_VALID_POSITION,        7
495;
496   .equ CP_S_TEMP_VALID_MASK,         0x00000100
497   .equ CP_S_TEMP_VALID_POSITION,     8
498;
499   .equ CP_I_TEMP_VALID_FLAG,         0x00000200
500   .equ CP_I_TEMP_VALID_POSITION,     9
501;
502   .equ CP_OPERATION_PENDING_MASK,    0x00000400
503   .equ CP_OPERATION_PENDING_POSITION,10
504;
505;
506; ______________________________________________________________________
507;|______________________________________________________________________|
508;|                                                                      |
509;|      SYMBOLS FOR DEFINING THE FLAG REGISTER WORD                     |
510;|                                                                      |
511;|______________________________________________________________________|
512;|______________________________________________________________________|
513;
514;
515   .equ CP_INVALID_OP_FLAG,           0x00000001
516   .equ CP_INVALID_OP_FLAG_POSITION,  0
517;
518   .equ CP_CARRY_FLAG,                0x00000001
519   .equ CP_CARRY_FLAG_POSITION,       0
520;
521   .equ CP_RESERVED_OP_FLAG,          0x00000002
522   .equ CP_RESERVED_OP_FLAG_POSITION, 1
523;
524   .equ CP_OVERFLOW_FLAG,             0x00000004
525   .equ CP_OVERFLOW_FLAG_POSITION,    2
526;
527   .equ CP_UNORDERED_FLAG,            0x00000004
528   .equ CP_UNORDERED_FLAG_POSITION,   2
529;
530   .equ CP_UNDERFLOW_FLAG,            0x00000008
531   .equ CP_UNDERFLOW_FLAG_POSITION,   3
532;
533   .equ CP_LESS_THAN_FLAG,            0x00000008
534   .equ CP_LESS_THAN_POSITION,        3
535;
536   .equ CP_WINNER_FLAG,               0x00000008
537   .equ CP_WINNER_FLAG_POSITION,      3
538;
539   .equ CP_INEXACT_FLAG,              0x00000010
540   .equ CP_INEXACT_FLAG_POSITION,     4
541;
542   .equ CP_GREATER_THAN_FLAG,         0x00000010
543   .equ CP_GREATER_THAN_FLAG_POSITION,4
544;
545   .equ CP_ZERO_FLAG,                 0x00000020
546   .equ CP_ZERO_FLAG_POSITION,        5
547;
548   .equ CP_EQUAL_FLAG,                0x00000020
549   .equ CP_EQUAL_FLAG_POSITION,       5
550;
551   .equ CP_SIGN_FLAG,                 0x00000040
552   .equ CP_SIGN_FLAG_POSITION,        6
553;
554;
555; ______________________________________________________________________
556;|______________________________________________________________________|
557;|                                                                      |
558;|                 SYMBOLS FOR TRANSACTION REQUEST TYPES                |
559;|                                                                      |
560;|______________________________________________________________________|
561;|______________________________________________________________________|
562;
563;
564; write requests
565;
566; Note: Each WRITE_* transaction request, plus ADV_TEMPS sets the CA
567; (Coprocessor Active) bit in the 29000 Current Processor Status Register.
568;
569   .equ  CP_WRITE_R,              0x20  ;write sing or doub to R register
570   .equ  CP_WRITE_S,              0x21  ;write sing or doub to S register
571   .equ  CP_WRITE_RS,             0x22  ;write sing operands to R and S
572   .equ  CP_WRITE_MODE,           0x23  ;write mode double word to 29027
573   .equ  CP_WRITE_STATUS,         0x24  ;write status word to 29027
574   .equ  CP_WRITE_PREC,           0x25  ;write reg. file precision word
575                                        ; to 29027
576   .equ  CP_WRITE_INST,           0x26  ;write instruction to 29027
577   .equ  CP_ADV_TEMPS,            0x27  ;move R-Temp, S-Temp into R,S
578;
579; read requests
580;
581   .equ  CP_READ_MSBS,            0x00  ;read sing result or MSB of doub
582   .equ  CP_READ_LSBS,            0x01  ;read LSB of doub result
583   .equ  CP_READ_FLAGS,           0x02  ;read 29027 flag register
584   .equ  CP_READ_STATUS,          0x03  ;read 29027 status register
585   .equ  CP_SAVE_STATE,           0x04  ;read one word of 29027 state
586;
587; "start operation" symbol; this is "OR"ed with a WRITE_R, WRITE_S,
588;    WRITE_RS, or WRITE_INST symbol.
589;
590
591   .equ  CP_START,                0b1000000  ;bit to start 29027 operation
592;
593; "suppress exceptions reporting" symbol; this is "OR"ed with a ed
594;
595;
596
597   .equ  CP_NO_ERR,               0b1000000  ;suppress exception reporting
598;                                            ;   during load.
599;       cp_write_r       - transfers 32- or 64-bit operand to Am29027
600;                          register R
601;       cp_write_s       - transfers 32- or 64-bit operand to Am29027
602;                          register S
603;       cp_write_rs      - transfers two 32-bit floating-point operands to
604;                          Am29027 registers R and S
605;       cp_write_prec    - transfers a word to the Am29027 precision register
606;       cp_write_status  - transfers a word to the Am29027 status register
607;       cp_write_inst    - transfers an instruction to the Am29027
608;                          instruction register
609;       cp_advance_temps - transfers the contents of the Am29027 temporary
610;                          registers to the corresponding working registers
611;       cp_write_mode    - transfers a mode specification the the Am29027
612;                          mode register
613;       cp_read_dp       - read a double-precision floating-point result
614;                          from the Am29027
615;       cp_read_sp       - read a single-precision floating-point result
616;                          from the Am29027
617;       cp_read_int      - read an integer result from the Am29027
618;       cp_read_flags    - read the contents of the Am29027 flag register
619;       cp_read_status   - read the contents of the Am29027 status register
620;       cp_read_state_wd - read a single Am29027 state word
621;       cp_save_state    - save Am29027 state
622;       cp_restore_state - restore Am29027 state
623;       cp_build_inst    - build an Am29027 instruction
624;       cp_build_inst_h  - build 16 MSBs of an Am29027 instruction
625;       cp_build_inst_l  - build 16 LSBs of an Am29027 instruction
626;
627;
628;
629;============================================================================
630;  MACRO NAME: cp_write_r
631;
632;  WRITTEN BY: Bob Perlman
633;
634;  MOST RECENT UPDATE:  April 16, 1988
635;
636;  FUNCTION:   Transfers a 32- or 64-bit operand to Am29027 input register R
637;
638;  PARAMETERS:
639;    reg      - the Am29000 g.p. register containing the 32-bit operand to be
640;               transferred, or the 32 MSBs of the 64-bit operand to be
641;               transferred.
642;
643;    LSB_reg  - the Am29000 g.p. register containing the 32 LSBs of the
644;               64-bit operand to be transferred
645;
646;    INT      - indicates that the operand to be transferred is a 32-bit
647;               integer
648;
649;    START    - indicates that a new Am29027 operation is to be started
650;               once the operand has been transferred
651;
652;
653;  USAGE:
654;
655;    cp_write_r  reg [,LSB_reg] [,START]       for floating-point operands
656; or cp_write_r  reg, INT [,START]             for integer operands
657;
658;    Transferring double-precision floating-point operands - Either of
659;       two forms is acceptable:
660;
661;               cp_write_r   reg
662;          or   cp_write_r   reg, LSB_reg
663;
664;       If LSB_reg is omitted, the LSBs are taken from the next g.p.
665;       register.
666;
667;       Ex:     cp_write_r   lr2     Transfers the contents of lr2 to
668;                                    the most-significant half of Am29027
669;                                    register R, and the contents of lr3
670;                                    to the least-significant half.
671;
672;               cp_write_r   lr2,lr5 Transfers the contents of lr2 to
673;                                    the most-significant half of Am29027
674;                                    register R, and the contents of lr5
675;                                    to the least-significant half.
676;
677;
678;    Transferring single-precision floating-point operands - Use the
679;       form:
680;
681;               cp_write_r   reg
682;
683;
684;       Ex:     cp_write_r   lr2     Transfers the contents of lr2 to
685;                                    the most-significant half of Am29027
686;                                    register R, (the contents of lr3
687;                                    will be transferred to the least-
688;                                    significant half of register R, but
689;                                    these bits are don't cares).
690;
691;
692;    Transferring integer operands - Use the form:
693;
694;               cp_write_r   reg,INT
695;
696;
697;       Ex:     cp_write_r   lr2,INT Transfers the contents of lr2 to
698;                                    the least-significant half of Am29027
699;                                    register R, (the contents of lr2
700;                                    will also be transferred to the most-
701;                                    significant half of register R, but
702;                                    these bits are don't cares).
703;
704;
705;    Starting an Am29027 operation - Any of the forms above may be
706;       appended with parameter START, e.g.:
707;
708;               cp_write_r   lr2,START
709;
710;               cp_write_r   lr2,lr5,START
711;
712;               cp_write_r   lr2,INT,START
713;
714;
715;============================================================================
716;
717 .macro cp_write_r,p1,p2,p3
718;
719   .if $narg==0
720     .err
721     .print "cp_WRITE_R: missing parameter(s)"
722   .endif
723;
724;
725   .if $narg==1
726     store 1,CP_WRITE_R,p1,%%((&p1)+1)
727     .exitm
728   .endif
729;
730;
731   .if $narg==2
732;
733     .ifeqs "@p2@","INT"
734       store 1,CP_WRITE_R,p1,p1
735       .exitm
736     .endif
737;
738     .ifeqs "@p2@","START"
739       store 1,CP_WRITE_R|CP_START,p1,%%((&p1)+1)
740       .exitm
741     .endif
742;
743     store 1,CP_WRITE_R,p1,p2
744     .exitm
745;
746   .endif
747;
748;
749   .if $narg==3
750;
751     .ifeqs "@p2@","START"
752       .ifeqs "@p3@","INT"
753         store 1,CP_WRITE_R|CP_START,p1,p1
754       .else
755         .err
756         .print "cp_write_r: bad parameter list"
757       .endif
758       .exitm
759     .endif
760;
761     .ifeqs "@p2@","INT"
762       .ifeqs "@p3@","START"
763         store 1,CP_WRITE_R|CP_START,p1,p1
764       .else
765         .err
766         .print "cp_write_r: bad parameter list"
767       .endif
768       .exitm
769     .endif
770;
771     .ifeqs "@p3@","START"
772       store 1,CP_WRITE_R|CP_START,p1,p2
773     .else
774       .err
775       .print "cp_write_r: bad parameter list"
776     .endif
777     .exitm
778;
779   .endif
780;
781;
782   .if $narg>=4
783     .err
784     .print "cp_write_r: too many parameters"
785   .endif
786;
787 .endm
788;
789;
790;
791;
792;
793;============================================================================
794;  MACRO NAME: cp_write_s
795;
796;  WRITTEN BY: Bob Perlman
797;
798;  MOST RECENT UPDATE:  April 16, 1988
799;
800;  FUNCTION:   Transfers a 32- or 64-bit operand to Am29027 input register S
801;
802;  PARAMETERS:
803;    reg      - the Am29000 g.p. register containing the 32-bit operand to be
804;               transferred, or the 32 MSBs of the 64-bit operand to be
805;               transferred.
806;
807;    LSB_reg  - the Am29000 g.p. register containing the 32 LSBs of the
808;               64-bit operand to be transferred
809;
810;    INT      - indicates that the operand to be transferred is a 32-bit
811;               integer
812;
813;    START    - indicates that a new Am29027 operation is to be started
814;               once the operand has been transferred
815;
816;
817;  USAGE:
818;
819;    cp_write_s  reg [,LSB_reg] [,START]       for floating-point operands
820; or cp_write_s  reg, INT [,START]             for integer operands
821;
822;    Transferring double-precision floating-point operands - Either of
823;       two forms is acceptable:
824;
825;               cp_write_s   reg
826;          or   cp_write_s   reg, LSB_reg
827;
828;       If LSB_reg is omitted, the LSBs are taken from the next g.p.
829;       register.
830;
831;       Ex:     cp_write_s   lr2     Transfers the contents of lr2 to
832;                                    the most-significant half of Am29027
833;                                    register S, and the contents of lr3
834;                                    to the least-significant half.
835;
836;               cp_write_s   lr2,lr5 Transfers the contents of lr2 to
837;                                    the most-significant half of Am29027
838;                                    register S, and the contents of lr5
839;                                    to the least-significant half.
840;
841;
842;    Transferring single-precision floating-point operands - Use the
843;       form:
844;
845;               cp_write_s   reg
846;
847;
848;       Ex:     cp_write_s   lr2     Transfers the contents of lr2 to
849;                                    the most-significant half of Am29027
850;                                    register S, (the contents of lr3
851;                                    will be transferred to the least-
852;                                    significant half of register S, but
853;                                    these bits are don't cares).
854;
855;
856;    Transferring integer operands - Use the form:
857;
858;               cp_write_s   reg,INT
859;
860;
861;       Ex:     cp_write_s   lr2,INT Transfers the contents of lr2 to
862;                                    the least-significant half of Am29027
863;                                    register S, (the contents of lr2
864;                                    will also be transferred to the most-
865;                                    significant half of register S, but
866;                                    these bits are don't cares).
867;
868;
869;    Starting an Am29027 operation - Any of the forms above may be
870;       appended with parameter START, e.g.:
871;
872;               cp_write_s   lr2,START
873;
874;               cp_write_s   lr2,lr5,START
875;
876;               cp_write_s   lr2,INT,START
877;
878;
879;============================================================================
880;
881 .macro cp_write_s,p1,p2,p3
882;
883   .if $narg==0
884     .err
885     .print "cp_write_s: missing parameter(s)"
886   .endif
887;
888;
889   .if $narg==1
890     store 1,CP_WRITE_S,p1,%%((&p1)+1)
891     .exitm
892   .endif
893;
894;
895   .if $narg==2
896;
897     .ifeqs "@p2@","INT"
898       store 1,CP_WRITE_S,p1,p1
899       .exitm
900     .endif
901;
902     .ifeqs "@p2@","START"
903       store 1,CP_WRITE_S|CP_START,p1,%%((&p1)+1)
904       .exitm
905     .endif
906;
907     store 1,CP_WRITE_S,p1,p2
908     .exitm
909;
910   .endif
911;
912;
913   .if $narg==3
914;
915     .ifeqs "@p2@","START"
916       .ifeqs "@p3@","INT"
917         store 1,CP_WRITE_S|CP_START,p1,p1
918       .else
919         .err
920         .print "cp_write_s: bad parameter list"
921       .endif
922       .exitm
923     .endif
924;
925     .ifeqs "@p2@","INT"
926       .ifeqs "@p3@","START"
927         store 1,CP_WRITE_S|CP_START,p1,p1
928       .else
929         .err
930         .print "cp_write_s: bad parameter list"
931       .endif
932       .exitm
933     .endif
934;
935     .ifeqs "@p3@","START"
936       store 1,CP_WRITE_S|CP_START,p1,p2
937     .else
938       .err
939       .print "cp_write_s: bad parameter list"
940     .endif
941     .exitm
942;
943   .endif
944;
945;
946   .if $narg>=4
947     .err
948     .print "cp_write_s: too many parameters"
949   .endif
950;
951 .endm
952;
953;
954;
955;
956;============================================================================
957;  MACRO NAME: cp_write_rs
958;
959;  WRITTEN BY: Bob Perlman
960;
961;  MOST RECENT UPDATE:  April 16, 1988
962;
963;  FUNCTION:   Transfers two 32-bit floating-point operands to Am29027
964;              input registers R and S
965;
966;  PARAMETERS:
967;    reg1     - the Am29000 g.p. register containing the 32-bit operand to be
968;               transferred to register R
969;
970;    reg2     - the Am29000 g.p. register containing the 32-bit operand to be
971;               transferred to register S
972;
973;    START    - indicates that a new Am29027 operation is to be started
974;               once the operands have been transferred
975;
976;
977;  USAGE:
978;
979;    cp_write_rs  reg1, reg2 [,START]
980;
981;       Ex: cp_write_rs  lr2,lr5       Transfers the contents of lr2 to
982;                                      the most-significant half of Am29027
983;                                      register R, and the contents of lr5
984;                                      to the most-significant half of Am29027
985;                                      register S.
986;
987;           cp_write_rs  lr2,lr5,START Transfers the contents of lr2 to
988;                                      the most-significant half of Am29027
989;                                      register R, and the contents of lr5
990;                                      to the most-significant half of Am29027
991;                                      register S; a new operation is started
992;                                      once the transfer is complete.
993;
994;
995;
996;============================================================================
997;
998 .macro cp_write_rs,p1,p2,p3
999;
1000;
1001   .if $narg<=1
1002     .err
1003     .print "cp_write_rs: missing parameter(s)"
1004     .exitm
1005   .endif
1006;
1007;
1008   .if $narg==2
1009     .ifeqs "@p2@","START"
1010       .err
1011       .print "cp_write_rs: bad parameter list"
1012     .else
1013       store 1,CP_WRITE_RS,p1,p2
1014     .endif
1015     .exitm
1016   .endif
1017;
1018;
1019   .if $narg==3
1020     .ifeqs "@p3@","START"
1021       store 1,CP_WRITE_RS|CP_START,p1,p2
1022     .else
1023       .err
1024       .print "cp_write_rs: bad parameter list"
1025     .endif
1026     .exitm
1027   .endif
1028;
1029;
1030   .if $narg>=4
1031     .err
1032     .print "cp_write_rs: too many parameters"
1033     .exitm
1034   .endif
1035;
1036 .endm
1037;
1038;
1039;
1040;
1041;
1042;
1043;============================================================================
1044;  MACRO NAME: cp_write_prec
1045;
1046;  WRITTEN BY: Bob Perlman
1047;
1048;  MOST RECENT UPDATE:  April 16, 1988
1049;
1050;  FUNCTION:   Transfers a word to the Am29027 precision register
1051;
1052;  PARAMETERS:
1053;    reg      - the Am29000 g.p. register containing the word to be
1054;               transferred to the Am29027 precision register
1055;
1056;  USAGE:
1057;
1058;    cp_write_prec  reg
1059;
1060;       Ex: cp_write_prec  lr2         Transfers the contents of lr2 to
1061;                                      the Am29027 precision register.
1062;
1063;
1064;============================================================================
1065;
1066 .macro cp_write_prec,p1
1067;
1068;
1069   .if $narg!=1
1070     .err
1071     .print "cp_write_prec: bad parameter list"
1072   .else
1073     store 1,CP_WRITE_PREC,p1,0
1074   .endif
1075;
1076 .endm
1077;
1078;
1079;
1080;
1081;
1082;
1083;============================================================================
1084;  MACRO NAME: cp_write_status
1085;
1086;  WRITTEN BY: Bob Perlman
1087;
1088;  MOST RECENT UPDATE:  April 16, 1988
1089;
1090;  FUNCTION:   Transfers a word to the Am29027 precision register
1091;
1092;  PARAMETERS:
1093;    reg        - the Am29000 g.p. register containing the word to be
1094;                 transferred to the Am29027 status register
1095;
1096;    RESTORE    - indicates that this is the last step of a state restoration
1097;                 sequence (flow-through mode only)
1098;
1099;    INVALIDATE - indicates that the current contents of the ALU pipeline
1100;                 register are to be invalidated (pipeline mode only)
1101;
1102;  USAGE:
1103;
1104;    cp_write_status  reg [,RESTORE|INVALIDATE]
1105;
1106;       Ex: cp_write_status  lr2            Transfers the contents of lr2 to
1107;                                           the Am29027 status register.
1108;
1109;
1110;           cp_write_status  lr2,RESTORE    Transfers the contents of lr2 to
1111;                                           the Am29027 status register, and
1112;                                           completes the state restore
1113;                                           sequence
1114;
1115;           cp_write_status  lr2,INVALIDATE Transfers the contents of lr2 to
1116;                                           the Am29027 status register, and
1117;                                           invalidates the contents of the
1118;                                           ALU pipeline.
1119;
1120;
1121;============================================================================
1122;
1123 .macro cp_write_status,p1,p2
1124;
1125   .if $narg==0
1126     .err
1127     .print "cp_write_status: missing parameter(s)"
1128   .endif
1129;
1130;
1131   .if $narg==1
1132     store 1,CP_WRITE_STATUS,p1,0
1133     .exitm
1134   .endif
1135;
1136;
1137   .if $narg==2
1138;
1139     .ifeqs "@p2@","RESTORE"
1140       store 1,CP_WRITE_STATUS|CP_START,p1,0
1141       .exitm
1142     .endif
1143;
1144     .ifeqs "@p2@","INVALIDATE"
1145       store 1,CP_WRITE_STATUS|CP_START,p1,0
1146       .exitm
1147     .endif
1148;
1149     .err
1150     .print "cp_write_status: bad parameter list"
1151     .exitm
1152;
1153   .endif
1154;
1155;
1156   .if $narg >=3
1157     .err
1158     .print "cp_write_status: too many parameters"
1159     .exitm
1160   .endif
1161;
1162 .endm
1163;
1164;
1165;
1166;
1167;
1168;============================================================================
1169;  MACRO NAME: cp_write_inst
1170;
1171;  WRITTEN BY: Bob Perlman
1172;
1173;  MOST RECENT UPDATE:  April 16, 1988
1174;
1175;  FUNCTION:   Transfers an instruction word to the Am29027 instruction
1176;              register
1177;
1178;  PARAMETERS:
1179;    reg     - the Am29000 g.p. register containing the word to be
1180;              transferred to the Am29027 instruction register
1181;
1182;    START   - indicates that a new Am29027 operation is to be started
1183;              once the instruction word has been transferred
1184;
1185;  USAGE:
1186;
1187;    cp_write_inst  reg [,START]
1188;
1189;       Ex: cp_write_inst  lr2            Transfers the contents of lr2 to
1190;                                         the Am29027 instruction register.
1191;
1192;
1193;           cp_write_inst  lr2,START      Transfers the contents of lr2 to
1194;                                         the Am29027 status register; a
1195;                                         new operation is started once the
1196;                                         transfer is complete.
1197;
1198;
1199;============================================================================
1200;
1201 .macro cp_write_inst,p1,p2
1202;
1203   .if $narg==0
1204     .err
1205     .print "cp_write_inst: missing parameter(s)"
1206   .endif
1207;
1208;
1209   .if $narg==1
1210     store 1,CP_WRITE_INST,p1,p1
1211     .exitm
1212   .endif
1213;
1214;
1215   .if $narg==2
1216;
1217     .ifeqs "@p2@","START"
1218       store 1,CP_WRITE_INST|CP_START,p1,p1
1219     .else
1220       .err
1221       .print "cp_write_inst: bad parameter list"
1222     .endif
1223     .exitm
1224;
1225   .endif
1226;
1227;
1228   .if $narg >=3
1229     .err
1230     .print "cp_write_inst: too many parameters"
1231     .exitm
1232   .endif
1233;
1234 .endm
1235;
1236;
1237;
1238;
1239;
1240;
1241;============================================================================
1242;  MACRO NAME: cp_advance_temps
1243;
1244;  WRITTEN BY: Bob Perlman
1245;
1246;  MOST RECENT UPDATE:  April 17, 1988
1247;
1248;  FUNCTION:   Transfers the contents of Am29027 registers R-Temp, S-Temp,
1249;              and I-Temp to register R, register S, and the instruction
1250;              register, respectively.
1251;
1252;  PARAMETERS: none
1253;
1254;  USAGE:
1255;
1256;    cp_advance_temps
1257;
1258;
1259;
1260;============================================================================
1261;
1262 .macro cp_advance_temps
1263;
1264;
1265   .if $narg!=0
1266     .err
1267     .print "cp_advance_temp: takes no parameters"
1268   .else
1269     store 1,CP_ADV_TEMPS,gr1,0 ; use gr1 because it's never protected
1270   .endif
1271;
1272 .endm
1273;
1274;
1275;
1276;
1277;============================================================================
1278;  MACRO NAME:  cp_write_mode
1279;
1280;  WRITTEN BY:  Bob Perlman
1281;
1282;  MOST RECENT UPDATE:  April 17, 1988
1283;
1284;  FUNCTION:    Transfers a 64-bit mode specification to the Am29027 mode
1285;               register
1286;
1287;  PARAMETERS:
1288;    reg      - the Am29000 g.p. register containing the 32 MSBs of the
1289;               64-bit mode specification to be transferred.
1290;
1291;    LSB_reg  - the Am29000 g.p. register containing the 32 LSBs of the
1292;               64-bit mode specification to be transferred.
1293;
1294;  USAGE:
1295;
1296;    cp_write_mode  reg [,LSB_reg]
1297;
1298;    Either of two forms is acceptable:
1299;
1300;               cp_write_mode   reg
1301;          or   cp_write_mode   reg, LSB_reg
1302;
1303;       If LSB_reg is omitted, the LSBs are taken from the next g.p.
1304;       register.
1305;
1306;       Ex:     cp_write_mode  lr2     Transfers the contents of lr2 to
1307;                                      the most-significant half of the Am29027
1308;                                      mode register, and the contents of lr3
1309;                                      to the least-significant half.
1310;
1311;               cp_write_mode  lr2,lr5 Transfers the contents of lr2 to
1312;                                      the most-significant half of the Am29027
1313;                                      mode register, and the contents of lr5
1314;                                      to the least-significant half.
1315;
1316;
1317;
1318;============================================================================
1319;
1320 .macro cp_write_mode,p1,p2
1321;
1322   .if $narg==0
1323     .err
1324     .print "cp_write_mode: missing parameter(s)"
1325   .endif
1326;
1327;
1328   .if $narg==1
1329     store 1,CP_WRITE_MODE,%%((&p1)+1),p1
1330     .exitm
1331   .endif
1332;
1333;
1334   .if $narg==2
1335     store 1,CP_WRITE_MODE,p2,p1
1336     .exitm
1337   .endif
1338;
1339;
1340   .if $narg>=3
1341     .err
1342     .print "cp_write_mode: too many parameters"
1343   .endif
1344;
1345 .endm
1346;
1347;
1348;
1349;============================================================================
1350;  MACRO NAME: cp_read_dp
1351;
1352;  WRITTEN BY: Bob Perlman
1353;
1354;  MOST RECENT UPDATE:  April 17, 1988
1355;
1356;  FUNCTION:   Transfers the current Am29027 double-precison floating-point
1357;              result to the Am29000
1358;
1359;  PARAMETERS:
1360;    reg     - the Am29000 g.p. register into which the 32 MSBs of the
1361;              current Am29027 result are to be written.
1362;
1363;    LSB_reg - the Am29000 g.p. register into which the 32 LSBs of the
1364;              current Am29027 result are to be written.
1365;
1366;    NO_ERR  - indicates that exception reporting is to be suppressed for this
1367;              transfer.
1368;
1369;  USAGE:
1370;
1371;    cp_read_dp  reg [,LSB_reg] [,START]
1372;
1373;    Either of two forms is acceptable:
1374;
1375;               cp_read_dp   reg
1376;          or   cp_read_dp   reg, LSB_reg
1377;
1378;     If LSB_reg is omitted, the LSBs are written to the next g.p. register.
1379;
1380;       Ex:     cp_read_dp   lr2     Transfers the 32 MSBs of the current
1381;                                    Am29027 result to lr2, and the 32 LSBs
1382;                                    to lr3.
1383;
1384;               cp_read_dp   lr2,lr5 Transfers the 32 MSBs of the current
1385;                                    Am29027 result to lr2, and the 32 LSBs
1386;                                    to lr5.
1387;
1388;    Exception reporting can be suppressed by appending NO_ERR to either
1389;    of the above, e.g.:
1390;
1391;               cp_read_dp   lr2,NO_ERR
1392;               cp_read_dp   lr2,lr5,NO_ERR
1393;
1394;
1395;============================================================================
1396;
1397 .macro cp_read_dp,p1,p2,p3
1398;
1399   .if $narg==0
1400     .err
1401     .print "cp_read_dp: missing parameter(s)"
1402   .endif
1403;
1404;
1405   .if $narg==1
1406     load 1,CP_READ_LSBS,%%((&p1)+1),0
1407     load 1,CP_READ_MSBS,p1,0
1408     .exitm
1409   .endif
1410;
1411;
1412   .if $narg==2
1413;
1414     .ifeqs "@p2@","NO_ERR"
1415       load 1,CP_READ_LSBS|CP_NO_ERR,%%((&p1)+1),0
1416       load 1,CP_READ_MSBS|CP_NO_ERR,p1,0
1417       .exitm
1418     .endif
1419;
1420     load 1,CP_READ_LSBS,p2,0
1421     load 1,CP_READ_MSBS,p1,0
1422     .exitm
1423;
1424   .endif
1425;
1426;
1427   .if $narg==3
1428;
1429     .ifeqs "@p3@","NO_ERR"
1430       load 1,CP_READ_LSBS|CP_NO_ERR,p2,0
1431       load 1,CP_READ_MSBS|CP_NO_ERR,p1,0
1432     .else
1433       .err
1434       .print "cp_read_dp: bad parameter list"
1435     .endif
1436     .exitm
1437;
1438   .endif
1439;
1440;
1441   .if $narg>=4
1442     .err
1443     .print "cp_read_dp: too many parameters"
1444   .endif
1445;
1446 .endm
1447;
1448;
1449;
1450;============================================================================
1451;  MACRO NAME: cp_read_sp
1452;
1453;  WRITTEN BY: Bob Perlman
1454;
1455;  MOST RECENT UPDATE:  April 17, 1988
1456;
1457;  FUNCTION:   Transfers the current Am29027 single-precison floating-point
1458;              result to the Am29000
1459;
1460;  PARAMETERS:
1461;    reg     - the Am29000 g.p. register into which the current Am29027
1462;              result is to be written.
1463;
1464;    NO_ERR  - indicates that exception reporting is to be suppressed for this
1465;              transfer.
1466;
1467;  USAGE:
1468;
1469;    cp_read_sp  reg [,START]
1470;
1471;       Ex:     cp_read_sp   lr2        Transfers the current Am29027 result
1472;                                       to lr2.
1473;
1474;               cp_read_sp   lr2,NO_ERR Transfers the current Am29027 result
1475;                                       to lr2, and suppresses exception
1476;                                       reporting for this transfer.
1477;
1478;
1479;============================================================================
1480;
1481 .macro cp_read_sp,p1,p2
1482;
1483   .if $narg==0
1484     .err
1485     .print "cp_read_sp: missing parameter(s)"
1486   .endif
1487;
1488;
1489   .if $narg==1
1490     load 1,CP_READ_MSBS,p1,0
1491     .exitm
1492   .endif
1493;
1494;
1495   .if $narg==2
1496;
1497     .ifeqs "@p2@","NO_ERR"
1498       load 1,CP_READ_MSBS|CP_NO_ERR,p1,0
1499     .else
1500       .err
1501       .print "cp_read_sp: bad parameter list"
1502     .endif
1503     .exitm
1504;
1505   .endif
1506;
1507;
1508   .if $narg>=3
1509     .err
1510     .print "cp_read_sp: too many parameters"
1511   .endif
1512;
1513 .endm
1514;
1515;
1516;
1517;============================================================================
1518;  MACRO NAME: cp_read_int
1519;
1520;  WRITTEN BY: Bob Perlman
1521;
1522;  MOST RECENT UPDATE:  April 17, 1988
1523;
1524;  FUNCTION:   Transfers the current Am29027 integer result to the Am29000
1525;
1526;  PARAMETERS:
1527;    reg     - the Am29000 g.p. register into which the current Am29027
1528;              result is to be written.
1529;
1530;    NO_ERR  - indicates that exception reporting is to be suppressed for this
1531;              transfer.
1532;
1533;  USAGE:
1534;
1535;    cp_read_int  reg [,START]
1536;
1537;       Ex:     cp_read_int  lr2        Transfers the current Am29027 result
1538;                                       to lr2.
1539;
1540;               cp_read_int  lr2,NO_ERR Transfers the current Am29027 result
1541;                                       to lr2, and suppresses exception
1542;                                       reporting for this transfer.
1543;
1544;
1545;============================================================================
1546;
1547 .macro cp_read_int,p1,p2
1548;
1549   .if $narg==0
1550     .err
1551     .print "cp_read_int: missing parameter(s)"
1552   .endif
1553;
1554;
1555   .if $narg==1
1556     load 1,CP_READ_LSBS,p1,0
1557     nop                    ; leave a cycle for the MSBs to come out
1558     .exitm
1559   .endif
1560;
1561;
1562   .if $narg==2
1563;
1564     .ifeqs "@p2@","NO_ERR"
1565       load 1,CP_READ_LSBS|CP_NO_ERR,p1,0
1566       nop                    ; leave a cycle for the MSBs to come out
1567     .else
1568       .err
1569       .print "cp_read_int: bad parameter list"
1570     .endif
1571     .exitm
1572;
1573   .endif
1574;
1575;
1576   .if $narg>=3
1577     .err
1578     .print "cp_read_int: too many parameters"
1579   .endif
1580;
1581 .endm
1582;
1583;
1584;
1585;============================================================================
1586;  MACRO NAME: cp_read_flags
1587;
1588;  WRITTEN BY: Bob Perlman
1589;
1590;  MOST RECENT UPDATE:  April 17, 1988
1591;
1592;  FUNCTION:   Transfers the contents of the Am29027 flag register
1593;              to the Am29000
1594;
1595;  PARAMETERS:
1596;    reg     - the Am29000 g.p. register into which the current Am29027
1597;              flag register contents are to be written.
1598;
1599;    NO_ERR  - indicates that exception reporting is to be suppressed for this
1600;              transfer.
1601;
1602;  USAGE:
1603;
1604;    cp_read_flags  reg [,START]
1605;
1606;       Ex:     cp_read_flags  lr2        Transfers the Am29027 flag register
1607;                                         contents to lr2.
1608;
1609;               cp_read_flags  lr2,NO_ERR Transfers the Am29027 flag register
1610;                                         contents to lr2, and suppresses
1611;                                         exception reporting for this
1612;                                         transfer.
1613;
1614;
1615;============================================================================
1616;
1617 .macro cp_read_flags,p1,p2
1618;
1619   .if $narg==0
1620     .err
1621     .print "cp_read_flags: missing parameter(s)"
1622   .endif
1623;
1624;
1625   .if $narg==1
1626     load 1,CP_READ_FLAGS,p1,0
1627     .exitm
1628   .endif
1629;
1630;
1631   .if $narg==2
1632;
1633     .ifeqs "@p2@","NO_ERR"
1634       load 1,CP_READ_FLAGS|CP_NO_ERR,p1,0
1635     .else
1636       .err
1637       .print "cp_read_flags: bad parameter list"
1638     .endif
1639     .exitm
1640;
1641   .endif
1642;
1643;
1644   .if $narg>=3
1645     .err
1646     .print "cp_read_flags: too many parameters"
1647   .endif
1648;
1649 .endm
1650;
1651;
1652;
1653;============================================================================
1654;  MACRO NAME: cp_read_status
1655;
1656;  WRITTEN BY: Bob Perlman
1657;
1658;  MOST RECENT UPDATE:  April 18, 1988
1659;
1660;  FUNCTION:   Transfers the contents of the Am29027 status register
1661;              to the Am29000
1662;
1663;  PARAMETERS:
1664;    reg     - the Am29000 g.p. register into which the current Am29027
1665;              status register contents are to be written.
1666;
1667;    NO_ERR  - indicates that exception reporting is to be suppressed for this
1668;              transfer.
1669;
1670;  USAGE:
1671;
1672;    cp_read_status  reg [,START]
1673;
1674;       Ex:     cp_read_status  lr2        Transfers the Am29027 status register
1675;                                          contents to lr2.
1676;
1677;               cp_read_status  lr2,NO_ERR Transfers the Am29027 status register
1678;                                          contents to lr2, and suppresses
1679;                                          exception reporting for this
1680;                                          transfer.
1681;
1682;
1683;============================================================================
1684;
1685 .macro cp_read_status,p1,p2
1686;
1687   .if $narg==0
1688     .err
1689     .print "cp_read_status: missing parameter(s)"
1690   .endif
1691;
1692;
1693   .if $narg==1
1694     load 1,CP_READ_STATUS,p1,0
1695     .exitm
1696   .endif
1697;
1698;
1699   .if $narg==2
1700;
1701     .ifeqs "@p2@","NO_ERR"
1702       load 1,CP_READ_STATUS|CP_NO_ERR,p1,0
1703     .else
1704       .err
1705       .print "cp_read_status: bad parameter list"
1706     .endif
1707     .exitm
1708;
1709   .endif
1710;
1711;
1712   .if $narg>=3
1713     .err
1714     .print "cp_read_status: too many parameters"
1715   .endif
1716;
1717 .endm
1718;
1719;
1720;
1721;============================================================================
1722;  MACRO NAME: cp_read_state_wd
1723;
1724;  WRITTEN BY: Bob Perlman
1725;
1726;  MOST RECENT UPDATE:  April 18, 1988
1727;
1728;  FUNCTION:   Transfers the next Am29027 state word to the Am29000
1729;
1730;  PARAMETERS:
1731;    reg     - the Am29000 g.p. register into which the next Am29027
1732;              state word contents are to be written.
1733;
1734;  USAGE:
1735;
1736;    cp_read_state_wd  reg
1737;
1738;       Ex:     cp_read_state_wd  lr2  Transfers the next Am29027 state word
1739;                                      to lr2.
1740;
1741;============================================================================
1742;
1743 .macro cp_read_state_wd,p1
1744;
1745   .if $narg==0
1746     .err
1747     .print "cp_read_state_wd: missing parameter"
1748   .endif
1749;
1750;
1751   .if $narg==1
1752     load 1,CP_SAVE_STATE,p1,0
1753     .exitm
1754   .endif
1755;
1756;
1757   .if $narg>=2
1758     .err
1759     .print "cp_read_state_wd: too many parameters"
1760   .endif
1761;
1762 .endm
1763;
1764;
1765;
1766;============================================================================
1767;  MACRO NAME: cp_save_state
1768;
1769;  WRITTEN BY: Bob Perlman
1770;
1771;  MOST RECENT UPDATE:  April 18, 1988
1772;
1773;  FUNCTION:   Transfers the current Am29027 state to the Am29000
1774;
1775;  PARAMETERS:
1776;    reg     - the first of 30 Am29000 g.p. registers in which Am29027 state
1777;              is saved.
1778;
1779;  USAGE:
1780;
1781;    cp_save_state  reg
1782;
1783;    This macro transfers the current Am29027 state to a block of 30 Am29000
1784;    registers.  State is stored in the following order:
1785;
1786;              reg      instruction register
1787;              reg+1    I-Temp
1788;              reg+2    R MSBs
1789;              reg+3    R LSBs
1790;              reg+4    S MSBs
1791;              reg+5    S LSBs
1792;              reg+6    R-Temp MSBs
1793;              reg+7    R-Temp LSBs
1794;              reg+8    S-Temp MSBs
1795;              reg+9    S-Temp LSBs
1796;              reg+10   status
1797;              reg+11   precision
1798;              reg+12   RF0 MSBs
1799;              reg+13   RF0 LSBs
1800;                .         .
1801;                .         .
1802;                .         .
1803;              reg+26   RF7 MSBs
1804;              reg+27   RF7 LSBs
1805;              reg+28   mode MSBs
1806;              reg+29   mode LSBs
1807;
1808;
1809;       Ex:     cp_save_state  lr2     Transfers the current Am29027 state to
1810;                                      the Am29000, starting at lr2.
1811;
1812;  NOTES:
1813;       1) This macro stores all 64-bit quantities in "big-endian" order,
1814;          i.e. MSBs first.  For example, the 32 MSBs of register R are
1815;          stored in reg+2, and the 32 LSBs are stored in reg+3.  The Am29027
1816;          transfers these quantites in "little-endian" order; the macro
1817;          is responsible for swapping MS and LS words.
1818;
1819;============================================================================
1820;
1821 .macro cp_save_state,p1
1822;
1823   .if $narg==0
1824     .err
1825     .print "cp_save_state: missing parameter"
1826   .endif
1827;
1828;
1829   .if $narg==1
1830     cp_read_sp p1,NO_ERR
1831                                    ;guarantee that we're at beginning of
1832                                    ; save state sequence
1833     cp_read_state_wd %%((&p1)+ 0)  ; instruction
1834     cp_read_state_wd %%((&p1)+ 1)  ; I-Temp
1835     cp_read_state_wd %%((&p1)+ 3)  ; R MSBs
1836     cp_read_state_wd %%((&p1)+ 2)  ; R LSBs
1837     cp_read_state_wd %%((&p1)+ 5)  ; S MSBs
1838     cp_read_state_wd %%((&p1)+ 4)  ; S LSBs
1839     cp_read_state_wd %%((&p1)+ 7)  ; R-Temp MSBs
1840     cp_read_state_wd %%((&p1)+ 6)  ; R-Temp LSBs
1841     cp_read_state_wd %%((&p1)+ 9)  ; S-Temp MSBs
1842     cp_read_state_wd %%((&p1)+ 8)  ; S-Temp LSBs
1843     cp_read_state_wd %%((&p1)+10)  ; status
1844     cp_read_state_wd %%((&p1)+11)  ; precision
1845     cp_read_state_wd %%((&p1)+13)  ; RF0 MSBs
1846     cp_read_state_wd %%((&p1)+12)  ; RF0 LSBs
1847     cp_read_state_wd %%((&p1)+15)  ; RF1 MSBs
1848     cp_read_state_wd %%((&p1)+14)  ; RF1 LSBs
1849     cp_read_state_wd %%((&p1)+17)  ; RF2 MSBs
1850     cp_read_state_wd %%((&p1)+16)  ; RF2 LSBs
1851     cp_read_state_wd %%((&p1)+19)  ; RF3 MSBs
1852     cp_read_state_wd %%((&p1)+18)  ; RF3 LSBs
1853     cp_read_state_wd %%((&p1)+21)  ; RF4 MSBs
1854     cp_read_state_wd %%((&p1)+20)  ; RF4 LSBs
1855     cp_read_state_wd %%((&p1)+23)  ; RF5 MSBs
1856     cp_read_state_wd %%((&p1)+22)  ; RF5 LSBs
1857     cp_read_state_wd %%((&p1)+25)  ; RF6 MSBs
1858     cp_read_state_wd %%((&p1)+24)  ; RF6 LSBs
1859     cp_read_state_wd %%((&p1)+27)  ; RF7 MSBs
1860     cp_read_state_wd %%((&p1)+26)  ; RF7 LSBs
1861     cp_read_state_wd %%((&p1)+29)  ; mode MSBs
1862     cp_read_state_wd %%((&p1)+28)  ; mode LSBs
1863     .exitm
1864   .endif
1865;
1866;
1867   .if $narg>=2
1868     .err
1869     .print "cp_save_state: too many parameters"
1870   .endif
1871;
1872 .endm
1873;
1874;
1875;
1876;
1877;
1878;============================================================================
1879;  MACRO NAME: cp_restore_state
1880;
1881;  WRITTEN BY: Bob Perlman
1882;
1883;  MOST RECENT UPDATE:  April 18, 1988
1884;
1885;  FUNCTION:   Restores Am29027 state
1886;
1887;  PARAMETERS:
1888;    reg     - the first of 30 Am29000 g.p. registers containing Am29027
1889;              state.
1890;
1891;    temp    - a scratch register used by cp_restore_state
1892;
1893;  USAGE:
1894;
1895;    cp_restore_state  reg,temp
1896;
1897;    This macro restores Am29027 state by transferring 30 words to the
1898;    Am29027; these words are taken from a block of Am29000 g.p. registers
1899;    starting at "reg."  The words are assumed to be stored in the following
1900;    order:
1901;
1902;              reg      instruction register
1903;              reg+1    I-Temp
1904;              reg+2    R MSBs
1905;              reg+3    R LSBs
1906;              reg+4    S MSBs
1907;              reg+5    S LSBs
1908;              reg+6    R-Temp MSBs
1909;              reg+7    R-Temp LSBs
1910;              reg+8    S-Temp MSBs
1911;              reg+9    S-Temp LSBs
1912;              reg+10   status
1913;              reg+11   precision
1914;              reg+12   RF0 MSBs
1915;              reg+13   RF0 LSBs
1916;                .         .
1917;                .         .
1918;                .         .
1919;              reg+26   RF7 MSBs
1920;              reg+27   RF7 LSBs
1921;              reg+28   mode MSBs
1922;              reg+29   mode LSBs
1923;
1924;
1925;       Ex:     cp_restore_state  lr2,gr70  Restores Am29027 state by
1926;                                           transferring a block of 30 words
1927;                                           that begins at lr2.  Register gr70
1928;                                           is used as scratch storage by this
1929;                                           macro.
1930;
1931;
1932;============================================================================
1933;
1934 .macro cp_restore_state,p1,p2
1935;
1936   .if $narg<=1
1937     .err
1938     .print "cp_restore_state: missing parameter(s)"
1939   .endif
1940;
1941;
1942   .if $narg==2
1943
1944     const p2,0                     ;clear the status register
1945     cp_write_status p2
1946;
1947     cp_write_mode %%((&p1)+28)     ;restore the mode register
1948;
1949     const  p2,0x80000018           ; restore RF0
1950     consth p2,0x80000018
1951     cp_write_inst p2
1952     cp_write_r %%((&p1)+12),START
1953;
1954     consth p2,0x90000018           ; restore RF1
1955     cp_write_inst p2
1956     cp_write_r %%((&p1)+14),START
1957;
1958     consth p2,0xA0000018           ; restore RF2
1959     cp_write_inst p2
1960     cp_write_r %%((&p1)+16),START
1961;
1962     consth p2,0xB0000018           ; restore RF3
1963     cp_write_inst p2
1964     cp_write_r %%((&p1)+18),START
1965;
1966     consth p2,0xC0000018           ; restore RF4
1967     cp_write_inst p2
1968     cp_write_r %%((&p1)+20),START
1969;
1970     consth p2,0xD0000018           ; restore RF5
1971     cp_write_inst p2
1972     cp_write_r %%((&p1)+22),START
1973;
1974     consth p2,0xE0000018           ; restore RF6
1975     cp_write_inst p2
1976     cp_write_r %%((&p1)+24),START
1977;
1978     consth p2,0xF0000018           ; restore RF7
1979     cp_write_inst p2
1980     cp_write_r %%((&p1)+26),START
1981;
1982     cp_read_sp p2                  ; do a dummy read, to guarantee that
1983                                    ; the last operation is complete
1984;
1985     cp_write_prec %%((&p1)+11)     ; restore precision
1986;
1987     cp_write_r %%((&p1)+2)         ; restore R
1988     cp_write_s %%((&p1)+4)         ; restore S
1989     cp_write_inst %%((&p1)+0)      ; restore instruction
1990     cp_advance_temps               ; move R,S, and inst. to working registers
1991;
1992     cp_write_r %%((&p1)+6)         ; restore R-Temp
1993     cp_write_s %%((&p1)+8)         ; restore S-Temp
1994     cp_write_inst %%((&p1)+1)      ; restore I-Temp
1995;
1996; restore the status register, retime last operation
1997;
1998     cp_write_status %%((&p1)+10),RESTORE
1999;
2000     .exitm
2001   .endif
2002;
2003;
2004   .if $narg>=3
2005     .err
2006     .print "cp_restore_state: too many parameters"
2007   .endif
2008;
2009 .endm
2010;
2011;
2012;
2013;============================================================================
2014;  MACRO NAME: cp_build_inst
2015;
2016;  WRITTEN BY: Bob Perlman
2017;
2018;  MOST RECENT UPDATE:  April 24, 1988
2019;                    :  January 4, 1989 Rich Parker
2020;
2021;  FUNCTION:   Builds a 32-bit Am29027 instruction in an Am29000 g.p.
2022;              register.
2023;
2024;  PARAMETERS:
2025;    reg       - the Am29000 g.p. register into which the instruction word
2026;                is to be written
2027;
2028;    op_code   - mnemonic specifying the operation to be performed
2029;                (e.g. FADD, P_TIMES_Q)
2030;
2031;    precision - precision specification for destination, source operands:
2032;                  D_S - double-prec. result, single-prec. input(s)
2033;                  D_D - double-prec. result, double-prec. input(s)
2034;                  S_S - single-prec. result, single-prec. input(s)
2035;                  S_D - single-prec. result, double-prec. input(s)
2036;
2037;    dest      - destination for the operation result:
2038;                  RF0 - store result in Am29027 register file location RF0
2039;                  RF1 - store result in Am29027 register file location RF1
2040;                  RF2 - store result in Am29027 register file location RF2
2041;                  RF3 - store result in Am29027 register file location RF3
2042;                  RF4 - store result in Am29027 register file location RF4
2043;                  RF5 - store result in Am29027 register file location RF5
2044;                  RF6 - store result in Am29027 register file location RF6
2045;                  RF7 - store result in Am29027 register file location RF7
2046;                  GP  - result is to be stored in an Am29000 g.p. register
2047;                          with a read_dp, read_sp, or read_int macro.
2048;
2049;    source1,
2050;    source2,
2051;    source3   - source operand specifications:
2052;                  R    - take source from Am29027 register R
2053;                  S    - take source from Am29027 register S
2054;                  RF0  - take source from Am29027 register file location RF0
2055;                  RF1  - take source from Am29027 register file location RF1
2056;                  RF2  - take source from Am29027 register file location RF2
2057;                  RF3  - take source from Am29027 register file location RF3
2058;                  RF4  - take source from Am29027 register file location RF4
2059;                  RF5  - take source from Am29027 register file location RF5
2060;                  RF6  - take source from Am29027 register file location RF6
2061;                  RF7  - take source from Am29027 register file location RF7
2062;                  0    - source is 0
2063;                  ONE_HALF - source is constant .5 (f.p. operations only)
2064;                  IMINUS1 - source is constant -1 (integer operations only)
2065;                  1    - source is constant 1
2066;                  2    - source is constant 2
2067;                  3    - source is constant 3
2068;                  PI   - source is constant pi (f.p. operations only)
2069;                  IMINUSMAX - source is -(2**63) (integer operations only)
2070;
2071;
2072;  USAGE:
2073;
2074;    cp_build_inst  reg,op_code,[precision,]dest,source1[,source2][,source3]
2075;
2076;    Op-codes fall into two categories: those that correspond to Am29000
2077;    floating-point op-codes, and for which the precision is implicit (e.g.
2078;    FADD, DMUL); and those that correspond to Am29027 base operations
2079;    (e.g. P_PLUS_T, P_TIMES_Q), and which require an explicit precision
2080;    specification.
2081;
2082;    Every operation specified must have a destination; if the operation
2083;    does not write a result to the Am29027 register file, destination GP
2084;    must be specified.  The number of source operands specified must agree
2085;    with the number of source operands required by the operation specified.
2086;
2087;    Ex:
2088;
2089;       cp_build_inst lr2,FADD,RF7,R,S
2090;                                         Builds an instruction word to
2091;                                         perform the operation:
2092;                                            RF7 <- R + S
2093;                                         where R, S, and RF7 are single-
2094;                                         precision f.p. operands.  The
2095;                                         instruction word is placed in lr2.
2096;
2097;       cp_build_inst gr119,DMUL,GP,R,ONE_HALF
2098;                                         Builds an instruction word to
2099;                                         perform the operation:
2100;                                                R * .5
2101;                                         where R, .5, and the result
2102;                                         are double-precision f.p. operands.
2103;                                         The result is not written to the
2104;                                         Am29027 register file.  The
2105;                                         instruction word is written to
2106;                                         gr119.
2107;
2108;
2109;       cp_build_inst lr3,MIN_P_AND_T,S_D,RF7,R,S
2110;                                         Builds an instruction word to
2111;                                         perform the operation:
2112;                                            RF7 <- smaller of(R,S)
2113;                                         where R and S are double-precision
2114;                                         f.p. operands, and RF7 is a single-
2115;                                         precison f.p. operand.  The
2116;                                         instruction word is written to
2117;                                         lr3.
2118;
2119;
2120;       cp_build_inst gr97,I_P_TIMES_Q,S_S,GP,R,2
2121;                                         Builds an instruction word to
2122;                                         perform the operation:
2123;                                                R * 2
2124;                                         where R, .5, and the result
2125;                                         are single-precision integer operands.
2126;                                         The result is not written to the
2127;                                         Am29027 register file.  The
2128;                                         instruction word is written to
2129;                                         gr97
2130;
2131;
2132;       cp_build_inst lr7,ABS_P,D_D,RF6,S
2133;                                         Builds an instruction word to
2134;                                         perform the operation:
2135;                                                RF6 <- |S|
2136;                                         where S and RF7 are double-precision
2137;                                         f.p. operands.  The instruction
2138;                                         word is written to gr7.
2139;
2140;
2141;       cp_build_inst gr127,PQ_PLUS_T,D_D,RF6,R,S,RF6
2142;                                         Builds an instruction word to
2143;                                         perform the operation:
2144;                                           RF6 <- (R * S) + RF6
2145;                                         where R, S and the result are
2146;                                         double-precision f.p. operands.
2147;                                         The instruction word is written
2148;                                         to gr127.
2149;
2150;
2151;
2152;============================================================================
2153;
2154 .macro cp_build_inst,p1,p2,p3,p4,p5,p6,p7
2155;
2156   .if $narg<=3
2157     .err
2158     .print "cp_build_inst: missing parameter(s)"
2159     .exitm
2160   .endif
2161;
2162; classify operation type
2163;
2164   .set _cp_op_type,255
2165
2166   _cp_set_op_params  p2,FADD,1,5,4,0,5
2167   _cp_set_op_params  p2,DADD,1,5,4,0,5
2168   _cp_set_op_params  p2,FSUB,1,5,4,0,5
2169   _cp_set_op_params  p2,DSUB,1,5,4,0,5
2170   _cp_set_op_params  p2,FMUL,1,5,4,5,0
2171   _cp_set_op_params  p2,DMUL,1,5,4,5,0
2172   _cp_set_op_params  p2,FEQ,1,5,4,0,5
2173   _cp_set_op_params  p2,DEQ,1,5,4,0,5
2174   _cp_set_op_params  p2,FGE,1,5,4,0,5
2175   _cp_set_op_params  p2,DGE,1,5,4,0,5
2176   _cp_set_op_params  p2,FGT,1,5,4,0,5
2177   _cp_set_op_params  p2,DGT,1,5,4,0,5
2178   _cp_set_op_params  p2,CONVERT_I_TO_F,1,4,0,0,4
2179   _cp_set_op_params  p2,CONVERT_I_TO_D,1,4,0,0,4
2180   _cp_set_op_params  p2,CONVERT_F_TO_I,1,4,0,0,4
2181   _cp_set_op_params  p2,CONVERT_D_TO_I,1,4,0,0,4
2182;
2183; The next two lines were corrected on 1-4-89, Rich Parker
2184;
2185   _cp_set_op_params  p2,CONVERT_F_TO_D,1,4,4,0,0
2186   _cp_set_op_params  p2,CONVERT_D_TO_F,1,4,4,0,0
2187;
2188   _cp_set_op_params  p2,PASS_P,0,5,5,0,0
2189   _cp_set_op_params  p2,MINUSP,0,5,5,0,0
2190   _cp_set_op_params  p2,ABSP,0,5,5,0,0
2191   _cp_set_op_params  p2,SIGNT_TIMES_ABSP,0,6,6,0,5
2192   _cp_set_op_params  p2,P_PLUS_T,0,6,5,0,6
2193   _cp_set_op_params  p2,P_MINUS_T,0,6,5,0,6
2194   _cp_set_op_params  p2,MINUSP_PLUS_T,0,6,5,0,6
2195   _cp_set_op_params  p2,MINUSP_MINUS_T,0,6,5,0,6
2196   _cp_set_op_params  p2,ABS_P_PLUS_T,0,6,5,0,6
2197   _cp_set_op_params  p2,ABS_P_MINUS_T,0,6,5,0,6
2198   _cp_set_op_params  p2,ABSP_PLUS_ABST,0,6,5,0,6
2199   _cp_set_op_params  p2,ABSP_MINUS_ABST,0,6,5,0,6
2200   _cp_set_op_params  p2,ABS_ABSP_MINUS_ABST,0,6,5,0,6
2201   _cp_set_op_params  p2,P_TIMES_Q,0,6,5,6,0
2202   _cp_set_op_params  p2,MINUSP_TIMES_Q,0,6,5,6,0
2203   _cp_set_op_params  p2,ABS_P_TIMES_Q,0,6,5,6,0
2204   _cp_set_op_params  p2,COMPARE_P_AND_T,0,6,5,0,6
2205   _cp_set_op_params  p2,MAX_P_AND_T,0,6,5,0,6
2206   _cp_set_op_params  p2,MAX_ABSP_AND_ABST,0,6,5,0,6
2207   _cp_set_op_params  p2,MIN_P_AND_T,0,6,5,0,6
2208   _cp_set_op_params  p2,MIN_ABSP_AND_ABST,0,6,5,0,6
2209   _cp_set_op_params  p2,LIMIT_P_TO_MAGT,0,6,5,0,6
2210   _cp_set_op_params  p2,CONVERT_T_TO_INT,0,5,0,0,5
2211   _cp_set_op_params  p2,SCALE_T_TO_INT_BY_Q,0,6,0,6,5
2212   _cp_set_op_params  p2,PQ_PLUS_T,0,7,5,6,7
2213   _cp_set_op_params  p2,MINUSPQ_PLUS_T,0,7,5,6,7
2214   _cp_set_op_params  p2,PQ_MINUS_T,0,7,5,6,7
2215   _cp_set_op_params  p2,MINUSPQ_MINUS_T,0,7,5,6,7
2216   _cp_set_op_params  p2,ABSPQ_PLUS_ABST,0,7,5,6,7
2217   _cp_set_op_params  p2,MINUSABSPQ_PLUS_ABST,0,7,5,6,7
2218   _cp_set_op_params  p2,ABSPQ_MINUS_ABST,0,7,5,6,7
2219   _cp_set_op_params  p2,ROUND_T_TO_INT,0,5,0,0,5
2220   _cp_set_op_params  p2,RECIPROCAL_OF_P,0,5,5,0,0
2221   _cp_set_op_params  p2,CONVERT_T_TO_ALT,0,5,0,0,5
2222   _cp_set_op_params  p2,CONVERT_T_FROM_ALT,0,5,0,0,5
2223   _cp_set_op_params  p2,I_PASS_P,0,5,5,0,0
2224   _cp_set_op_params  p2,I_MINUSP,0,5,5,0,0
2225   _cp_set_op_params  p2,I_ABSP,0,5,5,0,0
2226   _cp_set_op_params  p2,I_SIGNT_TIMES_ABSP,0,6,6,0,5
2227   _cp_set_op_params  p2,I_P_PLUS_T,0,6,5,0,6
2228   _cp_set_op_params  p2,I_P_MINUS_T,0,6,5,0,6
2229   _cp_set_op_params  p2,I_MINUSP_PLUS_T,0,6,5,0,6
2230   _cp_set_op_params  p2,I_ABS_P_PLUS_T,0,6,5,0,6
2231   _cp_set_op_params  p2,I_ABS_P_MINUS_T,0,6,5,0,6
2232   _cp_set_op_params  p2,I_P_TIMES_Q,0,6,5,6,0
2233   _cp_set_op_params  p2,I_COMPARE_P_AND_T,0,6,5,0,6
2234   _cp_set_op_params  p2,I_MAX_P_AND_T,0,6,5,0,6
2235   _cp_set_op_params  p2,I_MIN_P_AND_T,0,6,5,0,6
2236   _cp_set_op_params  p2,I_CONVERT_T_TO_FLOAT,0,5,0,0,5
2237   _cp_set_op_params  p2,I_SCALE_T_TO_FLOAT_BY_Q,0,6,0,6,5
2238   _cp_set_op_params  p2,I_P_OR_T,0,6,5,0,6
2239   _cp_set_op_params  p2,I_P_AND_T,0,6,5,0,6
2240   _cp_set_op_params  p2,I_P_XOR_T,0,6,5,0,6
2241   _cp_set_op_params  p2,I_NOT_T,0,5,0,0,5
2242   _cp_set_op_params  p2,I_LSHIFT_P_BY_Q,0,6,5,6,0
2243   _cp_set_op_params  p2,I_ASHIFT_P_BY_Q,0,6,5,6,0
2244   _cp_set_op_params  p2,I_FSHIFT_PT_BY_Q,0,7,5,7,6
2245   _cp_set_op_params  p2,MOVE_P,0,5,5,0,0
2246;
2247;
2248; if we couldn't find the op_code, flag an error
2249;
2250    .if _cp_op_type>=2
2251      .err
2252      .print "cp_build_inst: invalid Am29027 instruction mnemonic"
2253      .exitm
2254    .endif
2255;
2256; if number of parameters is incorrect, flag error
2257;
2258    .if $narg!=_cp_no_params
2259      .err
2260      .print "cp_build_inst: incorrect number of parameters"
2261      .exitm
2262    .endif
2263;
2264; find correct value for precision field, if appropriate
2265;
2266    .set _cp_prec_field,0 ; ** CORRECTION (1/4/89 ROP)
2267    .if _cp_op_type==0    ; need to look for precision
2268      .set _cp_found_precision,0
2269      .ifeqs "@p3@","D_D"
2270        .set _cp_prec_field,CP_@p3
2271        .set _cp_found_precision,1
2272      .endif
2273      .ifeqs "@p3@","D_S"
2274        .set _cp_prec_field,CP_@p3
2275        .set _cp_found_precision,1
2276      .endif
2277      .ifeqs "@p3@","S_D"
2278        .set _cp_prec_field,CP_@p3
2279        .set _cp_found_precision,1
2280      .endif
2281      .ifeqs "@p3@","S_S"
2282        .set _cp_prec_field,CP_@p3
2283        .set _cp_found_precision,1
2284      .endif
2285      .if _cp_found_precision==0
2286        .err
2287        .print "cp_build_inst: missing precision field"
2288        .exitm
2289      .endif
2290    .endif
2291;
2292; find value for destination field
2293;
2294    .if _cp_op_type==0
2295      .set _cp_dest_field_val,CP_DEST_EQ_@p4
2296    .else
2297      .set _cp_dest_field_val,CP_DEST_EQ_@p3
2298    .endif
2299;
2300; find correct value for p select field
2301;
2302     .if _cp_p_paramno==0
2303       .set _cp_p_field_val,0x00000000
2304     .endif
2305     .if _cp_p_paramno==4
2306       .set _cp_p_field_val,CP_P_EQ_@p4
2307     .endif
2308     .if _cp_p_paramno==5
2309       .set _cp_p_field_val,CP_P_EQ_@p5
2310     .endif
2311     .if _cp_p_paramno==6
2312       .set _cp_p_field_val,CP_P_EQ_@p6
2313     .endif
2314     .if _cp_p_paramno==7
2315       .set _cp_p_field_val,CP_P_EQ_@p7
2316     .endif
2317     .ifeqs "@p2@","I_NOT_T"
2318       .set _cp_p_field_val,CP_P_EQ_IMINUS1
2319     .endif
2320;
2321; find correct value for q select field
2322;
2323     .if _cp_q_paramno==0
2324       .set _cp_q_field_val,0x00000000
2325     .endif
2326     .if _cp_q_paramno==4
2327       .set _cp_q_field_val,CP_Q_EQ_@p4
2328     .endif
2329     .if _cp_q_paramno==5
2330       .set _cp_q_field_val,CP_Q_EQ_@p5
2331     .endif
2332     .if _cp_q_paramno==6
2333       .set _cp_q_field_val,CP_Q_EQ_@p6
2334     .endif
2335     .if _cp_q_paramno==7
2336       .set _cp_q_field_val,CP_Q_EQ_@p7
2337     .endif
2338;
2339; find correct value for t select field
2340;
2341     .if _cp_t_paramno==0
2342       .set _cp_t_field_val,0x00000000
2343     .endif
2344     .if _cp_t_paramno==4
2345       .set _cp_t_field_val,CP_T_EQ_@p4
2346     .endif
2347     .if _cp_t_paramno==5
2348       .set _cp_t_field_val,CP_T_EQ_@p5
2349     .endif
2350     .if _cp_t_paramno==6
2351       .set _cp_t_field_val,CP_T_EQ_@p6
2352     .endif
2353     .if _cp_t_paramno==7
2354       .set _cp_t_field_val,CP_T_EQ_@p7
2355     .endif
2356;
2357;
2358     .set _cp_inst_word,CP_@p2@|_cp_prec_field|_cp_dest_field_val
2359     .set _cp_inst_word,_cp_inst_word|_cp_p_field_val
2360     .set _cp_inst_word,_cp_inst_word|_cp_q_field_val
2361     .set _cp_inst_word,_cp_inst_word|_cp_t_field_val
2362
2363     const  p1,_cp_inst_word
2364     consth p1,_cp_inst_word
2365;
2366 .endm
2367;
2368;
2369;
2370 .macro _cp_set_op_params,par1,par2,par3,par4,par5,par6,par7
2371   .ifeqs "@par1@","@par2@"
2372     .set _cp_op_type,par3
2373     .set _cp_no_params,par4
2374     .set _cp_p_paramno,par5
2375     .set _cp_q_paramno,par6
2376     .set _cp_t_paramno,par7
2377    .endif
2378 .endm
2379;
2380;
2381;
2382;============================================================================
2383;  MACRO NAME: cp_build_inst_h
2384;
2385;  WRITTEN BY: Bob Perlman
2386;
2387;  MOST RECENT UPDATE:  April 24, 1988
2388;                    :  January 4, 1989 Rich Parker
2389;
2390;  FUNCTION:   Builds a 16 MSBs of a 32-bit Am29027 instruction in an
2391;              Am29000 g.p. register.
2392;
2393;  PARAMETERS:
2394;    reg       - the Am29000 g.p. register into which the instruction word
2395;                is to be written
2396;
2397;    op_code   - mnemonic specifying the operation to be performed
2398;                (e.g. FADD, P_TIMES_Q)
2399;
2400;    precision - precision specification for destination, source operands:
2401;                  D_S - double-prec. result, single-prec. input(s)
2402;                  D_D - double-prec. result, double-prec. input(s)
2403;                  S_S - single-prec. result, single-prec. input(s)
2404;                  S_D - single-prec. result, double-prec. input(s)
2405;
2406;    dest      - destination for the operation result:
2407;                  RF0 - store result in Am29027 register file location RF0
2408;                  RF1 - store result in Am29027 register file location RF1
2409;                  RF2 - store result in Am29027 register file location RF2
2410;                  RF3 - store result in Am29027 register file location RF3
2411;                  RF4 - store result in Am29027 register file location RF4
2412;                  RF5 - store result in Am29027 register file location RF5
2413;                  RF6 - store result in Am29027 register file location RF6
2414;                  RF7 - store result in Am29027 register file location RF7
2415;                  GP  - result is to be stored in an Am29000 g.p. register
2416;                          with a read_dp, read_sp, or read_int macro.
2417;
2418;    source1,
2419;    source2,
2420;    source3   - source operand specifications:
2421;                  R    - take source from Am29027 register R
2422;                  S    - take source from Am29027 register S
2423;                  RF0  - take source from Am29027 register file location RF0
2424;                  RF1  - take source from Am29027 register file location RF1
2425;                  RF2  - take source from Am29027 register file location RF2
2426;                  RF3  - take source from Am29027 register file location RF3
2427;                  RF4  - take source from Am29027 register file location RF4
2428;                  RF5  - take source from Am29027 register file location RF5
2429;                  RF6  - take source from Am29027 register file location RF6
2430;                  RF7  - take source from Am29027 register file location RF7
2431;                  0    - source is 0
2432;                  ONE_HALF - source is constant .5 (f.p. operations only)
2433;                  IMINUS1 - source is constant -1 (integer operations only)
2434;                  1    - source is constant 1
2435;                  2    - source is constant 2
2436;                  3    - source is constant 3
2437;                  PI   - source is constant pi (f.p. operations only)
2438;                  IMINUSMAX - source is -(2**63) (integer operations only)
2439;
2440;
2441;  USAGE:
2442;
2443;    cp_build_inst_h reg,op_code,[precision,]dest,source1[,source2][,source3]
2444;
2445;    This macro is similar to cp_build_inst, but creates only the 16 MSBs
2446;    of the 32-bit Am29027 instruction word.  This macro is useful in cases
2447;    where the 16 LSBs of instruction word, which specify the operation
2448;    to be performed, already exist in an Am29000 g.p. register, but where
2449;    the 16 MSBs, which specify operand sources and destination, must be
2450;    changed.  In such cases, one Am29000 instruction can be saved by using
2451;    cp_build_inst_h instead of cp_build_inst.
2452;
2453;    Syntax and usage are identical to that of cp_build_inst.
2454;
2455;    NOTE: This macro references macro _cp_set_op_params, which appears
2456;          in the assembly listing for macro _cp_build_inst.
2457;
2458;
2459;
2460;
2461;============================================================================
2462;
2463 .macro cp_build_inst_h,p1,p2,p3,p4,p5,p6,p7
2464;
2465   .if $narg<=3
2466     .err
2467     .print "cp_build_inst_h: missing parameter(s)"
2468     .exitm
2469   .endif
2470;
2471; classify operation type
2472;
2473   .set _cp_op_type,255
2474
2475   _cp_set_op_params  p2,FADD,1,5,4,0,5
2476   _cp_set_op_params  p2,DADD,1,5,4,0,5
2477   _cp_set_op_params  p2,FSUB,1,5,4,0,5
2478   _cp_set_op_params  p2,DSUB,1,5,4,0,5
2479   _cp_set_op_params  p2,FMUL,1,5,4,5,0
2480   _cp_set_op_params  p2,DMUL,1,5,4,5,0
2481   _cp_set_op_params  p2,FEQ,1,5,4,0,5
2482   _cp_set_op_params  p2,DEQ,1,5,4,0,5
2483   _cp_set_op_params  p2,FGE,1,5,4,0,5
2484   _cp_set_op_params  p2,DGE,1,5,4,0,5
2485   _cp_set_op_params  p2,FGT,1,5,4,0,5
2486   _cp_set_op_params  p2,DGT,1,5,4,0,5
2487   _cp_set_op_params  p2,CONVERT_I_TO_F,1,4,0,0,4
2488   _cp_set_op_params  p2,CONVERT_I_TO_D,1,4,0,0,4
2489   _cp_set_op_params  p2,CONVERT_F_TO_I,1,4,0,0,4
2490   _cp_set_op_params  p2,CONVERT_D_TO_I,1,4,0,0,4
2491;
2492; The next two lines were corrected on 1-4-89, Rich Parker
2493;
2494   _cp_set_op_params  p2,CONVERT_F_TO_D,1,4,4,0,0
2495   _cp_set_op_params  p2,CONVERT_D_TO_F,1,4,4,0,0
2496;
2497   _cp_set_op_params  p2,PASS_P,0,5,5,0,0
2498   _cp_set_op_params  p2,MINUSP,0,5,5,0,0
2499   _cp_set_op_params  p2,ABSP,0,5,5,0,0
2500   _cp_set_op_params  p2,SIGNT_TIMES_ABSP,0,6,6,0,5
2501   _cp_set_op_params  p2,P_PLUS_T,0,6,5,0,6
2502   _cp_set_op_params  p2,P_MINUS_T,0,6,5,0,6
2503   _cp_set_op_params  p2,MINUSP_PLUS_T,0,6,5,0,6
2504   _cp_set_op_params  p2,MINUSP_MINUS_T,0,6,5,0,6
2505   _cp_set_op_params  p2,ABS_P_PLUS_T,0,6,5,0,6
2506   _cp_set_op_params  p2,ABS_P_MINUS_T,0,6,5,0,6
2507   _cp_set_op_params  p2,ABSP_PLUS_ABST,0,6,5,0,6
2508   _cp_set_op_params  p2,ABSP_MINUS_ABST,0,6,5,0,6
2509   _cp_set_op_params  p2,ABS_ABSP_MINUS_ABST,0,6,5,0,6
2510   _cp_set_op_params  p2,P_TIMES_Q,0,6,5,6,0
2511   _cp_set_op_params  p2,MINUSP_TIMES_Q,0,6,5,6,0
2512   _cp_set_op_params  p2,ABS_P_TIMES_Q,0,6,5,6,0
2513   _cp_set_op_params  p2,COMPARE_P_AND_T,0,6,5,0,6
2514   _cp_set_op_params  p2,MAX_P_AND_T,0,6,5,0,6
2515   _cp_set_op_params  p2,MAX_ABSP_AND_ABST,0,6,5,0,6
2516   _cp_set_op_params  p2,MIN_P_AND_T,0,6,5,0,6
2517   _cp_set_op_params  p2,MIN_ABSP_AND_ABST,0,6,5,0,6
2518   _cp_set_op_params  p2,LIMIT_P_TO_MAGT,0,6,5,0,6
2519   _cp_set_op_params  p2,CONVERT_T_TO_INT,0,5,0,0,5
2520   _cp_set_op_params  p2,SCALE_T_TO_INT_BY_Q,0,6,0,6,5
2521   _cp_set_op_params  p2,PQ_PLUS_T,0,7,5,6,7
2522   _cp_set_op_params  p2,MINUSPQ_PLUS_T,0,7,5,6,7
2523   _cp_set_op_params  p2,PQ_MINUS_T,0,7,5,6,7
2524   _cp_set_op_params  p2,MINUSPQ_MINUS_T,0,7,5,6,7
2525   _cp_set_op_params  p2,ABSPQ_PLUS_ABST,0,7,5,6,7
2526   _cp_set_op_params  p2,MINUSABSPQ_PLUS_ABST,0,7,5,6,7
2527   _cp_set_op_params  p2,ABSPQ_MINUS_ABST,0,7,5,6,7
2528   _cp_set_op_params  p2,ROUND_T_TO_INT,0,5,0,0,5
2529   _cp_set_op_params  p2,RECIPROCAL_OF_P,0,5,5,0,0
2530   _cp_set_op_params  p2,CONVERT_T_TO_ALT,0,5,0,0,5
2531   _cp_set_op_params  p2,CONVERT_T_FROM_ALT,0,5,0,0,5
2532   _cp_set_op_params  p2,I_PASS_P,0,5,5,0,0
2533   _cp_set_op_params  p2,I_MINUSP,0,5,5,0,0
2534   _cp_set_op_params  p2,I_ABSP,0,5,5,0,0
2535   _cp_set_op_params  p2,I_SIGNT_TIMES_ABSP,0,6,6,0,5
2536   _cp_set_op_params  p2,I_P_PLUS_T,0,6,5,0,6
2537   _cp_set_op_params  p2,I_P_MINUS_T,0,6,5,0,6
2538   _cp_set_op_params  p2,I_MINUSP_PLUS_T,0,6,5,0,6
2539   _cp_set_op_params  p2,I_ABS_P_PLUS_T,0,6,5,0,6
2540   _cp_set_op_params  p2,I_ABS_P_MINUS_T,0,6,5,0,6
2541   _cp_set_op_params  p2,I_P_TIMES_Q,0,6,5,6,0
2542   _cp_set_op_params  p2,I_COMPARE_P_AND_T,0,6,5,0,6
2543   _cp_set_op_params  p2,I_MAX_P_AND_T,0,6,5,0,6
2544   _cp_set_op_params  p2,I_MIN_P_AND_T,0,6,5,0,6
2545   _cp_set_op_params  p2,I_CONVERT_T_TO_FLOAT,0,5,0,0,5
2546   _cp_set_op_params  p2,I_SCALE_T_TO_FLOAT_BY_Q,0,6,0,6,5
2547   _cp_set_op_params  p2,I_P_OR_T,0,6,5,0,6
2548   _cp_set_op_params  p2,I_P_AND_T,0,6,5,0,6
2549   _cp_set_op_params  p2,I_P_XOR_T,0,6,5,0,6
2550   _cp_set_op_params  p2,I_NOT_T,0,5,0,0,5
2551   _cp_set_op_params  p2,I_LSHIFT_P_BY_Q,0,6,5,6,0
2552   _cp_set_op_params  p2,I_ASHIFT_P_BY_Q,0,6,5,6,0
2553   _cp_set_op_params  p2,I_FSHIFT_PT_BY_Q,0,7,5,7,6
2554   _cp_set_op_params  p2,MOVE_P,0,5,5,0,0
2555;
2556;
2557; if we couldn't find the op_code, flag an error
2558;
2559    .if _cp_op_type>=2
2560      .err
2561      .print "cp_build_inst_h: invalid Am29027 instruction mnemonic"
2562      .exitm
2563    .endif
2564;
2565; if number of parameters is incorrect, flag error
2566;
2567    .if $narg!=_cp_no_params
2568      .err
2569      .print "cp_build_inst_h: incorrect number of parameters"
2570      .exitm
2571    .endif
2572;
2573; find correct value for precision field, if appropriate
2574;
2575    .set _cp_prec_field,0 ; ** CORRECTION (1-4-89 Rich Parker)
2576    .if _cp_op_type==0    ; need to look for precision
2577      .set _cp_found_precision,0
2578      .ifeqs "@p3@","D_D"
2579        .set _cp_prec_field,CP_@p3
2580        .set _cp_found_precision,1
2581      .endif
2582      .ifeqs "@p3@","D_S"
2583        .set _cp_prec_field,CP_@p3
2584        .set _cp_found_precision,1
2585      .endif
2586      .ifeqs "@p3@","S_D"
2587        .set _cp_prec_field,CP_@p3
2588        .set _cp_found_precision,1
2589      .endif
2590      .ifeqs "@p3@","S_S"
2591        .set _cp_prec_field,CP_@p3
2592        .set _cp_found_precision,1
2593      .endif
2594      .if _cp_found_precision==0
2595        .err
2596        .print "cp_build_inst_h: missing precision field"
2597        .exitm
2598      .endif
2599    .endif
2600;
2601; find value for destination field
2602;
2603    .if _cp_op_type==0
2604      .set _cp_dest_field_val,CP_DEST_EQ_@p4
2605    .else
2606      .set _cp_dest_field_val,CP_DEST_EQ_@p3
2607    .endif
2608;
2609; find correct value for p select field
2610;
2611     .if _cp_p_paramno==0
2612       .set _cp_p_field_val,0x00000000
2613     .endif
2614     .if _cp_p_paramno==4
2615       .set _cp_p_field_val,CP_P_EQ_@p4
2616     .endif
2617     .if _cp_p_paramno==5
2618       .set _cp_p_field_val,CP_P_EQ_@p5
2619     .endif
2620     .if _cp_p_paramno==6
2621       .set _cp_p_field_val,CP_P_EQ_@p6
2622     .endif
2623     .if _cp_p_paramno==7
2624       .set _cp_p_field_val,CP_P_EQ_@p7
2625     .endif
2626     .ifeqs "@p2@","I_NOT_T"
2627       .set _cp_p_field_val,CP_P_EQ_IMINUS1
2628     .endif
2629;
2630; find correct value for q select field
2631;
2632     .if _cp_q_paramno==0
2633       .set _cp_q_field_val,0x00000000
2634     .endif
2635     .if _cp_q_paramno==4
2636       .set _cp_q_field_val,CP_Q_EQ_@p4
2637     .endif
2638     .if _cp_q_paramno==5
2639       .set _cp_q_field_val,CP_Q_EQ_@p5
2640     .endif
2641     .if _cp_q_paramno==6
2642       .set _cp_q_field_val,CP_Q_EQ_@p6
2643     .endif
2644     .if _cp_q_paramno==7
2645       .set _cp_q_field_val,CP_Q_EQ_@p7
2646     .endif
2647;
2648; find correct value for t select field
2649;
2650     .if _cp_t_paramno==0
2651       .set _cp_t_field_val,0x00000000
2652     .endif
2653     .if _cp_t_paramno==4
2654       .set _cp_t_field_val,CP_T_EQ_@p4
2655     .endif
2656     .if _cp_t_paramno==5
2657       .set _cp_t_field_val,CP_T_EQ_@p5
2658     .endif
2659     .if _cp_t_paramno==6
2660       .set _cp_t_field_val,CP_T_EQ_@p6
2661     .endif
2662     .if _cp_t_paramno==7
2663       .set _cp_t_field_val,CP_T_EQ_@p7
2664     .endif
2665;
2666;
2667     .set _cp_inst_word,CP_@p2@|_cp_prec_field|_cp_dest_field_val
2668     .set _cp_inst_word,_cp_inst_word|_cp_p_field_val
2669     .set _cp_inst_word,_cp_inst_word|_cp_q_field_val
2670     .set _cp_inst_word,_cp_inst_word|_cp_t_field_val
2671;
2672     consth p1,_cp_inst_word
2673;
2674 .endm
2675;
2676;
2677;
2678;
2679;============================================================================
2680;  MACRO NAME: cp_build_inst_l
2681;
2682;  WRITTEN BY: Bob Perlman
2683;
2684;  MOST RECENT UPDATE:  April 24, 1988
2685;                    :  January 4, 1989 Rich Parker
2686;
2687;  FUNCTION:   Builds a 16 LSBs of a 32-bit Am29027 instruction in an
2688;              Am29000 g.p. register; the 16 MSBs of the register are
2689;              set to 0..
2690;
2691;  PARAMETERS:
2692;    reg       - the Am29000 g.p. register into which the instruction word
2693;                is to be written
2694;
2695;    op_code   - mnemonic specifying the operation to be performed
2696;                (e.g. FADD, P_TIMES_Q)
2697;
2698;    precision - precision specification for destination, source operands:
2699;                  D_S - double-prec. result, single-prec. input(s)
2700;                  D_D - double-prec. result, double-prec. input(s)
2701;                  S_S - single-prec. result, single-prec. input(s)
2702;                  S_D - single-prec. result, double-prec. input(s)
2703;
2704;    dest      - destination for the operation result:
2705;                  RF0 - store result in Am29027 register file location RF0
2706;                  RF1 - store result in Am29027 register file location RF1
2707;                  RF2 - store result in Am29027 register file location RF2
2708;                  RF3 - store result in Am29027 register file location RF3
2709;                  RF4 - store result in Am29027 register file location RF4
2710;                  RF5 - store result in Am29027 register file location RF5
2711;                  RF6 - store result in Am29027 register file location RF6
2712;                  RF7 - store result in Am29027 register file location RF7
2713;                  GP  - result is to be stored in an Am29000 g.p. register
2714;                          with a read_dp, read_sp, or read_int macro.
2715;
2716;    source1,
2717;    source2,
2718;    source3   - source operand specifications:
2719;                  R    - take source from Am29027 register R
2720;                  S    - take source from Am29027 register S
2721;                  RF0  - take source from Am29027 register file location RF0
2722;                  RF1  - take source from Am29027 register file location RF1
2723;                  RF2  - take source from Am29027 register file location RF2
2724;                  RF3  - take source from Am29027 register file location RF3
2725;                  RF4  - take source from Am29027 register file location RF4
2726;                  RF5  - take source from Am29027 register file location RF5
2727;                  RF6  - take source from Am29027 register file location RF6
2728;                  RF7  - take source from Am29027 register file location RF7
2729;                  0    - source is 0
2730;                  ONE_HALF - source is constant .5 (f.p. operations only)
2731;                  IMINUS1 - source is constant -1 (integer operations only)
2732;                  1    - source is constant 1
2733;                  2    - source is constant 2
2734;                  3    - source is constant 3
2735;                  PI   - source is constant pi (f.p. operations only)
2736;                  IMINUSMAX - source is -(2**63) (integer operations only)
2737;
2738;
2739;  USAGE:
2740;
2741;    cp_build_inst_l reg,op_code,[precision,]dest,source1[,source2][,source3]
2742;
2743;    This macro is similar to cp_build_inst, but creates only the 16 LSBs
2744;    of the 32-bit Am29027 instruction word; the 16 MSBs of the target
2745;    register are set to 0.  This macro is useful in cases
2746;    where it is helpful to specify instruction LSBs and MSBs separately,
2747;    to improve instruction scheduling.
2748;
2749;    Syntax and usage are identical to that of cp_build_inst.
2750;
2751;    NOTE: This macro references macro _cp_set_op_params, which appears
2752;          in the assembly listing for macro _cp_build_inst.
2753;
2754;
2755;============================================================================
2756;
2757 .macro cp_build_inst_l,p1,p2,p3,p4,p5,p6,p7
2758;
2759   .if $narg<=3
2760     .err
2761     .print "cp_build_inst_h: missing parameter(s)"
2762     .exitm
2763   .endif
2764;
2765; classify operation type
2766;
2767   .set _cp_op_type,255
2768
2769   _cp_set_op_params  p2,FADD,1,5,4,0,5
2770   _cp_set_op_params  p2,DADD,1,5,4,0,5
2771   _cp_set_op_params  p2,FSUB,1,5,4,0,5
2772   _cp_set_op_params  p2,DSUB,1,5,4,0,5
2773   _cp_set_op_params  p2,FMUL,1,5,4,5,0
2774   _cp_set_op_params  p2,DMUL,1,5,4,5,0
2775   _cp_set_op_params  p2,FEQ,1,5,4,0,5
2776   _cp_set_op_params  p2,DEQ,1,5,4,0,5
2777   _cp_set_op_params  p2,FGE,1,5,4,0,5
2778   _cp_set_op_params  p2,DGE,1,5,4,0,5
2779   _cp_set_op_params  p2,FGT,1,5,4,0,5
2780   _cp_set_op_params  p2,DGT,1,5,4,0,5
2781   _cp_set_op_params  p2,CONVERT_I_TO_F,1,4,0,0,4
2782   _cp_set_op_params  p2,CONVERT_I_TO_D,1,4,0,0,4
2783   _cp_set_op_params  p2,CONVERT_F_TO_I,1,4,0,0,4
2784   _cp_set_op_params  p2,CONVERT_D_TO_I,1,4,0,0,4
2785;
2786; The next two lines were corrected on 1-4-89, Rich Parker
2787;
2788   _cp_set_op_params  p2,CONVERT_F_TO_D,1,4,4,0,0
2789   _cp_set_op_params  p2,CONVERT_D_TO_F,1,4,4,0,0
2790;
2791   _cp_set_op_params  p2,PASS_P,0,5,5,0,0
2792   _cp_set_op_params  p2,MINUSP,0,5,5,0,0
2793   _cp_set_op_params  p2,ABSP,0,5,5,0,0
2794   _cp_set_op_params  p2,SIGNT_TIMES_ABSP,0,6,6,0,5
2795   _cp_set_op_params  p2,P_PLUS_T,0,6,5,0,6
2796   _cp_set_op_params  p2,P_MINUS_T,0,6,5,0,6
2797   _cp_set_op_params  p2,MINUSP_PLUS_T,0,6,5,0,6
2798   _cp_set_op_params  p2,MINUSP_MINUS_T,0,6,5,0,6
2799   _cp_set_op_params  p2,ABS_P_PLUS_T,0,6,5,0,6
2800   _cp_set_op_params  p2,ABS_P_MINUS_T,0,6,5,0,6
2801   _cp_set_op_params  p2,ABSP_PLUS_ABST,0,6,5,0,6
2802   _cp_set_op_params  p2,ABSP_MINUS_ABST,0,6,5,0,6
2803   _cp_set_op_params  p2,ABS_ABSP_MINUS_ABST,0,6,5,0,6
2804   _cp_set_op_params  p2,P_TIMES_Q,0,6,5,6,0
2805   _cp_set_op_params  p2,MINUSP_TIMES_Q,0,6,5,6,0
2806   _cp_set_op_params  p2,ABS_P_TIMES_Q,0,6,5,6,0
2807   _cp_set_op_params  p2,COMPARE_P_AND_T,0,6,5,0,6
2808   _cp_set_op_params  p2,MAX_P_AND_T,0,6,5,0,6
2809   _cp_set_op_params  p2,MAX_ABSP_AND_ABST,0,6,5,0,6
2810   _cp_set_op_params  p2,MIN_P_AND_T,0,6,5,0,6
2811   _cp_set_op_params  p2,MIN_ABSP_AND_ABST,0,6,5,0,6
2812   _cp_set_op_params  p2,LIMIT_P_TO_MAGT,0,6,5,0,6
2813   _cp_set_op_params  p2,CONVERT_T_TO_INT,0,5,0,0,5
2814   _cp_set_op_params  p2,SCALE_T_TO_INT_BY_Q,0,6,0,6,5
2815   _cp_set_op_params  p2,PQ_PLUS_T,0,7,5,6,7
2816   _cp_set_op_params  p2,MINUSPQ_PLUS_T,0,7,5,6,7
2817   _cp_set_op_params  p2,PQ_MINUS_T,0,7,5,6,7
2818   _cp_set_op_params  p2,MINUSPQ_MINUS_T,0,7,5,6,7
2819   _cp_set_op_params  p2,ABSPQ_PLUS_ABST,0,7,5,6,7
2820   _cp_set_op_params  p2,MINUSABSPQ_PLUS_ABST,0,7,5,6,7
2821   _cp_set_op_params  p2,ABSPQ_MINUS_ABST,0,7,5,6,7
2822   _cp_set_op_params  p2,ROUND_T_TO_INT,0,5,0,0,5
2823   _cp_set_op_params  p2,RECIPROCAL_OF_P,0,5,5,0,0
2824   _cp_set_op_params  p2,CONVERT_T_TO_ALT,0,5,0,0,5
2825   _cp_set_op_params  p2,CONVERT_T_FROM_ALT,0,5,0,0,5
2826   _cp_set_op_params  p2,I_PASS_P,0,5,5,0,0
2827   _cp_set_op_params  p2,I_MINUSP,0,5,5,0,0
2828   _cp_set_op_params  p2,I_ABSP,0,5,5,0,0
2829   _cp_set_op_params  p2,I_SIGNT_TIMES_ABSP,0,6,6,0,5
2830   _cp_set_op_params  p2,I_P_PLUS_T,0,6,5,0,6
2831   _cp_set_op_params  p2,I_P_MINUS_T,0,6,5,0,6
2832   _cp_set_op_params  p2,I_MINUSP_PLUS_T,0,6,5,0,6
2833   _cp_set_op_params  p2,I_ABS_P_PLUS_T,0,6,5,0,6
2834   _cp_set_op_params  p2,I_ABS_P_MINUS_T,0,6,5,0,6
2835   _cp_set_op_params  p2,I_P_TIMES_Q,0,6,5,6,0
2836   _cp_set_op_params  p2,I_COMPARE_P_AND_T,0,6,5,0,6
2837   _cp_set_op_params  p2,I_MAX_P_AND_T,0,6,5,0,6
2838   _cp_set_op_params  p2,I_MIN_P_AND_T,0,6,5,0,6
2839   _cp_set_op_params  p2,I_CONVERT_T_TO_FLOAT,0,5,0,0,5
2840   _cp_set_op_params  p2,I_SCALE_T_TO_FLOAT_BY_Q,0,6,0,6,5
2841   _cp_set_op_params  p2,I_P_OR_T,0,6,5,0,6
2842   _cp_set_op_params  p2,I_P_AND_T,0,6,5,0,6
2843   _cp_set_op_params  p2,I_P_XOR_T,0,6,5,0,6
2844   _cp_set_op_params  p2,I_NOT_T,0,5,0,0,5
2845   _cp_set_op_params  p2,I_LSHIFT_P_BY_Q,0,6,5,6,0
2846   _cp_set_op_params  p2,I_ASHIFT_P_BY_Q,0,6,5,6,0
2847   _cp_set_op_params  p2,I_FSHIFT_PT_BY_Q,0,7,5,7,6
2848   _cp_set_op_params  p2,MOVE_P,0,5,5,0,0
2849;
2850;
2851; if we couldn't find the op_code, flag an error
2852;
2853    .if _cp_op_type>=2
2854      .err
2855      .print "cp_build_inst_h: invalid Am29027 instruction mnemonic"
2856      .exitm
2857    .endif
2858;
2859; if number of parameters is incorrect, flag error
2860;
2861    .if $narg!=_cp_no_params
2862      .err
2863      .print "cp_build_inst_h: incorrect number of parameters"
2864      .exitm
2865    .endif
2866;
2867; find correct value for precision field, if appropriate
2868;
2869    .set _cp_prec_field,0 ; CORRECTION (1-4-89 Rich Parker)
2870    .if _cp_op_type==0    ; need to look for precision
2871      .set _cp_found_precision,0
2872      .ifeqs "@p3@","D_D"
2873        .set _cp_prec_field,CP_@p3
2874        .set _cp_found_precision,1
2875      .endif
2876      .ifeqs "@p3@","D_S"
2877        .set _cp_prec_field,CP_@p3
2878        .set _cp_found_precision,1
2879      .endif
2880      .ifeqs "@p3@","S_D"
2881        .set _cp_prec_field,CP_@p3
2882        .set _cp_found_precision,1
2883      .endif
2884      .ifeqs "@p3@","S_S"
2885        .set _cp_prec_field,CP_@p3
2886        .set _cp_found_precision,1
2887      .endif
2888      .if _cp_found_precision==0
2889        .err
2890        .print "cp_build_inst_h: missing precision field"
2891        .exitm
2892      .endif
2893    .endif
2894;
2895; find value for destination field
2896;
2897    .if _cp_op_type==0
2898      .set _cp_dest_field_val,CP_DEST_EQ_@p4
2899    .else
2900      .set _cp_dest_field_val,CP_DEST_EQ_@p3
2901    .endif
2902;
2903; find correct value for p select field
2904;
2905     .if _cp_p_paramno==0
2906       .set _cp_p_field_val,0x00000000
2907     .endif
2908     .if _cp_p_paramno==4
2909       .set _cp_p_field_val,CP_P_EQ_@p4
2910     .endif
2911     .if _cp_p_paramno==5
2912       .set _cp_p_field_val,CP_P_EQ_@p5
2913     .endif
2914     .if _cp_p_paramno==6
2915       .set _cp_p_field_val,CP_P_EQ_@p6
2916     .endif
2917     .if _cp_p_paramno==7
2918       .set _cp_p_field_val,CP_P_EQ_@p7
2919     .endif
2920     .ifeqs "@p2@","I_NOT_T"
2921       .set _cp_p_field_val,CP_P_EQ_IMINUS1
2922     .endif
2923;
2924; find correct value for q select field
2925;
2926     .if _cp_q_paramno==0
2927       .set _cp_q_field_val,0x00000000
2928     .endif
2929     .if _cp_q_paramno==4
2930       .set _cp_q_field_val,CP_Q_EQ_@p4
2931     .endif
2932     .if _cp_q_paramno==5
2933       .set _cp_q_field_val,CP_Q_EQ_@p5
2934     .endif
2935     .if _cp_q_paramno==6
2936       .set _cp_q_field_val,CP_Q_EQ_@p6
2937     .endif
2938     .if _cp_q_paramno==7
2939       .set _cp_q_field_val,CP_Q_EQ_@p7
2940     .endif
2941;
2942; find correct value for t select field
2943;
2944     .if _cp_t_paramno==0
2945       .set _cp_t_field_val,0x00000000
2946     .endif
2947     .if _cp_t_paramno==4
2948       .set _cp_t_field_val,CP_T_EQ_@p4
2949     .endif
2950     .if _cp_t_paramno==5
2951       .set _cp_t_field_val,CP_T_EQ_@p5
2952     .endif
2953     .if _cp_t_paramno==6
2954       .set _cp_t_field_val,CP_T_EQ_@p6
2955     .endif
2956     .if _cp_t_paramno==7
2957       .set _cp_t_field_val,CP_T_EQ_@p7
2958     .endif
2959;
2960;
2961     .set _cp_inst_word,CP_@p2@|_cp_prec_field|_cp_dest_field_val
2962     .set _cp_inst_word,_cp_inst_word|_cp_p_field_val
2963     .set _cp_inst_word,_cp_inst_word|_cp_q_field_val
2964     .set _cp_inst_word,_cp_inst_word|_cp_t_field_val
2965;
2966     const p1,_cp_inst_word
2967;
2968 .endm
2969;
2970; end of file fpsymbol.h
Note: See TracBrowser for help on using the repository browser.