[AArch64] Add SchedReadAdvance to the Neoverse-N3 scheduling model (#167302)

Introduce a description of late forwarding to the Neoverse-N3 scheduling
model.
This commit is contained in:
Asher Dobrescu 2025-11-13 14:13:20 +00:00 committed by GitHub
parent f67409c3ec
commit ec490b1062
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 2211 additions and 64 deletions

View File

@ -553,6 +553,107 @@ def N3Write_16c_16V0 : SchedWriteRes<[N3UnitV0, N3UnitV0, N3UnitV0, N3UnitV0,
let NumMicroOps = 16;
}
//===----------------------------------------------------------------------===//
// Define forwarded types
// NOTE: SOG, p. 19, n. 2: Accumulator forwarding is not supported for
// consumers of 64 bit multiply high operations?
def N3Wr_FMA : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_FMA : SchedReadAdvance<2, [WriteFMul, N3Wr_FMA]>;
def N3Wr_VMA : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Rd_VMA : SchedReadAdvance<3, [N3Wr_VMA]>;
def N3Wr_VMAL : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Rd_VMAL : SchedReadAdvance<3, [N3Wr_VMAL]>;
def N3Wr_VMAH : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Rd_VMAH : SchedReadAdvance<2, [N3Wr_VMAH]>;
def N3Wr_VMASL : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Rd_VMASL : SchedReadAdvance<2, [N3Wr_VMASL]>;
def N3Wr_ADA : SchedWriteRes<[N3UnitV1]> { let Latency = 4; }
def N3Rd_ADA : SchedReadAdvance<3, [N3Wr_ADA]>;
def N3Wr_VDOT : SchedWriteRes<[N3UnitV]> { let Latency = 3; }
def N3Rd_VDOT : SchedReadAdvance<2, [N3Wr_VDOT]>;
def N3Wr_VMMA : SchedWriteRes<[N3UnitV]> { let Latency = 3; }
def N3Rd_VMMA : SchedReadAdvance<2, [N3Wr_VMMA]>;
def N3Wr_FCMA : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_FCMA : SchedReadAdvance<2, [N3Wr_FCMA]>;
def N3Wr_FPM : SchedWriteRes<[N3UnitV]> { let Latency = 3; }
def N3Wr_FPMA : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_FPMA : SchedReadAdvance<2, [N3Wr_FPM, N3Wr_FPMA]>;
def N3Wr_FPMAL : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_FPMAL : SchedReadAdvance<2, [N3Wr_FPMAL]>;
def N3Wr_BFD : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_BFD : SchedReadAdvance<2, [N3Wr_BFD]>;
def N3Wr_BFMMA : SchedWriteRes<[N3UnitV]> { let Latency = 5; }
def N3Rd_BFMMA : SchedReadAdvance<2, [N3Wr_BFMMA]>;
def N3Wr_BFMLA : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_BFMLA : SchedReadAdvance<2, [N3Wr_BFMLA]>;
def N3Wr_CRC : SchedWriteRes<[N3UnitM0]> { let Latency = 2; }
def N3Rd_CRC : SchedReadAdvance<1, [N3Wr_CRC]>;
def N3Wr_ZA : SchedWriteRes<[N3UnitV1]> { let Latency = 4; }
def N3Rd_ZA : SchedReadAdvance<3, [N3Wr_ZA]>;
def N3Wr_ZPA : SchedWriteRes<[N3UnitV1]> { let Latency = 4; }
def N3Rd_ZPA : SchedReadAdvance<3, [N3Wr_ZPA]>;
def N3Wr_ZSA : SchedWriteRes<[N3UnitV1]> { let Latency = 4; }
def N3Rd_ZSA : SchedReadAdvance<3, [N3Wr_ZSA]>;
def N3Wr_ZDOTB : SchedWriteRes<[N3UnitV]> { let Latency = 3; }
def N3Rd_ZDOTB : SchedReadAdvance<2, [N3Wr_ZDOTB]>;
def N3Wr_ZDOTH : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Rd_ZDOTH : SchedReadAdvance<3, [N3Wr_ZDOTH]>;
def N3Wr_ZCMABHS : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Rd_ZCMABHS : SchedReadAdvance<3, [N3Wr_ZCMABHS]>;
def N3Wr_ZCMAD : SchedWriteRes<[N3UnitV0, N3UnitV0]> { let Latency = 5; }
def N3Rd_ZCMAD : SchedReadAdvance<2, [N3Wr_ZCMAD]>;
def N3Wr_ZMMA : SchedWriteRes<[N3UnitV]> { let Latency = 3; }
def N3Rd_ZMMA : SchedReadAdvance<2, [N3Wr_ZMMA]>;
def N3Wr_ZMABHS : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Rd_ZMABHS : SchedReadAdvance<3, [N3Wr_ZMABHS]>;
def N3Wr_ZMAD : SchedWriteRes<[N3UnitV0, N3UnitV0]> { let Latency = 5; }
def N3Rd_ZMAD : SchedReadAdvance<2, [N3Wr_ZMAD]>;
def N3Wr_ZMAL : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Rd_ZMAL : SchedReadAdvance<3, [N3Wr_ZMAL]>;
def N3Wr_ZMASQL : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Wr_ZMASQBHS : SchedWriteRes<[N3UnitV0]> { let Latency = 4; }
def N3Wr_ZMASQD : SchedWriteRes<[N3UnitV0, N3UnitV0]> { let Latency = 5; }
def N3Rd_ZMASQ : SchedReadAdvance<2, [N3Wr_ZMASQL, N3Wr_ZMASQBHS,
N3Wr_ZMASQD]>;
def N3Wr_ZFCMA : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_ZFCMA : SchedReadAdvance<2, [N3Wr_ZFCMA]>;
def N3Wr_ZFMA : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_ZFMA : SchedReadAdvance<2, [N3Wr_ZFMA]>;
def N3Wr_ZFMAL : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_ZFMAL : SchedReadAdvance<2, [N3Wr_ZFMAL]>;
def N3Wr_ZBFDOT : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_ZBFDOT : SchedReadAdvance<2, [N3Wr_ZBFDOT]>;
def N3Wr_ZBFMMA : SchedWriteRes<[N3UnitV]> { let Latency = 5; }
def N3Rd_ZBFMMA : SchedReadAdvance<2, [N3Wr_ZBFMMA]>;
def N3Wr_ZBFMAL : SchedWriteRes<[N3UnitV]> { let Latency = 4; }
def N3Rd_ZBFMAL : SchedReadAdvance<2, [N3Wr_ZBFMAL]>;
// Miscellaneous
// -----------------------------------------------------------------------------
@ -832,10 +933,11 @@ def : SchedAlias<WriteFDiv , N3Write_7c_1V0>;
def : InstRW<[N3Write_12c_1V0], (instrs FDIVDrr, FSQRTDr)>;
// FP multiply
def : SchedAlias<WriteFMul, N3Write_3c_1V>;
def : WriteRes<WriteFMul, [N3UnitV]> { let Latency = 3; }
// FP multiply accumulate
def : InstRW<[N3Write_4c_1V], (instregex "^(FMADD|FMSUB|FNMADD|FNMSUB)[DHS]rrr$")>;
def : InstRW<[N3Wr_FMA, ReadDefault, ReadDefault, N3Rd_FMA],
(instregex "^(FMADD|FMSUB|FNMADD|FNMSUB)[DHS]rrr$")>;
// FP round to integral
def : InstRW<[N3Write_3c_1V0], (instregex "^FRINT([AIMNPXZ]|32X|64X|32Z|64Z)[DHS]r$")>;
@ -969,7 +1071,7 @@ def : SchedAlias<WriteVq, N3Write_2c_1V>;
// ASIMD absolute diff accum long
// ASIMD pairwise add and accumulate long
// ASIMD shift accumulate
def : InstRW<[N3Write_4c_1V1], (instregex "^[SU]ABAL?v",
def : InstRW<[N3Wr_ADA, N3Rd_ADA], (instregex "^[SU]ABAL?v",
"^[SU]ADALPv",
"^[SU]R?SRAv")>;
@ -984,10 +1086,11 @@ def : InstRW<[N3Write_6c_2V1], (instregex "^[SU]?ADDL?Vv16i8v$")>;
// ASIMD dot product
// ASIMD dot product using signed and unsigned integers
def : InstRW<[N3Write_3c_1V], (instregex "^([SU]|SU|US)DOT(lane)?(v8|v16)i8$")>;
def : InstRW<[N3Wr_VDOT, N3Rd_VDOT],
(instregex "^([SU]|SU|US)DOT(lane)?(v8|v16)i8$")>;
// ASIMD matrix multiply-accumulate
def : InstRW<[N3Write_3c_1V], (instrs SMMLA, UMMLA, USMMLA)>;
def : InstRW<[N3Wr_VMMA, N3Rd_VMMA], (instrs SMMLA, UMMLA, USMMLA)>;
// ASIMD max/min, reduce, 4H/4S
def : InstRW<[N3Write_3c_1V1], (instregex "^[SU](MAX|MIN)Vv4i(16|32)v$")>;
@ -1002,16 +1105,16 @@ def : InstRW<[N3Write_6c_2V1], (instregex "[SU](MAX|MIN)Vv16i8v$")>;
def : InstRW<[N3Write_4c_1V0], (instregex "^MULv", "^SQ(R)?DMULHv")>;
// ASIMD multiply accumulate
def : InstRW<[N3Write_4c_1V0], (instregex "^MLAv", "^MLSv")>;
def : InstRW<[N3Wr_VMA, N3Rd_VMA], (instregex "^MLAv", "^MLSv")>;
// ASIMD multiply accumulate high
def : InstRW<[N3Write_4c_1V0], (instregex "^SQRDMLAHv", "^SQRDMLSHv")>;
def : InstRW<[N3Wr_VMAH, N3Rd_VMAH], (instregex "^SQRDMLAHv", "^SQRDMLSHv")>;
// ASIMD multiply accumulate long
def : InstRW<[N3Write_4c_1V0], (instregex "^[SU]MLALv", "^[SU]MLSLv")>;
def : InstRW<[N3Wr_VMAL, N3Rd_VMAL], (instregex "^[SU]MLALv", "^[SU]MLSLv")>;
// ASIMD multiply accumulate saturating long
def : InstRW<[N3Write_4c_1V0], (instregex "^SQDMLALv", "^SQDMLSLv")>;
def : InstRW<[N3Wr_VMASL, N3Rd_VMASL], (instregex "^SQDMLALv", "^SQDMLSLv")>;
// ASIMD multiply/multiply long (8x8) polynomial, D-form
// ASIMD multiply/multiply long (8x8) polynomial, Q-form
@ -1058,7 +1161,7 @@ def : InstRW<[N3Write_4c_1V1],
def : InstRW<[N3Write_3c_1V], (instregex "^FCADDv")>;
// ASIMD FP complex multiply add
def : InstRW<[N3Write_4c_1V], (instregex "^FCMLAv")>;
def : InstRW<[N3Wr_FCMA, N3Rd_FCMA], (instregex "^FCMLAv")>;
// ASIMD FP convert, long (F16 to F32)
def : InstRW<[N3Write_4c_2V0], (instregex "^FCVTL(v4|v8)i16")>;
@ -1114,13 +1217,13 @@ def : InstRW<[N3Write_4c_2V], (instregex "^(FMAX|FMIN)(NM)?Vv4(i16|i32)v$")>;
def : InstRW<[N3Write_6c_3V], (instregex "^(FMAX|FMIN)(NM)?Vv8i16v$")>;
// ASIMD FP multiply
def : InstRW<[N3Write_3c_1V], (instregex "^FMULv", "^FMULXv")>;
def : InstRW<[N3Wr_FPM], (instregex "^FMULv", "^FMULXv")>;
// ASIMD FP multiply accumulate
def : InstRW<[N3Write_4c_1V], (instregex "^FMLAv", "^FMLSv")>;
def : InstRW<[N3Wr_FPMA, N3Rd_FPMA], (instregex "^FMLAv", "^FMLSv")>;
// ASIMD FP multiply accumulate long
def : InstRW<[N3Write_4c_1V], (instregex "^FMLALv", "^FMLSLv")>;
def : InstRW<[N3Wr_FPMAL, N3Rd_FPMAL], (instregex "^FMLALv", "^FMLSLv")>;
// ASIMD FP round, D-form F32 and Q-form F64
def : InstRW<[N3Write_3c_1V0],
@ -1157,13 +1260,14 @@ def : InstRW<[N3Write_13c_2V0], (instrs FSQRTv2f64)>;
def : InstRW<[N3Write_4c_2V0], (instrs BFCVTN, BFCVTN2)>;
// ASIMD dot product
def : InstRW<[N3Write_4c_1V], (instrs BFDOTv4bf16, BFDOTv8bf16)>;
def : InstRW<[N3Wr_BFD, N3Rd_BFD], (instrs BFDOTv4bf16, BFDOTv8bf16)>;
// ASIMD matrix multiply accumulate
def : InstRW<[N3Write_5c_1V], (instrs BFMMLA)>;
def : InstRW<[N3Wr_BFMMA, N3Rd_BFMMA], (instrs BFMMLA)>;
// ASIMD multiply accumulate long
def : InstRW<[N3Write_4c_1V], (instrs BFMLALB, BFMLALBIdx, BFMLALT, BFMLALTIdx)>;
def : InstRW<[N3Wr_BFMLA, N3Rd_BFMLA],
(instrs BFMLALB, BFMLALBIdx, BFMLALT, BFMLALTIdx)>;
// Scalar convert, F32 to BF16
def : InstRW<[N3Write_3c_1V0], (instrs BFCVT)>;
@ -1502,7 +1606,7 @@ def : InstRW<[N3Write_4c_1V0], (instrs SM4E, SM4ENCKEY)>;
// -----------------------------------------------------------------------------
// CRC checksum ops
def : InstRW<[N3Write_2c_1M0], (instregex "^CRC32")>;
def : InstRW<[N3Wr_CRC, N3Rd_CRC], (instregex "^CRC32")>;
// SVE Predicate instructions
// -----------------------------------------------------------------------------
@ -1592,10 +1696,10 @@ def : InstRW<[N3Write_2c_1V], (instregex "^[SU]ABD_ZPmZ_[BHSD]",
"^[SU]ABD_ZPZZ_[BHSD]")>;
// Arithmetic, absolute diff accum
def : InstRW<[N3Write_4c_1V1], (instregex "^[SU]ABA_ZZZ_[BHSD]$")>;
def : InstRW<[N3Wr_ZA, N3Rd_ZA], (instregex "^[SU]ABA_ZZZ_[BHSD]$")>;
// Arithmetic, absolute diff accum long
def : InstRW<[N3Write_4c_1V1], (instregex "^[SU]ABAL[TB]_ZZZ_[HSD]$")>;
def : InstRW<[N3Wr_ZA, N3Rd_ZA], (instregex "^[SU]ABAL[TB]_ZZZ_[HSD]$")>;
// Arithmetic, absolute diff long
def : InstRW<[N3Write_2c_1V], (instregex "^[SU]ABDL[TB]_ZZZ_[HSD]$")>;
@ -1629,7 +1733,8 @@ def : InstRW<[N3Write_2c_1V], (instregex "^(AD|SB)CL[BT]_ZZZ_[SD]$")>;
def : InstRW<[N3Write_2c_1V], (instregex "^ADDP_ZPmZ_[BHSD]$")>;
// Arithmetic, pairwise add and accum long
def : InstRW<[N3Write_4c_1V1], (instregex "^[SU]ADALP_ZPmZ_[HSD]$")>;
def : InstRW<[N3Wr_ZPA, ReadDefault, N3Rd_ZPA],
(instregex "^[SU]ADALP_ZPmZ_[HSD]$")>;
// Arithmetic, shift
def : InstRW<[N3Write_2c_1V1],
@ -1642,7 +1747,7 @@ def : InstRW<[N3Write_2c_1V1],
"^(ASRR|LSLR|LSRR)_ZPmZ_[BHSD]")>;
// Arithmetic, shift and accumulate
def : InstRW<[N3Write_4c_1V1],
def : InstRW<[N3Wr_ZSA, N3Rd_ZSA],
(instregex "^(SRSRA|SSRA|URSRA|USRA)_ZZI_[BHSD]$")>;
// Arithmetic, shift by immediate
@ -1688,16 +1793,17 @@ def : InstRW<[N3Write_2c_1V],
def : InstRW<[N3Write_2c_1V], (instregex "^(SQ)?CADD_ZZI_[BHSD]$")>;
// Complex dot product 8-bit element
def : InstRW<[N3Write_3c_1V], (instrs CDOT_ZZZ_S, CDOT_ZZZI_S)>;
def : InstRW<[N3Wr_ZDOTB, N3Rd_ZDOTB], (instrs CDOT_ZZZ_S, CDOT_ZZZI_S)>;
// Complex dot product 16-bit element
def : InstRW<[N3Write_4c_1V0], (instrs CDOT_ZZZ_D, CDOT_ZZZI_D)>;
def : InstRW<[N3Wr_ZDOTH, N3Rd_ZDOTH], (instrs CDOT_ZZZ_D, CDOT_ZZZI_D)>;
// Complex multiply-add B, H, S element size
def : InstRW<[N3Write_4c_1V0], (instregex "^CMLA_ZZZ_[BHS]$", "^CMLA_ZZZI_[HS]$")>;
def : InstRW<[N3Wr_ZCMABHS, N3Rd_ZCMABHS],
(instregex "^CMLA_ZZZ_[BHS]$", "^CMLA_ZZZI_[HS]$")>;
// Complex multiply-add D element size
def : InstRW<[N3Write_5c_2V0], (instrs CMLA_ZZZ_D)>;
def : InstRW<[N3Wr_ZCMAD, N3Rd_ZCMAD], (instrs CMLA_ZZZ_D)>;
// Conditional extract operations, scalar form
def : InstRW<[N3Write_8c_1M0_1V], (instregex "^CLAST[AB]_RPZ_[BHSD]$")>;
@ -1736,13 +1842,14 @@ def : InstRW<[N3Write_16c_16V0], (instregex "^[SU]DIVR?_ZPmZ_D",
"^[SU]DIV_ZPZZ_D")>;
// Dot product, 8 bit
def : InstRW<[N3Write_3c_1V], (instregex "^[SU]DOT_ZZZI?_BtoS$")>;
def : InstRW<[N3Wr_ZDOTB, N3Rd_ZDOTB], (instregex "^[SU]DOT_ZZZI?_BtoS$")>;
// Dot product, 8 bit, using signed and unsigned integers
def : InstRW<[N3Write_3c_1V], (instrs SUDOT_ZZZI, USDOT_ZZZI, USDOT_ZZZ)>;
def : InstRW<[N3Wr_ZDOTB, N3Rd_ZDOTB],
(instrs SUDOT_ZZZI, USDOT_ZZZI, USDOT_ZZZ)>;
// Dot product, 16 bit
def : InstRW<[N3Write_4c_1V0], (instregex "^[SU]DOT_ZZZI?_HtoD$")>;
def : InstRW<[N3Wr_ZDOTH, N3Rd_ZDOTH], (instregex "^[SU]DOT_ZZZI?_HtoD$")>;
// Duplicate, immediate and indexed form
def : InstRW<[N3Write_2c_1V], (instregex "^DUP_ZI_[BHSD]$",
@ -1804,7 +1911,7 @@ def : InstRW<[N3Write_2c_1V], (instregex "^[SU](MAX|MIN)_ZI_[BHSD]",
def : InstRW<[N3Write_2c_1V], (instregex "^N?MATCH_PPzZZ_[BH]$")>;
// Matrix multiply-accumulate
def : InstRW<[N3Write_3c_1V], (instrs SMMLA_ZZZ, UMMLA_ZZZ, USMMLA_ZZZ)>;
def : InstRW<[N3Wr_ZMMA, N3Rd_ZMMA], (instrs SMMLA_ZZZ, UMMLA_ZZZ, USMMLA_ZZZ)>;
// Move prefix
def : InstRW<[N3Write_2c_1V], (instregex "^MOVPRFX_ZP[mz]Z_[BHSD]$",
@ -1827,20 +1934,22 @@ def : InstRW<[N3Write_4c_1V0], (instregex "^[SU]MULL[BT]_ZZZI_[SD]$",
"^[SU]MULL[BT]_ZZZ_[HSD]$")>;
// Multiply accumulate, B, H, S element size
def : InstRW<[N3Write_4c_1V0], (instregex "^ML[AS]_ZZZI_[BHS]$",
"^(ML[AS]|MAD|MSB)_(ZPmZZ|ZPZZZ)_[BHS]")>;
def : InstRW<[N3Wr_ZMABHS, ReadDefault, N3Rd_ZMABHS],
(instregex "^ML[AS]_ZZZI_[BHS]$",
"^(ML[AS]|MAD|MSB)_(ZPmZZ|ZPZZZ)_[BHS]")>;
// Multiply accumulate, D element size
def : InstRW<[N3Write_5c_2V0], (instregex "^ML[AS]_ZZZI_D$",
def : InstRW<[N3Wr_ZMAD, ReadDefault, N3Rd_ZMAD], (instregex "^ML[AS]_ZZZI_D$",
"^(ML[AS]|MAD|MSB)_(ZPmZZ|ZPZZZ)_D")>;
// Multiply accumulate long
def : InstRW<[N3Write_4c_1V0], (instregex "^[SU]ML[AS]L[BT]_ZZZ_[HSD]$",
def : InstRW<[N3Wr_ZMAL, N3Rd_ZMAL], (instregex "^[SU]ML[AS]L[BT]_ZZZ_[HSD]$",
"^[SU]ML[AS]L[BT]_ZZZI_[SD]$")>;
// Multiply accumulate saturating doubling long regular
def : InstRW<[N3Write_4c_1V0], (instregex "^SQDML[AS](LB|LT|LBT)_ZZZ_[HSD]$",
"^SQDML[AS](LB|LT)_ZZZI_[SD]$")>;
def : InstRW<[N3Wr_ZMASQL, N3Rd_ZMASQ],
(instregex "^SQDML[AS](LB|LT|LBT)_ZZZ_[HSD]$",
"^SQDML[AS](LB|LT)_ZZZI_[SD]$")>;
// Multiply saturating doubling high, B, H, S element size
def : InstRW<[N3Write_4c_1V0], (instregex "^SQDMULH_ZZZ_[BHS]$",
@ -1854,13 +1963,13 @@ def : InstRW<[N3Write_4c_1V0], (instregex "^SQDMULL[BT]_ZZZ_[HSD]$",
"^SQDMULL[BT]_ZZZI_[SD]$")>;
// Multiply saturating rounding doubling regular/complex accumulate, B, H, S element size
def : InstRW<[N3Write_4c_1V0], (instregex "^SQRDML[AS]H_ZZZ_[BHS]$",
def : InstRW<[N3Wr_ZMASQBHS, N3Rd_ZMASQ], (instregex "^SQRDML[AS]H_ZZZ_[BHS]$",
"^SQRDCMLAH_ZZZ_[BHS]$",
"^SQRDML[AS]H_ZZZI_[HS]$",
"^SQRDCMLAH_ZZZI_[HS]$")>;
// Multiply saturating rounding doubling regular/complex accumulate, D element size
def : InstRW<[N3Write_5c_2V0], (instregex "^SQRDML[AS]H_ZZZI?_D$",
def : InstRW<[N3Wr_ZMASQD, N3Rd_ZMASQ], (instregex "^SQRDML[AS]H_ZZZI?_D$",
"^SQRDCMLAH_ZZZ_D$")>;
// Multiply saturating rounding doubling regular/complex, B, H, S element size
@ -1948,8 +2057,9 @@ def : InstRW<[N3Write_2c_1V], (instregex "^FAC(GE|GT)_PPzZZ_[HSD]$",
def : InstRW<[N3Write_3c_1V], (instregex "^FCADD_ZPmZ_[HSD]$")>;
// Floating point complex multiply add
def : InstRW<[N3Write_4c_1V], (instregex "^FCMLA_ZPmZZ_[HSD]$",
"^FCMLA_ZZZI_[HS]$")>;
def : InstRW<[N3Wr_ZFCMA, ReadDefault, N3Rd_ZFCMA],
(instregex "^FCMLA_ZPmZZ_[HSD]")>;
def : InstRW<[N3Wr_ZFCMA, N3Rd_ZFCMA], (instregex "^FCMLA_ZZZI_[HS]")>;
// Floating point convert, long or narrow (F16 to F32 or F32 to F16)
def : InstRW<[N3Write_4c_2V0], (instregex "^FCVT_ZPmZ_(HtoS|StoH)",
@ -2014,12 +2124,15 @@ def : InstRW<[N3Write_3c_1V], (instregex "^(FSCALE|FMULX)_ZPmZ_[HSD]",
"^FMUL_ZPZ[IZ]_[HSD]")>;
// Floating point multiply accumulate
def : InstRW<[N3Write_4c_1V], (instregex "^F(N?M(AD|SB)|N?ML[AS])_ZPmZZ_[HSD]$",
"^FN?ML[AS]_ZPZZZ_[HSD]",
"^FML[AS]_ZZZI_[HSD]$")>;
def : InstRW<[N3Wr_ZFMA, ReadDefault, N3Rd_ZFMA],
(instregex "^FN?ML[AS]_ZPmZZ_[HSD]",
"^FN?(MAD|MSB)_ZPmZZ_[HSD]")>;
def : InstRW<[N3Wr_ZFMA, N3Rd_ZFMA],
(instregex "^FML[AS]_ZZZI_[HSD]",
"^FN?ML[AS]_ZPZZZ_[HSD]")>;
// Floating point multiply add/sub accumulate long
def : InstRW<[N3Write_4c_1V], (instregex "^FML[AS]L[BT]_ZZZI?_SHH$")>;
def : InstRW<[N3Wr_ZFMAL, N3Rd_ZFMAL], (instregex "^FML[AS]L[BT]_ZZZI?_SHH$")>;
// Floating point reciprocal estimate, F16
def : InstRW<[N3Write_6c_4V0], (instregex "^FR(ECP|SQRT)E_ZZ_H", "^FRECPX_ZPmZ_H")>;
@ -2079,13 +2192,13 @@ def : InstRW<[N3Write_3c_1V], (instregex "^FTS(MUL|SEL)_ZZZ_[HSD]$")>;
def : InstRW<[N3Write_4c_2V0], (instrs BFCVT_ZPmZ, BFCVTNT_ZPmZ)>;
// Dot product
def : InstRW<[N3Write_4c_1V], (instrs BFDOT_ZZI, BFDOT_ZZZ)>;
def : InstRW<[N3Wr_ZBFDOT, N3Rd_ZBFDOT], (instrs BFDOT_ZZI, BFDOT_ZZZ)>;
// Matrix multiply accumulate
def : InstRW<[N3Write_5c_1V], (instrs BFMMLA_ZZZ_HtoS)>;
def : InstRW<[N3Wr_ZBFMMA, N3Rd_ZBFMMA], (instrs BFMMLA_ZZZ_HtoS)>;
// Multiply accumulate long
def : InstRW<[N3Write_4c_1V], (instregex "^BFMLAL[BT]_ZZZ(I)?$")>;
def : InstRW<[N3Wr_ZBFMAL, N3Rd_ZBFMAL], (instregex "^BFMLAL[BT]_ZZZ(I)?$")>;
// SVE Load instructions
// -----------------------------------------------------------------------------

File diff suppressed because it is too large Load Diff

View File

@ -3685,21 +3685,21 @@ zip2 z31.s, z31.s, z31.s
# CHECK-NEXT: 1 2 0.50 clz z31.h, p7/m, z31.h
# CHECK-NEXT: 1 2 0.50 clz z31.s, p7/m, z31.s
# CHECK-NEXT: 1 4 1.00 cmla z0.b, z1.b, z2.b, #0
# CHECK-NEXT: 2 5 2.00 cmla z0.d, z1.d, z2.d, #0
# CHECK-NEXT: 1 5 2.00 cmla z0.d, z1.d, z2.d, #0
# CHECK-NEXT: 1 4 1.00 cmla z0.h, z1.h, z2.h, #0
# CHECK-NEXT: 1 4 1.00 cmla z0.h, z1.h, z2.h[0], #0
# CHECK-NEXT: 1 4 1.00 cmla z0.s, z1.s, z2.s, #0
# CHECK-NEXT: 1 4 1.00 cmla z0.s, z1.s, z2.s[0], #0
# CHECK-NEXT: 1 4 1.00 cmla z15.b, z16.b, z17.b, #270
# CHECK-NEXT: 2 5 2.00 cmla z15.d, z16.d, z17.d, #270
# CHECK-NEXT: 1 5 2.00 cmla z15.d, z16.d, z17.d, #270
# CHECK-NEXT: 1 4 1.00 cmla z15.h, z16.h, z17.h, #270
# CHECK-NEXT: 1 4 1.00 cmla z15.s, z16.s, z17.s, #270
# CHECK-NEXT: 1 4 1.00 cmla z29.b, z30.b, z31.b, #90
# CHECK-NEXT: 2 5 2.00 cmla z29.d, z30.d, z31.d, #90
# CHECK-NEXT: 1 5 2.00 cmla z29.d, z30.d, z31.d, #90
# CHECK-NEXT: 1 4 1.00 cmla z29.h, z30.h, z31.h, #90
# CHECK-NEXT: 1 4 1.00 cmla z29.s, z30.s, z31.s, #90
# CHECK-NEXT: 1 4 1.00 cmla z31.b, z31.b, z31.b, #180
# CHECK-NEXT: 2 5 2.00 cmla z31.d, z31.d, z31.d, #180
# CHECK-NEXT: 1 5 2.00 cmla z31.d, z31.d, z31.d, #180
# CHECK-NEXT: 1 4 1.00 cmla z31.h, z30.h, z7.h[0], #180
# CHECK-NEXT: 1 4 1.00 cmla z31.h, z31.h, z31.h, #180
# CHECK-NEXT: 1 4 1.00 cmla z31.s, z30.s, z7.s[0], #180
@ -4938,7 +4938,7 @@ zip2 z31.s, z31.s, z31.s
# CHECK-NEXT: 1 2 1.00 lsrr z0.h, p0/m, z0.h, z0.h
# CHECK-NEXT: 1 2 1.00 lsrr z0.s, p0/m, z0.s, z0.s
# CHECK-NEXT: 1 4 1.00 mad z0.b, p7/m, z1.b, z31.b
# CHECK-NEXT: 2 5 2.00 mad z0.d, p7/m, z1.d, z31.d
# CHECK-NEXT: 1 5 2.00 mad z0.d, p7/m, z1.d, z31.d
# CHECK-NEXT: 1 4 1.00 mad z0.h, p7/m, z1.h, z31.h
# CHECK-NEXT: 1 4 1.00 mad z0.s, p7/m, z1.s, z31.s
# CHECK-NEXT: 1 2 0.50 match p0.b, p0/z, z0.b, z0.b
@ -4946,15 +4946,15 @@ zip2 z31.s, z31.s, z31.s
# CHECK-NEXT: 1 2 0.50 match p15.b, p7/z, z30.b, z31.b
# CHECK-NEXT: 1 2 0.50 match p15.h, p7/z, z30.h, z31.h
# CHECK-NEXT: 1 4 1.00 mla z0.b, p7/m, z1.b, z31.b
# CHECK-NEXT: 2 5 2.00 mla z0.d, p7/m, z1.d, z31.d
# CHECK-NEXT: 2 5 2.00 mla z0.d, z1.d, z7.d[1]
# CHECK-NEXT: 1 5 2.00 mla z0.d, p7/m, z1.d, z31.d
# CHECK-NEXT: 1 5 2.00 mla z0.d, z1.d, z7.d[1]
# CHECK-NEXT: 1 4 1.00 mla z0.h, p7/m, z1.h, z31.h
# CHECK-NEXT: 1 4 1.00 mla z0.h, z1.h, z7.h[7]
# CHECK-NEXT: 1 4 1.00 mla z0.s, p7/m, z1.s, z31.s
# CHECK-NEXT: 1 4 1.00 mla z0.s, z1.s, z7.s[3]
# CHECK-NEXT: 1 4 1.00 mls z0.b, p7/m, z1.b, z31.b
# CHECK-NEXT: 2 5 2.00 mls z0.d, p7/m, z1.d, z31.d
# CHECK-NEXT: 2 5 2.00 mls z0.d, z1.d, z7.d[1]
# CHECK-NEXT: 1 5 2.00 mls z0.d, p7/m, z1.d, z31.d
# CHECK-NEXT: 1 5 2.00 mls z0.d, z1.d, z7.d[1]
# CHECK-NEXT: 1 4 1.00 mls z0.h, p7/m, z1.h, z31.h
# CHECK-NEXT: 1 4 1.00 mls z0.h, z1.h, z7.h[7]
# CHECK-NEXT: 1 4 1.00 mls z0.s, p7/m, z1.s, z31.s
@ -5072,7 +5072,7 @@ zip2 z31.s, z31.s, z31.s
# CHECK-NEXT: 1 1 0.25 U mrs x3, ZCR_EL2
# CHECK-NEXT: 1 1 0.25 U mrs x3, ZCR_EL3
# CHECK-NEXT: 1 4 1.00 msb z0.b, p7/m, z1.b, z31.b
# CHECK-NEXT: 2 5 2.00 msb z0.d, p7/m, z1.d, z31.d
# CHECK-NEXT: 1 5 2.00 msb z0.d, p7/m, z1.d, z31.d
# CHECK-NEXT: 1 4 1.00 msb z0.h, p7/m, z1.h, z31.h
# CHECK-NEXT: 1 4 1.00 msb z0.s, p7/m, z1.s, z31.s
# CHECK-NEXT: 1 1 0.25 U msr ZCR_EL1, x3
@ -5790,35 +5790,35 @@ zip2 z31.s, z31.s, z31.s
# CHECK-NEXT: 1 2 0.50 sqneg z31.h, p7/m, z31.h
# CHECK-NEXT: 1 2 0.50 sqneg z31.s, p7/m, z31.s
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z0.b, z1.b, z2.b, #0
# CHECK-NEXT: 2 5 2.00 sqrdcmlah z0.d, z1.d, z2.d, #0
# CHECK-NEXT: 1 5 2.00 sqrdcmlah z0.d, z1.d, z2.d, #0
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z0.h, z1.h, z2.h, #0
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z0.h, z1.h, z2.h[0], #0
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z0.s, z1.s, z2.s, #0
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z0.s, z1.s, z2.s[0], #0
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z15.b, z16.b, z17.b, #270
# CHECK-NEXT: 2 5 2.00 sqrdcmlah z15.d, z16.d, z17.d, #270
# CHECK-NEXT: 1 5 2.00 sqrdcmlah z15.d, z16.d, z17.d, #270
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z15.h, z16.h, z17.h, #270
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z15.s, z16.s, z17.s, #270
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z29.b, z30.b, z31.b, #90
# CHECK-NEXT: 2 5 2.00 sqrdcmlah z29.d, z30.d, z31.d, #90
# CHECK-NEXT: 1 5 2.00 sqrdcmlah z29.d, z30.d, z31.d, #90
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z29.h, z30.h, z31.h, #90
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z29.s, z30.s, z31.s, #90
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z31.b, z31.b, z31.b, #180
# CHECK-NEXT: 2 5 2.00 sqrdcmlah z31.d, z31.d, z31.d, #180
# CHECK-NEXT: 1 5 2.00 sqrdcmlah z31.d, z31.d, z31.d, #180
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z31.h, z30.h, z7.h[0], #180
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z31.h, z31.h, z31.h, #180
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z31.s, z30.s, z7.s[0], #180
# CHECK-NEXT: 1 4 1.00 sqrdcmlah z31.s, z31.s, z31.s, #180
# CHECK-NEXT: 1 4 1.00 sqrdmlah z0.b, z1.b, z31.b
# CHECK-NEXT: 2 5 2.00 sqrdmlah z0.d, z1.d, z15.d[1]
# CHECK-NEXT: 2 5 2.00 sqrdmlah z0.d, z1.d, z31.d
# CHECK-NEXT: 1 5 2.00 sqrdmlah z0.d, z1.d, z15.d[1]
# CHECK-NEXT: 1 5 2.00 sqrdmlah z0.d, z1.d, z31.d
# CHECK-NEXT: 1 4 1.00 sqrdmlah z0.h, z1.h, z31.h
# CHECK-NEXT: 1 4 1.00 sqrdmlah z0.h, z1.h, z7.h[7]
# CHECK-NEXT: 1 4 1.00 sqrdmlah z0.s, z1.s, z31.s
# CHECK-NEXT: 1 4 1.00 sqrdmlah z0.s, z1.s, z7.s[3]
# CHECK-NEXT: 1 4 1.00 sqrdmlsh z0.b, z1.b, z31.b
# CHECK-NEXT: 2 5 2.00 sqrdmlsh z0.d, z1.d, z15.d[1]
# CHECK-NEXT: 2 5 2.00 sqrdmlsh z0.d, z1.d, z31.d
# CHECK-NEXT: 1 5 2.00 sqrdmlsh z0.d, z1.d, z15.d[1]
# CHECK-NEXT: 1 5 2.00 sqrdmlsh z0.d, z1.d, z31.d
# CHECK-NEXT: 1 4 1.00 sqrdmlsh z0.h, z1.h, z31.h
# CHECK-NEXT: 1 4 1.00 sqrdmlsh z0.h, z1.h, z7.h[7]
# CHECK-NEXT: 1 4 1.00 sqrdmlsh z0.s, z1.s, z31.s