mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-10 05:50:26 +02:00
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.
This commit is contained in:
parent
b733ca461c
commit
49d77b1243
6 changed files with 28 additions and 4 deletions
|
@ -1565,9 +1565,10 @@ operand is an immediate unsigned 8-bit integer.
|
||||||
|
|
||||||
@deftypefn Instruction {} ulogand s8:@var{dst} s8:@var{a} s8:@var{b}
|
@deftypefn Instruction {} ulogand s8:@var{dst} s8:@var{a} s8:@var{b}
|
||||||
@deftypefnx Instruction {} ulogior s8:@var{dst} s8:@var{a} s8:@var{b}
|
@deftypefnx Instruction {} ulogior s8:@var{dst} s8:@var{a} s8:@var{b}
|
||||||
|
@deftypefnx Instruction {} ulogxor s8:@var{dst} s8:@var{a} s8:@var{b}
|
||||||
@deftypefnx Instruction {} ulogsub 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
|
Like @code{logand}, @code{logior}, @code{logxor}, and @code{logsub}, but
|
||||||
unboxed unsigned 64-bit integers.
|
operating on unboxed unsigned 64-bit integers.
|
||||||
@end deftypefn
|
@end deftypefn
|
||||||
|
|
||||||
@deftypefn Instruction {} ulsh s8:@var{dst} s8:@var{a} s8:@var{b}
|
@deftypefn Instruction {} ulsh s8:@var{dst} s8:@var{a} s8:@var{b}
|
||||||
|
|
|
@ -3802,7 +3802,22 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
|
||||||
NEXT (1);
|
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 (178, unused_178, NULL, NOP)
|
||||||
VM_DEFINE_OP (179, unused_179, NULL, NOP)
|
VM_DEFINE_OP (179, unused_179, NULL, NOP)
|
||||||
VM_DEFINE_OP (180, unused_180, NULL, NOP)
|
VM_DEFINE_OP (180, unused_180, NULL, NOP)
|
||||||
|
|
|
@ -475,6 +475,7 @@ is or might be a read or a write to the same location as A."
|
||||||
((lognot . _) &type-check)
|
((lognot . _) &type-check)
|
||||||
((ulogand . _))
|
((ulogand . _))
|
||||||
((ulogior . _))
|
((ulogior . _))
|
||||||
|
((ulogxor . _))
|
||||||
((ulogsub . _))
|
((ulogsub . _))
|
||||||
((ursh . _))
|
((ursh . _))
|
||||||
((ulsh . _))
|
((ulsh . _))
|
||||||
|
|
|
@ -805,7 +805,7 @@ are comparable with eqv?. A tmp slot may be used."
|
||||||
'char->integer
|
'char->integer
|
||||||
'bv-length 'vector-length 'string-length
|
'bv-length 'vector-length 'string-length
|
||||||
'uadd 'usub 'umul
|
'uadd 'usub 'umul
|
||||||
'ulogand 'ulogior 'ulogsub 'ursh 'ulsh
|
'ulogand 'ulogior 'ulogxor 'ulogsub 'ursh 'ulsh
|
||||||
'uadd/immediate 'usub/immediate 'umul/immediate
|
'uadd/immediate 'usub/immediate 'umul/immediate
|
||||||
'ursh/immediate 'ulsh/immediate
|
'ursh/immediate 'ulsh/immediate
|
||||||
'bv-u8-ref 'bv-u16-ref 'bv-u32-ref 'bv-u64-ref))
|
'bv-u8-ref 'bv-u16-ref 'bv-u32-ref 'bv-u64-ref))
|
||||||
|
|
|
@ -1356,6 +1356,12 @@ minimum, and maximum."
|
||||||
;; For our purposes, treat logxor the same as logior.
|
;; For our purposes, treat logxor the same as logior.
|
||||||
(define-type-aliases logior logxor)
|
(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-simple-type-checker (lognot &exact-integer))
|
||||||
(define-type-inferrer (lognot a result)
|
(define-type-inferrer (lognot a result)
|
||||||
(restrict! a &exact-integer -inf.0 +inf.0)
|
(restrict! a &exact-integer -inf.0 +inf.0)
|
||||||
|
|
|
@ -161,6 +161,7 @@
|
||||||
emit-logsub
|
emit-logsub
|
||||||
emit-ulogand
|
emit-ulogand
|
||||||
emit-ulogior
|
emit-ulogior
|
||||||
|
emit-ulogxor
|
||||||
emit-ulogsub
|
emit-ulogsub
|
||||||
emit-ursh
|
emit-ursh
|
||||||
emit-ulsh
|
emit-ulsh
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue