]> gitweb.factorcode.org Git - factor.git/commitdiff
asm math functions pass vm ptr to overflow function in 3rd arg (X86.32)
authorPhil Dawes <phil@phildawes.net>
Fri, 4 Sep 2009 19:13:44 +0000 (20:13 +0100)
committerPhil Dawes <phil@phildawes.net>
Wed, 16 Sep 2009 07:22:17 +0000 (08:22 +0100)
vm/cpu-ppc.hpp
vm/cpu-x86.32.S
vm/cpu-x86.32.hpp
vm/cpu-x86.64.hpp
vm/cpu-x86.S
vm/math.cpp
vm/math.hpp
vm/vm.hpp

index 495eb375ec6dd7fff3fa93aaa9baf64eceefd40b..d0036fb84f038bcfcbce1d191e53ae2c6e830c36 100644 (file)
@@ -3,6 +3,7 @@ namespace factor
 
 #define FACTOR_CPU_STRING "ppc"
 #define VM_ASM_API VM_C_API
+#define VM_ASM_API_OVERFLOW VM_C_API
 
 register cell ds asm("r13");
 register cell rs asm("r14");
index 326ddb6eb83973a149d3c6f5650218f72212f2c1..1618171b5baa85c6d366d32c36b8813bcc080458 100644 (file)
@@ -2,6 +2,7 @@
 
 #define ARG0 %eax
 #define ARG1 %edx
+#define ARG2 %ecx
 #define STACK_REG %esp
 #define DS_REG %esi
 #define RETURN_REG %eax
index 351865f776183d8c1e1c005eb4e03815dda5aef7..a95179a49b611d5ab9bce6a7f5a11d7bc414cfb5 100644 (file)
@@ -7,4 +7,5 @@ register cell ds asm("esi");
 register cell rs asm("edi");
 
 #define VM_ASM_API VM_C_API __attribute__ ((regparm (2)))
+#define VM_ASM_API_OVERFLOW VM_C_API __attribute__ ((regparm (3)))
 }
index 679c301548e051c74b605339f65ff6d83d6ece2b..841705c1717c7a3e7b32314fd738c3b8e8051a24 100644 (file)
@@ -7,5 +7,5 @@ register cell ds asm("r14");
 register cell rs asm("r15");
 
 #define VM_ASM_API VM_C_API
-
+#define VM_ASM_API_OVERFLOW VM_C_API
 }
index 2599ba3f97d0ba047de36fdd1223c96b14bf69c2..a18d1483fb0dc177dd6741a0041cdc5d253c08b4 100644 (file)
@@ -1,4 +1,5 @@
-DEF(void,primitive_fixnum_add,(void)):
+DEF(void,primitive_fixnum_add,(void *myvm)):
+       mov ARG0, ARG2  /* save vm ptr for overflow */
        mov (DS_REG),ARG0
        mov -CELL_SIZE(DS_REG),ARG1
        sub $CELL_SIZE,DS_REG
@@ -8,7 +9,8 @@ DEF(void,primitive_fixnum_add,(void)):
        mov ARITH_TEMP_1,(DS_REG)
        ret
 
-DEF(void,primitive_fixnum_subtract,(void)):
+DEF(void,primitive_fixnum_subtract,(void *myvm)):
+       mov ARG0, ARG2  /* save vm ptr for overflow */
        mov (DS_REG),ARG1
        mov -CELL_SIZE(DS_REG),ARG0
        sub $CELL_SIZE,DS_REG
@@ -18,7 +20,8 @@ DEF(void,primitive_fixnum_subtract,(void)):
        mov ARITH_TEMP_1,(DS_REG)
        ret
 
