1468 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			1468 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#define fitins(a) (a&~0xFF)==0||(a&~0x3FC)==0||(a&~0xFF0)==0||(a&~0x3FC0)==0||(a&~0xFF00)==0||(a&~0x3FC00)==0||(a&~0xFF000)==0||(a&~0x3FC000)==0||(a&~0xFF0000)==0||(a&~0x3FC0000)==0||(a&~0xFF00000)==0||(a&~0x3FC00000)==0||(a&~0xFF000000)==0||(a&~0xFC000003)==0||(a&~0xF000000F)==0||(a&~0xC000003F)==0||(~a&~0xFF)==0
 | 
						|
EM_WSIZE=4
 | 
						|
EM_PSIZE=4
 | 
						|
EM_BSIZE=8
 | 
						|
 | 
						|
PROPERTIES
 | 
						|
 | 
						|
GENREG			/* All 16 user registers */
 | 
						|
REG			/* Allocatable registers */
 | 
						|
PCPSR			/* PSW and PC */
 | 
						|
SREG
 | 
						|
STACKPOINTER
 | 
						|
LOCALBASE
 | 
						|
LINKREGISTER
 | 
						|
 | 
						|
REGISTERS
 | 
						|
 | 
						|
R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10	:GENREG, REG .
 | 
						|
R11	               			:GENREG, SREG  .
 | 
						|
SP("R12")				:GENREG, STACKPOINTER .
 | 
						|
LB("R13")				:GENREG, LOCALBASE .
 | 
						|
R14					:GENREG, LINKREGISTER .
 | 
						|
PC("R15")				:GENREG, PCPSR .
 | 
						|
 | 
						|
TOKENS
 | 
						|
 | 
						|
const4		= { INT num; } 4 "#" num .
 | 
						|
fitcon		= { INT num; } 4 "#" num .
 | 
						|
LOCAL		= { INT ind; } 4 "[R13,#" ind "]" .
 | 
						|
addr_local	= { INT ind; } 4 .
 | 
						|
addr_external	= { ADDR add; } 4 add .
 | 
						|
 | 
						|
imS		= { GENREG reg; ADDR S; INT shift;} 4 reg "," S " #" shift  .
 | 
						|
regS		= { GENREG reg; ADDR S; GENREG sreg;} 4 reg "," S " "sreg  .
 | 
						|
 | 
						|
absolute	= { ADDR add; } 4 add .
 | 
						|
regind		= { GENREG reg; } 4 "[" reg "]" .
 | 
						|
regrel		= { GENREG reg; ADDR ind; } 4 "[" reg ",#" ind "]"  .
 | 
						|
regrelwb	= { GENREG reg; ADDR ind; } 4 "[" reg ",#" ind "]<"  .
 | 
						|
regregrel	= { GENREG reg1; GENREG reg2; } 4 "[" reg1 "," reg2 "]" .
 | 
						|
regminregrel	= { GENREG reg1; GENREG reg2; } 4 "[" reg1 ",-" reg2 "]" .
 | 
						|
regiSregrel	= { GENREG reg1; ADDR S; INT shift; GENREG reg2; } 4 
 | 
						|
			"[" reg1 "," reg2 ","  S "#" shift "]" .
 | 
						|
regminiSregrel	= { GENREG reg1; ADDR S; INT shift; GENREG reg2; } 4 
 | 
						|
			"[" reg1 ",-" reg2 ","  S "#" shift "]" .
 | 
						|
regrSregrel	= { GENREG reg1; ADDR S; GENREG sreg; GENREG reg2; } 4 
 | 
						|
			"[" reg1 "," reg2 ","  S sreg "]" .
 | 
						|
regminrSregrel	= { GENREG reg1; ADDR S; GENREG sreg; GENREG reg2; } 4 
 | 
						|
			"[" reg1 ",-" reg2 ","  S sreg "]" .
 | 
						|
regregrelwb	= { GENREG reg1; GENREG reg2; } 4 "[" reg1 "," reg2 "]<" .
 | 
						|
regiSregrelwb	= { GENREG reg1; ADDR S; INT shift; GENREG reg2; } 4 
 | 
						|
			"[" reg1 "," reg2 ","  S "#" shift "]<" .
 | 
						|
regrSregrelwb	= { GENREG reg1; ADDR S; GENREG sreg; GENREG reg2; } 4 
 | 
						|
			"[" reg1 "," reg2 ","  S sreg "]<" .
 | 
						|
regrelpi	= { GENREG reg; ADDR ind; } 4 "[" reg "],#" ind .
 | 
						|
regregrelpi	= { GENREG reg1; GENREG reg2; } 4 "[" reg1 "]," reg2 .
 | 
						|
 | 
						|
label		= {ADDR add; } 4 add .
 | 
						|
 | 
						|
autoid		= {GENREG reg; } 4 reg "<" .
 | 
						|
reglist1	= {GENREG reg1; } 4 "{" reg1 "}" .
 | 
						|
reglist2	= {GENREG reg1; GENREG reg2; } 8 "{" reg1 "," reg2 "}" .
 | 
						|
reglist3	= {GENREG reg1; GENREG reg2; GENREG reg3; } 12 
 | 
						|
			"{" reg1 "," reg2 "," reg3 "}" .
 | 
						|
reglist4	= {GENREG reg1; GENREG reg2; GENREG reg3; GENREG reg4; } 16 
 | 
						|
			"{" reg1 "," reg2 "," reg3 "," reg4 "}" .
 | 
						|
regexp		= {INT exp;} 4 exp  .
 | 
						|
 | 
						|
regconst	= {GENREG reg; ADDR ind; } 4 reg ",#" ind  .
 | 
						|
regplusreg	= {GENREG reg1; GENREG reg2;} 4  .
 | 
						|
regplusiSreg	= {GENREG reg1; ADDR S; INT shift; GENREG reg2;} 4  .
 | 
						|
regplusrSreg	= {GENREG reg1; ADDR S; GENREG sreg; GENREG reg2;} 4  .
 | 
						|
regminreg	= {GENREG reg1; GENREG reg2;} 4  .
 | 
						|
regminiSreg	= {GENREG reg1; ADDR S; INT shift; GENREG reg2;} 4  .
 | 
						|
regminrSreg	= {GENREG reg1; ADDR S; GENREG sreg; GENREG reg2;} 4  .
 | 
						|
 | 
						|
SETS
 | 
						|
 | 
						|
address		= absolute + regind + regrel + regrelwb + regregrel +
 | 
						|
                  regiSregrel + regrSregrel + regiSregrelwb + regrSregrelwb +
 | 
						|
		  regminregrel + regminiSregrel + regminrSregrel +
 | 
						|
		  regregrelwb + regrelpi + regregrelpi + LOCAL .
 | 
						|
REGcon		= GENREG + imS + regS + fitcon  .
 | 
						|
reglist		= reglist1 + reglist2 + reglist3 + reglist4 + regexp  .
 | 
						|
 | 
						|
INSTRUCTIONS
 | 
						|
 | 
						|
BAL  label  .
 | 
						|
BAL_L "BAL.L" label  .
 | 
						|
BNV  label  .
 | 
						|
BNE  label  .
 | 
						|
BEQ  label  .
 | 
						|
BMI  label  .
 | 
						|
BGT  label  .
 | 
						|
BLT  label  .
 | 
						|
BLE  label  .
 | 
						|
BGE  label  .
 | 
						|
 | 
						|
LDR  GENREG:wo,	address:rw  .
 | 
						|
STR  GENREG:ro, address:rw  .
 | 
						|
LDR_B "LDR.B" GENREG:wo, address:rw  .
 | 
						|
STR_B "STR.B" GENREG:ro, address:rw  .
 | 
						|
 | 
						|
