factor/vm/cpu-x86.S

117 lines
2.4 KiB
ArmAsm
Raw Normal View History

DEF(void,primitive_fixnum_add,(void)):
2009-09-14 04:14:48 -04:00
mov (DS_REG),ARG0
mov -CELL_SIZE(DS_REG),ARG1
sub $CELL_SIZE,DS_REG
mov ARG1,ARITH_TEMP_1
add ARG0,ARITH_TEMP_1
jo MANGLE(overflow_fixnum_add)
mov ARITH_TEMP_1,(DS_REG)
ret
DEF(void,primitive_fixnum_subtract,(void)):
2009-09-14 04:14:48 -04:00
mov (DS_REG),ARG1
mov -CELL_SIZE(DS_REG),ARG0
sub $CELL_SIZE,DS_REG
mov ARG0,ARITH_TEMP_1
sub ARG1,ARITH_TEMP_1
jo MANGLE(overflow_fixnum_subtract)
mov ARITH_TEMP_1,(DS_REG)
ret
DEF(void,primitive_fixnum_multiply,(void)):
2009-09-14 04:14:48 -04:00
mov (DS_REG),ARITH_TEMP_1
mov ARITH_TEMP_1,DIV_RESULT
mov -CELL_SIZE(DS_REG),ARITH_TEMP_2
sar $3,ARITH_TEMP_2
sub $CELL_SIZE,DS_REG
imul ARITH_TEMP_2
jo multiply_overflow
mov DIV_RESULT,(DS_REG)
ret
multiply_overflow:
2009-09-14 04:14:48 -04:00
sar $3,ARITH_TEMP_1
mov ARITH_TEMP_1,ARG0
mov ARITH_TEMP_2,ARG1
jmp MANGLE(overflow_fixnum_multiply)
2007-09-27 16:10:37 -04:00
DEF(F_FASTCALL void,c_to_factor,(CELL quot)):
2007-09-21 23:30:47 -04:00
PUSH_NONVOLATILE
2008-11-08 21:32:23 -05:00
mov ARG0,NV_TEMP_REG
2008-11-07 21:33:32 -05:00
/* Create register shadow area for Win64 */
2008-11-08 21:32:23 -05:00
sub $32,STACK_REG
/* Save stack pointer */
lea -CELL_SIZE(STACK_REG),ARG0
2007-09-20 18:09:08 -04:00
call MANGLE(save_callstack_bottom)
2008-11-07 21:33:32 -05:00
/* Call quot-xt */
2008-11-08 21:32:23 -05:00
mov NV_TEMP_REG,ARG0
2008-11-07 21:33:32 -05:00
call *QUOT_XT_OFFSET(ARG0)
2007-09-20 18:09:08 -04:00
2008-11-08 21:32:23 -05:00
/* Tear down register shadow area */
add $32,STACK_REG
2007-09-21 23:30:47 -04:00
POP_NONVOLATILE
2007-09-20 18:09:08 -04:00
ret
2007-09-27 16:10:37 -04:00
DEF(F_FASTCALL void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to)):
/* clear x87 stack, but preserve rounding mode and exception flags */
sub $2,STACK_REG
fnstcw (STACK_REG)
fninit
fldcw (STACK_REG)
2008-11-07 21:33:32 -05:00
/* rewind_to */
mov ARG1,STACK_REG
jmp *QUOT_XT_OFFSET(ARG0)
2007-09-26 00:34:37 -04:00
2009-04-28 04:48:37 -04:00
DEF(F_FASTCALL void,lazy_jit_compile,(CELL quot)):
2007-09-26 00:34:37 -04:00
mov STACK_REG,ARG1 /* Save stack pointer */
2008-11-07 21:33:32 -05:00
sub $STACK_PADDING,STACK_REG
call MANGLE(lazy_jit_compile_impl)
2007-09-26 00:34:37 -04:00
mov RETURN_REG,ARG0 /* No-op on 32-bit */
2008-11-07 21:33:32 -05:00
add $STACK_PADDING,STACK_REG
jmp *QUOT_XT_OFFSET(ARG0) /* Call the quotation */
2007-10-04 12:56:12 -04:00
/* cpu.x86.features calls this */
DEF(bool,sse_version,(void)):
mov $0x1,RETURN_REG
cpuid
2009-09-14 04:14:48 -04:00
/* test $0x100000,%ecx
jnz sse_42
test $0x80000,%ecx
jnz sse_41
test $0x200,%ecx
jnz ssse_3 */
test $0x1,%ecx
jnz sse_3
test $0x4000000,%edx
jnz sse_2
test $0x2000000,%edx
jnz sse_1
mov $0,%eax
ret
sse_42:
2009-09-14 04:14:48 -04:00
mov $42,RETURN_REG
ret
sse_41:
2009-09-14 04:14:48 -04:00
mov $41,RETURN_REG
ret
ssse_3:
2009-09-14 04:14:48 -04:00
mov $33,RETURN_REG
ret
sse_3:
2009-09-14 04:14:48 -04:00
mov $30,RETURN_REG
ret
sse_2:
2009-09-14 04:14:48 -04:00
mov $20,RETURN_REG
ret
sse_1:
2009-09-14 04:14:48 -04:00
mov $10,RETURN_REG
ret
2007-10-06 18:09:22 -04:00
#ifdef WINDOWS
.section .drectve
.ascii " -export:sse_version"
2007-10-06 18:09:22 -04:00
.ascii " -export:c_to_factor"
#endif