with GPRI GPRI
yields %1 %2
-#if 0
pat stl lol $1==$2 /* Store then load local */
leaving
dup QUAD
stl $1
-#endif
pat lal sti lal loi $1==$3 && $2==$4 /* Store then load local, of a different size */
leaving
pat lal /* Load address of local */
uses REG
gen
- add %a, FP, {CONST, $1}
- sub %a, GP
+ sub %a, FP, GP
+ add %a, {CONST, $1}
yields %a
pat lol inreg($1)>0 /* Load from local */
pat ldl /* Load double-word from local */
leaving
- lal $1
- loi QUAD*2
+ lol $1 + QUAD*0
+ lol $1 + QUAD*1
pat stl inreg($1)>0 /* Store to local */
with CONST+GPRI
pat sdl /* Store double-word to local */
leaving
- lal $1
- sti QUAD*2
+ stl $1 + QUAD*1
+ stl $1 + QUAD*0
pat lil inreg($1)>0 /* Load from indirected local */
uses REG
pat stl lol $1==$2 /* Save then load (generated by C compiler) */
leaving
- dup 4
+ dup QUAD
stl $1
- pat zrl /* Zero local */
+ pat zrl /* Zero local */
leaving
loc 0
stl $1
- pat inl /* Increment local */
+ pat inl inreg($1)>0 /* Increment local in register */
+ kills regvar($1)
+ gen
+ add {GPRE, regvar($1)}, {CONST, 1}
+
+ pat inl inreg($1)<=0 /* Increment local */
leaving
lol $1
loc 1
- adi 4
+ adi QUAD
stl $1
- pat del /* Decrement local */
+ pat del inreg($1)>0 /* Decrement local in register */
+ kills regvar($1)
+ gen
+ sub {GPRE, regvar($1)}, {CONST, 1}
+
+ pat del inreg($1)<=0 /* Decrement local */
leaving
lol $1
loc 1
- sbi 4
+ sbi QUAD
stl $1
/* Loads and stores */
pat loi $1==BYTE /* Load byte indirect */
+ with LABEL
+ uses REG
+ gen
+ ldb %a, %1
+ yields %a
with GPR
uses reusing %1, REG
gen
ldb %a, {GPRGPR, %1.reg, GP}
yields %a
-#if 0
- pat loi loc loc cii $1==WORD && $2==WORD && $3==QUAD /* Load half-word indirect and sign extend */
- with GPR
+ pat loi loc loc cii $1==WORD && $2==WORD && $3==QUAD /* Load short indirect and sign extend */
+ with LABEL
uses REG
gen
- lha %a, {GPROFFSET, %1, 0}
+ ldhs %a, %1
yields %a
- with SUM_RR
+ with GPRI
uses reusing %1, REG
gen
- lhax %a, %1.reg1, %1.reg2
- yields %a
- with SUM_RC
- uses REG
- gen
- move {IND_RC_H_S, %1.reg, %1.off}, %a
+ add %a, %1, GP
+ ldhs %a, {GPROFFSET, %a, 0}
yields %a
- pat loi $1==WORD /* Load half-word indirect */
- with GPR
+ pat loi $1==WORD /* Load short indirect */
+ with LABEL
uses REG
gen
- lhz %a, {GPROFFSET, %1, 0}
+ ldh %a, %1
yields %a
- with SUM_RR
+ with GPRI
uses reusing %1, REG
gen
- lhzx %a, %1.reg1, %1.reg2
+ add %a, %1, GP
+ ldh %a, {GPROFFSET, %a, 0}
yields %a
- with SUM_RC
+
+ pat loi $1==QUAD /* Load quad indirect */
+ with LABEL
uses REG
gen
- move {IND_RC_H, %1.reg, %1.off}, %a
+ ld %a, %1
yields %a
-#endif
-
- pat loi $1==QUAD /* Load quad indirect */
- with GPR
+ with GPRI
uses reusing %1, REG
gen
add %a, %1, GP
ld %a, {GPROFFSET, %a, 0}
yields %a
- pat loi /* Load arbitrary size */
+ pat loi !nicesize($1) /* Load arbitrary size */
leaving
loc $1
los QUAD
bl {LABEL, ".los"}
pat sti $1==BYTE /* Store byte indirect */
+ with LABEL GPRI
+ gen
+ stb %2, %1
with GPR GPRI
gen
stb %2, {GPRGPR, %1, GP}
stb %2, {GPRGPR, %1.reg, GP}
pat sti $1==WORD /* Store half-word indirect */
- with GPR GPR
- uses REG
+ with LABEL GPRI
+ gen
+ sth %2, %1
+ with GPRI GPRI
+ uses reusing %1, REG
gen
add %a, %1, GP
sth %2, {GPROFFSET, %a, 0}
pat sti $1==QUAD /* Store quad indirect */
- with GPR GPR
- uses REG
+ with LABEL GPRI
+ gen
+ st %2, %1
+ with GPRI GPRI
+ uses reusing %1, REG
gen
add %a, %1, GP
st %2, {GPROFFSET, %a, 0}