diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index b4f30c25..00cd7de5 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -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: diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 4268f4de..79a99463 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -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; diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index 24931608..1cab3983 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -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)