]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/cpu/x86/bootstrap.factor
use radix literals
[factor.git] / basis / cpu / x86 / bootstrap.factor
index 5bb55bead0fe4d8991e08b5e41c2a1cac478900d..3c6d7ae8de60449f3cefe90b72e4eaaae5eafa89 100644 (file)
@@ -1,10 +1,10 @@
-! Copyright (C) 2007, 2010 Slava Pestov.
+! Copyright (C) 2007, 2011 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: bootstrap.image.private compiler.constants
-compiler.units cpu.x86.assembler cpu.x86.assembler.operands
-kernel kernel.private layouts locals.backend make math
-math.private namespaces sequences slots.private strings.private
-vocabs ;
+compiler.codegen.relocation compiler.units cpu.x86.assembler
+cpu.x86.assembler.operands kernel kernel.private layouts
+locals locals.backend make math math.private namespaces sequences
+slots.private strings.private vocabs ;
 IN: bootstrap.x86
 
 big-endian off
@@ -25,7 +25,7 @@ big-endian off
     jit-save-tib
 
     ! Load VM into vm-reg
-    vm-reg 0 MOV rc-absolute-cell rt-vm jit-rel
+    vm-reg 0 MOV 0 rc-absolute-cell rel-vm
 
     ! Save old context
     nv-reg vm-reg vm-context-offset [+] MOV
@@ -38,19 +38,21 @@ big-endian off
     ! Save C callstack pointer
     nv-reg context-callstack-save-offset [+] stack-reg MOV
 
-    ! Load Factor callstack pointer
+    ! Load Factor stack pointers
     stack-reg nv-reg context-callstack-bottom-offset [+] MOV
-
     nv-reg jit-update-tib
     jit-install-seh
 
+    rs-reg nv-reg context-retainstack-offset [+] MOV
+    ds-reg nv-reg context-datastack-offset [+] MOV
+
     ! Call into Factor code
-    nv-reg 0 MOV rc-absolute-cell rt-entry-point jit-rel
-    nv-reg CALL
+    link-reg 0 MOV f rc-absolute-cell rel-word
+    link-reg CALL
 
     ! Load VM into vm-reg; only needed on x86-32, but doesn't
     ! hurt on x86-64
-    vm-reg 0 MOV rc-absolute-cell rt-vm jit-rel
+    vm-reg 0 MOV 0 rc-absolute-cell rel-vm
 
     ! Load C callstack pointer
     nv-reg vm-reg vm-context-offset [+] MOV
@@ -71,25 +73,12 @@ big-endian off
     ! need a parameter here.
 
     ! See the comment for M\ x86.32 stack-cleanup in cpu.x86.32
-    HEX: ffff RET rc-absolute-2 rt-untagged jit-rel
+    0xffff RET f rc-absolute-2 rel-untagged
 ] callback-stub jit-define
 
-[
-    ! Load word
-    temp0 0 MOV rc-absolute-cell rt-literal jit-rel
-    ! Bump profiling counter
-    temp0 profile-count-offset [+] 1 tag-fixnum ADD
-    ! Load word->code
-    temp0 temp0 word-code-offset [+] MOV
-    ! Compute word entry point
-    temp0 compiled-header-size ADD
-    ! Jump to entry point
-    temp0 JMP
-] jit-profiling jit-define
-
 [
     ! load literal
-    temp0 0 MOV rc-absolute-cell rt-literal jit-rel
+    temp0 0 MOV f rc-absolute-cell rel-literal
     ! increment datastack pointer
     ds-reg bootstrap-cell ADD
     ! store literal on datastack
@@ -97,9 +86,50 @@ big-endian off
 ] jit-push jit-define
 
 [
-    0 CALL rc-relative rt-entry-point-pic jit-rel
+    0 CALL f rc-relative rel-word-pic
 ] jit-word-call jit-define
 
