imul clobbers arg2 on x86.64, so stashing vm ptr on the stack

db4
Phil Dawes 2009-09-07 18:20:43 +01:00
parent a8d1e5187d
commit 8049b441c2
1 changed files with 4 additions and 2 deletions

View File

@ -21,7 +21,7 @@ DEF(void,primitive_fixnum_subtract,(void *myvm)):
ret ret
DEF(void,primitive_fixnum_multiply,(void *myvm)): DEF(void,primitive_fixnum_multiply,(void *myvm)):
mov ARG0, ARG2 /* save vm ptr for overflow */ push ARG0 /* save vm ptr for overflow */
mov (DS_REG),ARITH_TEMP_1 mov (DS_REG),ARITH_TEMP_1
mov ARITH_TEMP_1,DIV_RESULT mov ARITH_TEMP_1,DIV_RESULT
mov -CELL_SIZE(DS_REG),ARITH_TEMP_2 mov -CELL_SIZE(DS_REG),ARITH_TEMP_2
@ -30,14 +30,16 @@ DEF(void,primitive_fixnum_multiply,(void *myvm)):
imul ARITH_TEMP_2 imul ARITH_TEMP_2
jo multiply_overflow jo multiply_overflow
mov DIV_RESULT,(DS_REG) mov DIV_RESULT,(DS_REG)
pop ARG2
ret ret
multiply_overflow: multiply_overflow:
sar $3,ARITH_TEMP_1 sar $3,ARITH_TEMP_1
mov ARITH_TEMP_1,ARG0 mov ARITH_TEMP_1,ARG0
mov ARITH_TEMP_2,ARG1 mov ARITH_TEMP_2,ARG1
pop ARG2
jmp MANGLE(overflow_fixnum_multiply) jmp MANGLE(overflow_fixnum_multiply)
DEF(F_FASTCALL void,c_to_factor,(CELL quot, void *vm)): DEF(F_FASTCALL void,c_to_factor,(CELL quot, void *vm)):
PUSH_NONVOLATILE PUSH_NONVOLATILE
mov ARG0,NV_TEMP_REG mov ARG0,NV_TEMP_REG