mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-20 08:54:08 +00:00
Make sure we correctly unroll conversions between v2f64 and v2i32 on ARM.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144241 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5ccb0825ed
commit
14e809c872
@ -110,7 +110,12 @@ void ARMTargetLowering::addTypeForNEON(EVT VT, EVT PromotedLdStVT,
|
||||
setOperationAction(ISD::SETCC, VT.getSimpleVT(), Custom);
|
||||
setOperationAction(ISD::INSERT_VECTOR_ELT, VT.getSimpleVT(), Custom);
|
||||
setOperationAction(ISD::EXTRACT_VECTOR_ELT, VT.getSimpleVT(), Custom);
|
||||
if (ElemTy != MVT::i32) {
|
||||
if (ElemTy == MVT::i32) {
|
||||
setOperationAction(ISD::SINT_TO_FP, VT.getSimpleVT(), Custom);
|
||||
setOperationAction(ISD::UINT_TO_FP, VT.getSimpleVT(), Custom);
|
||||
setOperationAction(ISD::FP_TO_SINT, VT.getSimpleVT(), Custom);
|
||||
setOperationAction(ISD::FP_TO_UINT, VT.getSimpleVT(), Custom);
|
||||
} else {
|
||||
setOperationAction(ISD::SINT_TO_FP, VT.getSimpleVT(), Expand);
|
||||
setOperationAction(ISD::UINT_TO_FP, VT.getSimpleVT(), Expand);
|
||||
setOperationAction(ISD::FP_TO_SINT, VT.getSimpleVT(), Expand);
|
||||
@ -3018,7 +3023,20 @@ SDValue ARMTargetLowering::LowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
|
||||
}
|
||||
}
|
||||
|
||||
static SDValue LowerVectorFP_TO_INT(SDValue Op, SelectionDAG &DAG) {
|
||||
EVT VT = Op.getValueType();
|
||||
assert(VT.getVectorElementType() == MVT::i32 && "Unexpected custom lowering");
|
||||
|
||||
if (Op.getOperand(0).getValueType().getVectorElementType() == MVT::f32)
|
||||
return Op;
|
||||
return DAG.UnrollVectorOp(Op.getNode());
|
||||
}
|
||||
|
||||
static SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) {
|
||||
EVT VT = Op.getValueType();
|
||||
if (VT.isVector())
|
||||
return LowerVectorFP_TO_INT(Op, DAG);
|
||||
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
unsigned Opc;
|
||||
|
||||
@ -3040,6 +3058,12 @@ static SDValue LowerVectorINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
|
||||
EVT VT = Op.getValueType();
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
|
||||
if (Op.getOperand(0).getValueType().getVectorElementType() == MVT::i32) {
|
||||
if (VT.getVectorElementType() == MVT::f32)
|
||||
return Op;
|
||||
return DAG.UnrollVectorOp(Op.getNode());
|
||||
}
|
||||
|
||||
assert(Op.getOperand(0).getValueType() == MVT::v4i16 &&
|
||||
"Invalid type for custom lowering!");
|
||||
if (VT != MVT::v4f32)
|
||||
|
37
test/CodeGen/ARM/2011-11-09-IllegalVectorFPIntConvert.ll
Normal file
37
test/CodeGen/ARM/2011-11-09-IllegalVectorFPIntConvert.ll
Normal file
@ -0,0 +1,37 @@
|
||||
; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
|
||||
|
||||
define <2 x i32> @test1(<2 x double>* %A) {
|
||||
; CHECK: test1
|
||||
; CHECK: vcvt.s32.f64
|
||||
; CHECK: vcvt.s32.f64
|
||||
%tmp1 = load <2 x double>* %A
|
||||
%tmp2 = fptosi <2 x double> %tmp1 to <2 x i32>
|
||||
ret <2 x i32> %tmp2
|
||||
}
|
||||
|
||||
define <2 x i32> @test2(<2 x double>* %A) {
|
||||
; CHECK: test2
|
||||
; CHECK: vcvt.u32.f64
|
||||
; CHECK: vcvt.u32.f64
|
||||
%tmp1 = load <2 x double>* %A
|
||||
%tmp2 = fptoui <2 x double> %tmp1 to <2 x i32>
|
||||
ret <2 x i32> %tmp2
|
||||
}
|
||||
|
||||
define <2 x double> @test3(<2 x i32>* %A) {
|
||||
; CHECK: test3
|
||||
; CHECK: vcvt.f64.s32
|
||||
; CHECK: vcvt.f64.s32
|
||||
%tmp1 = load <2 x i32>* %A
|
||||
%tmp2 = sitofp <2 x i32> %tmp1 to <2 x double>
|
||||
ret <2 x double> %tmp2
|
||||
}
|
||||
|
||||
define <2 x double> @test4(<2 x i32>* %A) {
|
||||
; CHECK: test4
|
||||
; CHECK: vcvt.f64.u32
|
||||
; CHECK: vcvt.f64.u32
|
||||
%tmp1 = load <2 x i32>* %A
|
||||
%tmp2 = uitofp <2 x i32> %tmp1 to <2 x double>
|
||||
ret <2 x double> %tmp2
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user