Allow sp and fp on the fake stack.
This simplifies parts of the PowerPC table and causes ncg to better decide whether to push sp or fp to the real stack, or coerce it to REG3, or coerce it to REG-REG3, or move it to a regvar. These better decisions remove extra _mr_ instructions. The idea comes from mach/powerpc/arm/table, where SP has a property STACKPOINTER and LB has LOCALBASE. I don't need two properties, so I make one property SPFP for both registers.
This commit is contained in:
parent
c6ceaac1af
commit
e3672bd66e
|
@ -31,6 +31,7 @@ PC_OFFSET = 4 /* Offset of saved PC relative to our FP */
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
|
|
||||||
GPR /* general-purpose register */
|
GPR /* general-purpose register */
|
||||||
|
SPFP /* sp or fp */
|
||||||
REG /* allocatable GPR */
|
REG /* allocatable GPR */
|
||||||
REG3 /* coercion to r3 */
|
REG3 /* coercion to r3 */
|
||||||
|
|
||||||
|
@ -51,7 +52,8 @@ REGISTERS
|
||||||
* r13, r14, ..., r31: GPR, REG regvar(reg_any).
|
* r13, r14, ..., r31: GPR, REG regvar(reg_any).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
r0, sp, fp, r12 : GPR.
|
r0, r12 : GPR.
|
||||||
|
sp, fp : GPR, SPFP.
|
||||||
r3 : GPR, REG, REG3.
|
r3 : GPR, REG, REG3.
|
||||||
r4, r5, r6, r7, r8, r9, r10, r11 : GPR, REG.
|
r4, r5, r6, r7, r8, r9, r10, r11 : GPR, REG.
|
||||||
|
|
||||||
|
@ -238,7 +240,7 @@ SETS
|
||||||
MEMORY = IND_V + FRAME_V.
|
MEMORY = IND_V + FRAME_V.
|
||||||
|
|
||||||
/* any integer from stack that we can easily move to GPR */
|
/* any integer from stack that we can easily move to GPR */
|
||||||
INT_W = REG + CONST_STACK + SEX_B + SEX_H +
|
INT_W = SPFP + REG + CONST_STACK + SEX_B + SEX_H +
|
||||||
SUM_RIS + SUM_RC + SUM_RL + SUM_RR +
|
SUM_RIS + SUM_RC + SUM_RL + SUM_RR +
|
||||||
SUB_RR + NEG_R + MUL_RR + DIV_RR + DIV_RR_U +
|
SUB_RR + NEG_R + MUL_RR + DIV_RR + DIV_RR_U +
|
||||||
IND_ALL_B + IND_ALL_H + IND_ALL_W +
|
IND_ALL_B + IND_ALL_H + IND_ALL_W +
|
||||||
|
@ -717,19 +719,14 @@ TESTS
|
||||||
|
|
||||||
STACKINGRULES
|
STACKINGRULES
|
||||||
|
|
||||||
/* We don't allow GPR-REG on the stack. The intent is to ban
|
from SPFP+REG to STACK
|
||||||
* r0 from the stack, but this also bans fp from the stack.
|
|
||||||
* This is odd because most other tables for ncg allow the
|
|
||||||
* frame pointer on the stack.
|
|
||||||
*/
|
|
||||||
from REG to STACK
|
|
||||||
gen
|
gen
|
||||||
COMMENT("stack REG")
|
COMMENT("stack SPFP+REG")
|
||||||
stwu %1, {IND_RC_W, sp, 0-4}
|
stwu %1, {IND_RC_W, sp, 0-4}
|
||||||
|
|
||||||
from INT_W-REG to STACK
|
from INT_W-SPFP-REG to STACK
|
||||||
gen
|
gen
|
||||||
COMMENT("stack INT_W-REG")
|
COMMENT("stack INT_W-SPFP-REG")
|
||||||
move %1, RSCRATCH
|
move %1, RSCRATCH
|
||||||
stwu RSCRATCH, {IND_RC_W, sp, 0-4}
|
stwu RSCRATCH, {IND_RC_W, sp, 0-4}
|
||||||
|
|
||||||
|
@ -1146,26 +1143,15 @@ PATTERNS
|
||||||
uses REG={LXFRAME, $1}
|
uses REG={LXFRAME, $1}
|
||||||
gen move %1, {FRAME_D, $1, %a, $2, 8}
|
gen move %1, {FRAME_D, $1, %a, $2, 8}
|
||||||
|
|
||||||
/* Programs use "lxl cal" to pass the static chain and call a
|
pat lxl nicelx($1) /* Local base on static chain */
|
||||||
* nested procedure. This must push a token LXFRAME or the
|
|
||||||
* register fp to the real stack. */
|
|
||||||
|
|
||||||
/* Local base of procedure on static chain */
|
|
||||||
pat lxl nicelx($1)
|
|
||||||
uses REG={LXFRAME, $1}
|
uses REG={LXFRAME, $1}
|
||||||
yields %a /* Can't yield LXFRAME. */
|
yields %a /* Can't yield LXFRAME. */
|
||||||
pat lxl stl nicelx($1) && inreg($2)==reg_any
|
pat lxl stl nicelx($1) && inreg($2)==reg_any
|
||||||
kills regvar($2)
|
kills regvar($2)
|
||||||
gen move {LXFRAME, $1}, {REG_EXPR, regvar($2)}
|
gen move {LXFRAME, $1}, {REG_EXPR, regvar($2)}
|
||||||
|
|
||||||
pat lxl cal $1==0 /* Pass our local base to procedure */
|
|
||||||
with STACK
|
|
||||||
gen stwu fp, {IND_RC_W, sp, 0-4}
|
|
||||||
leaving cal $2
|
|
||||||
|
|
||||||
pat lxl $1==0 /* Our local base */
|
pat lxl $1==0 /* Our local base */
|
||||||
uses REG=fp
|
yields fp
|
||||||
yields %a /* Can't yield fp. */
|
|
||||||
|
|
||||||
pat lxa $1==0 /* Our argument base */
|
pat lxa $1==0 /* Our argument base */
|
||||||
yields {SUM_RC, fp, EM_BSIZE}
|
yields {SUM_RC, fp, EM_BSIZE}
|
||||||
|
@ -2134,7 +2120,8 @@ PATTERNS
|
||||||
bls
|
bls
|
||||||
|
|
||||||
pat bls /* Block move variable length */
|
pat bls /* Block move variable length */
|
||||||
with REG REG REG
|
with REG SPFP+REG SPFP+REG
|
||||||
|
/* allows sp as %2, %3 */
|
||||||
/* ( src%3 dst%2 len%1 -- ) */
|
/* ( src%3 dst%2 len%1 -- ) */
|
||||||
uses reusing %1, REG, REG, REG
|
uses reusing %1, REG, REG, REG
|
||||||
gen
|
gen
|
||||||
|
@ -2230,22 +2217,14 @@ PATTERNS
|
||||||
|
|
||||||
pat lor $1==1 /* Load stack pointer */
|
pat lor $1==1 /* Load stack pointer */
|
||||||
with STACK
|
with STACK
|
||||||
uses REG=sp
|
yields sp
|
||||||
yields %a /* Can't yield sp. */
|
|
||||||
|
|
||||||
/* Next few patterns for "lor 1" appear in
|
/* Next few patterns for "lor 1" appear in
|
||||||
* lang/m2/libm2/par_misc.e
|
* lang/m2/libm2/par_misc.e
|
||||||
*/
|
*/
|
||||||
pat lor lor $1==1 && $2==1 /* Load sp twice */
|
|
||||||
with STACK
|
|
||||||
gen stwu sp, {IND_RC_W, sp, 0-4}
|
|
||||||
leaving lor 1
|
|
||||||
|
|
||||||
pat lor adp $1==1 && smalls($2) /* sp + constant */
|
pat lor adp $1==1 && smalls($2) /* sp + constant */
|
||||||
with STACK
|
with STACK
|
||||||
uses REG
|
yields {SUM_RC, sp, $2}
|
||||||
gen addi %a, sp, {C, $2}
|
|
||||||
yields %a
|
|
||||||
|
|
||||||
/* Subtract stack pointer by doing %1 - (sp - 4)
|
/* Subtract stack pointer by doing %1 - (sp - 4)
|
||||||
* because sp - 4 would point to %1.
|
* because sp - 4 would point to %1.
|
||||||
|
|
Loading…
Reference in a new issue