Updating non-optimizing PowerPC backend for register variable removal (untested)
							parent
							
								
									4d70649914
								
							
						
					
					
						commit
						285caff08e
					
				| 
						 | 
				
			
			@ -12,6 +12,7 @@ big-endian on
 | 
			
		|||
 | 
			
		||||
CONSTANT: ds-reg 13
 | 
			
		||||
CONSTANT: rs-reg 14
 | 
			
		||||
CONSTANT: vm-reg 15
 | 
			
		||||
 | 
			
		||||
: factor-area-size ( -- n ) 4 bootstrap-cells ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -25,9 +26,15 @@ CONSTANT: rs-reg 14
 | 
			
		|||
    [ '[ bootstrap-cell /i 1 + @ ] ] dip jit-conditional ; inline
 | 
			
		||||
 | 
			
		||||
: jit-save-context ( -- )
 | 
			
		||||
    0 3 LOAD32 rc-absolute-ppc-2/2 rt-context jit-rel
 | 
			
		||||
    4 3 0 LWZ
 | 
			
		||||
    1 4 0 STW ;
 | 
			
		||||
    4 vm-reg 0 LWZ
 | 
			
		||||
    1 4 0 STW
 | 
			
		||||
    ds-reg vm-reg 8 STW
 | 
			
		||||
    rs-reg vm-reg 12 STW ;
 | 
			
		||||
 | 
			
		||||
: jit-load-context ( -- )
 | 
			
		||||
    4 vm-reg 0 LWZ
 | 
			
		||||
    ds-reg vm-reg 8 LWZ
 | 
			
		||||
    rs-reg vm-reg 12 LWZ ;
 | 
			
		||||
 | 
			
		||||
[
 | 
			
		||||
    0 3 LOAD32 rc-absolute-ppc-2/2 rt-literal jit-rel
 | 
			
		||||
| 
						 | 
				
			
			@ -57,10 +64,11 @@ CONSTANT: rs-reg 14
 | 
			
		|||
 | 
			
		||||
[
 | 
			
		||||
    jit-save-context
 | 
			
		||||
    0 3 LOAD32 rc-absolute-ppc-2/2 rt-vm jit-rel
 | 
			
		||||
    3 vm-reg MR
 | 
			
		||||
    0 4 LOAD32 rc-absolute-ppc-2/2 rt-primitive jit-rel
 | 
			
		||||
    4 MTLR
 | 
			
		||||
    BLRL
 | 
			
		||||
    jit-load-context
 | 
			
		||||
] jit-primitive jit-define
 | 
			
		||||
 | 
			
		||||
[ 0 BL rc-relative-ppc-3 rt-xt-pic jit-rel ] jit-word-call jit-define
 | 
			
		||||
| 
						 | 
				
			
			@ -235,7 +243,7 @@ CONSTANT: rs-reg 14
 | 
			
		|||
[
 | 
			
		||||
    3 ds-reg 0 LWZ
 | 
			
		||||
    ds-reg dup 4 SUBI
 | 
			
		||||
    0 4 LOAD32 0 rc-absolute-ppc-2/2 jit-vm
 | 
			
		||||
    4 vm-reg MR
 | 
			
		||||
    5 3 quot-xt-offset LWZ
 | 
			
		||||
]
 | 
			
		||||
[ 5 MTLR BLRL ]
 | 
			
		||||
| 
						 | 
				
			
			@ -502,7 +510,7 @@ CONSTANT: rs-reg 14
 | 
			
		|||
: jit-inline-cache-miss ( -- )
 | 
			
		||||
    jit-save-context
 | 
			
		||||
    3 6 MR
 | 
			
		||||
    0 4 LOAD32 0 rc-absolute-ppc-2/2 jit-vm
 | 
			
		||||
    4 vm-reg MR
 | 
			
		||||
    0 5 LOAD32 "inline_cache_miss" f rc-absolute-ppc-2/2 jit-dlsym
 | 
			
		||||
    5 MTLR
 | 
			
		||||
    BLRL ;
 | 
			
		||||
| 
						 | 
				
			
			@ -529,10 +537,10 @@ CONSTANT: rs-reg 14
 | 
			
		|||
    6 ds-reg 0 STW
 | 
			
		||||
    [ BNO ]
 | 
			
		||||
    [
 | 
			
		||||
       0 5 LOAD32 0 rc-absolute-ppc-2/2 jit-vm
 | 
			
		||||
       0 6 LOAD32 func f rc-absolute-ppc-2/2 jit-dlsym
 | 
			
		||||
       6 MTLR
 | 
			
		||||
       BLRL
 | 
			
		||||
        5 vm-reg MR
 | 
			
		||||
        0 6 LOAD32 func f rc-absolute-ppc-2/2 jit-dlsym
 | 
			
		||||
        6 MTLR
 | 
			
		||||
        BLRL
 | 
			
		||||
    ]
 | 
			
		||||
    jit-conditional* ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -553,7 +561,7 @@ CONSTANT: rs-reg 14
 | 
			
		|||
    [ BNO ]
 | 
			
		||||
    [
 | 
			
		||||
        4 4 tag-bits get SRAWI
 | 
			
		||||
        0 5 LOAD32 0 rc-absolute-ppc-2/2 jit-vm
 | 
			
		||||
        5 vm-reg MR
 | 
			
		||||
        0 6 LOAD32 "overflow_fixnum_multiply" f rc-absolute-ppc-2/2 jit-dlsym
 | 
			
		||||
        6 MTLR
 | 
			
		||||
        BLRL
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										193
									
								
								vm/cpu-ppc.S
								
								
								
								
							
							
						
						
									
										193
									
								
								vm/cpu-ppc.S
								
								
								
								
							| 
						 | 
				
			
			@ -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_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 FPRs */
 | 
			
		||||
	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,set_callstack,(void *vm, stack_frame *to, stack_frame *from, cell length, void *memcpy)):
 | 
			
		||||
	/* Compute new stack pointer */
 | 
			
		||||
	sub r1,r4,r6
 | 
			
		||||
 | 
			
		||||
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 */
 | 
			
		||||
	/* 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
 | 
			
		||||
	JUMP_QUOT	   /* call the quotation */
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
	/* 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.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue