diff options
| author | gingerBill <bill@gingerbill.org> | 2021-05-12 15:00:19 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-05-12 15:00:19 +0100 |
| commit | d2fcbf0e1d5488ee3d64f94e488122d7800214eb (patch) | |
| tree | 139d192abad36025aedc7e424f0e2baa0097fefb /src | |
| parent | e08f39ec28eaf462ddee6c418721ce4c7a03450e (diff) | |
Fix #948
Diffstat (limited to 'src')
| -rw-r--r-- | src/llvm_backend.cpp | 34 |
1 files changed, 7 insertions, 27 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 28c37be7d..81ccf1659 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -10773,42 +10773,22 @@ lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue ri Type *lt = left.type; Type *rt = right.type; - // if (is_type_bit_set(lt) && is_type_bit_set(rt)) { - // Type *blt = base_type(lt); - // Type *brt = base_type(rt); - // i64 bits = gb_max(blt->BitSet.bits, brt->BitSet.bits); - // i64 bytes = bits / 8; - // switch (bytes) { - // case 1: - // left = lb_emit_conv(p, left, t_u8); - // right = lb_emit_conv(p, right, t_u8); - // break; - // case 2: - // left = lb_emit_conv(p, left, t_u16); - // right = lb_emit_conv(p, right, t_u16); - // break; - // case 4: - // left = lb_emit_conv(p, left, t_u32); - // right = lb_emit_conv(p, right, t_u32); - // break; - // case 8: - // left = lb_emit_conv(p, left, t_u64); - // right = lb_emit_conv(p, right, t_u64); - // break; - // default: GB_PANIC("Unknown integer size"); break; - // } - // } - lt = left.type; rt = right.type; i64 ls = type_size_of(lt); i64 rs = type_size_of(rt); + + // NOTE(bill): Quick heuristic, larger types are usually the target type if (ls < rs) { left = lb_emit_conv(p, left, rt); } else if (ls > rs) { right = lb_emit_conv(p, right, lt); } else { - right = lb_emit_conv(p, right, lt); + if (is_type_union(rt)) { + left = lb_emit_conv(p, left, rt); + } else { + right = lb_emit_conv(p, right, lt); + } } } |