]> gitweb.factorcode.org Git - factor.git/commitdiff
arm: implement prolog and epilog
authorDoug Coleman <doug.coleman@gmail.com>
Sat, 27 Mar 2021 04:14:25 +0000 (23:14 -0500)
committerDoug Coleman <doug.coleman@gmail.com>
Sat, 27 Mar 2021 04:14:25 +0000 (23:14 -0500)
prolog should decrement stack ptr and save the link register in the stack frame
epilog should restore the link register, inc stack ptr and jump

basis/bootstrap/assembler/arm.64.factor
basis/cpu/arm/assembler/assembler.factor

index 9f3e63304a1fb812e08c7c3962b00d37bbfcbae0..438edbe6babb39c65ca3cbd93cc5b6fde23d45f9 100644 (file)
@@ -25,7 +25,8 @@ big-endian off
 ! x29/fp       Non-volatile    Frame pointer
 ! x30/lr       Non-volatile    Link registers
 
-: stack-frame-size ( -- n ) 4 bootstrap-cells ;
+! varargs https://developer.arm.com/documentation/ihi0055/d/?lang=en
+: stack-frame-size ( -- n ) 8 bootstrap-cells ;
 : volatile-regs ( -- seq ) { X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 } ;
 ! windows arm - X18 is non-volatile https://docs.microsoft.com/en-us/cpp/build/arm64-windows-abi-conventions?view=msvc-160
 : nv-regs ( -- seq ) { X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30 } ;
@@ -98,7 +99,7 @@ big-endian off
 : stack-reg ( -- reg ) SP ;
 ! https://developer.arm.com/documentation/dui0801/a/Overview-of-AArch64-state/Link-registers
 : link-reg ( -- reg ) X30 ; ! LR
-: stack-frame-reg ( -- reg ) X29 ; ! FP
+: stack-frame-reg ( -- reg ) X29 ; ! FP
 : vm-reg ( -- reg ) X28 ;
 : ds-reg ( -- reg ) X27 ;
 : rs-reg ( -- reg ) X26 ;
@@ -598,12 +599,22 @@ big-endian off
 ] JIT-EXECUTE jit-define
 
 [
-    ! stack-reg stack-framrcee-size bootstrap-cell - SUB
-    stack-frame-size bootstrap-cell - stack-reg stack-reg SUBi64
+    ! x64 ! stack-reg stack-frame-size bootstrap-cell - SUB
+
+
+    ! : link-reg ( -- reg ) X30 ; ! LR
+    ! : stack-frame-reg ( -- reg ) X29 ; ! FP
+
+    ! ! make room for LR plus magic number of callback, 16byte align
+    stack-frame-size bootstrap-cell 2 * + stack-reg stack-reg SUBi64
+    ! link-reg X29 stack-reg STP
+    -16 SP link-reg X29 STP-pre
 ] JIT-PROLOG jit-define
 
 [
-    ! stack-reg stack-frame-size bootstrap-cell - ADD
+    ! x64 ! stack-reg stack-frame-size bootstrap-cell - ADD
+    -16 SP link-reg X29 LDP-pre
+    stack-frame-size bootstrap-cell 2 * + stack-reg stack-reg ADDi64
 ] JIT-EPILOG jit-define
 
 [
index 68430468404a722d611d33bca3fa88cdd4dd8958..b2454f076808693f5e47c8136226902443d6aba4 100644 (file)
@@ -41,6 +41,16 @@ ERROR: arm64-encoding-imm original n-bits-requested truncated ;
 : STP-signed-offset ( offset register-offset register-mid register -- )
     [ 8 / 7 bits ] 3dip swapd STPsoff64-encode ;
 
+
+: LDP-pre ( offset register-offset register-mid register -- )
+    [ 8 / 7 bits ] 3dip swapd LDPpre64-encode ;
+
+: LDP-post ( offset register-offset register-mid register -- )
+    [ 8 / 7 bits ] 3dip swapd LDPpost64-encode ;
+
+: LDP-signed-offset ( offset register-offset register-mid register -- )
+    [ 8 / 7 bits ] 3dip swapd LDPsoff64-encode ;
+
 ! Some instructions allow an immediate literal of n bits
 ! or n bits shifted. This means there are invalid immediate
 ! values, e.g. imm12 of 1, 4096, but not 4097