From: Krzysztof Parzyszek Date: Mon, 27 Nov 2017 18:12:16 +0000 (+0000) Subject: [Hexagon] Implement HexagonSubtarget::isHVXVectorType X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ee0ba22d4565e2b1102a0992a4b5d917923d034a;p=llvm [Hexagon] Implement HexagonSubtarget::isHVXVectorType git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319064 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Hexagon/HexagonISelLowering.cpp b/lib/Target/Hexagon/HexagonISelLowering.cpp index 51e00849f19..3ecc2867907 100644 --- a/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/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(); + 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/lib/Target/Hexagon/HexagonSubtarget.h b/lib/Target/Hexagon/HexagonSubtarget.h index f430631c9d2..76892454d8a 100644 --- a/lib/Target/Hexagon/HexagonSubtarget.h +++ b/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;