0.8.13.47:
[sbcl.git] / src / compiler / x86 / c-call.lisp
index f56fd52..e3fd9d0 100644 (file)
 
 
 (deftransform %alien-funcall ((function type &rest args) * * :node node)
-  (aver (sb!c::constant-continuation-p type))
-  (let* ((type (sb!c::continuation-value type))
+  (aver (sb!c::constant-lvar-p type))
+  (let* ((type (sb!c::lvar-value type))
         (env (sb!c::node-lexenv node))
          (arg-types (alien-fun-type-arg-types type))
          (result-type (alien-fun-type-result-type type)))
 (define-vop (alloc-number-stack-space)
   (:info amount)
   (:results (result :scs (sap-reg any-reg)))
+  (:node-var node)
   (:generator 0
     (aver (location= result esp-tn))
+    (when (policy node (= sb!c::float-accuracy 3))
+      (inst sub esp-tn 4)
+      (inst fnstcw (make-ea :word :base esp-tn))
+      (inst wait)
+      (inst or (make-ea :word :base esp-tn) #x300)
+      (inst fldcw (make-ea :word :base esp-tn))
+      (inst wait))
     (unless (zerop amount)
       (let ((delta (logandc2 (+ amount 3) 3)))
        (inst sub esp-tn delta)))
 
 (define-vop (dealloc-number-stack-space)
   (:info amount)
+  (:node-var node)
   (:generator 0
     (unless (zerop amount)
       (let ((delta (logandc2 (+ amount 3) 3)))
-       (inst add esp-tn delta)))))
+       (inst add esp-tn delta)))
+    (when (policy node (= sb!c::float-accuracy 3))
+      (inst fnstcw (make-ea :word :base esp-tn))
+      (inst wait)
+      (inst and (make-ea :word :base esp-tn) #xfeff)
+      (inst fldcw (make-ea :word :base esp-tn))
+      (inst wait)
+      (inst add esp-tn 4))))
 
 (define-vop (alloc-alien-stack-space)
   (:info amount)