LDMFD autoid:rw, reglist:wo  .
 | 
						|
STMFD autoid:rw, reglist:ro  .
 | 
						|
LDMIA GENREG:rw, reglist:wo  .
 | 
						|
 | 
						|
ADC  GENREG:wo, GENREG:ro, REGcon:ro  .
 | 
						|
ADD  GENREG:wo, GENREG:ro, REGcon+const4:ro  .
 | 
						|
ADD  GENREG:wo, regconst:ro  .
 | 
						|
AND  GENREG:wo, GENREG:ro, REGcon:ro  .
 | 
						|
BIC  GENREG:wo, GENREG:ro, REGcon:ro  .
 | 
						|
CMN  GENREG:ro, REGcon:ro kills :cc  .
 | 
						|
CMP  GENREG:ro, REGcon:ro kills :cc  .
 | 
						|
EOR  GENREG:wo, GENREG:ro, REGcon:ro  .
 | 
						|
EOR_S "EOR.S"  GENREG:wo:cc, GENREG:ro, REGcon:ro  .
 | 
						|
MOV  GENREG:wo, REGcon+const4:ro  .
 | 
						|
MOV_MI "MOV.MI"  GENREG:wo, REGcon+const4:ro  .
 | 
						|
MOV_LT "MOV.LT"  GENREG:wo, REGcon+const4:ro  .
 | 
						|
MOV_LE "MOV.LE"  GENREG:wo, REGcon+const4:ro  .
 | 
						|
MOV_EQ "MOV.EQ"  GENREG:wo, REGcon+const4:ro  .
 | 
						|
MOV_NE "MOV.NE"  GENREG:wo, REGcon+const4:ro  .
 | 
						|
MOV_GE "MOV.GE"  GENREG:wo, REGcon+const4:ro  .
 | 
						|
MOV_GT "MOV.GT"  GENREG:wo, REGcon+const4:ro  .
 | 
						|
MVN  GENREG:wo, REGcon:ro  .
 | 
						|
ORR  GENREG:wo, GENREG:ro, REGcon:ro  .
 | 
						|
RSB  GENREG:wo, GENREG:ro, REGcon:ro  .
 | 
						|
RSB_S "RSB.S"  GENREG:wo:cc, GENREG:ro, REGcon:ro  .
 | 
						|
RSC  GENREG:wo, GENREG:ro, REGcon:ro  .
 | 
						|
SBC  GENREG:wo, GENREG:ro, REGcon:ro  .
 | 
						|
SUB  GENREG:wo, GENREG:ro, REGcon:ro  .
 | 
						|
SUB_S "SUB.S"  GENREG:wo:cc, GENREG:ro, REGcon:ro  .
 | 
						|
TEQ  GENREG:ro, REGcon:ro kills :cc  .
 | 
						|
TST  GENREG:ro, REGcon:ro kills :cc  .
 | 
						|
ADR  GENREG:wo, addr_external+label:ro  .
 | 
						|
LABEL "" label kills :cc .
 | 
						|
 | 
						|
MOVES
 | 
						|
 | 
						|
from GENREG to address
 | 
						|
	gen STR %1, %2
 | 
						|
 | 
						|
from address to GENREG
 | 
						|
	gen LDR %2, %1
 | 
						|
 | 
						|
from GENREG to autoid
 | 
						|
	gen STMFD %2, {reglist1, %1}
 | 
						|
 | 
						|
from autoid to GENREG
 | 
						|
	gen LDMFD %1, {reglist1, %2}
 | 
						|
 | 
						|
from REGcon to GENREG
 | 
						|
	gen MOV %2, %1
 | 
						|
 | 
						|
from const4 to GENREG
 | 
						|
	gen MOV %2, %1
 | 
						|
 | 
						|
from addr_external to GENREG
 | 
						|
	gen ADR %2, %1
 | 
						|
 | 
						|
TESTS
 | 
						|
 | 
						|
to test GENREG
 | 
						|
gen CMP %1, {fitcon, 0}
 | 
						|
 | 
						|
STACKINGRULES
 | 
						|
 | 
						|
from address to STACK
 | 
						|
	gen move %1, R11
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from GENREG to STACK
 | 
						|
	gen move %1, {autoid, SP}
 | 
						|
 | 
						|
from REGcon to STACK
 | 
						|
	gen move %1, R11
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from const4 to STACK
 | 
						|
	gen move %1, R11
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from addr_local to STACK
 | 
						|
	gen ADD R11, LB, {const4, %1.ind}
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
	
 | 
						|
from addr_external to STACK
 | 
						|
	gen ADR R11, %1
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from regconst to STACK
 | 
						|
	gen ADD R11, %1
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from regplusreg to STACK
 | 
						|
	gen ADD R11, %1.reg1, %1.reg2
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from regminreg to STACK
 | 
						|
	gen SUB R11, %1.reg1, %1.reg2
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from regplusiSreg to STACK
 | 
						|
	gen ADD R11, %1.reg1, {imS, %1.reg2, %1.S, %1.shift}
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from regminiSreg to STACK
 | 
						|
	gen SUB R11, %1.reg1, {imS, %1.reg2, %1.S, %1.shift}
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from regplusrSreg to STACK
 | 
						|
	gen ADD R11, %1.reg1, {regS, %1.reg2, %1.S, %1.sreg}
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
from regminrSreg to STACK
 | 
						|
	gen SUB R11, %1.reg1, {regS, %1.reg2, %1.S, %1.sreg}
 | 
						|
	    move R11, {autoid, SP}
 | 
						|
 | 
						|
COERCIONS
 | 
						|
 | 
						|
from const4
 | 
						|
uses REG
 | 
						|
	gen move %1, %a				yields %a
 | 
						|
 | 
						|
from const4 fitins(%1.num)			 yields {fitcon, %num}
 | 
						|
 | 
						|
from STACK
 | 
						|
uses REG
 | 
						|
	gen move {autoid, SP}, %a		yields %a
 | 
						|
 | 
						|
from address 
 | 
						|
uses REG
 | 
						|
	gen move %1, %a				yields %a
 | 
						|
 | 
						|
from REGcon 
 | 
						|
uses REG
 | 
						|
	gen move %1, %a				yields %a
 | 
						|
	
 | 
						|
from addr_external
 | 
						|
uses REG
 | 
						|
	gen move %1, %a
 | 
						|
	    					yields %a
 | 
						|
 | 
						|
from addr_local
 | 
						|
uses REG
 | 
						|
	gen ADD %a, LB, {const4, %1.ind}	yields %a
 | 
						|
 | 
						|
from regconst
 | 
						|
uses REG
 | 
						|
	gen ADD %a, %1				yields %a
 | 
						|
 | 
						|
from regplusreg 
 | 
						|
uses REG
 | 
						|
	gen ADD %a, %1.reg1, %1.reg2
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regminreg 
 | 
						|
uses REG
 | 
						|
	gen SUB %a, %1.reg1, %1.reg2
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regplusiSreg 
 | 
						|
uses REG
 | 
						|
	gen ADD %a, %1.reg1, {imS, %1.reg2, %1.S, %1.shift}
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regminiSreg 
 | 
						|
uses REG
 | 
						|
	gen SUB %a, %1.reg1, {imS, %1.reg2, %1.S, %1.shift}
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regplusrSreg 
 | 
						|
uses REG
 | 
						|
	gen ADD %a, %1.reg1, {regS, %1.reg2, %1.S, %1.sreg}
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regminrSreg 
 | 
						|
uses REG
 | 
						|
	gen SUB %a, %1.reg1, {regS, %1.reg2, %1.S, %1.sreg}
 | 
						|
						yields %a
 | 
						|
 | 
						|
 | 
						|
