]> gitweb.factorcode.org Git - factor.git/blob - vm/cpu-x86.S
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / vm / cpu-x86.S
1 DEF(void,primitive_fixnum_add,(void)):
2         mov (DS_REG),ARG0
3         mov -CELL_SIZE(DS_REG),ARG1
4         sub $CELL_SIZE,DS_REG
5         mov ARG1,ARITH_TEMP_1
6         add ARG0,ARITH_TEMP_1
7         jo MANGLE(overflow_fixnum_add)
8         mov ARITH_TEMP_1,(DS_REG)
9         ret
10
11 DEF(void,primitive_fixnum_subtract,(void)):
12         mov (DS_REG),ARG1
13         mov -CELL_SIZE(DS_REG),ARG0
14         sub $CELL_SIZE,DS_REG
15         mov ARG0,ARITH_TEMP_1
16         sub ARG1,ARITH_TEMP_1
17         jo MANGLE(overflow_fixnum_subtract)
18         mov ARITH_TEMP_1,(DS_REG)
19         ret
20
21 DEF(void,primitive_fixnum_multiply,(void)):
22         mov (DS_REG),ARITH_TEMP_1
23         mov ARITH_TEMP_1,DIV_RESULT
24         mov -CELL_SIZE(DS_REG),ARITH_TEMP_2
25         sar $3,ARITH_TEMP_2
26         sub $CELL_SIZE,DS_REG
27         imul ARITH_TEMP_2
28         jo multiply_overflow
29         mov DIV_RESULT,(DS_REG)
30         ret
31 multiply_overflow:
32         sar $3,ARITH_TEMP_1
33         mov ARITH_TEMP_1,ARG0
34         mov ARITH_TEMP_2,ARG1
35         jmp MANGLE(overflow_fixnum_multiply)
36
37 DEF(F_FASTCALL void,c_to_factor,(CELL quot)):
38         PUSH_NONVOLATILE
39         mov ARG0,NV_TEMP_REG
40
41         /* Create register shadow area for Win64 */
42         sub $32,STACK_REG
43
44         /* Save stack pointer */
45         lea -CELL_SIZE(STACK_REG),ARG0
46         call MANGLE(save_callstack_bottom)
47
48         /* Call quot-xt */
49         mov NV_TEMP_REG,ARG0
50         call *QUOT_XT_OFFSET(ARG0)
51
52         /* Tear down register shadow area */
53         add $32,STACK_REG
54
55         POP_NONVOLATILE
56         ret
57
58 DEF(F_FASTCALL void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to)):
59         /* clear x87 stack, but preserve rounding mode and exception flags */
60         sub $2,STACK_REG
61         fnstcw (STACK_REG)
62         fninit
63         fldcw (STACK_REG)
64         /* rewind_to */
65         mov ARG1,STACK_REG                    
66         jmp *QUOT_XT_OFFSET(ARG0)
67
68 DEF(F_FASTCALL void,lazy_jit_compile,(CELL quot)):
69         mov STACK_REG,ARG1           /* Save stack pointer */
70         sub $STACK_PADDING,STACK_REG
71         call MANGLE(lazy_jit_compile_impl)
72         mov RETURN_REG,ARG0          /* No-op on 32-bit */
73         add $STACK_PADDING,STACK_REG
74         jmp *QUOT_XT_OFFSET(ARG0)    /* Call the quotation */
75
76 /* cpu.x86.features calls this */
77 DEF(bool,sse_version,(void)):
78         mov $0x1,RETURN_REG
79         cpuid
80         /* test $0x100000,%ecx
81         jnz sse_42
82         test $0x80000,%ecx
83         jnz sse_41
84         test $0x200,%ecx
85         jnz ssse_3 */
86         test $0x1,%ecx
87         jnz sse_3
88         test $0x4000000,%edx
89         jnz sse_2
90         test $0x2000000,%edx
91         jnz sse_1
92         mov $0,%eax
93         ret
94 sse_42:
95         mov $42,RETURN_REG
96         ret
97 sse_41:
98         mov $41,RETURN_REG
99         ret
100 ssse_3:
101         mov $33,RETURN_REG
102         ret
103 sse_3:
104         mov $30,RETURN_REG
105         ret
106 sse_2:
107         mov $20,RETURN_REG
108         ret
109 sse_1:
110         mov $10,RETURN_REG
111         ret
112 #ifdef WINDOWS
113         .section .drectve
114         .ascii " -export:sse_version"
115         .ascii " -export:c_to_factor"
116 #endif