[amdgpu] shader: implement vop3 V_MED3_F32

This commit is contained in:
DH 2023-07-30 19:35:39 +03:00
parent 72b52166d3
commit 32a9febee4

View file

@ -2770,6 +2770,33 @@ void convertVop3(Fragment &fragment, Vop3 inst) {
fragment.setVectorOperand(inst.vdst, {floatT, result});
break;
}
case Vop3::Op::V3_MED3_F32: {
auto src0 = spirv::cast<spirv::FloatValue>(
fragment.getScalarOperand(inst.src0, TypeId::Float32).value);
auto src1 = spirv::cast<spirv::FloatValue>(
fragment.getScalarOperand(inst.src1, TypeId::Float32).value);
auto src2 = spirv::cast<spirv::FloatValue>(
fragment.getScalarOperand(inst.src2, TypeId::Float32).value);
auto boolT = fragment.context->getBoolType();
auto floatT = fragment.context->getFloat32Type();
auto glslStd450 = fragment.context->getGlslStd450();
auto min01 = fragment.builder.createSelect(
floatT, fragment.builder.createFOrdLessThan(boolT, src0, src1), src0,
src1);
auto max01 = fragment.builder.createSelect(
floatT, fragment.builder.createFOrdGreaterThan(boolT, src0, src1), src0,
src1);
auto minMax011 = fragment.builder.createSelect(
floatT, fragment.builder.createFOrdLessThan(boolT, max01, src2), max01,
src2);
auto result = fragment.builder.createExtInst(
floatT, glslStd450, GLSLstd450NMax, {{min01, minMax011}});
fragment.setVectorOperand(inst.vdst, {floatT, result});
}
case Vop3::Op::V3_FMA_F32: {
auto src0 = spirv::cast<spirv::FloatValue>(
fragment.getScalarOperand(inst.src0, TypeId::Float32).value);