PATTERNS
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP I :	Load Instructions					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat loc fitins($1)		yields {fitcon, $1}
 | 
						|
 | 
						|
pat loc !(fitins($1))		yields {const4, $1}
 | 
						|
 | 
						|
pat ldc				leaving loc 18
 | 
						|
					trp
 | 
						|
 | 
						|
pat lol				yields {LOCAL, $1}
 | 
						|
 | 
						|
pat loe				yields {absolute, $1}
 | 
						|
 | 
						|
pat lil				leaving lol $1 loi 4
 | 
						|
 | 
						|
pat lof
 | 
						|
with GENREG			yields {regrel, %1, $1}
 | 
						|
with exact addr_local		yields {LOCAL, %1.ind+$1}
 | 
						|
with exact addr_external	yields {absolute, %1.add+$1}
 | 
						|
with exact regconst		yields {regrel, %1.reg, $1+%1.ind}
 | 
						|
 | 
						|
pat lal				yields {addr_local, $1}
 | 
						|
 | 
						|
pat lae				yields {addr_external, $1}
 | 
						|
 | 
						|
pat lxl $1==0			yields LB
 | 
						|
 | 
						|
pat lxl $1==1			yields {LOCAL,8}
 | 
						|
 | 
						|
pat lxl $1>1
 | 
						|
uses REG={const4, $1}, REG=LB
 | 
						|
gen move {regrel, %b, 8}, %b
 | 
						|
    SUB_S %a, %a, {fitcon,1}
 | 
						|
    BNE {label,"1B"}		yields %b
 | 
						|
 | 
						|
pat lxa $1==0			yields {addr_local,8}
 | 
						|
 | 
						|
pat lxa $1==1
 | 
						|
uses REG={LOCAL,8}		yields {regconst,%a,8}
 | 
						|
 | 
						|
 | 
						|
pat lxa $1>1
 | 
						|
uses REG={const4, $1}, REG=LB
 | 
						|
gen move {regrel, %b, 8}, %b
 | 
						|
    SUB_S %a, %a, {fitcon,1}
 | 
						|
    BNE {label,"1B"}		yields {regconst, %b, 8}
 | 
						|
 | 
						|
pat loi $1==1
 | 
						|
with GENREG
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {regind, %1}	yields %a
 | 
						|
with exact addr_local
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {LOCAL, %1.ind}	yields %a
 | 
						|
with exact addr_external
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {absolute, %1.add}	yields %a
 | 
						|
with exact regconst
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {regrel, %1.reg, %1.ind}	yields %a
 | 
						|
with exact regplusreg
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {regregrel, %1.reg1, %1.reg2}	yields %a
 | 
						|
with exact regminreg
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {regminregrel, %1.reg1, %1.reg2}	yields %a
 | 
						|
with exact regplusiSreg
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {regiSregrel, %1.reg1, %1.S, %1.shift, %1.reg2}	yields %a
 | 
						|
with exact regminiSreg
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {regminiSregrel, %1.reg1, %1.S, %1.shift, %1.reg2}	yields %a
 | 
						|
with exact regplusrSreg
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {regrSregrel, %1.reg1, %1.S, %1.sreg, %1.reg2}	yields %a
 | 
						|
with exact regminrSreg
 | 
						|
uses REG
 | 
						|
gen LDR_B %a, {regminrSregrel, %1.reg1, %1.S, %1.sreg, %1.reg2}	yields %a
 | 
						|
 | 
						|
pat loi $1==2
 | 
						|
with GENREG
 | 
						|
uses REG, REG
 | 
						|
gen LDR_B %a, {regind, %1}
 | 
						|
    LDR_B %b, {regrel, %1, 1}
 | 
						|
    ADD %a, %a, {imS, %b, "LSL", 8}	yields %a
 | 
						|
 | 
						|
pat loi $1==4
 | 
						|
with GENREG			yields {regind, %1}
 | 
						|
with exact addr_local		yields {LOCAL, %1.ind}
 | 
						|
with exact addr_external	yields {absolute, %1.add}
 | 
						|
with exact regconst		yields {regrel, %1.reg, %1.ind}
 | 
						|
with exact regplusreg		yields {regregrel, %1.reg1, %1.reg2}	
 | 
						|
with exact regminreg		yields {regminregrel, %1.reg1, %1.reg2}	
 | 
						|
with exact regplusiSreg	 yields {regiSregrel, %1.reg1, %1.S, %1.shift, %1.reg2}	
 | 
						|
with exact regminiSreg	 yields {regminiSregrel,%1.reg1,%1.S,%1.shift,%1.reg2}	
 | 
						|
with exact regplusrSreg	 yields {regrSregrel, %1.reg1, %1.S, %1.sreg, %1.reg2}	
 | 
						|
with exact regminrSreg	 yields {regminrSregrel,%1.reg1,%1.S,%1.sreg,%1.reg2}	
 | 
						|
 | 
						|
pat loi $1==8
 | 
						|
with GENREG
 | 
						|
uses REG, REG
 | 
						|
gen LDMIA %1, {reglist2, %a, %b}	yields %b %a
 | 
						|
 | 
						|
pat loi defined($1)
 | 
						|
with GENREG STACK
 | 
						|
kills ALL
 | 
						|
uses REG = {const4, $1}
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    SUB_S %a, %a, {fitcon, 4}
 | 
						|
    move {regregrel, %1, %a}, R11
 | 
						|
    move R11, {autoid, SP}
 | 
						|
    BLT {label, "1b"}
 | 
						|
 | 
						|
pat los $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen BAL_L {label, ".los"}
 | 
						|
 | 
						|
pat ldl				yields {LOCAL, $1+4}
 | 
						|
				       {LOCAL, $1}
 | 
						|
 | 
						|
pat lde				yields {absolute, $1+4}
 | 
						|
				       {absolute, $1}
 | 
						|
 | 
						|
pat ldf
 | 
						|
with GENREG			yields {regrel, %1, $1+4}
 | 
						|
				       {regrel, %1, $1}
 | 
						|
with exact addr_local		yields {LOCAL, %1.ind+$1+4}
 | 
						|
				       {LOCAL, %1.ind+$1}
 | 
						|
with exact addr_external	yields {absolute, %1.add+$1+4}
 | 
						|
				       {absolute, %1.add+$1}
 | 
						|
with exact regconst		yields {regrel, %1.reg, $1+%1.ind+4}
 | 
						|
				       {regrel, %1.reg, $1+%1.ind}
 | 
						|
 | 
						|
pat lpi				yields {addr_external, $1}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP II :	Store Instructions					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat stl
 | 
						|
with GENREG
 | 
						|
kills address-(absolute+LOCAL), LOCAL %ind-4 < $1 && %ind+4 > $1
 | 
						|
	gen move %1, {LOCAL, $1}
 | 
						|
 | 
						|
pat ste
 | 
						|
with GENREG
 | 
						|
kills address
 | 
						|
	gen move %1, {absolute, $1}
 | 
						|
 | 
						|
pat sil					leaving lol $1 sti 4
 | 
						|
 | 
						|
pat stf
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regrel, %1, $1}
 | 
						|
with addr_local GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {LOCAL, %1.ind + $1}
 | 
						|
with addr_external GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {absolute, %1.add + $1}
 | 
						|
with regconst GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regrel, %1.reg, $1+%1.ind}
 | 
						|
 | 
						|
pat sti $1==1
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {regind, %1}
 | 
						|
with  addr_local GENREG
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {LOCAL, %1.ind}
 | 
						|
with  addr_external GENREG
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {absolute, %1.add}
 | 
						|
with  regconst GENREG
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {regrel, %1.reg, %1.ind}
 | 
						|
with  regplusreg GENREG
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {regregrel, %1.reg1, %1.reg2}
 | 
						|
