Pristine Ack-5.5
[Ack-5.5.git] / mach / z8000 / cg / table
1 "$Id: table,v 1.9 1994/06/24 13:56:50 ceriel Exp $"
2 #define SL      6
3 #define SSL     "6"
4     /* savsize is 6 because size of LB is 2 and size of z8000-PC is 4 */
5 #define NC      nocoercions:
6
7 /*********************************************************
8 ** Back end tables for z8000                            **
9 ** Author: Jan Voors                                    **
10 **                                                      **
11 ** wordsize = 2 bytes, pointersize = 2 bytes.           **
12 **                                                      **
13 ** Register R13 is used as LB, RR14 is the normal       **
14 ** z8000-stackpointer. Some global variables are used:  **
15 ** - reghp     : the heap pointer                       **
16 ** - trpim     : trap ignore mask                       **
17 ** - trppc     : address of user defined trap handler   **
18 **                                                      **
19 ** Floating point arithmetic and constants are not      **
20 ** implemented.                                         **
21 **                                                      **
22 *********************************************************/
23
24 /*
25  * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
26  *
27  *          This product is part of the Amsterdam Compiler Kit.
28  *
29  * Permission to use, sell, duplicate or disclose this software must be
30  * obtained in writing. Requests for such permissions may be sent to
31  *
32  *      Dr. Andrew S. Tanenbaum
33  *      Wiskundig Seminarium
34  *      Vrije Universiteit
35  *      Postbox 7161
36  *      1007 MC Amsterdam
37  *      The Netherlands
38  *
39  */
40
41 EM_WSIZE = 2
42 EM_PSIZE = 2
43 EM_BSIZE = SL
44
45 TIMEFACTOR = 3/4
46
47 REGISTERS:
48 R0 = ("R0", 2), REG, B2REG.
49 R1 = ("R1", 2), REG, B2REG, XREG.
50 R2 = ("R2", 2), REG, B2REG, XREG.
51 R3 = ("R3", 2), REG, B2REG, XREG.
52 R4 = ("R4", 2), REG, B2REG, XREG.
53 R5 = ("R5", 2), REG, B2REG, XREG.
54 R6 = ("R6", 2), REG, B2REG, XREG.
55 R7 = ("R7", 2), REG, B2REG, XREG.
56 R8 = ("R8", 2), REG, XREG.
57 R9 = ("R9", 2), REG, XREG.
58 R10 = ("R10", 2), REG, XREG.
59 R11 = ("R11", 2), REG, XREG.
60 R12 = ("R12", 2), REG, XREG.
61 LB = ("R13", 2), localbase.
62
63 RR0 = ("RR0", 4, R0, R1), LWREG, LWB2REG.
64 RR2 = ("RR2", 4, R2, R3), LWREG, LWB2REG, LWXREG.
65 RR4 = ("RR4", 4, R4, R5), LWREG, LWB2REG, LWXREG.
66 RR6 = ("RR6", 4, R6, R7), LWREG, LWB2REG, LWXREG.
67 RR8 = ("RR8", 4, R8, R9), LWREG, LWXREG.
68 RR10 = ("RR10", 4, R10, R11), LWREG, LWXREG.
69
70 RQ0 = ("RQ0", 8, RR0, RR2), DLWREG.
71 RQ4 = ("RQ4", 8, RR4, RR6), DLWREG.
72 RQ8 = ("RQ8", 8, RR8, RR10), DLWREG.
73
74 /*\f*/
75 TOKENS:
76 /* z8000-addressing-modes 'ra', 'ba' and 'bx' never used so far,
77 ** so there are no tokens for them (yet).
78 */
79 ir1 = { REGISTER lwxreg; }      2       cost=(0,2)      "*%[lwxreg]"
80 ir2 = { REGISTER lwxreg; }      2       cost=(0,2)      "*%[lwxreg]"
81 ir4 = { REGISTER lwxreg; }      4       cost=(0,5)      "*%[lwxreg]"
82 ir4_hi = { REGISTER lwreg; }    2
83
84 da1 = { STRING ind; }           2       cost=(4,4)      "%[ind]"
85 da2 = { STRING ind; }           2       cost=(4,4)      "%[ind]"
86 da4 = { STRING ind; }           4       cost=(4,7)      "%[ind]"
87
88 im2 = { INT num; }              2       cost=(2,2)      "$%[num]"
89 im4 = { INT num; }              4       cost=(4,5)      "$%[num]"
90 double = { STRING ind; }        4       cost=(4,5)      "$%[ind]"
91
92 x1 = { REGISTER xreg; INT ind; }   2    cost=(4,5)     "%[ind](%[xreg])"
93 x2 = { REGISTER xreg; INT ind; }   2    cost=(4,5)     "%[ind](%[xreg])"
94 x4 = { REGISTER xreg; INT ind; }   4    cost=(4,8)     "%[ind](%[xreg])"
95
96 ADDR_LOCAL      = { INT ind; }     2
97 ADDR_EXTERNAL   = { STRING ind; }  2    cost=(2,3)     "$%[ind]"
98 regconst2       = { REGISTER xreg; INT ind; }   2
99
100 TOKENEXPRESSIONS:
101 REGS = REG + LWREG + DLWREG
102 SCR_REG    = REG * SCRATCH
103 SCR_XREG   = XREG * SCRATCH
104 SCR_LWREG  = LWREG * SCRATCH
105 SCR_DLWREG = DLWREG * SCRATCH
106 src1 = ir1 + da1 + x1
107 src2 = REG + ir2 + im2 + da2 + x2 + localbase + ADDR_EXTERNAL
108 src4 = LWREG + ir4 + im4 + da4 + x4 + double
109 indexed = x1 + x2 + x4
110 ind_access = ir1 + ir2 + ir4
111 da = da1 + da2 + da4
112 const2 = im2 + ADDR_EXTERNAL
113 const4 = im4 + double
114 allexceptcon = ALL - REGS - im2 - im4 - double - ADDR_LOCAL
115                                                         - ADDR_EXTERNAL
116
117 src2a = ir2 + da2 + x2
118 src4a = ir4 + da4 + x4
119 src2b = REG + im2 + localbase + ADDR_EXTERNAL
120 src4b = LWREG
121 src2c = REG + ir2 + da2 + x2
122
123 CODE:
124 /*\f*/
125 /***************************************
126 ********        GROUP 1         ********
127 ***************************************/
128
129 loc     | | | {im2, $1}         | |
130 ldc     | | allocate( LWREG )
131             move( {im2, highw(1)}, %[a.1] )
132             move( {im2, loww(1)}, %[a.2] )      | %[a]  | |
133 lol     | | | {x2, LB, $1}      | |
134 ldl     | | | {x4, LB, $1}      | |
135 loe     | | | {da2, $1}         | |
136 lde     | | | {da4, $1}         | |
137 lil     | | allocate( LWXREG )
138             move( {x2, LB, $1}, %[a.2] )
139             move( {im2, 0}, %[a.1] )            | {ir2,%[a]}    | |
140 lof     | XREG  | | {x2, %[1], $1}      | |
141 ...     | NC regconst2  | | {x2, %[1.xreg], $1+%[1.ind]}        | |
142 ...     | NC ADDR_EXTERNAL | | {da2, tostring($1)+"+"+%[1.ind]} | |
143 ...     | NC ADDR_LOCAL | | {x2, LB, %[1.ind]+$1}       | |
144 ldf     | XREG  | | {x4, %[1], $1}      | |
145 ...     | NC regconst2  | | {x4, %[1.xreg], $1+%[1.ind]}        | |
146 ...     | NC ADDR_EXTERNAL | | {da4, tostring($1)+"+"+%[1.ind]} | |
147 ...     | NC ADDR_LOCAL | | {x4, LB, %[1.ind]+$1}       | |
148 lal     | | | { ADDR_LOCAL, $1 }                | |
149 lae     | | | { ADDR_EXTERNAL, $1 }     | |
150 lxl $1==0       | | | LB                | |
151 lxl $1==1       | | | {x2, LB, SL}      | |
152 lxl $1==2       | | allocate( XREG = {x2, LB, SL} ) | {x2, %[a], SL}| |
153 lxl $1>2        | | allocate( XREG = {x2, LB, SL}, REG = {im2, $1-1} )
154                     "1:\tld %[a], 6(%[a])"
155                     "djnz %[b], 1b"
156                     erase(%[a])  erase(%[b])  samecc    | %[a]  | |
157 lxa $1==0       | | | {ADDR_LOCAL, SL}  | |
158 lxa $1==1       | | allocate( XREG = {x2, LB, SL} )     |
159                                             {regconst2, %[a], SL} | |
160 lxa $1==2       | | allocate( XREG = {x2, LB, SL} )
161                     move( {x2, %[a], SL }, %[a] )       |
162                                             {regconst2, %[a], SL} | |
163 lxa $1>2        | | allocate( XREG = {x2, LB, SL}, REG = {im2, $1-1} )
164                     "1:\tld %[a], 6(%[a])"
165                     "djnz %[b], 1b"
166                     erase(%[a])  erase(%[b])  samecc    |
167                                             {regconst2, %[a], SL} | |
168 loi $1==1       | NC  regconst2 | | {x1, %[1.xreg], %[1.ind]}   | |
169 ...             | NC  ADDR_LOCAL| | {x1, LB, %[1.ind]}  | |
170 ...             | NC  ADDR_EXTERNAL     | | {da1, %[1.ind]}     | |
171 ...             | src2  | allocate( %[1], LWXREG )
172                           move( %[1], %[a.2] )
173                           move( {im2, 0}, %[a.1] )
174                                                 | {ir1, %[a]}   | |
175 loi $1==2       | NC  regconst2 | | {x2, %[1.xreg], %[1.ind]}   | |
176 ...             | NC  ADDR_LOCAL| | {x2, LB, %[1.ind]}  | |
177 ...             | NC  ADDR_EXTERNAL     | | {da2, %[1.ind]}     | |
178 ...             | src2  | allocate( %[1], LWXREG )
179                           move( %[1], %[a.2] )
180                           move( {im2, 0}, %[a.1] )
181                                                 | {ir2, %[a]}   | |
182 loi $1==4       | NC  regconst2 | | {x4, %[1.xreg], %[1.ind]}   | |
183 ...             | NC  ADDR_LOCAL| | {x4, LB, %[1.ind]}  | |
184 ...             | NC  ADDR_EXTERNAL     | | {da4, %[1.ind]}     | |
185 ...             | src2  | allocate( %[1], LWXREG )
186                           move( %[1], %[a.2] )
187                           move( {im2, 0}, %[a.1] )
188                                                 | {ir4, %[a]}   | |
189 loi $1>4        | src2  STACK   | allocate( REG = {im2, $1/2} )
190                                   allocate( %[1], LWXREG )
191                                   move( %[1], %[b.2] )
192                                   move( {im2, 0}, %[b.1] )
193                                   "add %[b.2], $$$1-2"
194                                   "dec R15, $$2"
195                                   "lddr *RR14, *%[b], %[a]"
196                                   "inc R15, $$2"
197                                   erase(%[a])  erase(%[b])  nocc  | | |
198 lal loi $2==6   | STACK | "push *RR14, $1+4(R13)"
199                           "pushl *RR14, $1(R13)"        | | |
200 lal loi $2==8   | STACK | "pushl *RR14, $1+4(R13)"
201                           "pushl *RR14, $1(R13)"        | | |
202 lae loi $2==6   | STACK | "push *RR14, $1+4"
203                           "pushl *RR14, $1"     | | |
204 lae loi $2==8   | STACK | "pushl *RR14, $1+4"
205                           "pushl *RR14, $1"     | | |
206 los $1==2       | STACK | "calr los2"           | | |
207 los !defined($1)| src2c STACK   | "cp %[1], $$2"
208                                   "jr NE, unknown"
209                                   "calr los2"           | | |
210 lpi     | | | {ADDR_EXTERNAL, $1}       | |
211 /*\f*/
212 /***************************************
213 ********        GROUP 2         ********
214 ***************************************/
215
216 stl     | src2b | remove( x2, %[xreg]==LB && %[ind]==$1 )
217                   remove( x4, %[xreg]==LB &&
218                                 ( %[ind]==$1-2 || %[ind]==$1 ))
219                   remove( x1, %[xreg]==LB &&
220                                 ( %[ind]==$1 || %[ind]==$1+1 ))
221                   remove( indexed, %[xreg]!=LB )
222                   remove( ind_access )
223                   move( %[1], {x2, LB, $1} )    | | |
224 ste     | src2b | remove( da )
225                   remove( indexed, %[xreg]!=LB )
226                   remove( ind_access )
227                   move( %[1], {da2, $1} )               | | |
228 sil     | src2b | remove( allexceptcon )
229                   allocate( LWXREG )
230                   move( {x2, LB, $1}, %[a.2] )
231                   move( {im2, 0}, %[a.1] )
232                   move( %[1], {ir2, %[a]} )             | | |
233 stf     | regconst2  src2b      |
234                     remove( allexceptcon )
235                     move( %[2], {x2, %[1.xreg], $1+%[1.ind]} ) | | |
236 ...     | ADDR_EXTERNAL  src2b  |
237                     remove( allexceptcon )
238                     move( %[2], {da2, tostring($1)+"+"+%[1.ind]} ) | | |
239 sti $1==1       | regconst2  const2     | remove( allexceptcon )
240                         move( %[2], {x1, %[1.xreg], %[1.ind]} ) | | |
241 ...             | regconst2  B2REG      | remove( allexceptcon )
242                         move( %[2], {x1, %[1.xreg], %[1.ind]} ) | | |
243 ...             | NC ADDR_LOCAL  const2 | remove( allexceptcon )
244                         move( %[2], {x1, LB, %[1.ind]} )  | | |
245 ...             | ADDR_LOCAL  B2REG     | remove( allexceptcon )
246                         move( %[2], {x1, LB, %[1.ind]} )  | | |
247 ...             | NC ADDR_EXTERNAL  const2      | remove( allexceptcon )
248                         move( %[2], {da1, %[1.ind]} )   | | |
249 ...             | ADDR_EXTERNAL  B2REG  | remove( allexceptcon )
250                         move( %[2], {da1, %[1.ind]} )   | | |
251 ...             | src2  const2  | remove( allexceptcon )
252                                   allocate( %[1], LWXREG )
253                                   move( %[1], %[a.2] )
254                                   move( {im2, 0}, %[a.1] )
255                                   move( %[2], {ir1, %[a]} )     | | |
256 ...             | src2  B2REG   | remove( allexceptcon )
257                                   allocate( %[1], LWXREG )
258                                   move( %[1], %[a.2] )
259                                   move( {im2, 0}, %[a.1] )
260                                   move( %[2], {ir1, %[a]} )     | | |
261 sti $1==2       | regconst2  src2b      | remove( allexceptcon )
262                         move( %[2], {x2, %[1.xreg], %[1.ind]} ) | | |
263 ...             | ADDR_LOCAL  src2b     | remove( allexceptcon )
264                         move( %[2], {x2, LB, %[1.ind]} )  | | |
265 ...             | ADDR_EXTERNAL  src2b  | remove( allexceptcon )
266                         move( %[2], {da2, %[1.ind]} )   | | |
267 ...             | src2  src2b   | remove( allexceptcon )
268                                   allocate( %[1], LWXREG )
269                                   move( %[1], %[a.2] )
270                                   move( {im2, 0}, %[a.1] )
271                                   move( %[2], {ir2, %[a]} )     | | |
272 sti $1==4       | regconst2  src4b      | remove( allexceptcon )
273                         move( %[2], {x4, %[1.xreg], %[1.ind]} ) | | |
274 ...             | ADDR_LOCAL  src4b     | remove( allexceptcon )
275                         move( %[2], {x4, LB, %[1.ind]} )  | | |
276 ...             | ADDR_EXTERNAL  src4b  | remove( allexceptcon )
277                         move( %[2], {da4, %[1.ind]} )   | | |
278 ...             | src2  src4b   | remove( allexceptcon )
279                                   allocate( %[1], LWXREG )
280                                   move( %[1], %[a.2] )
281                                   move( {im2, 0}, %[a.1] )
282                                   move( %[2], {ir4, %[a]} )     | | |
283 sti $1>4        | src2  STACK   |
284                         allocate( REG = {im2, $1/2} )
285                         allocate( %[1], LWXREG )
286                         move( %[1], %[b.2] )
287                         move( {im2, 0}, %[b.1] )
288                         "ldir *%[b], *RR14, %[a]"
289                         erase(%[a])  erase(%[b])  nocc  | | |
290 lal sti $2>4 && $2<=8   | NC src2b      | | %[1]        |
291                                 stl $1 lal $1+2 sti $2-2        |
292 ...                     | | | {ADDR_LOCAL, $1}  | sti $2        |
293 sts $1==2       | STACK | "calr sts2"           | | |
294 sts !defined($1)| src2c STACK   | "cp %[1], $$2"
295                                   "jr NE, unknown"
296                                   "calr sts2"           | | |
297 sdl     | src4b | remove( x2, %[xreg]==LB &&
298                                 ( %[ind]==$1 || %[ind]==$1+2 ))
299                   remove( x4, %[xreg]==LB &&
300                                 ( %[ind]>=$1-2 && %[ind]<=$1+2 ))
301                   remove( x1, %[xreg]==LB &&
302                                 ( %[ind]>=$1 && %[ind]<=$1+3 ))
303                   remove( indexed, %[xreg]!=LB )
304                   remove( ind_access )
305                   move( %[1], {x4, LB, $1} )    | | |
306 sde     | src4b | remove( da )
307                   remove( indexed, %[xreg]!=LB )
308                   remove( ind_access )
309                   move( %[1], {da4, $1} )               | | |
310 sdf     | regconst2  src4b      |
311                     remove( allexceptcon )
312                     move( %[2], {x4, %[1.xreg], $1+%[1.ind]} ) | | |
313 ...     | ADDR_EXTERNAL  src4b  |
314                     remove( allexceptcon )
315                     move( %[2], {da4, tostring($1)+"+"+%[1.ind]} ) | | |
316 /*\f*/
317 /***************************************
318 ********        GROUP 3         ********
319 ***************************************/
320
321 adi $1==2       | NC SCR_XREG  im2      | |
322                                 {regconst2, %[1], %[2.num]}     | |
323 ...             | NC SCR_XREG  ADDR_LOCAL       |
324                         "add %[1], R13"
325                         erase(%[1])     |
326                                 {regconst2, %[1], %[2.ind]}     | |
327 ...             | NC REG  ADDR_LOCAL    |
328                         allocate( XREG )
329                         "ld %[a], R13"
330                         "add %[a], %[1]"
331                         erase(%[a])     |
332                                 {regconst2, %[a], %[2.ind]}     | |
333 ...             | NC SCR_XREG  regconst2        |
334                         "add %[1], %[2.xreg]"
335                         erase(%[1])     |
336                                 {regconst2, %[1], %[2.ind]}     | |
337 ...             | NC im2  ADDR_LOCAL    | |
338                         {ADDR_LOCAL, %[1.num]+%[2.ind]} | |
339 ...             | NC src2  im2+ADDR_LOCAL       |
340                         allocate( %[1], XREG = %[1] )   |
341                                 %[2] %[a]       | adi 2 |
342 ...             | NC src2  regconst2    |
343                         "add %[2.xreg], %[1]"
344                         erase(%[2.xreg])        | %[2]  | |
345 ...             | NC regconst2  im2     | |
346                         {regconst2, %[1.xreg], %[2.num]+%[1.ind]}    | |
347 ...             | NC regconst2  ADDR_LOCAL      |
348                         "add %[1.xreg], R13"
349                         erase(%[1.xreg])        |
350                                 {regconst2, %[1.xreg],
351                                                %[2.ind]+%[1.ind]}    | |
352 ...             | NC regconst2  regconst2       |
353                         "add %[1.xreg],%[2.xreg]"
354                         erase(%[1.xreg])        |
355                                 {regconst2, %[1.xreg],
356                                                %[2.ind]+%[1.ind]}    | |
357 ...             | NC regconst2  src2-im2        |
358                         "add %[1.xreg], %[2]"
359                         erase(%[1.xreg])        | %[1]  | |
360 ...             | NC ADDR_LOCAL  regconst2      |
361                         "add %[2.xreg], R13"
362                         erase(%[2.xreg])        |
363                                 {regconst2, %[2.xreg],
364                                                %[1.ind]+%[2.ind]}    | |
365 ...             | NC ADDR_LOCAL  src2   | | %[1] %[2]   | adi 2 |
366 ...             | NC SCR_REG  src2-im2  | "add %[1], %[2]"
367                                           erase(%[1])
368                                           setcc(%[1])   | %[1]  | |
369 ...             | src2  SCR_REG         | "add %[2], %[1]"
370                                           erase(%[2])
371                                           setcc(%[2])   | %[2]  | |
372 adi $1==4       | src4  SCR_LWREG       |
373                                   "addl %[2], %[1]"
374                                   erase(%[2])
375                                   setcc(%[2])   | %[2]  | | (2,8)+%[1]
376 ...             | SCR_LWREG  src4       |
377                                   "addl %[1], %[2]"
378                                   erase(%[1])
379                                   setcc(%[1])   | %[1]  | | (2,8)+%[2]
380 sbi $1==2       | src2  SCR_REG | "sub %[2], %[1]"
381                                   erase(%[2])
382                                   setcc(%[2])   | %[2]  | | (2,4)+%[1]
383 ...             | SCR_REG  src2 | "sub %[1], %[2]"
384                                   erase(%[1])
385                                         | %[1]  | ngi 2 | (2,4)+%[2]
386 sbi $1==4       | src4  SCR_LWREG       |
387                                   "subl %[2], %[1]"
388                                   erase(%[2])
389                                   setcc(%[2])   | %[2]  | | (2,8)+%[1]
390 ...             | SCR_LWREG  src4       |
391                                   "subl %[1], %[2]"
392                                   erase(%[1])
393                                         | %[1]  | ngi 4 | (2,8)+%[2]
394 mli $1==2       | src2  src2    | allocate( %[2], LWREG )
395                                   move( %[2], %[a.2] )
396                                   "mult %[a], %[1]"
397                                   erase(%[a])
398                                   setcc(%[a.2])         | %[a.2]  | |
399 mli $1==4       | src4  src4    | allocate( %[2], DLWREG )
400                                   move( %[2], %[a.2] )
401                                   "multl %[a], %[1]"
402                                   erase(%[a])
403                                   setcc(%[a.2])         | %[a.2]  | |
404 dvi $1==2       | src2  src2    | allocate( %[2], LWREG )
405                                   move( %[2], %[a.2] )
406                                   "exts %[a]"
407                                   "div %[a], %[1]"
408                                   erase(%[a])
409                                   nocc                  | %[a.2]  | |
410 dvi $1==4       | src4  src4    | allocate( %[2], DLWREG )
411                                   move( %[2], %[a.2] )
412                                   "extsl %[a]"
413                                   "divl %[a], %[1]"
414                                   erase(%[a])
415                                   nocc                  | %[a.2]  | |
416 rmi $1==2       | src2  src2    | allocate( %[2], LWREG )
417                                   move( %[2], %[a.2] )
418                                   "exts %[a]"
419                                   "div %[a], %[1]"
420                                   erase(%[a])
421                                   nocc                  | %[a.1]  | |
422 rmi $1==4       | src4  src4    | allocate( %[2], DLWREG )
423                                   move( %[2], %[a.2] )
424                                   "extsl %[a]"
425                                   "divl %[a], %[1]"
426                                   erase(%[a])
427                                   nocc                  | %[a.1]  | |
428 ngi $1==2       | SCR_REG       | "neg %[1]"
429                                   erase(%[1])
430                                   setcc(%[1])   | %[1]  | | (2,7)
431 ngi $1==4       | src4          | allocate( LWREG = {im4, 0} )
432                                   "subl %[a], %[1]"
433                                   erase(%[a])
434                                   setcc(%[a])   | %[a]  | | (2,8)+%[1]
435 sli $1==2       | im2 SCR_REG   | "sla %[2], %[1]"
436                                   erase(%[2])
437                                   setcc(%[2])   | %[2]  | | (2,0)
438 ...             | REG SCR_REG   | "sda %[2], %[1]"
439                                   erase(%[2])
440                                   setcc(%[2])   | %[2]  | | (4,2)
441 sli $1==4       | im2 SCR_LWREG | "slal %[2], %[1]"
442                                   erase(%[2])
443                                   setcc(%[2])   | %[2]  | | (2,0)
444 ...             | REG SCR_LWREG | "sdal %[2], %[1]"
445                                   erase(%[2])
446                                   setcc(%[2])   | %[2]  | | (4,2)
447 sri $1==2       | im2 SCR_REG   | allocate( REG = {im2, 0-%[1.num]} )
448                                   "sda %[2], %[a]"
449                                   erase(%[2])
450                                   setcc(%[2])   | %[2]  | | (4,2)
451 ...             | REG SCR_REG   | "neg %[1]"
452                                   "sda %[2], %[1]"
453                                   erase(%[2])
454                                   setcc(%[2])   | %[2]  | | (6,9)
455 sri $1==4       | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} )
456                                   "sdal %[2], %[a]"
457                                   erase(%[2])
458                                   setcc(%[2])   | %[2]  | | (4,2)
459 ...             | REG SCR_LWREG | "neg %[1]"
460                                   "sdal %[2], %[1]"
461                                   erase(%[2])
462                                   setcc(%[2])   | %[2]  | | (6,9)
463 lol loc adi stl $1==$4 && $3==2 && $2>=0-16 && $2<=16   | | | |
464                                 loc $2 lol $1 adi $3 stl $4     |
465 loc lol adi stl $2==$4 && $3==2 && $1>0 && $1<=16       | |
466                                 remove( x2, %[xreg]==LB && %[ind]==$2 )
467                                 remove( x4, %[xreg]==LB &&
468                                         ( %[ind]==$2-2 || %[ind]==$2 ))
469                                 remove( x1, %[xreg]==LB &&
470                                         ( %[ind]==$2 || %[ind]==$2+1 ))
471                                 remove( indexed, %[xreg]!=LB )
472                                 remove( ind_access )
473                                 "inc $2(R13), $$$1"
474                                 setcc({x2, LB, $2})     | | |
475 loc lol adi stl $2==$4 && $3==2 && $1<0 && $1>=0-16     | |
476                                 remove( x2, %[xreg]==LB && %[ind]==$2 )
477                                 remove( x4, %[xreg]==LB &&
478                                         ( %[ind]==$2-2 || %[ind]==$2 ))
479                                 remove( x1, %[xreg]==LB &&
480                                         ( %[ind]==$2 || %[ind]==$2+1 ))
481                                 remove( indexed, %[xreg]!=LB )
482                                 remove( ind_access )
483                                 "dec $2(R13), $$0-$1"
484                                 setcc({x2, LB, $2})     | | |
485 loe loc adi ste $1==$4 && $3==2 && $2>=0-16 && $2<=16   | | | |
486                                 loc $2 loe $1 adi $3 ste $4     |
487 loc loe adi ste $2==$4 && $3==2 && $1>0 && $1<=16       | |
488                                 remove( da )
489                                 remove( indexed, %[xreg]!=LB )
490                                 remove( ind_access )
491                                 "inc $2, $$$1"
492                                 setcc({da2, $2})        | | |
493 loc loe adi ste $2==$4 && $3==2 && $1<0 && $1>=0-16     | |
494                                 remove( da )
495                                 remove( indexed, %[xreg]!=LB )
496                                 remove( ind_access )
497                                 "dec $2, $$0-$1"
498                                 setcc({da2, $2})        | | |
499 lil loc adi sil $1==$4 && $3==2 && $2>=0-16 && $2<=16   | | | |
500                                 loc $2 lil $1 adi $3 sil $4     |
501 loc lil adi sil $2==$4 && $3==2 && $1>0 && $1<=16       | |
502                                 remove( allexceptcon )
503                                 allocate( LWXREG )
504                                 move( {x2, LB, $2}, %[a.2] )
505                                 move( {im2, 0}, %[a.1] )
506                                 "inc *%[a], $$$1"
507                                 setcc({ir2, %[a]})      | | |
508 loc lil adi sil $2==$4 && $3==2 && $1<0 && $1>=0-16     | |
509                                 remove( allexceptcon )
510                                 allocate( LWXREG )
511                                 move( {x2, LB, $2}, %[a.2] )
512                                 move( {im2, 0}, %[a.1] )
513                                 "dec *%[a], $$0-$1"
514                                 setcc({ir2, %[a]})      | | |
515 lol loc sbi stl $1==$4 && $3==2 && $2>0 && $2<=16       | |
516                                 remove( x2, %[xreg]==LB && %[ind]==$1 )
517                                 remove( x4, %[xreg]==LB &&
518                                         ( %[ind]==$1-2 || %[ind]==$1 ))
519                                 remove( x1, %[xreg]==LB &&
520                                         ( %[ind]==$1 || %[ind]==$1+1 ))
521                                 remove( indexed, %[xreg]!=LB )
522                                 remove( ind_access )
523                                 "dec $1(R13), $$$2"
524                                 setcc({x2, LB, $1})     | | |
525 lol loc sbi stl $1==$4 && $3==2 && $2<0 && $2>=0-16     | |
526                                 remove( x2, %[xreg]==LB && %[ind]==$1 )
527                                 remove( x4, %[xreg]==LB &&
528                                         ( %[ind]==$1-2 || %[ind]==$1 ))
529                                 remove( x1, %[xreg]==LB &&
530                                         ( %[ind]==$1 || %[ind]==$1+1 ))
531                                 remove( indexed, %[xreg]!=LB )
532                                 remove( ind_access )
533                                 "inc $1(R13), $$0-$2"
534                                 setcc({x2, LB, $1})     | | |
535 loe loc sbi ste $1==$4 && $3==2 && $2>0 && $2<=16       | |
536                                 remove( da )
537                                 remove( indexed, %[xreg]!=LB )
538                                 remove( ind_access )
539                                 "dec $1, $$$2"
540                                 setcc({da2, $1})        | | |
541 loe loc sbi ste $1==$4 && $3==2 && $2<0 && $2>=0-16     | |
542                                 remove( da )
543                                 remove( indexed, %[xreg]!=LB )
544                                 remove( ind_access )
545                                 "inc $1, $$0-$2"
546                                 setcc({da2, $1})        | | |
547 lil loc sbi sil $1==$4 && $3==2 && $2>0 && $2<=16       | |
548                                 remove( allexceptcon )
549                                 allocate( LWXREG )
550                                 move( {x2, LB, $1}, %[a.2] )
551                                 move( {im2, 0}, %[a.1] )
552                                 "dec *%[a], $$$2"
553                                 setcc({ir2, %[a]})      | | |
554 lil loc sbi sil $1==$4 && $3==2 && $2<0 && $2>=0-16     | |
555                                 remove( allexceptcon )
556                                 allocate( LWXREG )
557                                 move( {x2, LB, $1}, %[a.2] )
558                                 move( {im2, 0}, %[a.1] )
559                                 "inc *%[a], $$0-$2"
560                                 setcc({ir2, %[a]})      | | |
561 lol ngi stl $1==$3 && $2==2     | |
562                                 remove( x2, %[xreg]==LB && %[ind]==$1 )
563                                 remove( x4, %[xreg]==LB &&
564                                         ( %[ind]==$1-2 || %[ind]==$1 ))
565                                 remove( x1, %[xreg]==LB &&
566                                         ( %[ind]==$1 || %[ind]==$1+1 ))
567                                 remove( indexed, %[xreg]!=LB )
568                                 remove( ind_access )
569                                 remove( allexceptcon )
570                                 "neg $1(R13)"
571                                 setcc({x2, LB, $1})     | | |
572 loe ngi ste $1==$3 && $2==2     | |
573                                 remove( da )
574                                 remove( indexed, %[xreg]!=LB )
575                                 remove( ind_access )
576                                 "neg $1"
577                                 setcc({da2, $1})        | | |
578 lil ngi sil $1==$3 && $2==2     | |
579                                 remove( allexceptcon )
580                                 allocate( LWXREG )
581                                 move( {x2, LB, $1}, %[a.2] )
582                                 move( {im2, 0}, %[a.1] )
583                                 "neg *%[a]"
584                                 setcc({ir2, %[a]})      | | |
585 loc sli $1>=0 && $1<=16 && $2==2        | SCR_REG       |
586                                         "sla %[1], $$$1"
587                                         erase(%[1])
588                                         setcc(%[1])     | %[1]  | |
589 loc sli $1>=0 && $1<=32 && $2==4        | SCR_LWREG     |
590                                         "slal %[1], $$$1"
591                                         erase(%[1])
592                                         setcc(%[1])     | %[1]  | |
593 loc sri $1>=0 && $1<=16 && $2==2        | SCR_REG       |
594                                         "sra %[1], $$-$1"
595                                         erase(%[1])
596                                         setcc(%[1])     | %[1]  | |
597 loc sri $1>=0 && $1<=32 && $2==4        | SCR_LWREG     |
598                                         "sral %[1], $$-$1"
599                                         erase(%[1])
600                                         setcc(%[1])     | %[1]  | |
601 loc sru $1>=0 && $1<=16 && $2==2        | SCR_REG       |
602                                         "srl %[1], $$-$1"
603                                         erase(%[1])
604                                         setcc(%[1])     | %[1]  | |
605 loc sru $1>=0 && $1<=32 && $2==4        | SCR_LWREG     |
606                                         "srll %[1], $$-$1"
607                                         erase(%[1])
608                                         setcc(%[1])     | %[1]  | |
609 /*\f*/
610 /***************************************
611 ********        GROUP 4         ********
612 ***************************************/
613 /*      adu = adi
614 **      sbu = sbi
615 **      mlu = mli
616 **      slu = sli
617 */
618
619 adu     | | | | adi $1  |
620 sbu     | | | | sbi $1  |
621 mlu     | | | | mli $1  |
622 slu     | | | | sli $1  |
623 dvu $1==2       | STACK | "calr dvu2"   | R1    | |
624 dvu $1==4       | STACK | "calr dvu4"   | R3 R2 | |
625 rmu $1==2       | STACK | "calr rmu2"   | R0    | |
626 rmu $1==4       | STACK | "calr rmu4"   | R1 R0 | |
627 sru $1==2       | im2 SCR_REG   | allocate( REG = {im2, 0-%[1.num]} )
628                                   "sdl %[2], %[a]"
629                                   erase(%[2])
630                                   setcc(%[2])   | %[2]  | | (4,2)
631 ...             | REG SCR_REG   | "neg %[1]"
632                                   "sdl %[2], %[1]"
633                                   erase(%[2])
634                                   setcc(%[2])   | %[2]  | | (6,9)
635 sru $1==4       | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} )
636                                   "sdll %[2], %[a]"
637                                   erase(%[2])
638                                   setcc(%[2])   | %[2]  | | (4,2)
639 ...             | REG SCR_LWREG | "neg %[1]"
640                                   "sdll %[2], %[1]"
641                                   erase(%[2])
642                                   setcc(%[2])   | %[2]  | | (6,9)
643 /*\f*/
644 /***************************************
645 ********        GROUP 6         ********
646 ***************************************/
647
648 adp     | SCR_XREG      | | {regconst2, %[1], $1}       | |
649 ...     | NC regconst2  | | {regconst2, %[1.xreg], $1+%[1.ind]} | |
650 ...     | NC ADDR_LOCAL | | {ADDR_LOCAL, %[1.ind]+$1 }  | |
651 ...     | NC ADDR_EXTERNAL | | {ADDR_EXTERNAL,
652                                    tostring($1)+"+"+%[1.ind]}   | |
653 lil adp sil $1==$3 && $2>0 && $2<=16    | | allocate( LWXREG )
654                                             remove( allexceptcon )
655                                             move( {x2, LB, $1}, %[a.2] )
656                                             move( {im2, 0}, %[a.1] )
657                                             "inc *%[a], $$$2"
658                                             setcc({ir2, %[a]})  | | |
659 lil adp sil $1==$3 && $2<0 && $2>=0-16  | | allocate( LWXREG )
660                                             remove( allexceptcon )
661                                             move( {x2, LB, $1}, %[a.2] )
662                                             move( {im2, 0}, %[a.1] )
663                                             "dec *%[a], $$0-$2"
664                                             setcc({ir2, %[a]})  | | |
665 lil adp dup sil adp $1==$4 && $3==2 && $2==1 && $5==0-1 | |
666                                 allocate( LWXREG, XREG )
667                                 remove( allexceptcon )
668                                 move( {x2, LB, $1}, %[a.2] )
669                                 move( {im2, 0}, %[a.1] )
670                                 "ld %[b], *%[a]"
671                                 "inc *%[a]"  | {regconst2, %[b], 0} | |
672                                    /* because the next EM-instruction
673                                    ** will be `loi'.
674                                    */
675 lil adp dup sil $1==$4 && $3==2 && $2==1        | |
676                                 allocate( LWXREG )
677                                 remove( allexceptcon )
678                                 move( {x2, LB, $1}, %[a.2] )
679                                 move( {im2, 0}, %[a.1] )
680                                 "inc *%[a]"
681                                 setcc({ir2, %[a]})      | {ir2,%[a]} | |
682 lol dup adp stl $1==$4 && $2==2 && $3>0 && $3<=16       | |
683                         allocate( REG = {x2, LB, $1} )
684                         remove( x2, %[xreg]==LB && %[ind]==$1 )
685                         remove( x4, %[xreg]==LB &&
686                                 ( %[ind]==$1-2 || %[ind]==$1 ))
687                         remove( x1, %[xreg]==LB &&
688                                 ( %[ind]==$1 || %[ind]==$1+1 ))
689                         remove( indexed, %[xreg]!=LB )
690                         remove( ind_access )
691                         "inc $1(R13), $$$3"
692                         setcc({x2, LB, $1})             | %[a]  | |
693 lol dup adp stl $1==$4 && $2==2 && $3<0 && $3>=0-16     | |
694                         allocate( REG = {x2, LB, $1} )
695                         remove( x2, %[xreg]==LB && %[ind]==$1 )
696                         remove( x4, %[xreg]==LB &&
697                                 ( %[ind]==$1-2 || %[ind]==$1 ))
698                         remove( x1, %[xreg]==LB &&
699                                 ( %[ind]==$1 || %[ind]==$1+1 ))
700                         remove( indexed, %[xreg]!=LB )
701                         remove( ind_access )
702                         "dec $1(R13), $$0-$3"
703                         setcc({x2, LB, $1})             | %[a]  | |
704 loe dup adp ste $1==$4 && $2==2 && $3>0 && $3<=16       | |
705                         allocate( REG = {da2, $1} )
706                         remove( da )
707                         remove( indexed, %[xreg]!=LB )
708                         remove( ind_access )
709                         "inc $1, $$$3"
710                         setcc({da2, $1})                | %[a]  | |
711 loe dup adp ste $1==$4 && $2==2 && $3<0 && $3>=0-16     | |
712                         allocate( REG = {da2, $1} )
713                         remove( da )
714                         remove( indexed, %[xreg]!=LB )
715                         remove( ind_access )
716                         "dec $1, $$0-$3"
717                         setcc({da2, $1})                | %[a]  | |
718 lol adp stl $1==$3 && $2>0 && $2<=16    | |
719                         remove( x2, %[xreg]==LB && %[ind]==$1 )
720                         remove( x4, %[xreg]==LB &&
721                                 ( %[ind]==$1-2 || %[ind]==$1 ))
722                         remove( x1, %[xreg]==LB &&
723                                 ( %[ind]==$1 || %[ind]==$1+1 ))
724                         remove( indexed, %[xreg]!=LB )
725                         remove( ind_access )
726                         "inc $1(R13), $$$2"
727                         setcc({x2, LB, $1})             | | |
728 lol adp stl $1==$3 && $2<0 && $2>=0-16  | |
729                         remove( x2, %[xreg]==LB && %[ind]==$1 )
730                         remove( x4, %[xreg]==LB &&
731                                 ( %[ind]==$1-2 || %[ind]==$1 ))
732                         remove( x1, %[xreg]==LB &&
733                                 ( %[ind]==$1 || %[ind]==$1+1 ))
734                         remove( indexed, %[xreg]!=LB )
735                         remove( ind_access )
736                         "dec $1(R13), $$0-$2"
737                         setcc({x2, LB, $1})             | | |
738 loe adp ste $1==$3 && $2>0 && $2<=16    | |
739                         remove( da )
740                         remove( indexed, %[xreg]!=LB )
741                         remove( ind_access )
742                         "inc $1, $$$2"
743                         setcc({da2, $1})                | | |
744 loe adp ste $1==$3 && $2<0 && $2>=0-16  | |
745                         remove( da )
746                         remove( indexed, %[xreg]!=LB )
747                         remove( ind_access )
748                         "dec $1, $$0-$2"
749                         setcc({da2, $1})                | | |
750 ads $1==2       | | | | adi $1  |
751 ads $1==4       | | | | adi $1  |
752 sbs $1==2       | | | | sbi $1  |
753 sbs $1==4       | | | | sbi $1  |
754 /*\f*/
755 /***************************************
756 ********        GROUP 7         ********
757 ***************************************/
758
759 inc     | SCR_REG       | "inc %[1]"
760                           erase(%[1])  setcc(%[1])      | %[1]  | |
761 lil inc sil $1==$3      | | allocate( LWXREG )
762                             remove( allexceptcon )
763                             move( {x2, LB, $1}, %[a.2] )
764                             move( {im2, 0}, %[a.1] )
765                             "inc *%[a]"
766                             setcc({ir2, %[a]})          | | |
767 dec     | SCR_REG       | "dec %[1]"
768                           erase(%[1])  setcc(%[1])      | %[1]  | |
769 lil dec sil $1==$3      | | allocate( LWXREG )
770                             remove( allexceptcon )
771                             move( {x2, LB, $1}, %[a.2] )
772                             move( {im2, 0}, %[a.1] )
773                             "dec *%[a]"
774                             setcc({ir2, %[a]})          | | |
775 lil dec dup sil $1==$4 && $3==2 | | allocate( LWXREG )
776                                     remove( allexceptcon )
777                                     move( {x2, LB, $1}, %[a.2] )
778                                     move( {im2, 0}, %[a.1] )
779                                     "dec *%[a]"
780                                     setcc({ir2, %[a]})  | {ir2,%[a]} | |
781 inl     | | remove( x2, %[xreg]==LB && %[ind]==$1 )
782             remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) )
783             remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 ))
784             remove( indexed, %[xreg]!=LB )
785             remove( ind_access )
786             "inc $1(R13)"
787             setcc({x2, LB, $1})         | | |
788 del     | | remove( x2, %[xreg]==LB && %[ind]==$1 )
789             remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) )
790             remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 ))
791             remove( indexed, %[xreg]!=LB )
792             remove( ind_access )
793             "dec $1(R13)"
794             setcc({x2, LB, $1})         | | |
795 zrl     | | remove( x2, %[xreg]==LB && %[ind]==$1 )
796             remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) )
797             remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 ))
798             remove( indexed, %[xreg]!=LB )
799             remove( ind_access )
800             "clr $1(R13)"
801             samecc              | | |
802 ine     | | remove( da )
803             remove( indexed, %[xreg]!=LB )
804             remove( ind_access )
805             "inc $1"
806             setcc({da2, $1})    | | |
807 dee     | | remove( da )
808             remove( indexed, %[xreg]!=LB )
809             remove( ind_access )
810             "dec $1"
811             setcc({da2, $1})    | | |
812 zre     | | remove( da )
813             remove( indexed, %[xreg]!=LB )
814             remove( ind_access )
815             "clr $1"
816             samecc              | | |
817 zer $1==2       | | | {im2, 0}  | |
818 zer $1==4       | | | {im4, 0}  | |
819 zer $1==6       | | | {im4, 0} {im2, 0} | |
820 zer $1==8       | | | {im4, 0} {im4, 0} | |
821 zer $1>8        | | remove( ALL )
822                     allocate( REG = {im2, $1/2} )   /*nr of words*/
823                     "1:\tpush *RR14, $$0"
824                     "djnz %[a], 1b"
825                     erase(%[a])  samecc         | | |
826 zer !defined($1)| SCR_REG       | remove( ALL )
827                                   "sra %[1]"
828                                   "1:\tpush *RR14, $$0"
829                                   "djnz %[1], 1b"
830                                   erase(%[1])   nocc    | | |
831 /*\f*/
832 /***************************************
833 ********        GROUP 8         ********
834 ***************************************/
835
836 cii     | STACK | "calr cii"    | | |
837 loc loc cii $1==1 && $2==2      | NC src1       |
838                         allocate( %[1], B2REG = %[1] )  | %[a]  | |
839 ...     | src2  | allocate( %[1], REG = %[1] )
840                   "extsb %[a]"
841                   erase(%[a])  samecc   | %[a]  | |
842 loc loc cii $1==1 && $2==4      | NC src1       |
843                         allocate( %[1], LWB2REG )
844                         move( %[1], %[a.2] )
845                         "exts %[a]"
846                         samecc          | %[a]  | |
847 ...     | src2  | allocate( %[1], LWREG )
848                   move( %[1], %[a.2] )
849                   "exts %[a]"
850                   samecc                | %[a]  | |
851 loc loc cii $1==2 && $2==4      | src2  | allocate( %[1], LWREG )
852                                           move( %[1], %[a.2] )
853                                           "exts %[a]"
854                                           samecc        | %[a]  | |
855 loc loc loc cii $1>=0 && $2==2 && $3==4 | | | | loc $1 loc 0    |
856 loc loc loc cii $1< 0 && $2==2 && $3==4 | | | | loc $1 loc 0-1  |
857 loc loc cii $1==4 && $2==2      | src2  src2    | | %[2]        | |
858 loc loc cuu $1==2 && $2==4      | | | {im2, 0}  | |
859 loc loc cuu $1==4 && $2==2      | src2  | | | |
860 cuu     | STACK | "calr cuu"    | | |
861 ciu     | | | | cuu     |
862 cui     | | | | cuu     |
863 /*\f*/
864 /***************************************
865 ********        GROUP 9         ********
866 ***************************************/
867
868 and $1==2       | SCR_REG  src2 | "and %[1], %[2]"
869                                   erase(%[1])
870                                   setcc(%[1])   | %[1]  | | (2,4)+%[2]
871 ...             | src2  SCR_REG | "and %[2], %[1]"
872                                   erase(%[2])
873                                   setcc(%[2])   | %[2]  | | (2,4)+%[1]
874 and $1>2        | | remove( ALL )
875                     allocate( LWXREG, REG, REG = {im2, $1/2} )
876                     "ldl %[a], RR14"
877                     "addl %[a], $$$1"
878                     "1:\tpop %[b], *RR14"
879                     "and %[b], *%[a]"
880                     "ld *%[a], %[b]"
881                     "inc %[a.2], $$2"
882                     "djnz %[c], 1b"
883                     erase(%[c])  nocc   | | |
884 and !defined($1)| SCR_REG       | remove( ALL )
885                                   allocate( LWXREG, REG )
886                                   "ldl %[a], RR14"
887                                   "addl %[a], $$$1"
888                                   "sra %[1]"
889                                   "1:\tpop %[b], *RR14"
890                                   "and %[b], *%[a]"
891                                   "ld *%[a], %[b]"
892                                   "inc %[a.2], $$2"
893                                   "djnz %[1], 1b"
894                                   erase(%[1])  nocc     | | |
895 ior $1==2       | SCR_REG  src2 | "or %[1], %[2]"
896                                   erase(%[1])
897                                   setcc(%[1])   | %[1]  | | (2,4)+%[2]
898 ...             | src2  SCR_REG | "or %[2], %[1]"
899                                   erase(%[2])
900                                   setcc(%[2])   | %[2]  | | (2,4)+%[1]
901 ior $1>2        | | remove( ALL )
902                     allocate( LWXREG, REG, REG = {im2, $1/2} )
903                     "ldl %[a], RR14"
904                     "addl %[a], $$$1"
905                     "1:\tpop %[b], *RR14"
906                     "or %[b], *%[a]"
907                     "ld *%[a], %[b]"
908                     "inc %[a.2], $$2"
909                     "djnz %[c], 1b"
910                     erase(%[c])  nocc   | | |
911 ior !defined($1)| SCR_REG       | remove( ALL )
912                                   allocate( LWXREG, REG )
913                                   "ldl %[a], RR14"
914                                   "addl %[a], $$$1"
915                                   "sra %[1]"
916                                   "1:\tpop %[b], *RR14"
917                                   "or %[b], *%[a]"
918                                   "ld *%[a], %[b]"
919                                   "inc %[a.2], $$2"
920                                   "djnz %[1], 1b"
921                                   erase(%[1])  nocc     | | |
922 xor $1==2       | SCR_REG  src2 | "xor %[1], %[2]"
923                                   erase(%[1])
924                                   setcc(%[1])   | %[1]  | | (2,4)+%[2]
925 ...             | src2  SCR_REG | "xor %[2], %[1]"
926                                   erase(%[2])
927                                   setcc(%[2])   | %[2]  | | (2,4)+%[1]
928 xor $1>2        | | remove( ALL )
929                     allocate( LWXREG, REG, REG = {im2, $1/2} )
930                     "ldl %[a], RR14"
931                     "addl %[a], $$$1"
932                     "1:\tpop %[b], *RR14"
933                     "xor %[b], *%[a]"
934                     "ld *%[a], %[b]"
935                     "inc %[a.2], $$2"
936                     "djnz %[c], 1b"
937                     erase(%[c])  nocc   | | |
938 xor !defined($1)| SCR_REG       | remove( ALL )
939                                   allocate( LWXREG, REG )
940                                   "ldl %[a], RR14"
941                                   "addl %[a], $$$1"
942                                   "sra %[1]"
943                                   "1:\tpop %[b], *RR14"
944                                   "xor %[b], *%[a]"
945                                   "ld *%[a], %[b]"
946                                   "inc %[a.2], $$2"
947                                   "djnz %[1], 1b"
948                                   erase(%[1])  nocc     | | |
949 com $1==2       | SCR_REG       | "com %[1]"
950                                   erase(%[1])
951                                   setcc(%[1])           | %[1]  | |
952 com defined($1) | STACK | allocate( LWXREG, REG = {im2, $1/2} )
953                           "ldl %[a], RR14"
954                           "1:\tcom *%[a]"
955                           "inc %[a.2], $$2"
956                           "djnz %[b], 1b"
957                           erase(%[b])  nocc     | | |
958 com !defined($1)| SCR_REG STACK | allocate( LWXREG )
959                                   "ldl %[a], RR14"
960                                   "1:\tcom *%[a]"
961                                   "inc %[a.2], $$2"
962                                   "djnz %[1], 1b"
963                                   erase(%[1])  nocc     | | |
964 lil and sil $1==$3 && $2==2     | SCR_REG       |
965                                         allocate( LWXREG )
966                                         remove( allexceptcon )
967                                         move( {x2, LB, $1}, %[a.2] )
968                                         move( {im2, 0}, %[a.1] )
969                                         "and %[1], *%[a]"
970                                         "ld *%[a], %[1]"        | | |
971 lil ior sil $1==$3 && $2==2     | SCR_REG       |
972                                         allocate( LWXREG )
973                                         remove( allexceptcon )
974                                         move( {x2, LB, $1}, %[a.2] )
975                                         move( {im2, 0}, %[a.1] )
976                                         "or %[1], *%[a]"
977                                         "ld *%[a], %[1]"        | | |
978 lil xor sil $1==$3 && $2==2     | SCR_REG       |
979                                         allocate( LWXREG )
980                                         remove( allexceptcon )
981                                         move( {x2, LB, $1}, %[a.2] )
982                                         move( {im2, 0}, %[a.1] )
983                                         "xor %[1], *%[a]"
984                                         "ld *%[a], %[1]"        | | |
985 lol com stl $1==$3 && $2==2     | |
986                                 remove( x2, %[xreg]==LB && %[ind]==$1 )
987                                 remove( x4, %[xreg]==LB &&
988                                         ( %[ind]==$1-2 || %[ind]==$1 ))
989                                 remove( x1, %[xreg]==LB &&
990                                         ( %[ind]==$1 || %[ind]==$1+1 ))
991                                 remove( indexed, %[xreg]!=LB )
992                                 remove( ind_access )
993                                 remove( allexceptcon )
994                                 "com $1(R13)"
995                                 setcc({x2, LB, $1})     | | |
996 loe com ste $1==$3 && $2==2     | |
997                                 remove( da )
998                                 remove( indexed, %[xreg]!=LB )
999                                 remove( ind_access )
1000                                 "com $1"
1001                                 setcc({da2, $1})        | | |
1002 lil com sil $1==$3 && $2==2     | |
1003                                 allocate( LWXREG )
1004                                 remove( allexceptcon )
1005                                 move( {x2, LB, $1}, %[a.2] )
1006                                 move( {im2, 0}, %[a.1] )
1007                                 "com *%[a]"
1008                                 setcc({ir2, %[a]})      | | |
1009 rol $1==2       | SCR_REG  SCR_REG      | "1:\trl %[2]"
1010                                           "djnz %[1], 1b"
1011                                           erase(%[2])
1012                                           setcc(%[2])   | %[2]  | |
1013 ror $1==2       | SCR_REG  SCR_REG      | "1:\trr %[2]"
1014                                           "djnz %[1], 1b"
1015                                           erase(%[2])
1016                                           setcc(%[2])   | %[2]  | |
1017 /*\f*/
1018 /***************************************
1019 ********        GROUP 10        ********
1020 ***************************************/
1021
1022 inn $1==2       | REG  SCR_REG  | allocate( REG = {im2, 0} )
1023                                   "cp %[1], $$15"
1024                                   "jr UGT, 1f"
1025                                   "bit %[2], %[1]"
1026                                   "tcc NE, %[a]\n1:"
1027                                   erase(%[a])  nocc     | %[a]  | |
1028 inn defined($1) | src2  STACK   | move( %[1], R1 )
1029                                   move( {im2, $1}, R2 )
1030                                   "calr inn"
1031                                   erase(R1)
1032                                   erase(R2)     | R0    | |
1033 inn !defined($1)| src2  src2  STACK     | move( %[1], R2 )
1034                                           move( %[2], R1 )
1035                                           "calr inn"
1036                                           erase(R1)
1037                                           erase(R2)     | R0    | |
1038 loc inn $2==2 && $1==0  | SCR_REG       |
1039                         "and %[1], $$1"
1040                         erase(%[1])  setcc(%[1])        | %[1]  | |
1041 loc inn $2==2 && $1==1  | SCR_REG       |
1042                         "srl %[1]"
1043                         "and %[1], $$1"
1044                         erase(%[1])  setcc(%[1])        | %[1]  | |
1045 loc inn $2==2 && $1>1 && $1<=16 | SCR_REG       |
1046                         "srl %[1], $$%(0-$1%)"
1047                         "and %[1], $$1"
1048                         erase(%[1])  setcc(%[1])        | %[1]  | |
1049 loc inn zeq $2==2       | | | {im2, 1<<$1}      | and 2 zeq $3  |
1050 inn zeq $1==2   | REG   | allocate( REG = {im2, 1} )
1051                           "sdl %[a], %[1]"
1052                           erase(%[a])
1053                           setcc(%[a])   | %[a]  | and 2 zeq $2  |
1054 loc inn zne $2==2       | | | {im2, 1<<$1}      | and 2 zne $3  |
1055 inn zne $1==2   | REG   | allocate( REG = {im2, 1} )
1056                           "sdl %[a], %[1]"
1057                           erase(%[a])
1058                           setcc(%[a])   | %[a]  | and 2 zne $2  |
1059 set $1==2       | REG   | allocate( REG = {im2, 0} )
1060                           "cp %[1], $$15"
1061                           "jr ULE, 1f"
1062                           "push *RR14, $$ESET"
1063                           "calr trp"
1064                           "jr 2f"
1065                           "1:\tset %[a], %[1]\n2:"
1066                           erase(%[a])  nocc     | %[a]  | |
1067 set defined($1) | src2  STACK   | move( %[1], R1 )
1068                                   move( {im2, $1}, R0 )
1069                                   "calr xset"
1070                                   erase(R0)
1071                                   erase(R1)             | | |
1072 set !defined($1)| src2  src2  STACK     | move( %[1], R0 )
1073                                           move( %[2], R1 )
1074                                           "calr xset"
1075                                           erase(R0)
1076                                           erase(R1)             | | |
1077 /*\f*/
1078 /***************************************
1079 ********        GROUP 11        ********
1080 ***************************************/
1081
1082 aar $1==2       | src2  src2  STACK     | move( %[1], R1 )
1083                                           move( %[2], R3 )
1084                                           "calr aar"
1085                                           erase(R1)
1086                                           erase(R3)             | | |
1087 aar !defined($1)| src2c  src2  src2  STACK      | move( %[2], R1 )
1088                                                   move( %[3], R3 )
1089                                                   "cp %[1], $$2"
1090                                                   "jr NE, unknown"
1091                                                   "calr aar"
1092                                                   erase(R1)
1093                                                   erase(R3)     | | |
1094 sar $1==2       | src2  src2  STACK     | move( %[1], R1 )
1095                                           move( %[2], R3 )
1096                                           "calr sar"
1097                                           erase(R1)
1098                                           erase(R3)             | | |
1099 sar !defined($1)| src2c  src2  src2  STACK      | move( %[2], R1 )
1100                                                   move( %[3], R3 )
1101                                                   "cp %[1], $$2"
1102                                                   "jr NE, unknown"
1103                                                   "calr sar"
1104                                                   erase(R1)
1105                                                   erase(R3)     | | |
1106 lar $1==2       | src2  src2  STACK     | move( %[1], R1 )
1107                                           move( %[2], R3 )
1108                                           "calr lar"
1109                                           erase(R1)
1110                                           erase(R3)             | | |
1111 lar !defined($1)| src2c  src2  src2  STACK      | move( %[2], R1 )
1112                                                   move( %[3], R3 )
1113                                                   "cp %[1], $$2"
1114                                                   "jr NE, unknown"
1115                                                   "calr lar"
1116                                                   erase(R1)
1117                                                   erase(R3)     | | |
1118 lae aar $2==2 && rom(1,3)==1 && rom(1,1)==0     | | | | adi 2   |
1119 lae aar $2==2 && rom(1,3)==1 && rom(1,1)!=0     | | | |
1120                                         adi 2 adp 0-rom(1,1)    |
1121 lae aar $2==2 && rom(1,3)==2 && rom(1,1)==0     | SCR_REG       |
1122                 "sla %[1]"
1123                 erase(%[1])     | %[1]  | adi 2 |
1124 lae aar $2==2 && rom(1,3)==2 && rom(1,1)!=0     | SCR_XREG      |
1125                 "sla %[1]"
1126                 erase(%[1])
1127                 | {regconst2, %[1], (0-2)*rom(1,1)}     | adi 2 |
1128 lae aar $2==2 && rom(1,3)==4 && rom(1,1)==0     | SCR_REG       |
1129                 "sla %[1], $$2"
1130                 erase(%[1])     | %[1]  | adi 2 |
1131 lae aar $2==2 && rom(1,3)==4 && rom(1,1)!=0     | SCR_XREG      |
1132                 "sla %[1], $$2"
1133                 erase(%[1])
1134                 | {regconst2, %[1], (0-4)*rom(1,1)}     | adi 2 |
1135 lae aar $2==2 && rom(1,3)==8 && rom(1,1)==0     | SCR_REG       |
1136                 "sla %[1], $$3"
1137                 erase(%[1])     | %[1]  | adi 2 |
1138 lae aar $2==2 && rom(1,3)==8 && rom(1,1)!=0     | SCR_XREG      |
1139                 "sla %[1], $$3"
1140                 erase(%[1])
1141                 | {regconst2, %[1], (0-8)*rom(1,1)}     | adi 2 |
1142 lae aar $2==2 && rom(1,1)==0            | src2  |
1143                 allocate( %[1], LWREG )
1144                 move( %[1], %[a.2] )
1145                 "mult %[a], $$%(rom(1,3)%)"
1146                 erase(%[a])             | %[a.2]        | adi 2 |
1147 lae aar $2==2 && defined(rom(1,1))      | src2  |
1148                 allocate( %[1], LWREG )
1149                 move( %[1], %[a.2] )
1150                 "mult %[a], $$%(rom(1,3)%)"
1151                 erase(%[a])
1152                 | {regconst2, %[a.2], (0-rom(1,3))*rom(1,1)}   | adi 2 |
1153 lae sar defined(rom(1,3))       | | | | lae $1 aar $2 sti rom(1,3)     |
1154 lae lar defined(rom(1,3))       | | | | lae $1 aar $2 loi rom(1,3)     |
1155 /*\f*/
1156 /***************************************
1157 ********        GROUP 12        ********
1158 ***************************************/
1159
1160 cmi $1==2 | src2  REG   | allocate( REG = {im2, 0} )
1161                           "cp %[2], %[1]"
1162                           "jr EQ, 2f"
1163                           "jr LT, 1f"
1164                           "inc %[a]"
1165                           "jr 2f"
1166                           "1:\tdec %[a]\n2:"
1167                           erase(%[a])  nocc     | %[a]  | |
1168 ...     | NC im2  src2a | allocate( REG = {im2, 0} )
1169                           "cp %[2], %[1]"
1170                           "jr EQ, 2f"
1171                           "jr LT, 1f"
1172                           "inc %[a]"
1173                           "jr 2f"
1174                           "1:\tdec %[a]\n2:"
1175                           erase(%[a])  nocc     | %[a]  | |
1176 cmi $1==4       | STACK | "calr cmi4"   | R0    | |
1177 cmi !defined($1)| src2  STACK   | move( %[1], R0 )
1178                                   "calr cmi"
1179                                   erase(R0)     | R0    | |
1180 cmu $1==2       | | | | cmp     |
1181 cmu $1==4       | STACK | "calr cmu4"   | R0    | |
1182 cmu !defined($1)| src2  STACK   | move( %[1], R0 )
1183                                   "calr cmu"
1184                                   erase(R0)     | R0    | |
1185 cms $1==2       | | | | sbi $1  |
1186 cms defined($1) | STACK | move( {im2, $1}, R0 )
1187                           "calr cms"
1188                           erase(R0)     | R0    | |
1189 cms !defined($1)| src2  STACK   | move( %[1], R0 )
1190                                   "calr cms"
1191                                   erase(R0)     | R0    | |
1192 cmp     | src2  REG     | allocate( REG = {im2, 0} )
1193                           "cp %[2], %[1]"
1194                           "jr EQ, 2f"
1195                           "jr ULT, 1f"
1196                           "inc %[a]"
1197                           "jr 2f"
1198                           "1:\tdec %[a]\n2:"
1199                           erase(%[a])  nocc     | %[a]  | |
1200 ...     | NC im2  src2a | allocate( REG = {im2, 0} )
1201                           "cp %[2], %[1]"
1202                           "jr EQ, 2f"
1203                           "jr ULT, 1f"
1204                           "inc %[a]"
1205                           "jr 2f"
1206                           "1:\tdec %[a]\n2:"
1207                           erase(%[a])  nocc     | %[a]  | |
1208 tlt     | src2c | allocate( REG = {im2, 0} )
1209                   test(%[1])
1210                   "tcc LT, %[a]"
1211                   erase(%[a])  samecc   | %[a]  | |
1212 tle     | src2c | allocate( REG = {im2, 0} )
1213                   test(%[1])
1214                   "tcc LE, %[a]"
1215                   erase(%[a])  samecc   | %[a]  | |
1216 teq     | src2c | allocate( REG = {im2, 0} )
1217                   test(%[1])
1218                   "tcc EQ, %[a]"
1219                   erase(%[a])  samecc   | %[a]  | |
1220 tne     | src2c | allocate( REG = {im2, 0} )
1221                   test(%[1])
1222                   "tcc NE, %[a]"
1223                   erase(%[a])  samecc   | %[a]  | |
1224 tge     | src2c | allocate( REG = {im2, 0} )
1225                   test(%[1])
1226                   "tcc GE, %[a]"
1227                   erase(%[a])  samecc   | %[a]  | |
1228 tgt     | src2c | allocate( REG = {im2, 0} )
1229                   test(%[1])
1230                   "tcc GT, %[a]"
1231                   erase(%[a])  samecc   | %[a]  | |
1232 cmp tlt | src2  REG     | allocate( REG = {im2, 0} )
1233                           "cp %[2], %[1]"
1234                           "tcc ULT, %[a]"
1235                           erase(%[a])           | %[a]  | |
1236 ...     | NC im2  src2a | allocate( REG = {im2, 0} )
1237                           "cp %[2], %[1]"
1238                           "tcc ULT, %[a]"
1239                           erase(%[a])           | %[a]  | |
1240 cmp tle | src2  REG     | allocate( REG = {im2, 0} )
1241                           "cp %[2], %[1]"
1242                           "tcc ULE, %[a]"
1243                           erase(%[a])           | %[a]  | |
1244 ...     | NC im2  src2a | allocate( REG = {im2, 0} )
1245                           "cp %[2], %[1]"
1246                           "tcc ULE, %[a]"
1247                           erase(%[a])           | %[a]  | |
1248 cmp teq | src2  REG     | allocate( REG = {im2, 0} )
1249                           "cp %[2], %[1]"
1250                           "tcc EQ, %[a]"
1251                           erase(%[a])           | %[a]  | |
1252 ...     | NC im2  src2a | allocate( REG = {im2, 0} )
1253                           "cp %[2], %[1]"
1254                           "tcc EQ, %[a]"
1255                           erase(%[a])           | %[a]  | |
1256 cmp tne | src2  REG     | allocate( REG = {im2, 0} )
1257                           "cp %[2], %[1]"
1258                           "tcc NE, %[a]"
1259                           erase(%[a])           | %[a]  | |
1260 ...     | NC im2  src2a | allocate( REG = {im2, 0} )
1261                           "cp %[2], %[1]"
1262                           "tcc NE, %[a]"
1263                           erase(%[a])           | %[a]  | |
1264 cmp tge | src2  REG     | allocate( REG = {im2, 0} )
1265                           "cp %[2], %[1]"
1266                           "tcc UGE, %[a]"
1267                           erase(%[a])           | %[a]  | |
1268 ...     | NC im2  src2a | allocate( REG = {im2, 0} )
1269                           "cp %[2], %[1]"
1270                           "tcc UGE, %[a]"
1271                           erase(%[a])           | %[a]  | |
1272 cmp tgt | src2  REG     | allocate( REG = {im2, 0} )
1273                           "cp %[2], %[1]"
1274                           "tcc UGT, %[a]"
1275                           erase(%[a])           | %[a]  | |
1276 ...     | NC im2  src2a | allocate( REG = {im2, 0} )
1277                           "cp %[2], %[1]"
1278                           "tcc UGT, %[a]"
1279                           erase(%[a])           | %[a]  | |
1280 tlt and $2==2   | src2c  SCR_REG        | test(%[1])
1281                                           "jr LT, 1f"
1282                                           "ldk %[2], $$0\n1:"
1283                                           erase(%[2])   | %[2]  | |
1284 tlt ior $2==2   | src2c  SCR_REG        | test(%[1])
1285                                           "tcc LT, %[2]"
1286                                           samecc
1287                                           erase(%[2])   | %[2]  | |
1288 tle and $2==2   | src2c  SCR_REG        | test(%[1])
1289                                           "jr LE, 1f"
1290                                           "ldk %[2], $$0\n1:"
1291                                           erase(%[2])   | %[2]  | |
1292 tle ior $2==2   | src2c  SCR_REG        | test(%[1])
1293                                           "tcc LE, %[2]"
1294                                           samecc
1295                                           erase(%[2])   | %[2]  | |
1296 teq and $2==2   | src2c  SCR_REG        | test(%[1])
1297                                           "jr EQ, 1f"
1298                                           "ldk %[2], $$0\n1:"
1299                                           erase(%[2])   | %[2]  | |
1300 teq ior $2==2   | src2c  SCR_REG        | test(%[1])
1301                                           "tcc EQ, %[2]"
1302                                           samecc
1303                                           erase(%[2])   | %[2]  | |
1304 tne and $2==2   | src2c  SCR_REG        | test(%[1])
1305                                           "jr NE, 1f"
1306                                           "ldk %[2], $$0\n1:"
1307                                           erase(%[2])   | %[2]  | |
1308 tne ior $2==2   | src2c  SCR_REG        | test(%[1])
1309                                           "tcc NE, %[2]"
1310                                           samecc
1311                                           erase(%[2])   | %[2]  | |
1312 tgt and $2==2   | src2c  SCR_REG        | test(%[1])
1313                                           "jr GT, 1f"
1314                                           "ldk %[2], $$0\n1:"
1315                                           erase(%[2])   | %[2]  | |
1316 tgt ior $2==2   | src2c  SCR_REG        | test(%[1])
1317                                           "tcc GT, %[2]"
1318                                           samecc
1319                                           erase(%[2])   | %[2]  | |
1320 tge and $2==2   | src2c  SCR_REG        | test(%[1])
1321                                           "jr GE, 1f"
1322                                           "ldk %[2], $$0\n1:"
1323                                           erase(%[2])   | %[2]  | |
1324 tge ior $2==2   | src2c  SCR_REG        | test(%[1])
1325                                           "tcc GE, %[2]"
1326                                           samecc
1327                                           erase(%[2])   | %[2]  | |
1328 cmi tlt and $1==2 && $3==2      | src2  REG  SCR_REG    |
1329                                         "cp %[2], %[1]"
1330                                         "jr LT, 1f"
1331                                         "ldk %[3], $$0\n1:"
1332                                         erase(%[3])     | %[3]  | |
1333 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1334                                           "jr LT, 1f"
1335                                           "ldk %[3], $$0\n1:"
1336                                           erase(%[3])   | %[3]  | |
1337 cmi tlt ior $1==2 && $3==2      | src2  REG  SCR_REG    |
1338                                         "cp %[2], %[1]"
1339                                         "tcc LT, %[3]"
1340                                         erase(%[3])     | %[3]  | |
1341 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1342                                           "tcc LT, %[3]"
1343                                           erase(%[3])   | %[3]  | |
1344 cmi tlt $1==2   | src2  REG     | allocate( REG = {im2, 0} )
1345                                   "cp %[2], %[1]"
1346                                   "tcc LT, %[a]"
1347                                   erase(%[a])           | %[a]  | |
1348 ...     | NC  im2  src2a        | allocate( REG = {im2, 0} )
1349                                   "cp %[2], %[1]"
1350                                   "tcc LT, %[a]"
1351                                   erase(%[a])           | %[a]  | |
1352 cmi tle and $1==2 && $3==2      | src2  REG  SCR_REG    |
1353                                         "cp %[2], %[1]"
1354                                         "jr LE, 1f"
1355                                         "ldk %[3], $$0\n1:"
1356                                         erase(%[3])     | %[3]  | |
1357 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1358                                           "jr LE, 1f"
1359                                           "ldk %[3], $$0\n1:"
1360                                           erase(%[3])   | %[3]  | |
1361 cmi tle ior $1==2 && $3==2      | src2  REG  SCR_REG    |
1362                                         "cp %[2], %[1]"
1363                                         "tcc LE, %[3]"
1364                                         erase(%[3])     | %[3]  | |
1365 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1366                                           "tcc LE, %[3]"
1367                                           erase(%[3])   | %[3]  | |
1368 cmi tle $1==2   | src2  REG     | allocate( REG = {im2, 0} )
1369                                   "cp %[2], %[1]"
1370                                   "tcc LE, %[a]"
1371                                   erase(%[a])           | %[a]  | |
1372 ...     | NC  im2  src2a        | allocate( REG = {im2, 0} )
1373                                   "cp %[2], %[1]"
1374                                   "tcc LE, %[a]"
1375                                   erase(%[a])           | %[a]  | |
1376 cmi teq and $1==2 && $3==2      | src2  REG  SCR_REG    |
1377                                         "cp %[2], %[1]"
1378                                         "jr EQ, 1f"
1379                                         "ldk %[3], $$0\n1:"
1380                                         erase(%[3])     | %[3]  | |
1381 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1382                                           "jr EQ, 1f"
1383                                           "ldk %[3], $$0\n1:"
1384                                           erase(%[3])   | %[3]  | |
1385 cmi teq ior $1==2 && $3==2      | src2  REG  SCR_REG    |
1386                                         "cp %[2], %[1]"
1387                                         "tcc EQ, %[3]"
1388                                         erase(%[3])     | %[3]  | |
1389 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1390                                           "tcc EQ, %[3]"
1391                                           erase(%[3])   | %[3]  | |
1392 cmi teq $1==2   | src2  REG     | allocate( REG = {im2, 0} )
1393                                   "cp %[2], %[1]"
1394                                   "tcc EQ, %[a]"
1395                                   erase(%[a])           | %[a]  | |
1396 ...     | NC  im2  src2a        | allocate( REG = {im2, 0} )
1397                                   "cp %[2], %[1]"
1398                                   "tcc EQ, %[a]"
1399                                   erase(%[a])           | %[a]  | |
1400 cmi tne and $1==2 && $3==2      | src2  REG  SCR_REG    |
1401                                         "cp %[2], %[1]"
1402                                         "jr NE, 1f"
1403                                         "ldk %[3], $$0\n1:"
1404                                         erase(%[3])     | %[3]  | |
1405 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1406                                           "jr NE, 1f"
1407                                           "ldk %[3], $$0\n1:"
1408                                           erase(%[3])   | %[3]  | |
1409 cmi tne ior $1==2 && $3==2      | src2  REG  SCR_REG    |
1410                                         "cp %[2], %[1]"
1411                                         "tcc NE, %[3]"
1412                                         erase(%[3])     | %[3]  | |
1413 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1414                                           "tcc NE, %[3]"
1415                                           erase(%[3])   | %[3]  | |
1416 cmi tne $1==2   | src2  REG     | allocate( REG = {im2, 0} )
1417                                   "cp %[2], %[1]"
1418                                   "tcc NE, %[a]"
1419                                   erase(%[a])           | %[a]  | |
1420 ...     | NC  im2  src2a        | allocate( REG = {im2, 0} )
1421                                   "cp %[2], %[1]"
1422                                   "tcc NE, %[a]"
1423                                   erase(%[a])           | %[a]  | |
1424 cmi tge and $1==2 && $3==2      | src2  REG  SCR_REG    |
1425                                         "cp %[2], %[1]"
1426                                         "jr GE, 1f"
1427                                         "ldk %[3], $$0\n1:"
1428                                         erase(%[3])     | %[3]  | |
1429 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1430                                           "jr GE, 1f"
1431                                           "ldk %[3], $$0\n1:"
1432                                           erase(%[3])   | %[3]  | |
1433 cmi tge ior $1==2 && $3==2      | src2  REG  SCR_REG    |
1434                                         "cp %[2], %[1]"
1435                                         "tcc GE, %[3]"
1436                                         erase(%[3])     | %[3]  | |
1437 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1438                                           "tcc GE, %[3]"
1439                                           erase(%[3])   | %[3]  | |
1440 cmi tge $1==2   | src2  REG     | allocate( REG = {im2, 0} )
1441                                   "cp %[2], %[1]"
1442                                   "tcc GE, %[a]"
1443                                   erase(%[a])           | %[a]  | |
1444 ...     | NC  im2  src2a        | allocate( REG = {im2, 0} )
1445                                   "cp %[2], %[1]"
1446                                   "tcc GE, %[a]"
1447                                   erase(%[a])           | %[a]  | |
1448 cmi tgt and $1==2 && $3==2      | src2  REG  SCR_REG    |
1449                                         "cp %[2], %[1]"
1450                                         "jr GT, 1f"
1451                                         "ldk %[3], $$0\n1:"
1452                                         erase(%[3])     | %[3]  | |
1453 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1454                                           "jr GT, 1f"
1455                                           "ldk %[3], $$0\n1:"
1456                                           erase(%[3])   | %[3]  | |
1457 cmi tgt ior $1==2 && $3==2      | src2  REG  SCR_REG    |
1458                                         "cp %[2], %[1]"
1459                                         "tcc GT, %[3]"
1460                                         erase(%[3])     | %[3]  | |
1461 ...     | NC im2  src2a  SCR_REG        | "cp %[2], %[1]"
1462                                           "tcc GT, %[3]"
1463                                           erase(%[3])   | %[3]  | |
1464 cmi tgt $1==2   | src2  REG     | allocate( REG = {im2, 0} )
1465                                   "cp %[2], %[1]"
1466                                   "tcc GT, %[a]"
1467                                   erase(%[a])           | %[a]  | |
1468 ...     | NC  im2  src2a        | allocate( REG = {im2, 0} )
1469                                   "cp %[2], %[1]"
1470                                   "tcc GT, %[a]"
1471                                   erase(%[a])           | %[a]  | |
1472 /*\f*/
1473 /***************************************
1474 ********        GROUP 13        ********
1475 ***************************************/
1476
1477 bra     | STACK | "jr $1"  samecc       | | |
1478 blt     | src2  REG     | remove( ALL )
1479                           "cp %[2], %[1]"
1480                           "jr LT, $1"           | | | (4,10)+%[1]
1481 ...     | NC im2  src2a | remove( ALL )
1482                           "cp %[2], %[1]"
1483                           "jr LT, $1"           | | |
1484 ...     | REG  src2     | remove( ALL )
1485                           "cp %[1], %[2]"
1486                           "jr GT, $1"           | | | (4,10)+%[2]
1487 ...     | NC src2a  im2 | remove( ALL )
1488                           "cp %[1], %[2]"
1489                           "jr GT, $1"           | | |
1490 ble     | src2  REG     | remove( ALL )
1491                           "cp %[2], %[1]"
1492                           "jr LE, $1"           | | | (4,10)+%[1]
1493 ...     | NC im2  src2a | remove( ALL )
1494                           "cp %[2], %[1]"
1495                           "jr LE, $1"           | | |
1496 ...     | REG  src2     | remove( ALL )
1497                           "cp %[1], %[2]"
1498                           "jr GE, $1"           | | | (4,10)+%[2]
1499 ...     | NC src2a  im2 | remove( ALL )
1500                           "cp %[1], %[2]"
1501                           "jr GE, $1"           | | |
1502 beq     | src2  REG     | remove( ALL )
1503                           "cp %[2], %[1]"
1504                           "jr EQ, $1"           | | | (4,10)+%[1]
1505 ...     | NC im2  src2a | remove( ALL )
1506                           "cp %[2], %[1]"
1507                           "jr EQ, $1"           | | |
1508 ...     | REG  src2     | remove( ALL )
1509                           "cp %[1], %[2]"
1510                           "jr EQ, $1"           | | | (4,10)+%[2]
1511 ...     | NC src2a  im2 | remove( ALL )
1512                           "cp %[1], %[2]"
1513                           "jr EQ, $1"           | | |
1514 bne     | src2  REG     | remove( ALL )
1515                           "cp %[2], %[1]"
1516                           "jr NE, $1"           | | | (4,10)+%[1]
1517 ...     | NC im2  src2a | remove( ALL )
1518                           "cp %[2], %[1]"
1519                           "jr NE, $1"           | | |
1520 ...     | REG  src2     | remove( ALL )
1521                           "cp %[1], %[2]"
1522                           "jr NE, $1"           | | | (4,10)+%[2]
1523 ...     | NC src2a  im2 | remove( ALL )
1524                           "cp %[1], %[2]"
1525                           "jr NE, $1"           | | |
1526 bge     | src2  REG     | remove( ALL )
1527                           "cp %[2], %[1]"
1528                           "jr GE, $1"           | | | (4,10)+%[1]
1529 ...     | NC im2  src2a | remove( ALL )
1530                           "cp %[2], %[1]"
1531                           "jr GE, $1"           | | |
1532 ...     | REG  src2     | remove( ALL )
1533                           "cp %[1], %[2]"
1534                           "jr LE, $1"           | | | (4,10)+%[2]
1535 ...     | NC src2a  im2 | remove( ALL )
1536                           "cp %[1], %[2]"
1537                           "jr LE, $1"           | | |
1538 bgt     | src2  REG     | remove( ALL )
1539                           "cp %[2], %[1]"
1540                           "jr GT, $1"           | | | (4,10)+%[1]
1541 ...     | NC im2  src2a | remove( ALL )
1542                           "cp %[2], %[1]"
1543                           "jr GT, $1"           | | |
1544 ...     | REG  src2     | remove( ALL )
1545                           "cp %[1], %[2]"
1546                           "jr LT, $1"           | | | (4,10)+%[2]
1547 ...     | NC src2a  im2 | remove( ALL )
1548                           "cp %[1], %[2]"
1549                           "jr LT, $1"           | | |
1550 zlt     | src2c | remove( ALL )
1551                   test(%[1])
1552                   "jr LT, $1"
1553                   samecc                | | |
1554 zle     | src2c | remove( ALL )
1555                   test(%[1])
1556                   "jr LE, $1"
1557                   samecc                | | |
1558 zeq     | src2c | remove( ALL )
1559                   test(%[1])
1560                   "jr EQ, $1"
1561                   samecc                | | |
1562 zne     | src2c | remove( ALL )
1563                   test(%[1])
1564                   "jr NE, $1"
1565                   samecc                | | |
1566 zge     | src2c | remove( ALL )
1567                   test(%[1])
1568                   "jr GE, $1"
1569                   samecc                | | |
1570 zgt     | src2c | remove( ALL )
1571                   test(%[1])
1572                   "jr GT, $1"
1573                   samecc                | | |
1574 cmp zlt         | src2  REG  STACK      | "cp %[2], %[1]"
1575                                           "jr ULT, $2"          | | |
1576 ...             | NC im2  src2a  STACK  | "cp %[2], %[1]"
1577                                           "jr ULT, $2"          | | |
1578 cmp zle         | src2  REG  STACK      | "cp %[2], %[1]"
1579                                           "jr ULE, $2"          | | |
1580 ...             | NC im2  src2a  STACK  | "cp %[2], %[1]"
1581                                           "jr ULE, $2"          | | |
1582 cmp zeq         | src2  REG  STACK      | "cp %[2], %[1]"
1583                                           "jr EQ, $2"           | | |
1584 ...             | NC im2  src2a  STACK  | "cp %[2], %[1]"
1585                                           "jr EQ, $2"           | | |
1586 cmp zne         | src2  REG  STACK      | "cp %[2], %[1]"
1587                                           "jr NE, $2"           | | |
1588 ...             | NC im2  src2a  STACK  | "cp %[2], %[1]"
1589                                           "jr NE, $2"           | | |
1590 cmp zgt         | src2  REG  STACK      | "cp %[2], %[1]"
1591                                           "jr UGT, $2"          | | |
1592 ...             | NC im2  src2a  STACK  | "cp %[2], %[1]"
1593                                           "jr UGT, $2"          | | |
1594 cmp zge         | src2  REG  STACK      | "cp %[2], %[1]"
1595                                           "jr UGE, $2"          | | |
1596 ...             | NC im2  src2a  STACK  | "cp %[2], %[1]"
1597                                           "jr UGE, $2"          | | |
1598 and zeq $1==2   | src2  SCR_REG  STACK  | "and %[2], %[1]"
1599                                           "jr EQ, $2"
1600                                           erase(%[2])   | | | (4,10)+%[1]
1601 ...             | SCR_REG  src2  STACK  | "and %[1], %[2]"
1602                                           "jr EQ, $2"
1603                                           erase(%[1])   | | | (4,10)+%[2]
1604 and zne $1==2   | src2  SCR_REG  STACK  | "and %[2], %[1]"
1605                                           "jr NE, $2"
1606                                           erase(%[2])   | | | (4,10)+%[1]
1607 ...             | SCR_REG  src2  STACK  | "and %[1], %[2]"
1608                                           "jr NE, $2"
1609                                           erase(%[1])   | | | (4,10)+%[2]
1610 /*\f*/
1611 /***************************************
1612 ********        GROUP 14        ********
1613 ***************************************/
1614
1615 cal     | STACK | "calr $1"     | | |
1616 cai     | NC src2a-x2  STACK    | "call %[1]"           | | |
1617 ...     | NC x2  STACK  | allocate( %[1], XREG = %[1] )
1618                           "call 0(%[a])"                | | |
1619 ...     | XREG  STACK   | "call 0(%[1])"                | | |
1620 lfr $1==0       | | | | |
1621 lfr $1==2       | | | R0        | |
1622 lfr $1==4       | | | RR0       | |
1623 lfr $1==6       | | | R2 R1 R0  | |
1624 lfr $1==8       | | | RR2  RR0  | |
1625 ret $1==0       | STACK | "ldk R14, $$0\nld R15, R13"
1626                           "pop R13, *RR14"
1627                           "ret"                 | | |
1628 ret $1==2       | src2  STACK   | move( %[1], R0 )
1629                                   "ldk R14, $$0\nld R15, R13"
1630                                   "pop R13, *RR14"
1631                                   "ret"                 | | |
1632 ret $1==4       | src4  STACK   | move( %[1], RR0 )
1633                                   "ldk R14, $$0\nld R15, R13"
1634                                   "pop R13, *RR14"
1635                                   "ret"                 | | |
1636 ret $1==6       | src2 src2 src2 STACK  | move( %[1], R0 )
1637                                           move( %[2], R1 )
1638                                           move( %[3], R2 )
1639                                           "ldk R14, $$0\nld R15, R13"
1640                                           "pop R13, *RR14"
1641                                           "ret"                 | | |
1642 ret $1==8       | src4  src4  STACK     | move( %[1], RR0 )
1643                                           move( %[2], RR2 )
1644                                           "ldk R14, $$0\nld R15, R13"
1645                                           "pop R13, *RR14"
1646                                           "ret"                 | | |
1647 lfr ret $1==$2          | | | | ret 0   |
1648 asp lfr ret $2==$3      | | | | ret 0   |
1649 asp ret $2==0           | | | | ret 0   |
1650 /*\f*/
1651 /***************************************
1652 ********        GROUP 15        ********
1653 ***************************************/
1654
1655 asp             | STACK | "add R15, $$$1"               | | |
1656 ass $1==2       | src2  STACK    | "add R15, %[1]"      | | |
1657 blm             | STACK | move( {im2, $1}, R0 )
1658                           "calr blm"
1659                           erase(R0)     | | |
1660 bls $1==2       | src2 STACK    | move( %[1], R0 )
1661                                   "calr blm"
1662                                   erase(R0)     | | |
1663 csa $1==2       | STACK | "pop R1, *RR14"
1664                           "pop R2, *RR14"
1665                           "jr csa"              | | |
1666 lae csa $2==2   | src2  STACK   | move( %[1], R2 )
1667                                   move( {ADDR_EXTERNAL, $1}, R1 )
1668                                   "jr csa"                      | | |
1669 csb $1==2       | STACK | "pop R1, *RR14"
1670                           "pop R2, *RR14"
1671                           "jr csb"              | | |
1672 lae csb $2==2   | src2  STACK   | move( %[1], R2 )
1673                                   move( {ADDR_EXTERNAL, $1}, R1 )
1674                                   "jr csb"                      | | |
1675 dup $1==2       | src2  | | %[1]  %[1]  | |
1676 dup $1==4       | src2  src2    | | %[2]  %[1]  %[2]  %[1]      | |
1677 dup             | STACK | move( {im2, $1}, R0 )
1678                           "calr dup"
1679                           erase(R0)     | | |
1680 dus $1==2       | src2  STACK   | move( %[1], R0 )
1681                                   "calr dup"
1682                                   erase(R0)             | | |
1683 exg $1==2       | src2  src2    | | %[1]  %[2]  | |
1684 exg $1==2       | STACK | move( {im2, $1}, R0 )
1685                           "calr exg"
1686                           erase(R0)             | | |
1687 lor $1==0       | | | LB        | |
1688 lor $1==1       | STACK | allocate( REG )
1689                           "ld %[a], R15"
1690                           samecc                | %[a]  | |
1691 lor $1==2       | | | {da2, "reghp"}    | |
1692 rck $1==2       | src2  STACK   | move( %[1], R1 )
1693                                   "calr rck"            | | |
1694 rck !defined($1)| src2  src2  STACK     | "cp %[1], $$2"
1695                                           "jr NE, unknown"
1696                                           move( %[2], R1 )
1697                                           "calr rck"            | | |
1698 str $1==0       | src2  | "ld R13, %[1]"  samecc        | | |
1699 str $1==1       | src2  STACK   | "ldk R14, $$0\nld R15, %[1]"
1700                                   samecc                        | | |
1701 str $1==2       | STACK | "calr strhp"  | | |
1702 dch     | | | | loi 2   |
1703 fil     | | "ld hol0+4, $$$1"  samecc   | | |
1704 gto     | STACK | "push *RR14, $$$1"
1705                   "jr gto"              | | |
1706 lim     | | | {da2, "trpim"}    | |
1707 lin     | | "ld hol0, $$$1"  samecc     | | |
1708 lni     | | "inc hol0"  | | |
1709 lpb     | | | | adp SL  |
1710 mon     | STACK | "calr mon"    | | |
1711 nop     | STACK |
1712 #ifdef DEBUG
1713         "calr noop"
1714 #endif
1715                                         | | |
1716 rtt     | | | | ret 0   |
1717 sig     | REG   | allocate(REG)
1718                   move( {da2, "trppc"}, %[a] )
1719                   "ld trppc, %[1]"
1720                   samecc                        | %[a]  | |
1721 sim     | STACK | "pop trpim, *RR14"
1722                   samecc                | | |
1723 trp     | STACK | "calr trp"            | | |
1724
1725 /* For several floating point instructions we generate an illegal
1726 ** instruction trap
1727 */
1728 adf     | | | | loc 18 trp      |
1729 sbf     | | | | loc 18 trp      |
1730 mlf     | | | | loc 18 trp      |
1731 dvf     | | | | loc 18 trp      |
1732 ngf     | | | | loc 18 trp      |
1733 fef     | | | | loc 18 trp      |
1734 fif     | | | | loc 18 trp      |
1735 zrf     | | | | loc 18 trp      |
1736 cfi     | | | | loc 18 trp      |
1737 cif     | | | | loc 18 trp      |
1738 cfu     | | | | loc 18 trp      |
1739 cuf     | | | | loc 18 trp      |
1740 cff     | | | | loc 18 trp      |
1741 cmf     | | | | loc 18 trp      |
1742 /*\f*/
1743 /* COERCIONS    */
1744 /*********************************
1745 ** From source2 to register     **
1746 *********************************/
1747 | regconst2     | allocate( %[1], XREG = %[1.xreg] )
1748                   "add %[a], $$%[1.ind]"
1749                   setcc(%[a])                   | %[a]  | | (4,7)
1750 | ADDR_LOCAL    | allocate( REG )
1751                   "ld %[a], R13"
1752                   "add %[a], $$%[1.ind]"
1753                   setcc(%[a])                   | %[a]  | | (6,10)
1754 | REG   | allocate( %[1], XREG = %[1] ) | {regconst2, %[a], 0}  | |
1755 | src2  | allocate( %[1], REG = %[1] )  | %[a]  | |
1756 | src2  | allocate( %[1], XREG = %[1] ) | {regconst2, %[a], 0}  | |
1757
1758
1759 /*********************************
1760 ** From source2 to source2      **
1761 *********************************/
1762 | ADDR_EXTERNAL | | {da2, %[1.ind]}     | |
1763
1764
1765 /*********************************
1766 ** From source1 to source2      **
1767 *********************************/
1768 | src1  | allocate( %[1], B2REG = %[1] )        | %[a]  | |
1769
1770
1771 /*********************************
1772 ** From source4 to register     **
1773 *********************************/
1774 | src4  | allocate( %[1], LWREG = %[1] )        | %[a]  | |
1775
1776
1777 /*********************************
1778 ** From source4 to source2      **
1779 *********************************/
1780 | LWREG | | %[1.2]  %[1.1]      | |
1781 | x4    | | {x2, %[1.xreg], 2+%[1.ind]}  {x2, %[1.xreg], %[1.ind]} | |
1782 | da4   | | {da2, "2+"+%[1.ind]}  {da2, %[1.ind]}       | |
1783 | ir4   | | {ir4_hi, %[1.lwxreg]}  {ir2, %[1.lwxreg]}   | |
1784 | ir4_hi  | allocate( LWREG = %[1.lwreg] )      | {x2, %[a.2], 2}  | |
1785
1786
1787 /*********************************
1788 ** From STACK                   **
1789 *********************************/
1790 | STACK | allocate( REG )
1791           "pop %[a], *RR14"
1792           samecc                | %[a]  | | (2,8)
1793 | STACK | allocate( XREG )
1794           "pop %[a], *RR14"
1795           samecc                | {regconst2, %[a], 0}  | | (2,8)
1796 | STACK | allocate( LWREG )
1797           "popl %[a], *RR14"
1798           samecc                | %[a]  | | (2,12)
1799
1800
1801 MOVES:
1802 /* move( src, dst ) --> ld dst, src     */
1803 (im2  (%[num]>=0 && %[num]<=15), REG, "ldk %[2], %[1]" samecc, (2,5))
1804 (im2  %[num]==0, src2a, "clr %[2]" samecc, (2,7)+%[2])
1805 (im2  %[num]==0, src1, "clrb %[2]" samecc, (2,7)+%[2])
1806 (im2, src1, "ldb %[2], $$[%[1.num]-[%[1.num]&0xFFFFFF00]+128]%%256-128"
1807             samecc, (4,9)+%[2])
1808 (src1, B2REG, "ldk %[2], $$0\nldb L%[2], %[1]" samecc, (4,8)+%[1])
1809 (src2, REG, "ld %[2], %[1]" samecc, (2,3)+%[1])
1810 (src4, LWREG, "ldl %[2], %[1]" samecc, (2,5)+%[1])
1811 (const2, src1, "ldb %[2], %[1]" samecc, (4,9)+%[2])
1812 (B2REG, src1, "ldb %[2], L%[1]" samecc, (2,6)+%[2])
1813 (src2b, src2a, "ld %[2], %[1]" samecc, (2,6)+%[1]+%[2])
1814 (src4b, src4a, "ldl %[2], %[1]" samecc, (2,6)+%[2])
1815
1816
1817 TESTS:
1818 (src2c, "test %[1]", (2,7)+%[1])
1819
1820
1821 STACKS:
1822 (src1, B2REG,   move( %[1], %[a] )
1823                 "push *RR14, %[a]"
1824                 "clrb *RR14"
1825                 samecc,         (4,17)          )
1826 (src1,,         ".sect data\n1:\t.data2 0\n.text"
1827                 "ld 1b, R0"
1828                 "ldk R0, $$0"
1829                 "ldb RL0, %[1]"
1830                 "push *RR14, R0"
1831                 "ld R0, 1b"
1832                 samecc,         (18,37)+%[1]    )
1833 (src2,,         "push *RR14, %[1]"
1834                 samecc,         (2,9)+%[1]      )
1835 (const4, LWREG, move( %[1], %[a] )
1836                 "pushl *RR14, %[a]"
1837                 samecc,         (2,12)          )
1838 (im4,,          "push *RR14, %[1]"
1839                 "push *RR14, $$0"
1840                 samecc,         (8,24)  )  /* there is no pushl ir,im */
1841 (double,,       ".sect .data\n1:\t.data4 %[1]\n.text"
1842                 "pushl *RR14, 1b"
1843                 samecc,         (6,20)          )
1844 (src4,,         "pushl *RR14, %[1]"
1845                 samecc,         (2,12)+%[1]     )
1846 (regconst2,,    "add %[1.xreg], $$%[1.ind]"
1847                 "push *RR14, %[1.xreg]"
1848                 nocc,           (6,16)          )
1849 (ADDR_LOCAL, REG,
1850                 move( LB, %[a] )
1851                 "add %[a], $$%[1.ind]"
1852                 "push *RR14, %[a]"
1853                 setcc(%[a]),    (6,16)          )
1854 (ADDR_LOCAL,,   "add R13, $$%[1.ind]"
1855                 "push *RR14, R13"
1856                 "sub R13, $$%[1.ind]"
1857                 nocc,           (10,23)         )