mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 06:30:10 +01:00
radeon/llvm: Replace AMDGPU pow intrinsic with the llvm version
This commit is contained in:
parent
aa3c2e3186
commit
87decd6e66
4 changed files with 27 additions and 8 deletions
|
|
@ -34,6 +34,7 @@ AMDGPUTargetLowering::AMDGPUTargetLowering(TargetMachine &TM) :
|
|||
// for them.
|
||||
setOperationAction(ISD::FCEIL, MVT::f32, Legal);
|
||||
setOperationAction(ISD::FEXP2, MVT::f32, Legal);
|
||||
setOperationAction(ISD::FPOW, MVT::f32, Legal);
|
||||
setOperationAction(ISD::FRINT, MVT::f32, Legal);
|
||||
|
||||
setOperationAction(ISD::UDIV, MVT::i32, Expand);
|
||||
|
|
|
|||
|
|
@ -67,3 +67,5 @@ def AMDGPUumin : SDNode<"AMDGPUISD::UMIN", SDTIntBinOp,
|
|||
// out = (2^32 / a) + e
|
||||
// e is rounding error
|
||||
def AMDGPUurecip : SDNode<"AMDGPUISD::URECIP", SDTIntUnaryOp>;
|
||||
|
||||
def fpow : SDNode<"ISD::FPOW", SDTFPBinOp>;
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ def SHADER_TYPE : AMDGPUShaderInst <
|
|||
|
||||
class POW_Common <AMDGPUInst log_ieee, AMDGPUInst exp_ieee, AMDGPUInst mul,
|
||||
RegisterClass rc> : Pat <
|
||||
(int_AMDGPU_pow rc:$src0, rc:$src1),
|
||||
(fpow rc:$src0, rc:$src1),
|
||||
(exp_ieee (mul rc:$src1, (log_ieee rc:$src0)))
|
||||
>;
|
||||
|
||||
|
|
|
|||
|
|
@ -980,17 +980,33 @@ build_intrinsic(LLVMBuilderRef builder,
|
|||
return LLVMBuildCall(builder, function, args, num_args, "");
|
||||
}
|
||||
|
||||
static void build_tgsi_intrinsic(
|
||||
const struct lp_build_tgsi_action * action,
|
||||
struct lp_build_tgsi_context * bld_base,
|
||||
struct lp_build_emit_data * emit_data,
|
||||
LLVMAttribute attr)
|
||||
{
|
||||
struct lp_build_context * base = &bld_base->base;
|
||||
emit_data->output[emit_data->chan] = build_intrinsic(
|
||||
base->gallivm->builder, action->intr_name,
|
||||
emit_data->dst_type, emit_data->args,
|
||||
emit_data->arg_count, attr);
|
||||
}
|
||||
void
|
||||
build_tgsi_intrinsic_nomem(
|
||||
const struct lp_build_tgsi_action * action,
|
||||
struct lp_build_tgsi_context * bld_base,
|
||||
struct lp_build_emit_data * emit_data)
|
||||
{
|
||||
struct lp_build_context * base = &bld_base->base;
|
||||
emit_data->output[emit_data->chan] = build_intrinsic(
|
||||
base->gallivm->builder, action->intr_name,
|
||||
emit_data->dst_type, emit_data->args,
|
||||
emit_data->arg_count, LLVMReadNoneAttribute);
|
||||
build_tgsi_intrinsic(action, bld_base, emit_data, LLVMReadNoneAttribute);
|
||||
}
|
||||
|
||||
static void build_tgsi_intrinsic_readonly(
|
||||
const struct lp_build_tgsi_action * action,
|
||||
struct lp_build_tgsi_context * bld_base,
|
||||
struct lp_build_emit_data * emit_data)
|
||||
{
|
||||
build_tgsi_intrinsic(action, bld_base, emit_data, LLVMReadOnlyAttribute);
|
||||
}
|
||||
|
||||
void radeon_llvm_context_init(struct radeon_llvm_context * ctx)
|
||||
|
|
@ -1147,8 +1163,8 @@ void radeon_llvm_context_init(struct radeon_llvm_context * ctx)
|
|||
bld_base->op_actions[TGSI_OPCODE_MAX].intr_name = "llvm.AMDIL.max.";
|
||||
bld_base->op_actions[TGSI_OPCODE_MUL].emit = build_tgsi_intrinsic_nomem;
|
||||
bld_base->op_actions[TGSI_OPCODE_MUL].intr_name = "llvm.AMDGPU.mul";
|
||||
bld_base->op_actions[TGSI_OPCODE_POW].emit = build_tgsi_intrinsic_nomem;
|
||||
bld_base->op_actions[TGSI_OPCODE_POW].intr_name = "llvm.AMDGPU.pow";
|
||||
bld_base->op_actions[TGSI_OPCODE_POW].emit = build_tgsi_intrinsic_readonly;
|
||||
bld_base->op_actions[TGSI_OPCODE_POW].intr_name = "llvm.pow.f32";
|
||||
bld_base->op_actions[TGSI_OPCODE_RCP].emit = build_tgsi_intrinsic_nomem;
|
||||
bld_base->op_actions[TGSI_OPCODE_RCP].intr_name = "llvm.AMDGPU.rcp";
|
||||
bld_base->op_actions[TGSI_OPCODE_SSG].emit = build_tgsi_intrinsic_nomem;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue