2356 lines
		
	
	
	
		
			60 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			2356 lines
		
	
	
	
		
			60 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 *            ACK backend for Acorn Risc Machine                            *
 | 
						|
 *            First version: A.N.Other, Vrije Universiteit, Amsterdam       *
 | 
						|
 *            Completed by: Albert Koelmans, University of Newcastle        *
 | 
						|
 *            Register variables by Jonathan Hardwick                       *
 | 
						|
 *            With help from: Andy Michael and Ceriel Jacobs                *
 | 
						|
 ****************************************************************************/
 | 
						|
 | 
						|
#define legal(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)
 | 
						|
#define neglegal(a)  (((0-a)&~0xFF)==0||((0-a)&~0x3FC)==0||((0-a)&~0xFF0)==0||\
 | 
						|
 		     ((0-a)&~0x3FC0)==0||((0-a)&~0xFF00)==0||((0-a)&~0x3FC00)==0||\
 | 
						|
 		     ((0-a)&~0xFF000)==0||((0-a)&~0x3FC000)==0||((0-a)&~0xFF0000)==0||\
 | 
						|
 		     ((0-a)&~0x3FC0000)==0||((0-a)&~0xFF00000)==0||((0-a)&~0x3FC00000)==0||\
 | 
						|
 		     ((0-a)&~0xFF000000)==0||((0-a)&~0xFC000003)==0||((0-a)&~0xF000000F)==0||\
 | 
						|
 		     ((0-a)&~0xC000003F)==0||(~(0-a)&~0xFF)==0)
 | 
						|
 | 
						|
#define illegal(a)    !legal(a)
 | 
						|
#define minlegal(a)    (a < 0) && neglegal(a)
 | 
						|
#define minillegal(a)  (a < 0) && !neglegal(a)
 | 
						|
 | 
						|
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,R8,R9,R10			:GENREG, REG .
 | 
						|
R4,R5,R6,R7				:GENREG regvar(reg_any).
 | 
						|
R11	               			:GENREG, SREG  .
 | 
						|
SP("R12")				:STACKPOINTER .
 | 
						|
LB("R13")				:LOCALBASE .
 | 
						|
LR("R14")				:LINKREGISTER .
 | 
						|
PC("R15")				:PCPSR .
 | 
						|
 | 
						|
TOKENS
 | 
						|
 | 
						|
const4		= { INT num; } 4 cost(0,4) "#" num .
 | 
						|
fitcon		= { INT num; } 4 cost(0,4) "#" num .
 | 
						|
lb_local	= { INT ind; } 4 "[R13,#" ind "]" .
 | 
						|
addr_local	= { INT ind; } 4 .
 | 
						|
naddr_local	= { INT ind; } 4 .
 | 
						|
absolute	= { ADDR add; } 4 add .
 | 
						|
addr_external	= { ADDR add; } 4 add .
 | 
						|
label		= { ADDR add; } 4 add .
 | 
						|
autoid		= { STACKPOINTER reg; } 4 reg "<" .
 | 
						|
regexp		= { INT exp;} 4 exp  .
 | 
						|
register	= { GENREG exp;} 4 exp  .
 | 
						|
 | 
						|
imS		= { GENREG reg; ADDR S; INT shift;} 4 
 | 
						|
			reg "," S "#" shift  .
 | 
						|
regS		= { GENREG reg; ADDR S; GENREG sreg;} 4 
 | 
						|
			reg "," S " "sreg  .
 | 
						|
regind		= { GENREG reg; } 4 
 | 
						|
			"[" reg "]" .
 | 
						|
REGrel		= { REG reg; ADDR ind; } 4 
 | 
						|
			"[" reg ",#" ind "]"  .
 | 
						|
regrel		= { GENREG reg; ADDR ind; } 4 
 | 
						|
			"[" reg ",#" ind "]"  .
 | 
						|
st_regrel	= { STACKPOINTER reg; ADDR ind; } 4 
 | 
						|
			"[" reg ",#" ind "]"  .
 | 
						|
lb_regrel	= { LOCALBASE reg; ADDR ind; } 4 
 | 
						|
			"[" reg ",#" ind "]"  .
 | 
						|
regregrel	= { GENREG reg1; GENREG reg2; } 4 
 | 
						|
			"[" reg1 "," reg2 "]" .
 | 
						|
st_regregrel	= { STACKPOINTER reg1; GENREG reg2; } 4 
 | 
						|
			"[" reg1 "," reg2 "]" .
 | 
						|