with  regminreg GENREG 
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {regminregrel, %1.reg1, %1.reg2}	
 | 
						|
with  regplusiSreg GENREG
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {regiSregrel, %1.reg1, %1.S, %1.shift, %1.reg2}	
 | 
						|
with  regminiSreg GENREG
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {regminiSregrel, %1.reg1, %1.S, %1.shift, %1.reg2}	
 | 
						|
with  regplusrSreg GENREG
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {regrSregrel, %1.reg1, %1.S, %1.sreg, %1.reg2}	
 | 
						|
with  regminrSreg GENREG
 | 
						|
kills address
 | 
						|
	gen STR_B %2, {regminrSregrel, %1.reg1, %1.S, %1.sreg, %1.reg2}	
 | 
						|
 | 
						|
pat sti $1==2
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
uses REG
 | 
						|
gen move {imS, %2, "LSR", 8}, %a
 | 
						|
    SUB %2, %2, {imS, %a, "LSL", 8}
 | 
						|
    STR_B %2, {regind, %1}
 | 
						|
    STR_B %a, {regrel, %1, 1}
 | 
						|
 | 
						|
pat sti $1==4
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regind, %1}
 | 
						|
with addr_local GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {LOCAL, %1.ind}
 | 
						|
with addr_external GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {absolute, %1.add}
 | 
						|
with regconst GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regrel, %1.reg, %1.ind}
 | 
						|
with  regplusreg GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regregrel, %1.reg1, %1.reg2}
 | 
						|
with  regminreg GENREG 
 | 
						|
kills address
 | 
						|
	gen move %2, {regminregrel, %1.reg1, %1.reg2}	
 | 
						|
with  regplusiSreg GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regiSregrel, %1.reg1, %1.S, %1.shift, %1.reg2}	
 | 
						|
with  regminiSreg GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regminiSregrel, %1.reg1, %1.S, %1.shift, %1.reg2}	
 | 
						|
with  regplusrSreg GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regrSregrel, %1.reg1, %1.S, %1.sreg, %1.reg2}	
 | 
						|
with  regminrSreg GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regminrSregrel, %1.reg1, %1.S, %1.sreg, %1.reg2}	
 | 
						|
 | 
						|
pat sti defined($1)
 | 
						|
with GENREG STACK
 | 
						|
kills ALL
 | 
						|
uses REG={const4, $1}
 | 
						|
gen	LABEL {label, "1:"}
 | 
						|
	SUB_S %a, %a, {fitcon, 4}
 | 
						|
	move {regregrel, SP, %a}, R11
 | 
						|
	move R11, {regregrel, %1, %a}
 | 
						|
	BLT {label,"1B"}
 | 
						|
	ADD SP, SP, {const4, $1}
 | 
						|
 | 
						|
pat sts $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen BAL_L {label, ".sts"}
 | 
						|
 | 
						|
pat sdl
 | 
						|
with GENREG GENREG
 | 
						|
kills address-absolute
 | 
						|
gen 	move %1, {LOCAL,$1}
 | 
						|
	move %2, {LOCAL,$1+4}
 | 
						|
 | 
						|
pat sde
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
gen	move %1, {absolute, $1}
 | 
						|
	move %2, {absolute, $1+4}
 | 
						|
 | 
						|
pat sdf
 | 
						|
with GENREG GENREG GENREG
 | 
						|
kills address
 | 
						|
gen	move %2, {regrel, %1, $1}
 | 
						|
	move %3, {regrel, %1, $1+4}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP III :	Integer Arithmetic					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat adi $1==4
 | 
						|
with GENREG const4			yields {regconst, %1, %2.num}
 | 
						|
with const4 GENREG			yields {regconst, %2, %1.num}
 | 
						|
with GENREG GENREG			yields {regplusreg, %1, %2}
 | 
						|
with GENREG imS			yields {regplusiSreg,%1, %2.S, %2.shift, %2.reg}
 | 
						|
with imS GENREG 		yields {regplusiSreg,%2, %1.S, %1.shift, %1.reg}
 | 
						|
with GENREG regS		yields {regplusrSreg,%1, %2.S, %2.sreg, %2.reg}
 | 
						|
with regS GENREG 		yields {regplusrSreg,%2, %1.S, %1.sreg, %1.reg}
 | 
						|
with exact addr_local const4		yields {addr_local, %1.ind+%2.num}
 | 
						|
with exact const4 addr_local 		yields {addr_local, %2.ind+%1.num}
 | 
						|
with exact addr_external const4		yields {addr_external, %1.add+%2.num}
 | 
						|
with exact const4 addr_external		yields {addr_external, %2.add+%1.num}
 | 
						|
 | 
						|
pat sbi $1==4
 | 
						|
with GENREG GENREG			yields {regminreg, %2, %1}
 | 
						|
with imS GENREG			yields {regminiSreg,%2,%1.S,%1.shift,%1.reg}
 | 
						|
with regS GENREG		yields {regminrSreg,%2,%1.S,%1.sreg,%1.reg}
 | 
						|
with GENREG REGcon
 | 
						|
gen	RSB %1, %1, %2			yields %1
 | 
						|
with const4 GENREG			yields {regconst, %2, 0-%1.num}
 | 
						|
with exact const4 addr_local		yields {addr_local, %2.ind-%1.num}
 | 
						|
 | 
						|
pat loc mli $1<0 && $2==4		leaving loc 0-$1
 | 
						|
						mli 4
 | 
						|
						ngi 4
 | 
						|
 | 
						|
pat loc mli $1==2 && $2==4		
 | 
						|
with GENREG				yields {imS, %1, "LSL", 1}
 | 
						|
 | 
						|
pat loc mli $1==4 && $2==4		
 | 
						|
with GENREG				yields {imS, %1, "LSL", 2}
 | 
						|
 | 
						|
pat loc mli $1==8 && $2==4		
 | 
						|
with GENREG				yields {imS, %1, "LSL", 3}
 | 
						|
 | 
						|
pat loc mli $1==16 && $2==4		
 | 
						|
with GENREG				yields {imS, %1, "LSL", 4}
 | 
						|
 | 
						|
pat loc mli $1==32 && $2==4		
 | 
						|
with GENREG				yields {imS, %1, "LSL", 5}
 | 
						|
 | 
						|
pat loc mli $1==3 && $2==4
 | 
						|
with GENREG				yields {regplusiSreg,%1,"LSL",1,%1}
 | 
						|
 | 
						|
pat loc mli $1==5 && $2==4
 | 
						|
with GENREG				yields {regplusiSreg,%1,"LSL",2,%1}
 | 
						|
 | 
						|
pat loc mli $1==6 && $2==4
 | 
						|
with GENREG
 | 
						|
gen ADD %1, %1, {imS, %1, "LSL", 2}	yields {regplusiSreg,%1,"LSR",2,%1}
 | 
						|
 | 
						|
pat loc mli $1==7 && $2==4
 | 
						|
with GENREG
 | 
						|
gen RSB %1, %1, {imS, %1, "LSL", 3}	yields %1
 | 
						|
 | 
						|
pat loc mli $1==9 && $2==4
 | 
						|
with GENREG
 | 
						|
with GENREG				yields {regplusiSreg,%1,"LSL",3,%1}
 | 
						|
 | 
						|
pat loc mli $1==10 && $2==4
 | 
						|
with GENREG
 | 
						|
uses REG
 | 
						|
gen ADD %1, %1, {imS, %1, "LSL", 3}	
 | 
						|
    ADD %1, %1, {imS, %1, "LSR", 3}	yields %1
 | 
						|
 | 
						|
pat loc mli $1==12 && $2==4
 | 
						|
with GENREG
 | 
						|
