<html lang='en'>
<head>
<meta content='text/html; charset=utf-8' http-equiv='Content-Type'>
<title>
GitLab
</title>
</meta>
</head>
<style>
  img {
    max-width: 100%;
    height: auto;
  }
  p.details {
    font-style:italic;
    color:#777
  }
  .footer p {
    font-size:small;
    color:#777
  }
  pre.commit-message {
    white-space: pre-wrap;
  }
  .file-stats a {
    text-decoration: none;
  }
  .file-stats .new-file {
    color: #090;
  }
  .file-stats .deleted-file {
    color: #B00;
  }
</style>
<body>
<div class='content'>
<h3>Raymond Toy pushed to branch rtoy-setexception-inexact at <a href="https://gitlab.common-lisp.net/cmucl/cmucl">cmucl / cmucl</a></h3>
<h4>
Commits:
</h4>
<ul>
<li>
<strong><a href="https://gitlab.common-lisp.net/cmucl/cmucl/commit/5721ddd2c71849c61c25bad61c4d1877be45ccc7">5721ddd2</a></strong>
<div>
<span>by Raymond Toy</span>
<i>at 2015-12-24T11:46:36Z</i>
</div>
<pre class='commit-message'>Simplify WITH-FLOAT-TRAPS-MASKED and WITH-FLOAT-TRAPS-ENABLED.

Merge the body of both macros into one since they only differ in how
the bits are merged with the actual mode bits.</pre>
</li>
</ul>
<h4>1 changed file:</h4>
<ul>
<li class='file-stats'>
<a href='#diff-0'>
src/code/float-trap.lisp
</a>
</li>
</ul>
<h4>Changes:</h4>
<li id='diff-0'>
<a href='https://gitlab.common-lisp.net/cmucl/cmucl/commit/5721ddd2c71849c61c25bad61c4d1877be45ccc7#diff-0'>
<strong>
src/code/float-trap.lisp
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/src/code/float-trap.lisp
</span><span style="color: #000000;background-color: #ddffdd">+++ b/src/code/float-trap.lisp
</span><span style="color: #aaaaaa">@@ -366,85 +366,52 @@
</span>                   code)))))))
 
 ;;; WITH-FLOAT-TRAPS-MASKED  --  Public