-DEF(void,primitive_fixnum_multiply,(void)):
+DEF(void,primitive_fixnum_multiply,(void *myvm)):
+       mov ARG0, ARG2  /* 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
@@ -28,6 +31,7 @@ DEF(void,primitive_fixnum_multiply,(void)):
        jo multiply_overflow
        mov DIV_RESULT,(DS_REG)
        ret
+
 multiply_overflow:
        sar $3,ARITH_TEMP_1
        mov ARITH_TEMP_1,ARG0
index fbb946e19f39487c17c4db08db8dab5b17f10d17..be285872f5575570bbc46f43461a25aaf28874bf 100755 (executable)
@@ -842,7 +842,7 @@ inline void factorvm::overflow_fixnum_add(fixnum x, fixnum y)
                untag_fixnum(x) + untag_fixnum(y))));
 }
 
-VM_ASM_API void overflow_fixnum_add(fixnum x, fixnum y, factorvm *myvm)
+VM_ASM_API_OVERFLOW void overflow_fixnum_add(fixnum x, fixnum y, factorvm *myvm)
 {
        return PRIMITIVE_OVERFLOW_GETVM()->overflow_fixnum_add(x,y);
 }
@@ -853,7 +853,7 @@ inline void factorvm::overflow_fixnum_subtract(fixnum x, fixnum y)
                untag_fixnum(x) - untag_fixnum(y))));
 }
 
-VM_ASM_API void overflow_fixnum_subtract(fixnum x, fixnum y, factorvm *myvm)
+VM_ASM_API_OVERFLOW void overflow_fixnum_subtract(fixnum x, fixnum y, factorvm *myvm)
 {
        return PRIMITIVE_OVERFLOW_GETVM()->overflow_fixnum_subtract(x,y);
 }
@@ -867,7 +867,7 @@ inline void factorvm::overflow_fixnum_multiply(fixnum x, fixnum y)
        drepl(tag<bignum>(bignum_multiply(bx,by)));
 }
 
-VM_ASM_API void overflow_fixnum_multiply(fixnum x, fixnum y, factorvm *myvm)
+VM_ASM_API_OVERFLOW void overflow_fixnum_multiply(fixnum x, fixnum y, factorvm *myvm)
 {
        return PRIMITIVE_OVERFLOW_GETVM()->overflow_fixnum_multiply(x,y);
 }
index 5183f85f450822960947e547e9d7f9b48d7b5335..5e6121afb236fd74e7a762e5b99aa0e4e16359e3 100644 (file)
@@ -83,8 +83,8 @@ VM_C_API u64 to_unsigned_8(cell obj, factorvm *vm);
 VM_C_API fixnum to_fixnum(cell tagged, factorvm *vm);
 VM_C_API cell to_cell(cell tagged, factorvm *vm);
 
-VM_ASM_API void overflow_fixnum_add(fixnum x, fixnum y, factorvm *vm);
-VM_ASM_API void overflow_fixnum_subtract(fixnum x, fixnum y, factorvm *vm);
-VM_ASM_API void overflow_fixnum_multiply(fixnum x, fixnum y, factorvm *vm);
+VM_ASM_API_OVERFLOW void overflow_fixnum_add(fixnum x, fixnum y, factorvm *vm);
+VM_ASM_API_OVERFLOW void overflow_fixnum_subtract(fixnum x, fixnum y, factorvm *vm);
+VM_ASM_API_OVERFLOW void overflow_fixnum_multiply(fixnum x, fixnum y, factorvm *vm);
 
 }
index a199885f495575697a6d6c9567b12d3b7a0f7180..3c0f4a246b70cc8dba6c91eed685342e47837132 100644 (file)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -626,10 +626,10 @@ struct factorvm : factorvmdata {
 #ifdef FACTOR_SINGLE_THREADED_TESTING
 /* calls are dispatched as per multithreaded, but checked against singleton */
   extern factorvm *vm;
+  #define ASSERTVM() assert(vm==myvm)
   #define PRIMITIVE_GETVM() ((factorvm*)myvm)
-  #define PRIMITIVE_OVERFLOW_GETVM() vm
+  #define PRIMITIVE_OVERFLOW_GETVM() ASSERTVM(); myvm
   #define VM_PTR myvm
-  #define ASSERTVM() assert(vm==myvm)
   #define SIGNAL_VM_PTR() tls_vm()
 #endif