aco: implement b2i8/b2i16
Fixes lots of tests under dEQP-VK.spirv_assembly.type.* Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5993>
This commit is contained in:
@@ -2693,18 +2693,25 @@ void visit_alu_instr(isel_context *ctx, nir_alu_instr *instr)
|
||||
break;
|
||||
}
|
||||
case nir_op_b2b32:
|
||||
case nir_op_b2i32: {
|
||||
case nir_op_b2i8:
|
||||
case nir_op_b2i16:
|
||||
case nir_op_b2i32:
|
||||
case nir_op_b2i64: {
|
||||
Temp src = get_alu_src(ctx, instr->src[0]);
|
||||
assert(src.regClass() == bld.lm);
|
||||
|
||||
if (dst.regClass() == s1) {
|
||||
Temp tmp = dst.bytes() == 8 ? bld.tmp(RegClass::get(dst.type(), 4)) : dst;
|
||||
if (tmp.regClass() == s1) {
|
||||
// TODO: in a post-RA optimization, we can check if src is in VCC, and directly use VCCNZ
|
||||
bool_to_scalar_condition(ctx, src, dst);
|
||||
} else if (dst.regClass() == v1) {
|
||||
bld.vop2_e64(aco_opcode::v_cndmask_b32, Definition(dst), Operand(0u), Operand(1u), src);
|
||||
bool_to_scalar_condition(ctx, src, tmp);
|
||||
} else if (tmp.type() == RegType::vgpr) {
|
||||
bld.vop2_e64(aco_opcode::v_cndmask_b32, Definition(tmp), Operand(0u), Operand(1u), src);
|
||||
} else {
|
||||
unreachable("Invalid register class for b2i32");
|
||||
}
|
||||
|
||||
if (tmp != dst)
|
||||
bld.pseudo(aco_opcode::p_create_vector, Definition(dst), tmp, Operand(0u));
|
||||
break;
|
||||
}
|
||||
case nir_op_b2b1:
|
||||
|
@@ -532,7 +532,10 @@ void init_context(isel_context *ctx, nir_shader *shader)
|
||||
case nir_op_f2u32:
|
||||
case nir_op_f2i64:
|
||||
case nir_op_f2u64:
|
||||
case nir_op_b2i8:
|
||||
case nir_op_b2i16:
|
||||
case nir_op_b2i32:
|
||||
case nir_op_b2i64:
|
||||
case nir_op_b2b32:
|
||||
case nir_op_b2f16:
|
||||
case nir_op_b2f32:
|
||||
|
Reference in New Issue
Block a user