1//=- AArch64SchedThunderX3T110.td - Marvell ThunderX3 T110 ---*- 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 scheduling model for Marvell ThunderX3T110 10// family of processors. 11// 12//===----------------------------------------------------------------------===// 13 14//===----------------------------------------------------------------------===// 15// Pipeline Description. 16 17def ThunderX3T110Model : SchedMachineModel { 18 let IssueWidth = 4; // 4 micro-ops dispatched at a time. 19 let MicroOpBufferSize = 70; // 70 entries in micro-op re-order buffer. 20 let LoadLatency = 4; // Optimistic load latency. 21 let MispredictPenalty = 12; // Extra cycles for mispredicted branch. 22 // Determined via a mix of micro-arch details and experimentation. 23 let LoopMicroOpBufferSize = 128; // FIXME: might be much bigger in TX3. 24 let PostRAScheduler = 1; // Using PostRA sched. 25 let CompleteModel = 1; 26 27 list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F, 28 PAUnsupported.F, 29 SMEUnsupported.F, 30 [HasMTE, HasCSSC]); 31 // FIXME: Remove when all errors have been fixed. 32 let FullInstRWOverlapCheck = 0; 33} 34 35let SchedModel = ThunderX3T110Model in { 36 37// Issue ports. 38 39// Port 0: ALU. 40def THX3T110P0 : ProcResource<1>; 41 42// Port 1: ALU. 43def THX3T110P1 : ProcResource<1>; 44 45// Port 2: ALU/Branch. 46def THX3T110P2 : ProcResource<1>; 47 48// Port 3: ALU/Branch. 49def THX3T110P3 : ProcResource<1>; 50 51// Port 4: Load/Store. 52def THX3T110P4 : ProcResource<1>; 53 54// Port 5: Load/store. 55def THX3T110P5 : ProcResource<1>; 56 57// Port 6: FP/Neon/SIMD/Crypto. 58def THX3T110P6FP0 : ProcResource<1>; 59 60// Port 7: FP/Neon/SIMD/Crypto. 61def THX3T110P7FP1 : ProcResource<1>; 62 63// Port 8: FP/Neon/SIMD/Crypto. 64def THX3T110P8FP2 : ProcResource<1>; 65 66// Port 9: FP/Neon/SIMD/Crypto. 67def THX3T110P9FP3 : ProcResource<1>; 68 69// Port 10: Store Data Unit. 70def THX3T110SD0 : ProcResource<1>; 71 72// Define groups for the functional units on each issue port. Each group 73// created will be used by a WriteRes. 74 75// Integer divide/mulhi micro-ops only on port I1. 76def THX3T110I1 : ProcResGroup<[THX3T110P1]>; 77 78// Branch micro-ops on ports I2/I3. 79def THX3T110I23 : ProcResGroup<[THX3T110P2, THX3T110P3]>; 80 81// Branch micro-ops on ports I1/I2/I3. 82def THX3T110I123 : ProcResGroup<[THX3T110P1, THX3T110P2, THX3T110P3]>; 83 84// Integer micro-ops on ports I0/I1/I2. 85def THX3T110I012 : ProcResGroup<[THX3T110P0, THX3T110P1, THX3T110P2]>; 86 87// Integer micro-ops on ports I0/I1/I2/I3. 88def THX3T110I0123 : ProcResGroup<[THX3T110P0, THX3T110P1, 89 THX3T110P2, THX3T110P3]>; 90 91// FP micro-ops on ports FP0/FP1/FP2/FP3. 92def THX3T110FP0123 : ProcResGroup<[THX3T110P6FP0, THX3T110P7FP1, 93 THX3T110P8FP2, THX3T110P9FP3]>; 94 95// FP micro-ops on ports FP2/FP3. 96def THX3T110FP23 : ProcResGroup<[THX3T110P8FP2, THX3T110P9FP3]>; 97 98// ASIMD micro-ops on ports FP0/FP1/FP2/FP3. 99def THX3T110SIMD : ProcResGroup<[THX3T110P6FP0, THX3T110P7FP1, 100 THX3T110P8FP2, THX3T110P9FP3]>; 101 102// Store data micro-ops only on port 10. 103def THX3T110SD : ProcResGroup<[THX3T110SD0]>; 104 105// Load/store micro-ops on ports P4/P5. 106def THX3T110LS : ProcResGroup<[THX3T110P4, THX3T110P5]>; 107 108// 70 entry unified scheduler. 109def THX3T110ANY: ProcResGroup<[THX3T110P0, THX3T110P1, THX3T110P2, 110 THX3T110P3, THX3T110P4, THX3T110P5, 111 THX3T110P6FP0, THX3T110P7FP1, 112 THX3T110P8FP2, THX3T110P9FP3]> { 113 let BufferSize = 70; 114} 115 116// Define commonly used write types for InstRW specializations. 117// All definitions follow the format: THX3T110Write_<NumCycles>Cyc_<Resources>. 118 119// 3 cycles on I1. 120def THX3T110Write_3Cyc_I1 : SchedWriteRes<[THX3T110I1]> { 121 let Latency = 3; 122 let NumMicroOps = 2; 123} 124 125// 4 cycles on I1. 126def THX3T110Write_4Cyc_I1 : SchedWriteRes<[THX3T110I1]> { 127 let Latency = 4; 128 let NumMicroOps = 2; 129} 130 131// 5 cycles on I1. 132def THX3T110Write_5Cyc_I1 : SchedWriteRes<[THX3T110I1]> { 133 let Latency = 5; 134 let NumMicroOps = 2; 135} 136 137// 7 cycles on I1. 138def THX3T110Write_7Cyc_I1 : SchedWriteRes<[THX3T110I1]> { 139 let Latency = 7; 140 let NumMicroOps = 3; 141} 142 143// 23 cycles on I1. 144def THX3T110Write_23Cyc_I1 : SchedWriteRes<[THX3T110I1]> { 145 let Latency = 23; 146 let ReleaseAtCycles = [13, 23]; 147 let NumMicroOps = 4; 148} 149 150// 39 cycles on I1. 151def THX3T110Write_39Cyc_I1 : SchedWriteRes<[THX3T110I1]> { 152 let Latency = 39; 153 let ReleaseAtCycles = [13, 39]; 154 let NumMicroOps = 4; 155} 156 157// 1 cycle on I2/I3 158def THX3T110Write_1Cyc_I23 : SchedWriteRes<[THX3T110I23]> { 159 let Latency = 1; 160 let NumMicroOps = 2; 161} 162 163// 8 cycles on I2/I3 164def THX3T110Write_8Cyc_I23 : SchedWriteRes<[THX3T110I23]> { 165 let Latency = 8; 166 let NumMicroOps = 3; 167} 168 169// 1 cycle on I1/I2/I3 170def THX3T110Write_1Cyc_I123 : SchedWriteRes<[THX3T110I123]> { 171 let Latency = 1; 172 let NumMicroOps = 2; 173} 174 175// 8 cycles on I1/I2/I3 176def THX3T110Write_8Cyc_I123 : SchedWriteRes<[THX3T110I123]> { 177 let Latency = 8; 178 let NumMicroOps = 3; 179} 180 181// 1 cycle on I0/I1/I2/I3. 182def THX3T110Write_1Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 183 let Latency = 1; 184 let NumMicroOps = 2; 185} 186 187// 2 cycles on I0/I1/I2/I3. 188def THX3T110Write_2Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 189 let Latency = 2; 190 let NumMicroOps = 2; 191} 192 193// 3 cycles on I0/I1/I2/I3. 194def THX3T110Write_3Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 195 let Latency = 3; 196 let NumMicroOps = 2; 197} 198 199// 4 cycles on I0/I1/I2/I3. 200def THX3T110Write_4Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 201 let Latency = 4; 202 let NumMicroOps = 3; 203} 204 205// 5 cycles on I0/I1/I2/I3. 206def THX3T110Write_5Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 207 let Latency = 5; 208 let NumMicroOps = 3; 209} 210 211// 6 cycles on I0/I1/I2/I3. 212def THX3T110Write_6Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 213 let Latency = 6; 214 let NumMicroOps = 3; 215} 216 217// 8 cycles on I0/I1/I2/I3. 218def THX3T110Write_8Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 219 let Latency = 8; 220 let NumMicroOps = 4; 221} 222 223// 13 cycles on I0/I1/I2/I3. 224def THX3T110Write_13Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 225 let Latency = 13; 226 let NumMicroOps = 3; 227} 228 229// 23 cycles on I0/I1/I2/I3. 230def THX3T110Write_23Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 231 let Latency = 23; 232 let NumMicroOps = 3; 233} 234 235// 39 cycles on I0/I1/I2/I3. 236def THX3T110Write_39Cyc_I0123 : SchedWriteRes<[THX3T110I0123]> { 237 let Latency = 39; 238 let NumMicroOps = 3; 239} 240 241// 4 cycles on F2/F3. 242def THX3T110Write_4Cyc_F23 : SchedWriteRes<[THX3T110FP23]> { 243 let Latency = 4; 244 let NumMicroOps = 2; 245} 246 247// 5 cycles on F0/F1/F2/F3. 248def THX3T110Write_5Cyc_F01 : SchedWriteRes<[THX3T110FP0123]> { 249 let Latency = 5; 250 let NumMicroOps = 2; 251} 252 253// 6 cycles on F0/F1/F2/F3. 254def THX3T110Write_6Cyc_F01 : SchedWriteRes<[THX3T110FP0123]> { 255 let Latency = 6; 256 let NumMicroOps = 3; 257} 258 259// 7 cycles on F0/F1/F2/F3. 260def THX3T110Write_7Cyc_F01 : SchedWriteRes<[THX3T110FP0123]> { 261 let Latency = 7; 262 let NumMicroOps = 3; 263} 264 265// 8 cycles on F0/F1/F2/F3. 266def THX3T110Write_8Cyc_F01 : SchedWriteRes<[THX3T110FP0123]> { 267 let Latency = 8; 268 let NumMicroOps = 3; 269} 270 271// 10 cycles on F0/F1/F2/F3. 272def THX3T110Write_10Cyc_F01 : SchedWriteRes<[THX3T110FP0123]> { 273 let Latency = 10; 274 let NumMicroOps = 3; 275} 276 277// 16 cycles on F0/F1/F2/F3. 278def THX3T110Write_16Cyc_F01 : SchedWriteRes<[THX3T110FP0123]> { 279 let Latency = 16; 280 let NumMicroOps = 3; 281 let ReleaseAtCycles = [8]; 282} 283 284// 23 cycles on F0/F1/F2/F3. 285def THX3T110Write_23Cyc_F01 : SchedWriteRes<[THX3T110FP0123]> { 286 let Latency = 23; 287 let NumMicroOps = 3; 288 let ReleaseAtCycles = [11]; 289} 290 291// 1 cycle on LS0/LS1. 292def THX3T110Write_1Cyc_LS01 : SchedWriteRes<[THX3T110LS]> { 293 let Latency = 1; 294 let NumMicroOps = 1; 295} 296 297// 2 cycles on LS0/LS1. 298def THX3T110Write_2Cyc_LS01 : SchedWriteRes<[THX3T110LS]> { 299 let Latency = 2; 300 let NumMicroOps = 2; 301} 302 303// 4 cycles on LS0/LS1. 304def THX3T110Write_4Cyc_LS01 : SchedWriteRes<[THX3T110LS]> { 305 let Latency = 4; 306 let NumMicroOps = 2; 307 let ReleaseAtCycles = [2]; 308} 309 310// 5 cycles on LS0/LS1. 311def THX3T110Write_5Cyc_LS01 : SchedWriteRes<[THX3T110LS]> { 312 let Latency = 5; 313 let NumMicroOps = 3; 314} 315 316// 6 cycles on LS0/LS1. 317def THX3T110Write_6Cyc_LS01 : SchedWriteRes<[THX3T110LS]> { 318 let Latency = 6; 319 let NumMicroOps = 3; 320} 321 322// 4 + 5 cycles on LS0/LS1. 323// First resource is available after 4 cycles. 324// Second resource is available after 5 cycles. 325// Load vector pair, immed offset, Q-form [LDP/LDNP]. 326def THX3T110Write_4_5Cyc_LS01 : SchedWriteRes<[THX3T110LS]> { 327 let Latency = 4; 328 let NumMicroOps = 2; 329 let ReleaseAtCycles = [4, 5]; 330} 331 332// 4 + 8 cycles on LS0/LS1. 333// First resource is available after 4 cycles. 334// Second resource is available after 8 cycles. 335// Load vector pair, immed offset, S/D-form [LDP/LDNP]. 336def THX3T110Write_4_8Cyc_LS01 : SchedWriteRes<[THX3T110LS]> { 337 let Latency = 4; 338 let NumMicroOps = 2; 339 let ReleaseAtCycles = [4, 8]; 340} 341 342// 11 cycles on LS0/LS1 and I1. 343def THX3T110Write_11Cyc_LS01_I1 : 344 SchedWriteRes<[THX3T110LS, THX3T110I1]> { 345 let Latency = 11; 346 let NumMicroOps = 4; 347} 348 349// 1 cycles on LS0/LS1 and I0/I1/I2/I3. 350def THX3T110Write_1Cyc_LS01_I0123 : 351 SchedWriteRes<[THX3T110LS, THX3T110I0123]> { 352 let Latency = 1; 353 let NumMicroOps = 2; 354} 355 356// 1 cycles on LS0/LS1 and 2 of I0/I1/I2/I3. 357def THX3T110Write_1Cyc_LS01_I0123_I0123 : 358 SchedWriteRes<[THX3T110LS, THX3T110I0123, THX3T110I0123]> { 359 let Latency = 1; 360 let NumMicroOps = 3; 361} 362 363// 4 cycles on LS0/LS1 and I0/I1/I2/I3. 364def THX3T110Write_4Cyc_LS01_I0123 : 365 SchedWriteRes<[THX3T110LS, THX3T110I0123]> { 366 let Latency = 4; 367 let NumMicroOps = 3; 368} 369 370// 4 cycles on LS0/LS1 and 2 of I0/I1/I2/I3. 371def THX3T110Write_4Cyc_LS01_I0123_I0123 : 372 SchedWriteRes<[THX3T110LS, THX3T110I0123, THX3T110I0123]> { 373 let Latency = 4; 374 let NumMicroOps = 3; 375} 376 377// 5 cycles on LS0/LS1 and I0/I1/I2/I3. 378def THX3T110Write_5Cyc_LS01_I0123 : 379 SchedWriteRes<[THX3T110LS, THX3T110I0123]> { 380 let Latency = 5; 381 let NumMicroOps = 3; 382} 383 384// 5 cycles on LS0/LS1 and 2 of I0/I1/I2/I3. 385def THX3T110Write_5Cyc_LS01_I0123_I0123 : 386 SchedWriteRes<[THX3T110LS, THX3T110I0123, THX3T110I0123]> { 387 let Latency = 5; 388 let NumMicroOps = 3; 389} 390 391// 6 cycles on LS0/LS1 and I0/I1/I2/I3. 392def THX3T110Write_6Cyc_LS01_I012 : 393 SchedWriteRes<[THX3T110LS, THX3T110I0123]> { 394 let Latency = 6; 395 let NumMicroOps = 4; 396} 397 398// 6 cycles on LS0/LS1 and 2 of I0/I1/I2/I3. 399def THX3T110Write_6Cyc_LS01_I0123_I0123 : 400 SchedWriteRes<[THX3T110LS, THX3T110I0123, THX3T110I0123]> { 401 let Latency = 6; 402 let NumMicroOps = 3; 403} 404 405// 1 cycle on LS0/LS1 and SD. 406def THX3T110Write_1Cyc_LS01_SD : 407 SchedWriteRes<[THX3T110LS, THX3T110SD]> { 408 let Latency = 1; 409 let NumMicroOps = 2; 410} 411 412// 2 cycles on LS0/LS1 and SD. 413def THX3T110Write_2Cyc_LS01_SD : 414 SchedWriteRes<[THX3T110LS, THX3T110SD]> { 415 let Latency = 2; 416 let NumMicroOps = 2; 417} 418 419// 4 cycles on LS0/LS1 and SD. 420def THX3T110Write_4Cyc_LS01_SD : 421 SchedWriteRes<[THX3T110LS, THX3T110SD]> { 422 let Latency = 4; 423 let NumMicroOps = 3; 424} 425 426// 5 cycles on LS0/LS1 and SD. 427def THX3T110Write_5Cyc_LS01_SD : 428 SchedWriteRes<[THX3T110LS, THX3T110SD]> { 429 let Latency = 5; 430 let NumMicroOps = 4; 431} 432 433// 6 cycles on LS0/LS1 and SD. 434def THX3T110Write_6Cyc_LS01_SD : 435 SchedWriteRes<[THX3T110LS, THX3T110SD]> { 436 let Latency = 6; 437 let NumMicroOps = 5; 438} 439 440// 1 cycle on LS0/LS1, SD and I0/I1/I2/I3. 441def THX3T110Write_1Cyc_LS01_SD_I0123 : 442 SchedWriteRes<[THX3T110LS, THX3T110SD, THX3T110I0123]> { 443 let Latency = 1; 444 let NumMicroOps = 2; 445} 446 447// 2 cycles on LS0/LS1, SD and I0/I1/I2/I3. 448def THX3T110Write_2Cyc_LS01_SD_I0123 : 449 SchedWriteRes<[THX3T110LS, THX3T110SD, THX3T110I0123]> { 450 let Latency = 2; 451 let NumMicroOps = 2; 452} 453 454// 4 cycles on LS0/LS1, SD and I0/I1/I2/I3. 455def THX3T110Write_4Cyc_LS01_SD_I0123 : 456 SchedWriteRes<[THX3T110LS, THX3T110SD, THX3T110I0123]> { 457 let Latency = 4; 458 let NumMicroOps = 3; 459} 460 461// 5 cycles on LS0/LS1, SD and I0/I1/I2/I3. 462def THX3T110Write_5Cyc_LS01_SD_I0123 : 463 SchedWriteRes<[THX3T110LS, THX3T110SD, THX3T110I0123]> { 464 let Latency = 5; 465 let NumMicroOps = 4; 466} 467 468// 6 cycles on LS0/LS1, SD and I0/I1/I2/I3. 469def THX3T110Write_6Cyc_LS01_SD_I0123 : 470 SchedWriteRes<[THX3T110LS, THX3T110SD, THX3T110I0123]> { 471 let Latency = 6; 472 let NumMicroOps = 5; 473} 474 475// 1 cycles on LS0/LS1 and F0/F1/F2/F3. 476def THX3T110Write_1Cyc_LS01_F0123 : 477 SchedWriteRes<[THX3T110LS, THX3T110FP0123]> { 478 let Latency = 1; 479 let NumMicroOps = 2; 480} 481 482// 5 cycles on LS0/LS1 and F0/F1/F2/F3. 483def THX3T110Write_5Cyc_LS01_F0123 : 484 SchedWriteRes<[THX3T110LS, THX3T110FP0123]> { 485 let Latency = 5; 486 let NumMicroOps = 3; 487} 488 489// 6 cycles on LS0/LS1 and F0/F1/F2/F3. 490def THX3T110Write_6Cyc_LS01_F0123 : 491 SchedWriteRes<[THX3T110LS, THX3T110FP0123]> { 492 let Latency = 6; 493 let NumMicroOps = 3; 494} 495 496// 7 cycles on LS0/LS1 and F0/F1/F2/F3. 497def THX3T110Write_7Cyc_LS01_F0123 : 498 SchedWriteRes<[THX3T110LS, THX3T110FP0123]> { 499 let Latency = 7; 500 let NumMicroOps = 3; 501} 502 503// 8 cycles on LS0/LS1 and F0/F1/F2/F3. 504def THX3T110Write_8Cyc_LS01_F0123 : 505 SchedWriteRes<[THX3T110LS, THX3T110FP0123]> { 506 let Latency = 8; 507 let NumMicroOps = 3; 508} 509 510// 8 cycles on LS0/LS1 and I0/I1/I2/I3. 511def THX3T110Write_8Cyc_LS01_I0123 : 512 SchedWriteRes<[THX3T110LS, THX3T110I0123]> { 513 let Latency = 8; 514 let NumMicroOps = 3; 515} 516 517// 12 cycles on LS0/LS1 and I0/I1/I2/I3. 518def THX3T110Write_12Cyc_LS01_I0123 : 519 SchedWriteRes<[THX3T110LS, THX3T110I0123]> { 520 let Latency = 12; 521 let NumMicroOps = 4; 522} 523 524// 16 cycles on LS0/LS1 and I0/I1/I2/I3. 525def THX3T110Write_16Cyc_LS01_I0123 : 526 SchedWriteRes<[THX3T110LS, THX3T110I0123]> { 527 let Latency = 16; 528 let NumMicroOps = 5; 529} 530 531// 24 cycles on LS0/LS1 and I0/I1/I2/I3. 532def THX3T110Write_24Cyc_LS01_I0123 : 533 SchedWriteRes<[THX3T110LS, THX3T110I0123]> { 534 let Latency = 24; 535 let NumMicroOps = 10; 536} 537 538// 32 cycles on LS0/LS1 and I0/I1/I2/I3. 539def THX3T110Write_32Cyc_LS01_I0123 : 540 SchedWriteRes<[THX3T110LS, THX3T110I0123]> { 541 let Latency = 32; 542 let NumMicroOps = 14; 543} 544 545// 3 cycles on F0/F1/F2/F3. 546def THX3T110Write_3Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 547 let Latency = 3; 548 let NumMicroOps = 2; 549} 550 551// 4 cycles on F0/F1/F2/F3. 552def THX3T110Write_4Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 553 let Latency = 4; 554 let NumMicroOps = 2; 555} 556 557// 5 cycles on F0/F1/F2/F3. 558def THX3T110Write_5Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 559 let Latency = 5; 560 let NumMicroOps = 2; 561} 562 563// 10 cycles on F0/F1/F2/F3. 564def THX3T110Write_10Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 565 let Latency = 10; 566 let NumMicroOps = 4; 567} 568 569// 15 cycles on F0/F1/F2/F3. 570def THX3T110Write_15Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 571 let Latency = 15; 572 let NumMicroOps = 7; 573} 574 575// 16 cycles on F0/F1/F2/F3. 576def THX3T110Write_16Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 577 let Latency = 16; 578 let NumMicroOps = 3; 579} 580 581// 18 cycles on F0/F1/F2/F3. 582def THX3T110Write_18Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 583 let Latency = 18; 584 let NumMicroOps = 3; 585} 586 587// 19 cycles on F0/F1/F2/F3. 588def THX3T110Write_19Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 589 let Latency = 19; 590 let NumMicroOps = 4; 591} 592 593// 20 cycles on F0/F1/F2/F3. 594def THX3T110Write_20Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 595 let Latency = 20; 596 let NumMicroOps = 4; 597} 598 599// 23 cycles on F0/F1/F2/F3. 600def THX3T110Write_23Cyc_F0123 : SchedWriteRes<[THX3T110FP0123]> { 601 let Latency = 23; 602 let NumMicroOps = 4; 603} 604 605// 3 cycles on F2/F3 and 4 cycles on F0/F1/F2/F3. 606def THX3T110Write_3_4Cyc_F23_F0123 : 607 SchedWriteRes<[THX3T110FP23, THX3T110FP0123]> { 608 let Latency = 3; 609 let NumMicroOps = 2; 610 let ReleaseAtCycles = [3, 4]; 611} 612 613 614// Define commonly used read types. 615 616// No forwarding is provided for these types. 617def : ReadAdvance<ReadI, 0>; 618def : ReadAdvance<ReadISReg, 0>; 619def : ReadAdvance<ReadIEReg, 0>; 620def : ReadAdvance<ReadIM, 0>; 621def : ReadAdvance<ReadIMA, 0>; 622def : ReadAdvance<ReadID, 0>; 623def : ReadAdvance<ReadExtrHi, 0>; 624def : ReadAdvance<ReadAdrBase, 0>; 625def : ReadAdvance<ReadVLD, 0>; 626def : ReadAdvance<ReadST, 0>; 627 628//===----------------------------------------------------------------------===// 629// 3. Instruction Tables. 630 631//--- 632// 3.1 Branch Instructions 633//--- 634 635// Branch, immed 636// Branch and link, immed 637// Compare and branch 638def : WriteRes<WriteBr, [THX3T110I23]> { 639 let Latency = 1; 640 let NumMicroOps = 2; 641} 642 643// Branch, register 644// Branch and link, register != LR 645// Branch and link, register = LR 646def : WriteRes<WriteBrReg, [THX3T110I23]> { 647 let Latency = 1; 648 let NumMicroOps = 2; 649} 650 651def : WriteRes<WriteSys, []> { let Latency = 1; } 652def : WriteRes<WriteBarrier, []> { let Latency = 1; } 653def : WriteRes<WriteHint, []> { let Latency = 1; } 654 655def : WriteRes<WriteAtomic, []> { 656 let Latency = 4; 657 let NumMicroOps = 2; 658} 659 660//--- 661// Branch 662//--- 663def : InstRW<[THX3T110Write_1Cyc_I23], (instrs B, BL, BR, BLR)>; 664def : InstRW<[THX3T110Write_1Cyc_I23], (instrs Bcc)>; 665def : InstRW<[THX3T110Write_1Cyc_I23], (instrs RET)>; 666def : InstRW<[THX3T110Write_1Cyc_I23], 667 (instrs CBZW, CBZX, CBNZW, CBNZX, TBZW, TBZX, TBNZW, TBNZX)>; 668 669//--- 670// 3.2 Arithmetic and Logical Instructions 671// 3.3 Move and Shift Instructions 672//--- 673 674 675// ALU, basic 676// Conditional compare 677// Conditional select 678// Address generation 679def : WriteRes<WriteI, [THX3T110I0123]> { 680 let Latency = 1; 681 let ReleaseAtCycles = [1]; 682 let NumMicroOps = 2; 683} 684 685def : InstRW<[WriteI], 686 (instregex "ADD?(W|X)r(i|r|s|x)", "ADDS?(W|X)r(i|r|s|x)(64)?", 687 "AND?(W|X)r(i|r|s|x)", "ANDS?(W|X)r(i|r|s|x)", 688 "ADC(W|X)r", 689 "BIC?(W|X)r(i|r|s|x)", "BICS?(W|X)r(i|r|s|x)", 690 "EON?(W|X)r(i|r|s|x)", "ORN?(W|X)r(i|r|s|x)", 691 "ORR?(W|X)r(i|r|s|x)", "SUB?(W|X)r(i|r|s|x)", 692 "SUBS?(W|X)r(i|r|s|x)", "SBC(W|X)r", 693 "SBCS(W|X)r", "CCMN(W|X)(i|r)", 694 "CCMP(W|X)(i|r)", "CSEL(W|X)r", 695 "CSINC(W|X)r", "CSINV(W|X)r", 696 "CSNEG(W|X)r")>; 697 698def : InstRW<[WriteI], (instrs COPY)>; 699 700// ALU, extend and/or shift 701def : WriteRes<WriteISReg, [THX3T110I0123]> { 702 let Latency = 2; 703 let ReleaseAtCycles = [2]; 704 let NumMicroOps = 2; 705} 706 707def : InstRW<[WriteISReg], 708 (instregex "ADD?(W|X)r(i|r|s|x)", "ADDS?(W|X)r(i|r|s|x)(64)?", 709 "AND?(W|X)r(i|r|s|x)", "ANDS?(W|X)r(i|r|s|x)", 710 "ADC(W|X)r", 711 "BIC?(W|X)r(i|r|s|x)", "BICS?(W|X)r(i|r|s|x)", 712 "EON?(W|X)r(i|r|s|x)", "ORN?(W|X)r(i|r|s|x)", 713 "ORR?(W|X)r(i|r|s|x)", "SUB?(W|X)r(i|r|s|x)", 714 "SUBS?(W|X)r(i|r|s|x)", "SBC(W|X)r", 715 "SBCS(W|X)r", "CCMN(W|X)(i|r)", 716 "CCMP(W|X)(i|r)", "CSEL(W|X)r", 717 "CSINC(W|X)r", "CSINV(W|X)r", 718 "CSNEG(W|X)r")>; 719 720def : WriteRes<WriteIEReg, [THX3T110I0123]> { 721 let Latency = 1; 722 let ReleaseAtCycles = [1]; 723 let NumMicroOps = 2; 724} 725 726def : InstRW<[WriteIEReg], 727 (instregex "ADD?(W|X)r(i|r|s|x)", "ADDS?(W|X)r(i|r|s|x)(64)?", 728 "AND?(W|X)r(i|r|s|x)", "ANDS?(W|X)r(i|r|s|x)", 729 "ADC(W|X)r", 730 "BIC?(W|X)r(i|r|s|x)", "BICS?(W|X)r(i|r|s|x)", 731 "EON?(W|X)r(i|r|s|x)", "ORN?(W|X)r(i|r|s|x)", 732 "ORR?(W|X)r(i|r|s|x)", "SUB?(W|X)r(i|r|s|x)", 733 "SUBS?(W|X)r(i|r|s|x)", "SBC(W|X)r", 734 "SBCS(W|X)r", "CCMN(W|X)(i|r)", 735 "CCMP(W|X)(i|r)", "CSEL(W|X)r", 736 "CSINC(W|X)r", "CSINV(W|X)r", 737 "CSNEG(W|X)r")>; 738 739// Move immed 740def : WriteRes<WriteImm, [THX3T110I0123]> { 741 let Latency = 1; 742 let NumMicroOps = 2; 743} 744 745def : InstRW<[THX3T110Write_1Cyc_I0123], 746 (instrs MOVKWi, MOVKXi, MOVNWi, MOVNXi, MOVZWi, MOVZXi)>; 747 748def : InstRW<[THX3T110Write_1Cyc_I0123], 749 (instrs ASRVWr, ASRVXr, LSLVWr, LSLVXr, RORVWr, RORVXr)>; 750 751// Variable shift 752def : WriteRes<WriteIS, [THX3T110I0123]> { 753 let Latency = 1; 754 let NumMicroOps = 2; 755} 756 757//--- 758// 3.4 Divide and Multiply Instructions 759//--- 760 761// Divide, W-form 762// Latency range of 13-23/13-39. 763def : WriteRes<WriteID32, [THX3T110I1]> { 764 let Latency = 39; 765 let ReleaseAtCycles = [39]; 766 let NumMicroOps = 4; 767} 768 769// Divide, X-form 770def : WriteRes<WriteID64, [THX3T110I1]> { 771 let Latency = 23; 772 let ReleaseAtCycles = [23]; 773 let NumMicroOps = 4; 774} 775 776// Multiply accumulate, W-form 777def : WriteRes<WriteIM32, [THX3T110I0123]> { 778 let Latency = 5; 779 let NumMicroOps = 3; 780} 781 782// Multiply accumulate, X-form 783def : WriteRes<WriteIM64, [THX3T110I0123]> { 784 let Latency = 5; 785 let NumMicroOps = 3; 786} 787 788//def : InstRW<[WriteIM32, ReadIM, ReadIM, ReadIMA, THX3T110Write_5Cyc_I012], 789// (instrs MADDWrrr, MSUBWrrr)>; 790def : InstRW<[WriteIM32], (instrs MADDWrrr, MSUBWrrr)>; 791def : InstRW<[WriteIM32], (instrs MADDXrrr, MSUBXrrr)>; 792def : InstRW<[THX3T110Write_5Cyc_I0123], 793 (instregex "(S|U)(MADDL|MSUBL)rrr")>; 794 795def : InstRW<[WriteID32], (instrs SDIVWr, UDIVWr)>; 796def : InstRW<[WriteID64], (instrs SDIVXr, UDIVXr)>; 797 798// Bitfield extract, two reg 799def : WriteRes<WriteExtr, [THX3T110I0123]> { 800 let Latency = 1; 801 let NumMicroOps = 2; 802} 803 804// Multiply high 805def : InstRW<[THX3T110Write_4Cyc_I1], (instrs SMULHrr, UMULHrr)>; 806 807// Miscellaneous Data-Processing Instructions 808// Bitfield extract 809def : InstRW<[THX3T110Write_1Cyc_I0123], (instrs EXTRWrri, EXTRXrri)>; 810 811// Bitifield move - basic 812def : InstRW<[THX3T110Write_1Cyc_I0123], 813 (instrs SBFMWri, SBFMXri, UBFMWri, UBFMXri)>; 814 815// Bitfield move, insert 816def : InstRW<[THX3T110Write_1Cyc_I0123], (instregex "^BFM")>; 817def : InstRW<[THX3T110Write_1Cyc_I0123], (instregex "(S|U)?BFM.*")>; 818 819// Count leading 820def : InstRW<[THX3T110Write_3_4Cyc_F23_F0123], 821 (instregex "^CLS(W|X)r$", "^CLZ(W|X)r$")>; 822 823// Reverse bits 824def : InstRW<[THX3T110Write_3_4Cyc_F23_F0123], (instrs RBITWr, RBITXr)>; 825 826// Cryptography Extensions 827def : InstRW<[THX3T110Write_4Cyc_F0123], (instregex "^AES[DE]")>; 828def : InstRW<[THX3T110Write_4Cyc_F0123], (instregex "^AESI?MC")>; 829def : InstRW<[THX3T110Write_4Cyc_F0123], (instregex "^PMULL")>; 830def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SHA1SU0")>; 831def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SHA1(H|SU1)")>; 832def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SHA1[CMP]")>; 833def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SHA256SU0")>; 834def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SHA256(H|H2|SU1)")>; 835 836// CRC Instructions 837// def : InstRW<[THX3T110Write_4Cyc_I1], (instregex "^CRC32", "^CRC32C")>; 838def : InstRW<[THX3T110Write_4Cyc_I1], 839 (instrs CRC32Brr, CRC32Hrr, CRC32Wrr, CRC32Xrr)>; 840 841def : InstRW<[THX3T110Write_4Cyc_I1], 842 (instrs CRC32CBrr, CRC32CHrr, CRC32CWrr, CRC32CXrr)>; 843 844// Reverse bits/bytes 845// NOTE: Handled by WriteI. 846 847//--- 848// 3.6 Load Instructions 849// 3.10 FP Load Instructions 850//--- 851 852// Load register, literal 853// Load register, unscaled immed 854// Load register, immed unprivileged 855// Load register, unsigned immed 856def : WriteRes<WriteLD, [THX3T110LS]> { 857 let Latency = 4; 858 let NumMicroOps = 4; 859} 860 861// Load register, immed post-index 862// NOTE: Handled by WriteLD, WriteI. 863// Load register, immed pre-index 864// NOTE: Handled by WriteLD, WriteAdr. 865def : WriteRes<WriteAdr, [THX3T110I0123]> { 866 let Latency = 1; 867 let NumMicroOps = 2; 868} 869 870// Load pair, immed offset, normal 871// Load pair, immed offset, signed words, base != SP 872// Load pair, immed offset signed words, base = SP 873// LDP only breaks into *one* LS micro-op. Thus 874// the resources are handled by WriteLD. 875def : WriteRes<WriteLDHi, []> { 876 let Latency = 4; 877 let NumMicroOps = 4; 878} 879 880// Load register offset, basic 881// Load register, register offset, scale by 4/8 882// Load register, register offset, scale by 2 883// Load register offset, extend 884// Load register, register offset, extend, scale by 4/8 885// Load register, register offset, extend, scale by 2 886def THX3T110WriteLDIdx : SchedWriteVariant<[ 887 SchedVar<ScaledIdxPred, [THX3T110Write_4Cyc_LS01_I0123_I0123]>, 888 SchedVar<NoSchedPred, [THX3T110Write_4Cyc_LS01_I0123]>]>; 889def : SchedAlias<WriteLDIdx, THX3T110WriteLDIdx>; 890 891def THX3T110ReadAdrBase : SchedReadVariant<[ 892 SchedVar<ScaledIdxPred, [ReadDefault]>, 893 SchedVar<NoSchedPred, [ReadDefault]>]>; 894def : SchedAlias<ReadAdrBase, THX3T110ReadAdrBase>; 895 896// Load pair, immed pre-index, normal 897// Load pair, immed pre-index, signed words 898// Load pair, immed post-index, normal 899// Load pair, immed post-index, signed words 900def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDNPDi)>; 901def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDNPQi)>; 902def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDNPSi)>; 903def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDNPWi)>; 904def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDNPXi)>; 905 906def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDPDi)>; 907def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDPQi)>; 908def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDPSi)>; 909def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDPSWi)>; 910def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDPWi)>; 911def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, WriteLDHi], (instrs LDPXi)>; 912 913def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDRBui)>; 914def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDRDui)>; 915def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDRHui)>; 916def : InstRW<[THX3T110Write_5Cyc_LS01], (instrs LDRQui)>; 917def : InstRW<[THX3T110Write_5Cyc_LS01], (instrs LDRSui)>; 918 919def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDRDl)>; 920def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDRQl)>; 921def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDRWl)>; 922def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDRXl)>; 923 924def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDTRBi)>; 925def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDTRHi)>; 926def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDTRWi)>; 927def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDTRXi)>; 928 929def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDTRSBWi)>; 930def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDTRSBXi)>; 931def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDTRSHWi)>; 932def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDTRSHXi)>; 933def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDTRSWi)>; 934 935def : InstRW<[THX3T110Write_5Cyc_LS01_I0123, WriteLDHi, WriteAdr], 936 (instrs LDPDpre)>; 937def : InstRW<[THX3T110Write_5Cyc_LS01_I0123, WriteLDHi, WriteAdr], 938 (instrs LDPQpre)>; 939def : InstRW<[THX3T110Write_5Cyc_LS01_I0123, WriteLDHi, WriteAdr], 940 (instrs LDPSpre)>; 941def : InstRW<[THX3T110Write_5Cyc_LS01_I0123, WriteLDHi, WriteAdr], 942 (instrs LDPWpre)>; 943def : InstRW<[THX3T110Write_5Cyc_LS01_I0123, WriteLDHi, WriteAdr], 944 (instrs LDPWpre)>; 945 946def : InstRW<[THX3T110Write_4Cyc_LS01, WriteAdr], 947 (instrs LDRBpre, LDRDpre, LDRHpre, LDRQpre, 948 LDRSpre, LDRWpre, LDRXpre, 949 LDRSBWpre, LDRSBXpre, LDRSBWpost, LDRSBXpost, 950 LDRSHWpre, LDRSHXpre, LDRSHWpost, LDRSHXpost, 951 LDRBBpre, LDRBBpost, LDRHHpre, LDRHHpost)>; 952 953def : InstRW<[THX3T110Write_5Cyc_LS01_I0123, WriteLDHi, WriteAdr], 954 (instrs LDPDpost, LDPQpost, LDPSpost, LDPWpost, LDPXpost)>; 955 956def : InstRW<[THX3T110Write_5Cyc_LS01_I0123, WriteI], 957 (instrs LDRBpost, LDRDpost, LDRHpost, 958 LDRQpost, LDRSpost, LDRWpost, LDRXpost)>; 959 960def : InstRW<[THX3T110Write_4Cyc_LS01_I0123_I0123, WriteLDHi, WriteAdr], 961 (instrs LDPDpre, LDPQpre, LDPSpre, LDPWpre, LDPXpre)>; 962 963def : InstRW<[THX3T110Write_4Cyc_LS01_I0123_I0123, WriteAdr], 964 (instrs LDRBpre, LDRDpre, LDRHpre, LDRQpre, 965 LDRSpre, LDRWpre, LDRXpre)>; 966 967def : InstRW<[THX3T110Write_4Cyc_LS01_I0123_I0123, WriteLDHi, WriteAdr], 968 (instrs LDPDpost, LDPQpost, LDPSpost, LDPWpost, LDPXpost)>; 969 970def : InstRW<[THX3T110Write_4Cyc_LS01_I0123_I0123, WriteI], 971 (instrs LDRBpost, LDRDpost, LDRHpost, LDRQpost, 972 LDRSpost, LDRWpost, LDRXpost)>; 973 974def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRBroW)>; 975def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRDroW)>; 976def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRHroW)>; 977def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRHHroW)>; 978def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRQroW)>; 979def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRSroW)>; 980def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRSHWroW)>; 981def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRSHXroW)>; 982def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRWroW)>; 983def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRXroW)>; 984 985def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRBroX)>; 986def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRDroX)>; 987def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRHHroX)>; 988def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRHroX)>; 989def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRQroX)>; 990def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRSroX)>; 991def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRSHWroX)>; 992def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRSHXroX)>; 993def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRWroX)>; 994def : InstRW<[THX3T110Write_4Cyc_LS01_I0123, ReadAdrBase], (instrs LDRXroX)>; 995 996def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURBi)>; 997def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURBBi)>; 998def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURDi)>; 999def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURHi)>; 1000def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURHHi)>; 1001def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURQi)>; 1002def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURSi)>; 1003def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURXi)>; 1004def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURSBWi)>; 1005def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURSBXi)>; 1006def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURSHWi)>; 1007def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURSHXi)>; 1008def : InstRW<[THX3T110Write_4Cyc_LS01], (instrs LDURSWi)>; 1009 1010// Load exclusive 1011def : InstRW<[THX3T110Write_4Cyc_LS01], (instregex "^LDAR(B|H|W|X)$")>; 1012def : InstRW<[THX3T110Write_4Cyc_LS01], (instregex "^LDAXR(B|H|W|X)$")>; 1013def : InstRW<[THX3T110Write_4Cyc_LS01], (instregex "^LDXR(B|H|W|X)$")>; 1014def : InstRW<[THX3T110Write_4Cyc_LS01], (instregex "^LDAXP(W|X)$")>; 1015def : InstRW<[THX3T110Write_4Cyc_LS01], (instregex "^LDXP(W|X)$")>; 1016 1017//--- 1018// Prefetch 1019//--- 1020def : InstRW<[THX3T110Write_6Cyc_LS01_I012], (instrs PRFMl)>; 1021def : InstRW<[THX3T110Write_6Cyc_LS01_I012], (instrs PRFUMi)>; 1022def : InstRW<[THX3T110Write_6Cyc_LS01_I012], (instrs PRFMui)>; 1023def : InstRW<[THX3T110Write_6Cyc_LS01_I012], (instrs PRFMroW)>; 1024def : InstRW<[THX3T110Write_6Cyc_LS01_I012], (instrs PRFMroX)>; 1025 1026//-- 1027// 3.7 Store Instructions 1028// 3.11 FP Store Instructions 1029//-- 1030 1031// Store register, unscaled immed 1032// Store register, immed unprivileged 1033// Store register, unsigned immed 1034def : WriteRes<WriteST, [THX3T110LS, THX3T110SD]> { 1035 let Latency = 1; 1036 let NumMicroOps = 2; 1037} 1038 1039// Store register, immed post-index 1040// NOTE: Handled by WriteAdr, WriteST, ReadAdrBase 1041 1042// Store register, immed pre-index 1043// NOTE: Handled by WriteAdr, WriteST 1044 1045// Store register, register offset, basic 1046// Store register, register offset, scaled by 4/8 1047// Store register, register offset, scaled by 2 1048// Store register, register offset, extend 1049// Store register, register offset, extend, scale by 4/8 1050// Store register, register offset, extend, scale by 1 1051def : WriteRes<WriteSTIdx, [THX3T110LS, THX3T110SD, THX3T110I0123]> { 1052 let Latency = 1; 1053 let NumMicroOps = 2; 1054} 1055 1056// Store pair, immed offset, W-form 1057// Store pair, immed offset, X-form 1058def : WriteRes<WriteSTP, [THX3T110LS, THX3T110SD]> { 1059 let Latency = 1; 1060 let NumMicroOps = 2; 1061} 1062 1063// Store pair, immed post-index, W-form 1064// Store pair, immed post-index, X-form 1065// Store pair, immed pre-index, W-form 1066// Store pair, immed pre-index, X-form 1067// NOTE: Handled by WriteAdr, WriteSTP. 1068def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STURBi)>; 1069def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STURBBi)>; 1070def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STURDi)>; 1071def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STURHi)>; 1072def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STURHHi)>; 1073def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STURQi)>; 1074def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STURSi)>; 1075def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STURWi)>; 1076def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STURXi)>; 1077 1078def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_SD], (instrs STTRBi)>; 1079def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_SD], (instrs STTRHi)>; 1080def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_SD], (instrs STTRWi)>; 1081def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_SD], (instrs STTRXi)>; 1082 1083def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STNPDi)>; 1084def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STNPQi)>; 1085def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STNPXi)>; 1086def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STNPWi)>; 1087 1088def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STPDi)>; 1089def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STPQi)>; 1090def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STPXi)>; 1091def : InstRW<[THX3T110Write_1Cyc_LS01_SD], (instrs STPWi)>; 1092 1093def : InstRW<[THX3T110Write_1Cyc_LS01_I0123], (instrs STRBui)>; 1094def : InstRW<[THX3T110Write_1Cyc_LS01_I0123], (instrs STRDui)>; 1095def : InstRW<[THX3T110Write_1Cyc_LS01_I0123], (instrs STRHui)>; 1096def : InstRW<[THX3T110Write_1Cyc_LS01_I0123], (instrs STRQui)>; 1097def : InstRW<[THX3T110Write_1Cyc_LS01_I0123], (instrs STRXui)>; 1098def : InstRW<[THX3T110Write_1Cyc_LS01_I0123], (instrs STRWui)>; 1099 1100def : InstRW<[WriteSTP, THX3T110Write_1Cyc_LS01_SD], (instrs STRBui)>; 1101def : InstRW<[WriteSTP, THX3T110Write_1Cyc_LS01_SD], (instrs STRDui)>; 1102def : InstRW<[WriteSTP, THX3T110Write_1Cyc_LS01_SD], (instrs STRHui)>; 1103def : InstRW<[WriteSTP, THX3T110Write_1Cyc_LS01_SD], (instrs STRQui)>; 1104def : InstRW<[WriteSTP, THX3T110Write_1Cyc_LS01_SD], (instrs STRXui)>; 1105def : InstRW<[WriteSTP, THX3T110Write_1Cyc_LS01_SD], (instrs STRWui)>; 1106 1107def : InstRW<[WriteSTIdx, THX3T110Write_1Cyc_LS01_SD_I0123], (instrs STRBui)>; 1108def : InstRW<[WriteSTIdx, THX3T110Write_1Cyc_LS01_SD_I0123], (instrs STRDui)>; 1109def : InstRW<[WriteSTIdx, THX3T110Write_1Cyc_LS01_SD_I0123], (instrs STRHui)>; 1110def : InstRW<[WriteSTIdx, THX3T110Write_1Cyc_LS01_SD_I0123], (instrs STRQui)>; 1111def : InstRW<[WriteSTIdx, THX3T110Write_1Cyc_LS01_SD_I0123], (instrs STRXui)>; 1112def : InstRW<[WriteSTIdx, THX3T110Write_1Cyc_LS01_SD_I0123], (instrs STRWui)>; 1113 1114def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1115 (instrs STPDpre, STPDpost)>; 1116def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1117 (instrs STPDpre, STPDpost)>; 1118def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1119 (instrs STPQpre, STPQpost)>; 1120def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1121 (instrs STPQpre, STPQpost)>; 1122def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1123 (instrs STPSpre, STPSpost)>; 1124def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1125 (instrs STPSpre, STPSpost)>; 1126def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1127 (instrs STPWpre, STPWpost)>; 1128def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1129 (instrs STPWpre, STPWpost)>; 1130def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1131 (instrs STPXpre, STPXpost)>; 1132def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1133 (instrs STPXpre, STPXpost)>; 1134def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1135 (instrs STRBpre, STRBpost)>; 1136def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1137 (instrs STRBpre, STRBpost)>; 1138def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1139 (instrs STRBBpre, STRBBpost)>; 1140def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1141 (instrs STRBBpre, STRBBpost)>; 1142def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1143 (instrs STRDpre, STRDpost)>; 1144def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1145 (instrs STRDpre, STRDpost)>; 1146def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1147 (instrs STRHpre, STRHpost)>; 1148def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1149 (instrs STRHpre, STRHpost)>; 1150def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1151 (instrs STRHHpre, STRHHpost)>; 1152def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1153 (instrs STRHHpre, STRHHpost)>; 1154def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1155 (instrs STRQpre, STRQpost)>; 1156def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1157 (instrs STRQpre, STRQpost)>; 1158def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1159 (instrs STRSpre, STRSpost)>; 1160def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1161 (instrs STRSpre, STRSpost)>; 1162def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1163 (instrs STRWpre, STRWpost)>; 1164def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1165 (instrs STRWpre, STRWpost)>; 1166def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123], 1167 (instrs STRXpre, STRXpost)>; 1168def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1169 (instrs STRXpre, STRXpost)>; 1170def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1171 (instrs STRBroW, STRBroX)>; 1172def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1173 (instrs STRBBroW, STRBBroX)>; 1174def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1175 (instrs STRDroW, STRDroX)>; 1176def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1177 (instrs STRHroW, STRHroX)>; 1178def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1179 (instrs STRHHroW, STRHHroX)>; 1180def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1181 (instrs STRQroW, STRQroX)>; 1182def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1183 (instrs STRSroW, STRSroX)>; 1184def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1185 (instrs STRWroW, STRWroX)>; 1186def : InstRW<[WriteAdr, THX3T110Write_1Cyc_LS01_I0123, ReadAdrBase], 1187 (instrs STRXroW, STRXroX)>; 1188 1189// Store exclusive 1190def : InstRW<[THX3T110Write_4Cyc_LS01_SD], (instrs STNPWi, STNPXi)>; 1191def : InstRW<[THX3T110Write_4Cyc_LS01_SD], (instregex "^STLR(B|H|W|X)$")>; 1192def : InstRW<[THX3T110Write_4Cyc_LS01_SD], (instregex "^STXP(W|X)$")>; 1193def : InstRW<[THX3T110Write_4Cyc_LS01_SD], (instregex "^STXR(B|H|W|X)$")>; 1194def : InstRW<[THX3T110Write_4Cyc_LS01_SD], (instregex "^STLXP(W|X)$")>; 1195def : InstRW<[THX3T110Write_4Cyc_LS01_SD], (instregex "^STLXR(B|H|W|X)$")>; 1196 1197//--- 1198// 3.8 FP Data Processing Instructions 1199//--- 1200 1201// FP absolute value 1202// FP min/max 1203// FP negate 1204def : WriteRes<WriteF, [THX3T110FP0123]> { 1205 let Latency = 5; 1206 let NumMicroOps = 2; 1207} 1208 1209// FP arithmetic 1210def : InstRW<[THX3T110Write_6Cyc_F01], (instregex "^FADD", "^FSUB")>; 1211 1212// FP compare 1213def : WriteRes<WriteFCmp, [THX3T110FP0123]> { 1214 let Latency = 5; 1215 let NumMicroOps = 2; 1216} 1217 1218// FP Mul, Div, Sqrt 1219def : WriteRes<WriteFDiv, [THX3T110FP0123]> { 1220 let Latency = 22; 1221 let ReleaseAtCycles = [19]; 1222} 1223 1224def THX3T110XWriteFDiv : SchedWriteRes<[THX3T110FP0123]> { 1225 let Latency = 16; 1226 let ReleaseAtCycles = [8]; 1227 let NumMicroOps = 4; 1228} 1229 1230def THX3T110XWriteFDivSP : SchedWriteRes<[THX3T110FP0123]> { 1231 let Latency = 16; 1232 let ReleaseAtCycles = [8]; 1233 let NumMicroOps = 4; 1234} 1235 1236def THX3T110XWriteFDivDP : SchedWriteRes<[THX3T110FP0123]> { 1237 let Latency = 23; 1238 let ReleaseAtCycles = [12]; 1239 let NumMicroOps = 4; 1240} 1241 1242def THX3T110XWriteFSqrtSP : SchedWriteRes<[THX3T110FP0123]> { 1243 let Latency = 16; 1244 let ReleaseAtCycles = [8]; 1245 let NumMicroOps = 4; 1246} 1247 1248def THX3T110XWriteFSqrtDP : SchedWriteRes<[THX3T110FP0123]> { 1249 let Latency = 23; 1250 let ReleaseAtCycles = [12]; 1251 let NumMicroOps = 4; 1252} 1253 1254// FP divide, S-form 1255// FP square root, S-form 1256def : InstRW<[THX3T110XWriteFDivSP], (instrs FDIVSrr)>; 1257def : InstRW<[THX3T110XWriteFSqrtSP], (instrs FSQRTSr)>; 1258def : InstRW<[THX3T110XWriteFDivSP], (instregex "^FDIVv.*32$")>; 1259def : InstRW<[THX3T110XWriteFSqrtSP], (instregex "^.*SQRT.*32$")>; 1260def : InstRW<[THX3T110Write_16Cyc_F01], (instregex "^FDIVSrr", "^FSQRTSr")>; 1261 1262// FP divide, D-form 1263// FP square root, D-form 1264def : InstRW<[THX3T110XWriteFDivDP], (instrs FDIVDrr)>; 1265def : InstRW<[THX3T110XWriteFSqrtDP], (instrs FSQRTDr)>; 1266def : InstRW<[THX3T110XWriteFDivDP], (instregex "^FDIVv.*64$")>; 1267def : InstRW<[THX3T110XWriteFSqrtDP], (instregex "^.*SQRT.*64$")>; 1268def : InstRW<[THX3T110Write_23Cyc_F01], (instregex "^FDIVDrr", "^FSQRTDr")>; 1269 1270// FP multiply 1271// FP multiply accumulate 1272def : WriteRes<WriteFMul, [THX3T110FP0123]> { 1273 let Latency = 6; 1274 let ReleaseAtCycles = [2]; 1275 let NumMicroOps = 3; 1276} 1277 1278def THX3T110XWriteFMul : SchedWriteRes<[THX3T110FP0123]> { 1279 let Latency = 6; 1280 let ReleaseAtCycles = [2]; 1281 let NumMicroOps = 3; 1282} 1283 1284def THX3T110XWriteFMulAcc : SchedWriteRes<[THX3T110FP0123]> { 1285 let Latency = 6; 1286 let ReleaseAtCycles = [2]; 1287 let NumMicroOps = 3; 1288} 1289 1290def : InstRW<[THX3T110XWriteFMul], (instregex "^FMUL", "^FNMUL")>; 1291def : InstRW<[THX3T110XWriteFMulAcc], 1292 (instregex "^FMADD", "^FMSUB", "^FNMADD", "^FNMSUB")>; 1293 1294// FP round to integral 1295def : InstRW<[THX3T110Write_7Cyc_F01], 1296 (instregex "^FRINT(A|I|M|N|P|X|Z)(Sr|Dr)")>; 1297 1298// FP select 1299def : InstRW<[THX3T110Write_3_4Cyc_F23_F0123], (instregex "^FCSEL")>; 1300 1301//--- 1302// 3.9 FP Miscellaneous Instructions 1303//--- 1304 1305// FP convert, from vec to vec reg 1306// FP convert, from gen to vec reg 1307// FP convert, from vec to gen reg 1308def : WriteRes<WriteFCvt, [THX3T110FP0123]> { 1309 let Latency = 7; 1310 let NumMicroOps = 3; 1311} 1312 1313// FP move, immed 1314// FP move, register 1315def : WriteRes<WriteFImm, [THX3T110FP0123]> { 1316 let Latency = 4; 1317 let NumMicroOps = 2; 1318} 1319 1320// FP transfer, from gen to vec reg 1321// FP transfer, from vec to gen reg 1322def : WriteRes<WriteFCopy, [THX3T110FP0123]> { 1323 let Latency = 4; 1324 let NumMicroOps = 2; 1325} 1326 1327def : InstRW<[THX3T110Write_5Cyc_F01], (instrs FMOVXDHighr, FMOVDXHighr)>; 1328 1329//--- 1330// 3.12 ASIMD Integer Instructions 1331//--- 1332 1333// ASIMD absolute diff, D-form 1334// ASIMD absolute diff, Q-form 1335// ASIMD absolute diff accum, D-form 1336// ASIMD absolute diff accum, Q-form 1337// ASIMD absolute diff accum long 1338// ASIMD absolute diff long 1339// ASIMD arith, basic 1340// ASIMD arith, complex 1341// ASIMD compare 1342// ASIMD logical (AND, BIC, EOR) 1343// ASIMD max/min, basic 1344// ASIMD max/min, reduce, 4H/4S 1345// ASIMD max/min, reduce, 8B/8H 1346// ASIMD max/min, reduce, 16B 1347// ASIMD multiply, D-form 1348// ASIMD multiply, Q-form 1349// ASIMD multiply accumulate long 1350// ASIMD multiply accumulate saturating long 1351// ASIMD multiply long 1352// ASIMD pairwise add and accumulate 1353// ASIMD shift accumulate 1354// ASIMD shift by immed, basic 1355// ASIMD shift by immed and insert, basic, D-form 1356// ASIMD shift by immed and insert, basic, Q-form 1357// ASIMD shift by immed, complex 1358// ASIMD shift by register, basic, D-form 1359// ASIMD shift by register, basic, Q-form 1360// ASIMD shift by register, complex, D-form 1361// ASIMD shift by register, complex, Q-form 1362def : WriteRes<WriteVd, [THX3T110FP0123]> { 1363 let Latency = 5; 1364 let NumMicroOps = 4; 1365 let ReleaseAtCycles = [4]; 1366} 1367def : WriteRes<WriteVq, [THX3T110FP0123]> { 1368 let Latency = 5; 1369 let NumMicroOps = 4; 1370 let ReleaseAtCycles = [4]; 1371} 1372 1373// ASIMD arith, reduce, 4H/4S 1374// ASIMD arith, reduce, 8B/8H 1375// ASIMD arith, reduce, 16B 1376 1377// ASIMD logical (MVN (alias for NOT), ORN, ORR) 1378def : InstRW<[THX3T110Write_5Cyc_F0123], 1379 (instregex "^ANDv", "^BICv", "^EORv", "^ORRv", "^ORNv", "^NOTv")>; 1380 1381// ASIMD arith, reduce 1382def : InstRW<[THX3T110Write_5Cyc_F0123], 1383 (instregex "^ADDVv", "^SADDLVv", "^UADDLVv")>; 1384 1385// ASIMD polynomial (8x8) multiply long 1386def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^(S|U|SQD)MULL")>; 1387def : InstRW<[THX3T110Write_5Cyc_F0123], 1388 (instregex "(S|U|SQD)(MLAL|MLSL|MULL)v.*")>; 1389def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^PMULL(v8i8|v16i8)")>; 1390def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^PMULL(v1i64|v2i64)")>; 1391 1392// ASIMD absolute diff accum, D-form 1393def : InstRW<[THX3T110Write_5Cyc_F0123], 1394 (instregex "^[SU]ABA(v8i8|v4i16|v2i32)$")>; 1395// ASIMD absolute diff accum, Q-form 1396def : InstRW<[THX3T110Write_5Cyc_F0123], 1397 (instregex "^[SU]ABA(v16i8|v8i16|v4i32)$")>; 1398// ASIMD absolute diff accum long 1399def : InstRW<[THX3T110Write_5Cyc_F0123], 1400 (instregex "^[SU]ABAL")>; 1401// ASIMD arith, reduce, 4H/4S 1402def : InstRW<[THX3T110Write_5Cyc_F0123], 1403 (instregex "^[SU]?ADDL?V(v8i8|v4i16|v2i32)v$")>; 1404// ASIMD arith, reduce, 8B 1405def : InstRW<[THX3T110Write_5Cyc_F0123], 1406 (instregex "^[SU]?ADDL?V(v8i16|v4i32)v$")>; 1407// ASIMD arith, reduce, 16B/16H 1408def : InstRW<[THX3T110Write_10Cyc_F0123], 1409 (instregex "^[SU]?ADDL?Vv16i8v$")>; 1410// ASIMD max/min, reduce, 4H/4S 1411def : InstRW<[THX3T110Write_5Cyc_F0123], 1412 (instregex "^[SU](MIN|MAX)V(v4i16|v4i32)v$")>; 1413// ASIMD max/min, reduce, 8B/8H 1414def : InstRW<[THX3T110Write_5Cyc_F0123], 1415 (instregex "^[SU](MIN|MAX)V(v8i8|v8i16)v$")>; 1416// ASIMD max/min, reduce, 16B/16H 1417def : InstRW<[THX3T110Write_5Cyc_F0123], 1418 (instregex "^[SU](MIN|MAX)Vv16i8v$")>; 1419// ASIMD multiply, D-form 1420def : InstRW<[THX3T110Write_5Cyc_F0123], 1421 (instregex "^(P?MUL|SQR?DMULH)" # 1422 "(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)" # 1423 "(_indexed)?$")>; 1424// ASIMD multiply, Q-form 1425def : InstRW<[THX3T110Write_5Cyc_F0123], 1426 (instregex "^(P?MUL|SQR?DMULH)(v16i8|v8i16|v4i32)(_indexed)?$")>; 1427// ASIMD multiply accumulate, D-form 1428def : InstRW<[THX3T110Write_5Cyc_F0123], 1429 (instregex "^ML[AS](v8i8|v4i16|v2i32)(_indexed)?$")>; 1430// ASIMD multiply accumulate, Q-form 1431def : InstRW<[THX3T110Write_5Cyc_F0123], 1432 (instregex "^ML[AS](v16i8|v8i16|v4i32)(_indexed)?$")>; 1433// ASIMD shift accumulate 1434def : InstRW<[THX3T110Write_5Cyc_F0123], 1435 (instregex "SRSRAv","SSRAv","URSRAv","USRAv")>; 1436 1437// ASIMD shift by immed, basic 1438def : InstRW<[THX3T110Write_5Cyc_F0123], 1439 (instregex "RSHRNv","SHRNv", "SQRSHRNv","SQRSHRUNv", 1440 "SQSHRNv","SQSHRUNv", "UQRSHRNv", 1441 "UQSHRNv","SQXTNv","SQXTUNv","UQXTNv")>; 1442// ASIMD shift by immed, complex 1443def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^[SU]?(Q|R){1,2}SHR")>; 1444def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SQSHLU")>; 1445// ASIMD shift by register, basic, Q-form 1446def : InstRW<[THX3T110Write_5Cyc_F01], 1447 (instregex "^[SU]SHL(v16i8|v8i16|v4i32|v2i64)")>; 1448// ASIMD shift by register, complex, D-form 1449def : InstRW<[THX3T110Write_5Cyc_F0123], 1450 (instregex "^[SU][QR]{1,2}SHL" # 1451 "(v1i8|v1i16|v1i32|v1i64|v8i8|v4i16|v2i32|b|d|h|s)")>; 1452// ASIMD shift by register, complex, Q-form 1453def : InstRW<[THX3T110Write_5Cyc_F0123], 1454 (instregex "^[SU][QR]{1,2}SHL(v16i8|v8i16|v4i32|v2i64)")>; 1455 1456// ASIMD Arithmetic 1457def : InstRW<[THX3T110Write_5Cyc_F0123], 1458 (instregex "(ADD|SUB)(v8i8|v4i16|v2i32|v1i64)")>; 1459def : InstRW<[THX3T110Write_5Cyc_F0123], 1460 (instregex "(ADD|SUB)(v16i8|v8i16|v4i32|v2i64)")>; 1461def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "(ADD|SUB)HNv.*")>; 1462def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "(RADD|RSUB)HNv.*")>; 1463def : InstRW<[THX3T110Write_5Cyc_F0123], 1464 (instregex "^SQADD", "^SQNEG", "^SQSUB", "^SRHADD", 1465 "^SUQADD", "^UQADD", "^UQSUB", "^URHADD", "^USQADD")>; 1466def : InstRW<[THX3T110Write_5Cyc_F0123], 1467 (instregex "ADDP(v16i8|v8i16|v4i32|v2i64)")>; 1468def : InstRW<[THX3T110Write_5Cyc_F0123], 1469 (instregex "((AND|ORN|EOR|EON)S?(Xr[rsi]|v16i8|v8i16|v4i32)|" # 1470 "(ORR|BIC)S?(Xr[rs]|v16i8|v8i16|v4i32))")>; 1471def : InstRW<[THX3T110Write_5Cyc_F0123], 1472 (instregex "(CLS|CLZ|CNT)(v4i32|v8i16|v16i8)")>; 1473def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SADALP","^UADALP")>; 1474def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SADDLPv","^UADDLPv")>; 1475def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SADDLV","^UADDLV")>; 1476def : InstRW<[THX3T110Write_5Cyc_F0123], 1477 (instregex "^ADDVv","^SMAXVv","^UMAXVv","^SMINVv","^UMINVv")>; 1478def : InstRW<[THX3T110Write_5Cyc_F0123], 1479 (instregex "^SABAv","^UABAv","^SABALv","^UABALv")>; 1480def : InstRW<[THX3T110Write_5Cyc_F0123], 1481 (instregex "^SQADDv","^SQSUBv","^UQADDv","^UQSUBv")>; 1482def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^SUQADDv","^USQADDv")>; 1483def : InstRW<[THX3T110Write_5Cyc_F0123], 1484 (instregex "^ADDHNv","^RADDHNv", "^RSUBHNv", 1485 "^SQABS", "^SQADD", "^SQNEG", "^SQSUB", 1486 "^SRHADD", "^SUBHNv", "^SUQADD", 1487 "^UQADD", "^UQSUB", "^URHADD", "^USQADD")>; 1488def : InstRW<[THX3T110Write_5Cyc_F0123], 1489 (instregex "^CMEQv","^CMGEv","^CMGTv", 1490 "^CMLEv","^CMLTv", "^CMHIv","^CMHSv")>; 1491def : InstRW<[THX3T110Write_5Cyc_F0123], 1492 (instregex "^SMAXv","^SMINv","^UMAXv","^UMINv", 1493 "^SMAXPv","^SMINPv","^UMAXPv","^UMINPv")>; 1494def : InstRW<[THX3T110Write_5Cyc_F0123], 1495 (instregex "^SABDv","^UABDv", "^SABDLv","^UABDLv")>; 1496 1497//--- 1498// 3.13 ASIMD Floating-point Instructions 1499//--- 1500 1501// ASIMD FP absolute value 1502def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^FABSv")>; 1503 1504// ASIMD FP arith, normal, D-form 1505// ASIMD FP arith, normal, Q-form 1506def : InstRW<[THX3T110Write_3_4Cyc_F23_F0123], 1507 (instregex "^FABDv", "^FADDv", "^FSUBv")>; 1508 1509// ASIMD FP arith,pairwise, D-form 1510// ASIMD FP arith, pairwise, Q-form 1511def : InstRW<[THX3T110Write_3_4Cyc_F23_F0123], (instregex "^FADDPv")>; 1512 1513// ASIMD FP compare, D-form 1514// ASIMD FP compare, Q-form 1515def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^FACGEv", "^FACGTv")>; 1516def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^FCMEQv", "^FCMGEv", 1517 "^FCMGTv", "^FCMLEv", 1518 "^FCMLTv")>; 1519 1520// ASIMD FP round, D-form 1521def : InstRW<[THX3T110Write_5Cyc_F0123], 1522 (instregex "^FRINT[AIMNPXZ](v2f32)")>; 1523// ASIMD FP round, Q-form 1524def : InstRW<[THX3T110Write_5Cyc_F0123], 1525 (instregex "^FRINT[AIMNPXZ](v4f32|v2f64)")>; 1526 1527// ASIMD FP convert, long 1528// ASIMD FP convert, narrow 1529// ASIMD FP convert, other, D-form 1530// ASIMD FP convert, other, Q-form 1531// NOTE: Handled by WriteV. 1532 1533// ASIMD FP convert, long and narrow 1534def : InstRW<[THX3T110Write_5Cyc_F01], (instregex "^FCVT(L|N|XN)v")>; 1535// ASIMD FP convert, other, D-form 1536def : InstRW<[THX3T110Write_5Cyc_F01], 1537 (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v2f32|v1i32|v2i32|v1i64)")>; 1538// ASIMD FP convert, other, Q-form 1539def : InstRW<[THX3T110Write_5Cyc_F01], 1540 (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v4f32|v2f64|v4i32|v2i64)")>; 1541 1542// ASIMD FP divide, D-form, F32 1543def : InstRW<[THX3T110Write_16Cyc_F0123], (instrs FDIVv2f32)>; 1544def : InstRW<[THX3T110Write_16Cyc_F0123], (instregex "FDIVv2f32")>; 1545 1546// ASIMD FP divide, Q-form, F32 1547def : InstRW<[THX3T110Write_16Cyc_F0123], (instrs FDIVv4f32)>; 1548def : InstRW<[THX3T110Write_16Cyc_F0123], (instregex "FDIVv4f32")>; 1549 1550// ASIMD FP divide, Q-form, F64 1551def : InstRW<[THX3T110Write_23Cyc_F0123], (instrs FDIVv2f64)>; 1552def : InstRW<[THX3T110Write_23Cyc_F0123], (instregex "FDIVv2f64")>; 1553 1554// ASIMD FP max/min, normal, D-form 1555// ASIMD FP max/min, normal, Q-form 1556def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^FMAXv", "^FMAXNMv", 1557 "^FMINv", "^FMINNMv")>; 1558 1559// ASIMD FP max/min, pairwise, D-form 1560// ASIMD FP max/min, pairwise, Q-form 1561def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^FMAXPv", "^FMAXNMPv", 1562 "^FMINPv", "^FMINNMPv")>; 1563 1564// ASIMD FP max/min, reduce 1565def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^FMAXVv", "^FMAXNMVv", 1566 "^FMINVv", "^FMINNMVv")>; 1567 1568// ASIMD FP multiply, D-form, FZ 1569// ASIMD FP multiply, D-form, no FZ 1570// ASIMD FP multiply, Q-form, FZ 1571// ASIMD FP multiply, Q-form, no FZ 1572def : InstRW<[THX3T110Write_5Cyc_F0123], 1573 (instregex "^FMULv", "^FMULXv")>; 1574def : InstRW<[THX3T110Write_5Cyc_F0123], 1575 (instregex "^FMULX?(v2f32|v1i32|v2i32|v1i64|32|64)")>; 1576def : InstRW<[THX3T110Write_5Cyc_F0123], 1577 (instregex "^FMULX?(v4f32|v2f64|v4i32|v2i64)")>; 1578 1579// ASIMD FP multiply accumulate, Dform, FZ 1580// ASIMD FP multiply accumulate, Dform, no FZ 1581// ASIMD FP multiply accumulate, Qform, FZ 1582// ASIMD FP multiply accumulate, Qform, no FZ 1583def : InstRW<[THX3T110Write_5Cyc_F0123], 1584 (instregex "^FMLAv", "^FMLSv")>; 1585def : InstRW<[THX3T110Write_5Cyc_F0123], 1586 (instregex "^FML[AS](v2f32|v1i32|v2i32|v1i64)")>; 1587def : InstRW<[THX3T110Write_5Cyc_F0123], 1588 (instregex "^FML[AS](v4f32|v2f64|v4i32|v2i64)")>; 1589 1590// ASIMD FP negate 1591def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^FNEGv")>; 1592 1593//-- 1594// 3.14 ASIMD Miscellaneous Instructions 1595//-- 1596 1597// ASIMD bit reverse 1598def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^RBITv")>; 1599 1600// ASIMD bitwise insert, D-form 1601// ASIMD bitwise insert, Q-form 1602def : InstRW<[THX3T110Write_3_4Cyc_F23_F0123], 1603 (instregex "^BIFv", "^BITv", "^BSLv")>; 1604 1605// ASIMD count, D-form 1606// ASIMD count, Q-form 1607def : InstRW<[THX3T110Write_3_4Cyc_F23_F0123], 1608 (instregex "^CLSv", "^CLZv", "^CNTv")>; 1609 1610// ASIMD duplicate, gen reg 1611// ASIMD duplicate, element 1612def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^DUPv")>; 1613def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^DUP(i8|i16|i32|i64)$")>; 1614def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^DUPv.+gpr")>; 1615 1616// ASIMD extract 1617def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^EXTv")>; 1618 1619// ASIMD extract narrow 1620def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^XTNv")>; 1621 1622// ASIMD extract narrow, saturating 1623def : InstRW<[THX3T110Write_5Cyc_F0123], 1624 (instregex "^SQXTNv", "^SQXTUNv", "^UQXTNv")>; 1625 1626// ASIMD insert, element to element 1627def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^INSv")>; 1628 1629// ASIMD transfer, element to gen reg 1630def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^[SU]MOVv")>; 1631 1632// ASIMD move, integer immed 1633def : InstRW<[THX3T110Write_3_4Cyc_F23_F0123], (instregex "^MOVIv")>; 1634 1635// ASIMD move, FP immed 1636def : InstRW<[THX3T110Write_3_4Cyc_F23_F0123], (instregex "^FMOVv")>; 1637 1638// ASIMD transpose 1639def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^TRN1", "^TRN2")>; 1640 1641// ASIMD unzip/zip 1642def : InstRW<[THX3T110Write_5Cyc_F0123], 1643 (instregex "^UZP1", "^UZP2", "^ZIP1", "^ZIP2")>; 1644 1645// ASIMD reciprocal estimate, D-form 1646// ASIMD reciprocal estimate, Q-form 1647def : InstRW<[THX3T110Write_5Cyc_F0123], 1648 (instregex "^FRECPEv", "^FRECPXv", "^URECPEv", 1649 "^FRSQRTEv", "^URSQRTEv")>; 1650 1651// ASIMD reciprocal step, D-form, FZ 1652// ASIMD reciprocal step, D-form, no FZ 1653// ASIMD reciprocal step, Q-form, FZ 1654// ASIMD reciprocal step, Q-form, no FZ 1655def : InstRW<[THX3T110Write_5Cyc_F0123], 1656 (instregex "^FRECPSv", "^FRSQRTSv")>; 1657 1658// ASIMD reverse 1659def : InstRW<[THX3T110Write_5Cyc_F0123], 1660 (instregex "^REV16v", "^REV32v", "^REV64v")>; 1661 1662// ASIMD table lookup, D-form 1663// ASIMD table lookup, Q-form 1664def : InstRW<[THX3T110Write_5Cyc_F0123], 1665 (instrs TBLv8i8One, TBLv16i8One, TBXv8i8One, TBXv16i8One)>; 1666def : InstRW<[THX3T110Write_10Cyc_F0123], 1667 (instrs TBLv8i8Two, TBLv16i8Two, TBXv8i8Two, TBXv16i8Two)>; 1668def : InstRW<[THX3T110Write_15Cyc_F0123], 1669 (instrs TBLv8i8Three, TBLv16i8Three, TBXv8i8Three, TBXv16i8Three)>; 1670def : InstRW<[THX3T110Write_20Cyc_F0123], 1671 (instrs TBLv8i8Four, TBLv16i8Four, TBXv8i8Four, TBXv16i8Four)>; 1672 1673// ASIMD transfer, element to word or word 1674def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^[SU]MOVv")>; 1675 1676// ASIMD transfer, element to gen reg 1677def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "(S|U)MOVv.*")>; 1678 1679// ASIMD transfer gen reg to element 1680def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^INSv")>; 1681 1682// ASIMD transpose 1683def : InstRW<[THX3T110Write_5Cyc_F0123], 1684 (instregex "^TRN1v", "^TRN2v", "^UZP1v", "^UZP2v")>; 1685 1686// ASIMD unzip/zip 1687def : InstRW<[THX3T110Write_5Cyc_F0123], (instregex "^ZIP1v", "^ZIP2v")>; 1688 1689//-- 1690// 3.15 ASIMD Load Instructions 1691//-- 1692 1693// ASIMD load, 1 element, multiple, 1 reg, D-form 1694// ASIMD load, 1 element, multiple, 1 reg, Q-form 1695def : InstRW<[THX3T110Write_4Cyc_LS01], 1696 (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1697def : InstRW<[THX3T110Write_4Cyc_LS01, WriteAdr], 1698 (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1699 1700// ASIMD load, 1 element, multiple, 2 reg, D-form 1701// ASIMD load, 1 element, multiple, 2 reg, Q-form 1702def : InstRW<[THX3T110Write_4Cyc_LS01], 1703 (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1704def : InstRW<[THX3T110Write_4Cyc_LS01, WriteAdr], 1705 (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1706 1707// ASIMD load, 1 element, multiple, 3 reg, D-form 1708// ASIMD load, 1 element, multiple, 3 reg, Q-form 1709def : InstRW<[THX3T110Write_5Cyc_LS01], 1710 (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1711def : InstRW<[THX3T110Write_5Cyc_LS01, WriteAdr], 1712 (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1713 1714// ASIMD load, 1 element, multiple, 4 reg, D-form 1715// ASIMD load, 1 element, multiple, 4 reg, Q-form 1716def : InstRW<[THX3T110Write_6Cyc_LS01], 1717 (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1718def : InstRW<[THX3T110Write_6Cyc_LS01, WriteAdr], 1719 (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1720 1721// ASIMD load, 1 element, one lane, B/H/S 1722// ASIMD load, 1 element, one lane, D 1723def : InstRW<[THX3T110Write_5Cyc_LS01_F0123], 1724 (instregex "^LD1i(8|16|32|64)$")>; 1725def : InstRW<[THX3T110Write_5Cyc_LS01_F0123, WriteAdr], 1726 (instregex "^LD1i(8|16|32|64)_POST$")>; 1727 1728// ASIMD load, 1 element, all lanes, D-form, B/H/S 1729// ASIMD load, 1 element, all lanes, D-form, D 1730// ASIMD load, 1 element, all lanes, Q-form 1731def : InstRW<[THX3T110Write_5Cyc_LS01_F0123], 1732 (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1733def : InstRW<[THX3T110Write_5Cyc_LS01_F0123, WriteAdr], 1734 (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1735 1736// ASIMD load, 2 element, multiple, D-form, B/H/S 1737// ASIMD load, 2 element, multiple, Q-form, D 1738def : InstRW<[THX3T110Write_5Cyc_LS01_F0123], 1739 (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)$")>; 1740def : InstRW<[THX3T110Write_5Cyc_LS01_F0123, WriteAdr], 1741 (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 1742 1743// ASIMD load, 2 element, one lane, B/H 1744// ASIMD load, 2 element, one lane, S 1745// ASIMD load, 2 element, one lane, D 1746def : InstRW<[THX3T110Write_5Cyc_LS01_F0123], 1747 (instregex "^LD2i(8|16|32|64)$")>; 1748def : InstRW<[THX3T110Write_5Cyc_LS01_F0123, WriteAdr], 1749 (instregex "^LD2i(8|16|32|64)_POST$")>; 1750 1751// ASIMD load, 2 element, all lanes, D-form, B/H/S 1752// ASIMD load, 2 element, all lanes, D-form, D 1753// ASIMD load, 2 element, all lanes, Q-form 1754def : InstRW<[THX3T110Write_5Cyc_LS01_F0123], 1755 (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1756def : InstRW<[THX3T110Write_5Cyc_LS01_F0123, WriteAdr], 1757 (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1758 1759// ASIMD load, 3 element, multiple, D-form, B/H/S 1760// ASIMD load, 3 element, multiple, Q-form, B/H/S 1761// ASIMD load, 3 element, multiple, Q-form, D 1762def : InstRW<[THX3T110Write_8Cyc_LS01_F0123], 1763 (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)$")>; 1764def : InstRW<[THX3T110Write_8Cyc_LS01_F0123, WriteAdr], 1765 (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 1766 1767// ASIMD load, 3 element, one lone, B/H 1768// ASIMD load, 3 element, one lane, S 1769// ASIMD load, 3 element, one lane, D 1770def : InstRW<[THX3T110Write_7Cyc_LS01_F0123], 1771 (instregex "^LD3i(8|16|32|64)$")>; 1772def : InstRW<[THX3T110Write_7Cyc_LS01_F0123, WriteAdr], 1773 (instregex "^LD3i(8|16|32|64)_POST$")>; 1774 1775// ASIMD load, 3 element, all lanes, D-form, B/H/S 1776// ASIMD load, 3 element, all lanes, D-form, D 1777// ASIMD load, 3 element, all lanes, Q-form, B/H/S 1778// ASIMD load, 3 element, all lanes, Q-form, D 1779def : InstRW<[THX3T110Write_7Cyc_LS01_F0123], 1780 (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1781def : InstRW<[THX3T110Write_7Cyc_LS01_F0123, WriteAdr], 1782 (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1783 1784// ASIMD load, 4 element, multiple, D-form, B/H/S 1785// ASIMD load, 4 element, multiple, Q-form, B/H/S 1786// ASIMD load, 4 element, multiple, Q-form, D 1787def : InstRW<[THX3T110Write_8Cyc_LS01_F0123], 1788 (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>; 1789def : InstRW<[THX3T110Write_8Cyc_LS01_F0123, WriteAdr], 1790 (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 1791 1792// ASIMD load, 4 element, one lane, B/H 1793// ASIMD load, 4 element, one lane, S 1794// ASIMD load, 4 element, one lane, D 1795def : InstRW<[THX3T110Write_6Cyc_LS01_F0123], 1796 (instregex "^LD4i(8|16|32|64)$")>; 1797def : InstRW<[THX3T110Write_6Cyc_LS01_F0123, WriteAdr], 1798 (instregex "^LD4i(8|16|32|64)_POST$")>; 1799 1800// ASIMD load, 4 element, all lanes, D-form, B/H/S 1801// ASIMD load, 4 element, all lanes, D-form, D 1802// ASIMD load, 4 element, all lanes, Q-form, B/H/S 1803// ASIMD load, 4 element, all lanes, Q-form, D 1804def : InstRW<[THX3T110Write_6Cyc_LS01_F0123], 1805 (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1806def : InstRW<[THX3T110Write_6Cyc_LS01_F0123, WriteAdr], 1807 (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1808 1809//-- 1810// 3.16 ASIMD Store Instructions 1811//-- 1812 1813// ASIMD store, 1 element, multiple, 1 reg, D-form 1814// ASIMD store, 1 element, multiple, 1 reg, Q-form 1815def : InstRW<[THX3T110Write_1Cyc_LS01], 1816 (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1817def : InstRW<[THX3T110Write_1Cyc_LS01, WriteAdr], 1818 (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1819 1820// ASIMD store, 1 element, multiple, 2 reg, D-form 1821// ASIMD store, 1 element, multiple, 2 reg, Q-form 1822def : InstRW<[THX3T110Write_1Cyc_LS01], 1823 (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1824def : InstRW<[THX3T110Write_1Cyc_LS01, WriteAdr], 1825 (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1826 1827// ASIMD store, 1 element, multiple, 3 reg, D-form 1828// ASIMD store, 1 element, multiple, 3 reg, Q-form 1829def : InstRW<[THX3T110Write_1Cyc_LS01], 1830 (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1831def : InstRW<[THX3T110Write_1Cyc_LS01, WriteAdr], 1832 (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1833 1834// ASIMD store, 1 element, multiple, 4 reg, D-form 1835// ASIMD store, 1 element, multiple, 4 reg, Q-form 1836def : InstRW<[THX3T110Write_1Cyc_LS01], 1837 (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 1838def : InstRW<[THX3T110Write_1Cyc_LS01, WriteAdr], 1839 (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 1840 1841// ASIMD store, 1 element, one lane, B/H/S 1842// ASIMD store, 1 element, one lane, D 1843def : InstRW<[THX3T110Write_1Cyc_LS01_F0123], 1844 (instregex "^ST1i(8|16|32|64)$")>; 1845def : InstRW<[THX3T110Write_1Cyc_LS01_F0123, WriteAdr], 1846 (instregex "^ST1i(8|16|32|64)_POST$")>; 1847 1848// ASIMD store, 2 element, multiple, D-form, B/H/S 1849// ASIMD store, 2 element, multiple, Q-form, B/H/S 1850// ASIMD store, 2 element, multiple, Q-form, D 1851def : InstRW<[THX3T110Write_1Cyc_LS01_F0123], 1852 (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)$")>; 1853def : InstRW<[THX3T110Write_1Cyc_LS01_F0123, WriteAdr], 1854 (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 1855 1856// ASIMD store, 2 element, one lane, B/H/S 1857// ASIMD store, 2 element, one lane, D 1858def : InstRW<[THX3T110Write_1Cyc_LS01_F0123], 1859 (instregex "^ST2i(8|16|32|64)$")>; 1860def : InstRW<[THX3T110Write_1Cyc_LS01_F0123, WriteAdr], 1861 (instregex "^ST2i(8|16|32|64)_POST$")>; 1862 1863// ASIMD store, 3 element, multiple, D-form, B/H/S 1864// ASIMD store, 3 element, multiple, Q-form, B/H/S 1865// ASIMD store, 3 element, multiple, Q-form, D 1866def : InstRW<[THX3T110Write_1Cyc_LS01_F0123], 1867 (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)$")>; 1868def : InstRW<[THX3T110Write_1Cyc_LS01_F0123, WriteAdr], 1869 (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 1870 1871// ASIMD store, 3 element, one lane, B/H 1872// ASIMD store, 3 element, one lane, S 1873// ASIMD store, 3 element, one lane, D 1874def : InstRW<[THX3T110Write_1Cyc_LS01_F0123], 1875 (instregex "^ST3i(8|16|32|64)$")>; 1876def : InstRW<[THX3T110Write_1Cyc_LS01_F0123, WriteAdr], 1877 (instregex "^ST3i(8|16|32|64)_POST$")>; 1878 1879// ASIMD store, 4 element, multiple, D-form, B/H/S 1880// ASIMD store, 4 element, multiple, Q-form, B/H/S 1881// ASIMD store, 4 element, multiple, Q-form, D 1882def : InstRW<[THX3T110Write_1Cyc_LS01_F0123], 1883 (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>; 1884def : InstRW<[THX3T110Write_1Cyc_LS01_F0123, WriteAdr], 1885 (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 1886 1887// ASIMD store, 4 element, one lane, B/H 1888// ASIMD store, 4 element, one lane, S 1889// ASIMD store, 4 element, one lane, D 1890def : InstRW<[THX3T110Write_1Cyc_LS01_F0123], 1891 (instregex "^ST4i(8|16|32|64)$")>; 1892def : InstRW<[THX3T110Write_1Cyc_LS01_F0123, WriteAdr], 1893 (instregex "^ST4i(8|16|32|64)_POST$")>; 1894 1895// V8.1a Atomics (LSE) 1896def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1897 (instrs CASB, CASH, CASW, CASX)>; 1898 1899def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1900 (instrs CASAB, CASAH, CASAW, CASAX)>; 1901 1902def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1903 (instrs CASLB, CASLH, CASLW, CASLX)>; 1904 1905def : InstRW<[THX3T110Write_8Cyc_I0123, WriteAtomic], 1906 (instrs CASALB, CASALH, CASALW, CASALX)>; 1907 1908def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1909 (instrs LDLARB, LDLARH, LDLARW, LDLARX)>; 1910 1911def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1912 (instrs LDADDB, LDADDH, LDADDW, LDADDX)>; 1913 1914def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1915 (instrs LDADDAB, LDADDAH, LDADDAW, LDADDAX)>; 1916 1917def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1918 (instrs LDADDLB, LDADDLH, LDADDLW, LDADDLX)>; 1919 1920def : InstRW<[THX3T110Write_8Cyc_I0123, WriteAtomic], 1921 (instrs LDADDALB, LDADDALH, LDADDALW, LDADDALX)>; 1922 1923def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1924 (instrs LDCLRB, LDCLRH, LDCLRW, LDCLRX)>; 1925 1926def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1927 (instrs LDCLRAB, LDCLRAH, LDCLRAW, LDCLRAX)>; 1928 1929def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1930 (instrs LDCLRLB, LDCLRLH, LDCLRLW, LDCLRLX)>; 1931 1932def : InstRW<[THX3T110Write_8Cyc_I0123, WriteAtomic], 1933 (instrs LDCLRALB, LDCLRALH, LDCLRALW, LDCLRALX)>; 1934 1935def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1936 (instrs LDEORB, LDEORH, LDEORW, LDEORX)>; 1937 1938def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1939 (instrs LDEORAB, LDEORAH, LDEORAW, LDEORAX)>; 1940 1941def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1942 (instrs LDEORLB, LDEORLH, LDEORLW, LDEORLX)>; 1943 1944def : InstRW<[THX3T110Write_8Cyc_I0123, WriteAtomic], 1945 (instrs LDEORALB, LDEORALH, LDEORALW, LDEORALX)>; 1946 1947def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1948 (instrs LDSETB, LDSETH, LDSETW, LDSETX)>; 1949 1950def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1951 (instrs LDSETAB, LDSETAH, LDSETAW, LDSETAX)>; 1952 1953def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1954 (instrs LDSETLB, LDSETLH, LDSETLW, LDSETLX)>; 1955 1956def : InstRW<[THX3T110Write_8Cyc_I0123, WriteAtomic], 1957 (instrs LDSETALB, LDSETALH, LDSETALW, LDSETALX)>; 1958 1959def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1960 (instrs LDSMAXB, LDSMAXH, LDSMAXW, LDSMAXX, 1961 LDSMAXAB, LDSMAXAH, LDSMAXAW, LDSMAXAX, 1962 LDSMAXLB, LDSMAXLH, LDSMAXLW, LDSMAXLX, 1963 LDSMAXALB, LDSMAXALH, LDSMAXALW, LDSMAXALX)>; 1964 1965def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1966 (instrs LDSMINB, LDSMINH, LDSMINW, LDSMINX, 1967 LDSMINAB, LDSMINAH, LDSMINAW, LDSMINAX, 1968 LDSMINLB, LDSMINLH, LDSMINLW, LDSMINLX, 1969 LDSMINALB, LDSMINALH, LDSMINALW, LDSMINALX)>; 1970 1971def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1972 (instrs LDUMAXB, LDUMAXH, LDUMAXW, LDUMAXX, 1973 LDUMAXAB, LDUMAXAH, LDUMAXAW, LDUMAXAX, 1974 LDUMAXLB, LDUMAXLH, LDUMAXLW, LDUMAXLX, 1975 LDUMAXALB, LDUMAXALH, LDUMAXALW, LDUMAXALX)>; 1976 1977def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1978 (instrs LDUMINB, LDUMINH, LDUMINW, LDUMINX, 1979 LDUMINAB, LDUMINAH, LDUMINAW, LDUMINAX, 1980 LDUMINLB, LDUMINLH, LDUMINLW, LDUMINLX, 1981 LDUMINALB, LDUMINALH, LDUMINALW, LDUMINALX)>; 1982 1983def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1984 (instrs SWPB, SWPH, SWPW, SWPX)>; 1985 1986def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1987 (instrs SWPAB, SWPAH, SWPAW, SWPAX)>; 1988 1989def : InstRW<[THX3T110Write_6Cyc_I0123, WriteAtomic], 1990 (instrs SWPLB, SWPLH, SWPLW, SWPLX)>; 1991 1992def : InstRW<[THX3T110Write_8Cyc_I0123, WriteAtomic], 1993 (instrs SWPALB, SWPALH, SWPALW, SWPALX)>; 1994 1995def : InstRW<[THX3T110Write_4Cyc_I0123, WriteAtomic], 1996 (instrs STLLRB, STLLRH, STLLRW, STLLRX)>; 1997 1998// V8.3a PAC 1999def : InstRW<[THX3T110Write_11Cyc_LS01_I1], (instregex "^LDRAA", "^LDRAB")>; 2000def : InstRW<[THX3T110Write_8Cyc_I123], 2001 (instrs BLRAA, BLRAAZ, BLRAB, BLRABZ, 2002 BRAA, BRAAZ, BRAB, BRABZ)>; 2003def : InstRW<[THX3T110Write_8Cyc_I123], (instrs RETAA, RETAB)>; 2004 2005} // SchedModel = ThunderX3T110Model 2006