[PATCH] R600: Custom lower f32 = SINT_TO_FP i64

Tom Stellard thomas.stellard at amd.com
Tue Apr 7 12:59:15 PDT 2015


---
 lib/Target/R600/AMDGPUISelLowering.cpp | 11 ++++++++---
 test/CodeGen/R600/sint_to_fp.f32.ll    | 15 +++++++++++++++
 2 files changed, 23 insertions(+), 3 deletions(-)
 create mode 100644 test/CodeGen/R600/sint_to_fp.f32.ll

diff --git a/lib/Target/R600/AMDGPUISelLowering.cpp b/lib/Target/R600/AMDGPUISelLowering.cpp
index 62a33fa..2b266be 100644
--- a/lib/Target/R600/AMDGPUISelLowering.cpp
+++ b/lib/Target/R600/AMDGPUISelLowering.cpp
@@ -2194,9 +2194,14 @@ SDValue AMDGPUTargetLowering::LowerUINT_TO_FP(SDValue Op,
 SDValue AMDGPUTargetLowering::LowerSINT_TO_FP(SDValue Op,
                                               SelectionDAG &DAG) const {
   SDValue Src = Op.getOperand(0);
-  if (Src.getValueType() == MVT::i64 && Op.getValueType() == MVT::f64)
-    return LowerINT_TO_FP64(Op, DAG, true);
-
+  if (Src.getValueType() == MVT::i64) {
+    SDValue OpFP64 = LowerINT_TO_FP64(Op, DAG, true);
+    if (Op.getValueType() == MVT::f64)
+      return OpFP64;
+    else if(Op.getValueType() == MVT::f32)
+      return DAG.getNode(ISD::FP_ROUND, SDLoc(Op), MVT::f32, OpFP64,
+                         DAG.getConstant(0, MVT::i32));
+  }
   return SDValue();
 }
 
diff --git a/test/CodeGen/R600/sint_to_fp.f32.ll b/test/CodeGen/R600/sint_to_fp.f32.ll
new file mode 100644
index 0000000..ef18ca7
--- /dev/null
+++ b/test/CodeGen/R600/sint_to_fp.f32.ll
@@ -0,0 +1,15 @@
+; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
+; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
+
+; FUNC-LABEL: {{^}}sint_to_fp_i64_f32:
+; SI: s_load_dwordx2 s{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}, s[{{[0-9]+:[0-9]+}}]
+; SI: v_cvt_f64_i32_e32 [[DST_HI:v[[0-9]+:[0-9]+]]], s[[HI]]
+; SI: v_ldexp_f64 [[LDEXP:v[[0-9]+:[0-9]+]]], [[DST_HI]], 32
+; SI: v_cvt_f64_u32_e32 [[DST_LO:v[[0-9]+:[0-9]+]]], s[[LO]]
+; SI: v_add_f64 [[ADD:v[[0-9]+:[0-9]+]]], [[DST_HI]], [[DST_LO]]
+; SI: v_cvt_f32_f64_e32 v{{[0-9]+}}, [[ADD]]
+define void @sint_to_fp_i64_f32(float addrspace(1)* %out, i64 %in) {
+  %tmp0 = sitofp i64 %in to float
+  store float %tmp0, float addrspace(1)* %out
+  ret void
+}
-- 
2.0.4




More information about the llvm-commits mailing list