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
2971