Add a lot more opcodes.
--HG-- branch : dtrg-videocore
This commit is contained in:
parent
d6565f4d5b
commit
6cdea73e84
1 changed files with 143 additions and 176 deletions
|
@ -13,6 +13,8 @@ INT8 = 1 /* Size of values */
|
||||||
INT16 = 2
|
INT16 = 2
|
||||||
INT32 = 4
|
INT32 = 4
|
||||||
INT64 = 8
|
INT64 = 8
|
||||||
|
FLOAT32 = 4
|
||||||
|
FLOAT64 = 8
|
||||||
|
|
||||||
FP_OFFSET = 0 /* Offset of saved FP relative to our FP */
|
FP_OFFSET = 0 /* Offset of saved FP relative to our FP */
|
||||||
PC_OFFSET = 4 /* Offset of saved PC relative to our FP */
|
PC_OFFSET = 4 /* Offset of saved PC relative to our FP */
|
||||||
|
@ -100,6 +102,7 @@ INSTRUCTIONS
|
||||||
|
|
||||||
add GPRI:wo, GPRI:ro, GPRI+CONST:ro.
|
add GPRI:wo, GPRI:ro, GPRI+CONST:ro.
|
||||||
add GPRI:rw, GPRI+CONST:ro.
|
add GPRI:rw, GPRI+CONST:ro.
|
||||||
|
and GPRI:rw, GPRI+CONST:ro.
|
||||||
beq "b.eq" LABEL:ro.
|
beq "b.eq" LABEL:ro.
|
||||||
bne "b.ne" LABEL:ro.
|
bne "b.ne" LABEL:ro.
|
||||||
bgt "b.gt" LABEL:ro.
|
bgt "b.gt" LABEL:ro.
|
||||||
|
@ -108,6 +111,9 @@ INSTRUCTIONS
|
||||||
b GPRI+LABEL:ro.
|
b GPRI+LABEL:ro.
|
||||||
bl GPRI+LABEL:ro.
|
bl GPRI+LABEL:ro.
|
||||||
cmp GPRI:ro, GPRI+CONST:ro kills :cc.
|
cmp GPRI:ro, GPRI+CONST:ro kills :cc.
|
||||||
|
divs GPRI:wo, GPRI:ro, GPRI+CONST:ro.
|
||||||
|
divu GPRI:wo, GPRI:ro, GPRI+CONST:ro.
|
||||||
|
eor GPRI:rw, GPRI+CONST:ro.
|
||||||
exts GPRI:wo, GPRI:ro, GPRI+CONST:ro.
|
exts GPRI:wo, GPRI:ro, GPRI+CONST:ro.
|
||||||
exts GPRI:rw, GPRI+CONST:ro.
|
exts GPRI:rw, GPRI+CONST:ro.
|
||||||
ld GPRI:wo, GPROFFSET+GPRGPR+LABEL:ro.
|
ld GPRI:wo, GPROFFSET+GPRGPR+LABEL:ro.
|
||||||
|
@ -118,7 +124,9 @@ INSTRUCTIONS
|
||||||
lsl GPRI:rw, GPRI+CONST:ro.
|
lsl GPRI:rw, GPRI+CONST:ro.
|
||||||
lsl GPRI:wo, GPRI:ro, GPRI+CONST:ro.
|
lsl GPRI:wo, GPRI:ro, GPRI+CONST:ro.
|
||||||
mov GPRI:wo, GPRI+CONST:ro.
|
mov GPRI:wo, GPRI+CONST:ro.
|
||||||
|
mul GPRI:rw, GPRI+CONST:ro.
|
||||||
neg GPRI:rw, GPRI+CONST:ro.
|
neg GPRI:rw, GPRI+CONST:ro.
|
||||||
|
or GPRI:rw, GPRI+CONST:ro.
|
||||||
pop STACKABLE:wo.
|
pop STACKABLE:wo.
|
||||||
pop STACKABLE:wo, GPRLR+GPRPC:wo.
|
pop STACKABLE:wo, GPRLR+GPRPC:wo.
|
||||||
push STACKABLE:ro.
|
push STACKABLE:ro.
|
||||||
|
@ -547,17 +555,14 @@ PATTERNS
|
||||||
ld %a, {GPROFFSET, %a, 0}
|
ld %a, {GPROFFSET, %a, 0}
|
||||||
yields %a
|
yields %a
|
||||||
|
|
||||||
#if 0
|
|
||||||
pat loi $1==INT64 /* Load double-quad indirect */
|
pat loi $1==INT64 /* Load double-quad indirect */
|
||||||
with GPR
|
with GPRI
|
||||||
yields {IND_RC_D, %1, 0}
|
uses reusing %1, REG, REG
|
||||||
with SUM_RC
|
gen
|
||||||
yields {IND_RC_D, %1.reg, %1.off}
|
add %a, %1, GP
|
||||||
with SUM_RR
|
ld %b, {GPROFFSET, %a, 4}
|
||||||
yields {IND_RR_D, %1.reg1, %1.reg2}
|
ld %a, {GPROFFSET, %a, 0}
|
||||||
with LABEL
|
yields %a %b
|
||||||
yields {IND_LABEL_D, %1.adr}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pat loi /* Load arbitrary size */
|
pat loi /* Load arbitrary size */
|
||||||
leaving
|
leaving
|
||||||
|
@ -565,7 +570,7 @@ PATTERNS
|
||||||
los INT32
|
los INT32
|
||||||
|
|
||||||
pat los /* Load arbitrary size */
|
pat los /* Load arbitrary size */
|
||||||
with GPR0 GPR1 STACK
|
with STACK
|
||||||
kills ALL
|
kills ALL
|
||||||
gen
|
gen
|
||||||
bl {LABEL, ".los"}
|
bl {LABEL, ".los"}
|
||||||
|
@ -592,29 +597,13 @@ PATTERNS
|
||||||
add %a, %1, GP
|
add %a, %1, GP
|
||||||
st %2, {GPROFFSET, %a, 0}
|
st %2, {GPROFFSET, %a, 0}
|
||||||
|
|
||||||
#if 0
|
pat sti $1==INT64 /* Store double-quad indirect */
|
||||||
pat sti $1==INT64 /* Store double-word indirect */
|
with GPR GPR
|
||||||
with GPR FD
|
uses REG
|
||||||
gen
|
gen
|
||||||
move %2, {IND_RC_D, %1, 0}
|
add %a, %1, GP
|
||||||
with SUM_RR FD
|
st %1, {GPROFFSET, %a, 0}
|
||||||
gen
|
st %2, {GPROFFSET, %a, 4}
|
||||||
move %2, {IND_RR_D, %1.reg1, %1.reg2}
|
|
||||||
with SUM_RC FD
|
|
||||||
gen
|
|
||||||
move %2, {IND_RC_D, %1.reg, %1.off}
|
|
||||||
with GPR GPR GPR
|
|
||||||
gen
|
|
||||||
stw %2, {GPROFFSET, %1, 0}
|
|
||||||
stw %3, {GPROFFSET, %1, 4}
|
|
||||||
with SUM_RC GPR GPR
|
|
||||||
gen
|
|
||||||
move %2, {IND_RC_Q, %1.reg, %1.off}
|
|
||||||
move %3, {IND_RC_Q, %1.reg, %1.off+4}
|
|
||||||
with LABEL FD
|
|
||||||
gen
|
|
||||||
move %2, {IND_LABEL_D, %1.adr}
|
|
||||||
|
|
||||||
|
|
||||||
pat sti /* Store arbitrary size */
|
pat sti /* Store arbitrary size */
|
||||||
leaving
|
leaving
|
||||||
|
@ -622,12 +611,11 @@ PATTERNS
|
||||||
sts INT32
|
sts INT32
|
||||||
|
|
||||||
pat sts /* Load arbitrary size */
|
pat sts /* Load arbitrary size */
|
||||||
with GPR3 GPR4 STACK
|
with STACK
|
||||||
kills ALL
|
kills ALL
|
||||||
gen
|
gen
|
||||||
bl {LABEL, ".sts"}
|
bl {LABEL, ".sts"}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Arithmetic wrappers */
|
/* Arithmetic wrappers */
|
||||||
|
@ -709,6 +697,65 @@ PATTERNS
|
||||||
neg %a, %a
|
neg %a, %a
|
||||||
yields %a
|
yields %a
|
||||||
|
|
||||||
|
pat and $1==INT32 /* AND word */
|
||||||
|
with GPRI+CONST GPRI
|
||||||
|
uses reusing %2, REG=%2
|
||||||
|
gen
|
||||||
|
and %a, %1
|
||||||
|
yields %a
|
||||||
|
with GPRI GPRI+CONST
|
||||||
|
uses reusing %1, REG=%1
|
||||||
|
gen
|
||||||
|
and %a, %2
|
||||||
|
yields %a
|
||||||
|
|
||||||
|
pat ior $1==INT32 /* OR word */
|
||||||
|
with GPRI+CONST GPRI
|
||||||
|
uses reusing %2, REG=%2
|
||||||
|
gen
|
||||||
|
or %a, %1
|
||||||
|
yields %a
|
||||||
|
with GPRI GPRI+CONST
|
||||||
|
uses reusing %1, REG=%1
|
||||||
|
gen
|
||||||
|
or %a, %2
|
||||||
|
yields %a
|
||||||
|
|
||||||
|
pat xor $1==INT32 /* XOR word */
|
||||||
|
with GPRI+CONST GPRI
|
||||||
|
uses reusing %2, REG=%2
|
||||||
|
gen
|
||||||
|
eor %a, %1
|
||||||
|
yields %a
|
||||||
|
with GPRI GPRI+CONST
|
||||||
|
uses reusing %1, REG=%1
|
||||||
|
gen
|
||||||
|
eor %a, %2
|
||||||
|
yields %a
|
||||||
|
|
||||||
|
pat dvi $1==INT32 /* Divide word (second / top) */
|
||||||
|
with GPRI GPRI
|
||||||
|
uses reusing %2, REG
|
||||||
|
gen
|
||||||
|
divs %a, %2, %1
|
||||||
|
yields %a
|
||||||
|
|
||||||
|
pat dvu $1==INT32 /* Divide unsigned word (second / top) */
|
||||||
|
with GPRI GPRI
|
||||||
|
uses reusing %2, REG
|
||||||
|
gen
|
||||||
|
divu %a, %2, %1
|
||||||
|
yields %a
|
||||||
|
|
||||||
|
pat rmu $1==INT32 /* Remainder unsigned word (second % top) */
|
||||||
|
with GPRI GPRI
|
||||||
|
uses REG
|
||||||
|
gen
|
||||||
|
divu %a, %2, %1
|
||||||
|
mul %a, %1
|
||||||
|
sub %a, %2
|
||||||
|
yields %a
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
pat mli $1==4 /* Multiply word (second * top) */
|
pat mli $1==4 /* Multiply word (second * top) */
|
||||||
with REG REG
|
with REG REG
|
||||||
|
@ -717,20 +764,6 @@ PATTERNS
|
||||||
mullw %a, %2, %1
|
mullw %a, %2, %1
|
||||||
yields %a
|
yields %a
|
||||||
|
|
||||||
pat dvi $1==4 /* Divide word (second / top) */
|
|
||||||
with REG REG
|
|
||||||
uses reusing %2, REG
|
|
||||||
gen
|
|
||||||
divw %a, %2, %1
|
|
||||||
yields %a
|
|
||||||
|
|
||||||
pat dvu $1==4 /* Divide unsigned word (second / top) */
|
|
||||||
with REG REG
|
|
||||||
uses reusing %2, REG
|
|
||||||
gen
|
|
||||||
divwu %a, %2, %1
|
|
||||||
yields %a
|
|
||||||
|
|
||||||
pat rmi $1==4 /* Remainder word (second % top) */
|
pat rmi $1==4 /* Remainder word (second % top) */
|
||||||
with REG REG
|
with REG REG
|
||||||
uses REG
|
uses REG
|
||||||
|
@ -740,56 +773,11 @@ PATTERNS
|
||||||
subf %a, %a, %2
|
subf %a, %a, %2
|
||||||
yields %a
|
yields %a
|
||||||
|
|
||||||
pat rmu $1==4 /* Remainder unsigned word (second % top) */
|
|
||||||
with REG REG
|
|
||||||
uses REG
|
|
||||||
gen
|
|
||||||
divwu %a, %2, %1
|
|
||||||
mullw %a, %a, %1
|
|
||||||
subf %a, %a, %2
|
|
||||||
yields %a
|
|
||||||
|
|
||||||
pat and $1==4 /* AND word */
|
|
||||||
with GPR NOT_R
|
|
||||||
uses reusing %1, REG
|
|
||||||
gen
|
|
||||||
andc %a, %1, %2.reg
|
|
||||||
yields %a
|
|
||||||
with NOT_R GPR
|
|
||||||
uses reusing %1, REG
|
|
||||||
gen
|
|
||||||
andc %a, %2, %1.reg
|
|
||||||
yields %a
|
|
||||||
with GPR GPR
|
|
||||||
yields {AND_RR, %1, %2}
|
|
||||||
with GPR CONST
|
|
||||||
yields {AND_RC, %1, %2.val}
|
|
||||||
with CONST GPR
|
|
||||||
yields {AND_RC, %2, %1.val}
|
|
||||||
|
|
||||||
pat and !defined($1) /* AND set */
|
pat and !defined($1) /* AND set */
|
||||||
with STACK
|
with STACK
|
||||||
gen
|
gen
|
||||||
bl {LABEL, ".and"}
|
bl {LABEL, ".and"}
|
||||||
|
|
||||||
pat ior $1==4 /* OR word */
|
|
||||||
with GPR NOT_R
|
|
||||||
uses reusing %1, REG
|
|
||||||
gen
|
|
||||||
orc %a, %1, %2.reg
|
|
||||||
yields %a
|
|
||||||
with NOT_R GPR
|
|
||||||
uses reusing %2, REG
|
|
||||||
gen
|
|
||||||
orc %a, %2, %1.reg
|
|
||||||
yields %a
|
|
||||||
with GPR GPR
|
|
||||||
yields {OR_RR, %1, %2}
|
|
||||||
with GPR CONST
|
|
||||||
yields {OR_RC, %1, %2.val}
|
|
||||||
with CONST GPR
|
|
||||||
yields {OR_RC, %2, %1.val}
|
|
||||||
|
|
||||||
pat ior !defined($1) /* OR set */
|
pat ior !defined($1) /* OR set */
|
||||||
with STACK
|
with STACK
|
||||||
gen
|
gen
|
||||||
|
@ -924,72 +912,27 @@ PATTERNS
|
||||||
with GPR3 STACK
|
with GPR3 STACK
|
||||||
gen
|
gen
|
||||||
bl {LABEL, ".inn"}
|
bl {LABEL, ".inn"}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Boolean resolutions */
|
/* Boolean resolutions */
|
||||||
|
|
||||||
pat teq /* top = (top == 0) */
|
proc anyt example teq
|
||||||
with TRISTATE_ALL + GPR
|
with GPRI
|
||||||
uses reusing %1, REG
|
uses reusing %1, REG=%1
|
||||||
gen
|
gen
|
||||||
move %1, C0
|
cmp %1, {CONST, 0}
|
||||||
move C0, SCRATCH
|
mov %a, {CONST, 0}
|
||||||
move {LABEL, ".teq_table"}, %a
|
add[1] %a, {CONST, 1}
|
||||||
lwzx %a, %a, SCRATCH
|
|
||||||
yields %a
|
|
||||||
|
|
||||||
pat tne /* top = (top != 0) */
|
|
||||||
with TRISTATE_ALL + GPR
|
|
||||||
uses reusing %1, REG
|
|
||||||
gen
|
|
||||||
move %1, C0
|
|
||||||
move C0, SCRATCH
|
|
||||||
move {LABEL, ".tne_table"}, %a
|
|
||||||
lwzx %a, %a, SCRATCH
|
|
||||||
yields %a
|
|
||||||
|
|
||||||
pat tlt /* top = (top < 0) */
|
|
||||||
with TRISTATE_ALL + GPR
|
|
||||||
uses reusing %1, REG
|
|
||||||
gen
|
|
||||||
move %1, C0
|
|
||||||
move C0, SCRATCH
|
|
||||||
move {LABEL, ".tlt_table"}, %a
|
|
||||||
lwzx %a, %a, SCRATCH
|
|
||||||
yields %a
|
|
||||||
|
|
||||||
pat tle /* top = (top <= 0) */
|
|
||||||
with TRISTATE_ALL + GPR
|
|
||||||
uses reusing %1, REG
|
|
||||||
gen
|
|
||||||
move %1, C0
|
|
||||||
move C0, SCRATCH
|
|
||||||
move {LABEL, ".tle_table"}, %a
|
|
||||||
lwzx %a, %a, SCRATCH
|
|
||||||
yields %a
|
|
||||||
|
|
||||||
pat tgt /* top = (top > 0) */
|
|
||||||
with TRISTATE_ALL + GPR
|
|
||||||
uses reusing %1, REG
|
|
||||||
gen
|
|
||||||
move %1, C0
|
|
||||||
move C0, SCRATCH
|
|
||||||
move {LABEL, ".tgt_table"}, %a
|
|
||||||
lwzx %a, %a, SCRATCH
|
|
||||||
yields %a
|
yields %a
|
||||||
|
|
||||||
pat tge /* top = (top >= 0) */
|
pat cmu teq call anyt("add.eq") /* top = (top == 0) */
|
||||||
with TRISTATE_ALL + GPR
|
pat cmu tne call anyt("add.ne") /* top = (top != 0) */
|
||||||
uses reusing %1, REG
|
pat cmu tlt call anyt("add.lo") /* top = unsigned (top < 0) */
|
||||||
gen
|
pat cmu tle call anyt("add.ls") /* top = unsigned (top <= 0) */
|
||||||
move %1, C0
|
pat cmu tgt call anyt("add.hi") /* top = unsigned (top > 0) */
|
||||||
move C0, SCRATCH
|
pat cmu tge call anyt("add.hs") /* top = unsigned (top >= 0) */
|
||||||
move {LABEL, ".tge_table"}, %a
|
|
||||||
lwzx %a, %a, SCRATCH
|
|
||||||
yields %a
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1004,7 +947,9 @@ PATTERNS
|
||||||
pat zeq call anyz("b.eq") /* Branch if signed top == 0 */
|
pat zeq call anyz("b.eq") /* Branch if signed top == 0 */
|
||||||
pat zne call anyz("b.ne") /* Branch if signed top != 0 */
|
pat zne call anyz("b.ne") /* Branch if signed top != 0 */
|
||||||
pat zgt call anyz("b.gt") /* Branch if signed top > 0 */
|
pat zgt call anyz("b.gt") /* Branch if signed top > 0 */
|
||||||
pat zlt call anyz("b.lt") /* Branch if signed top > 0 */
|
pat zlt call anyz("b.lt") /* Branch if signed top < 0 */
|
||||||
|
pat zge call anyz("b.ge") /* Branch if signed top >= 0 */
|
||||||
|
pat zle call anyz("b.le") /* Branch if signed top <= 0 */
|
||||||
|
|
||||||
proc anyb example beq
|
proc anyb example beq
|
||||||
with GPR+CONST GPRI STACK
|
with GPR+CONST GPRI STACK
|
||||||
|
@ -1015,6 +960,9 @@ PATTERNS
|
||||||
pat beq call anyz("b.eq") /* Branch if signed second == top */
|
pat beq call anyz("b.eq") /* Branch if signed second == top */
|
||||||
pat bne call anyz("b.ne") /* Branch if signed second != top */
|
pat bne call anyz("b.ne") /* Branch if signed second != top */
|
||||||
pat bgt call anyz("b.gt") /* Branch if signed second > top */
|
pat bgt call anyz("b.gt") /* Branch if signed second > top */
|
||||||
|
pat bge call anyz("b.ge") /* Branch if signed second >= top */
|
||||||
|
pat blt call anyz("b.lt") /* Branch if signed second < top */
|
||||||
|
pat ble call anyz("b.le") /* Branch if signed second <= top */
|
||||||
|
|
||||||
proc anycmpb example cmu zeq
|
proc anycmpb example cmu zeq
|
||||||
with GPR+CONST GPRI STACK
|
with GPR+CONST GPRI STACK
|
||||||
|
@ -1050,7 +998,22 @@ PATTERNS
|
||||||
pat cms $1==INT32 /* Compare blocks (word sized) */
|
pat cms $1==INT32 /* Compare blocks (word sized) */
|
||||||
leaving
|
leaving
|
||||||
cmi INT32
|
cmi INT32
|
||||||
|
|
||||||
|
proc anycmf64 example teq
|
||||||
|
with STACK
|
||||||
|
uses REG
|
||||||
|
gen
|
||||||
|
bl {LABEL, ".cmf8"}
|
||||||
|
mov %a, {CONST, 0}
|
||||||
|
add[1] %a, {CONST, 1}
|
||||||
|
yields %a
|
||||||
|
|
||||||
|
pat cmf tlt $1==FLOAT64 call anyt("add.lo") /* top = unsigned (top < 0) */
|
||||||
|
pat cmf tle $1==FLOAT64 call anyt("add.ls") /* top = unsigned (top <= 0) */
|
||||||
|
pat cmf tgt $1==FLOAT64 call anyt("add.hi") /* top = unsigned (top > 0) */
|
||||||
|
pat cmf tge $1==FLOAT64 call anyt("add.hs") /* top = unsigned (top >= 0) */
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
|
|
||||||
|
@ -1121,18 +1084,19 @@ PATTERNS
|
||||||
mov SP, FP
|
mov SP, FP
|
||||||
pop FP, PC
|
pop FP, PC
|
||||||
|
|
||||||
#if 0
|
|
||||||
pat blm /* Block move constant length */
|
pat blm /* Block move constant length */
|
||||||
with GPR GPR STACK
|
with GPRI GPRI STACK
|
||||||
uses REG
|
uses REG
|
||||||
gen
|
gen
|
||||||
move {CONST, $1}, %a
|
sub SP, {CONST, 12}
|
||||||
stwu %a, {GPROFFSET, SP, 0-4}
|
mov %a, {CONST, $1}
|
||||||
stwu %2, {GPROFFSET, SP, 0-4}
|
st %1, {GPROFFSET, SP, 0}
|
||||||
stwu %1, {GPROFFSET, SP, 0-4}
|
st %2, {GPROFFSET, SP, 4}
|
||||||
|
st %a, {GPROFFSET, SP, 8}
|
||||||
bl {LABEL, "_memmove"}
|
bl {LABEL, "_memmove"}
|
||||||
addi SP, SP, {CONST, 12}
|
add SP, {CONST, 12}
|
||||||
|
|
||||||
|
#if 0
|
||||||
pat bls /* Block move variable length */
|
pat bls /* Block move variable length */
|
||||||
with GPR GPR GPR STACK
|
with GPR GPR GPR STACK
|
||||||
gen
|
gen
|
||||||
|
@ -1141,16 +1105,17 @@ PATTERNS
|
||||||
stwu %2, {GPROFFSET, SP, 0-4}
|
stwu %2, {GPROFFSET, SP, 0-4}
|
||||||
bl {LABEL, "_memmove"}
|
bl {LABEL, "_memmove"}
|
||||||
addi SP, SP, {CONST, 12}
|
addi SP, SP, {CONST, 12}
|
||||||
|
#endif
|
||||||
|
|
||||||
pat csa /* Array-lookup switch */
|
pat csa /* Array-lookup switch */
|
||||||
with GPR3 GPR4 STACK
|
with STACK
|
||||||
gen
|
gen
|
||||||
b {LABEL, ".csa"}
|
bl {LABEL, ".csa"}
|
||||||
|
|
||||||
pat csb /* Table-lookup switch */
|
pat csb /* Table-lookup switch */
|
||||||
with GPR3 GPR4 STACK
|
with STACK
|
||||||
gen
|
gen
|
||||||
b {LABEL, ".csb"}
|
bl {LABEL, ".csb"}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1179,7 +1144,7 @@ PATTERNS
|
||||||
ste ".ignmask"
|
ste ".ignmask"
|
||||||
|
|
||||||
pat trp /* Raise EM trap */
|
pat trp /* Raise EM trap */
|
||||||
with GPR3
|
with GPR0
|
||||||
gen
|
gen
|
||||||
bl {LABEL, ".trap"}
|
bl {LABEL, ".trap"}
|
||||||
|
|
||||||
|
@ -1204,7 +1169,8 @@ PATTERNS
|
||||||
with GPR
|
with GPR
|
||||||
uses reusing %1, REG
|
uses reusing %1, REG
|
||||||
gen
|
gen
|
||||||
lwz %a, {GPROFFSET, %1, FP_OFFSET}
|
ld %a, {GPROFFSET, %1, FP_OFFSET}
|
||||||
|
sub %a, GP
|
||||||
yields %a
|
yields %a
|
||||||
|
|
||||||
pat lpb /* Convert FP to argument address */
|
pat lpb /* Convert FP to argument address */
|
||||||
|
@ -1217,15 +1183,17 @@ PATTERNS
|
||||||
lpb
|
lpb
|
||||||
|
|
||||||
pat gto /* longjmp */
|
pat gto /* longjmp */
|
||||||
uses REG
|
uses REG, REG
|
||||||
gen
|
gen
|
||||||
move {LABEL, $1}, %a
|
move {LABEL, $1}, %a
|
||||||
move {IND_RC_Q, %a, 8}, FP
|
ld %b, {GPROFFSET, %a, 8}
|
||||||
move {IND_RC_Q, %a, 4}, SP
|
add FP, %b, GP
|
||||||
move {IND_RC_Q, %a, 0}, %a
|
ld %b, {GPROFFSET, %a, 4}
|
||||||
mtspr CTR, %a
|
add SP, %b, GP
|
||||||
bcctr ALWAYS, {CONST, 0}, {CONST, 0}
|
ld %b, {GPROFFSET, %a, 0}
|
||||||
|
add %b, GP
|
||||||
|
b %b
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
pat gto /* longjmp */
|
pat gto /* longjmp */
|
||||||
|
@ -1243,7 +1211,6 @@ PATTERNS
|
||||||
gen
|
gen
|
||||||
wspec {CONST, $1}
|
wspec {CONST, $1}
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pat lor $1==0 /* Load FP */
|
pat lor $1==0 /* Load FP */
|
||||||
|
|
Loading…
Add table
Reference in a new issue