begin sketching out eval paths for small string operations

This commit is contained in:
Ryan Fleury
2024-08-13 16:16:55 -07:00
parent 07c4e6ee87
commit eac1672c4e
9 changed files with 86 additions and 117 deletions
+1 -1
View File
@@ -341,7 +341,7 @@ DF_GfxViewRuleTable:
@data(DF_ViewSpecInfo) @c_file df_g_gfx_view_rule_tab_view_spec_info_table: @data(DF_ViewSpecInfo) @c_file df_g_gfx_view_rule_tab_view_spec_info_table:
{ {
@expand(DF_GfxViewRuleTable a) @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: @data(DF_GfxViewRuleSpecInfo) @c_file df_g_gfx_view_rule_spec_info_table:
-3
View File
@@ -2686,7 +2686,6 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
switch(t->node->op) switch(t->node->op)
{ {
default:{}break; default:{}break;
case E_IRExtKind_Data:{op_string = str8_lit("Data");}break;
case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break;
#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; #define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break;
RDI_EvalOp_XList 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) switch(op->opcode)
{ {
default:{}break; default:{}break;
case E_IRExtKind_Data:{op_string = str8_lit("Data");}break;
case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break;
#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; #define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break;
RDI_EvalOp_XList 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}; String8 ext = {0};
switch(op->opcode) 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; case E_IRExtKind_Bytecode:{ext = str8_lit("[bytecode]");}break;
default: default:
{ {
+4 -4
View File
@@ -206,10 +206,10 @@ str8_lit_comp("function_breakpoint"),
DF_ViewSpecInfo df_g_gfx_view_rule_tab_view_spec_info_table[4] = 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|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, 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("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|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, 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("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] = DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[14] =
+7 -44
View File
@@ -133,17 +133,6 @@ e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode)
list->encoded_size += bytecode.size; 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 internal void
e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push) 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 * internal E_IRNode *
e_irtree_string_literal(Arena *arena, String8 string) e_irtree_string_literal(Arena *arena, String8 string)
{ {
E_IRNode *root = e_push_irnode(arena, E_IRExtKind_Data); E_IRNode *root = e_push_irnode(arena, RDI_EvalOp_ConstU512);
root->string = string; root->string = str8(string.str, Min(64, string.size));
return root; 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); E_IRNode *new_tree = e_irtree_string_literal(arena, string);
result.root = new_tree; result.root = new_tree;
result.type_key = type_key; result.type_key = type_key;
result.mode = E_Mode_InlineData; result.mode = E_Mode_Value;
}break; }break;
//- rjf: leaf U64s //- 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); e_oplist_push_bytecode(arena, out, root->string);
}break; }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: // TODO(rjf)
//
// 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);
}break; }break;
case RDI_EvalOp_Cond: case RDI_EvalOp_Cond:
@@ -1274,20 +1251,6 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist)
// rjf: advance // rjf: advance
ptr = next_ptr; ptr = next_ptr;
}break; }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;
} }
} }
-2
View File
@@ -10,7 +10,6 @@
enum enum
{ {
E_IRExtKind_Bytecode = RDI_EvalOp_COUNT, E_IRExtKind_Bytecode = RDI_EvalOp_COUNT,
E_IRExtKind_Data,
E_IRExtKind_COUNT 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_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_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_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); internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push);
//- rjf: ir tree core building helpers //- rjf: ir tree core building helpers
-1
View File
@@ -85,7 +85,6 @@ typedef enum E_Mode
E_Mode_Value, E_Mode_Value,
E_Mode_Addr, E_Mode_Addr,
E_Mode_Reg, E_Mode_Reg,
E_Mode_InlineData,
} }
E_Mode; E_Mode;
+4 -1
View File
@@ -92,7 +92,7 @@ RDI_U8 rdi_section_is_required_table[37] =
0, 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),
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(2, 0, 1),
RDI_EVAL_CTRLBITS(4, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1),
RDI_EVAL_CTRLBITS(8, 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, 1, 1), RDI_EVAL_CTRLBITS(1, 1, 1),
RDI_EVAL_CTRLBITS(1, 2, 1), RDI_EVAL_CTRLBITS(1, 2, 1),
+37 -31
View File
@@ -52,7 +52,7 @@ typedef int64_t RDI_S64;
// \"raddbg\0\0\" // \"raddbg\0\0\"
#define RDI_MAGIC_CONSTANT 0x0000676264646172 #define RDI_MAGIC_CONSTANT 0x0000676264646172
#define RDI_ENCODING_VERSION 7 #define RDI_ENCODING_VERSION 8
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
//~ Format Types & Functions //~ Format Types & Functions
@@ -452,35 +452,38 @@ RDI_EvalOp_ConstU8 = 12,
RDI_EvalOp_ConstU16 = 13, RDI_EvalOp_ConstU16 = 13,
RDI_EvalOp_ConstU32 = 14, RDI_EvalOp_ConstU32 = 14,
RDI_EvalOp_ConstU64 = 15, RDI_EvalOp_ConstU64 = 15,
RDI_EvalOp_Abs = 16, RDI_EvalOp_ConstU128 = 16,
RDI_EvalOp_Neg = 17, RDI_EvalOp_ConstU256 = 17,
RDI_EvalOp_Add = 18, RDI_EvalOp_ConstU512 = 18,
RDI_EvalOp_Sub = 19, RDI_EvalOp_Abs = 19,
RDI_EvalOp_Mul = 20, RDI_EvalOp_Neg = 20,
RDI_EvalOp_Div = 21, RDI_EvalOp_Add = 21,
RDI_EvalOp_Mod = 22, RDI_EvalOp_Sub = 22,
RDI_EvalOp_LShift = 23, RDI_EvalOp_Mul = 23,
RDI_EvalOp_RShift = 24, RDI_EvalOp_Div = 24,
RDI_EvalOp_BitAnd = 25, RDI_EvalOp_Mod = 25,
RDI_EvalOp_BitOr = 26, RDI_EvalOp_LShift = 26,
RDI_EvalOp_BitXor = 27, RDI_EvalOp_RShift = 27,
RDI_EvalOp_BitNot = 28, RDI_EvalOp_BitAnd = 28,
RDI_EvalOp_LogAnd = 29, RDI_EvalOp_BitOr = 29,
RDI_EvalOp_LogOr = 30, RDI_EvalOp_BitXor = 30,
RDI_EvalOp_LogNot = 31, RDI_EvalOp_BitNot = 31,
RDI_EvalOp_EqEq = 32, RDI_EvalOp_LogAnd = 32,
RDI_EvalOp_NtEq = 33, RDI_EvalOp_LogOr = 33,
RDI_EvalOp_LsEq = 34, RDI_EvalOp_LogNot = 34,
RDI_EvalOp_GrEq = 35, RDI_EvalOp_EqEq = 35,
RDI_EvalOp_Less = 36, RDI_EvalOp_NtEq = 36,
RDI_EvalOp_Grtr = 37, RDI_EvalOp_LsEq = 37,
RDI_EvalOp_Trunc = 38, RDI_EvalOp_GrEq = 38,
RDI_EvalOp_TruncSigned = 39, RDI_EvalOp_Less = 39,
RDI_EvalOp_Convert = 40, RDI_EvalOp_Grtr = 40,
RDI_EvalOp_Pick = 41, RDI_EvalOp_Trunc = 41,
RDI_EvalOp_Pop = 42, RDI_EvalOp_TruncSigned = 42,
RDI_EvalOp_Insert = 43, RDI_EvalOp_Convert = 43,
RDI_EvalOp_COUNT = 44, RDI_EvalOp_Pick = 44,
RDI_EvalOp_Pop = 45,
RDI_EvalOp_Insert = 46,
RDI_EvalOp_COUNT = 47,
} RDI_EvalOpEnum; } RDI_EvalOpEnum;
typedef RDI_U8 RDI_EvalTypeGroup; typedef RDI_U8 RDI_EvalTypeGroup;
@@ -854,6 +857,9 @@ X(ConstU8)\
X(ConstU16)\ X(ConstU16)\
X(ConstU32)\ X(ConstU32)\
X(ConstU64)\ X(ConstU64)\
X(ConstU128)\
X(ConstU256)\
X(ConstU512)\
X(Abs)\ X(Abs)\
X(Neg)\ X(Neg)\
X(Add)\ 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_U16 rdi_section_element_size_table[37];
extern RDI_U8 rdi_section_is_required_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 #endif // RDI_FORMAT_H
+33 -30
View File
@@ -62,7 +62,7 @@
""; "";
"// \"raddbg\0\0\""; "// \"raddbg\0\0\"";
"#define RDI_MAGIC_CONSTANT 0x0000676264646172"; "#define RDI_MAGIC_CONSTANT 0x0000676264646172";
"#define RDI_ENCODING_VERSION 7"; "#define RDI_ENCODING_VERSION 8";
""; "";
"////////////////////////////////////////////////////////////////"; "////////////////////////////////////////////////////////////////";
"//~ Format Types & Functions"; "//~ Format Types & Functions";
@@ -1245,35 +1245,38 @@ RDI_EvalOpTable:
{ConstU16 13 2 0 1} {ConstU16 13 2 0 1}
{ConstU32 14 4 0 1} {ConstU32 14 4 0 1}
{ConstU64 15 8 0 1} {ConstU64 15 8 0 1}
{Abs 16 1 1 1} {ConstU128 16 16 0 1}
{Neg 17 1 1 1} {ConstU256 17 32 0 1}
{Add 18 1 2 1} {ConstU512 18 64 0 1}
{Sub 19 1 2 1} {Abs 19 1 1 1}
{Mul 20 1 2 1} {Neg 20 1 1 1}
{Div 21 1 2 1} {Add 21 1 2 1}
{Mod 22 1 2 1} {Sub 22 1 2 1}
{LShift 23 1 2 1} {Mul 23 1 2 1}
{RShift 24 1 2 1} {Div 24 1 2 1}
{BitAnd 25 1 2 1} {Mod 25 1 2 1}
{BitOr 26 1 2 1} {LShift 26 1 2 1}
{BitXor 27 1 2 1} {RShift 27 1 2 1}
{BitNot 28 1 1 1} {BitAnd 28 1 2 1}
{LogAnd 29 1 2 1} {BitOr 29 1 2 1}
{LogOr 30 1 2 1} {BitXor 30 1 2 1}
{LogNot 31 1 1 1} {BitNot 31 1 1 1}
{EqEq 32 1 2 1} {LogAnd 32 1 2 1}
{NtEq 33 1 2 1} {LogOr 33 1 2 1}
{LsEq 34 1 2 1} {LogNot 34 1 1 1}
{GrEq 35 1 2 1} {EqEq 35 1 2 1}
{Less 36 1 2 1} {NtEq 36 1 2 1}
{Grtr 37 1 2 1} {LsEq 37 1 2 1}
{Trunc 38 1 1 1} {GrEq 38 1 2 1}
{TruncSigned 39 1 1 1} {Less 39 1 2 1}
{Convert 40 2 1 1} {Grtr 40 1 2 1}
{Pick 41 1 0 1} {Trunc 41 1 1 1}
{Pop 42 0 1 0} {TruncSigned 42 1 1 1}
{Insert 43 1 0 0} {Convert 43 2 1 1}
{COUNT 44 0 0 0} {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 // NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form