From 9c296cb9b21516ae73ef5decc8fa51fba867290e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 7 May 2025 14:19:39 -0700 Subject: [PATCH] fixes for arithmetic with bitfields; bitfield -> numeric value path in irtree generation; fix bad stomping / mutation when generating a synthetic UFCS tree --- src/eval/eval_ir.c | 34 ++++++++++++++++++++++++++- src/lib_raddbg_markup/raddbg_markup.h | 2 +- src/mule/mule_main.cpp | 34 +++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 62e88a1a..dc406f93 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -301,6 +301,20 @@ e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_Type { result = e_irtree_mem_read_type(arena, tree, type_key); } + if(e_type_kind_from_key(type_key) == E_TypeKind_Bitfield) + { + E_Type *type = e_type_from_key(type_key); + if(type->byte_size <= sizeof(U64)) + { + U64 valid_bits_mask = 0; + for(U64 idx = 0; idx < type->count; idx += 1) + { + valid_bits_mask |= (1ull<off)); + result = e_irtree_binary_op_u(arena, RDI_EvalOp_BitAnd, result, e_irtree_const_u(arena, valid_bits_mask)); + } + } return result; } @@ -1002,6 +1016,22 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind l_type_kind = e_type_kind_from_key(l_type); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); + + // rjf: resolve complex types to simple arithmetic tyeps + if(l_type_kind == E_TypeKind_Bitfield) + { + l_tree.root = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_tree.type_key); + l_type = e_type_key_unwrap(e_type_key_direct(l_tree.type_key), E_TypeUnwrapFlag_AllDecorative); + l_type_kind = e_type_kind_from_key(r_type); + l_tree.mode = E_Mode_Value; + } + if(r_type_kind == E_TypeKind_Bitfield) + { + r_tree.root = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_tree.type_key); + r_type = e_type_key_unwrap(e_type_key_direct(r_tree.type_key), E_TypeUnwrapFlag_AllDecorative); + r_type_kind = e_type_kind_from_key(r_type); + r_tree.mode = E_Mode_Value; + } if(l_type.kind == E_TypeKeyKind_Reg) { l_type_kind = E_TypeKind_U64; @@ -1012,6 +1042,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 r_type_kind = E_TypeKind_U64; r_type = e_type_key_basic(r_type_kind); } + + // rjf: unpack info about resolved types B32 l_is_pointer = (l_type_kind == E_TypeKind_Ptr); B32 l_is_decay = (l_type_kind == E_TypeKind_Array && l_tree.mode == E_Mode_Offset); B32 l_is_pointer_like = (l_is_pointer || l_is_decay); @@ -1355,7 +1387,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 // calls - for example, bin(2).digits(4) else if(lhs->kind == E_ExprKind_MemberAccess && lhs->first->next != &e_expr_nil) { - E_Expr *callee = lhs->first->next; + E_Expr *callee = e_expr_ref(arena, lhs->first->next); E_Expr *first_arg = e_expr_ref(arena, lhs->first); E_Expr *call = e_push_expr(arena, E_ExprKind_Call, r1u64(0, 0)); e_expr_push_child(call, callee); diff --git a/src/lib_raddbg_markup/raddbg_markup.h b/src/lib_raddbg_markup/raddbg_markup.h index 6a21c40d..4913a86c 100644 --- a/src/lib_raddbg_markup/raddbg_markup.h +++ b/src/lib_raddbg_markup/raddbg_markup.h @@ -34,7 +34,7 @@ # define raddbg_pin(expr, ...) /* NOTE(rjf): inspected by debugger ui - does not change program execution */ # define raddbg_log(fmt, ...) raddbg_log__impl((fmt), __VA_ARGS__) # define raddbg_entry_point(...) raddbg_exe_data char raddbg_gen_data_id()[] = ("entry_point: \"" #__VA_ARGS__ "\"") -# define raddbg_type_view(type, ...) raddbg_exe_data char raddbg_gen_data_id()[] = ("type_view: {type: \"" #type "\", expr: \"" #__VA_ARGS__ "\"}") +# define raddbg_type_view(type, ...) raddbg_exe_data char raddbg_gen_data_id()[] = ("type_view: {type: ```" #type "```, expr: ```" #__VA_ARGS__ "```}") # define raddbg_add_breakpoint(ptr, size, r, w, x) raddbg_add_or_remove_breakpoint__impl((ptr), (1), (size), (r), (w), (x)) # define raddbg_remove_breakpoint(ptr, size, r, w, x) raddbg_add_or_remove_breakpoint__impl((ptr), (0), (size), (r), (w), (x)) #else diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 664e79f1..e2a3b06e 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -196,6 +196,25 @@ union Matrix4x4F32 }; raddbg_type_view(Matrix4x4F32, table($.elements, $[0], $[1], $[2], $[3])); +union PackedF16 +{ + uint16_t v; + struct + { + uint16_t mantissa : 10; + uint16_t exponent : 5; + uint16_t sign : 1; + }; +}; +raddbg_type_view(PackedF16, + exponent == 0 ? (0.00006103515625f*mantissa/1024.f) : + (exponent == 31 && mantissa == 0 && sign == 1) ? "-infinity" : + (exponent == 31 && mantissa == 0 && sign == 1) ? "+infinity" : + (exponent == 31) ? "NaN" : + (exponent < 15) ? (1.f/(1<<(15 - exponent)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) : + (exponent > 15) ? ((1<<(exponent-15)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) : + ((sign * -2 + 1) * 1.f + mantissa/1024.f)); + enum Kind { Kind_None, @@ -1823,6 +1842,21 @@ fancy_viz_eval_tests(void) raddbg_pin(text(code_string, lang=c)); raddbg_pin(disasm(fancy_viz_eval_tests)); + //- rjf: half-floats + PackedF16 f16s[] = + { + {0x0001}, // ~0.000000059604645 + {0x03ff}, // ~0.000060975552 + {0x0400}, // ~0.00006103515625 + {0x3555}, // ~0.33325195 + {0x3bff}, // ~0.99951172 + {0x3c00}, // 1 + {0x3c01}, // 1.00097656 + {0x7bff}, // 65504, + {0x7c00}, // +inf + {0xfc00}, // -inf + }; + //- rjf: table index lookups struct {