From a74b4a45fab1a78e34954bce5f031e8a9765f827 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Sat, 22 Sep 2018 18:42:27 +0200 Subject: [PATCH] Update comments in vm-engine.c * libguile/jit.c (compile_s64_numerically_equal): Remove as this instruction was removed in previous refactoring. (compile_atomic_scm_set_immediate), compile_atomic_scm_ref_immediate): Adapt to change in C name of these instructions. * libguile/vm-engine.c: Add comments for all instructions. --- libguile/jit.c | 10 +- libguile/vm-engine.c | 492 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 453 insertions(+), 49 deletions(-) diff --git a/libguile/jit.c b/libguile/jit.c index 92782c95f..8ef570fd7 100644 --- a/libguile/jit.c +++ b/libguile/jit.c @@ -2449,7 +2449,7 @@ compile_untag_char (scm_jit_state *j, uint16_t dst, uint16_t src) } static void -compile_atomic_ref_scm_immediate (scm_jit_state *j, uint8_t dst, uint8_t obj, uint8_t offset) +compile_atomic_scm_ref_immediate (scm_jit_state *j, uint8_t dst, uint8_t obj, uint8_t offset) { emit_sp_ref_scm (j, T0, obj); #if defined(__i386__) || defined(__x86_64__) @@ -2467,7 +2467,7 @@ compile_atomic_ref_scm_immediate (scm_jit_state *j, uint8_t dst, uint8_t obj, ui } static void -compile_atomic_set_scm_immediate (scm_jit_state *j, uint8_t obj, uint8_t offset, uint8_t val) +compile_atomic_scm_set_immediate (scm_jit_state *j, uint8_t obj, uint8_t offset, uint8_t val) { emit_sp_ref_scm (j, T1, obj); emit_sp_ref_scm (j, T2, val); @@ -3151,12 +3151,6 @@ compile_u64_less (scm_jit_state *j, uint16_t a, uint16_t b) #endif } -static void -compile_s64_numerically_equal (scm_jit_state *j, uint16_t a, uint16_t b) -{ - compile_u64_numerically_equal (j, a, b); -} - static void compile_s64_less (scm_jit_state *j, uint16_t a, uint16_t b) { diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 542cac413..7230f38b1 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -350,7 +350,7 @@ VM_NAME (scm_thread *thread) /* instrument-entry _:24 data:32 * * Increase execution counter for this function and potentially tier - * up to the next JIT level. DATA is an offset to raw profiler, + * up to the next JIT level. DATA is an offset to a structure * recording execution counts and the next-level JIT code * corresponding to this function. Also run the apply hook. */ @@ -399,7 +399,7 @@ VM_NAME (scm_thread *thread) /* instrument-loop _:24 data:32 * * Increase execution counter for this function and potentially tier - * up to the next JIT level. DATA is an offset to raw profiler, + * up to the next JIT level. DATA is an offset to a structure * recording execution counts and the next-level JIT code * corresponding to this function. */ @@ -438,7 +438,7 @@ VM_NAME (scm_thread *thread) /* call proc:24 _:8 nlocals:24 * * Call a procedure. PROC is the local corresponding to a procedure. - * The two values below PROC will be overwritten by the saved call + * The three values below PROC will be overwritten by the saved call * frame data. The new frame will have space for NLOCALS locals: one * for the procedure, and the rest for the arguments which should * already have been pushed on. @@ -446,7 +446,7 @@ VM_NAME (scm_thread *thread) * When the call returns, execution proceeds with the next * instruction. There may be any number of values on the return * stack; the precise number can be had by subtracting the address of - * PROC from the post-call SP. + * slot PROC-1 from the post-call SP. */ VM_DEFINE_OP (3, call, "call", OP2 (X8_F24, X8_C24)) { @@ -477,8 +477,8 @@ VM_NAME (scm_thread *thread) * This instruction is just like "call", except that instead of * dereferencing PROC to find the call target, the call target is * known to be at LABEL, a signed 32-bit offset in 32-bit units from - * the current IP. Since PROC is not dereferenced, it may be some - * other representation of the closure. + * the current IP. Since PROC is not used to compute the callee code, + * it may be some other representation of the closure. */ VM_DEFINE_OP (4, call_label, "call-label", OP3 (X8_F24, X8_C24, L32)) { @@ -656,6 +656,12 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* arguments<=? expected:24 + * + * Set the LESS_THAN, EQUAL, or NONE comparison result values if the + * number of arguments is respectively less than, equal to, or greater + * than EXPECTED. + */ VM_DEFINE_OP (14, check_arguments, "arguments<=?", OP1 (X8_C24)) { uint8_t compare_result; @@ -677,6 +683,13 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* positional-arguments<=? nreq:24 _:8 expected:24 + * + * Set the LESS_THAN, EQUAL, or NONE comparison result values if the + * number of positional arguments is less than, equal to, or greater + * than EXPECTED. The first NREQ arguments are positional arguments, + * as are the subsequent arguments that are not keywords. + */ VM_DEFINE_OP (15, check_positional_arguments, "positional-arguments<=?", OP2 (X8_C24, X8_C24)) { uint8_t compare_result; @@ -786,9 +799,8 @@ VM_NAME (scm_thread *thread) /* alloc-frame nlocals:24 * - * Ensure that there is space on the stack for NLOCALS local variables, - * setting them all to SCM_UNDEFINED, except those nargs values that - * were passed as arguments and procedure. + * Ensure that there is space on the stack for NLOCALS local variables. + * setting any new stack slots to SCM_UNDEFINED. */ VM_DEFINE_OP (18, alloc_frame, "alloc-frame", OP1 (X8_C24)) { @@ -805,9 +817,10 @@ VM_NAME (scm_thread *thread) /* reset-frame nlocals:24 * - * Like alloc-frame, but doesn't check that the stack is big enough. - * Used to reset the frame size to something less than the size that - * was previously set via alloc-frame. + * Like alloc-frame, but doesn't check that the stack is big enough, + * and doesn't reset stack slots to SCM_UNDEFINED. Used to reset the + * frame size to something less than the size that was previously set + * via alloc-frame. */ VM_DEFINE_OP (19, reset_frame, "reset-frame", OP1 (X8_C24)) { @@ -965,10 +978,10 @@ VM_NAME (scm_thread *thread) /* subr-call idx:24 * - * Call a subr, passing all locals in this frame as arguments. Return - * from the calling frame. This instruction is part of the - * trampolines created in gsubr.c, and is not generated by the - * compiler. + * Call a subr, passing all locals in this frame as arguments, and + * storing the results on the stack, ready to be returned. This + * instruction is part of the trampolines created in gsubr.c, and is + * not generated by the compiler. */ VM_DEFINE_OP (28, subr_call, "subr-call", OP1 (X8_C24)) { @@ -997,10 +1010,10 @@ VM_NAME (scm_thread *thread) /* foreign-call cif-idx:12 ptr-idx:12 * * Call a foreign function. Fetch the CIF and foreign pointer from - * CIF-IDX and PTR-IDX, both free variables. Return from the calling - * frame. Arguments are taken from the stack. This instruction is - * part of the trampolines created by the FFI, and is not generated by - * the compiler. + * the CIF-IDX and PTR-IDX closure slots of the callee. Arguments are + * taken from the stack, and results placed on the stack, ready to be + * returned. This instruction is part of the trampolines created by + * the FFI, and is not generated by the compiler. */ VM_DEFINE_OP (29, foreign_call, "foreign-call", OP1 (X8_C12_C12)) { @@ -1289,7 +1302,11 @@ VM_NAME (scm_thread *thread) NEXT (0); } - + /* call-thread _:24 IDX:32 + * + * Call the void-returning instrinsic with index IDX, passing the + * current scm_thread* as the argument. + */ VM_DEFINE_OP (41, call_thread, "call-thread", OP2 (X32, C32)) { scm_t_thread_intrinsic intrinsic; @@ -1303,6 +1320,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-thread-scm a:24 IDX:32 + * + * Call the void-returning instrinsic with index IDX, passing the + * current scm_thread* and the SCM local A as arguments. + */ VM_DEFINE_OP (42, call_thread_scm, "call-thread-scm", OP2 (X8_S24, C32)) { uint32_t a; @@ -1318,6 +1340,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-thread-scm-scm a:12 b:12 IDX:32 + * + * Call the void-returning instrinsic with index IDX, passing the + * current scm_thread* and the SCM locals A and B as arguments. + */ VM_DEFINE_OP (43, call_thread_scm_scm, "call-thread-scm-scm", OP2 (X8_S12_S12, C32)) { uint16_t a, b; @@ -1333,6 +1360,13 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-scm-sz-u32 a:8 b:8 c:8 IDX:32 + * + * Call the void-returning instrinsic with index IDX, passing the + * locals A, B, and C as arguments. A is a SCM value, while B and C + * are raw u64 values which fit into size_t and uint32_t types, + * respectively. + */ VM_DEFINE_OP (44, call_scm_sz_u32, "call-scm-sz-u32", OP2 (X8_S8_S8_S8, C32)) { uint8_t a, b, c; @@ -1348,6 +1382,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-thread dst:24 IDX:32 + * + * Call the SCM-returning instrinsic with index IDX, passing the + * current scm_thread* as argument. Place the SCM result in DST. + */ VM_DEFINE_OP (45, call_scm_from_thread, "call-scm<-thread", DOP2 (X8_S24, C32)) { uint32_t dst; @@ -1366,6 +1405,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-s64<-scm dst:12 a:12 IDX:32 + * + * Call the int64_t-returning instrinsic with index IDX, passing the + * SCM local A as argument. Place the s64 result in DST. + */ VM_DEFINE_OP (46, call_s64_from_scm, "call-s64<-scm", DOP2 (X8_S12_S12, C32)) { uint16_t dst, src; @@ -1391,6 +1435,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-scm<-u64 dst:12 a:12 IDX:32 + * + * Call the SCM-returning instrinsic with index IDX, passing the + * uint64_t local A as argument. Place the SCM result in DST. + */ VM_DEFINE_OP (47, call_scm_from_u64, "call-scm<-u64", DOP2 (X8_S12_S12, C32)) { uint16_t dst, src; @@ -1415,6 +1464,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-scm<-s64 dst:12 a:12 IDX:32 + * + * Call the SCM-returning instrinsic with index IDX, passing the + * int64_t local A as argument. Place the SCM result in DST. + */ VM_DEFINE_OP (48, call_scm_from_s64, "call-scm<-s64", DOP2 (X8_S12_S12, C32)) { uint16_t dst, src; @@ -1436,6 +1490,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-scm<-scm dst:12 a:12 IDX:32 + * + * Call the SCM-returning instrinsic with index IDX, passing the SCM + * local A as argument. Place the SCM result in DST. + */ VM_DEFINE_OP (49, call_scm_from_scm, "call-scm<-scm", DOP2 (X8_S12_S12, C32)) { uint16_t dst, src; @@ -1453,6 +1512,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-f64<-scm dst:12 a:12 IDX:32 + * + * Call the double-returning instrinsic with index IDX, passing the + * SCM local A as argument. Place the f64 result in DST. + */ VM_DEFINE_OP (50, call_f64_from_scm, "call-f64<-scm", DOP2 (X8_S12_S12, C32)) { uint16_t dst, src; @@ -1470,6 +1534,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-u64<-scm dst:12 a:12 IDX:32 + * + * Call the uint64_t-returning instrinsic with index IDX, passing the + * SCM local A as argument. Place the u64 result in DST. + */ VM_DEFINE_OP (51, call_u64_from_scm, "call-u64<-scm", DOP2 (X8_S12_S12, C32)) { uint16_t dst, src; @@ -1495,6 +1564,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-scm<-scm-scm dst:8 a:8 b:8 IDX:32 + * + * Call the SCM-returning instrinsic with index IDX, passing the SCM + * locals A and B as arguments. Place the SCM result in DST. + */ VM_DEFINE_OP (52, call_scm_from_scm_scm, "call-scm<-scm-scm", DOP2 (X8_S8_S8_S8, C32)) { uint8_t dst, a, b; @@ -1512,6 +1586,12 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-scm<-scm-uimm dst:8 a:8 b:8 IDX:32 + * + * Call the SCM-returning instrinsic with index IDX, passing the SCM + * local A and the uint8_t immediate B as arguments. Place the SCM + * result in DST. + */ VM_DEFINE_OP (53, call_scm_from_scm_uimm, "call-scm<-scm-uimm", DOP2 (X8_S8_S8_C8, C32)) { uint8_t dst, a, b; @@ -1529,6 +1609,12 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-scm<-thread-scm dst:12 a:12 IDX:32 + * + * Call the SCM-returning instrinsic with index IDX, passing the + * current scm_thread* and SCM local A as arguments. Place the SCM + * result in DST. + */ VM_DEFINE_OP (54, call_scm_from_thread_scm, "call-scm<-thread-scm", DOP2 (X8_S12_S12, C32)) { uint16_t dst, src; @@ -1547,6 +1633,11 @@ VM_NAME (scm_thread *thread) NEXT (2); } + /* call-scm<-scm-u64 dst:8 a:8 b:8 IDX:32 + * + * Call the SCM-returning instrinsic with index IDX, passing SCM local + * A and u64 local B as arguments. Place the SCM result in DST. + */ VM_DEFINE_OP (55, call_scm_from_scm_u64, "call-scm<-scm-u64", DOP2 (X8_S8_S8_S8, C32)) { uint8_t dst, a, b; @@ -1738,6 +1829,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* allocate-words dst:12 count:12 + * + * Allocate a fresh GC-traced object consisting of COUNT words and + * store it into DST. COUNT is a u64 local. + */ VM_DEFINE_OP (65, allocate_words, "allocate-words", DOP1 (X8_S12_S12)) { uint16_t dst, size; @@ -1749,6 +1845,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* allocate-words/immediate dst:12 count:12 + * + * Allocate a fresh GC-traced object consisting of COUNT words and + * store it into DST. COUNT is an immediate. + */ VM_DEFINE_OP (66, allocate_words_immediate, "allocate-words/immediate", DOP1 (X8_S12_C12)) { uint16_t dst, size; @@ -1761,6 +1862,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* scm-ref dst:8 obj:8 idx:8 + * + * Load the SCM object at word offset IDX from local OBJ, and store it + * to DST. + */ VM_DEFINE_OP (67, scm_ref, "scm-ref", DOP1 (X8_S8_S8_S8)) { uint8_t dst, obj, idx; @@ -1772,6 +1878,10 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* scm-set! obj:8 idx:8 val:8 + * + * Store the SCM local VAL into object OBJ at word offset IDX. + */ VM_DEFINE_OP (68, scm_set, "scm-set!", OP1 (X8_S8_S8_S8)) { uint8_t obj, idx, val; @@ -1783,6 +1893,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* scm-ref/tag dst:8 obj:8 tag:8 + * + * Reference the first word of OBJ, subtract the immediate TAG, and + * store the resulting SCM to DST. + */ VM_DEFINE_OP (69, scm_ref_tag, "scm-ref/tag", DOP1 (X8_S8_S8_C8)) { uint8_t dst, obj, tag; @@ -1794,6 +1909,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* scm-ref/tag dst:8 obj:8 tag:8 + * + * Reference the first word of OBJ, subtract the immediate TAG, and + * store the resulting SCM to DST. + */ VM_DEFINE_OP (70, scm_set_tag, "scm-set!/tag", OP1 (X8_S8_C8_S8)) { uint8_t obj, tag, val; @@ -1805,6 +1925,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* scm-ref/immediate dst:8 obj:8 idx:8 + * + * Load the SCM object at word offset IDX from local OBJ, and store it + * to DST. IDX is a uint8_t immediate. + */ VM_DEFINE_OP (71, scm_ref_immediate, "scm-ref/immediate", DOP1 (X8_S8_S8_C8)) { uint8_t dst, obj, idx; @@ -1816,6 +1941,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* scm-set!/immediate obj:8 idx:8 val:8 + * + * Store the SCM local VAL into object OBJ at word offset IDX. IDX is + * a uint8_t immediate. + */ VM_DEFINE_OP (72, scm_set_immediate, "scm-set!/immediate", OP1 (X8_S8_C8_S8)) { uint8_t obj, idx, val; @@ -1827,6 +1957,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* word-ref dst:8 obj:8 idx:8 + * + * Load the word at offset IDX from local OBJ, and store it to u64 + * DST. + */ VM_DEFINE_OP (73, word_ref, "word-ref", DOP1 (X8_S8_S8_S8)) { uint8_t dst, obj, idx; @@ -1838,6 +1973,10 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* word-set! obj:8 idx:8 val:8 + * + * Store the u64 local VAL into object OBJ at word offset IDX. + */ VM_DEFINE_OP (74, word_set, "word-set!", OP1 (X8_S8_S8_S8)) { uint8_t obj, idx, val; @@ -1849,6 +1988,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* word-ref/immediate dst:8 obj:8 idx:8 + * + * Load the word at offset IDX from local OBJ, and store it to u64 + * DST. IDX is a uint8_t immediate. + */ VM_DEFINE_OP (75, word_ref_immediate, "word-ref/immediate", DOP1 (X8_S8_S8_C8)) { uint8_t dst, obj, idx; @@ -1860,6 +2004,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* word-set!/immediate obj:8 idx:8 val:8 + * + * Store the u64 local VAL into object OBJ at word offset IDX. IDX is + * a uint8_t immediate. + */ VM_DEFINE_OP (76, word_set_immediate, "word-set!/immediate", OP1 (X8_S8_C8_S8)) { uint8_t obj, idx, val; @@ -1871,6 +2020,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* pointer-ref/immediate dst:8 obj:8 idx:8 + * + * Load the pointer at offset IDX from local OBJ, and store it to DST. + * IDX is a uint8_t immediate. + */ VM_DEFINE_OP (77, pointer_ref_immediate, "pointer-ref/immediate", DOP1 (X8_S8_S8_C8)) { uint8_t dst, obj, idx; @@ -1882,6 +2036,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* pointer-set!/immediate obj:8 idx:8 val:8 + * + * Store the pointer local VAL into object OBJ at offset IDX. IDX is + * a uint8_t immediate. + */ VM_DEFINE_OP (78, pointer_set_immediate, "pointer-set!/immediate", OP1 (X8_S8_C8_S8)) { uint8_t obj, idx, val; @@ -1893,6 +2052,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* tail-pointer-ref/immediate dst:8 obj:8 idx:8 + * + * Compute the address of word offset IDX from local OBJ, and store it + * to DST. IDX is a uint8_t immediate. + */ VM_DEFINE_OP (79, tail_pointer_ref_immediate, "tail-pointer-ref/immediate", DOP1 (X8_S8_S8_C8)) { uint8_t dst, obj, idx; @@ -1904,7 +2068,13 @@ VM_NAME (scm_thread *thread) NEXT (1); } - VM_DEFINE_OP (80, atomic_ref_scm_immediate, "atomic-scm-ref/immediate", DOP1 (X8_S8_S8_C8)) + /* scm-ref/immediate dst:8 obj:8 idx:8 + * + * Atomically reference the SCM object at word offset IDX from local + * OBJ, and store it to DST, using the sequential consistency memory + * model. IDX is a uint8_t immediate. + */ + VM_DEFINE_OP (80, atomic_scm_ref_immediate, "atomic-scm-ref/immediate", DOP1 (X8_S8_S8_C8)) { uint8_t dst, obj, offset; SCM *loc; @@ -1914,7 +2084,13 @@ VM_NAME (scm_thread *thread) NEXT (1); } - VM_DEFINE_OP (81, atomic_set_scm_immediate, "atomic-scm-set!/immediate", OP1 (X8_S8_C8_S8)) + /* atomic-scm-set!/immediate obj:8 idx:8 val:8 + * + * Atomically store the SCM local VAL into object OBJ at word offset + * IDX, using the sequentially consistent memory model. IDX is a + * uint8_t immediate. + */ + VM_DEFINE_OP (81, atomic_scm_set_immediate, "atomic-scm-set!/immediate", OP1 (X8_S8_C8_S8)) { uint8_t obj, offset, val; SCM *loc; @@ -1924,6 +2100,12 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* atomic-scm-swap!/immediate dst:24 _:8 obj:24 idx:8 val:24 + * + * Atomically swap the SCM value stored in object OBJ at word offset + * IDX with VAL, using the sequentially consistent memory model. IDX + * is a uint8_t immediate. Return the previous value to DST. + */ VM_DEFINE_OP (82, atomic_scm_swap_immediate, "atomic-scm-swap!/immediate", DOP3 (X8_S24, X8_S24, C8_S24)) { uint32_t dst, obj, val; @@ -1937,6 +2119,14 @@ VM_NAME (scm_thread *thread) NEXT (3); } + /* atomic-scm-compare-and-swap!/immediate dst:24 _:8 obj:24 idx:8 expected:24 _:8 desired:24 + * + * Atomically swap the SCM value stored in object OBJ at word offset + * IDX with DESIRED, if and only if the value that was there was + * EXPECTED, using the sequentially consistent memory model. IDX is a + * uint8_t immediate. Return the value that was stored at IDX from + * OBJ in DST. + */ VM_DEFINE_OP (83, atomic_scm_compare_and_swap_immediate, "atomic-scm-compare-and-swap!/immediate", DOP4 (X8_S24, X8_S24, C8_S24, X8_S24)) { uint32_t dst, obj, expected, desired; @@ -2027,6 +2217,11 @@ VM_NAME (scm_thread *thread) NEXT (3); } + /* tag-char dst:12 src:12 + * + * Make a SCM character whose integer value is the u64 in SRC, and + * store it in DST. + */ VM_DEFINE_OP (87, tag_char, "tag-char", DOP1 (X8_S12_S12)) { uint16_t dst, src; @@ -2037,6 +2232,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* untag-char dst:12 src:12 + * + * Extract the integer value from the SCM character SRC, and store the + * resulting u64 in DST. + */ VM_DEFINE_OP (88, untag_char, "untag-char", DOP1 (X8_S12_S12)) { uint16_t dst, src; @@ -2045,6 +2245,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* tag-fixnum dst:12 src:12 + * + * Make a SCM integer whose value is the s64 in SRC, and store it in + * DST. + */ VM_DEFINE_OP (89, tag_fixnum, "tag-fixnum", DOP1 (X8_S12_S12)) { uint16_t dst, src; @@ -2056,6 +2261,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* untag-fixnum dst:12 src:12 + * + * Extract the integer value from the SCM integer SRC, and store the + * resulting s64 in DST. + */ VM_DEFINE_OP (90, untag_fixnum, "untag-fixnum", DOP1 (X8_S12_S12)) { uint16_t dst, src; @@ -2370,6 +2580,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* u64=? a:12 b:12 + * + * Set the comparison result to EQUAL if the u64 values A and B are + * the same, or NONE otherwise. + */ VM_DEFINE_OP (111, u64_numerically_equal, "u64=?", OP1 (X8_S12_S12)) { uint16_t a, b; @@ -2384,6 +2599,11 @@ VM_NAME (scm_thread *thread) NEXT (1); } + /* u64