save vector registers, save control register, and enable denormals before calling factor in powerpc c_to_factor()

db4
Joe Groff 2009-09-13 13:18:24 -05:00
parent a61dcfc4cd
commit b469dc29fa
1 changed files with 55 additions and 3 deletions

View File

@ -63,7 +63,9 @@ multiply_overflow:
#define SAVED_FP_REGS_SIZE 144 #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__) #if defined( __APPLE__)
#define LR_SAVE 8 #define LR_SAVE 8
@ -85,6 +87,13 @@ multiply_overflow:
#define SAVE_FP(register,offset) stfd register,SAVE_AT(offset)(r1) #define SAVE_FP(register,offset) stfd register,SAVE_AT(offset)(r1)
#define RESTORE_FP(register,offset) lfd 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 \ #define PROLOGUE \
mflr r0 XX /* get caller's return address */ \ mflr r0 XX /* get caller's return address */ \
stwu r1,-FRAME(r1) XX /* create a stack frame to hold non-volatile registers */ \ 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 */ \ lwz r1,0(r1) XX /* destroy the stack frame */ \
mtlr r0 /* get ready to return */ mtlr r0 /* get ready to return */
/* We have to save and restore nonvolatile registers because /* We have to save and restore nonvolatile registers because
the Factor compiler treats the entire register file as volatile. */ the Factor compiler treats the entire register file as volatile. */
DEF(void,c_to_factor,(CELL quot)): DEF(void,c_to_factor,(CELL quot)):
@ -137,6 +148,31 @@ DEF(void,c_to_factor,(CELL quot)):
SAVE_FP(f30,52) SAVE_FP(f30,52)
SAVE_FP(f31,54) 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 */ SAVE_INT(r3,19) /* save quotation since we're about to mangle it */
mr r3,r1 /* pass call stack pointer as an argument */ 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 */ RESTORE_INT(r3,19) /* restore quotation */
CALL_QUOT 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(f31,54)
RESTORE_FP(f30,52) RESTORE_FP(f30,52)
RESTORE_FP(f29,50) RESTORE_FP(f29,50)
@ -260,8 +312,8 @@ DEF(void,get_ppc_vmx_env,(void*)):
subi r4,r1,16 subi r4,r1,16
li r5,0xf li r5,0xf
andc r4,r4,r5 andc r4,r4,r5
stvxl v0,0,r4
li r5,0xc li r5,0xc
stvewx v0,r5,r4
lwzx r6,r5,r4 lwzx r6,r5,r4
stw r6,0(r3) stw r6,0(r3)
blr blr
@ -273,7 +325,7 @@ DEF(void,set_ppc_vmx_env,(const void*)):
li r5,0xc li r5,0xc
lwz r6,0(r3) lwz r6,0(r3)
stwx r6,r5,r4 stwx r6,r5,r4
lvewx v0,r5,r4 lvxl v0,0,r4
mtvscr v0 mtvscr v0
blr blr