From e86b88f85bb36235574c765676712d2d488cce4e Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Thu, 27 Jan 2022 14:17:23 +0000 Subject: [PATCH] aco/tests: add a bunch more building helpers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/tests/helpers.cpp | 83 +++++++++++++++++++++++++++--- src/amd/compiler/tests/helpers.h | 13 ++++- 2 files changed, 87 insertions(+), 9 deletions(-) diff --git a/src/amd/compiler/tests/helpers.cpp b/src/amd/compiler/tests/helpers.cpp index 58303346a8d..0b9ce051271 100644 --- a/src/amd/compiler/tests/helpers.cpp +++ b/src/amd/compiler/tests/helpers.cpp @@ -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) diff --git a/src/amd/compiler/tests/helpers.h b/src/amd/compiler/tests/helpers.h index 7299939f327..0e93c0dd177 100644 --- a/src/amd/compiler/tests/helpers.h +++ b/src/amd/compiler/tests/helpers.h @@ -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);