OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib/] [newlib/] [libc/] [sys/] [a29khif/] [sys/] [fpsymbol.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 39 lampret
; @(#)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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.