1//==- AArch64SchedTSV110.td - Huawei TSV110 Scheduling Definitions -*- tablegen -*-=// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines the machine model for Huawei TSV110 to support 10// instruction scheduling and other instruction cost heuristics. 11// 12//===----------------------------------------------------------------------===// 13 14// ===---------------------------------------------------------------------===// 15// The following definitions describe the simpler per-operand machine model. 16// This works with MachineScheduler. See llvm/MC/MCSchedule.h for details. 17 18// Huawei TSV110 scheduling machine model. 19def TSV110Model : SchedMachineModel { 20 let IssueWidth = 4; // 4 micro-ops dispatched per cycle. 21 let MicroOpBufferSize = 128; // 128 micro-op re-order buffer 22 let LoopMicroOpBufferSize = 16; 23 let LoadLatency = 4; // Optimistic load latency. 24 let MispredictPenalty = 14; // Fetch + Decode/Rename/Dispatch + Branch 25 let CompleteModel = 1; 26 27 list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F, 28 PAUnsupported.F, 29 SMEUnsupported.F, 30 [HasMTE, HasCSSC]); 31} 32 33// Define each kind of processor resource and number available on the TSV110, 34// which has 8 pipelines, each with its own queue where micro-ops wait for 35// their operands and issue out-of-order to one of eight execution pipelines. 36let SchedModel = TSV110Model in { 37 def TSV110UnitALU : ProcResource<1>; // Int ALU 38 def TSV110UnitAB : ProcResource<2>; // Int ALU/BRU 39 def TSV110UnitMDU : ProcResource<1>; // Multi-Cycle 40 def TSV110UnitFSU1 : ProcResource<1>; // FP/ASIMD 41 def TSV110UnitFSU2 : ProcResource<1>; // FP/ASIMD 42 def TSV110UnitLd0St : ProcResource<1>; // Load/Store 43 def TSV110UnitLd1 : ProcResource<1>; // Load 44 45 def TSV110UnitLd : ProcResGroup<[TSV110UnitLd0St, TSV110UnitLd1]>; // Any load 46 def TSV110UnitF : ProcResGroup<[TSV110UnitFSU1, TSV110UnitFSU2]>; 47 def TSV110UnitALUAB : ProcResGroup<[TSV110UnitALU, TSV110UnitAB]>; 48} 49 50let SchedModel = TSV110Model in { 51 52//===----------------------------------------------------------------------===// 53// Map the target-defined scheduler read/write resources and latency for TSV110 54 55// Integer ALU 56// TODO: Use SchedVariant to select BRU for ALU ops that sets NZCV flags 57// (including ops that shift and/or extend): 58// 1cyc_1BRU: ADDS, ADCS, ANDS, BICS, SUBS, SBCS, CCMN, CCMP 59// 2cyc_1BRU: ADDSshfr, SUBSshfr, ANDSshfr, ADDSextr, SUBSextr 60def : WriteRes<WriteImm, [TSV110UnitALUAB]> { let Latency = 1; } 61def : WriteRes<WriteI, [TSV110UnitALUAB]> { let Latency = 1; } 62def : WriteRes<WriteISReg, [TSV110UnitMDU]> { let Latency = 2; } 63def : WriteRes<WriteIEReg, [TSV110UnitMDU]> { let Latency = 2; } 64def : WriteRes<WriteExtr, [TSV110UnitALUAB]> { let Latency = 1; } 65def : WriteRes<WriteIS, [TSV110UnitALUAB]> { let Latency = 1; } 66 67// Integer Mul/MAC/Div 68def : WriteRes<WriteID32, [TSV110UnitMDU]> { let Latency = 12; 69 let ReleaseAtCycles = [12]; } 70def : WriteRes<WriteID64, [TSV110UnitMDU]> { let Latency = 20; 71 let ReleaseAtCycles = [20]; } 72def : WriteRes<WriteIM32, [TSV110UnitMDU]> { let Latency = 3; } 73def : WriteRes<WriteIM64, [TSV110UnitMDU]> { let Latency = 4; } 74 75// Load 76def : WriteRes<WriteLD, [TSV110UnitLd]> { let Latency = 4; } 77def : WriteRes<WriteLDIdx, [TSV110UnitLd]> { let Latency = 4; } 78def : WriteRes<WriteLDHi, []> { let Latency = 4; } 79 80// Pre/Post Indexing 81def : WriteRes<WriteAdr, [TSV110UnitALUAB]> { let Latency = 1; } 82 83// Store 84def : WriteRes<WriteST, [TSV110UnitLd0St]> { let Latency = 1; } 85def : WriteRes<WriteSTP, [TSV110UnitLd0St]> { let Latency = 1; } 86def : WriteRes<WriteSTIdx, [TSV110UnitLd0St]> { let Latency = 1; } 87 88// FP 89def : WriteRes<WriteF, [TSV110UnitF]> { let Latency = 2; } 90def : WriteRes<WriteFCmp, [TSV110UnitF]> { let Latency = 3; } 91def : WriteRes<WriteFCvt, [TSV110UnitF]> { let Latency = 3; } 92def : WriteRes<WriteFCopy, [TSV110UnitF]> { let Latency = 2; } 93def : WriteRes<WriteFImm, [TSV110UnitF]> { let Latency = 2; } 94def : WriteRes<WriteFMul, [TSV110UnitF]> { let Latency = 5; } 95 96// FP Div, Sqrt 97def : WriteRes<WriteFDiv, [TSV110UnitFSU1]> { let Latency = 18; let ReleaseAtCycles = [18]; } 98 99def : WriteRes<WriteVd, [TSV110UnitF]> { let Latency = 4; } 100def : WriteRes<WriteVq, [TSV110UnitF]> { let Latency = 4; } 101def : WriteRes<WriteVST, [TSV110UnitF]> { let Latency = 1; } 102 103// Branch 104def : WriteRes<WriteBr, [TSV110UnitAB]> { let Latency = 1; } 105def : WriteRes<WriteBrReg, [TSV110UnitAB]> { let Latency = 1; } 106def : WriteRes<WriteSys, []> { let Latency = 1; } 107def : WriteRes<WriteBarrier, []> { let Latency = 1; } 108def : WriteRes<WriteHint, []> { let Latency = 1; } 109 110def : WriteRes<WriteAtomic, []> { let Unsupported = 1; } 111 112// Forwarding logic is modeled only for multiply and accumulate. 113def : ReadAdvance<ReadI, 0>; 114def : ReadAdvance<ReadISReg, 0>; 115def : ReadAdvance<ReadIEReg, 0>; 116def : ReadAdvance<ReadIM, 0>; 117def : ReadAdvance<ReadIMA, 2, [WriteIM32, WriteIM64]>; 118def : ReadAdvance<ReadID, 0>; 119def : ReadAdvance<ReadExtrHi, 0>; 120def : ReadAdvance<ReadAdrBase, 0>; 121def : ReadAdvance<ReadVLD, 0>; 122def : ReadAdvance<ReadST, 0>; 123 124def : InstRW<[WriteI], (instrs COPY)>; 125 126// Detailed Refinements 127//===----------------------------------------------------------------------===// 128 129// Contains all of the TSV110 specific SchedWriteRes types. The approach 130// below is to define a generic SchedWriteRes for every combination of 131// latency and microOps. The naming conventions is to use a prefix, one field 132// for latency, and one or more microOp count/type designators. 133// Prefix: TSV110Wr 134// Latency: #cyc 135// MicroOp Count/Types: #(ALU|AB|MDU|FSU1|FSU2|LdSt|ALUAB|F|FLdSt) 136// 137// e.g. TSV110Wr_6cyc_1ALU_6MDU_4LdSt means the total latency is 6 and there are 138// 1 micro-ops to be issued down one ALU pipe, six MDU pipes and four LdSt pipes. 139// 140 141//===----------------------------------------------------------------------===// 142// Define Generic 1 micro-op types 143 144def TSV110Wr_1cyc_1AB : SchedWriteRes<[TSV110UnitAB]> { let Latency = 1; } 145def TSV110Wr_1cyc_1ALU : SchedWriteRes<[TSV110UnitALU]> { let Latency = 1; } 146def TSV110Wr_1cyc_1ALUAB : SchedWriteRes<[TSV110UnitALUAB]> { let Latency = 1; } 147def TSV110Wr_1cyc_1LdSt : SchedWriteRes<[TSV110UnitLd0St]> { let Latency = 1; } 148 149def TSV110Wr_2cyc_1AB : SchedWriteRes<[TSV110UnitAB]> { let Latency = 2; let ReleaseAtCycles = [2]; } 150def TSV110Wr_2cyc_1ALU : SchedWriteRes<[TSV110UnitALU]> { let Latency = 2; } 151def TSV110Wr_2cyc_1MDU : SchedWriteRes<[TSV110UnitMDU]> { let Latency = 2; } 152def TSV110Wr_2cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]> { let Latency = 2; } 153def TSV110Wr_2cyc_1F : SchedWriteRes<[TSV110UnitF]> { let Latency = 2; } 154 155def TSV110Wr_3cyc_1F : SchedWriteRes<[TSV110UnitF]> { let Latency = 3; } 156def TSV110Wr_3cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]> { let Latency = 3; } 157def TSV110Wr_3cyc_1MDU : SchedWriteRes<[TSV110UnitMDU]> { let Latency = 3; } 158 159def TSV110Wr_4cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]> { let Latency = 4; } 160def TSV110Wr_4cyc_1F : SchedWriteRes<[TSV110UnitF]> { let Latency = 4; } 161def TSV110Wr_4cyc_1LdSt : SchedWriteRes<[TSV110UnitLd]> { let Latency = 4; } 162def TSV110Wr_4cyc_1MDU : SchedWriteRes<[TSV110UnitMDU]> { let Latency = 4; } 163 164def TSV110Wr_5cyc_1F : SchedWriteRes<[TSV110UnitF]> { let Latency = 5; } 165def TSV110Wr_5cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]> { let Latency = 5; } 166def TSV110Wr_5cyc_1FSU2 : SchedWriteRes<[TSV110UnitFSU2]> { let Latency = 5; } 167def TSV110Wr_5cyc_1LdSt : SchedWriteRes<[TSV110UnitLd]> { let Latency = 5; } 168 169def TSV110Wr_6cyc_1F : SchedWriteRes<[TSV110UnitF]> { let Latency = 6; } 170 171def TSV110Wr_7cyc_1F : SchedWriteRes<[TSV110UnitF]> { let Latency = 7; } 172 173def TSV110Wr_8cyc_1F : SchedWriteRes<[TSV110UnitF]> { let Latency = 8; } 174 175def TSV110Wr_11cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]> { let Latency = 11; let ReleaseAtCycles = [11]; } 176 177def TSV110Wr_12cyc_1MDU : SchedWriteRes<[TSV110UnitMDU]> { let Latency = 12; let ReleaseAtCycles = [12]; } 178 179def TSV110Wr_17cyc_1FSU2 : SchedWriteRes<[TSV110UnitFSU2]> { let Latency = 17; let ReleaseAtCycles = [17]; } 180 181def TSV110Wr_18cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]> { let Latency = 18; let ReleaseAtCycles = [18]; } 182 183def TSV110Wr_20cyc_1MDU : SchedWriteRes<[TSV110UnitMDU]> { let Latency = 20; let ReleaseAtCycles = [20]; } 184 185def TSV110Wr_24cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]> { let Latency = 24; let ReleaseAtCycles = [24]; } 186 187def TSV110Wr_31cyc_1FSU2 : SchedWriteRes<[TSV110UnitFSU2]> { let Latency = 31; let ReleaseAtCycles = [31]; } 188 189def TSV110Wr_36cyc_1FSU2 : SchedWriteRes<[TSV110UnitFSU2]> { let Latency = 36; let ReleaseAtCycles = [36]; } 190 191def TSV110Wr_38cyc_1FSU1 : SchedWriteRes<[TSV110UnitFSU1]> { let Latency = 38; let ReleaseAtCycles = [38]; } 192 193def TSV110Wr_64cyc_1FSU2 : SchedWriteRes<[TSV110UnitFSU2]> { let Latency = 64; let ReleaseAtCycles = [64]; } 194 195//===----------------------------------------------------------------------===// 196// Define Generic 2 micro-op types 197 198def TSV110Wr_1cyc_1LdSt_1ALUAB : SchedWriteRes<[TSV110UnitLd0St, 199 TSV110UnitALUAB]> { 200 let Latency = 1; 201 let NumMicroOps = 2; 202} 203 204def TSV110Wr_2cyc_1LdSt_1ALUAB : SchedWriteRes<[TSV110UnitLd0St, 205 TSV110UnitALUAB]> { 206 let Latency = 2; 207 let NumMicroOps = 2; 208} 209 210def TSV110Wr_2cyc_2LdSt : SchedWriteRes<[TSV110UnitLd0St, 211 TSV110UnitLd0St]> { 212 let Latency = 2; 213 let NumMicroOps = 2; 214} 215 216def TSV110Wr_2cyc_2F : SchedWriteRes<[TSV110UnitF, 217 TSV110UnitF]> { 218 let Latency = 2; 219 let NumMicroOps = 2; 220} 221 222def TSV110Wr_2cyc_1FSU1_1FSU2 : SchedWriteRes<[TSV110UnitFSU1, 223 TSV110UnitFSU2]> { 224 let Latency = 2; 225 let NumMicroOps = 2; 226} 227 228def TSV110Wr_4cyc_2F : SchedWriteRes<[TSV110UnitF, 229 TSV110UnitF]> { 230 let Latency = 4; 231 let NumMicroOps = 2; 232} 233 234def TSV110Wr_4cyc_1FSU1_1FSU2 : SchedWriteRes<[TSV110UnitFSU1, 235 TSV110UnitFSU2]> { 236 let Latency = 4; 237 let NumMicroOps = 2; 238} 239 240def TSV110Wr_4cyc_1LdSt_1ALUAB : SchedWriteRes<[TSV110UnitLd, 241 TSV110UnitALUAB]> { 242 let Latency = 4; 243 let NumMicroOps = 2; 244} 245 246def TSV110Wr_5cyc_1ALU_1F : SchedWriteRes<[TSV110UnitALU, 247 TSV110UnitF]> { 248 let Latency = 5; 249 let NumMicroOps = 2; 250} 251 252def TSV110Wr_6cyc_2LdSt : SchedWriteRes<[TSV110UnitLd, 253 TSV110UnitLd]> { 254 let Latency = 6; 255 let NumMicroOps = 2; 256} 257 258def TSV110Wr_6cyc_1LdSt_1ALUAB : SchedWriteRes<[TSV110UnitLd, 259 TSV110UnitALUAB]> { 260 let Latency = 6; 261 let NumMicroOps = 2; 262} 263 264def TSV110Wr_7cyc_1F_1LdSt : SchedWriteRes<[TSV110UnitF, 265 TSV110UnitLd]> { 266 let Latency = 7; 267 let NumMicroOps = 2; 268} 269 270def TSV110Wr_8cyc_2FSU1 : SchedWriteRes<[TSV110UnitFSU1, 271 TSV110UnitFSU1]> { 272 let Latency = 8; 273 let NumMicroOps = 2; 274} 275 276 277def TSV110Wr_8cyc_1FSU1_1FSU2 : SchedWriteRes<[TSV110UnitFSU1, 278 TSV110UnitFSU2]> { 279 let Latency = 8; 280 let NumMicroOps = 2; 281} 282 283//===----------------------------------------------------------------------===// 284// Define Generic 3 micro-op types 285 286def TSV110Wr_6cyc_3F : SchedWriteRes<[TSV110UnitF, TSV110UnitF, 287 TSV110UnitF]> { 288 let Latency = 6; 289 let NumMicroOps = 3; 290} 291 292def TSV110Wr_6cyc_3LdSt : SchedWriteRes<[TSV110UnitLd, TSV110UnitLd, 293 TSV110UnitLd]> { 294 let Latency = 6; 295 let NumMicroOps = 3; 296} 297 298def TSV110Wr_7cyc_2F_1LdSt : SchedWriteRes<[TSV110UnitF, TSV110UnitF, 299 TSV110UnitLd]> { 300 let Latency = 7; 301 let NumMicroOps = 3; 302} 303 304//===----------------------------------------------------------------------===// 305// Define Generic 4 micro-op types 306 307def TSV110Wr_8cyc_4F : SchedWriteRes<[TSV110UnitF, TSV110UnitF, 308 TSV110UnitF, TSV110UnitF]> { 309 let Latency = 8; 310 let NumMicroOps = 4; 311} 312 313def TSV110Wr_8cyc_3F_1LdSt : SchedWriteRes<[TSV110UnitF, TSV110UnitF, 314 TSV110UnitF, TSV110UnitLd]> { 315 let Latency = 8; 316 let NumMicroOps = 4; 317} 318 319//===----------------------------------------------------------------------===// 320// Define Generic 5 micro-op types 321 322def TSV110Wr_8cyc_3F_2LdSt : SchedWriteRes<[TSV110UnitF, TSV110UnitF, TSV110UnitF, 323 TSV110UnitLd, TSV110UnitLd]> { 324 let Latency = 8; 325 let NumMicroOps = 5; 326} 327 328//===----------------------------------------------------------------------===// 329// Define Generic 8 micro-op types 330 331def TSV110Wr_10cyc_4F_4LdSt : SchedWriteRes<[TSV110UnitF, TSV110UnitF, 332 TSV110UnitF, TSV110UnitF, 333 TSV110UnitLd, TSV110UnitLd, 334 TSV110UnitLd, TSV110UnitLd]> { 335 let Latency = 10; 336 let NumMicroOps = 8; 337} 338 339 340// Branch Instructions 341// ----------------------------------------------------------------------------- 342 343def : InstRW<[TSV110Wr_1cyc_1AB], (instrs B)>; 344def : InstRW<[TSV110Wr_1cyc_1AB], (instrs BL)>; 345def : InstRW<[TSV110Wr_1cyc_1AB], (instrs BLR)>; 346def : InstRW<[TSV110Wr_1cyc_1AB], (instregex "^(BR|RET|(CBZ|CBNZ|TBZ|TBNZ))$")>; 347 348 349// Cryptography Extensions 350// ----------------------------------------------------------------------------- 351 352def : InstRW<[TSV110Wr_3cyc_1FSU1], (instregex "^AES[DE]")>; 353def : InstRW<[TSV110Wr_3cyc_1FSU1], (instregex "^AESI?MC")>; 354def : InstRW<[TSV110Wr_2cyc_1FSU1], (instregex "^SHA1SU1")>; 355def : InstRW<[TSV110Wr_2cyc_2F], (instregex "^SHA1(H|SU0)")>; 356def : InstRW<[TSV110Wr_5cyc_1FSU1], (instregex "^SHA1[CMP]")>; 357def : InstRW<[TSV110Wr_2cyc_1FSU1], (instregex "^SHA256SU0")>; 358def : InstRW<[TSV110Wr_3cyc_1FSU1], (instregex "^SHA256SU1")>; 359def : InstRW<[TSV110Wr_5cyc_1FSU1], (instregex "^SHA256(H|H2)")>; 360def TSV110ReadCRC: SchedReadAdvance<1, [TSV110Wr_2cyc_1MDU]>; 361def : InstRW<[TSV110Wr_2cyc_1MDU, TSV110ReadCRC], (instregex "^CRC32.*$")>; 362 363 364// Arithmetic and Logical Instructions 365// ----------------------------------------------------------------------------- 366 367def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "(BIC|EON|ORN)[WX]rr")>; 368def : InstRW<[TSV110Wr_1cyc_1AB], (instregex "(BIC)S[WX]rr")>; 369 370def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "(ADD|AND|EOR|ORR|SUB)[WX]r(r|i)")>; 371def : InstRW<[TSV110Wr_1cyc_1AB], (instregex "(ADD|AND|EOR|ORR|SUB)S[WX]r(r|i)")>; 372 373def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "^(ADC|SBC|BIC)[WX]r$")>; 374def : InstRW<[TSV110Wr_1cyc_1AB], (instregex "^(ADC|SBC)S[WX]r$")>; 375 376 377// Shifted Register with Shift == 0 378// ---------------------------------------------------------------------------- 379 380def TSV110WrISReg : SchedWriteVariant<[ 381 SchedVar<RegShiftedPred, [WriteISReg]>, 382 SchedVar<NoSchedPred, [WriteI]>]>; 383def : InstRW<[TSV110WrISReg], (instregex "^(ADD|AND|BIC|EON|EOR|ORN|ORR|SUB)[WX]rs$")>; 384 385def TSV110WrISRegBr : SchedWriteVariant<[ 386 SchedVar<RegShiftedPred, [TSV110Wr_2cyc_1AB]>, 387 SchedVar<NoSchedPred, [WriteBr]>]>; 388def : InstRW<[TSV110WrISRegBr], (instregex "^(ADD|AND|BIC|EON|EOR|ORN|ORR|SUB)S[WX]rs$")>; 389 390// Extended Register with Extend == 0 391// ---------------------------------------------------------------------------- 392 393def TSV110WrIEReg : SchedWriteVariant<[ 394 SchedVar<RegExtendedPred, [WriteISReg]>, 395 SchedVar<NoSchedPred, [WriteI]>]>; 396def : InstRW<[TSV110WrIEReg], (instregex "^(ADD|SUB)[WX]r(x|x64)$")>; 397 398def TSV110WrIERegBr : SchedWriteVariant<[ 399 SchedVar<RegExtendedPred, [TSV110Wr_2cyc_1AB]>, 400 SchedVar<NoSchedPred, [WriteBr]>]>; 401def : InstRW<[TSV110WrIERegBr], (instregex "^(ADD|SUB)S[WX]r(x|x64)$")>; 402 403def : InstRW<[TSV110Wr_1cyc_1AB], (instregex "^(CCMN|CCMP)(W|X)(r|i)$")>; 404def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "^(CSEL|CSINC|CSINV|CSNEG)(W|X)r$")>; 405 406 407// Move and Shift Instructions 408// ----------------------------------------------------------------------------- 409 410def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instrs ADR, ADRP)>; 411def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "^MOV[NZK][WX]i")>; 412def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "(LSLV|LSRV|ASRV|RORV)(W|X)r")>; 413 414 415// Divide and Multiply Instructions 416// ----------------------------------------------------------------------------- 417 418def : InstRW<[TSV110Wr_12cyc_1MDU], (instregex "^(S|U)DIVWr$")>; 419def : InstRW<[TSV110Wr_20cyc_1MDU], (instregex "^(S|U)DIVXr$")>; 420 421def TSV110ReadMAW : SchedReadAdvance<2, [TSV110Wr_3cyc_1MDU]>; 422def : InstRW<[TSV110Wr_3cyc_1MDU, ReadIM, ReadIM, TSV110ReadMAW], (instrs MADDWrrr, MSUBWrrr)>; 423def TSV110ReadMAQ : SchedReadAdvance<3, [TSV110Wr_4cyc_1MDU]>; 424def : InstRW<[TSV110Wr_4cyc_1MDU, ReadIM, ReadIM, TSV110ReadMAQ], (instrs MADDXrrr, MSUBXrrr)>; 425def : InstRW<[TSV110Wr_3cyc_1MDU, ReadIM, ReadIM, TSV110ReadMAW], (instregex "(S|U)(MADDL|MSUBL)rrr")>; 426def : InstRW<[TSV110Wr_4cyc_1MDU], (instregex "^(S|U)MULHrr$")>; 427 428 429// Miscellaneous Data-Processing Instructions 430// ----------------------------------------------------------------------------- 431 432def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "^EXTR(W|X)rri$")>; 433def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "^(S|U)?BFM(W|X)ri$")>; 434def : InstRW<[TSV110Wr_1cyc_1ALUAB], (instregex "^(CLS|CLZ|RBIT|REV(16|32)?)(W|X)r$")>; 435 436 437// Load Instructions 438// ----------------------------------------------------------------------------- 439 440def : InstRW<[TSV110Wr_4cyc_1LdSt], (instregex "^LDR(W|X)l$")>; 441def : InstRW<[TSV110Wr_4cyc_1LdSt], (instrs LDRSWl)>; 442 443def : InstRW<[TSV110Wr_4cyc_1LdSt], (instregex "^LDR(BB|HH|W|X)ui$")>; 444def : InstRW<[TSV110Wr_4cyc_1LdSt], (instregex "^LDRS(BW|BX|HW|HX|W)ui$")>; 445 446def : InstRW<[WriteAdr, TSV110Wr_4cyc_1LdSt], (instregex "^LDR(BB|HH|W|X)(post|pre)$")>; 447def : InstRW<[WriteAdr, TSV110Wr_4cyc_1LdSt], (instregex "^LDRS(BW|BX|HW|HX|W)(post|pre)$")>; 448 449def : InstRW<[TSV110Wr_4cyc_1LdSt], (instregex "^LDTR(B|H|W|X)i$")>; 450def : InstRW<[TSV110Wr_4cyc_1LdSt], (instregex "^LDUR(BB|HH|W|X)i$")>; 451def : InstRW<[TSV110Wr_4cyc_1LdSt], (instregex "^LDTRS(BW|BX|HW|HX|W)i$")>; 452def : InstRW<[TSV110Wr_4cyc_1LdSt], (instregex "^LDURS(BW|BX|HW|HX|W)i$")>; 453 454def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteLDHi], (instregex "^LDNP(W|X)i$")>; 455def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteLDHi], (instregex "^LDP(W|X)i$")>; 456def : InstRW<[WriteAdr, TSV110Wr_4cyc_1LdSt_1ALUAB, WriteLDHi],(instregex "^LDP(W|X)(post|pre)$")>; 457 458def : InstRW<[TSV110Wr_4cyc_1LdSt, WriteLDHi], (instrs LDPSWi)>; 459def : InstRW<[WriteAdr, TSV110Wr_4cyc_1LdSt, WriteLDHi], (instrs LDPSWpost)>; 460def : InstRW<[WriteAdr, TSV110Wr_4cyc_1LdSt, WriteLDHi], (instrs LDPSWpre)>; 461 462def : InstRW<[TSV110Wr_4cyc_1LdSt], (instrs PRFMl)>; 463def : InstRW<[TSV110Wr_4cyc_1LdSt], (instrs PRFUMi)>; 464def : InstRW<[TSV110Wr_4cyc_1LdSt], (instregex "^PRFMui$")>; 465def : InstRW<[TSV110Wr_4cyc_1LdSt], (instregex "^PRFMro(W|X)$")>; 466 467 468// Store Instructions 469// ----------------------------------------------------------------------------- 470 471def : InstRW<[TSV110Wr_1cyc_1LdSt], (instregex "^STN?P(W|X)i$")>; 472def : InstRW<[WriteAdr, TSV110Wr_1cyc_1LdSt], (instregex "^STP(W|X)(post|pre)$")>; 473def : InstRW<[TSV110Wr_1cyc_1LdSt], (instregex "^STUR(BB|HH|W|X)i$")>; 474def : InstRW<[TSV110Wr_1cyc_1LdSt], (instregex "^STTR(B|H|W|X)i$")>; 475def : InstRW<[TSV110Wr_1cyc_1LdSt], (instregex "^STR(BB|HH|W|X)ui$")>; 476 477def : InstRW<[WriteAdr, TSV110Wr_1cyc_1LdSt], (instregex "^STR(BB|HH|W|X)(post|pre)$")>; 478def : InstRW<[WriteAdr, TSV110Wr_1cyc_1LdSt], (instregex "^STR(BB|HH|W|X)ro(W|X)$")>; 479 480 481// FP Data Processing Instructions 482// ----------------------------------------------------------------------------- 483 484def : InstRW<[TSV110Wr_2cyc_1F], (instregex "F(ABS|NEG)(D|S)r")>; 485def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FCCMP(E)?(S|D)rr$")>; 486def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FCMP(E)?(S|D)r(r|i)$")>; 487def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FCSEL(S|D)rrr$")>; 488 489def : InstRW<[TSV110Wr_11cyc_1FSU1], (instrs FDIVSrr)>; 490def : InstRW<[TSV110Wr_18cyc_1FSU1], (instrs FDIVDrr)>; 491def : InstRW<[TSV110Wr_17cyc_1FSU2], (instrs FSQRTSr)>; 492def : InstRW<[TSV110Wr_31cyc_1FSU2], (instrs FSQRTDr)>; 493 494def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^F(MAX|MIN).+rr")>; 495 496def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^FN?M(ADD|SUB)Hrrr")>; 497def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^FN?M(ADD|SUB)Srrr")>; 498def : InstRW<[TSV110Wr_7cyc_1F], (instregex "^FN?M(ADD|SUB)Drrr")>; 499 500def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^F(ADD|SUB)Hrr")>; 501def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^F(ADD|SUB)Srr")>; 502def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^F(ADD|SUB)Drr")>; 503 504def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^F(N)?MULHrr$")>; 505def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^F(N)?MULSrr$")>; 506def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^F(N)?MULDrr$")>; 507 508def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FRINT.+r")>; 509 510 511// FP Miscellaneous Instructions 512// ----------------------------------------------------------------------------- 513 514def : InstRW<[TSV110Wr_5cyc_1ALU_1F], (instregex "^[SU]CVTF[SU][WX][SD]ri")>; 515def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^FCVT(A|M|N|P|Z)(S|U)U(W|X)(S|D)r$")>; 516def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FCVT[HSD][HSD]r")>; 517 518def : InstRW<[TSV110Wr_2cyc_1FSU1], (instregex "^FMOV(DX|WS|XD|SW|DXHigh|XDHigh)r$")>; 519def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^FMOV[SD][ir]$")>; 520 521 522// FP Load Instructions 523// ----------------------------------------------------------------------------- 524 525def : InstRW<[TSV110Wr_5cyc_1LdSt], (instregex "^LDR[DSQ]l")>; 526def : InstRW<[TSV110Wr_5cyc_1LdSt], (instregex "^LDUR[BDHSQ]i")>; 527def : InstRW<[WriteAdr, TSV110Wr_5cyc_1LdSt], (instregex "^LDR[BDHSQ](post|pre)")>; 528def : InstRW<[TSV110Wr_5cyc_1LdSt], (instregex "^LDR[BDHSQ]ui")>; 529def : InstRW<[TSV110Wr_6cyc_1LdSt_1ALUAB, ReadAdrBase], (instregex "^LDR(Q|D|H|S|B)ro(W|X)$")>; 530def : InstRW<[TSV110Wr_5cyc_1LdSt, WriteLDHi], (instregex "^LDN?P[DQS]i")>; 531def : InstRW<[WriteAdr, TSV110Wr_5cyc_1LdSt, WriteLDHi], (instregex "^LDP[DQS](post|pre)")>; 532 533 534// FP Store Instructions 535// ----------------------------------------------------------------------------- 536 537def : InstRW<[TSV110Wr_1cyc_1LdSt], (instregex "^STUR[BHSDQ]i")>; 538def : InstRW<[TSV110Wr_1cyc_1LdSt_1ALUAB, ReadAdrBase], (instregex "^STR[BHSDQ](post|pre)")>; 539def : InstRW<[TSV110Wr_1cyc_1LdSt], (instregex "^STR[BHSDQ]ui")>; 540def : InstRW<[TSV110Wr_2cyc_1LdSt_1ALUAB, ReadAdrBase], (instregex "^STR[BHSDQ]ro[WX]")>; 541def : InstRW<[TSV110Wr_2cyc_2LdSt], (instregex "^STN?P[SDQ]i")>; 542def : InstRW<[WriteAdr, TSV110Wr_2cyc_2LdSt], (instregex "^STP[SDQ](post|pre)")>; 543 544 545// ASIMD Integer Instructions 546// ----------------------------------------------------------------------------- 547 548// Reference for forms in this group 549// D form - v8i8, v4i16, v2i32 550// Q form - v16i8, v8i16, v4i32 551// D form - v1i8, v1i16, v1i32, v1i64 552// Q form - v16i8, v8i16, v4i32, v2i64 553// D form - v8i8_v8i16, v4i16_v4i32, v2i32_v2i64 554// Q form - v16i8_v8i16, v8i16_v4i32, v4i32_v2i64 555 556// ASIMD simple arithmetic 557def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(ABS|ADD(P)?|NEG|SUB)v")>; 558def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^[SU](ADD(L|LP|W)|SUB(L|W))v")>; 559 560// ASIMD complex arithmetic 561def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]H(ADD|SUB)v")>; 562def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^R?(ADD|SUB)HN2?v")>; 563def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]Q(ADD|SUB)v")>; 564def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^(SU|US)QADDv")>; 565def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]RHADDv")>; 566def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]ABAL?v")>; 567def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]ABDL?v")>; 568def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]ADALPv")>; 569def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^((SQ)(ABS|NEG))v")>; 570 571// ASIMD compare 572def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^CM(EQ|GE|GT|HI|HS|LE|LT|TST)v")>; 573 574// ASIMD max/min 575def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^[SU](MIN|MAX)P?v")>; 576 577// ASIMD logical 578def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(AND|BIC|BIF|BIT|BSL|EOR|MVN|NOT|ORN|ORR)v")>; 579 580// ASIMD multiply accumulate, D-form 581def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^(MUL|ML[AS]|SQR?D(MULH))(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)")>; 582// ASIMD multiply accumulate, Q-form 583def : InstRW<[TSV110Wr_8cyc_2FSU1], (instregex "^(MUL|ML[AS]|SQR?D(MULH))(v16i8|v8i16|v4i32)")>; 584 585// ASIMD multiply accumulate long 586def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "(S|U|SQD)(MLAL|MLSL|MULL)v.*")>; 587def : InstRW<[TSV110Wr_2cyc_1FSU1], (instregex "^PMULL(v8i8|v16i8)")>; 588def : InstRW<[TSV110Wr_2cyc_1FSU1], (instregex "^PMULL(v1i64|v2i64)")>; 589 590// ASIMD shift 591// ASIMD shift accumulate 592def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^(S|SR|U|UR)SRA")>; 593// ASIMD shift by immed, basic 594def : InstRW<[TSV110Wr_4cyc_1FSU1], 595 (instregex "SHLv","SLIv","SRIv","SHRNv","SQXTNv","SQXTUNv","UQXTNv")>; 596// ASIMD shift by immed, complex 597def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^[SU]?(Q|R){1,2}SHR")>; 598def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^SQSHLU")>; 599// ASIMD shift by register, basic, Q-form 600def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^[SU]SHL(v16i8|v8i16|v4i32|v2i64)")>; 601// ASIMD shift by register, complex, D-form 602def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^[SU][QR]{1,2}SHL(v1i8|v1i16|v1i32|v1i64|v8i8|v4i16|v2i32|b|d|h|s)")>; 603// ASIMD shift by register, complex, Q-form 604def : InstRW<[TSV110Wr_4cyc_1FSU1], (instregex "^[SU][QR]{1,2}SHL(v16i8|v8i16|v4i32|v2i64)")>; 605 606// ASIMD reduction 607// ASIMD arith, reduce, 4H/4S 608def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU]?ADDL?V(v8i8|v4i16|v2i32)v$")>; 609// ASIMD arith, reduce, 8B/8H 610def : InstRW<[TSV110Wr_8cyc_1FSU1_1FSU2], (instregex "^[SU]?ADDL?V(v8i16|v4i32)v$")>; 611// ASIMD arith, reduce, 16B 612def : InstRW<[TSV110Wr_8cyc_1FSU1_1FSU2], (instregex "^[SU]?ADDL?Vv16i8v$")>; 613 614// ASIMD max/min, reduce, 4H/4S 615def : InstRW<[TSV110Wr_4cyc_1FSU1_1FSU2], (instregex "^[SU](MIN|MAX)V(v4i16|v4i32)v$")>; 616// ASIMD max/min, reduce, 8B/8H 617def : InstRW<[TSV110Wr_8cyc_1FSU1_1FSU2], (instregex "^[SU](MIN|MAX)V(v8i8|v8i16)v$")>; 618// ASIMD max/min, reduce, 16B 619def : InstRW<[TSV110Wr_8cyc_1FSU1_1FSU2], (instregex "^[SU](MIN|MAX)Vv16i8v$")>; 620 621 622// Vector - Floating Point 623// ----------------------------------------------------------------------------- 624 625// Reference for forms in this group 626// D form - v2f32 627// Q form - v4f32, v2f64 628// D form - 32, 64 629// D form - v1i32, v1i64 630// D form - v2i32 631// Q form - v4i32, v2i64 632 633// ASIMD FP sign manipulation 634def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^FABSv")>; 635def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^FNEGv")>; 636 637// ASIMD FP compare 638def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^F(AC|CM)(EQ|GE|GT|LE|LT)v")>; 639 640// ASIMD FP convert 641def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^FCVT[AMNPZ][SU]v")>; 642def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FCVT(L)v")>; 643def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^FCVT(N|XN)v")>; 644 645// ASIMD FP divide, D-form, F32 646def : InstRW<[TSV110Wr_11cyc_1FSU1], (instregex "FDIVv2f32")>; 647// ASIMD FP divide, Q-form, F32 648def : InstRW<[TSV110Wr_24cyc_1FSU1], (instregex "FDIVv4f32")>; 649// ASIMD FP divide, Q-form, F64 650def : InstRW<[TSV110Wr_38cyc_1FSU1], (instregex "FDIVv2f64")>; 651 652// ASIMD FP SQRT 653def : InstRW<[TSV110Wr_17cyc_1FSU2], (instrs FSQRTv2f32)>; 654def : InstRW<[TSV110Wr_36cyc_1FSU2], (instrs FSQRTv4f32)>; 655def : InstRW<[TSV110Wr_64cyc_1FSU2], (instrs FSQRTv2f64)>; 656 657// ASIMD FP max,min 658def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^F(MAX|MIN)(NM)?v")>; 659def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^F(MAX|MIN)(NM)?Pv")>; 660def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^F(MAX|MIN)(NM)?Vv")>; 661 662// ASIMD FP add 663def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^F(ADD|ADDP|SUB)v")>; 664 665// ASIMD FP multiply 666def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^FMULX?v")>; 667 668 669// ASIMD Miscellaneous Instructions 670// ----------------------------------------------------------------------------- 671 672def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(CLS|CLZ|CNT)v")>; 673def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(DUP|INS)v.+lane")>; 674def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^REV(16|32|64)v")>; 675def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^(UZP|ZIP)[12]v")>; 676 677def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^EXTv")>; 678def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^XTNv")>; 679def : InstRW<[TSV110Wr_2cyc_1FSU1_1FSU2], (instregex "^RBITv")>; 680 681def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^(INS|DUP)v.+gpr")>; 682 683def : InstRW<[TSV110Wr_3cyc_1FSU1], (instregex "^[SU]MOVv")>; 684 685// ASIMD table lookup, D-form 686def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^TB[LX]v8i8One")>; 687def : InstRW<[TSV110Wr_4cyc_2F], (instregex "^TB[LX]v8i8Two")>; 688def : InstRW<[TSV110Wr_6cyc_3F], (instregex "^TB[LX]v8i8Three")>; 689def : InstRW<[TSV110Wr_8cyc_4F], (instregex "^TB[LX]v8i8Four")>; 690// ASIMD table lookup, Q-form 691def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^TB[LX]v16i8One")>; 692def : InstRW<[TSV110Wr_4cyc_2F], (instregex "^TB[LX]v16i8Two")>; 693def : InstRW<[TSV110Wr_6cyc_3F], (instregex "^TB[LX]v16i8Three")>; 694def : InstRW<[TSV110Wr_8cyc_4F], (instregex "^TB[LX]v16i8Four")>; 695 696def : InstRW<[TSV110Wr_2cyc_1F], (instregex "^FMOVv")>; 697 698def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^FRINT[AIMNPXZ]v")>; 699def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^[SU]CVTFv")>; 700def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^[FU](RECP|RSQRT)(E|X)v")>; 701 702 703// ASIMD Load Instructions 704// ----------------------------------------------------------------------------- 705 706def : InstRW<[TSV110Wr_7cyc_1F_1LdSt], (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 707def : InstRW<[WriteAdr, TSV110Wr_7cyc_1F_1LdSt], (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 708def : InstRW<[TSV110Wr_7cyc_2F_1LdSt], (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 709def : InstRW<[WriteAdr, TSV110Wr_7cyc_2F_1LdSt], (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 710def : InstRW<[TSV110Wr_8cyc_3F_1LdSt], (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 711def : InstRW<[WriteAdr, TSV110Wr_8cyc_3F_1LdSt], (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 712def : InstRW<[TSV110Wr_8cyc_3F_2LdSt], (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 713def : InstRW<[WriteAdr, TSV110Wr_8cyc_3F_2LdSt], (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 714 715def : InstRW<[TSV110Wr_7cyc_1F_1LdSt], (instregex "LD1i(8|16|32|64)$")>; 716def : InstRW<[WriteAdr, TSV110Wr_7cyc_1F_1LdSt], (instregex "LD1i(8|16|32|64)_POST$")>; 717def : InstRW<[TSV110Wr_7cyc_2F_1LdSt], (instregex "LD2i(8|16|32|64)$")>; 718def : InstRW<[WriteAdr, TSV110Wr_7cyc_2F_1LdSt], (instregex "LD2i(8|16|32|64)_POST$")>; 719def : InstRW<[TSV110Wr_8cyc_3F_1LdSt], (instregex "LD3i(8|16|32|64)$")>; 720def : InstRW<[WriteAdr, TSV110Wr_8cyc_3F_1LdSt], (instregex "LD3i(8|16|32|64)_POST$")>; 721def : InstRW<[TSV110Wr_8cyc_3F_2LdSt], (instregex "LD4i(8|16|32|64)$")>; 722def : InstRW<[WriteAdr, TSV110Wr_8cyc_3F_2LdSt], (instregex "LD4i(8|16|32|64)_POST$")>; 723 724def : InstRW<[TSV110Wr_5cyc_1LdSt], (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 725def : InstRW<[WriteAdr, TSV110Wr_5cyc_1LdSt], (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 726def : InstRW<[TSV110Wr_5cyc_1LdSt], (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 727def : InstRW<[WriteAdr, TSV110Wr_5cyc_1LdSt], (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 728def : InstRW<[TSV110Wr_6cyc_3LdSt], (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 729def : InstRW<[WriteAdr, TSV110Wr_6cyc_3LdSt], (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 730def : InstRW<[TSV110Wr_6cyc_2LdSt], (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 731def : InstRW<[WriteAdr, TSV110Wr_6cyc_2LdSt], (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 732 733def : InstRW<[TSV110Wr_7cyc_2F_1LdSt], (instregex "^LD2Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 734def : InstRW<[WriteAdr, TSV110Wr_7cyc_2F_1LdSt], (instregex "^LD2Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 735 736def : InstRW<[TSV110Wr_8cyc_3F_1LdSt], (instregex "^LD3Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 737def : InstRW<[WriteAdr, TSV110Wr_8cyc_3F_1LdSt], (instregex "^LD3Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 738 739def : InstRW<[TSV110Wr_10cyc_4F_4LdSt], (instregex "^LD4Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 740def : InstRW<[WriteAdr, TSV110Wr_10cyc_4F_4LdSt], (instregex "^LD4Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 741 742 743// ASIMD Store Instructions 744// ----------------------------------------------------------------------------- 745 746def : InstRW<[TSV110Wr_3cyc_1F], (instregex "ST1i(8|16|32|64)$")>; 747def : InstRW<[WriteAdr, TSV110Wr_3cyc_1F], (instregex "ST1i(8|16|32|64)_POST$")>; 748def : InstRW<[TSV110Wr_4cyc_1F], (instregex "ST2i(8|16|32|64)$")>; 749def : InstRW<[WriteAdr, TSV110Wr_4cyc_1F], (instregex "ST2i(8|16|32|64)_POST$")>; 750def : InstRW<[TSV110Wr_5cyc_1F], (instregex "ST3i(8|16|32|64)$")>; 751def : InstRW<[WriteAdr, TSV110Wr_5cyc_1F], (instregex "ST3i(8|16|32|64)_POST$")>; 752def : InstRW<[TSV110Wr_6cyc_1F], (instregex "ST4i(8|16|32|64)$")>; 753def : InstRW<[WriteAdr, TSV110Wr_6cyc_1F], (instregex "ST4i(8|16|32|64)_POST$")>; 754 755def : InstRW<[TSV110Wr_3cyc_1F], (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 756def : InstRW<[WriteAdr, TSV110Wr_3cyc_1F], (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 757def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 758def : InstRW<[WriteAdr, TSV110Wr_4cyc_1F], (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 759def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 760def : InstRW<[WriteAdr, TSV110Wr_5cyc_1F], (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 761def : InstRW<[TSV110Wr_6cyc_1F], (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 762def : InstRW<[WriteAdr, TSV110Wr_6cyc_1F], (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 763 764def : InstRW<[TSV110Wr_4cyc_1F], (instregex "^ST2Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 765def : InstRW<[WriteAdr, TSV110Wr_4cyc_1F], (instregex "^ST2Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 766 767def : InstRW<[TSV110Wr_5cyc_1F], (instregex "^ST3Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 768def : InstRW<[WriteAdr, TSV110Wr_5cyc_1F], (instregex "^ST3Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 769 770def : InstRW<[TSV110Wr_8cyc_1F], (instregex "^ST4Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 771def : InstRW<[WriteAdr, TSV110Wr_8cyc_1F], (instregex "^ST4Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 772 773} // SchedModel = TSV110Model 774