gen move {imS, %1, "LSL", 3}, %1	yields {regplusiSreg,%1,"LSR",1,%1}
 | 
						|
 | 
						|
pat mli $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen	BAL_L {label, ".mli"}		yields R0
 | 
						|
 | 
						|
pat loc dvi $1<0 && $2==4		leaving loc 0-$1
 | 
						|
						dvi 4
 | 
						|
						ngi 4
 | 
						|
 | 
						|
pat loc dvi $1==2 && $2==4	
 | 
						|
with GENREG				yields {imS, %1, "ASR", 1}
 | 
						|
 | 
						|
pat loc dvi $1==4 && $2==4	
 | 
						|
with GENREG				yields {imS, %1, "ASR", 2}
 | 
						|
 | 
						|
pat loc dvi $1==8 && $2==4	
 | 
						|
with GENREG				yields {imS, %1, "ASR", 3}
 | 
						|
 | 
						|
pat loc dvi $1==16 && $2==4	
 | 
						|
with GENREG				yields {imS, %1, "ASR", 4}
 | 
						|
 | 
						|
pat loc dvi $1==32 && $2==4	
 | 
						|
with GENREG				yields {imS, %1, "ASR", 5}
 | 
						|
 | 
						|
pat dvi $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen	BAL_L {label, ".dvi"}		yields R3
 | 
						|
 | 
						|
pat rmi $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen	BAL_L {label, ".dvi"}		yields R2
 | 
						|
 | 
						|
pat ngi $1==4
 | 
						|
with GENREG
 | 
						|
gen 	RSB %1, %1, {fitcon, 0}		yields %1
 | 
						|
 | 
						|
pat sli $1==4
 | 
						|
with const4 GENREG			yields {imS, %2, "LSL", %1.num}
 | 
						|
with GENREG GENREG			yields {regS, %2, "LSL", %1}
 | 
						|
 | 
						|
pat loc sri $1==0 && $2==4		
 | 
						|
with address+REGcon			yields %1
 | 
						|
 | 
						|
pat sri $1==4
 | 
						|
with const4 GENREG			yields {imS, %2, "ASR", %1.num}
 | 
						|
with GENREG GENREG			yields {regS, %2, "ASR", %1}
 | 
						|
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP IV :	Unsigned Arithmetic					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat adu					leaving adi $1
 | 
						|
 | 
						|
pat sbu					leaving sbi $1
 | 
						|
 | 
						|
pat loc mlu $1<11 && $1>0 && $2==4	leaving loc $1
 | 
						|
						mli 4
 | 
						|
 | 
						|
pat mlu $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen	BAL_L {label, ".mlu"}		yields R0
 | 
						|
 | 
						|
pat loc dvu $1<33 && $1>0 && $2==4	leaving loc $1
 | 
						|
						dvi 4
 | 
						|
 | 
						|
pat dvu $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen	BAL_L {label, ".dvu"}		yields R3
 | 
						|
 | 
						|
pat rmu $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen	BAL_L {label, ".dvu"}		yields R2
 | 
						|
 | 
						|
pat slu $1==4
 | 
						|
with GENREG GENREG			yields {regS, %2, "LSL", %1}
 | 
						|
with const4 GENREG			yields {imS, %2, "LSL", $1}
 | 
						|
 | 
						|
pat sru $1==4
 | 
						|
with GENREG GENREG			yields {regS, %2, "LSR", %1}
 | 
						|
with const4 GENREG			yields {imS, %2, "LSR", $1}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP V :	Floating Point Arithmetic 				*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
 pat adf				leaving loc 18
 | 
						|
						trp
 | 
						|
 | 
						|
 pat sbf				leaving loc 18
 | 
						|
						trp
 | 
						|
 | 
						|
 pat mlf				leaving loc 18
 | 
						|
						trp
 | 
						|
 | 
						|
 pat dvf				leaving loc 18
 | 
						|
						trp
 | 
						|
 | 
						|
 pat  ngf				leaving loc 18
 | 
						|
						trp
 | 
						|
 | 
						|
 pat fif				leaving loc 18
 | 
						|
						trp
 | 
						|
 | 
						|
 pat fef				leaving loc 18
 | 
						|
						trp
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP VI :	Pointer Arithmetic					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat adp
 | 
						|
with GENREG				yields {regconst, %1, $1}
 | 
						|
with exact addr_local			yields {addr_local, %1.ind+$1}
 | 
						|
with exact addr_external		yields {addr_external, %1.add+$1}
 | 
						|
with exact regconst			yields {regconst, %1.reg, %1.ind+$1}
 | 
						|
 | 
						|
pat ads $1==4				leaving adi 4
 | 
						|
 | 
						|
pat sbs	$1==4				leaving sbi 4
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP VII :	Increment/Decrement/Zero				*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat inc
 | 
						|
with GENREG				yields {regconst, %1, 1}
 | 
						|
with exact regconst			yields {regconst, %1.reg, %1.ind+1}
 | 
						|
 | 
						|
pat inl
 | 
						|
kills address-absolute
 | 
						|
uses REG={LOCAL,$1}
 | 
						|
gen ADD %a,%a,{const4,1}
 | 
						|
    move %a,{LOCAL,$1}
 | 
						|
 | 
						|
pat ine
 | 
						|
kills address			
 | 
						|
uses REG={absolute,$1}
 | 
						|
gen ADD %a,%a,{const4,1}
 | 
						|
    move %a,{absolute,$1}
 | 
						|
 | 
						|
pat dec
 | 
						|
with GENREG				yields {regconst, %1, 0-1}
 | 
						|
 | 
						|
pat del
 | 
						|
kills address-absolute
 | 
						|
uses REG={LOCAL,$1}
 | 
						|
gen SUB %a,%a,{fitcon,1}
 | 
						|
    move %a,{LOCAL,$1}
 | 
						|
 | 
						|
pat dee
 | 
						|
kills address			
 | 
						|
uses REG={absolute,$1}
 | 
						|
gen SUB %a,%a,{fitcon,1}
 | 
						|
    move %a,{absolute,$1}
 | 
						|
 | 
						|
pat zrl
 | 
						|
kills address-absolute
 | 
						|
uses REG={fitcon,0}
 | 
						|
gen move %a,{LOCAL,$1}
 | 
						|
 | 
						|
pat zre
 | 
						|
kills address
 | 
						|
uses REG={fitcon,0}
 | 
						|
gen move %a,{absolute,$1}
 | 
						|
 | 
						|
pat zrf					leaving loc 18
 | 
						|
						trp
 | 
						|
 | 
						|
pat zer $1==4				yields {fitcon,0}
 | 
						|
 | 
						|
pat zer $1==8				yields {fitcon,0} {fitcon,0}
 | 
						|
 | 
						|
pat zer $1==12				yields {fitcon,0} {fitcon,0} {fitcon,0}
 | 
						|
 | 
						|
pat zer defined($1)
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses REG={fitcon,0},REG={const4,$1}
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    move %a,{autoid,SP}
 | 
						|
    SUB_S %b,%b,{fitcon,4}
 | 
						|
    BNE {label,"1B"}
 | 
						|
    move R14,PC
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP VIII :	Convert 						*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat cii
 | 
						|
with address + REGcon address + REGcon
 | 
						|
 | 
						|
pat cui
 | 
						|
with address +REGcon address + REGcon
 | 
						|
 | 
						|
pat cfi					leaving loc 18 trp
 | 
						|
pat cif					leaving loc 18 trp
 | 
						|
pat cuf					leaving loc 18 trp
 | 
						|
pat cff					leaving loc 18 trp
 | 
						|
pat cfu					leaving loc 18 trp
 | 
						|
 | 
						|
pat ciu
 | 
						|
with address +REGcon address + REGcon
 | 
						|
 | 
						|
