Merge branch 'master' of git://factorcode.org/git/factor
[factor/jcg.git] / vm / cpu-x86.32.S
blob36db5d6c80bcdc489db117f0ff4a162a0a610429
1 #include "asm.h"
3 /* Note that primitive word definitions are compiled with
4 __attribute__((regparm 2), so the pointer to the word object is passed in EAX,
5 and the callstack top is passed in EDX */
7 #define ARG0 %eax
8 #define ARG1 %edx
9 #define STACK_REG %esp
10 #define DS_REG %esi
11 #define RETURN_REG %eax
13 #define NV_TEMP_REG %ebx
15 #define ARITH_TEMP_1 %ebp
16 #define ARITH_TEMP_2 %ebx
17 #define DIV_RESULT %eax
19 #define CELL_SIZE 4
20 #define STACK_PADDING 12
22 #define PUSH_NONVOLATILE \
23         push %ebx ; \
24         push %ebp ; \
25         push %ebp
27 #define POP_NONVOLATILE \
28         pop %ebp ; \
29         pop %ebp ; \
30         pop %ebx
32 #define QUOT_XT_OFFSET 9
34 /* We pass a function pointer to memcpy to work around a Mac OS X
35 ABI limitation which would otherwise require us to do a bizzaro PC-relative
36 trampoline to retrieve the function address */
37 DEF(void,set_callstack,(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length, void *memcpy)):
38         mov 4(%esp),%ebp                   /* to */
39         mov 8(%esp),%edx                   /* from */
40         mov 12(%esp),%ecx                  /* length */
41         mov 16(%esp),%eax                  /* memcpy */
42         sub %ecx,%ebp                      /* compute new stack pointer */
43         mov %ebp,%esp
44         push %ecx                          /* pass length */
45         push %edx                          /* pass src */
46         push %ebp                          /* pass dst */
47         call *%eax                         /* call memcpy */
48         add $12,%esp                       /* pop args from the stack */
49         ret                                /* return _with new stack_ */
51 /* cpu.x86.32 calls this */
52 DEF(bool,check_sse2,(void)):
53         push %ebx
54         mov $1,%eax
55         cpuid
56         shr $26,%edx
57         and $1,%edx
58         pop %ebx
59         mov %edx,%eax
60         ret
62 #include "cpu-x86.S"
64 #ifdef WINDOWS
65         .section .drectve
66         .ascii " -export:check_sse2"
67 #endif