corda/src/compile.S

136 lines
2.0 KiB
ArmAsm
Raw Normal View History

#include "types.h"
.text
#ifdef __x86_64__
2007-10-04 00:41:54 +00:00
.globl vmInvoke
vmInvoke:
pushq %rbp
movq %rsp,%rbp
// rbx is a callee-saved register (so are r12-r15, but we don't use those)
pushq %rbx
// %rdi: function
// %rsi: stack
// %rdx: stackSize
// %rcx: returnType
// reserve space for arguments
pushq %rdx
subq %rdx,%rsp
// copy memory arguments into place
movq $0,%r8
jmp test
loop:
movq %r8,%rax
movq %r8,%r9
addq %rsp,%r9
addq %rsi,%rax
movq (%rax),%rax
movq %rax,(%r9)
addq $8,%r8
test:
cmpq %rdx,%r8
jb loop
// call function
call *%rdi
// pop arguments
addq -16(%rbp),%rsp
addq $8,%rsp
popq %rbx
movq %rbp,%rsp
popq %rbp
ret
2007-10-04 00:41:54 +00:00
.globl vmJump
vmJump:
2007-10-04 22:41:19 +00:00
movq %rsi,%rbp
movq %rdx,%rsp
jmp *%rdi
#elif defined __i386__
2007-10-04 00:41:54 +00:00
.globl vmInvoke
vmInvoke:
pushl %ebp
movl %esp,%ebp
// ebx, esi and edi are callee-saved registers
pushl %ebx
pushl %esi
pushl %edi
// 8(%ebp): function
// 12(%ebp): stack
// 16(%ebp): stackSize
// 20(%ebp): returnType
// reserve space for arguments
subl 16(%ebp),%esp
// copy arguments into place
movl $0,%ecx
jmp test
loop:
movl %ecx,%eax
movl %ecx,%edx
addl %esp,%edx
addl 12(%ebp),%eax
movl (%eax),%eax
movl %eax,(%edx)
addl $4,%ecx
test:
cmpl 16(%ebp),%ecx
jb loop
// call function
call *8(%ebp)
// pop arguments
addl 16(%ebp),%esp
// handle return value based on expected type
movl 20(%ebp),%ecx
void:
cmpl $VOID_TYPE,%ecx
jne int64
jmp exit
int64:
cmpl $INT64_TYPE,%ecx
jne int32
jmp exit
int32:
movl $0,%edx
exit:
popl %edi
popl %esi
popl %ebx
movl %ebp,%esp
popl %ebp
ret
2007-10-04 00:41:54 +00:00
.globl vmJump
vmJump:
2007-10-04 03:19:39 +00:00
movl 4(%esp),%eax
2007-10-04 22:41:19 +00:00
movl 8(%esp),%ebp
movl 12(%esp),%esp
2007-10-04 03:19:39 +00:00
jmp *%eax
2007-10-04 00:41:54 +00:00
#else
# error unsupported platform
#endif