"$Header$" #define SL 6 #define SSL "6" /* savsize is 6 because size of LB is 2 and size of z8000-PC is 4 */ #define NC nocoercions: /********************************************************* ** Back end tables for z8000 ** ** Author: Jan Voors ** ** ** ** wordsize = 2 bytes, pointersize = 2 bytes. ** ** ** ** Register R13 is used as LB, RR14 is the normal ** ** z8000-stackpointer. Some global variables are used: ** ** - reghp : the heap pointer ** ** - trpim : trap ignore mask ** ** - trppc : address of user defined trap handler ** ** ** ** Floating point arithmetic and constants are not ** ** implemented. ** ** ** *********************************************************/ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ EM_WSIZE = 2 EM_PSIZE = 2 EM_BSIZE = SL TIMEFACTOR = 3/4 REGISTERS: R0 = ("R0", 2), REG, B2REG. R1 = ("R1", 2), REG, B2REG, XREG. R2 = ("R2", 2), REG, B2REG, XREG. R3 = ("R3", 2), REG, B2REG, XREG. R4 = ("R4", 2), REG, B2REG, XREG. R5 = ("R5", 2), REG, B2REG, XREG. R6 = ("R6", 2), REG, B2REG, XREG. R7 = ("R7", 2), REG, B2REG, XREG. R8 = ("R8", 2), REG, XREG. R9 = ("R9", 2), REG, XREG. R10 = ("R10", 2), REG, XREG. R11 = ("R11", 2), REG, XREG. R12 = ("R12", 2), REG, XREG. LB = ("R13", 2), localbase. RR0 = ("RR0", 4, R0, R1), LWREG, LWB2REG. RR2 = ("RR2", 4, R2, R3), LWREG, LWB2REG, LWXREG. RR4 = ("RR4", 4, R4, R5), LWREG, LWB2REG, LWXREG. RR6 = ("RR6", 4, R6, R7), LWREG, LWB2REG, LWXREG. RR8 = ("RR8", 4, R8, R9), LWREG, LWXREG. RR10 = ("RR10", 4, R10, R11), LWREG, LWXREG. RQ0 = ("RQ0", 8, RR0, RR2), DLWREG. RQ4 = ("RQ4", 8, RR4, RR6), DLWREG. RQ8 = ("RQ8", 8, RR8, RR10), DLWREG. /* */ TOKENS: /* z8000-addressing-modes 'ra', 'ba' and 'bx' never used so far, ** so there are no tokens for them (yet). */ ir1 = { REGISTER lwxreg; } 2 cost=(0,2) "*%[lwxreg]" ir2 = { REGISTER lwxreg; } 2 cost=(0,2) "*%[lwxreg]" ir4 = { REGISTER lwxreg; } 4 cost=(0,5) "*%[lwxreg]" ir4_hi = { REGISTER lwreg; } 2 da1 = { STRING ind; } 2 cost=(4,4) "%[ind]" da2 = { STRING ind; } 2 cost=(4,4) "%[ind]" da4 = { STRING ind; } 4 cost=(4,7) "%[ind]" im2 = { INT num; } 2 cost=(2,2) "$%[num]" im4 = { INT num; } 4 cost=(4,5) "$%[num]" double = { STRING ind; } 4 cost=(4,5) "$%[ind]" x1 = { REGISTER xreg; INT ind; } 2 cost=(4,5) "%[ind](%[xreg])" x2 = { REGISTER xreg; INT ind; } 2 cost=(4,5) "%[ind](%[xreg])" x4 = { REGISTER xreg; INT ind; } 4 cost=(4,8) "%[ind](%[xreg])" ADDR_LOCAL = { INT ind; } 2 ADDR_EXTERNAL = { STRING ind; } 2 cost=(2,3) "$%[ind]" regconst2 = { REGISTER xreg; INT ind; } 2 TOKENEXPRESSIONS: REGS = REG + LWREG + DLWREG SCR_REG = REG * SCRATCH SCR_XREG = XREG * SCRATCH SCR_LWREG = LWREG * SCRATCH SCR_DLWREG = DLWREG * SCRATCH src1 = ir1 + da1 + x1 src2 = REG + ir2 + im2 + da2 + x2 + localbase + ADDR_EXTERNAL src4 = LWREG + ir4 + im4 + da4 + x4 + double indexed = x1 + x2 + x4 ind_access = ir1 + ir2 + ir4 da = da1 + da2 + da4 const2 = im2 + ADDR_EXTERNAL const4 = im4 + double allexceptcon = ALL - REGS - im2 - im4 - double - ADDR_LOCAL - ADDR_EXTERNAL src2a = ir2 + da2 + x2 src4a = ir4 + da4 + x4 src2b = REG + im2 + localbase + ADDR_EXTERNAL src4b = LWREG src2c = REG + ir2 + da2 + x2 CODE: /* */ /*************************************** ******** GROUP 1 ******** ***************************************/ loc | | | {im2, $1} | | ldc | | allocate( LWREG ) move( {im2, highw(1)}, %[a.1] ) move( {im2, loww(1)}, %[a.2] ) | %[a] | | lol | | | {x2, LB, $1} | | ldl | | | {x4, LB, $1} | | loe | | | {da2, $1} | | lde | | | {da4, $1} | | lil | | allocate( LWXREG ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) | {ir2,%[a]} | | lof | XREG | | {x2, %[1], $1} | | ... | NC regconst2 | | {x2, %[1.xreg], $1+%[1.ind]} | | ... | NC ADDR_EXTERNAL | | {da2, tostring($1)+"+"+%[1.ind]} | | ... | NC ADDR_LOCAL | | {x2, LB, %[1.ind]+$1} | | ldf | XREG | | {x4, %[1], $1} | | ... | NC regconst2 | | {x4, %[1.xreg], $1+%[1.ind]} | | ... | NC ADDR_EXTERNAL | | {da4, tostring($1)+"+"+%[1.ind]} | | ... | NC ADDR_LOCAL | | {x4, LB, %[1.ind]+$1} | | lal | | | { ADDR_LOCAL, $1 } | | lae | | | { ADDR_EXTERNAL, $1 } | | lxl $1==0 | | | LB | | lxl $1==1 | | | {x2, LB, SL} | | lxl $1==2 | | allocate( XREG = {x2, LB, SL} ) | {x2, %[a], SL}| | lxl $1>2 | | allocate( XREG = {x2, LB, SL}, REG = {im2, $1-1} ) "1:\tld %[a], 6(%[a])" "djnz %[b], 1b" erase(%[a]) erase(%[b]) samecc | %[a] | | lxa $1==0 | | | {ADDR_LOCAL, SL} | | lxa $1==1 | | allocate( XREG = {x2, LB, SL} ) | {regconst2, %[a], SL} | | lxa $1==2 | | allocate( XREG = {x2, LB, SL} ) move( {x2, %[a], SL }, %[a] ) | {regconst2, %[a], SL} | | lxa $1>2 | | allocate( XREG = {x2, LB, SL}, REG = {im2, $1-1} ) "1:\tld %[a], 6(%[a])" "djnz %[b], 1b" erase(%[a]) erase(%[b]) samecc | {regconst2, %[a], SL} | | loi $1==1 | NC regconst2 | | {x1, %[1.xreg], %[1.ind]} | | ... | NC ADDR_LOCAL| | {x1, LB, %[1.ind]} | | ... | NC ADDR_EXTERNAL | | {da1, %[1.ind]} | | ... | src2 | allocate( %[1], LWXREG ) move( %[1], %[a.2] ) move( {im2, 0}, %[a.1] ) | {ir1, %[a]} | | loi $1==2 | NC regconst2 | | {x2, %[1.xreg], %[1.ind]} | | ... | NC ADDR_LOCAL| | {x2, LB, %[1.ind]} | | ... | NC ADDR_EXTERNAL | | {da2, %[1.ind]} | | ... | src2 | allocate( %[1], LWXREG ) move( %[1], %[a.2] ) move( {im2, 0}, %[a.1] ) | {ir2, %[a]} | | loi $1==4 | NC regconst2 | | {x4, %[1.xreg], %[1.ind]} | | ... | NC ADDR_LOCAL| | {x4, LB, %[1.ind]} | | ... | NC ADDR_EXTERNAL | | {da4, %[1.ind]} | | ... | src2 | allocate( %[1], LWXREG ) move( %[1], %[a.2] ) move( {im2, 0}, %[a.1] ) | {ir4, %[a]} | | loi $1>4 | src2 STACK | allocate( REG = {im2, $1/2} ) allocate( %[1], LWXREG ) move( %[1], %[b.2] ) move( {im2, 0}, %[b.1] ) "add %[b.2], $$$1-2" "dec R15, $$2" "lddr *RR14, *%[b], %[a]" "inc R15, $$2" erase(%[a]) erase(%[b]) nocc | | | lal loi $2==6 | STACK | "push *RR14, $1+4(R13)" "pushl *RR14, $1(R13)" | | | lal loi $2==8 | STACK | "pushl *RR14, $1+4(R13)" "pushl *RR14, $1(R13)" | | | lae loi $2==6 | STACK | "push *RR14, $1+4" "pushl *RR14, $1" | | | lae loi $2==8 | STACK | "pushl *RR14, $1+4" "pushl *RR14, $1" | | | los $1==2 | STACK | "calr los2" | | | los !defined($1)| src2c STACK | "cp %[1], $$2" "jr NE, unknown" "calr los2" | | | lpi | | | {ADDR_EXTERNAL, $1} | | /* */ /*************************************** ******** GROUP 2 ******** ***************************************/ stl | src2b | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 )) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) move( %[1], {x2, LB, $1} ) | | | ste | src2b | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) move( %[1], {da2, $1} ) | | | sil | src2b | remove( allexceptcon ) allocate( LWXREG ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) move( %[1], {ir2, %[a]} ) | | | stf | regconst2 src2b | remove( allexceptcon ) move( %[2], {x2, %[1.xreg], $1+%[1.ind]} ) | | | ... | ADDR_EXTERNAL src2b | remove( allexceptcon ) move( %[2], {da2, tostring($1)+"+"+%[1.ind]} ) | | | sti $1==1 | regconst2 const2 | remove( allexceptcon ) move( %[2], {x1, %[1.xreg], %[1.ind]} ) | | | ... | regconst2 B2REG | remove( allexceptcon ) move( %[2], {x1, %[1.xreg], %[1.ind]} ) | | | ... | NC ADDR_LOCAL const2 | remove( allexceptcon ) move( %[2], {x1, LB, %[1.ind]} ) | | | ... | ADDR_LOCAL B2REG | remove( allexceptcon ) move( %[2], {x1, LB, %[1.ind]} ) | | | ... | NC ADDR_EXTERNAL const2 | remove( allexceptcon ) move( %[2], {da1, %[1.ind]} ) | | | ... | ADDR_EXTERNAL B2REG | remove( allexceptcon ) move( %[2], {da1, %[1.ind]} ) | | | ... | src2 const2 | remove( allexceptcon ) allocate( %[1], LWXREG ) move( %[1], %[a.2] ) move( {im2, 0}, %[a.1] ) move( %[2], {ir1, %[a]} ) | | | ... | src2 B2REG | remove( allexceptcon ) allocate( %[1], LWXREG ) move( %[1], %[a.2] ) move( {im2, 0}, %[a.1] ) move( %[2], {ir1, %[a]} ) | | | sti $1==2 | regconst2 src2b | remove( allexceptcon ) move( %[2], {x2, %[1.xreg], %[1.ind]} ) | | | ... | ADDR_LOCAL src2b | remove( allexceptcon ) move( %[2], {x2, LB, %[1.ind]} ) | | | ... | ADDR_EXTERNAL src2b | remove( allexceptcon ) move( %[2], {da2, %[1.ind]} ) | | | ... | src2 src2b | remove( allexceptcon ) allocate( %[1], LWXREG ) move( %[1], %[a.2] ) move( {im2, 0}, %[a.1] ) move( %[2], {ir2, %[a]} ) | | | sti $1==4 | regconst2 src4b | remove( allexceptcon ) move( %[2], {x4, %[1.xreg], %[1.ind]} ) | | | ... | ADDR_LOCAL src4b | remove( allexceptcon ) move( %[2], {x4, LB, %[1.ind]} ) | | | ... | ADDR_EXTERNAL src4b | remove( allexceptcon ) move( %[2], {da4, %[1.ind]} ) | | | ... | src2 src4b | remove( allexceptcon ) allocate( %[1], LWXREG ) move( %[1], %[a.2] ) move( {im2, 0}, %[a.1] ) move( %[2], {ir4, %[a]} ) | | | sti $1>4 | src2 STACK | allocate( REG = {im2, $1/2} ) allocate( %[1], LWXREG ) move( %[1], %[b.2] ) move( {im2, 0}, %[b.1] ) "ldir *%[b], *RR14, %[a]" erase(%[a]) erase(%[b]) nocc | | | lal sti $2>4 && $2<=8 | NC src2b | | %[1] | stl $1 lal $1+2 sti $2-2 | ... | | | {ADDR_LOCAL, $1} | sti $2 | sts $1==2 | STACK | "calr sts2" | | | sts !defined($1)| src2c STACK | "cp %[1], $$2" "jr NE, unknown" "calr sts2" | | | sdl | src4b | remove( x2, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+2 )) remove( x4, %[xreg]==LB && ( %[ind]>=$1-2 && %[ind]<=$1+2 )) remove( x1, %[xreg]==LB && ( %[ind]>=$1 && %[ind]<=$1+3 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) move( %[1], {x4, LB, $1} ) | | | sde | src4b | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) move( %[1], {da4, $1} ) | | | sdf | regconst2 src4b | remove( allexceptcon ) move( %[2], {x4, %[1.xreg], $1+%[1.ind]} ) | | | ... | ADDR_EXTERNAL src4b | remove( allexceptcon ) move( %[2], {da4, tostring($1)+"+"+%[1.ind]} ) | | | /* */ /*************************************** ******** GROUP 3 ******** ***************************************/ adi $1==2 | NC SCR_XREG im2 | | {regconst2, %[1], %[2.num]} | | ... | NC SCR_XREG ADDR_LOCAL | "add %[1], R13" erase(%[1]) | {regconst2, %[1], %[2.ind]} | | ... | NC REG ADDR_LOCAL | allocate( XREG ) "ld %[a], R13" "add %[a], %[1]" erase(%[a]) | {regconst2, %[a], %[2.ind]} | | ... | NC SCR_XREG regconst2 | "add %[1], %[2.xreg]" erase(%[1]) | {regconst2, %[1], %[2.ind]} | | ... | NC im2 ADDR_LOCAL | | {ADDR_LOCAL, %[1.num]+%[2.ind]} | | ... | NC src2 im2+ADDR_LOCAL | allocate( %[1], XREG = %[1] ) | %[2] %[a] | adi 2 | ... | NC src2 regconst2 | "add %[2.xreg], %[1]" erase(%[2.xreg]) | %[2] | | ... | NC regconst2 im2 | | {regconst2, %[1.xreg], %[2.num]+%[1.ind]} | | ... | NC regconst2 ADDR_LOCAL | "add %[1.xreg], R13" erase(%[1.xreg]) | {regconst2, %[1.xreg], %[2.ind]+%[1.ind]} | | ... | NC regconst2 regconst2 | "add %[1.xreg],%[2.xreg]" erase(%[1.xreg]) | {regconst2, %[1.xreg], %[2.ind]+%[1.ind]} | | ... | NC regconst2 src2-im2 | "add %[1.xreg], %[2]" erase(%[1.xreg]) | %[1] | | ... | NC ADDR_LOCAL regconst2 | "add %[2.xreg], R13" erase(%[2.xreg]) | {regconst2, %[2.xreg], %[1.ind]+%[2.ind]} | | ... | NC ADDR_LOCAL src2 | | %[1] %[2] | adi 2 | ... | NC SCR_REG src2-im2 | "add %[1], %[2]" erase(%[1]) setcc(%[1]) | %[1] | | ... | src2 SCR_REG | "add %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | adi $1==4 | src4 SCR_LWREG | "addl %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (2,8)+%[1] ... | SCR_LWREG src4 | "addl %[1], %[2]" erase(%[1]) setcc(%[1]) | %[1] | | (2,8)+%[2] sbi $1==2 | src2 SCR_REG | "sub %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (2,4)+%[1] ... | SCR_REG src2 | "sub %[1], %[2]" erase(%[1]) | %[1] | ngi 2 | (2,4)+%[2] sbi $1==4 | src4 SCR_LWREG | "subl %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (2,8)+%[1] ... | SCR_LWREG src4 | "subl %[1], %[2]" erase(%[1]) | %[1] | ngi 4 | (2,8)+%[2] mli $1==2 | src2 src2 | allocate( %[2], LWREG ) move( %[2], %[a.2] ) "mult %[a], %[1]" erase(%[a]) setcc(%[a.2]) | %[a.2] | | mli $1==4 | src4 src4 | allocate( %[2], DLWREG ) move( %[2], %[a.2] ) "multl %[a], %[1]" erase(%[a]) setcc(%[a.2]) | %[a.2] | | dvi $1==2 | src2 src2 | allocate( %[2], LWREG ) move( %[2], %[a.2] ) "exts %[a]" "div %[a], %[1]" erase(%[a]) nocc | %[a.2] | | dvi $1==4 | src4 src4 | allocate( %[2], DLWREG ) move( %[2], %[a.2] ) "extsl %[a]" "divl %[a], %[1]" erase(%[a]) nocc | %[a.2] | | rmi $1==2 | src2 src2 | allocate( %[2], LWREG ) move( %[2], %[a.2] ) "exts %[a]" "div %[a], %[1]" erase(%[a]) nocc | %[a.1] | | rmi $1==4 | src4 src4 | allocate( %[2], DLWREG ) move( %[2], %[a.2] ) "extsl %[a]" "divl %[a], %[1]" erase(%[a]) nocc | %[a.1] | | ngi $1==2 | SCR_REG | "neg %[1]" erase(%[1]) setcc(%[1]) | %[1] | | (2,7) ngi $1==4 | src4 | allocate( LWREG = {im4, 0} ) "subl %[a], %[1]" erase(%[a]) setcc(%[a]) | %[a] | | (2,8)+%[1] sli $1==2 | im2 SCR_REG | "sla %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (2,0) ... | REG SCR_REG | "sda %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (4,2) sli $1==4 | im2 SCR_LWREG | "slal %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (2,0) ... | REG SCR_LWREG | "sdal %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (4,2) sri $1==2 | im2 SCR_REG | allocate( REG = {im2, 0-%[1.num]} ) "sda %[2], %[a]" erase(%[2]) setcc(%[2]) | %[2] | | (4,2) ... | REG SCR_REG | "neg %[1]" "sda %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (6,9) sri $1==4 | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} ) "sdal %[2], %[a]" erase(%[2]) setcc(%[2]) | %[2] | | (4,2) ... | REG SCR_LWREG | "neg %[1]" "sdal %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (6,9) lol loc adi stl $1==$4 && $3==2 && $2>=0-16 && $2<=16 | | | | loc $2 lol $1 adi $3 stl $4 | loc lol adi stl $2==$4 && $3==2 && $1>0 && $1<=16 | | remove( x2, %[xreg]==LB && %[ind]==$2 ) remove( x4, %[xreg]==LB && ( %[ind]==$2-2 || %[ind]==$2 )) remove( x1, %[xreg]==LB && ( %[ind]==$2 || %[ind]==$2+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $2(R13), $$$1" setcc({x2, LB, $2}) | | | loc lol adi stl $2==$4 && $3==2 && $1<0 && $1>=0-16 | | remove( x2, %[xreg]==LB && %[ind]==$2 ) remove( x4, %[xreg]==LB && ( %[ind]==$2-2 || %[ind]==$2 )) remove( x1, %[xreg]==LB && ( %[ind]==$2 || %[ind]==$2+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $2(R13), $$0-$1" setcc({x2, LB, $2}) | | | loe loc adi ste $1==$4 && $3==2 && $2>=0-16 && $2<=16 | | | | loc $2 loe $1 adi $3 ste $4 | loc loe adi ste $2==$4 && $3==2 && $1>0 && $1<=16 | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $2, $$$1" setcc({da2, $2}) | | | loc loe adi ste $2==$4 && $3==2 && $1<0 && $1>=0-16 | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $2, $$0-$1" setcc({da2, $2}) | | | lil loc adi sil $1==$4 && $3==2 && $2>=0-16 && $2<=16 | | | | loc $2 lil $1 adi $3 sil $4 | loc lil adi sil $2==$4 && $3==2 && $1>0 && $1<=16 | | remove( allexceptcon ) allocate( LWXREG ) move( {x2, LB, $2}, %[a.2] ) move( {im2, 0}, %[a.1] ) "inc *%[a], $$$1" setcc({ir2, %[a]}) | | | loc lil adi sil $2==$4 && $3==2 && $1<0 && $1>=0-16 | | remove( allexceptcon ) allocate( LWXREG ) move( {x2, LB, $2}, %[a.2] ) move( {im2, 0}, %[a.1] ) "dec *%[a], $$0-$1" setcc({ir2, %[a]}) | | | lol loc sbi stl $1==$4 && $3==2 && $2>0 && $2<=16 | | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 )) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $1(R13), $$$2" setcc({x2, LB, $1}) | | | lol loc sbi stl $1==$4 && $3==2 && $2<0 && $2>=0-16 | | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 )) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $1(R13), $$0-$2" setcc({x2, LB, $1}) | | | loe loc sbi ste $1==$4 && $3==2 && $2>0 && $2<=16 | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $1, $$$2" setcc({da2, $1}) | | | loe loc sbi ste $1==$4 && $3==2 && $2<0 && $2>=0-16 | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $1, $$0-$2" setcc({da2, $1}) | | | lil loc sbi sil $1==$4 && $3==2 && $2>0 && $2<=16 | | remove( allexceptcon ) allocate( LWXREG ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "dec *%[a], $$$2" setcc({ir2, %[a]}) | | | lil loc sbi sil $1==$4 && $3==2 && $2<0 && $2>=0-16 | | remove( allexceptcon ) allocate( LWXREG ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "inc *%[a], $$0-$2" setcc({ir2, %[a]}) | | | lol ngi stl $1==$3 && $2==2 | | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 )) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) remove( allexceptcon ) "neg $1(R13)" setcc({x2, LB, $1}) | | | loe ngi ste $1==$3 && $2==2 | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "neg $1" setcc({da2, $1}) | | | lil ngi sil $1==$3 && $2==2 | | remove( allexceptcon ) allocate( LWXREG ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "neg *%[a]" setcc({ir2, %[a]}) | | | loc sli $1>=0 && $1<=16 && $2==2 | SCR_REG | "sla %[1], $$$1" erase(%[1]) setcc(%[1]) | %[1] | | loc sli $1>=0 && $1<=32 && $2==4 | SCR_LWREG | "slal %[1], $$$1" erase(%[1]) setcc(%[1]) | %[1] | | loc sri $1>=0 && $1<=16 && $2==2 | SCR_REG | "sra %[1], $$-$1" erase(%[1]) setcc(%[1]) | %[1] | | loc sri $1>=0 && $1<=32 && $2==4 | SCR_LWREG | "sral %[1], $$-$1" erase(%[1]) setcc(%[1]) | %[1] | | loc sru $1>=0 && $1<=16 && $2==2 | SCR_REG | "srl %[1], $$-$1" erase(%[1]) setcc(%[1]) | %[1] | | loc sru $1>=0 && $1<=32 && $2==4 | SCR_LWREG | "srll %[1], $$-$1" erase(%[1]) setcc(%[1]) | %[1] | | /* */ /*************************************** ******** GROUP 4 ******** ***************************************/ /* adu = adi ** sbu = sbi ** mlu = mli ** slu = sli */ adu | | | | adi $1 | sbu | | | | sbi $1 | mlu | | | | mli $1 | slu | | | | sli $1 | dvu $1==2 | STACK | "calr dvu2" | R1 | | dvu $1==4 | STACK | "calr dvu4" | R3 R2 | | rmu $1==2 | STACK | "calr rmu2" | R0 | | rmu $1==4 | STACK | "calr rmu4" | R1 R0 | | sru $1==2 | im2 SCR_REG | allocate( REG = {im2, 0-%[1.num]} ) "sdl %[2], %[a]" erase(%[2]) setcc(%[2]) | %[2] | | (4,2) ... | REG SCR_REG | "neg %[1]" "sdl %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (6,9) sru $1==4 | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} ) "sdll %[2], %[a]" erase(%[2]) setcc(%[2]) | %[2] | | (4,2) ... | REG SCR_LWREG | "neg %[1]" "sdll %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (6,9) /* */ /*************************************** ******** GROUP 6 ******** ***************************************/ adp | SCR_XREG | | {regconst2, %[1], $1} | | ... | NC regconst2 | | {regconst2, %[1.xreg], $1+%[1.ind]} | | ... | NC ADDR_LOCAL | | {ADDR_LOCAL, %[1.ind]+$1 } | | ... | NC ADDR_EXTERNAL | | {ADDR_EXTERNAL, tostring($1)+"+"+%[1.ind]} | | lil adp sil $1==$3 && $2>0 && $2<=16 | | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "inc *%[a], $$$2" setcc({ir2, %[a]}) | | | lil adp sil $1==$3 && $2<0 && $2>=0-16 | | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "dec *%[a], $$0-$2" setcc({ir2, %[a]}) | | | lil adp dup sil adp $1==$4 && $3==2 && $2==1 && $5==0-1 | | allocate( LWXREG, XREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "ld %[b], *%[a]" "inc *%[a]" | {regconst2, %[b], 0} | | /* because the next EM-instruction ** will be `loi'. */ lil adp dup sil $1==$4 && $3==2 && $2==1 | | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "inc *%[a]" setcc({ir2, %[a]}) | {ir2,%[a]} | | lol lol adp stl $1==$2 && $2==$4 && $3>0 && $3<=16 | | allocate( REG = {x2, LB, $1} ) remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 )) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $1(R13), $$$3" setcc({x2, LB, $1}) | %[a] | | lol lol adp stl $1==$2 && $2==$4 && $3<0 && $3>=0-16 | | allocate( REG = {x2, LB, $1} ) remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 )) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $1(R13), $$0-$3" setcc({x2, LB, $1}) | %[a] | | loe loe adp ste $1==$2 && $2==$4 && $3>0 && $3<=16 | | allocate( REG = {da2, $1} ) remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $1, $$$3" setcc({da2, $1}) | %[a] | | loe loe adp ste $1==$2 && $2==$4 && $3<0 && $3>=0-16 | | allocate( REG = {da2, $1} ) remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $1, $$0-$3" setcc({da2, $1}) | %[a] | | lol adp stl $1==$3 && $2>0 && $2<=16 | | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 )) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $1(R13), $$$2" setcc({x2, LB, $1}) | | | lol adp stl $1==$3 && $2<0 && $2>=0-16 | | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 )) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $1(R13), $$0-$2" setcc({x2, LB, $1}) | | | loe adp ste $1==$3 && $2>0 && $2<=16 | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $1, $$$2" setcc({da2, $1}) | | | loe adp ste $1==$3 && $2<0 && $2>=0-16 | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $1, $$0-$2" setcc({da2, $1}) | | | ads $1==2 | | | | adi $1 | ads $1==4 | | | | adi $1 | sbs $1==2 | | | | sbi $1 | sbs $1==4 | | | | sbi $1 | /* */ /*************************************** ******** GROUP 7 ******** ***************************************/ inc | SCR_REG | "inc %[1]" erase(%[1]) setcc(%[1]) | %[1] | | lil inc sil $1==$3 | | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "inc *%[a]" setcc({ir2, %[a]}) | | | dec | SCR_REG | "dec %[1]" erase(%[1]) setcc(%[1]) | %[1] | | lil dec sil $1==$3 | | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "dec *%[a]" setcc({ir2, %[a]}) | | | lil dec dup sil $1==$4 && $3==2 | | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "dec *%[a]" setcc({ir2, %[a]}) | {ir2,%[a]} | | inl | | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) ) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $1(R13)" setcc({x2, LB, $1}) | | | del | | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) ) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $1(R13)" setcc({x2, LB, $1}) | | | zrl | | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) ) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "clr $1(R13)" samecc | | | ine | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "inc $1" setcc({da2, $1}) | | | dee | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "dec $1" setcc({da2, $1}) | | | zre | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "clr $1" samecc | | | zer $1==2 | | | {im2, 0} | | zer $1==4 | | | {im4, 0} | | zer $1==6 | | | {im4, 0} {im2, 0} | | zer $1==8 | | | {im4, 0} {im4, 0} | | zer $1>8 | | remove( ALL ) allocate( REG = {im2, $1/2} ) /*nr of words*/ "1:\tpush *RR14, $$0" "djnz %[a], 1b" erase(%[a]) samecc | | | zer !defined($1)| SCR_REG | remove( ALL ) "sra %[1]" "1:\tpush *RR14, $$0" "djnz %[1], 1b" erase(%[1]) nocc | | | /* */ /*************************************** ******** GROUP 8 ******** ***************************************/ cii | STACK | "calr cii" | | | loc loc cii $1==1 && $2==2 | NC src1 | allocate( %[1], B2REG = %[1] ) | %[a] | | ... | src2 | allocate( %[1], REG = %[1] ) "extsb %[a]" erase(%[a]) samecc | %[a] | | loc loc cii $1==1 && $2==4 | NC src1 | allocate( %[1], LWB2REG ) move( %[1], %[a.2] ) "exts %[a]" samecc | %[a] | | ... | src2 | allocate( %[1], LWREG ) move( %[1], %[a.2] ) "exts %[a]" samecc | %[a] | | loc loc cii $1==2 && $2==4 | src2 | allocate( %[1], LWREG ) move( %[1], %[a.2] ) "exts %[a]" samecc | %[a] | | loc loc loc cii $1>=0 && $2==2 && $3==4 | | | | loc $1 loc 0 | loc loc loc cii $1< 0 && $2==2 && $3==4 | | | | loc $1 loc 0-1 | loc loc cii $1==4 && $2==2 | src2 src2 | | %[2] | | loc loc cuu $1==2 && $2==4 | | | {im2, 0} | | loc loc cuu $1==4 && $2==2 | src2 | | | | cuu | STACK | "calr cuu" | | | ciu | | | | cuu | cui | | | | cuu | /* */ /*************************************** ******** GROUP 9 ******** ***************************************/ and $1==2 | SCR_REG src2 | "and %[1], %[2]" erase(%[1]) setcc(%[1]) | %[1] | | (2,4)+%[2] ... | src2 SCR_REG | "and %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (2,4)+%[1] and $1>2 | | remove( ALL ) allocate( LWXREG, REG, REG = {im2, $1/2} ) "ldl %[a], RR14" "addl %[a], $$$1" "1:\tpop %[b], *RR14" "and %[b], *%[a]" "ld *%[a], %[b]" "inc %[a.2], $$2" "djnz %[c], 1b" erase(%[c]) nocc | | | and !defined($1)| SCR_REG | remove( ALL ) allocate( LWXREG, REG ) "ldl %[a], RR14" "addl %[a], $$$1" "sra %[1]" "1:\tpop %[b], *RR14" "and %[b], *%[a]" "ld *%[a], %[b]" "inc %[a.2], $$2" "djnz %[1], 1b" erase(%[1]) nocc | | | ior $1==2 | SCR_REG src2 | "or %[1], %[2]" erase(%[1]) setcc(%[1]) | %[1] | | (2,4)+%[2] ... | src2 SCR_REG | "or %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (2,4)+%[1] ior $1>2 | | remove( ALL ) allocate( LWXREG, REG, REG = {im2, $1/2} ) "ldl %[a], RR14" "addl %[a], $$$1" "1:\tpop %[b], *RR14" "or %[b], *%[a]" "ld *%[a], %[b]" "inc %[a.2], $$2" "djnz %[c], 1b" erase(%[c]) nocc | | | ior !defined($1)| SCR_REG | remove( ALL ) allocate( LWXREG, REG ) "ldl %[a], RR14" "addl %[a], $$$1" "sra %[1]" "1:\tpop %[b], *RR14" "or %[b], *%[a]" "ld *%[a], %[b]" "inc %[a.2], $$2" "djnz %[1], 1b" erase(%[1]) nocc | | | xor $1==2 | SCR_REG src2 | "xor %[1], %[2]" erase(%[1]) setcc(%[1]) | %[1] | | (2,4)+%[2] ... | src2 SCR_REG | "xor %[2], %[1]" erase(%[2]) setcc(%[2]) | %[2] | | (2,4)+%[1] xor $1>2 | | remove( ALL ) allocate( LWXREG, REG, REG = {im2, $1/2} ) "ldl %[a], RR14" "addl %[a], $$$1" "1:\tpop %[b], *RR14" "xor %[b], *%[a]" "ld *%[a], %[b]" "inc %[a.2], $$2" "djnz %[c], 1b" erase(%[c]) nocc | | | xor !defined($1)| SCR_REG | remove( ALL ) allocate( LWXREG, REG ) "ldl %[a], RR14" "addl %[a], $$$1" "sra %[1]" "1:\tpop %[b], *RR14" "xor %[b], *%[a]" "ld *%[a], %[b]" "inc %[a.2], $$2" "djnz %[1], 1b" erase(%[1]) nocc | | | com $1==2 | SCR_REG | "com %[1]" erase(%[1]) setcc(%[1]) | %[1] | | com defined($1) | STACK | allocate( LWXREG, REG = {im2, $1/2} ) "ldl %[a], RR14" "1:\tcom *%[a]" "inc %[a.2], $$2" "djnz %[b], 1b" erase(%[b]) nocc | | | com !defined($1)| SCR_REG STACK | allocate( LWXREG ) "ldl %[a], RR14" "1:\tcom *%[a]" "inc %[a.2], $$2" "djnz %[1], 1b" erase(%[1]) nocc | | | lil and sil $1==$3 && $2==2 | SCR_REG | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "and %[1], *%[a]" "ld *%[a], %[1]" | | | lil ior sil $1==$3 && $2==2 | SCR_REG | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "or %[1], *%[a]" "ld *%[a], %[1]" | | | lil xor sil $1==$3 && $2==2 | SCR_REG | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "xor %[1], *%[a]" "ld *%[a], %[1]" | | | lol com stl $1==$3 && $2==2 | | remove( x2, %[xreg]==LB && %[ind]==$1 ) remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 )) remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 )) remove( indexed, %[xreg]!=LB ) remove( ind_access ) remove( allexceptcon ) "com $1(R13)" setcc({x2, LB, $1}) | | | loe com ste $1==$3 && $2==2 | | remove( da ) remove( indexed, %[xreg]!=LB ) remove( ind_access ) "com $1" setcc({da2, $1}) | | | lil com sil $1==$3 && $2==2 | | allocate( LWXREG ) remove( allexceptcon ) move( {x2, LB, $1}, %[a.2] ) move( {im2, 0}, %[a.1] ) "com *%[a]" setcc({ir2, %[a]}) | | | rol $1==2 | SCR_REG SCR_REG | "1:\trl %[2]" "djnz %[1], 1b" erase(%[2]) setcc(%[2]) | %[2] | | ror $1==2 | SCR_REG SCR_REG | "1:\trr %[2]" "djnz %[1], 1b" erase(%[2]) setcc(%[2]) | %[2] | | /* */ /*************************************** ******** GROUP 10 ******** ***************************************/ inn $1==2 | REG SCR_REG | allocate( REG = {im2, 0} ) "cp %[1], $$15" "jr UGT, 1f" "bit %[2], %[1]" "tcc NE, %[a]\n1:" erase(%[a]) nocc | %[a] | | inn defined($1) | src2 STACK | move( %[1], R1 ) move( {im2, $1}, R2 ) "calr inn" erase(R1) erase(R2) | R0 | | inn !defined($1)| src2 src2 STACK | move( %[1], R2 ) move( %[2], R1 ) "calr inn" erase(R1) erase(R2) | R0 | | loc inn $2==2 && $1==0 | SCR_REG | "and %[1], $$1" erase(%[1]) setcc(%[1]) | %[1] | | loc inn $2==2 && $1==1 | SCR_REG | "srl %[1]" "and %[1], $$1" erase(%[1]) setcc(%[1]) | %[1] | | loc inn $2==2 && $1>1 && $1<=16 | SCR_REG | "srl %[1], $$%(0-$1%)" "and %[1], $$1" erase(%[1]) setcc(%[1]) | %[1] | | loc inn zeq $2==2 | | | {im2, 1<<$1} | and 2 zeq $3 | inn zeq $1==2 | REG | allocate( REG = {im2, 1} ) "sdl %[a], %[1]" erase(%[a]) setcc(%[a]) | %[a] | and 2 zeq $2 | loc inn zne $2==2 | | | {im2, 1<<$1} | and 2 zne $3 | inn zne $1==2 | REG | allocate( REG = {im2, 1} ) "sdl %[a], %[1]" erase(%[a]) setcc(%[a]) | %[a] | and 2 zne $2 | set $1==2 | REG | allocate( REG = {im2, 0} ) "cp %[1], $$15" "jr ULE, 1f" "push *RR14, $$ESET" "calr trp" "jr 2f" "1:\tset %[a], %[1]\n2:" erase(%[a]) nocc | %[a] | | set defined($1) | src2 STACK | move( %[1], R1 ) move( {im2, $1}, R0 ) "calr xset" erase(R0) erase(R1) | | | set !defined($1)| src2 src2 STACK | move( %[1], R0 ) move( %[2], R1 ) "calr xset" erase(R0) erase(R1) | | | /* */ /*************************************** ******** GROUP 11 ******** ***************************************/ aar $1==2 | src2 src2 STACK | move( %[1], R1 ) move( %[2], R3 ) "calr aar" erase(R1) erase(R3) | | | aar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 ) move( %[3], R3 ) "cp %[1], $$2" "jr NE, unknown" "calr aar" erase(R1) erase(R3) | | | sar $1==2 | src2 src2 STACK | move( %[1], R1 ) move( %[2], R3 ) "calr sar" erase(R1) erase(R3) | | | sar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 ) move( %[3], R3 ) "cp %[1], $$2" "jr NE, unknown" "calr sar" erase(R1) erase(R3) | | | lar $1==2 | src2 src2 STACK | move( %[1], R1 ) move( %[2], R3 ) "calr lar" erase(R1) erase(R3) | | | lar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 ) move( %[3], R3 ) "cp %[1], $$2" "jr NE, unknown" "calr lar" erase(R1) erase(R3) | | | lae aar $2==2 && rom(1,3)==1 && rom(1,1)==0 | | | | adi 2 | lae aar $2==2 && rom(1,3)==1 && rom(1,1)!=0 | | | | adi 2 adp 0-rom(1,1) | lae aar $2==2 && rom(1,3)==2 && rom(1,1)==0 | SCR_REG | "sla %[1]" erase(%[1]) | %[1] | adi 2 | lae aar $2==2 && rom(1,3)==2 && rom(1,1)!=0 | SCR_XREG | "sla %[1]" erase(%[1]) | {regconst2, %[1], (0-2)*rom(1,1)} | adi 2 | lae aar $2==2 && rom(1,3)==4 && rom(1,1)==0 | SCR_REG | "sla %[1], $$2" erase(%[1]) | %[1] | adi 2 | lae aar $2==2 && rom(1,3)==4 && rom(1,1)!=0 | SCR_XREG | "sla %[1], $$2" erase(%[1]) | {regconst2, %[1], (0-4)*rom(1,1)} | adi 2 | lae aar $2==2 && rom(1,3)==8 && rom(1,1)==0 | SCR_REG | "sla %[1], $$3" erase(%[1]) | %[1] | adi 2 | lae aar $2==2 && rom(1,3)==8 && rom(1,1)!=0 | SCR_XREG | "sla %[1], $$3" erase(%[1]) | {regconst2, %[1], (0-8)*rom(1,1)} | adi 2 | lae aar $2==2 && rom(1,1)==0 | src2 | allocate( %[1], LWREG ) move( %[1], %[a.2] ) "mult %[a], $$%(rom(1,3)%)" erase(%[a]) | %[a.2] | adi 2 | lae aar $2==2 && defined(rom(1,1)) | src2 | allocate( %[1], LWREG ) move( %[1], %[a.2] ) "mult %[a], $$%(rom(1,3)%)" erase(%[a]) | {regconst2, %[a.2], (0-rom(1,3))*rom(1,1)} | adi 2 | 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) | /* */ /*************************************** ******** GROUP 12 ******** ***************************************/ cmi $1==2 | | | | sbi $1 | cmi $1==4 | STACK | "calr cmi4" | R0 | | cmi !defined($1)| src2 STACK | move( %[1], R0 ) "calr cmi" erase(R0) | R0 | | cmu $1==2 | | | | cmp | cmu $1==4 | STACK | "calr cmu4" | R0 | | cmu !defined($1)| src2 STACK | move( %[1], R0 ) "calr cmu" erase(R0) | R0 | | cms $1==2 | | | | sbi $1 | cms defined($1) | STACK | move( {im2, $1}, R0 ) "calr cms" erase(R0) | R0 | | cms !defined($1)| src2 STACK | move( %[1], R0 ) "calr cms" erase(R0) | R0 | | cmp | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "jr EQ, 2f" "jr ULT, 1f" "inc %[a]" "jr 2f" "1:\tdec %[a]\n2:" erase(%[a]) nocc | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "jr EQ, 2f" "jr ULT, 1f" "inc %[a]" "jr 2f" "1:\tdec %[a]\n2:" erase(%[a]) nocc | %[a] | | tlt | src2c | allocate( REG = {im2, 0} ) test(%[1]) "tcc LT, %[a]" erase(%[a]) samecc | %[a] | | tle | src2c | allocate( REG = {im2, 0} ) test(%[1]) "tcc LE, %[a]" erase(%[a]) samecc | %[a] | | teq | src2c | allocate( REG = {im2, 0} ) test(%[1]) "tcc EQ, %[a]" erase(%[a]) samecc | %[a] | | tne | src2c | allocate( REG = {im2, 0} ) test(%[1]) "tcc NE, %[a]" erase(%[a]) samecc | %[a] | | tge | src2c | allocate( REG = {im2, 0} ) test(%[1]) "tcc GE, %[a]" erase(%[a]) samecc | %[a] | | tgt | src2c | allocate( REG = {im2, 0} ) test(%[1]) "tcc GT, %[a]" erase(%[a]) samecc | %[a] | | cmp tlt | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc ULT, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc ULT, %[a]" erase(%[a]) | %[a] | | cmp tle | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc ULE, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc ULE, %[a]" erase(%[a]) | %[a] | | cmp teq | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc EQ, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc EQ, %[a]" erase(%[a]) | %[a] | | cmp tne | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc NE, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc NE, %[a]" erase(%[a]) | %[a] | | cmp tge | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc UGE, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc UGE, %[a]" erase(%[a]) | %[a] | | cmp tgt | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc UGT, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc UGT, %[a]" erase(%[a]) | %[a] | | tlt and $2==2 | src2c SCR_REG | test(%[1]) "jr LT, 1f" "ldk %[2], $$0\n1:" erase(%[2]) | %[2] | | tlt ior $2==2 | src2c SCR_REG | test(%[1]) "tcc LT, %[2]" samecc erase(%[2]) | %[2] | | tle and $2==2 | src2c SCR_REG | test(%[1]) "jr LE, 1f" "ldk %[2], $$0\n1:" erase(%[2]) | %[2] | | tle ior $2==2 | src2c SCR_REG | test(%[1]) "tcc LE, %[2]" samecc erase(%[2]) | %[2] | | teq and $2==2 | src2c SCR_REG | test(%[1]) "jr EQ, 1f" "ldk %[2], $$0\n1:" erase(%[2]) | %[2] | | teq ior $2==2 | src2c SCR_REG | test(%[1]) "tcc EQ, %[2]" samecc erase(%[2]) | %[2] | | tne and $2==2 | src2c SCR_REG | test(%[1]) "jr NE, 1f" "ldk %[2], $$0\n1:" erase(%[2]) | %[2] | | tne ior $2==2 | src2c SCR_REG | test(%[1]) "tcc NE, %[2]" samecc erase(%[2]) | %[2] | | tgt and $2==2 | src2c SCR_REG | test(%[1]) "jr GT, 1f" "ldk %[2], $$0\n1:" erase(%[2]) | %[2] | | tgt ior $2==2 | src2c SCR_REG | test(%[1]) "tcc GT, %[2]" samecc erase(%[2]) | %[2] | | tge and $2==2 | src2c SCR_REG | test(%[1]) "jr GE, 1f" "ldk %[2], $$0\n1:" erase(%[2]) | %[2] | | tge ior $2==2 | src2c SCR_REG | test(%[1]) "tcc GE, %[2]" samecc erase(%[2]) | %[2] | | cmi tlt and $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "jr LT, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "jr LT, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | cmi tlt ior $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "tcc LT, %[3]" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "tcc LT, %[3]" erase(%[3]) | %[3] | | cmi tlt $1==2 | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc LT, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc LT, %[a]" erase(%[a]) | %[a] | | cmi tle and $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "jr LE, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "jr LE, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | cmi tle ior $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "tcc LE, %[3]" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "tcc LE, %[3]" erase(%[3]) | %[3] | | cmi tle $1==2 | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc LE, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc LE, %[a]" erase(%[a]) | %[a] | | cmi teq and $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "jr EQ, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "jr EQ, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | cmi teq ior $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "tcc EQ, %[3]" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "tcc EQ, %[3]" erase(%[3]) | %[3] | | cmi teq $1==2 | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc EQ, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc EQ, %[a]" erase(%[a]) | %[a] | | cmi tne and $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "jr NE, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "jr NE, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | cmi tne ior $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "tcc NE, %[3]" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "tcc NE, %[3]" erase(%[3]) | %[3] | | cmi tne $1==2 | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc NE, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc NE, %[a]" erase(%[a]) | %[a] | | cmi tge and $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "jr GE, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "jr GE, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | cmi tge ior $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "tcc GE, %[3]" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "tcc GE, %[3]" erase(%[3]) | %[3] | | cmi tge $1==2 | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc GE, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc GE, %[a]" erase(%[a]) | %[a] | | cmi tgt and $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "jr GT, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "jr GT, 1f" "ldk %[3], $$0\n1:" erase(%[3]) | %[3] | | cmi tgt ior $1==2 && $3==2 | src2 REG SCR_REG | "cp %[2], %[1]" "tcc GT, %[3]" erase(%[3]) | %[3] | | ... | NC im2 src2a SCR_REG | "cp %[2], %[1]" "tcc GT, %[3]" erase(%[3]) | %[3] | | cmi tgt $1==2 | src2 REG | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc GT, %[a]" erase(%[a]) | %[a] | | ... | NC im2 src2a | allocate( REG = {im2, 0} ) "cp %[2], %[1]" "tcc GT, %[a]" erase(%[a]) | %[a] | | /* */ /*************************************** ******** GROUP 13 ******** ***************************************/ bra | STACK | "jr $1" samecc | | | blt | src2 REG | remove( ALL ) "cp %[2], %[1]" "jr LT, $1" | | | (4,10)+%[1] ... | NC im2 src2a | remove( ALL ) "cp %[2], %[1]" "jr LT, $1" | | | ... | REG src2 | remove( ALL ) "cp %[1], %[2]" "jr GT, $1" | | | (4,10)+%[2] ... | NC src2a im2 | remove( ALL ) "cp %[1], %[2]" "jr GT, $1" | | | ble | src2 REG | remove( ALL ) "cp %[2], %[1]" "jr LE, $1" | | | (4,10)+%[1] ... | NC im2 src2a | remove( ALL ) "cp %[2], %[1]" "jr LE, $1" | | | ... | REG src2 | remove( ALL ) "cp %[1], %[2]" "jr GE, $1" | | | (4,10)+%[2] ... | NC src2a im2 | remove( ALL ) "cp %[1], %[2]" "jr GE, $1" | | | beq | src2 REG | remove( ALL ) "cp %[2], %[1]" "jr EQ, $1" | | | (4,10)+%[1] ... | NC im2 src2a | remove( ALL ) "cp %[2], %[1]" "jr EQ, $1" | | | ... | REG src2 | remove( ALL ) "cp %[1], %[2]" "jr EQ, $1" | | | (4,10)+%[2] ... | NC src2a im2 | remove( ALL ) "cp %[1], %[2]" "jr EQ, $1" | | | bne | src2 REG | remove( ALL ) "cp %[2], %[1]" "jr NE, $1" | | | (4,10)+%[1] ... | NC im2 src2a | remove( ALL ) "cp %[2], %[1]" "jr NE, $1" | | | ... | REG src2 | remove( ALL ) "cp %[1], %[2]" "jr NE, $1" | | | (4,10)+%[2] ... | NC src2a im2 | remove( ALL ) "cp %[1], %[2]" "jr NE, $1" | | | bge | src2 REG | remove( ALL ) "cp %[2], %[1]" "jr GE, $1" | | | (4,10)+%[1] ... | NC im2 src2a | remove( ALL ) "cp %[2], %[1]" "jr GE, $1" | | | ... | REG src2 | remove( ALL ) "cp %[1], %[2]" "jr LE, $1" | | | (4,10)+%[2] ... | NC src2a im2 | remove( ALL ) "cp %[1], %[2]" "jr LE, $1" | | | bgt | src2 REG | remove( ALL ) "cp %[2], %[1]" "jr GT, $1" | | | (4,10)+%[1] ... | NC im2 src2a | remove( ALL ) "cp %[2], %[1]" "jr GT, $1" | | | ... | REG src2 | remove( ALL ) "cp %[1], %[2]" "jr LT, $1" | | | (4,10)+%[2] ... | NC src2a im2 | remove( ALL ) "cp %[1], %[2]" "jr LT, $1" | | | zlt | src2c | remove( ALL ) test(%[1]) "jr LT, $1" samecc | | | zle | src2c | remove( ALL ) test(%[1]) "jr LE, $1" samecc | | | zeq | src2c | remove( ALL ) test(%[1]) "jr EQ, $1" samecc | | | zne | src2c | remove( ALL ) test(%[1]) "jr NE, $1" samecc | | | zge | src2c | remove( ALL ) test(%[1]) "jr GE, $1" samecc | | | zgt | src2c | remove( ALL ) test(%[1]) "jr GT, $1" samecc | | | cmp zlt | src2 REG STACK | "cp %[2], %[1]" "jr ULT, $2" | | | ... | NC im2 src2a STACK | "cp %[2], %[1]" "jr ULT, $2" | | | cmp zle | src2 REG STACK | "cp %[2], %[1]" "jr ULE, $2" | | | ... | NC im2 src2a STACK | "cp %[2], %[1]" "jr ULE, $2" | | | cmp zeq | src2 REG STACK | "cp %[2], %[1]" "jr EQ, $2" | | | ... | NC im2 src2a STACK | "cp %[2], %[1]" "jr EQ, $2" | | | cmp zne | src2 REG STACK | "cp %[2], %[1]" "jr NE, $2" | | | ... | NC im2 src2a STACK | "cp %[2], %[1]" "jr NE, $2" | | | cmp zgt | src2 REG STACK | "cp %[2], %[1]" "jr UGT, $2" | | | ... | NC im2 src2a STACK | "cp %[2], %[1]" "jr UGT, $2" | | | cmp zge | src2 REG STACK | "cp %[2], %[1]" "jr UGE, $2" | | | ... | NC im2 src2a STACK | "cp %[2], %[1]" "jr UGE, $2" | | | and zeq $1==2 | src2 SCR_REG STACK | "and %[2], %[1]" "jr EQ, $2" erase(%[2]) | | | (4,10)+%[1] ... | SCR_REG src2 STACK | "and %[1], %[2]" "jr EQ, $2" erase(%[1]) | | | (4,10)+%[2] and zne $1==2 | src2 SCR_REG STACK | "and %[2], %[1]" "jr NE, $2" erase(%[2]) | | | (4,10)+%[1] ... | SCR_REG src2 STACK | "and %[1], %[2]" "jr NE, $2" erase(%[1]) | | | (4,10)+%[2] /* */ /*************************************** ******** GROUP 14 ******** ***************************************/ cal | STACK | "calr $1" | | | cai | NC src2a-x2 STACK | "call %[1]" | | | ... | NC x2 STACK | allocate( %[1], XREG = %[1] ) "call 0(%[a])" | | | ... | XREG STACK | "call 0(%[1])" | | | lfr $1==0 | | | | | lfr $1==2 | | | R0 | | lfr $1==4 | | | RR0 | | lfr $1==6 | | | R2 R1 R0 | | lfr $1==8 | | | RR2 RR0 | | ret $1==0 | STACK | "ldk R14, $$0\nld R15, R13" "pop R13, *RR14" "ret" | | | ret $1==2 | src2 STACK | move( %[1], R0 ) "ldk R14, $$0\nld R15, R13" "pop R13, *RR14" "ret" | | | ret $1==4 | src4 STACK | move( %[1], RR0 ) "ldk R14, $$0\nld R15, R13" "pop R13, *RR14" "ret" | | | ret $1==6 | src2 src2 src2 STACK | move( %[1], R0 ) move( %[2], R1 ) move( %[3], R2 ) "ldk R14, $$0\nld R15, R13" "pop R13, *RR14" "ret" | | | ret $1==8 | src4 src4 STACK | move( %[1], RR0 ) move( %[2], RR2 ) "ldk R14, $$0\nld R15, R13" "pop R13, *RR14" "ret" | | | lfr ret $1==$2 | | | | ret 0 | asp lfr ret $2==$3 | | | | ret 0 | asp ret $2==0 | | | | ret 0 | /* */ /*************************************** ******** GROUP 15 ******** ***************************************/ asp | STACK | "add R15, $$$1" | | | ass $1==2 | src2 STACK | "add R15, %[1]" | | | blm | STACK | move( {im2, $1}, R0 ) "calr blm" erase(R0) | | | bls $1==2 | src2 STACK | move( %[1], R0 ) "calr blm" erase(R0) | | | csa $1==2 | STACK | "pop R1, *RR14" "pop R2, *RR14" "jr csa" | | | lae csa $2==2 | src2 STACK | move( %[1], R2 ) move( {ADDR_EXTERNAL, $1}, R1 ) "jr csa" | | | csb $1==2 | STACK | "pop R1, *RR14" "pop R2, *RR14" "jr csb" | | | lae csb $2==2 | src2 STACK | move( %[1], R2 ) move( {ADDR_EXTERNAL, $1}, R1 ) "jr csb" | | | dup $1==2 | src2 | | %[1] %[1] | | dup $1==4 | src2 src2 | | %[2] %[1] %[2] %[1] | | dup | STACK | move( {im2, $1}, R0 ) "calr dup" erase(R0) | | | dus $1==2 | src2 STACK | move( %[1], R0 ) "calr dup" erase(R0) | | | exg $1==2 | src2 src2 | | %[1] %[2] | | exg $1==2 | STACK | move( {im2, $1}, R0 ) "calr exg" erase(R0) | | | lor $1==0 | | | LB | | lor $1==1 | STACK | allocate( REG ) "ld %[a], R15" samecc | %[a] | | lor $1==2 | | | {da2, "reghp"} | | rck $1==2 | src2 STACK | move( %[1], R1 ) "calr rck" | | | rck !defined($1)| src2 src2 STACK | "cp %[1], $$2" "jr NE, unknown" move( %[2], R1 ) "calr rck" | | | str $1==0 | src2 | "ld R13, %[1]" samecc | | | str $1==1 | src2 STACK | "ldk R14, $$0\nld R15, %[1]" samecc | | | str $1==2 | STACK | "calr strhp" | | | dch | | | | loi 2 | fil | | "ld hol0+4, $$$1" samecc | | | gto | STACK | "push *RR14, $$$1" "jr gto" | | | lim | | | {da2, "trpim"} | | lin | | "ld hol0, $$$1" samecc | | | lni | | "inc hol0" | | | lpb | | | | adp SL | mon | STACK | "calr mon" | | | nop | STACK | "calr noop" | | | rtt | | | | ret 0 | sig | REG | allocate(REG) move( {da2, "trppc"}, %[a] ) "ld trppc, %[1]" samecc | %[a] | | sim | STACK | "pop trpim, *RR14" samecc | | | trp | STACK | "calr trp" | | | /* For several floating point instructions we generate an illegal ** instruction trap */ adf | | | | loc 18 trp | sbf | | | | loc 18 trp | mlf | | | | loc 18 trp | dvf | | | | loc 18 trp | ngf | | | | loc 18 trp | fef | | | | loc 18 trp | fif | | | | loc 18 trp | zrf | | | | loc 18 trp | cfi | | | | loc 18 trp | cif | | | | loc 18 trp | cfu | | | | loc 18 trp | cuf | | | | loc 18 trp | cff | | | | loc 18 trp | cmf | | | | loc 18 trp | /* */ /* COERCIONS */ /********************************* ** From source2 to register ** *********************************/ | regconst2 | allocate( %[1], XREG = %[1.xreg] ) "add %[a], $$%[1.ind]" setcc(%[a]) | %[a] | | (4,7) | ADDR_LOCAL | allocate( REG ) "ld %[a], R13" "add %[a], $$%[1.ind]" setcc(%[a]) | %[a] | | (6,10) | REG | allocate( %[1], XREG = %[1] ) | {regconst2, %[a], 0} | | | src2 | allocate( %[1], REG = %[1] ) | %[a] | | | src2 | allocate( %[1], XREG = %[1] ) | {regconst2, %[a], 0} | | /********************************* ** From source2 to source2 ** *********************************/ | ADDR_EXTERNAL | | {da2, %[1.ind]} | | /********************************* ** From source1 to source2 ** *********************************/ | src1 | allocate( %[1], B2REG = %[1] ) | %[a] | | /********************************* ** From source4 to register ** *********************************/ | src4 | allocate( %[1], LWREG = %[1] ) | %[a] | | /********************************* ** From source4 to source2 ** *********************************/ | LWREG | | %[1.2] %[1.1] | | | x4 | | {x2, %[1.xreg], 2+%[1.ind]} {x2, %[1.xreg], %[1.ind]} | | | da4 | | {da2, "2+"+%[1.ind]} {da2, %[1.ind]} | | | ir4 | | {ir4_hi, %[1.lwxreg]} {ir2, %[1.lwxreg]} | | | ir4_hi | allocate( LWREG = %[1.lwreg] ) | {x2, %[a.2], 2} | | /********************************* ** From STACK ** *********************************/ | STACK | allocate( REG ) "pop %[a], *RR14" samecc | %[a] | | (2,8) | STACK | allocate( XREG ) "pop %[a], *RR14" samecc | {regconst2, %[a], 0} | | (2,8) | STACK | allocate( LWREG ) "popl %[a], *RR14" samecc | %[a] | | (2,12) MOVES: /* move( src, dst ) --> ld dst, src */ (im2 (%[num]>=0 && %[num]<=15), REG, "ldk %[2], %[1]" samecc, (2,5)) (im2 %[num]==0, src2a, "clr %[2]" samecc, (2,7)+%[2]) (im2 %[num]==0, src1, "clrb %[2]" samecc, (2,7)+%[2]) (im2, src1, "ldb %[2], $$[%[1.num]-[%[1.num]&0xFFFFFF00]+128]%%256-128" samecc, (4,9)+%[2]) (src1, B2REG, "ldk %[2], $$0\nldb L%[2], %[1]" samecc, (4,8)+%[1]) (src2, REG, "ld %[2], %[1]" samecc, (2,3)+%[1]) (src4, LWREG, "ldl %[2], %[1]" samecc, (2,5)+%[1]) (const2, src1, "ldb %[2], %[1]" samecc, (4,9)+%[2]) (B2REG, src1, "ldb %[2], L%[1]" samecc, (2,6)+%[2]) (src2b, src2a, "ld %[2], %[1]" samecc, (2,6)+%[1]+%[2]) (src4b, src4a, "ldl %[2], %[1]" samecc, (2,6)+%[2]) TESTS: (src2c, "test %[1]", (2,7)+%[1]) STACKS: (src1, B2REG, move( %[1], %[a] ) "push *RR14, %[a]" "clrb *RR14" samecc, (4,17) ) (src1,, ".data\n1:\t.word 0\n.text" "ld 1b, R0" "ldk R0, $$0" "ldb RL0, %[1]" "push *RR14, R0" "ld R0, 1b" samecc, (18,37)+%[1] ) (src2,, "push *RR14, %[1]" samecc, (2,9)+%[1] ) (const4, LWREG, move( %[1], %[a] ) "pushl *RR14, %[a]" samecc, (2,12) ) (im4,, "push *RR14, %[1]" "push *RR14, $$0" samecc, (8,24) ) /* there is no pushl ir,im */ (double,, ".data\n1:\t.long %[1]\n.text" "pushl *RR14, 1b" samecc, (6,20) ) (src4,, "pushl *RR14, %[1]" samecc, (2,12)+%[1] ) (regconst2,, "add %[1.xreg], $$%[1.ind]" "push *RR14, %[1.xreg]" nocc, (6,16) ) (ADDR_LOCAL, REG, move( LB, %[a] ) "add %[a], $$%[1.ind]" "push *RR14, %[a]" setcc(%[a]), (6,16) ) (ADDR_LOCAL,, "add R13, $$%[1.ind]" "push *RR14, R13" "sub R13, $$%[1.ind]" nocc, (10,23) )