mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-21 02:10:17 +01:00
ac/llvm: fix 64-bit fmed3
Lower 64-bit fmed3 because LLVM doesn't expose an intrinsic. Fixes dEQP-VK.spirv_assembly.instruction.amd_trinary_minmax.mid3.f64.*. Fixes:d6a07732c9("ac: use llvm.amdgcn.fmed3 intrinsic for nir_op_fmed3") Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3962> (cherry picked from commit50b8c25274)
This commit is contained in:
parent
e32110df11
commit
d0bfb09c67
2 changed files with 32 additions and 18 deletions
|
|
@ -3280,7 +3280,7 @@
|
|||
"description": "ac/llvm: fix 64-bit fmed3",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"master_sha": null,
|
||||
"because_sha": "d6a07732c9c155c73f7d2cddc10faa7eab768df9"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -2698,27 +2698,41 @@ LLVMValueRef ac_build_fmed3(struct ac_llvm_context *ctx, LLVMValueRef src0,
|
|||
LLVMValueRef src1, LLVMValueRef src2,
|
||||
unsigned bitsize)
|
||||
{
|
||||
LLVMTypeRef type;
|
||||
char *intr;
|
||||
LLVMValueRef result;
|
||||
|
||||
if (bitsize == 16) {
|
||||
intr = "llvm.amdgcn.fmed3.f16";
|
||||
type = ctx->f16;
|
||||
} else if (bitsize == 32) {
|
||||
intr = "llvm.amdgcn.fmed3.f32";
|
||||
type = ctx->f32;
|
||||
if (bitsize == 64) {
|
||||
/* Lower 64-bit fmed because LLVM doesn't expose an intrinsic. */
|
||||
LLVMValueRef min1, min2, max1;
|
||||
|
||||
min1 = ac_build_fmin(ctx, src0, src1);
|
||||
max1 = ac_build_fmax(ctx, src0, src1);
|
||||
min2 = ac_build_fmin(ctx, max1, src2);
|
||||
|
||||
result = ac_build_fmax(ctx, min2, min1);
|
||||
} else {
|
||||
intr = "llvm.amdgcn.fmed3.f64";
|
||||
type = ctx->f64;
|
||||
LLVMTypeRef type;
|
||||
char *intr;
|
||||
|
||||
if (bitsize == 16) {
|
||||
intr = "llvm.amdgcn.fmed3.f16";
|
||||
type = ctx->f16;
|
||||
} else {
|
||||
assert(bitsize == 32);
|
||||
intr = "llvm.amdgcn.fmed3.f32";
|
||||
type = ctx->f32;
|
||||
}
|
||||
|
||||
LLVMValueRef params[] = {
|
||||
src0,
|
||||
src1,
|
||||
src2,
|
||||
};
|
||||
|
||||
result = ac_build_intrinsic(ctx, intr, type, params, 3,
|
||||
AC_FUNC_ATTR_READNONE);
|
||||
}
|
||||
|
||||
LLVMValueRef params[] = {
|
||||
src0,
|
||||
src1,
|
||||
src2,
|
||||
};
|
||||
return ac_build_intrinsic(ctx, intr, type, params, 3,
|
||||
AC_FUNC_ATTR_READNONE);
|
||||
return result;
|
||||
}
|
||||
|
||||
LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue