@@ -1603,39 +1603,19 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
1603
1603
setOperationAction(ISD::VECREDUCE_SEQ_FADD, VT, Custom);
1604
1604
}
1605
1605
1606
- if (!Subtarget->isNeonAvailable()) {
1607
- setTruncStoreAction(MVT::v2f32, MVT::v2bf16, Custom);
1608
- setTruncStoreAction(MVT::v4f32, MVT::v4bf16, Custom);
1609
- setTruncStoreAction(MVT::v8f32, MVT::v8bf16, Custom);
1610
- setTruncStoreAction(MVT::v2f64, MVT::v2bf16, Custom);
1611
- setTruncStoreAction(MVT::v4f64, MVT::v4bf16, Custom);
1612
- setTruncStoreAction(MVT::v2f32, MVT::v2f16, Custom);
1613
- setTruncStoreAction(MVT::v4f32, MVT::v4f16, Custom);
1614
- setTruncStoreAction(MVT::v8f32, MVT::v8f16, Custom);
1615
- setTruncStoreAction(MVT::v1f64, MVT::v1f16, Custom);
1616
- setTruncStoreAction(MVT::v2f64, MVT::v2f16, Custom);
1617
- setTruncStoreAction(MVT::v4f64, MVT::v4f16, Custom);
1618
- setTruncStoreAction(MVT::v1f64, MVT::v1f32, Custom);
1619
- setTruncStoreAction(MVT::v2f64, MVT::v2f32, Custom);
1620
- setTruncStoreAction(MVT::v4f64, MVT::v4f32, Custom);
1621
- for (MVT VT : {MVT::v8i8, MVT::v16i8, MVT::v4i16, MVT::v8i16, MVT::v2i32,
1622
- MVT::v4i32, MVT::v1i64, MVT::v2i64})
1623
- addTypeForFixedLengthSVE(VT, /*StreamingSVE=*/ true);
1624
-
1625
- for (MVT VT :
1626
- {MVT::v4f16, MVT::v8f16, MVT::v2f32, MVT::v4f32, MVT::v2f64})
1627
- addTypeForFixedLengthSVE(VT, /*StreamingSVE=*/ true);
1628
- }
1629
-
1630
1606
// NOTE: Currently this has to happen after computeRegisterProperties rather
1631
1607
// than the preferred option of combining it with the addRegisterClass call.
1632
1608
if (Subtarget->useSVEForFixedLengthVectors()) {
1633
- for (MVT VT : MVT::integer_fixedlen_vector_valuetypes())
1634
- if (useSVEForFixedLengthVectorVT(VT))
1635
- addTypeForFixedLengthSVE(VT, /*StreamingSVE=*/ false);
1636
- for (MVT VT : MVT::fp_fixedlen_vector_valuetypes())
1637
- if (useSVEForFixedLengthVectorVT(VT))
1638
- addTypeForFixedLengthSVE(VT, /*StreamingSVE=*/ false);
1609
+ for (MVT VT : MVT::integer_fixedlen_vector_valuetypes()) {
1610
+ if (useSVEForFixedLengthVectorVT(
1611
+ VT, /*OverrideNEON=*/!Subtarget->isNeonAvailable()))
1612
+ addTypeForFixedLengthSVE(VT);
1613
+ }
1614
+ for (MVT VT : MVT::fp_fixedlen_vector_valuetypes()) {
1615
+ if (useSVEForFixedLengthVectorVT(
1616
+ VT, /*OverrideNEON=*/!Subtarget->isNeonAvailable()))
1617
+ addTypeForFixedLengthSVE(VT);
1618
+ }
1639
1619
1640
1620
// 64bit results can mean a bigger than NEON input.
1641
1621
for (auto VT : {MVT::v8i8, MVT::v4i16})
@@ -1869,8 +1849,7 @@ bool AArch64TargetLowering::shouldExpandCttzElements(EVT VT) const {
1869
1849
return !Subtarget->hasSVEorSME() || VT != MVT::nxv16i1;
1870
1850
}
1871
1851
1872
- void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT,
1873
- bool StreamingSVE) {
1852
+ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT) {
1874
1853
assert(VT.isFixedLengthVector() && "Expected fixed length vector type!");
1875
1854
1876
1855
// By default everything must be expanded.
@@ -1889,13 +1868,17 @@ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT,
1889
1868
setCondCodeAction(ISD::SETONE, VT, Expand);
1890
1869
}
1891
1870
1871
+ TargetLoweringBase::LegalizeAction Default =
1872
+ VT == MVT::v1f64 ? Expand : Custom;
1873
+
1892
1874
// Mark integer truncating stores/extending loads as having custom lowering
1893
1875
if (VT.isInteger()) {
1894
1876
MVT InnerVT = VT.changeVectorElementType(MVT::i8);
1895
1877
while (InnerVT != VT) {
1896
- setTruncStoreAction(VT, InnerVT, Custom);
1897
- setLoadExtAction(ISD::ZEXTLOAD, VT, InnerVT, Custom);
1898
- setLoadExtAction(ISD::SEXTLOAD, VT, InnerVT, Custom);
1878
+ setTruncStoreAction(VT, InnerVT, Default);
1879
+ setLoadExtAction(ISD::ZEXTLOAD, VT, InnerVT, Default);
1880
+ setLoadExtAction(ISD::SEXTLOAD, VT, InnerVT, Default);
1881
+ setLoadExtAction(ISD::EXTLOAD, VT, InnerVT, Default);
1899
1882
InnerVT = InnerVT.changeVectorElementType(
1900
1883
MVT::getIntegerVT(2 * InnerVT.getScalarSizeInBits()));
1901
1884
}
@@ -1907,101 +1890,103 @@ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT,
1907
1890
MVT InnerVT = VT.changeVectorElementType(MVT::f16);
1908
1891
while (InnerVT != VT) {
1909
1892
setTruncStoreAction(VT, InnerVT, Custom);
1910
- setLoadExtAction(ISD::EXTLOAD, VT, InnerVT, Custom );
1893
+ setLoadExtAction(ISD::EXTLOAD, VT, InnerVT, Default );
1911
1894
InnerVT = InnerVT.changeVectorElementType(
1912
1895
MVT::getFloatingPointVT(2 * InnerVT.getScalarSizeInBits()));
1913
1896
}
1914
1897
}
1915
1898
1899
+ bool PreferNEON = VT.is64BitVector() || VT.is128BitVector();
1900
+ bool PreferSVE = !PreferNEON && Subtarget->isSVEAvailable();
1901
+
1916
1902
// Lower fixed length vector operations to scalable equivalents.
1917
- setOperationAction(ISD::ABS, VT, Custom);
1918
- setOperationAction(ISD::ADD, VT, Custom);
1919
- setOperationAction(ISD::AND, VT, Custom);
1920
- setOperationAction(ISD::ANY_EXTEND, VT, Custom);
1921
- setOperationAction(ISD::BITCAST, VT, StreamingSVE ? Legal : Custom);
1922
- setOperationAction(ISD::BITREVERSE, VT, Custom);
1923
- setOperationAction(ISD::BSWAP, VT, Custom);
1924
- setOperationAction(ISD::BUILD_VECTOR, VT, Custom);
1925
- setOperationAction(ISD::CONCAT_VECTORS, VT, Custom);
1926
- setOperationAction(ISD::CTLZ, VT, Custom);
1927
- setOperationAction(ISD::CTPOP, VT, Custom);
1928
- setOperationAction(ISD::CTTZ, VT, Custom);
1929
- setOperationAction(ISD::EXTRACT_SUBVECTOR, VT, Custom);
1930
- setOperationAction(ISD::EXTRACT_VECTOR_ELT, VT, Custom);
1931
- setOperationAction(ISD::FABS, VT, Custom);
1932
- setOperationAction(ISD::FADD, VT, Custom);
1933
- setOperationAction(ISD::FCEIL, VT, Custom);
1934
- setOperationAction(ISD::FCOPYSIGN, VT, Custom);
1935
- setOperationAction(ISD::FDIV, VT, Custom);
1936
- setOperationAction(ISD::FFLOOR, VT, Custom);
1937
- setOperationAction(ISD::FMA, VT, Custom);
1938
- setOperationAction(ISD::FMAXIMUM, VT, Custom);
1939
- setOperationAction(ISD::FMAXNUM, VT, Custom);
1940
- setOperationAction(ISD::FMINIMUM, VT, Custom);
1941
- setOperationAction(ISD::FMINNUM, VT, Custom);
1942
- setOperationAction(ISD::FMUL, VT, Custom);
1943
- setOperationAction(ISD::FNEARBYINT, VT, Custom);
1944
- setOperationAction(ISD::FNEG, VT, Custom);
1945
- setOperationAction(ISD::FP_EXTEND, VT, Custom);
1946
- setOperationAction(ISD::FP_ROUND, VT, Custom);
1947
- setOperationAction(ISD::FP_TO_SINT, VT, Custom);
1948
- setOperationAction(ISD::FP_TO_UINT, VT, Custom);
1949
- setOperationAction(ISD::FRINT, VT, Custom);
1950
- setOperationAction(ISD::FROUND, VT, Custom);
1951
- setOperationAction(ISD::FROUNDEVEN, VT, Custom);
1952
- setOperationAction(ISD::FSQRT, VT, Custom);
1953
- setOperationAction(ISD::FSUB, VT, Custom);
1954
- setOperationAction(ISD::FTRUNC, VT, Custom);
1955
- setOperationAction(ISD::INSERT_VECTOR_ELT, VT, Custom);
1956
- setOperationAction(ISD::LOAD, VT, StreamingSVE ? Legal : Custom);
1957
- setOperationAction(ISD::MGATHER, VT, StreamingSVE ? Expand : Custom);
1958
- setOperationAction(ISD::MLOAD, VT, Custom);
1959
- setOperationAction(ISD::MSCATTER, VT, StreamingSVE ? Expand : Custom);
1960
- setOperationAction(ISD::MSTORE, VT, Custom);
1961
- setOperationAction(ISD::MUL, VT, Custom);
1962
- setOperationAction(ISD::MULHS, VT, Custom);
1963
- setOperationAction(ISD::MULHU, VT, Custom);
1964
- setOperationAction(ISD::OR, VT, Custom);
1965
- setOperationAction(ISD::SCALAR_TO_VECTOR, VT, StreamingSVE ? Legal : Expand);
1966
- setOperationAction(ISD::SDIV, VT, Custom);
1967
- setOperationAction(ISD::SELECT, VT, Custom);
1968
- setOperationAction(ISD::SETCC, VT, Custom);
1969
- setOperationAction(ISD::SHL, VT, Custom);
1970
- setOperationAction(ISD::SIGN_EXTEND, VT, Custom);
1971
- setOperationAction(ISD::SIGN_EXTEND_INREG, VT, Custom);
1972
- setOperationAction(ISD::SINT_TO_FP, VT, Custom);
1973
- setOperationAction(ISD::SMAX, VT, Custom);
1974
- setOperationAction(ISD::SMIN, VT, Custom);
1975
- setOperationAction(ISD::SPLAT_VECTOR, VT, Custom);
1976
- setOperationAction(ISD::SRA, VT, Custom);
1977
- setOperationAction(ISD::SRL, VT, Custom);
1978
- setOperationAction(ISD::STORE, VT, StreamingSVE ? Legal : Custom);
1979
- setOperationAction(ISD::SUB, VT, Custom);
1980
- setOperationAction(ISD::TRUNCATE, VT, Custom);
1981
- setOperationAction(ISD::UDIV, VT, Custom);
1982
- setOperationAction(ISD::UINT_TO_FP, VT, Custom);
1983
- setOperationAction(ISD::UMAX, VT, Custom);
1984
- setOperationAction(ISD::UMIN, VT, Custom);
1985
- setOperationAction(ISD::VECREDUCE_ADD, VT, Custom);
1986
- setOperationAction(ISD::VECREDUCE_AND, VT, Custom);
1987
- setOperationAction(ISD::VECREDUCE_FADD, VT, Custom);
1988
- setOperationAction(ISD::VECREDUCE_FMAX, VT, Custom);
1989
- setOperationAction(ISD::VECREDUCE_FMIN, VT, Custom);
1990
- setOperationAction(ISD::VECREDUCE_FMAXIMUM, VT, Custom);
1991
- setOperationAction(ISD::VECREDUCE_FMINIMUM, VT, Custom);
1992
- setOperationAction(ISD::VECREDUCE_OR, VT, Custom);
1993
- setOperationAction(ISD::VECREDUCE_SEQ_FADD, VT,
1994
- StreamingSVE ? Expand : Custom);
1995
- setOperationAction(ISD::VECREDUCE_SMAX, VT, Custom);
1996
- setOperationAction(ISD::VECREDUCE_SMIN, VT, Custom);
1997
- setOperationAction(ISD::VECREDUCE_UMAX, VT, Custom);
1998
- setOperationAction(ISD::VECREDUCE_UMIN, VT, Custom);
1999
- setOperationAction(ISD::VECREDUCE_XOR, VT, Custom);
2000
- setOperationAction(ISD::VECTOR_SHUFFLE, VT, Custom);
2001
- setOperationAction(ISD::VECTOR_SPLICE, VT, Custom);
2002
- setOperationAction(ISD::VSELECT, VT, Custom);
2003
- setOperationAction(ISD::XOR, VT, Custom);
2004
- setOperationAction(ISD::ZERO_EXTEND, VT, Custom);
1903
+ setOperationAction(ISD::ABS, VT, Default);
1904
+ setOperationAction(ISD::ADD, VT, Default);
1905
+ setOperationAction(ISD::AND, VT, Default);
1906
+ setOperationAction(ISD::ANY_EXTEND, VT, Default);
1907
+ setOperationAction(ISD::BITCAST, VT, PreferNEON ? Legal : Default);
1908
+ setOperationAction(ISD::BITREVERSE, VT, Default);
1909
+ setOperationAction(ISD::BSWAP, VT, Default);
1910
+ setOperationAction(ISD::BUILD_VECTOR, VT, Default);
1911
+ setOperationAction(ISD::CONCAT_VECTORS, VT, Default);
1912
+ setOperationAction(ISD::CTLZ, VT, Default);
1913
+ setOperationAction(ISD::CTPOP, VT, Default);
1914
+ setOperationAction(ISD::CTTZ, VT, Default);
1915
+ setOperationAction(ISD::EXTRACT_SUBVECTOR, VT, Default);
1916
+ setOperationAction(ISD::EXTRACT_VECTOR_ELT, VT, Default);
1917
+ setOperationAction(ISD::FABS, VT, Default);
1918
+ setOperationAction(ISD::FADD, VT, Default);
1919
+ setOperationAction(ISD::FCEIL, VT, Default);
1920
+ setOperationAction(ISD::FCOPYSIGN, VT, Default);
1921
+ setOperationAction(ISD::FDIV, VT, Default);
1922
+ setOperationAction(ISD::FFLOOR, VT, Default);
1923
+ setOperationAction(ISD::FMA, VT, Default);
1924
+ setOperationAction(ISD::FMAXIMUM, VT, Default);
1925
+ setOperationAction(ISD::FMAXNUM, VT, Default);
1926
+ setOperationAction(ISD::FMINIMUM, VT, Default);
1927
+ setOperationAction(ISD::FMINNUM, VT, Default);
1928
+ setOperationAction(ISD::FMUL, VT, Default);
1929
+ setOperationAction(ISD::FNEARBYINT, VT, Default);
1930
+ setOperationAction(ISD::FNEG, VT, Default);
1931
+ setOperationAction(ISD::FP_EXTEND, VT, Default);
1932
+ setOperationAction(ISD::FP_ROUND, VT, Default);
1933
+ setOperationAction(ISD::FP_TO_SINT, VT, Default);
1934
+ setOperationAction(ISD::FP_TO_UINT, VT, Default);
1935
+ setOperationAction(ISD::FRINT, VT, Default);
1936
+ setOperationAction(ISD::FROUND, VT, Default);
1937
+ setOperationAction(ISD::FROUNDEVEN, VT, Default);
1938
+ setOperationAction(ISD::FSQRT, VT, Default);
1939
+ setOperationAction(ISD::FSUB, VT, Default);
1940
+ setOperationAction(ISD::FTRUNC, VT, Default);
1941
+ setOperationAction(ISD::INSERT_VECTOR_ELT, VT, Default);
1942
+ setOperationAction(ISD::LOAD, VT, PreferNEON ? Legal : Default);
1943
+ setOperationAction(ISD::MGATHER, VT, PreferSVE ? Default : Expand);
1944
+ setOperationAction(ISD::MLOAD, VT, Default);
1945
+ setOperationAction(ISD::MSCATTER, VT, PreferSVE ? Default : Expand);
1946
+ setOperationAction(ISD::MSTORE, VT, Default);
1947
+ setOperationAction(ISD::MUL, VT, Default);
1948
+ setOperationAction(ISD::MULHS, VT, Default);
1949
+ setOperationAction(ISD::MULHU, VT, Default);
1950
+ setOperationAction(ISD::OR, VT, Default);
1951
+ setOperationAction(ISD::SCALAR_TO_VECTOR, VT, PreferNEON ? Legal : Expand);
1952
+ setOperationAction(ISD::SDIV, VT, Default);
1953
+ setOperationAction(ISD::SELECT, VT, Default);
1954
+ setOperationAction(ISD::SETCC, VT, Default);
1955
+ setOperationAction(ISD::SHL, VT, Default);
1956
+ setOperationAction(ISD::SIGN_EXTEND, VT, Default);
1957
+ setOperationAction(ISD::SIGN_EXTEND_INREG, VT, Default);
1958
+ setOperationAction(ISD::SINT_TO_FP, VT, Default);
1959
+ setOperationAction(ISD::SMAX, VT, Default);
1960
+ setOperationAction(ISD::SMIN, VT, Default);
1961
+ setOperationAction(ISD::SPLAT_VECTOR, VT, Default);
1962
+ setOperationAction(ISD::SRA, VT, Default);
1963
+ setOperationAction(ISD::SRL, VT, Default);
1964
+ setOperationAction(ISD::STORE, VT, PreferNEON ? Legal : Default);
1965
+ setOperationAction(ISD::SUB, VT, Default);
1966
+ setOperationAction(ISD::TRUNCATE, VT, Default);
1967
+ setOperationAction(ISD::UDIV, VT, Default);
1968
+ setOperationAction(ISD::UINT_TO_FP, VT, Default);
1969
+ setOperationAction(ISD::UMAX, VT, Default);
1970
+ setOperationAction(ISD::UMIN, VT, Default);
1971
+ setOperationAction(ISD::VECREDUCE_ADD, VT, Default);
1972
+ setOperationAction(ISD::VECREDUCE_AND, VT, Default);
1973
+ setOperationAction(ISD::VECREDUCE_FADD, VT, Default);
1974
+ setOperationAction(ISD::VECREDUCE_FMAX, VT, Default);
1975
+ setOperationAction(ISD::VECREDUCE_FMIN, VT, Default);
1976
+ setOperationAction(ISD::VECREDUCE_FMAXIMUM, VT, Default);
1977
+ setOperationAction(ISD::VECREDUCE_FMINIMUM, VT, Default);
1978
+ setOperationAction(ISD::VECREDUCE_OR, VT, Default);
1979
+ setOperationAction(ISD::VECREDUCE_SEQ_FADD, VT, PreferSVE ? Default : Expand);
1980
+ setOperationAction(ISD::VECREDUCE_SMAX, VT, Default);
1981
+ setOperationAction(ISD::VECREDUCE_SMIN, VT, Default);
1982
+ setOperationAction(ISD::VECREDUCE_UMAX, VT, Default);
1983
+ setOperationAction(ISD::VECREDUCE_UMIN, VT, Default);
1984
+ setOperationAction(ISD::VECREDUCE_XOR, VT, Default);
1985
+ setOperationAction(ISD::VECTOR_SHUFFLE, VT, Default);
1986
+ setOperationAction(ISD::VECTOR_SPLICE, VT, Default);
1987
+ setOperationAction(ISD::VSELECT, VT, Default);
1988
+ setOperationAction(ISD::XOR, VT, Default);
1989
+ setOperationAction(ISD::ZERO_EXTEND, VT, Default);
2005
1990
}
2006
1991
2007
1992
void AArch64TargetLowering::addDRTypeForNEON(MVT VT) {
0 commit comments