! nv-reg PUSH
vm-context-offset vm-reg ctx-reg LDR-uoff
- 8 SP ctx-reg STRuoff64
+ 8 SP ctx-reg STRuoff
! ! Switch over to the spare context
! nv-reg vm-reg vm-spare-context-offset [+] MOV
! vm-reg vm-context-offset [+] nv-reg MOV
vm-spare-context-offset vm-reg ctx-reg LDR-uoff
- vm-context-offset vm-reg ctx-reg STRuoff64
+ vm-context-offset vm-reg ctx-reg STRuoff
! ! Save C callstack pointer
! nv-reg context-callstack-save-offset [+] stack-reg MOV
- 0 stack-reg temp0 ADDi64 ! MOV temp0, stack-reg
- context-callstack-save-offset ctx-reg temp0 STRuoff64
+ 0 stack-reg temp0 ADDi ! MOV temp0, stack-reg
+ context-callstack-save-offset ctx-reg temp0 STRuoff
! ! Load Factor stack pointers
! stack-reg nv-reg context-callstack-bottom-offset [+] MOV
context-callstack-bottom-offset ctx-reg temp0 LDR-uoff
- 0 temp0 stack-reg ADDi64 ! MOV stack-reg, temp0
+ 0 temp0 stack-reg ADDi ! MOV stack-reg, temp0
! rs-reg nv-reg context-retainstack-offset [+] MOV
! ds-reg nv-reg context-datastack-offset [+] MOV
vm-context-offset vm-reg ctx-reg LDR-uoff
context-callstack-save-offset ctx-reg temp0 LDR-uoff
- 0 temp0 stack-reg ADDi64 ! MOV stack-reg, temp0
+ 0 temp0 stack-reg ADDi ! MOV stack-reg, temp0
! ! Load old context
! nv-reg POP
! vm-reg vm-context-offset [+] nv-reg MOV
8 SP ctx-reg LDR-uoff
- vm-context-offset vm-reg ctx-reg STRuoff64
+ vm-context-offset vm-reg ctx-reg STRuoff
! ! Restore non-volatile registers
! nv-regs <reversed> [ POP ] each
--- /dev/null
+! Copyright (C) 2023 Doug Coleman.
+! See https://factorcode.org/license.txt for BSD license.
+USING: cpu.arm.assembler.64 cpu.arm.assembler.opcodes make
+tools.test ;
+IN: cpu.arm.assembler.64.tests
+
+{ { 0x10 0x02 0x00 0x91 } } [ [ 0 X16 X16 ADDi ] { } make ] unit-test
+{ { 0x10 0x22 0x00 0x91 } } [ [ 8 X16 X16 ADDi ] { } make ] unit-test
+{ { 0x10 0xe2 0x3f 0x91 } } [ [ 0xff8 X16 X16 ADDi ] { } make ] unit-test
: LDR-pre ( imm9 Rn Rt -- ) LDRpre64-encode ;
: LDR-post ( imm9 Rn Rt -- ) LDRpost64-encode ;
: LDR-uoff ( imm12 Rn Rt -- ) [ 8 / ] 2dip LDRuoff64-encode ;
+: LDR-literal ( imm19 Rt -- ) [ 4 / 19 bits ] dip LDRl64-encode ;
: LDP-pre ( offset register-offset register-mid register -- )
[ 8 / 7 bits ] 3dip swapd LDPpre64-encode ;
: STP-signed-offset ( offset register-offset register-mid register -- )
[ 8 / 7 bits ] 3dip swapd STPsoff64-encode ;
+: STR-pre ( imm9 Rn Rt -- )
+ [ 9 bits ] 2dip STRpre64-encode ;
+
+: STR-post ( imm9 Rn Rt -- )
+ [ 9 bits ] 2dip STRpost64-encode ;
+
: STRr ( Rm Rn Rt -- )
[ 0 0 ] 2dip STRr64-encode ;
tools.test ;
IN: cpu.arm.assembler.tests
-{ { 0x10 0x02 0x00 0x91 } } [ [ 0 X16 X16 ADDi64 ] { } make ] unit-test
-{ { 0x10 0x22 0x00 0x91 } } [ [ 8 X16 X16 ADDi64 ] { } make ] unit-test
-{ { 0x10 0xe2 0x3f 0x91 } } [ [ 0xff8 X16 X16 ADDi64 ] { } make ] unit-test
-
{ { 0xb8 0x04 0x40 0x94 } } [ [ 0x04004b8 BL ] { } make ] unit-test
{ { 0x20 0x02 0x1f 0xd6 } } [ [ X17 BR ] { } make ] unit-test