pat cuu
 | 
						|
with address +REGcon address + REGcon
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP IX :	Logical 						*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat and $1==4
 | 
						|
with REGcon GENREG
 | 
						|
gen AND %2, %2, %1			yields %2
 | 
						|
with GENREG REGcon
 | 
						|
gen AND %1, %1, %2			yields %1
 | 
						|
 | 
						|
pat ior $1==4
 | 
						|
with REGcon GENREG
 | 
						|
gen ORR %2, %2, %1			yields %2
 | 
						|
with GENREG REGcon
 | 
						|
gen ORR %1, %1, %2			yields %1
 | 
						|
 | 
						|
pat xor $1==4
 | 
						|
with REGcon GENREG
 | 
						|
gen EOR %2, %2, %1			yields %2
 | 
						|
with GENREG REGcon
 | 
						|
gen EOR %1, %1, %2			yields %1
 | 
						|
 | 
						|
pat com $1==4
 | 
						|
with REGcon
 | 
						|
uses REG
 | 
						|
gen MVN %a,%1				yields %a
 | 
						|
 | 
						|
pat ror $1==4
 | 
						|
with const4 GENREG			yields {imS, %2, "ROR", %1.num}
 | 
						|
with GENREG GENREG			yields {regS, %2, "ROR", %1}
 | 
						|
 | 
						|
pat rol $1==4
 | 
						|
with const4 GENREG			yields {imS, %2, "ROR", 32-%1.num}
 | 
						|
with GENREG GENREG
 | 
						|
gen RSB %1, %1, {fitcon,32}		yields {regS, %2, "ROR", %1}
 | 
						|
 | 
						|
pat and $1>4
 | 
						|
with STACK
 | 
						|
gen move {const4,$1}, R1
 | 
						|
    move SP, R0
 | 
						|
    ADD SP, SP, R1
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S R1, R1, {fitcon, 4}
 | 
						|
    move {regregrel,SP,R1},R2
 | 
						|
    move {regregrel,R0,R1},R3
 | 
						|
    AND R2, R2, R3
 | 
						|
    move R2, {regregrel,SP,R1}
 | 
						|
    BNE {label, "1B"}
 | 
						|
    move R14,PC
 | 
						|
 | 
						|
pat ior $1>4
 | 
						|
with STACK
 | 
						|
gen move {const4,$1}, R1
 | 
						|
    move SP, R0
 | 
						|
    ADD SP, SP, R1
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S R1, R1, {fitcon, 4}
 | 
						|
    move {regregrel,SP,R1},R2
 | 
						|
    move {regregrel,R0,R1},R3
 | 
						|
    ORR R2, R2, R3
 | 
						|
    move R2, {regregrel,SP,R1}
 | 
						|
    BNE {label, "1B"}
 | 
						|
    move R14,PC
 | 
						|
 | 
						|
 | 
						|
pat xor $1>4
 | 
						|
with STACK
 | 
						|
gen move {const4,$1}, R1
 | 
						|
    move SP, R0
 | 
						|
    ADD SP, SP, R1
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S R1, R1, {fitcon, 4}
 | 
						|
    move {regregrel,SP,R1},R2
 | 
						|
    move {regregrel,R0,R1},R3
 | 
						|
    EOR R2, R2, R3
 | 
						|
    move R2, {regregrel,SP,R1}
 | 
						|
    BNE {label, "1B"}
 | 
						|
    move R14,PC
 | 
						|
 | 
						|
pat com $1>4
 | 
						|
with STACK
 | 
						|
gen move {const4,$1}, R1
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S R1, R1, {fitcon, 4}
 | 
						|
    move {regregrel,SP,R1},R2
 | 
						|
    MVN R2, R2
 | 
						|
    move R2,{regregrel,SP,R1}
 | 
						|
    BNE {label, "1B"}
 | 
						|
    move R14,PC
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP X:	Sets  							*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat loc loc inn !defined($3)		leaving loc $1 inn $2
 | 
						|
 | 
						|
pat loc inn $2==4 && $1>=0 && $1<32
 | 
						|
with GENREG
 | 
						|
uses REG={fitcon,1}
 | 
						|
gen AND %1, %1, {imS,%a,"LSL",$1}	yields %1
 | 
						|
 | 
						|
pat loc inn $2==4 && $1<0
 | 
						|
with GENREG
 | 
						|
gen move {fitcon,0}, %1			yields %1
 | 
						|
 | 
						|
pat loc inn $2==4 && $1>31		leaving loc 2 trp
 | 
						|
 | 
						|
pat loc inn !defined($2)		leaving inn $1
 | 
						|
 | 
						|
pat inn defined($1)
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen move {const4,$1}, R0
 | 
						|
    BAL_L {label, ".inn"}		yields R0
 | 
						|
 | 
						|
pat inn !defined($1)
 | 
						|
with GENREG
 | 
						|
gen move %1, R0
 | 
						|
    BAL_L {label, ".inn"}		yields R0
 | 
						|
 | 
						|
pat loc set !defined($2)		leaving set $1
 | 
						|
 | 
						|
pat set $1==4
 | 
						|
with const4 
 | 
						|
uses REG={fitcon,1} 			yields {imS,%a,"LSL",%1.num}
 | 
						|
with GENREG 
 | 
						|
uses REG={fitcon,1}			yields {regS,%a,"LSL",%1}
 | 
						|
 | 
						|
pat set $1>4
 | 
						|
with GENREG STACK
 | 
						|
uses REG={fitcon,1}, REG={fitcon,0}, REG={const4,$1}
 | 
						|
gen LABEL {label, "2:"}
 | 
						|
    move %b,{autoid, SP}
 | 
						|
    SUB_S %c, %c, {fitcon,4}
 | 
						|
    BGT {label, "2B"}
 | 
						|
    CMP %1, {fitcon, 0}
 | 
						|
    BMI {label, "1F"}
 | 
						|
    AND %b, %1, {fitcon, 31}
 | 
						|
    move {regS, %a, "LSL", %b}, %b
 | 
						|
    move {imS, %1, "LSR", 5}, %1
 | 
						|
    move %b, {regiSregrel, SP, "LSL", 2, %1}
 | 
						|
    LABEL {label, "1:"}
 | 
						|
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP XI :	Array Instructions					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat lae aar $2==4 && rom($1,3)==1 && rom($1,1)==0	leaving adi 4
 | 
						|
 | 
						|
pat lae aar $2==4 && rom($1,3)==1 && rom($1,1)!=0
 | 
						|
with GENREG
 | 
						|
gen ADD %1, %1, {const4, 1-rom($1,1)}		yields %1
 | 
						|
						leaving adi 4
 | 
						|
 | 
						|
pat lae aar $2==4 && rom($1,3)==4 && rom($1,1)==0
 | 
						|
with GENREG					yields {imS, %1,"LSL",  2}
 | 
						|
						leaving adi 4
 | 
						|
 | 
						|
pat lae aar $2==4 && rom($1,3)==4 && rom($1,1)!=0
 | 
						|
with GENREG
 | 
						|
gen ADD %1, %1, {const4, 1-rom($1,1)}		yields {imS, %1,"LSL", 2}
 | 
						|
						leaving adi 4
 | 
						|
 | 
						|
pat lae aar $2==4 && rom($1,1)==0
 | 
						|
						leaving loc rom($1,3) 
 | 
						|
							mli 4 adi 4
 | 
						|
 | 
						|
pat lae aar $2==4 && rom($1,1)!=0
 | 
						|
with GENREG
 | 
						|
gen ADD %1, %1, {const4, 1-rom($1,1)}
 | 
						|
						yields %1
 | 
						|
						leaving loc rom($1,3) 
 | 
						|
							mli 4 adi 4
 | 
						|
 | 
						|
