summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-11-27 18:12:16 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-11-27 18:12:16 +0000
commitac1966e15d517e311d7064cbdd21307402dad218 (patch)
tree64c7e3828c1f14ff981a256a7435a64820080cb9 /llvm/lib
parent51f2886f932b88460de0e7e5a235a76f1da4d9f2 (diff)
downloadbcm5719-llvm-ac1966e15d517e311d7064cbdd21307402dad218.tar.gz
bcm5719-llvm-ac1966e15d517e311d7064cbdd21307402dad218.zip
[Hexagon] Implement HexagonSubtarget::isHVXVectorType
llvm-svn: 319064
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/Hexagon/HexagonISelLowering.cpp31
-rw-r--r--llvm/lib/Target/Hexagon/HexagonSubtarget.h10
2 files changed, 14 insertions, 27 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp
index 51e00849f19..3ecc2867907 100644
--- a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp
@@ -129,8 +129,6 @@ namespace {
// Implement calling convention for Hexagon.
-static bool isHvxVectorType(MVT ty);
-
static bool
CC_Hexagon(unsigned ValNo, MVT ValVT,
MVT LocVT, CCValAssign::LocInfo LocInfo,
@@ -291,7 +289,8 @@ static bool CC_Hexagon (unsigned ValNo, MVT ValVT, MVT LocVT,
return false;
}
- if (isHvxVectorType(LocVT)) {
+ auto &HST = State.getMachineFunction().getSubtarget<HexagonSubtarget>();
+ if (HST.isHVXVectorType(LocVT)) {
if (!CC_HexagonVector(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))
return false;
}
@@ -553,28 +552,6 @@ static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst,
MachinePointerInfo(), MachinePointerInfo());
}
-static bool isHvxVectorType(MVT Ty) {
- switch (Ty.SimpleTy) {
- case MVT::v8i64:
- case MVT::v16i32:
- case MVT::v32i16:
- case MVT::v64i8:
- case MVT::v16i64:
- case MVT::v32i32:
- case MVT::v64i16:
- case MVT::v128i8:
- case MVT::v32i64:
- case MVT::v64i32:
- case MVT::v128i16:
- case MVT::v256i8:
- case MVT::v512i1:
- case MVT::v1024i1:
- return true;
- default:
- return false;
- }
-}
-
bool
HexagonTargetLowering::CanLowerReturn(
CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg,
@@ -774,7 +751,7 @@ HexagonTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
SDValue Arg = OutVals[i];
ISD::ArgFlagsTy Flags = Outs[i].Flags;
// Record if we need > 8 byte alignment on an argument.
- bool ArgAlign = isHvxVectorType(VA.getValVT());
+ bool ArgAlign = Subtarget.isHVXVectorType(VA.getValVT());
NeedsArgAlign |= ArgAlign;
// Promote the value if needed.
@@ -2727,7 +2704,7 @@ HexagonTargetLowering::LowerEXTRACT_VECTOR(SDValue Op,
// If we are dealing with EXTRACT_SUBVECTOR on a HVX type, we may
// be able to simplify it to an EXTRACT_SUBREG.
if (Op.getOpcode() == ISD::EXTRACT_SUBVECTOR && Subtarget.useHVXOps() &&
- isHvxVectorType(Op.getValueType().getSimpleVT()))
+ Subtarget.isHVXVectorType(Op.getValueType().getSimpleVT()))
return LowerEXTRACT_SUBVECTOR_HVX(Op, DAG);
EVT VT = Op.getValueType();
diff --git a/llvm/lib/Target/Hexagon/HexagonSubtarget.h b/llvm/lib/Target/Hexagon/HexagonSubtarget.h
index f430631c9d2..76892454d8a 100644
--- a/llvm/lib/Target/Hexagon/HexagonSubtarget.h
+++ b/llvm/lib/Target/Hexagon/HexagonSubtarget.h
@@ -190,6 +190,16 @@ public:
llvm_unreachable("Invalid HVX vector length settings");
}
+ bool isHVXVectorType(MVT VecTy) const {
+ if (!VecTy.isVector() || !useHVXOps())
+ return false;
+ unsigned ElemWidth = VecTy.getVectorElementType().getSizeInBits();
+ if (ElemWidth < 8 || ElemWidth > 64)
+ return false;
+ unsigned VecWidth = VecTy.getSizeInBits();
+ return VecWidth == 8*getVectorLength() || VecWidth == 16*getVectorLength();
+ }
+
unsigned getL1CacheLineSize() const;
unsigned getL1PrefetchDistance() const;
OpenPOWER on IntegriCloud