save vector registers, save control register, and enable denormals before calling factor in powerpc c_to_factor()
parent
a61dcfc4cd
commit
b469dc29fa
58
vm/cpu-ppc.S
58
vm/cpu-ppc.S
|
@ -63,7 +63,9 @@ multiply_overflow:
|
|||
|
||||
#define SAVED_FP_REGS_SIZE 144
|
||||
|
||||
#define FRAME (RESERVED_SIZE + PARAM_SIZE + SAVED_INT_REGS_SIZE + SAVED_FP_REGS_SIZE + 8)
|
||||
#define SAVED_V_REGS_SIZE 208
|
||||
|
||||
#define FRAME (RESERVED_SIZE + PARAM_SIZE + SAVED_INT_REGS_SIZE + SAVED_FP_REGS_SIZE + SAVED_V_REGS_SIZE + 8)
|
||||
|
||||
#if defined( __APPLE__)
|
||||
#define LR_SAVE 8
|
||||
|
@ -85,6 +87,13 @@ multiply_overflow:
|
|||
#define SAVE_FP(register,offset) stfd register,SAVE_AT(offset)(r1)
|
||||
#define RESTORE_FP(register,offset) lfd register,SAVE_AT(offset)(r1)
|
||||
|
||||
#define SAVE_V(register,offset) \
|
||||
li r2,SAVE_AT(offset) XX \
|
||||
stvxl register,r2,r1
|
||||
#define RESTORE_V(register,offset) \
|
||||
li r2,SAVE_AT(offset) XX \
|
||||
lvxl register,r2,r1
|
||||
|
||||
#define PROLOGUE \
|
||||
mflr r0 XX /* get caller's return address */ \
|
||||
stwu r1,-FRAME(r1) XX /* create a stack frame to hold non-volatile registers */ \
|
||||
|
@ -95,6 +104,8 @@ multiply_overflow:
|
|||
lwz r1,0(r1) XX /* destroy the stack frame */ \
|
||||
mtlr r0 /* get ready to return */
|
||||
|
||||
|
||||
|
||||
/* We have to save and restore nonvolatile registers because
|
||||
the Factor compiler treats the entire register file as volatile. */
|
||||
DEF(void,c_to_factor,(CELL quot)):
|
||||
|
@ -137,6 +148,31 @@ DEF(void,c_to_factor,(CELL quot)):
|
|||
SAVE_FP(f30,52)
|
||||
SAVE_FP(f31,54)
|
||||
|
||||
SAVE_V(v20,56)
|
||||
SAVE_V(v21,60)
|
||||
SAVE_V(v22,64)
|
||||
SAVE_V(v23,68)
|
||||
SAVE_V(v24,72)
|
||||
SAVE_V(v25,76)
|
||||
SAVE_V(v26,80)
|
||||
SAVE_V(v27,84)
|
||||
SAVE_V(v28,88)
|
||||
SAVE_V(v29,92)
|
||||
SAVE_V(v30,96)
|
||||
SAVE_V(v31,100)
|
||||
|
||||
mfvscr v0
|
||||
li r2,SAVE_AT(104)
|
||||
stvxl v0,r2,r1
|
||||
addi r2,r2,0xc
|
||||
lwzx r4,r2,r1
|
||||
lis r5,0x1
|
||||
andc r4,r4,r5
|
||||
stwx r4,r2,r1
|
||||
subi r2,r2,0xc
|
||||
lvxl v0,r2,r1
|
||||
mtvscr v0
|
||||
|
||||
SAVE_INT(r3,19) /* save quotation since we're about to mangle it */
|
||||
|
||||
mr r3,r1 /* pass call stack pointer as an argument */
|
||||
|
@ -145,6 +181,22 @@ DEF(void,c_to_factor,(CELL quot)):
|
|||
RESTORE_INT(r3,19) /* restore quotation */
|
||||
CALL_QUOT
|
||||
|
||||
RESTORE_V(v0,104)
|
||||
mtvscr v0
|
||||
|
||||
RESTORE_V(v31,100)
|
||||
RESTORE_V(v30,96)
|
||||
RESTORE_V(v29,92)
|
||||
RESTORE_V(v28,88)
|
||||
RESTORE_V(v27,84)
|
||||
RESTORE_V(v26,80)
|
||||
RESTORE_V(v25,76)
|
||||
RESTORE_V(v24,72)
|
||||
RESTORE_V(v23,68)
|
||||
RESTORE_V(v22,64)
|
||||
RESTORE_V(v21,60)
|
||||
RESTORE_V(v20,56)
|
||||
|
||||
RESTORE_FP(f31,54)
|
||||
RESTORE_FP(f30,52)
|
||||
RESTORE_FP(f29,50)
|
||||
|
@ -260,8 +312,8 @@ DEF(void,get_ppc_vmx_env,(void*)):
|
|||
subi r4,r1,16
|
||||
li r5,0xf
|
||||
andc r4,r4,r5
|
||||
stvxl v0,0,r4
|
||||
li r5,0xc
|
||||
stvewx v0,r5,r4
|
||||
lwzx r6,r5,r4
|
||||
stw r6,0(r3)
|
||||
blr
|
||||
|
@ -273,7 +325,7 @@ DEF(void,set_ppc_vmx_env,(const void*)):
|
|||
li r5,0xc
|
||||
lwz r6,0(r3)
|
||||
stwx r6,r5,r4
|
||||
lvewx v0,r5,r4
|
||||
lvxl v0,0,r4
|
||||
mtvscr v0
|
||||
blr
|
||||
|
||||
|
|
Loading…
Reference in New Issue