1 "$Id: table,v 1.9 1994/06/24 13:56:50 ceriel Exp $"
4 /* savsize is 6 because size of LB is 2 and size of z8000-PC is 4 */
5 #define NC nocoercions:
7 /*********************************************************
8 ** Back end tables for z8000 **
9 ** Author: Jan Voors **
11 ** wordsize = 2 bytes, pointersize = 2 bytes. **
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 **
19 ** Floating point arithmetic and constants are not **
22 *********************************************************/
25 * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
27 * This product is part of the Amsterdam Compiler Kit.
29 * Permission to use, sell, duplicate or disclose this software must be
30 * obtained in writing. Requests for such permissions may be sent to
32 * Dr. Andrew S. Tanenbaum
33 * Wiskundig Seminarium
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.
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.
70 RQ0 = ("RQ0", 8, RR0, RR2), DLWREG.
71 RQ4 = ("RQ4", 8, RR4, RR6), DLWREG.
72 RQ8 = ("RQ8", 8, RR8, RR10), DLWREG.
76 /* z8000-addressing-modes 'ra', 'ba' and 'bx' never used so far,
77 ** so there are no tokens for them (yet).
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
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]"
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]"
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])"
96 ADDR_LOCAL = { INT ind; } 2
97 ADDR_EXTERNAL = { STRING ind; } 2 cost=(2,3) "$%[ind]"
98 regconst2 = { REGISTER xreg; INT ind; } 2
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
112 const2 = im2 + ADDR_EXTERNAL
113 const4 = im4 + double
114 allexceptcon = ALL - REGS - im2 - im4 - double - ADDR_LOCAL
117 src2a = ir2 + da2 + x2
118 src4a = ir4 + da4 + x4
119 src2b = REG + im2 + localbase + ADDR_EXTERNAL
121 src2c = REG + ir2 + da2 + x2
125 /***************************************
126 ******** GROUP 1 ********
127 ***************************************/
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])"
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])"
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 )
173 move( {im2, 0}, %[a.1] )
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 )
180 move( {im2, 0}, %[a.1] )
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 )
187 move( {im2, 0}, %[a.1] )
189 loi $1>4 | src2 STACK | allocate( REG = {im2, $1/2} )
190 allocate( %[1], LWXREG )
192 move( {im2, 0}, %[b.1] )
195 "lddr *RR14, *%[b], %[a]"
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"
210 lpi | | | {ADDR_EXTERNAL, $1} | |
212 /***************************************
213 ******** GROUP 2 ********
214 ***************************************/
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 )
223 move( %[1], {x2, LB, $1} ) | | |
224 ste | src2b | remove( da )
225 remove( indexed, %[xreg]!=LB )
227 move( %[1], {da2, $1} ) | | |
228 sil | src2b | remove( allexceptcon )
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 )
254 move( {im2, 0}, %[a.1] )
255 move( %[2], {ir1, %[a]} ) | | |
256 ... | src2 B2REG | remove( allexceptcon )
257 allocate( %[1], LWXREG )
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 )
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 )
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 )
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"
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 )
305 move( %[1], {x4, LB, $1} ) | | |
306 sde | src4b | remove( da )
307 remove( indexed, %[xreg]!=LB )
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]} ) | | |
317 /***************************************
318 ******** GROUP 3 ********
319 ***************************************/
321 adi $1==2 | NC SCR_XREG im2 | |
322 {regconst2, %[1], %[2.num]} | |
323 ... | NC SCR_XREG ADDR_LOCAL |
326 {regconst2, %[1], %[2.ind]} | |
327 ... | NC REG ADDR_LOCAL |
332 {regconst2, %[a], %[2.ind]} | |
333 ... | NC SCR_XREG regconst2 |
334 "add %[1], %[2.xreg]"
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] ) |
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 |
350 {regconst2, %[1.xreg],
351 %[2.ind]+%[1.ind]} | |
352 ... | NC regconst2 regconst2 |
353 "add %[1.xreg],%[2.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 |
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]"
368 setcc(%[1]) | %[1] | |
369 ... | src2 SCR_REG | "add %[2], %[1]"
371 setcc(%[2]) | %[2] | |
372 adi $1==4 | src4 SCR_LWREG |
375 setcc(%[2]) | %[2] | | (2,8)+%[1]
376 ... | SCR_LWREG src4 |
379 setcc(%[1]) | %[1] | | (2,8)+%[2]
380 sbi $1==2 | src2 SCR_REG | "sub %[2], %[1]"
382 setcc(%[2]) | %[2] | | (2,4)+%[1]
383 ... | SCR_REG src2 | "sub %[1], %[2]"
385 | %[1] | ngi 2 | (2,4)+%[2]
386 sbi $1==4 | src4 SCR_LWREG |
389 setcc(%[2]) | %[2] | | (2,8)+%[1]
390 ... | SCR_LWREG src4 |
393 | %[1] | ngi 4 | (2,8)+%[2]
394 mli $1==2 | src2 src2 | allocate( %[2], LWREG )
398 setcc(%[a.2]) | %[a.2] | |
399 mli $1==4 | src4 src4 | allocate( %[2], DLWREG )
403 setcc(%[a.2]) | %[a.2] | |
404 dvi $1==2 | src2 src2 | allocate( %[2], LWREG )
410 dvi $1==4 | src4 src4 | allocate( %[2], DLWREG )
416 rmi $1==2 | src2 src2 | allocate( %[2], LWREG )
422 rmi $1==4 | src4 src4 | allocate( %[2], DLWREG )
428 ngi $1==2 | SCR_REG | "neg %[1]"
430 setcc(%[1]) | %[1] | | (2,7)
431 ngi $1==4 | src4 | allocate( LWREG = {im4, 0} )
434 setcc(%[a]) | %[a] | | (2,8)+%[1]
435 sli $1==2 | im2 SCR_REG | "sla %[2], %[1]"
437 setcc(%[2]) | %[2] | | (2,0)
438 ... | REG SCR_REG | "sda %[2], %[1]"
440 setcc(%[2]) | %[2] | | (4,2)
441 sli $1==4 | im2 SCR_LWREG | "slal %[2], %[1]"
443 setcc(%[2]) | %[2] | | (2,0)
444 ... | REG SCR_LWREG | "sdal %[2], %[1]"
446 setcc(%[2]) | %[2] | | (4,2)
447 sri $1==2 | im2 SCR_REG | allocate( REG = {im2, 0-%[1.num]} )
450 setcc(%[2]) | %[2] | | (4,2)
451 ... | REG SCR_REG | "neg %[1]"
454 setcc(%[2]) | %[2] | | (6,9)
455 sri $1==4 | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} )
458 setcc(%[2]) | %[2] | | (4,2)
459 ... | REG SCR_LWREG | "neg %[1]"
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 )
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 )
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 | |
489 remove( indexed, %[xreg]!=LB )
492 setcc({da2, $2}) | | |
493 loc loe adi ste $2==$4 && $3==2 && $1<0 && $1>=0-16 | |
495 remove( indexed, %[xreg]!=LB )
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 )
504 move( {x2, LB, $2}, %[a.2] )
505 move( {im2, 0}, %[a.1] )
507 setcc({ir2, %[a]}) | | |
508 loc lil adi sil $2==$4 && $3==2 && $1<0 && $1>=0-16 | |
509 remove( allexceptcon )
511 move( {x2, LB, $2}, %[a.2] )
512 move( {im2, 0}, %[a.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 )
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 )
533 "inc $1(R13), $$0-$2"
534 setcc({x2, LB, $1}) | | |
535 loe loc sbi ste $1==$4 && $3==2 && $2>0 && $2<=16 | |
537 remove( indexed, %[xreg]!=LB )
540 setcc({da2, $1}) | | |
541 loe loc sbi ste $1==$4 && $3==2 && $2<0 && $2>=0-16 | |
543 remove( indexed, %[xreg]!=LB )
546 setcc({da2, $1}) | | |
547 lil loc sbi sil $1==$4 && $3==2 && $2>0 && $2<=16 | |
548 remove( allexceptcon )
550 move( {x2, LB, $1}, %[a.2] )
551 move( {im2, 0}, %[a.1] )
553 setcc({ir2, %[a]}) | | |
554 lil loc sbi sil $1==$4 && $3==2 && $2<0 && $2>=0-16 | |
555 remove( allexceptcon )
557 move( {x2, LB, $1}, %[a.2] )
558 move( {im2, 0}, %[a.1] )
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 )
569 remove( allexceptcon )
571 setcc({x2, LB, $1}) | | |
572 loe ngi ste $1==$3 && $2==2 | |
574 remove( indexed, %[xreg]!=LB )
577 setcc({da2, $1}) | | |
578 lil ngi sil $1==$3 && $2==2 | |
579 remove( allexceptcon )
581 move( {x2, LB, $1}, %[a.2] )
582 move( {im2, 0}, %[a.1] )
584 setcc({ir2, %[a]}) | | |
585 loc sli $1>=0 && $1<=16 && $2==2 | SCR_REG |
588 setcc(%[1]) | %[1] | |
589 loc sli $1>=0 && $1<=32 && $2==4 | SCR_LWREG |
592 setcc(%[1]) | %[1] | |
593 loc sri $1>=0 && $1<=16 && $2==2 | SCR_REG |
596 setcc(%[1]) | %[1] | |
597 loc sri $1>=0 && $1<=32 && $2==4 | SCR_LWREG |
600 setcc(%[1]) | %[1] | |
601 loc sru $1>=0 && $1<=16 && $2==2 | SCR_REG |
604 setcc(%[1]) | %[1] | |
605 loc sru $1>=0 && $1<=32 && $2==4 | SCR_LWREG |
608 setcc(%[1]) | %[1] | |
610 /***************************************
611 ******** GROUP 4 ********
612 ***************************************/
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]} )
630 setcc(%[2]) | %[2] | | (4,2)
631 ... | REG SCR_REG | "neg %[1]"
634 setcc(%[2]) | %[2] | | (6,9)
635 sru $1==4 | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} )
638 setcc(%[2]) | %[2] | | (4,2)
639 ... | REG SCR_LWREG | "neg %[1]"
642 setcc(%[2]) | %[2] | | (6,9)
644 /***************************************
645 ******** GROUP 6 ********
646 ***************************************/
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] )
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] )
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] )
671 "inc *%[a]" | {regconst2, %[b], 0} | |
672 /* because the next EM-instruction
675 lil adp dup sil $1==$4 && $3==2 && $2==1 | |
677 remove( allexceptcon )
678 move( {x2, LB, $1}, %[a.2] )
679 move( {im2, 0}, %[a.1] )
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 )
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 )
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} )
707 remove( indexed, %[xreg]!=LB )
710 setcc({da2, $1}) | %[a] | |
711 loe dup adp ste $1==$4 && $2==2 && $3<0 && $3>=0-16 | |
712 allocate( REG = {da2, $1} )
714 remove( indexed, %[xreg]!=LB )
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 )
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 )
736 "dec $1(R13), $$0-$2"
737 setcc({x2, LB, $1}) | | |
738 loe adp ste $1==$3 && $2>0 && $2<=16 | |
740 remove( indexed, %[xreg]!=LB )
743 setcc({da2, $1}) | | |
744 loe adp ste $1==$3 && $2<0 && $2>=0-16 | |
746 remove( indexed, %[xreg]!=LB )
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 |
755 /***************************************
756 ******** GROUP 7 ********
757 ***************************************/
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] )
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] )
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] )
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 )
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 )
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 )
803 remove( indexed, %[xreg]!=LB )
806 setcc({da2, $1}) | | |
808 remove( indexed, %[xreg]!=LB )
811 setcc({da2, $1}) | | |
813 remove( indexed, %[xreg]!=LB )
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"
825 erase(%[a]) samecc | | |
826 zer !defined($1)| SCR_REG | remove( ALL )
828 "1:\tpush *RR14, $$0"
830 erase(%[1]) nocc | | |
832 /***************************************
833 ******** GROUP 8 ********
834 ***************************************/
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] )
841 erase(%[a]) samecc | %[a] | |
842 loc loc cii $1==1 && $2==4 | NC src1 |
843 allocate( %[1], LWB2REG )
847 ... | src2 | allocate( %[1], LWREG )
851 loc loc cii $1==2 && $2==4 | src2 | allocate( %[1], LWREG )
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" | | |
864 /***************************************
865 ******** GROUP 9 ********
866 ***************************************/
868 and $1==2 | SCR_REG src2 | "and %[1], %[2]"
870 setcc(%[1]) | %[1] | | (2,4)+%[2]
871 ... | src2 SCR_REG | "and %[2], %[1]"
873 setcc(%[2]) | %[2] | | (2,4)+%[1]
874 and $1>2 | | remove( ALL )
875 allocate( LWXREG, REG, REG = {im2, $1/2} )
878 "1:\tpop %[b], *RR14"
883 erase(%[c]) nocc | | |
884 and !defined($1)| SCR_REG | remove( ALL )
885 allocate( LWXREG, REG )
889 "1:\tpop %[b], *RR14"
894 erase(%[1]) nocc | | |
895 ior $1==2 | SCR_REG src2 | "or %[1], %[2]"
897 setcc(%[1]) | %[1] | | (2,4)+%[2]
898 ... | src2 SCR_REG | "or %[2], %[1]"
900 setcc(%[2]) | %[2] | | (2,4)+%[1]
901 ior $1>2 | | remove( ALL )
902 allocate( LWXREG, REG, REG = {im2, $1/2} )
905 "1:\tpop %[b], *RR14"
910 erase(%[c]) nocc | | |
911 ior !defined($1)| SCR_REG | remove( ALL )
912 allocate( LWXREG, REG )
916 "1:\tpop %[b], *RR14"
921 erase(%[1]) nocc | | |
922 xor $1==2 | SCR_REG src2 | "xor %[1], %[2]"
924 setcc(%[1]) | %[1] | | (2,4)+%[2]
925 ... | src2 SCR_REG | "xor %[2], %[1]"
927 setcc(%[2]) | %[2] | | (2,4)+%[1]
928 xor $1>2 | | remove( ALL )
929 allocate( LWXREG, REG, REG = {im2, $1/2} )
932 "1:\tpop %[b], *RR14"
937 erase(%[c]) nocc | | |
938 xor !defined($1)| SCR_REG | remove( ALL )
939 allocate( LWXREG, REG )
943 "1:\tpop %[b], *RR14"
948 erase(%[1]) nocc | | |
949 com $1==2 | SCR_REG | "com %[1]"
951 setcc(%[1]) | %[1] | |
952 com defined($1) | STACK | allocate( LWXREG, REG = {im2, $1/2} )
957 erase(%[b]) nocc | | |
958 com !defined($1)| SCR_REG STACK | allocate( LWXREG )
963 erase(%[1]) nocc | | |
964 lil and sil $1==$3 && $2==2 | SCR_REG |
966 remove( allexceptcon )
967 move( {x2, LB, $1}, %[a.2] )
968 move( {im2, 0}, %[a.1] )
970 "ld *%[a], %[1]" | | |
971 lil ior sil $1==$3 && $2==2 | SCR_REG |
973 remove( allexceptcon )
974 move( {x2, LB, $1}, %[a.2] )
975 move( {im2, 0}, %[a.1] )
977 "ld *%[a], %[1]" | | |
978 lil xor sil $1==$3 && $2==2 | SCR_REG |
980 remove( allexceptcon )
981 move( {x2, LB, $1}, %[a.2] )
982 move( {im2, 0}, %[a.1] )
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 )
993 remove( allexceptcon )
995 setcc({x2, LB, $1}) | | |
996 loe com ste $1==$3 && $2==2 | |
998 remove( indexed, %[xreg]!=LB )
1001 setcc({da2, $1}) | | |
1002 lil com sil $1==$3 && $2==2 | |
1004 remove( allexceptcon )
1005 move( {x2, LB, $1}, %[a.2] )
1006 move( {im2, 0}, %[a.1] )
1008 setcc({ir2, %[a]}) | | |
1009 rol $1==2 | SCR_REG SCR_REG | "1:\trl %[2]"
1012 setcc(%[2]) | %[2] | |
1013 ror $1==2 | SCR_REG SCR_REG | "1:\trr %[2]"
1016 setcc(%[2]) | %[2] | |
1018 /***************************************
1019 ******** GROUP 10 ********
1020 ***************************************/
1022 inn $1==2 | REG SCR_REG | allocate( REG = {im2, 0} )
1027 erase(%[a]) nocc | %[a] | |
1028 inn defined($1) | src2 STACK | move( %[1], R1 )
1029 move( {im2, $1}, R2 )
1033 inn !defined($1)| src2 src2 STACK | move( %[1], R2 )
1038 loc inn $2==2 && $1==0 | SCR_REG |
1040 erase(%[1]) setcc(%[1]) | %[1] | |
1041 loc inn $2==2 && $1==1 | SCR_REG |
1044 erase(%[1]) setcc(%[1]) | %[1] | |
1045 loc inn $2==2 && $1>1 && $1<=16 | SCR_REG |
1046 "srl %[1], $$%(0-$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} )
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} )
1058 setcc(%[a]) | %[a] | and 2 zne $2 |
1059 set $1==2 | REG | allocate( REG = {im2, 0} )
1062 "push *RR14, $$ESET"
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 )
1072 set !defined($1)| src2 src2 STACK | move( %[1], R0 )
1078 /***************************************
1079 ******** GROUP 11 ********
1080 ***************************************/
1082 aar $1==2 | src2 src2 STACK | move( %[1], R1 )
1087 aar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 )
1094 sar $1==2 | src2 src2 STACK | move( %[1], R1 )
1099 sar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 )
1106 lar $1==2 | src2 src2 STACK | move( %[1], R1 )
1111 lar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 )
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 |
1123 erase(%[1]) | %[1] | adi 2 |
1124 lae aar $2==2 && rom(1,3)==2 && rom(1,1)!=0 | SCR_XREG |
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 |
1130 erase(%[1]) | %[1] | adi 2 |
1131 lae aar $2==2 && rom(1,3)==4 && rom(1,1)!=0 | SCR_XREG |
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 |
1137 erase(%[1]) | %[1] | adi 2 |
1138 lae aar $2==2 && rom(1,3)==8 && rom(1,1)!=0 | SCR_XREG |
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)%)"
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) |
1156 /***************************************
1157 ******** GROUP 12 ********
1158 ***************************************/
1160 cmi $1==2 | src2 REG | allocate( REG = {im2, 0} )
1167 erase(%[a]) nocc | %[a] | |
1168 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1175 erase(%[a]) nocc | %[a] | |
1176 cmi $1==4 | STACK | "calr cmi4" | R0 | |
1177 cmi !defined($1)| src2 STACK | move( %[1], R0 )
1180 cmu $1==2 | | | | cmp |
1181 cmu $1==4 | STACK | "calr cmu4" | R0 | |
1182 cmu !defined($1)| src2 STACK | move( %[1], R0 )
1185 cms $1==2 | | | | sbi $1 |
1186 cms defined($1) | STACK | move( {im2, $1}, R0 )
1189 cms !defined($1)| src2 STACK | move( %[1], R0 )
1192 cmp | src2 REG | allocate( REG = {im2, 0} )
1199 erase(%[a]) nocc | %[a] | |
1200 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1207 erase(%[a]) nocc | %[a] | |
1208 tlt | src2c | allocate( REG = {im2, 0} )
1211 erase(%[a]) samecc | %[a] | |
1212 tle | src2c | allocate( REG = {im2, 0} )
1215 erase(%[a]) samecc | %[a] | |
1216 teq | src2c | allocate( REG = {im2, 0} )
1219 erase(%[a]) samecc | %[a] | |
1220 tne | src2c | allocate( REG = {im2, 0} )
1223 erase(%[a]) samecc | %[a] | |
1224 tge | src2c | allocate( REG = {im2, 0} )
1227 erase(%[a]) samecc | %[a] | |
1228 tgt | src2c | allocate( REG = {im2, 0} )
1231 erase(%[a]) samecc | %[a] | |
1232 cmp tlt | src2 REG | allocate( REG = {im2, 0} )
1235 erase(%[a]) | %[a] | |
1236 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1239 erase(%[a]) | %[a] | |
1240 cmp tle | src2 REG | allocate( REG = {im2, 0} )
1243 erase(%[a]) | %[a] | |
1244 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1247 erase(%[a]) | %[a] | |
1248 cmp teq | src2 REG | allocate( REG = {im2, 0} )
1251 erase(%[a]) | %[a] | |
1252 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1255 erase(%[a]) | %[a] | |
1256 cmp tne | src2 REG | allocate( REG = {im2, 0} )
1259 erase(%[a]) | %[a] | |
1260 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1263 erase(%[a]) | %[a] | |
1264 cmp tge | src2 REG | allocate( REG = {im2, 0} )
1267 erase(%[a]) | %[a] | |
1268 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1271 erase(%[a]) | %[a] | |
1272 cmp tgt | src2 REG | allocate( REG = {im2, 0} )
1275 erase(%[a]) | %[a] | |
1276 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1279 erase(%[a]) | %[a] | |
1280 tlt and $2==2 | src2c SCR_REG | test(%[1])
1283 erase(%[2]) | %[2] | |
1284 tlt ior $2==2 | src2c SCR_REG | test(%[1])
1287 erase(%[2]) | %[2] | |
1288 tle and $2==2 | src2c SCR_REG | test(%[1])
1291 erase(%[2]) | %[2] | |
1292 tle ior $2==2 | src2c SCR_REG | test(%[1])
1295 erase(%[2]) | %[2] | |
1296 teq and $2==2 | src2c SCR_REG | test(%[1])
1299 erase(%[2]) | %[2] | |
1300 teq ior $2==2 | src2c SCR_REG | test(%[1])
1303 erase(%[2]) | %[2] | |
1304 tne and $2==2 | src2c SCR_REG | test(%[1])
1307 erase(%[2]) | %[2] | |
1308 tne ior $2==2 | src2c SCR_REG | test(%[1])
1311 erase(%[2]) | %[2] | |
1312 tgt and $2==2 | src2c SCR_REG | test(%[1])
1315 erase(%[2]) | %[2] | |
1316 tgt ior $2==2 | src2c SCR_REG | test(%[1])
1319 erase(%[2]) | %[2] | |
1320 tge and $2==2 | src2c SCR_REG | test(%[1])
1323 erase(%[2]) | %[2] | |
1324 tge ior $2==2 | src2c SCR_REG | test(%[1])
1327 erase(%[2]) | %[2] | |
1328 cmi tlt and $1==2 && $3==2 | src2 REG SCR_REG |
1332 erase(%[3]) | %[3] | |
1333 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1336 erase(%[3]) | %[3] | |
1337 cmi tlt ior $1==2 && $3==2 | src2 REG SCR_REG |
1340 erase(%[3]) | %[3] | |
1341 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1343 erase(%[3]) | %[3] | |
1344 cmi tlt $1==2 | src2 REG | allocate( REG = {im2, 0} )
1347 erase(%[a]) | %[a] | |
1348 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1351 erase(%[a]) | %[a] | |
1352 cmi tle and $1==2 && $3==2 | src2 REG SCR_REG |
1356 erase(%[3]) | %[3] | |
1357 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1360 erase(%[3]) | %[3] | |
1361 cmi tle ior $1==2 && $3==2 | src2 REG SCR_REG |
1364 erase(%[3]) | %[3] | |
1365 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1367 erase(%[3]) | %[3] | |
1368 cmi tle $1==2 | src2 REG | allocate( REG = {im2, 0} )
1371 erase(%[a]) | %[a] | |
1372 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1375 erase(%[a]) | %[a] | |
1376 cmi teq and $1==2 && $3==2 | src2 REG SCR_REG |
1380 erase(%[3]) | %[3] | |
1381 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1384 erase(%[3]) | %[3] | |
1385 cmi teq ior $1==2 && $3==2 | src2 REG SCR_REG |
1388 erase(%[3]) | %[3] | |
1389 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1391 erase(%[3]) | %[3] | |
1392 cmi teq $1==2 | src2 REG | allocate( REG = {im2, 0} )
1395 erase(%[a]) | %[a] | |
1396 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1399 erase(%[a]) | %[a] | |
1400 cmi tne and $1==2 && $3==2 | src2 REG SCR_REG |
1404 erase(%[3]) | %[3] | |
1405 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1408 erase(%[3]) | %[3] | |
1409 cmi tne ior $1==2 && $3==2 | src2 REG SCR_REG |
1412 erase(%[3]) | %[3] | |
1413 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1415 erase(%[3]) | %[3] | |
1416 cmi tne $1==2 | src2 REG | allocate( REG = {im2, 0} )
1419 erase(%[a]) | %[a] | |
1420 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1423 erase(%[a]) | %[a] | |
1424 cmi tge and $1==2 && $3==2 | src2 REG SCR_REG |
1428 erase(%[3]) | %[3] | |
1429 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1432 erase(%[3]) | %[3] | |
1433 cmi tge ior $1==2 && $3==2 | src2 REG SCR_REG |
1436 erase(%[3]) | %[3] | |
1437 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1439 erase(%[3]) | %[3] | |
1440 cmi tge $1==2 | src2 REG | allocate( REG = {im2, 0} )
1443 erase(%[a]) | %[a] | |
1444 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1447 erase(%[a]) | %[a] | |
1448 cmi tgt and $1==2 && $3==2 | src2 REG SCR_REG |
1452 erase(%[3]) | %[3] | |
1453 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1456 erase(%[3]) | %[3] | |
1457 cmi tgt ior $1==2 && $3==2 | src2 REG SCR_REG |
1460 erase(%[3]) | %[3] | |
1461 ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
1463 erase(%[3]) | %[3] | |
1464 cmi tgt $1==2 | src2 REG | allocate( REG = {im2, 0} )
1467 erase(%[a]) | %[a] | |
1468 ... | NC im2 src2a | allocate( REG = {im2, 0} )
1471 erase(%[a]) | %[a] | |
1473 /***************************************
1474 ******** GROUP 13 ********
1475 ***************************************/
1477 bra | STACK | "jr $1" samecc | | |
1478 blt | src2 REG | remove( ALL )
1480 "jr LT, $1" | | | (4,10)+%[1]
1481 ... | NC im2 src2a | remove( ALL )
1484 ... | REG src2 | remove( ALL )
1486 "jr GT, $1" | | | (4,10)+%[2]
1487 ... | NC src2a im2 | remove( ALL )
1490 ble | src2 REG | remove( ALL )
1492 "jr LE, $1" | | | (4,10)+%[1]
1493 ... | NC im2 src2a | remove( ALL )
1496 ... | REG src2 | remove( ALL )
1498 "jr GE, $1" | | | (4,10)+%[2]
1499 ... | NC src2a im2 | remove( ALL )
1502 beq | src2 REG | remove( ALL )
1504 "jr EQ, $1" | | | (4,10)+%[1]
1505 ... | NC im2 src2a | remove( ALL )
1508 ... | REG src2 | remove( ALL )
1510 "jr EQ, $1" | | | (4,10)+%[2]
1511 ... | NC src2a im2 | remove( ALL )
1514 bne | src2 REG | remove( ALL )
1516 "jr NE, $1" | | | (4,10)+%[1]
1517 ... | NC im2 src2a | remove( ALL )
1520 ... | REG src2 | remove( ALL )
1522 "jr NE, $1" | | | (4,10)+%[2]
1523 ... | NC src2a im2 | remove( ALL )
1526 bge | src2 REG | remove( ALL )
1528 "jr GE, $1" | | | (4,10)+%[1]
1529 ... | NC im2 src2a | remove( ALL )
1532 ... | REG src2 | remove( ALL )
1534 "jr LE, $1" | | | (4,10)+%[2]
1535 ... | NC src2a im2 | remove( ALL )
1538 bgt | src2 REG | remove( ALL )
1540 "jr GT, $1" | | | (4,10)+%[1]
1541 ... | NC im2 src2a | remove( ALL )
1544 ... | REG src2 | remove( ALL )
1546 "jr LT, $1" | | | (4,10)+%[2]
1547 ... | NC src2a im2 | remove( ALL )
1550 zlt | src2c | remove( ALL )
1554 zle | src2c | remove( ALL )
1558 zeq | src2c | remove( ALL )
1562 zne | src2c | remove( ALL )
1566 zge | src2c | remove( ALL )
1570 zgt | src2c | remove( ALL )
1574 cmp zlt | src2 REG STACK | "cp %[2], %[1]"
1576 ... | NC im2 src2a STACK | "cp %[2], %[1]"
1578 cmp zle | src2 REG STACK | "cp %[2], %[1]"
1580 ... | NC im2 src2a STACK | "cp %[2], %[1]"
1582 cmp zeq | src2 REG STACK | "cp %[2], %[1]"
1584 ... | NC im2 src2a STACK | "cp %[2], %[1]"
1586 cmp zne | src2 REG STACK | "cp %[2], %[1]"
1588 ... | NC im2 src2a STACK | "cp %[2], %[1]"
1590 cmp zgt | src2 REG STACK | "cp %[2], %[1]"
1592 ... | NC im2 src2a STACK | "cp %[2], %[1]"
1594 cmp zge | src2 REG STACK | "cp %[2], %[1]"
1596 ... | NC im2 src2a STACK | "cp %[2], %[1]"
1598 and zeq $1==2 | src2 SCR_REG STACK | "and %[2], %[1]"
1600 erase(%[2]) | | | (4,10)+%[1]
1601 ... | SCR_REG src2 STACK | "and %[1], %[2]"
1603 erase(%[1]) | | | (4,10)+%[2]
1604 and zne $1==2 | src2 SCR_REG STACK | "and %[2], %[1]"
1606 erase(%[2]) | | | (4,10)+%[1]
1607 ... | SCR_REG src2 STACK | "and %[1], %[2]"
1609 erase(%[1]) | | | (4,10)+%[2]
1611 /***************************************
1612 ******** GROUP 14 ********
1613 ***************************************/
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])" | | |
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"
1628 ret $1==2 | src2 STACK | move( %[1], R0 )
1629 "ldk R14, $$0\nld R15, R13"
1632 ret $1==4 | src4 STACK | move( %[1], RR0 )
1633 "ldk R14, $$0\nld R15, R13"
1636 ret $1==6 | src2 src2 src2 STACK | move( %[1], R0 )
1639 "ldk R14, $$0\nld R15, R13"
1642 ret $1==8 | src4 src4 STACK | move( %[1], RR0 )
1644 "ldk R14, $$0\nld R15, R13"
1647 lfr ret $1==$2 | | | | ret 0 |
1648 asp lfr ret $2==$3 | | | | ret 0 |
1649 asp ret $2==0 | | | | ret 0 |
1651 /***************************************
1652 ******** GROUP 15 ********
1653 ***************************************/
1655 asp | STACK | "add R15, $$$1" | | |
1656 ass $1==2 | src2 STACK | "add R15, %[1]" | | |
1657 blm | STACK | move( {im2, $1}, R0 )
1660 bls $1==2 | src2 STACK | move( %[1], R0 )
1663 csa $1==2 | STACK | "pop R1, *RR14"
1666 lae csa $2==2 | src2 STACK | move( %[1], R2 )
1667 move( {ADDR_EXTERNAL, $1}, R1 )
1669 csb $1==2 | STACK | "pop R1, *RR14"
1672 lae csb $2==2 | src2 STACK | move( %[1], R2 )
1673 move( {ADDR_EXTERNAL, $1}, R1 )
1675 dup $1==2 | src2 | | %[1] %[1] | |
1676 dup $1==4 | src2 src2 | | %[2] %[1] %[2] %[1] | |
1677 dup | STACK | move( {im2, $1}, R0 )
1680 dus $1==2 | src2 STACK | move( %[1], R0 )
1683 exg $1==2 | src2 src2 | | %[1] %[2] | |
1684 exg $1==2 | STACK | move( {im2, $1}, R0 )
1687 lor $1==0 | | | LB | |
1688 lor $1==1 | STACK | allocate( REG )
1691 lor $1==2 | | | {da2, "reghp"} | |
1692 rck $1==2 | src2 STACK | move( %[1], R1 )
1694 rck !defined($1)| src2 src2 STACK | "cp %[1], $$2"
1698 str $1==0 | src2 | "ld R13, %[1]" samecc | | |
1699 str $1==1 | src2 STACK | "ldk R14, $$0\nld R15, %[1]"
1701 str $1==2 | STACK | "calr strhp" | | |
1703 fil | | "ld hol0+4, $$$1" samecc | | |
1704 gto | STACK | "push *RR14, $$$1"
1706 lim | | | {da2, "trpim"} | |
1707 lin | | "ld hol0, $$$1" samecc | | |
1708 lni | | "inc hol0" | | |
1709 lpb | | | | adp SL |
1710 mon | STACK | "calr mon" | | |
1717 sig | REG | allocate(REG)
1718 move( {da2, "trppc"}, %[a] )
1721 sim | STACK | "pop trpim, *RR14"
1723 trp | STACK | "calr trp" | | |
1725 /* For several floating point instructions we generate an illegal
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 |
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 )
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} | |
1759 /*********************************
1760 ** From source2 to source2 **
1761 *********************************/
1762 | ADDR_EXTERNAL | | {da2, %[1.ind]} | |
1765 /*********************************
1766 ** From source1 to source2 **
1767 *********************************/
1768 | src1 | allocate( %[1], B2REG = %[1] ) | %[a] | |
1771 /*********************************
1772 ** From source4 to register **
1773 *********************************/
1774 | src4 | allocate( %[1], LWREG = %[1] ) | %[a] | |
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} | |
1787 /*********************************
1789 *********************************/
1790 | STACK | allocate( REG )
1792 samecc | %[a] | | (2,8)
1793 | STACK | allocate( XREG )
1795 samecc | {regconst2, %[a], 0} | | (2,8)
1796 | STACK | allocate( LWREG )
1798 samecc | %[a] | | (2,12)
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"
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])
1818 (src2c, "test %[1]", (2,7)+%[1])
1822 (src1, B2REG, move( %[1], %[a] )
1826 (src1,, ".sect data\n1:\t.data2 0\n.text"
1832 samecc, (18,37)+%[1] )
1833 (src2,, "push *RR14, %[1]"
1834 samecc, (2,9)+%[1] )
1835 (const4, LWREG, move( %[1], %[a] )
1838 (im4,, "push *RR14, %[1]"
1840 samecc, (8,24) ) /* there is no pushl ir,im */
1841 (double,, ".sect .data\n1:\t.data4 %[1]\n.text"
1844 (src4,, "pushl *RR14, %[1]"
1845 samecc, (2,12)+%[1] )
1846 (regconst2,, "add %[1.xreg], $$%[1.ind]"
1847 "push *RR14, %[1.xreg]"
1851 "add %[a], $$%[1.ind]"
1853 setcc(%[a]), (6,16) )
1854 (ADDR_LOCAL,, "add R13, $$%[1.ind]"
1856 "sub R13, $$%[1.ind]"