[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