]> gitweb.factorcode.org Git - factor.git/commitdiff
imul clobbers arg2 on x86.64, so stashing vm ptr on the stack
authorPhil Dawes <phil@phildawes.net>
Mon, 7 Sep 2009 17:20:43 +0000 (18:20 +0100)
committerPhil Dawes <phil@phildawes.net>
Wed, 16 Sep 2009 07:22:18 +0000 (08:22 +0100)
vm/cpu-x86.S

index a18d1483fb0dc177dd6741a0041cdc5d253c08b4..5360d6c22730248e9e29990cc686ad43dd3b80df 100644 (file)
@@ -21,7 +21,7 @@ DEF(void,primitive_fixnum_subtract,(void *myvm)):
        ret
 
 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 ARITH_TEMP_1,DIV_RESULT
        mov -CELL_SIZE(DS_REG),ARITH_TEMP_2
@@ -30,14 +30,16 @@ DEF(void,primitive_fixnum_multiply,(void *myvm)):
        imul ARITH_TEMP_2
        jo multiply_overflow
        mov DIV_RESULT,(DS_REG)
+       pop ARG2
        ret
-
 multiply_overflow:
        sar $3,ARITH_TEMP_1
        mov ARITH_TEMP_1,ARG0
        mov ARITH_TEMP_2,ARG1
+       pop ARG2
        jmp MANGLE(overflow_fixnum_multiply)
 
+
 DEF(F_FASTCALL void,c_to_factor,(CELL quot, void *vm)):
        PUSH_NONVOLATILE
        mov ARG0,NV_TEMP_REG