From b469dc29fab54a1f6f489b167886383633877600 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 13 Sep 2009 13:18:24 -0500 Subject: [PATCH] save vector registers, save control register, and enable denormals before calling factor in powerpc c_to_factor() --- vm/cpu-ppc.S | 58 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/vm/cpu-ppc.S b/vm/cpu-ppc.S index 007638189a..342ec83d7e 100644 --- a/vm/cpu-ppc.S +++ b/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