[
! Load word
- temp-reg 0 MOV
+ temp0 0 MOV
! Bump profiling counter
- temp-reg profile-count-offset [+] 1 tag-fixnum ADD
+ temp0 profile-count-offset [+] 1 tag-fixnum ADD
! Load word->code
- temp-reg temp-reg word-code-offset [+] MOV
+ temp0 temp0 word-code-offset [+] MOV
! Compute word XT
- temp-reg compiled-header-size ADD
+ temp0 compiled-header-size ADD
! Jump to XT
- temp-reg JMP
+ temp0 JMP
] rc-absolute-cell rt-immediate 1 rex-length + jit-profiling jit-define
[
- temp-reg 0 MOV ! load XT
- stack-frame-size PUSH ! save stack frame size
- temp-reg PUSH ! push XT
- stack-reg stack-frame-size 3 bootstrap-cells - SUB ! alignment
+ ! load XT
+ temp0 0 MOV
+ ! save stack frame size
+ stack-frame-size PUSH
+ ! push XT
+ temp0 PUSH
+ ! alignment
+ stack-reg stack-frame-size 3 bootstrap-cells - SUB
] rc-absolute-cell rt-label 1 rex-length + jit-prolog jit-define
[
- arg0 0 MOV ! load literal
- ds-reg bootstrap-cell ADD ! increment datastack pointer
- ds-reg [] arg0 MOV ! store literal on datastack
+ ! load literal
+ temp0 0 MOV
+ ! increment datastack pointer
+ ds-reg bootstrap-cell ADD
+ ! store literal on datastack
+ ds-reg [] temp0 MOV
] rc-absolute-cell rt-immediate 1 rex-length + jit-push-immediate jit-define
[
] rc-relative rt-xt 1 jit-word-call jit-define
[
- arg0 ds-reg [] MOV ! load boolean
- ds-reg bootstrap-cell SUB ! pop boolean
- arg0 \ f tag-number CMP ! compare boolean with f
- f JNE ! jump to true branch if not equal
+ ! load boolean
+ temp0 ds-reg [] MOV
+ ! pop boolean
+ ds-reg bootstrap-cell SUB
+ ! compare boolean with f
+ temp0 \ f tag-number CMP
+ ! jump to true branch if not equal
+ f JNE
] rc-relative rt-xt 10 rex-length 3 * + jit-if-1 jit-define
[
- f JMP ! jump to false branch if equal
+ ! jump to false branch if equal
+ f JMP
] rc-relative rt-xt 1 jit-if-2 jit-define
[
- arg1 0 MOV ! load dispatch table
- arg0 ds-reg [] MOV ! load index
- fixnum>slot@ ! turn it into an array offset
- ds-reg bootstrap-cell SUB ! pop index
- arg0 arg1 ADD ! compute quotation location
- arg0 arg0 array-start-offset [+] MOV ! load quotation
- arg0 quot-xt-offset [+] JMP ! execute branch
+ ! load dispatch table
+ temp1 0 MOV
+ ! load index
+ temp0 ds-reg [] MOV
+ ! turn it into an array offset
+ fixnum>slot@
+ ! pop index
+ ds-reg bootstrap-cell SUB
+ ! compute quotation location
+ temp0 temp1 ADD
+ ! load quotation
+ temp0 temp0 array-start-offset [+] MOV
+ ! execute branch
+ temp0 quot-xt-offset [+] JMP
] rc-absolute-cell rt-immediate 1 rex-length + jit-dispatch jit-define
: jit->r ( -- )
rs-reg bootstrap-cell ADD
- arg0 ds-reg [] MOV
+ temp0 ds-reg [] MOV
ds-reg bootstrap-cell SUB
- rs-reg [] arg0 MOV ;
+ rs-reg [] temp0 MOV ;
: jit-2>r ( -- )
rs-reg 2 bootstrap-cells ADD
- arg0 ds-reg [] MOV
- arg1 ds-reg -1 bootstrap-cells [+] MOV
+ temp0 ds-reg [] MOV
+ temp1 ds-reg -1 bootstrap-cells [+] MOV
ds-reg 2 bootstrap-cells SUB
- rs-reg [] arg0 MOV
- rs-reg -1 bootstrap-cells [+] arg1 MOV ;
+ rs-reg [] temp0 MOV
+ rs-reg -1 bootstrap-cells [+] temp1 MOV ;
: jit-3>r ( -- )
rs-reg 3 bootstrap-cells ADD
- arg0 ds-reg [] MOV
- arg1 ds-reg -1 bootstrap-cells [+] MOV
- arg2 ds-reg -2 bootstrap-cells [+] MOV
+ temp0 ds-reg [] MOV
+ temp1 ds-reg -1 bootstrap-cells [+] MOV
+ temp2 ds-reg -2 bootstrap-cells [+] MOV
ds-reg 3 bootstrap-cells SUB
- rs-reg [] arg0 MOV
- rs-reg -1 bootstrap-cells [+] arg1 MOV
- rs-reg -2 bootstrap-cells [+] arg2 MOV ;
+ rs-reg [] temp0 MOV
+ rs-reg -1 bootstrap-cells [+] temp1 MOV
+ rs-reg -2 bootstrap-cells [+] temp2 MOV ;
: jit-r> ( -- )
ds-reg bootstrap-cell ADD
- arg0 rs-reg [] MOV
+ temp0 rs-reg [] MOV
rs-reg bootstrap-cell SUB
- ds-reg [] arg0 MOV ;
+ ds-reg [] temp0 MOV ;
: jit-2r> ( -- )
ds-reg 2 bootstrap-cells ADD
- arg0 rs-reg [] MOV
- arg1 rs-reg -1 bootstrap-cells [+] MOV
+ temp0 rs-reg [] MOV
+ temp1 rs-reg -1 bootstrap-cells [+] MOV
rs-reg 2 bootstrap-cells SUB
- ds-reg [] arg0 MOV
- ds-reg -1 bootstrap-cells [+] arg1 MOV ;
+ ds-reg [] temp0 MOV
+ ds-reg -1 bootstrap-cells [+] temp1 MOV ;
: jit-3r> ( -- )
ds-reg 3 bootstrap-cells ADD
- arg0 rs-reg [] MOV
- arg1 rs-reg -1 bootstrap-cells [+] MOV
- arg2 rs-reg -2 bootstrap-cells [+] MOV
+ temp0 rs-reg [] MOV
+ temp1 rs-reg -1 bootstrap-cells [+] MOV
+ temp2 rs-reg -2 bootstrap-cells [+] MOV
rs-reg 3 bootstrap-cells SUB
- ds-reg [] arg0 MOV
- ds-reg -1 bootstrap-cells [+] arg1 MOV
- ds-reg -2 bootstrap-cells [+] arg2 MOV ;
+ ds-reg [] temp0 MOV
+ ds-reg -1 bootstrap-cells [+] temp1 MOV
+ ds-reg -2 bootstrap-cells [+] temp2 MOV ;
[
jit->r
] rc-relative rt-xt 17 rex-length 6 * + jit-2dip jit-define
[
- jit-3>r
+ jit-3>r
f CALL
jit-3r>
] rc-relative rt-xt 23 rex-length 8 * + jit-3dip jit-define
[
- stack-reg stack-frame-size bootstrap-cell - ADD ! unwind stack frame
+ ! unwind stack frame
+ stack-reg stack-frame-size bootstrap-cell - ADD
] f f f jit-epilog jit-define
[ 0 RET ] f f f jit-return jit-define
! Quotations and words
[
- arg0 ds-reg [] MOV ! load from stack
- ds-reg bootstrap-cell SUB ! pop stack
- arg0 quot-xt-offset [+] JMP ! call quotation
+ ! load from stack
+ temp0 ds-reg [] MOV
+ ! pop stack
+ ds-reg bootstrap-cell SUB
+ ! call quotation
+ temp0 quot-xt-offset [+] JMP
] f f f \ (call) define-sub-primitive
[
- arg0 ds-reg [] MOV ! load from stack
- ds-reg bootstrap-cell SUB ! pop stack
- arg0 word-xt-offset [+] JMP ! execute word
+ ! load from stack
+ temp0 ds-reg [] MOV
+ ! pop stack
+ ds-reg bootstrap-cell SUB
+ ! execute word
+ temp0 word-xt-offset [+] JMP
] f f f \ (execute) define-sub-primitive
! Objects
[
- arg1 ds-reg [] MOV ! load from stack
- arg1 tag-mask get AND ! compute tag
- arg1 tag-bits get SHL ! tag the tag
- ds-reg [] arg1 MOV ! push to stack
+ ! load from stack
+ temp0 ds-reg [] MOV
+ ! compute tag
+ temp0 tag-mask get AND
+ ! tag the tag
+ temp0 tag-bits get SHL
+ ! push to stack
+ ds-reg [] temp0 MOV
] f f f \ tag define-sub-primitive
[
- arg0 ds-reg [] MOV ! load slot number
- ds-reg bootstrap-cell SUB ! adjust stack pointer
- arg1 ds-reg [] MOV ! load object
- fixnum>slot@ ! turn slot number into offset
- arg1 tag-bits get SHR ! mask off tag
- arg1 tag-bits get SHL
- arg0 arg1 arg0 [+] MOV ! load slot value
- ds-reg [] arg0 MOV ! push to stack
+ ! load slot number
+ temp0 ds-reg [] MOV
+ ! adjust stack pointer
+ ds-reg bootstrap-cell SUB
+ ! load object
+ temp1 ds-reg [] MOV
+ ! turn slot number into offset
+ fixnum>slot@
+ ! mask off tag
+ temp1 tag-bits get SHR
+ temp1 tag-bits get SHL
+ ! load slot value
+ temp0 temp1 temp0 [+] MOV
+ ! push to stack
+ ds-reg [] temp0 MOV
] f f f \ slot define-sub-primitive
! Shufflers
] f f f \ 3drop define-sub-primitive
[
- arg0 ds-reg [] MOV
+ temp0 ds-reg [] MOV
ds-reg bootstrap-cell ADD
- ds-reg [] arg0 MOV
+ ds-reg [] temp0 MOV
] f f f \ dup define-sub-primitive
[
- arg0 ds-reg [] MOV
- arg1 ds-reg bootstrap-cell neg [+] MOV
+ temp0 ds-reg [] MOV
+ temp1 ds-reg bootstrap-cell neg [+] MOV
ds-reg 2 bootstrap-cells ADD
- ds-reg [] arg0 MOV
- ds-reg bootstrap-cell neg [+] arg1 MOV
+ ds-reg [] temp0 MOV
+ ds-reg bootstrap-cell neg [+] temp1 MOV
] f f f \ 2dup define-sub-primitive
[
- arg0 ds-reg [] MOV
- arg1 ds-reg -1 bootstrap-cells [+] MOV
- temp-reg ds-reg -2 bootstrap-cells [+] MOV
+ temp0 ds-reg [] MOV
+ temp1 ds-reg -1 bootstrap-cells [+] MOV
+ temp3 ds-reg -2 bootstrap-cells [+] MOV
ds-reg 3 bootstrap-cells ADD
- ds-reg [] arg0 MOV
- ds-reg -1 bootstrap-cells [+] arg1 MOV
- ds-reg -2 bootstrap-cells [+] temp-reg MOV
+ ds-reg [] temp0 MOV
+ ds-reg -1 bootstrap-cells [+] temp1 MOV
+ ds-reg -2 bootstrap-cells [+] temp3 MOV
] f f f \ 3dup define-sub-primitive
[
- arg0 ds-reg [] MOV
+ temp0 ds-reg [] MOV
ds-reg bootstrap-cell SUB
- ds-reg [] arg0 MOV
+ ds-reg [] temp0 MOV
] f f f \ nip define-sub-primitive
[
- arg0 ds-reg [] MOV
+ temp0 ds-reg [] MOV
ds-reg 2 bootstrap-cells SUB
- ds-reg [] arg0 MOV
+ ds-reg [] temp0 MOV
] f f f \ 2nip define-sub-primitive
[
- arg0 ds-reg -1 bootstrap-cells [+] MOV
+ temp0 ds-reg -1 bootstrap-cells [+] MOV
ds-reg bootstrap-cell ADD
- ds-reg [] arg0 MOV
+ ds-reg [] temp0 MOV
] f f f \ over define-sub-primitive
[
- arg0 ds-reg -2 bootstrap-cells [+] MOV
+ temp0 ds-reg -2 bootstrap-cells [+] MOV
ds-reg bootstrap-cell ADD
- ds-reg [] arg0 MOV
+ ds-reg [] temp0 MOV
] f f f \ pick define-sub-primitive
[
- arg0 ds-reg [] MOV
- arg1 ds-reg -1 bootstrap-cells [+] MOV
- ds-reg [] arg1 MOV
+ temp0 ds-reg [] MOV
+ temp1 ds-reg -1 bootstrap-cells [+] MOV
+ ds-reg [] temp1 MOV
ds-reg bootstrap-cell ADD
- ds-reg [] arg0 MOV
+ ds-reg [] temp0 MOV
] f f f \ dupd define-sub-primitive
[
- arg0 ds-reg [] MOV
- arg1 ds-reg -1 bootstrap-cells [+] MOV
+ temp0 ds-reg [] MOV
+ temp1 ds-reg -1 bootstrap-cells [+] MOV
ds-reg bootstrap-cell ADD
- ds-reg [] arg0 MOV
- ds-reg -1 bootstrap-cells [+] arg1 MOV
- ds-reg -2 bootstrap-cells [+] arg0 MOV
+ ds-reg [] temp0 MOV
+ ds-reg -1 bootstrap-cells [+] temp1 MOV
+ ds-reg -2 bootstrap-cells [+] temp0 MOV
] f f f \ tuck define-sub-primitive
[
- arg0 ds-reg [] MOV
- arg1 ds-reg bootstrap-cell neg [+] MOV
- ds-reg bootstrap-cell neg [+] arg0 MOV
- ds-reg [] arg1 MOV
+ temp0 ds-reg [] MOV
+ temp1 ds-reg bootstrap-cell neg [+] MOV
+ ds-reg bootstrap-cell neg [+] temp0 MOV
+ ds-reg [] temp1 MOV
] f f f \ swap define-sub-primitive
[
- arg0 ds-reg -1 bootstrap-cells [+] MOV
- arg1 ds-reg -2 bootstrap-cells [+] MOV
- ds-reg -2 bootstrap-cells [+] arg0 MOV
- ds-reg -1 bootstrap-cells [+] arg1 MOV
+ temp0 ds-reg -1 bootstrap-cells [+] MOV
+ temp1 ds-reg -2 bootstrap-cells [+] MOV
+ ds-reg -2 bootstrap-cells [+] temp0 MOV
+ ds-reg -1 bootstrap-cells [+] temp1 MOV
] f f f \ swapd define-sub-primitive
[
- arg0 ds-reg [] MOV
- arg1 ds-reg -1 bootstrap-cells [+] MOV
- temp-reg ds-reg -2 bootstrap-cells [+] MOV
- ds-reg -2 bootstrap-cells [+] arg1 MOV
- ds-reg -1 bootstrap-cells [+] arg0 MOV
- ds-reg [] temp-reg MOV
+ temp0 ds-reg [] MOV
+ temp1 ds-reg -1 bootstrap-cells [+] MOV
+ temp3 ds-reg -2 bootstrap-cells [+] MOV
+ ds-reg -2 bootstrap-cells [+] temp1 MOV
+ ds-reg -1 bootstrap-cells [+] temp0 MOV
+ ds-reg [] temp3 MOV
] f f f \ rot define-sub-primitive
[
- arg0 ds-reg [] MOV
- arg1 ds-reg -1 bootstrap-cells [+] MOV
- temp-reg ds-reg -2 bootstrap-cells [+] MOV
- ds-reg -2 bootstrap-cells [+] arg0 MOV
- ds-reg -1 bootstrap-cells [+] temp-reg MOV
- ds-reg [] arg1 MOV
+ temp0 ds-reg [] MOV
+ temp1 ds-reg -1 bootstrap-cells [+] MOV
+ temp3 ds-reg -2 bootstrap-cells [+] MOV
+ ds-reg -2 bootstrap-cells [+] temp0 MOV
+ ds-reg -1 bootstrap-cells [+] temp3 MOV
+ ds-reg [] temp1 MOV
] f f f \ -rot define-sub-primitive
[ jit->r ] f f f \ >r define-sub-primitive
! Comparisons
: jit-compare ( insn -- )
- temp-reg 0 MOV ! load t
- arg1 \ f tag-number MOV ! load f
- arg0 ds-reg [] MOV ! load first value
- ds-reg bootstrap-cell SUB ! adjust stack pointer
- ds-reg [] arg0 CMP ! compare with second value
- [ arg1 temp-reg ] dip execute ! move t if true
- ds-reg [] arg1 MOV ! store
- ;
+ ! load t
+ temp3 0 MOV
+ ! load f
+ temp1 \ f tag-number MOV
+ ! load first value
+ temp0 ds-reg [] MOV
+ ! adjust stack pointer
+ ds-reg bootstrap-cell SUB
+ ! compare with second value
+ ds-reg [] temp0 CMP
+ ! move t if true
+ [ temp1 temp3 ] dip execute
+ ! store
+ ds-reg [] temp1 MOV ;
: define-jit-compare ( insn word -- )
[ [ jit-compare ] curry rc-absolute-cell rt-immediate 1 rex-length + ] dip
! Math
: jit-math ( insn -- )
- arg0 ds-reg [] MOV ! load second input
- ds-reg bootstrap-cell SUB ! pop stack
- [ ds-reg [] arg0 ] dip execute ! compute result
- ;
+ ! load second input
+ temp0 ds-reg [] MOV
+ ! pop stack
+ ds-reg bootstrap-cell SUB
+ ! compute result
+ [ ds-reg [] temp0 ] dip execute ;
[ \ ADD jit-math ] f f f \ fixnum+fast define-sub-primitive
[ \ SUB jit-math ] f f f \ fixnum-fast define-sub-primitive
[
- arg0 ds-reg [] MOV ! load second input
- ds-reg bootstrap-cell SUB ! pop stack
- arg1 ds-reg [] MOV ! load first input
- arg0 tag-bits get SAR ! untag second input
- arg0 arg1 IMUL2 ! multiply
- ds-reg [] arg1 MOV ! push result
+ ! load second input
+ temp0 ds-reg [] MOV
+ ! pop stack
+ ds-reg bootstrap-cell SUB
+ ! load first input
+ temp1 ds-reg [] MOV
+ ! untag second input
+ temp0 tag-bits get SAR
+ ! multiply
+ temp0 temp1 IMUL2
+ ! push result
+ ds-reg [] temp1 MOV
] f f f \ fixnum*fast define-sub-primitive
[ \ AND jit-math ] f f f \ fixnum-bitand define-sub-primitive
[ \ XOR jit-math ] f f f \ fixnum-bitxor define-sub-primitive
[
- ds-reg [] NOT ! complement
- ds-reg [] tag-mask get XOR ! clear tag bits
+ ! complement
+ ds-reg [] NOT
+ ! clear tag bits
+ ds-reg [] tag-mask get XOR
] f f f \ fixnum-bitnot define-sub-primitive
[
- shift-arg ds-reg [] MOV ! load shift count
- shift-arg tag-bits get SAR ! untag shift count
- ds-reg bootstrap-cell SUB ! adjust stack pointer
- temp-reg ds-reg [] MOV ! load value
- arg1 temp-reg MOV ! make a copy
- arg1 CL SHL ! compute positive shift value in arg1
- shift-arg NEG ! compute negative shift value in arg0
- temp-reg CL SAR
- temp-reg tag-mask get bitnot AND
- shift-arg 0 CMP ! if shift count was negative, move arg0 to arg1
- arg1 temp-reg CMOVGE
- ds-reg [] arg1 MOV ! push to stack
+ ! load shift count
+ shift-arg ds-reg [] MOV
+ ! untag shift count
+ shift-arg tag-bits get SAR
+ ! adjust stack pointer
+ ds-reg bootstrap-cell SUB
+ ! load value
+ temp3 ds-reg [] MOV
+ ! make a copy
+ temp1 temp3 MOV
+ ! compute positive shift value in temp1
+ temp1 CL SHL
+ shift-arg NEG
+ ! compute negative shift value in temp3
+ temp3 CL SAR
+ temp3 tag-mask get bitnot AND
+ shift-arg 0 CMP
+ ! if shift count was negative, move temp0 to temp1
+ temp1 temp3 CMOVGE
+ ! push to stack
+ ds-reg [] temp1 MOV
] f f f \ fixnum-shift-fast define-sub-primitive
: jit-fixnum-/mod ( -- )
- temp-reg ds-reg [] MOV ! load second parameter
- div-arg ds-reg bootstrap-cell neg [+] MOV ! load first parameter
- mod-arg div-arg MOV ! make a copy
- mod-arg bootstrap-cell-bits 1- SAR ! sign-extend
- temp-reg IDIV ; ! divide
+ ! load second parameter
+ temp3 ds-reg [] MOV
+ ! load first parameter
+ div-arg ds-reg bootstrap-cell neg [+] MOV
+ ! make a copy
+ mod-arg div-arg MOV
+ ! sign-extend
+ mod-arg bootstrap-cell-bits 1- SAR
+ ! divide
+ temp3 IDIV ;
[
jit-fixnum-/mod
- ds-reg bootstrap-cell SUB ! adjust stack pointer
- ds-reg [] mod-arg MOV ! push to stack
+ ! adjust stack pointer
+ ds-reg bootstrap-cell SUB
+ ! push to stack
+ ds-reg [] mod-arg MOV
] f f f \ fixnum-mod define-sub-primitive
[
jit-fixnum-/mod
- ds-reg bootstrap-cell SUB ! adjust stack pointer
- div-arg tag-bits get SHL ! tag it
- ds-reg [] div-arg MOV ! push to stack
+ ! adjust stack pointer
+ ds-reg bootstrap-cell SUB
+ ! tag it
+ div-arg tag-bits get SHL
+ ! push to stack
+ ds-reg [] div-arg MOV
] f f f \ fixnum/i-fast define-sub-primitive
[
jit-fixnum-/mod
- div-arg tag-bits get SHL ! tag it
- ds-reg [] mod-arg MOV ! push to stack
+ ! tag it
+ div-arg tag-bits get SHL
+ ! push to stack
+ ds-reg [] mod-arg MOV
ds-reg bootstrap-cell neg [+] div-arg MOV
] f f f \ fixnum/mod-fast define-sub-primitive
[
- arg0 ds-reg [] MOV
+ temp0 ds-reg [] MOV
ds-reg bootstrap-cell SUB
- arg0 ds-reg [] OR
- arg0 tag-mask get AND
- arg0 \ f tag-number MOV
- arg1 1 tag-fixnum MOV
- arg0 arg1 CMOVE
- ds-reg [] arg0 MOV
+ temp0 ds-reg [] OR
+ temp0 tag-mask get AND
+ temp0 \ f tag-number MOV
+ temp1 1 tag-fixnum MOV
+ temp0 temp1 CMOVE
+ ds-reg [] temp0 MOV
] f f f \ both-fixnums? define-sub-primitive
[
- arg0 ds-reg [] MOV ! load local number
- fixnum>slot@ ! turn local number into offset
- arg0 rs-reg arg0 [+] MOV ! load local value
- ds-reg [] arg0 MOV ! push to stack
+ ! load local number
+ temp0 ds-reg [] MOV
+ ! turn local number into offset
+ fixnum>slot@
+ ! load local value
+ temp0 rs-reg temp0 [+] MOV
+ ! push to stack
+ ds-reg [] temp0 MOV
] f f f \ get-local define-sub-primitive
[
- arg0 ds-reg [] MOV ! load local count
- ds-reg bootstrap-cell SUB ! adjust stack pointer
- fixnum>slot@ ! turn local number into offset
- rs-reg arg0 SUB ! decrement retain stack pointer
+ ! load local count
+ temp0 ds-reg [] MOV
+ ! adjust stack pointer
+ ds-reg bootstrap-cell SUB
+ ! turn local number into offset
+ fixnum>slot@
+ ! decrement retain stack pointer
+ rs-reg temp0 SUB
] f f f \ drop-locals define-sub-primitive
[ "bootstrap.x86" forget-vocab ] with-compilation-unit