mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
logsub is intrinsic
* libguile/intrinsics.h: * libguile/intrinsics.c (logsub): New intrinsic. (scm_bootstrap_intrinsics): Init new intrinsic. * libguile/vm-engine.c (logsub): Disable. * module/language/cps/reify-primitives.scm (compute-known-primitives): Add logsub. * module/system/vm/assembler.scm: Update logsub intrinsic assembler.
This commit is contained in:
parent
b2c01e5b58
commit
25a0fe8839
5 changed files with 22 additions and 6 deletions
|
@ -80,6 +80,22 @@ scm_to_uint64_truncate (SCM x)
|
||||||
return scm_to_uint64 (scm_logand (x, scm_from_uint64 ((scm_t_uint64) -1)));
|
return scm_to_uint64 (scm_logand (x, scm_from_uint64 ((scm_t_uint64) -1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SCM
|
||||||
|
logsub (SCM x, SCM y)
|
||||||
|
{
|
||||||
|
if (SCM_I_INUMP (x) && SCM_I_INUMP (y))
|
||||||
|
{
|
||||||
|
scm_t_signed_bits a, b;
|
||||||
|
|
||||||
|
a = SCM_I_INUM (x);
|
||||||
|
b = SCM_I_INUM (y);
|
||||||
|
|
||||||
|
return SCM_I_MAKINUM (a & ~b);
|
||||||
|
}
|
||||||
|
|
||||||
|
return scm_logand (x, scm_lognot (y));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
scm_bootstrap_intrinsics (void)
|
scm_bootstrap_intrinsics (void)
|
||||||
{
|
{
|
||||||
|
@ -106,6 +122,7 @@ scm_bootstrap_intrinsics (void)
|
||||||
scm_vm_intrinsics.scm_to_s64 = scm_to_int64;
|
scm_vm_intrinsics.scm_to_s64 = scm_to_int64;
|
||||||
scm_vm_intrinsics.u64_to_scm = scm_from_uint64;
|
scm_vm_intrinsics.u64_to_scm = scm_from_uint64;
|
||||||
scm_vm_intrinsics.s64_to_scm = scm_from_int64;
|
scm_vm_intrinsics.s64_to_scm = scm_from_int64;
|
||||||
|
scm_vm_intrinsics.logsub = logsub;
|
||||||
|
|
||||||
scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION,
|
scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION,
|
||||||
"scm_init_intrinsics",
|
"scm_init_intrinsics",
|
||||||
|
|
|
@ -57,6 +57,7 @@ typedef SCM (*scm_t_scm_from_s64_intrinsic) (scm_t_int64);
|
||||||
M(s64_from_scm, scm_to_s64, "scm->s64", SCM_TO_S64) \
|
M(s64_from_scm, scm_to_s64, "scm->s64", SCM_TO_S64) \
|
||||||
M(scm_from_u64, u64_to_scm, "u64->scm", U64_TO_SCM) \
|
M(scm_from_u64, u64_to_scm, "u64->scm", U64_TO_SCM) \
|
||||||
M(scm_from_s64, s64_to_scm, "s64->scm", S64_TO_SCM) \
|
M(scm_from_s64, s64_to_scm, "s64->scm", S64_TO_SCM) \
|
||||||
|
M(scm_from_scm_scm, logsub, "logsub", LOGSUB) \
|
||||||
/* Add new intrinsics here; also update scm_bootstrap_intrinsics. */
|
/* Add new intrinsics here; also update scm_bootstrap_intrinsics. */
|
||||||
|
|
||||||
enum scm_vm_intrinsic
|
enum scm_vm_intrinsic
|
||||||
|
|
|
@ -2564,11 +2564,7 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
|
||||||
NEXT (1);
|
NEXT (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* logsub dst:8 a:8 b:8
|
VM_DEFINE_OP (161, unused_161, NULL, NOP)
|
||||||
*
|
|
||||||
* Place the bitwise AND of A and the bitwise NOT of B into DST.
|
|
||||||
*/
|
|
||||||
VM_DEFINE_OP (161, logsub, "logsub", OP1 (X8_S8_S8_S8) | OP_DST)
|
|
||||||
{
|
{
|
||||||
ARGS2 (x, y);
|
ARGS2 (x, y);
|
||||||
|
|
||||||
|
|
|
@ -224,6 +224,7 @@
|
||||||
logand
|
logand
|
||||||
logior
|
logior
|
||||||
logxor
|
logxor
|
||||||
|
logsub
|
||||||
string-set!
|
string-set!
|
||||||
string->number
|
string->number
|
||||||
string->symbol
|
string->symbol
|
||||||
|
|
|
@ -195,6 +195,7 @@
|
||||||
emit-logand
|
emit-logand
|
||||||
emit-logior
|
emit-logior
|
||||||
emit-logxor
|
emit-logxor
|
||||||
|
emit-logsub
|
||||||
emit-string-set!
|
emit-string-set!
|
||||||
emit-string->number
|
emit-string->number
|
||||||
emit-string->symbol
|
emit-string->symbol
|
||||||
|
@ -255,7 +256,6 @@
|
||||||
emit-uadd/immediate
|
emit-uadd/immediate
|
||||||
emit-usub/immediate
|
emit-usub/immediate
|
||||||
emit-umul/immediate
|
emit-umul/immediate
|
||||||
emit-logsub
|
|
||||||
emit-ulogand
|
emit-ulogand
|
||||||
emit-ulogior
|
emit-ulogior
|
||||||
emit-ulogxor
|
emit-ulogxor
|
||||||
|
@ -1321,6 +1321,7 @@ returned instead."
|
||||||
(define-scm<-scm-scm-intrinsic logand)
|
(define-scm<-scm-scm-intrinsic logand)
|
||||||
(define-scm<-scm-scm-intrinsic logior)
|
(define-scm<-scm-scm-intrinsic logior)
|
||||||
(define-scm<-scm-scm-intrinsic logxor)
|
(define-scm<-scm-scm-intrinsic logxor)
|
||||||
|
(define-scm<-scm-scm-intrinsic logsub)
|
||||||
(define-scm-u64-u64-intrinsic string-set!)
|
(define-scm-u64-u64-intrinsic string-set!)
|
||||||
(define-scm<-scm-intrinsic string->number)
|
(define-scm<-scm-intrinsic string->number)
|
||||||
(define-scm<-scm-intrinsic string->symbol)
|
(define-scm<-scm-intrinsic string->symbol)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue