guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 01/03: Add unboxed logxor on u64 values


From: Andy Wingo
Subject: [Guile-commits] 01/03: Add unboxed logxor on u64 values
Date: Thu, 1 Sep 2016 09:15:34 +0000 (UTC)

wingo pushed a commit to branch master
in repository guile.

commit 49d77b1243aecfd250e4f6160c66603555c4e86a
Author: Andy Wingo <address@hidden>
Date:   Thu Sep 1 10:51:57 2016 +0200

    Add unboxed logxor on u64 values
    
    * libguile/vm-engine.c (ulogxor): New instruction.
    * module/language/cps/effects-analysis.scm (ulogxor):
    * module/language/cps/slot-allocation.scm (compute-var-representations):
    * module/language/cps/types.scm (ulogxor):
    * module/system/vm/assembler.scm (emit-ulogxor): Add support for new
      instruction.
    * doc/ref/vm.texi (Unboxed Integer Arithmetic): Document ulogxor.
---
 doc/ref/vm.texi                          |    5 +++--
 libguile/vm-engine.c                     |   17 ++++++++++++++++-
 module/language/cps/effects-analysis.scm |    1 +
 module/language/cps/slot-allocation.scm  |    2 +-
 module/language/cps/types.scm            |    6 ++++++
 module/system/vm/assembler.scm           |    1 +
 6 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/doc/ref/vm.texi b/doc/ref/vm.texi
index 4505a01..2f32c51 100644
--- a/doc/ref/vm.texi
+++ b/doc/ref/vm.texi
@@ -1565,9 +1565,10 @@ operand is an immediate unsigned 8-bit integer.
 
 @deftypefn Instruction {} ulogand s8:@var{dst} s8:@var{a} s8:@var{b}
 @deftypefnx Instruction {} ulogior s8:@var{dst} s8:@var{a} s8:@var{b}
address@hidden Instruction {} ulogxor s8:@var{dst} s8:@var{a} s8:@var{b}
 @deftypefnx Instruction {} ulogsub s8:@var{dst} s8:@var{a} s8:@var{b}
-Like @code{logand}, @code{logior}, and @code{logsub}, but operating on
-unboxed unsigned 64-bit integers.
+Like @code{logand}, @code{logior}, @code{logxor}, and @code{logsub}, but
+operating on unboxed unsigned 64-bit integers.
 @end deftypefn
 
 @deftypefn Instruction {} ulsh s8:@var{dst} s8:@var{a} s8:@var{b}
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index 4b5b70b..f508cd2 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -3802,7 +3802,22 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
       NEXT (1);
     }
 
-  VM_DEFINE_OP (177, unused_177, NULL, NOP)
+  /* ulogxor dst:8 a:8 b:8
+   *
+   * Place the bitwise exclusive OR of the u64 values in A and B into
+   * DST.
+   */
+  VM_DEFINE_OP (177, ulogxor, "ulogxor", OP1 (X8_S8_S8_S8) | OP_DST)
+    {
+      scm_t_uint8 dst, a, b;
+
+      UNPACK_8_8_8 (op, dst, a, b);
+
+      SP_SET_U64 (dst, SP_REF_U64 (a) ^ SP_REF_U64 (b));
+
+      NEXT (1);
+    }
+
   VM_DEFINE_OP (178, unused_178, NULL, NOP)
   VM_DEFINE_OP (179, unused_179, NULL, NOP)
   VM_DEFINE_OP (180, unused_180, NULL, NOP)
diff --git a/module/language/cps/effects-analysis.scm 
b/module/language/cps/effects-analysis.scm
index 5698fcd..aed47d4 100644
--- a/module/language/cps/effects-analysis.scm
+++ b/module/language/cps/effects-analysis.scm
@@ -475,6 +475,7 @@ is or might be a read or a write to the same location as A."
   ((lognot . _)                    &type-check)
   ((ulogand . _))
   ((ulogior . _))
+  ((ulogxor . _))
   ((ulogsub . _))
   ((ursh . _))
   ((ulsh . _))
diff --git a/module/language/cps/slot-allocation.scm 
b/module/language/cps/slot-allocation.scm
index 654dbda..32f0ace 100644
--- a/module/language/cps/slot-allocation.scm
+++ b/module/language/cps/slot-allocation.scm
@@ -805,7 +805,7 @@ are comparable with eqv?.  A tmp slot may be used."
                                'char->integer
                                'bv-length 'vector-length 'string-length
                                'uadd 'usub 'umul
-                               'ulogand 'ulogior 'ulogsub 'ursh 'ulsh
+                               'ulogand 'ulogior 'ulogxor 'ulogsub 'ursh 'ulsh
                                'uadd/immediate 'usub/immediate 'umul/immediate
                                'ursh/immediate 'ulsh/immediate
                                'bv-u8-ref 'bv-u16-ref 'bv-u32-ref 'bv-u64-ref))
diff --git a/module/language/cps/types.scm b/module/language/cps/types.scm
index 633fef5..266cb74 100644
--- a/module/language/cps/types.scm
+++ b/module/language/cps/types.scm
@@ -1356,6 +1356,12 @@ minimum, and maximum."
 ;; For our purposes, treat logxor the same as logior.
 (define-type-aliases logior logxor)
 
+(define-simple-type-checker (ulogxor &u64 &u64))
+(define-type-inferrer (ulogxor a b result)
+  (restrict! a &u64 0 &u64-max)
+  (restrict! b &u64 0 &u64-max)
+  (define! result &u64 0 &u64-max))
+
 (define-simple-type-checker (lognot &exact-integer))
 (define-type-inferrer (lognot a result)
   (restrict! a &exact-integer -inf.0 +inf.0)
diff --git a/module/system/vm/assembler.scm b/module/system/vm/assembler.scm
index 20a652c..c9ef5f1 100644
--- a/module/system/vm/assembler.scm
+++ b/module/system/vm/assembler.scm
@@ -161,6 +161,7 @@
             emit-logsub
             emit-ulogand
             emit-ulogior
+            emit-ulogxor
             emit-ulogsub
             emit-ursh
             emit-ulsh



reply via email to

[Prev in Thread] Current Thread [Next in Thread]