X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcode%2Ffloat-trap.lisp;h=4bf0429e50f2a7a71ead1d57c7c4c7b75c4d3951;hb=0e3c4b4db102bd204a30402d7e5a0de44aea57ce;hp=897d3109f571907e07c41060346bc6550c03cef3;hpb=ce495da534fd7e2d5452124c210436209115c298;p=sbcl.git diff --git a/src/code/float-trap.lisp b/src/code/float-trap.lisp index 897d310..4bf0429 100644 --- a/src/code/float-trap.lisp +++ b/src/code/float-trap.lisp @@ -118,7 +118,8 @@ in effect." (or (cdr (assoc precision *precision-mode-alist*)) (error "unknown precision mode: ~S" precision)))) ;; FIXME: This apparently doesn't work on Darwin - #!-darwin (setf (floating-point-modes) modes)) + #!-(and darwin ppc) + (setf (floating-point-modes) modes)) (values)) (defun get-floating-point-modes () @@ -158,7 +159,7 @@ sets the floating point modes to their current values (and thus is a no-op)." ;;; disabled by default. Joe User can explicitly enable them if ;;; desired. (defvar *saved-floating-point-modes* - '(:traps (:overflow #!-netbsd :invalid :divide-by-zero) + '(:traps (:overflow #!-(or netbsd ppc) :invalid :divide-by-zero) :rounding-mode :nearest :current-exceptions nil :accrued-exceptions nil :fast-mode nil #!+x86 :precision #!+x86 :53-bit)) @@ -194,8 +195,12 @@ sets the floating point modes to their current values (and thus is a no-op)." (declare (type system-area-pointer info)) (let ((code (sb!unix::siginfo-code info))) (with-interrupts - (error (or (cdr (assoc code *sigfpe-code-error-alist*)) - 'floating-point-exception))))) + ;; Reset the accumulated exceptions, may be needed on other + ;; platforms too, at least Linux doesn't seem to require it. + #!+sunos + (setf (ldb sb!vm::float-sticky-bits (floating-point-modes)) 0) + (error (or (cdr (assoc code *sigfpe-code-error-alist*)) + 'floating-point-exception))))) ;;; Execute BODY with the floating point exceptions listed in TRAPS ;;; masked (disabled). TRAPS should be a list of possible exceptions