Various codegen tweaks.
--HG-- branch : dtrg-videocore
This commit is contained in:
parent
2c7ee27206
commit
98a51732ab
|
@ -27,7 +27,6 @@ PROPERTIES
|
|||
|
||||
GPR /* any GPR */
|
||||
REG /* any allocatable GPR */
|
||||
STACKABLE /* a push/popable register (r0, r6, r16, fp) */
|
||||
|
||||
GPR0 GPR1 GPR2 GPR3 GPR4 GPR5 GPR6 GPR7
|
||||
GPR8 GPR9 GPR10 GPR11 GPR12 GPR13 GPR14 GPR15
|
||||
|
@ -37,13 +36,13 @@ PROPERTIES
|
|||
|
||||
REGISTERS
|
||||
|
||||
R0("r0") : GPR, REG, STACKABLE, GPR0.
|
||||
R0("r0") : GPR, REG, GPR0.
|
||||
R1("r1") : GPR, REG, GPR1.
|
||||
R2("r2") : GPR, REG, GPR2.
|
||||
R3("r3") : GPR, REG, GPR3.
|
||||
R4("r4") : GPR, REG, GPR4.
|
||||
R5("r5") : GPR, REG, GPR5.
|
||||
R6("r6") : GPR, REG, STACKABLE, GPR6 regvar.
|
||||
R6("r6") : GPR, REG, GPR6 regvar.
|
||||
R7("r7") : GPR, REG, GPR7 regvar.
|
||||
R8("r8") : GPR, REG, GPR8 regvar.
|
||||
R9("r9") : GPR, REG, GPR9 regvar.
|
||||
|
@ -54,14 +53,16 @@ REGISTERS
|
|||
R14("r14") : GPR, REG, GPR14 regvar.
|
||||
GP("r15") : GPR, GPRGP.
|
||||
|
||||
R16("r16") : GPR, GPR16.
|
||||
|
||||
R23("r23") : GPR.
|
||||
FP("fp") : GPR, GPRFP, STACKABLE.
|
||||
FP("fp") : GPR, GPRFP.
|
||||
SP("sp") : GPR, GPRSP.
|
||||
LR("lr") : GPR, GPRLR.
|
||||
PC("pc") : GPR, GPRPC.
|
||||
/* r26 to r31 are special and the code generator doesn't touch them. */
|
||||
|
||||
#define SCRATCH R23
|
||||
#define SCRATCH R16
|
||||
|
||||
TOKENS
|
||||
|
||||
|
@ -69,6 +70,7 @@ TOKENS
|
|||
|
||||
GPROFFSET = { GPR reg; INT off; } 4 off "(" reg ")".
|
||||
GPRGPR = { GPR reg1; GPR reg2; } 4 "(" reg1 "," reg2 ")".
|
||||
GPRINC = { GPR reg; } 4 "(" reg ")++".
|
||||
|
||||
/* Primitives */
|
||||
|
||||
|
@ -119,6 +121,7 @@ INSTRUCTIONS
|
|||
bgt "b.gt" LABEL:ro.
|
||||
bgt "b.gt" LABEL:ro.
|
||||
bhi "b.hi" LABEL:ro.
|
||||
bset XREG:rw, XREG+CONST:ro.
|
||||
b XREG+LABEL:ro.
|
||||
bl XREG+LABEL:ro.
|
||||
cmp XREG:ro, XREG+CONST:ro kills :cc.
|
||||
|
@ -132,6 +135,7 @@ INSTRUCTIONS
|
|||
fdiv XREG:wo, XREG:ro, XREG:ro.
|
||||
fmul XREG:wo, XREG:ro, XREG:ro.
|
||||
fsub XREG:wo, XREG:ro, XREG:ro.
|
||||
ld XREG:wo, GPRINC:rw.
|
||||
ld XREG:wo, GPROFFSET+GPRGPR+LABEL:ro.
|
||||
ldb XREG:wo, GPROFFSET+GPRGPR+LABEL:ro.
|
||||
ldh XREG:wo, GPROFFSET+GPRGPR+LABEL:ro.
|
||||
|
@ -144,9 +148,10 @@ INSTRUCTIONS
|
|||
mul XREG:rw, XREG+CONST:ro.
|
||||
neg XREG:rw, XREG+CONST:ro.
|
||||
or XREG:rw, XREG+CONST:ro.
|
||||
pop STACKABLE:wo.
|
||||
pop STACKABLE:wo, GPRLR+GPRPC:wo.
|
||||
push STACKABLE:ro.
|
||||
pop GPR0+GPR6+GPR16+GPRFP+GPRPC:wo.
|
||||
pop GPR0+GPR6+GPR16+GPRFP:wo, GPRPC:wo.
|
||||
push GPR0+GPR6+GPR16+GPRFP+GPRLR:ro.
|
||||
push GPR0+GPR6+GPR16+GPRFP:ro, GPRLR:ro.
|
||||
sub XREG:wo, XREG:ro, CONST+XREG:ro.
|
||||
sub XREG:rw, XREG+CONST:ro.
|
||||
st XREG:ro, GPROFFSET+GPRGPR+LABEL:ro.
|
||||
|
@ -155,6 +160,7 @@ INSTRUCTIONS
|
|||
sths XREG:ro, GPROFFSET+GPRGPR+LABEL:ro.
|
||||
|
||||
invalid "invalid".
|
||||
comment "!" LABEL:ro.
|
||||
|
||||
|
||||
|
||||
|
@ -210,53 +216,35 @@ TESTS
|
|||
|
||||
STACKINGRULES
|
||||
|
||||
from STACKABLE to STACK
|
||||
from GPR0+GPR6+GPR16 to STACK
|
||||
gen
|
||||
push %1
|
||||
comment {LABEL, "push stackable"}
|
||||
push %1
|
||||
|
||||
from GPR to STACK
|
||||
uses STACKABLE
|
||||
from OP+GPRI to STACK
|
||||
gen
|
||||
move %1, %a
|
||||
push %a
|
||||
|
||||
from GPR to STACK
|
||||
gen
|
||||
sub SP, SP, {CONST, 4}
|
||||
st %1, {GPROFFSET, SP, 0}
|
||||
|
||||
from GPRE to STACK
|
||||
uses STACKABLE
|
||||
gen
|
||||
move %1, %a
|
||||
push %a
|
||||
|
||||
from GPRE to STACK
|
||||
gen
|
||||
sub SP, {CONST, 4}
|
||||
st %1, {GPROFFSET, SP, 0}
|
||||
|
||||
from OP to STACK
|
||||
uses STACKABLE
|
||||
gen
|
||||
move %1, %a
|
||||
push %a
|
||||
|
||||
from OP to STACK
|
||||
gen
|
||||
COMMENT("fallback stack")
|
||||
comment {LABEL, "push via scratch"}
|
||||
move %1, SCRATCH
|
||||
sub SP, SP, {CONST, 4}
|
||||
st SCRATCH, {GPROFFSET, SP, 0}
|
||||
push SCRATCH
|
||||
|
||||
|
||||
|
||||
|
||||
COERCIONS
|
||||
|
||||
from GPRE
|
||||
from GPRI
|
||||
uses reusing %1, REG=%1
|
||||
yields %a
|
||||
|
||||
from GPR
|
||||
yields {GPRE, %1}
|
||||
|
||||
from OP
|
||||
uses GPR0
|
||||
gen
|
||||
move %1, %a
|
||||
yields %a
|
||||
|
||||
from OP
|
||||
uses REG
|
||||
gen
|
||||
|
@ -264,10 +252,10 @@ COERCIONS
|
|||
yields %a
|
||||
|
||||
from STACK
|
||||
uses STACKABLE
|
||||
uses REG
|
||||
gen
|
||||
COMMENT("coerce STACK->REG")
|
||||
pop %a
|
||||
pop R0
|
||||
move R0, %a
|
||||
yields %a
|
||||
|
||||
|
||||
|
@ -619,10 +607,8 @@ PATTERNS
|
|||
los QUAD
|
||||
|
||||
pat los /* Load arbitrary size */
|
||||
with STACK
|
||||
kills ALL
|
||||
gen
|
||||
bl {LABEL, ".los"}
|
||||
leaving
|
||||
cal ".los"
|
||||
|
||||
pat sti $1==BYTE /* Store byte indirect */
|
||||
with LABEL GPRI+SIGNEX8+SIGNEX16
|
||||
|
@ -735,6 +721,9 @@ PATTERNS
|
|||
|
||||
/* Word arithmetic */
|
||||
|
||||
pat loc adi $1==0 /* Add nothing */
|
||||
/* nop */
|
||||
|
||||
pat adi $1==QUAD /* Add word (second + top) */
|
||||
with GPRI+CONST GPRI
|
||||
uses reusing %2, REG=%2
|
||||
|
@ -747,6 +736,9 @@ PATTERNS
|
|||
add %a, %2
|
||||
yields %a
|
||||
|
||||
pat loc sbi $1==0 /* Subtract nothing */
|
||||
/* nop */
|
||||
|
||||
pat sbi $1==QUAD /* Subtract word (second - top) */
|
||||
with GPRI+CONST GPRI
|
||||
uses reusing %2, REG=%2
|
||||
|
@ -886,16 +878,6 @@ PATTERNS
|
|||
yields %a
|
||||
|
||||
|
||||
pat and !defined($1) /* AND set */
|
||||
with STACK
|
||||
gen
|
||||
bl {LABEL, ".and"}
|
||||
|
||||
pat ior !defined($1) /* OR set */
|
||||
with STACK
|
||||
gen
|
||||
bl {LABEL, ".ior"}
|
||||
|
||||
pat xor $1==4 /* XOR word */
|
||||
with GPR GPR
|
||||
yields {XOR_RR, %1, %2}
|
||||
|
@ -1055,33 +1037,48 @@ PATTERNS
|
|||
|
||||
/* Sets */
|
||||
|
||||
pat set defined($1) /* Create word with set bit */
|
||||
pat set $1==QUAD /* Create quad with one bit set */
|
||||
with GPRI
|
||||
uses reusing %1, REG
|
||||
gen
|
||||
bset %a, %1
|
||||
yields %a
|
||||
|
||||
pat set defined($1) /* Any other set */
|
||||
leaving
|
||||
loc 1
|
||||
exg $1
|
||||
sli $1
|
||||
loc $1
|
||||
cal ".set"
|
||||
|
||||
pat set !defined($1) /* Create structure with set bit (variable) */
|
||||
with STACK
|
||||
gen
|
||||
bl {LABEL, ".set"}
|
||||
leaving
|
||||
cal ".set"
|
||||
|
||||
pat inn defined($1) /* Test for set bit */
|
||||
leaving
|
||||
set QUAD
|
||||
and QUAD
|
||||
set $1
|
||||
and $1
|
||||
|
||||
pat inn !defined($1) /* Test for set bit (variable) */
|
||||
with GPR0 STACK
|
||||
gen
|
||||
bl {LABEL, ".inn"}
|
||||
yields R0
|
||||
leaving
|
||||
cal ".inn"
|
||||
|
||||
pat ior !defined($1) /* Or two sets */
|
||||
with STACK
|
||||
gen
|
||||
bl {LABEL, ".ior"}
|
||||
pat ior !nicesize($1) /* OR set */
|
||||
leaving
|
||||
cal ".ior"
|
||||
|
||||
pat ior !defined($1) /* OR set */
|
||||
leaving
|
||||
cal ".ior"
|
||||
|
||||
pat and !nicesize($1) /* AND set */
|
||||
leaving
|
||||
loc $1
|
||||
cal ".and"
|
||||
|
||||
pat and !defined($1) /* AND set */
|
||||
leaving
|
||||
cal ".and"
|
||||
|
||||
|
||||
|
||||
/* Boolean resolutions */
|
||||
|
@ -1171,15 +1168,23 @@ PATTERNS
|
|||
pat ble call anyb("b.le") /* Branch if signed second <= top */
|
||||
|
||||
proc cmu_z example cmu zeq
|
||||
with GPR+CONST GPRI STACK
|
||||
with GPRI+CONST GPRI STACK
|
||||
gen
|
||||
cmp %2, %1
|
||||
beq[1] {LABEL, $2}
|
||||
|
||||
pat cmu zeq call cmu_z("b.eq") /* Branch if unsigned second == top */
|
||||
pat cmu zne call cmu_z("b.ne") /* Branch if unsigned second != top */
|
||||
pat cmu zgt call cmu_z("b.hi") /* Branch if unsigned second > top */
|
||||
pat cmu zlt call cmu_z("b.lo") /* Branch if unsigned second < top */
|
||||
pat cmu zge call cmu_z("b.hs") /* Branch if unsigned second >= top */
|
||||
pat cmu zle call cmu_z("b.ls") /* Branch if unsigned second <= top */
|
||||
pat cmi zeq call cmu_z("b.eq") /* Branch if signed second == top */
|
||||
pat cmi zne call cmu_z("b.ne") /* Branch if signed second != top */
|
||||
pat cmi zgt call cmu_z("b.gt") /* Branch if signed second > top */
|
||||
pat cmi zlt call cmu_z("b.lt") /* Branch if signed second < top */
|
||||
pat cmi zge call cmu_z("b.ge") /* Branch if signed second >= top */
|
||||
pat cmi zle call cmu_z("b.le") /* Branch if signed second <= top */
|
||||
|
||||
proc cmf_z example cmu zeq
|
||||
with GPRI GPRI STACK
|
||||
|
@ -1268,6 +1273,9 @@ PATTERNS
|
|||
pat lfr $1==QUAD /* Load function result, word */
|
||||
yields R0
|
||||
|
||||
pat lfr $1==QUAD*2 /* Load function result, word */
|
||||
yields R1 R0
|
||||
|
||||
pat ret $1==0 /* Return from procedure */
|
||||
gen
|
||||
return
|
||||
|
@ -1280,9 +1288,12 @@ PATTERNS
|
|||
return
|
||||
mov SP, FP
|
||||
pop FP, PC
|
||||
with STACK
|
||||
|
||||
pat ret $1==QUAD*2 /* Return from procedure, word */
|
||||
with GPRI GPRI
|
||||
gen
|
||||
pop R0
|
||||
move %1, R0
|
||||
move %2, R1
|
||||
return
|
||||
mov SP, FP
|
||||
pop FP, PC
|
||||
|
@ -1335,9 +1346,8 @@ PATTERNS
|
|||
ste ".ignmask"
|
||||
|
||||
pat trp /* Raise EM trap */
|
||||
with GPR0
|
||||
gen
|
||||
bl {LABEL, ".trap"}
|
||||
leaving
|
||||
cal ".trap"
|
||||
|
||||
pat sig /* Set trap handler */
|
||||
leaving
|
||||
|
@ -1467,47 +1477,38 @@ PATTERNS
|
|||
pat dvf call simple_f("fdiv") /* Float divide (second / top) */
|
||||
|
||||
pat loc loc cff $1==$2 && $1==QUAD /* Convert float to float */
|
||||
leaving
|
||||
leaving
|
||||
nop
|
||||
|
||||
pat loc loc cfi $1==$2 && $1==QUAD /* Convert float -> integer */
|
||||
with GPR0
|
||||
gen
|
||||
bl {LABEL, ".cfi"}
|
||||
yields R0
|
||||
leaving
|
||||
cal ".cfi"
|
||||
lfr QUAD
|
||||
|
||||
pat loc loc cfu $1==$2 && $1==QUAD /* Convert float -> unsigned */
|
||||
with GPR0
|
||||
gen
|
||||
bl {LABEL, ".cfu"}
|
||||
yields R0
|
||||
leaving
|
||||
cal ".cfu"
|
||||
lfr QUAD
|
||||
|
||||
pat loc loc cif $1==$2 && $1==QUAD /* Convert integer -> float */
|
||||
with GPR0
|
||||
gen
|
||||
bl {LABEL, ".cif"}
|
||||
yields R0
|
||||
leaving
|
||||
cal ".cif"
|
||||
lfr QUAD
|
||||
|
||||
pat loc loc cuf $1==$2 && $1==QUAD /* Convert unsigned -> float */
|
||||
with GPR0
|
||||
gen
|
||||
bl {LABEL, ".cuf"}
|
||||
yields R0
|
||||
leaving
|
||||
cal ".cuf"
|
||||
lfr QUAD
|
||||
|
||||
pat fef /* Split float */
|
||||
with GPR0
|
||||
kills GPR1
|
||||
gen
|
||||
bl {LABEL, ".fef"}
|
||||
yields R0 R1
|
||||
leaving
|
||||
cal ".cuf"
|
||||
lfr QUAD*2
|
||||
|
||||
pat fif /* Multiply float and split (?) */
|
||||
with GPRI GPRI
|
||||
kills GPR0, GPR1
|
||||
gen
|
||||
fmul R0, %2, %1
|
||||
bl {LABEL, ".fef"}
|
||||
yields R0 R1
|
||||
leaving
|
||||
mlf QUAD
|
||||
fef
|
||||
|
||||
pat zrf /* Load a floating zero */
|
||||
leaving
|
||||
|
|
Loading…
Reference in a new issue