corda/src/arm.masm

77 lines
1.4 KiB
Plaintext
Raw Normal View History

AREA text, CODE, ARM
EXPORT vmNativeCall [FUNC]
vmNativeCall
; arguments:
; r0 -> r4 : function
; r1 -> r5 : stackTotal
; r2 : memoryTable
; r3 : memoryCount
; [sp, #0] -> r6 : gprTable
mov ip, sp ; save stack frame
stmfd sp!, {r4-r6, lr} ; save clobbered non-volatile regs
; mv args into non-volatile regs
mov r4, r0
mov r5, r1
ldr r6, [ip]
; setup stack arguments if necessary
sub sp, sp, r5 ; allocate stack
mov ip, sp
loop
tst r3, r3
ldrne r0, [r2], #4
strne r0, [ip], #4
subne r3, r3, #4
bne loop
; setup argument registers if necessary
tst r6, r6
ldmneia r6, {r0-r3}
blx r4 ; call function
add sp, sp, r5 ; deallocate stack
ldmfd sp!, {r4-r6, pc} ; restore non-volatile regs and return
EXPORT vmJump [FUNC]
vmJump
mov lr, r0
ldr r0, [sp]
ldr r1, [sp, #4]
mov sp, r2
mov r8, r3
bx lr
CHECKPOINT_THREAD EQU 4
CHECKPOINT_STACK EQU 24
EXPORT vmRun [FUNC]
vmRun
; r0: function
; r1: arguments
; r2: checkpoint
stmfd sp!, {r4-r11, lr}
; align stack
sub sp, sp, #12
str sp, [r2, #CHECKPOINT_STACK]
mov r12, r0
ldr r0, [r2, #CHECKPOINT_THREAD]
blx r12
EXPORT vmRun_returnAddress [FUNC]
vmRun_returnAddress
add sp, sp, #12
ldmfd sp!, {r4-r11, lr}
bx lr
EXPORT vmTrap [FUNC]
vmTrap
bkpt 3
END