lb_regregrel	= { LOCALBASE 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 "]" .
 | 
						|
st_regiSregrel	= { STACKPOINTER 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 "]" .
 | 
						|
regminrSregrel	= { GENREG reg1; ADDR S; GENREG sreg; GENREG reg2; } 4
 | 
						|
			"[" reg1 ",-" reg2 ","  S " " sreg "]" .
 | 
						|
regrelpi	= { GENREG reg; ADDR ind; } 4 
 | 
						|
			"[" reg "],#" ind .
 | 
						|
regconst	= { GENREG reg; INT  ind; } 4 
 | 
						|
			reg ",#" ind  .
 | 
						|
 | 
						|
regplusreg	= {GENREG reg1; GENREG reg2;} 4
 | 
						|
			reg1 "," reg2 .
 | 
						|
regplusiSreg	= {GENREG reg1; ADDR S; INT shift; GENREG reg2;} 4
 | 
						|
			reg1 "," reg2 "," S "#" shift .
 | 
						|
regplusrSreg	= {GENREG reg1; ADDR S; GENREG sreg; GENREG reg2;} 4
 | 
						|
			reg1 "," reg2 "," S "," sreg .
 | 
						|
regminreg	= {GENREG reg1; GENREG reg2;} 4
 | 
						|
			reg1 "," reg2 .
 | 
						|
regminiSreg	= {GENREG reg1; ADDR S; INT shift; GENREG reg2;} 4
 | 
						|
			reg1 "," reg2 "," S "#" shift .
 | 
						|
regminrSreg	= {GENREG reg1; ADDR S; GENREG sreg; GENREG reg2;} 4
 | 
						|
			reg1 "," reg2 "," S "," sreg .
 | 
						|
 | 
						|
REGlist1	= {REG reg1; } 4 
 | 
						|
			"{" reg1 "}" .
 | 
						|
reglist1	= {GENREG reg1; } 4 
 | 
						|
			"{" reg1 "}" .
 | 
						|
lb_reglist1	= {LOCALBASE reg1; } 4 
 | 
						|
			"{" reg1 "}" .
 | 
						|
sp_reglist1	= {STACKPOINTER reg1; } 4 
 | 
						|
			"{" reg1 "}" .
 | 
						|
reglist2	= {GENREG reg1; GENREG reg2; } 8 
 | 
						|
			"{" reg1 "," reg2 "}" .
 | 
						|
lb_pc_reglist2	= {LOCALBASE reg1; PCPSR 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 "}" .
 | 
						|
 | 
						|
/* the next 5 are not currently used - perhaps later */
 | 
						|
regrelwb	= { GENREG reg; ADDR ind; } 4 "[" reg ",#" ind "]<"  .
 | 
						|
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 "]<" .
 | 
						|
regregrelpi	= { GENREG reg1; GENREG reg2; } 4 "[" reg1 "]," reg2 .
 | 
						|
 | 
						|
LOCAL		= { INT ind;} 4 ">>> BUG IN LOCAL".
 | 
						|
stack		= { GENREG r;} 4 "R12<,{" r "}".
 | 
						|
 | 
						|
/* tokens to put shifts and rotates into opcodes			*/
 | 
						|
reglslcon	= {GENREG target; INT shift;} 4 target ",LSL#" shift.
 | 
						|
reglsrcon	= {GENREG target; INT shift;} 4 target ",LSR#" shift.
 | 
						|
regasrcon	= {GENREG target; INT shift;} 4 target ",ASR#" shift.
 | 
						|
regrorcon	= {GENREG target; INT shift;} 4 target ",ROR#" shift.
 | 
						|
reglslreg	= {GENREG target; GENREG shift;} 4 cost(0,1) target ",LSL " shift.
 | 
						|
reglsrreg	= {GENREG target; GENREG shift;} 4 cost(0,1) target ",LSR " shift.
 | 
						|
regasrreg	= {GENREG target; GENREG shift;} 4 cost(0,1) target ",ASR " shift.
 | 
						|
regrorreg	= {GENREG target; GENREG shift;} 4 cost(0,1) target ",ROR " shift.
 | 
						|
regrorregr	= {GENREG target; GENREG shift;} 4 cost(0,1) target ",ROR " shift.
 | 
						|
 | 
						|
 | 
						|
SETS
 | 
						|
 | 
						|
address		= absolute + regind + regrel + regrelwb + regregrel +
 | 
						|
		  st_regrel + st_regregrel + st_regiSregrel +
 | 
						|
		  lb_regrel + lb_regregrel +
 | 
						|
                  regiSregrel + regiSregrelwb + regrSregrelwb +
 | 
						|
		  regminregrel + regminiSregrel + regminrSregrel +
 | 
						|
		  regregrelwb + regrelpi + regregrelpi + lb_local .
 | 
						|
REGcon		= GENREG + imS + regS + fitcon  .
 | 
						|
reglist		= reglist1 + reglist2 + reglist3 + reglist4 +
 | 
						|
		  lb_reglist1 + sp_reglist1 + lb_pc_reglist2 +
 | 
						|
		  regexp + REGlist1 .
 | 
						|
constant        = fitcon + const4 .
 | 
						|
local		= lb_local + LOCAL.
 | 
						|
regshift	= reglslreg + reglsrreg + regasrreg + regrorreg + regrorregr +
 | 
						|
		  reglslcon + reglsrcon + regasrcon + regrorcon.
 | 
						|
rhs		= GENREG + constant + regshift + LOCAL.
 | 
						|
mem4		= regregrel + regrel + lb_local.
 | 
						|
extern		= addr_external + absolute + label.
 | 
						|
all_except_con  = mem4 + extern + local.
 | 
						|
any_data	= all_except_con + rhs.
 | 
						|
any_data_except_local = any_data - LOCAL.
 | 
						|
posshifts       = regplusiSreg+regplusrSreg.
 | 
						|
negshifts       = regminiSreg+regminrSreg.
 | 
						|
shifts          = posshifts+negshifts.
 | 
						|
 | 
						|
INSTRUCTIONS
 | 
						|
 | 
						|
BAL  		 label  					cost(4,4) .
 | 
						|
BAL_L   "BAL.L"  label 						cost(4,4) .
 | 
						|
BAL_LEQ "BAL.L.EQ" label 					cost(4,4) .
 | 
						|
BNV  		 label 						cost(4,4) .
 | 
						|
BNE  		 label 						cost(4,4) .
 | 
						|
BEQ  		 label 						cost(4,4) .
 | 
						|
BMI  		 label 						cost(4,4) .
 | 
						|
BGT  		 label 						cost(4,4) .
 | 
						|
BLT  		 label 						cost(4,4) .
 | 
						|
BLE  	 	 label 						cost(4,4) .
 | 
						|
BGE  		 label 						cost(4,4) .
 | 
						|
 | 
						|
LDR  		 REG+LOCALBASE+GENREG+address:wo, address:rw 	cost(4,4) .
 | 
						|
LDR		 LOCAL+GENREG:rw,
 | 
						|
			mem4+absolute+addr_external:ro		cost(4,4) .
 | 
						|
STR  		 GENREG+REG:ro, REGrel+address:rw 		cost(4,4) .
 | 
						|
LDR_B  "LDR.B"   REG+GENREG:wo, address:rw 			cost(4,4) .
 | 
						|
LDR_B		 LOCAL:rw, rhs+mem4:ro				cost(4,4) .
 | 
						|
STR_B  "STR.B"   GENREG+REG:ro, address:rw 			cost(4,4) .
 | 
						|
 | 
						|
LDMFD 		 autoid:rw, reglist:wo 				cost(4,7) .
 | 
						|
STMFD 		 autoid:rw, reglist:ro 				cost(4,7) .
 | 
						|
STMFD		 stack						cost(4,4) .
 | 
						|
LDMIA 		 GENREG:rw, reglist:wo 				cost(4,7) .
 | 
						|
 | 
						|
ADC  		 REG+GENREG:wo, REG+GENREG:ro, REGcon:ro  	cost(4,1) .
 | 
						|
ADD  		 GENREG+REG:wo, GENREG:ro, REGcon+const4:ro  	cost(4,1) .
 | 
						|
ADD  		 GENREG+STACKPOINTER:wo, GENREG+STACKPOINTER:ro,
 | 
						|
			STACKPOINTER+REGcon+const4:ro  		cost(4,1) .
 | 
						|
ADD  		 LOCAL+GENREG+REG:wo,
 | 
						|
			regconst+shifts+regminreg+regplusreg:ro	cost(4,1) .
 | 
						|
ADD		 LOCAL+GENREG:rw, LOCALBASE+GENREG+LOCAL:ro,
 | 
						|
					rhs:ro			cost(4,1).
 | 
						|
ADD_NE "ADD.NE"  GENREG+REG:wo, GENREG:ro, REGcon+const4:ro  	cost(4,1) .
 | 
						|
AND  		 REG+GENREG:wo, GENREG:ro, GENREG+REGcon:ro  	cost(4,1) .
 | 
						|
AND_S  "AND.S"   GENREG+REG:wo, GENREG:ro, REGcon:ro  		cost(4,1) .
 | 
						|
BIC  		 REG+GENREG:wo, GENREG:ro, REGcon:ro  		cost(4,1) .
 | 
						|
CMN  		 GENREG+REG:ro, REGcon:ro kills :cc  		cost(4,1) .
 | 
						|
CMP  		 REG+GENREG:ro, REGcon:ro kills :cc  		cost(4,1) .
 | 
						|
EOR  		 GENREG+REG:wo, GENREG:ro, GENREG+REGcon:ro	cost(4,1) .
 | 
						|
EOR_S  "EOR.S"   REG+GENREG:wo:cc, GENREG:ro, REGcon:ro  	cost(4,1) .
 | 
						|
MOV  		 REG:wo, REGcon+const4:ro  			cost(4,1) .
 | 
						|
MOV		 REG:rw, LOCAL:ro				cost(4,1).
 | 
						|
MOV		 LOCALBASE+PCPSR+STACKPOINTER+GENREG:rw, 
 | 
						|
		 REGcon+address+LOCALBASE+PCPSR+
 | 
						|
				STACKPOINTER+GENREG+LOCAL:ro	cost(4,1).
 | 
						|
MOV		 LOCAL+GENREG:rw, GENREG+rhs+register+REG:ro	cost(4,1).
 | 
						|
MOV  		 LOCALBASE+GENREG:wo, REGcon+const4:ro  	cost(4,1) .
 | 
						|
MOV_MI "MOV.MI"  REG+GENREG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_HI "MOV.HI"  GENREG+REG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_LS "MOV.LS"  REG+GENREG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_LT "MOV.LT"  GENREG+REG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_LE "MOV.LE"  REG+GENREG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_EQ "MOV.EQ"  GENREG+REG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_NE "MOV.NE"  REG+GENREG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_GE "MOV.GE"  REG+GENREG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_GT "MOV.GT"  REG+GENREG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_NV "MOV.NV"  GENREG+REG:wo, REGcon+const4:ro  		cost(4,1) .
 | 
						|
MOV_S  "MOV.S"   GENREG+REG:wo, REGcon+const4+regind:ro
 | 
						|
						kills :cc   	cost(4,1) .
 | 
						|
MVN  		 LOCAL+GENREG+REG:wo, REGcon:ro			cost(4,1) .
 | 
						|
ORR  		 REG+GENREG:wo, GENREG:ro, GENREG+REGcon:ro	cost(4,1) .
 | 
						|
ORR  		 REG+GENREG+LOCAL:wo, imS:ro			cost(4,1) .
 | 
						|
RSB		 REG+GENREG+LOCAL:rw, REG+GENREG+LOCAL:ro,
 | 
						|
					rhs:ro			cost(4,1).
 | 
						|
RSB  		 GENREG+REG:wo, GENREG:ro, REGcon:ro  		cost(4,1) .
 | 
						|
RSB_S  "RSB.S"   REG+GENREG:wo:cc, GENREG:ro, REGcon:ro  	cost(4,1) .
 | 
						|
RSC  		 GENREG+REG:wo, GENREG:ro, REGcon:ro  		cost(4,1) .
 | 
						|
SBC  		 REG+GENREG:wo, GENREG:ro, REGcon:ro  		cost(4,1) .
 | 
						|
SUB		 LOCAL+GENREG:rw,
 | 
						|
			regconst+shifts+regplusreg+regminreg:ro	cost(4,1).
 | 
						|
SUB		 LOCAL:rw, LOCAL:ro, rhs:ro			cost(4,1).
 | 
						|
SUB  		 LOCAL+REG+GENREG:wo, LOCALBASE+GENREG:ro, 
 | 
						|
			constant+REGcon:ro  			cost(4,1) .
 | 
						|
SUB_S  "SUB.S"   REG+GENREG:wo:cc, GENREG:ro, REGcon:ro  	cost(4,1) .
 | 
						|
TEQ  		 GENREG+REG:ro, REGcon:ro kills :cc  		cost(4,1) .
 | 
						|
TST 		 REG+GENREG:ro, REGcon:ro kills :cc  		cost(4,1) .
 | 
						|
ADR 		 REG+LINKREGISTER+GENREG:wo,
 | 
						|
					addr_external+label:ro	cost(4,1) .
 | 
						|
LABEL  "" 	 label kills :cc 				cost(4,1) .
 | 
						|
 | 
						|
/* Dummy instructions for ncgg procedures : lxx is logical operator,	*/ 
 | 
						|
/* mxx is conditional move, bxx is conditional branch, rxx is arith-	*/
 | 
						|
/* metical operator on register variable (LOCAL).			*/
 | 
						|
 | 
						|
lxx "lxx : bug in cg"	REG:rw, REG:ro, rhs:ro 		cost(4,1).
 | 
						|
mxx "mxx : bug in cg"	REG:rw, rhs:ro			cost(4,1).
 | 
						|
bxx "bxx : bug in cg"	addr_external			cost(4,4).
 | 
						|
rxx "rxx : bug in cg"	LOCAL:rw, LOCAL:ro, rhs:ro	cost(4,1).
 | 
						|
rrx "rrx : bug in cg"	LOCAL:rw, LOCAL:ro, LOCAL:ro	cost(4,1).
 | 
						|
 | 
						|
 | 
						|
MOVES
 | 
						|
 | 
						|
from GENREG+STACKPOINTER+LOCALBASE+PCPSR to
 | 
						|
     GENREG+STACKPOINTER+LOCALBASE+PCPSR
 | 
						|
	gen MOV %2, %1
 | 
						|
 | 
						|
from fitcon+GENREG+REG to LOCAL inreg(%ind)==reg_any
 | 
						|
	gen MOV %2, %1
 | 
						|
 | 
						|
from LOCAL inreg(%ind)==reg_any to REG+GENREG
 | 
						|
	gen MOV %2, %1
 | 
						|
 | 
						|
/* illegal immediate operands */
 | 
						|
 | 
						|
from const4 minlegal(%num+1) to GENREG+LOCAL
 | 
						|
gen MVN %2, {fitcon, 0-%1.num-1}
 | 
						|
 | 
						|
from const4 (minlegal(%num)) to GENREG+LOCAL
 | 
						|
gen MOV %2, {fitcon, 0-%1.num}
 | 
						|
    RSB %2, %2, {fitcon, 0}
 | 
						|
 | 
						|
from const4 to GENREG+LOCAL    /* general case */
 | 
						|
      gen MOV %2,     { fitcon,   %1.num & 0xFF}
 | 
						|
          ADD %2, %2, { fitcon,   %1.num & 0xFF00}
 | 
						|
          ADD %2, %2, { fitcon,   %1.num & 0xFF0000}
 | 
						|
          ADD %2, %2, { fitcon,   %1.num & 0xFF000000}
 | 
						|
 | 
						|
from regconst (%ind > 0) && legal(%ind) to LOCAL inreg(%ind)==reg_any
 | 
						|
	gen ADD %2, %1
 | 
						|
 | 
						|
from regconst minlegal(%ind) to LOCAL inreg(%ind)==reg_any
 | 
						|
	gen SUB %2, %1.reg, {fitcon, 0-%1.ind}
 | 
						|
 | 
						|
from lb_local legal(%ind) to GENREG
 | 
						|
gen LDR %2, {lb_regrel, LB, %1.ind}
 | 
						|
 | 
						|
from lb_local to GENREG
 | 
						|
gen move {const4, %1.ind}, R11
 | 
						|
    LDR %2, {lb_regregrel, LB, R11}
 | 
						|
 | 
						|
from GENREG to lb_local legal(%ind)
 | 
						|
gen STR %1, {lb_regrel, LB, %2.ind}
 | 
						|
 | 
						|
from GENREG to lb_local
 | 
						|
gen move {const4, %2.ind}, R11
 | 
						|
    STR %1, {lb_regregrel, LB, R11}
 | 
						|
 | 
						|
from GENREG to address
 | 
						|
	gen STR %1, %2
 | 
						|
 | 
						|
from address to GENREG+LOCALBASE
 | 
						|
	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+LOCALBASE
 | 
						|
	gen MOV %2, %1
 | 
						|
 | 
						|
 | 
						|
from addr_external to GENREG
 | 
						|
          gen ADR %2, %1
 | 
						|
 | 
						|
/* strictly speaking, the following move is impossible.
 | 
						|
 * what it really means is: move from reg to address!
 | 
						|
 */
 | 
						|
from GENREG to addr_external
 | 
						|
          gen ADR R11,%2
 | 
						|
              STR %1,{regind,R11}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
TESTS
 | 
						|
 | 
						|
to test GENREG
 | 
						|
gen CMP %1, {fitcon, 0}
 | 
						|
 | 
						|
 | 
						|
STACKINGRULES
 | 
						|
 | 
						|
from LOCAL to STACK
 | 
						|
	gen STMFD {stack, regvar(%1.ind)}
 | 
						|
 | 
						|
from REG to STACK
 | 
						|
	gen STMFD {autoid, SP}, {REGlist1, %1}
 | 
						|
 | 
						|
from GENREG to STACK
 | 
						|
	gen STMFD {autoid, SP}, {reglist1, %1}
 | 
						|
 | 
						|
from LOCALBASE to STACK
 | 
						|
	gen STMFD {autoid, SP}, {lb_reglist1, %1}
 | 
						|
 | 
						|
from STACKPOINTER to STACK
 | 
						|
	gen STMFD {autoid, SP}, {sp_reglist1, %1}
 | 
						|
 | 
						|
from REGcon to STACK
 | 
						|
	gen move %1, R11
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from const4 to STACK
 | 
						|
	gen move %1, R11
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from addr_local legal(%ind) to STACK
 | 
						|
	gen ADD R11, LB, {fitcon, %1.ind}
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from addr_local to STACK
 | 
						|
	gen move {const4, %1.ind}, R11
 | 
						|
	    ADD R11, LB, R11
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from naddr_local legal(%ind) to STACK
 | 
						|
	gen SUB R11, LB, {fitcon, %1.ind}
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from naddr_local to STACK
 | 
						|
	gen move {const4, %1.ind}, R11
 | 
						|
	    SUB R11, LB, R11
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from addr_external to STACK
 | 
						|
	gen ADR R11, %1
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from regconst (%ind > 0) && legal(%ind) to STACK
 | 
						|
	gen ADD R11, %1.reg, {fitcon,%1.ind}
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from regconst to STACK
 | 
						|
	gen move {const4, %1.ind}, R11
 | 
						|
	    ADD R11, R11, %1.reg
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from regplusreg to STACK
 | 
						|
	gen ADD R11, %1.reg1, %1.reg2
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from regminreg to STACK
 | 
						|
	gen SUB R11, %1.reg1, %1.reg2
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from regplusiSreg to STACK
 | 
						|
	gen ADD R11, %1.reg1, {imS, %1.reg2, %1.S, %1.shift}
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from regminiSreg to STACK
 | 
						|
	gen SUB R11, %1.reg1, {imS, %1.reg2, %1.S, %1.shift}
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from regplusrSreg to STACK
 | 
						|
	gen ADD R11, %1.reg1, {regS, %1.reg2, %1.S, %1.sreg}
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from regminrSreg to STACK
 | 
						|
	gen SUB R11, %1.reg1, {regS, %1.reg2, %1.S, %1.sreg}
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
from address to STACK
 | 
						|
	gen move %1, R11
 | 
						|
	    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
 | 
						|
COERCIONS
 | 
						|
 | 
						|
from LOCAL
 | 
						|
uses GENREG
 | 
						|
gen MOV %a, %1					yields %a
 | 
						|
 | 
						|
from lb_local legal(%ind)
 | 
						|
uses GENREG
 | 
						|
gen LDR %a, {lb_regrel, LB, %ind}   		yields %a
 | 
						|
 | 
						|
from lb_local
 | 
						|
uses GENREG
 | 
						|
gen move {const4, %ind}, R11 
 | 
						|
    LDR %a, {lb_regregrel, LB, R11}   		yields %a
 | 
						|
 | 
						|
from const4 %num < 0
 | 
						|
uses GENREG
 | 
						|
	gen move {const4, 0-%num}, %a
 | 
						|
	    RSB %a, %a, {fitcon, 0}       	yields %a
 | 
						|
 | 
						|
from const4 illegal(%num)
 | 
						|
uses GENREG
 | 
						|
	gen move %1, %a				yields %a
 | 
						|
 | 
						|
from const4 					yields {fitcon, %num}
 | 
						|
 | 
						|
from STACK
 | 
						|
uses GENREG
 | 
						|
	gen LDMFD {autoid, SP}, {reglist1, %a}	yields %a
 | 
						|
 | 
						|
from address
 | 
						|
uses GENREG
 | 
						|
	gen move %1, %a				yields %a
 | 
						|
 | 
						|
from REGcon
 | 
						|
uses GENREG
 | 
						|
	gen move %1, %a				yields %a
 | 
						|
 | 
						|
from addr_external
 | 
						|
uses GENREG
 | 
						|
	gen move %1, %a
 | 
						|
	    					yields %a
 | 
						|
 | 
						|
from addr_local legal(%ind)
 | 
						|
uses GENREG
 | 
						|
	gen ADD %a, LB, {fitcon, %ind}		yields %a
 | 
						|
 | 
						|
from addr_local
 | 
						|
uses GENREG
 | 
						|
	gen move {const4, %ind}, %a
 | 
						|
	    ADD %a, LB, %a 			yields %a
 | 
						|
 | 
						|
from naddr_local legal(%ind)
 | 
						|
uses GENREG
 | 
						|
	gen SUB %a, LB, {fitcon, %ind}		yields %a
 | 
						|
 | 
						|
from naddr_local
 | 
						|
uses GENREG
 | 
						|
	gen move {const4, %ind}, %a
 | 
						|
	    SUB %a, LB, %a 			yields %a
 | 
						|
 | 
						|
from regconst (%ind > 0) && legal(%ind)
 | 
						|
uses GENREG
 | 
						|
	gen ADD %a, %1				yields %a
 | 
						|
 | 
						|
from regconst minlegal(%ind)
 | 
						|
uses GENREG
 | 
						|
	gen SUB %a, %reg, {fitcon, 0-%ind}	yields %a
 | 
						|
 | 
						|
from regconst minillegal(%ind)
 | 
						|
uses GENREG
 | 
						|
	gen move {const4, 0-%ind}, %a
 | 
						|
	    SUB %a, %a, %reg			yields %a
 | 
						|
 | 
						|
from regconst
 | 
						|
uses GENREG
 | 
						|
	gen move {const4, %ind}, %a
 | 
						|
	    ADD %a, %a, %reg			yields %a
 | 
						|
 | 
						|
from regplusreg
 | 
						|
uses GENREG
 | 
						|
	gen ADD %a, %reg1, %reg2
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regminreg
 | 
						|
uses GENREG
 | 
						|
	gen SUB %a, %reg1, %reg2
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regplusiSreg
 | 
						|
uses GENREG
 | 
						|
	gen ADD %a, %reg1, {imS, %reg2, %S, %shift}
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regminiSreg
 | 
						|
uses GENREG
 | 
						|
	gen SUB %a, %reg1, {imS, %reg2, %S, %shift}
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regplusrSreg
 | 
						|
uses GENREG
 | 
						|
	gen ADD %a, %reg1, {regS, %reg2, %S, %sreg}
 | 
						|
						yields %a
 | 
						|
 | 
						|
from regminrSreg
 | 
						|
uses GENREG
 | 
						|
	gen SUB %a, %reg1, {regS, %reg2, %S, %sreg}
 | 
						|
						yields %a
 | 
						|
 | 
						|
 | 
						|
PATTERNS
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP 0 :	Register variables					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
/* Simple load and store */
 | 
						|
pat lol			inreg($1)==reg_any
 | 
						|
    yields {LOCAL, $1}
 | 
						|
 | 
						|
pat lil			inreg($1)==reg_any
 | 
						|
    yields {regind, regvar($1)}
 | 
						|
 | 
						|
pat stl			inreg($1)==reg_any
 | 
						|
with exact const4
 | 
						|
kills local %ind==$1
 | 
						|
gen move %1, {LOCAL, $1}
 | 
						|
with exact fitcon
 | 
						|
kills local %ind==$1
 | 
						|
gen MOV {LOCAL, $1}, %1
 | 
						|
with rhs-constant
 | 
						|
kills local %ind==$1
 | 
						|
	gen MOV {LOCAL, $1}, %1
 | 
						|
with mem4+absolute
 | 
						|
kills local %ind==$1
 | 
						|
	gen LDR {LOCAL, $1}, %1
 | 
						|
with regminreg
 | 
						|
kills local %ind == $1
 | 
						|
	gen SUB {LOCAL, $1}, %1
 | 
						|
with regplusreg+posshifts
 | 
						|
kills local %ind == $1
 | 
						|
	gen ADD {LOCAL, $1}, %1
 | 
						|
with negshifts
 | 
						|
kills local %ind == $1
 | 
						|
	gen SUB {LOCAL, $1}, %1
 | 
						|
 | 
						|
pat stl	$1==1 && inreg($1)==reg_any
 | 
						|
with rhs
 | 
						|
    kills local %ind==$1
 | 
						|
    gen LDR_B {LOCAL, $1}, %1
 | 
						|
 | 
						|
pat sil			inreg($1)==reg_any
 | 
						|
with GENREG
 | 
						|
    kills /*all_except_con*/ address
 | 
						|
    gen move %1, {regind, regvar($1)}
 | 
						|
 | 
						|
 | 
						|
/* Increment, decrement, zero						*/
 | 
						|
pat inl			inreg($1)==reg_any
 | 
						|
    kills local %ind==$1
 | 
						|
    gen ADD {LOCAL, $1}, {LOCAL, $1}, {fitcon, 1}
 | 
						|
 | 
						|
pat del			inreg($1)==reg_any
 | 
						|
    kills local %ind==$1
 | 
						|
    gen SUB {LOCAL, $1}, {LOCAL, $1}, {fitcon, 1}
 | 
						|
 | 
						|
pat zrl			inreg($1)==reg_any
 | 
						|
    kills local %ind==$1
 | 
						|
    gen MOV {LOCAL, $1}, {fitcon, 0}
 | 
						|
 | 
						|
pat lol inc stl		inreg($1)==reg_any && inreg($3)==reg_any
 | 
						|
    kills local %ind==$3
 | 
						|
    gen ADD {LOCAL, $3}, {LOCAL, $1}, {fitcon, 1}
 | 
						|
 | 
						|
pat lol dec stl		inreg($1)==reg_any && inreg($3)==reg_any
 | 
						|
    kills local %ind==$3
 | 
						|
    gen SUB {LOCAL, $3}, {LOCAL, $1}, {fitcon, 1}
 | 
						|
 | 
						|
pat lol ngi stl 	inreg($1)==reg_any && inreg($3)==reg_any
 | 
						|
    kills local %ind==$3
 | 
						|
    gen RSB {LOCAL, $3}, {LOCAL, $1}, {fitcon, 0}
 | 
						|
 | 
						|
/* Procedure :  load register, op xx, store register */
 | 
						|
proc lol_op_stl example lol adi stl
 | 
						|
with rhs
 | 
						|
    kills local %ind==$3
 | 
						|
    gen rxx* {LOCAL, $3}, {LOCAL, $1}, %1
 | 
						|
 | 
						|
pat lol adi stl		inreg($1)==reg_any && inreg($3)==reg_any && $2==4
 | 
						|
    call lol_op_stl("ADD")
 | 
						|
 | 
						|
pat lol adu stl		leaving lol $1 adi $2 stl $3
 | 
						|
 | 
						|
pat lol sbi stl		inreg($1)==reg_any && inreg($3)==reg_any && $2==4
 | 
						|
    call lol_op_stl("RSB")
 | 
						|
 | 
						|
pat lol sbu stl		leaving lol $1 sbi $2 stl $3
 | 
						|
 | 
						|
pat lol and stl		inreg($1)==reg_any && inreg($3)==reg_any && $2==4
 | 
						|
    call lol_op_stl("AND")
 | 
						|
 | 
						|
pat lol ior stl		inreg($1)==reg_any && inreg($3)==reg_any && $2==4
 | 
						|
    call lol_op_stl("ORR")
 | 
						|
 | 
						|
pat lol xor stl		inreg($1)==reg_any && inreg($3)==reg_any && $2==4
 | 
						|
    call lol_op_stl("EOR")
 | 
						|
 | 
						|
/* Procedure : load register, load constant, op xx, store register */
 | 
						|
proc lol_loc_op_stl example lol loc adi stl
 | 
						|
    kills local %ind==$4
 | 
						|
    gen rxx* {LOCAL, $4}, {LOCAL, $1}, {const4, $2}
 | 
						|
 | 
						|
pat lol loc adi stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    call lol_loc_op_stl("ADD")
 | 
						|
 | 
						|
pat lol loc adu stl	leaving lol $1 loc $2 adi $3 stl $4
 | 
						|
 | 
						|
pat lol loc sbi stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    call lol_loc_op_stl("SUB")
 | 
						|
 | 
						|
pat lol loc sbu stl	leaving lol $1 loc $2 sbi $3 stl $4
 | 
						|
 | 
						|
pat lol loc and stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    call lol_loc_op_stl("AND")
 | 
						|
 | 
						|
pat lol loc ior stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    call lol_loc_op_stl("ORR")
 | 
						|
 | 
						|
pat lol loc xor stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    call lol_loc_op_stl("EOR")
 | 
						|
 | 
						|
/* Procedure : load register, load register, op xx, store register	*/
 | 
						|
proc lol_lol_op_stl example lol lol adi stl
 | 
						|
    kills local %ind==$4
 | 
						|
    gen	rrx* {LOCAL, $4}, {LOCAL, $1}, {LOCAL, $2}
 | 
						|
 | 
						|
pat lol lol adi stl	inreg($1)==reg_any && inreg($2)==reg_any && 
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    call lol_lol_op_stl("ADD")
 | 
						|
 | 
						|
pat lol lol adu stl	leaving lol $1 lol $2 adi $3 stl $4
 | 
						|
 | 
						|
pat lol lol sbi stl	inreg($1)==reg_any && inreg($2)==reg_any && 
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    call lol_lol_op_stl("SUB")
 | 
						|
 | 
						|
pat lol lol sbu stl	leaving lol $1 lol $2 sbi $3 stl $4
 | 
						|
 | 
						|
pat lol lol and stl	inreg($1)==reg_any && inreg($2)==reg_any && 
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    call lol_lol_op_stl("AND")
 | 
						|
 | 
						|
pat lol lol ior stl	inreg($1)==reg_any && inreg($2)==reg_any && 
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    call lol_lol_op_stl("ORR")
 | 
						|
 | 
						|
pat lol lol xor stl	inreg($1)==reg_any && inreg($2)==reg_any && 
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    call lol_lol_op_stl("EOR")
 | 
						|
 | 
						|
/* Shifts								*/
 | 
						|
pat lol loc sli stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen MOV {LOCAL, $4}, {reglslcon, regvar($1), $2}
 | 
						|
 | 
						|
pat lol loc slu stl	leaving lol $1 loc $2 sli $3 stl $4
 | 
						|
 | 
						|
pat lol loc sri stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen	MOV {LOCAL, $4}, {regasrcon, regvar($1), $2}
 | 
						|
 | 
						|
pat lol loc sru stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen	MOV {LOCAL, $4}, {reglsrcon, regvar($1), $2}
 | 
						|
 | 
						|
pat lol lol sli stl	inreg($1)==reg_any && inreg($2)==reg_any &&
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen MOV {LOCAL, $4}, {reglslreg, regvar($1), regvar($2)}
 | 
						|
 | 
						|
pat lol lol slu stl	leaving lol $1 lol $2 sli $3 stl $4
 | 
						|
 | 
						|
pat lol lol sri stl	inreg($1)==reg_any && inreg($2)==reg_any &&
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen MOV {LOCAL, $4}, {regasrreg, regvar($1), regvar($2)}
 | 
						|
 | 
						|
pat lol lol sru stl	inreg($1)==reg_any && inreg($2)==reg_any &&
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen MOV {LOCAL, $4}, {reglsrreg, regvar($1), regvar($2)}
 | 
						|
 | 
						|
/* Rotates								*/
 | 
						|
pat lol loc ror stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen	MOV {LOCAL, $4}, {regrorcon, regvar($1), $2}
 | 
						|
 | 
						|
pat lol lol ror stl	inreg($1)==reg_any && inreg($2)==reg_any && 
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen	MOV {LOCAL, $4}, {regrorreg, regvar($1), regvar($2)}
 | 
						|
 | 
						|
pat lol loc rol stl	inreg($1)==reg_any && inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen	MOV {LOCAL, $4}, {regrorcon, regvar($1), 32-$2}
 | 
						|
 | 
						|
pat lol lol ror stl	inreg($1)==reg_any && inreg($2)==reg_any &&
 | 
						|
			inreg($4)==reg_any && $3==4
 | 
						|
    kills local %ind==$4
 | 
						|
    gen	RSB R11, {LOCAL, $2}, {fitcon, 32}
 | 
						|
	MOV {LOCAL, $4}, {regrorregr, regvar($1), R11}
 | 
						|
 | 
						|
/* code for *p++ and *p-- (integers) */
 | 
						|
pat lol lol adp stl loi $1==$2 && $2==$4 && $5==4 && inreg($1)==reg_any
 | 
						|
kills GENREG
 | 
						|
uses GENREG
 | 
						|
gen LDR %a, {regrelpi, regvar($1), $5}    		yields %a
 | 
						|
 | 
						|
pat lol lol adp stl sti $1==$2 && $2==$4 && $5==4 && inreg($1)==reg_any
 | 
						|
with GENREG
 | 
						|
kills GENREG
 | 
						|
gen STR %1, {regrelpi, regvar($1), $5}
 | 
						|
 | 
						|
/* code for *p++ and *p-- (bytes)*/
 | 
						|
pat lol lol adp stl loi $1==$2 && $2==$4 && $5==1 && inreg($1)==reg_any
 | 
						|
kills GENREG
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {regrelpi, regvar($1), $5}    		yields %a
 | 
						|
 | 
						|
pat lol lol adp stl sti $1==$2 && $2==$4 && $5==1 && inreg($1)==reg_any
 | 
						|
with GENREG
 | 
						|
kills GENREG
 | 
						|
gen STR_B %1, {regrelpi, regvar($1), $5}
 | 
						|
 | 
						|
/* code for *pp->p++ and *pp->p-- (integers) */
 | 
						|
pat lil lil adp sil loi $1==$2 && $2==$4 && $5==4 && inreg($1)==reg_any
 | 
						|
kills GENREG
 | 
						|
uses GENREG,GENREG
 | 
						|
gen LDR %a, {regind, regvar($1)}
 | 
						|
    ADD %b, %a, {fitcon, $3}
 | 
						|
    STR %b, {regind, regvar($1)}
 | 
						|
    LDR %b, {regind, %a}				yields %b
 | 
						|
 | 
						|
pat lil lil adp sil sti $1==$2 && $2==$4 && $5==4 && inreg($1)==reg_any
 | 
						|
with GENREG
 | 
						|
kills GENREG
 | 
						|
uses GENREG,GENREG
 | 
						|
gen LDR %a, {regind, regvar($1)}
 | 
						|
    ADD %b, %a, {fitcon, $3}
 | 
						|
    STR %b, {regind, regvar($1)}
 | 
						|
    STR %1, {regind, %a}
 | 
						|
 | 
						|
/* code for *pp->p++ and *pp->p-- (bytes) */
 | 
						|
pat lil lil adp sil loi $1==$2 && $2==$4 && $5==1 && inreg($1)==reg_any
 | 
						|
kills GENREG
 | 
						|
uses GENREG,GENREG
 | 
						|
gen LDR %a, {regind, regvar($1)}
 | 
						|
    ADD %b, %a, {fitcon, $3}
 | 
						|
    STR %b, {regind, regvar($1)}
 | 
						|
    LDR_B %b, {regind, %a}				yields %b
 | 
						|
 | 
						|
pat lil lil adp sil sti $1==$2 && $2==$4 && $5==1 && inreg($1)==reg_any
 | 
						|
with GENREG
 | 
						|
kills GENREG
 | 
						|
uses GENREG,GENREG
 | 
						|
gen LDR %a, {regind, regvar($1)}
 | 
						|
    ADD %b, %a, {fitcon, $3}
 | 
						|
    STR %b, {regind, regvar($1)}
 | 
						|
    STR_B %1, {regind, %a}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP I :	Load Instructions					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat loc $1 < 0						yields {const4, $1}
 | 
						|
 | 
						|
pat loc legal($1) 					yields {fitcon, $1}
 | 
						|
 | 
						|
pat loc							yields {const4, $1}
 | 
						|
 | 
						|
pat ldc	leaving loc 18 trp
 | 
						|
 | 
						|
pat lol							yields {lb_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 {lb_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 $1 > 0			yields {addr_local, $1}
 | 
						|
pat lal $1 < 0			yields {naddr_local, 0-$1}
 | 
						|
pat lal $1 == 0			yields LB
 | 
						|
 | 
						|
pat lae				yields {addr_external, $1}
 | 
						|
pat lae loi lae sti $2==$4      leaving lae $1 lae $3 blm $2
 | 
						|
 | 
						|
pat lxl $1==0			yields LB
 | 
						|
 | 
						|
pat lxl $1==1			yields {lb_local,8}
 | 
						|
 | 
						|
pat lxl $1>1
 | 
						|
uses GENREG={const4, $1}, GENREG=LB
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    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 GENREG={lb_local,8}		yields {regconst,%a,8}
 | 
						|
 | 
						|
 | 
						|
pat lxa $1>1
 | 
						|
uses GENREG={const4, $1}, GENREG=LB
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    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 GENREG
 | 
						|
gen LDR_B %a, {regind, %1}					yields %a
 | 
						|
with exact naddr_local
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {lb_local, 0-%1.ind}				yields %a
 | 
						|
with exact addr_local
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {lb_local, %1.ind}				yields %a
 | 
						|
with exact addr_external
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {absolute, %1.add}				yields %a
 | 
						|
with exact regconst
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {regrel, %1.reg, %1.ind}				yields %a
 | 
						|
with exact regplusreg
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {regregrel, %1.reg1, %1.reg2}			yields %a
 | 
						|
with exact regminreg
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {regminregrel, %1.reg1, %1.reg2}			yields %a
 | 
						|
with exact regplusiSreg
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {regiSregrel, %1.reg1, %1.S, %1.shift, %1.reg2}	yields %a
 | 
						|
with exact regminiSreg
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {regminiSregrel,%1.reg1,%1.S,%1.shift,%1.reg2}	yields %a
 | 
						|
 | 
						|
with exact regplusrSreg
 | 
						|
uses GENREG,GENREG
 | 
						|
gen move {regS,%1.reg2,%1.S,%1.sreg}, %b
 | 
						|
    LDR_B %a, {regregrel, %1.reg1, %b}				yields %a
 | 
						|
 | 
						|
with exact regminrSreg
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {regminrSregrel,%1.reg1,%1.S,%1.sreg,%1.reg2}	yields %a
 | 
						|
 | 
						|
pat loi $1==2
 | 
						|
with GENREG
 | 
						|
uses GENREG, GENREG
 | 
						|
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 {lb_local, %1.ind}
 | 
						|
with exact naddr_local		yields {lb_local, 0-%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
 | 
						|
uses GENREG,GENREG
 | 
						|
gen move {regS,%1.reg2,%1.S,%1.sreg}, %b
 | 
						|
    LDR %a, {regregrel, %1.reg1, %b}		yields %a
 | 
						|
 | 
						|
with exact regminrSreg	 			yields {regminrSregrel,%1.reg1,
 | 
						|
							  %1.S,%1.sreg,%1.reg2}
 | 
						|
 | 
						|
pat loi $1==8
 | 
						|
with GENREG
 | 
						|
uses GENREG, GENREG
 | 
						|
gen LDMIA %1, {reglist2, %a, %b}		yields %b %a
 | 
						|
 | 
						|
pat loi defined($1)
 | 
						|
with GENREG STACK
 | 
						|
uses GENREG = {const4, $1}
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    SUB_S %a, %a, {fitcon, 4}
 | 
						|
    move {regregrel, %1, %a}, R11
 | 
						|
    STMFD {autoid, SP}, {reglist1, R11}
 | 
						|
    BGT {label, "1b"}
 | 
						|
 | 
						|
pat loi loc and $1==2 && $2>0 && $2<256  leaving loi 1 loc $2 and $3
 | 
						|
 | 
						|
pat loi loc loc cii $1==2 && $2==2 && $3==4
 | 
						|
with GENREG
 | 
						|
uses GENREG,GENREG
 | 
						|
gen LDR_B %a, {regind, %1}
 | 
						|
    LDR_B %b, {regrel, %1, 1}
 | 
						|
    MOV   %b, {imS, %b, "LSL", 24}
 | 
						|
    ORR   %a, %a, {imS, %b, "ASR", 16}			yields %a
 | 
						|
 | 
						|
pat los
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen BAL_L {label, ".los"}
 | 
						|
 | 
						|
pat ldl				yields {lb_local, $1+4}
 | 
						|
					{lb_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 {lb_local, %1.ind+$1+4}
 | 
						|
				       {lb_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+lb_local), lb_local %ind-4 < $1 && %ind+4 > $1
 | 
						|
	gen move %1, {lb_local, $1}
 | 
						|
 | 
						|
pat stl lol $1==$2		leaving dup 4 stl $1
 | 
						|
 | 
						|
pat ste
 | 
						|
with GENREG
 | 
						|
kills address
 | 
						|
	gen move %1, {absolute, $1}
 | 
						|
 | 
						|
pat ste loe $1==$2
 | 
						|
	leaving dup 4 ste $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, {lb_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, {lb_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
 | 
						|
uses GENREG
 | 
						|
gen move {regS, %1.reg2, %1.S, %1.sreg}, %a
 | 
						|
    STR_B %2, {regregrel, %1.reg1, %a}
 | 
						|
 | 
						|
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 GENREG
 | 
						|
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}
 | 
						|
*/
 | 
						|
gen STR_B %2, {regind, %1}
 | 
						|
    MOV   %2, {imS, %2, "LSR", 8}
 | 
						|
    STR_B %2, {regrel, %1, 1}
 | 
						|
/*with GENREG fitcon %2.num==0
 | 
						|
kills address
 | 
						|
gen STR_B %2, {regind, %1}
 | 
						|
    STR_B %2, {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, {lb_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
 | 
						|
uses GENREG
 | 
						|
gen move {regS, %1.reg2, %1.S, %1.sreg}, %a
 | 
						|
    STR %2, {regregrel, %1.reg1, %a}
 | 
						|
with  regminrSreg GENREG
 | 
						|
kills address
 | 
						|
	gen move %2, {regminrSregrel, %1.reg1, %1.S, %1.sreg, %1.reg2}
 | 
						|
 | 
						|
pat sti defined($1) && legal($1)
 | 
						|
with GENREG STACK
 | 
						|
kills address
 | 
						|
uses GENREG={fitcon, $1}
 | 
						|
gen	LABEL {label, "1:"}
 | 
						|
	SUB_S %a, %a, {fitcon, 4}
 | 
						|
	move {st_regregrel, SP, %a}, R11
 | 
						|
	move R11, {regregrel, %1, %a}
 | 
						|
	BGT {label,"1B"}
 | 
						|
	ADD SP, SP, {fitcon, $1}
 | 
						|
 | 
						|
pat sti defined($1)
 | 
						|
with GENREG STACK
 | 
						|
kills address
 | 
						|
uses GENREG={const4, $1}, GENREG
 | 
						|
gen	move %a, %b
 | 
						|
	LABEL {label, "1:"}
 | 
						|
	SUB_S %a, %a, {fitcon, 4}
 | 
						|
	move {st_regregrel, SP, %a}, R11
 | 
						|
	move R11, {regregrel, %1, %a}
 | 
						|
	BGT {label,"1B"}
 | 
						|
	ADD SP, SP, %b
 | 
						|
 | 
						|
pat sts
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen BAL_L {label, ".sts"}
 | 
						|
 | 
						|
pat sdl
 | 
						|
with GENREG GENREG
 | 
						|
kills address-absolute
 | 
						|
gen 	move %1, {lb_local,$1}
 | 
						|
	move %2, {lb_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 constant			yields {regconst, %1, %2.num}
 | 
						|
with constant 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 constant		yields {addr_local, %1.ind+%2.num}
 | 
						|
with exact constant addr_local 		yields {addr_local, %2.ind+%1.num}
 | 
						|
with exact addr_external constant	yields {addr_external, %1.add+%2.num}
 | 
						|
with exact constant 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 fitcon
 | 
						|
uses GENREG
 | 
						|
gen RSB  %a, %1, %2			yields %a
 | 
						|
with fitcon GENREG
 | 
						|
gen SUB %2, %2, %1			yields %2
 | 
						|
with GENREG const4
 | 
						|
uses GENREG
 | 
						|
gen move %2, %a
 | 
						|
    RSB  %1, %1, %a			yields %1
 | 
						|
with const4 GENREG
 | 
						|
uses GENREG
 | 
						|
gen move %1, %a
 | 
						|
    SUB  %a, %2, %a			yields %a
 | 
						|
with GENREG REGcon
 | 
						|
uses GENREG
 | 
						|
gen	RSB %a, %1, %2			yields %a
 | 
						|
/*with constant GENREG			yields {regconst, %2, 0-%1.num}*/
 | 
						|
with exact constant 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
 | 
						|
uses GENREG
 | 
						|
gen MOV %a, {imS,%1,"LSL",2}
 | 
						|
    ADD %a, %a, {imS,%1,"LSL",1}        yields %a
 | 
						|
 | 
						|
pat loc mli $1==7 && $2==4
 | 
						|
with GENREG
 | 
						|
uses GENREG
 | 
						|
gen RSB %a, %1, {imS, %1, "LSL", 3}	yields %a
 | 
						|
 | 
						|
pat loc mli $1==9 && $2==4
 | 
						|
with GENREG				yields {regplusiSreg,%1,"LSL",3,%1}
 | 
						|
 | 
						|
pat loc mli $1==10 && $2==4
 | 
						|
with GENREG
 | 
						|
uses GENREG
 | 
						|
gen MOV %a,{imS, %1, "LSL", 1}
 | 
						|
    ADD %a, %a, {imS, %1, "LSL", 3}	yields %a
 | 
						|
 | 
						|
pat loc mli $1==12 && $2==4
 | 
						|
with GENREG
 | 
						|
uses GENREG
 | 
						|
gen move {imS, %1, "LSL", 3}, %a	yields {regplusiSreg,%a,"LSR",1,%a}
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
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
 | 
						|
uses GENREG
 | 
						|
gen 	RSB %a, %1, {fitcon, 0}		yields %a
 | 
						|
 | 
						|
pat sli $1==4
 | 
						|
with fitcon 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 fitcon 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+fitcon GENREG		yields {imS, %2, "LSL", %1.num}
 | 
						|
 | 
						|
pat sru $1==4
 | 
						|
with GENREG GENREG			yields {regS, %2, "LSR", %1}
 | 
						|
with const4+fitcon GENREG		yields {imS, %2, "LSR", %1.num}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP V :	Floating Point Arithmetic 				*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat adf $1==4           leaving cal ".adf4" asp 4
 | 
						|
pat adf $1==8           leaving cal ".adf8" asp 8
 | 
						|
pat sbf $1==4           leaving cal ".sbf4" asp 4
 | 
						|
pat sbf $1==8           leaving cal ".sbf8" asp 8
 | 
						|
pat mlf $1==4           leaving cal ".mlf4" asp 4
 | 
						|
pat mlf $1==8           leaving cal ".mlf8" asp 8
 | 
						|
pat dvf $1==4           leaving cal ".dvf4" asp 4
 | 
						|
pat dvf $1==8           leaving cal ".dvf8" asp 8
 | 
						|
pat ngf $1==4           leaving cal ".ngf4"
 | 
						|
pat ngf $1==8           leaving cal ".ngf8"
 | 
						|
pat fif $1==4           leaving lor 1 cal ".fif4" asp 4
 | 
						|
pat fif $1==8           leaving lor 1 cal ".fif8" asp 4
 | 
						|
pat fef $1==4           leaving lor 1 adp 0-4 cal ".fef4"
 | 
						|
pat fef $1==8           leaving lor 1 adp 0-4 cal ".fef8"
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * 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 GENREG={lb_local,$1}
 | 
						|
gen ADD %a,%a,{fitcon,1}
 | 
						|
    move %a,{lb_local,$1}
 | 
						|
 | 
						|
pat ine
 | 
						|
kills address
 | 
						|
uses GENREG={absolute,$1}
 | 
						|
gen ADD %a,%a,{fitcon,1}
 | 
						|
    move %a,{absolute,$1}
 | 
						|
 | 
						|
pat dec
 | 
						|
with GENREG				yields {regconst, %1, 0-1}
 | 
						|
/*gen SUB %a, %1, {fitcon, 1}*/
 | 
						|
with exact regconst			yields {regconst, %1.reg, %1.ind-1}
 | 
						|
 | 
						|
pat del
 | 
						|
kills address-absolute
 | 
						|
uses GENREG={lb_local,$1}
 | 
						|
gen SUB %a,%a,{fitcon,1}
 | 
						|
    move %a,{lb_local,$1}
 | 
						|
 | 
						|
pat dee
 | 
						|
kills address
 | 
						|
uses GENREG={absolute,$1}
 | 
						|
gen SUB %a,%a,{fitcon,1}
 | 
						|
    move %a,{absolute,$1}
 | 
						|
 | 
						|
pat zrl
 | 
						|
kills address-absolute
 | 
						|
uses GENREG={fitcon,0}
 | 
						|
gen move %a,{lb_local,$1}
 | 
						|
 | 
						|
pat zre
 | 
						|
kills address
 | 
						|
uses GENREG={fitcon,0}
 | 
						|
gen move %a,{absolute,$1}
 | 
						|
 | 
						|
pat zrf	leaving zer $1
 | 
						|
 | 
						|
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 GENREG={fitcon,0},GENREG={const4,$1}
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    STMFD {autoid, SP}, {reglist1, %a}
 | 
						|
    SUB_S %b,%b,{fitcon,4}
 | 
						|
    BNE {label,"1B"}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP VIII :	Convert 						*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
/* sign extension short -> integer */
 | 
						|
pat loc loc cii $1==2 && $2==4
 | 
						|
with GENREG
 | 
						|
uses GENREG
 | 
						|
gen MOV %a, {imS, %1, "LSL", 16}
 | 
						|
    MOV %a, {imS, %a, "ASR", 16}		yields %a
 | 
						|
 | 
						|
/* sign extension byte -> integer */
 | 
						|
pat loc loc cii $1==1 && $2==4
 | 
						|
with GENREG
 | 
						|
uses GENREG
 | 
						|
gen MOV %a, {imS, %1, "LSL", 24}
 | 
						|
    MOV %a, {imS, %a, "ASR", 24}		yields %a
 | 
						|
 | 
						|
pat loc loc cii ($1 > 2)
 | 
						|
 | 
						|
pat cui
 | 
						|
with address +REGcon address + REGcon
 | 
						|
 | 
						|
pat loc loc cif	$1==4 && $2==4 leaving loc 4 cal ".cif4" asp 4
 | 
						|
pat loc loc cif	$1==4 && $2==8 leaving loc 4 cal ".cif8"
 | 
						|
 | 
						|
pat loc loc cuf	$1==4 && $2==4 leaving loc 4 cal ".cuf4" asp 4
 | 
						|
pat loc loc cuf	$1==4 && $2==8 leaving loc 4 cal ".cuf8"
 | 
						|
 | 
						|
pat loc loc cfi	leaving loc $1 loc $2 cal ".cfi" asp 8+($1-4)
 | 
						|
 | 
						|
pat loc loc cfu	leaving loc $1 loc $2 cal ".cfu" asp 8+($1-4)
 | 
						|
 | 
						|
pat loc loc cff	$1==8 && $2==4 leaving cal ".cff4" asp 4
 | 
						|
 | 
						|
/* this one expects a 4 byte hole on the stack */
 | 
						|
pat loc loc cff	$1==4 && $2==8	leaving dup 4 cal ".cff8"
 | 
						|
 | 
						|
pat ciu
 | 
						|
with address +REGcon address + REGcon
 | 
						|
 | 
						|
pat cuu
 | 
						|
with address +REGcon address + REGcon
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP IX :	Logical 						*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat and $1==4
 | 
						|
with REGcon GENREG
 | 
						|
uses GENREG
 | 
						|
gen AND %a, %2, %1			yields %a
 | 
						|
with GENREG REGcon
 | 
						|
uses GENREG
 | 
						|
gen AND %a, %1, %2			yields %a
 | 
						|
 | 
						|
pat ior $1==4
 | 
						|
with REGcon GENREG
 | 
						|
uses GENREG
 | 
						|
gen ORR %a, %2, %1			yields %a
 | 
						|
with GENREG REGcon
 | 
						|
uses GENREG
 | 
						|
gen ORR %a, %1, %2			yields %a
 | 
						|
 | 
						|
pat xor $1==4
 | 
						|
with REGcon GENREG
 | 
						|
uses GENREG
 | 
						|
gen EOR %a, %2, %1			yields %a
 | 
						|
with GENREG REGcon
 | 
						|
uses GENREG
 | 
						|
gen EOR %a, %1, %2			yields %a
 | 
						|
 | 
						|
pat com $1==4
 | 
						|
with REGcon
 | 
						|
uses GENREG
 | 
						|
gen MVN %a,%1				yields %a
 | 
						|
 | 
						|
pat ror $1==4
 | 
						|
with constant GENREG			yields {imS, %2, "ROR", %1.num}
 | 
						|
with GENREG GENREG			yields {regS, %2, "ROR", %1}
 | 
						|
 | 
						|
pat rol $1==4
 | 
						|
with constant GENREG			yields {imS, %2, "ROR", 32-%1.num}
 | 
						|
with GENREG GENREG
 | 
						|
uses GENREG
 | 
						|
gen RSB %a, %1, {fitcon,32}		yields {regS, %2, "ROR", %a}
 | 
						|
 | 
						|
pat and $1>4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG,GENREG,GENREG,GENREG
 | 
						|
gen move {const4,$1}, %b
 | 
						|
    move SP, %a
 | 
						|
    ADD SP, SP, %b
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S %b, %b, {fitcon, 4}
 | 
						|
    move {st_regregrel, SP,%b}, %c
 | 
						|
    move {regregrel, %a, %b}, %d
 | 
						|
    AND %c, %c, %d
 | 
						|
    move %c, {st_regregrel, SP, %b}
 | 
						|
    BNE {label, "1B"}
 | 
						|
 | 
						|
pat ior $1>4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG,GENREG,GENREG,GENREG
 | 
						|
gen move {const4,$1}, %b
 | 
						|
    move SP, %a
 | 
						|
    ADD SP, SP, %b
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S %b, %b, {fitcon, 4}
 | 
						|
    move {st_regregrel, SP,%b}, %c
 | 
						|
    move {regregrel, %a, %b}, %d
 | 
						|
    ORR %c, %c, %d
 | 
						|
    move %c, {st_regregrel, SP, %b}
 | 
						|
    BNE {label, "1B"}
 | 
						|
 | 
						|
pat ior !defined($1)
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG,GENREG,GENREG,GENREG
 | 
						|
gen LDMFD {autoid, SP}, {reglist1, %b}
 | 
						|
    move SP, %a
 | 
						|
    ADD SP, SP, %b
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S %b, %b, {fitcon, 4}
 | 
						|
    move {st_regregrel, SP, %b}, %c
 | 
						|
    move {regregrel, %a, %b}, %d
 | 
						|
    ORR %c, %c, %d
 | 
						|
    move %c, {st_regregrel, SP, %b}
 | 
						|
    BNE {label, "1B"}
 | 
						|
 | 
						|
 | 
						|
pat xor $1>4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG,GENREG,GENREG,GENREG
 | 
						|
gen move {const4,$1}, %b
 | 
						|
    move SP, %a
 | 
						|
    ADD SP, SP, %b
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S %b, %b, {fitcon, 4}
 | 
						|
    move {st_regregrel, SP,%b}, %c
 | 
						|
    move {regregrel, %a, %b}, %d
 | 
						|
    EOR %c, %c, %d
 | 
						|
    move %c, {st_regregrel, SP, %b}
 | 
						|
    BNE {label, "1B"}
 | 
						|
 | 
						|
pat com $1>4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG,GENREG,GENREG
 | 
						|
gen move {const4,$1}, %b
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S %b, %b, {fitcon, 4}
 | 
						|
    move {st_regregrel, SP, %b}, %c
 | 
						|
    MVN %c, %c
 | 
						|
    move %c, {st_regregrel, SP, %b}
 | 
						|
    BNE {label, "1B"}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * 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 GENREG={fitcon,1},GENREG
 | 
						|
gen AND %b, %1, {imS,%a,"LSL",$1}	yields %b
 | 
						|
 | 
						|
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 GENREG STACK
 | 
						|
uses GENREG={fitcon,1}, GENREG, GENREG
 | 
						|
gen AND %b, %1, {fitcon, 31}
 | 
						|
    move {regS, %a, "LSL", %b}, %b
 | 
						|
    move {imS, %1, "LSR", 5}, %1
 | 
						|
    move {st_regiSregrel, SP, "LSL", 2, %1}, %c
 | 
						|
    AND_S %b, %b, %c
 | 
						|
    MOV_NE %b, {fitcon, 1}
 | 
						|
    ADD SP, SP, {const4, $1}            yields %b
 | 
						|
 | 
						|
pat inn !defined($1)
 | 
						|
with GENREG GENREG STACK
 | 
						|
uses GENREG={fitcon,1}, GENREG, GENREG
 | 
						|
gen AND %b, %2, {fitcon, 31}
 | 
						|
    move {regS, %a, "LSL", %b}, %b
 | 
						|
    move {imS, %2, "LSR", 5}, %2
 | 
						|
    move {st_regiSregrel, SP, "LSL", 2, %2}, %c
 | 
						|
    AND_S %b, %b, %c
 | 
						|
    MOV_NE %b, {fitcon, 1}
 | 
						|
    ADD SP, SP, %1                      yields %b
 | 
						|
 | 
						|
pat loc set !defined($2)		leaving set $1
 | 
						|
 | 
						|
pat set $1==4
 | 
						|
with const4
 | 
						|
uses GENREG={fitcon,1} 			yields {imS,%a,"LSL",%1.num}
 | 
						|
with GENREG
 | 
						|
uses GENREG={fitcon,1}			yields {regS,%a,"LSL",%1}
 | 
						|
 | 
						|
pat set $1>4
 | 
						|
with GENREG STACK
 | 
						|
uses GENREG={fitcon,1}, GENREG={fitcon,0}, GENREG={const4,$1}
 | 
						|
gen LABEL {label, "2:"}
 | 
						|
    STMFD {autoid, SP}, {reglist1, %b}
 | 
						|
    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, {st_regiSregrel, SP, "LSL", 2, %1}
 | 
						|
    LABEL {label, "1:"}
 | 
						|
 | 
						|
pat set !defined($1)
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG={fitcon,1}, GENREG={fitcon,0}, GENREG, GENREG
 | 
						|
gen LDMFD {autoid, SP}, {reglist1, %c}
 | 
						|
    LDMFD {autoid, SP}, {reglist1, %d}
 | 
						|
    LABEL {label, "2:"}
 | 
						|
    STMFD {autoid, SP}, {reglist1, %b}
 | 
						|
    SUB_S %c, %c, {fitcon,4}
 | 
						|
    BGT {label, "2B"}
 | 
						|
    CMP %d, {fitcon, 0}
 | 
						|
    BMI {label, "1F"}
 | 
						|
    AND %b, %d, {fitcon, 31}
 | 
						|
    move {regS, %a, "LSL", %b}, %b
 | 
						|
    move {imS, %d, "LSR", 5}, %d
 | 
						|
    move %b, {st_regiSregrel, SP, "LSL", 2, %d}
 | 
						|
    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 && legal(rom($1,1))
 | 
						|
with GENREG
 | 
						|
uses GENREG
 | 
						|
gen SUB %a,%1,{fitcon,rom($1,1)}		yields %a
 | 
						|
						leaving adi 4
 | 
						|
with exact regconst				yields {regconst, %1.reg,
 | 
						|
							%1.ind-rom($1,1)}
 | 
						|
						leaving adi 4
 | 
						|
 | 
						|
pat lae aar $2==4 && rom($1,3)==1 && rom($1,1)!=0
 | 
						|
with GENREG
 | 
						|
uses GENREG={const4, 0-rom($1,1)}
 | 
						|
gen ADD %a,%1,%a				yields %a
 | 
						|
						leaving adi 4
 | 
						|
with exact regconst				yields {regconst, %1.reg,
 | 
						|
							%1.ind-rom($1,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 && legal(rom($1,1))
 | 
						|
with GENREG
 | 
						|
uses GENREG
 | 
						|
gen SUB %a,%1,{fitcon, rom($1,1)}		yields {imS, %a,"LSL", 2}
 | 
						|
						leaving adi 4
 | 
						|
 | 
						|
pat lae aar $2==4 && rom($1,3)==4 && rom($1,1)!=0
 | 
						|
with GENREG
 | 
						|
uses GENREG={const4, 0-rom($1,1)}
 | 
						|
gen ADD %a,%1,%a				yields {imS, %a,"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 && legal(rom($1,1))
 | 
						|
with GENREG
 | 
						|
uses GENREG
 | 
						|
gen SUB %a,%1,{fitcon,rom($1,1)}		yields %a
 | 
						|
						leaving loc rom($1,3)
 | 
						|
							mli 4 adi 4
 | 
						|
 | 
						|
pat lae aar $2==4 && rom($1,1)!=0
 | 
						|
with GENREG
 | 
						|
uses GENREG={const4, 0-rom($1,1)}
 | 
						|
gen ADD %a,%1,%a				yields %a
 | 
						|
						leaving loc rom($1,3)
 | 
						|
							mli 4 adi 4
 | 
						|
 | 
						|
pat aar $1==4
 | 
						|
with GENREG GENREG
 | 
						|
uses GENREG
 | 
						|
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)
 | 
						|
 | 
						|
/* next two: dynamic arrays in modula2 - not tested */
 | 
						|
 | 
						|
pat lal sar $2==4 leaving lal $1 aar 4 lal $1 adp 8 loi 4 sts
 | 
						|
 | 
						|
pat lal lar $2==4 leaving lal $1 aar 4 lal $1 adp 8 loi 4 los
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP XII :	Compare Instructions					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat cmi
 | 
						|
with GENREG REGcon
 | 
						|
uses reusing %1, GENREG=%1
 | 
						|
gen RSB_S %a, %1, %2				yields %a
 | 
						|
with REGcon GENREG
 | 
						|
uses reusing %2, GENREG=%2
 | 
						|
gen SUB_S %a, %2, %1				yields %a
 | 
						|
 | 
						|
pat cmu $1==4
 | 
						|
with GENREG REGcon
 | 
						|
uses GENREG
 | 
						|
gen CMP %1, %2
 | 
						|
    MOV_HI %a, {fitcon, 0-1}
 | 
						|
    MOV_LS %a, {fitcon, 1}
 | 
						|
    MOV_EQ %a, {fitcon, 0}			yields %a
 | 
						|
with REGcon GENREG
 | 
						|
uses GENREG
 | 
						|
gen CMP %2, %1
 | 
						|
    MOV_HI %a, {fitcon, 1}
 | 
						|
    MOV_LS %a, {fitcon, 0-1}
 | 
						|
    MOV_EQ %a, {fitcon, 0}			yields %a
 | 
						|
 | 
						|
pat cmp						leaving cmu 4
 | 
						|
 | 
						|
pat cmf $1==4	leaving cal ".cmf4" asp 8 lfr 4
 | 
						|
pat cmf $1==8	leaving cal ".cmf8" asp 16 lfr 4
 | 
						|
 | 
						|
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
 | 
						|
kills ALL
 | 
						|
uses GENREG = {const4, $1}, GENREG, GENREG, GENREG, GENREG
 | 
						|
gen move %a, %e
 | 
						|
    ADD %b, %a, SP
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S %a, %a, {fitcon, 4}
 | 
						|
    BLT {label, "2F"}
 | 
						|
    move {st_regregrel, SP, %a}, %c
 | 
						|
    move {regregrel, %b, %a}, %d
 | 
						|
    EOR_S %c, %c, %d
 | 
						|
    BEQ {label, "1B"}
 | 
						|
    LABEL {label, "2:"}
 | 
						|
    ADD SP, %b, %e				yields %c
 | 
						|
 | 
						|
pat cms !defined($1)
 | 
						|
with GENREG STACK
 | 
						|
uses GENREG, GENREG, GENREG, GENREG
 | 
						|
gen move %1, %d
 | 
						|
    ADD %a, %1, SP
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    SUB_S %1, %1, {fitcon, 4}
 | 
						|
    BLT {label, "2F"}
 | 
						|
    move {st_regregrel, SP, %1}, %b
 | 
						|
    move {regregrel, %a, %1}, %c
 | 
						|
    EOR_S %b, %b, %c
 | 
						|
    BEQ {label, "1B"}
 | 
						|
    LABEL {label, "2:"}
 | 
						|
    ADD SP, %a, %d				yields %b
 | 
						|
 | 
						|
pat tlt
 | 
						|
with GENREG
 | 
						|
uses reusing %1, GENREG=%1
 | 
						|
gen test %1
 | 
						|
    MOV_LT %a, {fitcon,1}
 | 
						|
    MOV_GE %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat tle
 | 
						|
with  GENREG
 | 
						|
uses reusing %1, GENREG=%1
 | 
						|
gen test %1
 | 
						|
    MOV_LE %a, {fitcon,1}
 | 
						|
    MOV_GT %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat teq
 | 
						|
with GENREG
 | 
						|
uses reusing %1, GENREG=%1
 | 
						|
gen test %1
 | 
						|
    MOV_EQ %a, {fitcon,1}
 | 
						|
    MOV_NE %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat tne
 | 
						|
with  GENREG
 | 
						|
uses reusing %1, GENREG=%1
 | 
						|
gen test %1
 | 
						|
    MOV_NE %a, {fitcon,1}
 | 
						|
    MOV_EQ %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat tge
 | 
						|
with  GENREG
 | 
						|
uses reusing %1, GENREG=%1
 | 
						|
gen test %1
 | 
						|
    MOV_GE %a, {fitcon,1}
 | 
						|
    MOV_LT %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
pat tgt
 | 
						|
with GENREG
 | 
						|
uses reusing %1, GENREG=%1
 | 
						|
gen test %1
 | 
						|
    MOV_GT %a, {fitcon,1}
 | 
						|
    MOV_LE %a, {fitcon,0}			yields %a
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP XIII :	Branch Instructions					*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat bra
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
	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
 | 
						|
with GENREG STACK
 | 
						|
kills ALL
 | 
						|
gen /* the trick is to set up R14 properly */
 | 
						|
    ADR LR, {label, "1F"}
 | 
						|
    MOV PC, %1
 | 
						|
    LABEL {label, "1:"}
 | 
						|
 | 
						|
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 return
 | 
						|
    MOV SP, LB
 | 
						|
    LDMFD {autoid, SP}, {lb_pc_reglist2, LB, PC}
 | 
						|
 | 
						|
pat ret $1==4
 | 
						|
with address STACK
 | 
						|
kills ALL
 | 
						|
gen move %1, R0
 | 
						|
    return
 | 
						|
    move LB, SP
 | 
						|
    LDMFD {autoid, SP}, {lb_pc_reglist2, LB, PC}
 | 
						|
with REGcon STACK
 | 
						|
kills ALL
 | 
						|
gen move %1, R0
 | 
						|
    return
 | 
						|
    move LB, SP
 | 
						|
    LDMFD {autoid, SP}, {lb_pc_reglist2, LB, PC}
 | 
						|
 | 
						|
pat ret $1==8
 | 
						|
with REGcon REGcon STACK
 | 
						|
kills ALL
 | 
						|
gen move %1, R0
 | 
						|
    move %2, R1
 | 
						|
    return
 | 
						|
    move LB, SP
 | 
						|
    LDMFD {autoid, SP}, {lb_pc_reglist2, LB, PC}
 | 
						|
 | 
						|
pat ret $1==12
 | 
						|
with REGcon REGcon REGcon STACK
 | 
						|
kills ALL
 | 
						|
gen move %1, R0
 | 
						|
    move %2, R1
 | 
						|
    move %3, R2
 | 
						|
    return
 | 
						|
    move LB, SP
 | 
						|
    LDMFD {autoid, SP}, {lb_pc_reglist2, LB, PC}
 | 
						|
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 *									*
 | 
						|
 * GROUP XV :	Miscellaneous						*
 | 
						|
 *									*
 | 
						|
 ************************************************************************/
 | 
						|
 | 
						|
pat asp legal($1)
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen ADD SP, SP, {fitcon, $1}
 | 
						|
 | 
						|
pat asp
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG={const4, $1}
 | 
						|
gen ADD SP, SP, %a
 | 
						|
 | 
						|
pat ass $1==4
 | 
						|
with REGcon STACK
 | 
						|
gen ADD SP, SP, %1
 | 
						|
 | 
						|
pat blm $1==0
 | 
						|
with address+REGcon address+REGcon
 | 
						|
 | 
						|
pat blm $1==1
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
uses GENREG
 | 
						|
gen LDR_B %a, {regind, %2}
 | 
						|
    STR_B %a, {regind, %1}
 | 
						|
 | 
						|
pat blm $1==4
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
uses GENREG
 | 
						|
gen move {regind, %2}, %a
 | 
						|
    move %a, {regind, %1}
 | 
						|
 | 
						|
pat blm $1>4
 | 
						|
with GENREG GENREG
 | 
						|
kills address
 | 
						|
uses GENREG, GENREG={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 GENREG
 | 
						|
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 $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen BAL_L {label, "_Csa"}
 | 
						|
    move R2, PC
 | 
						|
 | 
						|
pat csb $1==4
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen BAL_L {label, "_Csb"}
 | 
						|
    move R3, PC
 | 
						|
 | 
						|
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
 | 
						|
kills ALL
 | 
						|
uses GENREG={const4,$1}, GENREG
 | 
						|
gen LABEL {label, "1:"}
 | 
						|
    move {st_regrel, SP, $1-4}, %b
 | 
						|
    STMFD {autoid, SP}, {reglist1, %b}
 | 
						|
    SUB_S %a, %a, {fitcon, 4}
 | 
						|
    BGT {label, "1B"}
 | 
						|
 | 
						|
pat dus
 | 
						|
with GENREG STACK
 | 
						|
uses GENREG, GENREG
 | 
						|
gen SUB %b, %1, {fitcon, 4}
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    move {st_regregrel, SP, %b}, %a
 | 
						|
    STMFD {autoid, SP}, {reglist1, %a}
 | 
						|
    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 GENREG, GENREG, GENREG={const4, $1-4}, GENREG, GENREG={const4, $1}
 | 
						|
gen ADD %d, SP, %e
 | 
						|
    LABEL {label, "1:"}
 | 
						|
    move {st_regregrel, SP,%c}, %a
 | 
						|
    move {regregrel,%d,%c}, %b
 | 
						|
    move %a, {regregrel,%d,%c}
 | 
						|
    move %b, {st_regregrel, SP,%c}
 | 
						|
    SUB_S %c, %c, {fitcon, 4}
 | 
						|
    BGE {label, "1B"}
 | 
						|
 | 
						|
pat fil
 | 
						|
uses GENREG
 | 
						|
gen move {addr_external,$1}, %a
 | 
						|
    move %a, {addr_external, "_Filna"}
 | 
						|
 | 
						|
pat gto        /* this code does NOT restore registers */
 | 
						|
uses GENREG,GENREG,GENREG,GENREG
 | 
						|
gen move {addr_external, $1}, %d
 | 
						|
    move {regind, %d}, %a
 | 
						|
    move {regrel, %d, 4}, %b
 | 
						|
    move {regrel, %d, 8}, %c
 | 
						|
    MOV  LB, %c
 | 
						|
    MOV  SP, %b
 | 
						|
    MOV  PC, %a
 | 
						|
 | 
						|
pat lin
 | 
						|
kills address
 | 
						|
uses GENREG={const4,$1}
 | 
						|
gen move %a,{addr_external,"_Lineno"}
 | 
						|
 | 
						|
pat lni
 | 
						|
kills address
 | 
						|
uses GENREG
 | 
						|
gen move {addr_external,"_Lineno"}, %a
 | 
						|
    LDR %a, {regind, %a}
 | 
						|
    ADD %a,%a,{fitcon,1}
 | 
						|
    move %a,{addr_external,"_Lineno"}
 | 
						|
 | 
						|
pat lor $1==0				yields LB
 | 
						|
 | 
						|
pat lor $1==1
 | 
						|
with STACK
 | 
						|
kills ALL				yields SP
 | 
						|
 | 
						|
pat lor $1==2				yields {absolute, "_RegHp"}
 | 
						|
 | 
						|
pat lpb					leaving adp 8
 | 
						|
 | 
						|
pat nop
 | 
						|
gen MOV_NV R0,R0
 | 
						|
 | 
						|
pat rck
 | 
						|
with GENREG REGcon  STACK 
 | 
						|
uses GENREG,GENREG
 | 
						|
gen move {regind, %1}, %a
 | 
						|
    /* for some reason, the code generator expects the value
 | 
						|
     * to be checked on top of the stack after checking, while
 | 
						|
     * in fact it is held in %2. This causes mayhem later on, and
 | 
						|
     * the following two lines rectify this.
 | 
						|
     */
 | 
						|
    move %2,%b
 | 
						|
    STMFD {autoid, SP}, {reglist1, %b}
 | 
						|
    CMP %a, %2
 | 
						|
    BGT {label, "_RckTrap"}
 | 
						|
    move {regrel, %1, 4}, %a
 | 
						|
    CMP %a, %2
 | 
						|
    BLT {label, "_RckTrap"}
 | 
						|
 | 
						|
pat lim
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG
 | 
						|
gen move {addr_external, "_IgnoreMask"}, %a
 | 
						|
    STMFD {autoid, SP}, {reglist1, %a}
 | 
						|
 | 
						|
pat mon
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen BAL_L {label, "_EmMon"}
 | 
						|
 | 
						|
pat rtt
 | 
						|
            leaving ret 0
 | 
						|
 | 
						|
pat sig
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG,GENREG
 | 
						|
gen move {addr_external, "_TrpReg"}, %a
 | 
						|
    LDR %a, {regind, %a}
 | 
						|
    LDMFD {autoid, SP}, {reglist1, %b}
 | 
						|
    move %b, {addr_external, "_TrpReg"}
 | 
						|
    STMFD {autoid, SP}, {reglist1, %a}
 | 
						|
 | 
						|
pat sim
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
uses GENREG
 | 
						|
gen LDMFD {autoid, SP}, {reglist1, %a}
 | 
						|
    move %a, {addr_external, "_IgnoreMask"}
 | 
						|
 | 
						|
pat trp
 | 
						|
with STACK
 | 
						|
kills ALL
 | 
						|
gen BAL_L {label, "_EmTrp"}
 | 
						|
 | 
						|
pat str $1==0
 | 
						|
with address
 | 
						|
gen move %1, LB
 | 
						|
with REGcon
 | 
						|
gen move %1, LB
 | 
						|
 | 
						|
pat str $1==1
 | 
						|
with address
 | 
						|
gen MOV SP, %1
 | 
						|
with REGcon
 | 
						|
gen MOV SP, %1
 | 
						|
 | 
						|
pat str $1==2
 | 
						|
with GENREG
 | 
						|
gen move %1, {absolute, "_RegHp"}
 | 
						|
 | 
						|
/***********************************************************************/
 | 
						|
 | 
						|
/* code for *p++ and *p-- (integers)*/
 | 
						|
pat lol lol adp stl loi $1==$2 && $2==$4 && $5==4
 | 
						|
kills GENREG
 | 
						|
uses GENREG, GENREG
 | 
						|
gen move {lb_local, $1}, %a
 | 
						|
    LDR %b, {regrelpi, %a, $5}
 | 
						|
    STR %a, {lb_local, $1}		yields %b
 | 
						|
 | 
						|
pat lol lol adp stl sti $1==$2 && $2==$4 && $5==4
 | 
						|
with GENREG
 | 
						|
kills GENREG
 | 
						|
uses GENREG
 | 
						|
gen move {lb_local,$1}, %a
 | 
						|
    STR %1, {regrelpi, %a, $5}
 | 
						|
    STR %a, {lb_local, $1}
 | 
						|
 | 
						|
/* code for *p++ and *p-- (bytes)*/
 | 
						|
pat lol lol adp stl loi $1==$2 && $2==$4 && $5==1
 | 
						|
kills GENREG
 | 
						|
uses GENREG, GENREG
 | 
						|
gen move {lb_local, $1}, %a
 | 
						|
    LDR_B %b, {regrelpi, %a, $5}
 | 
						|
    STR %a, {lb_local, $1}		yields %b
 | 
						|
 | 
						|
pat lol lol adp stl sti $1==$2 && $2==$4 && $5==1
 | 
						|
with GENREG
 | 
						|
kills GENREG
 | 
						|
uses GENREG
 | 
						|
gen move {lb_local,$1}, %a
 | 
						|
    STR_B %1, {regrelpi, %a, $5}
 | 
						|
    STR %a, {lb_local, $1}
 | 
						|
 | 
						|
/* code for *pp->p++ and *pp->p-- (integers)*/
 | 
						|
pat lil lil adp sil loi $1==$2 && $2==$4 && $5==4
 | 
						|
kills GENREG
 | 
						|
uses GENREG, GENREG, GENREG
 | 
						|
gen move {lb_local, $1}, %a
 | 
						|
    LDR %b, {regind, %a}
 | 
						|
    ADD %c, %b, {fitcon, $5}
 | 
						|
    STR %c, {regind, %a}
 | 
						|
    LDR %c, {regind, %b}		yields %c
 | 
						|
 | 
						|
pat lil lil adp sil sti $1==$2 && $2==$4 && $5==4
 | 
						|
with GENREG
 | 
						|
kills GENREG
 | 
						|
uses GENREG, GENREG, GENREG
 | 
						|
gen move {lb_local, $1}, %a
 | 
						|
    LDR %b, {regind, %a}
 | 
						|
    ADD %c, %b, {fitcon, $5}
 | 
						|
    STR %c, {regind, %a}
 | 
						|
    STR %1, {regind, %b}
 | 
						|
 | 
						|
/* code for *pp->p++ and *pp->p-- (bytes)*/
 | 
						|
pat lil lil adp sil loi $1==$2 && $2==$4 && $5==1
 | 
						|
kills GENREG
 | 
						|
uses GENREG, GENREG, GENREG
 | 
						|
gen move {lb_local, $1}, %a
 | 
						|
    LDR %b, {regind, %a}
 | 
						|
    ADD %c, %b, {fitcon, $5}
 | 
						|
    STR %c, {regind, %a}
 | 
						|
    LDR_B %c, {regind, %b}		yields %c
 | 
						|
 | 
						|
pat lil lil adp sil sti $1==$2 && $2==$4 && $5==1
 | 
						|
with GENREG
 | 
						|
kills GENREG
 | 
						|
uses GENREG, GENREG, GENREG
 | 
						|
gen move {lb_local, $1}, %a
 | 
						|
    LDR %b, {regind, %a}
 | 
						|
    ADD %c, %b, {fitcon, $5}
 | 
						|
    STR %c, {regind, %a}
 | 
						|
    STR_B %1, {regind, %b}
 | 
						|
 | 
						|
 | 
						|
/* global array access of the form x[y-1] */
 | 
						|
 | 
						|
pat lol loc mli loc sbi $2==$4 && $3==4 && $5==4
 | 
						|
    leaving lol $1 dec 4 loc $2 mli 4
 | 
						|
 | 
						|
/* x[i] = y with large array elements */
 | 
						|
 | 
						|
pat lae loi lae lol loc mli ads sti $2==$8 && $2 > 4
 | 
						|
    leaving lae $1 lae $3 lol $4 loc $5 mli $6 ads $7 blm $8
 | 
						|
pat lae loi lae lol loc mlu ads sti $2==$8 && $2 > 4
 | 
						|
    leaving lae $1 lae $3 lol $4 loc $5 mlu $6 ads $7 blm $8
 | 
						|
 | 
						|
/* prevent double push/pull of $1 */
 | 
						|
 | 
						|
pat lae lol loc mli ads
 | 
						|
    leaving lol $2 loc $3 mli $4 lae $1 ads $5
 | 
						|
pat lae lol loc mlu ads
 | 
						|
    leaving lol $2 loc $3 mlu $4 lae $1 ads $5
 | 
						|
 | 
						|
pat lae lol loc mli ads lol loc mli ads $5==$9 && $4==$8
 | 
						|
    leaving lol $2 loc $3 mli $4 lol $6 loc $7 mli $8 ads $5 lae $1 ads $9
 | 
						|
pat lae lol loc mlu ads lol loc mlu ads $5==$9 && $4==$8
 | 
						|
    leaving lol $2 loc $3 mlu $4 lol $6 loc $7 mlu $8 ads $5 lae $1 ads $9
 | 
						|
 | 
						|
pat lae lol adp loi loc mli ads
 | 
						|
    leaving lol $2 adp $3 loi $4 loc $5 mli $6 lae $1 ads $7
 | 
						|
pat lae lol adp loi loc mlu ads
 | 
						|
    leaving lol $2 adp $3 loi $4 loc $5 mlu $6 lae $1 ads $7
 | 
						|
 | 
						|
/*
 | 
						|
pat lae loi lae lol adp loi loc mli ads sti $2==$10 && $2 > 4
 | 
						|
    leaving lae $1 lae $3 lol $4 adp $5 loi $6 loc $7 mli $8 ads $9 blm $2
 | 
						|
pat lae loi lae lol adp loi loc mlu ads sti $2==$10 && $2 > 4
 | 
						|
    leaving lae $1 lae $3 lol $4 adp $5 loi $6 loc $7 mlu $8 ads $9 blm $2
 | 
						|
*/
 |