pat aar $1==4
 | 
						|
with GENREG GENREG
 | 
						|
uses REG
 | 
						|
gen move {regind, %1}, %a
 | 
						|
    SUB %2, %2, %a				yields %2 {regrel, %1, 8}
 | 
						|
						leaving mli 4 adi 4
 | 
						|
 | 
						|
pat lae sar $2==4 && defined(rom($1,3))		leaving lae $1 aar 4 
 | 
						|
							sti rom($1,3)
 | 
						|
						
 | 
						|
pat lae lar $2==4 && defined(rom($1,3))		leaving lae $1 aar 4 
 | 
						|
							loi rom($1,3)
 | 
						|
 | 
						|
pat loc aar !defined($2)			leaving aar $1
 | 
						|
						
 | 
						|
pat lae loc sar !defined($3) && $2==4 && defined(rom($1,3))
 | 
						|
						leaving lae $1 aar 4
 | 
						|
							sti rom($1,3)
 | 
						|
						
 | 
						|
pat lae loc lar !defined($3) && $2==4 && defined(rom($1,3))
 | 
						|
						leaving lae $1 aar 4
 | 
						|
							loi rom($1,3)
 | 
						|
						
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP XII :	Compare Instructions					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat cmi
 | 
						|
with GENREG REGcon
 | 
						|
uses reusing %1, REG
 | 
						|
gen RSB_S %a, %1, %2				yields %a
 | 
						|
with REGcon GENREG
 | 
						|
uses reusing %2, REG
 | 
						|
gen SUB_S %a, %2, %1				yields %a
 | 
						|
 | 
						|
pat cmu						leaving cmi $1
 | 
						|
						/* !!! cannot be correct !!! */
 | 
						|
 | 
						|
pat cmp						leaving cmu 4
 | 
						|
 | 
						|
pat cmf						leaving loc 18 trp
 | 
						|
 | 
						|
pat loc cms !defined($2)			leaving cms $1
 | 
						|
 | 
						|
pat cms $1==4
 | 
						|
with GENREG REGcon
 | 
						|
gen EOR_S %1, %1, %2				yields %1
 | 
						|
with REGcon GENREG
 | 
						|
gen EOR_S %2, %2, %1				yields %2
 | 
						|
 | 
						|
pat cms $1!=4
 | 
						|
with STACK
 | 
						|
uses REG = {const4, $1}, REG, REG, REG
 | 
						|
gen ADD %b, %a, SP
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S %a, %a, {fitcon, 4}
 | 
						|
    BLT {label, "2F"}
 | 
						|
    move {regregrel, SP, %a}, %c
 | 
						|
    move {regregrel, %b, %a}, %d
 | 
						|
    EOR_S %c, %c, %d
 | 
						|
    BEQ {label, "1B"}
 | 
						|
    LABEL {label, "2:"}
 | 
						|
    ADD SP, %b, {const4, $1}			yields %c
 | 
						|
 | 
						|
pat cms !defined($1)
 | 
						|
with GENREG STACK
 | 
						|
uses REG, REG, REG
 | 
						|
gen ADD %a, %1, SP
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S %1, %1, {fitcon, 4}
 | 
						|
    BLT {label, "2F"}
 | 
						|
    move {regregrel, SP, %1}, %b
 | 
						|
    move {regregrel, %a, %1}, %c
 | 
						|
    EOR_S %b, %b, %c
 | 
						|
    BEQ {label, "1B"}
 | 
						|
    LABEL {label, "2:"}
 | 
						|
    ADD SP, %a, {const4, $1}			yields %b
 | 
						|
 | 
						|
pat tlt
 | 
						|
with GENREG
 | 
						|
uses reusing %1, REG
 | 
						|
gen test %1
 | 
						|
    MOV_LT %a, {fitcon,1}
 | 
						|
    MOV_GE %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat tle
 | 
						|
with  GENREG
 | 
						|
uses reusing %1, REG
 | 
						|
gen test %1
 | 
						|
    MOV_LE %a, {fitcon,1}
 | 
						|
    MOV_GT %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat teq
 | 
						|
with GENREG
 | 
						|
uses reusing %1, REG
 | 
						|
gen test %1
 | 
						|
    MOV_EQ %a, {fitcon,1}
 | 
						|
    MOV_NE %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat tne
 | 
						|
with  GENREG
 | 
						|
uses reusing %1, REG
 | 
						|
gen test %1
 | 
						|
    MOV_NE %a, {fitcon,1}
 | 
						|
    MOV_EQ %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat tge
 | 
						|
with  GENREG
 | 
						|
uses reusing %1, REG
 | 
						|
gen test %1
 | 
						|
    MOV_GE %a, {fitcon,1}
 | 
						|
    MOV_LT %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat tgt
 | 
						|
with GENREG
 | 
						|
uses reusing %1, REG
 | 
						|
gen test %1
 | 
						|
    MOV_GT %a, {fitcon,1}
 | 
						|
    MOV_LE %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP XIII :	Branch Instructions					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat bra
 | 
						|
with STACK
 | 
						|
	gen BAL {label, $1}
 | 
						|
 | 
						|
pat bne
 | 
						|
with REGcon GENREG STACK
 | 
						|
	gen CMP %2, %1
 | 
						|
	    BNE {label, $1}
 | 
						|
with GENREG REGcon STACK
 | 
						|
	gen CMP %1, %2
 | 
						|
	    BNE {label, $1}
 | 
						|
 | 
						|
pat beq
 | 
						|
with REGcon GENREG STACK
 | 
						|
	gen CMP %2, %1
 | 
						|
	    BEQ {label, $1}
 | 
						|
with GENREG REGcon STACK
 | 
						|
	gen CMP %1, %2
 | 
						|
	    BEQ {label, $1}
 | 
						|
 | 
						|
pat blt
 | 
						|
with REGcon GENREG STACK
 | 
						|
	gen CMP %2, %1
 | 
						|
	    BLT {label, $1}
 | 
						|
 | 
						|
pat ble
 | 
						|
with REGcon GENREG STACK
 | 
						|
	gen CMP %2, %1
 | 
						|
	    BLE {label, $1}
 | 
						|
 | 
						|
pat bgt
 | 
						|
with REGcon GENREG STACK
 | 
						|
	gen CMP %2, %1
 | 
						|
	    BGT {label, $1}
 | 
						|
 | 
						|
pat bge
 | 
						|
with REGcon GENREG STACK
 | 
						|
	gen CMP %2, %1
 | 
						|
	    BGE {label, $1}
 | 
						|
 | 
						|
pat zlt
 | 
						|
with GENREG STACK
 | 
						|
gen test %1
 | 
						|
    BLT {label, $1}
 | 
						|
 | 
						|
pat zle
 | 
						|
with GENREG STACK
 | 
						|
gen test %1
 | 
						|
    BLE {label, $1}
 | 
						|
 | 
						|
pat zeq
 | 
						|
with GENREG STACK
 | 
						|
gen test %1
 | 
						|
    BEQ {label, $1}
 | 
						|
 | 
						|
pat zne
 | 
						|
with GENREG STACK
 | 
						|
gen test %1
 | 
						|
    BNE {label, $1}
 | 
						|
 | 
						|
pat zge
 | 
						|
with GENREG STACK
 | 
						|
gen test %1
 | 
						|
    BGE {label, $1}
 | 
						|
 | 
						|
pat zgt
 | 
						|
with  GENREG STACK
 | 
						|
gen test %1
 | 
						|
    BGT {label, $1}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP XIV :	Procedure Call						*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat cal
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen BAL_L {label, $1}
 | 
						|
 | 
						|
pat cai					leaving loc 18 trp
 | 
						|
 | 
						|
