fixes for arithmetic with bitfields; bitfield -> numeric value path in irtree generation; fix bad stomping / mutation when generating a synthetic UFCS tree

This commit is contained in:
Ryan Fleury
2025-05-07 14:19:39 -07:00
parent 1cc5561f1f
commit 9c296cb9b2
3 changed files with 68 additions and 2 deletions
+33 -1
View File
@@ -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<<idx);
}
result = e_irtree_binary_op_u(arena, RDI_EvalOp_RShift, result, e_irtree_const_u(arena, type->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);
+1 -1
View File
@@ -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
+34
View File
@@ -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
{