1 "$Id: table,v 1.33 1994/06/24 13:41:51 ceriel Exp $"
2 #define LOCLABS /* define if target assembler recognizes local labels */
3 #define REGVARS /* define for register variables */
4 #define DORCK /* define if you want RCK */
5 #define FLOAT4 /* define if you want better 4-byte FP arithmetic */
6 #define FLOAT8 /* define if you want better 8-byte FP arithmetic */
7 /* #define ASBUG_AVOID /* define if you want to avoid a bug in the BSD 4.1 VAX
8 assembler, that sometimes generates "*1" for
9 (r1). This is avoided by generating 0(r1), which is
10 optimized by the assembler to (r1).
13 #define REGDEFFORMAT "0(%[reg])"
15 #define REGDEFFORMAT "(%[reg])"
18 #define NC nocoercions :
25 /****************************************************************
26 * VAX 11 Back end table. *
27 * Author : Ceriel J.H. Jacobs, Duk Bekema *
29 * Wordsize = 4 bytes *
30 * Pointersize = 4 bytes *
32 * There is hardly any instruction timing information available *
33 * for the DEC-VAX machines. Timing of addressing modes was done*
34 * by counting the memory references and multiplying them by *
35 * 3. 300 nanosec seems to be a typical memory reference time.*
36 * However, the VAX can be much faster, if the "cache hit rate" *
38 * Assumed hardware : VAX-11/7?0 with Floating Point Acc. *
39 ****************************************************************/
42 AP = ("ap",4),ArgumentPointer.
43 LB = ("fp",4),LocaLBase.
49 R4 = ("r4",4) regvar,RREG.
50 R5 = ("r5",4) regvar,RREG.
51 R6 = ("r6",4) regvar,RREG.
52 R7 = ("r7",4) regvar,RREG.
53 R8 = ("r8",4) regvar,RREG.
54 R9 = ("r9",4) regvar,RREG.
55 RA = ("r10",4) regvar,RREG.
56 RB = ("r11",4) regvar,RREG.
67 QR0 = ("r0",8,R0,R1),QREG.
68 QR2 = ("r2",8,R2,R3),QREG.
70 QR4 = ("r4",8,R4,R5),QREG.
71 QR6 = ("r6",8,R6,R7),QREG.
72 QR8 = ("r8",8,R8,R9),QREG.
73 QRA = ("r10",8,RA,RB),QREG.
75 QR1 = ("r1",8,R1,R2),QREG.
77 QR3 = ("r3",8,R3,R4),QREG.
78 QR5 = ("r5",8,R5,R6),QREG.
79 QR7 = ("r7",8,R7,R8),QREG.
80 QR9 = ("r9",8,R9,RA),QREG.
85 /* First some EM machine tokens */
86 CONST1 = {INT num;} 4 cost=(4,3) "$%[num]"
87 CONST2 = {INT num;} 4 cost=(4,3) "$%[num]"
88 CONST4 = {INT num;} 4 cost=(4,3) "$%[num]"
89 CONST8 = {STRING ind;} 8 cost=(8,6) "$%[ind]"
90 LOCAL1 = {REGISTER reg; INT num,size;} 4 cost=(2,6) "%[num](%[reg])"
91 LOCAL2 = {REGISTER reg; INT num,size;} 4 cost=(2,6) "%[num](%[reg])"
92 LOCAL4 = {REGISTER reg; INT num,size;} 4 cost=(2,6) "%[num](%[reg])"
93 LOCAL8 = {REGISTER reg; INT num,size;} 8 cost=(2,9) "%[num](%[reg])"
94 ADDR_LOCAL = {REGISTER reg; INT num;} 4 cost=(2,6) "%[num](%[reg])"
95 ADDR_EXTERNAL = {STRING ind;} 4 cost=(4,6) "%[ind]"
96 EXTERNAL1 = {STRING ind;} 4 cost=(4,6) "%[ind]"
97 EXTERNAL2 = {STRING ind;} 4 cost=(4,6) "%[ind]"
98 EXTERNAL4 = {STRING ind;} 4 cost=(4,6) "%[ind]"
99 EXTERNAL8 = {STRING ind;} 8 cost=(4,9) "%[ind]"
100 DOUBLE = {STRING ind;} 4 cost=(4,6) "$%[ind]"
101 /* Now tokens for the target machine */
102 regdef1 = {REGISTER reg;} 4 cost=(0,3) REGDEFFORMAT
103 regdef2 = {REGISTER reg;} 4 cost=(0,3) REGDEFFORMAT
104 regdef4 = {REGISTER reg;} 4 cost=(0,3) REGDEFFORMAT
105 regdef8 = {REGISTER reg;} 8 cost=(0,6) REGDEFFORMAT
107 reginc1 = {REGISTER reg;} 4 cost=(0,3) "(%[reg])+"
108 reginc2 = {REGISTER reg;} 4 cost=(0,3) "(%[reg])+"
109 reginc4 = {REGISTER reg;} 4 cost=(0,3) "(%[reg])+"
110 reginc8 = {REGISTER reg;} 8 cost=(0,6) "(%[reg])+"
111 regdec1 = {REGISTER reg;} 4 cost=(0,3) "-(%[reg])"
112 regdec2 = {REGISTER reg;} 4 cost=(0,3) "-(%[reg])"
113 regdec4 = {REGISTER reg;} 4 cost=(0,3) "-(%[reg])"
114 regdec8 = {REGISTER reg;} 8 cost=(0,6) "-(%[reg])"
116 displ1 = {REGISTER reg; STRING ind;} 4 cost=(2,6) "%[ind](%[reg])"
117 displ2 = {REGISTER reg; STRING ind;} 4 cost=(2,6) "%[ind](%[reg])"
118 displ4 = {REGISTER reg; STRING ind;} 4 cost=(2,6) "%[ind](%[reg])"
119 displ8 = {REGISTER reg; STRING ind;} 8 cost=(2,9) "%[ind](%[reg])"
120 displdef1 = {REGISTER reg; STRING ind;} 4 cost=(2,9) "*%[ind](%[reg])"
121 displdef2 = {REGISTER reg; STRING ind;} 4 cost=(2,9) "*%[ind](%[reg])"
122 displdef4 = {REGISTER reg; STRING ind;} 4 cost=(2,9) "*%[ind](%[reg])"
123 displdef8 = {REGISTER reg; STRING ind;} 8 cost=(2,12) "*%[ind](%[reg])"
124 reldef1 = {STRING ind;} 4 cost=(4,9) "*%[ind]"
125 reldef2 = {STRING ind;} 4 cost=(4,9) "*%[ind]"
126 reldef4 = {STRING ind;} 4 cost=(4,9) "*%[ind]"
127 reldef8 = {STRING ind;} 8 cost=(4,12) "*%[ind]"
128 extind2 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]"
129 extind4 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]"
130 extind8 = {REGISTER ireg; STRING ind; } 8 cost=(5,13) "%[ind] [%[ireg]]"
131 displind1 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10)
132 "%[ind](%[reg]) [%[ireg]]"
133 displind2 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10)
134 "%[ind](%[reg]) [%[ireg]]"
135 displind4 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10)
136 "%[ind](%[reg]) [%[ireg]]"
137 displind8 = {REGISTER ireg,reg; STRING ind;} 8 cost=(3,13)
138 "%[ind](%[reg]) [%[ireg]]"
139 extdefind1 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]"
140 extdefind2 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]"
141 extdefind4 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]"
142 extdefind8 = {REGISTER ireg; STRING ind; } 8 cost=(5,16) "*%[ind] [%[ireg]]"
143 displdefind1 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13)
144 "*%[ind](%[reg]) [%[ireg]]"
145 displdefind2 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13)
146 "*%[ind](%[reg]) [%[ireg]]"
147 displdefind4 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13)
148 "*%[ind](%[reg]) [%[ireg]]"
149 displdefind8 = {REGISTER ireg,reg; STRING ind;} 8 cost=(3,16)
150 "*%[ind](%[reg]) [%[ireg]]"
152 /* Not really addressable modes */
153 adispl = {REGISTER reg; STRING ind; } 4 cost=(4,6) "%[ind](%[reg])"
154 aextind2 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]"
155 aextind4 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]"
156 aextind8 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]"
157 adisplind1 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10)
158 "%[ind](%[reg]) [%[ireg]]"
159 adisplind2 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10)
160 "%[ind](%[reg]) [%[ireg]]"
161 adisplind4 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10)
162 "%[ind](%[reg]) [%[ireg]]"
163 adisplind8 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10)
164 "%[ind](%[reg]) [%[ireg]]"
165 aextdefind1 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]"
166 aextdefind2 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]"
167 aextdefind4 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]"
168 aextdefind8 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]"
169 adispldefind1 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13)
170 "*%[ind](%[reg]) [%[ireg]]"
171 adispldefind2 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13)
172 "*%[ind](%[reg]) [%[ireg]]"
173 adispldefind4 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13)
174 "*%[ind](%[reg]) [%[ireg]]"
175 adispldefind8 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13)
176 "*%[ind](%[reg]) [%[ireg]]"
180 CONST = CONST1 + CONST2 + CONST4
181 ind2 = extind2 + displind2 + extdefind2 + displdefind2
182 ind4 = extind4 + displind4 + extdefind4 + displdefind4
183 Xsource1 = regdef1 + displ1 + displdef1 +
184 EXTERNAL1 + reldef1 + CONST1 + LOCAL1
185 + displind1 + extdefind1 + displdefind1
190 Xsource2 = regdef2 + displ2 + displdef2 +
191 EXTERNAL2 + reldef2 + CONST2 + LOCAL2 + ind2
196 Xsource4 = REG + regdef4 + displ4 + displdef4 + LocaLBase +
197 EXTERNAL4 + reldef4 + CONST + DOUBLE + LOCAL4 + ind4
200 + RREG + reginc4 + regdec4
202 dups4 = CONST + regdef1 + displ1 + LOCAL1 +
203 REG + regdef2 + displ2 + LOCAL2 +
204 RREG + regdef4 + displ4 + LOCAL4 + DOUBLE
205 Xsource8 = QREG + regdef8 + displ8 + displdef8 +
206 EXTERNAL8 + reldef8 + CONST8 + LOCAL8
207 + extind8 + displind8 + extdefind8 + displdefind8
212 source1or2 = source1 + source2 - ind2
213 source1or2or4 = source1or2 + source4 - (ind2 + ind4)
214 source2or4 = source2 + source4 - ind4
215 nonexist1 = adispl + ADDR_EXTERNAL + ADDR_LOCAL
216 aextind = aextind2 + aextind4 + aextind8
217 adisplind = adisplind1 + adisplind2 + adisplind4 + adisplind8
218 aextdefind = aextdefind1 + aextdefind2 + aextdefind4 + aextdefind8
219 adispldefind = adispldefind1 + adispldefind2 + adispldefind4 + adispldefind8
220 aind1 = adisplind1 + aextdefind1 + adispldefind1
221 aind2 = aextind2 + adisplind2 + aextdefind2 + adispldefind2
222 aind4 = aextind4 + adisplind4 + aextdefind4 + adispldefind4
223 aind8 = aextind8 + adisplind8 + aextdefind8 + adispldefind8
224 aind = aind1 + aind2 + aind4 + aind8
225 nonexist = nonexist1 + aind
227 regch4 = reginc1 + regdec1 + reginc2 + regdec2 + reginc4 + regdec4
228 regch8 = reginc8 + regdec8
229 regch = regch4 + regch8
231 displs = displ1 + displ2 + displ4 + displ8 +
232 regdef1 + regdef2 + regdef4 + regdef8
236 displdefs = displdef1 + displdef2 + displdef4 + displdef8
237 EXTERNALS = EXTERNAL1 + EXTERNAL2 + EXTERNAL4 + EXTERNAL8
238 LOCALS = LOCAL1 + LOCAL2 + LOCAL4 + LOCAL8
239 reldefs = reldef1 + reldef2 + reldef4 + reldef8
240 displinds = displind1 + displind2 + displind4 + displind8
241 extinds = extind2 + extind4 + extind8
242 displdefinds = displdefind1 + displdefind2 + displdefind4 + displdefind8
243 extdefinds = extdefind1 + extdefind2 + extdefind4 + extdefind8
244 displaced = displs + displdefs + reldefs
245 + displinds + displdefinds + extdefinds
246 externals = EXTERNALS + displaced + extinds
247 extandloc = externals + LOCALS
249 reg4 = REG + RREG + LocaLBase
255 sreg4 = REG * SCRATCH
256 sreg8 = QREG * SCRATCH
257 bigsource4 = source1or2or4 + nonexist + ind2 + ind4
259 all = bigsource4 + bigsource8
260 scr = ALL - (EXTERNALS + LOCALS + ADDR_LOCAL + ADDR_EXTERNAL + CONST
263 #define REMEXTANDLOC remove(externals) remove(LOCALS,inreg(%[num])==0)
264 #define REMREG(x) remove(regch,%[reg]==regvar(x))
266 #define REMEXTANDLOC remove(extandloc)
271 /********************************
272 * Group 1 : Load instructions *
273 ********************************/
275 loc $1>=0 && $1<256 | | | {CONST1,$1} | |
276 loc $1>=256 && $1<65536 | | | {CONST2,$1} | |
277 loc | | | {CONST4,$1} | |
278 ldc | | | {CONST8,$1} | |
280 lol inreg($1)==2 | | REMREG($1) | regvar($1) | |
282 lol $1 < 0 | | | {LOCAL4,LB,$1,4} | |
283 lol $1 >= 0 | | | {LOCAL4,AP,$1,4} | |
284 loe | | | {EXTERNAL4,$1} | |
286 lil inreg($1)==2 | | REMREG($1) | {regdef4,regvar($1)} | |
288 lil $1 < 0 | | | {displdef4,LB,tostring($1)} | |
289 lil $1 >= 0 | | | {displdef4,AP,tostring($1)} | |
290 lof | | | | adp $1 loi 4 |
291 lal $1 < 0 | | | {ADDR_LOCAL,LB,$1} | |
292 lal $1 >= 0 | | | {ADDR_LOCAL,AP,$1} | |
293 lae | | | {ADDR_EXTERNAL,$1} | |
294 lxl $1==0 | | | LB | |
295 lxl $1==1 | | | {LOCAL4,AP,BSIZE,4} | |
296 lxl $1 > 1 | | remove(scr)
300 lxa $1==0 | | | {ADDR_LOCAL,AP,BSIZE} | |
301 lxa $1==1 | | | {LOCAL4,AP,BSIZE,4} | lpb |
302 lxa $1 > 1 | | remove(scr)
306 loi $1==1 | NC adispl | | {displ1,%[1.reg],%[1.ind]} | |
307 ... | NC ADDR_LOCAL | | {LOCAL1,%[1.reg],%[1.num],1} | |
308 ... | NC LOCAL4 | | {displdef1,%[1.reg],tostring(%[1.num])} | |
309 ... | NC regdef4 | | {displdef1,%[1.reg],"0"} | |
310 ... | NC displ4 | | {displdef1,%[1.reg],%[1.ind]} | |
311 ... | NC ADDR_EXTERNAL | | {EXTERNAL1,%[1.ind]} | |
312 ... | NC EXTERNAL4 | | {reldef1,%[1.ind]} | |
313 ... | NC adisplind1 |
314 | {displind1,%[1.ireg],%[1.reg],%[1.ind]} | |
315 ... | NC aextdefind1 |
316 | {extdefind1,%[1.ireg],%[1.ind]} | |
317 ... | NC adispldefind1 |
318 | {displdefind1,%[1.ireg],%[1.reg],%[1.ind]} | |
319 ... | reg4 | | {regdef1,%[1]} | |
320 loi $1==2 | NC adispl | | {displ2,%[1.reg],%[1.ind]} | |
321 ... | NC ADDR_LOCAL | | {LOCAL2,%[1.reg],%[1.num],2} | |
322 ... | NC LOCAL4 | | {displdef2,%[1.reg],tostring(%[1.num])} | |
323 ... | NC regdef4 | | {displdef2,%[1.reg],"0"} | |
324 ... | NC displ4 | | {displdef2,%[1.reg],%[1.ind]} | |
325 ... | NC ADDR_EXTERNAL | | {EXTERNAL2,%[1.ind]} | |
326 ... | NC EXTERNAL4 | | {reldef2,%[1.ind]} | |
327 ... | NC aextind2 | | {extind2,%[1.ireg],%[1.ind]} | |
328 ... | NC adisplind2 |
329 | {displind2,%[1.ireg],%[1.reg],%[1.ind]} | |
330 ... | NC aextdefind2 |
331 | {extdefind2,%[1.ireg],%[1.ind]} | |
332 ... | NC adispldefind2 |
333 | {displdefind2,%[1.ireg],%[1.reg],%[1.ind]} | |
334 ... | reg4 | | {regdef2,%[1]} | |
335 loi $1==4 | NC adispl | | {displ4,%[1.reg],%[1.ind]} | |
336 ... | NC ADDR_LOCAL | | {LOCAL4,%[1.reg],%[1.num],4} | |
337 ... | NC LOCAL4 | | {displdef4,%[1.reg],tostring(%[1.num])} | |
338 ... | NC regdef4 | | {displdef4,%[1.reg],"0"} | |
339 ... | NC displ4 | | {displdef4,%[1.reg],%[1.ind]} | |
340 ... | NC ADDR_EXTERNAL | | {EXTERNAL4,%[1.ind]} | |
341 ... | NC EXTERNAL4 | | {reldef4,%[1.ind]} | |
342 ... | NC aextind4 | | {extind4,%[1.ireg],%[1.ind]} | |
343 ... | NC adisplind4 |
344 | {displind4,%[1.ireg],%[1.reg],%[1.ind]} | |
345 ... | NC aextdefind4 |
346 | {extdefind4,%[1.ireg],%[1.ind]} | |
347 ... | NC adispldefind4 |
348 | {displdefind4,%[1.ireg],%[1.reg],%[1.ind]} | |
349 ... | reg4 | | {regdef4,%[1]} | |
350 loi $1==8 | NC adispl | | {displ8,%[1.reg],%[1.ind]} | |
351 ... | NC ADDR_LOCAL | | {LOCAL8,%[1.reg],%[1.num],8} | |
352 ... | NC LOCAL4 | | {displdef8,%[1.reg],tostring(%[1.num])} | |
353 ... | NC regdef4 | | {displdef8,%[1.reg],"0"} | |
354 ... | NC displ4 | | {displdef8,%[1.reg],%[1.ind]} | |
355 ... | NC ADDR_EXTERNAL | | {EXTERNAL8,%[1.ind]} | |
356 ... | NC EXTERNAL4 | | {reldef8,%[1.ind]} | |
357 ... | NC aextind8 | | {extind8,%[1.ireg],%[1.ind]} | |
358 ... | NC adisplind8 |
359 | {displind8,%[1.ireg],%[1.reg],%[1.ind]} | |
360 ... | NC aextdefind8 |
361 | {extdefind8,%[1.ireg],%[1.ind]} | |
362 ... | NC adispldefind8 |
363 | {displdefind8,%[1.ireg],%[1.reg],%[1.ind]} | |
364 ... | reg4 | | {regdef8,%[1]} | |
367 | {EXTERNAL8,%[1.ind]+"+"+tostring($1-8)}
369 ... | NC ADDR_LOCAL |
370 | {LOCAL8,%[1.reg],%[1.num]+$1-8,8} %[1]
372 ... | reg4 | | {displ8,%[1],tostring($1-8)} %[1] | loi $1-8 |
375 allocate(REG={CONST4,$1/4})
378 "1:\nmovl\t-(%[1]),-(sp)"
381 "movl\t-(%[1]),-(sp)"
389 los !defined($1) | source1or2or4 |
394 ldl $1<0 | | | {LOCAL8,LB,$1,8} | |
395 ldl $1>=0 | | | {LOCAL8,AP,$1,8} | |
396 lde | | | {EXTERNAL8,$1} | |
397 ldf | | | | adp $1 loi 8 |
398 lpi | | | {ADDR_EXTERNAL,$1} | |
400 /********************************
401 * Group 2 : Store instructions *
402 ********************************/
405 stl inreg($1)==2 | NC bigsource4 |
407 move(%[1],regvar($1)) | | |
409 "movl\t(sp)+,%(regvar($1)%)" | | | (3,7)
411 stl $1 < 0 | NC bigsource4 |
413 remove(LOCALS,%[num] <= $1+3 && %[num]+%[size] > $1)
414 move(%[1],{LOCAL4,LB,$1,4}) | | |
416 "movl\t(sp)+,$1(fp)" | | | (5,14)
417 stl $1 >= 0 | NC bigsource4 |
419 remove(LOCALS,%[num] <= $1+3 && %[num]+%[size] > $1)
420 move(%[1],{LOCAL4,AP,$1,4}) | | |
422 "movl\t(sp)+,$1(ap)" | | | (5,14)
423 ste | NC bigsource4 |
425 move(%[1],{EXTERNAL4,$1}) | | |
427 "movl\t(sp)+,$1" | | | (7,14)
429 sil inreg($1)==2 | NC bigsource4 |
431 move(%[1],{regdef4,regvar($1)}) | | |
433 "movl\t(sp)+,(%(regvar($1)%))" | | | (3,10)
435 sil $1 < 0 | NC bigsource4 |
437 move(%[1],{displdef4,LB,tostring($1)}) | | |
439 "movl\t(sp)+,*$1(fp)" | | | (5,17)
440 sil $1 >= 0 | NC bigsource4 |
442 move(%[1],{displdef4,AP,tostring($1)}) | | |
444 "movl\t(sp)+,*$1(ap)" | | | (5,17)
445 stf | | | | adp $1 sti 4 |
446 /*** C-problem: f(c) char c; {
449 You don't know where the character is put in the word,
450 so the CEM-compiler generates: (shorts analogously)
452 lol lal sti $1==$2 && $3<4 | | | | |
453 /************************************************/
454 sti $1==1 | NC adispl source1or2or4 |
456 move(%[2],{displ1,%[1.reg],%[1.ind]}) | | |
457 ... | NC ADDR_LOCAL source1or2or4 |
460 %[num]<=%[1.num] && %[num]+%[size]>%[1.num])
461 move(%[2],{LOCAL1,%[1.reg],%[1.num],1}) | | |
462 ... | NC displ4 source1or2or4 |
464 move(%[2],{displdef1,%[1.reg],%[1.ind]}) | | |
465 ... | NC ADDR_EXTERNAL source1or2or4 |
467 move(%[2],{EXTERNAL1,%[1.ind]}) | | |
468 ... | NC EXTERNAL4 source1or2or4 |
470 move(%[2],{reldef1,%[1.ind]}) | | |
471 ... | NC adisplind1 source1or2or4 |
473 move(%[2],{displind1,%[1.ireg],%[1.reg],%[1.ind]})
475 ... | NC aextdefind1 source1or2or4 |
477 move(%[2],{extdefind1,%[1.ireg],%[1.ind]}) | | |
478 ... | NC adispldefind1 source1or2or4 |
480 move(%[2],{displdefind1,%[1.ireg],%[1.reg],%[1.ind]})
482 ... | reg4 source1or2or4 |
484 move(%[2],{regdef1,%[1]}) | | |
485 ... | NC nonexist1+aind1 STACK |
486 "cvtlb\t(sp)+,%[1]" | | | (3,7)+%[1]
487 sti $1==2 | NC adispl source1or2or4 |
489 move(%[2],{displ2,%[1.reg],%[1.ind]}) | | |
490 ... | NC ADDR_LOCAL source1or2or4 |
493 %[num]<=%[1.num] && %[num]+%[size]>%[1.num])
494 move(%[2],{LOCAL2,%[1.reg],%[1.num],2}) | | |
495 ... | NC displ4 source1or2or4 |
497 move(%[2],{displdef2,%[1.reg],%[1.ind]}) | | |
498 ... | NC ADDR_EXTERNAL source1or2or4 |
500 move(%[2],{EXTERNAL2,%[1.ind]}) | | |
501 ... | NC EXTERNAL4 source1or2or4 |
503 move(%[2],{reldef2,%[1.ind]}) | | |
504 ... | NC aextind2 source1or2or4 |
506 move(%[2],{extind2,%[1.ireg],%[1.ind]}) | | |
507 ... | NC adisplind2 source1or2or4 |
509 move(%[2],{displind2,%[1.ireg],%[1.reg],%[1.ind]}) | | |
510 ... | NC aextdefind2 source1or2or4 |
512 move(%[2],{extdefind2,%[1.ireg],%[1.ind]}) | | |
513 ... | NC adispldefind2 source1or2or4 |
515 move(%[2],{displdefind2,%[1.ireg],%[1.reg],%[1.ind]})
517 ... | reg4 source1or2or4 |
519 move(%[2],{regdef2,%[1]}) | | |
520 sti $1==4 | NC adispl bigsource4 |
522 move(%[2],{displ4,%[1.reg],%[1.ind]}) | | |
523 ... | NC ADDR_LOCAL | | | stl %[1.num] |
524 ... | NC ADDR_EXTERNAL | | | ste %[1.ind] |
525 ... | NC LOCAL4 bigsource4 |
527 move(%[2],{displdef4,%[1.reg],tostring(%[1.num])}) | | |
528 ... | NC regdef4 bigsource4 |
530 move(%[2],{displdef4,%[1.reg],"0"}) | | |
531 ... | NC displ4 bigsource4 |
533 move(%[2],{displdef4,%[1.reg],%[1.ind]}) | | |
534 ... | NC EXTERNAL4 bigsource4 |
536 move(%[2],{reldef4,%[1.ind]}) | | |
537 ... | NC aextind4 bigsource4 |
539 move(%[2],{extind4,%[1.ireg],%[1.ind]}) | | |
540 ... | NC adisplind4 bigsource4 |
542 move(%[2],{displind4,%[1.ireg],%[1.reg],%[1.ind]}) | | |
543 ... | NC aextdefind4 bigsource4 |
545 move(%[2],{extdefind4,%[1.ireg],%[1.ind]}) | | |
546 ... | NC adispldefind4 bigsource4 |
548 move(%[2],{displdefind4,%[1.ireg],%[1.reg],%[1.ind]})
550 ... | NC nonexist1+aind4 STACK |
551 "movl\t(sp)+,%[1]" | | | (3,7)+%[1]
552 ... | reg4 bigsource4 |
554 move(%[2],{regdef4,%[1]}) | | |
556 "movl\t(sp)+,(%[1])" | | | (3,10)
557 sti $1==8 | NC adispl bigsource8 |
559 move(%[2],{displ8,%[1.reg],%[1.ind]}) | | |
560 ... | NC ADDR_LOCAL | | | sdl %[1.num] |
561 ... | NC ADDR_EXTERNAL | | | sde %[1.ind] |
562 ... | NC displ4 bigsource8 |
564 move(%[2],{displdef8,%[1.reg],%[1.ind]}) | | |
565 ... | NC LOCAL4 bigsource8 |
567 move(%[2],{displdef8,%[1.reg],tostring(%[1.num])}) | | |
568 ... | NC regdef4 bigsource8 |
570 move(%[2],{displdef8,%[1.reg],"0"}) | | |
571 ... | NC EXTERNAL4 bigsource8 |
573 move(%[2],{reldef8,%[1.ind]}) | | |
574 ... | NC aextind8 bigsource8 |
576 move(%[2],{extind8,%[1.ireg],%[1.ind]}) | | |
577 ... | NC adisplind8 bigsource8 |
579 move(%[2],{displind8,%[1.ireg],%[1.reg],%[1.ind]}) | | |
580 ... | NC aextdefind8 bigsource8 |
582 move(%[2],{extdefind8,%[1.ireg],%[1.ind]}) | | |
583 ... | NC adispldefind8 bigsource8 |
585 move(%[2],{displdefind8,%[1.ireg],%[1.reg],%[1.ind]})
587 ... | reg4 bigsource8 |
589 move(%[2],{regdef8,%[1]}) | | |
592 allocate(REG={CONST4,$1/4})
594 "1:\nmovl\t(sp)+,(%[1])+"
597 "movl\t(sp)+,(%[1])+"
605 sts !defined($1) | source4 |
610 sdl $1 < 0 | NC bigsource8 |
612 remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1)
613 move(%[1],{LOCAL8,LB,$1,8}) | | |
614 ... | NC bigsource4 bigsource4 |
616 remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1)
617 move(%[1],{LOCAL4,LB,$1,4})
618 move(%[2],{LOCAL4,LB,$1+4,4}) | | |
620 "movq\t(sp)+,$1(fp)" | | | (5,14)
621 sdl $1 >= 0 | NC bigsource8 |
623 remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1)
624 move(%[1],{LOCAL8,AP,$1,8}) | | |
625 ... | NC bigsource4 bigsource4 |
627 remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1)
628 move(%[1],{LOCAL4,AP,$1,4})
629 move(%[2],{LOCAL4,AP,$1+4,4}) | | |
631 "movq\t(sp)+,$1(ap)" | | | (5,14)
632 sde | NC bigsource8 |
634 move(%[1],{EXTERNAL8,$1}) | | |
635 ... | bigsource4 bigsource4 |
637 move(%[1],{EXTERNAL4,$1})
638 move(%[2],{EXTERNAL4,$1+"+4"}) | | |
640 "movq\t(sp)+,$1" | | | (7,14)
641 sdf | | | | adp $1 sti 8 |
643 /********************************
644 * Group 3 : Integer Arithmetic *
645 ********************************/
647 adi $1==4 | source4 sreg4 |
650 setcc(%[2]) | %[2] | | (3,4) + %[1]
651 ... | sreg4 source4 |
654 setcc(%[1]) | %[1] | | (3,4) + %[2]
655 ... | source4 source4 |
656 allocate(%[1],%[2],REG)
657 "addl3\t%[1],%[2],%[a]"
658 setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2]
660 adi stl $1==4 && inreg($2)==2
663 "addl3\t%[1],%[2],%(regvar($2)%)"
665 setcc(regvar($2)) | | |
667 adi stl $1==4 && $2<0
670 remove(LOCALS,%[num]<=$2+3 && %[num]+%[size]>$2)
671 "addl3\t%[1],%[2],$2(fp)"
672 setcc({LOCAL4,LB,$2,4}) | | |
673 adi stl $1==4 && $2>=0
676 remove(LOCALS,%[num]<=$2+3 && %[num]+%[size]>$2)
677 "addl3\t%[1],%[2],$2(ap)"
678 setcc({LOCAL4,AP,$2,4}) | | |
680 adi sil $1==4 && inreg($2)==2
683 "addl3\t%[1],%[2],(%(regvar($2)%))"
684 setcc({regdef4,regvar($2)}) | | |
685 adi lol stf $1==4 && inreg($2)==2
688 "addl3\t%[1],%[2],$3(%(regvar($2)%))"
689 setcc({displ4,regvar($2),tostring($3)}) | | |
691 adi sil $1==4 && $2<0
694 "addl3\t%[1],%[2],*$2(fp)"
695 setcc({displdef4,LB,tostring($2)}) | | |
696 adi sil $1==4 && $2>=0
699 "addl3\t%[1],%[2],*$2(ap)"
700 setcc({displdef4,AP,tostring($2)}) | | |
701 adi ste $1==4 | source4 source4 |
703 "addl3\t%[1],%[2],$2"
704 setcc({EXTERNAL4,$2}) | | |
705 adi !defined($1) | source4 |
709 sbi $1==4 | source4 sreg4 |
712 setcc(%[2]) | %[2] | | (3,4) + %[1]
713 ... | source4 source4 |
714 allocate(%[1],%[2],REG)
715 "subl3\t%[1],%[2],%[a]"
716 setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2]
718 sbi stl $1==4 && inreg($2)==2
721 "subl3\t%[1],%[2],%(regvar($2)%)"
723 setcc(regvar($2)) | | |
725 sbi stl $1==4 && $2<0
728 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
729 "subl3\t%[1],%[2],$2(fp)"
730 setcc({LOCAL4,LB,$2,4}) | | |
731 sbi stl $1==4 && $2>=0
734 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
735 "subl3\t%[1],%[2],$2(ap)"
736 setcc({LOCAL4,AP,$2,4}) | | |
738 sbi sil $1==4 && inreg($2)==2
741 "subl3\t%[1],%[2],(%(regvar($2)%))"
742 setcc({regdef4,regvar($2)}) | | |
743 sbi lol stf $1==4 && inreg($2)==2
746 "subl3\t%[1],%[2],$3(%(regvar($2)%))"
747 setcc({displ4,regvar($2),tostring($3)}) | | |
749 sbi sil $1==4 && $2<0
752 "subl3\t%[1],%[2],*$2(fp)"
753 setcc({displdef4,LB,tostring($2)}) | | |
754 sbi sil $1==4 && $2>=0
757 "subl3\t%[1],%[2],*$2(ap)"
758 setcc({displdef4,AP,tostring($2)}) | | |
759 sbi ste $1==4 | source4 source4 |
761 "subl3\t%[1],%[2],$2"
762 setcc({EXTERNAL4,$2}) | | |
763 sbi !defined($1) | source4 |
767 mli $1==4 | source4 sreg4 |
770 setcc(%[2]) | %[2] | | (3,16) + %[1]
771 ... | sreg4 source4 |
774 setcc(%[1]) | %[1] | | (3,16) + %[2]
775 ... | source4 source4 |
776 allocate(%[1],%[2],REG)
777 "mull3\t%[1],%[2],%[a]"
778 setcc(%[a]) | %[a] | | (4,16)+%[1]+%[2]
780 mli stl $1==4 && inreg($2)==2
783 "mull3\t%[1],%[2],%(regvar($2)%)"
785 setcc(regvar($2)) | | |
787 mli stl $1==4 && $2<0
790 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
791 "mull3\t%[1],%[2],$2(fp)"
792 setcc({LOCAL4,LB,$2,4}) | | |
793 mli stl $1==4 && $2>=0
796 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
797 "mull3\t%[1],%[2],$2(ap)"
798 setcc({LOCAL4,AP,$2,4}) | | |
800 mli sil $1==4 && inreg($2)==2
803 "mull3\t%[1],%[2],(%(regvar($2)%))"
804 setcc({regdef4,regvar($2)}) | | |
805 mli lol stf $1==4 && inreg($2)==2
808 "mull3\t%[1],%[2],$3(%(regvar($2)%))"
809 setcc({displ4,regvar($2),tostring($3)}) | | |
811 mli sil $1==4 && $2<0
814 "mull3\t%[1],%[2],*$2(fp)"
815 setcc({displdef4,LB,tostring($2)}) | | |
816 mli sil $1==4 && $2>=0
819 "mull3\t%[1],%[2],*$2(ap)"
820 setcc({displdef4,AP,tostring($2)}) | | |
821 mli ste $1==4 | source4 source4 |
823 "mull3\t%[1],%[2],$2"
824 setcc({EXTERNAL4,$2}) | | |
825 mli !defined($1) | source4 |
829 dvi $1==4 | source4 sreg4 |
832 setcc(%[2]) | %[2] | | (3,98) + %[1]
833 ... | source4 source4 |
834 allocate(%[1],%[2],REG)
835 "divl3\t%[1],%[2],%[a]"
836 setcc(%[a]) | %[a] | | (4,98)+%[1]+%[2]
838 dvi stl $1==4 && inreg($2)==2
841 "divl3\t%[1],%[2],%(regvar($2)%)"
843 setcc(regvar($2)) | | |
845 dvi stl $1==4 && $2<0
848 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
849 "divl3\t%[1],%[2],$2(fp)"
850 setcc({LOCAL4,LB,$2,4}) | | |
851 dvi stl $1==4 && $2>=0
854 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
855 "divl3\t%[1],%[2],$2(ap)"
856 setcc({LOCAL4,AP,$2,4}) | | |
858 dvi sil $1==4 && inreg($2)==2
861 "divl3\t%[1],%[2],(%(regvar($2)%))"
862 setcc({regdef4,regvar($2)}) | | |
863 dvi lol stf $1==4 && inreg($2)==2
866 "divl3\t%[1],%[2],$3(%(regvar($2)%))"
867 setcc({displ4,regvar($2),tostring($3)}) | | |
869 dvi sil $1==4 && $2<0
872 "divl3\t%[1],%[2],*$2(fp)"
873 setcc({displdef4,LB,tostring($2)}) | | |
874 dvi sil $1==4 && $2>=0
877 "divl3\t%[1],%[2],*$2(ap)"
878 setcc({displdef4,AP,tostring($2)}) | | |
879 dvi ste $1==4 | source4 source4 |
881 "divl3\t%[1],%[2],$2"
882 setcc({EXTERNAL4,$2}) | | |
883 dvi !defined($1) | source4 |
887 rmi $1==4 | Xsource4 Xsource4 |
889 "divl3\t%[1],%[2],%[a]"
891 "subl3\t%[a],%[2],%[a]"
892 setcc(%[a]) | %[a] | |
894 rmi stl $1==4 && inreg($2)==2
895 | Xsource4 Xsource4 |
898 "divl3\t%[1],%[2],%[a]"
900 "subl3\t%[a],%[2],%(regvar($2)%)"
902 setcc(regvar($2)) | | |
904 rmi stl $1==4 && $2<0
905 | Xsource4 Xsource4 |
907 remove(LOCALS,(%[num]<=$2+3 && %[num]+%[size]>$2))
909 "divl3\t%[1],%[2],%[a]"
911 "subl3\t%[a],%[2],$2(fp)"
912 setcc({LOCAL4,LB,$2,4}) | | |
913 rmi stl $1==4 && $2>=0
914 | Xsource4 Xsource4 |
916 remove(LOCALS,(%[num]<=$2+3 && %[num]+%[size]>$2))
918 "divl3\t%[1],%[2],%[a]"
920 "subl3\t%[a],%[2],$2(ap)"
921 setcc({LOCAL4,AP,$2,4}) | | |
923 rmi sil $1==4 && inreg($2)==2
924 | Xsource4 Xsource4 |
927 "divl3\t%[1],%[2],%[a]"
929 "subl3\t%[a],%[2],(%(regvar($2)%))"
930 setcc({regdef4,regvar($2)}) | | |
931 rmi lol stf $1==4 && inreg($2)==2
932 | Xsource4 Xsource4 |
935 "divl3\t%[1],%[2],%[a]"
937 "subl3\t%[a],%[2],$3(%(regvar($2)%))"
938 setcc({displ4,regvar($2),tostring($3)}) | | |
940 rmi sil $1==4 && $2<0
941 | Xsource4 Xsource4 |
944 "divl3\t%[1],%[2],%[a]"
946 "subl3\t%[a],%[2],*$2(fp)"
947 setcc({displdef4,LB,tostring($2)}) | | |
948 rmi sil $1==4 && $2>=0
949 | Xsource4 Xsource4 |
952 "divl3\t%[1],%[2],%[a]"
954 "subl3\t%[a],%[2],*$2(ap)"
955 setcc({displdef4,AP,tostring($2)}) | | |
956 rmi ste $1==4 | Xsource4 Xsource4 |
959 "divl3\t%[1],%[2],%[a]"
961 "subl3\t%[a],%[2],$2"
962 setcc({EXTERNAL4,$2}) | | |
963 rmi !defined($1) | source4 |
968 ngi $1==4 | source4 |
971 setcc(%[a]) | %[a] | |
973 ngi stl $1==4 && inreg($2)==2
976 "mnegl\t%[1],%(regvar($2)%)"
978 setcc(regvar($2)) | | |
980 ngi stl $1==4 && $2<0
983 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
985 setcc({LOCAL4,LB,$2,4}) | | |
986 ngi stl $1==4 && $2>=0
989 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
991 setcc({LOCAL4,AP,$2,4}) | | |
993 ngi sil $1==4 && inreg($2)==2
996 "mnegl\t%[1],(%(regvar($2)%))"
997 setcc({regdef4,regvar($2)}) | | |
998 ngi lol stf $1==4 && inreg($2)==2
1001 "mnegl\t%[1],$3(%(regvar($2)%))"
1002 setcc({displ4,regvar($2),tostring($3)}) | | |
1003 #endif /* REGVARS */
1004 ngi sil $1==4 && $2<0
1007 "mnegl\t%[1],*$2(fp)"
1008 setcc({displdef4,LB,tostring($2)}) | | |
1009 ngi sil $1==4 && $2>=0
1012 "mnegl\t%[1],*$2(ap)"
1013 setcc({displdef4,AP,tostring($2)}) | | |
1014 ngi ste $1==4 | source4 |
1017 setcc({EXTERNAL4,$2}) | | |
1018 ngi !defined($1) | source4 |
1022 sli $1==4 | source1or2or4 source4 |
1023 allocate(%[1],%[2],REG)
1024 "ashl\t%[1],%[2],%[a]"
1025 setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2]
1027 sli stl $1==4 && inreg($2)==2
1028 | source1or2or4 source4 |
1030 "ashl\t%[1],%[2],%(regvar($2)%)"
1032 setcc(regvar($2)) | | |
1033 #endif /* REGVARS */
1034 sli stl $1==4 && $2<0
1035 | source1or2or4 source4 |
1037 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
1038 "ashl\t%[1],%[2],$2(fp)"
1039 setcc({LOCAL4,LB,$2,4}) | | |
1040 sli stl $1==4 && $2>=0
1041 | source1or2or4 source4 |
1043 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
1044 "ashl\t%[1],%[2],$2(ap)"
1045 setcc({LOCAL4,AP,$2,4}) | | |
1047 sli sil $1==4 && inreg($2)==2
1048 | source1or2or4 source4 |
1050 "ashl\t%[1],%[2],(%(regvar($2)%))"
1051 setcc({regdef4,regvar($2)}) | | |
1052 sli lol stf $1==4 && inreg($2)==2
1053 | source1or2or4 source4 |
1055 "ashl\t%[1],%[2],$3(%(regvar($2)%))"
1056 setcc({displ4,regvar($2),tostring($3)}) | | |
1057 #endif /* REGVARS */
1058 sli sil $1==4 && $2<0
1059 | source1or2or4 source4 |
1061 "ashl\t%[1],%[2],*$2(fp)"
1062 setcc({displdef4,LB,tostring($2)}) | | |
1063 sli sil $1==4 && $2>=0
1064 | source1or2or4 source4 |
1066 "ashl\t%[1],%[2],*$2(ap)"
1067 setcc({displdef4,AP,tostring($2)}) | | |
1068 sli ste $1==4 | source1or2or4 source4 |
1070 "ashl\t%[1],%[2],$2"
1071 setcc({EXTERNAL4,$2}) | | | (8,10)+%[1]+%[2]
1072 sli !defined($1) | source1or2or4 |
1077 sri $1==4 | source4 source4 |
1080 "ashl\t%[a],%[2],%[a]"
1081 setcc(%[a]) | %[a] | | (7,8)+%[1]+%[2]
1082 ... | NC CONST source4 |
1084 "ashl\t$$%(0-%[1.num]%),%[2],%[a]"
1085 setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2]
1087 sri stl $1==4 && inreg($2)==2
1092 "ashl\t%[a],%[2],%(regvar($2)%)"
1094 setcc(regvar($2)) | | | (9,14)+%[1]+%[2]
1095 ... | NC CONST source4 |
1097 "ashl\t$$%(0-%[1.num]%),%[2],%(regvar($2)%)"
1099 setcc(regvar($2)) | | | (6,10)+%[1]+%[2]
1100 #endif /* REGVARS */
1101 sri stl $1==4 && $2<0
1104 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
1107 "ashl\t%[a],%[2],$2(fp)"
1108 setcc({LOCAL4,LB,$2,4}) | | | (9,11)+%[1]+%[2]
1109 ... | NC CONST source4 |
1111 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
1112 "ashl\t$$%(0-%[1.num]%),%[2],$2(fp)"
1113 setcc({LOCAL4,LB,$2,4}) | | | (6,7)+%[1]+%[2]
1114 sri stl $1==4 && $2>=0
1117 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
1120 "ashl\t%[a],%[2],$2(ap)"
1121 setcc({LOCAL4,AP,$2,4}) | | | (9,11)+%[1]+%[2]
1122 ... | NC CONST source4 |
1124 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
1125 "ashl\t$$%(0-%[1.num]%),%[2],$2(ap)"
1126 setcc({LOCAL4,AP,$2,4}) | | | (6,7)+%[1]+%[2]
1128 sri sil $1==4 && inreg($2)==2
1133 "ashl\t%[a],%[2],(%(regvar($2)%))"
1134 setcc({regdef4,regvar($2)}) | | | (9,14)+%[1]+%[2]
1135 ... | NC CONST source4 |
1137 "ashl\t$$%(0-%[1.num]%),%[2],(%(regvar($2)%))"
1138 setcc({regdef4,regvar($2)}) | | | (6,10)+%[1]+%[2]
1139 sri lol stf $1==4 && inreg($2)==2
1144 "ashl\t%[a],%[2],$3(%(regvar($2)%))"
1145 setcc({displ4,regvar($2),tostring($3)}) | | | (9,14)+%[1]+%[2]
1146 ... | NC CONST source4 |
1148 "ashl\t$$%(0-%[1.num]%),%[2],$3(%(regvar($2)%))"
1149 setcc({displ4,regvar($2),tostring($3)}) | | | (6,10)+%[1]+%[2]
1150 #endif /* REGVARS */
1151 sri sil $1==4 && $2<0
1156 "ashl\t%[a],%[2],*$2(fp)"
1157 setcc({displdef4,LB,tostring($2)})
1158 | | | (9,17)+%[1]+%[2]
1159 ... | NC CONST source4 |
1161 "ashl\t$$%(0-%[1.num]%),%[2],*$2(fp)"
1162 setcc({displdef4,LB,tostring($2)})
1163 | | | (6,13)+%[1]+%[2]
1164 sri sil $1==4 && $2>=0
1169 "ashl\t%[a],%[2],*$2(ap)"
1170 setcc({displdef4,AP,tostring($2)})
1171 | | | (9,17)+%[1]+%[2]
1172 ... | NC CONST source4 |
1174 "ashl\t$$%(0-%[1.num]%),%[2],*$2(ap)"
1175 setcc({displdef4,AP,tostring($2)})
1176 | | | (6,13)+%[1]+%[2]
1177 sri ste $1==4 | source4 source4 |
1181 "ashl\t%[a],%[2],$2"
1182 setcc({EXTERNAL4,$2}) | | | (11,14)+%[1]+%[2]
1183 ... | NC CONST source4 |
1185 "ashl\t$$%(0-%[1.num]%),%[2],$2"
1186 setcc({EXTERNAL4,$2}) | | | (8,10)+%[1]+%[2]
1187 sri !defined($1) | source4 |
1193 /************************************************
1194 * Group 4 : Unsigned arithmetic *
1195 ************************************************/
1197 adu | | | | adi $1 |
1198 sbu | | | | sbi $1 |
1199 mlu | | | | mli $1 |
1201 "jsb\t.dvu4" | R0 | |
1202 dvu !defined($1) | source1or2or4 |
1208 "jsb\t.rmu4" | R0 | |
1209 rmu !defined($1) | source1or2or4 |
1214 slu | | | | sli $1 |
1215 loc slu | | | | loc $1 sli $2 |
1216 sru $1==4 | source4 source4 |
1217 allocate(%[1],REG,QREG)
1220 move({CONST4,0},%[b.2])
1221 "ashq\t%[a],%[b],%[b]"
1222 erase(%[b]) | %[b.1] | | (10,12)+%[1]
1223 ... | NC CONST source4 |
1226 move({CONST4,0},%[a.2])
1227 "ashq\t$$%(0-%[1.num]%),%[a],%[a]"
1228 erase(%[a]) | %[a.1] | | (4,4)+%[1]
1229 sru !defined($1) | source1or2or4 |
1235 /****************************************
1236 * Group 5 : Floating point arithmetic *
1237 ****************************************/
1239 adf $1==4 | source4 source4 |
1240 allocate(%[1],%[2],REG)
1241 "addf3\t%[1],%[2],%[a]"
1242 setcc(%[a]) | %[a] | | (4,8)+%[1]+%[2]
1244 ... | source4 sreg4 |
1247 setcc(%[2]) | %[2] | | (3,8) + %[1]
1248 ... | sreg4 source4 |
1251 setcc(%[1]) | %[1] | | (3,8) + %[2]
1253 adf stl $1==4 && inreg($2)==2
1256 "addf3\t%[1],%[2],%(regvar($2)%)"
1257 erase(regvar($2)) | | |
1258 #endif /* REGVARS */
1259 adf stl $1==4 && $2<0
1262 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1263 "addf3\t%[1],%[2],$2(fp)"
1264 setcc({LOCAL4,LB,$2,4}) | | |
1265 adf stl $1==4 && $2>=0
1268 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1269 "addf3\t%[1],%[2],$2(ap)"
1270 setcc({LOCAL4,AP,$2,4}) | | |
1272 adf sil $1==4 && inreg($2)==2
1275 "addf3\t%[1],%[2],(%(regvar($2)%))"
1276 setcc(regvar($2)) | | |
1277 #endif /* REGVARS */
1278 adf sil $1==4 && $2<0
1281 "addf3\t%[1],%[2],*$2(fp)"
1282 setcc({displdef4,LB,tostring($2)}) | | |
1283 adf sil $1==4 && $2>=0
1286 "addf3\t%[1],%[2],*$2(ap)"
1287 setcc({displdef4,AP,tostring($2)}) | | |
1288 adf ste $1==4 | source4 source4 |
1290 "addf3\t%[1],%[2],$2"
1291 setcc({EXTERNAL4,$2}) | | |
1293 adf $1==8 | source8 source8 |
1294 allocate(%[1],%[2],QREG)
1295 "addd3\t%[1],%[2],%[a]"
1296 setcc(%[a]) | %[a] | | (4,14)+%[1]+%[2]
1298 ... | source8 sreg8 |
1301 setcc(%[2]) | %[2] | | (3,14) + %[1]
1302 ... | sreg8 source8 |
1305 setcc(%[1]) | %[1] | | (3,14) + %[2]
1306 adf sdl $1==8 && $2<0
1309 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1310 "addd3\t%[1],%[2],$2(fp)"
1311 setcc({LOCAL8,LB,$2,8}) | | |
1312 adf sdl $1==8 && $2>=0
1315 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1316 "addd3\t%[1],%[2],$2(ap)"
1317 setcc({LOCAL8,AP,$2,8}) | | |
1318 adf sde $1==8 | source8 source8 |
1320 "addd3\t%[1],%[2],$2"
1321 setcc({EXTERNAL8,$2}) | | |
1323 adf !defined($1) | source4 |
1327 sbf $1==4 | source4 source4 |
1328 allocate(%[1],%[2],REG)
1329 "subf3\t%[1],%[2],%[a]"
1330 setcc(%[a]) | %[a] | | (4,8)+%[1]+%[2]
1332 ... | NC source4 sreg4 |
1335 setcc(%[2]) | %[2] | | (3,8) + %[1]
1337 sbf stl $1==4 && inreg($2)==2
1340 "subf3\t%[1],%[2],%(regvar($2)%)"
1342 setcc(regvar($2)) | | |
1343 #endif /* REGVARS */
1344 sbf stl $1==4 && $2<0
1347 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1348 "subf3\t%[1],%[2],$2(fp)"
1349 setcc({LOCAL4,LB,$2,4}) | | |
1350 sbf stl $1==4 && $2>=0
1353 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1354 "subf3\t%[1],%[2],$2(ap)"
1355 setcc({LOCAL4,AP,$2,4}) | | |
1357 sbf sil $1==4 && inreg($2)==2
1360 "subf3\t%[1],%[2],(%(regvar($2)%))"
1361 setcc(regvar($2)) | | |
1362 #endif /* REGVARS */
1363 sbf sil $1==4 && $2<0
1366 "subf3\t%[1],%[2],*$2(fp)"
1367 setcc({displdef4,LB,tostring($2)}) | | |
1368 sbf sil $1==4 && $2>=0
1371 "subf3\t%[1],%[2],*$2(ap)"
1372 setcc({displdef4,AP,tostring($2)}) | | |
1373 sbf ste $1==4 | source4 source4 |
1375 "subf3\t%[1],%[2],$2"
1376 setcc({EXTERNAL4,$2}) | | |
1378 sbf $1==8 | source8 source8 |
1379 allocate(%[1],%[2],QREG)
1380 "subd3\t%[1],%[2],%[a]"
1381 setcc(%[a]) | %[a] | | (4,14)+%[1]+%[2]
1383 ... | source8 sreg8 |
1386 setcc(%[2]) | %[2] | | (3,14) + %[1]
1387 sbf sdl $1==8 && $2<0
1390 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1391 "subd3\t%[1],%[2],$2(fp)"
1392 setcc({LOCAL8,LB,$2,8}) | | |
1393 sbf sdl $1==8 && $2>=0
1396 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1397 "subd3\t%[1],%[2],$2(ap)"
1398 setcc({LOCAL8,AP,$2,8}) | | |
1399 sbf sde $1==8 | source8 source8 |
1401 "subd3\t%[1],%[2],$2"
1402 setcc({EXTERNAL8,$2}) | | |
1404 sbf !defined($1) | source1or2or4 |
1408 mlf $1==4 | source4 source4 |
1409 allocate(%[1],%[2],REG)
1410 "mulf3\t%[1],%[2],%[a]"
1411 setcc(%[a]) | %[a] | | (4,12)+%[1]+%[2]
1413 ... | source4 sreg4 |
1416 setcc(%[2]) | %[2] | | (3,12) + %[1]
1417 ... | sreg4 source4 |
1420 setcc(%[1]) | %[1] | | (3,12) + %[2]
1422 mlf stl $1==4 && inreg($2)==2
1425 "mulf3\t%[1],%[2],%(regvar($2)%)"
1426 erase(regvar($2)) | | |
1427 #endif /* REGVARS */
1428 mlf stl $1==4 && $2<0
1431 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1432 "mulf3\t%[1],%[2],$2(fp)"
1433 setcc({LOCAL4,LB,$2,4}) | | |
1434 mlf stl $1==4 && $2>=0
1437 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1438 "mulf3\t%[1],%[2],$2(ap)"
1439 setcc({LOCAL4,AP,$2,4}) | | |
1441 mlf sil $1==4 && inreg($2)==2
1444 "mulf3\t%[1],%[2],(%(regvar($2)%))"
1445 setcc(regvar($2)) | | |
1446 #endif /* REGVARS */
1447 mlf sil $1==4 && $2<0
1450 "mulf3\t%[1],%[2],*$2(fp)"
1451 setcc({displdef4,LB,tostring($2)}) | | |
1452 mlf sil $1==4 && $2>=0
1455 "mulf3\t%[1],%[2],*$2(ap)"
1456 setcc({displdef4,AP,tostring($2)}) | | |
1457 mlf ste $1==4 | source4 source4 |
1459 "mulf3\t%[1],%[2],$2"
1460 setcc({EXTERNAL4,$2}) | | |
1462 mlf $1==8 | source8 source8 |
1463 allocate(%[1],%[2],QREG)
1464 "muld3\t%[1],%[2],%[a]"
1465 setcc(%[a]) | %[a] | | (4,20)+%[1]+%[2]
1467 ... | source8 sreg8 |
1470 setcc(%[2]) | %[2] | | (3,20) + %[1]
1471 ... | sreg8 source8 |
1474 setcc(%[1]) | %[1] | | (3,20) + %[2]
1475 mlf sdl $1==8 && $2<0
1478 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1479 "muld3\t%[1],%[2],$2(fp)"
1480 setcc({LOCAL8,LB,$2,8}) | | |
1481 mlf sdl $1==8 && $2>=0
1484 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1485 "muld3\t%[1],%[2],$2(ap)"
1486 setcc({LOCAL8,AP,$2,8}) | | |
1487 mlf sde $1==8 | source8 source8 |
1489 "muld3\t%[1],%[2],$2"
1490 setcc({EXTERNAL8,$2}) | | |
1492 mlf !defined($1) | source1or2or4 |
1496 dvf $1==4 | source4 source4 |
1497 allocate(%[1],%[2],REG)
1498 "divf3\t%[1],%[2],%[a]"
1499 setcc(%[a]) | %[a] | | (4,46)+%[1]+%[2]
1501 ... | source4 sreg4 |
1504 setcc(%[2]) | %[2] | | (3,46) + %[1]
1506 dvf stl $1==4 && inreg($2)==2
1509 "divf3\t%[1],%[2],%(regvar($2)%)"
1511 setcc(regvar($2)) | | |
1512 #endif /* REGVARS */
1513 dvf stl $1==4 && $2<0
1516 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1517 "divf3\t%[1],%[2],$2(fp)"
1518 setcc({LOCAL4,LB,$2,4}) | | |
1519 dvf stl $1==4 && $2>=0
1522 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1523 "divf3\t%[1],%[2],$2(ap)"
1524 setcc({LOCAL4,AP,$2,4}) | | |
1526 dvf sil $1==4 && inreg($2)==2
1529 "divf3\t%[1],%[2],(%(regvar($2)%))"
1530 setcc(regvar($2)) | | |
1531 #endif /* REGVARS */
1532 dvf sil $1==4 && $2<0
1535 "divf3\t%[1],%[2],*$2(fp)"
1536 setcc({displdef4,LB,tostring($2)}) | | |
1537 dvf sil $1==4 &&$2>=0
1540 "divf3\t%[1],%[2],*$2(ap)"
1541 setcc({displdef4,AP,tostring($2)}) | | |
1542 dvf ste $1==4 | source4 source4 |
1544 "divf3\t%[1],%[2],$2"
1545 setcc({EXTERNAL4,$2}) | | |
1547 dvf $1==8 | source8 source8 |
1548 allocate(%[1],%[2],QREG)
1549 "divd3\t%[1],%[2],%[a]"
1550 setcc(%[a]) | %[a] | | (4,80)+%[1]+%[2]
1552 ... | source8 sreg8 |
1555 setcc(%[2]) | %[2] | | (3,80) + %[1]
1556 dvf sdl $1==8 && $2<0
1559 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1560 "divd3\t%[1],%[2],$2(fp)"
1561 setcc({LOCAL8,LB,$2,8}) | | |
1562 dvf sdl $1==8 && $2>=0
1565 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1566 "divd3\t%[1],%[2],$2(ap)"
1567 setcc({LOCAL8,AP,$2,8}) | | |
1568 dvf sde $1==8 | source8 source8 |
1570 "divd3\t%[1],%[2],$2"
1571 setcc({EXTERNAL8,$2}) | | |
1573 dvf !defined($1) | source1or2or4 |
1577 ngf $1==4 | source4 |
1580 setcc(%[a]) | %[a] | |
1583 ngf stl $1==4 && inreg($2)==2
1586 "mnegf\t%[1],%(regvar($2)%)"
1588 setcc(regvar($2)) | | |
1589 #endif /* REGVARS */
1590 ngf stl $1==4 && $2<0
1593 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1594 "mnegf\t%[1],$2(fp)"
1595 setcc({LOCAL4,LB,$2,4}) | | |
1596 ngf stl $1==4 && $2>=0
1599 remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
1600 "mnegf\t%[1],$2(ap)"
1601 setcc({LOCAL4,AP,$2,4}) | | |
1603 ngf sil $1==4 && inreg($2)==2
1606 "mnegf\t%[1],(%(regvar($2)%))"
1607 setcc(regvar($2)) | | |
1608 #endif /* REGVARS */
1609 ngf sil $1==4 && $2<0
1612 "mnegf\t%[1],*$2(fp)"
1613 setcc({displdef4,LB,tostring($2)}) | | |
1614 ngf sil $1==4 && $2>=0
1617 "mnegf\t%[1],*$2(ap)"
1618 setcc({displdef4,AP,tostring($2)}) | | |
1619 ngf ste $1==4 | source4 |
1622 setcc({EXTERNAL4,$2}) | | |
1624 ngf $1==8 | source8 |
1627 setcc(%[a]) | %[a] | |
1629 ngf sdl $1==8 && $2<0
1632 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1633 "mnegd\t%[1],$2(fp)"
1634 setcc({LOCAL8,LB,$2,8}) | | |
1635 ngf sdl $1==8 && $2>=0
1638 remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
1639 "mnegd\t%[1],$2(ap)"
1640 setcc({LOCAL8,AP,$2,8}) | | |
1641 ngf sde $1==8 | source8 |
1644 setcc({EXTERNAL8,$2}) | | |
1646 ngf !defined($1) | source1or2or4 |
1650 fif $1==4 | source4 source4 |
1651 allocate(%[1],%[2],REG,REG)
1652 "mulf3\t%[1],%[2],%[a]"
1653 /* the assembler does not do immediate floating point */
1655 "emodf\t%[a],$$0,%[b],-(sp),%[b]"
1657 * Don't trust the integer part.
1658 * Overflow could occur.
1661 "subf2\t%[b],%[a]" | %[b] %[a] | |
1662 fif $1==8 | source8 source8 |
1663 allocate(%[1],%[2],QREG,QREG)
1664 "muld3\t%[1],%[2],%[a]"
1666 "emodd\t%[a],$$0,%[b],-(sp),%[b]"
1668 "subd2\t%[b],%[a]" | %[b] %[a] | |
1669 fif !defined($1) | source1or2or4 |
1676 move({CONST4, $1}, R0)
1679 fef !defined($1) | source1or2or4 |
1685 /********************************
1686 * Group 6 : pointer arithmetic *
1687 ********************************/
1690 adp | NC ADDR_EXTERNAL |
1691 | {ADDR_EXTERNAL,%[1.ind]+"+"+tostring($1)} | |
1692 ... | NC ADDR_LOCAL |
1693 | {ADDR_LOCAL,%[1.reg],%[1.num]+$1} | |
1694 ... | NC adisplind1 |
1695 | {adisplind1,%[1.ireg],%[1.reg],
1696 %[1.ind]+"+"+tostring($1)} | |
1697 ... | NC adispldefind1 |
1698 allocate(%[1.ireg],REG)
1699 "addl3\t$$$1,%[1.ireg],%[a]"
1700 | {adispldefind1,%[a],%[1.reg],%[1.ind]} | |
1701 ... | NC aextdefind1 |
1703 "addl3\t$$$1,%[1.ireg],%[a]"
1704 | {aextdefind1,%[a],%[1.ind]} | |
1705 ... | NC adispl | | {adispl,%[1.reg],%[1.ind]+"+"+tostring($1)} | |
1706 ... | reg4 | | {adispl,%[1],tostring($1)} | |
1707 adp sil | | | {CONST4,$1} | adi 4 sil $2 |
1708 adp stl | | | {CONST4,$1} | adi 4 stl $2 |
1709 adp ste | | | {CONST4,$1} | adi 4 ste $2 |
1710 adp dup $2==4 | | | {CONST4,$1} | adi 4 dup 4 |
1711 adp lol stf | | | {CONST4,$1} | adi 4 lol $2 stf $3 |
1713 | | | {CONST4,$1} | adi 4 lol $2 sti 4 |
1715 | | | {CONST4,$1} | adi 4 loe $2 sti 4 |
1716 adp cms $2==4 | | | {CONST4,$1} | adi 4 cms 4 |
1717 loe lof adp loe stf $1==$4 && $2==$5
1719 allocate(REG={EXTERNAL4,$1})
1720 "addl2\t$$$3,$2(%[a])" | | |
1721 lol lof adp lol stf $1<0 && $1==$4 && inreg($1)!=2 && $2==$5
1723 allocate(REG={LOCAL4,LB,$1,4})
1724 "addl2\t$$$3,$2(%[a])" | | |
1725 lol lof adp lol stf $1>=0 && $1==$4 && inreg($1)!=2 && $2==$5
1727 allocate(REG={LOCAL4,AP,$1,4})
1728 "addl2\t$$$3,$2(%[a])" | | |
1729 ads $1==4 | NC reg4 adispl |
1730 | {adisplind1,%[1],%[2.reg],%[2.ind]} | |
1731 ... | NC reg4 ADDR_LOCAL |
1732 | {adisplind1,%[1],%[2.reg],tostring(%[2.num])} | |
1733 ... | NC reg4 ADDR_EXTERNAL |
1734 | {adispl,%[1],%[2.ind]} | |
1735 ... | NC reg4 aextind2 |
1736 | {adisplind2,%[2.ireg],%[1],%[2.ind]} | |
1737 ... | NC reg4 aextind4 |
1738 | {adisplind4,%[2.ireg],%[1],%[2.ind]} | |
1739 ... | NC reg4 aextind8 |
1740 | {adisplind8,%[2.ireg],%[1],%[2.ind]} | |
1741 ... | NC reg4 displ4 |
1742 | {adispldefind1,%[1],%[2.reg],%[2.ind]} | |
1743 ... | NC reg4 LOCAL4 |
1744 | {adispldefind1,%[1],%[2.reg],tostring(%[2.num])} | |
1745 ... | NC reg4 regdef4 |
1746 | {adispldefind1,%[1],%[2.reg],"0"} | |
1747 ... | NC reg4 EXTERNAL4 |
1748 | {aextdefind1,%[1],%[2.ind]} | |
1749 ... | NC reg4 reg4 | | {adisplind1,%[1],%[2],"0"} | |
1751 ads | | | | loc $1 loc 4 cii ads 4 |
1752 ads !defined($1) | | | | loc 4 cii ads 4 |
1753 sbs $1==4 | | | | sbu $1 |
1754 sbs $1!=4 | | | | sbu 4 loc 4 loc $1 cii |
1755 sbs !defined($1) | source1or2or4 |
1760 adp dup sil adp $1==(0-$4) && $2==4
1761 | reg4 | | %[1] %[1] | adp $1 sil $3 |
1762 adp dup loe sti adp $1==(0-$5) && $2==4 && $4==4
1763 | reg4 | | %[1] %[1] | adp $1 loe $3 sti 4 |
1764 dup adp lol sti $1==4 && $4==4
1765 | bigsource4-regch4 |
1767 | %[a] %[1] {CONST4,$2}
1768 | adi 4 lol $3 sti 4 |
1769 dup adp loe sti $1==4 && $4==4
1770 | bigsource4-regch4 |
1772 | %[a] %[1] {CONST4,$2}
1773 | adi 4 loe $3 sti 4 |
1775 lol dup adp stl loi $1==$4 && $2==4 && inreg($1)==2 && $3==1 && $5==1
1776 | | remove(regvar($1))
1778 | {reginc1,regvar($1)} | |
1779 lol dup adp stl loi $1==$4 && $2==4 && inreg($1)==2 && $3==2 && $5==2
1780 | | remove(regvar($1))
1782 | {reginc2,regvar($1)} | |
1783 lol dup adp stl loi $1==$4 && $2==4 && inreg($1)==2 && $3==4 && $5==4
1784 | | remove(regvar($1))
1786 | {reginc4,regvar($1)} | |
1787 lol dup adp stl loi $1==$4 && $2==4 && inreg($1)==2 && $3==8 && $5==8
1788 | | remove(regvar($1))
1790 | {reginc8,regvar($1)} | |
1791 lol adp dup stl loi $1==$4 && $2==(0-1) && inreg($1)==2 && $3==4 && $5==1
1792 | | remove(regvar($1))
1794 | {regdec1,regvar($1)} | |
1795 lol adp dup stl loi $1==$4 && $2==(0-2) && inreg($1)==2 && $3==4 && $5==2
1796 | | remove(regvar($1))
1798 | {regdec2,regvar($1)} | |
1799 lol adp stl lil $1==$4 && $2==(0-4) && inreg($1)==2 && $3==$1
1800 | | remove(regvar($1))
1802 | {regdec4,regvar($1)} | |
1803 lol adp dup stl loi $1==$4 && $2==(0-8) && inreg($1)==2 && $3==4 && $5==8
1804 | | remove(regvar($1))
1806 | {regdec8,regvar($1)} | |
1807 lol dup adp stl sti $1==$4 && $2==4 && inreg($1)==2 && $3==1 && $5==1
1811 "movb\t%[1],(%(regvar($1)%))+"
1812 erase(regvar($1)) | | | (3,7)+%[1]
1816 "cvtwb\t%[1],(%(regvar($1)%))+"
1817 erase(regvar($1)) | | | (3,7)+%[1]
1821 "cvtlb\t%[1],(%(regvar($1)%))+"
1822 erase(regvar($1)) | | | (3,7)+%[1]
1823 lol dup adp stl sti $1==$4 && $2==4 && inreg($1)==2 && $3==2 && $5==2
1827 "movw\t%[1],(%(regvar($1)%))+"
1828 erase(regvar($1)) | | | (3,7)+%[1]
1832 "cvtlw\t%[1],(%(regvar($1)%))+"
1833 erase(regvar($1)) | | | (3,7)+%[1]
1834 lol dup adp stl sti $1==$4 && $2==4 && inreg($1)==2 && $3==4 && $5==4
1838 move(%[1],{reginc4,regvar($1)})
1839 erase(regvar($1)) | | |
1840 lol dup adp stl sti $1==$4 && $2==4 && inreg($1)==2 && $3==8 && $5==8
1844 move(%[1],{reginc8,regvar($1)})
1845 erase(regvar($1)) | | |
1846 lol adp dup stl sti $1==$4 && inreg($1)==2 && $2==(0-1) && $3==4 && $5==1
1850 "movb\t%[1],-(%(regvar($1)%))"
1851 erase(regvar($1)) | | | (3,7)+%[1]
1855 "cvtwb\t%[1],-(%(regvar($1)%))"
1856 erase(regvar($1)) | | | (3,7)+%[1]
1860 "cvtlb\t%[1],-(%(regvar($1)%))"
1861 erase(regvar($1)) | | | (3,7)+%[1]
1862 lol adp dup stl sti $1==$4 && inreg($1)==2 && $2==(0-2) && $3==4 && $5==2
1866 "movw\t%[1],-(%(regvar($1)%))"
1867 erase(regvar($1)) | | | (3,7)+%[1]
1871 "cvtlw\t%[1],-(%(regvar($1)%))"
1872 erase(regvar($1)) | | | (3,7)+%[1]
1873 lol adp stl sil $1==$4 && inreg($1)==2 && $2==(0-4) && $3==$4
1877 move(%[1],{regdec4,regvar($1)})
1878 erase(regvar($1)) | | |
1879 lol adp dup stl sti $1==$4 && inreg($1)==2 && $2==(0-8) && $3==4 && $5==8
1883 move(%[1],{regdec8,regvar($1)})
1884 erase(regvar($1)) | | |
1885 lol dup adp stl $1==$4 && $2==4 && inreg($1)==2
1886 | | remove(regvar($1))
1887 allocate(REG=regvar($1))
1888 "addl2\t$$$3,%(regvar($1)%)"
1889 erase(regvar($1)) | %[a] | |
1890 lol adp stl $1==$3 && inreg($1)==2
1891 | | remove(regvar($1))
1892 "addl2\t$$$2,%(regvar($1)%)"
1893 erase(regvar($1)) | | |
1894 #endif /* REGVARS */
1895 lol adp stl $1==$3 && $1<0
1896 | | remove(displaced)
1897 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
1898 "addl2\t$$$2,$1(fp)"
1899 setcc({LOCAL4,LB,$1,4}) | | |
1900 lol adp stl $1==$3 && $1>=0
1901 | | remove(displaced)
1902 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
1903 "addl2\t$$$2,$1(ap)"
1904 setcc({LOCAL4,AP,$1,4}) | | |
1905 lol dup adp stl $1==$4 && $2==4 && $1<0
1906 | | remove(displaced)
1907 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
1908 allocate(REG={LOCAL4,LB,$1,4})
1909 "addl2\t$$$3,$1(fp)"
1910 setcc({LOCAL4,LB,$1,4}) | %[a] | |
1911 lol dup adp stl $1==$4 && $2==4
1912 | | remove(displaced)
1913 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
1914 allocate(REG={LOCAL4,AP,$1,4})
1915 "addl2\t$$$3,$1(ap)"
1916 setcc({LOCAL4,AP,$1,4}) | %[a] | |
1918 lil dup adp sil $1==$4 && $2==4 && inreg($1)==2
1920 allocate(REG={regdef4,regvar($1)})
1921 "addl2\t$$$3,(%(regvar($1)%))"
1922 setcc(regvar($1)) | %[a] | |
1923 lol lof dup adp lol stf $1==$5 && $2==$6 && $3==4 && inreg($1)==2
1925 allocate(REG={displ4,regvar($1),tostring($2)})
1926 "addl2\t$$$4,$2(%(regvar($1)%))"
1930 | | remove(externals)
1931 "addl2\t$$$2,$1" | | |
1932 loe dup adp ste $1==$4 && $2==4
1933 | | remove(externals)
1934 allocate(REG={EXTERNAL4,$1})
1935 "addl2\t$$$3,$1" | %[a] | |
1937 /****************************************
1938 * Group 7 : Increment/decrement/zero *
1939 ****************************************/
1941 lil inc dup sil $3==4 && $1==$4 | | | | lil $1 loc 1 adi 4 sil $1 lil $1 |
1942 lil dec dup sil $3==4 && $1==$4 | | | | lil $1 loc 1 sbi 4 sil $1 lil $1 |
1943 inc | | | {CONST1,1} | adi 4 |
1944 loe lof inc loe stf $1==$4 && $2==$5
1946 allocate(REG={EXTERNAL4,$1})
1948 setcc({displ4,%[a],tostring($2)}) | | |
1949 lol lof inc lol stf $1<0 && $1==$4 && inreg($1)!=2 && $2==$5
1951 allocate(REG={LOCAL4,LB,$1,4})
1953 setcc({displ4,%[a],tostring($2)}) | | |
1954 lol lof inc lol stf $1>=0 && $1==$4 && inreg($1)!=2 && $2==$5
1956 allocate(REG={LOCAL4,AP,$1,4})
1958 setcc({displ4,%[a],tostring($2)}) | | |
1959 dec | | | {CONST1,1} | sbi 4 |
1960 loe lof dec loe stf $1==$4 && $2==$5
1962 allocate(REG={EXTERNAL4,$1})
1964 setcc({displ4,%[a],tostring($2)}) | | |
1965 lol lof dec lol stf $1<0 && $1==$4 && inreg($1)!=2 && $2==$5
1967 allocate(REG={LOCAL4,LB,$1,4})
1969 setcc({displ4,%[a],tostring($2)}) | | |
1970 lol lof dec lol stf $1>=0 && $1==$4 && inreg($1)!=2 && $2==$5
1972 allocate(REG={LOCAL4,AP,$1,4})
1974 setcc({displ4,%[a],tostring($2)}) | | |
1976 inl inreg($1)==2 | | remove(regvar($1))
1977 "incl\t%(regvar($1)%)"
1979 setcc(regvar($1)) | | |
1980 #endif /* REGVARS */
1981 inl $1<0 | | remove(displaced)
1982 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
1984 setcc({LOCAL4,LB,$1,4}) | | |
1985 inl $1>=0 | | remove(displaced)
1986 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
1988 setcc({LOCAL4,AP,$1,4}) | | |
1990 lol inl $1==$2 && inreg($1)==2
1991 | | remove(regvar($1))
1992 allocate(REG=regvar($1))
1993 "incl\t%(regvar($1)%)"
1995 setcc(regvar($1)) | %[a] | |
1996 #endif /* REGVARS */
1997 ine | | remove(externals)
1999 setcc({EXTERNAL4,$1}) | | |
2001 del inreg($1)==2 | | remove(regvar($1))
2002 "decl\t%(regvar($1)%)"
2004 setcc(regvar($1)) | | |
2005 #endif /* REGVARS */
2006 del $1<0 | | remove(displaced)
2007 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
2009 setcc({LOCAL4,LB,$1,4}) | | |
2010 del $1>=0 | | remove(displaced)
2011 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
2013 setcc({LOCAL4,AP,$1,4}) | | |
2015 lol del $1==$2 && inreg($1)==2
2016 | | remove(regvar($1))
2017 allocate(REG=regvar($1))
2018 "decl\t%(regvar($1)%)"
2020 setcc(regvar($1)) | %[a] | |
2021 #endif /* REGVARS */
2022 dee | | remove(externals)
2024 setcc({EXTERNAL4,$1}) | | |
2026 zrl inreg($1)==2 | | remove(regvar($1))
2027 "clrl\t%(regvar($1)%)"
2029 setcc(regvar($1)) | | |
2030 #endif /* REGVARS */
2031 zrl $1<0 | | remove(displaced)
2032 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
2034 setcc({LOCAL4,LB,$1,4}) | | |
2035 zrl $1>=0 | | remove(displaced)
2036 remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
2038 setcc({LOCAL4,AP,$1,4}) | | |
2039 zrl zrl $1==$2+4 && $1<0
2041 && inreg($1)<2 && inreg($2)<2
2042 #endif /* REGVARS */
2043 | | remove(displaced)
2044 remove(LOCALS,%[num]<=$2+7 && %[num]+%[size]>$2)
2046 setcc({LOCAL8,LB,$2,8}) | | |
2047 zrl zrl $1==$2+4 && $1>=0
2049 && inreg($1)<2 && inreg($2)<2
2050 #endif /* REGVARS */
2051 | | remove(displaced)
2052 remove(LOCALS,%[num]<=$2+7 && %[num]+%[size]>$2)
2054 setcc({LOCAL8,AP,$2,8}) | | |
2055 zrl zrl $1==$2-4 | | | | zrl $2 zrl $1 |
2056 zre | | remove(externals)
2058 setcc({EXTERNAL4,$1}) | | |
2059 zrf $1==4 | | allocate(REG)
2060 "clrl\t%[a]" | %[a] | |
2061 zrf $1==8 | | allocate(QREG)
2062 "clrq\t%[a]" | %[a] | |
2063 zer $1==4 | | | {CONST4,0} | |
2064 zer $1==8 | | allocate(QREG)
2065 "clrq\t%[a]" | %[a] | |
2066 zer $1>8&&$1<=32 | STACK |
2067 "clrq\t-(sp)" | | zer $1-8 |
2068 zer defined($1) | STACK |
2069 move({CONST4,$1/4},R0)
2076 #endif /* LOCLABS */
2078 zer !defined($1) | source1or2or4 |
2087 #endif /* LOCLABS */
2090 /********************************
2091 * Group 8 : Convertions *
2092 ********************************/
2112 loc loc cii stl $1==1 && $2==4 && inreg($4)==2
2115 "cvtbl\t%[1],%(regvar($4)%)"
2117 setcc(regvar($4)) | | |
2118 #endif /* REGVARS */
2119 loc loc cii stl $1==1 && $2==4 && $4<0
2122 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2123 "cvtbl\t%[1],$4(fp)"
2124 setcc({LOCAL4,LB,$4,4}) | | |
2125 loc loc cii stl $1==1 && $2==4 && $4>=0
2128 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2129 "cvtbl\t%[1],$4(ap)"
2130 setcc({LOCAL4,AP,$4,4}) | | |
2131 loc loc cii ste $1==1 && $2==4 | source1or2or4 |
2134 setcc({EXTERNAL4,$4}) | | |
2135 loc loc cii $1==1 && $2==4 | source1or2or4 |
2138 setcc(%[a]) | %[a] | |
2140 loc loc cii stl $1==2 && $2==4 && inreg($4)==2
2143 "cvtwl\t%[1],%(regvar($4)%)"
2145 setcc(regvar($4)) | | |
2146 #endif /* REGVARS */
2147 loc loc cii stl $1==2 && $2==4 && $4<0
2150 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2151 "cvtwl\t%[1],$4(fp)"
2152 setcc({LOCAL4,LB,$4,4}) | | |
2153 loc loc cii stl $1==2 && $2==4 && $4>=0
2156 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2157 "cvtwl\t%[1],$4(ap)"
2158 setcc({LOCAL4,AP,$4,4}) | | |
2159 loc loc cii ste $1==2 && $2==4 | source2or4 |
2162 setcc({EXTERNAL4,$4}) | | |
2163 loc loc cii $1==2 && $2==4 | source2or4 |
2166 setcc(%[a]) | %[a] | |
2167 loc loc cui $1==$2 | | | | |
2168 loc loc ciu $1==$2 | | | | |
2171 loc loc cfi stl $1==4 && $2==4 && inreg($4)==2
2174 "cvtfl\t%[1],%(regvar($4)%)"
2176 setcc(regvar($4)) | | |
2177 #endif /* REGVARS */
2178 loc loc cfi stl $1==4 && $2==4 && $4<0
2181 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2182 "cvtfl\t%[1],$4(fp)"
2183 setcc({LOCAL4,AP,$4,4}) | | |
2184 loc loc cfi stl $1==4 && $2==4 && $4>=0
2187 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2188 "cvtfl\t%[1],$4(ap)"
2189 setcc({LOCAL4,AP,$4,4}) | | |
2190 loc loc cfi ste $1==4 && $2==4 | source4 |
2193 setcc({EXTERNAL4,$4}) | | |
2195 loc loc cfi $1==4 && $2==4 | source4 |
2198 setcc(%[a]) | %[a] | | (3,4) + %[1]
2201 loc loc cfi stl $1==8 && $2==4 && inreg($4)==2
2204 "cvtdl\t%[1],%(regvar($4)%)"
2206 setcc(regvar($4)) | | |
2207 #endif /* REGVARS */
2208 loc loc cfi stl $1==8 && $2==4 && $4<0
2211 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2212 "cvtdl\t%[1],$4(fp)"
2213 setcc({LOCAL4,LB,$4,4}) | | |
2214 loc loc cfi stl $1==8 && $2==4 && $4>=0
2217 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2218 "cvtdl\t%[1],$4(ap)"
2219 setcc({LOCAL4,AP,$4,4}) | | |
2220 loc loc cfi ste $1==8 && $2==4 | source8 |
2223 setcc({EXTERNAL4,$4}) | | |
2225 loc loc cfi $1==8 && $2==4 | source8 |
2228 setcc(%[a]) | %[a] | |
2231 loc loc cif stl $1==4 && $2==4 && inreg($4)==2
2234 "cvtlf\t%[1],%(regvar($4)%)"
2236 setcc(regvar($4)) | | |
2237 #endif /* REGVARS */
2238 loc loc cif stl $1==4 && $2==4 && $4<0
2241 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2242 "cvtlf\t%[1],$4(fp)" | | |
2243 loc loc cif stl $1==4 && $2==4 && $4>=0
2246 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2247 "cvtlf\t%[1],$4(ap)" | | |
2248 loc loc cif ste $1==4 && $2==4 | source4 |
2250 "cvtlf\t%[1],$4" | | |
2252 loc loc cif $1==4 && $2==4 | source4 |
2254 "cvtlf\t%[1],%[a]" | %[a] | |
2256 /* No double registervariables
2258 loc loc cif sdl $1==4 && $2==8 && inreg($4)==2
2261 "cvtld\t%[1],%(regvar($4)%)"
2263 setcc(regvar($4)) | | |
2266 loc loc cif sdl $1==4 && $2==8 && $4<0
2269 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2270 "cvtld\t%[1],$4(fp)" | | |
2271 loc loc cif sdl $1==4 && $2==8 && $4>=0
2274 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2275 "cvtld\t%[1],$4(ap)" | | |
2276 loc loc cif sde $1==4 && $2==8 | source4 |
2278 "cvtld\t%[1],$4" | | |
2280 loc loc cif $1==4 && $2==8 | source4 |
2282 "cvtld\t%[1],%[a]" | %[a] | |
2283 loc loc cfu $1==4 | source4 |
2284 allocate(%[1],REG=%[1])
2285 "bicl2\t$$32768,%[a]" | %[a] | loc $1 loc $2 cfi |
2286 loc loc cfu $1==8 | source8 |
2287 allocate(%[1],QREG=%[1])
2288 "bicl2\t$$32768,%[a]" | %[a] | loc $1 loc $2 cfi |
2290 /* No double registervariables
2292 loc loc cff sdl $1==4 && $2==8 && inreg($4)==2
2295 "cvtfd\t%[1],%(regvar($4)%)"
2297 setcc(regvar($4)) | | |
2300 loc loc cff sdl $1==4 && $2==8 && $4<0
2303 remove(LOCALS,(%[num] <= $4+7 && %[num]+%[size] > $4))
2304 "cvtfd\t%[1],$4(fp)" | | |
2305 loc loc cff sdl $1==4 && $2==8 && $4>=0
2308 remove(LOCALS,(%[num] <= $4+7 && %[num]+%[size] > $4))
2309 "cvtfd\t%[1],$4(ap)" | | |
2310 loc loc cff sde $1==4 && $2==8 | source4 |
2312 "cvtfd\t%[1],$4" | | |
2314 loc loc cff $1==4 && $2==8 | source4 |
2316 "cvtfd\t%[1],%[a]" | %[a] | |
2319 loc loc cff stl $1==8 && $2==4 && inreg($4)==2
2322 "cvtdf\t%[1],%(regvar($4)%)"
2324 setcc(regvar($4)) | | |
2325 #endif /* REGVARS */
2326 loc loc cff stl $1==8 && $2==4 && $4<0
2329 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2330 "cvtdf\t%[1],$4(fp)" | | |
2331 loc loc cff stl $1==8 && $2==4 && $4>=0
2334 remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
2335 "cvtdf\t%[1],$4(ap)" | | |
2336 loc loc cff ste $1==8 && $2==4 | source8 |
2338 "cvtdf\t%[1],$4" | | |
2340 loc loc cff $1==8 && $2==4 | source8 |
2342 "cvtdf\t%[1],%[a]" | %[a] | |
2344 /****************************************
2345 * Group 9 : Logical instructions *
2346 ****************************************/
2348 and $1==4 | source4 source4 |
2351 "bicl3\t%[a],%[2],%[a]"
2352 setcc(%[a]) | %[a] | | (7,6)+%[1]+%[2]
2353 ... | NC CONST source4 |
2355 "bicl3\t$$~%[1.num],%[2],%[a]"
2356 setcc(%[a]) | %[a] | | (4,3)+%[1]+%[2]
2357 ... | NC source4 CONST |
2359 "bicl3\t$$~%[2.num],%[1],%[a]"
2360 setcc(%[a]) | %[a] | | (4,3)+%[1]+%[2]
2361 and zeq $1==4 | source4 source4 |
2365 and zne $1==4 | source4 source4 |
2369 and tne $1==4 | source4 source4 |
2370 allocate(REG={CONST4,0})
2379 erase(%[a]) | %[a] | |
2381 and stl $1==4 && inreg($2)==2
2386 "bicl3\t%[a],%[2],%(regvar($2)%)"
2388 setcc(regvar($2)) | | | (8,8)+%[1]+%[2]
2389 ... | NC CONST source4 |
2391 "bicl3\t$$~%[1.num],%[2],%(regvar($2)%)"
2393 setcc(regvar($2)) | | | (4,4)+%[1]+%[2]
2394 ... | NC source4 CONST |
2396 "bicl3\t$$~%[2.num],%[1],%(regvar($2)%)"
2398 setcc(regvar($2)) | | | (4,4)+%[1]+%[2]
2399 #endif /* REGVARS */
2400 and stl $1==4 && $2<0
2403 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2406 "bicl3\t%[a],%[2],$2(fp)"
2407 setcc({LOCAL4,LB,$2,4}) | | | (9,12)+%[1]+%[2]
2408 ... | NC CONST source4 |
2410 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2411 "bicl3\t$$~%[1.num],%[2],$2(fp)"
2412 setcc({LOCAL4,LB,$2,4}) | | | (6,9)+%[1]+%[2]
2413 ... | NC source4 CONST |
2415 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2416 "bicl3\t$$~%[2.num],%[1],$2(fp)"
2417 setcc({LOCAL4,LB,$2,4}) | | | (6,9)+%[1]+%[2]
2418 and stl $1==4 && $2>=0
2421 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2424 "bicl3\t%[a],%[2],$2(ap)"
2425 setcc({LOCAL4,AP,$2,4}) | | | (9,12)+%[1]+%[2]
2426 ... | NC CONST source4 |
2428 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2429 "bicl3\t$$~%[1.num],%[2],$2(ap)"
2430 setcc({LOCAL4,AP,$2,4}) | | | (6,9)+%[1]+%[2]
2431 ... | NC source4 CONST |
2433 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2434 "bicl3\t$$~%[2.num],%[1],$2(ap)"
2435 setcc({LOCAL4,AP,$2,4}) | | | (6,9)+%[1]+%[2]
2437 and sil $1==4 && inreg($2)==2
2442 "bicl3\t%[a],%[2],(%(regvar($2)%))"
2443 setcc({regdef4,regvar($2)})
2444 | | | (9,15)+%[1]+%[2]
2445 ... | NC CONST source4 |
2447 "bicl3\t$$~%[1.num],%[2],(%(regvar($2)%))"
2448 setcc({regdef4,regvar($2)})
2449 | | | (6,12)+%[1]+%[2]
2450 ... | NC source4 CONST |
2452 "bicl3\t$$~%[2.num],%[1],(%(regvar($2)%))"
2453 setcc({regdef4,regvar($2)})
2454 | | | (6,12)+%[1]+%[2]
2455 #endif /* REGVARS */
2456 and sil $1==4 && $2<0
2461 "bicl3\t%[a],%[2],*$2(fp)"
2462 setcc({displdef4,LB,tostring($2)})
2463 | | | (9,15)+%[1]+%[2]
2464 ... | NC CONST source4 |
2466 "bicl3\t$$~%[1.num],%[2],*$2(fp)"
2467 setcc({displdef4,LB,tostring($2)})
2468 | | | (6,12)+%[1]+%[2]
2469 ... | NC source4 CONST |
2471 "bicl3\t$$~%[2.num],%[1],*$2(fp)"
2472 setcc({displdef4,LB,tostring($2)})
2473 | | | (6,12)+%[1]+%[2]
2474 and sil $1==4 && $2>=0
2479 "bicl3\t%[a],%[2],*$2(ap)"
2480 setcc({displdef4,AP,tostring($2)})
2481 | | | (9,15)+%[1]+%[2]
2482 ... | NC CONST source4 |
2484 "bicl3\t$$~%[1.num],%[2],*$2(ap)"
2485 setcc({displdef4,AP,tostring($2)})
2486 | | | (6,12)+%[1]+%[2]
2487 ... | NC source4 CONST |
2489 "bicl3\t$$~%[2.num],%[1],*$2(ap)"
2490 setcc({displdef4,AP,tostring($2)})
2491 | | | (6,12)+%[1]+%[2]
2492 and ste $1==4 | source4 source4 |
2496 "bicl3\t%[a],%[2],$2"
2497 setcc({EXTERNAL4,$2}) | | | (11,12)+%[1]+%[2]
2498 ... | NC CONST source4 |
2500 "bicl3\t$$~%[1.num],%[2],$2"
2501 setcc({EXTERNAL4,$2}) | | | (8,9)+%[1]+%[2]
2502 ... | NC source4 CONST |
2504 "bicl3\t$$~%[2.num],%[1],$2"
2505 setcc({EXTERNAL4,$2}) | | | (8,9)+%[1]+%[2]
2506 and $1==8 | sreg8 sreg8 |
2507 "mcoml\t%[1.1],%[1.1]"
2508 "mcoml\t%[1.2],%[1.2]"
2509 "bicl2\t%[1.1],%[2.1]"
2510 "bicl2\t%[1.2],%[2.2]"
2511 erase(%[1]) erase(%[2]) | %[2] | |
2512 and defined($1) | | remove(ALL)
2513 move({CONST4,$1},R0)
2516 and !defined($1) | source4 |
2521 ior $1==4 | source4 source4 |
2522 allocate(%[1],%[2],REG)
2523 "bisl3\t%[1],%[2],%[a]"
2524 setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2]
2525 ... | NC sreg4 source4 |
2528 setcc(%[1]) | %[1] | | (3,4) + %[2]
2529 ... | NC source4 sreg4 |
2532 setcc(%[2]) | %[2] | | (3,4) + %[1]
2534 ior stl $1==4 && inreg($2)==2
2537 "bisl3\t%[1],%[2],%(regvar($2)%)"
2539 setcc(regvar($2)) | | |
2540 #endif /* REGVARS */
2541 ior stl $1==4 && $2<0
2544 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2545 "bisl3\t%[1],%[2],$2(fp)"
2546 setcc({LOCAL4,LB,$2,4}) | | |
2547 ior stl $1==4 && $2>=0
2550 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2551 "bisl3\t%[1],%[2],$2(ap)"
2552 setcc({LOCAL4,AP,$2,4}) | | |
2554 ior sil $1==4 && inreg($2)==2
2557 "bisl3\t%[1],%[2],(%(regvar($2)%))"
2558 setcc({regdef4,regvar($2)}) | | |
2559 #endif /* REGVARS */
2560 ior sil $1==4 && $2<0
2563 "bisl3\t%[1],%[2],*$2(fp)"
2564 setcc({displdef4,LB,tostring($2)}) | | |
2565 ior sil $1==4 && $2>=0
2568 "bisl3\t%[1],%[2],*$2(ap)"
2569 setcc({displdef4,LB,tostring($2)}) | | |
2570 ior ste $1==4 | source4 source4 |
2572 "bisl3\t%[1],%[2],$2"
2573 setcc({EXTERNAL4,$2}) | | |
2574 ior $1==8 | sreg8 sreg8 |
2575 "bisl2\t%[1.1],%[2.1]"
2576 "bisl2\t%[1.2],%[2.2]"
2577 erase(%[2]) | %[2] | |
2578 ior defined($1) | STACK |
2579 move({CONST4,$1},R0)
2582 ior !defined($1) | source4 |
2587 xor $1==4 | source4 source4 |
2588 allocate(%[1],%[2],REG)
2589 "xorl3\t%[1],%[2],%[a]"
2590 setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2]
2591 ... | NC sreg4 source4 |
2594 setcc(%[1]) | %[1] | | (3,4) + %[2]
2595 ... | NC source4 sreg4 |
2598 setcc(%[2]) | %[2] | | (3,4) + %[1]
2600 xor stl $1==4 && inreg($2)==2
2603 "xorl3\t%[1],%[2],%(regvar($2)%)"
2605 setcc(regvar($2)) | | |
2606 #endif /* REGVARS */
2607 xor stl $1==4 && $2<0
2610 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2611 "xorl3\t%[1],%[2],$2(fp)"
2612 setcc({LOCAL4,LB,$2,4}) | | |
2613 xor stl $1==4 && $2>=0
2616 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2617 "xorl3\t%[1],%[2],$2(ap)"
2618 setcc({LOCAL4,AP,$2,4}) | | |
2620 xor sil $1==4 && inreg($2)==2
2623 "xorl3\t%[1],%[2],(%(regvar($2)%))"
2624 setcc({regdef4,regvar($2)}) | | |
2625 #endif /* REGVARS */
2626 xor sil $1==4 && $2<0
2629 "xorl3\t%[1],%[2],*$2(fp)"
2630 setcc({displdef4,LB,tostring($2)}) | | |
2631 xor sil $1==4 && $2>=0
2634 "xorl3\t%[1],%[2],*$2(ap)"
2635 setcc({displdef4,AP,tostring($2)}) | | |
2636 xor ste $1==4 | source4 source4 |
2638 "xorl3\t%[1],%[2],$2"
2639 setcc({EXTERNAL4,$2}) | | |
2640 xor defined($1) | STACK |
2641 move({CONST4,$1},R0)
2644 xor !defined($1) | source4 |
2649 com $1==4 | source4 |
2652 setcc(%[a]) | %[a] | |
2654 com stl $1==4 && inreg($2)==2
2657 "mcoml\t%[1],%(regvar($2)%)"
2659 setcc(regvar($2)) | | |
2660 #endif /* REGVARS */
2661 com stl $1==4 && $2<0
2664 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2665 "mcoml\t%[1],$2(fp)"
2666 setcc({LOCAL4,LB,$2,4}) | | |
2667 com stl $1==4 && $2>=0
2670 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2671 "mcoml\t%[1],$2(ap)"
2672 setcc({LOCAL4,AP,$2,4}) | | |
2674 com sil $1==4 && inreg($2)==2
2677 "mcoml\t%[1],(%(regvar($2)%))"
2678 setcc({regdef4,regvar($2)}) | | |
2679 #endif /* REGVARS */
2680 com sil $1==4 && $2<0
2683 "mcoml\t%[1],*$2(fp)"
2684 setcc({displdef4,LB,tostring($2)}) | | |
2685 com sil $1==4 && $2>=0
2688 "mcoml\t%[1],*$2(ap)"
2689 setcc({displdef4,AP,tostring($2)}) | | |
2690 com ste $1==4 | source4 |
2693 setcc({EXTERNAL4,$2}) | | |
2694 com defined($1) | STACK |
2695 move({CONST4,$1},R0)
2698 com !defined($1) | source4 |
2703 rol $1==4 | source4 source4 |
2704 allocate(%[1],REG=%[1])
2705 "rotl\t%[a],%[2],%[a]"
2707 setcc(%[a]) | %[a] | |
2709 rol stl $1==4 && inreg($2)==2
2712 "rotl\t%[1],%[2],%(regvar($2)%)"
2714 setcc(regvar($2)) | | |
2715 #endif /* REGVARS */
2716 rol stl $1==4 && $2<0
2719 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2720 "rotl\t%[1],%[2],$2(fp)"
2721 setcc({LOCAL4,LB,$2,4}) | | |
2722 rol stl $1==4 && $2>=0
2725 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2726 "rotl\t%[1],%[2],$2(ap)"
2727 setcc({LOCAL4,AP,$2,4}) | | |
2729 rol sil $1==4 && inreg($2)==2
2732 "rotl\t%[1],%[2],(%(regvar($2)%))"
2733 setcc({regdef4,regvar($2)}) | | |
2734 #endif /* REGVARS */
2735 rol sil $1==4 && $2<0
2738 "rotl\t%[1],%[2],*$2(fp)"
2739 setcc({displdef4,LB,tostring($2)}) | | |
2740 rol sil $1==4 && $2>=0
2743 "rotl\t%[1],%[2],*$2(ap)"
2744 setcc({displdef4,AP,tostring($2)}) | | |
2745 rol ste $1==4 | source4 source4 |
2747 "rotl\t%[1],%[2],$2"
2748 setcc({EXTERNAL4,$2}) | | |
2749 rol !defined($1) | source4 |
2754 ror $1==4 | source4 source4 |
2756 "subl3\t%[1],$$32,%[a]"
2757 "rotl\t%[a],%[2],%[a]"
2758 setcc(%[a]) | %[a] | |
2759 ... | NC CONST source4 |
2761 "rotl\t$$%(32-%[1.num]%),%[2],%[a]"
2762 setcc(%[a]) | %[a] | |
2764 ror stl $1==4 && inreg($2)==2
2768 "subl3\t%[1],$$32,%[a]"
2769 "rotl\t%[a],%[2],%(regvar($2)%)"
2771 setcc(regvar($2)) | | |
2772 ... | NC CONST source4 |
2774 "rotl\t$$%(32-%[1.num]%),%[2],%(regvar($2)%)"
2776 setcc(regvar($2)) | | |
2777 #endif /* REGVARS */
2778 ror stl $1==4 && $2<0
2781 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2783 "subl3\t%[1],$$32,%[a]"
2784 "rotl\t%[a],%[2],$2(fp)"
2785 setcc({LOCAL4,LB,$2,4}) | | |
2786 ... | NC CONST source4 |
2788 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2789 "rotl\t$$%(32-%[1.num]%),%[2],$2(fp)"
2790 setcc({LOCAL4,LB,$2,4}) | | |
2791 ror stl $1==4 && $2>=0
2794 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2796 "subl3\t%[1],$$32,%[a]"
2797 "rotl\t%[a],%[2],$2(ap)"
2798 setcc({LOCAL4,AP,$2,4}) | | |
2799 ... | NC CONST source4 |
2801 remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
2802 "rotl\t$$%(32-%[1.num]%),%[2],$2(ap)"
2803 setcc({LOCAL4,AP,$2,4}) | | |
2805 ror sil $1==4 && inreg($2)==2
2809 "subl3\t%[1],$$32,%[a]"
2810 "rotl\t%[a],%[2],(%(regvar($2)%))"
2811 setcc({regdef4,regvar($2)}) | | |
2812 ... | NC CONST source4 |
2814 "rotl\t$$%(32-%[1.num]%),%[2],(%(regvar($2)%))"
2815 setcc({regdef4,regvar($2)}) | | |
2816 #endif /* REGVARS */
2817 ror sil $1==4 && $2<0
2821 "subl3\t%[1],$$32,%[a]"
2822 "rotl\t%[a],%[2],*$2(fp)"
2823 setcc({displdef4,LB,tostring($2)}) | | |
2824 ... | NC CONST source4 |
2826 "rotl\t$$%(32-%[1.num]%),%[2],*$2(fp)"
2827 setcc({displdef4,LB,tostring($2)}) | | |
2828 ror sil $1==4 && $2>=0
2832 "subl3\t%[1],$$32,%[a]"
2833 "rotl\t%[a],%[2],*$2(ap)"
2834 setcc({displdef4,AP,tostring($2)}) | | |
2835 ... | NC CONST source4 |
2837 "rotl\t$$%(32-%[1.num]%),%[2],*$2(ap)"
2838 setcc({displdef4,AP,tostring($2)}) | | |
2839 ror ste $1==4 | source4 source4 |
2842 "subl3\t%[1],$$32,%[a]"
2843 "rotl\t%[a],%[2],$2"
2844 setcc({EXTERNAL4,$2}) | | |
2845 ... | NC CONST source4 |
2847 "rotl\t$$%(32-%[1.num]%),%[2],$2"
2848 setcc({EXTERNAL4,$2}) | | |
2849 ror !defined($1) | source4 |
2854 com and $1==4 && $2==4
2856 allocate(%[1],%[2],REG)
2857 "bicl3\t%[1],%[2],%[a]"
2858 setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2]
2859 ... | NC source4 sreg4 |
2862 setcc(%[2]) | %[2] | | (3,4) + %[1]
2864 com and stl $1==4 && $2==4 && inreg($3)==2
2867 "bicl3\t%[1],%[2],%(regvar($3)%)"
2869 setcc(regvar($3)) | | |
2870 #endif /* REGVARS */
2871 com and stl $1==4 && $2==4 && $3<0
2874 remove(LOCALS,(%[num] <= $3+3 && %[num]+%[size] > $3))
2875 "bicl3\t%[1],%[2],$3(fp)"
2876 setcc({LOCAL4,AP,$3,4}) | | |
2877 com and stl $1==4 && $2==4 && $3>=0
2880 remove(LOCALS,(%[num] <= $3+3 && %[num]+%[size] > $3))
2881 "bicl3\t%[1],%[2],$3(ap)"
2882 setcc({LOCAL4,AP,$3,4}) | | |
2884 com and sil $1==4 && $2==4 && inreg($3)==2
2887 "bicl3\t%[1],%[2],(%(regvar($3)%))"
2888 setcc({regdef4,regvar($3)}) | | |
2889 #endif /* REGVARS */
2890 com and sil $1==4 && $2==4 && $3<0
2893 "bicl3\t%[1],%[2],*$3(fp)"
2894 setcc({displdef4,LB,tostring($3)}) | | |
2895 com and sil $1==4 && $2==4 && $3>=0
2898 "bicl3\t%[1],%[2],*$3(ap)"
2899 setcc({displdef4,AP,tostring($3)}) | | |
2900 com and ste $1==4 &&$2==4
2903 "bicl3\t%[1],%[2],$3"
2904 setcc({EXTERNAL4,$3}) | | |
2905 com and $1==$2 | STACK |
2906 move({CONST4,$1},R0)
2910 /********************************
2911 * Group 10: Set instructions *
2912 ********************************/
2914 loc inn $1==0 && $2==4 | source4 |
2916 "bicl3\t$$~1,%[1],%[a]"
2917 setcc(%[a]) | %[a] | |
2918 loc inn $2==4 | source4 |
2920 "ashl\t$$%(0-$1%),%[1],%[a]"
2922 setcc(%[a]) | %[a] | |
2924 inn $1==4 | source4 source4 |
2925 allocate(REG={CONST1,0})
2929 "ashl\t%[a],%[2],%[a]"
2930 "bicl2\t$$~1,%[a]\n1:"
2932 erase(%[a]) | %[a] | |
2934 loc inn zeq $2==4 | source4 |
2936 "bitl\t%[1],$$%(1<<$1%)"
2938 loc inn zne $2==4 | source4 |
2940 "bitl\t%[1],$$%(1<<$1%)"
2942 inn zeq $1==4 | source4-(reginc4+regdec4+ind4) source4 |
2947 "ashl\t%[1],$$1,%[a]"
2950 ... | NC source1 source4 |
2955 "ashl\t%[1],$$1,%[a]"
2959 inn zne $1==4 | source4-(reginc4+regdec4+ind4) source4 |
2964 "ashl\t%[1],$$1,%[a]"
2966 "jneq\t$2\n1:" | | |
2967 ... | NC source1 source4 |
2972 "ashl\t%[1],$$1,%[a]"
2974 "jneq\t$2\n1:" | | |
2976 loc inn zeq $2==8 && $1<32 /* First half of set. */
2979 "bitl\t%[1],$$%(1<<$1%)"
2981 loc inn zeq $2==8 && $1>=32 /* Second half. */
2984 "bitl\t%[2],$$%(1<<($1-32)%)"
2986 loc inn zne $2==8 && $1<32 /* First half of set. */
2989 "bitl\t%[1],$$%(1<<$1%)"
2991 loc inn zne $2==8 && $1>=32 /* Second half. */
2994 "bitl\t%[2],$$%(1<<($1-32)%)"
2996 inn defined($1) | STACK |
2997 move({CONST4,$1},R0)
3000 inn !defined($1) | source4 |
3005 set $1==4 | source4 | | {CONST4,1} %[1] | sli 4 |
3006 set defined($1) | STACK |
3007 move({CONST4,$1},R0)
3010 set !defined($1) | source4 |
3016 /****************************************
3017 * Group 11 : Array instructions *
3018 ****************************************/
3020 lae aar $2==4 && rom(1,3)==1 | | | | ads 4 adp 0-rom(1,1) |
3021 lae aar $2==4 && rom(1,3)==2 | | | | loc 1 sli 4 ads 4 adp 0-2*rom(1,1) |
3022 lae aar $2==4 && rom(1,3)==4 | | | | loc 2 sli 4 ads 4 adp 0-4*rom(1,1) |
3023 lae aar $2==4 && rom(1,3)==8 | | | | loc 3 sli 4 ads 4 adp 0-8*rom(1,1) |
3024 lae aar $2==4 && defined(rom(1,3)) && rom(1,1)==0
3027 "mull3\t$$%(rom(1,3)%),%[1],%[a]"
3028 | {adisplind1,%[a],%[2.reg],%[2.ind]} | | (8,10)+%[1]
3029 ... | NC source4 ADDR_EXTERNAL |
3031 "mull3\t$$%(rom(1,3)%),%[1],%[a]"
3032 | {adispl,%[a],%[2.ind]} | | (7,16)+%[1]
3033 lae aar $2==4 && defined(rom(1,3))
3036 "mull3\t$$%(rom(1,3)%),%[1],%[a]"
3037 | {adisplind1,%[a],%[2.reg],
3038 %[2.ind]+"+"+tostring(0-rom(1,1)*rom(1,3))}
3040 ... | NC source4 ADDR_EXTERNAL |
3042 "mull3\t$$%(rom(1,3)%),%[1],%[a]"
3044 %[2.ind]+"+"+tostring(0-rom(1,1)*rom(1,3))}
3046 /* Sequence used by the CEM-compiler and the codegenerator. */
3047 loc sli ads $1==2 && $2==4 && $3==4
3048 | reg4 ADDR_EXTERNAL |
3049 | {aextind4,%[1],%[2.ind]} | |
3051 | {adisplind4,%[1],%[2.reg],%[2.ind]} | |
3053 | {adispldefind4,%[1],%[2.reg],%[2.ind]} | |
3054 ... | reg4 EXTERNAL4 |
3055 | {aextdefind4,%[1],%[2.ind]} | |
3056 loc sli ads $1==3 && $2==4 && $3==4
3057 | reg4 ADDR_EXTERNAL |
3058 | {aextind8,%[1],%[2.ind]} | |
3060 | {adisplind8,%[1],%[2.reg],%[2.ind]} | |
3062 | {adispldefind8,%[1],%[2.reg],%[2.ind]} | |
3063 ... | reg4 EXTERNAL4 |
3064 | {aextdefind8,%[1],%[2.ind]} | |
3066 "jsb\t.aar4" | R0 | |
3067 aar !defined($1) | source4 |
3072 lae sar defined(rom(1,3)) | | | | lae $1 aar $2 sti rom(1,3) |
3073 lae lar defined(rom(1,3)) | | | | lae $1 aar $2 loi rom(1,3) |
3076 sar !defined($1) | source4 |
3083 lar !defined($1) | source4 |
3089 /****************************************
3090 * Group 12 : Compare instructions *
3091 ****************************************/
3093 cmi $1==4 | source4 source4 |
3094 allocate(REG={CONST1,0})
3112 setcc(%[a]) | %[a] | |
3113 cmi !defined($1) | source4 |
3119 cmf $1==4 | source4 source4 |
3120 allocate(REG={CONST1,0})
3138 setcc(%[a]) | %[a] | |
3139 cmf $1==8 | source8 source8 |
3140 /* trouble, possible lack of scratch registers */
3141 allocate(%[1],%[2],REG)
3159 "mnegl\t$$1,%[a]\n3:"
3165 setcc(%[a]) | %[a] | |
3166 cmf !defined($1) | source4 |
3172 cmu $1==4 | | | | cmp |
3173 cmu !defined($1) | source4 |
3179 cmp | source4 source4 |
3180 allocate(REG={CONST1,0})
3198 setcc(%[a]) | %[a] | |
3199 cms $1==4 | source4 source4 |
3200 allocate(%[1],%[2],REG)
3201 "xorl3\t%[1],%[2],%[a]"
3203 erase(%[a]) | %[a] | |
3204 cms defined($1) | STACK |
3205 move({CONST1,$1},R0)
3209 cms !defined($1) | source4 |
3216 allocate(REG={CONST1,0})
3226 setcc(%[a]) | %[a] | |
3227 ... | NC source1or2-regch4 | | {CONST1,0} | |
3228 tlt and $2==4 | source4 sreg4 |
3238 erase(%[2]) | %[2] | |
3239 tlt ior $2==4 | source4 sreg4 |
3243 "bisl2\t$$1,%[2]\n1:"
3249 erase(%[2]) | %[2] | |
3251 allocate(REG={CONST1,0})
3261 setcc(%[a]) | %[a] | |
3262 ... | NC source1or2 | | %[1] | teq |
3263 tle and $2==4 | source4 sreg4 |
3273 erase(%[2]) | %[2] | |
3274 tle ior $2==4 | source4 sreg4 |
3278 "bisl2\t$$1,%[2]\n1:"
3284 erase(%[2]) | %[2] | |
3286 allocate(REG={CONST1,0})
3296 setcc(%[a]) | %[a] | |
3297 ... | NC source1or2-regch4 | | {CONST1,1} | |
3298 tge and $2==4 | source4 sreg4 |
3308 erase(%[2]) | %[2] | |
3309 tge ior $2==4 | source4 sreg4 |
3313 "bisl2\t$$1,%[2]\n1:"
3319 erase(%[2]) | %[2] | |
3321 allocate(REG={CONST1,0})
3331 setcc(%[a]) | %[a] | |
3332 ... | NC source1or2 | | %[1] | tne |
3333 tgt and $2==4 | source4 sreg4 |
3343 erase(%[2]) | %[2] | |
3344 tgt ior $2==4 | source4 sreg4 |
3348 "bisl2\t$$1,%[2]\n1:"
3354 erase(%[2]) | %[2] | |
3355 teq | source1or2or4 |
3356 allocate(REG={CONST1,0})
3366 setcc(%[a]) | %[a] | |
3367 teq and $2==4 | source4 sreg4 |
3377 erase(%[2]) | %[2] | |
3378 teq ior $2==4 | source4 sreg4 |
3382 "bisl2\t$$1,%[2]\n1:"
3388 erase(%[2]) | %[2] | |
3389 tne | source1or2or4 |
3390 allocate(REG={CONST1,0})
3400 setcc(%[a]) | %[a] | |
3401 tne and $2==4 | source4 sreg4 |
3411 erase(%[2]) | %[2] | |
3412 tne ior $2==4 | source4 sreg4 |
3416 "bisl2\t$$1,%[2]\n1:"
3422 erase(%[2]) | %[2] | |
3423 cmi tlt $1==4 | source4 source4 |
3424 allocate(REG={CONST4,0})
3434 setcc(%[a]) | %[a] | |
3435 ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tlt |
3436 cmi tle $1==4 | source4 source4 |
3437 allocate(REG={CONST4,0})
3447 setcc(%[a]) | %[a] | |
3448 ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tle |
3449 cmi teq $1==4 | source4 source4 |
3450 allocate(REG={CONST4,0})
3460 setcc(%[a]) | %[a] | |
3461 ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 teq |
3462 cmi tne $1==4 | source4 source4 |
3463 allocate(REG={CONST4,0})
3473 setcc(%[a]) | %[a] | |
3474 ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tne |
3475 cmi tge $1==4 | source4 source4 |
3476 allocate(REG={CONST4,0})
3486 setcc(%[a]) | %[a] | |
3487 ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tge |
3488 cmi tgt $1==4 | source4 source4 |
3489 allocate(REG={CONST4,0})
3499 setcc(%[a]) | %[a] | |
3500 ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tgt |
3501 cmi tlt and $1==4 && $3==4
3502 | source4 source4 sreg4 |
3512 erase(%[3]) | %[3] | |
3513 cmi tle and $1==4 && $3==4
3514 | source4 source4 sreg4 |
3524 erase(%[3]) | %[3] | |
3525 cmi teq and $1==4 && $3==4
3526 | source4 source4 sreg4 |
3536 erase(%[3]) | %[3] | |
3537 cmi tne and $1==4 && $3==4
3538 | source4 source4 sreg4 |
3548 erase(%[3]) | %[3] | |
3549 cmi tge and $1==4 && $3==4
3550 | source4 source4 sreg4 |
3560 erase(%[3]) | %[3] | |
3561 cmi tgt and $1==4 && $3==4
3562 | source4 source4 sreg4 |
3572 erase(%[3]) | %[3] | |
3573 cmi tlt ior $1==4 && $3==4
3574 | source4 source4 sreg4 |
3578 "bisl2\t$$1,%[3]\n1:"
3584 erase(%[3]) | %[3] | |
3585 cmi tle ior $1==4 && $3==4
3586 | source4 source4 sreg4 |
3590 "bisl2\t$$1,%[3]\n1:"
3596 erase(%[3]) | %[3] | |
3597 cmi teq ior $1==4 && $3==4
3598 | source4 source4 sreg4 |
3602 "bisl2\t$$1,%[3]\n1:"
3608 erase(%[3]) | %[3] | |
3609 cmi tne ior $1==4 && $3==4
3610 | source4 source4 sreg4 |
3614 "bisl2\t$$1,%[3]\n1:"
3620 erase(%[3]) | %[3] | |
3621 cmi tge ior $1==4 && $3==4
3622 | source4 source4 sreg4 |
3626 "bisl2\t$$1,%[3]\n1:"
3632 erase(%[3]) | %[3] | |
3633 cmi tgt ior $1==4 && $3==4
3634 | source4 source4 sreg4 |
3638 "bisl2\t$$1,%[3]\n1:"
3644 erase(%[3]) | %[3] | |
3646 cmf tlt $1==4 | source4 source4 |
3647 allocate(REG={CONST1,0})
3657 setcc(%[a]) | %[a] | |
3658 cmf tle $1==4 | source4 source4 |
3659 allocate(REG={CONST1,0})
3669 setcc(%[a]) | %[a] | |
3670 cmf teq $1==4 | source4 source4 |
3671 allocate(REG={CONST1,0})
3681 setcc(%[a]) | %[a] | |
3682 cmf tne $1==4 | source4 source4 |
3683 allocate(REG={CONST1,0})
3693 setcc(%[a]) | %[a] | |
3694 cmf tge $1==4 | source4 source4 |
3695 allocate(REG={CONST1,0})
3705 setcc(%[a]) | %[a] | |
3706 cmf tgt $1==4 | source4 source4 |
3707 allocate(REG={CONST1,0})
3717 setcc(%[a]) | %[a] | |
3720 cmf tlt $1==8 | source8 source8 |
3721 allocate(%[1],%[2],REG)
3736 setcc(%[a]) | %[a] | |
3737 cmf tle $1==8 | source8 source8 |
3738 allocate(%[1],%[2],REG)
3752 setcc(%[a]) | %[a] | |
3753 cmf teq $1==8 | source8 source8 |
3754 allocate(%[1],%[2],REG)
3768 setcc(%[a]) | %[a] | |
3769 cmf tne $1==8 | source8 source8 |
3770 allocate(%[1],%[2],REG)
3784 setcc(%[a]) | %[a] | |
3785 cmf tge $1==8 | source8 source8 |
3786 allocate(%[1],%[2],REG)
3800 setcc(%[a]) | %[a] | |
3801 cmf tgt $1==8 | source8 source8 |
3802 allocate(%[1],%[2],REG)
3816 setcc(%[a]) | %[a] | |
3818 /* Remember that cmu was replaced by cmp. */
3819 cmp tlt | source4 source4 |
3820 allocate(REG={CONST1,0})
3830 setcc(%[a]) | %[a] | |
3831 ... | NC source1 source1 |
3832 allocate(REG={CONST1,0})
3842 setcc(%[a]) | %[a] | |
3843 ... | NC source2 source2 |
3844 allocate(REG={CONST1,0})
3854 setcc(%[a]) | %[a] | |
3855 cmp tle | source4 source4 |
3856 allocate(REG={CONST1,0})
3866 setcc(%[a]) | %[a] | |
3867 ... | NC source1 source1 |
3868 allocate(REG={CONST1,0})
3878 setcc(%[a]) | %[a] | |
3879 ... | NC source2 source2 |
3880 allocate(REG={CONST1,0})
3890 setcc(%[a]) | %[a] | |
3891 cmp teq | source4 source4 |
3892 allocate(REG={CONST1,0})
3902 setcc(%[a]) | %[a] | |
3903 ... | NC source1 source1 |
3904 allocate(REG={CONST1,0})
3914 setcc(%[a]) | %[a] | |
3915 ... | NC source2 source2 |
3916 allocate(REG={CONST1,0})
3926 setcc(%[a]) | %[a] | |
3927 cmp tne | source4 source4 |
3928 allocate(REG={CONST1,0})
3938 setcc(%[a]) | %[a] | |
3939 ... | NC source1 source1 |
3940 allocate(REG={CONST1,0})
3950 setcc(%[a]) | %[a] | |
3951 ... | NC source2 source2 |
3952 allocate(REG={CONST1,0})
3962 setcc(%[a]) | %[a] | |
3963 cmp tge | source4 source4 |
3964 allocate(REG={CONST1,0})
3974 setcc(%[a]) | %[a] | |
3975 ... | NC source1 source1 |
3976 allocate(REG={CONST1,0})
3986 setcc(%[a]) | %[a] | |
3987 ... | NC source2 source2 |
3988 allocate(REG={CONST1,0})
3998 setcc(%[a]) | %[a] | |
3999 cmp tgt | source4 source4 |
4000 allocate(REG={CONST1,0})
4010 setcc(%[a]) | %[a] | |
4011 ... | NC source1 source1 |
4012 allocate(REG={CONST1,0})
4022 setcc(%[a]) | %[a] | |
4023 ... | NC source2 source2 |
4024 allocate(REG={CONST1,0})
4034 setcc(%[a]) | %[a] | |
4036 | source4 source4 sreg4 |
4046 erase(%[3]) | %[3] | |
4048 | source4 source4 sreg4 |
4058 erase(%[3]) | %[3] | |
4060 | source4 source4 sreg4 |
4064 "bisl2\t$$1,%[3]\n1:"
4070 erase(%[3]) | %[3] | |
4072 | source4 source4 sreg4 |
4076 "bisl2\t$$1,%[3]\n1:"
4082 erase(%[3]) | %[3] | |
4083 cms teq $1==4 | | | | cmp teq |
4084 cms tne $1==4 | | | | cmp tne |
4086 /****************************************
4087 * Group 13 : Branch instructions *
4088 ****************************************/
4092 blt | source4 source4 STACK |
4095 ... | NC source2 source2 STACK |
4098 ... | NC source1 source1 STACK |
4101 ... | NC source4 STACK |
4107 ble | source4 source4 STACK |
4110 ... | NC source2 source2 STACK |
4113 ... | NC source1 source1 STACK |
4116 ... | NC source4 STACK |
4122 beq | source4 source4 STACK |
4125 ... | NC source2 source2 STACK |
4128 ... | NC source1 source1 STACK |
4131 ... | NC source4 STACK |
4137 bne | source4 source4 STACK |
4140 ... | NC source2 source2 STACK |
4143 ... | NC source1 source1 STACK |
4146 ... | NC source4 STACK |
4152 bge | source4 source4 STACK |
4155 ... | NC source2 source2 STACK |
4158 ... | NC source1 source1 STACK |
4161 ... | NC source4 STACK |
4167 bgt | source4 source4 STACK |
4170 ... | NC source2 source2 STACK |
4173 ... | NC source1 source1 STACK |
4176 ... | NC source4 STACK |
4182 zlt | source4 STACK |
4186 ... | NC source1or2 | | %[1] | asp 4 |
4187 zle | source4 STACK |
4191 ... | NC source1or2 | | %[1] | zeq $1 |
4192 zeq | source1or2or4 STACK |
4196 zne | source1or2or4 STACK |
4200 zge | source4 STACK |
4204 ... | NC source1or2 | | %[1] | asp 4 bra $1 |
4205 zgt | source4 STACK |
4209 ... | NC source1or2 | | %[1] | zne $1 |
4210 cmf zlt $1==4 | source4 source4 STACK |
4213 cmf zle $1==4 | source4 source4 STACK |
4216 cmf zne $1==4 | source4 source4 STACK |
4219 cmf zeq $1==4 | source4 source4 STACK |
4222 cmf zge $1==4 | source4 source4 STACK |
4225 cmf zgt $1==4 | source4 source4 STACK |
4228 cmf zlt $1==8 | source8 source8 |
4232 cmf zle $1==8 | source8 source8 |
4236 cmf zne $1==8 | source8 source8 |
4240 cmf zeq $1==8 | source8 source8 |
4244 cmf zge $1==8 | source8 source8 |
4248 cmf zgt $1==8 | source8 source8 |
4252 cmp zlt | source4 source4 STACK |
4255 ... | NC source1or2 source1or2 | | %[2] %[1] | blt $2 |
4256 cmp zle | source4 source4 STACK |
4259 ... | NC source1or2 source1or2 | | %[2] %[1] | ble $2 |
4260 cmp zne | | | | bne $2 |
4261 cmp zeq | | | | beq $2 |
4262 cmp zge | source4 source4 STACK |
4265 ... | NC source1or2 source1or2 | | %[2] %[1] | bge $2 |
4266 cmp zgt | source4 source4 STACK |
4269 ... | NC source1or2 source1or2 | | %[2] %[1] | bgt $2 |
4270 cms zeq $1==4 | | | | cmp zeq $2 |
4271 cms zne $1==4 | | | | cmp zne $2 |
4273 /************************************************
4274 * Group 14 : Procedure call instructions *
4275 ************************************************/
4277 cai asp $2%4 == 0 && $2>=0 && $2 < 1024
4280 "calls\t$$%($2/4%),(%[1])" | | |
4283 "calls\t$$0,(%[1])" | | |
4284 cal asp $2%4 == 0 && $2>=0 && $2 < 1024
4286 "calls\t$$%($2/4%),$1" | | |
4288 "calls\t$$0,$1" | | |
4289 lfr $1==4 | | | R0 | |
4290 lfr $1==8 | | | QR0 | |
4291 asp ret $2==0 | | "ret" | | |
4292 ass ret $2==0 | | "ret" | | |
4293 asp lfr ret $2==$3 | | "ret" | | |
4294 ass lfr ret $2==$3 | | "ret" | | |
4295 lfr ret $1==$2 | | "ret" | | |
4296 ret $1==0 | | "ret" | | |
4297 ret $1==4 | NC bigsource4 |
4303 ret $1==8 | NC bigsource8 |
4310 /********************************
4311 * Group 15 : Miscellaneous *
4312 ********************************/
4315 asp $1==4 | bigsource4 - regch4 | | | |
4317 asp $1==4 | NC bigsource4 | | | |
4318 #endif /* REGVARS */
4320 "tstl\t(sp)+" | | | (2,7)
4322 "addl2\t$$$1,sp" | | |
4323 asp $1==(0-4) | | | {CONST4,0} | |
4324 asp $1==(0-8) | | | {CONST8,"0"} | |
4326 "subl2\t$$%(0-$1%),sp" | | |
4327 ass $1==4 | source4 |
4329 "addl2\t%[1],sp" | | |
4330 ass !defined($1) | source4 |
4332 move(%[1],R2) /* R2 <= leave return area intact. */
4335 blm $1==4 | nonexist1 nonexist1 |
4337 "movl\t%[2],%[1]" | | |
4338 blm $1==8 | nonexist1 nonexist1 |
4340 "movq\t%[2],%[1]" | | |
4341 blm $1==12 | sreg4 sreg4 |
4343 "movl\t(%[2])+,(%[1])+"
4344 "movq\t(%[2]),(%[1])"
4345 erase(%[1]) erase(%[2]) | | |
4346 blm $1==16 | sreg4 sreg4 |
4348 "movq\t(%[2])+,(%[1])+"
4349 "movq\t(%[2]),(%[1])"
4350 erase(%[1]) erase(%[2]) | | |
4353 allocate(REG={CONST1,$1/4})
4355 "1:\nmovl\t(%[2])+,(%[1])+"
4358 "\nmovl\t(%[2])+,(%[1])+"
4361 erase(%[1]) erase(%[2]) erase(%[a])
4363 bls $1==4 | | remove(ALL)
4367 bls !defined($1) | source4 |
4374 csa !defined($1) | source4 |
4381 csb !defined($1) | source4 |
4386 dch | reg4 | | {displ4,%[1],"12"} | |
4387 dup stl $1==4 | | | | stl $2 lol $2 |
4388 dup $1==4 | dups4 | | %[1] %[1] | |
4390 dup $1==8 | bigsource8-regch8 | | %[1] %[1] | |
4392 dup $1==8 | bigsource8 | | %[1] %[1] | |
4393 #endif /* REGVARS */
4394 ... | dups4 dups4 | | %[2] %[1] %[2] %[1] | |
4396 allocate(REG,REG={CONST1,$1/4})
4397 "addl3\tsp,$$$1,%[a]"
4399 "1:\nmovl\t-(%[a]),-(sp)"
4402 "movl\t-(%[a]),-(sp)"
4406 dus $1==4 | source4 |
4409 "ashl\t$$-2,%[1],%[b]"
4410 "addl3\tsp,%[1],%[a]"
4412 "1:\nmovl\t-(%[a]),-(sp)"
4415 "movl\t-(%[a]),-(sp)"
4419 dus !defined($1) | source4 |
4424 exg $1==4 | bigsource4-regch4 bigsource4-regch4 | | %[1] %[2] | |
4425 exg $1==8 | bigsource8-regch8 bigsource8-regch8 | | %[1] %[2] | |
4426 exg defined($1) | STACK |
4427 move({CONST4,$1},R0)
4430 exg !defined($1) | source4 |
4435 fil | | "movl\t$$$1,hol0+4" | | |
4436 lim | | allocate(REG)
4437 "movl\t.trpim,%[a]" | %[a] | |
4438 lin | | "movl\t$$$1,hol0" | | |
4439 lni | | "incl\thol0" | | |
4443 lor $1==0 | | | LB | |
4446 "movl\tsp,%[a]" | %[a] | |
4447 lor $1==2 | | allocate(REG)
4448 "movl\t.reghp,%[a]" | %[a] | |
4465 rck !defined($1) | source4 |
4472 rck defined($1) | bigsource4-regch4 | | | |
4473 rck !defined($1) | bigsource4-regch4 bigsource4-regch4 | | | |
4475 rck defined($1) | bigsource4 | | | |
4476 rck !defined($1) | bigsource4 bigsource4 | | | |
4477 #endif /* REGVARS */
4486 str $1==1 | source4 |
4488 "movl\t%[1],sp" | | |
4494 /********************************
4497 * A: From source to register, *
4498 * from nonexist to source. *
4499 ********************************/
4501 | ADDR_EXTERNAL | | {DOUBLE,%[1.ind]} | |
4502 | source1 | allocate(%[1],REG=%[1]) | %[a] | |
4503 | source2 | allocate(%[1],REG=%[1]) | %[a] | |
4504 | bigsource4 | allocate(%[1],REG=%[1]) | %[a] | |
4505 | bigsource8 | allocate(%[1],QREG=%[1]) | %[a] | |
4506 | reg4 | | {adispl,%[1],"0"} | |
4507 | ADDR_LOCAL | | {adispl,%[1.reg],tostring(%[1.num])} | |
4508 | bigsource4-adispl-reg4-ADDR_LOCAL |
4509 allocate(%[1],REG=%[1]) | {adispl,%[a],"0"} | |
4511 /********************************
4512 * B: From STACK to register *
4513 ********************************/
4515 | STACK | allocate(REG)
4517 setcc(%[a]) | %[a] | | (3,7)
4518 | STACK | allocate(QREG)
4520 setcc(%[a]) | %[a] | | (3,10)
4521 | STACK | allocate(REG)
4523 setcc(%[a]) | {adispl,%[a],"0"} | | (3,7)
4529 | regdef8 | | {displ4,%[1.reg],"4"} {regdef4,%[1.reg]} | |
4530 | displ8 | | {displ4,%[1.reg],%[1.ind]+"+4"}
4531 {displ4,%[1.reg],%[1.ind]} | |
4532 | LOCAL8 | | {LOCAL4,%[1.reg],%[1.num]+4,4} {LOCAL4,%[1.reg],%[1.num],4}| |
4533 | EXTERNAL8 | | {EXTERNAL4,%[1.ind]+"+4"} {EXTERNAL4,%[1.ind]} | |
4534 | QREG | | %[1.2] %[1.1] | |
4535 | regdef4 | | {displ4,%[1.reg],"0"} | |
4536 | LOCAL4 | | {displ4,%[1.reg],tostring(%[1.num])} | |
4539 (CONST %[num]==0,source1, "clrb\t%[2]", (2,4)+%[2])
4540 (CONST %[num]==0,source2, "clrw\t%[2]", (2,4)+%[2])
4541 (CONST %[num]==0,source4, "clrl\t%[2]"
4542 setcc(%[2]), (2,4)+%[2])
4543 (CONST %[num]<0 && ufit(0-%[num],6),source2,
4544 "mnegw\t$$%(0-%[1.num]%),%[2]"
4545 setcc(%[2]), (2,4)+%[2])
4546 (CONST ufit(%[num],8) && !ufit(%[num],6),source2,
4548 setcc(%[2]), (2,4)+%[2])
4549 (CONST sfit(%[num],8) && !ufit(%[num],6),source2,
4551 setcc(%[2]), (2,4)+%[2])
4552 (CONST %[num]<0 && ufit(0-%[num],6),source4,
4553 "mnegl\t$$%(0-%[1.num]%),%[2]"
4554 setcc(%[2]), (2,4)+%[2])
4555 (CONST ufit(%[num],8) && !ufit(%[num],6),source4,
4557 setcc(%[2]), (2,4)+%[2])
4558 (CONST sfit(%[num],8) && !ufit(%[num],6),source4,
4560 setcc(%[2]), (2,4)+%[2])
4561 (CONST ufit(%[num],16) && !ufit(%[num],6),source4,
4563 setcc(%[2]), (2,4)+%[2])
4564 (CONST sfit(%[num],16) && !ufit(%[num],6),source4,
4566 setcc(%[2]), (2,4)+%[2])
4567 (CONST8 %[ind]=="0",source8, "clrq\t%[2]"
4568 setcc(%[2]), (2,4)+%[2])
4570 /* Tokens with side effects should not be remembered. */
4571 (reginc1+regdec1,reg4, "movzbl\t%[1],%[2]"
4572 setcc(%[2]) erase(%[2]),(3,4)+%[1])
4573 (reginc2+regdec2,reg4, "movzwl\t%[1],%[2]"
4574 setcc(%[2]) erase(%[2]),(3,4)+%[1])
4575 (reginc4+regdec4,reg4, "movl\t%[1],%[2]"
4576 setcc(%[2]) erase(%[2]),(3,4)+%[1])
4577 (reginc8+regdec8,reg8, "movq\t%[1],%[2]"
4578 setcc(%[2]) erase(%[2]),(3,7)+%[1])
4579 #endif /* REGVARS */
4580 (source8,source8, "movq\t%[1],%[2]"
4581 setcc(%[2]), (3,4)+%[1]+%[2])
4582 (source4,source4, "movl\t%[1],%[2]"
4583 setcc(%[2]), (3,4)+%[1]+%[2])
4584 (source2,source2, "movw\t%[1],%[2]"
4585 setcc(%[2]), (3,4)+%[1]+%[2])
4586 (source1,source1, "movb\t%[1],%[2]"
4587 setcc(%[2]), (3,4)+%[1]+%[2])
4588 (source1, reg4, "movzbl\t%[1],%[2]"
4589 setcc(%[2]) erase(%[2]),(3,4)+%[1])
4590 (source2, reg4, "movzwl\t%[1],%[2]"
4591 setcc(%[2]) erase(%[2]),(3,4)+%[1])
4592 (reg4, source1, "cvtlb\t%[1],%[2]"
4593 setcc(%[2]) erase(%[1]),(3,4)+%[2])
4594 (reg4, source2, "cvtlw\t%[1],%[2]"
4595 setcc(%[2]) erase(%[1]),(3,4)+%[2])
4596 (source1,source2, "movzbw\t%[1],%[2]"
4597 setcc(%[2]), (3,4)+%[1]+%[2])
4598 (source1,source4, "movzbl\t%[1],%[2]"
4599 setcc(%[2]), (3,4)+%[1]+%[2])
4600 (source2,source4, "movzwl\t%[1],%[2]"
4601 setcc(%[2]), (3,4)+%[1]+%[2])
4602 (source2,source1, "cvtwb\t%[1],%[2]"
4603 setcc(%[2]), (3,4)+%[1]+%[2])
4604 (source4,source1, "cvtlb\t%[1],%[2]"
4605 setcc(%[2]), (3,4)+%[1]+%[2])
4606 (source4,source2, "cvtlw\t%[1],%[2]"
4607 setcc(%[2]), (3,4)+%[1]+%[2])
4608 (aind1,source4, "movab\t%[1],%[2]"
4609 setcc(%[2]), (3,4)+%[1]+%[2])
4610 (aind2,source4, "movaw\t%[1],%[2]"
4611 setcc(%[2]), (3,4)+%[1]+%[2])
4612 (aind4,source4, "moval\t%[1],%[2]"
4613 setcc(%[2]), (3,4)+%[1]+%[2])
4614 (aind8,source4, "movaq\t%[1],%[2]"
4615 setcc(%[2]), (3,4)+%[1]+%[2])
4616 (nonexist1,source4, "movab\t%[1],%[2]"
4617 setcc(%[2]), (3,4)+%[1]+%[2])
4619 (source1, "tstb\t%[1]" ,(2,4) + %[1])
4620 (source2, "tstw\t%[1]" ,(2,4) + %[1])
4621 (source4, "tstl\t%[1]" ,(2,4) + %[1])
4626 "clrl\t-(sp)", (2,7))
4627 (CONST %[num]<0 && ufit(0-%[num],6),,
4628 "mnegl\t$$%(0-%[1.num]%),-(sp)",
4630 (CONST ufit(%[num],6),,
4631 "pushl\t%[1]", (2,7) + %[1])
4632 (CONST8 %[ind]=="0",,
4633 "clrq\t-(sp)", (2,10))
4634 (CONST sfit(%[num],8),,
4635 "cvtbl\t%[1],-(sp)", (3,7) + %[1])
4636 (source1,, "movzbl\t%[1],-(sp)", (3,7) + %[1])
4637 (CONST sfit(%[num],16),,
4638 "cvtwl\t%[1],-(sp)", (3,7) + %[1])
4639 (source2,, "movzwl\t%[1],-(sp)", (3,7) + %[1])
4640 (source4,, "pushl\t%[1]"
4641 setcc(%[1]), (2,7) + %[1])
4642 (source8,, "movq\t%[1],-(sp)"
4643 setcc(%[1]), (3,10)+ %[1])
4644 (nonexist1,, "pushal\t%[1]", (2,7) + %[1])
4645 (aind1,, "pushab\t%[1]", (2,7) + %[1])
4646 (aind2,, "pushaw\t%[1]", (2,7) + %[1])
4647 (aind4,, "pushal\t%[1]", (2,7) + %[1])
4648 (aind8,, "pushaq\t%[1]", (2,7) + %[1])