@@ -1603,39 +1603,19 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
16031603 setOperationAction(ISD::VECREDUCE_SEQ_FADD, VT, Custom);
16041604 }
16051605
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-
16301606 // NOTE: Currently this has to happen after computeRegisterProperties rather
16311607 // than the preferred option of combining it with the addRegisterClass call.
16321608 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+ }
16391619
16401620 // 64bit results can mean a bigger than NEON input.
16411621 for (auto VT : {MVT::v8i8, MVT::v4i16})
@@ -1869,8 +1849,7 @@ bool AArch64TargetLowering::shouldExpandCttzElements(EVT VT) const {
18691849 return !Subtarget->hasSVEorSME() || VT != MVT::nxv16i1;
18701850}
18711851
1872- void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT,
1873- bool StreamingSVE) {
1852+ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT) {
18741853 assert(VT.isFixedLengthVector() && "Expected fixed length vector type!");
18751854
18761855 // By default everything must be expanded.
@@ -1889,13 +1868,17 @@ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT,
18891868 setCondCodeAction(ISD::SETONE, VT, Expand);
18901869 }
18911870
1871+ TargetLoweringBase::LegalizeAction Default =
1872+ VT == MVT::v1f64 ? Expand : Custom;
1873+
18921874 // Mark integer truncating stores/extending loads as having custom lowering
18931875 if (VT.isInteger()) {
18941876 MVT InnerVT = VT.changeVectorElementType(MVT::i8);
18951877 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);
18991882 InnerVT = InnerVT.changeVectorElementType(
19001883 MVT::getIntegerVT(2 * InnerVT.getScalarSizeInBits()));
19011884 }
@@ -1907,101 +1890,103 @@ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT,
19071890 MVT InnerVT = VT.changeVectorElementType(MVT::f16);
19081891 while (InnerVT != VT) {
19091892 setTruncStoreAction(VT, InnerVT, Custom);
1910- setLoadExtAction(ISD::EXTLOAD, VT, InnerVT, Custom );
1893+ setLoadExtAction(ISD::EXTLOAD, VT, InnerVT, Default );
19111894 InnerVT = InnerVT.changeVectorElementType(
19121895 MVT::getFloatingPointVT(2 * InnerVT.getScalarSizeInBits()));
19131896 }
19141897 }
19151898
1899+ bool PreferNEON = VT.is64BitVector() || VT.is128BitVector();
1900+ bool PreferSVE = !PreferNEON && Subtarget->isSVEAvailable();
1901+
19161902 // 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);
20051990}
20061991
20071992void AArch64TargetLowering::addDRTypeForNEON(MVT VT) {
0 commit comments