corda/src/compile.S

134 lines
1.9 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
2007-12-11 21:26:59 +00:00
// %rdi: thread
// %rsi: function
// %rdx: stack
// %rcx: stackSize
// %r8 : returnType
mov %rdi,%rbx
2007-12-20 01:42:12 +00:00
// copy memory arguments into place
pushq %rcx
2007-12-11 21:26:59 +00:00
movq $0,%r9
jmp test
loop:
push (%rdx,%r9,8)
inc %r9
test:
2007-12-11 21:26:59 +00:00
cmpq %rcx,%r9
jb loop
// call function
2007-12-11 21:26:59 +00:00
call *%rsi
// pop arguments
2007-12-20 01:42:12 +00:00
mov -16(%rbp),%rcx
sal $3,%rcx
addq %rcx,%rsp
// pop argument stack size
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
movq %rcx,%rbx
2007-10-04 22:41:19 +00:00
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
2007-12-11 21:26:59 +00:00
// 8(%ebp): thread
// 12(%ebp): function
// 16(%ebp): stack
// 20(%ebp): stackSize
// 24(%ebp): returnType
mov 8(%ebp),%ebx
// copy arguments into place
movl $0,%ecx
jmp test
loop:
2007-12-20 01:42:12 +00:00
push (%edx,%ecx,4)
inc %ecx
test:
2007-12-11 21:26:59 +00:00
cmpl 20(%ebp),%ecx
jb loop
// call function
2007-12-11 21:26:59 +00:00
call *12(%ebp)
// pop arguments
2007-12-20 01:42:12 +00:00
mov 20(%ebp),%ecx
sal $2,%ecx
addl %ecx,%esp
// handle return value based on expected type
2007-12-11 21:26:59 +00:00
movl 24(%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 16(%esp),%ebx
2007-12-20 01:42:12 +00:00
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