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}
 |