]> gitweb.factorcode.org Git - factor.git/commitdiff
save vector registers, save control register, and enable denormals before calling...
authorJoe Groff <arcata@gmail.com>
Sun, 13 Sep 2009 18:18:24 +0000 (13:18 -0500)
committerJoe Groff <arcata@gmail.com>
Sun, 13 Sep 2009 18:18:24 +0000 (13:18 -0500)
vm/cpu-ppc.S

index 007638189a6a03a39eff8f716d1ca2bcaa2261a2..342ec83d7eabe64d6e6740a376b9744ab4c82f4a 100644 (file)
@@ -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