From 6a7db3db183a9e109703d41165144676f0a8057e Mon Sep 17 00:00:00 2001 From: Ronald Caesar Date: Fri, 23 Jan 2026 19:08:44 -0400 Subject: [PATCH] engine: add operand bit extraction Also tracks the current position in the constants array. Signed-off-by: Ronald Caesar --- include/bal_engine.h | 6 ++++-- include/bal_types.h | 1 + src/bal_engine.c | 32 +++++++++++++++++++++++++------- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/include/bal_engine.h b/include/bal_engine.h index 54fc0c8..78f244c 100644 --- a/include/bal_engine.h +++ b/include/bal_engine.h @@ -59,8 +59,10 @@ BAL_ALIGNED(64) typedef struct /// arrays. bal_instruction_count_t instruction_count; - /// Padding to maintain 64 byte alignment. - char _padding[2]; + /// The number of constants emiited. + /// + /// This tracks the current position in the `constants` array. + bal_constant_count_t constant_count; /// The current error state of the Engine. /// diff --git a/include/bal_types.h b/include/bal_types.h index 7c44d9b..1e72101 100644 --- a/include/bal_types.h +++ b/include/bal_types.h @@ -13,6 +13,7 @@ typedef uint64_t bal_guest_address_t; typedef uint64_t bal_instruction_t; typedef uint32_t bal_constant_t; typedef uint16_t bal_instruction_count_t; +typedef uint16_t bal_constant_count_t; typedef uint16_t bal_ssa_id_t; typedef uint8_t bal_bit_width_t; diff --git a/src/bal_engine.c b/src/bal_engine.c index b347b96..ff0ced1 100644 --- a/src/bal_engine.c +++ b/src/bal_engine.c @@ -1,4 +1,5 @@ #include "bal_engine.h" +#include "bal_decoder.h" #include #include @@ -57,13 +58,14 @@ bal_engine_init (bal_allocator_t *allocator, bal_engine_t *engine) engine->instructions = (bal_instruction_t *)(data + offset_instructions); engine->ssa_bit_widths = (bal_bit_width_t *)(data + offset_ssa_bit_widths); engine->constants = (bal_constant_t *)(data + offset_constants); - engine->source_variables_size = source_variables_size / sizeof(bal_source_variable_t); - engine->instructions_size = instructions_size / sizeof(bal_instruction_t); - engine->constants_size = constants_size / sizeof(bal_constant_t); - engine->instruction_count = 0; - engine->status = BAL_SUCCESS; - engine->arena_base = (void *)data; - engine->arena_size = total_size_with_padding; + engine->source_variables_size + = source_variables_size / sizeof(bal_source_variable_t); + engine->instructions_size = instructions_size / sizeof(bal_instruction_t); + engine->constants_size = constants_size / sizeof(bal_constant_t); + engine->instruction_count = 0; + engine->status = BAL_SUCCESS; + engine->arena_base = (void *)data; + engine->arena_size = total_size_with_padding; (void)memset(engine->source_variables, POISON_UNINITIALIZED_MEMORY, @@ -106,6 +108,8 @@ bal_engine_translate (bal_engine_t *BAL_RESTRICT engine, bal_source_variable_t *BAL_RESTRICT source_variables_base = engine->source_variables; + bal_constant_t constant_count = engine->constant_count; + bal_instruction_count_t instruction_count = engine->instruction_count; const uint32_t *BAL_RESTRICT arm_instruction_cursor = arm_entry_point; while (ir_instruction_cursor < ir_instruction_end) @@ -150,3 +154,17 @@ bal_engine_destroy (bal_allocator_t *allocator, bal_engine_t *engine) engine->instructions = NULL; engine->ssa_bit_widths = NULL; } + +BAL_HOT static uint32_t +extract_operand_value (bal_instruction_t instruction, + bal_decoder_operand_t *operand) +{ + if (BAL_OPERAND_TYPE_NONE == operand->type) + { + return 0; + } + + uint32_t mask = (1U << (uint32_t)operand->bit_width) - 1; + uint32_t bits = (instruction >> (uint32_t)operand->bit_position) & mask; + return bits; +}