110 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
! Copyright (C) 2007, 2008 Slava Pestov.
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: bootstrap.image.private kernel namespaces system
 | 
						|
cpu.ppc.assembler generator.fixup compiler.units
 | 
						|
compiler.constants math layouts words vocabs ;
 | 
						|
IN: bootstrap.ppc
 | 
						|
 | 
						|
4 \ cell set
 | 
						|
big-endian on
 | 
						|
 | 
						|
4 jit-code-format set
 | 
						|
 | 
						|
: ds-reg 14 ;
 | 
						|
: quot-reg 3 ;
 | 
						|
: temp-reg 6 ;
 | 
						|
: aux-reg 11 ;
 | 
						|
 | 
						|
: factor-area-size 4 bootstrap-cells ;
 | 
						|
 | 
						|
: stack-frame
 | 
						|
    factor-area-size c-area-size + 4 bootstrap-cells align ;
 | 
						|
 | 
						|
: next-save stack-frame bootstrap-cell - ;
 | 
						|
: xt-save stack-frame 2 bootstrap-cells - ;
 | 
						|
 | 
						|
[
 | 
						|
    ! Load word
 | 
						|
    0 temp-reg LOAD32
 | 
						|
    temp-reg dup 0 LWZ
 | 
						|
    ! Bump profiling counter
 | 
						|
    aux-reg temp-reg profile-count-offset LWZ
 | 
						|
    aux-reg dup 1 tag-fixnum ADDI
 | 
						|
    aux-reg temp-reg profile-count-offset STW
 | 
						|
    ! Load word->code
 | 
						|
    aux-reg temp-reg word-code-offset LWZ
 | 
						|
    ! Compute word XT
 | 
						|
    aux-reg dup compiled-header-size ADDI
 | 
						|
    ! Jump to XT
 | 
						|
    aux-reg MTCTR
 | 
						|
    BCTR
 | 
						|
] rc-absolute-ppc-2/2 rt-literal 1 jit-profiling jit-define
 | 
						|
 | 
						|
[
 | 
						|
    0 temp-reg LOAD32                          ! load XT
 | 
						|
    0 MFLR                                     ! load return address
 | 
						|
    1 1 stack-frame neg ADDI                   ! create stack frame
 | 
						|
    temp-reg 1 xt-save STW                     ! save XT
 | 
						|
    stack-frame temp-reg LI                    ! load frame size
 | 
						|
    temp-reg 1 next-save STW                   ! save frame size
 | 
						|
    0 1 lr-save stack-frame + STW              ! save return address
 | 
						|
] rc-absolute-ppc-2/2 rt-label 1 jit-prolog jit-define
 | 
						|
 | 
						|
[
 | 
						|
    0 temp-reg LOAD32                          ! load literal
 | 
						|
    temp-reg dup 0 LWZ                         ! indirection
 | 
						|
    temp-reg ds-reg 4 STWU                     ! push literal
 | 
						|
] rc-absolute-ppc-2/2 rt-literal 1 jit-push-literal jit-define
 | 
						|
 | 
						|
[
 | 
						|
    0 temp-reg LOAD32                          ! load primitive address
 | 
						|
    4 1 MR                                     ! pass stack pointer to primitive
 | 
						|
    temp-reg MTCTR                             ! jump to primitive
 | 
						|
    BCTR
 | 
						|
] rc-absolute-ppc-2/2 rt-primitive 1 jit-primitive jit-define
 | 
						|
 | 
						|
[
 | 
						|
    0 BL
 | 
						|
] rc-relative-ppc-3 rt-xt 0 jit-word-call jit-define
 | 
						|
 | 
						|
[
 | 
						|
    0 B
 | 
						|
] rc-relative-ppc-3 rt-xt 0 jit-word-jump jit-define
 | 
						|
 | 
						|
: jit-call-quot ( -- )
 | 
						|
    temp-reg quot-reg quot-xt@ LWZ             ! load quotation-xt
 | 
						|
    temp-reg MTCTR                             ! jump to quotation-xt
 | 
						|
    BCTR ;
 | 
						|
 | 
						|
[
 | 
						|
    0 quot-reg LOAD32                          ! point quot-reg at false branch
 | 
						|
    temp-reg ds-reg 0 LWZ                      ! load boolean
 | 
						|
    0 temp-reg \ f tag-number CMPI             ! compare it with f
 | 
						|
    2 BNE                                      ! skip next insn if its not f
 | 
						|
    quot-reg dup 4 ADDI                        ! point quot-reg at true branch
 | 
						|
    quot-reg dup 0 LWZ                         ! load the branch
 | 
						|
    ds-reg dup 4 SUBI                          ! pop boolean
 | 
						|
    jit-call-quot
 | 
						|
] rc-absolute-ppc-2/2 rt-literal 1 jit-if-jump jit-define
 | 
						|
 | 
						|
[
 | 
						|
    0 quot-reg LOAD32                          ! load dispatch array
 | 
						|
    quot-reg dup 0 LWZ                         ! indirection
 | 
						|
    temp-reg ds-reg 0 LWZ                      ! load index
 | 
						|
    temp-reg dup 1 SRAWI                       ! turn it into an array offset
 | 
						|
    quot-reg dup temp-reg ADD                  ! compute quotation location
 | 
						|
    quot-reg dup array-start LWZ               ! load quotation
 | 
						|
    ds-reg dup 4 SUBI                          ! pop index
 | 
						|
    jit-call-quot
 | 
						|
] rc-absolute-ppc-2/2 rt-literal 1 jit-dispatch jit-define
 | 
						|
 | 
						|
[
 | 
						|
    0 1 lr-save stack-frame + LWZ              ! load return address
 | 
						|
    1 1 stack-frame ADDI                       ! pop stack frame
 | 
						|
    0 MTLR                                     ! get ready to return
 | 
						|
] f f f jit-epilog jit-define
 | 
						|
 | 
						|
[ BLR ] f f f jit-return jit-define
 | 
						|
 | 
						|
[ "bootstrap.ppc" forget-vocab ] with-compilation-unit
 |