]> gitweb.factorcode.org Git - factor.git/commitdiff
Updating non-optimizing PowerPC backend for register variable removal (untested)
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 27 Dec 2009 23:40:45 +0000 (12:40 +1300)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 27 Dec 2009 23:40:45 +0000 (12:40 +1300)
basis/cpu/ppc/bootstrap.factor
vm/cpu-ppc.S

index 40fa5c4b7876e03e84157aa909d39be7cc96bb01..fc525b7f4ebe3493b04cc8b3b2dc11e2c06ac3b4 100644 (file)
@@ -12,6 +12,7 @@ big-endian on
 \r
 CONSTANT: ds-reg 13\r
 CONSTANT: rs-reg 14\r
+CONSTANT: vm-reg 15\r
 \r
 : factor-area-size ( -- n ) 4 bootstrap-cells ;\r
 \r
@@ -25,9 +26,15 @@ CONSTANT: rs-reg 14
     [ '[ bootstrap-cell /i 1 + @ ] ] dip jit-conditional ; inline\r
 \r
 : jit-save-context ( -- )\r
-    0 3 LOAD32 rc-absolute-ppc-2/2 rt-context jit-rel\r
-    4 3 0 LWZ\r
-    1 4 0 STW ;\r
+    4 vm-reg 0 LWZ\r
+    1 4 0 STW\r
+    ds-reg vm-reg 8 STW\r
+    rs-reg vm-reg 12 STW ;\r
+\r
+: jit-load-context ( -- )\r
+    4 vm-reg 0 LWZ\r
+    ds-reg vm-reg 8 LWZ\r
+    rs-reg vm-reg 12 LWZ ;\r
 \r
 [\r
     0 3 LOAD32 rc-absolute-ppc-2/2 rt-literal jit-rel\r
@@ -57,10 +64,11 @@ CONSTANT: rs-reg 14
 \r
 [\r
     jit-save-context\r
-    0 3 LOAD32 rc-absolute-ppc-2/2 rt-vm jit-rel\r
+    3 vm-reg MR\r
     0 4 LOAD32 rc-absolute-ppc-2/2 rt-primitive jit-rel\r
     4 MTLR\r
     BLRL\r
+    jit-load-context\r
 ] jit-primitive jit-define\r
 \r
 [ 0 BL rc-relative-ppc-3 rt-xt-pic jit-rel ] jit-word-call jit-define\r
@@ -235,7 +243,7 @@ CONSTANT: rs-reg 14
 [\r
     3 ds-reg 0 LWZ\r
     ds-reg dup 4 SUBI\r
-    0 4 LOAD32 0 rc-absolute-ppc-2/2 jit-vm\r
+    4 vm-reg MR\r
     5 3 quot-xt-offset LWZ\r
 ]\r
 [ 5 MTLR BLRL ]\r
@@ -502,7 +510,7 @@ CONSTANT: rs-reg 14
 : jit-inline-cache-miss ( -- )\r
     jit-save-context\r
     3 6 MR\r
-    0 4 LOAD32 0 rc-absolute-ppc-2/2 jit-vm\r
+    4 vm-reg MR\r
     0 5 LOAD32 "inline_cache_miss" f rc-absolute-ppc-2/2 jit-dlsym\r
     5 MTLR\r
     BLRL ;\r
@@ -529,10 +537,10 @@ CONSTANT: rs-reg 14
     6 ds-reg 0 STW\r
     [ BNO ]\r
     [\r
-       0 5 LOAD32 0 rc-absolute-ppc-2/2 jit-vm\r
-       0 6 LOAD32 func f rc-absolute-ppc-2/2 jit-dlsym\r
-       6 MTLR\r
-       BLRL\r
+        5 vm-reg MR\r
+        0 6 LOAD32 func f rc-absolute-ppc-2/2 jit-dlsym\r
+        6 MTLR\r
+        BLRL\r
     ]\r
     jit-conditional* ;\r
 \r
@@ -553,7 +561,7 @@ CONSTANT: rs-reg 14
     [ BNO ]\r
     [\r
         4 4 tag-bits get SRAWI\r
-        0 5 LOAD32 0 rc-absolute-ppc-2/2 jit-vm\r
+        5 vm-reg MR\r
         0 6 LOAD32 "overflow_fixnum_multiply" f rc-absolute-ppc-2/2 jit-dlsym\r
         6 MTLR\r
         BLRL\r
index 9517154e1a6d601d84ff2a41af5cc0c34d143d66..ba3b5a55d3564cad946df213a2e08bedf6f0e053 100644 (file)
@@ -3,6 +3,8 @@ in the public domain. */
 #include "asm.h"
 
 #define DS_REG r13
+#define RS_REG r14
+#define VM_REG r15
 
 #define CALL_OR_JUMP_QUOT \
        lwz r11,12(r3)     /* load quotation-xt slot */ XX \
@@ -70,25 +72,27 @@ the Factor compiler treats the entire register file as volatile. */
 DEF(void,c_to_factor,(cell quot, void *vm)):
        PROLOGUE
 
-       SAVE_INT(r15,0)    /* save GPRs */
-       SAVE_INT(r16,1)
-       SAVE_INT(r17,2)
-       SAVE_INT(r18,3)
-       SAVE_INT(r19,4)
-       SAVE_INT(r20,5)
-       SAVE_INT(r21,6)
-       SAVE_INT(r22,7)
-       SAVE_INT(r23,8)
-       SAVE_INT(r24,9)
-       SAVE_INT(r25,10)
-       SAVE_INT(r26,11)
-       SAVE_INT(r27,12)
-       SAVE_INT(r28,13)
-       SAVE_INT(r29,14)
-       SAVE_INT(r30,15)
-       SAVE_INT(r31,16)
-
-       SAVE_FP(f14,20) /* save FPRs */
+       SAVE_INT(r13,0)
+       SAVE_INT(r14,1)
+       SAVE_INT(VM_REG,2)
+       SAVE_INT(r16,3)
+       SAVE_INT(r17,4)
+       SAVE_INT(r18,5)
+       SAVE_INT(r19,6)
+       SAVE_INT(r20,7)
+       SAVE_INT(r21,8)
+       SAVE_INT(r22,9)
+       SAVE_INT(r23,10)
+       SAVE_INT(r24,11)
+       SAVE_INT(r25,12)
+       SAVE_INT(r26,13)
+       SAVE_INT(r27,14)
+       SAVE_INT(r28,15)
+       SAVE_INT(r29,16)
+       SAVE_INT(r30,17)
+       SAVE_INT(r31,18)
+
+       SAVE_FP(f14,20)
        SAVE_FP(f15,22)
        SAVE_FP(f16,24)
        SAVE_FP(f17,26)
@@ -133,19 +137,31 @@ DEF(void,c_to_factor,(cell quot, void *vm)):
        lvxl v0,r2,r1
        mtvscr v0
 
-       /* save args in non-volatile regs */
-       mr r15,r3
-       mr r16,r4
 
-       /* pass call stack pointer as an argument */
-       mr r3,r1
-       bl MANGLE(save_callstack_bottom)
+       /* Load context */
+       mr VM_REG,r4
+       lwz r16,0(VM_REG)
+
+       /* Load ctx->datastack */
+       lwz DS_REG,8(r16)
+
+       /* Load ctx->retainstack */
+       lwz RS_REG,12(r16)
+
+       /* Save ctx->callstack_bottom */
+       stw r1,4(r16)
 
-       /* restore quotation args */
-       mr r3,r15
-       mr r4,r16
        CALL_QUOT
 
+       /* Load context */
+       lwz r16,0(VM_REG)
+
+       /* Save ctx->datastack */
+       stw DS_REG,8(r16)
+
+       /* Save ctx->retainstack */
+       stw RS_REG,12(r16)
+
        RESTORE_V(v0,104)
        mtvscr v0
 
@@ -162,7 +178,6 @@ DEF(void,c_to_factor,(cell quot, void *vm)):
        RESTORE_V(v21,60)
        RESTORE_V(v20,56)
 
-       /* Restore FPRs */
        RESTORE_FP(f31,54)
        RESTORE_FP(f30,52)
        RESTORE_FP(f29,50)
@@ -182,56 +197,100 @@ DEF(void,c_to_factor,(cell quot, void *vm)):
        RESTORE_FP(f15,22)
        RESTORE_FP(f14,20)
 
-       /* restore GPRs */
-       RESTORE_INT(r31,16)   
-       RESTORE_INT(r30,15)
-       RESTORE_INT(r29,14)
-       RESTORE_INT(r28,13)
-       RESTORE_INT(r27,12)
-       RESTORE_INT(r26,11)
-       RESTORE_INT(r25,10)
-       RESTORE_INT(r24,9)
-       RESTORE_INT(r23,8)
-       RESTORE_INT(r22,7)
-       RESTORE_INT(r21,6)
-       RESTORE_INT(r20,5)
-       RESTORE_INT(r19,4)
-       RESTORE_INT(r18,3)
-       RESTORE_INT(r17,2)
-       RESTORE_INT(r16,1)
-       RESTORE_INT(r15,0)
+       RESTORE_INT(r31,18)
+       RESTORE_INT(r30,17)
+       RESTORE_INT(r29,16)
+       RESTORE_INT(r28,15)
+       RESTORE_INT(r27,14)
+       RESTORE_INT(r26,13)
+       RESTORE_INT(r25,12)
+       RESTORE_INT(r24,11)
+       RESTORE_INT(r23,10)
+       RESTORE_INT(r22,9)
+       RESTORE_INT(r21,8)
+       RESTORE_INT(r20,7)
+       RESTORE_INT(r19,6)
+       RESTORE_INT(r18,5)
+       RESTORE_INT(r17,4)
+       RESTORE_INT(r16,3)
+       RESTORE_INT(VM_REG,2)
+       RESTORE_INT(r14,1)
+       RESTORE_INT(r13,0)
 
        EPILOGUE
        blr
 
-/* We pass a function pointer to memcpy in r6 to work around a Mac OS X ABI
-limitation which would otherwise require us to do a bizzaro PC-relative
-trampoline to retrieve the function address */
-DEF(void,set_callstack,(F_STACK_FRAME *to, F_STACK_FRAME *from, cell length, void *memcpy)):
-       sub r1,r3,r5       /* compute new stack pointer */
-       mr r3,r1           /* start of destination of memcpy() */
-       stwu r1,-64(r1)    /* setup fake stack frame for memcpy() */
-       mtlr r6            /* prepare to call memcpy() */
-       blrl               /* go */
-       lwz r1,0(r1)       /* tear down fake stack frame */
-       lwz r0,LR_SAVE(r1) /* we have restored the stack; load return address */
-       mtlr r0            /* prepare to return to restored callstack */
-       blr                /* go */
-
-DEF(void,throw_impl,(cell quot, F_STACK_FRAME *rewind_to, void *vm)):
-       mr r1,r4           /* compute new stack pointer */
-       mr r4,r5           /* make vm ptr 2nd arg in case quot_xt = lazy_jit_compile */
-       lwz r0,LR_SAVE(r1) /* we have rewound the stack; load return address */
+DEF(void,set_callstack,(void *vm, stack_frame *to, stack_frame *from, cell length, void *memcpy)):
+       /* Compute new stack pointer */
+       sub r1,r4,r6
+
+       /* Call memcpy() */
+       mr r4,r1
+       stwu r1,-64(r1)
+       mtlr r7
+       blrl
+       lwz r1,0(r1)
+
+       /* Load context */
+       mr VM_REG,r3
+       lwz r16,0(VM_REG)
+
+       /* Load ctx->datastack */
+       lwz DS_REG,8(r16)
+
+       /* Load ctx->retainstack */
+       lwz RS_REG,12(r16)
+
+       /* We have changed the stack; load return address again */
+       lwz r0,LR_SAVE(r1)
+       mtlr r0
+       blr
+
+DEF(void,throw_impl,(cell quot, void *new_stack, void *vm)):
+       /* compute new stack pointer */
+       mr r1,r4
+
+       /* make vm ptr 2nd arg in case quot->xt == lazy_jit_compile */
+       mr r4,r5
+
+       /* Load context */
+       mr VM_REG,r5
+       lwz r16,0(VM_REG)
+
+       /* Load ctx->datastack */
+       lwz DS_REG,8(r16)
+
+       /* Load ctx->retainstack */
+       lwz RS_REG,12(r16)
+
+       /* We have changed the stack; load return address again */
+       lwz r0,LR_SAVE(r1)
        mtlr r0
-       JUMP_QUOT          /* call the quotation */
+
+       /* Call the quotation */
+       JUMP_QUOT
 
 DEF(void,lazy_jit_compile_impl,(cell quot, void *vm)):
-       mr r5,r4           /* vm ptr is 3rd arg */
-       mr r4,r1           /* save stack pointer */
+       /* Load context */
+       mr VM_REG,r4
+       lwz r16,0(VM_REG)
+
+       /* Save ctx->datastack */
+       stw DS_REG,8(r16)
+
+       /* Save ctx->retainstack */
+       stw RS_REG,12(r16)
+
+       /* Save ctx->callstack_top */
+       stw r1,0(r16)
+
+       /* Compile quotation */
        PROLOGUE
        bl MANGLE(lazy_jit_compile)
        EPILOGUE
-       JUMP_QUOT          /* call the quotation */
+
+       /* Call the quotation */
+       JUMP_QUOT
 
 /* Thanks to Joshua Grams for this code.