ptr/array-value comparison path in eval

This commit is contained in:
Ryan Fleury
2024-08-14 11:29:45 -07:00
parent 918895c091
commit 728120690d
3 changed files with 55 additions and 13 deletions
+4 -2
View File
@@ -498,12 +498,14 @@ e_interpret(String8 bytecode)
case RDI_EvalOp_EqEq:
{
nval.u64 = (svals[0].u64 == svals[1].u64);
B32 result = MemoryMatchArray(svals[0].u512, svals[1].u512);
nval.u64 = !!result;
}break;
case RDI_EvalOp_NtEq:
{
nval.u64 = (svals[0].u64 != svals[1].u64);
B32 result = MemoryMatchArray(svals[0].u512, svals[1].u512);
nval.u64 = !result;
}break;
case RDI_EvalOp_LsEq:
+44 -4
View File
@@ -256,7 +256,7 @@ e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key)
{
U64 byte_size = e_type_byte_size_from_key(type_key);
E_IRNode *result = &e_irnode_nil;
if(0 < byte_size && byte_size <= 8)
if(0 < byte_size && byte_size <= 64)
{
// rjf: build the read node
E_IRNode *read_node = e_push_irnode(arena, RDI_EvalOp_MemRead);
@@ -834,9 +834,10 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
}
// rjf: determine arithmetic path
#define E_ArithPath_Normal 0
#define E_ArithPath_PtrAdd 1
#define E_ArithPath_PtrSub 2
#define E_ArithPath_Normal 0
#define E_ArithPath_PtrAdd 1
#define E_ArithPath_PtrSub 2
#define E_ArithPath_PtrArrayCompare 3
B32 ptr_arithmetic_mul_rptr = 0;
U32 arith_path = E_ArithPath_Normal;
if(kind == E_ExprKind_Add)
@@ -869,6 +870,17 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
}
}
}
else if(kind == E_ExprKind_EqEq)
{
if(l_type_kind == E_TypeKind_Array && r_type_kind == E_TypeKind_Ptr)
{
arith_path = E_ArithPath_PtrArrayCompare;
}
if(r_type_kind == E_TypeKind_Array && l_type_kind == E_TypeKind_Ptr)
{
arith_path = E_ArithPath_PtrArrayCompare;
}
}
// rjf: generate according to arithmetic path
switch(arith_path)
@@ -970,6 +982,34 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.type_key = e_type_key_basic(E_TypeKind_U64);
result.mode = E_Mode_Value;
}break;
//- rjf: pointer array comparison
case E_ArithPath_PtrArrayCompare:
{
// rjf: map l/r to pointer/array
E_IRTreeAndType *ptr_tree = &l_tree;
E_IRTreeAndType *arr_tree = &r_tree;
if(l_type_kind == E_TypeKind_Array)
{
ptr_tree = &r_tree;
arr_tree = &l_tree;
}
// rjf: resolve pointer to value, sized same as array
E_IRNode *ptr_root = ptr_tree->root;
E_IRNode *arr_root = arr_tree->root;
{
ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->mode, ptr_tree->root, ptr_tree->type_key);
}
// rjf: read from pointer into value, to compare with array
E_IRNode *mem_root = e_irtree_mem_read_type(arena, ptr_root, arr_tree->type_key);
// rjf: generate
result.root = e_irtree_binary_op(arena, op, RDI_EvalTypeGroup_Other, mem_root, arr_root);
result.type_key = e_type_key_basic(E_TypeKind_Bool);
result.mode = E_Mode_Value;
}break;
}
}break;
+7 -7
View File
@@ -1279,15 +1279,15 @@ RDI_EvalOpTable:
// NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form
// e.g. x:0, y:0 means other -> other, x:3, y:1 means uint -> f32, etc.
@table(name value ck0 ck1 ck2 ck3 ck4)
@table(name value ck0 ck1 ck2 ck3 ck4)
RDI_EvalTypeGroupTable:
{
{Other 0 OtherToOther FromOther FromOther FromOther FromOther }
{U 1 ToOther Noop Noop Legal Legal }
{S 2 ToOther Noop Noop Legal Legal }
{F32 3 ToOther Legal Legal Noop Legal }
{F64 4 ToOther Legal Legal Legal Noop }
{COUNT 5 Noop Noop Noop Noop Noop }
{Other 0 OtherToOther FromOther FromOther FromOther FromOther }
{U 1 ToOther Noop Noop Legal Legal }
{S 2 ToOther Noop Noop Legal Legal }
{F32 3 ToOther Legal Legal Noop Legal }
{F64 4 ToOther Legal Legal Legal Noop }
{COUNT 5 Noop Noop Noop Noop Noop }
}
@table(name value error_string)