<span style="color: #000000;background-color: #ffdddd">-;;;
-(defmacro with-float-traps-masked (traps &body body)
-  "Execute BODY with the floating point exceptions listed in TRAPS
-  masked (disabled).  TRAPS should be a list of possible exceptions
-  which includes :UNDERFLOW, :OVERFLOW, :INEXACT, :INVALID and
-  :DIVIDE-BY-ZERO and on the X86 :DENORMALIZED-OPERAND. The respective
-  accrued exceptions are cleared at the start of the body to support
-  their testing within, and restored on exit."
-  (let ((traps (dpb (float-trap-mask traps) float-traps-byte 0))
-       (exceptions (dpb (float-trap-mask traps) float-sticky-bits 0))
-       (trap-mask (dpb (lognot (float-trap-mask traps))
-                       float-traps-byte #xffffffff))
-       (exception-mask (dpb (lognot (vm::float-trap-mask traps))
-                            float-sticky-bits #xffffffff))
-       ;; On ppc if we are masking the invalid trap, we need to make
-       ;; sure we wipe out the various individual sticky bits
-       ;; representing the invalid operation.  Otherwise, if we
-       ;; enable the invalid trap later, these sticky bits will cause
-       ;; an exception.
-       #+ppc
-       (invalid-mask (if (member :invalid traps)
-                         (dpb 0
-                              (byte 1 31)
-                              (dpb 0 vm::float-invalid-op-2-byte
-                                   (dpb 0 vm:float-invalid-op-1-byte #xffffffff)))
-                         #xffffffff))
-       (orig-modes (gensym)))
-    `(let ((,orig-modes (floating-point-modes)))
-      (unwind-protect
-          (progn
-            (setf (floating-point-modes)
-                  (logand ,orig-modes ,(logand trap-mask exception-mask)))
-            ,@body)
-       ;; Restore the original traps and exceptions.
-       (setf (floating-point-modes)
-             (logior (logand ,orig-modes ,(logior traps exceptions))
-                     (logand (floating-point-modes)
-                             ,(logand trap-mask exception-mask)
-                             #+ppc
-                             ,invalid-mask
-                             #+mips ,(dpb 0 float-exceptions-byte #xffffffff))))))))
-
-(defmacro with-float-traps-enabled (traps &body body)
-  "Execute BODY with the floating point exceptions listed in TRAPS
</span><span style="color: #000000;background-color: #ddffdd">+;;; WITH-FLOAT-TRAPS-ENABLED --  Public
+
+
+(macrolet
+    ((with-float-traps (name logical-op)
+       `(defmacro ,(symbolicate "WITH-FLOAT-TRAPS-" name) (traps &body body)
+         "Execute BODY with the floating point exceptions listed in TRAPS
</span>   enabled.  TRAPS should be a list of possible exceptions which
   includes :UNDERFLOW, :OVERFLOW, :INEXACT, :INVALID and
   :DIVIDE-BY-ZERO and on the X86 :DENORMALIZED-OPERAND. The respective
   accrued exceptions are cleared at the start of the body to support
   their testing within, and restored on exit."
<span style="color: #000000;background-color: #ffdddd">-  (let ((traps (dpb (float-trap-mask traps) float-traps-byte 0))
-       (exceptions (dpb (float-trap-mask traps) float-sticky-bits 0))
-       (trap-mask (dpb (lognot (float-trap-mask traps))
-                       float-traps-byte #xffffffff))
-       (exception-mask (dpb (lognot (vm::float-trap-mask traps))
-                            float-sticky-bits #xffffffff))
-       ;; On ppc if we are masking the invalid trap, we need to make
-       ;; sure we wipe out the various individual sticky bits
-       ;; representing the invalid operation.  Otherwise, if we
-       ;; enable the invalid trap later, these sticky bits will cause
-       ;; an exception.
-       #+ppc
-       (invalid-mask (if (member :invalid traps)
-                         (dpb 0
-                              (byte 1 31)
-                              (dpb 0 vm::float-invalid-op-2-byte
-                                   (dpb 0 vm:float-invalid-op-1-byte #xffffffff)))
-                         #xffffffff))
-       (orig-modes (gensym)))
-    `(let ((,orig-modes (floating-point-modes)))
-      (unwind-protect
-          (progn
-            (setf (floating-point-modes)
-                  (logorc2 ,orig-modes ,(logand trap-mask exception-mask)))
-            ,@body)
-       ;; Restore the original traps and exceptions.
-       (setf (floating-point-modes)
-             (logior (logand ,orig-modes ,(logior traps exceptions))
-                     (logand (floating-point-modes)
-                             ,(logand trap-mask exception-mask)
-                             #+ppc
-                             ,invalid-mask
-                             #+mips ,(dpb 0 float-exceptions-byte #xffffffff))))))))
</span><span style="color: #000000;background-color: #ddffdd">+     (let ((traps (dpb (float-trap-mask traps) float-traps-byte 0))
+               (exceptions (dpb (float-trap-mask traps) float-sticky-bits 0))
+               (trap-mask (dpb (lognot (float-trap-mask traps))
+                               float-traps-byte #xffffffff))
+               (exception-mask (dpb (lognot (vm::float-trap-mask traps))
+                                    float-sticky-bits #xffffffff))
+               ;; On ppc if we are masking the invalid trap, we need to make
+               ;; sure we wipe out the various individual sticky bits
+               ;; representing the invalid operation.  Otherwise, if we
+               ;; enable the invalid trap later, these sticky bits will cause
+               ;; an exception.
+               #+ppc
+               (invalid-mask (if (member :invalid traps)
+                                 (dpb 0
+                                      (byte 1 31)
+                                      (dpb 0 vm::float-invalid-op-2-byte
+                                           (dpb 0 vm:float-invalid-op-1-byte #xffffffff)))
+                                 #xffffffff))
+               (orig-modes (gensym)))
+           `(let ((,orig-modes (floating-point-modes)))
+              (unwind-protect
+                   (progn
+                     (setf (floating-point-modes)
+                           (,',logical-op ,orig-modes ,(logand trap-mask exception-mask)))
+                     ,@body)
+                ;; Restore the original traps and exceptions.
+                (setf (floating-point-modes)
+                      (logior (logand ,orig-modes ,(logior traps exceptions))
+                              (logand (floating-point-modes)
+                                      ,(logand trap-mask exception-mask)
+                                      #+ppc
+                                      ,invalid-mask
+                                      #+mips ,(dpb 0 float-exceptions-byte #xffffffff))))))))))
+  ;; Masked and Enabled only differ whether we AND in the bits or OR
+  ;; them.
+  (with-float-traps masked logand)
+  (with-float-traps enabled logorc2))
</span></code></pre>

<br>
</li>

</div>
<div class='footer' style='margin-top: 10px;'>
<p>

<br>
<a href="https://gitlab.common-lisp.net/cmucl/cmucl/commit/5721ddd2c71849c61c25bad61c4d1877be45ccc7">View it on GitLab</a>.
<br>
You're receiving this email because of your account on gitlab.common-lisp.net.
If you'd like to receive fewer emails, you can adjust your notification settings.
<script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","action":{"@type":"ViewAction","name":"View Commit","url":"https://gitlab.common-lisp.net/cmucl/cmucl/commit/5721ddd2c71849c61c25bad61c4d1877be45ccc7"}}</script>
</p>
</div>
</body>
</html>