"$Header$" #define LOCLABS /* define if target assembler recognizes local labels */ #define REGVARS /* define for register variables */ #define DORCK /* define if you want RCK */ #define FLOAT4 /* define if you want better 4-byte FP arithmetic */ #define FLOAT8 /* define if you want better 8-byte FP arithmetic */ /* #define ASBUG_AVOID /* define if you want to avoid a bug in the BSD 4.1 VAX assembler, that sometimes generates "*1" for (r1). This is avoided by generating 0(r1), which is optimized by the assembler to (r1). */ #ifdef ASBUG_AVOID #define REGDEFFORMAT "0(%[reg])" #else #define REGDEFFORMAT "(%[reg])" #endif #define NC nocoercions : #define BSIZE 4 EM_PSIZE = 4 EM_WSIZE = 4 EM_BSIZE = BSIZE /**************************************************************** * VAX 11 Back end table. * * Author : Ceriel J.H. Jacobs, Duk Bekema * * * * Wordsize = 4 bytes * * Pointersize = 4 bytes * * * * There is hardly any instruction timing information available * * for the DEC-VAX machines. Timing of addressing modes was done* * by counting the memory references and multiplying them by * * 3. 300 nanosec seems to be a typical memory reference time.* * However, the VAX can be much faster, if the "cache hit rate" * * is high. * * Assumed hardware : VAX-11/7?0 with Floating Point Acc. * ****************************************************************/ REGISTERS: AP = ("ap",4),ArgumentPointer. LB = ("fp",4),LocaLBase. R0 = ("r0",4),REG. R1 = ("r1",4),REG. R2 = ("r2",4),REG. R3 = ("r3",4),REG. #ifdef REGVARS R4 = ("r4",4) regvar,RREG. R5 = ("r5",4) regvar,RREG. R6 = ("r6",4) regvar,RREG. R7 = ("r7",4) regvar,RREG. R8 = ("r8",4) regvar,RREG. R9 = ("r9",4) regvar,RREG. RA = ("r10",4) regvar,RREG. RB = ("r11",4) regvar,RREG. #else REGVARS R4 = ("r4",4),REG. R5 = ("r5",4),REG. R6 = ("r6",4),REG. R7 = ("r7",4),REG. R8 = ("r8",4),REG. R9 = ("r9",4),REG. RA = ("r10",4),REG. RB = ("r11",4),REG. #endif REGVARS QR0 = ("r0",8,R0,R1),QREG. QR2 = ("r2",8,R2,R3),QREG. #ifndef REGVARS QR4 = ("r4",8,R4,R5),QREG. QR6 = ("r6",8,R6,R7),QREG. QR8 = ("r8",8,R8,R9),QREG. QRA = ("r10",8,RA,RB),QREG. #endif REGVARS QR1 = ("r1",8,R1,R2),QREG. #ifndef REGVARS QR3 = ("r3",8,R3,R4),QREG. QR5 = ("r5",8,R5,R6),QREG. QR7 = ("r7",8,R7,R8),QREG. QR9 = ("r9",8,R9,RA),QREG. #endif REGVARS TOKENS: /* First some EM machine tokens */ CONST1 = {INT num;} 4 cost=(4,3) "$%[num]" CONST2 = {INT num;} 4 cost=(4,3) "$%[num]" CONST4 = {INT num;} 4 cost=(4,3) "$%[num]" CONST8 = {STRING ind;} 8 cost=(8,6) "$%[ind]" LOCAL1 = {REGISTER reg; INT num,size;} 4 cost=(2,6) "%[num](%[reg])" LOCAL2 = {REGISTER reg; INT num,size;} 4 cost=(2,6) "%[num](%[reg])" LOCAL4 = {REGISTER reg; INT num,size;} 4 cost=(2,6) "%[num](%[reg])" LOCAL8 = {REGISTER reg; INT num,size;} 8 cost=(2,9) "%[num](%[reg])" ADDR_LOCAL = {REGISTER reg; INT num;} 4 cost=(2,6) "%[num](%[reg])" ADDR_EXTERNAL = {STRING ind;} 4 cost=(4,6) "%[ind]" EXTERNAL1 = {STRING ind;} 4 cost=(4,6) "%[ind]" EXTERNAL2 = {STRING ind;} 4 cost=(4,6) "%[ind]" EXTERNAL4 = {STRING ind;} 4 cost=(4,6) "%[ind]" EXTERNAL8 = {STRING ind;} 8 cost=(4,9) "%[ind]" DOUBLE = {STRING ind;} 4 cost=(4,6) "$%[ind]" /* Now tokens for the target machine */ regdef1 = {REGISTER reg;} 4 cost=(0,3) REGDEFFORMAT regdef2 = {REGISTER reg;} 4 cost=(0,3) REGDEFFORMAT regdef4 = {REGISTER reg;} 4 cost=(0,3) REGDEFFORMAT regdef8 = {REGISTER reg;} 8 cost=(0,6) REGDEFFORMAT #ifdef REGVARS reginc1 = {REGISTER reg;} 4 cost=(0,3) "(%[reg])+" reginc2 = {REGISTER reg;} 4 cost=(0,3) "(%[reg])+" reginc4 = {REGISTER reg;} 4 cost=(0,3) "(%[reg])+" reginc8 = {REGISTER reg;} 8 cost=(0,6) "(%[reg])+" regdec1 = {REGISTER reg;} 4 cost=(0,3) "-(%[reg])" regdec2 = {REGISTER reg;} 4 cost=(0,3) "-(%[reg])" regdec4 = {REGISTER reg;} 4 cost=(0,3) "-(%[reg])" regdec8 = {REGISTER reg;} 8 cost=(0,6) "-(%[reg])" #endif REGVARS displ1 = {REGISTER reg; STRING ind;} 4 cost=(2,6) "%[ind](%[reg])" displ2 = {REGISTER reg; STRING ind;} 4 cost=(2,6) "%[ind](%[reg])" displ4 = {REGISTER reg; STRING ind;} 4 cost=(2,6) "%[ind](%[reg])" displ8 = {REGISTER reg; STRING ind;} 8 cost=(2,9) "%[ind](%[reg])" displdef1 = {REGISTER reg; STRING ind;} 4 cost=(2,9) "*%[ind](%[reg])" displdef2 = {REGISTER reg; STRING ind;} 4 cost=(2,9) "*%[ind](%[reg])" displdef4 = {REGISTER reg; STRING ind;} 4 cost=(2,9) "*%[ind](%[reg])" displdef8 = {REGISTER reg; STRING ind;} 8 cost=(2,12) "*%[ind](%[reg])" reldef1 = {STRING ind;} 4 cost=(4,9) "*%[ind]" reldef2 = {STRING ind;} 4 cost=(4,9) "*%[ind]" reldef4 = {STRING ind;} 4 cost=(4,9) "*%[ind]" reldef8 = {STRING ind;} 8 cost=(4,12) "*%[ind]" extind2 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]" extind4 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]" extind8 = {REGISTER ireg; STRING ind; } 8 cost=(5,13) "%[ind] [%[ireg]]" displind1 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10) "%[ind](%[reg]) [%[ireg]]" displind2 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10) "%[ind](%[reg]) [%[ireg]]" displind4 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10) "%[ind](%[reg]) [%[ireg]]" displind8 = {REGISTER ireg,reg; STRING ind;} 8 cost=(3,13) "%[ind](%[reg]) [%[ireg]]" extdefind1 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]" extdefind2 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]" extdefind4 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]" extdefind8 = {REGISTER ireg; STRING ind; } 8 cost=(5,16) "*%[ind] [%[ireg]]" displdefind1 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13) "*%[ind](%[reg]) [%[ireg]]" displdefind2 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13) "*%[ind](%[reg]) [%[ireg]]" displdefind4 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13) "*%[ind](%[reg]) [%[ireg]]" displdefind8 = {REGISTER ireg,reg; STRING ind;} 8 cost=(3,16) "*%[ind](%[reg]) [%[ireg]]" /* Not really addressable modes */ adispl = {REGISTER reg; STRING ind; } 4 cost=(4,6) "%[ind](%[reg])" aextind2 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]" aextind4 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]" aextind8 = {REGISTER ireg; STRING ind; } 4 cost=(5,10) "%[ind] [%[ireg]]" adisplind1 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10) "%[ind](%[reg]) [%[ireg]]" adisplind2 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10) "%[ind](%[reg]) [%[ireg]]" adisplind4 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10) "%[ind](%[reg]) [%[ireg]]" adisplind8 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,10) "%[ind](%[reg]) [%[ireg]]" aextdefind1 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]" aextdefind2 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]" aextdefind4 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]" aextdefind8 = {REGISTER ireg; STRING ind; } 4 cost=(5,13) "*%[ind] [%[ireg]]" adispldefind1 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13) "*%[ind](%[reg]) [%[ireg]]" adispldefind2 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13) "*%[ind](%[reg]) [%[ireg]]" adispldefind4 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13) "*%[ind](%[reg]) [%[ireg]]" adispldefind8 = {REGISTER ireg,reg; STRING ind;} 4 cost=(3,13) "*%[ind](%[reg]) [%[ireg]]" TOKENEXPRESSIONS: CONST = CONST1 + CONST2 + CONST4 ind2 = extind2 + displind2 + extdefind2 + displdefind2 ind4 = extind4 + displind4 + extdefind4 + displdefind4 Xsource1 = regdef1 + displ1 + displdef1 + EXTERNAL1 + reldef1 + CONST1 + LOCAL1 + displind1 + extdefind1 + displdefind1 source1 = Xsource1 #ifdef REGVARS + reginc1 + regdec1 #endif REGVARS Xsource2 = regdef2 + displ2 + displdef2 + EXTERNAL2 + reldef2 + CONST2 + LOCAL2 + ind2 source2 = Xsource2 #ifdef REGVARS + reginc2 + regdec2 #endif REGVARS Xsource4 = REG + regdef4 + displ4 + displdef4 + LocaLBase + EXTERNAL4 + reldef4 + CONST + DOUBLE + LOCAL4 + ind4 source4 = Xsource4 #ifdef REGVARS + RREG + reginc4 + regdec4 #endif REGVARS dups4 = CONST + regdef1 + displ1 + LOCAL1 + REG + regdef2 + displ2 + LOCAL2 + RREG + regdef4 + displ4 + LOCAL4 + DOUBLE Xsource8 = QREG + regdef8 + displ8 + displdef8 + EXTERNAL8 + reldef8 + CONST8 + LOCAL8 + extind8 + displind8 + extdefind8 + displdefind8 source8 = Xsource8 #ifdef REGVARS + reginc8 + regdec8 #endif REGVARS source1or2 = source1 + source2 - ind2 source1or2or4 = source1or2 + source4 - (ind2 + ind4) source2or4 = source2 + source4 - ind4 nonexist1 = adispl + ADDR_EXTERNAL + ADDR_LOCAL aextind = aextind2 + aextind4 + aextind8 adisplind = adisplind1 + adisplind2 + adisplind4 + adisplind8 aextdefind = aextdefind1 + aextdefind2 + aextdefind4 + aextdefind8 adispldefind = adispldefind1 + adispldefind2 + adispldefind4 + adispldefind8 aind1 = adisplind1 + aextdefind1 + adispldefind1 aind2 = aextind2 + adisplind2 + aextdefind2 + adispldefind2 aind4 = aextind4 + adisplind4 + aextdefind4 + adispldefind4 aind8 = aextind8 + adisplind8 + aextdefind8 + adispldefind8 aind = aind1 + aind2 + aind4 + aind8 nonexist = nonexist1 + aind #ifdef REGVARS regch4 = reginc1 + regdec1 + reginc2 + regdec2 + reginc4 + regdec4 regch8 = reginc8 + regdec8 regch = regch4 + regch8 #endif REGVARS displs = displ1 + displ2 + displ4 + displ8 + regdef1 + regdef2 + regdef4 + regdef8 #ifdef REGVARS + regch #endif REGVARS displdefs = displdef1 + displdef2 + displdef4 + displdef8 EXTERNALS = EXTERNAL1 + EXTERNAL2 + EXTERNAL4 + EXTERNAL8 LOCALS = LOCAL1 + LOCAL2 + LOCAL4 + LOCAL8 reldefs = reldef1 + reldef2 + reldef4 + reldef8 displinds = displind1 + displind2 + displind4 + displind8 extinds = extind2 + extind4 + extind8 displdefinds = displdefind1 + displdefind2 + displdefind4 + displdefind8 extdefinds = extdefind1 + extdefind2 + extdefind4 + extdefind8 displaced = displs + displdefs + reldefs + displinds + displdefinds + extdefinds externals = EXTERNALS + displaced + extinds extandloc = externals + LOCALS #ifdef REGVARS reg4 = REG + RREG + LocaLBase reg8 = QREG #else REGVARS reg4 = REG reg8 = QREG #endif REGVARS sreg4 = REG * SCRATCH sreg8 = QREG * SCRATCH bigsource4 = source1or2or4 + nonexist + ind2 + ind4 bigsource8 = source8 all = bigsource4 + bigsource8 scr = ALL - (EXTERNALS + LOCALS + ADDR_LOCAL + ADDR_EXTERNAL + CONST + DOUBLE) #ifdef REGVARS #define REMEXTANDLOC remove(externals) remove(LOCALS,inreg(%[num])==0) #define REMREG(x) remove(regch,%[reg]==regvar(x)) #else REGVARS #define REMEXTANDLOC remove(extandloc) #endif REGVARS CODE: /******************************** * Group 1 : Load instructions * ********************************/ loc $1>=0 && $1<256 | | | {CONST1,$1} | | loc $1>=256 && $1<65536 | | | {CONST2,$1} | | loc | | | {CONST4,$1} | | ldc | | | {CONST8,$1} | | #ifdef REGVARS lol inreg($1)==2 | | REMREG($1) | regvar($1) | | #endif REGVARS lol $1 < 0 | | | {LOCAL4,LB,$1,4} | | lol $1 >= 0 | | | {LOCAL4,AP,$1,4} | | loe | | | {EXTERNAL4,$1} | | #ifdef REGVARS lil inreg($1)==2 | | REMREG($1) | {regdef4,regvar($1)} | | #endif REGVARS lil $1 < 0 | | | {displdef4,LB,tostring($1)} | | lil $1 >= 0 | | | {displdef4,AP,tostring($1)} | | lof | | | | adp $1 loi 4 | lal $1 < 0 | | | {ADDR_LOCAL,LB,$1} | | lal $1 >= 0 | | | {ADDR_LOCAL,AP,$1} | | lae | | | {ADDR_EXTERNAL,$1} | | lxl $1==0 | | | LB | | lxl $1==1 | | | {LOCAL4,AP,BSIZE,4} | | lxl $1 > 1 | | remove(scr) move({CONST4,$1},R0) "jsb\t.lxl" erase(R0) | R0 | | lxa $1==0 | | | {ADDR_LOCAL,AP,BSIZE} | | lxa $1==1 | | | {LOCAL4,AP,BSIZE,4} | lpb | lxa $1 > 1 | | remove(scr) move({CONST4,$1},R0) "jsb\t.lxa" erase(R0) | R0 | | loi $1==1 | NC adispl | | {displ1,%[1.reg],%[1.ind]} | | ... | NC ADDR_LOCAL | | {LOCAL1,%[1.reg],%[1.num],1} | | ... | NC LOCAL4 | | {displdef1,%[1.reg],tostring(%[1.num])} | | ... | NC regdef4 | | {displdef1,%[1.reg],"0"} | | ... | NC displ4 | | {displdef1,%[1.reg],%[1.ind]} | | ... | NC ADDR_EXTERNAL | | {EXTERNAL1,%[1.ind]} | | ... | NC EXTERNAL4 | | {reldef1,%[1.ind]} | | ... | NC adisplind1 | | {displind1,%[1.ireg],%[1.reg],%[1.ind]} | | ... | NC aextdefind1 | | {extdefind1,%[1.ireg],%[1.ind]} | | ... | NC adispldefind1 | | {displdefind1,%[1.ireg],%[1.reg],%[1.ind]} | | ... | reg4 | | {regdef1,%[1]} | | loi $1==2 | NC adispl | | {displ2,%[1.reg],%[1.ind]} | | ... | NC ADDR_LOCAL | | {LOCAL2,%[1.reg],%[1.num],2} | | ... | NC LOCAL4 | | {displdef2,%[1.reg],tostring(%[1.num])} | | ... | NC regdef4 | | {displdef2,%[1.reg],"0"} | | ... | NC displ4 | | {displdef2,%[1.reg],%[1.ind]} | | ... | NC ADDR_EXTERNAL | | {EXTERNAL2,%[1.ind]} | | ... | NC EXTERNAL4 | | {reldef2,%[1.ind]} | | ... | NC aextind2 | | {extind2,%[1.ireg],%[1.ind]} | | ... | NC adisplind2 | | {displind2,%[1.ireg],%[1.reg],%[1.ind]} | | ... | NC aextdefind2 | | {extdefind2,%[1.ireg],%[1.ind]} | | ... | NC adispldefind2 | | {displdefind2,%[1.ireg],%[1.reg],%[1.ind]} | | ... | reg4 | | {regdef2,%[1]} | | loi $1==4 | NC adispl | | {displ4,%[1.reg],%[1.ind]} | | ... | NC ADDR_LOCAL | | {LOCAL4,%[1.reg],%[1.num],4} | | ... | NC LOCAL4 | | {displdef4,%[1.reg],tostring(%[1.num])} | | ... | NC regdef4 | | {displdef4,%[1.reg],"0"} | | ... | NC displ4 | | {displdef4,%[1.reg],%[1.ind]} | | ... | NC ADDR_EXTERNAL | | {EXTERNAL4,%[1.ind]} | | ... | NC EXTERNAL4 | | {reldef4,%[1.ind]} | | ... | NC aextind4 | | {extind4,%[1.ireg],%[1.ind]} | | ... | NC adisplind4 | | {displind4,%[1.ireg],%[1.reg],%[1.ind]} | | ... | NC aextdefind4 | | {extdefind4,%[1.ireg],%[1.ind]} | | ... | NC adispldefind4 | | {displdefind4,%[1.ireg],%[1.reg],%[1.ind]} | | ... | reg4 | | {regdef4,%[1]} | | loi $1==8 | NC adispl | | {displ8,%[1.reg],%[1.ind]} | | ... | NC ADDR_LOCAL | | {LOCAL8,%[1.reg],%[1.num],8} | | ... | NC LOCAL4 | | {displdef8,%[1.reg],tostring(%[1.num])} | | ... | NC regdef4 | | {displdef8,%[1.reg],"0"} | | ... | NC displ4 | | {displdef8,%[1.reg],%[1.ind]} | | ... | NC ADDR_EXTERNAL | | {EXTERNAL8,%[1.ind]} | | ... | NC EXTERNAL4 | | {reldef8,%[1.ind]} | | ... | NC aextind8 | | {extind8,%[1.ireg],%[1.ind]} | | ... | NC adisplind8 | | {displind8,%[1.ireg],%[1.reg],%[1.ind]} | | ... | NC aextdefind8 | | {extdefind8,%[1.ireg],%[1.ind]} | | ... | NC adispldefind8 | | {displdefind8,%[1.ireg],%[1.reg],%[1.ind]} | | ... | reg4 | | {regdef8,%[1]} | | loi $1>8 && $1<=16 | NC ADDR_EXTERNAL | | {EXTERNAL8,%[1.ind]+"+"+tostring($1-8)} %[1] | loi $1-8 | ... | NC ADDR_LOCAL | | {LOCAL8,%[1.reg],%[1.num]+$1-8,8} %[1] | loi $1-8 | ... | reg4 | | {displ8,%[1],tostring($1-8)} %[1] | loi $1-8 | loi | sreg4 | remove(ALL) allocate(REG={CONST4,$1/4}) "addl2\t$$$1,%[1]" #ifdef LOCLABS "1:\nmovl\t-(%[1]),-(sp)" "sobgtr\t%[a],1b" #else "movl\t-(%[1]),-(sp)" "sobgtr\t%[a],.-3" #endif erase(%[a]) | | | los $1==4 | STACK | move({CONST1,4},R0) "jsb\t.los" erase(R0) | | | los !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.los" erase(R0) | | | ldl $1<0 | | | {LOCAL8,LB,$1,8} | | ldl $1>=0 | | | {LOCAL8,AP,$1,8} | | lde | | | {EXTERNAL8,$1} | | ldf | | | | adp $1 loi 8 | lpi | | | {ADDR_EXTERNAL,$1} | | /******************************** * Group 2 : Store instructions * ********************************/ #ifdef REGVARS stl inreg($1)==2 | NC bigsource4 | remove(regvar($1)) move(%[1],regvar($1)) | | | ... | STACK | "movl\t(sp)+,%(regvar($1)%)" | | | (3,7) #endif REGVARS stl $1 < 0 | NC bigsource4 | remove(displaced) remove(LOCALS,%[num] <= $1+3 && %[num]+%[size] > $1) move(%[1],{LOCAL4,LB,$1,4}) | | | ... | STACK | "movl\t(sp)+,$1(fp)" | | | (5,14) stl $1 >= 0 | NC bigsource4 | remove(displaced) remove(LOCALS,%[num] <= $1+3 && %[num]+%[size] > $1) move(%[1],{LOCAL4,AP,$1,4}) | | | ... | STACK | "movl\t(sp)+,$1(ap)" | | | (5,14) ste | NC bigsource4 | remove(externals) move(%[1],{EXTERNAL4,$1}) | | | ... | STACK | "movl\t(sp)+,$1" | | | (7,14) #ifdef REGVARS sil inreg($1)==2 | NC bigsource4 | REMEXTANDLOC move(%[1],{regdef4,regvar($1)}) | | | ... | STACK | "movl\t(sp)+,(%(regvar($1)%))" | | | (3,10) #endif REGVARS sil $1 < 0 | NC bigsource4 | REMEXTANDLOC move(%[1],{displdef4,LB,tostring($1)}) | | | ... | STACK | "movl\t(sp)+,*$1(fp)" | | | (5,17) sil $1 >= 0 | NC bigsource4 | REMEXTANDLOC move(%[1],{displdef4,AP,tostring($1)}) | | | ... | STACK | "movl\t(sp)+,*$1(ap)" | | | (5,17) stf | | | | adp $1 sti 4 | /*** C-problem: f(c) char c; { write(1,&c,1); } You don't know where the character is put in the word, so the CEM-compiler generates: (shorts analogously) ***/ lol lal sti $1==$2 && $3<4 | | | | | /************************************************/ sti $1==1 | NC adispl source1or2or4 | REMEXTANDLOC move(%[2],{displ1,%[1.reg],%[1.ind]}) | | | ... | NC ADDR_LOCAL source1or2or4 | remove(displaced) remove(LOCALS, %[num]<=%[1.num] && %[num]+%[size]>%[1.num]) move(%[2],{LOCAL1,%[1.reg],%[1.num],1}) | | | ... | NC displ4 source1or2or4 | REMEXTANDLOC move(%[2],{displdef1,%[1.reg],%[1.ind]}) | | | ... | NC ADDR_EXTERNAL source1or2or4 | remove(externals) move(%[2],{EXTERNAL1,%[1.ind]}) | | | ... | NC EXTERNAL4 source1or2or4 | REMEXTANDLOC move(%[2],{reldef1,%[1.ind]}) | | | ... | NC adisplind1 source1or2or4 | REMEXTANDLOC move(%[2],{displind1,%[1.ireg],%[1.reg],%[1.ind]}) | | | ... | NC aextdefind1 source1or2or4 | REMEXTANDLOC move(%[2],{extdefind1,%[1.ireg],%[1.ind]}) | | | ... | NC adispldefind1 source1or2or4 | REMEXTANDLOC move(%[2],{displdefind1,%[1.ireg],%[1.reg],%[1.ind]}) | | | ... | reg4 source1or2or4 | REMEXTANDLOC move(%[2],{regdef1,%[1]}) | | | ... | NC nonexist1+aind1 STACK | "cvtlb\t(sp)+,%[1]" | | | (3,7)+%[1] sti $1==2 | NC adispl source1or2or4 | REMEXTANDLOC move(%[2],{displ2,%[1.reg],%[1.ind]}) | | | ... | NC ADDR_LOCAL source1or2or4 | remove(displaced) remove(LOCALS, %[num]<=%[1.num] && %[num]+%[size]>%[1.num]) move(%[2],{LOCAL2,%[1.reg],%[1.num],2}) | | | ... | NC displ4 source1or2or4 | REMEXTANDLOC move(%[2],{displdef2,%[1.reg],%[1.ind]}) | | | ... | NC ADDR_EXTERNAL source1or2or4 | remove(externals) move(%[2],{EXTERNAL2,%[1.ind]}) | | | ... | NC EXTERNAL4 source1or2or4 | REMEXTANDLOC move(%[2],{reldef2,%[1.ind]}) | | | ... | NC aextind2 source1or2or4 | remove(externals) move(%[2],{extind2,%[1.ireg],%[1.ind]}) | | | ... | NC adisplind2 source1or2or4 | REMEXTANDLOC move(%[2],{displind2,%[1.ireg],%[1.reg],%[1.ind]}) | | | ... | NC aextdefind2 source1or2or4 | REMEXTANDLOC move(%[2],{extdefind2,%[1.ireg],%[1.ind]}) | | | ... | NC adispldefind2 source1or2or4 | REMEXTANDLOC move(%[2],{displdefind2,%[1.ireg],%[1.reg],%[1.ind]}) | | | ... | reg4 source1or2or4 | REMEXTANDLOC move(%[2],{regdef2,%[1]}) | | | sti $1==4 | NC adispl bigsource4 | REMEXTANDLOC move(%[2],{displ4,%[1.reg],%[1.ind]}) | | | ... | NC ADDR_LOCAL | | | stl %[1.num] | ... | NC ADDR_EXTERNAL | | | ste %[1.ind] | ... | NC LOCAL4 bigsource4 | REMEXTANDLOC move(%[2],{displdef4,%[1.reg],tostring(%[1.num])}) | | | ... | NC regdef4 bigsource4 | REMEXTANDLOC move(%[2],{displdef4,%[1.reg],"0"}) | | | ... | NC displ4 bigsource4 | REMEXTANDLOC move(%[2],{displdef4,%[1.reg],%[1.ind]}) | | | ... | NC EXTERNAL4 bigsource4 | REMEXTANDLOC move(%[2],{reldef4,%[1.ind]}) | | | ... | NC aextind4 bigsource4 | remove(externals) move(%[2],{extind4,%[1.ireg],%[1.ind]}) | | | ... | NC adisplind4 bigsource4 | REMEXTANDLOC move(%[2],{displind4,%[1.ireg],%[1.reg],%[1.ind]}) | | | ... | NC aextdefind4 bigsource4 | REMEXTANDLOC move(%[2],{extdefind4,%[1.ireg],%[1.ind]}) | | | ... | NC adispldefind4 bigsource4 | REMEXTANDLOC move(%[2],{displdefind4,%[1.ireg],%[1.reg],%[1.ind]}) | | | ... | NC nonexist1+aind4 STACK | "movl\t(sp)+,%[1]" | | | (3,7)+%[1] ... | reg4 bigsource4 | REMEXTANDLOC move(%[2],{regdef4,%[1]}) | | | ... | reg4 STACK | "movl\t(sp)+,(%[1])" | | | (3,10) sti $1==8 | NC adispl bigsource8 | REMEXTANDLOC move(%[2],{displ8,%[1.reg],%[1.ind]}) | | | ... | NC ADDR_LOCAL | | | sdl %[1.num] | ... | NC ADDR_EXTERNAL | | | sde %[1.ind] | ... | NC displ4 bigsource8 | REMEXTANDLOC move(%[2],{displdef8,%[1.reg],%[1.ind]}) | | | ... | NC LOCAL4 bigsource8 | REMEXTANDLOC move(%[2],{displdef8,%[1.reg],tostring(%[1.num])}) | | | ... | NC regdef4 bigsource8 | REMEXTANDLOC move(%[2],{displdef8,%[1.reg],"0"}) | | | ... | NC EXTERNAL4 bigsource8 | REMEXTANDLOC move(%[2],{reldef8,%[1.ind]}) | | | ... | NC aextind8 bigsource8 | remove(externals) move(%[2],{extind8,%[1.ireg],%[1.ind]}) | | | ... | NC adisplind8 bigsource8 | REMEXTANDLOC move(%[2],{displind8,%[1.ireg],%[1.reg],%[1.ind]}) | | | ... | NC aextdefind8 bigsource8 | REMEXTANDLOC move(%[2],{extdefind8,%[1.ireg],%[1.ind]}) | | | ... | NC adispldefind8 bigsource8 | REMEXTANDLOC move(%[2],{displdefind8,%[1.ireg],%[1.reg],%[1.ind]}) | | | ... | reg4 bigsource8 | REMEXTANDLOC move(%[2],{regdef8,%[1]}) | | | sti | sreg4 | remove(ALL) allocate(REG={CONST4,$1/4}) #ifdef LOCLABS "1:\nmovl\t(sp)+,(%[1])+" "sobgtr\t%[a],1b" #else "movl\t(sp)+,(%[1])+" "sobgtr\t%[a],.-3" #endif erase(%[a]) | | | sts $1==4 | STACK | move({CONST1,4},R0) "jsb\t.sts" erase(R0) | | | sts !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.sts" erase(R0) | | | sdl $1 < 0 | NC bigsource8 | remove(displaced) remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1) move(%[1],{LOCAL8,LB,$1,8}) | | | ... | NC bigsource4 bigsource4 | remove(displaced) remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1) move(%[1],{LOCAL4,LB,$1,4}) move(%[2],{LOCAL4,LB,$1+4,4}) | | | ... | STACK | "movq\t(sp)+,$1(fp)" | | | (5,14) sdl $1 >= 0 | NC bigsource8 | remove(displaced) remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1) move(%[1],{LOCAL8,AP,$1,8}) | | | ... | NC bigsource4 bigsource4 | remove(displaced) remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1) move(%[1],{LOCAL4,AP,$1,4}) move(%[2],{LOCAL4,AP,$1+4,4}) | | | ... | STACK | "movq\t(sp)+,$1(ap)" | | | (5,14) sde | NC bigsource8 | remove(externals) move(%[1],{EXTERNAL8,$1}) | | | ... | bigsource4 bigsource4 | remove(externals) move(%[1],{EXTERNAL4,$1}) move(%[2],{EXTERNAL4,$1+"+4"}) | | | ... | STACK | "movq\t(sp)+,$1" | | | (7,14) sdf | | | | adp $1 sti 8 | /******************************** * Group 3 : Integer Arithmetic * ********************************/ adi $1==4 | source4 sreg4 | "addl2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,4) + %[1] ... | sreg4 source4 | "addl2\t%[2],%[1]" erase(%[1]) setcc(%[1]) | %[1] | | (3,4) + %[2] ... | source4 source4 | allocate(%[1],%[2],REG) "addl3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2] #ifdef REGVARS adi stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "addl3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS adi stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,%[num]<=$2+3 && %[num]+%[size]>$2) "addl3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | adi stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,%[num]<=$2+3 && %[num]+%[size]>$2) "addl3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS adi sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "addl3\t%[1],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | adi lol stf $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "addl3\t%[1],%[2],$3(%(regvar($2)%))" setcc({displ4,regvar($2),tostring($3)}) | | | #endif REGVARS adi sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "addl3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | adi sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "addl3\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | adi ste $1==4 | source4 source4 | remove(externals) "addl3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | adi !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.adi" | | | sbi $1==4 | source4 sreg4 | "subl2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,4) + %[1] ... | source4 source4 | allocate(%[1],%[2],REG) "subl3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2] #ifdef REGVARS sbi stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "subl3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS sbi stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "subl3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | sbi stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "subl3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS sbi sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "subl3\t%[1],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | sbi lol stf $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "subl3\t%[1],%[2],$3(%(regvar($2)%))" setcc({displ4,regvar($2),tostring($3)}) | | | #endif REGVARS sbi sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "subl3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | sbi sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "subl3\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | sbi ste $1==4 | source4 source4 | remove(externals) "subl3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | sbi !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.sbi" | | | mli $1==4 | source4 sreg4 | "mull2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,16) + %[1] ... | sreg4 source4 | "mull2\t%[2],%[1]" erase(%[1]) setcc(%[1]) | %[1] | | (3,16) + %[2] ... | source4 source4 | allocate(%[1],%[2],REG) "mull3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,16)+%[1]+%[2] #ifdef REGVARS mli stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "mull3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS mli stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "mull3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | mli stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "mull3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS mli sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "mull3\t%[1],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | mli lol stf $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "mull3\t%[1],%[2],$3(%(regvar($2)%))" setcc({displ4,regvar($2),tostring($3)}) | | | #endif REGVARS mli sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "mull3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | mli sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "mull3\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | mli ste $1==4 | source4 source4 | remove(externals) "mull3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | mli !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.mli" | | | dvi $1==4 | source4 sreg4 | "divl2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,98) + %[1] ... | source4 source4 | allocate(%[1],%[2],REG) "divl3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,98)+%[1]+%[2] #ifdef REGVARS dvi stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "divl3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS dvi stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "divl3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | dvi stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "divl3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS dvi sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "divl3\t%[1],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | dvi lol stf $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "divl3\t%[1],%[2],$3(%(regvar($2)%))" setcc({displ4,regvar($2),tostring($3)}) | | | #endif REGVARS dvi sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "divl3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | dvi sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "divl3\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | dvi ste $1==4 | source4 source4 | remove(externals) "divl3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | dvi !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.dvi" | | | rmi $1==4 | Xsource4 Xsource4 | allocate(REG) "divl3\t%[1],%[2],%[a]" "mull2\t%[1],%[a]" "subl3\t%[a],%[2],%[a]" setcc(%[a]) | %[a] | | #ifdef REGVARS rmi stl $1==4 && inreg($2)==2 | Xsource4 Xsource4 | remove(regvar($2)) allocate(REG) "divl3\t%[1],%[2],%[a]" "mull2\t%[1],%[a]" "subl3\t%[a],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS rmi stl $1==4 && $2<0 | Xsource4 Xsource4 | remove(displaced) remove(LOCALS,(%[num]<=$2+3 && %[num]+%[size]>$2)) allocate(REG) "divl3\t%[1],%[2],%[a]" "mull2\t%[1],%[a]" "subl3\t%[a],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | rmi stl $1==4 && $2>=0 | Xsource4 Xsource4 | remove(displaced) remove(LOCALS,(%[num]<=$2+3 && %[num]+%[size]>$2)) allocate(REG) "divl3\t%[1],%[2],%[a]" "mull2\t%[1],%[a]" "subl3\t%[a],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS rmi sil $1==4 && inreg($2)==2 | Xsource4 Xsource4 | REMEXTANDLOC allocate(REG) "divl3\t%[1],%[2],%[a]" "mull2\t%[1],%[a]" "subl3\t%[a],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | rmi lol stf $1==4 && inreg($2)==2 | Xsource4 Xsource4 | REMEXTANDLOC allocate(REG) "divl3\t%[1],%[2],%[a]" "mull2\t%[1],%[a]" "subl3\t%[a],%[2],$3(%(regvar($2)%))" setcc({displ4,regvar($2),tostring($3)}) | | | #endif REGVARS rmi sil $1==4 && $2<0 | Xsource4 Xsource4 | REMEXTANDLOC allocate(REG) "divl3\t%[1],%[2],%[a]" "mull2\t%[1],%[a]" "subl3\t%[a],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | rmi sil $1==4 && $2>=0 | Xsource4 Xsource4 | REMEXTANDLOC allocate(REG) "divl3\t%[1],%[2],%[a]" "mull2\t%[1],%[a]" "subl3\t%[a],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | rmi ste $1==4 | Xsource4 Xsource4 | remove(externals) allocate(REG) "divl3\t%[1],%[2],%[a]" "mull2\t%[1],%[a]" "subl3\t%[a],%[2],$2" setcc({EXTERNAL4,$2}) | | | rmi !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.rmi" erase(R0) | | | ngi $1==4 | source4 | allocate(%[1],REG) "mnegl\t%[1],%[a]" setcc(%[a]) | %[a] | | #ifdef REGVARS ngi stl $1==4 && inreg($2)==2 | source4 | remove(regvar($2)) "mnegl\t%[1],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS ngi stl $1==4 && $2<0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "mnegl\t%[1],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | ngi stl $1==4 && $2>=0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "mnegl\t%[1],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS ngi sil $1==4 && inreg($2)==2 | source4 | REMEXTANDLOC "mnegl\t%[1],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | ngi lol stf $1==4 && inreg($2)==2 | source4 | REMEXTANDLOC "mnegl\t%[1],$3(%(regvar($2)%))" setcc({displ4,regvar($2),tostring($3)}) | | | #endif REGVARS ngi sil $1==4 && $2<0 | source4 | REMEXTANDLOC "mnegl\t%[1],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | ngi sil $1==4 && $2>=0 | source4 | REMEXTANDLOC "mnegl\t%[1],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | ngi ste $1==4 | source4 | remove(externals) "mnegl\t%[1],$2" setcc({EXTERNAL4,$2}) | | | ngi !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.ngi" | | | sli $1==4 | source1or2or4 source4 | allocate(%[1],%[2],REG) "ashl\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2] #ifdef REGVARS sli stl $1==4 && inreg($2)==2 | source1or2or4 source4 | remove(regvar($2)) "ashl\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS sli stl $1==4 && $2<0 | source1or2or4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "ashl\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | sli stl $1==4 && $2>=0 | source1or2or4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "ashl\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS sli sil $1==4 && inreg($2)==2 | source1or2or4 source4 | REMEXTANDLOC "ashl\t%[1],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | sli lol stf $1==4 && inreg($2)==2 | source1or2or4 source4 | REMEXTANDLOC "ashl\t%[1],%[2],$3(%(regvar($2)%))" setcc({displ4,regvar($2),tostring($3)}) | | | #endif REGVARS sli sil $1==4 && $2<0 | source1or2or4 source4 | REMEXTANDLOC "ashl\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | sli sil $1==4 && $2>=0 | source1or2or4 source4 | REMEXTANDLOC "ashl\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | sli ste $1==4 | source1or2or4 source4 | remove(externals) "ashl\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | (8,10)+%[1]+%[2] sli !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.sli" erase(R0) | | | sri $1==4 | source4 source4 | allocate(%[1],REG) "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],%[a]" setcc(%[a]) | %[a] | | (7,8)+%[1]+%[2] ... | NC CONST source4 | allocate(%[2],REG) "ashl\t$$%(0-%[1.num]%),%[2],%[a]" setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2] #ifdef REGVARS sri stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) allocate(%[1],REG) "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | (9,14)+%[1]+%[2] ... | NC CONST source4 | remove(regvar($2)) "ashl\t$$%(0-%[1.num]%),%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | (6,10)+%[1]+%[2] #endif REGVARS sri stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) allocate(%[1],REG) "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | (9,11)+%[1]+%[2] ... | NC CONST source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "ashl\t$$%(0-%[1.num]%),%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | (6,7)+%[1]+%[2] sri stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) allocate(%[1],REG) "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | (9,11)+%[1]+%[2] ... | NC CONST source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "ashl\t$$%(0-%[1.num]%),%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | (6,7)+%[1]+%[2] #ifdef REGVARS sri sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC allocate(%[1],REG) "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | (9,14)+%[1]+%[2] ... | NC CONST source4 | REMEXTANDLOC "ashl\t$$%(0-%[1.num]%),%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | (6,10)+%[1]+%[2] sri lol stf $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC allocate(%[1], REG) "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],$3(%(regvar($2)%))" setcc({displ4,regvar($2),tostring($3)}) | | | (9,14)+%[1]+%[2] ... | NC CONST source4 | REMEXTANDLOC "ashl\t$$%(0-%[1.num]%),%[2],$3(%(regvar($2)%))" setcc({displ4,regvar($2),tostring($3)}) | | | (6,10)+%[1]+%[2] #endif REGVARS sri sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC allocate(%[1],REG) "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | (9,17)+%[1]+%[2] ... | NC CONST source4 | REMEXTANDLOC "ashl\t$$%(0-%[1.num]%),%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | (6,13)+%[1]+%[2] sri sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC allocate(%[1],REG) "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | (9,17)+%[1]+%[2] ... | NC CONST source4 | REMEXTANDLOC "ashl\t$$%(0-%[1.num]%),%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | (6,13)+%[1]+%[2] sri ste $1==4 | source4 source4 | remove(externals) allocate(%[1],REG) "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],$2" setcc({EXTERNAL4,$2}) | | | (11,14)+%[1]+%[2] ... | NC CONST source4 | remove(externals) "ashl\t$$%(0-%[1.num]%),%[2],$2" setcc({EXTERNAL4,$2}) | | | (8,10)+%[1]+%[2] sri !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.sri" erase(R0) | | | /************************************************ * Group 4 : Unsigned arithmetic * ************************************************/ adu | | | | adi $1 | sbu | | | | sbi $1 | mlu | | | | mli $1 | dvu $1==4 | STACK | "jsb\t.dvu4" | R0 | | dvu !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.dvu" erase(R0) | | | rmu $1==4 | STACK | "jsb\t.rmu4" | R0 | | rmu !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.rmu" erase(R0) | | | slu | | | | sli $1 | loc slu | | | | loc $1 sli $2 | sru $1==4 | source4 source4 | allocate(%[1],REG,QREG) "mnegl\t%[1],%[a]" move(%[2],%[b.1]) move({CONST4,0},%[b.2]) "ashq\t%[a],%[b],%[b]" erase(%[b]) | %[b.1] | | (10,12)+%[1] ... | NC CONST source4 | allocate(%[2],QREG) move(%[2],%[a.1]) move({CONST4,0},%[a.2]) "ashq\t$$%(0-%[1.num]%),%[a],%[a]" erase(%[a]) | %[a.1] | | (4,4)+%[1] sru !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.sru" erase(R0) | | | /**************************************** * Group 5 : Floating point arithmetic * ****************************************/ adf $1==4 | source4 source4 | allocate(%[1],%[2],REG) "addf3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,8)+%[1]+%[2] #ifdef FLOAT4 ... | source4 sreg4 | "addf2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,8) + %[1] ... | sreg4 source4 | "addf2\t%[2],%[1]" erase(%[1]) setcc(%[1]) | %[1] | | (3,8) + %[2] #ifdef REGVARS adf stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "addf3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) | | | #endif REGVARS adf stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "addf3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | adf stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "addf3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS adf sil $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "addf3\t%[1],%[2],(%(regvar($2)%))" setcc(regvar($2)) | | | #endif REGVARS adf sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "addf3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | adf sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "addf3\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | adf ste $1==4 | source4 source4 | remove(externals) "addf3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | #endif FLOAT4 adf $1==8 | source8 source8 | allocate(%[1],%[2],QREG) "addd3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,14)+%[1]+%[2] #ifdef FLOAT8 ... | source8 sreg8 | "addd2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,14) + %[1] ... | sreg8 source8 | "addd2\t%[2],%[1]" erase(%[1]) setcc(%[1]) | %[1] | | (3,14) + %[2] adf sdl $1==8 && $2<0 | source8 source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "addd3\t%[1],%[2],$2(fp)" setcc({LOCAL8,LB,$2,8}) | | | adf sdl $1==8 && $2>=0 | source8 source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "addd3\t%[1],%[2],$2(ap)" setcc({LOCAL8,AP,$2,8}) | | | adf sde $1==8 | source8 source8 | remove(externals) "addd3\t%[1],%[2],$2" setcc({EXTERNAL8,$2}) | | | #endif FLOAT8 adf !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.adf" | | | sbf $1==4 | source4 source4 | allocate(%[1],%[2],REG) "subf3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,8)+%[1]+%[2] #ifdef FLOAT4 ... | NC source4 sreg4 | "subf2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,8) + %[1] #ifdef REGVARS sbf stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "subf3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS sbf stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "subf3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | sbf stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "subf3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS sbf sil $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "subf3\t%[1],%[2],(%(regvar($2)%))" setcc(regvar($2)) | | | #endif REGVARS sbf sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "subf3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | sbf sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "subf3\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | sbf ste $1==4 | source4 source4 | remove(externals) "subf3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | #endif FLOAT4 sbf $1==8 | source8 source8 | allocate(%[1],%[2],QREG) "subd3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,14)+%[1]+%[2] #ifdef FLOAT8 ... | source8 sreg8 | "subd2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,14) + %[1] sbf sdl $1==8 && $2<0 | source8 source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "subd3\t%[1],%[2],$2(fp)" setcc({LOCAL8,LB,$2,8}) | | | sbf sdl $1==8 && $2>=0 | source8 source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "subd3\t%[1],%[2],$2(ap)" setcc({LOCAL8,AP,$2,8}) | | | sbf sde $1==8 | source8 source8 | remove(externals) "subd3\t%[1],%[2],$2" setcc({EXTERNAL8,$2}) | | | #endif FLOAT8 sbf !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.sbf" | | | mlf $1==4 | source4 source4 | allocate(%[1],%[2],REG) "mulf3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,12)+%[1]+%[2] #ifdef FLOAT4 ... | source4 sreg4 | "mulf2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,12) + %[1] ... | sreg4 source4 | "mulf2\t%[2],%[1]" erase(%[1]) setcc(%[1]) | %[1] | | (3,12) + %[2] #ifdef REGVARS mlf stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "mulf3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) | | | #endif REGVARS mlf stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "mulf3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | mlf stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "mulf3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS mlf sil $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "mulf3\t%[1],%[2],(%(regvar($2)%))" setcc(regvar($2)) | | | #endif REGVARS mlf sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "mulf3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | mlf sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "mulf3\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | mlf ste $1==4 | source4 source4 | remove(externals) "mulf3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | #endif FLOAT4 mlf $1==8 | source8 source8 | allocate(%[1],%[2],QREG) "muld3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,20)+%[1]+%[2] #ifdef FLOAT8 ... | source8 sreg8 | "muld2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,20) + %[1] ... | sreg8 source8 | "muld2\t%[2],%[1]" erase(%[1]) setcc(%[1]) | %[1] | | (3,20) + %[2] mlf sdl $1==8 && $2<0 | source8 source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "muld3\t%[1],%[2],$2(fp)" setcc({LOCAL8,LB,$2,8}) | | | mlf sdl $1==8 && $2>=0 | source8 source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "muld3\t%[1],%[2],$2(ap)" setcc({LOCAL8,AP,$2,8}) | | | mlf sde $1==8 | source8 source8 | remove(externals) "muld3\t%[1],%[2],$2" setcc({EXTERNAL8,$2}) | | | #endif FLOAT8 mlf !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.mlf" | | | dvf $1==4 | source4 source4 | allocate(%[1],%[2],REG) "divf3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,46)+%[1]+%[2] #ifdef FLOAT4 ... | source4 sreg4 | "divf2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,46) + %[1] #ifdef REGVARS dvf stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "divf3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS dvf stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "divf3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | dvf stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "divf3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS dvf sil $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "divf3\t%[1],%[2],(%(regvar($2)%))" setcc(regvar($2)) | | | #endif REGVARS dvf sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "divf3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | dvf sil $1==4 &&$2>=0 | source4 source4 | REMEXTANDLOC "divf3\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | dvf ste $1==4 | source4 source4 | remove(externals) "divf3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | #endif FLOAT4 dvf $1==8 | source8 source8 | allocate(%[1],%[2],QREG) "divd3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,80)+%[1]+%[2] #ifdef FLOAT8 ... | source8 sreg8 | "divd2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,80) + %[1] dvf sdl $1==8 && $2<0 | source8 source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "divd3\t%[1],%[2],$2(fp)" setcc({LOCAL8,LB,$2,8}) | | | dvf sdl $1==8 && $2>=0 | source8 source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "divd3\t%[1],%[2],$2(ap)" setcc({LOCAL8,AP,$2,8}) | | | dvf sde $1==8 | source8 source8 | remove(externals) "divd3\t%[1],%[2],$2" setcc({EXTERNAL8,$2}) | | | #endif FLOAT8 dvf !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.dvf" | | | ngf $1==4 | source4 | allocate(%[1],REG) "mnegf\t%[1],%[a]" setcc(%[a]) | %[a] | | #ifdef FLOAT4 #ifdef REGVARS ngf stl $1==4 && inreg($2)==2 | source4 | remove(regvar($2)) "mnegf\t%[1],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS ngf stl $1==4 && $2<0 | source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "mnegf\t%[1],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | ngf stl $1==4 && $2>=0 | source4 | remove(displaced) remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2) "mnegf\t%[1],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS ngf sil $1==4 && inreg($2)==2 | source4 | remove(regvar($2)) "mnegf\t%[1],(%(regvar($2)%))" setcc(regvar($2)) | | | #endif REGVARS ngf sil $1==4 && $2<0 | source4 | REMEXTANDLOC "mnegf\t%[1],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | ngf sil $1==4 && $2>=0 | source4 | REMEXTANDLOC "mnegf\t%[1],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | ngf ste $1==4 | source4 | remove(externals) "mnegf\t%[1],$2" setcc({EXTERNAL4,$2}) | | | #endif FLOAT4 ngf $1==8 | source8 | allocate(%[1],QREG) "mnegd\t%[1],%[a]" setcc(%[a]) | %[a] | | #ifdef FLOAT8 ngf sdl $1==8 && $2<0 | source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "mnegd\t%[1],$2(fp)" setcc({LOCAL8,LB,$2,8}) | | | ngf sdl $1==8 && $2>=0 | source8 | remove(displaced) remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2) "mnegd\t%[1],$2(ap)" setcc({LOCAL8,AP,$2,8}) | | | ngf sde $1==8 | source8 | remove(externals) "mnegd\t%[1],$2" setcc({EXTERNAL8,$2}) | | | #endif FLOAT8 ngf !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.ngf" | | | fif $1==4 | source4 source4 | allocate(%[1],%[2],REG,REG) "mulf3\t%[1],%[2],%[a]" /* the assembler does not do immediate floating point */ "cvtlf $$1,%[b]" "emodf\t%[a],$$0,%[b],-(sp),%[b]" /* * Don't trust the integer part. * Overflow could occur. */ "tstl\t(sp)+" "subf2\t%[b],%[a]" | %[b] %[a] | | fif $1==8 | source8 source8 | allocate(%[1],%[2],QREG,QREG) "muld3\t%[1],%[2],%[a]" "cvtld $$1,%[b]" "emodd\t%[a],$$0,%[b],-(sp),%[b]" "tstl\t(sp)+" "subd2\t%[b],%[a]" | %[b] %[a] | | fif !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.fif" erase(R0) | | | fef defined($1) | | remove(ALL) move({CONST4, $1}, R0) "jsb\t.fef" erase(R0) | | | fef !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.fef" erase(R0) | | | /******************************** * Group 6 : pointer arithmetic * ********************************/ adp $1==0 | | | | | adp | NC ADDR_EXTERNAL | | {ADDR_EXTERNAL,%[1.ind]+"+"+tostring($1)} | | ... | NC ADDR_LOCAL | | {ADDR_LOCAL,%[1.reg],%[1.num]+$1} | | ... | NC adisplind1 | | {adisplind1,%[1.ireg],%[1.reg], %[1.ind]+"+"+tostring($1)} | | ... | NC adispldefind1 | allocate(%[1.ireg],REG) "addl3\t$$$1,%[1.ireg],%[a]" | {adispldefind1,%[a],%[1.reg],%[1.ind]} | | ... | NC aextdefind1 | allocate(%[1],REG) "addl3\t$$$1,%[1.ireg],%[a]" | {aextdefind1,%[a],%[1.ind]} | | ... | NC adispl | | {adispl,%[1.reg],%[1.ind]+"+"+tostring($1)} | | ... | reg4 | | {adispl,%[1],tostring($1)} | | adp sil | | | {CONST4,$1} | adi 4 sil $2 | adp stl | | | {CONST4,$1} | adi 4 stl $2 | adp ste | | | {CONST4,$1} | adi 4 ste $2 | adp dup $2==4 | | | {CONST4,$1} | adi 4 dup 4 | adp lol stf | | | {CONST4,$1} | adi 4 lol $2 stf $3 | adp lol sti $3==4 | | | {CONST4,$1} | adi 4 lol $2 sti 4 | adp loe sti $3==4 | | | {CONST4,$1} | adi 4 loe $2 sti 4 | adp cms $2==4 | | | {CONST4,$1} | adi 4 cms 4 | loe lof adp loe stf $1==$4 && $2==$5 | | REMEXTANDLOC allocate(REG={EXTERNAL4,$1}) "addl2\t$$$3,$2(%[a])" | | | lol lof adp lol stf $1<0 && $1==$4 && inreg($1)!=2 && $2==$5 | | REMEXTANDLOC allocate(REG={LOCAL4,LB,$1,4}) "addl2\t$$$3,$2(%[a])" | | | lol lof adp lol stf $1>=0 && $1==$4 && inreg($1)!=2 && $2==$5 | | REMEXTANDLOC allocate(REG={LOCAL4,AP,$1,4}) "addl2\t$$$3,$2(%[a])" | | | ads $1==4 | NC reg4 adispl | | {adisplind1,%[1],%[2.reg],%[2.ind]} | | ... | NC reg4 ADDR_LOCAL | | {adisplind1,%[1],%[2.reg],tostring(%[2.num])} | | ... | NC reg4 ADDR_EXTERNAL | | {adispl,%[1],%[2.ind]} | | ... | NC reg4 aextind2 | | {adisplind2,%[2.ireg],%[1],%[2.ind]} | | ... | NC reg4 aextind4 | | {adisplind4,%[2.ireg],%[1],%[2.ind]} | | ... | NC reg4 aextind8 | | {adisplind8,%[2.ireg],%[1],%[2.ind]} | | ... | NC reg4 displ4 | | {adispldefind1,%[1],%[2.reg],%[2.ind]} | | ... | NC reg4 LOCAL4 | | {adispldefind1,%[1],%[2.reg],tostring(%[2.num])} | | ... | NC reg4 regdef4 | | {adispldefind1,%[1],%[2.reg],"0"} | | ... | NC reg4 EXTERNAL4 | | {aextdefind1,%[1],%[2.ind]} | | ... | NC reg4 reg4 | | {adisplind1,%[1],%[2],"0"} | | ... | | | | adi 4 | ads | | | | loc $1 loc 4 cii ads 4 | ads !defined($1) | | | | loc 4 cii ads 4 | sbs $1==4 | | | | sbu $1 | sbs $1!=4 | | | | sbu 4 loc 4 loc $1 cii | sbs !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) "jsb\t.sbs" erase(R0) | | | adp dup sil adp $1==(0-$4) && $2==4 | reg4 | | %[1] %[1] | adp $1 sil $3 | adp dup loe sti adp $1==(0-$5) && $2==4 && $4==4 | reg4 | | %[1] %[1] | adp $1 loe $3 sti 4 | dup adp lol sti $1==4 && $4==4 | bigsource4-regch4 | allocate(REG=%[1]) | %[a] %[1] {CONST4,$2} | adi 4 lol $3 sti 4 | dup adp loe sti $1==4 && $4==4 | bigsource4-regch4 | allocate(REG=%[1]) | %[a] %[1] {CONST4,$2} | adi 4 loe $3 sti 4 | #ifdef REGVARS lol lol adp stl loi $1==$4 && $2==$1 && inreg($1)==2 && $3==1 && $5==1 | | remove(regvar($1)) erase(regvar($1)) | {reginc1,regvar($1)} | | lol lol adp stl loi $1==$4 && $2==$1 && inreg($1)==2 && $3==2 && $5==2 | | remove(regvar($1)) erase(regvar($1)) | {reginc2,regvar($1)} | | lol lol adp stl loi $1==$4 && $2==$1 && inreg($1)==2 && $3==4 && $5==4 | | remove(regvar($1)) erase(regvar($1)) | {reginc4,regvar($1)} | | lol lol adp stl loi $1==$4 && $2==$1 && inreg($1)==2 && $3==8 && $5==8 | | remove(regvar($1)) erase(regvar($1)) | {reginc8,regvar($1)} | | lol adp dup stl loi $1==$4 && $2==(0-1) && inreg($1)==2 && $3==4 && $5==1 | | remove(regvar($1)) erase(regvar($1)) | {regdec1,regvar($1)} | | lol adp dup stl loi $1==$4 && $2==(0-2) && inreg($1)==2 && $3==4 && $5==2 | | remove(regvar($1)) erase(regvar($1)) | {regdec2,regvar($1)} | | lol adp stl lil $1==$4 && $2==(0-4) && inreg($1)==2 && $3==$1 | | remove(regvar($1)) erase(regvar($1)) | {regdec4,regvar($1)} | | lol adp dup stl loi $1==$4 && $2==(0-8) && inreg($1)==2 && $3==4 && $5==8 | | remove(regvar($1)) erase(regvar($1)) | {regdec8,regvar($1)} | | lol lol adp stl sti $1==$4 && $2==$1 && inreg($1)==2 && $3==1 && $5==1 | NC source1 | REMEXTANDLOC remove(regvar($1)) "movb\t%[1],(%(regvar($1)%))+" erase(regvar($1)) | | | (3,7)+%[1] ... | NC source2 | REMEXTANDLOC remove(regvar($1)) "cvtwb\t%[1],(%(regvar($1)%))+" erase(regvar($1)) | | | (3,7)+%[1] ... | source4 | REMEXTANDLOC remove(regvar($1)) "cvtlb\t%[1],(%(regvar($1)%))+" erase(regvar($1)) | | | (3,7)+%[1] lol lol adp stl sti $1==$4 && $2==$1 && inreg($1)==2 && $3==2 && $5==2 | NC source2 | REMEXTANDLOC remove(regvar($1)) "movw\t%[1],(%(regvar($1)%))+" erase(regvar($1)) | | | (3,7)+%[1] ... | source4 | REMEXTANDLOC remove(regvar($1)) "cvtlw\t%[1],(%(regvar($1)%))+" erase(regvar($1)) | | | (3,7)+%[1] lol lol adp stl sti $1==$4 && $2==$1 && inreg($1)==2 && $3==4 && $5==4 | source4 | REMEXTANDLOC remove(regvar($1)) move(%[1],{reginc4,regvar($1)}) erase(regvar($1)) | | | lol lol adp stl sti $1==$4 && $2==$1 && inreg($1)==2 && $3==8 && $5==8 | source8 | REMEXTANDLOC remove(regvar($1)) move(%[1],{reginc8,regvar($1)}) erase(regvar($1)) | | | lol adp dup stl sti $1==$4 && inreg($1)==2 && $2==(0-1) && $3==4 && $5==1 | NC source1 | REMEXTANDLOC remove(regvar($1)) "movb\t%[1],-(%(regvar($1)%))" erase(regvar($1)) | | | (3,7)+%[1] ... | NC source2 | REMEXTANDLOC remove(regvar($1)) "cvtwb\t%[1],-(%(regvar($1)%))" erase(regvar($1)) | | | (3,7)+%[1] ... | source4 | REMEXTANDLOC remove(regvar($1)) "cvtlb\t%[1],-(%(regvar($1)%))" erase(regvar($1)) | | | (3,7)+%[1] lol adp dup stl sti $1==$4 && inreg($1)==2 && $2==(0-2) && $3==4 && $5==2 | NC source2 | REMEXTANDLOC remove(regvar($1)) "movw\t%[1],-(%(regvar($1)%))" erase(regvar($1)) | | | (3,7)+%[1] ... | source4 | REMEXTANDLOC remove(regvar($1)) "cvtlw\t%[1],-(%(regvar($1)%))" erase(regvar($1)) | | | (3,7)+%[1] lol adp stl sil $1==$4 && inreg($1)==2 && $2==(0-4) && $3==$4 | source4 | REMEXTANDLOC remove(regvar($1)) move(%[1],{regdec4,regvar($1)}) erase(regvar($1)) | | | lol adp dup stl sti $1==$4 && inreg($1)==2 && $2==(0-8) && $3==4 && $5==8 | source8 | REMEXTANDLOC remove(regvar($1)) move(%[1],{regdec8,regvar($1)}) erase(regvar($1)) | | | lol lol adp stl $1==$4 && $2==$4 && inreg($1)==2 | | remove(regvar($1)) allocate(REG=regvar($1)) "addl2\t$$$3,%(regvar($1)%)" erase(regvar($1)) | %[a] | | lol adp stl $1==$3 && inreg($1)==2 | | remove(regvar($1)) "addl2\t$$$2,%(regvar($1)%)" erase(regvar($1)) | | | #endif REGVARS lol adp stl $1==$3 && $1<0 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) "addl2\t$$$2,$1(fp)" setcc({LOCAL4,LB,$1,4}) | | | lol adp stl $1==$3 && $1>=0 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) "addl2\t$$$2,$1(ap)" setcc({LOCAL4,AP,$1,4}) | | | lol lol adp stl $1==$4 && $2==$4 && $2<0 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) allocate(REG={LOCAL4,LB,$1,4}) "addl2\t$$$3,$1(fp)" setcc({LOCAL4,LB,$1,4}) | %[a] | | lol lol adp stl $1==$4 && $2==$4 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) allocate(REG={LOCAL4,AP,$1,4}) "addl2\t$$$3,$1(ap)" setcc({LOCAL4,AP,$1,4}) | %[a] | | #ifdef REGVARS lil lil adp sil $1==$2 && $1==$4 && inreg($1)==2 | | REMEXTANDLOC allocate(REG={regdef4,regvar($1)}) "addl2\t$$$3,(%(regvar($1)%))" setcc(regvar($1)) | %[a] | | lol lof dup adp lol stf $1==$5 && $2==$6 && $3==4 && inreg($1)==2 | | REMEXTANDLOC allocate(REG={displ4,regvar($1),tostring($2)}) "addl2\t$$$4,$2(%(regvar($1)%))" | %[a] | | #endif loe adp ste $1==$3 | | remove(externals) "addl2\t$$$2,$1" | | | loe loe adp ste $1==$4 && $2==$1 | | remove(externals) allocate(REG={EXTERNAL4,$1}) "addl2\t$$$3,$1" | %[a] | | /**************************************** * Group 7 : Increment/decrement/zero * ****************************************/ lil inc dup sil $3==4 && $1==$4 | | | | lil $1 loc 1 adi 4 sil $1 lil $1 | lil dec dup sil $3==4 && $1==$4 | | | | lil $1 loc 1 sbi 4 sil $1 lil $1 | inc | | | {CONST1,1} | adi 4 | loe lof inc loe stf $1==$4 && $2==$5 | | REMEXTANDLOC allocate(REG={EXTERNAL4,$1}) "incl\t$2(%[a])" setcc({displ4,%[a],tostring($2)}) | | | lol lof inc lol stf $1<0 && $1==$4 && inreg($1)!=2 && $2==$5 | | REMEXTANDLOC allocate(REG={LOCAL4,LB,$1,4}) "incl\t$2(%[a])" setcc({displ4,%[a],tostring($2)}) | | | lol lof inc lol stf $1>=0 && $1==$4 && inreg($1)!=2 && $2==$5 | | REMEXTANDLOC allocate(REG={LOCAL4,AP,$1,4}) "incl\t$2(%[a])" setcc({displ4,%[a],tostring($2)}) | | | dec | | | {CONST1,1} | sbi 4 | loe lof dec loe stf $1==$4 && $2==$5 | | REMEXTANDLOC allocate(REG={EXTERNAL4,$1}) "decl\t$2(%[a])" setcc({displ4,%[a],tostring($2)}) | | | lol lof dec lol stf $1<0 && $1==$4 && inreg($1)!=2 && $2==$5 | | REMEXTANDLOC allocate(REG={LOCAL4,LB,$1,4}) "decl\t$2(%[a])" setcc({displ4,%[a],tostring($2)}) | | | lol lof dec lol stf $1>=0 && $1==$4 && inreg($1)!=2 && $2==$5 | | REMEXTANDLOC allocate(REG={LOCAL4,AP,$1,4}) "decl\t$2(%[a])" setcc({displ4,%[a],tostring($2)}) | | | #ifdef REGVARS inl inreg($1)==2 | | remove(regvar($1)) "incl\t%(regvar($1)%)" erase(regvar($1)) setcc(regvar($1)) | | | #endif REGVARS inl $1<0 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) "incl\t$1(fp)" setcc({LOCAL4,LB,$1,4}) | | | inl $1>=0 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) "incl\t$1(ap)" setcc({LOCAL4,AP,$1,4}) | | | #ifdef REGVARS lol inl $1==$2 && inreg($1)==2 | | remove(regvar($1)) allocate(REG=regvar($1)) "incl\t%(regvar($1)%)" erase(regvar($1)) setcc(regvar($1)) | %[a] | | #endif REGVARS ine | | remove(externals) "incl\t$1" setcc({EXTERNAL4,$1}) | | | #ifdef REGVARS del inreg($1)==2 | | remove(regvar($1)) "decl\t%(regvar($1)%)" erase(regvar($1)) setcc(regvar($1)) | | | #endif REGVARS del $1<0 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) "decl\t$1(fp)" setcc({LOCAL4,LB,$1,4}) | | | del $1>=0 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) "decl\t$1(ap)" setcc({LOCAL4,AP,$1,4}) | | | #ifdef REGVARS lol del $1==$2 && inreg($1)==2 | | remove(regvar($1)) allocate(REG=regvar($1)) "decl\t%(regvar($1)%)" erase(regvar($1)) setcc(regvar($1)) | %[a] | | #endif REGVARS dee | | remove(externals) "decl\t$1" setcc({EXTERNAL4,$1}) | | | #ifdef REGVARS zrl inreg($1)==2 | | remove(regvar($1)) "clrl\t%(regvar($1)%)" erase(regvar($1)) setcc(regvar($1)) | | | #endif REGVARS zrl $1<0 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) "clrl\t$1(fp)" setcc({LOCAL4,LB,$1,4}) | | | zrl $1>=0 | | remove(displaced) remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1) "clrl\t$1(ap)" setcc({LOCAL4,AP,$1,4}) | | | zrl zrl $1==$2+4 && $1<0 #ifdef REGVARS && inreg($1)<2 && inreg($2)<2 #endif REGVARS | | remove(displaced) remove(LOCALS,%[num]<=$2+7 && %[num]+%[size]>$2) "clrq\t$2(fp)" setcc({LOCAL8,LB,$2,8}) | | | zrl zrl $1==$2+4 && $1>=0 #ifdef REGVARS && inreg($1)<2 && inreg($2)<2 #endif REGVARS | | remove(displaced) remove(LOCALS,%[num]<=$2+7 && %[num]+%[size]>$2) "clrq\t$2(ap)" setcc({LOCAL8,AP,$2,8}) | | | zrl zrl $1==$2-4 | | | | zrl $2 zrl $1 | zre | | remove(externals) "clrl\t$1" setcc({EXTERNAL4,$1}) | | | zrf $1==4 | | allocate(REG) "clrl\t%[a]" | %[a] | | zrf $1==8 | | allocate(QREG) "clrq\t%[a]" | %[a] | | zer $1==4 | | | {CONST4,0} | | zer $1==8 | | allocate(QREG) "clrq\t%[a]" | %[a] | | zer $1>8&&$1<=32 | STACK | "clrq\t-(sp)" | | zer $1-8 | zer defined($1) | STACK | move({CONST4,$1/4},R0) #ifdef LOCLABS "1:\tclrl\t-(sp)" "sobgtr\tr0,1b" #else LOCLABS "clrl\t-(sp)" "sobgtr\tr0,.-2" #endif LOCLABS erase(R0) | | | zer !defined($1) | source1or2or4 | remove(ALL) move(%[1],R0) #ifdef LOCLABS "1:\tclrl\t-(sp)" "sobgtr\tr0,1b" #else LOCLABS "clrl\t-(sp)" "sobgtr\tr0,.-2" #endif LOCLABS erase(R0) | | | /******************************** * Group 8 : Convertions * ********************************/ cii | STACK | "jsb\t.cii" | | | cfi | STACK | "jsb\t.cfi" | | | cfu | STACK | "jsb\t.cfu" | | | cuf | STACK | "jsb\t.cuf" | | | cif | STACK | "jsb\t.cif" | | | cff | STACK | "jsb\t.cff" | | | cuu | STACK | "jsb\t.cuu" | | | ciu | | | | cuu | cui | STACK | "jsb\t.cui" | | | #ifdef REGVARS loc loc cii stl $1==1 && $2==4 && inreg($4)==2 | source1or2or4 | remove(regvar($4)) "cvtbl\t%[1],%(regvar($4)%)" erase(regvar($1)) setcc(regvar($4)) | | | #endif REGVARS loc loc cii stl $1==1 && $2==4 && $4<0 | source1or2or4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtbl\t%[1],$4(fp)" setcc({LOCAL4,LB,$4,4}) | | | loc loc cii stl $1==1 && $2==4 && $4>=0 | source1or2or4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtbl\t%[1],$4(ap)" setcc({LOCAL4,AP,$4,4}) | | | loc loc cii ste $1==1 && $2==4 | source1or2or4 | remove(externals) "cvtbl\t%[1],$4" setcc({EXTERNAL4,$4}) | | | loc loc cii $1==1 && $2==4 | source1or2or4 | allocate(%[1],REG) "cvtbl\t%[1],%[a]" setcc(%[a]) | %[a] | | #ifdef REGVARS loc loc cii stl $1==2 && $2==4 && inreg($4)==2 | source2or4 | remove(regvar($4)) "cvtwl\t%[1],%(regvar($4)%)" erase(regvar($4)) setcc(regvar($4)) | | | #endif REGVARS loc loc cii stl $1==2 && $2==4 && $4<0 | source2or4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtwl\t%[1],$4(fp)" setcc({LOCAL4,LB,$4,4}) | | | loc loc cii stl $1==2 && $2==4 && $4>=0 | source2or4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtwl\t%[1],$4(ap)" setcc({LOCAL4,AP,$4,4}) | | | loc loc cii ste $1==2 && $2==4 | source2or4 | remove(externals) "cvtwl\t%[1],$4" setcc({EXTERNAL4,$4}) | | | loc loc cii $1==2 && $2==4 | source2or4 | allocate(%[1],REG) "cvtwl\t%[1],%[a]" setcc(%[a]) | %[a] | | loc loc cui $1==$2 | | | | | loc loc ciu $1==$2 | | | | | #ifdef FLOAT4 #ifdef REGVARS loc loc cfi stl $1==4 && $2==4 && inreg($4)==2 | source4 | remove(regvar($4)) "cvtfl\t%[1],%(regvar($4)%)" erase(regvar($4)) setcc(regvar($4)) | | | #endif REGVARS loc loc cfi stl $1==4 && $2==4 && $4<0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtfl\t%[1],$4(fp)" setcc({LOCAL4,AP,$4,4}) | | | loc loc cfi stl $1==4 && $2==4 && $4>=0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtfl\t%[1],$4(ap)" setcc({LOCAL4,AP,$4,4}) | | | loc loc cfi ste $1==4 && $2==4 | source4 | remove(externals) "cvtfl\t%[1],$4" setcc({EXTERNAL4,$4}) | | | #endif FLOAT4 loc loc cfi $1==4 && $2==4 | source4 | allocate(%[1],REG) "cvtfl\t%[1],%[a]" setcc(%[a]) | %[a] | | (3,4) + %[1] #ifdef FLOAT8 #ifdef REGVARS loc loc cfi stl $1==8 && $2==4 && inreg($4)==2 | source8 | remove(regvar($4)) "cvtdl\t%[1],%(regvar($4)%)" erase(regvar($4)) setcc(regvar($4)) | | | #endif REGVARS loc loc cfi stl $1==8 && $2==4 && $4<0 | source8 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtdl\t%[1],$4(fp)" setcc({LOCAL4,LB,$4,4}) | | | loc loc cfi stl $1==8 && $2==4 && $4>=0 | source8 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtdl\t%[1],$4(ap)" setcc({LOCAL4,AP,$4,4}) | | | loc loc cfi ste $1==8 && $2==4 | source8 | remove(externals) "cvtdl\t%[1],$4" setcc({EXTERNAL4,$4}) | | | #endif FLOAT8 loc loc cfi $1==8 && $2==4 | source8 | allocate(%[1],REG) "cvtdl\t%[1],%[a]" setcc(%[a]) | %[a] | | #ifdef FLOAT4 #ifdef REGVARS loc loc cif stl $1==4 && $2==4 && inreg($4)==2 | source4 | remove(regvar($4)) "cvtlf\t%[1],%(regvar($4)%)" erase(regvar($4)) setcc(regvar($4)) | | | #endif REGVARS loc loc cif stl $1==4 && $2==4 && $4<0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtlf\t%[1],$4(fp)" | | | loc loc cif stl $1==4 && $2==4 && $4>=0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtlf\t%[1],$4(ap)" | | | loc loc cif ste $1==4 && $2==4 | source4 | remove(externals) "cvtlf\t%[1],$4" | | | #endif FLOAT4 loc loc cif $1==4 && $2==4 | source4 | allocate(%[1],REG) "cvtlf\t%[1],%[a]" | %[a] | | #ifdef FLOAT8 /* No double registervariables #ifdef REGVARS loc loc cif sdl $1==4 && $2==8 && inreg($4)==2 | source4 | remove(regvar($4)) "cvtld\t%[1],%(regvar($4)%)" erase(regvar($4)) setcc(regvar($4)) | | | #endif REGVARS */ loc loc cif sdl $1==4 && $2==8 && $4<0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtld\t%[1],$4(fp)" | | | loc loc cif sdl $1==4 && $2==8 && $4>=0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtld\t%[1],$4(ap)" | | | loc loc cif sde $1==4 && $2==8 | source4 | remove(externals) "cvtld\t%[1],$4" | | | #endif FLOAT8 loc loc cif $1==4 && $2==8 | source4 | allocate(%[1],QREG) "cvtld\t%[1],%[a]" | %[a] | | loc loc cfu $1==4 | source4 | allocate(%[1],REG=%[1]) "bicl2\t$$32768,%[a]" | %[a] | loc $1 loc $2 cfi | loc loc cfu $1==8 | source8 | allocate(%[1],QREG=%[1]) "bicl2\t$$32768,%[a]" | %[a] | loc $1 loc $2 cfi | #ifdef FLOAT8 /* No double registervariables #ifdef REGVARS loc loc cff sdl $1==4 && $2==8 && inreg($4)==2 | source4 | remove(regvar($4)) "cvtfd\t%[1],%(regvar($4)%)" erase(regvar($4)) setcc(regvar($4)) | | | #endif REGVARS */ loc loc cff sdl $1==4 && $2==8 && $4<0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $4+7 && %[num]+%[size] > $4)) "cvtfd\t%[1],$4(fp)" | | | loc loc cff sdl $1==4 && $2==8 && $4>=0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $4+7 && %[num]+%[size] > $4)) "cvtfd\t%[1],$4(ap)" | | | loc loc cff sde $1==4 && $2==8 | source4 | remove(externals) "cvtfd\t%[1],$4" | | | #endif FLOAT8 loc loc cff $1==4 && $2==8 | source4 | allocate(%[1],QREG) "cvtfd\t%[1],%[a]" | %[a] | | #ifdef FLOAT4 #ifdef REGVARS loc loc cff stl $1==8 && $2==4 && inreg($4)==2 | source8 | remove(regvar($4)) "cvtdf\t%[1],%(regvar($4)%)" erase(regvar($4)) setcc(regvar($4)) | | | #endif REGVARS loc loc cff stl $1==8 && $2==4 && $4<0 | source8 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtdf\t%[1],$4(fp)" | | | loc loc cff stl $1==8 && $2==4 && $4>=0 | source8 | remove(displaced) remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4)) "cvtdf\t%[1],$4(ap)" | | | loc loc cff ste $1==8 && $2==4 | source8 | remove(externals) "cvtdf\t%[1],$4" | | | #endif FLOAT4 loc loc cff $1==8 && $2==4 | source8 | allocate(%[1],REG) "cvtdf\t%[1],%[a]" | %[a] | | /**************************************** * Group 9 : Logical instructions * ****************************************/ and $1==4 | source4 source4 | allocate(%[1],REG) "mcoml\t%[1],%[a]" "bicl3\t%[a],%[2],%[a]" setcc(%[a]) | %[a] | | (7,6)+%[1]+%[2] ... | NC CONST source4 | allocate(%[2],REG) "bicl3\t$$~%[1.num],%[2],%[a]" setcc(%[a]) | %[a] | | (4,3)+%[1]+%[2] ... | NC source4 CONST | allocate(%[1],REG) "bicl3\t$$~%[2.num],%[1],%[a]" setcc(%[a]) | %[a] | | (4,3)+%[1]+%[2] and zeq $1==4 | source4 source4 | remove(ALL) "bitl\t%[1],%[2]" "jeql\t$2" | | | and zne $1==4 | source4 source4 | remove(ALL) "bitl\t%[1],%[2]" "jneq\t$2" | | | and tne $1==4 | source4 source4 | allocate(REG={CONST4,0}) "bitl\t%[1],%[2]" #ifdef LOCLABS "jeql\t1f" "incl\t%[a]\n1:" #else "jeql\t.+4" "incl\t%[a]" #endif erase(%[a]) | %[a] | | #ifdef REGVARS and stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) allocate(%[1],REG) "mcoml\t%[1],%[a]" "bicl3\t%[a],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | (8,8)+%[1]+%[2] ... | NC CONST source4 | remove(regvar($2)) "bicl3\t$$~%[1.num],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | (4,4)+%[1]+%[2] ... | NC source4 CONST | remove(regvar($2)) "bicl3\t$$~%[2.num],%[1],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | (4,4)+%[1]+%[2] #endif REGVARS and stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) allocate(%[1],REG) "mcoml\t%[1],%[a]" "bicl3\t%[a],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | (9,12)+%[1]+%[2] ... | NC CONST source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "bicl3\t$$~%[1.num],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | (6,9)+%[1]+%[2] ... | NC source4 CONST | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "bicl3\t$$~%[2.num],%[1],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | (6,9)+%[1]+%[2] and stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) allocate(%[1],REG) "mcoml\t%[1],%[a]" "bicl3\t%[a],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | (9,12)+%[1]+%[2] ... | NC CONST source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "bicl3\t$$~%[1.num],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | (6,9)+%[1]+%[2] ... | NC source4 CONST | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "bicl3\t$$~%[2.num],%[1],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | (6,9)+%[1]+%[2] #ifdef REGVARS and sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC allocate(%[1],REG) "mcoml\t%[1],%[a]" "bicl3\t%[a],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | (9,15)+%[1]+%[2] ... | NC CONST source4 | REMEXTANDLOC "bicl3\t$$~%[1.num],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | (6,12)+%[1]+%[2] ... | NC source4 CONST | REMEXTANDLOC "bicl3\t$$~%[2.num],%[1],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | (6,12)+%[1]+%[2] #endif REGVARS and sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC allocate(%[1],REG) "mcoml\t%[1],%[a]" "bicl3\t%[a],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | (9,15)+%[1]+%[2] ... | NC CONST source4 | REMEXTANDLOC "bicl3\t$$~%[1.num],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | (6,12)+%[1]+%[2] ... | NC source4 CONST | REMEXTANDLOC "bicl3\t$$~%[2.num],%[1],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | (6,12)+%[1]+%[2] and sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC allocate(%[1],REG) "mcoml\t%[1],%[a]" "bicl3\t%[a],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | (9,15)+%[1]+%[2] ... | NC CONST source4 | REMEXTANDLOC "bicl3\t$$~%[1.num],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | (6,12)+%[1]+%[2] ... | NC source4 CONST | REMEXTANDLOC "bicl3\t$$~%[2.num],%[1],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | (6,12)+%[1]+%[2] and ste $1==4 | source4 source4 | remove(externals) allocate(%[1],REG) "mcoml\t%[1],%[a]" "bicl3\t%[a],%[2],$2" setcc({EXTERNAL4,$2}) | | | (11,12)+%[1]+%[2] ... | NC CONST source4 | remove(externals) "bicl3\t$$~%[1.num],%[2],$2" setcc({EXTERNAL4,$2}) | | | (8,9)+%[1]+%[2] ... | NC source4 CONST | remove(externals) "bicl3\t$$~%[2.num],%[1],$2" setcc({EXTERNAL4,$2}) | | | (8,9)+%[1]+%[2] and $1==8 | sreg8 sreg8 | "mcoml\t%[1.1],%[1.1]" "mcoml\t%[1.2],%[1.2]" "bicl2\t%[1.1],%[2.1]" "bicl2\t%[1.2],%[2.2]" erase(%[1]) erase(%[2]) | %[2] | | and defined($1) | | remove(ALL) move({CONST4,$1},R0) "jsb\t.and" erase(R0) | | | and !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.and" erase(R0) | | | ior $1==4 | source4 source4 | allocate(%[1],%[2],REG) "bisl3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2] ... | NC sreg4 source4 | "bisl2\t%[2],%[1]" erase(%[1]) setcc(%[1]) | %[1] | | (3,4) + %[2] ... | NC source4 sreg4 | "bisl2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,4) + %[1] #ifdef REGVARS ior stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "bisl3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS ior stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "bisl3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | ior stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "bisl3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS ior sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "bisl3\t%[1],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | #endif REGVARS ior sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "bisl3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | ior sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "bisl3\t%[1],%[2],*$2(ap)" setcc({displdef4,LB,tostring($2)}) | | | ior ste $1==4 | source4 source4 | remove(externals) "bisl3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | ior $1==8 | sreg8 sreg8 | "bisl2\t%[1.1],%[2.1]" "bisl2\t%[1.2],%[2.2]" erase(%[2]) | %[2] | | ior defined($1) | STACK | move({CONST4,$1},R0) "jsb\t.ior" erase(R0) | | | ior !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.ior" erase(R0) | | | xor $1==4 | source4 source4 | allocate(%[1],%[2],REG) "xorl3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2] ... | NC sreg4 source4 | "xorl2\t%[2],%[1]" erase(%[1]) setcc(%[1]) | %[1] | | (3,4) + %[2] ... | NC source4 sreg4 | "xorl2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,4) + %[1] #ifdef REGVARS xor stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "xorl3\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS xor stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "xorl3\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | xor stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "xorl3\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS xor sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "xorl3\t%[1],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | #endif REGVARS xor sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "xorl3\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | xor sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "xorl3\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | xor ste $1==4 | source4 source4 | remove(externals) "xorl3\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | xor defined($1) | STACK | move({CONST4,$1},R0) "jsb\t.xor" erase(R0) | | | xor !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.xor" erase(R0) | | | com $1==4 | source4 | allocate(%[1],REG) "mcoml\t%[1],%[a]" setcc(%[a]) | %[a] | | #ifdef REGVARS com stl $1==4 && inreg($2)==2 | source4 | remove(regvar($2)) "mcoml\t%[1],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS com stl $1==4 && $2<0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "mcoml\t%[1],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | com stl $1==4 && $2>=0 | source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "mcoml\t%[1],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS com sil $1==4 && inreg($2)==2 | source4 | REMEXTANDLOC "mcoml\t%[1],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | #endif REGVARS com sil $1==4 && $2<0 | source4 | REMEXTANDLOC "mcoml\t%[1],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | com sil $1==4 && $2>=0 | source4 | REMEXTANDLOC "mcoml\t%[1],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | com ste $1==4 | source4 | remove(externals) "mcoml\t%[1],$2" setcc({EXTERNAL4,$2}) | | | com defined($1) | STACK | move({CONST4,$1},R0) "jsb\t.com" erase(R0) | | | com !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.com" erase(R0) | | | rol $1==4 | source4 source4 | allocate(%[1],REG=%[1]) "rotl\t%[a],%[2],%[a]" erase(%[a]) setcc(%[a]) | %[a] | | #ifdef REGVARS rol stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) "rotl\t%[1],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS rol stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "rotl\t%[1],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | rol stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "rotl\t%[1],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS rol sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC "rotl\t%[1],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | #endif REGVARS rol sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC "rotl\t%[1],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | rol sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC "rotl\t%[1],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | rol ste $1==4 | source4 source4 | remove(externals) "rotl\t%[1],%[2],$2" setcc({EXTERNAL4,$2}) | | | rol !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.rol" erase(R0) | | | ror $1==4 | source4 source4 | allocate(%[1],REG) "subl3\t%[1],$$32,%[a]" "rotl\t%[a],%[2],%[a]" setcc(%[a]) | %[a] | | ... | NC CONST source4 | allocate(%[2],REG) "rotl\t$$%(32-%[1.num]%),%[2],%[a]" setcc(%[a]) | %[a] | | #ifdef REGVARS ror stl $1==4 && inreg($2)==2 | source4 source4 | remove(regvar($2)) allocate(%[1],REG) "subl3\t%[1],$$32,%[a]" "rotl\t%[a],%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | ... | NC CONST source4 | remove(regvar($2)) "rotl\t$$%(32-%[1.num]%),%[2],%(regvar($2)%)" erase(regvar($2)) setcc(regvar($2)) | | | #endif REGVARS ror stl $1==4 && $2<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) allocate(%[1],REG) "subl3\t%[1],$$32,%[a]" "rotl\t%[a],%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | ... | NC CONST source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "rotl\t$$%(32-%[1.num]%),%[2],$2(fp)" setcc({LOCAL4,LB,$2,4}) | | | ror stl $1==4 && $2>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) allocate(%[1],REG) "subl3\t%[1],$$32,%[a]" "rotl\t%[a],%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | ... | NC CONST source4 | remove(displaced) remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2)) "rotl\t$$%(32-%[1.num]%),%[2],$2(ap)" setcc({LOCAL4,AP,$2,4}) | | | #ifdef REGVARS ror sil $1==4 && inreg($2)==2 | source4 source4 | REMEXTANDLOC allocate(%[1],REG) "subl3\t%[1],$$32,%[a]" "rotl\t%[a],%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | ... | NC CONST source4 | REMEXTANDLOC "rotl\t$$%(32-%[1.num]%),%[2],(%(regvar($2)%))" setcc({regdef4,regvar($2)}) | | | #endif REGVARS ror sil $1==4 && $2<0 | source4 source4 | REMEXTANDLOC allocate(%[1],REG) "subl3\t%[1],$$32,%[a]" "rotl\t%[a],%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | ... | NC CONST source4 | REMEXTANDLOC "rotl\t$$%(32-%[1.num]%),%[2],*$2(fp)" setcc({displdef4,LB,tostring($2)}) | | | ror sil $1==4 && $2>=0 | source4 source4 | REMEXTANDLOC allocate(%[1],REG) "subl3\t%[1],$$32,%[a]" "rotl\t%[a],%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | ... | NC CONST source4 | REMEXTANDLOC "rotl\t$$%(32-%[1.num]%),%[2],*$2(ap)" setcc({displdef4,AP,tostring($2)}) | | | ror ste $1==4 | source4 source4 | remove(externals) allocate(%[1],REG) "subl3\t%[1],$$32,%[a]" "rotl\t%[a],%[2],$2" setcc({EXTERNAL4,$2}) | | | ... | NC CONST source4 | remove(externals) "rotl\t$$%(32-%[1.num]%),%[2],$2" setcc({EXTERNAL4,$2}) | | | ror !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.ror" erase(R0) | | | com and $1==4 && $2==4 | source4 source4 | allocate(%[1],%[2],REG) "bicl3\t%[1],%[2],%[a]" setcc(%[a]) | %[a] | | (4,4)+%[1]+%[2] ... | NC source4 sreg4 | "bicl2\t%[1],%[2]" erase(%[2]) setcc(%[2]) | %[2] | | (3,4) + %[1] #ifdef REGVARS com and stl $1==4 && $2==4 && inreg($3)==2 | source4 source4 | remove(regvar($3)) "bicl3\t%[1],%[2],%(regvar($3)%)" erase(regvar($3)) setcc(regvar($3)) | | | #endif REGVARS com and stl $1==4 && $2==4 && $3<0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $3+3 && %[num]+%[size] > $3)) "bicl3\t%[1],%[2],$3(fp)" setcc({LOCAL4,AP,$3,4}) | | | com and stl $1==4 && $2==4 && $3>=0 | source4 source4 | remove(displaced) remove(LOCALS,(%[num] <= $3+3 && %[num]+%[size] > $3)) "bicl3\t%[1],%[2],$3(ap)" setcc({LOCAL4,AP,$3,4}) | | | #ifdef REGVARS com and sil $1==4 && $2==4 && inreg($3)==2 | source4 source4 | REMEXTANDLOC "bicl3\t%[1],%[2],(%(regvar($3)%))" setcc({regdef4,regvar($3)}) | | | #endif REGVARS com and sil $1==4 && $2==4 && $3<0 | source4 source4 | REMEXTANDLOC "bicl3\t%[1],%[2],*$3(fp)" setcc({displdef4,LB,tostring($3)}) | | | com and sil $1==4 && $2==4 && $3>=0 | source4 source4 | REMEXTANDLOC "bicl3\t%[1],%[2],*$3(ap)" setcc({displdef4,AP,tostring($3)}) | | | com and ste $1==4 &&$2==4 | source4 source4 | remove(externals) "bicl3\t%[1],%[2],$3" setcc({EXTERNAL4,$3}) | | | com and $1==$2 | STACK | move({CONST4,$1},R0) "jsb\t.cmand" erase(R0) | | | /******************************** * Group 10: Set instructions * ********************************/ loc inn $1==0 && $2==4 | source4 | allocate(%[1],REG) "bicl3\t$$~1,%[1],%[a]" setcc(%[a]) | %[a] | | loc inn $2==4 | source4 | allocate(%[1],REG) "ashl\t$$%(0-$1%),%[1],%[a]" "bicl2\t$$~1,%[a]" setcc(%[a]) | %[a] | | #ifdef LOCLABS inn $1==4 | source4 source4 | allocate(REG={CONST1,0}) "cmpl\t%[1],$$31" "bgtru\t1f" "mnegl\t%[1],%[a]" "ashl\t%[a],%[2],%[a]" "bicl2\t$$~1,%[a]\n1:" setcc(%[a]) erase(%[a]) | %[a] | | #endif loc inn zeq $2==4 | source4 | remove(ALL) "bitl\t%[1],$$%(1<<$1%)" "jeql\t$3" | | | loc inn zne $2==4 | source4 | remove(ALL) "bitl\t%[1],$$%(1<<$1%)" "jneq\t$3" | | | inn zeq $1==4 | source4-(reginc4+regdec4+ind4) source4 | remove(ALL) allocate(REG) "cmpl\t%[1],$$31" "jgtru\t$2" "ashl\t%[1],$$1,%[a]" "bitl\t%[2],%[a]" "jeql\t$2" | | | ... | NC source1 source4 | remove(ALL) allocate(REG) "cmpb\t%[1],$$31" "jgtru\t$2" "ashl\t%[1],$$1,%[a]" "bitl\t%[2],%[a]" "jeql\t$2" | | | #ifdef LOCLABS inn zne $1==4 | source4-(reginc4+regdec4+ind4) source4 | remove(ALL) allocate(REG) "cmpl\t%[1],$$31" "bgtru\t1f" "ashl\t%[1],$$1,%[a]" "bitl\t%[2],%[a]" "jneq\t$2\n1:" | | | ... | NC source1 source4 | remove(ALL) allocate(REG) "cmpb\t%[1],$$31" "bgtru\t1f" "ashl\t%[1],$$1,%[a]" "bitl\t%[2],%[a]" "jneq\t$2\n1:" | | | #endif loc inn zeq $2==8 && $1<32 /* First half of set. */ | REG REG | remove(ALL) "bitl\t%[1],$$%(1<<$1%)" "jeql\t$3" | | | loc inn zeq $2==8 && $1>=32 /* Second half. */ | REG REG | remove(ALL) "bitl\t%[2],$$%(1<<($1-32)%)" "jeql\t$3" | | | loc inn zne $2==8 && $1<32 /* First half of set. */ | REG REG | remove(ALL) "bitl\t%[1],$$%(1<<$1%)" "jneq\t$3" | | | loc inn zne $2==8 && $1>=32 /* Second half. */ | REG REG | remove(ALL) "bitl\t%[2],$$%(1<<($1-32)%)" "jneq\t$3" | | | inn defined($1) | STACK | move({CONST4,$1},R0) "jsb\t.inn" erase(R0) | R1 | | inn !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.inn" erase(R0) | R1 | | set $1==4 | source4 | | {CONST4,1} %[1] | sli 4 | set defined($1) | STACK | move({CONST4,$1},R0) "jsb\t.setx" erase(R0) | | | set !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.setx" erase(R0) | | | /**************************************** * Group 11 : Array instructions * ****************************************/ lae aar $2==4 && rom(1,3)==1 | | | | ads 4 adp 0-rom(1,1) | lae aar $2==4 && rom(1,3)==2 | | | | loc 1 sli 4 ads 4 adp 0-2*rom(1,1) | lae aar $2==4 && rom(1,3)==4 | | | | loc 2 sli 4 ads 4 adp 0-4*rom(1,1) | lae aar $2==4 && rom(1,3)==8 | | | | loc 3 sli 4 ads 4 adp 0-8*rom(1,1) | lae aar $2==4 && defined(rom(1,3)) && rom(1,1)==0 | source4 adispl | allocate(%[1],REG) "mull3\t$$%(rom(1,3)%),%[1],%[a]" | {adisplind1,%[a],%[2.reg],%[2.ind]} | | (8,10)+%[1] ... | NC source4 ADDR_EXTERNAL | allocate(%[1],REG) "mull3\t$$%(rom(1,3)%),%[1],%[a]" | {adispl,%[a],%[2.ind]} | | (7,16)+%[1] lae aar $2==4 && defined(rom(1,3)) | source4 adispl | allocate(%[1],REG) "mull3\t$$%(rom(1,3)%),%[1],%[a]" | {adisplind1,%[a],%[2.reg], %[2.ind]+"+"+tostring(0-rom(1,1)*rom(1,3))} | | (8,10)+%[1] ... | NC source4 ADDR_EXTERNAL | allocate(%[1],REG) "mull3\t$$%(rom(1,3)%),%[1],%[a]" | {adispl,%[a], %[2.ind]+"+"+tostring(0-rom(1,1)*rom(1,3))} | | (7,16)+%[1] /* Sequence used by the CEM-compiler and the codegenerator. */ loc sli ads $1==2 && $2==4 && $3==4 | reg4 ADDR_EXTERNAL | | {aextind4,%[1],%[2.ind]} | | ... | reg4 adispl | | {adisplind4,%[1],%[2.reg],%[2.ind]} | | ... | reg4 displ4 | | {adispldefind4,%[1],%[2.reg],%[2.ind]} | | ... | reg4 EXTERNAL4 | | {aextdefind4,%[1],%[2.ind]} | | loc sli ads $1==3 && $2==4 && $3==4 | reg4 ADDR_EXTERNAL | | {aextind8,%[1],%[2.ind]} | | ... | reg4 adispl | | {adisplind8,%[1],%[2.reg],%[2.ind]} | | ... | reg4 displ4 | | {adispldefind8,%[1],%[2.reg],%[2.ind]} | | ... | reg4 EXTERNAL4 | | {aextdefind8,%[1],%[2.ind]} | | aar $1==4 | STACK | "jsb\t.aar4" | R0 | | aar !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.aar" erase(R0) | R0 | | lae sar defined(rom(1,3)) | | | | lae $1 aar $2 sti rom(1,3) | lae lar defined(rom(1,3)) | | | | lae $1 aar $2 loi rom(1,3) | sar $1==4 | STACK | "jsb\t.sar4" | | | sar !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.sar" erase(R0) | | | lar $1==4 | STACK | "jsb\t.lar4" | | | lar !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.lar" erase(R0) | | | /**************************************** * Group 12 : Compare instructions * ****************************************/ cmi $1==4 | source4 source4 | allocate(REG={CONST1,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "beql\t2f" "bgtr\t1f" #else "beql\t.+10" "bgtr\t.+6" #endif "incl\t%[a]" #ifdef LOCLABS "brb\t2f\n1:" "decl\t%[a]\n2:" #else "brb\t.+4" "decl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmi !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.cmi" setcc(R0) erase(R0) | R0 | | cmf $1==4 | source4 source4 | allocate(REG={CONST1,0}) "cmpf\t%[1],%[2]" #ifdef LOCLABS "beql\t2f" "bgtr\t1f" #else "beql\t.+10" "bgtr\t.+6" #endif "incl\t%[a]" #ifdef LOCLABS "brb\t2f\n1:" "decl\t%[a]\n2:" #else "brb\t.+4" "decl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf $1==8 | source8 source8 | /* trouble, possible lack of scratch registers */ allocate(%[1],%[2],REG) "cmpd\t%[1],%[2]" #ifdef LOCLABS "blss\t2f" "bgtr\t1f" #else "blss\t.+8" "bgtr\t.+11" #endif "clrl\t%[a]" #ifdef LOCLABS "brb\t3f\n2:" #else "brb\t.+10" #endif "movl\t$$1,%[a]" #ifdef LOCLABS "brb\t3f\n1:" "mnegl\t$$1,%[a]\n3:" #else "brb\t.+5" "mnegl\t$$1,%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.cmf" setcc(R0) erase(R0) | R0 | | cmu $1==4 | | | | cmp | cmu !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.cmu" setcc(R0) erase(R0) | R0 | | cmp | source4 source4 | allocate(REG={CONST1,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "beqlu\t2f" "bgtru\t1f" #else "beqlu\t.+10" "bgtru\t.+6" #endif "incl\t%[a]" #ifdef LOCLABS "brb\t2f\n1:" "decl\t%[a]\n2:" #else "brb\t.+4" "decl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cms $1==4 | source4 source4 | allocate(%[1],%[2],REG) "xorl3\t%[1],%[2],%[a]" setcc(%[a]) erase(%[a]) | %[a] | | cms defined($1) | STACK | move({CONST1,$1},R0) "jsb\t.cms" setcc(R0) erase(R0) | R0 | | cms !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.cms" setcc(R0) erase(R0) | R0 | | tlt | source4 | allocate(REG={CONST1,0}) test(%[1]) #ifdef LOCLABS "bgeq\t1f" "incl\t%[a]\n1:" #else "bgeq\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2-regch4 | | {CONST1,0} | | tlt and $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "blss\t1f" "clrl\t%[2]\n1:" #else "blss\t.+4" "clrl\t%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | tlt ior $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "bgeq\t1f" "bisl2\t$$1,%[2]\n1:" #else "bgeq\t.+4" "bisl2\t$$1,%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | tle | source4 | allocate(REG={CONST1,0}) test(%[1]) #ifdef LOCLABS "bgtr\t1f" "incl\t%[a]\n1:" #else "bgtr\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2 | | %[1] | teq | tle and $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "bleq\t1f" "clrl\t%[2]\n1:" #else "bleq\t.+4" "clrl\t%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | tle ior $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "bgtr\t1f" "bisl2\t$$1,%[2]\n1:" #else "bgtr\t.+4" "bisl2\t$$1,%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | tge | source4 | allocate(REG={CONST1,0}) test(%[1]) #ifdef LOCLABS "blss\t1f" "incl\t%[a]\n1:" #else "blss\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2-regch4 | | {CONST1,1} | | tge and $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "bgeq\t1f" "clrl\t%[2]\n1:" #else "bgeq\t.+4" "clrl\t%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | tge ior $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "blss\t1f" "bisl2\t$$1,%[2]\n1:" #else "blss\t.+4" "bisl2\t$$1,%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | tgt | source4 | allocate(REG={CONST1,0}) test(%[1]) #ifdef LOCLABS "bleq\t1f" "incl\t%[a]\n1:" #else "bleq\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2 | | %[1] | tne | tgt and $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "bgtr\t1f" "clrl\t%[2]\n1:" #else "bgtr\t.+4" "clrl\t%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | tgt ior $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "bleq\t1f" "bisl2\t$$1,%[2]\n1:" #else "bleq\t.+4" "bisl2\t$$1,%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | teq | source1or2or4 | allocate(REG={CONST1,0}) test(%[1]) #ifdef LOCLABS "bneq\t1f" "incl\t%[a]\n1:" #else "bneq\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | teq and $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "beql\t1f" "clrl\t%[2]\n1:" #else "beql\t.+4" "clrl\t%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | teq ior $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "bneq\t1f" "bisl2\t$$1,%[2]\n1:" #else "bneq\t.+4" "bisl2\t$$1,%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | tne | source1or2or4 | allocate(REG={CONST1,0}) test(%[1]) #ifdef LOCLABS "beql\t1f" "incl\t%[a]\n1:" #else "beql\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | tne and $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "bneq\t1f" "clrl\t%[2]\n1:" #else "bneq\t.+4" "clrl\t%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | tne ior $2==4 | source4 sreg4 | test(%[1]) #ifdef LOCLABS "beql\t1f" "bisl2\t$$1,%[2]\n1:" #else "beql\t.+4" "bisl2\t$$1,%[2]" #endif setcc(%[2]) erase(%[2]) | %[2] | | cmi tlt $1==4 | source4 source4 | allocate(REG={CONST4,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "bleq\t1f" "incl\t%[a]\n1:" #else "bleq\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tlt | cmi tle $1==4 | source4 source4 | allocate(REG={CONST4,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "blss\t1f" "incl\t%[a]\n1:" #else "blss\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tle | cmi teq $1==4 | source4 source4 | allocate(REG={CONST4,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "bneq\t1f" "incl\t%[a]\n1:" #else "bneq\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 teq | cmi tne $1==4 | source4 source4 | allocate(REG={CONST4,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "beql\t1f" "incl\t%[a]\n1:" #else "beql\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tne | cmi tge $1==4 | source4 source4 | allocate(REG={CONST4,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "bgtr\t1f" "incl\t%[a]\n1:" #else "bgtr\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tge | cmi tgt $1==4 | source4 source4 | allocate(REG={CONST4,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "bgeq\t1f" "incl\t%[a]\n1:" #else "bgeq\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1or2 source1or2 | | %[2] %[1] | cmu 4 tgt | cmi tlt and $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "blss\t1f" "clrl\t%[3]\n1:" #else "blss\t.+4" "clrl\t%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi tle and $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bleq\t1f" "clrl\t%[3]\n1:" #else "bleq\t.+4" "clrl\t%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi teq and $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "beql\t1f" "clrl\t%[3]\n1:" #else "beql\t.+4" "clrl\t%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi tne and $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bneq\t1f" "clrl\t%[3]\n1:" #else "bneq\t.+4" "clrl\t%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi tge and $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bgeq\t1f" "clrl\t%[3]\n1:" #else "bgeq\t.+4" "clrl\t%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi tgt and $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bgtr\t1f" "clrl\t%[3]\n1:" #else "bgtr\t.+4" "clrl\t%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi tlt ior $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bgeq\t1f" "bisl2\t$$1,%[3]\n1:" #else "bgeq\t.+7" "bisl2\t$$1,%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi tle ior $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bgtr\t1f" "bisl2\t$$1,%[3]\n1:" #else "bgtr\t.+7" "bisl2\t$$1,%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi teq ior $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bneq\t1f" "bisl2\t$$1,%[3]\n1:" #else "bneq\t.+7" "bisl2\t$$1,%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi tne ior $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "beql\t1f" "bisl2\t$$1,%[3]\n1:" #else "beql\t.+7" "bisl2\t$$1,%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi tge ior $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "blss\t1f" "bisl2\t$$1,%[3]\n1:" #else "blss\t.+7" "bisl2\t$$1,%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmi tgt ior $1==4 && $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bleq\t1f" "bisl2\t$$1,%[3]\n1:" #else "bleq\t.+7" "bisl2\t$$1,%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | #ifdef FLOAT4 cmf tlt $1==4 | source4 source4 | allocate(REG={CONST1,0}) "cmpf\t%[1],%[2]" #ifdef LOCLABS "bleq\t1f" "incl\t%[a]\n1:" #else "bleq\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf tle $1==4 | source4 source4 | allocate(REG={CONST1,0}) "cmpf\t%[1],%[2]" #ifdef LOCLABS "blss\t1f" "incl\t%[a]\n1:" #else "blss\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf teq $1==4 | source4 source4 | allocate(REG={CONST1,0}) "cmpf\t%[1],%[2]" #ifdef LOCLABS "bneq\t1f" "incl\t%[a]\n1:" #else "bneq\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf tne $1==4 | source4 source4 | allocate(REG={CONST1,0}) "cmpf\t%[1],%[2]" #ifdef LOCLABS "beql\t1f" "incl\t%[a]\n1:" #else "beql\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf tge $1==4 | source4 source4 | allocate(REG={CONST1,0}) "cmpf\t%[1],%[2]" #ifdef LOCLABS "bgtr\t1f" "incl\t%[a]\n1:" #else "bgtr\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf tgt $1==4 | source4 source4 | allocate(REG={CONST1,0}) "cmpf\t%[1],%[2]" #ifdef LOCLABS "bgeq\t1f" "incl\t%[a]\n1:" #else "bgeq\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | #endif FLOAT4 #ifdef FLOAT8 cmf tlt $1==8 | source8 source8 | allocate(%[1],%[2],REG) "cmpd\t%[1],%[2]" #ifdef LOCLABS "bleq\t1f" "movl\t$$1,%[a]" "brb\t2f\n1:" "clrl\t%[a]\n2:" #else "bleq\t.+9" "movl\t$$1,%[a]" "brb\t.+4" "clrl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf tle $1==8 | source8 source8 | allocate(%[1],%[2],REG) "cmpd\t%[1],%[2]" #ifdef LOCLABS "blss\t1f" "movl\t$$1,%[a]" "brb\t2f\n1:" "clrl\t%[a]\n2:" #else "blss\t.+9" "movl\t$$1,%[a]" "brb\t.+4" "clrl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf teq $1==8 | source8 source8 | allocate(%[1],%[2],REG) "cmpd\t%[1],%[2]" #ifdef LOCLABS "bneq\t1f" "movl\t$$1,%[a]" "brb\t2f\n1:" "clrl\t%[a]\n2:" #else "bneq\t.+9" "movl\t$$1,%[a]" "brb\t.+4" "clrl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf tne $1==8 | source8 source8 | allocate(%[1],%[2],REG) "cmpd\t%[1],%[2]" #ifdef LOCLABS "beql\t1f" "movl\t$$1,%[a]" "brb\t2f\n1:" "clrl\t%[a]\n2:" #else "beql\t.+9" "movl\t$$1,%[a]" "brb\t.+4" "clrl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf tge $1==8 | source8 source8 | allocate(%[1],%[2],REG) "cmpd\t%[1],%[2]" #ifdef LOCLABS "bgtr\t1f" "movl\t$$1,%[a]" "brb\t2f\n1:" "clrl\t%[a]\n2:" #else "bgtr\t.+9" "movl\t$$1,%[a]" "brb\t.+4" "clrl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmf tgt $1==8 | source8 source8 | allocate(%[1],%[2],REG) "cmpd\t%[1],%[2]" #ifdef LOCLABS "bgeq\t1f" "movl\t$$1,%[a]" "brb\t2f\n1:" "clrl\t%[a]\n2:" #else "bgeq\t.+9" "movl\t$$1,%[a]" "brb\t.+4" "clrl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | #endif FLOAT8 /* Remember that cmu was replaced by cmp. */ cmp tlt | source4 source4 | allocate(REG={CONST1,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "blequ\t1f" "incl\t%[a]\n1:" #else "blequ\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1 source1 | allocate(REG={CONST1,0}) "cmpb\t%[1],%[2]" #ifdef LOCLABS "blequ\t1f" "incl\t%[a]\n1:" #else "blequ\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source2 source2 | allocate(REG={CONST1,0}) "cmpw\t%[1],%[2]" #ifdef LOCLABS "blequ\t1f" "incl\t%[a]\n1:" #else "blequ\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmp tle | source4 source4 | allocate(REG={CONST1,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "blssu\t1f" "incl\t%[a]\n1:" #else "blssu\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1 source1 | allocate(REG={CONST1,0}) "cmpb\t%[1],%[2]" #ifdef LOCLABS "blssu\t1f" "incl\t%[a]\n1:" #else "blssu\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source2 source2 | allocate(REG={CONST1,0}) "cmpw\t%[1],%[2]" #ifdef LOCLABS "blssu\t1f" "incl\t%[a]\n1:" #else "blssu\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmp teq | source4 source4 | allocate(REG={CONST1,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "bnequ\t1f" "incl\t%[a]\n1:" #else "bnequ\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1 source1 | allocate(REG={CONST1,0}) "cmpb\t%[1],%[2]" #ifdef LOCLABS "bnequ\t1f" "incl\t%[a]\n1:" #else "bnequ\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source2 source2 | allocate(REG={CONST1,0}) "cmpw\t%[1],%[2]" #ifdef LOCLABS "bnequ\t1f" "incl\t%[a]\n1:" #else "bnequ\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmp tne | source4 source4 | allocate(REG={CONST1,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "beqlu\t1f" "incl\t%[a]\n1:" #else "beqlu\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1 source1 | allocate(REG={CONST1,0}) "cmpb\t%[1],%[2]" #ifdef LOCLABS "beqlu\t1f" "incl\t%[a]\n1:" #else "beqlu\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source2 source2 | allocate(REG={CONST1,0}) "cmpw\t%[1],%[2]" #ifdef LOCLABS "beqlu\t1f" "incl\t%[a]\n1:" #else "beqlu\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmp tge | source4 source4 | allocate(REG={CONST1,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "bgtru\t1f" "incl\t%[a]\n1:" #else "bgtru\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1 source1 | allocate(REG={CONST1,0}) "cmpb\t%[1],%[2]" #ifdef LOCLABS "bgtru\t1f" "incl\t%[a]\n1:" #else "bgtru\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source2 source2 | allocate(REG={CONST1,0}) "cmpw\t%[1],%[2]" #ifdef LOCLABS "bgtru\t1f" "incl\t%[a]\n1:" #else "bgtru\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmp tgt | source4 source4 | allocate(REG={CONST1,0}) "cmpl\t%[1],%[2]" #ifdef LOCLABS "bgequ\t1f" "incl\t%[a]\n1:" #else "bgequ\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source1 source1 | allocate(REG={CONST1,0}) "cmpb\t%[1],%[2]" #ifdef LOCLABS "bgequ\t1f" "incl\t%[a]\n1:" #else "bgequ\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | ... | NC source2 source2 | allocate(REG={CONST1,0}) "cmpw\t%[1],%[2]" #ifdef LOCLABS "bgequ\t1f" "incl\t%[a]\n1:" #else "bgequ\t.+4" "incl\t%[a]" #endif erase(%[a]) setcc(%[a]) | %[a] | | cmp teq and $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "beql\t1f" "clrl\t%[3]\n1:" #else "beql\t.+4" "clrl\t%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmp tne and $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bneq\t1f" "clrl\t%[3]\n1:" #else "bneq\t.+4" "clrl\t%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmp teq ior $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "bneq\t1f" "bisl2\t$$1,%[3]\n1:" #else "bneq\t.+7" "bisl2\t$$1,%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cmp tne ior $3==4 | source4 source4 sreg4 | "cmpl\t%[2],%[1]" #ifdef LOCLABS "beql\t1f" "bisl2\t$$1,%[3]\n1:" #else "beql\t.+7" "bisl2\t$$1,%[3]" #endif setcc(%[3]) erase(%[3]) | %[3] | | cms teq $1==4 | | | | cmp teq | cms tne $1==4 | | | | cmp tne | /**************************************** * Group 13 : Branch instructions * ****************************************/ bra | STACK | "jbr\t$1" | | | blt | source4 source4 STACK | "cmpl\t%[1],%[2]" "jgtr\t$1" | | | ... | NC source2 source2 STACK | "cmpw\t%[1],%[2]" "jgtru\t$1" | | | ... | NC source1 source1 STACK | "cmpb\t%[1],%[2]" "jgtru\t$1" | | | ... | NC source4 STACK | "cmpl\t%[1],(sp)+" "jgtr\t$1" | | | ... | STACK | "cmpl\t(sp)+,(sp)+" "jgtr\t$1" | | | ble | source4 source4 STACK | "cmpl\t%[1],%[2]" "jgeq\t$1" | | | ... | NC source2 source2 STACK | "cmpw\t%[1],%[2]" "jgequ\t$1" | | | ... | NC source1 source1 STACK | "cmpb\t%[1],%[2]" "jgequ\t$1" | | | ... | NC source4 STACK | "cmpl\t%[1],(sp)+" "jgeq\t$1" | | | ... | STACK | "cmpl\t(sp)+,(sp)+" "jgeq\t$1" | | | beq | source4 source4 STACK | "cmpl\t%[1],%[2]" "jeql\t$1" | | | ... | NC source2 source2 STACK | "cmpw\t%[1],%[2]" "jeqlu\t$1" | | | ... | NC source1 source1 STACK | "cmpb\t%[1],%[2]" "jeqlu\t$1" | | | ... | NC source4 STACK | "cmpl\t%[1],(sp)+" "jeql\t$1" | | | ... | STACK | "cmpl\t(sp)+,(sp)+" "jeql\t$1" | | | bne | source4 source4 STACK | "cmpl\t%[1],%[2]" "jneq\t$1" | | | ... | NC source2 source2 STACK | "cmpw\t%[1],%[2]" "jnequ\t$1" | | | ... | NC source1 source1 STACK | "cmpb\t%[1],%[2]" "jnequ\t$1" | | | ... | NC source4 STACK | "cmpl\t%[1],(sp)+" "jneq\t$1" | | | ... | STACK | "cmpl\t(sp)+,(sp)+" "jneq\t$1" | | | bge | source4 source4 STACK | "cmpl\t%[1],%[2]" "jleq\t$1" | | | ... | NC source2 source2 STACK | "cmpw\t%[1],%[2]" "jlequ\t$1" | | | ... | NC source1 source1 STACK | "cmpb\t%[1],%[2]" "jlequ\t$1" | | | ... | NC source4 STACK | "cmpl\t%[1],(sp)+" "jleq\t$1" | | | ... | STACK | "cmpl\t(sp)+,(sp)+" "jleq\t$1" | | | bgt | source4 source4 STACK | "cmpl\t%[1],%[2]" "jlss\t$1" | | | ... | NC source2 source2 STACK | "cmpw\t%[1],%[2]" "jlssu\t$1" | | | ... | NC source1 source1 STACK | "cmpb\t%[1],%[2]" "jlssu\t$1" | | | ... | NC source4 STACK | "cmpl\t%[1],(sp)+" "jlss\t$1" | | | ... | STACK | "cmpl\t(sp)+,(sp)+" "jlss\t$1" | | | zlt | source4 STACK | test(%[1]) "jlss\t$1" samecc | | | ... | NC source1or2 | | %[1] | asp 4 | zle | source4 STACK | test(%[1]) "jleq\t$1" samecc | | | ... | NC source1or2 | | %[1] | zeq $1 | zeq | source1or2or4 STACK | test(%[1]) "jeql\t$1" samecc | | | zne | source1or2or4 STACK | test(%[1]) "jneq\t$1" samecc | | | zge | source4 STACK | test(%[1]) "jgeq\t$1" samecc | | | ... | NC source1or2 | | %[1] | asp 4 bra $1 | zgt | source4 STACK | test(%[1]) "jgtr\t$1" samecc | | | ... | NC source1or2 | | %[1] | zne $1 | cmf zlt $1==4 | source4 source4 STACK | "cmpf\t%[1],%[2]" "jgtr\t$2" | | | cmf zle $1==4 | source4 source4 STACK | "cmpf\t%[1],%[2]" "jgeq\t$2" | | | cmf zne $1==4 | source4 source4 STACK | "cmpf\t%[1],%[2]" "jneq\t$2" | | | cmf zeq $1==4 | source4 source4 STACK | "cmpf\t%[1],%[2]" "jeql\t$2" | | | cmf zge $1==4 | source4 source4 STACK | "cmpf\t%[1],%[2]" "jleq\t$2" | | | cmf zgt $1==4 | source4 source4 STACK | "cmpf\t%[1],%[2]" "jlss\t$2" | | | cmf zlt $1==8 | source8 source8 | remove(ALL) "cmpd\t%[1],%[2]" "jgtr\t$2" | | | cmf zle $1==8 | source8 source8 | remove(ALL) "cmpd\t%[1],%[2]" "jgeq\t$2" | | | cmf zne $1==8 | source8 source8 | remove(ALL) "cmpd\t%[1],%[2]" "jneq\t$2" | | | cmf zeq $1==8 | source8 source8 | remove(ALL) "cmpd\t%[1],%[2]" "jeql\t$2" | | | cmf zge $1==8 | source8 source8 | remove(ALL) "cmpd\t%[1],%[2]" "jleq\t$2" | | | cmf zgt $1==8 | source8 source8 | remove(ALL) "cmpd\t%[1],%[2]" "jlss\t$2" | | | cmp zlt | source4 source4 STACK | "cmpl\t%[1],%[2]" "jgtru\t$2" | | | ... | NC source1or2 source1or2 | | %[2] %[1] | blt $2 | cmp zle | source4 source4 STACK | "cmpl\t%[1],%[2]" "jgequ\t$2" | | | ... | NC source1or2 source1or2 | | %[2] %[1] | ble $2 | cmp zne | | | | bne $2 | cmp zeq | | | | beq $2 | cmp zge | source4 source4 STACK | "cmpl\t%[1],%[2]" "jlequ\t$2" | | | ... | NC source1or2 source1or2 | | %[2] %[1] | bge $2 | cmp zgt | source4 source4 STACK | "cmpl\t%[1],%[2]" "jlssu\t$2" | | | ... | NC source1or2 source1or2 | | %[2] %[1] | bgt $2 | cms zeq $1==4 | | | | cmp zeq $2 | cms zne $1==4 | | | | cmp zne $2 | /************************************************ * Group 14 : Procedure call instructions * ************************************************/ cai asp $2%4 == 0 && $2>=0 && $2 < 1024 | reg4 | remove(ALL) "calls\t$$%($2/4%),(%[1])" | | | cai | reg4 | remove(ALL) "calls\t$$0,(%[1])" | | | cal asp $2%4 == 0 && $2>=0 && $2 < 1024 | | remove(ALL) "calls\t$$%($2/4%),$1" | | | cal | | remove(ALL) "calls\t$$0,$1" | | | lfr $1==4 | | | R0 | | lfr $1==8 | | | QR0 | | asp ret $2==0 | | "ret" | | | ass ret $2==0 | | "ret" | | | asp lfr ret $2==$3 | | "ret" | | | ass lfr ret $2==$3 | | "ret" | | | lfr ret $1==$2 | | "ret" | | | ret $1==0 | | "ret" | | | ret $1==4 | NC bigsource4 | move(%[1],R0) "ret" | | | ... | STACK | "movl\t(sp)+,r0" "ret" | | | ret $1==8 | NC bigsource8 | move(%[1],QR0) "ret" | | | ... | STACK | "movq\t(sp)+,r0" "ret" | | | /******************************** * Group 15 : Miscellaneous * ********************************/ #ifdef REGVARS asp $1==4 | bigsource4 - regch4 | | | | #else REGVARS asp $1==4 | NC bigsource4 | | | | #endif REGVARS ... | STACK | "tstl\t(sp)+" | | | (2,7) asp $1>0 | STACK | "addl2\t$$$1,sp" | | | asp $1==(0-4) | | | {CONST4,0} | | asp $1==(0-8) | | | {CONST8,"0"} | | asp | STACK | "subl2\t$$%(0-$1%),sp" | | | ass $1==4 | source4 | remove(ALL) "addl2\t%[1],sp" | | | ass !defined($1) | source4 | remove(ALL) move(%[1],R2) /* R2 <= leave return area intact. */ "jsb\t.ass" erase(R2) | | | blm $1==4 | nonexist1 nonexist1 | remove(ALL) "movl\t%[2],%[1]" | | | blm $1==8 | nonexist1 nonexist1 | remove(ALL) "movq\t%[2],%[1]" | | | blm $1==12 | sreg4 sreg4 | remove(ALL) "movl\t(%[2])+,(%[1])+" "movq\t(%[2]),(%[1])" erase(%[1]) erase(%[2]) | | | blm $1==16 | sreg4 sreg4 | remove(ALL) "movq\t(%[2])+,(%[1])+" "movq\t(%[2]),(%[1])" erase(%[1]) erase(%[2]) | | | blm | sreg4 sreg4 | remove(ALL) allocate(REG={CONST1,$1/4}) #ifdef LOCLABS "1:\nmovl\t(%[2])+,(%[1])+" "sobgtr\t%[a],1b" #else "\nmovl\t(%[2])+,(%[1])+" "sobgtr\t%[a],.-3" #endif erase(%[1]) erase(%[2]) erase(%[a]) | | | bls $1==4 | | remove(ALL) move({CONST1,4},R0) "jsb\t.bls" erase(R0) | | | bls !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.bls" erase(R0) | | | csa $1==4 | STACK | "jmp\t.csa4" | | | csa !defined($1) | source4 | remove(ALL) move(%[1],R0) "jmp\t.csa" erase(R0) | | | csb $1==4 | STACK | "jmp\t.csb4" | | | csb !defined($1) | source4 | remove(ALL) move(%[1],R0) "jmp\t.csb" erase(R0) | | | dch | reg4 | | {displ4,%[1],"12"} | | dup stl $1==4 | | | | stl $2 lol $2 | dup $1==4 | dups4 | | %[1] %[1] | | #ifdef REGVARS dup $1==8 | bigsource8-regch8 | | %[1] %[1] | | #else REGVARS dup $1==8 | bigsource8 | | %[1] %[1] | | #endif REGVARS ... | dups4 dups4 | | %[2] %[1] %[2] %[1] | | dup | STACK | allocate(REG,REG={CONST1,$1/4}) "addl3\tsp,$$$1,%[a]" #ifdef LOCLABS "1:\nmovl\t-(%[a]),-(sp)" "sobgtr\t%[b],1b" #else "movl\t-(%[a]),-(sp)" "sobgtr\t%[b],.-3" #endif erase(%[b]) | | | dus $1==4 | source4 | remove(ALL) allocate(REG,REG) "ashl\t$$-2,%[1],%[b]" "addl3\tsp,%[1],%[a]" #ifdef LOCLABS "1:\nmovl\t-(%[a]),-(sp)" "sobgtr\t%[b],1b" #else "movl\t-(%[a]),-(sp)" "sobgtr\t%[b],.-3" #endif | | | dus !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.dus" erase(R0) | | | exg $1==4 | bigsource4-regch4 bigsource4-regch4 | | %[1] %[2] | | exg $1==8 | bigsource8-regch8 bigsource8-regch8 | | %[1] %[2] | | exg defined($1) | STACK | move({CONST4,$1},R0) "jsb\t.exg" erase(R0) | | | exg !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.exg" erase(R0) | | | fil | | "movl\t$$$1,hol0+4" | | | lim | | allocate(REG) "movl\t.trpim,%[a]" | %[a] | | lin | | "movl\t$$$1,hol0" | | | lni | | "incl\thol0" | | | gto | STACK | "pushl\t$$$1" "jmp\t.gto" | | | lor $1==0 | | | LB | | lor $1==1 | STACK | allocate(REG) "movl\tsp,%[a]" | %[a] | | lor $1==2 | | allocate(REG) "movl\t.reghp,%[a]" | %[a] | | lpb | bigsource4 | remove(ALL) move(%[1],R0) "jsb\t.lpb" erase(R0) | R0 | | mon | STACK | "jsb\t.mon" | | | nop | STACK | #ifdef DEBUG "jsb\t.nop" #endif | | | #ifdef DORCK rck $1==4 | STACK | "jsb\t.rck4" | | | rck !defined($1) | source4 | remove(ALL) move(%[1],R0) "jsb\t.rck" erase(R0) | | | #else DORCK #ifdef REGVARS rck defined($1) | bigsource4-regch4 | | | | rck !defined($1) | bigsource4-regch4 bigsource4-regch4 | | | | #else REGVARS rck defined($1) | bigsource4 | | | | rck !defined($1) | bigsource4 bigsource4 | | | | #endif REGVARS #endif DORCK rtt | | "ret" | | | sig | STACK | "jsb\t.sig" | | | sim | STACK | "jsb\t.sim" | | | str $1==0 | STACK | "jsb\t.strlb" | | | str $1==1 | source4 | remove(ALL) "movl\t%[1],sp" | | | str $1==2 | STACK | "jsb\t.strhp" | | | trp | STACK | "jsb\t.trp" | | | /******************************** * Coercions: * * * * A: From source to register, * * from nonexist to source. * ********************************/ | ADDR_EXTERNAL | | {DOUBLE,%[1.ind]} | | | source1 | allocate(%[1],REG=%[1]) | %[a] | | | source2 | allocate(%[1],REG=%[1]) | %[a] | | | bigsource4 | allocate(%[1],REG=%[1]) | %[a] | | | bigsource8 | allocate(%[1],QREG=%[1]) | %[a] | | | reg4 | | {adispl,%[1],"0"} | | | ADDR_LOCAL | | {adispl,%[1.reg],tostring(%[1.num])} | | | bigsource4-adispl-reg4-ADDR_LOCAL | allocate(%[1],REG=%[1]) | {adispl,%[a],"0"} | | /******************************** * B: From STACK to register * ********************************/ | STACK | allocate(REG) "movl\t(sp)+,%[a]" setcc(%[a]) | %[a] | | (3,7) | STACK | allocate(QREG) "movq\t(sp)+,%[a]" setcc(%[a]) | %[a] | | (3,10) | STACK | allocate(REG) "movl\t(sp)+,%[a]" setcc(%[a]) | {adispl,%[a],"0"} | | (3,7) /**************** * C: General * ****************/ | regdef8 | | {displ4,%[1.reg],"4"} {regdef4,%[1.reg]} | | | displ8 | | {displ4,%[1.reg],%[1.ind]+"+4"} {displ4,%[1.reg],%[1.ind]} | | | LOCAL8 | | {LOCAL4,%[1.reg],%[1.num]+4,4} {LOCAL4,%[1.reg],%[1.num],4}| | | EXTERNAL8 | | {EXTERNAL4,%[1.ind]+"+4"} {EXTERNAL4,%[1.ind]} | | | QREG | | %[1.2] %[1.1] | | | regdef4 | | {displ4,%[1.reg],"0"} | | | LOCAL4 | | {displ4,%[1.reg],tostring(%[1.num])} | | MOVES: (CONST %[num]==0,source1, "clrb\t%[2]", (2,4)+%[2]) (CONST %[num]==0,source2, "clrw\t%[2]", (2,4)+%[2]) (CONST %[num]==0,source4, "clrl\t%[2]" setcc(%[2]), (2,4)+%[2]) (CONST %[num]<0 && ufit(0-%[num],6),source2, "mnegw\t$$%(0-%[1.num]%),%[2]" setcc(%[2]), (2,4)+%[2]) (CONST ufit(%[num],8) && !ufit(%[num],6),source2, "movzbw\t%[1],%[2]" setcc(%[2]), (2,4)+%[2]) (CONST sfit(%[num],8) && !ufit(%[num],6),source2, "cvtbw\t%[1],%[2]" setcc(%[2]), (2,4)+%[2]) (CONST %[num]<0 && ufit(0-%[num],6),source4, "mnegl\t$$%(0-%[1.num]%),%[2]" setcc(%[2]), (2,4)+%[2]) (CONST ufit(%[num],8) && !ufit(%[num],6),source4, "movzbl\t%[1],%[2]" setcc(%[2]), (2,4)+%[2]) (CONST sfit(%[num],8) && !ufit(%[num],6),source4, "cvtbl\t%[1],%[2]" setcc(%[2]), (2,4)+%[2]) (CONST ufit(%[num],16) && !ufit(%[num],6),source4, "movzwl\t%[1],%[2]" setcc(%[2]), (2,4)+%[2]) (CONST sfit(%[num],16) && !ufit(%[num],6),source4, "cvtwl\t%[1],%[2]" setcc(%[2]), (2,4)+%[2]) (CONST8 %[ind]=="0",source8, "clrq\t%[2]" setcc(%[2]), (2,4)+%[2]) #ifdef REGVARS /* Tokens with side effects should not be remembered. */ (reginc1+regdec1,reg4, "movzbl\t%[1],%[2]" setcc(%[2]) erase(%[2]),(3,4)+%[1]) (reginc2+regdec2,reg4, "movzwl\t%[1],%[2]" setcc(%[2]) erase(%[2]),(3,4)+%[1]) (reginc4+regdec4,reg4, "movl\t%[1],%[2]" setcc(%[2]) erase(%[2]),(3,4)+%[1]) (reginc8+regdec8,reg8, "movq\t%[1],%[2]" setcc(%[2]) erase(%[2]),(3,7)+%[1]) #endif REGVARS (source8,source8, "movq\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (source4,source4, "movl\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (source2,source2, "movw\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (source1,source1, "movb\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (source1, reg4, "movzbl\t%[1],%[2]" setcc(%[2]) erase(%[2]),(3,4)+%[1]) (source2, reg4, "movzwl\t%[1],%[2]" setcc(%[2]) erase(%[2]),(3,4)+%[1]) (reg4, source1, "cvtlb\t%[1],%[2]" setcc(%[2]) erase(%[1]),(3,4)+%[2]) (reg4, source2, "cvtlw\t%[1],%[2]" setcc(%[2]) erase(%[1]),(3,4)+%[2]) (source1,source2, "movzbw\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (source1,source4, "movzbl\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (source2,source4, "movzwl\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (source2,source1, "cvtwb\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (source4,source1, "cvtlb\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (source4,source2, "cvtlw\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (aind1,source4, "movab\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (aind2,source4, "movaw\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (aind4,source4, "moval\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (aind8,source4, "movaq\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) (nonexist1,source4, "movab\t%[1],%[2]" setcc(%[2]), (3,4)+%[1]+%[2]) TESTS: (source1, "tstb\t%[1]" ,(2,4) + %[1]) (source2, "tstw\t%[1]" ,(2,4) + %[1]) (source4, "tstl\t%[1]" ,(2,4) + %[1]) STACKS: (CONST %[num]==0,, "clrl\t-(sp)", (2,7)) (CONST %[num]<0 && ufit(0-%[num],6),, "mnegl\t$$%(0-%[1.num]%),-(sp)", (2,7) + %[1]) (CONST ufit(%[num],6),, "pushl\t%[1]", (2,7) + %[1]) (CONST8 %[ind]=="0",, "clrq\t-(sp)", (2,10)) (CONST sfit(%[num],8),, "cvtbl\t%[1],-(sp)", (3,7) + %[1]) (source1,, "movzbl\t%[1],-(sp)", (3,7) + %[1]) (CONST sfit(%[num],16),, "cvtwl\t%[1],-(sp)", (3,7) + %[1]) (source2,, "movzwl\t%[1],-(sp)", (3,7) + %[1]) (source4,, "pushl\t%[1]" setcc(%[1]), (2,7) + %[1]) (source8,, "movq\t%[1],-(sp)" setcc(%[1]), (3,10)+ %[1]) (nonexist1,, "pushal\t%[1]", (2,7) + %[1]) (aind1,, "pushab\t%[1]", (2,7) + %[1]) (aind2,, "pushaw\t%[1]", (2,7) + %[1]) (aind4,, "pushal\t%[1]", (2,7) + %[1]) (aind8,, "pushaq\t%[1]", (2,7) + %[1])