+! The *-signal-handler subprimitives are special-cased in vm/quotations.cpp
+! not to trigger generation of a stack frame, so they can
+! peform their own prolog/epilog preserving registers.
+
+[| |
+    jit-signal-handler-prolog :> frame-size
+    jit-save-context
+    temp0 vm-reg vm-signal-handler-addr-offset [+] MOV
+    temp0 CALL
+    frame-size jit-signal-handler-epilog
+    0 RET
+] \ signal-handler define-sub-primitive
+
+: leaf-frame-size ( -- n ) 4 bootstrap-cells ;
+
+[| |
+    jit-signal-handler-prolog :> frame-size
+    jit-save-context
+    temp0 vm-reg vm-signal-handler-addr-offset [+] MOV
+    temp0 CALL
+    frame-size jit-signal-handler-epilog
+    ! Pop the fake leaf frame along with our return address
+    leaf-frame-size bootstrap-cell - RET
+] \ leaf-signal-handler define-sub-primitive
+
+[| |
+    jit-signal-handler-prolog :> frame-size
+    temp0 vm-reg vm-signal-handler-addr-offset [+] MOV
+    temp0 CALL
+    frame-size jit-signal-handler-epilog
+    red-zone-size RET
+] \ ffi-signal-handler define-sub-primitive
+
+[| |
+    jit-signal-handler-prolog :> frame-size
+    temp0 vm-reg vm-signal-handler-addr-offset [+] MOV
+    temp0 CALL
+    frame-size jit-signal-handler-epilog
+    red-zone-size 16 bootstrap-cell - + RET
+] \ ffi-leaf-signal-handler define-sub-primitive
+
 [
     ! load boolean
     temp0 ds-reg [] MOV
@@ -108,9 +138,9 @@ big-endian off
     ! compare boolean with f
     temp0 \ f type-number CMP
     ! jump to true branch if not equal
-    0 JNE rc-relative rt-entry-point jit-rel
+    0 JNE f rc-relative rel-word
     ! jump to false branch if equal
-    0 JMP rc-relative rt-entry-point jit-rel
+    0 JMP f rc-relative rel-word
 ] jit-if jit-define
 
 : jit->r ( -- )
@@ -163,19 +193,19 @@ big-endian off
 
 [
     jit->r
-    0 CALL rc-relative rt-entry-point jit-rel
+    0 CALL f rc-relative rel-word
     jit-r>
 ] jit-dip jit-define
 
 [
     jit-2>r
-    0 CALL rc-relative rt-entry-point jit-rel
+    0 CALL f rc-relative rel-word
     jit-2r>
 ] jit-2dip jit-define
 
 [
     jit-3>r
-    0 CALL rc-relative rt-entry-point jit-rel
+    0 CALL f rc-relative rel-word
     jit-3r>
 ] jit-3dip jit-define
 
@@ -207,7 +237,7 @@ big-endian off
 
 ! Load a value from a stack position
 [
-    temp1 ds-reg HEX: 7f [+] MOV rc-absolute-1 rt-untagged jit-rel
+    temp1 ds-reg 0x7f [+] MOV f rc-absolute-1 rel-untagged
 ] pic-load jit-define
 
 [ temp1 tag-mask get AND ] pic-tag jit-define
@@ -222,10 +252,10 @@ big-endian off
 ] pic-tuple jit-define
 
 [
-    temp1 HEX: 7f CMP rc-absolute-1 rt-untagged jit-rel
+    temp1 0x7f CMP f rc-absolute-1 rel-untagged
 ] pic-check-tag jit-define
 
-[ 0 JE rc-relative rt-entry-point jit-rel ] pic-hit jit-define
+[ 0 JE f rc-relative rel-word ] pic-hit jit-define
 
 ! ! ! Megamorphic caches
 
@@ -239,7 +269,7 @@ big-endian off
     [ temp1 temp0 tuple-class-offset [+] MOV ]
     jit-conditional
     ! cache = ...
-    temp0 0 MOV rc-absolute-cell rt-literal jit-rel
+    temp0 0 MOV f rc-absolute-cell rel-literal
     ! key = hashcode(class)
     temp2 temp1 MOV
     bootstrap-cell 4 = [ temp2 1 SHR ] when
@@ -254,7 +284,7 @@ big-endian off
     [ JNE ]
     [
         ! megamorphic_cache_hits++
-        temp1 0 MOV rc-absolute-cell rt-megamorphic-cache-hits jit-rel
+        temp1 0 MOV rc-absolute-cell rel-megamorphic-cache-hits
         temp1 [] 1 ADD
         ! goto get(cache + bootstrap-cell)
         temp0 temp0 bootstrap-cell [+] MOV
@@ -416,8 +446,7 @@ big-endian off
 ! Comparisons
 : jit-compare ( insn -- )
     ! load t
-    t jit-literal
-    temp3 0 MOV rc-absolute-cell rt-literal jit-rel
+    temp3 0 MOV t rc-absolute-cell rel-literal
     ! load f
     temp1 \ f type-number MOV
     ! load first value
@@ -465,7 +494,7 @@ big-endian off
     ! multiply
     temp0 temp1 IMUL2
     ! push result
-    ds-reg [] temp1 MOV
+    ds-reg [] temp0 MOV
 ] \ fixnum*fast define-sub-primitive
 
 [ \ AND jit-math ] \ fixnum-bitand define-sub-primitive
@@ -548,7 +577,7 @@ big-endian off
     temp0 ds-reg [] MOV
     ds-reg bootstrap-cell SUB
     temp0 ds-reg [] OR
-    temp0 tag-mask get AND
+    temp0 tag-mask get TEST
     temp0 \ f type-number MOV
     temp1 1 tag-fixnum MOV
     temp0 temp1 CMOVE