aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2020-09-28 17:16:57 +0200
committerLemonBoy <thatlemon@gmail.com>2020-09-28 17:16:57 +0200
commitcbbcf609688d70ce9e45bde444b2904b39a0ae2c (patch)
tree2d691a3896b897a88c99335f1babb5501f04d7eb /src
parent56b52dd0a357f87627fe96dc99377a397f3bb9a1 (diff)
downloadzig-cbbcf609688d70ce9e45bde444b2904b39a0ae2c.tar.gz
zig-cbbcf609688d70ce9e45bde444b2904b39a0ae2c.zip
stage1: Allow comparison with comptime-known vectors
Since comptime_{int,float} vectors are not allowed (thanks $DEITY) we can use the element type infos to determine the minimum operand size.
Diffstat (limited to 'src')
-rw-r--r--src/ir.cpp14
1 files changed, 4 insertions, 10 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 871c6739e6..d8d7289dae 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -16715,16 +16715,12 @@ static IrInstGen *ir_analyze_bin_op_cmp_numeric(IrAnalyze *ira, IrInst *source_i
}
ZigType *dest_float_type = nullptr;
uint32_t op1_bits;
- if (instr_is_comptime(op1)) {
+ if (instr_is_comptime(op1) && result_type->id != ZigTypeIdVector) {
ZigValue *op1_val = ir_resolve_const(ira, op1, UndefOk);
if (op1_val == nullptr)
return ira->codegen->invalid_inst_gen;
if (op1_val->special == ConstValSpecialUndef)
return ir_const_undef(ira, source_instr, ira->codegen->builtin_types.entry_bool);
- if (result_type->id == ZigTypeIdVector) {
- ir_add_error(ira, &op1->base, buf_sprintf("compiler bug: TODO: support comptime vector here"));
- return ira->codegen->invalid_inst_gen;
- }
bool is_unsigned;
if (op1_is_float) {
BigInt bigint = {};
@@ -16750,6 +16746,7 @@ static IrInstGen *ir_analyze_bin_op_cmp_numeric(IrAnalyze *ira, IrInst *source_i
op1_bits += 1;
}
} else if (op1_is_float) {
+ ir_assert(op1_scalar_type->id == ZigTypeIdFloat, source_instr);
dest_float_type = op1_scalar_type;
} else {
ir_assert(op1_scalar_type->id == ZigTypeIdInt, source_instr);
@@ -16759,16 +16756,12 @@ static IrInstGen *ir_analyze_bin_op_cmp_numeric(IrAnalyze *ira, IrInst *source_i
}
}
uint32_t op2_bits;
- if (instr_is_comptime(op2)) {
+ if (instr_is_comptime(op2) && result_type->id != ZigTypeIdVector) {
ZigValue *op2_val = ir_resolve_const(ira, op2, UndefOk);
if (op2_val == nullptr)
return ira->codegen->invalid_inst_gen;
if (op2_val->special == ConstValSpecialUndef)
return ir_const_undef(ira, source_instr, ira->codegen->builtin_types.entry_bool);
- if (result_type->id == ZigTypeIdVector) {
- ir_add_error(ira, &op2->base, buf_sprintf("compiler bug: TODO: support comptime vector here"));
- return ira->codegen->invalid_inst_gen;
- }
bool is_unsigned;
if (op2_is_float) {
BigInt bigint = {};
@@ -16794,6 +16787,7 @@ static IrInstGen *ir_analyze_bin_op_cmp_numeric(IrAnalyze *ira, IrInst *source_i
op2_bits += 1;
}
} else if (op2_is_float) {
+ ir_assert(op2_scalar_type->id == ZigTypeIdFloat, source_instr);
dest_float_type = op2_scalar_type;
} else {
ir_assert(op2_scalar_type->id == ZigTypeIdInt, source_instr);