@@ -15945,85 +15945,239 @@ static Stage1AirInst *ir_analyze_instruction_optional_unwrap_ptr(IrAnalyze *ira,
15945
15945
}
15946
15946
15947
15947
static Stage1AirInst *ir_analyze_instruction_ctz(IrAnalyze *ira, Stage1ZirInstCtz *instruction) {
15948
+ Error err;
15949
+
15948
15950
ZigType *int_type = ir_resolve_int_type(ira, instruction->type->child);
15949
15951
if (type_is_invalid(int_type))
15950
15952
return ira->codegen->invalid_inst_gen;
15951
15953
15952
- Stage1AirInst *op = ir_implicit_cast(ira, instruction->op->child, int_type);
15954
+ Stage1AirInst *uncasted_op = instruction->op->child;
15955
+ if (type_is_invalid(uncasted_op->value->type))
15956
+ return ira->codegen->invalid_inst_gen;
15957
+
15958
+ uint32_t vector_len = UINT32_MAX; // means not a vector
15959
+ if (uncasted_op->value->type->id == ZigTypeIdArray) {
15960
+ bool can_be_vec_elem;
15961
+ if ((err = is_valid_vector_elem_type(ira->codegen, uncasted_op->value->type->data.array.child_type,
15962
+ &can_be_vec_elem)))
15963
+ {
15964
+ return ira->codegen->invalid_inst_gen;
15965
+ }
15966
+ if (can_be_vec_elem) {
15967
+ vector_len = uncasted_op->value->type->data.array.len;
15968
+ }
15969
+ } else if (uncasted_op->value->type->id == ZigTypeIdVector) {
15970
+ vector_len = uncasted_op->value->type->data.vector.len;
15971
+ }
15972
+
15973
+ bool is_vector = (vector_len != UINT32_MAX);
15974
+ ZigType *op_type = is_vector ? get_vector_type(ira->codegen, vector_len, int_type) : int_type;
15975
+
15976
+ Stage1AirInst *op = ir_implicit_cast(ira, uncasted_op, op_type);
15953
15977
if (type_is_invalid(op->value->type))
15954
15978
return ira->codegen->invalid_inst_gen;
15955
15979
15956
15980
if (int_type->data.integral.bit_count == 0)
15957
15981
return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, 0);
15958
15982
15983
+ ZigType *smallest_type = get_smallest_unsigned_int_type(ira->codegen, int_type->data.integral.bit_count);
15984
+
15959
15985
if (instr_is_comptime(op)) {
15960
15986
ZigValue *val = ir_resolve_const(ira, op, UndefOk);
15961
15987
if (val == nullptr)
15962
15988
return ira->codegen->invalid_inst_gen;
15963
15989
if (val->special == ConstValSpecialUndef)
15964
15990
return ir_const_undef(ira, instruction->base.scope, instruction->base.source_node, ira->codegen->builtin_types.entry_num_lit_int);
15965
- size_t result_usize = bigint_ctz(&op->value->data.x_bigint, int_type->data.integral.bit_count);
15966
- return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, result_usize);
15991
+
15992
+ if (is_vector) {
15993
+ ZigType *smallest_vec_type = get_vector_type(ira->codegen, vector_len, smallest_type);
15994
+ Stage1AirInst *result = ir_const(ira, instruction->base.scope, instruction->base.source_node, smallest_vec_type);
15995
+ expand_undef_array(ira->codegen, val);
15996
+ result->value->data.x_array.data.s_none.elements = ira->codegen->pass1_arena->allocate<ZigValue>(smallest_vec_type->data.vector.len);
15997
+ for (unsigned i = 0; i < smallest_vec_type->data.vector.len; i += 1) {
15998
+ ZigValue *op_elem_val = &val->data.x_array.data.s_none.elements[i];
15999
+ if ((err = ir_resolve_const_val(ira->codegen, ira->new_irb.exec, instruction->base.source_node,
16000
+ op_elem_val, UndefOk)))
16001
+ {
16002
+ return ira->codegen->invalid_inst_gen;
16003
+ }
16004
+ ZigValue *result_elem_val = &result->value->data.x_array.data.s_none.elements[i];
16005
+ result_elem_val->type = smallest_type;
16006
+ result_elem_val->special = op_elem_val->special;
16007
+ if (op_elem_val->special == ConstValSpecialUndef)
16008
+ continue;
16009
+ size_t value = bigint_ctz(&op_elem_val->data.x_bigint, int_type->data.integral.bit_count);
16010
+ bigint_init_unsigned(&result->value->data.x_array.data.s_none.elements[i].data.x_bigint, value);
16011
+ }
16012
+ return result;
16013
+ } else {
16014
+ size_t result_usize = bigint_ctz(&op->value->data.x_bigint, int_type->data.integral.bit_count);
16015
+ return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, result_usize);
16016
+ }
15967
16017
}
15968
16018
15969
- ZigType *return_type = get_smallest_unsigned_int_type (ira->codegen, int_type->data.integral.bit_count) ;
16019
+ ZigType *return_type = is_vector ? get_vector_type (ira->codegen, vector_len, smallest_type) : smallest_type ;
15970
16020
return ir_build_ctz_gen(ira, instruction->base.scope, instruction->base.source_node, return_type, op);
15971
16021
}
15972
16022
15973
16023
static Stage1AirInst *ir_analyze_instruction_clz(IrAnalyze *ira, Stage1ZirInstClz *instruction) {
16024
+ Error err;
16025
+
15974
16026
ZigType *int_type = ir_resolve_int_type(ira, instruction->type->child);
15975
16027
if (type_is_invalid(int_type))
15976
16028
return ira->codegen->invalid_inst_gen;
15977
16029
15978
- Stage1AirInst *op = ir_implicit_cast(ira, instruction->op->child, int_type);
16030
+ Stage1AirInst *uncasted_op = instruction->op->child;
16031
+ if (type_is_invalid(uncasted_op->value->type))
16032
+ return ira->codegen->invalid_inst_gen;
16033
+
16034
+ uint32_t vector_len = UINT32_MAX; // means not a vector
16035
+ if (uncasted_op->value->type->id == ZigTypeIdArray) {
16036
+ bool can_be_vec_elem;
16037
+ if ((err = is_valid_vector_elem_type(ira->codegen, uncasted_op->value->type->data.array.child_type,
16038
+ &can_be_vec_elem)))
16039
+ {
16040
+ return ira->codegen->invalid_inst_gen;
16041
+ }
16042
+ if (can_be_vec_elem) {
16043
+ vector_len = uncasted_op->value->type->data.array.len;
16044
+ }
16045
+ } else if (uncasted_op->value->type->id == ZigTypeIdVector) {
16046
+ vector_len = uncasted_op->value->type->data.vector.len;
16047
+ }
16048
+
16049
+ bool is_vector = (vector_len != UINT32_MAX);
16050
+ ZigType *op_type = is_vector ? get_vector_type(ira->codegen, vector_len, int_type) : int_type;
16051
+
16052
+ Stage1AirInst *op = ir_implicit_cast(ira, uncasted_op, op_type);
15979
16053
if (type_is_invalid(op->value->type))
15980
16054
return ira->codegen->invalid_inst_gen;
15981
16055
15982
16056
if (int_type->data.integral.bit_count == 0)
15983
16057
return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, 0);
15984
16058
16059
+ ZigType *smallest_type = get_smallest_unsigned_int_type(ira->codegen, int_type->data.integral.bit_count);
16060
+
15985
16061
if (instr_is_comptime(op)) {
15986
16062
ZigValue *val = ir_resolve_const(ira, op, UndefOk);
15987
16063
if (val == nullptr)
15988
16064
return ira->codegen->invalid_inst_gen;
15989
16065
if (val->special == ConstValSpecialUndef)
15990
16066
return ir_const_undef(ira, instruction->base.scope, instruction->base.source_node, ira->codegen->builtin_types.entry_num_lit_int);
15991
- size_t result_usize = bigint_clz(&op->value->data.x_bigint, int_type->data.integral.bit_count);
15992
- return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, result_usize);
16067
+
16068
+ if (is_vector) {
16069
+ ZigType *smallest_vec_type = get_vector_type(ira->codegen, vector_len, smallest_type);
16070
+ Stage1AirInst *result = ir_const(ira, instruction->base.scope, instruction->base.source_node, smallest_vec_type);
16071
+ expand_undef_array(ira->codegen, val);
16072
+ result->value->data.x_array.data.s_none.elements = ira->codegen->pass1_arena->allocate<ZigValue>(smallest_vec_type->data.vector.len);
16073
+ for (unsigned i = 0; i < smallest_vec_type->data.vector.len; i += 1) {
16074
+ ZigValue *op_elem_val = &val->data.x_array.data.s_none.elements[i];
16075
+ if ((err = ir_resolve_const_val(ira->codegen, ira->new_irb.exec, instruction->base.source_node,
16076
+ op_elem_val, UndefOk)))
16077
+ {
16078
+ return ira->codegen->invalid_inst_gen;
16079
+ }
16080
+ ZigValue *result_elem_val = &result->value->data.x_array.data.s_none.elements[i];
16081
+ result_elem_val->type = smallest_type;
16082
+ result_elem_val->special = op_elem_val->special;
16083
+ if (op_elem_val->special == ConstValSpecialUndef)
16084
+ continue;
16085
+ size_t value = bigint_clz(&op_elem_val->data.x_bigint, int_type->data.integral.bit_count);
16086
+ bigint_init_unsigned(&result->value->data.x_array.data.s_none.elements[i].data.x_bigint, value);
16087
+ }
16088
+ return result;
16089
+ } else {
16090
+ size_t result_usize = bigint_clz(&op->value->data.x_bigint, int_type->data.integral.bit_count);
16091
+ return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, result_usize);
16092
+ }
15993
16093
}
15994
16094
15995
- ZigType *return_type = get_smallest_unsigned_int_type (ira->codegen, int_type->data.integral.bit_count) ;
16095
+ ZigType *return_type = is_vector ? get_vector_type (ira->codegen, vector_len, smallest_type) : smallest_type ;
15996
16096
return ir_build_clz_gen(ira, instruction->base.scope, instruction->base.source_node, return_type, op);
15997
16097
}
15998
16098
15999
16099
static Stage1AirInst *ir_analyze_instruction_pop_count(IrAnalyze *ira, Stage1ZirInstPopCount *instruction) {
16100
+ Error err;
16101
+
16000
16102
ZigType *int_type = ir_resolve_int_type(ira, instruction->type->child);
16001
16103
if (type_is_invalid(int_type))
16002
16104
return ira->codegen->invalid_inst_gen;
16003
16105
16004
- Stage1AirInst *op = ir_implicit_cast(ira, instruction->op->child, int_type);
16106
+ Stage1AirInst *uncasted_op = instruction->op->child;
16107
+ if (type_is_invalid(uncasted_op->value->type))
16108
+ return ira->codegen->invalid_inst_gen;
16109
+
16110
+ uint32_t vector_len = UINT32_MAX; // means not a vector
16111
+ if (uncasted_op->value->type->id == ZigTypeIdArray) {
16112
+ bool can_be_vec_elem;
16113
+ if ((err = is_valid_vector_elem_type(ira->codegen, uncasted_op->value->type->data.array.child_type,
16114
+ &can_be_vec_elem)))
16115
+ {
16116
+ return ira->codegen->invalid_inst_gen;
16117
+ }
16118
+ if (can_be_vec_elem) {
16119
+ vector_len = uncasted_op->value->type->data.array.len;
16120
+ }
16121
+ } else if (uncasted_op->value->type->id == ZigTypeIdVector) {
16122
+ vector_len = uncasted_op->value->type->data.vector.len;
16123
+ }
16124
+
16125
+ bool is_vector = (vector_len != UINT32_MAX);
16126
+ ZigType *op_type = is_vector ? get_vector_type(ira->codegen, vector_len, int_type) : int_type;
16127
+
16128
+ Stage1AirInst *op = ir_implicit_cast(ira, uncasted_op, op_type);
16005
16129
if (type_is_invalid(op->value->type))
16006
16130
return ira->codegen->invalid_inst_gen;
16007
16131
16008
16132
if (int_type->data.integral.bit_count == 0)
16009
16133
return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, 0);
16010
16134
16135
+ ZigType *smallest_type = get_smallest_unsigned_int_type(ira->codegen, int_type->data.integral.bit_count);
16136
+
16011
16137
if (instr_is_comptime(op)) {
16012
16138
ZigValue *val = ir_resolve_const(ira, op, UndefOk);
16013
16139
if (val == nullptr)
16014
16140
return ira->codegen->invalid_inst_gen;
16015
16141
if (val->special == ConstValSpecialUndef)
16016
16142
return ir_const_undef(ira, instruction->base.scope, instruction->base.source_node, ira->codegen->builtin_types.entry_num_lit_int);
16143
+
16144
+ if (is_vector) {
16145
+ ZigType *smallest_vec_type = get_vector_type(ira->codegen, vector_len, smallest_type);
16146
+ Stage1AirInst *result = ir_const(ira, instruction->base.scope, instruction->base.source_node, smallest_vec_type);
16147
+ expand_undef_array(ira->codegen, val);
16148
+ result->value->data.x_array.data.s_none.elements = ira->codegen->pass1_arena->allocate<ZigValue>(smallest_vec_type->data.vector.len);
16149
+ for (unsigned i = 0; i < smallest_vec_type->data.vector.len; i += 1) {
16150
+ ZigValue *op_elem_val = &val->data.x_array.data.s_none.elements[i];
16151
+ if ((err = ir_resolve_const_val(ira->codegen, ira->new_irb.exec, instruction->base.source_node,
16152
+ op_elem_val, UndefOk)))
16153
+ {
16154
+ return ira->codegen->invalid_inst_gen;
16155
+ }
16156
+ ZigValue *result_elem_val = &result->value->data.x_array.data.s_none.elements[i];
16157
+ result_elem_val->type = smallest_type;
16158
+ result_elem_val->special = op_elem_val->special;
16159
+ if (op_elem_val->special == ConstValSpecialUndef)
16160
+ continue;
16017
16161
16018
- if (bigint_cmp_zero(&val->data.x_bigint) != CmpLT) {
16019
- size_t result = bigint_popcount_unsigned(&val->data.x_bigint);
16162
+ if (bigint_cmp_zero(&op_elem_val->data.x_bigint) != CmpLT) {
16163
+ size_t value = bigint_popcount_unsigned(&op_elem_val->data.x_bigint);
16164
+ bigint_init_unsigned(&result->value->data.x_array.data.s_none.elements[i].data.x_bigint, value);
16165
+ }
16166
+ size_t value = bigint_popcount_signed(&op_elem_val->data.x_bigint, int_type->data.integral.bit_count);
16167
+ bigint_init_unsigned(&result->value->data.x_array.data.s_none.elements[i].data.x_bigint, value);
16168
+ }
16169
+ return result;
16170
+ } else {
16171
+ if (bigint_cmp_zero(&val->data.x_bigint) != CmpLT) {
16172
+ size_t result = bigint_popcount_unsigned(&val->data.x_bigint);
16173
+ return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, result);
16174
+ }
16175
+ size_t result = bigint_popcount_signed(&val->data.x_bigint, int_type->data.integral.bit_count);
16020
16176
return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, result);
16021
16177
}
16022
- size_t result = bigint_popcount_signed(&val->data.x_bigint, int_type->data.integral.bit_count);
16023
- return ir_const_unsigned(ira, instruction->base.scope, instruction->base.source_node, result);
16024
16178
}
16025
16179
16026
- ZigType *return_type = get_smallest_unsigned_int_type (ira->codegen, int_type->data.integral.bit_count) ;
16180
+ ZigType *return_type = is_vector ? get_vector_type (ira->codegen, vector_len, smallest_type) : smallest_type ;
16027
16181
return ir_build_pop_count_gen(ira, instruction->base.scope, instruction->base.source_node, return_type, op);
16028
16182
}
16029
16183
0 commit comments