diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index c405b2b89..d92910a80 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -3095,7 +3095,20 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp, VM_DEFINE_OP (127, bv_f64_set, "bv-f64-set!", OP1 (U8_U8_U8_U8)) BV_FLOAT_SET (f64, ieee_double, double, 8); - VM_DEFINE_OP (128, unused_128, NULL, NOP) + /* br-if-logtest a:12 b:12 invert:1 _:7 offset:24 + * + * If the exact integer in A has any bits in common with the exact + * integer in B, add OFFSET, a signed 24-bit number, to the current + * instruction pointer. + */ + VM_DEFINE_OP (128, br_if_logtest, "br-if-logtest", OP2 (U8_U12_U12, B1_X7_L24)) + { + BR_BINARY (x, y, + ((SCM_I_INUMP (x) && SCM_I_INUMP (y)) + ? (SCM_UNPACK (x) & SCM_UNPACK (y) & ~scm_tc2_int) + : scm_is_true (scm_logtest (x, y)))); + } + VM_DEFINE_OP (129, unused_129, NULL, NOP) VM_DEFINE_OP (130, unused_130, NULL, NOP) VM_DEFINE_OP (131, unused_131, NULL, NOP) diff --git a/module/system/vm/disassembler.scm b/module/system/vm/disassembler.scm index 3d8de82f2..d41c2c1c6 100644 --- a/module/system/vm/disassembler.scm +++ b/module/system/vm/disassembler.scm @@ -205,7 +205,8 @@ address of that offset." 'br-if-nargs-ne 'br-if-nargs-lt 'br-if-nargs-gt 'br-if-true 'br-if-null 'br-if-nil 'br-if-pair 'br-if-struct 'br-if-char 'br-if-eq 'br-if-eqv 'br-if-equal - 'br-if-= 'br-if-< 'br-if-<= 'br-if-> 'br-if->=) _ ... target) + 'br-if-= 'br-if-< 'br-if-<= 'br-if-> 'br-if->= + 'br-if-logtest) _ ... target) (list "-> ~A" (vector-ref labels (- (+ offset target) start)))) (('br-if-tc7 slot invert? tc7 target) (list "~A -> ~A"