parent
							
								
									3c845b6f1b
								
							
						
					
					
						commit
						c947d8ca64
					
				| 
						 | 
				
			
			@ -134,6 +134,8 @@ AMDGPUTargetLowering::AMDGPUTargetLowering(TargetMachine &TM) :
 | 
			
		|||
  setOperationAction(ISD::FNEG, MVT::v2f32, Expand);
 | 
			
		||||
  setOperationAction(ISD::FNEG, MVT::v4f32, Expand);
 | 
			
		||||
 | 
			
		||||
  setOperationAction(ISD::UINT_TO_FP, MVT::i64, Custom);
 | 
			
		||||
 | 
			
		||||
  setOperationAction(ISD::MUL, MVT::i64, Expand);
 | 
			
		||||
 | 
			
		||||
  setOperationAction(ISD::UDIV, MVT::i32, Expand);
 | 
			
		||||
| 
						 | 
				
			
			@ -251,6 +253,7 @@ SDValue AMDGPUTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG)
 | 
			
		|||
  case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
 | 
			
		||||
  case ISD::STORE: return LowerSTORE(Op, DAG);
 | 
			
		||||
  case ISD::UDIVREM: return LowerUDIVREM(Op, DAG);
 | 
			
		||||
  case ISD::UINT_TO_FP: return LowerUINT_TO_FP(Op, DAG);
 | 
			
		||||
  }
 | 
			
		||||
  return Op;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -672,6 +675,25 @@ SDValue AMDGPUTargetLowering::LowerUDIVREM(SDValue Op,
 | 
			
		|||
  return DAG.getMergeValues(Ops, 2, DL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SDValue AMDGPUTargetLowering::LowerUINT_TO_FP(SDValue Op,
 | 
			
		||||
                                               SelectionDAG &DAG) const {
 | 
			
		||||
  SDValue S0 = Op.getOperand(0);
 | 
			
		||||
  SDLoc DL(Op);
 | 
			
		||||
  if (Op.getValueType() != MVT::f32 || S0.getValueType() != MVT::i64)
 | 
			
		||||
    return SDValue();
 | 
			
		||||
 | 
			
		||||
  // f32 uint_to_fp i64
 | 
			
		||||
  SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, S0,
 | 
			
		||||
                           DAG.getConstant(0, MVT::i32));
 | 
			
		||||
  SDValue FloatLo = DAG.getNode(ISD::UINT_TO_FP, DL, MVT::f32, Lo);
 | 
			
		||||
  SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, S0,
 | 
			
		||||
                           DAG.getConstant(1, MVT::i32));
 | 
			
		||||
  SDValue FloatHi = DAG.getNode(ISD::UINT_TO_FP, DL, MVT::f32, Hi);
 | 
			
		||||
  FloatHi = DAG.getNode(ISD::FMUL, DL, MVT::f32, FloatHi,
 | 
			
		||||
                        DAG.getConstantFP(4294967296.0f, MVT::f32)); // 2^32
 | 
			
		||||
  return DAG.getNode(ISD::FADD, DL, MVT::f32, FloatLo, FloatHi);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//===----------------------------------------------------------------------===//
 | 
			
		||||
// Helper functions
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,7 @@ private:
 | 
			
		|||
  /// \brief Split a vector store into multiple scalar stores.
 | 
			
		||||
  /// \returns The resulting chain. 
 | 
			
		||||
  SDValue LowerUDIVREM(SDValue Op, SelectionDAG &DAG) const;
 | 
			
		||||
  SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s --check-prefix=R600-CHECK
 | 
			
		||||
; RUN: llc < %s -march=r600 -mcpu=SI -verify-machineinstrs | FileCheck %s --check-prefix=SI-CHECK
 | 
			
		||||
 | 
			
		||||
; R600-CHECK: @uint_to_fp_v2i32
 | 
			
		||||
; R600-CHECK-LABEL: @uint_to_fp_v2i32
 | 
			
		||||
; R600-CHECK-DAG: UINT_TO_FLT * T{{[0-9]+\.[XYZW]}}, KC0[2].W
 | 
			
		||||
; R600-CHECK-DAG: UINT_TO_FLT * T{{[0-9]+\.[XYZW]}}, KC0[3].X
 | 
			
		||||
; SI-CHECK: @uint_to_fp_v2i32
 | 
			
		||||
; SI-CHECK-LABEL: @uint_to_fp_v2i32
 | 
			
		||||
; SI-CHECK: V_CVT_F32_U32_e32
 | 
			
		||||
; SI-CHECK: V_CVT_F32_U32_e32
 | 
			
		||||
define void @uint_to_fp_v2i32(<2 x float> addrspace(1)* %out, <2 x i32> %in) {
 | 
			
		||||
| 
						 | 
				
			
			@ -13,12 +13,12 @@ define void @uint_to_fp_v2i32(<2 x float> addrspace(1)* %out, <2 x i32> %in) {
 | 
			
		|||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; R600-CHECK: @uint_to_fp_v4i32
 | 
			
		||||
; R600-CHECK-LABEL: @uint_to_fp_v4i32
 | 
			
		||||
; R600-CHECK: UINT_TO_FLT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 | 
			
		||||
; R600-CHECK: UINT_TO_FLT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 | 
			
		||||
; R600-CHECK: UINT_TO_FLT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 | 
			
		||||
; R600-CHECK: UINT_TO_FLT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 | 
			
		||||
; SI-CHECK: @uint_to_fp_v4i32
 | 
			
		||||
; SI-CHECK-LABEL: @uint_to_fp_v4i32
 | 
			
		||||
; SI-CHECK: V_CVT_F32_U32_e32
 | 
			
		||||
; SI-CHECK: V_CVT_F32_U32_e32
 | 
			
		||||
; SI-CHECK: V_CVT_F32_U32_e32
 | 
			
		||||
| 
						 | 
				
			
			@ -29,3 +29,18 @@ define void @uint_to_fp_v4i32(<4 x float> addrspace(1)* %out, <4 x i32> addrspac
 | 
			
		|||
  store <4 x float> %result, <4 x float> addrspace(1)* %out
 | 
			
		||||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; R600-CHECK-LABEL: @uint_to_fp_i64_f32
 | 
			
		||||
; R600-CHECK: UINT_TO_FLT
 | 
			
		||||
; R600-CHECK: UINT_TO_FLT
 | 
			
		||||
; R600-CHECK: MULADD_IEEE
 | 
			
		||||
; SI-CHECK-LABEL: @uint_to_fp_i64_f32
 | 
			
		||||
; SI-CHECK: V_CVT_F32_U32_e32
 | 
			
		||||
; SI-CHECK: V_CVT_F32_U32_e32
 | 
			
		||||
; SI-CHECK: V_MAD_F32
 | 
			
		||||
define void @uint_to_fp_i64_f32(float addrspace(1)* %out, i64 %in) {
 | 
			
		||||
entry:
 | 
			
		||||
  %0 = uitofp i64 %in to float
 | 
			
		||||
  store float %0, float addrspace(1)* %out
 | 
			
		||||
  ret void
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue