aco/tests: add a bunch more building helpers

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/14810>
This commit is contained in:
Rhys Perry 2022-01-27 14:17:23 +00:00 committed by Marge Bot
parent 1410d150e7
commit e86b88f85b
2 changed files with 87 additions and 9 deletions

View file

@ -262,17 +262,86 @@ void writeout(unsigned i, Operand op0, Operand op1)
bld.pseudo(aco_opcode::p_unit_test, Operand::c32(i), op0, op1);
}
Temp fneg(Temp src)
Temp fneg(Temp src, Builder b)
{
return bld.vop2(aco_opcode::v_mul_f32, bld.def(v1), Operand::c32(0xbf800000u), src);
if (src.bytes() == 2)
return b.vop2(aco_opcode::v_mul_f16, b.def(v2b), Operand::c16(0xbc00u), src);
else
return b.vop2(aco_opcode::v_mul_f32, b.def(v1), Operand::c32(0xbf800000u), src);
}
Temp fabs(Temp src)
Temp fabs(Temp src, Builder b)
{
Builder::Result res =
bld.vop2_e64(aco_opcode::v_mul_f32, bld.def(v1), Operand::c32(0x3f800000u), src);
res.instr->vop3().abs[1] = true;
return res;
if (src.bytes() == 2) {
Builder::Result res = b.vop2_e64(aco_opcode::v_mul_f16, b.def(v2b), Operand::c16(0x3c00), src);
res.instr->vop3().abs[1] = true;
return res;
} else {
Builder::Result res = b.vop2_e64(aco_opcode::v_mul_f32, b.def(v1), Operand::c32(0x3f800000u), src);
res.instr->vop3().abs[1] = true;
return res;
}
}
Temp f2f32(Temp src, Builder b)
{
return b.vop1(aco_opcode::v_cvt_f32_f16, b.def(v1), src);
}
Temp f2f16(Temp src, Builder b)
{
return b.vop1(aco_opcode::v_cvt_f16_f32, b.def(v2b), src);
}
Temp u2u16(Temp src, Builder b)
{
return b.pseudo(aco_opcode::p_extract_vector, b.def(v2b), src, Operand::zero());
}
Temp fadd(Temp src0, Temp src1, Builder b)
{
if (src0.bytes() == 2)
return b.vop2(aco_opcode::v_add_f16, b.def(v2b), src0, src1);
else
return b.vop2(aco_opcode::v_add_f32, b.def(v1), src0, src1);
}
Temp fmul(Temp src0, Temp src1, Builder b)
{
if (src0.bytes() == 2)
return b.vop2(aco_opcode::v_mul_f16, b.def(v2b), src0, src1);
else
return b.vop2(aco_opcode::v_mul_f32, b.def(v1), src0, src1);
}
Temp fma(Temp src0, Temp src1, Temp src2, Builder b)
{
if (src0.bytes() == 2)
return b.vop3(aco_opcode::v_fma_f16, b.def(v2b), src0, src1, src2);
else
return b.vop3(aco_opcode::v_fma_f32, b.def(v1), src0, src1, src2);
}
Temp fsat(Temp src, Builder b)
{
if (src.bytes() == 2)
return b.vop3(aco_opcode::v_med3_f16, b.def(v2b), Operand::c16(0u),
Operand::c16(0x3c00u), src);
else
return b.vop3(aco_opcode::v_med3_f32, b.def(v1), Operand::zero(),
Operand::c32(0x3f800000u), src);
}
Temp ext_ushort(Temp src, unsigned idx, Builder b)
{
return b.pseudo(aco_opcode::p_extract, b.def(v1), src, Operand::c32(idx), Operand::c32(16u),
Operand::c32(false));
}
Temp ext_ubyte(Temp src, unsigned idx, Builder b)
{
return b.pseudo(aco_opcode::p_extract, b.def(v1), src, Operand::c32(idx), Operand::c32(8u),
Operand::c32(false));
}
VkDevice get_vk_device(enum chip_class chip_class)

View file

@ -91,8 +91,17 @@ void writeout(unsigned i, aco::Builder::Result res);
void writeout(unsigned i, aco::Operand op);
void writeout(unsigned i, aco::Operand op0, aco::Operand op1);
aco::Temp fneg(aco::Temp src);
aco::Temp fabs(aco::Temp src);
aco::Temp fneg(aco::Temp src, aco::Builder b=bld);
aco::Temp fabs(aco::Temp src, aco::Builder b=bld);
aco::Temp f2f32(aco::Temp src, aco::Builder b=bld);
aco::Temp f2f16(aco::Temp src, aco::Builder b=bld);
aco::Temp u2u16(aco::Temp src, aco::Builder b=bld);
aco::Temp fadd(aco::Temp src0, aco::Temp src1, aco::Builder b=bld);
aco::Temp fmul(aco::Temp src0, aco::Temp src1, aco::Builder b=bld);
aco::Temp fma(aco::Temp src0, aco::Temp src1, aco::Temp src2, aco::Builder b=bld);
aco::Temp fsat(aco::Temp src, aco::Builder b=bld);
aco::Temp ext_ushort(aco::Temp src, unsigned idx, aco::Builder b=bld);
aco::Temp ext_ubyte(aco::Temp src, unsigned idx, aco::Builder b=bld);
/* vulkan helpers */
VkDevice get_vk_device(enum chip_class chip_class);