mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-24 20:30:06 +00:00
Add support for lowering FABS of vector types.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163461 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a1fb1d2ed7
commit
4362067d7c
@ -829,6 +829,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::FDIV, MVT::v4f32, Legal);
|
||||
setOperationAction(ISD::FSQRT, MVT::v4f32, Legal);
|
||||
setOperationAction(ISD::FNEG, MVT::v4f32, Custom);
|
||||
setOperationAction(ISD::FABS, MVT::v4f32, Custom);
|
||||
setOperationAction(ISD::LOAD, MVT::v4f32, Legal);
|
||||
setOperationAction(ISD::BUILD_VECTOR, MVT::v4f32, Custom);
|
||||
setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v4f32, Custom);
|
||||
@ -862,6 +863,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::FDIV, MVT::v2f64, Legal);
|
||||
setOperationAction(ISD::FSQRT, MVT::v2f64, Legal);
|
||||
setOperationAction(ISD::FNEG, MVT::v2f64, Custom);
|
||||
setOperationAction(ISD::FABS, MVT::v2f64, Custom);
|
||||
|
||||
setOperationAction(ISD::SETCC, MVT::v2i64, Custom);
|
||||
setOperationAction(ISD::SETCC, MVT::v16i8, Custom);
|
||||
@ -1022,6 +1024,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::FDIV, MVT::v8f32, Legal);
|
||||
setOperationAction(ISD::FSQRT, MVT::v8f32, Legal);
|
||||
setOperationAction(ISD::FNEG, MVT::v8f32, Custom);
|
||||
setOperationAction(ISD::FABS, MVT::v8f32, Custom);
|
||||
|
||||
setOperationAction(ISD::FADD, MVT::v4f64, Legal);
|
||||
setOperationAction(ISD::FSUB, MVT::v4f64, Legal);
|
||||
@ -1029,6 +1032,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::FDIV, MVT::v4f64, Legal);
|
||||
setOperationAction(ISD::FSQRT, MVT::v4f64, Legal);
|
||||
setOperationAction(ISD::FNEG, MVT::v4f64, Custom);
|
||||
setOperationAction(ISD::FABS, MVT::v4f64, Custom);
|
||||
|
||||
setOperationAction(ISD::FP_TO_SINT, MVT::v8i32, Legal);
|
||||
setOperationAction(ISD::SINT_TO_FP, MVT::v8i32, Legal);
|
||||
@ -8175,26 +8179,35 @@ SDValue X86TargetLowering::LowerFP_TO_UINT(SDValue Op,
|
||||
return FIST;
|
||||
}
|
||||
|
||||
SDValue X86TargetLowering::LowerFABS(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
SDValue X86TargetLowering::LowerFABS(SDValue Op, SelectionDAG &DAG) const {
|
||||
LLVMContext *Context = DAG.getContext();
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
EVT VT = Op.getValueType();
|
||||
EVT EltVT = VT;
|
||||
if (VT.isVector())
|
||||
unsigned NumElts = VT == MVT::f64 ? 2 : 4;
|
||||
if (VT.isVector()) {
|
||||
EltVT = VT.getVectorElementType();
|
||||
Constant *C;
|
||||
if (EltVT == MVT::f64) {
|
||||
C = ConstantVector::getSplat(2,
|
||||
ConstantFP::get(*Context, APFloat(APInt(64, ~(1ULL << 63)))));
|
||||
} else {
|
||||
C = ConstantVector::getSplat(4,
|
||||
ConstantFP::get(*Context, APFloat(APInt(32, ~(1U << 31)))));
|
||||
NumElts = VT.getVectorNumElements();
|
||||
}
|
||||
SDValue CPIdx = DAG.getConstantPool(C, getPointerTy(), 16);
|
||||
Constant *C;
|
||||
if (EltVT == MVT::f64)
|
||||
C = ConstantFP::get(*Context, APFloat(APInt(64, ~(1ULL << 63))));
|
||||
else
|
||||
C = ConstantFP::get(*Context, APFloat(APInt(32, ~(1U << 31))));
|
||||
C = ConstantVector::getSplat(NumElts, C);
|
||||
SDValue CPIdx = DAG.getConstantPool(C, getPointerTy());
|
||||
unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
|
||||
SDValue Mask = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
|
||||
MachinePointerInfo::getConstantPool(),
|
||||
false, false, false, 16);
|
||||
false, false, false, Alignment);
|
||||
if (VT.isVector()) {
|
||||
MVT ANDVT = VT.is128BitVector() ? MVT::v2i64 : MVT::v4i64;
|
||||
return DAG.getNode(ISD::BITCAST, dl, VT,
|
||||
DAG.getNode(ISD::AND, dl, ANDVT,
|
||||
DAG.getNode(ISD::BITCAST, dl, ANDVT,
|
||||
Op.getOperand(0)),
|
||||
DAG.getNode(ISD::BITCAST, dl, ANDVT, Mask)));
|
||||
}
|
||||
return DAG.getNode(X86ISD::FAND, dl, VT, Op.getOperand(0), Mask);
|
||||
}
|
||||
|
||||
|
38
test/CodeGen/X86/vec_fabs.ll
Normal file
38
test/CodeGen/X86/vec_fabs.ll
Normal file
@ -0,0 +1,38 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin -march=x86 -mcpu=corei7-avx | FileCheck %s
|
||||
|
||||
|
||||
define <2 x double> @fabs_v2f64(<2 x double> %p)
|
||||
{
|
||||
; CHECK: fabs_v2f64
|
||||
; CHECK: vandps
|
||||
%t = call <2 x double> @llvm.fabs.v2f64(<2 x double> %p)
|
||||
ret <2 x double> %t
|
||||
}
|
||||
declare <2 x double> @llvm.fabs.v2f64(<2 x double> %p)
|
||||
|
||||
define <4 x float> @fabs_v4f32(<4 x float> %p)
|
||||
{
|
||||
; CHECK: fabs_v4f32
|
||||
; CHECK: vandps
|
||||
%t = call <4 x float> @llvm.fabs.v4f32(<4 x float> %p)
|
||||
ret <4 x float> %t
|
||||
}
|
||||
declare <4 x float> @llvm.fabs.v4f32(<4 x float> %p)
|
||||
|
||||
define <4 x double> @fabs_v4f64(<4 x double> %p)
|
||||
{
|
||||
; CHECK: fabs_v4f64
|
||||
; CHECK: vandps
|
||||
%t = call <4 x double> @llvm.fabs.v4f64(<4 x double> %p)
|
||||
ret <4 x double> %t
|
||||
}
|
||||
declare <4 x double> @llvm.fabs.v4f64(<4 x double> %p)
|
||||
|
||||
define <8 x float> @fabs_v8f32(<8 x float> %p)
|
||||
{
|
||||
; CHECK: fabs_v8f32
|
||||
; CHECK: vandps
|
||||
%t = call <8 x float> @llvm.fabs.v8f32(<8 x float> %p)
|
||||
ret <8 x float> %t
|
||||
}
|
||||
declare <8 x float> @llvm.fabs.v8f32(<8 x float> %p)
|
Loading…
Reference in New Issue
Block a user