--- /dev/null
+#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
+
+pat sbu leaving sbu
+
+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 leaving adi 4
+
+pat sbs 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
+
+pat cmp leaving cmi $1
+
+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}