From eac1672c4e66397067a750b2f06d134ab10400ad Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 13 Aug 2024 16:16:55 -0700 Subject: [PATCH] begin sketching out eval paths for small string operations --- src/df/gfx/df_gfx.mdesk | 2 +- src/df/gfx/df_views.c | 3 -- src/df/gfx/generated/df_gfx.meta.c | 8 ++-- src/eval/eval_ir.c | 51 +++------------------- src/eval/eval_ir.h | 2 - src/eval/eval_parse.h | 1 - src/lib_rdi_format/rdi_format.c | 5 ++- src/lib_rdi_format/rdi_format.h | 68 ++++++++++++++++-------------- src/rdi_format/rdi_format.mdesk | 63 ++++++++++++++------------- 9 files changed, 86 insertions(+), 117 deletions(-) diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index 54e04694..9460364b 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -341,7 +341,7 @@ DF_GfxViewRuleTable: @data(DF_ViewSpecInfo) @c_file df_g_gfx_view_rule_tab_view_spec_info_table: { @expand(DF_GfxViewRuleTable a) - ```$(a.tu == "x" -> '{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("' .. a.string .. '_view_rule"), str8_lit_comp("' .. a.tab_display_string .. '"), DF_IconKind_Binoculars, ' .. 'DF_VIEW_SETUP_FUNCTION_NAME(' .. a.string .. '), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(' .. a.string .. '), DF_VIEW_CMD_FUNCTION_NAME(' .. a.string .. '), DF_VIEW_UI_FUNCTION_NAME(' .. a.string .. ') }')```; + ```$(a.tu == "x" -> '{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery|DF_ViewSpecFlag_FilterIsCode, str8_lit_comp("' .. a.string .. '_view_rule"), str8_lit_comp("' .. a.tab_display_string .. '"), DF_IconKind_Binoculars, ' .. 'DF_VIEW_SETUP_FUNCTION_NAME(' .. a.string .. '), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(' .. a.string .. '), DF_VIEW_CMD_FUNCTION_NAME(' .. a.string .. '), DF_VIEW_UI_FUNCTION_NAME(' .. a.string .. ') }')```; } @data(DF_GfxViewRuleSpecInfo) @c_file df_g_gfx_view_rule_spec_info_table: diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index c58d322b..5342c311 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -2686,7 +2686,6 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS switch(t->node->op) { default:{}break; - case E_IRExtKind_Data:{op_string = str8_lit("Data");}break; case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; #define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; RDI_EvalOp_XList @@ -2712,7 +2711,6 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS switch(op->opcode) { default:{}break; - case E_IRExtKind_Data:{op_string = str8_lit("Data");}break; case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; #define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; RDI_EvalOp_XList @@ -2721,7 +2719,6 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS String8 ext = {0}; switch(op->opcode) { - case E_IRExtKind_Data:{ext = push_str8f(scratch.arena, "'%S'", op->data);}break; case E_IRExtKind_Bytecode:{ext = str8_lit("[bytecode]");}break; default: { diff --git a/src/df/gfx/generated/df_gfx.meta.c b/src/df/gfx/generated/df_gfx.meta.c index 2bded322..543a9571 100644 --- a/src/df/gfx/generated/df_gfx.meta.c +++ b/src/df/gfx/generated/df_gfx.meta.c @@ -206,10 +206,10 @@ str8_lit_comp("function_breakpoint"), DF_ViewSpecInfo df_g_gfx_view_rule_tab_view_spec_info_table[4] = { -{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("text_view_rule"), str8_lit_comp("Text"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(text), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(text), DF_VIEW_CMD_FUNCTION_NAME(text), DF_VIEW_UI_FUNCTION_NAME(text) }, -{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("disasm_view_rule"), str8_lit_comp("Disassembly"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(disasm), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(disasm), DF_VIEW_CMD_FUNCTION_NAME(disasm), DF_VIEW_UI_FUNCTION_NAME(disasm) }, -{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("bitmap_view_rule"), str8_lit_comp("Bitmap"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(bitmap), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(bitmap), DF_VIEW_CMD_FUNCTION_NAME(bitmap), DF_VIEW_UI_FUNCTION_NAME(bitmap) }, -{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("geo_view_rule"), str8_lit_comp("Geometry"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(geo), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(geo), DF_VIEW_CMD_FUNCTION_NAME(geo), DF_VIEW_UI_FUNCTION_NAME(geo) }, +{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery|DF_ViewSpecFlag_FilterIsCode, str8_lit_comp("text_view_rule"), str8_lit_comp("Text"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(text), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(text), DF_VIEW_CMD_FUNCTION_NAME(text), DF_VIEW_UI_FUNCTION_NAME(text) }, +{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery|DF_ViewSpecFlag_FilterIsCode, str8_lit_comp("disasm_view_rule"), str8_lit_comp("Disassembly"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(disasm), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(disasm), DF_VIEW_CMD_FUNCTION_NAME(disasm), DF_VIEW_UI_FUNCTION_NAME(disasm) }, +{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery|DF_ViewSpecFlag_FilterIsCode, str8_lit_comp("bitmap_view_rule"), str8_lit_comp("Bitmap"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(bitmap), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(bitmap), DF_VIEW_CMD_FUNCTION_NAME(bitmap), DF_VIEW_UI_FUNCTION_NAME(bitmap) }, +{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery|DF_ViewSpecFlag_FilterIsCode, str8_lit_comp("geo_view_rule"), str8_lit_comp("Geometry"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(geo), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(geo), DF_VIEW_CMD_FUNCTION_NAME(geo), DF_VIEW_UI_FUNCTION_NAME(geo) }, }; DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[14] = diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 08b7d237..99d76d13 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -133,17 +133,6 @@ e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode) list->encoded_size += bytecode.size; } -internal void -e_oplist_push_data(Arena *arena, E_OpList *list, String8 data) -{ - E_Op *node = push_array_no_zero(arena, E_Op, 1); - node->opcode = E_IRExtKind_Data; - node->data = data; - SLLQueuePush(list->first, list->last, node); - list->op_count += 1; - list->encoded_size += data.size; -} - internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push) { @@ -242,8 +231,8 @@ e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode) internal E_IRNode * e_irtree_string_literal(Arena *arena, String8 string) { - E_IRNode *root = e_push_irnode(arena, E_IRExtKind_Data); - root->string = string; + E_IRNode *root = e_push_irnode(arena, RDI_EvalOp_ConstU512); + root->string = str8(string.str, Min(64, string.size)); return root; } @@ -1043,7 +1032,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRNode *new_tree = e_irtree_string_literal(arena, string); result.root = new_tree; result.type_key = type_key; - result.mode = E_Mode_InlineData; + result.mode = E_Mode_Value; }break; //- rjf: leaf U64s @@ -1149,23 +1138,11 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out) e_oplist_push_bytecode(arena, out, root->string); }break; - case E_IRExtKind_Data: + case RDI_EvalOp_ConstU128: + case RDI_EvalOp_ConstU256: + case RDI_EvalOp_ConstU512: { - // rjf: for inline data in a bytecode stream, we: - // - // 1. generate a const-u64 value on the stack, encoding the offset of the - // data within the bytecode stream - // 2. generate a 'skip' instruction, to skip past the data - // 3. generate the actual data - // - Temp scratch = scratch_begin(&arena, 1); - E_OpList header_calcsize_ops = {0}; - e_oplist_push_op(scratch.arena, &header_calcsize_ops, RDI_EvalOp_ConstU64, 0); - e_oplist_push_op(scratch.arena, &header_calcsize_ops, RDI_EvalOp_Skip, 0); - e_oplist_push_op(arena, out, RDI_EvalOp_ConstU64, out->encoded_size + header_calcsize_ops.encoded_size); - e_oplist_push_op(arena, out, RDI_EvalOp_Skip, root->string.size); - e_oplist_push_data(arena, out, root->string); - scratch_end(scratch); + // TODO(rjf) }break; case RDI_EvalOp_Cond: @@ -1274,20 +1251,6 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist) // rjf: advance ptr = next_ptr; }break; - - case E_IRExtKind_Data: - { - // rjf: compute bytecode advance - U64 size = op->data.size; - U8 *next_ptr = ptr + size; - Assert(next_ptr <= opl); - - // rjf: fill data - MemoryCopy(ptr, op->data.str, op->data.size); - - // rjf: advance - ptr = next_ptr; - }break; } } diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 5a8c6204..e5c72eea 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -10,7 +10,6 @@ enum { E_IRExtKind_Bytecode = RDI_EvalOp_COUNT, - E_IRExtKind_Data, E_IRExtKind_COUNT }; @@ -94,7 +93,6 @@ internal void e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, internal void e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x); internal void e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x); internal void e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode); -internal void e_oplist_push_data(Arena *arena, E_OpList *list, String8 data); internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push); //- rjf: ir tree core building helpers diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index d2ab161f..19e17b4e 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -85,7 +85,6 @@ typedef enum E_Mode E_Mode_Value, E_Mode_Addr, E_Mode_Reg, - E_Mode_InlineData, } E_Mode; diff --git a/src/lib_rdi_format/rdi_format.c b/src/lib_rdi_format/rdi_format.c index 0f0d5c8e..1b947329 100644 --- a/src/lib_rdi_format/rdi_format.c +++ b/src/lib_rdi_format/rdi_format.c @@ -92,7 +92,7 @@ RDI_U8 rdi_section_is_required_table[37] = 0, }; -RDI_U8 rdi_eval_op_ctrlbits_table[45] = +RDI_U8 rdi_eval_op_ctrlbits_table[48] = { RDI_EVAL_CTRLBITS(0, 0, 0), RDI_EVAL_CTRLBITS(0, 0, 0), @@ -110,6 +110,9 @@ RDI_EVAL_CTRLBITS(1, 0, 1), RDI_EVAL_CTRLBITS(2, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1), RDI_EVAL_CTRLBITS(8, 0, 1), +RDI_EVAL_CTRLBITS(16, 0, 1), +RDI_EVAL_CTRLBITS(32, 0, 1), +RDI_EVAL_CTRLBITS(64, 0, 1), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(1, 2, 1), diff --git a/src/lib_rdi_format/rdi_format.h b/src/lib_rdi_format/rdi_format.h index 390c07d9..a1f08180 100644 --- a/src/lib_rdi_format/rdi_format.h +++ b/src/lib_rdi_format/rdi_format.h @@ -52,7 +52,7 @@ typedef int64_t RDI_S64; // \"raddbg\0\0\" #define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 7 +#define RDI_ENCODING_VERSION 8 //////////////////////////////////////////////////////////////// //~ Format Types & Functions @@ -452,35 +452,38 @@ RDI_EvalOp_ConstU8 = 12, RDI_EvalOp_ConstU16 = 13, RDI_EvalOp_ConstU32 = 14, RDI_EvalOp_ConstU64 = 15, -RDI_EvalOp_Abs = 16, -RDI_EvalOp_Neg = 17, -RDI_EvalOp_Add = 18, -RDI_EvalOp_Sub = 19, -RDI_EvalOp_Mul = 20, -RDI_EvalOp_Div = 21, -RDI_EvalOp_Mod = 22, -RDI_EvalOp_LShift = 23, -RDI_EvalOp_RShift = 24, -RDI_EvalOp_BitAnd = 25, -RDI_EvalOp_BitOr = 26, -RDI_EvalOp_BitXor = 27, -RDI_EvalOp_BitNot = 28, -RDI_EvalOp_LogAnd = 29, -RDI_EvalOp_LogOr = 30, -RDI_EvalOp_LogNot = 31, -RDI_EvalOp_EqEq = 32, -RDI_EvalOp_NtEq = 33, -RDI_EvalOp_LsEq = 34, -RDI_EvalOp_GrEq = 35, -RDI_EvalOp_Less = 36, -RDI_EvalOp_Grtr = 37, -RDI_EvalOp_Trunc = 38, -RDI_EvalOp_TruncSigned = 39, -RDI_EvalOp_Convert = 40, -RDI_EvalOp_Pick = 41, -RDI_EvalOp_Pop = 42, -RDI_EvalOp_Insert = 43, -RDI_EvalOp_COUNT = 44, +RDI_EvalOp_ConstU128 = 16, +RDI_EvalOp_ConstU256 = 17, +RDI_EvalOp_ConstU512 = 18, +RDI_EvalOp_Abs = 19, +RDI_EvalOp_Neg = 20, +RDI_EvalOp_Add = 21, +RDI_EvalOp_Sub = 22, +RDI_EvalOp_Mul = 23, +RDI_EvalOp_Div = 24, +RDI_EvalOp_Mod = 25, +RDI_EvalOp_LShift = 26, +RDI_EvalOp_RShift = 27, +RDI_EvalOp_BitAnd = 28, +RDI_EvalOp_BitOr = 29, +RDI_EvalOp_BitXor = 30, +RDI_EvalOp_BitNot = 31, +RDI_EvalOp_LogAnd = 32, +RDI_EvalOp_LogOr = 33, +RDI_EvalOp_LogNot = 34, +RDI_EvalOp_EqEq = 35, +RDI_EvalOp_NtEq = 36, +RDI_EvalOp_LsEq = 37, +RDI_EvalOp_GrEq = 38, +RDI_EvalOp_Less = 39, +RDI_EvalOp_Grtr = 40, +RDI_EvalOp_Trunc = 41, +RDI_EvalOp_TruncSigned = 42, +RDI_EvalOp_Convert = 43, +RDI_EvalOp_Pick = 44, +RDI_EvalOp_Pop = 45, +RDI_EvalOp_Insert = 46, +RDI_EvalOp_COUNT = 47, } RDI_EvalOpEnum; typedef RDI_U8 RDI_EvalTypeGroup; @@ -854,6 +857,9 @@ X(ConstU8)\ X(ConstU16)\ X(ConstU32)\ X(ConstU64)\ +X(ConstU128)\ +X(ConstU256)\ +X(ConstU512)\ X(Abs)\ X(Neg)\ X(Add)\ @@ -1351,6 +1357,6 @@ RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConver extern RDI_U16 rdi_section_element_size_table[37]; extern RDI_U8 rdi_section_is_required_table[37]; -extern RDI_U8 rdi_eval_op_ctrlbits_table[45]; +extern RDI_U8 rdi_eval_op_ctrlbits_table[48]; #endif // RDI_FORMAT_H diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index f346b9b4..45a95846 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -62,7 +62,7 @@ ""; "// \"raddbg\0\0\""; "#define RDI_MAGIC_CONSTANT 0x0000676264646172"; - "#define RDI_ENCODING_VERSION 7"; + "#define RDI_ENCODING_VERSION 8"; ""; "////////////////////////////////////////////////////////////////"; "//~ Format Types & Functions"; @@ -1245,35 +1245,38 @@ RDI_EvalOpTable: {ConstU16 13 2 0 1} {ConstU32 14 4 0 1} {ConstU64 15 8 0 1} - {Abs 16 1 1 1} - {Neg 17 1 1 1} - {Add 18 1 2 1} - {Sub 19 1 2 1} - {Mul 20 1 2 1} - {Div 21 1 2 1} - {Mod 22 1 2 1} - {LShift 23 1 2 1} - {RShift 24 1 2 1} - {BitAnd 25 1 2 1} - {BitOr 26 1 2 1} - {BitXor 27 1 2 1} - {BitNot 28 1 1 1} - {LogAnd 29 1 2 1} - {LogOr 30 1 2 1} - {LogNot 31 1 1 1} - {EqEq 32 1 2 1} - {NtEq 33 1 2 1} - {LsEq 34 1 2 1} - {GrEq 35 1 2 1} - {Less 36 1 2 1} - {Grtr 37 1 2 1} - {Trunc 38 1 1 1} - {TruncSigned 39 1 1 1} - {Convert 40 2 1 1} - {Pick 41 1 0 1} - {Pop 42 0 1 0} - {Insert 43 1 0 0} - {COUNT 44 0 0 0} + {ConstU128 16 16 0 1} + {ConstU256 17 32 0 1} + {ConstU512 18 64 0 1} + {Abs 19 1 1 1} + {Neg 20 1 1 1} + {Add 21 1 2 1} + {Sub 22 1 2 1} + {Mul 23 1 2 1} + {Div 24 1 2 1} + {Mod 25 1 2 1} + {LShift 26 1 2 1} + {RShift 27 1 2 1} + {BitAnd 28 1 2 1} + {BitOr 29 1 2 1} + {BitXor 30 1 2 1} + {BitNot 31 1 1 1} + {LogAnd 32 1 2 1} + {LogOr 33 1 2 1} + {LogNot 34 1 1 1} + {EqEq 35 1 2 1} + {NtEq 36 1 2 1} + {LsEq 37 1 2 1} + {GrEq 38 1 2 1} + {Less 39 1 2 1} + {Grtr 40 1 2 1} + {Trunc 41 1 1 1} + {TruncSigned 42 1 1 1} + {Convert 43 2 1 1} + {Pick 44 1 0 1} + {Pop 45 0 1 0} + {Insert 46 1 0 0} + {COUNT 47 0 0 0} } // NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form