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