diff --git a/llvm/lib/Target/R600/SIISelLowering.cpp b/llvm/lib/Target/R600/SIISelLowering.cpp index c64027f7de09..b714fc19267e 100644 --- a/llvm/lib/Target/R600/SIISelLowering.cpp +++ b/llvm/lib/Target/R600/SIISelLowering.cpp @@ -85,6 +85,9 @@ SITargetLowering::SITargetLowering(TargetMachine &TM) : setLoadExtAction(ISD::SEXTLOAD, MVT::i32, Expand); + setLoadExtAction(ISD::EXTLOAD, MVT::f32, Expand); + setTruncStoreAction(MVT::f64, MVT::f32, Expand); + setOperationAction(ISD::GlobalAddress, MVT::i64, Custom); setTargetDAGCombine(ISD::SELECT_CC); diff --git a/llvm/lib/Target/R600/SIInstructions.td b/llvm/lib/Target/R600/SIInstructions.td index efe7a3ea6801..dc41885c4367 100644 --- a/llvm/lib/Target/R600/SIInstructions.td +++ b/llvm/lib/Target/R600/SIInstructions.td @@ -625,8 +625,12 @@ defm V_MOV_FED_B32 : VOP1_32 <0x00000009, "V_MOV_FED_B32", []>; //defm V_CVT_RPI_I32_F32 : VOP1_32 <0x0000000c, "V_CVT_RPI_I32_F32", []>; //defm V_CVT_FLR_I32_F32 : VOP1_32 <0x0000000d, "V_CVT_FLR_I32_F32", []>; //defm V_CVT_OFF_F32_I4 : VOP1_32 <0x0000000e, "V_CVT_OFF_F32_I4", []>; -//defm V_CVT_F32_F64 : VOP1_32 <0x0000000f, "V_CVT_F32_F64", []>; -//defm V_CVT_F64_F32 : VOP1_64 <0x00000010, "V_CVT_F64_F32", []>; +defm V_CVT_F32_F64 : VOP1_32_64 <0x0000000f, "V_CVT_F32_F64", + [(set f32:$dst, (fround f64:$src0))] +>; +defm V_CVT_F64_F32 : VOP1_64_32 <0x00000010, "V_CVT_F64_F32", + [(set f64:$dst, (fextend f32:$src0))] +>; //defm V_CVT_F32_UBYTE0 : VOP1_32 <0x00000011, "V_CVT_F32_UBYTE0", []>; //defm V_CVT_F32_UBYTE1 : VOP1_32 <0x00000012, "V_CVT_F32_UBYTE1", []>; //defm V_CVT_F32_UBYTE2 : VOP1_32 <0x00000013, "V_CVT_F32_UBYTE2", []>; diff --git a/llvm/test/CodeGen/R600/fpext.ll b/llvm/test/CodeGen/R600/fpext.ll new file mode 100644 index 000000000000..e02c19ce106b --- /dev/null +++ b/llvm/test/CodeGen/R600/fpext.ll @@ -0,0 +1,9 @@ +; RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s --check-prefix=CHECK + +; CHECK: @fpext +; CHECK: V_CVT_F64_F32_e32 +define void @fpext(double addrspace(1)* %out, float %in) { + %result = fpext float %in to double + store double %result, double addrspace(1)* %out + ret void +} diff --git a/llvm/test/CodeGen/R600/fptrunc.ll b/llvm/test/CodeGen/R600/fptrunc.ll new file mode 100644 index 000000000000..2a10f6372298 --- /dev/null +++ b/llvm/test/CodeGen/R600/fptrunc.ll @@ -0,0 +1,9 @@ +; RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s --check-prefix=CHECK + +; CHECK: @fptrunc +; CHECK: V_CVT_F32_F64_e32 +define void @fptrunc(float addrspace(1)* %out, double %in) { + %result = fptrunc double %in to float + store float %result, float addrspace(1)* %out + ret void +}