1/* Opcode infix
2   B  condition              16--20   U,C,Z,LO,HI, etc.
3   C  condition              23--27   U,C,Z,LO,HI, etc.
4
5   Arguments
6   ,  required arg follows
7   ;  optional arg follows
8
9   Argument types             bits    [classes] - example
10   -----------------------------------------------------------
11   *  indirect (all)          0--15   [A,AB,AU,AF,A2,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - *+AR0(5), *++AR0(IR0)
12   #  direct (for LDP)        0--15   [Z] - @start, start
13   @  direct                  0--15   [A,AB,AU,AF,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - @start, start
14   A  address register       22--24   [D] - AR0, AR7
15   B  unsigned integer        0--23   [I,I2] - @start, start  (absolute on C3x, relative on C4x)
16   C  indirect (disp - C4x)   0--7    [S,SC,S2,T,TC,T2,T2C] - *+AR0(5)
17   E  register (all)          0--7    [T,TC,T2,T2C] - R0, R7, R11, AR0, DP
18   e  register (0-11)         0--7    [S,SC,S2] - R0, R7, R11
19   F  short float immediate   0--15   [AF,B,BA,BB] - 3.5, 0e-3.5e-1
20   G  register (all)          8--15   [T,TC,T2,T2C] - R0, R7, R11, AR0, DP
21   g  register (0-11)         0--7    [S,SC,S2] - R0, R7, R11
22   H  register (0-7)         18--16   [LS,M,P,Q] - R0, R7
23   I  indirect (no disp)      0--7    [S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0)
24   i  indirect (enhanced)     0--7    [LL,LS,M,P,Q,QC] - *+AR0(1), R5
25   J  indirect (no disp)      8--15   [LL,LS,P,Q,QC,S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0)
26   j  indirect (enhanced)     8--15   [M] - *+AR0(1), R5
27   K  register               19--21   [LL,M,Q,QC] - R0, R7
28   L  register               22--24   [LL,LS,P,Q,QC] - R0, R7
29   M  register (R2,R3)       22--22   [M] R2, R3
30   N  register (R0,R1)       23--23   [M] R0, R1
31   O  indirect(disp - C4x)    8--15   [S,SC,S2,T,TC,T2] - *+AR0(5)
32   P  displacement (PC Rel)   0--15   [D,J,JS] - @start, start
33   Q  register (all)          0--15   [A,AB,AU,A2,A3,AY,BA,BI,D,I2,J,JS] - R0, AR0, DP, SP
34   q  register (0-11)         0--15   [AF,B,BB] - R0, R7, R11
35   R  register (all)         16--20   [A,AB,AU,AF,A6,A7,R,T,TC] - R0, AR0, DP, SP
36   r  register (0-11)        16--20   [B,BA,BB,BI,B6,B7,RF,S,SC] - R0, R1, R11
37   S  short int immediate     0--15   [A,AB,AY,BI] - -5, 5
38   T  integer (C4x)          16--20   [Z] - -5, 12
39   U  unsigned integer        0--15   [AU,A3] - 0, 65535
40   V  vector (C4x: 0--8)      0--4    [Z] - 25, 7
41   W  short int (C4x)         0--7    [T,TC,T2,T2C] - -3, 5
42   X  expansion reg (C4x)     0--4    [Z] - IVTP, TVTP
43   Y  address reg (C4x)      16--20   [Z] - AR0, DP, SP, IR0
44   Z  expansion reg (C4x)    16--20   [Z] - IVTP, TVTP
45*/
46
47/* A: General 2-operand integer operations
48   Syntax: <i> src, dst
49      src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
50      dst = Register (R)
51   Instr: 15/8 - ABSI, ADDC, ADDI, ASH, CMPI, LDI, LSH, MPYI, NEGB, NEGI,
52                SUBB, SUBC, SUBI, SUBRB, SUBRI, C4x: LBn, LHn, LWLn, LWRn,
53                MBn, MHn, MPYSHI, MPYUHI
54*/
55#define A_CLASS(name, level) \
56  .ifdef level                    &\
57name##_A:                         &\
58  name  AR1, AR0        /* Q;R */ &\
59  name  AR0             /* Q;R */ &\
60  name  @start, AR0     /* @,R */ &\
61  name  *+AR0(5), AR0   /* *,R */ &\
62  name  -5, AR0         /* S,R */ &\
63  .endif
64
65
66/* AB: General 2-operand integer operation with condition
67   Syntax: <i>c src, dst
68       c   = Condition
69       src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
70       dst = Register (R)
71   Instr: 1/0 - LDIc
72*/
73#define AB_CLASS(name, level) \
74  .ifdef level                    &\
75name##_AB:                        &\
76  name  AR1, AR0        /* Q;R */ &\
77  name  AR0             /* Q;R */ &\
78  name  @start, AR0     /* @,R */ &\
79  name  *+AR0(5), AR0   /* *,R */ &\
80  name  -5, AR0         /* S,R */ &\
81  .endif
82
83
84/* AU: General 2-operand unsigned integer operation
85   Syntax: <i> src, dst
86        src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U)
87        dst = Register (R)
88   Instr: 6/2 - AND, ANDN, NOT, OR, TSTB, XOR, C4x: LBUn, LHUn
89*/
90#define AU_CLASS(name, level) \
91  .ifdef level                    &\
92name##_AU:                        &\
93  name  AR1, AR0        /* Q;R */ &\
94  name  AR0             /* Q;R */ &\
95  name  @start, AR0     /* @,R */ &\
96  name  *+AR0(5), AR0   /* *,R */ &\
97  name  5, AR0          /* U,R */ &\
98  .endif
99
100
101/* AF: General 2-operand float to integer operation
102   Syntax: <i> src, dst
103        src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F)
104        dst = Register (R)
105   Instr: 1/0 - FIX
106*/
107#define AF_CLASS(name, level) \
108  .ifdef level                    &\
109name##_AF:                        &\
110  name  R1, R0          /* q;R */ &\
111  name  R0              /* q;R */ &\
112  name  @start, AR0     /* @,R */ &\
113  name  *+AR0(5), AR0   /* *,R */ &\
114  name  3.5, AR0        /* F,R */ &\
115  .endif
116
117
118/* A2: Limited 1-operand (integer) operation
119   Syntax: <i> src
120       src = Register (Q), Indirect (*), None
121   Instr: 1/0 - NOP
122*/
123#define A2_CLASS(name, level) \
124  .ifdef level                    &\
125name##_A2:                        &\
126  name  AR0               /* Q */ &\
127  name  *+AR0(5)          /* * */ &\
128  name                    /*   */ &\
129  .endif
130
131
132/* A3: General 1-operand unsigned integer operation
133   Syntax: <i> src
134        src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U)
135   Instr: 1/0 - RPTS
136*/
137#define A3_CLASS(name, level) \
138  .ifdef level                    &\
139name##_A3:                        &\
140  name  AR1               /* Q */ &\
141  name  @start            /* @ */ &\
142  name  *+AR0(5)          /* * */ &\
143  name  5                 /* U */ &\
144  .endif
145
146
147/* A6: Limited 2-operand integer operation
148   Syntax: <i> src, dst
149       src = Direct (@), Indirect (*)
150       dst = Register (R)
151   Instr: 1/1 - LDII, C4x: SIGI
152*/
153#define A6_CLASS(name, level) \
154  .ifdef level                    &\
155name##_A6:                        &\
156  name  @start, AR0     /* @,R */ &\
157  name  *+AR0(5), AR0   /* *,R */ &\
158  .endif
159
160
161/* A7: Limited 2-operand integer store operation
162   Syntax: <i> src, dst
163       src = Register (R)
164       dst = Direct (@), Indirect (*)
165   Instr: 2/0 - STI, STII
166*/
167#define A7_CLASS(name, level) \
168  .ifdef level                    &\
169name##_A7:                        &\
170  name  AR0, @start     /* R,@ */ &\
171  name  AR0, *+AR0(5)   /* R,* */ &\
172  .endif
173
174
175/* AY: General 2-operand signed address load operation
176   Syntax: <i> src, dst
177        src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
178        dst = Address register - ARx, IRx, DP, BK, SP (Y)
179   Instr: 0/1 - C4x: LDA
180   Note: Q and Y should *never* be the same register
181*/
182#define AY_CLASS(name, level) \
183  .ifdef level                    &\
184name##_AY:                        &\
185  name  AR1, AR0        /* Q,Y */ &\
186  name  @start, AR0     /* @,Y */ &\
187  name  *+AR0(5), AR0   /* *,Y */ &\
188  name  -5, AR0         /* S,Y */ &\
189  .endif
190
191
192/* B: General 2-operand float operation
193   Syntax: <i> src, dst
194       src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F)
195       dst = Register 0-11 (r)
196   Instr: 12/2 - ABSF, ADDF, CMPF, LDE, LDF, LDM, MPYF, NEGF, NORM, RND,
197                 SUBF, SUBRF, C4x: RSQRF, TOIEEE
198*/
199#define B_CLASS(name, level) \
200  .ifdef level                    &\
201name##_B:                         &\
202  name  R1, R0          /* q;r */ &\
203  name  R0              /* q;r */ &\
204  name  @start, R0      /* @,r */ &\
205  name  *+AR0(5), R0    /* *,r */ &\
206  name  3.5, R0         /* F,r */ &\
207  .endif
208
209
210/* BA: General 2-operand integer to float operation
211   Syntax: <i> src, dst
212       src = Register (Q), Direct (@), Indirect (*), Float immediate (F)
213       dst = Register 0-11 (r)
214   Instr: 0/1 - C4x: CRCPF
215*/
216#define BA_CLASS(name, level) \
217  .ifdef level                    &\
218name##_BA:                        &\
219  name  AR1, R0         /* Q;r */ &\
220  name  R0              /* Q;r */ &\
221  name  @start, R0      /* @,r */ &\
222  name  *+AR0(5), R0    /* *,r */ &\
223  name  3.5, R0         /* F,r */ &\
224  .endif
225
226
227/* BB: General 2-operand conditional float operation
228   Syntax: <i>c src, dst
229       c   = Condition
230       src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F)
231       dst = Register 0-11 (r)
232   Instr: 1/0 - LDFc
233*/
234#define BB_CLASS(name, level) \
235  .ifdef level                    &\
236name##_BB:                        &\
237  name  R1, R0          /* q;r */ &\
238  name  R0              /* q;r */ &\
239  name  @start, R0      /* @,r */ &\
240  name  *+AR0(5), R0    /* *,r */ &\
241  name  3.5, R0         /* F,r */ &\
242  .endif
243
244
245/* BI: General 2-operand integer to float operation (yet different to BA)
246   Syntax: <i> src, dst
247       src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
248       dst = Register 0-11 (r)
249   Instr: 1/0 - FLOAT
250*/
251#define BI_CLASS(name, level) \
252  .ifdef level                    &\
253name##_BI:                        &\
254  name  AR1, R0         /* Q;r */ &\
255  name  R0              /* Q;r */ &\
256  name  @start, R0      /* @,r */ &\
257  name  *+AR0(5), R0    /* *,r */ &\
258  name  -5, R0          /* S,r */ &\
259  .endif
260
261
262/* B6: Limited 2-operand float operation
263   Syntax: <i> src, dst
264       src = Direct (@), Indirect (*)
265       dst = Register 0-11 (r)
266   Instr: 1/1 - LDFI, C4x: FRIEEE
267*/
268#define B6_CLASS(name, level) \
269  .ifdef level                    &\
270name##_B6:                        &\
271  name  @start, R0      /* @,r */ &\
272  name  *+AR0(5), R0    /* *,r */ &\
273  .endif
274
275
276/* B7: Limited 2-operand float store operation
277   Syntax: <i> src, dst
278       src = Register 0-11 (r)
279       dst = Direct (@), Indirect (*)
280   Instr: 2/0 - STF, STFI
281*/
282#define B7_CLASS(name, level) \
283  .ifdef level                    &\
284name##_B7:                        &\
285  name  R0, @start      /* r,@ */ &\
286  name  R0, *+AR0(5)    /* r,* */ &\
287  .endif
288
289
290/* D: Decrement and brach operations
291   Syntax: <i>c ARn, dst
292       c   = condition
293       ARn = AR register 0-7 (A)
294       dst = Register (Q), PC-relative (P)
295   Instr: 2/0 - DBc, DBcD
296   Alias: <namea> <nameb>
297*/
298#define D_CLASS(namea, nameb, level) \
299  .ifdef level                    &\
300namea##_D:                        &\
301  namea  AR0, R0        /* A,Q */ &\
302  namea  AR0, start     /* A,P */ &\
303nameb##_D:                        &\
304  nameb  AR0, R0        /* A,Q */ &\
305  nameb  AR0, start     /* A,P */ &\
306  .endif
307
308
309/* J: General conditional branch operations
310   Syntax: <i>c dst
311       c   = Condition
312       dst = Register (Q), PC-relative (P)
313   Instr: 2/3 - Bc, BcD, C4x: BcAF, BcAT, LAJc
314   Alias: <namea> <nameb>
315*/
316#define J_CLASS(namea, nameb, level) \
317  .ifdef level                    &\
318namea##_J:                        &\
319  namea  R0               /* Q */ &\
320  namea  start            /* P */ &\
321nameb##_J:                        &\
322  nameb  R0               /* Q */ &\
323  nameb  start            /* P */ &\
324  .endif
325
326
327/* LL: Load-load parallell operation
328   Syntax: <i> src2, dst2 || <i> src1, dst1
329       src1 = Indirect 0,1,IR0,IR1 (J)
330       dst1 = Register 0-7 (K)
331       src2 = Indirect 0,1,IR0,IR1, ENH: Register (i)
332       dst2 = Register 0-7 (L)
333   Instr: 2/0 - LDF||LDF, LDI||LDI
334   Alias: i||i, i1||i2, i2||i1
335*/
336#define LL_CLASS(name, level) \
337  .ifdef level                                                      &\
338name##_LL:                                                          &\
339  name     *+AR0(1), R0  &||  name     *+AR1(1), R1   /* i;L|J,K */ &\
340  name##2  *+AR0(1), R0  &||  name##1  *+AR1(1), R1   /* i;L|J,K */ &\
341  name##1  *+AR1(1), R1  &||  name##2  *+AR0(1), R0   /* J,K|i;L */ &\
342  .endif                                                            &\
343  .ifdef TEST_ENH                                                   &\
344name##_LL_enh:                                                      &\
345  name     R0, R0        &||  name     *+AR1(1), R1   /* i;L|J,K */ &\
346  name     R0            &||  name     *+AR1(1), R1   /* i;L|J,K */ &\
347  name##2  R0, R0        &||  name##1  *+AR1(1), R1   /* i;L|J,K */ &\
348  name##2  R0            &||  name##1  *+AR1(1), R1   /* i;L|J,K */ &\
349  name##1  *+AR1(1), R1  &||  name##2  R0, R0         /* J,K|i;L */ &\
350  name##1  *+AR1(1), R1  &||  name##2  R0             /* J,K|i;L */ &\
351  .endif
352
353
354
355/* LS: Store-store parallell operation
356   Syntax: <i> src2, dst2 || <i> src1, dst1
357       src1 = Register 0-7 (H)
358       dst1 = Indirect 0,1,IR0,IR1 (J)
359       src2 = Register 0-7 (L)
360       dst2 = Indirect 0,1,IR0,IR1, ENH: register (i)
361   Instr: 2/0 - STF||STF, STI||STI
362   Alias: i||i, i1||i2, i2||i1.
363*/
364#define LS_CLASS(name, level) \
365  .ifdef level                                                      &\
366name##_LS:                                                          &\
367  name     R0, *+AR0(1)  &||  name     R1, *+AR1(1)   /* L;i|H,J */ &\
368  name##2  R0, *+AR0(1)  &||  name##1  R1, *+AR1(1)   /* L;i|H,J */ &\
369  name##1  R1, *+AR1(1)  &||  name##2  R0, *+AR0(1)   /* H,J|L;i */ &\
370  .endif                                                            &\
371  .ifdef TEST_ENH                                                   &\
372name##_LS_enh:                                                      &\
373  name     R0, R0        &||  name     R1, *+AR1(1)   /* L;i|H,J */ &\
374  name     R0            &||  name     R1, *+AR1(1)   /* L;i|H,J */ &\
375  name##2  R0, R0        &||  name##1  R1, *+AR1(1)   /* L;i|H,J */ &\
376  name##2  R0            &||  name##1  R1, *+AR1(1)   /* L;i|H,J */ &\
377  name##1  R1, *+AR1(1)  &||  name##2  R0, R0         /* H,J|L;i */ &\
378  name##1  R1, *+AR1(1)  &||  name##2  R0             /* H,J|L;i */ &\
379  .endif
380
381
382/* M: General multiply and add/sub operations
383   Syntax: <ia> src3,src4,dst1 || <ib> src2,src1,dst2 [00] - Manual
384           <ia> src3,src1,dst1 || <ib> src2,src4,dst2 [01] - Manual
385           <ia> src1,src3,dst1 || <ib> src2,src4,dst2 [01]
386           <ia> src1,src2,dst1 || <ib> src4,src3,dst2 [02] - Manual
387           <ia> src3,src1,dst1 || <ib> src4,src2,dst2 [03] - Manual
388           <ia> src1,src3,dst1 || <ib> src4,src2,dst2 [03]
389       src1 = Register 0-7 (K)
390       src2 = Register 0-7 (H)
391       src3 = Indirect 0,1,IR0,IR1, ENH: register (j)
392       src4 = Indirect 0,1,IR0,IR1, ENH: register (i)
393       dst1 = Register 0-1 (N)
394       dst2 = Register 2-3 (M)
395   Instr: 4/0 - MPYF3||ADDF3, MPYF3||SUBF3, MPYI3||ADDI3, MPYI3||SUBI3
396   Alias: a||b, a3||n, a||b3, a3||b3, b||a, b3||a, b||a3, b3||a3
397*/
398#define M_CLASS(namea, nameb, level) \
399  .ifdef level                                                                                &\
400namea##_##nameb##_M:                                                                          &\
401  namea     *+AR0(1), *+AR1(1), R0  &||  nameb     R0, R1, R2               /* i;j;N|H;K;M */ &\
402  namea     *+AR0(1), *+AR1(1), R0  &||  nameb     R0, R2                   /* i;j;N|H;K;M */ &\
403  namea     *+AR0(1), R0, R0        &||  nameb     R0, *+AR1(1), R2         /* j;K;N|H;i;M */ &\
404  namea     *+AR0(1), R0            &||  nameb     R0, *+AR1(1), R2         /* j;K;N|H;i;M */ &\
405  namea     R0, *+AR0(1), R0        &||  nameb     R0, *+AR1(1), R2         /* K;j;N|H;i;M */ &\
406  namea     R2, R1, R0              &||  nameb     *+AR0(1), *+AR1(1), R2   /* H;K;N|i;j;M */ &\
407  namea     R2, R0                  &||  nameb     *+AR0(1), *+AR1(1), R2   /* H;K;N|i;j;M */ &\
408  namea     *+AR0(1), R1, R0        &||  nameb     *+AR1(1), R3, R2         /* j;K;N|i;H;M */ &\
409  namea     *+AR0(1), R0            &||  nameb     *+AR1(1), R3, R2         /* j;K;N|i;H;M */ &\
410  namea     *+AR0(1), R1, R0        &||  nameb     *+AR1(1), R2             /* j;K;N|i;H;M */ &\
411  namea     *+AR0(1), R0            &||  nameb     *+AR1(1), R2             /* j;K;N|i;H;M */ &\
412  namea     R0, *+AR0(1), R0        &||  nameb     *+AR1(1), R0, R2         /* K;j;N|i;H;M */ &\
413  namea     R0, *+AR0(1), R0        &||  nameb     *+AR1(1), R2             /* K;j;N|i;H;M */ &\
414  .endif                                                                                      &\
415  .ifdef TEST_ENH                                                                             &\
416namea##_##nameb##_M_enh:                                                                      &\
417  namea     R0, R0, R0              &||  nameb     R2, R2, R2               /* i;j;N|H;K;M */ &\
418  namea     R0, R0                  &||  nameb     R2, R2, R2               /* i;j;N|H;K;M */ &\
419  namea     R0                      &||  nameb     R2, R2, R2               /* i;j;N|H;K;M */ &\
420  namea     R0, R0                  &||  nameb     R2, R2                   /* i;j;N|H;K;M */ &\
421  namea     R0                      &||  nameb     R2, R2                   /* i;j;N|H;K;M */ &\
422  namea     R0                      &||  nameb     R2                       /* i;j;N|H;K;M */ &\
423  namea     AR0, AR0, R0            &||  nameb     R2, R2, R2               /* i;j;N|H;K;M */ &\
424  namea     AR0, R0, R0             &||  nameb     R0, AR0, R2              /* j;K;N|H;i;M */ &\
425  namea     R0, AR0, R0             &||  nameb     R0, AR0, R2              /* K;j;N|H;i;M */ &\
426  namea     R2, R1, R0              &||  nameb     AR0, AR1, R2             /* H;K;N|i;j;M */ &\
427  namea     AR0, R1, R0             &||  nameb     AR0, R3, R2              /* j;K;N|i;H;M */ &\
428  namea     R0, AR0, R0             &||  nameb     AR0, R0, R2              /* K;j;N|i;H;M */ &\
429  .endif                                                                                      &\
430  .ifdef level                                                                                &\
431namea##3_##nameb##_M:                                                                         &\
432  namea##3  *+AR0(1), *+AR1(1), R0  &||  nameb     R0, R1, R2               /* i;j;N|H;K;M */ &\
433  namea##3  *+AR0(1), *+AR1(1), R0  &||  nameb     R0, R2                   /* i;j;N|H;K;M */ &\
434  namea##3  *+AR0(1), R0, R0        &||  nameb     R0, *+AR1(1), R2         /* j;K;N|H;i;M */ &\
435  namea##3  *+AR0(1), R0            &||  nameb     R0, *+AR1(1), R2         /* j;K;N|H;i;M */ &\
436  namea##3  R0, *+AR0(1), R0        &||  nameb     R0, *+AR1(1), R2         /* K;j;N|H;i;M */ &\
437  namea##3  R2, R1, R0              &||  nameb     *+AR0(1), *+AR1(1), R2   /* H;K;N|i;j;M */ &\
438  namea##3  R2, R0                  &||  nameb     *+AR0(1), *+AR1(1), R2   /* H;K;N|i;j;M */ &\
439  namea##3  *+AR0(1), R1, R0        &||  nameb     *+AR1(1), R3, R2         /* j;K;N|i;H;M */ &\
440  namea##3  *+AR0(1), R0            &||  nameb     *+AR1(1), R3, R2         /* j;K;N|i;H;M */ &\
441  namea##3  *+AR0(1), R1, R0        &||  nameb     *+AR1(1), R2             /* j;K;N|i;H;M */ &\
442  namea##3  *+AR0(1), R0            &||  nameb     *+AR1(1), R2             /* j;K;N|i;H;M */ &\
443  namea##3  R0, *+AR0(1), R0        &||  nameb     *+AR1(1), R0, R2         /* K;j;N|i;H;M */ &\
444  namea##3  R0, *+AR0(1), R0        &||  nameb     *+AR1(1), R2             /* K;j;N|i;H;M */ &\
445  .endif                                                                                      &\
446  .ifdef TEST_ENH                                                                             &\
447namea##3_##nameb##_M_enh:                                                                     &\
448  namea##3  R0, R0, R0              &||  nameb     R2, R2, R2               /* i;j;N|H;K;M */ &\
449  namea##3  R0, R0                  &||  nameb     R2, R2, R2               /* i;j;N|H;K;M */ &\
450  namea##3  R0                      &||  nameb     R2, R2, R2               /* i;j;N|H;K;M */ &\
451  namea##3  R0, R0                  &||  nameb     R2, R2                   /* i;j;N|H;K;M */ &\
452  namea##3  R0                      &||  nameb     R2, R2                   /* i;j;N|H;K;M */ &\
453  namea##3  R0                      &||  nameb     R2                       /* i;j;N|H;K;M */ &\
454  namea##3  AR0, AR0, R0            &||  nameb     R2, R2, R2               /* i;j;N|H;K;M */ &\
455  namea##3  AR0, R0, R0             &||  nameb     R0, AR0, R2              /* j;K;N|H;i;M */ &\
456  namea##3  R0, AR0, R0             &||  nameb     R0, AR0, R2              /* K;j;N|H;i;M */ &\
457  namea##3  R2, R1, R0              &||  nameb     AR0, AR1, R2             /* H;K;N|i;j;M */ &\
458  namea##3  AR0, R1, R0             &||  nameb     AR0, R3, R2              /* j;K;N|i;H;M */ &\
459  namea##3  R0, AR0, R0             &||  nameb     AR0, R0, R2              /* K;j;N|i;H;M */ &\
460  .endif                                                                                      &\
461  .ifdef level                                                                                &\
462namea##_##nameb##3_M:                                                                         &\
463  namea     *+AR0(1), *+AR1(1), R0  &||  nameb##3  R0, R1, R2               /* i;j;N|H;K;M */ &\
464  namea     *+AR0(1), *+AR1(1), R0  &||  nameb##3  R0, R2                   /* i;j;N|H;K;M */ &\
465  namea     *+AR0(1), R0, R0        &||  nameb##3  R0, *+AR1(1), R2         /* j;K;N|H;i;M */ &\
466  namea     *+AR0(1), R0            &||  nameb##3  R0, *+AR1(1), R2         /* j;K;N|H;i;M */ &\
467  namea     R0, *+AR0(1), R0        &||  nameb##3  R0, *+AR1(1), R2         /* K;j;N|H;i;M */ &\
468  namea     R2, R1, R0              &||  nameb##3  *+AR0(1), *+AR1(1), R2   /* H;K;N|i;j;M */ &\
469  namea     R2, R0                  &||  nameb##3  *+AR0(1), *+AR1(1), R2   /* H;K;N|i;j;M */ &\
470  namea     *+AR0(1), R1, R0        &||  nameb##3  *+AR1(1), R3, R2         /* j;K;N|i;H;M */ &\
471  namea     *+AR0(1), R0            &||  nameb##3  *+AR1(1), R3, R2         /* j;K;N|i;H;M */ &\
472  namea     *+AR0(1), R1, R0        &||  nameb##3  *+AR1(1), R2             /* j;K;N|i;H;M */ &\
473  namea     *+AR0(1), R0            &||  nameb##3  *+AR1(1), R2             /* j;K;N|i;H;M */ &\
474  namea     R0, *+AR0(1), R0        &||  nameb##3  *+AR1(1), R0, R2         /* K;j;N|i;H;M */ &\
475  namea     R0, *+AR0(1), R0        &||  nameb##3  *+AR1(1), R2             /* K;j;N|i;H;M */ &\
476  .endif                                                                                      &\
477  .ifdef TEST_ENH                                                                             &\
478namea##_##nameb##3_M_enh:                                                                     &\
479  namea     R0, R0, R0              &||  nameb##3  R2, R2, R2               /* i;j;N|H;K;M */ &\
480  namea     R0, R0                  &||  nameb##3  R2, R2, R2               /* i;j;N|H;K;M */ &\
481  namea     R0                      &||  nameb##3  R2, R2, R2               /* i;j;N|H;K;M */ &\
482  namea     R0, R0                  &||  nameb##3  R2, R2                   /* i;j;N|H;K;M */ &\
483  namea     R0                      &||  nameb##3  R2, R2                   /* i;j;N|H;K;M */ &\
484  namea     R0                      &||  nameb##3  R2                       /* i;j;N|H;K;M */ &\
485  namea     AR0, AR0, R0            &||  nameb##3  R2, R2, R2               /* i;j;N|H;K;M */ &\
486  namea     AR0, R0, R0             &||  nameb##3  R0, AR0, R2              /* j;K;N|H;i;M */ &\
487  namea     R0, AR0, R0             &||  nameb##3  R0, AR0, R2              /* K;j;N|H;i;M */ &\
488  namea     R2, R1, R0              &||  nameb##3  AR0, AR1, R2             /* H;K;N|i;j;M */ &\
489  namea     AR0, R1, R0             &||  nameb##3  AR0, R3, R2              /* j;K;N|i;H;M */ &\
490  namea     R0, AR0, R0             &||  nameb##3  AR0, R0, R2              /* K;j;N|i;H;M */ &\
491  .endif                                                                                      &\
492  .ifdef level                                                                                &\
493namea##3_##nameb##3_M:                                                                        &\
494  namea##3  *+AR0(1), *+AR1(1), R0  &||  nameb##3  R0, R1, R2               /* i;j;N|H;K;M */ &\
495  namea##3  *+AR0(1), *+AR1(1), R0  &||  nameb##3  R0, R2                   /* i;j;N|H;K;M */ &\
496  namea##3  *+AR0(1), R0, R0        &||  nameb##3  R0, *+AR1(1), R2         /* j;K;N|H;i;M */ &\
497  namea##3  *+AR0(1), R0            &||  nameb##3  R0, *+AR1(1), R2         /* j;K;N|H;i;M */ &\
498  namea##3  R0, *+AR0(1), R0        &||  nameb##3  R0, *+AR1(1), R2         /* K;j;N|H;i;M */ &\
499  namea##3  R2, R1, R0              &||  nameb##3  *+AR0(1), *+AR1(1), R2   /* H;K;N|i;j;M */ &\
500  namea##3  R2, R0                  &||  nameb##3  *+AR0(1), *+AR1(1), R2   /* H;K;N|i;j;M */ &\
501  namea##3  *+AR0(1), R1, R0        &||  nameb##3  *+AR1(1), R3, R2         /* j;K;N|i;H;M */ &\
502  namea##3  *+AR0(1), R0            &||  nameb##3  *+AR1(1), R3, R2         /* j;K;N|i;H;M */ &\
503  namea##3  *+AR0(1), R1, R0        &||  nameb##3  *+AR1(1), R2             /* j;K;N|i;H;M */ &\
504  namea##3  *+AR0(1), R0            &||  nameb##3  *+AR1(1), R2             /* j;K;N|i;H;M */ &\
505  namea##3  R0, *+AR0(1), R0        &||  nameb##3  *+AR1(1), R0, R2         /* K;j;N|i;H;M */ &\
506  namea##3  R0, *+AR0(1), R0        &||  nameb##3  *+AR1(1), R2             /* K;j;N|i;H;M */ &\
507  .endif                                                                                      &\
508  .ifdef TEST_ENH                                                                             &\
509namea##3_##nameb##3_M_enh:                                                                    &\
510  namea##3  R0, R0, R0              &||  nameb##3  R2, R2, R2               /* i;j;N|H;K;M */ &\
511  namea##3  R0, R0                  &||  nameb##3  R2, R2, R2               /* i;j;N|H;K;M */ &\
512  namea##3  R0                      &||  nameb##3  R2, R2, R2               /* i;j;N|H;K;M */ &\
513  namea##3  R0, R0                  &||  nameb##3  R2, R2                   /* i;j;N|H;K;M */ &\
514  namea##3  R0                      &||  nameb##3  R2, R2                   /* i;j;N|H;K;M */ &\
515  namea##3  R0                      &||  nameb##3  R2                       /* i;j;N|H;K;M */ &\
516  namea##3  AR0, AR0, R0            &||  nameb##3  R2, R2, R2               /* i;j;N|H;K;M */ &\
517  namea##3  AR0, R0, R0             &||  nameb##3  R0, AR0, R2              /* j;K;N|H;i;M */ &\
518  namea##3  R0, AR0, R0             &||  nameb##3  R0, AR0, R2              /* K;j;N|H;i;M */ &\
519  namea##3  R2, R1, R0              &||  nameb##3  AR0, AR1, R2             /* H;K;N|i;j;M */ &\
520  namea##3  AR0, R1, R0             &||  nameb##3  AR0, R3, R2              /* j;K;N|i;H;M */ &\
521  namea##3  R0, AR0, R0             &||  nameb##3  AR0, R0, R2              /* K;j;N|i;H;M */ &\
522  .endif                                                                                      &\
523  .ifdef level                                                                                &\
524nameb##_##namea##_M:                                                                          &\
525  nameb     R0, R1, R2              &||  namea     *+AR0(1), *+AR1(1), R0   /* H;K;M|i;j;N */ &\
526  nameb     R0, R2                  &||  namea     *+AR0(1), *+AR1(1), R0   /* H;K;M|i;j;N */ &\
527  nameb     R0, *+AR1(1), R2        &||  namea     *+AR0(1), R0, R0         /* H;i;M|j;K;N */ &\
528  nameb     R0, *+AR1(1), R2        &||  namea     *+AR0(1), R0             /* H;i;M|j;K;N */ &\
529  nameb     R0, *+AR1(1), R2        &||  namea     R0, *+AR0(1), R0         /* H;i;M|K;j;N */ &\
530  nameb     *+AR0(1), *+AR1(1), R2  &||  namea     R2, R1, R0               /* i;j;M|H;K;N */ &\
531  nameb     *+AR0(1), *+AR1(1), R2  &||  namea     R2, R0                   /* i;j;M|H;K;N */ &\
532  nameb     *+AR1(1), R3, R2        &||  namea     *+AR0(1), R1, R0         /* i;H;M|j;K;N */ &\
533  nameb     *+AR1(1), R3, R2        &||  namea     *+AR0(1), R0             /* i;H;M|j;K;N */ &\
534  nameb     *+AR1(1), R2            &||  namea     *+AR0(1), R1, R0         /* i;H;M|j;K;N */ &\
535  nameb     *+AR1(1), R2            &||  namea     *+AR0(1), R0             /* i;H;M|j;K;N */ &\
536  nameb     *+AR1(1), R0, R2        &||  namea     R0, *+AR0(1), R0         /* i;H;M|K;j;N */ &\
537  nameb     *+AR1(1), R2            &||  namea     R0, *+AR0(1), R0         /* i;H;M|K;j;N */ &\
538  .endif                                                                                      &\
539  .ifdef TEST_ENH                                                                             &\
540nameb##_##namea##_M_enh:                                                                      &\
541  nameb     R2, R2, R2              &||  namea     R0, R0, R0               /* H;K;M|i;j;N */ &\
542  nameb     R2, R2, R2              &||  namea     R0, R0                   /* H;K;M|i;j;N */ &\
543  nameb     R2, R2, R2              &||  namea     R0                       /* H;K;M|i;j;N */ &\
544  nameb     R2, R2                  &||  namea     R0, R0                   /* H;K;M|i;j;N */ &\
545  nameb     R2, R2                  &||  namea     R0                       /* H;K;M|i;j;N */ &\
546  nameb     R2                      &||  namea     R0                       /* H;K;M|i;j;N */ &\
547  nameb     R2, R2, R2              &||  namea     AR0, AR0, R0             /* H;K;M|i;j;N */ &\
548  nameb     R0, AR0, R2             &||  namea     AR0, R0, R0              /* H;i;M|j;K;N */ &\
549  nameb     R0, AR0, R2             &||  namea     R0, AR0, R0              /* H;i;M|K;j;N */ &\
550  nameb     AR0, AR1, R2            &||  namea     R2, R1, R0               /* i;j;M|H;K;N */ &\
551  nameb     AR0, R3, R2             &||  namea     AR0, R1, R0              /* i;H;M|j;K;N */ &\
552  nameb     AR0, R0, R2             &||  namea     R0, AR0, R0              /* i;H;M|K;j;N */ &\
553  .endif                                                                                      &\
554  .ifdef level                                                                                &\
555nameb##3_##namea##_M:                                                                         &\
556  nameb##3  R0, R1, R2              &||  namea     *+AR0(1), *+AR1(1), R0   /* H;K;M|i;j;N */ &\
557  nameb##3  R0, R2                  &||  namea     *+AR0(1), *+AR1(1), R0   /* H;K;M|i;j;N */ &\
558  nameb##3  R0, *+AR1(1), R2        &||  namea     *+AR0(1), R0, R0         /* H;i;M|j;K;N */ &\
559  nameb##3  R0, *+AR1(1), R2        &||  namea     *+AR0(1), R0             /* H;i;M|j;K;N */ &\
560  nameb##3  R0, *+AR1(1), R2        &||  namea     R0, *+AR0(1), R0         /* H;i;M|K;j;N */ &\
561  nameb##3  *+AR0(1), *+AR1(1), R2  &||  namea     R2, R1, R0               /* i;j;M|H;K;N */ &\
562  nameb##3  *+AR0(1), *+AR1(1), R2  &||  namea     R2, R0                   /* i;j;M|H;K;N */ &\
563  nameb##3  *+AR1(1), R3, R2        &||  namea     *+AR0(1), R1, R0         /* i;H;M|j;K;N */ &\
564  nameb##3  *+AR1(1), R3, R2        &||  namea     *+AR0(1), R0             /* i;H;M|j;K;N */ &\
565  nameb##3  *+AR1(1), R2            &||  namea     *+AR0(1), R1, R0         /* i;H;M|j;K;N */ &\
566  nameb##3  *+AR1(1), R2            &||  namea     *+AR0(1), R0             /* i;H;M|j;K;N */ &\
567  nameb##3  *+AR1(1), R0, R2        &||  namea     R0, *+AR0(1), R0         /* i;H;M|K;j;N */ &\
568  nameb##3  *+AR1(1), R2            &||  namea     R0, *+AR0(1), R0         /* i;H;M|K;j;N */ &\
569  .endif                                                                                      &\
570  .ifdef TEST_ENH                                                                             &\
571nameb##3_##namea##_M_enh:                                                                     &\
572  nameb##3  R2, R2, R2              &||  namea     R0, R0, R0               /* H;K;M|i;j;N */ &\
573  nameb##3  R2, R2, R2              &||  namea     R0, R0                   /* H;K;M|i;j;N */ &\
574  nameb##3  R2, R2, R2              &||  namea     R0                       /* H;K;M|i;j;N */ &\
575  nameb##3  R2, R2                  &||  namea     R0, R0                   /* H;K;M|i;j;N */ &\
576  nameb##3  R2, R2                  &||  namea     R0                       /* H;K;M|i;j;N */ &\
577  nameb##3  R2                      &||  namea     R0                       /* H;K;M|i;j;N */ &\
578  nameb##3  R2, R2, R2              &||  namea     AR0, AR0, R0             /* H;K;M|i;j;N */ &\
579  nameb##3  R0, AR0, R2             &||  namea     AR0, R0, R0              /* H;i;M|j;K;N */ &\
580  nameb##3  R0, AR0, R2             &||  namea     R0, AR0, R0              /* H;i;M|K;j;N */ &\
581  nameb##3  AR0, AR1, R2            &||  namea     R2, R1, R0               /* i;j;M|H;K;N */ &\
582  nameb##3  AR0, R3, R2             &||  namea     AR0, R1, R0              /* i;H;M|j;K;N */ &\
583  nameb##3  AR0, R0, R2             &||  namea     R0, AR0, R0              /* i;H;M|K;j;N */ &\
584  .endif                                                                                      &\
585  .ifdef level                                                                                &\
586nameb##_##namea##3_M:                                                                         &\
587  nameb     R0, R1, R2              &||  namea##3  *+AR0(1), *+AR1(1), R0   /* H;K;M|i;j;N */ &\
588  nameb     R0, R2                  &||  namea##3  *+AR0(1), *+AR1(1), R0   /* H;K;M|i;j;N */ &\
589  nameb     R0, *+AR1(1), R2        &||  namea##3  *+AR0(1), R0, R0         /* H;i;M|j;K;N */ &\
590  nameb     R0, *+AR1(1), R2        &||  namea##3  *+AR0(1), R0             /* H;i;M|j;K;N */ &\
591  nameb     R0, *+AR1(1), R2        &||  namea##3  R0, *+AR0(1), R0         /* H;i;M|K;j;N */ &\
592  nameb     *+AR0(1), *+AR1(1), R2  &||  namea##3  R2, R1, R0               /* i;j;M|H;K;N */ &\
593  nameb     *+AR0(1), *+AR1(1), R2  &||  namea##3  R2, R0                   /* i;j;M|H;K;N */ &\
594  nameb     *+AR1(1), R3, R2        &||  namea##3  *+AR0(1), R1, R0         /* i;H;M|j;K;N */ &\
595  nameb     *+AR1(1), R3, R2        &||  namea##3  *+AR0(1), R0             /* i;H;M|j;K;N */ &\
596  nameb     *+AR1(1), R2            &||  namea##3  *+AR0(1), R1, R0         /* i;H;M|j;K;N */ &\
597  nameb     *+AR1(1), R2            &||  namea##3  *+AR0(1), R0             /* i;H;M|j;K;N */ &\
598  nameb     *+AR1(1), R0, R2        &||  namea##3  R0, *+AR0(1), R0         /* i;H;M|K;j;N */ &\
599  nameb     *+AR1(1), R2            &||  namea##3  R0, *+AR0(1), R0         /* i;H;M|K;j;N */ &\
600  .endif                                                                                      &\
601  .ifdef TEST_ENH                                                                             &\
602nameb##_##namea##3_M_enh:                                                                     &\
603  nameb     R2, R2, R2              &||  namea##3  R0, R0, R0               /* H;K;M|i;j;N */ &\
604  nameb     R2, R2, R2              &||  namea##3  R0, R0                   /* H;K;M|i;j;N */ &\
605  nameb     R2, R2, R2              &||  namea##3  R0                       /* H;K;M|i;j;N */ &\
606  nameb     R2, R2                  &||  namea##3  R0, R0                   /* H;K;M|i;j;N */ &\
607  nameb     R2, R2                  &||  namea##3  R0                       /* H;K;M|i;j;N */ &\
608  nameb     R2                      &||  namea##3  R0                       /* H;K;M|i;j;N */ &\
609  nameb     R2, R2, R2              &||  namea##3  AR0, AR0, R0             /* H;K;M|i;j;N */ &\
610  nameb     R0, AR0, R2             &||  namea##3  AR0, R0, R0              /* H;i;M|j;K;N */ &\
611  nameb     R0, AR0, R2             &||  namea##3  R0, AR0, R0              /* H;i;M|K;j;N */ &\
612  nameb     AR0, AR1, R2            &||  namea##3  R2, R1, R0               /* i;j;M|H;K;N */ &\
613  nameb     AR0, R3, R2             &||  namea##3  AR0, R1, R0              /* i;H;M|j;K;N */ &\
614  nameb     AR0, R0, R2             &||  namea##3  R0, AR0, R0              /* i;H;M|K;j;N */ &\
615  .endif                                                                                      &\
616  .ifdef level                                                                                &\
617nameb##3_##namea##3_M:                                                                        &\
618  nameb##3  R0, R1, R2              &||  namea##3  *+AR0(1), *+AR1(1), R0   /* H;K;M|i;j;N */ &\
619  nameb##3  R0, R2                  &||  namea##3  *+AR0(1), *+AR1(1), R0   /* H;K;M|i;j;N */ &\
620  nameb##3  R0, *+AR1(1), R2        &||  namea##3  *+AR0(1), R0, R0         /* H;i;M|j;K;N */ &\
621  nameb##3  R0, *+AR1(1), R2        &||  namea##3  *+AR0(1), R0             /* H;i;M|j;K;N */ &\
622  nameb##3  R0, *+AR1(1), R2        &||  namea##3  R0, *+AR0(1), R0         /* H;i;M|K;j;N */ &\
623  nameb##3  *+AR0(1), *+AR1(1), R2  &||  namea##3  R2, R1, R0               /* i;j;M|H;K;N */ &\
624  nameb##3  *+AR0(1), *+AR1(1), R2  &||  namea##3  R2, R0                   /* i;j;M|H;K;N */ &\
625  nameb##3  *+AR1(1), R3, R2        &||  namea##3  *+AR0(1), R1, R0         /* i;H;M|j;K;N */ &\
626  nameb##3  *+AR1(1), R3, R2        &||  namea##3  *+AR0(1), R0             /* i;H;M|j;K;N */ &\
627  nameb##3  *+AR1(1), R2            &||  namea##3  *+AR0(1), R1, R0         /* i;H;M|j;K;N */ &\
628  nameb##3  *+AR1(1), R2            &||  namea##3  *+AR0(1), R0             /* i;H;M|j;K;N */ &\
629  nameb##3  *+AR1(1), R0, R2        &||  namea##3  R0, *+AR0(1), R0         /* i;H;M|K;j;N */ &\
630  nameb##3  *+AR1(1), R2            &||  namea##3  R0, *+AR0(1), R0         /* i;H;M|K;j;N */ &\
631  .endif                                                                                      &\
632  .ifdef TEST_ENH                                                                             &\
633nameb##3_##namea##3_M_enh:                                                                    &\
634  nameb##3  R2, R2, R2              &||  namea##3  R0, R0, R0               /* H;K;M|i;j;N */ &\
635  nameb##3  R2, R2, R2              &||  namea##3  R0, R0                   /* H;K;M|i;j;N */ &\
636  nameb##3  R2, R2, R2              &||  namea##3  R0                       /* H;K;M|i;j;N */ &\
637  nameb##3  R2, R2                  &||  namea##3  R0, R0                   /* H;K;M|i;j;N */ &\
638  nameb##3  R2, R2                  &||  namea##3  R0                       /* H;K;M|i;j;N */ &\
639  nameb##3  R2                      &||  namea##3  R0                       /* H;K;M|i;j;N */ &\
640  nameb##3  R2, R2, R2              &||  namea##3  AR0, AR0, R0             /* H;K;M|i;j;N */ &\
641  nameb##3  R0, AR0, R2             &||  namea##3  AR0, R0, R0              /* H;i;M|j;K;N */ &\
642  nameb##3  R0, AR0, R2             &||  namea##3  R0, AR0, R0              /* H;i;M|K;j;N */ &\
643  nameb##3  AR0, AR1, R2            &||  namea##3  R2, R1, R0               /* i;j;M|H;K;N */ &\
644  nameb##3  AR0, R3, R2             &||  namea##3  AR0, R1, R0              /* i;H;M|j;K;N */ &\
645  nameb##3  AR0, R0, R2             &||  namea##3  R0, AR0, R0              /* i;H;M|K;j;N */ &\
646  .endif
647
648/* P: General 2-operand operation with parallell store
649   Syntax: <ia> src2, dst1 || <ib> src3, dst2
650       src2 = Indirect 0,1,IR0,IR1, ENH: register (i)
651       dst1 = Register 0-7 (L)
652       src3 = Register 0-7 (H)
653       dst2 = Indirect 0,1,IR0,IR1 (J)
654   Instr: 9/2 - ABSF||STF, ABSI||STI, FIX||STI, FLOAT||STF, LDF||STF,
655                LDI||STI, NEGF||STF, NEGI||STI, NOT||STI, C4x: FRIEEE||STF,
656                TOIEEE||STF
657   Alias: a||b, b||a
658*/
659#define P_CLASS(namea, nameb, level) \
660  .ifdef level                                                  &\
661namea##_##nameb##_P:                                            &\
662  namea  *+AR0(1), R0  &||  nameb  R1, *+AR1(1)   /* i;L|H,J */ &\
663  nameb  R1, *+AR1(1)  &||  namea  *+AR0(1), R0   /* H,J|i;L */ &\
664  .endif                                                        &\
665  .ifdef TEST_ENH                                               &\
666namea##_##nameb##_P_enh:                                        &\
667  namea  R0, R0        &||  nameb  R1, *+AR1(1)   /* i;L|H,J */ &\
668  namea  R0            &||  nameb  R1, *+AR1(1)   /* i;L|H,J */ &\
669  nameb  R1, *+AR1(1)  &||  namea  R0, R0         /* H,J|i;L */ &\
670  nameb  R1, *+AR1(1)  &||  namea  R0             /* H,J|i;L */ &\
671  .endif
672
673
674/* Q: General 3-operand operation with parallell store
675   Syntax: <ia> src1, src2, dst1 || <ib> src3, dst2
676       src1 = Register 0-7 (K)
677       src2 = Indirect 0,1,IR0,IR1, ENH: register (i)
678       dst1 = Register 0-7 (L)
679       src3 = Register 0-7 (H)
680       dst2 = Indirect 0,1,IR0,IR1 (J)
681   Instr: 4/0 - ASH3||STI, LSH3||STI, SUBF3||STF, SUBI3||STI
682   Alias: a||b, b||a, a3||b, b||a3
683*/
684#define Q_CLASS(namea, nameb, level) \
685  .ifdef level                                                                  &\
686namea##_##nameb##_Q:                                                            &\
687  namea     R0, *+AR0(1), R0  &||  nameb     R1, *+AR1(1)       /* K,i;L|H,J */ &\
688  nameb     R1, *+AR1(1)      &||  namea     R0, *+AR0(1), R0   /* H,J|K,i;L */ &\
689  .endif                                                                        &\
690  .ifdef TEST_ENH                                                               &\
691namea##_##nameb##_Q_enh:                                                        &\
692  namea     R0, R0, R0        &||  nameb     R1, *+AR1(1)       /* K,i;L|H,J */ &\
693  namea     R0, R0            &||  nameb     R1, *+AR1(1)       /* K,i;L|H,J */ &\
694  nameb     R1, *+AR1(1)      &||  namea     R0, R0, R0         /* H,J|K,i;L */ &\
695  nameb     R1, *+AR1(1)      &||  namea     R0, R0             /* H,J|K,i;L */ &\
696  .endif                                                                        &\
697  .ifdef level                                                                  &\
698namea##3_##nameb##_Q:                                                           &\
699  namea##3  R0, *+AR0(1), R0  &||  nameb     R1, *+AR1(1)       /* K,i;L|H,J */ &\
700  nameb     R1, *+AR1(1)      &||  namea##3  R0, *+AR0(1), R0   /* H,J|K,i;L */ &\
701  .endif                                                                        &\
702  .ifdef TEST_ENH                                                               &\
703namea##3_##nameb##_Q_enh:                                                       &\
704  namea##3  R0, R0, R0        &||  nameb     R1, *+AR1(1)       /* K,i;L|H,J */ &\
705  namea##3  R0, R0            &||  nameb     R1, *+AR1(1)       /* K,i;L|H,J */ &\
706  nameb     R1, *+AR1(1)      &||  namea##3  R0, R0, R0         /* H,J|K,i;L */ &\
707  nameb     R1, *+AR1(1)      &||  namea##3  R0, R0             /* H,J|K,i;L */ &\
708  .endif
709
710
711/* QC: General commutative 3-operand operation with parallell store
712   Syntax: <ia> src2, src1, dst1 || <ib> src3, dst2
713           <ia> src1, src2, dst1 || <ib> src3, dst2 - Manual
714       src1 = Register 0-7 (K)
715       src2 = Indirect 0,1,IR0,IR1, ENH: register (i)
716       dst1 = Register 0-7 (L)
717       src3 = Register 0-7 (H)
718       dst2 = Indirect 0,1,IR0,IR1 (J)
719   Instr: 7/0 - ADDF3||STF, ADDI3||STI, AND3||STI, MPYF3||STF, MPYI3||STI,
720                OR3||STI, XOR3||STI
721   Alias: a||b, b||a, a3||b, b||a3
722*/
723#define QC_CLASS(namea, nameb, level) \
724  .ifdef level                                                                  &\
725namea##_##nameb##_QC:                                                           &\
726  namea     *+AR0(1), R1, R0  &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
727  namea     *+AR0(1), R0      &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
728  namea     R0, *+AR0(1), R0  &||  nameb     R1, *+AR1(1)       /* K;i;L|H,J */ &\
729  nameb     R1, *+AR1(1)      &||  namea     *+AR0(1), R1, R0   /* H,J|i;K;L */ &\
730  nameb     R1, *+AR1(1)      &||  namea     *+AR0(1), R0       /* H,J|i;K;L */ &\
731  nameb     R1, *+AR1(1)      &||  namea     R0, *+AR0(1), R0   /* H,J|K;i;L */ &\
732  .endif                                                                        &\
733  .ifdef TEST_ENH                                                               &\
734namea##_##nameb##_QC_enh:                                                       &\
735  namea     AR0, R1, R0       &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
736  namea     R2, R1, R0        &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
737  namea     R1, R0            &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
738  namea     R0                &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
739  namea     R0, AR0, R0       &||  nameb     R1, *+AR1(1)       /* K;i;L|H,J */ &\
740  nameb     R1, *+AR1(1)      &||  namea     AR0, R1, R0        /* H,J|i;K;L */ &\
741  nameb     R1, *+AR1(1)      &||  namea     R2, R1, R0         /* H,J|i;K;L */ &\
742  nameb     R1, *+AR1(1)      &||  namea     R1, R0             /* H,J|i;K;L */ &\
743  nameb     R1, *+AR1(1)      &||  namea     R0                 /* H,J|i;K;L */ &\
744  nameb     R1, *+AR1(1)      &||  namea     R0, AR0, R0        /* H,J|K;i;L */ &\
745  .endif                                                                        &\
746  .ifdef level                                                                  &\
747namea##3_##nameb##_QC:                                                          &\
748  namea##3  *+AR0(1), R1, R0  &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
749  namea##3  *+AR0(1), R0      &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
750  namea##3  R0, *+AR0(1), R0  &||  nameb     R1, *+AR1(1)       /* K;i;L|H,J */ &\
751  nameb     R1, *+AR1(1)      &||  namea##3  *+AR0(1), R1, R0   /* H,J|i;K;L */ &\
752  nameb     R1, *+AR1(1)      &||  namea##3  *+AR0(1), R0       /* H,J|i;K;L */ &\
753  nameb     R1, *+AR1(1)      &||  namea##3  R0, *+AR0(1), R0   /* H,J|K;i;L */ &\
754  .endif                                                                        &\
755  .ifdef TEST_ENH                                                               &\
756namea##3_##nameb##_QC_enh:                                                      &\
757  namea##3  AR0, R1, R0       &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
758  namea##3  R2, R1, R0        &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
759  namea##3  R1, R0            &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
760  namea##3  R0                &||  nameb     R1, *+AR1(1)       /* i;K;L|H,J */ &\
761  namea##3  R0, AR0, R0       &||  nameb     R1, *+AR1(1)       /* K;i;L|H,J */ &\
762  nameb     R1, *+AR1(1)      &||  namea##3  AR0, R1, R0        /* H,J|i;K;L */ &\
763  nameb     R1, *+AR1(1)      &||  namea##3  R2, R1, R0         /* H,J|i;K;L */ &\
764  nameb     R1, *+AR1(1)      &||  namea##3  R1, R0             /* H,J|i;K;L */ &\
765  nameb     R1, *+AR1(1)      &||  namea##3  R0                 /* H,J|i;K;L */ &\
766  nameb     R1, *+AR1(1)      &||  namea##3  R0, AR0, R0        /* H,J|K;i;L */ &\
767  .endif
768
769
770/* R: General register integer operation
771   Syntax: <i> dst
772       dst = Register (R)
773   Instr: 6/0 - POP, PUSH, ROL, ROLC, ROR, RORC
774*/
775#define R_CLASS(name, level) \
776  .ifdef level                    &\
777name##_R:                         &\
778  name  AR0               /* R */ &\
779  .endif
780
781
782/* RF: General register float operation
783   Syntax: <i> dst
784       dst = Register 0-11 (r)
785   Instr: 2/0 - POPF, PUSHF
786*/
787#define RF_CLASS(name, level) \
788  .ifdef level                    &\
789name##_RF:                        &\
790  name  F0                /* r */ &\
791  .endif
792
793
794/* S: General 3-operand float operation
795   Syntax: <i> src2, src1, dst
796       src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C)
797       src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
798       dst  = Register 0-11 (r)
799   Instr: 1/0 - SUBF3
800   Alias: i, i3
801*/
802#define S_CLASS(name, level) \
803  .ifdef level                                  &\
804name##_S:                                       &\
805  name     R2, R1, R0               /* e,g;r */ &\
806  name     R1, R0                   /* e,g;r */ &\
807  name     R1, *+AR0(1), R0         /* e,J,r */ &\
808  name     *+AR0(1), R1, R0         /* I,g;r */ &\
809  name     *+AR0(1), R0             /* I,g;r */ &\
810  name     *+AR0(1), *+AR1(1), R0   /* I,J,r */ &\
811  .endif                                        &\
812  .ifdef TEST_C4X                               &\
813name##_S_c4x:                                   &\
814  name     *+AR0(5), R1, R0         /* C,g;r */ &\
815  name     *+AR0(5), R0             /* C,g;r */ &\
816  name     *+AR0(5), *+AR1(5), R0   /* C,O,r */ &\
817  .endif                                        &\
818  .ifdef level                                  &\
819name##3_S:                                      &\
820  name##3  R2, R1, R0               /* e,g;r */ &\
821  name##3  R1, R0                   /* e,g;r */ &\
822  name##3  R1, *+AR0(1), R0         /* e,J,r */ &\
823  name##3  *+AR0(1), R1, R0         /* I,g;r */ &\
824  name##3  *+AR0(1), R0             /* I,g;r */ &\
825  name##3  *+AR0(1), *+AR1(1), R0   /* I,J,r */ &\
826  .endif                                        &\
827  .ifdef TEST_C4X                               &\
828name##3_S_c4x:                                  &\
829  name##3  *+AR0(5), R1, R0         /* C,g;r */ &\
830  name##3  *+AR0(5), R0             /* C,g;r */ &\
831  name##3  *+AR0(5), *+AR1(5), R0   /* C,O,r */ &\
832  .endif
833
834
835/* SC: General commutative 3-operand float operation
836   Syntax: <i> src2, src1, dst - Manual
837           <i> src1, src2, dst
838       src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C)
839       src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
840       dst  = Register 0-11 (r)
841   Instr: 2/0 - ADDF3, MPYF3
842   Alias: i, i3
843*/
844#define SC_CLASS(name, level) \
845  .ifdef level                                  &\
846name##_SC:                                      &\
847  name     R2, R1, R0               /* e,g;r */ &\
848  name     R1, R0                   /* e,g;r */ &\
849  name     R1, *+AR0(1), R0         /* e,J,r */ &\
850  name     *+AR0(1), R1, R0         /* I,g;r */ &\
851  name     *+AR0(1), R0             /* I,g;r */ &\
852  name     *+AR0(1), *+AR1(1), R0   /* I,J,r */ &\
853  .endif                                        &\
854  .ifdef TEST_C4X                               &\
855name##_SC_c4x:                                  &\
856  name     *+AR0(5), R1, R0         /* C,g;r */ &\
857  name     *+AR0(5), R0             /* C,g;r */ &\
858  name     R1, *+AR0(5), R0         /* g,C,r */ &\
859  name     *+AR0(5), *+AR1(5), R0   /* C,O,r */ &\
860  .endif                                        &\
861  .ifdef level                                  &\
862name##3_SC:                                     &\
863  name##3  R2, R1, R0               /* e,g;r */ &\
864  name##3  R1, R0                   /* e,g;r */ &\
865  name##3  R1, *+AR0(1), R0         /* e,J,r */ &\
866  name##3  *+AR0(1), R1, R0         /* I,g;r */ &\
867  name##3  *+AR0(1), R0             /* I,g;r */ &\
868  name##3  *+AR0(1), *+AR1(1), R0   /* I,J,r */ &\
869  .endif                                        &\
870  .ifdef TEST_C4X                               &\
871name##3_SC_c4x:                                 &\
872  name##3  *+AR0(5), R1, R0         /* C,g;r */ &\
873  name##3  *+AR0(5), R0             /* C,g;r */ &\
874  name##3  R1, *+AR0(5), R0         /* g,C,r */ &\
875  name##3  *+AR0(5), *+AR1(5), R0   /* C,O,r */ &\
876  .endif
877
878
879/* S2: General 3-operand float operation with 2 args
880   Syntax: <i> src2, src1
881       src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C)
882       src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
883   Instr: 1/0 - CMPF3
884   Alias: i, i3
885*/
886#define S2_CLASS(name, level) \
887  .ifdef level                                &\
888name##_S2:                                    &\
889  name     R2, R1                   /* e,g */ &\
890  name     R1, *+AR0(1)             /* e,J */ &\
891  name     *+AR0(1), R1             /* I,g */ &\
892  name     *+AR0(1), *+AR1(1)       /* I,J */ &\
893  .endif                                      &\
894  .ifdef TEST_C4X                             &\
895name##_S2_c4x:                                &\
896  name     *+AR0(5), R1             /* C,g */ &\
897  name     *+AR0(5), *+AR1(5)       /* C,O */ &\
898  .endif                                      &\
899  .ifdef level                                &\
900name##3_S2:                                   &\
901  name##3  R2, R1                   /* e,g */ &\
902  name##3  R1, *+AR0(1)             /* e,J */ &\
903  name##3  *+AR0(1), R1             /* I,g */ &\
904  name##3  *+AR0(1), *+AR1(1)       /* I,J */ &\
905  .endif                                      &\
906  .ifdef TEST_C4X                             &\
907name##3_S2_c4x:                               &\
908  name##3  *+AR0(5), R1             /* C,g */ &\
909  name##3  *+AR0(5), *+AR1(5)       /* C,O */ &\
910  .endif
911
912
913/* T: General 3-operand integer operand
914   Syntax: <i> src2, src1, dst
915       src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
916       src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
917       dst  = Register (R)
918   Instr: 5/0 - ANDN3, ASH3, LSH3, SUBB3, SUBI3
919   Alias: i, i3
920*/
921#define T_CLASS(name, level) \
922  .ifdef level                                   &\
923name##_T:                                        &\
924  name     AR2, AR1, AR0             /* E,G;R */ &\
925  name     AR1, AR0                  /* E,G;R */ &\
926  name     AR1, *+AR0(1), AR0        /* E,J,R */ &\
927  name     *+AR0(1), AR1, AR0        /* I,G;R */ &\
928  name     *+AR0(1), AR0             /* I,G;R */ &\
929  name     *+AR1(1), *+AR0(1), AR0   /* I,J,R */ &\
930  .endif                                         &\
931  .ifdef   TEST_C4X                              &\
932name##_T_sc:                                     &\
933  name     -5, AR1, AR0              /* W,G;R */ &\
934  name     -5, AR0                   /* W,G;R */ &\
935  name     *+AR0(5), AR1, AR0        /* C,G;R */ &\
936  name     *+AR0(5), AR0             /* C,G;R */ &\
937  name     -5, *+AR0(5), AR0         /* W,O,R */ &\
938  name     *+AR0(5), *+AR1(5), AR0   /* C,O,R */ &\
939  .endif                                         &\
940  .ifdef level                                   &\
941name##3_T:                                       &\
942  name##3  AR2, AR1, AR0             /* E,G;R */ &\
943  name##3  AR1, AR0                  /* E,G;R */ &\
944  name##3  AR1, *+AR0(1), AR0        /* E,J,R */ &\
945  name##3  *+AR0(1), AR1, AR0        /* I,G;R */ &\
946  name##3  *+AR0(1), AR0             /* I,G;R */ &\
947  name##3  *+AR1(1), *+AR0(1), AR0   /* I,J,R */ &\
948  .endif                                         &\
949  .ifdef   TEST_C4X                              &\
950name##3_T_sc:                                    &\
951  name##3  -5, AR1, AR0              /* W,G;R */ &\
952  name##3  -5, AR0                   /* W,G;R */ &\
953  name##3  *+AR0(5), AR1, AR0        /* C,G;R */ &\
954  name##3  *+AR0(5), AR0             /* C,G;R */ &\
955  name##3  -5, *+AR0(5), AR0         /* W,O,R */ &\
956  name##3  *+AR0(5), *+AR1(5), AR0   /* C,O,R */ &\
957  .endif
958
959
960/* TC: General commutative 3-operand integer operation
961   Syntax: <i> src2, src1, dst
962           <i> src1, src2, dst
963       src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
964       src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
965       dst  = Register (R)
966   Instr: 6/2 - ADDC3, ADDI3, AND3, MPYI3, OR3, XOR3, C4x: MPYSHI, MPYUHI
967   Alias: i, i3
968*/
969#define TC_CLASS(name, level) \
970  .ifdef level                                   &\
971name##_TC:                                       &\
972  name     AR2, AR1, AR0             /* E,G;R */ &\
973  name     AR1, AR0                  /* E,G;R */ &\
974  name     AR1, *+AR0(1), AR0        /* E,J,R */ &\
975  name     *+AR0(1), AR1, AR0        /* I,G;R */ &\
976  name     *+AR0(1), AR0             /* I,G;R */ &\
977  name     *+AR1(1), *+AR0(1), AR0   /* I,J,R */ &\
978  .endif                                         &\
979  .ifdef   TEST_C4X                              &\
980name##_TC_c4x:                                   &\
981  name     -5, AR1, AR0              /* W,G;R */ &\
982  name     -5, AR0                   /* W,G;R */ &\
983  name     AR1, -5, AR0              /* G,W,R */ &\
984  name     *+AR0(5), AR1, AR0        /* C,G;R */ &\
985  name     *+AR0(5), AR0             /* C,G;R */ &\
986  name     AR1, *+AR0(5), AR0        /* G,C,R */ &\
987  name     -5, *+AR0(5), AR0         /* W,O,R */ &\
988  name     *+AR0(5), -5, AR0         /* O,W,R */ &\
989  name     *+AR0(5), *+AR1(5), AR0   /* C,O,R */ &\
990  .endif                                         &\
991  .ifdef level                                   &\
992name##3_TC:                                      &\
993  name##3  AR2, AR1, AR0             /* E,G;R */ &\
994  name##3  AR1, AR0                  /* E,G;R */ &\
995  name##3  AR1, *+AR0(1), AR0        /* E,J,R */ &\
996  name##3  *+AR0(1), AR1, AR0        /* I,G;R */ &\
997  name##3  *+AR0(1), AR0             /* I,G;R */ &\
998  name##3  *+AR1(1), *+AR0(1), AR0   /* I,J,R */ &\
999  .endif                                         &\
1000  .ifdef   TEST_C4X                              &\
1001name##3_TC_c4x:                                  &\
1002  name##3  -5, AR1, AR0              /* W,G;R */ &\
1003  name##3  -5, AR0                   /* W,G;R */ &\
1004  name##3  AR1, -5, AR0              /* G,W,R */ &\
1005  name##3  *+AR0(5), AR1, AR0        /* C,G;R */ &\
1006  name##3  *+AR0(5), AR0             /* C,G;R */ &\
1007  name##3  AR1, *+AR0(5), AR0        /* G,C,R */ &\
1008  name##3  -5, *+AR0(5), AR0         /* W,O,R */ &\
1009  name##3  *+AR0(5), -5, AR0         /* O,W,R */ &\
1010  name##3  *+AR0(5), *+AR1(5), AR0   /* C,O,R */ &\
1011  .endif
1012
1013
1014/* T2: General 3-operand integer operation with 2 args
1015   Syntax: <i> src2, src1
1016       src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
1017       src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
1018   Instr: 1/0 - CMPI3
1019   Alias: i, i3
1020*/
1021#define T2_CLASS(name, level) \
1022  .ifdef level                                 &\
1023name##_T2:                                     &\
1024  name     AR2, AR1                  /* E,G */ &\
1025  name     AR1, *+AR0(1)             /* E,J */ &\
1026  name     *+AR0(1), AR1             /* I,G */ &\
1027  name     *+AR1(1), *+AR0(1)        /* I,J */ &\
1028  .endif                                       &\
1029  .ifdef   TEST_C4X                            &\
1030name##_T2_c4x:                                 &\
1031  name     -5, AR1                   /* W,G */ &\
1032  name     *+AR0(5), AR1             /* C,G */ &\
1033  name     -5, *+AR0(5)              /* W,O */ &\
1034  name     *+AR0(5), *+AR1(5)        /* C,O */ &\
1035  .endif                                       &\
1036  .ifdef level                                 &\
1037name##3_T2:                                    &\
1038  name##3  AR2, AR1                  /* E,G */ &\
1039  name##3  AR1, *+AR0(1)             /* E,J */ &\
1040  name##3  *+AR0(1), AR1             /* I,G */ &\
1041  name##3  *+AR1(1), *+AR0(1)        /* I,J */ &\
1042  .endif                                       &\
1043  .ifdef   TEST_C4X                            &\
1044name##3_T2_c4x:                                &\
1045  name##3  -5, AR1                   /* W,G */ &\
1046  name##3  *+AR0(5), AR1             /* C,G */ &\
1047  name##3  -5, *+AR0(5)              /* W,O */ &\
1048  name##3  *+AR0(5), *+AR1(5)        /* C,O */ &\
1049  .endif
1050
1051
1052/* T2C: General commutative 3-operand integer operation with 2 args
1053   Syntax: <i> src2, src1 - Manual
1054           <i> src1, src2
1055       src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
1056       src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (0)
1057   Instr: 1/0 - TSTB3
1058   Alias: i, i3
1059*/
1060#define T2C_CLASS(name, level) \
1061  .ifdef level                                 &\
1062name##_T2C:                                    &\
1063  name     AR2, AR1                  /* E,G */ &\
1064  name     AR1, *+AR0(1)             /* E,J */ &\
1065  name     *+AR0(1), AR1             /* I,G */ &\
1066  name     *+AR1(1), *+AR0(1)        /* I,J */ &\
1067  .endif                                       &\
1068  .ifdef   TEST_C4X                            &\
1069name##_T2C_c4x:                                &\
1070  name     -5, AR1                   /* W,G */ &\
1071  name     AR1, -5                   /* G,W */ &\
1072  name     *+AR0(5), AR1             /* C,G */ &\
1073  name     AR1, *+AR0(5)             /* G,C */ &\
1074  name     -5, *+AR0(5)              /* W,O */ &\
1075  name     *+AR0(5), -5              /* O,W */ &\
1076  name     *+AR0(5), *+AR1(5)        /* C,O */ &\
1077  .endif                                       &\
1078  .ifdef level                                 &\
1079name##3_T2C:                                   &\
1080  name##3  AR2, AR1                  /* E,G */ &\
1081  name##3  AR1, *+AR0(1)             /* E,J */ &\
1082  name##3  *+AR0(1), AR1             /* I,G */ &\
1083  name##3  *+AR1(1), *+AR0(1)        /* I,J */ &\
1084  .endif                                       &\
1085  .ifdef   TEST_C4X                            &\
1086name##3_T2C_c4x:                               &\
1087  name##3  -5, AR1                   /* W,G */ &\
1088  name##3  AR1, -5                   /* G,W */ &\
1089  name##3  *+AR0(5), AR1             /* C,G */ &\
1090  name##3  AR1, *+AR0(5)             /* G,C */ &\
1091  name##3  -5, *+AR0(5)              /* W,O */ &\
1092  name##3  *+AR0(5), -5              /* O,W */ &\
1093  name##3  *+AR0(5), *+AR1(5)        /* C,O */ &\
1094  .endif
1095