radeon/llvm: Replace AMDGPU pow intrinsic with the llvm version
authorTom Stellard <thomas.stellard@amd.com>
Thu, 13 Sep 2012 15:04:15 +0000 (15:04 +0000)
committerTom Stellard <thomas.stellard@amd.com>
Fri, 21 Sep 2012 19:30:53 +0000 (19:30 +0000)
src/gallium/drivers/radeon/AMDGPUISelLowering.cpp
src/gallium/drivers/radeon/AMDGPUInstrInfo.td
src/gallium/drivers/radeon/AMDGPUInstructions.td
src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c

index 3f9c82076f07bb9fe4cce32536bdf17e6a054a71..d6304a2307e2025eaff9142b227e607b52bd4ac9 100644 (file)
@@ -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);
index 4452719686162fb103ca286888172a8c30b17dee..23ca35aadc289df605e7fb9e1f596b7fcf180c40 100644 (file)
@@ -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>;
index 3e850ebe184312905e72407991cbaae55063e8aa..01948731fbb53be3fc0622100e37da363a202e0a 100644 (file)
@@ -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)))
 >;
 
index 04469e28759f02d9bf286214e145fa21e736d5fa..3c2912208842f7b0a403c48cc7bf8a90fae2a48f 100644 (file)
@@ -980,17 +980,33 @@ build_intrinsic(LLVMBuilderRef builder,
    return LLVMBuildCall(builder, function, args, num_args, "");
 }
 
-void
-build_tgsi_intrinsic_nomem(
+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)
+ 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, LLVMReadNoneAttribute);
+               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)
+{
+       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;