Prevent personality setting on Linux from going in circles.
[sbcl.git] / src / assembly / ppc / arith.lisp
index ea9fc11..60175d0 100644 (file)
@@ -46,7 +46,9 @@
   (lisp-return lra lip :offset 2)
 
   DO-STATIC-FUN
-  (inst lwz lip null-tn (static-fun-offset 'two-arg-+) )
+  (inst addi lexenv-tn null-tn (static-fdefn-offset 'two-arg-+))
+  (loadw code-tn lexenv-tn fdefn-fun-slot other-pointer-lowtag)
+  (loadw lip lexenv-tn fdefn-raw-addr-slot other-pointer-lowtag)
   (inst li nargs (fixnumize 2))
   (inst mr ocfp cfp-tn)
   (inst mr cfp-tn csp-tn)
@@ -94,7 +96,9 @@
   (lisp-return lra lip :offset 2)
 
   DO-STATIC-FUN
-  (inst lwz lip null-tn (static-fun-offset 'two-arg--))
+  (inst addi lexenv-tn null-tn (static-fdefn-offset 'two-arg--))
+  (loadw code-tn lexenv-tn fdefn-fun-slot other-pointer-lowtag)
+  (loadw lip lexenv-tn fdefn-raw-addr-slot other-pointer-lowtag)
   (inst li nargs (fixnumize 2))
   (inst mr ocfp cfp-tn)
   (inst mr cfp-tn csp-tn)
 
   CONS-BIGNUM
   ;; Allocate a BIGNUM for the result.
-  (pseudo-atomic (pa-flag :extra (pad-data-block (1+ bignum-digits-offset)))
+  (with-fixed-allocation (res pa-flag temp bignum-widetag
+                              (+ bignum-digits-offset 2))
     (let ((one-word (gen-label)))
-      (inst ori res alloc-tn other-pointer-lowtag)
       ;; We start out assuming that we need one word.  Is that correct?
       (inst srawi temp lo 31)
       (inst xor. temp temp hi)
       (inst li temp (logior (ash 1 n-widetag-bits) bignum-widetag))
       (inst beq one-word)
-      ;; Nope, we need two, so allocate the additional space.
-      (inst addi alloc-tn alloc-tn (- (pad-data-block (+ 2 bignum-digits-offset))
-                                      (pad-data-block (1+ bignum-digits-offset))))
       (inst li temp (logior (ash 2 n-widetag-bits) bignum-widetag))
       (storew hi res (1+ bignum-digits-offset) other-pointer-lowtag)
       (emit-label one-word)
   (lisp-return lra lip :offset 2)
 
   DO-STATIC-FUN
-  (inst lwz lip null-tn (static-fun-offset 'two-arg-*))
+  (inst addi lexenv-tn null-tn (static-fdefn-offset 'two-arg-*))
+  (loadw code-tn lexenv-tn fdefn-fun-slot other-pointer-lowtag)
+  (loadw lip lexenv-tn fdefn-raw-addr-slot other-pointer-lowtag)
   (inst li nargs (fixnumize 2))
   (inst mr ocfp cfp-tn)
   (inst mr cfp-tn csp-tn)
                           (:res quo any-reg nl2-offset)
                           (:res rem any-reg nl0-offset))
   (aver (location= rem dividend))
-  (let ((error (generate-error-code nil division-by-zero-error
+  (let ((error (generate-error-code nil 'division-by-zero-error
                                     dividend divisor)))
     (inst cmpwi divisor 0)
     (inst beq error))
                           (:res rem any-reg nl0-offset))
 
   (aver (location= rem dividend))
-  (let ((error (generate-error-code nil division-by-zero-error
+  (let ((error (generate-error-code nil 'division-by-zero-error
                                     dividend divisor)))
     (inst cmpwi divisor 0)
     (inst beq error))
                           (:res quo signed-reg nl2-offset)
                           (:res rem signed-reg nl0-offset))
 
-  (let ((error (generate-error-code nil division-by-zero-error
+  (let ((error (generate-error-code nil 'division-by-zero-error
                                     dividend divisor)))
     (inst cmpwi divisor 0)
     (inst beq error))
           (inst beq DO-COMPARE)
 
           DO-STATIC-FN
-          (inst lwz lip null-tn (static-fun-offset ',static-fn))
+          (inst addi lexenv-tn null-tn (static-fdefn-offset ',static-fn))
+          (loadw code-tn lexenv-tn fdefn-fun-slot other-pointer-lowtag)
+          (loadw lip lexenv-tn fdefn-raw-addr-slot other-pointer-lowtag)
           (inst li nargs (fixnumize 2))
           (inst mr ocfp cfp-tn)
           (inst mr cfp-tn csp-tn)
   (lisp-return lra lip :offset 2)
 
   DO-STATIC-FN
-  (inst lwz lip null-tn (static-fun-offset 'eql))
+  (inst addi lexenv-tn null-tn (static-fdefn-offset 'eql))
+  (loadw code-tn lexenv-tn fdefn-fun-slot other-pointer-lowtag)
+  (loadw lip lexenv-tn fdefn-raw-addr-slot other-pointer-lowtag)
   (inst li nargs (fixnumize 2))
   (inst mr ocfp cfp-tn)
   (inst mr cfp-tn csp-tn)
   (lisp-return lra lip :offset 2)
 
   DO-STATIC-FN
-  (inst lwz lip null-tn (static-fun-offset 'two-arg-=))
+  (inst addi lexenv-tn null-tn (static-fdefn-offset 'two-arg-=))
+  (loadw code-tn lexenv-tn fdefn-fun-slot other-pointer-lowtag)
+  (loadw lip lexenv-tn fdefn-raw-addr-slot other-pointer-lowtag)
   (inst li nargs (fixnumize 2))
   (inst mr ocfp cfp-tn)
   (inst mr cfp-tn csp-tn)
   (lisp-return lra lip :offset 2)
 
   DO-STATIC-FN
-  (inst lwz lip null-tn (static-fun-offset 'two-arg-/=))
+  (inst addi lexenv-tn null-tn (static-fdefn-offset 'two-arg-/=))
+  (loadw code-tn lexenv-tn fdefn-fun-slot other-pointer-lowtag)
+  (loadw lip lexenv-tn fdefn-raw-addr-slot other-pointer-lowtag)
   (inst li nargs (fixnumize 2))
   (inst mr ocfp cfp-tn)
   (inst j lip 0)