pat lfr $1==4				yields R0
 | 
						|
 | 
						|
pat lfr $1==8				yields R1 R0
 | 
						|
 | 
						|
pat lfr $1==12				yields R2 R1 R0
 | 
						|
 | 
						|
pat ret $1==0				
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen move LB, SP 
 | 
						|
    move {autoid, SP}, LB
 | 
						|
    move {autoid, SP}, PC
 | 
						|
 | 
						|
pat ret $1==4
 | 
						|
with address STACK
 | 
						|
kills ALL
 | 
						|
gen move %1, R0
 | 
						|
    move LB, SP
 | 
						|
    move {autoid, SP}, LB
 | 
						|
    move {autoid, SP}, PC
 | 
						|
with REGcon STACK
 | 
						|
kills ALL
 | 
						|
gen move %1, R0
 | 
						|
    move LB, SP
 | 
						|
    move {autoid, SP}, LB
 | 
						|
    move {autoid, SP}, PC
 | 
						|
 | 
						|
pat ret $1==8
 | 
						|
with REGcon REGcon STACK
 | 
						|
kills ALL
 | 
						|
gen move %1, R0
 | 
						|
    move %2, R1
 | 
						|
    move LB, SP
 | 
						|
    move {autoid, SP}, LB
 | 
						|
    move {autoid, SP}, PC
 | 
						|
 | 
						|
pat ret $1==12
 | 
						|
with REGcon REGcon REGcon STACK
 | 
						|
kills ALL
 | 
						|
gen move %1, R0
 | 
						|
    move %2, R1
 | 
						|
    move %3, R2
 | 
						|
    move LB, SP
 | 
						|
    move {autoid, SP}, LB
 | 
						|
    move {autoid, SP}, PC
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP XV :	Miscellaneous						*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat asp
 | 
						|
with STACK
 | 
						|
gen ADD SP, SP, {const4, $1}
 | 
						|
 | 
						|
pat ass $1==4
 | 
						|
with REGcon STACK
 | 
						|
gen ADD SP, SP, %1
 | 
						|
 | 
						|
pat blm $1==0
 | 
						|
with address+REGcon address+REGcon
 | 
						|
 | 
						|
pat blm $1==4
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
uses REG
 | 
						|
gen move {regind, %2}, %a
 | 
						|
    move %a, {regind, %1}
 | 
						|
 | 
						|
pat blm $1>4
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
uses REG, REG={const4, $1-4}
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    move {regregrel, %2, %b}, %a
 | 
						|
    move %a, {regregrel, %1, %b}
 | 
						|
    SUB_S %b, %b, {fitcon, 4}
 | 
						|
    BGE {label,"1B"}
 | 
						|
 | 
						|
pat bls $1==4
 | 
						|
with GENREG GENREG GENREG
 | 
						|
kills address
 | 
						|
uses REG
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    SUB_S %1, %1, {fitcon, 4}
 | 
						|
    move {regregrel, %3, %1}, %a
 | 
						|
    move %a, {regregrel, %2, %1}
 | 
						|
    BGT {label,"1B"}
 | 
						|
 | 
						|
pat csa
 | 
						|
 | 
						|
pat csb
 | 
						|
 | 
						|
pat dch					leaving loi 4
 | 
						|
 | 
						|
pat dup $1==4
 | 
						|
with address+REGcon			yields %1 %1
 | 
						|
 | 
						|
pat dup $1==8
 | 
						|
with address+REGcon address+REGcon	yields %2 %1 %2 %1
 | 
						|
 | 
						|
pat dup $1>8
 | 
						|
with STACK
 | 
						|
uses REG={const4,$1}, REG
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    move {regrel, SP, $1-4}, %b
 | 
						|
    move %b, {autoid, SP}
 | 
						|
    SUB_S %a, %a, {fitcon, 4}
 | 
						|
    BGT {label, "1B"}
 | 
						|
 | 
						|
pat dus
 | 
						|
with GENREG STACK
 | 
						|
uses REG, REG
 | 
						|
gen SUB %b, %1, {fitcon, 4}
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    move {regregrel, SP, %b}, %a
 | 
						|
    move %a, {autoid, SP}
 | 
						|
    SUB_S %1, %1, {fitcon, 4}
 | 
						|
    BGT {label, "1B"}
 | 
						|
 | 
						|
pat exg $1==4
 | 
						|
with address+REGcon address+REGcon		yields %1 %2
 | 
						|
 | 
						|
pat exg $1==8
 | 
						|
with address+REGcon address+REGcon
 | 
						|
     address+REGcon address+REGcon		yields %2 %1 %4 %3
 | 
						|
 | 
						|
pat exg $1>8
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses REG, REG, REG={const4, $1-4}, REG
 | 
						|
gen ADD %d, SP, {const4, $1}
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    move {regregrel,SP,%c}, %a
 | 
						|
    move {regregrel,%d,%c}, %b
 | 
						|
    move %a, {regregrel,%d,%c}
 | 
						|
    move %b, {regregrel,SP,%c}
 | 
						|
    SUB_S %c, %c, {fitcon, 4}
 | 
						|
    BGE {label, "1B"}
 | 
						|
 | 
						|
pat fil
 | 
						|
 | 
						|
pat gto
 | 
						|
 | 
						|
pat lim
 | 
						|
 | 
						|
pat lin
 | 
						|
 | 
						|
pat lni
 | 
						|
 | 
						|
pat lor $1==0				yields LB
 | 
						|
 | 
						|
pat lor $1==1
 | 
						|
with STACK				yields SP
 | 
						|
 | 
						|
pat lor $1==2				yields {absolute, ".reghp"}
 | 
						|
 | 
						|
pat lpb					leaving adp 8
 | 
						|
 | 
						|
pat mon
 | 
						|
 | 
						|
pat nop
 | 
						|
 | 
						|
pat rck
 | 
						|
with GENREG REGcon STACK
 | 
						|
uses REG
 | 
						|
gen move {regind, %1}, %a
 | 
						|
    CMP %a, %2
 | 
						|
    BGT {label, "rcktrap"}
 | 
						|
    move {regrel, %1, 4}, %a
 | 
						|
    CMP %a, %2
 | 
						|
    BLT {label, "rcktrap"}
 | 
						|
 | 
						|
pat rtt
 | 
						|
 | 
						|
pat sig
 | 
						|
 | 
						|
pat sim
 | 
						|
 | 
						|
pat str $1==0
 | 
						|
with address
 | 
						|
gen move %1, LB
 | 
						|
with REGcon
 | 
						|
gen move %1, LB
 | 
						|
 | 
						|
pat str $1==1
 | 
						|
with address
 | 
						|
gen move %1, SP
 | 
						|
with REGcon
 | 
						|
gen move %1, SP
 | 
						|
 | 
						|
pat str $1==2
 | 
						|
with GENREG
 | 
						|
gen move %1, {absolute, ".reghp"}
 | 
						|
 | 
						|
pat trp
 | 
						|
 | 
						|
 | 
						|
/***********************************************************************/
 | 
						|
 | 
						|
pat lol lol adp stl loi $1==$2 && $2==$4 && $5==4
 | 
						|
uses REG, REG
 | 
						|
gen move {LOCAL, $1}, %a
 | 
						|
    move {regrelpi, %a, $3}, %b
 | 
						|
    move %a, {LOCAL, $1}		yields %b
 | 
						|
 | 
						|
pat lol lol adp stl sti $1==$2 && $2==$4 && $5==4
 | 
						|
with GENREG
 | 
						|
uses REG
 | 
						|
gen move {LOCAL,$1}, %a
 | 
						|
    move %1, {regrelpi, %a, $3}
 | 
						|
    move %a, {LOCAL, $1}
 |