From 954633bba2d71c8c745989292b3f1669ecc7f02b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 2 Oct 2025 18:01:49 -0700 Subject: [PATCH] add opcode for swapping top two values on the stack --- src/eval/eval_interpret.c | 6 ++++++ src/lib_rdi/rdi.c | 3 ++- src/lib_rdi/rdi.h | 6 ++++-- src/rdi/rdi.mdesk | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 4bc92189..38850f8c 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -841,6 +841,12 @@ e_interpret(String8 bytecode) case 8:{nval.u64 = bswap_u64(svals[0].u64);}break; } }break; + + case RDI_EvalOp_Swap: + { + // TODO: add support for pushing multiple values onto the stack + NotImplemented; + }break; } // rjf: push diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index dc297153..943411a9 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -58,7 +58,7 @@ sizeof(RDI_NameMapNode), sizeof(RDI_U8), }; -RDI_U16 rdi_eval_op_ctrlbits_table[52] = +RDI_U16 rdi_eval_op_ctrlbits_table[53] = { RDI_EVAL_CTRLBITS(0, 0, 0), RDI_EVAL_CTRLBITS(0, 0, 0), @@ -111,6 +111,7 @@ RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(4, 0, 0), RDI_EVAL_CTRLBITS(4, 0, 0), RDI_EVAL_CTRLBITS(8, 0, 0), +RDI_EVAL_CTRLBITS(0, 2, 2), RDI_EVAL_CTRLBITS(0, 0, 0), }; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 4d052bce..44da5f21 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -523,7 +523,8 @@ RDI_EvalOp_ByteSwap = 47, RDI_EvalOp_CallSiteValue = 48, RDI_EvalOp_PartialValue = 49, RDI_EvalOp_PartialValueBit = 50, -RDI_EvalOp_COUNT = 51, +RDI_EvalOp_Swap = 51, +RDI_EvalOp_COUNT = 52, } RDI_EvalOpEnum; typedef RDI_U8 RDI_EvalTypeGroup; @@ -1122,6 +1123,7 @@ X(ByteSwap)\ X(CallSiteValue)\ X(PartialValue)\ X(PartialValueBit)\ +X(Swap)\ #define RDI_EvalTypeGroup_XList \ X(Other)\ @@ -1623,6 +1625,6 @@ RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTyp RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); extern RDI_U16 rdi_section_element_size_table[44]; -extern RDI_U16 rdi_eval_op_ctrlbits_table[52]; +extern RDI_U16 rdi_eval_op_ctrlbits_table[53]; #endif // RDI_H diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index d106d98d..6bbcfb95 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1349,7 +1349,8 @@ RDI_EvalOpTable: {CallSiteValue 48 4 0 0} {PartialValue 49 4 0 0} {PartialValueBit 50 8 0 0} - {COUNT 51 0 0 0} + {Swap 51 0 2 2} // swaps the top two entries on the stack + {COUNT 52 0 0 0} } // NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form