1//=- AArch64SchedA64FX.td - Fujitsu A64FX Scheduling Defs -*- 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 the Fujitsu A64FX processors. 10// 11//===----------------------------------------------------------------------===// 12 13def A64FXModel : SchedMachineModel { 14 let IssueWidth = 6; // 6 micro-ops dispatched at a time. 15 let MicroOpBufferSize = 180; // 180 entries in micro-op re-order buffer. 16 let LoadLatency = 5; // Optimistic load latency. 17 let MispredictPenalty = 12; // Extra cycles for mispredicted branch. 18 // Determined via a mix of micro-arch details and experimentation. 19 let LoopMicroOpBufferSize = 128; 20 let PostRAScheduler = 1; // Using PostRA sched. 21 let CompleteModel = 1; 22 23 list<Predicate> UnsupportedFeatures = 24 [HasSVE2, HasSVE2AES, HasSVE2SM4, HasSVE2SHA3, HasSVE2BitPerm, HasPAuth]; 25 26 let FullInstRWOverlapCheck = 0; 27} 28 29let SchedModel = A64FXModel in { 30 31// Define the issue ports. 32 33// A64FXIP* 34 35// Port 0 36def A64FXIPFLA : ProcResource<1>; 37 38// Port 1 39def A64FXIPPR : ProcResource<1>; 40 41// Port 2 42def A64FXIPEXA : ProcResource<1>; 43 44// Port 3 45def A64FXIPFLB : ProcResource<1>; 46 47// Port 4 48def A64FXIPEXB : ProcResource<1>; 49 50// Port 5 51def A64FXIPEAGA : ProcResource<1>; 52 53// Port 6 54def A64FXIPEAGB : ProcResource<1>; 55 56// Port 7 57def A64FXIPBR : ProcResource<1>; 58 59// Define groups for the functional units on each issue port. Each group 60// created will be used by a WriteRes later on. 61 62def A64FXGI7 : ProcResGroup<[A64FXIPBR]>; 63 64def A64FXGI0 : ProcResGroup<[A64FXIPFLA]>; 65 66def A64FXGI1 : ProcResGroup<[A64FXIPPR]>; 67 68def A64FXGI2 : ProcResGroup<[A64FXIPEXA]>; 69 70def A64FXGI3 : ProcResGroup<[A64FXIPFLB]>; 71 72def A64FXGI4 : ProcResGroup<[A64FXIPEXB]>; 73 74def A64FXGI5 : ProcResGroup<[A64FXIPEAGA]>; 75 76def A64FXGI6 : ProcResGroup<[A64FXIPEAGB]>; 77 78def A64FXGI03 : ProcResGroup<[A64FXIPFLA, A64FXIPFLB]>; 79 80def A64FXGI01 : ProcResGroup<[A64FXIPFLA, A64FXIPPR]>; 81 82def A64FXGI02 : ProcResGroup<[A64FXIPFLA, A64FXIPEXA]>; 83 84def A64FXGI12 : ProcResGroup<[A64FXIPEXA, A64FXIPPR]>; 85 86def A64FXGI15 : ProcResGroup<[A64FXIPEAGA, A64FXIPPR]>; 87 88def A64FXGI05 : ProcResGroup<[A64FXIPFLA, A64FXIPEAGA]>; 89 90def A64FXGI24 : ProcResGroup<[A64FXIPEXA, A64FXIPEXB]>; 91 92def A64FXGI124 : ProcResGroup<[A64FXIPEXA, A64FXIPEXB, A64FXIPPR]>; 93 94def A64FXGI056 : ProcResGroup<[A64FXIPFLA, A64FXIPEAGA, A64FXIPEAGB]>; 95 96def A64FXGI0256 : ProcResGroup<[A64FXIPFLA, A64FXIPEXA, A64FXIPEAGA, A64FXIPEAGB]>; 97 98def A64FXGI56 : ProcResGroup<[A64FXIPEAGA, A64FXIPEAGB]>; 99 100def A64FXGI2456 : ProcResGroup<[A64FXIPEXA, A64FXIPEXB, A64FXIPEAGA, A64FXIPEAGB]>; 101 102def A64FXAny : ProcResGroup<[A64FXIPFLA, A64FXIPPR, A64FXIPEXA, A64FXIPFLB, 103 A64FXIPEXB, A64FXIPEAGA, A64FXIPEAGB, A64FXIPBR]> { 104 let BufferSize = 60; 105} 106 107def A64FXWrite_6Cyc : SchedWriteRes<[]> { 108 let Latency = 6; 109} 110 111def A64FXWrite_1Cyc_GI7 : SchedWriteRes<[A64FXGI7]> { 112 let Latency = 1; 113} 114 115def A64FXWrite_2Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 116 let Latency = 2; 117} 118 119def A64FXWrite_4Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 120 let Latency = 4; 121} 122 123def A64FXWrite_5Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 124 let Latency = 5; 125} 126 127def A64FXWrite_6Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 128 let Latency = 6; 129} 130 131def A64FXWrite_8Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 132 let Latency = 8; 133} 134 135def A64FXWrite_9Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 136 let Latency = 9; 137} 138 139def A64FXWrite_13Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 140 let Latency = 13; 141} 142 143def A64FXWrite_37Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 144 let Latency = 37; 145} 146 147def A64FXWrite_98Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 148 let Latency = 98; 149} 150 151def A64FXWrite_134Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 152 let Latency = 134; 153} 154 155def A64FXWrite_154Cyc_GI0 : SchedWriteRes<[A64FXGI0]> { 156 let Latency = 154; 157} 158 159def A64FXWrite_4Cyc_GI01 : SchedWriteRes<[A64FXGI01]> { 160 let Latency = 4; 161} 162 163def A64FXWrite_6Cyc_GI01 : SchedWriteRes<[A64FXGI01]> { 164 let Latency = 6; 165} 166 167def A64FXWrite_8Cyc_GI01 : SchedWriteRes<[A64FXGI01]> { 168 let Latency = 8; 169} 170 171def A64FXWrite_12Cyc_GI01 : SchedWriteRes<[A64FXGI01]> { 172 let Latency = 12; 173} 174 175def A64FXWrite_10Cyc_GI02 : SchedWriteRes<[A64FXGI02]> { 176 let Latency = 10; 177} 178 179def A64FXWrite_17Cyc_GI02 : SchedWriteRes<[A64FXGI02]> { 180 let Latency = 17; 181} 182 183def A64FXWrite_21Cyc_GI02 : SchedWriteRes<[A64FXGI02]> { 184 let Latency = 21; 185} 186 187def A64FXWrite_3Cyc_GI1 : SchedWriteRes<[A64FXGI1]> { 188 let Latency = 3; 189} 190 191def A64FXWrite_6Cyc_NGI1 : SchedWriteRes<[A64FXGI1]> { 192 let Latency = 3; 193 let NumMicroOps = 2; 194} 195 196def A64FXWrite_4Cyc_GI12 : SchedWriteRes<[A64FXGI12]> { 197 let Latency = 4; 198} 199 200def A64FXWrite_3Cyc_GI2 : SchedWriteRes<[A64FXGI2]> { 201 let Latency = 3; 202} 203 204def A64FXWrite_5Cyc_GI2 : SchedWriteRes<[A64FXGI2]> { 205 let Latency = 5; 206} 207 208def A64FXWrite_6Cyc_GI2 : SchedWriteRes<[A64FXGI2]> { 209 let Latency = 6; 210} 211 212def A64FXWrite_4Cyc_GI3 : SchedWriteRes<[A64FXGI3]> { 213 let Latency = 4; 214} 215 216def A64FXWrite_6Cyc_GI3 : SchedWriteRes<[A64FXGI3]> { 217 let Latency = 6; 218} 219 220def A64FXWrite_6Cyc_GI15 : SchedWriteRes<[A64FXGI15]> { 221 let Latency = 6; 222} 223 224def A64FXWrite_3Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 225 let Latency = 3; 226} 227 228def A64FXWrite_4Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 229 let Latency = 4; 230} 231 232def A64FXWrite_6Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 233 let Latency = 6; 234} 235 236def A64FXWrite_8Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 237 let Latency = 8; 238} 239 240def A64FXWrite_9Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 241 let Latency = 9; 242} 243 244def A64FXWrite_10Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 245 let Latency = 10; 246} 247 248def A64FXWrite_12Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 249 let Latency = 12; 250} 251 252def A64FXWrite_14Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 253 let Latency = 14; 254} 255 256def A64FXWrite_15Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 257 let Latency = 15; 258} 259 260def A64FXWrite_15Cyc_NGI03 : SchedWriteRes<[A64FXGI03]> { 261 let Latency = 15; 262 let NumMicroOps = 2; 263} 264 265def A64FXWrite_18Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 266 let Latency = 18; 267} 268 269def A64FXWrite_45Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 270 let Latency = 45; 271} 272 273def A64FXWrite_60Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 274 let Latency = 60; 275} 276 277def A64FXWrite_75Cyc_GI03 : SchedWriteRes<[A64FXGI03]> { 278 let Latency = 75; 279} 280 281def A64FXWrite_6Cyc_GI05 : SchedWriteRes<[A64FXGI05]> { 282 let Latency = 6; 283} 284 285def A64FXWrite_10Cyc_GI4 : SchedWriteRes<[A64FXGI4]> { 286 let Latency = 10; 287} 288 289def A64FXWrite_12Cyc_GI4 : SchedWriteRes<[A64FXGI4]> { 290 let Latency = 12; 291} 292 293def A64FXWrite_20Cyc_GI4 : SchedWriteRes<[A64FXGI4]> { 294 let Latency = 20; 295} 296 297def A64FXWrite_5Cyc_GI5 : SchedWriteRes<[A64FXGI5]> { 298 let Latency = 5; 299} 300 301def A64FXWrite_11Cyc_GI5 : SchedWriteRes<[A64FXGI5]> { 302 let Latency = 11; 303} 304 305def A64FXWrite_5Cyc_GI6 : SchedWriteRes<[A64FXGI6]> { 306 let Latency = 5; 307} 308 309def A64FXWrite_1Cyc_GI24 : SchedWriteRes<[A64FXGI24]> { 310 let Latency = 1; 311} 312 313def A64FXWrite_2Cyc_GI24 : SchedWriteRes<[A64FXGI24]> { 314 let Latency = 2; 315} 316 317def A64FXWrite_4Cyc_NGI24 : SchedWriteRes<[A64FXGI24]> { 318 let Latency = 4; 319 let NumMicroOps = 4; 320} 321 322def A64FXWrite_6Cyc_GI124: SchedWriteRes<[A64FXGI124]> { 323 let Latency = 6; 324} 325 326def A64FXWrite_8Cyc_GI124 : SchedWriteRes<[A64FXGI124]> { 327 let Latency = 8; 328 let NumMicroOps = 2; 329} 330 331def A64FXWrite_6Cyc_GI56 : SchedWriteRes<[A64FXGI56]> { 332 let Latency = 0; 333} 334 335def A64FXWrite_1Cyc_GI56 : SchedWriteRes<[A64FXGI56]> { 336 let Latency = 1; 337} 338 339def A64FXWrite_5Cyc_GI56 : SchedWriteRes<[A64FXGI56]> { 340 let Latency = 5; 341} 342 343def A64FXWrite_8Cyc_GI56 : SchedWriteRes<[A64FXGI56]> { 344 let Latency = 8; 345} 346 347def A64FXWrite_11Cyc_GI56 : SchedWriteRes<[A64FXGI56]> { 348 let Latency = 11; 349} 350 351def A64FXWrite_44Cyc_GI56 : SchedWriteRes<[A64FXGI56]> { 352 let Latency = 44; 353} 354 355def A64FXWrite_10Cyc_GI056 : SchedWriteRes<[A64FXGI056]> { 356 let Latency = 10; 357} 358 359def A64FXWrite_15Cyc_GI056 : SchedWriteRes<[A64FXGI056]> { 360 let Latency = 15; 361} 362 363def A64FXWrite_19Cyc_GI056 : SchedWriteRes<[A64FXGI056]> { 364 let Latency = 19; 365} 366 367def A64FXWrite_25Cyc_GI056 : SchedWriteRes<[A64FXGI056]> { 368 let Latency = 25; 369} 370 371def A64FXWrite_14Cyc_GI0256 : SchedWriteRes<[A64FXGI0256]> { 372 let Latency = 14; 373} 374 375def A64FXWrite_19Cyc_GI0256 : SchedWriteRes<[A64FXGI0256]> { 376 let Latency = 19; 377} 378 379def A64FXWrite_29Cyc_GI0256 : SchedWriteRes<[A64FXGI0256]> { 380 let Latency = 29; 381} 382 383def A64FXWrite_LDNP: SchedWriteRes<[A64FXGI56]> { 384 let Latency = 5; 385 let NumMicroOps = 2; 386} 387 388def A64FXWrite_LDP01: SchedWriteRes<[A64FXGI2456]> { 389 let Latency = 5; 390 let NumMicroOps = 3; 391} 392 393def A64FXWrite_LDR01: SchedWriteRes<[A64FXGI2456]> { 394 let Latency = 5; 395 let NumMicroOps = 2; 396} 397 398def A64FXWrite_LD102: SchedWriteRes<[A64FXGI56]> { 399 let Latency = 8; 400 let NumMicroOps = 2; 401} 402 403def A64FXWrite_LD103: SchedWriteRes<[A64FXGI56]> { 404 let Latency = 11; 405 let NumMicroOps = 2; 406 407} 408 409def A64FXWrite_LD104: SchedWriteRes<[A64FXGI56]> { 410 let Latency = 8; 411 let NumMicroOps = 3; 412} 413 414def A64FXWrite_LD105: SchedWriteRes<[A64FXGI56]> { 415 let Latency = 11; 416 let NumMicroOps = 3; 417} 418 419def A64FXWrite_LD106: SchedWriteRes<[A64FXGI56]> { 420 let Latency = 8; 421 let NumMicroOps = 4; 422} 423 424def A64FXWrite_LD107: SchedWriteRes<[A64FXGI56]> { 425 let Latency = 11; 426 let NumMicroOps = 4; 427} 428 429def A64FXWrite_LD108: SchedWriteRes<[A64FXGI56]> { 430 let Latency = 8; 431 let NumMicroOps = 2; 432} 433 434def A64FXWrite_LD109: SchedWriteRes<[A64FXGI56]> { 435 let Latency = 11; 436 let NumMicroOps = 2; 437} 438 439def A64FXWrite_LD110: SchedWriteRes<[A64FXGI56]> { 440 let Latency = 8; 441 let NumMicroOps = 3; 442} 443 444def A64FXWrite_LD111: SchedWriteRes<[A64FXGI56]> { 445 let Latency = 11; 446 let NumMicroOps = 3; 447} 448 449def A64FXWrite_LD112: SchedWriteRes<[A64FXGI56]> { 450 let Latency = 8; 451 let NumMicroOps = 4; 452} 453 454def A64FXWrite_LD113: SchedWriteRes<[A64FXGI56]> { 455 let Latency = 11; 456 let NumMicroOps = 4; 457} 458 459def A64FXWrite_LD114: SchedWriteRes<[A64FXGI56]> { 460 let Latency = 8; 461 let NumMicroOps = 5; 462} 463 464def A64FXWrite_LD115: SchedWriteRes<[A64FXGI56]> { 465 let Latency = 11; 466 let NumMicroOps = 5; 467} 468 469def A64FXWrite_LD1I0: SchedWriteRes<[A64FXGI056]> { 470 let Latency = 8; 471 let NumMicroOps = 2; 472} 473 474def A64FXWrite_LD1I1: SchedWriteRes<[A64FXGI056]> { 475 let Latency = 8; 476 let NumMicroOps = 3; 477} 478 479def A64FXWrite_LD2I0: SchedWriteRes<[A64FXGI056]> { 480 let Latency = 8; 481 let NumMicroOps = 4; 482} 483 484def A64FXWrite_LD2I1: SchedWriteRes<[A64FXGI056]> { 485 let Latency = 8; 486 let NumMicroOps = 5; 487} 488 489def A64FXWrite_LD3I0: SchedWriteRes<[A64FXGI056]> { 490 let Latency = 8; 491 let NumMicroOps = 6; 492} 493 494def A64FXWrite_LD3I1: SchedWriteRes<[A64FXGI056]> { 495 let Latency = 8; 496 let NumMicroOps = 7; 497} 498 499def A64FXWrite_LD4I0: SchedWriteRes<[A64FXGI056]> { 500 let Latency = 8; 501 let NumMicroOps = 8; 502} 503 504def A64FXWrite_LD4I1: SchedWriteRes<[A64FXGI056]> { 505 let Latency = 8; 506 let NumMicroOps = 9; 507} 508 509def A64FXWrite_1Cyc_GI2456 : SchedWriteRes<[A64FXGI2456]> { 510 let Latency = 1; 511} 512 513def A64FXWrite_FMOV_GV : SchedWriteRes<[A64FXGI03]> { 514 let Latency = 10; 515} 516 517def A64FXWrite_FMOV_VG14 : SchedWriteRes<[A64FXGI03]> { 518 let Latency = 14; 519} 520 521def A64FXWrite_FMOV_VG : SchedWriteRes<[A64FXGI03]> { 522 let Latency = 25; 523} 524 525def A64FXWrite_ADDLV : SchedWriteRes<[A64FXGI03]> { 526 let Latency = 12; 527} 528 529def A64FXWrite_MULLE : SchedWriteRes<[A64FXGI03]> { 530 let Latency = 14; 531} 532 533def A64FXWrite_MULLV : SchedWriteRes<[A64FXGI03]> { 534 let Latency = 14; 535} 536 537def A64FXWrite_MADDL : SchedWriteRes<[A64FXGI03]> { 538 let Latency = 6; 539} 540 541def A64FXWrite_ABA : SchedWriteRes<[A64FXGI03]> { 542 let Latency = 8; 543} 544 545def A64FXWrite_ABAL : SchedWriteRes<[A64FXGI03]> { 546 let Latency = 10; 547} 548 549def A64FXWrite_ADDLV1 : SchedWriteRes<[A64FXGI03]> { 550 let Latency = 12; 551 let NumMicroOps = 6; 552} 553 554def A64FXWrite_MINMAXV : SchedWriteRes<[A64FXGI03]> { 555 let Latency = 14; 556 let NumMicroOps = 6; 557} 558 559def A64FXWrite_SQRDMULH : SchedWriteRes<[A64FXGI03]> { 560 let Latency = 9; 561} 562 563def A64FXWrite_PMUL : SchedWriteRes<[A64FXGI03]> { 564 let Latency = 8; 565} 566 567 568def A64FXWrite_SRSRAV : SchedWriteRes<[A64FXGI03]> { 569 let Latency = 8; 570 let NumMicroOps = 3; 571} 572 573def A64FXWrite_SSRAV : SchedWriteRes<[A64FXGI03]> { 574 let Latency = 8; 575 let NumMicroOps = 2; 576} 577 578def A64FXWrite_RSHRN : SchedWriteRes<[A64FXGI03]> { 579 let Latency = 10; 580 let NumMicroOps = 3; 581} 582 583def A64FXWrite_SHRN : SchedWriteRes<[A64FXGI03]> { 584 let Latency = 10; 585 let NumMicroOps = 2; 586} 587 588 589def A64FXWrite_ADDP : SchedWriteRes<[A64FXGI03]> { 590 let Latency = 10; 591 let NumMicroOps = 3; 592} 593 594def A64FXWrite_FMULXE : SchedWriteRes<[A64FXGI03]> { 595 let Latency = 15; 596 let NumMicroOps = 2; 597} 598 599def A64FXWrite_FADDPV : SchedWriteRes<[A64FXGI03]> { 600 let Latency = 15; 601 let NumMicroOps = 3; 602} 603 604def A64FXWrite_SADALP : SchedWriteRes<[A64FXGI03]> { 605 let Latency = 10; 606 let NumMicroOps = 3; 607} 608 609def A64FXWrite_SADDLP : SchedWriteRes<[A64FXGI03]> { 610 let Latency = 10; 611 let NumMicroOps = 2; 612} 613 614def A64FXWrite_FCVTXNV : SchedWriteRes<[A64FXGI03]> { 615 let Latency = 15; 616 let NumMicroOps = 2; 617} 618 619def A64FXWrite_FMAXVVH : SchedWriteRes<[A64FXGI03]> { 620 let Latency = 14; 621 let NumMicroOps = 7; 622} 623 624def A64FXWrite_FMAXVVS : SchedWriteRes<[A64FXGI03]> { 625 let Latency = 14; 626} 627 628def A64FXWrite_BIF : SchedWriteRes<[A64FXGI03]> { 629 let Latency = 5; 630} 631 632def A64FXWrite_DUPGENERAL : SchedWriteRes<[A64FXGI03]> { 633 let Latency = 10; 634} 635 636def A64FXWrite_SHA00 : SchedWriteRes<[A64FXGI0]> { 637 let Latency = 9; 638} 639 640def A64FXWrite_SHA01 : SchedWriteRes<[A64FXGI0]> { 641 let Latency = 12; 642} 643 644def A64FXWrite_SMOV : SchedWriteRes<[A64FXGI03]> { 645 let Latency = 25; 646} 647 648def A64FXWrite_TBX1 : SchedWriteRes<[A64FXGI03]> { 649 let Latency = 10; 650 let NumMicroOps = 3; 651} 652 653def A64FXWrite_TBX2 : SchedWriteRes<[A64FXGI03]> { 654 let Latency = 10; 655 let NumMicroOps = 5; 656} 657 658def A64FXWrite_TBX3 : SchedWriteRes<[A64FXGI03]> { 659 let Latency = 10; 660 let NumMicroOps = 7; 661} 662 663def A64FXWrite_TBX4 : SchedWriteRes<[A64FXGI03]> { 664 let Latency = 10; 665 let NumMicroOps = 9; 666} 667 668def A64FXWrite_PREF0: SchedWriteRes<[A64FXGI56]> { 669 let Latency = 0; 670} 671 672def A64FXWrite_PREF1: SchedWriteRes<[A64FXGI56]> { 673 let Latency = 0; 674} 675 676def A64FXWrite_SWP: SchedWriteRes<[A64FXGI56]> { 677 let Latency = 0; 678} 679 680def A64FXWrite_STUR: SchedWriteRes<[A64FXGI56]> { 681 let Latency = 0; 682} 683 684def A64FXWrite_STNP: SchedWriteRes<[A64FXGI56]> { 685 let Latency = 0; 686} 687 688def A64FXWrite_STP01: SchedWriteRes<[A64FXGI56]> { 689 let Latency = 0; 690} 691 692def A64FXWrite_ST10: SchedWriteRes<[A64FXGI56]> { 693 let Latency = 0; 694} 695 696def A64FXWrite_ST11: SchedWriteRes<[A64FXGI56]> { 697 let Latency = 0; 698} 699 700def A64FXWrite_ST12: SchedWriteRes<[A64FXGI56]> { 701 let Latency = 0; 702} 703 704def A64FXWrite_ST13: SchedWriteRes<[A64FXGI56]> { 705 let Latency = 0; 706} 707 708def A64FXWrite_ST14: SchedWriteRes<[A64FXGI56]> { 709 let Latency = 1; 710} 711 712def A64FXWrite_ST15: SchedWriteRes<[A64FXGI56]> { 713 let Latency = 1; 714} 715 716def A64FXWrite_ST16: SchedWriteRes<[A64FXGI56]> { 717 let Latency = 1; 718} 719 720def A64FXWrite_ST17: SchedWriteRes<[A64FXGI56]> { 721 let Latency = 1; 722} 723 724def A64FXWrite_ST1W_6: SchedWriteRes<[A64FXGI056]> { 725 let Latency = 6; 726} 727 728def A64FXWrite_ST2W_7: SchedWriteRes<[A64FXGI056]> { 729 let Latency = 7; 730} 731 732def A64FXWrite_ST3W_8: SchedWriteRes<[A64FXGI056]> { 733 let Latency = 8; 734} 735 736def A64FXWrite_ST4W_9: SchedWriteRes<[A64FXGI056]> { 737 let Latency = 9; 738} 739 740def A64FXWrite_ST1W_15: SchedWriteRes<[A64FXGI056]> { 741 let Latency = 15; 742} 743 744def A64FXWrite_ST1W_19: SchedWriteRes<[A64FXGI056]> { 745 let Latency = 19; 746} 747 748def A64FXWrite_CAS: SchedWriteRes<[A64FXGI56]> { 749 let Latency = 7; 750} 751 752// Define commonly used read types. 753 754// No forwarding is provided for these types. 755def : ReadAdvance<ReadI, 0>; 756def : ReadAdvance<ReadISReg, 0>; 757def : ReadAdvance<ReadIEReg, 0>; 758def : ReadAdvance<ReadIM, 0>; 759def : ReadAdvance<ReadIMA, 0>; 760def : ReadAdvance<ReadID, 0>; 761def : ReadAdvance<ReadExtrHi, 0>; 762def : ReadAdvance<ReadAdrBase, 0>; 763def : ReadAdvance<ReadVLD, 0>; 764 765//===----------------------------------------------------------------------===// 766// 3. Instruction Tables. 767 768//--- 769// 3.1 Branch Instructions 770//--- 771 772// Branch, immed 773// Branch and link, immed 774// Compare and branch 775def : WriteRes<WriteBr, [A64FXGI7]> { 776 let Latency = 1; 777} 778 779// Branch, register 780// Branch and link, register != LR 781// Branch and link, register = LR 782def : WriteRes<WriteBrReg, [A64FXGI7]> { 783 let Latency = 1; 784} 785 786def : WriteRes<WriteSys, []> { let Latency = 1; } 787def : WriteRes<WriteBarrier, []> { let Latency = 1; } 788def : WriteRes<WriteHint, []> { let Latency = 1; } 789 790def : WriteRes<WriteAtomic, []> { 791 let Latency = 4; 792} 793 794//--- 795// Branch 796//--- 797def : InstRW<[A64FXWrite_1Cyc_GI7], (instrs B, BL, BR, BLR)>; 798def : InstRW<[A64FXWrite_1Cyc_GI7], (instrs RET)>; 799def : InstRW<[A64FXWrite_1Cyc_GI7], (instregex "^B..$")>; 800def : InstRW<[A64FXWrite_1Cyc_GI7], 801 (instregex "^CBZ", "^CBNZ", "^TBZ", "^TBNZ")>; 802 803//--- 804// 3.2 Arithmetic and Logical Instructions 805// 3.3 Move and Shift Instructions 806//--- 807 808// ALU, basic 809// Conditional compare 810// Conditional select 811// Address generation 812def : WriteRes<WriteI, [A64FXGI2456]> { 813 let Latency = 1; 814 let ResourceCycles = [1]; 815} 816 817def : InstRW<[WriteI], 818 (instregex "ADD?(W|X)r(i|r|s|x)", "ADDS?(W|X)r(i|r|s|x)(64)?", 819 "AND?(W|X)r(i|r|s|x)", "ANDS?(W|X)r(i|r|s|x)", 820 "ADC(W|X)r", 821 "BIC?(W|X)r(i|r|s|x)", "BICS?(W|X)r(i|r|s|x)", 822 "EON?(W|X)r(i|r|s|x)", "ORN?(W|X)r(i|r|s|x)", 823 "ORR?(W|X)r(i|r|s|x)", "SUB?(W|X)r(i|r|s|x)", 824 "SUBS?(W|X)r(i|r|s|x)", "SBC(W|X)r", 825 "SBCS(W|X)r", "CCMN(W|X)(i|r)", 826 "CCMP(W|X)(i|r)", "CSEL(W|X)r", 827 "CSINC(W|X)r", "CSINV(W|X)r", 828 "CSNEG(W|X)r")>; 829 830def : InstRW<[WriteI], (instrs COPY)>; 831 832// ALU, extend and/or shift 833def : WriteRes<WriteISReg, [A64FXGI2456]> { 834 let Latency = 2; 835 let ResourceCycles = [1]; 836} 837 838def : InstRW<[WriteISReg], 839 (instregex "ADD?(W|X)r(i|r|s|x)", "ADDS?(W|X)r(i|r|s|x)(64)?", 840 "AND?(W|X)r(i|r|s|x)", "ANDS?(W|X)r(i|r|s|x)", 841 "ADC(W|X)r", 842 "BIC?(W|X)r(i|r|s|x)", "BICS?(W|X)r(i|r|s|x)", 843 "EON?(W|X)r(i|r|s|x)", "ORN?(W|X)r(i|r|s|x)", 844 "ORR?(W|X)r(i|r|s|x)", "SUB?(W|X)r(i|r|s|x)", 845 "SUBS?(W|X)r(i|r|s|x)", "SBC(W|X)r", 846 "SBCS(W|X)r", "CCMN(W|X)(i|r)", 847 "CCMP(W|X)(i|r)", "CSEL(W|X)r", 848 "CSINC(W|X)r", "CSINV(W|X)r", 849 "CSNEG(W|X)r")>; 850 851def : WriteRes<WriteIEReg, [A64FXGI2456]> { 852 let Latency = 1; 853 let ResourceCycles = [1]; 854} 855 856def : InstRW<[WriteIEReg], 857 (instregex "ADD?(W|X)r(i|r|s|x)", "ADDS?(W|X)r(i|r|s|x)(64)?", 858 "AND?(W|X)r(i|r|s|x)", "ANDS?(W|X)r(i|r|s|x)", 859 "ADC(W|X)r", 860 "BIC?(W|X)r(i|r|s|x)", "BICS?(W|X)r(i|r|s|x)", 861 "EON?(W|X)r(i|r|s|x)", "ORN?(W|X)r(i|r|s|x)", 862 "ORR?(W|X)r(i|r|s|x)", "SUB?(W|X)r(i|r|s|x)", 863 "SUBS?(W|X)r(i|r|s|x)", "SBC(W|X)r", 864 "SBCS(W|X)r", "CCMN(W|X)(i|r)", 865 "CCMP(W|X)(i|r)", "CSEL(W|X)r", 866 "CSINC(W|X)r", "CSINV(W|X)r", 867 "CSNEG(W|X)r")>; 868 869// Move immed 870def : WriteRes<WriteImm, [A64FXGI2456]> { 871 let Latency = 1; 872 let ResourceCycles = [1]; 873} 874 875def : InstRW<[A64FXWrite_1Cyc_GI2456], 876 (instrs MOVKWi, MOVKXi, MOVNWi, MOVNXi, MOVZWi, MOVZXi)>; 877 878def : InstRW<[A64FXWrite_2Cyc_GI24], 879 (instrs ASRVWr, ASRVXr, LSLVWr, LSLVXr, RORVWr, RORVXr)>; 880 881// Variable shift 882def : WriteRes<WriteIS, [A64FXGI2456]> { 883 let Latency = 1; 884 let ResourceCycles = [1]; 885} 886 887//--- 888// 3.4 Divide and Multiply Instructions 889//--- 890 891// Divide, W-form 892def : WriteRes<WriteID32, [A64FXGI4]> { 893 let Latency = 39; 894 let ResourceCycles = [39]; 895} 896 897// Divide, X-form 898def : WriteRes<WriteID64, [A64FXGI4]> { 899 let Latency = 23; 900 let ResourceCycles = [23]; 901} 902 903// Multiply accumulate, W-form 904def : WriteRes<WriteIM32, [A64FXGI2456]> { 905 let Latency = 5; 906 let ResourceCycles = [1]; 907} 908 909// Multiply accumulate, X-form 910def : WriteRes<WriteIM64, [A64FXGI2456]> { 911 let Latency = 5; 912 let ResourceCycles = [1]; 913} 914 915def : InstRW<[WriteIM32], (instrs MADDWrrr, MSUBWrrr)>; 916def : InstRW<[WriteIM32], (instrs MADDXrrr, MSUBXrrr)>; 917def : InstRW<[A64FXWrite_MADDL], 918 (instregex "(S|U)(MADDL|MSUBL)rrr")>; 919 920def : InstRW<[WriteID32], (instrs SDIVWr, UDIVWr)>; 921def : InstRW<[WriteID64], (instrs SDIVXr, UDIVXr)>; 922 923// Bitfield extract, two reg 924def : WriteRes<WriteExtr, [A64FXGI2456]> { 925 let Latency = 1; 926 let ResourceCycles = [1]; 927} 928 929// Multiply high 930def : InstRW<[A64FXWrite_5Cyc_GI2], (instrs SMULHrr, UMULHrr)>; 931 932// Miscellaneous Data-Processing Instructions 933// Bitfield extract 934def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs EXTRWrri, EXTRXrri)>; 935 936// Bitifield move - basic 937def : InstRW<[A64FXWrite_1Cyc_GI24], 938 (instrs SBFMWri, SBFMXri, UBFMWri, UBFMXri)>; 939 940// Bitfield move, insert 941def : InstRW<[A64FXWrite_4Cyc_NGI24], (instregex "^BFM")>; 942def : InstRW<[A64FXWrite_1Cyc_GI24], (instregex "(S|U)?BFM.*")>; 943 944// Count leading 945def : InstRW<[A64FXWrite_2Cyc_GI0], (instregex "^CLS(W|X)r$", 946 "^CLZ(W|X)r$")>; 947 948// Reverse bits 949def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs RBITWr, RBITXr)>; 950 951// Cryptography Extensions 952def : InstRW<[A64FXWrite_8Cyc_GI0], (instregex "^AES[DE]")>; 953def : InstRW<[A64FXWrite_8Cyc_GI0], (instregex "^AESI?MC")>; 954def : InstRW<[A64FXWrite_8Cyc_GI0], (instregex "^PMULL")>; 955def : InstRW<[A64FXWrite_SHA00], (instregex "^SHA1SU0")>; 956def : InstRW<[A64FXWrite_8Cyc_GI0], (instregex "^SHA1(H|SU1)")>; 957def : InstRW<[A64FXWrite_SHA01], (instregex "^SHA1[CMP]")>; 958def : InstRW<[A64FXWrite_8Cyc_GI0], (instregex "^SHA256SU0")>; 959def : InstRW<[A64FXWrite_8Cyc_GI0], (instregex "^SHA256SU1")>; 960def : InstRW<[A64FXWrite_SHA01], (instregex "^SHA256(H|H2)")>; 961 962// CRC Instructions 963def : InstRW<[A64FXWrite_10Cyc_GI4], (instrs CRC32Brr, CRC32Hrr)>; 964def : InstRW<[A64FXWrite_12Cyc_GI4], (instrs CRC32Wrr)>; 965def : InstRW<[A64FXWrite_20Cyc_GI4], (instrs CRC32Xrr)>; 966 967def : InstRW<[A64FXWrite_10Cyc_GI4], (instrs CRC32CBrr, CRC32CHrr)>; 968def : InstRW<[A64FXWrite_12Cyc_GI4], (instrs CRC32CWrr)>; 969def : InstRW<[A64FXWrite_20Cyc_GI4], (instrs CRC32CXrr)>; 970 971// Reverse bits/bytes 972// NOTE: Handled by WriteI. 973 974//--- 975// 3.6 Load Instructions 976// 3.10 FP Load Instructions 977//--- 978 979// Load register, literal 980// Load register, unscaled immed 981// Load register, immed unprivileged 982// Load register, unsigned immed 983def : WriteRes<WriteLD, [A64FXGI56]> { 984 let Latency = 4; 985 let ResourceCycles = [3]; 986} 987 988// Load register, immed post-index 989// NOTE: Handled by WriteLD, WriteI. 990// Load register, immed pre-index 991// NOTE: Handled by WriteLD, WriteAdr. 992def : WriteRes<WriteAdr, [A64FXGI2456]> { 993 let Latency = 1; 994 let ResourceCycles = [1]; 995} 996 997// Load pair, immed offset, normal 998// Load pair, immed offset, signed words, base != SP 999// Load pair, immed offset signed words, base = SP 1000// LDP only breaks into *one* LS micro-op. Thus 1001// the resources are handled by WriteLD. 1002def : WriteRes<WriteLDHi, []> { 1003 let Latency = 5; 1004} 1005 1006// Load register offset, basic 1007// Load register, register offset, scale by 4/8 1008// Load register, register offset, scale by 2 1009// Load register offset, extend 1010// Load register, register offset, extend, scale by 4/8 1011// Load register, register offset, extend, scale by 2 1012def A64FXWriteLDIdx : SchedWriteVariant<[ 1013 SchedVar<ScaledIdxPred, [A64FXWrite_1Cyc_GI56]>, 1014 SchedVar<NoSchedPred, [A64FXWrite_1Cyc_GI56]>]>; 1015def : SchedAlias<WriteLDIdx, A64FXWriteLDIdx>; 1016 1017def A64FXReadAdrBase : SchedReadVariant<[ 1018 SchedVar<ScaledIdxPred, [ReadDefault]>, 1019 SchedVar<NoSchedPred, [ReadDefault]>]>; 1020def : SchedAlias<ReadAdrBase, A64FXReadAdrBase>; 1021 1022// Load pair, immed pre-index, normal 1023// Load pair, immed pre-index, signed words 1024// Load pair, immed post-index, normal 1025// Load pair, immed post-index, signed words 1026// NOTE: Handled by WriteLD, WriteLDHi, WriteAdr. 1027 1028def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDNPDi)>; 1029def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDNPQi)>; 1030def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDNPSi)>; 1031def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDNPWi)>; 1032def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDNPXi)>; 1033 1034def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDPDi)>; 1035def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDPQi)>; 1036def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDPSi)>; 1037def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDPSWi)>; 1038def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDPWi)>; 1039def : InstRW<[A64FXWrite_LDNP, WriteLDHi], (instrs LDPXi)>; 1040 1041def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDRBui)>; 1042def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDRDui)>; 1043def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDRHui)>; 1044def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDRQui)>; 1045def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDRSui)>; 1046 1047def : InstRW<[A64FXWrite_5Cyc_GI6], (instrs LDRDl)>; 1048def : InstRW<[A64FXWrite_5Cyc_GI6], (instrs LDRQl)>; 1049def : InstRW<[A64FXWrite_5Cyc_GI6], (instrs LDRWl)>; 1050def : InstRW<[A64FXWrite_5Cyc_GI6], (instrs LDRXl)>; 1051 1052def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDTRBi)>; 1053def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDTRHi)>; 1054def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDTRWi)>; 1055def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDTRXi)>; 1056 1057def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDTRSBWi)>; 1058def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDTRSBXi)>; 1059def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDTRSHWi)>; 1060def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDTRSHXi)>; 1061def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDTRSWi)>; 1062 1063def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1064 (instrs LDPDpre)>; 1065def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1066 (instrs LDPQpre)>; 1067def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1068 (instrs LDPSpre)>; 1069def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1070 (instrs LDPWpre)>; 1071def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1072 (instrs LDPWpre)>; 1073 1074def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRBpre)>; 1075def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRDpre)>; 1076def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRHpre)>; 1077def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRQpre)>; 1078def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSpre)>; 1079def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRWpre)>; 1080def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRXpre)>; 1081 1082def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSBWpre)>; 1083def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSBXpre)>; 1084def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSBWpost)>; 1085def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSBXpost)>; 1086 1087def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSHWpre)>; 1088def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSHXpre)>; 1089def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSHWpost)>; 1090def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSHXpost)>; 1091 1092def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRBBpre)>; 1093def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRBBpost)>; 1094 1095def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRHHpre)>; 1096def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRHHpost)>; 1097 1098def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1099 (instrs LDPDpost)>; 1100def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1101 (instrs LDPQpost)>; 1102def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1103 (instrs LDPSpost)>; 1104def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1105 (instrs LDPWpost)>; 1106def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1107 (instrs LDPXpost)>; 1108 1109def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRBpost)>; 1110def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRDpost)>; 1111def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRHpost)>; 1112def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRQpost)>; 1113def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRSpost)>; 1114def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRWpost)>; 1115def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRXpost)>; 1116 1117def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1118 (instrs LDPDpre)>; 1119def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1120 (instrs LDPQpre)>; 1121def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1122 (instrs LDPSpre)>; 1123def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1124 (instrs LDPWpre)>; 1125def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1126 (instrs LDPXpre)>; 1127 1128def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRBpre)>; 1129def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRDpre)>; 1130def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRHpre)>; 1131def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRQpre)>; 1132def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRSpre)>; 1133def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRWpre)>; 1134def : InstRW<[A64FXWrite_LDR01, WriteAdr], (instrs LDRXpre)>; 1135 1136def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1137 (instrs LDPDpost)>; 1138def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1139 (instrs LDPQpost)>; 1140def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1141 (instrs LDPSpost)>; 1142def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1143 (instrs LDPWpost)>; 1144def : InstRW<[A64FXWrite_LDP01, WriteLDHi, WriteAdr], 1145 (instrs LDPXpost)>; 1146 1147def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRBpost)>; 1148def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRDpost)>; 1149def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRHpost)>; 1150def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRQpost)>; 1151def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRSpost)>; 1152def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRWpost)>; 1153def : InstRW<[A64FXWrite_LDR01, WriteI], (instrs LDRXpost)>; 1154 1155def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRBroW)>; 1156def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRDroW)>; 1157def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRHroW)>; 1158def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRHHroW)>; 1159def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRQroW)>; 1160def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRSroW)>; 1161def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRSHWroW)>; 1162def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRSHXroW)>; 1163def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRWroW)>; 1164def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRXroW)>; 1165 1166def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRBroX)>; 1167def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRDroX)>; 1168def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRHHroX)>; 1169def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRHroX)>; 1170def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRQroX)>; 1171def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRSroX)>; 1172def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRSHWroX)>; 1173def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRSHXroX)>; 1174def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRWroX)>; 1175def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], (instrs LDRXroX)>; 1176 1177def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1178 (instrs LDRBroW)>; 1179def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1180 (instrs LDRBroW)>; 1181def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1182 (instrs LDRDroW)>; 1183def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1184 (instrs LDRHroW)>; 1185def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1186 (instrs LDRHHroW)>; 1187def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1188 (instrs LDRQroW)>; 1189def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1190 (instrs LDRSroW)>; 1191def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1192 (instrs LDRSHWroW)>; 1193def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1194 (instrs LDRSHXroW)>; 1195def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1196 (instrs LDRWroW)>; 1197def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1198 (instrs LDRXroW)>; 1199def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1200 (instrs LDRBroX)>; 1201def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1202 (instrs LDRDroX)>; 1203def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1204 (instrs LDRHroX)>; 1205def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1206 (instrs LDRHHroX)>; 1207def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1208 (instrs LDRQroX)>; 1209def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1210 (instrs LDRSroX)>; 1211def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1212 (instrs LDRSHWroX)>; 1213def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1214 (instrs LDRSHXroX)>; 1215def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1216 (instrs LDRWroX)>; 1217def : InstRW<[A64FXWrite_5Cyc_GI56, ReadAdrBase], 1218 (instrs LDRXroX)>; 1219 1220def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURBi)>; 1221def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURBBi)>; 1222def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURDi)>; 1223def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURHi)>; 1224def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURHHi)>; 1225def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURQi)>; 1226def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURSi)>; 1227def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURXi)>; 1228def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURSBWi)>; 1229def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURSBXi)>; 1230def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURSHWi)>; 1231def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURSHXi)>; 1232def : InstRW<[A64FXWrite_5Cyc_GI56], (instrs LDURSWi)>; 1233 1234//--- 1235// Prefetch 1236//--- 1237def : InstRW<[A64FXWrite_PREF0], (instrs PRFMl)>; 1238def : InstRW<[A64FXWrite_PREF1], (instrs PRFUMi)>; 1239def : InstRW<[A64FXWrite_PREF1], (instrs PRFMui)>; 1240def : InstRW<[A64FXWrite_PREF1], (instrs PRFMroW)>; 1241def : InstRW<[A64FXWrite_PREF1], (instrs PRFMroX)>; 1242 1243//-- 1244// 3.7 Store Instructions 1245// 3.11 FP Store Instructions 1246//-- 1247 1248// Store register, unscaled immed 1249// Store register, immed unprivileged 1250// Store register, unsigned immed 1251def : WriteRes<WriteST, [A64FXGI56]> { 1252 let Latency = 1; 1253} 1254 1255// Store register, immed post-index 1256// NOTE: Handled by WriteAdr, WriteST, ReadAdrBase 1257 1258// Store register, immed pre-index 1259// NOTE: Handled by WriteAdr, WriteST 1260 1261// Store register, register offset, basic 1262// Store register, register offset, scaled by 4/8 1263// Store register, register offset, scaled by 2 1264// Store register, register offset, extend 1265// Store register, register offset, extend, scale by 4/8 1266// Store register, register offset, extend, scale by 1 1267def : WriteRes<WriteSTIdx, [A64FXGI56, A64FXGI2456]> { 1268 let Latency = 1; 1269} 1270 1271// Store pair, immed offset, W-form 1272// Store pair, immed offset, X-form 1273def : WriteRes<WriteSTP, [A64FXGI56]> { 1274 let Latency = 1; 1275} 1276 1277// Store pair, immed post-index, W-form 1278// Store pair, immed post-index, X-form 1279// Store pair, immed pre-index, W-form 1280// Store pair, immed pre-index, X-form 1281// NOTE: Handled by WriteAdr, WriteSTP. 1282 1283def : InstRW<[A64FXWrite_STUR], (instrs STURBi)>; 1284def : InstRW<[A64FXWrite_STUR], (instrs STURBBi)>; 1285def : InstRW<[A64FXWrite_STUR], (instrs STURDi)>; 1286def : InstRW<[A64FXWrite_STUR], (instrs STURHi)>; 1287def : InstRW<[A64FXWrite_STUR], (instrs STURHHi)>; 1288def : InstRW<[A64FXWrite_STUR], (instrs STURQi)>; 1289def : InstRW<[A64FXWrite_STUR], (instrs STURSi)>; 1290def : InstRW<[A64FXWrite_STUR], (instrs STURWi)>; 1291def : InstRW<[A64FXWrite_STUR], (instrs STURXi)>; 1292 1293def : InstRW<[WriteAdr, A64FXWrite_STUR], (instrs STTRBi)>; 1294def : InstRW<[WriteAdr, A64FXWrite_STUR], (instrs STTRHi)>; 1295def : InstRW<[WriteAdr, A64FXWrite_STUR], (instrs STTRWi)>; 1296def : InstRW<[WriteAdr, A64FXWrite_STUR], (instrs STTRXi)>; 1297 1298def : InstRW<[A64FXWrite_STNP], (instrs STNPDi)>; 1299def : InstRW<[A64FXWrite_STNP], (instrs STNPQi)>; 1300def : InstRW<[A64FXWrite_STNP], (instrs STNPXi)>; 1301def : InstRW<[A64FXWrite_STNP], (instrs STNPWi)>; 1302 1303def : InstRW<[A64FXWrite_STNP], (instrs STPDi)>; 1304def : InstRW<[A64FXWrite_STNP], (instrs STPQi)>; 1305def : InstRW<[A64FXWrite_STNP], (instrs STPXi)>; 1306def : InstRW<[A64FXWrite_STNP], (instrs STPWi)>; 1307 1308def : InstRW<[A64FXWrite_STUR], (instrs STRBui)>; 1309def : InstRW<[A64FXWrite_STUR], (instrs STRBui)>; 1310def : InstRW<[A64FXWrite_STUR], (instrs STRDui)>; 1311def : InstRW<[A64FXWrite_STUR], (instrs STRDui)>; 1312def : InstRW<[A64FXWrite_STUR], (instrs STRHui)>; 1313def : InstRW<[A64FXWrite_STUR], (instrs STRHui)>; 1314def : InstRW<[A64FXWrite_STUR], (instrs STRQui)>; 1315def : InstRW<[A64FXWrite_STUR], (instrs STRQui)>; 1316def : InstRW<[A64FXWrite_STUR], (instrs STRXui)>; 1317def : InstRW<[A64FXWrite_STUR], (instrs STRXui)>; 1318def : InstRW<[A64FXWrite_STUR], (instrs STRWui)>; 1319def : InstRW<[A64FXWrite_STUR], (instrs STRWui)>; 1320 1321def : InstRW<[A64FXWrite_STP01], 1322 (instrs STPDpre, STPDpost)>; 1323def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1324 (instrs STPDpre, STPDpost)>; 1325def : InstRW<[A64FXWrite_STP01], 1326 (instrs STPDpre, STPDpost)>; 1327def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1328 (instrs STPDpre, STPDpost)>; 1329def : InstRW<[A64FXWrite_STP01], 1330 (instrs STPQpre, STPQpost)>; 1331def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1332 (instrs STPQpre, STPQpost)>; 1333def : InstRW<[A64FXWrite_STP01], 1334 (instrs STPQpre, STPQpost)>; 1335def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1336 (instrs STPQpre, STPQpost)>; 1337def : InstRW<[A64FXWrite_STP01], 1338 (instrs STPSpre, STPSpost)>; 1339def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1340 (instrs STPSpre, STPSpost)>; 1341def : InstRW<[A64FXWrite_STP01], 1342 (instrs STPSpre, STPSpost)>; 1343def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1344 (instrs STPSpre, STPSpost)>; 1345def : InstRW<[A64FXWrite_STP01], 1346 (instrs STPWpre, STPWpost)>; 1347def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1348 (instrs STPWpre, STPWpost)>; 1349def : InstRW<[A64FXWrite_STP01], 1350 (instrs STPWpre, STPWpost)>; 1351def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1352 (instrs STPWpre, STPWpost)>; 1353def : InstRW<[A64FXWrite_STP01], 1354 (instrs STPXpre, STPXpost)>; 1355def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1356 (instrs STPXpre, STPXpost)>; 1357def : InstRW<[A64FXWrite_STP01], 1358 (instrs STPXpre, STPXpost)>; 1359def : InstRW<[A64FXWrite_STP01, ReadAdrBase], 1360 (instrs STPXpre, STPXpost)>; 1361 1362def : InstRW<[WriteAdr, A64FXWrite_STP01], 1363 (instrs STRBpre, STRBpost)>; 1364def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1365 (instrs STRBpre, STRBpost)>; 1366def : InstRW<[WriteAdr, A64FXWrite_STP01], 1367 (instrs STRBpre, STRBpost)>; 1368def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1369 (instrs STRBpre, STRBpost)>; 1370def : InstRW<[WriteAdr, A64FXWrite_STP01], 1371 (instrs STRBBpre, STRBBpost)>; 1372def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1373 (instrs STRBBpre, STRBBpost)>; 1374def : InstRW<[WriteAdr, A64FXWrite_STP01], 1375 (instrs STRBBpre, STRBBpost)>; 1376def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1377 (instrs STRBBpre, STRBBpost)>; 1378def : InstRW<[WriteAdr, A64FXWrite_STP01], 1379 (instrs STRDpre, STRDpost)>; 1380def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1381 (instrs STRDpre, STRDpost)>; 1382def : InstRW<[WriteAdr, A64FXWrite_STP01], 1383 (instrs STRDpre, STRDpost)>; 1384def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1385 (instrs STRDpre, STRDpost)>; 1386def : InstRW<[WriteAdr, A64FXWrite_STP01], 1387 (instrs STRHpre, STRHpost)>; 1388def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1389 (instrs STRHpre, STRHpost)>; 1390def : InstRW<[WriteAdr, A64FXWrite_STP01], 1391 (instrs STRHpre, STRHpost)>; 1392def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1393 (instrs STRHpre, STRHpost)>; 1394def : InstRW<[WriteAdr, A64FXWrite_STP01], 1395 (instrs STRHHpre, STRHHpost)>; 1396def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1397 (instrs STRHHpre, STRHHpost)>; 1398def : InstRW<[WriteAdr, A64FXWrite_STP01], 1399 (instrs STRHHpre, STRHHpost)>; 1400def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1401 (instrs STRHHpre, STRHHpost)>; 1402def : InstRW<[WriteAdr, A64FXWrite_STP01], 1403 (instrs STRQpre, STRQpost)>; 1404def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1405 (instrs STRQpre, STRQpost)>; 1406def : InstRW<[WriteAdr, A64FXWrite_STP01], 1407 (instrs STRQpre, STRQpost)>; 1408def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1409 (instrs STRQpre, STRQpost)>; 1410def : InstRW<[WriteAdr, A64FXWrite_STP01], 1411 (instrs STRSpre, STRSpost)>; 1412def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1413 (instrs STRSpre, STRSpost)>; 1414def : InstRW<[WriteAdr, A64FXWrite_STP01], 1415 (instrs STRSpre, STRSpost)>; 1416def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1417 (instrs STRSpre, STRSpost)>; 1418def : InstRW<[WriteAdr, A64FXWrite_STP01], 1419 (instrs STRWpre, STRWpost)>; 1420def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1421 (instrs STRWpre, STRWpost)>; 1422def : InstRW<[WriteAdr, A64FXWrite_STP01], 1423 (instrs STRWpre, STRWpost)>; 1424def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1425 (instrs STRWpre, STRWpost)>; 1426def : InstRW<[WriteAdr, A64FXWrite_STP01], 1427 (instrs STRXpre, STRXpost)>; 1428def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1429 (instrs STRXpre, STRXpost)>; 1430def : InstRW<[WriteAdr, A64FXWrite_STP01], 1431 (instrs STRXpre, STRXpost)>; 1432def : InstRW<[WriteAdr, A64FXWrite_STP01, ReadAdrBase], 1433 (instrs STRXpre, STRXpost)>; 1434 1435def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1436 (instrs STRBroW, STRBroX)>; 1437def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1438 (instrs STRBroW, STRBroX)>; 1439def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1440 (instrs STRBBroW, STRBBroX)>; 1441def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1442 (instrs STRBBroW, STRBBroX)>; 1443def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1444 (instrs STRDroW, STRDroX)>; 1445def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1446 (instrs STRDroW, STRDroX)>; 1447def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1448 (instrs STRHroW, STRHroX)>; 1449def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1450 (instrs STRHroW, STRHroX)>; 1451def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1452 (instrs STRHHroW, STRHHroX)>; 1453def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1454 (instrs STRHHroW, STRHHroX)>; 1455def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1456 (instrs STRQroW, STRQroX)>; 1457def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1458 (instrs STRQroW, STRQroX)>; 1459def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1460 (instrs STRSroW, STRSroX)>; 1461def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1462 (instrs STRSroW, STRSroX)>; 1463def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1464 (instrs STRWroW, STRWroX)>; 1465def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1466 (instrs STRWroW, STRWroX)>; 1467def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1468 (instrs STRXroW, STRXroX)>; 1469def : InstRW<[A64FXWrite_STUR, ReadAdrBase], 1470 (instrs STRXroW, STRXroX)>; 1471 1472//--- 1473// 3.8 FP Data Processing Instructions 1474//--- 1475 1476// FP absolute value 1477// FP min/max 1478// FP negate 1479def : WriteRes<WriteF, [A64FXGI03]> { 1480 let Latency = 4; 1481 let ResourceCycles = [2]; 1482} 1483 1484// FP arithmetic 1485 1486def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FADDDrr, FADDHrr)>; 1487def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FSUBDrr, FSUBHrr)>; 1488 1489// FP compare 1490def : WriteRes<WriteFCmp, [A64FXGI03]> { 1491 let Latency = 4; 1492 let ResourceCycles = [2]; 1493} 1494 1495// FP Div, Sqrt 1496def : WriteRes<WriteFDiv, [A64FXGI0]> { 1497 let Latency = 43; 1498} 1499 1500def A64FXXWriteFDiv : SchedWriteRes<[A64FXGI0]> { 1501 let Latency = 38; 1502} 1503 1504def A64FXXWriteFDivSP : SchedWriteRes<[A64FXGI0]> { 1505 let Latency = 29; 1506} 1507 1508def A64FXXWriteFDivDP : SchedWriteRes<[A64FXGI0]> { 1509 let Latency = 43; 1510} 1511 1512def A64FXXWriteFSqrtSP : SchedWriteRes<[A64FXGI0]> { 1513 let Latency = 29; 1514} 1515 1516def A64FXXWriteFSqrtDP : SchedWriteRes<[A64FXGI0]> { 1517 let Latency = 43; 1518} 1519 1520// FP divide, S-form 1521// FP square root, S-form 1522def : InstRW<[A64FXXWriteFDivSP], (instrs FDIVSrr)>; 1523def : InstRW<[A64FXXWriteFSqrtSP], (instrs FSQRTSr)>; 1524def : InstRW<[A64FXXWriteFDivSP], (instregex "^FDIVv.*32$")>; 1525def : InstRW<[A64FXXWriteFSqrtSP], (instregex "^.*SQRT.*32$")>; 1526def : InstRW<[A64FXXWriteFDivSP], (instregex "^FDIVSrr")>; 1527def : InstRW<[A64FXXWriteFSqrtSP], (instregex "^FSQRTSr")>; 1528 1529// FP divide, D-form 1530// FP square root, D-form 1531def : InstRW<[A64FXXWriteFDivDP], (instrs FDIVDrr)>; 1532def : InstRW<[A64FXXWriteFSqrtDP], (instrs FSQRTDr)>; 1533def : InstRW<[A64FXXWriteFDivDP], (instregex "^FDIVv.*64$")>; 1534def : InstRW<[A64FXXWriteFSqrtDP], (instregex "^.*SQRT.*64$")>; 1535def : InstRW<[A64FXXWriteFDivDP], (instregex "^FDIVDrr")>; 1536def : InstRW<[A64FXXWriteFSqrtDP], (instregex "^FSQRTDr")>; 1537 1538// FP multiply 1539// FP multiply accumulate 1540def : WriteRes<WriteFMul, [A64FXGI03]> { 1541 let Latency = 9; 1542 let ResourceCycles = [2]; 1543} 1544 1545def A64FXXWriteFMul : SchedWriteRes<[A64FXGI03]> { 1546 let Latency = 9; 1547 let ResourceCycles = [2]; 1548} 1549 1550def A64FXXWriteFMulAcc : SchedWriteRes<[A64FXGI03]> { 1551 let Latency = 9; 1552 let ResourceCycles = [2]; 1553} 1554 1555def : InstRW<[A64FXXWriteFMul], (instregex "^FMUL", "^FNMUL")>; 1556def : InstRW<[A64FXXWriteFMulAcc], 1557 (instregex "^FMADD", "^FMSUB", "^FNMADD", "^FNMSUB")>; 1558 1559// FP round to integral 1560def : InstRW<[A64FXWrite_9Cyc_GI03], 1561 (instregex "^FRINT(A|I|M|N|P|X|Z)(Sr|Dr)")>; 1562 1563// FP select 1564def : InstRW<[A64FXWrite_4Cyc_GI03], (instregex "^FCSEL")>; 1565 1566//--- 1567// 3.9 FP Miscellaneous Instructions 1568//--- 1569 1570// FP convert, from vec to vec reg 1571// FP convert, from gen to vec reg 1572// FP convert, from vec to gen reg 1573def : WriteRes<WriteFCvt, [A64FXGI03]> { 1574 let Latency = 9; 1575 let ResourceCycles = [2]; 1576} 1577 1578// FP move, immed 1579// FP move, register 1580def : WriteRes<WriteFImm, [A64FXGI0]> { 1581 let Latency = 4; 1582 let ResourceCycles = [2]; 1583} 1584 1585// FP transfer, from gen to vec reg 1586// FP transfer, from vec to gen reg 1587def : WriteRes<WriteFCopy, [A64FXGI0]> { 1588 let Latency = 4; 1589 let ResourceCycles = [2]; 1590} 1591 1592def : InstRW<[A64FXWrite_FMOV_GV], (instrs FMOVXDHighr)>; 1593def : InstRW<[A64FXWrite_FMOV_VG14], (instrs FMOVDXHighr)>; 1594 1595//--- 1596// 3.12 ASIMD Integer Instructions 1597//--- 1598 1599// ASIMD absolute diff, D-form 1600// ASIMD absolute diff, Q-form 1601// ASIMD absolute diff accum, D-form 1602// ASIMD absolute diff accum, Q-form 1603// ASIMD absolute diff accum long 1604// ASIMD absolute diff long 1605// ASIMD arith, basic 1606// ASIMD arith, complex 1607// ASIMD compare 1608// ASIMD logical (AND, BIC, EOR) 1609// ASIMD max/min, basic 1610// ASIMD max/min, reduce, 4H/4S 1611// ASIMD max/min, reduce, 8B/8H 1612// ASIMD max/min, reduce, 16B 1613// ASIMD multiply, D-form 1614// ASIMD multiply, Q-form 1615// ASIMD multiply accumulate long 1616// ASIMD multiply accumulate saturating long 1617// ASIMD multiply long 1618// ASIMD pairwise add and accumulate 1619// ASIMD shift accumulate 1620// ASIMD shift by immed, basic 1621// ASIMD shift by immed and insert, basic, D-form 1622// ASIMD shift by immed and insert, basic, Q-form 1623// ASIMD shift by immed, complex 1624// ASIMD shift by register, basic, D-form 1625// ASIMD shift by register, basic, Q-form 1626// ASIMD shift by register, complex, D-form 1627// ASIMD shift by register, complex, Q-form 1628def : WriteRes<WriteV, [A64FXGI03]> { 1629 let Latency = 4; 1630 let ResourceCycles = [1]; 1631} 1632 1633// ASIMD arith, reduce, 4H/4S 1634// ASIMD arith, reduce, 8B/8H 1635// ASIMD arith, reduce, 16B 1636 1637// ASIMD logical (MVN (alias for NOT), ORN, ORR) 1638def : InstRW<[A64FXWrite_4Cyc_GI03], 1639 (instregex "^ANDv", "^BICv", "^EORv", "^ORRv", "^ORNv", "^NOTv")>; 1640 1641// ASIMD arith, reduce 1642def : InstRW<[A64FXWrite_ADDLV], 1643 (instregex "^ADDVv", "^SADDLVv", "^UADDLVv")>; 1644 1645// ASIMD polynomial (8x8) multiply long 1646def : InstRW<[A64FXWrite_MULLE], (instregex "^(S|U|SQD)MULL")>; 1647def : InstRW<[A64FXWrite_MULLV], 1648 (instregex "(S|U|SQD)(MLAL|MLSL|MULL)v.*")>; 1649def : InstRW<[A64FXWrite_8Cyc_GI03], (instregex "^PMULL(v8i8|v16i8)")>; 1650def : InstRW<[A64FXWrite_8Cyc_GI03], (instregex "^PMULL(v1i64|v2i64)")>; 1651 1652// ASIMD absolute diff accum, D-form 1653def : InstRW<[A64FXWrite_ABA], 1654 (instregex "^[SU]ABA(v8i8|v4i16|v2i32)$")>; 1655// ASIMD absolute diff accum, Q-form 1656def : InstRW<[A64FXWrite_ABA], 1657 (instregex "^[SU]ABA(v16i8|v8i16|v4i32)$")>; 1658// ASIMD absolute diff accum long 1659def : InstRW<[A64FXWrite_ABAL], 1660 (instregex "^[SU]ABAL")>; 1661// ASIMD arith, reduce, 4H/4S 1662def : InstRW<[A64FXWrite_ADDLV1], 1663 (instregex "^[SU]?ADDL?V(v8i8|v4i16|v2i32)v$")>; 1664// ASIMD arith, reduce, 8B 1665def : InstRW<[A64FXWrite_ADDLV1], 1666 (instregex "^[SU]?ADDL?V(v8i16|v4i32)v$")>; 1667// ASIMD arith, reduce, 16B/16H 1668def : InstRW<[A64FXWrite_ADDLV1], 1669 (instregex "^[SU]?ADDL?Vv16i8v$")>; 1670// ASIMD max/min, reduce, 4H/4S 1671def : InstRW<[A64FXWrite_MINMAXV], 1672 (instregex "^[SU](MIN|MAX)V(v4i16|v4i32)v$")>; 1673// ASIMD max/min, reduce, 8B/8H 1674def : InstRW<[A64FXWrite_MINMAXV], 1675 (instregex "^[SU](MIN|MAX)V(v8i8|v8i16)v$")>; 1676// ASIMD max/min, reduce, 16B/16H 1677def : InstRW<[A64FXWrite_MINMAXV], 1678 (instregex "^[SU](MIN|MAX)Vv16i8v$")>; 1679// ASIMD multiply, D-form 1680def : InstRW<[A64FXWrite_PMUL], 1681 (instregex "^(P?MUL|SQR?DMUL)" # 1682 "(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)" # 1683 "(_indexed)?$")>; 1684 1685// ASIMD multiply, Q-form 1686def : InstRW<[A64FXWrite_PMUL], 1687 (instregex "^(P?MUL)(v16i8|v8i16|v4i32)(_indexed)?$")>; 1688 1689// ASIMD multiply, Q-form 1690def : InstRW<[A64FXWrite_SQRDMULH], 1691 (instregex "^(SQR?DMULH)(v16i8|v8i16|v4i32)(_indexed)?$")>; 1692 1693// ASIMD multiply accumulate, D-form 1694def : InstRW<[A64FXWrite_9Cyc_GI03], 1695 (instregex "^ML[AS](v8i8|v4i16|v2i32)(_indexed)?$")>; 1696// ASIMD multiply accumulate, Q-form 1697def : InstRW<[A64FXWrite_9Cyc_GI03], 1698 (instregex "^ML[AS](v16i8|v8i16|v4i32)(_indexed)?$")>; 1699// ASIMD shift accumulate 1700def : InstRW<[A64FXWrite_SRSRAV], 1701 (instregex "SRSRAv", "URSRAv")>; 1702def : InstRW<[A64FXWrite_SSRAV], 1703 (instregex "SSRAv", "USRAv")>; 1704 1705// ASIMD shift by immed, basic 1706def : InstRW<[A64FXWrite_RSHRN], 1707 (instregex "RSHRNv", "SQRSHRNv", "SQRSHRUNv", "UQRSHRNv")>; 1708def : InstRW<[A64FXWrite_SHRN], 1709 (instregex "SHRNv", "SQSHRNv", "SQSHRUNv", "UQSHRNv")>; 1710 1711def : InstRW<[A64FXWrite_6Cyc_GI3], 1712 (instregex "SQXTNv", "SQXTUNv", "UQXTNv")>; 1713 1714// ASIMD shift by immed, complex 1715def : InstRW<[A64FXWrite_ABA], (instregex "^[SU]?(Q|R){1,2}SHR")>; 1716def : InstRW<[A64FXWrite_6Cyc_GI3], (instregex "^SQSHLU")>; 1717// ASIMD shift by register, basic, Q-form 1718def : InstRW<[A64FXWrite_6Cyc_GI3], 1719 (instregex "^[SU]SHL(v16i8|v8i16|v4i32|v2i64)")>; 1720// ASIMD shift by register, complex, D-form 1721def : InstRW<[A64FXWrite_6Cyc_GI3], 1722 (instregex "^[SU][QR]{1,2}SHL" # 1723 "(v1i8|v1i16|v1i32|v1i64|v8i8|v4i16|v2i32|b|d|h|s)")>; 1724// ASIMD shift by register, complex, Q-form 1725def : InstRW<[A64FXWrite_6Cyc_GI3], 1726 (instregex "^[SU][QR]{1,2}SHL(v16i8|v8i16|v4i32|v2i64)")>; 1727 1728// ASIMD Arithmetic 1729def : InstRW<[A64FXWrite_4Cyc_GI03], 1730 (instregex "(ADD|SUB)(v8i8|v4i16|v2i32|v1i64)")>; 1731def : InstRW<[A64FXWrite_4Cyc_GI03], 1732 (instregex "(ADD|SUB)(v16i8|v8i16|v4i32|v2i64)")>; 1733def : InstRW<[A64FXWrite_SHRN], (instregex "(ADD|SUB)HNv.*")>; 1734def : InstRW<[A64FXWrite_RSHRN], (instregex "(RADD|RSUB)HNv.*")>; 1735def : InstRW<[A64FXWrite_4Cyc_GI03], 1736 (instregex "^SQADD", "^SQNEG", "^SQSUB", "^SRHADD", 1737 "^SUQADD", "^UQADD", "^UQSUB", "^URHADD", "^USQADD")>; 1738def : InstRW<[A64FXWrite_ADDP], 1739 (instregex "ADDP(v16i8|v8i16|v4i32|v2i64)")>; 1740def : InstRW<[A64FXWrite_4Cyc_GI03], 1741 (instregex "((AND|ORN|EOR|EON)S?(Xr[rsi]|v16i8|v8i16|v4i32)|" # 1742 "(ORR|BIC)S?(Xr[rs]|v16i8|v8i16|v4i32))")>; 1743def : InstRW<[A64FXWrite_4Cyc_GI0], 1744 (instregex "(CLS|CLZ|CNT)(v4i32|v8i16|v16i8)")>; 1745def : InstRW<[A64FXWrite_SADALP], (instregex "^SADALP", "^UADALP")>; 1746def : InstRW<[A64FXWrite_SADDLP], (instregex "^SADDLPv", "^UADDLPv")>; 1747def : InstRW<[A64FXWrite_ADDLV1], (instregex "^SADDLV", "^UADDLV")>; 1748def : InstRW<[A64FXWrite_MINMAXV], 1749 (instregex "^ADDVv", "^SMAXVv", "^UMAXVv", "^SMINVv", "^UMINVv")>; 1750def : InstRW<[A64FXWrite_ABA], 1751 (instregex "^SABAv", "^UABAv", "^SABALv", "^UABALv")>; 1752def : InstRW<[A64FXWrite_4Cyc_GI03], 1753 (instregex "^SQADDv", "^SQSUBv", "^UQADDv", "^UQSUBv")>; 1754def : InstRW<[A64FXWrite_4Cyc_GI03], (instregex "^SUQADDv", "^USQADDv")>; 1755def : InstRW<[A64FXWrite_SHRN], 1756 (instregex "^ADDHNv", "^SUBHNv")>; 1757def : InstRW<[A64FXWrite_RSHRN], 1758 (instregex "^RADDHNv", "^RSUBHNv")>; 1759def : InstRW<[A64FXWrite_4Cyc_GI03], 1760 (instregex "^SQABS", "^SQADD", "^SQNEG", "^SQSUB", 1761 "^SRHADD", "^SUQADD", "^UQADD", "^UQSUB", 1762 "^URHADD", "^USQADD")>; 1763 1764def : InstRW<[A64FXWrite_4Cyc_GI03], 1765 (instregex "^CMEQv", "^CMGEv", "^CMGTv", 1766 "^CMLEv", "^CMLTv", "^CMHIv", "^CMHSv")>; 1767def : InstRW<[A64FXWrite_MINMAXV], 1768 (instregex "^SMAXv", "^SMINv", "^UMAXv", "^UMINv")>; 1769def : InstRW<[A64FXWrite_ADDP], 1770 (instregex "^SMAXPv", "^SMINPv", "^UMAXPv", "^UMINPv")>; 1771def : InstRW<[A64FXWrite_4Cyc_GI03], 1772 (instregex "^SABDv", "^UABDv")>; 1773def : InstRW<[A64FXWrite_TBX1], 1774 (instregex "^SABDLv", "^UABDLv")>; 1775 1776//--- 1777// 3.13 ASIMD Floating-point Instructions 1778//--- 1779 1780// ASIMD FP absolute value 1781def : InstRW<[A64FXWrite_4Cyc_GI03], (instregex "^FABSv")>; 1782 1783// ASIMD FP arith, normal, D-form 1784// ASIMD FP arith, normal, Q-form 1785def : InstRW<[A64FXWrite_9Cyc_GI03], 1786 (instregex "^FABDv", "^FADDv", "^FSUBv")>; 1787 1788// ASIMD FP arith, pairwise, D-form 1789// ASIMD FP arith, pairwise, Q-form 1790def : InstRW<[A64FXWrite_FADDPV], (instregex "^FADDPv")>; 1791 1792// ASIMD FP compare, D-form 1793// ASIMD FP compare, Q-form 1794def : InstRW<[A64FXWrite_4Cyc_GI03], (instregex "^FACGEv", "^FACGTv")>; 1795def : InstRW<[A64FXWrite_4Cyc_GI03], (instregex "^FCMEQv", "^FCMGEv", 1796 "^FCMGTv", "^FCMLEv", 1797 "^FCMLTv")>; 1798// ASIMD FP round, D-form 1799def : InstRW<[A64FXWrite_9Cyc_GI03], 1800 (instregex "^FRINT[AIMNPXZ](v2f32)")>; 1801// ASIMD FP round, Q-form 1802def : InstRW<[A64FXWrite_9Cyc_GI03], 1803 (instregex "^FRINT[AIMNPXZ](v4f32|v2f64)")>; 1804 1805// ASIMD FP convert, long 1806// ASIMD FP convert, narrow 1807// ASIMD FP convert, other, D-form 1808// ASIMD FP convert, other, Q-form 1809 1810// ASIMD FP convert, long and narrow 1811def : InstRW<[A64FXWrite_FCVTXNV], (instregex "^FCVT(L|N|XN)v")>; 1812// ASIMD FP convert, other, D-form 1813def : InstRW<[A64FXWrite_FCVTXNV], 1814 (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v2f32|v1i32|v2i32|v1i64)")>; 1815// ASIMD FP convert, other, Q-form 1816def : InstRW<[A64FXWrite_FCVTXNV], 1817 (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v4f32|v2f64|v4i32|v2i64)")>; 1818 1819// ASIMD FP divide, D-form, F32 1820def : InstRW<[A64FXXWriteFDivSP], (instrs FDIVv2f32)>; 1821def : InstRW<[A64FXXWriteFDivSP], (instregex "FDIVv2f32")>; 1822 1823// ASIMD FP divide, Q-form, F32 1824def : InstRW<[A64FXXWriteFDiv], (instrs FDIVv4f32)>; 1825def : InstRW<[A64FXXWriteFDiv], (instregex "FDIVv4f32")>; 1826 1827// ASIMD FP divide, Q-form, F64 1828def : InstRW<[A64FXXWriteFDivDP], (instrs FDIVv2f64)>; 1829def : InstRW<[A64FXXWriteFDivDP], (instregex "FDIVv2f64")>; 1830 1831// ASIMD FP max/min, normal, D-form 1832// ASIMD FP max/min, normal, Q-form 1833def : InstRW<[A64FXWrite_4Cyc_GI0], (instregex "^FMAXv", "^FMAXNMv", 1834 "^FMINv", "^FMINNMv")>; 1835 1836// ASIMD FP max/min, pairwise, D-form 1837// ASIMD FP max/min, pairwise, Q-form 1838def : InstRW<[A64FXWrite_ADDP], (instregex "^FMAXPv", "^FMAXNMPv", 1839 "^FMINPv", "^FMINNMPv")>; 1840 1841// ASIMD FP max/min, reduce 1842def : InstRW<[A64FXWrite_FMAXVVH], (instregex "^FMAXVv", "^FMAXNMVv", 1843 "^FMINVv", "^FMINNMVv")>; 1844 1845// ASIMD FP multiply, D-form, FZ 1846// ASIMD FP multiply, D-form, no FZ 1847// ASIMD FP multiply, Q-form, FZ 1848// ASIMD FP multiply, Q-form, no FZ 1849def : InstRW<[A64FXWrite_9Cyc_GI03], (instregex "^FMULv", "^FMULXv")>; 1850def : InstRW<[A64FXWrite_FMULXE], 1851 (instregex "^FMULX?(v2f32|v1i32|v2i32|v1i64|32|64)")>; 1852def : InstRW<[A64FXWrite_FMULXE], 1853 (instregex "^FMULX?(v4f32|v2f64|v4i32|v2i64)")>; 1854 1855// ASIMD FP multiply accumulate, Dform, FZ 1856// ASIMD FP multiply accumulate, Dform, no FZ 1857// ASIMD FP multiply accumulate, Qform, FZ 1858// ASIMD FP multiply accumulate, Qform, no FZ 1859def : InstRW<[A64FXWrite_9Cyc_GI03], (instregex "^FMLAv", "^FMLSv")>; 1860def : InstRW<[A64FXWrite_FMULXE], 1861 (instregex "^FML[AS](v2f32|v1i32|v2i32|v1i64)")>; 1862def : InstRW<[A64FXWrite_FMULXE], 1863 (instregex "^FML[AS](v4f32|v2f64|v4i32|v2i64)")>; 1864 1865// ASIMD FP negate 1866def : InstRW<[A64FXWrite_4Cyc_GI03], (instregex "^FNEGv")>; 1867 1868//-- 1869// 3.14 ASIMD Miscellaneous Instructions 1870//-- 1871 1872// ASIMD bit reverse 1873def : InstRW<[A64FXWrite_1Cyc_GI2456], (instregex "^RBITv")>; 1874 1875// ASIMD bitwise insert, D-form 1876// ASIMD bitwise insert, Q-form 1877def : InstRW<[A64FXWrite_BIF], 1878 (instregex "^BIFv", "^BITv", "^BSLv")>; 1879 1880// ASIMD count, D-form 1881// ASIMD count, Q-form 1882def : InstRW<[A64FXWrite_4Cyc_GI0], 1883 (instregex "^CLSv", "^CLZv", "^CNTv")>; 1884 1885// ASIMD duplicate, gen reg 1886// ASIMD duplicate, element 1887def : InstRW<[A64FXWrite_DUPGENERAL], (instregex "^DUPv")>; 1888def : InstRW<[A64FXWrite_6Cyc_GI0], (instregex "^CPY")>; 1889def : InstRW<[A64FXWrite_6Cyc_GI0], (instregex "^DUPv.+gpr")>; 1890 1891// ASIMD extract 1892def : InstRW<[A64FXWrite_6Cyc_GI0], (instregex "^EXTv")>; 1893 1894// ASIMD extract narrow 1895def : InstRW<[A64FXWrite_6Cyc_GI3], (instregex "^XTNv")>; 1896 1897// ASIMD extract narrow, saturating 1898def : InstRW<[A64FXWrite_6Cyc_GI3], 1899 (instregex "^SQXTNv", "^SQXTUNv", "^UQXTNv")>; 1900 1901// ASIMD insert, element to element 1902def : InstRW<[A64FXWrite_6Cyc_GI0], (instregex "^INSv")>; 1903 1904// ASIMD transfer, element to gen reg 1905def : InstRW<[A64FXWrite_SMOV], (instregex "^[SU]MOVv")>; 1906 1907// ASIMD move, integer immed 1908def : InstRW<[A64FXWrite_4Cyc_GI0], (instregex "^MOVIv")>; 1909 1910// ASIMD move, FP immed 1911def : InstRW<[A64FXWrite_4Cyc_GI0], (instregex "^FMOVv")>; 1912 1913// ASIMD table lookup, D-form 1914def : InstRW<[A64FXWrite_6Cyc_GI3], (instregex "^TBLv8i8One")>; 1915def : InstRW<[A64FXWrite_TBX1], (instregex "^TBLv8i8Two")>; 1916def : InstRW<[A64FXWrite_TBX2], (instregex "^TBLv8i8Three")>; 1917def : InstRW<[A64FXWrite_TBX3], (instregex "^TBLv8i8Four")>; 1918def : InstRW<[A64FXWrite_TBX1], (instregex "^TBXv8i8One")>; 1919def : InstRW<[A64FXWrite_TBX2], (instregex "^TBXv8i8Two")>; 1920def : InstRW<[A64FXWrite_TBX3], (instregex "^TBXv8i8Three")>; 1921def : InstRW<[A64FXWrite_TBX4], (instregex "^TBXv8i8Four")>; 1922 1923// ASIMD table lookup, Q-form 1924def : InstRW<[A64FXWrite_6Cyc_GI3], (instregex "^TBLv16i8One")>; 1925def : InstRW<[A64FXWrite_TBX1], (instregex "^TBLv16i8Two")>; 1926def : InstRW<[A64FXWrite_TBX2], (instregex "^TBLv16i8Three")>; 1927def : InstRW<[A64FXWrite_TBX3], (instregex "^TBLv16i8Four")>; 1928def : InstRW<[A64FXWrite_TBX1], (instregex "^TBXv16i8One")>; 1929def : InstRW<[A64FXWrite_TBX2], (instregex "^TBXv16i8Two")>; 1930def : InstRW<[A64FXWrite_TBX3], (instregex "^TBXv16i8Three")>; 1931def : InstRW<[A64FXWrite_TBX4], (instregex "^TBXv16i8Four")>; 1932 1933// ASIMD transpose 1934def : InstRW<[A64FXWrite_6Cyc_GI0], (instregex "^TRN1", "^TRN2")>; 1935 1936// ASIMD unzip/zip 1937def : InstRW<[A64FXWrite_6Cyc_GI0], 1938 (instregex "^UZP1", "^UZP2", "^ZIP1", "^ZIP2")>; 1939 1940// ASIMD reciprocal estimate, D-form 1941// ASIMD reciprocal estimate, Q-form 1942def : InstRW<[A64FXWrite_4Cyc_GI03], 1943 (instregex "^FRECPEv", "^FRECPXv", "^URECPEv", 1944 "^FRSQRTEv", "^URSQRTEv")>; 1945 1946// ASIMD reciprocal step, D-form, FZ 1947// ASIMD reciprocal step, D-form, no FZ 1948// ASIMD reciprocal step, Q-form, FZ 1949// ASIMD reciprocal step, Q-form, no FZ 1950def : InstRW<[A64FXWrite_9Cyc_GI0], (instregex "^FRECPSv", "^FRSQRTSv")>; 1951 1952// ASIMD reverse 1953def : InstRW<[A64FXWrite_4Cyc_GI03], 1954 (instregex "^REV16v", "^REV32v", "^REV64v")>; 1955 1956// ASIMD table lookup, D-form 1957// ASIMD table lookup, Q-form 1958def : InstRW<[A64FXWrite_6Cyc_GI0], (instregex "^TBLv", "^TBXv")>; 1959 1960// ASIMD transfer, element to word or word 1961def : InstRW<[A64FXWrite_SMOV], (instregex "^[SU]MOVv")>; 1962 1963// ASIMD transfer, element to gen reg 1964def : InstRW<[A64FXWrite_SMOV], (instregex "(S|U)MOVv.*")>; 1965 1966// ASIMD transfer gen reg to element 1967def : InstRW<[A64FXWrite_6Cyc_GI0], (instregex "^INSv")>; 1968 1969// ASIMD transpose 1970def : InstRW<[A64FXWrite_6Cyc_GI0], (instregex "^TRN1v", "^TRN2v", 1971 "^UZP1v", "^UZP2v")>; 1972 1973// ASIMD unzip/zip 1974def : InstRW<[A64FXWrite_6Cyc_GI0], (instregex "^ZIP1v", "^ZIP2v")>; 1975 1976//-- 1977// 3.15 ASIMD Load Instructions 1978//-- 1979 1980// ASIMD load, 1 element, multiple, 1 reg, D-form 1981// ASIMD load, 1 element, multiple, 1 reg, Q-form 1982def : InstRW<[A64FXWrite_8Cyc_GI56], 1983 (instregex "^LD1Onev(8b|4h|2s|1d|2d)$")>; 1984def : InstRW<[A64FXWrite_11Cyc_GI56], 1985 (instregex "^LD1Onev(16b|8h|4s)$")>; 1986def : InstRW<[A64FXWrite_LD108, WriteAdr], 1987 (instregex "^LD1Onev(8b|4h|2s|1d|2d)_POST$")>; 1988def : InstRW<[A64FXWrite_LD109, WriteAdr], 1989 (instregex "^LD1Onev(16b|8h|4s)_POST$")>; 1990 1991// ASIMD load, 1 element, multiple, 2 reg, D-form 1992// ASIMD load, 1 element, multiple, 2 reg, Q-form 1993def : InstRW<[A64FXWrite_LD102], 1994 (instregex "^LD1Twov(8b|4h|2s|1d|2d)$")>; 1995def : InstRW<[A64FXWrite_LD103], 1996 (instregex "^LD1Twov(16b|8h|4s)$")>; 1997def : InstRW<[A64FXWrite_LD110, WriteAdr], 1998 (instregex "^LD1Twov(8b|4h|2s|1d|2d)_POST$")>; 1999def : InstRW<[A64FXWrite_LD111, WriteAdr], 2000 (instregex "^LD1Twov(16b|8h|4s)_POST$")>; 2001 2002// ASIMD load, 1 element, multiple, 3 reg, D-form 2003// ASIMD load, 1 element, multiple, 3 reg, Q-form 2004def : InstRW<[A64FXWrite_LD104], 2005 (instregex "^LD1Threev(8b|4h|2s|1d|2d)$")>; 2006def : InstRW<[A64FXWrite_LD105], 2007 (instregex "^LD1Threev(16b|8h|4s)$")>; 2008def : InstRW<[A64FXWrite_LD112, WriteAdr], 2009 (instregex "^LD1Threev(8b|4h|2s|1d|2d)_POST$")>; 2010def : InstRW<[A64FXWrite_LD113, WriteAdr], 2011 (instregex "^LD1Threev(16b|8h|4s)_POST$")>; 2012 2013// ASIMD load, 1 element, multiple, 4 reg, D-form 2014// ASIMD load, 1 element, multiple, 4 reg, Q-form 2015def : InstRW<[A64FXWrite_LD106], 2016 (instregex "^LD1Fourv(8b|4h|2s|1d|2d)$")>; 2017def : InstRW<[A64FXWrite_LD107], 2018 (instregex "^LD1Fourv(16b|8h|4s)$")>; 2019def : InstRW<[A64FXWrite_LD114, WriteAdr], 2020 (instregex "^LD1Fourv(8b|4h|2s|1d|2d)_POST$")>; 2021def : InstRW<[A64FXWrite_LD115, WriteAdr], 2022 (instregex "^LD1Fourv(16b|8h|4s)_POST$")>; 2023 2024// ASIMD load, 1 element, one lane, B/H/S 2025// ASIMD load, 1 element, one lane, D 2026def : InstRW<[A64FXWrite_LD1I0], (instregex "^LD1i(8|16|32|64)$")>; 2027def : InstRW<[A64FXWrite_LD1I1, WriteAdr], 2028 (instregex "^LD1i(8|16|32|64)_POST$")>; 2029 2030// ASIMD load, 1 element, all lanes, D-form, B/H/S 2031// ASIMD load, 1 element, all lanes, D-form, D 2032// ASIMD load, 1 element, all lanes, Q-form 2033def : InstRW<[A64FXWrite_8Cyc_GI03], 2034 (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 2035def : InstRW<[A64FXWrite_LD108, WriteAdr], 2036 (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 2037 2038// ASIMD load, 2 element, multiple, D-form, B/H/S 2039// ASIMD load, 2 element, multiple, Q-form, D 2040def : InstRW<[A64FXWrite_LD103], 2041 (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)$")>; 2042def : InstRW<[A64FXWrite_LD111, WriteAdr], 2043 (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 2044 2045// ASIMD load, 2 element, one lane, B/H 2046// ASIMD load, 2 element, one lane, S 2047// ASIMD load, 2 element, one lane, D 2048def : InstRW<[A64FXWrite_LD2I0], (instregex "^LD2i(8|16|32|64)$")>; 2049def : InstRW<[A64FXWrite_LD2I1, WriteAdr], 2050 (instregex "^LD2i(8|16|32|64)_POST$")>; 2051 2052// ASIMD load, 2 element, all lanes, D-form, B/H/S 2053// ASIMD load, 2 element, all lanes, D-form, D 2054// ASIMD load, 2 element, all lanes, Q-form 2055def : InstRW<[A64FXWrite_LD102], 2056 (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 2057def : InstRW<[A64FXWrite_LD110, WriteAdr], 2058 (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 2059 2060// ASIMD load, 3 element, multiple, D-form, B/H/S 2061// ASIMD load, 3 element, multiple, Q-form, B/H/S 2062// ASIMD load, 3 element, multiple, Q-form, D 2063def : InstRW<[A64FXWrite_LD105], 2064 (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)$")>; 2065def : InstRW<[A64FXWrite_LD113, WriteAdr], 2066 (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 2067 2068// ASIMD load, 3 element, one lone, B/H 2069// ASIMD load, 3 element, one lane, S 2070// ASIMD load, 3 element, one lane, D 2071def : InstRW<[A64FXWrite_LD3I0], (instregex "^LD3i(8|16|32|64)$")>; 2072def : InstRW<[A64FXWrite_LD3I1, WriteAdr], 2073 (instregex "^LD3i(8|16|32|64)_POST$")>; 2074 2075// ASIMD load, 3 element, all lanes, D-form, B/H/S 2076// ASIMD load, 3 element, all lanes, D-form, D 2077// ASIMD load, 3 element, all lanes, Q-form, B/H/S 2078// ASIMD load, 3 element, all lanes, Q-form, D 2079def : InstRW<[A64FXWrite_LD104], 2080 (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 2081def : InstRW<[A64FXWrite_LD112, WriteAdr], 2082 (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 2083 2084// ASIMD load, 4 element, multiple, D-form, B/H/S 2085// ASIMD load, 4 element, multiple, Q-form, B/H/S 2086// ASIMD load, 4 element, multiple, Q-form, D 2087def : InstRW<[A64FXWrite_LD107], 2088 (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>; 2089def : InstRW<[A64FXWrite_LD115, WriteAdr], 2090 (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 2091 2092// ASIMD load, 4 element, one lane, B/H 2093// ASIMD load, 4 element, one lane, S 2094// ASIMD load, 4 element, one lane, D 2095def : InstRW<[A64FXWrite_LD4I0], (instregex "^LD4i(8|16|32|64)$")>; 2096def : InstRW<[A64FXWrite_LD4I1, WriteAdr], 2097 (instregex "^LD4i(8|16|32|64)_POST$")>; 2098 2099// ASIMD load, 4 element, all lanes, D-form, B/H/S 2100// ASIMD load, 4 element, all lanes, D-form, D 2101// ASIMD load, 4 element, all lanes, Q-form, B/H/S 2102// ASIMD load, 4 element, all lanes, Q-form, D 2103def : InstRW<[A64FXWrite_LD106], 2104 (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 2105def : InstRW<[A64FXWrite_LD114, WriteAdr], 2106 (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 2107 2108//-- 2109// 3.16 ASIMD Store Instructions 2110//-- 2111 2112// ASIMD store, 1 element, multiple, 1 reg, D-form 2113// ASIMD store, 1 element, multiple, 1 reg, Q-form 2114def : InstRW<[A64FXWrite_ST10], 2115 (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 2116def : InstRW<[A64FXWrite_ST14, WriteAdr], 2117 (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 2118 2119// ASIMD store, 1 element, multiple, 2 reg, D-form 2120// ASIMD store, 1 element, multiple, 2 reg, Q-form 2121def : InstRW<[A64FXWrite_ST11], 2122 (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 2123def : InstRW<[A64FXWrite_ST15, WriteAdr], 2124 (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 2125 2126// ASIMD store, 1 element, multiple, 3 reg, D-form 2127// ASIMD store, 1 element, multiple, 3 reg, Q-form 2128def : InstRW<[A64FXWrite_ST12], 2129 (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 2130def : InstRW<[A64FXWrite_ST16, WriteAdr], 2131 (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 2132 2133// ASIMD store, 1 element, multiple, 4 reg, D-form 2134// ASIMD store, 1 element, multiple, 4 reg, Q-form 2135def : InstRW<[A64FXWrite_ST13], 2136 (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 2137def : InstRW<[A64FXWrite_ST17, WriteAdr], 2138 (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 2139 2140// ASIMD store, 1 element, one lane, B/H/S 2141// ASIMD store, 1 element, one lane, D 2142def : InstRW<[A64FXWrite_ST10], 2143 (instregex "^ST1i(8|16|32|64)$")>; 2144def : InstRW<[A64FXWrite_ST14, WriteAdr], 2145 (instregex "^ST1i(8|16|32|64)_POST$")>; 2146 2147// ASIMD store, 2 element, multiple, D-form, B/H/S 2148// ASIMD store, 2 element, multiple, Q-form, B/H/S 2149// ASIMD store, 2 element, multiple, Q-form, D 2150def : InstRW<[A64FXWrite_ST11], 2151 (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)$")>; 2152def : InstRW<[A64FXWrite_ST15, WriteAdr], 2153 (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 2154 2155// ASIMD store, 2 element, one lane, B/H/S 2156// ASIMD store, 2 element, one lane, D 2157def : InstRW<[A64FXWrite_ST11], 2158 (instregex "^ST2i(8|16|32|64)$")>; 2159def : InstRW<[A64FXWrite_ST15, WriteAdr], 2160 (instregex "^ST2i(8|16|32|64)_POST$")>; 2161 2162// ASIMD store, 3 element, multiple, D-form, B/H/S 2163// ASIMD store, 3 element, multiple, Q-form, B/H/S 2164// ASIMD store, 3 element, multiple, Q-form, D 2165def : InstRW<[A64FXWrite_ST12], 2166 (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)$")>; 2167def : InstRW<[A64FXWrite_ST16, WriteAdr], 2168 (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 2169 2170// ASIMD store, 3 element, one lane, B/H 2171// ASIMD store, 3 element, one lane, S 2172// ASIMD store, 3 element, one lane, D 2173def : InstRW<[A64FXWrite_ST12], (instregex "^ST3i(8|16|32|64)$")>; 2174def : InstRW<[A64FXWrite_ST16, WriteAdr], 2175 (instregex "^ST3i(8|16|32|64)_POST$")>; 2176 2177// ASIMD store, 4 element, multiple, D-form, B/H/S 2178// ASIMD store, 4 element, multiple, Q-form, B/H/S 2179// ASIMD store, 4 element, multiple, Q-form, D 2180def : InstRW<[A64FXWrite_ST13], 2181 (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>; 2182def : InstRW<[A64FXWrite_ST17, WriteAdr], 2183 (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 2184 2185// ASIMD store, 4 element, one lane, B/H 2186// ASIMD store, 4 element, one lane, S 2187// ASIMD store, 4 element, one lane, D 2188def : InstRW<[A64FXWrite_ST13], (instregex "^ST4i(8|16|32|64)$")>; 2189def : InstRW<[A64FXWrite_ST17, WriteAdr], 2190 (instregex "^ST4i(8|16|32|64)_POST$")>; 2191 2192// V8.1a Atomics (LSE) 2193def : InstRW<[A64FXWrite_CAS, WriteAtomic], 2194 (instrs CASB, CASH, CASW, CASX)>; 2195 2196def : InstRW<[A64FXWrite_CAS, WriteAtomic], 2197 (instrs CASAB, CASAH, CASAW, CASAX)>; 2198 2199def : InstRW<[A64FXWrite_CAS, WriteAtomic], 2200 (instrs CASLB, CASLH, CASLW, CASLX)>; 2201 2202def : InstRW<[A64FXWrite_CAS, WriteAtomic], 2203 (instrs CASALB, CASALH, CASALW, CASALX)>; 2204 2205def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2206 (instrs LDLARB, LDLARH, LDLARW, LDLARX)>; 2207 2208def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2209 (instrs LDADDB, LDADDH, LDADDW, LDADDX)>; 2210 2211def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2212 (instrs LDADDAB, LDADDAH, LDADDAW, LDADDAX)>; 2213 2214def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2215 (instrs LDADDLB, LDADDLH, LDADDLW, LDADDLX)>; 2216 2217def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2218 (instrs LDADDALB, LDADDALH, LDADDALW, LDADDALX)>; 2219 2220def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2221 (instrs LDCLRB, LDCLRH, LDCLRW, LDCLRX)>; 2222 2223def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2224 (instrs LDCLRAB, LDCLRAH, LDCLRAW, LDCLRAX)>; 2225 2226def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2227 (instrs LDCLRLB, LDCLRLH, LDCLRLW, LDCLRLX)>; 2228 2229def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2230 (instrs LDCLRALB, LDCLRALH, LDCLRALW, LDCLRALX)>; 2231 2232def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2233 (instrs LDEORB, LDEORH, LDEORW, LDEORX)>; 2234 2235def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2236 (instrs LDEORAB, LDEORAH, LDEORAW, LDEORAX)>; 2237 2238def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2239 (instrs LDEORLB, LDEORLH, LDEORLW, LDEORLX)>; 2240 2241def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2242 (instrs LDEORALB, LDEORALH, LDEORALW, LDEORALX)>; 2243 2244def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2245 (instrs LDSETB, LDSETH, LDSETW, LDSETX)>; 2246 2247def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2248 (instrs LDSETAB, LDSETAH, LDSETAW, LDSETAX)>; 2249 2250def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2251 (instrs LDSETLB, LDSETLH, LDSETLW, LDSETLX)>; 2252 2253def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2254 (instrs LDSETALB, LDSETALH, LDSETALW, LDSETALX)>; 2255 2256def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2257 (instrs LDSMAXB, LDSMAXH, LDSMAXW, LDSMAXX, 2258 LDSMAXAB, LDSMAXAH, LDSMAXAW, LDSMAXAX, 2259 LDSMAXLB, LDSMAXLH, LDSMAXLW, LDSMAXLX, 2260 LDSMAXALB, LDSMAXALH, LDSMAXALW, LDSMAXALX)>; 2261 2262def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2263 (instrs LDSMINB, LDSMINH, LDSMINW, LDSMINX, 2264 LDSMINAB, LDSMINAH, LDSMINAW, LDSMINAX, 2265 LDSMINLB, LDSMINLH, LDSMINLW, LDSMINLX, 2266 LDSMINALB, LDSMINALH, LDSMINALW, LDSMINALX)>; 2267 2268def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2269 (instrs LDUMAXB, LDUMAXH, LDUMAXW, LDUMAXX, 2270 LDUMAXAB, LDUMAXAH, LDUMAXAW, LDUMAXAX, 2271 LDUMAXLB, LDUMAXLH, LDUMAXLW, LDUMAXLX, 2272 LDUMAXALB, LDUMAXALH, LDUMAXALW, LDUMAXALX)>; 2273 2274def : InstRW<[A64FXWrite_5Cyc_GI5, WriteAtomic], 2275 (instrs LDUMINB, LDUMINH, LDUMINW, LDUMINX, 2276 LDUMINAB, LDUMINAH, LDUMINAW, LDUMINAX, 2277 LDUMINLB, LDUMINLH, LDUMINLW, LDUMINLX, 2278 LDUMINALB, LDUMINALH, LDUMINALW, LDUMINALX)>; 2279 2280def : InstRW<[A64FXWrite_SWP, WriteAtomic], 2281 (instrs SWPB, SWPH, SWPW, SWPX)>; 2282 2283def : InstRW<[A64FXWrite_SWP, WriteAtomic], 2284 (instrs SWPAB, SWPAH, SWPAW, SWPAX)>; 2285 2286def : InstRW<[A64FXWrite_SWP, WriteAtomic], 2287 (instrs SWPLB, SWPLH, SWPLW, SWPLX)>; 2288 2289def : InstRW<[A64FXWrite_SWP, WriteAtomic], 2290 (instrs SWPALB, SWPALH, SWPALW, SWPALX)>; 2291 2292def : InstRW<[A64FXWrite_STUR, WriteAtomic], 2293 (instrs STLLRB, STLLRH, STLLRW, STLLRX)>; 2294 2295// [ 1] "abs $Zd, $Pg/m, $Zn"; 2296def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ABS_ZPmZ_B, ABS_ZPmZ_D, ABS_ZPmZ_H, ABS_ZPmZ_S)>; 2297 2298// [ 2] "add $Zd, $Zn, $Zm"; 2299def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ADD_ZZZ_B, ADD_ZZZ_D, ADD_ZZZ_H, ADD_ZZZ_S)>; 2300 2301// [ 3] "add $Zdn, $Pg/m, $_Zdn, $Zm"; 2302def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ADD_ZPmZ_B, ADD_ZPmZ_D, ADD_ZPmZ_H, ADD_ZPmZ_S)>; 2303 2304// [ 4] "add $Zdn, $_Zdn, $imm"; 2305def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ADD_ZI_B, ADD_ZI_D, ADD_ZI_H, ADD_ZI_S)>; 2306 2307// [ 5] "addpl $Rd, $Rn, $imm6"; 2308def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs ADDPL_XXI)>; 2309 2310// [ 6] "addvl $Rd, $Rn, $imm6"; 2311def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs ADDVL_XXI)>; 2312 2313// [ 7] "adr $Zd, [$Zn, $Zm]"; 2314def : InstRW<[A64FXWrite_5Cyc_GI0], (instrs ADR_LSL_ZZZ_D_0, ADR_LSL_ZZZ_D_1, ADR_LSL_ZZZ_D_2, ADR_LSL_ZZZ_D_3, ADR_LSL_ZZZ_S_0, ADR_LSL_ZZZ_S_1, ADR_LSL_ZZZ_S_2, ADR_LSL_ZZZ_S_3, ADR_SXTW_ZZZ_D_0, ADR_SXTW_ZZZ_D_1, ADR_SXTW_ZZZ_D_2, ADR_SXTW_ZZZ_D_3, ADR_UXTW_ZZZ_D_0, ADR_UXTW_ZZZ_D_1, ADR_UXTW_ZZZ_D_2, ADR_UXTW_ZZZ_D_3)>; 2315 2316// [ 8] "and $Pd, $Pg/z, $Pn, $Pm"; 2317def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs AND_PPzPP)>; 2318 2319// [ 9] "and $Zd, $Zn, $Zm"; 2320def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs AND_ZZZ)>; 2321 2322// [10] "and $Zdn, $Pg/m, $_Zdn, $Zm"; 2323def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs AND_ZPmZ_B, AND_ZPmZ_D, AND_ZPmZ_H, AND_ZPmZ_S)>; 2324 2325// [11] "and $Zdn, $_Zdn, $imms13"; 2326def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs AND_ZI)>; 2327 2328// [12] "ands $Pd, $Pg/z, $Pn, $Pm"; 2329def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs ANDS_PPzPP)>; 2330 2331// [13] "andv $Vd, $Pg, $Zn"; 2332def : InstRW<[A64FXWrite_14Cyc_GI03], (instrs ANDV_VPZ_B, ANDV_VPZ_D, ANDV_VPZ_H, ANDV_VPZ_S)>; 2333 2334// [14] "asr $Zd, $Zn, $Zm"; 2335def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ASR_WIDE_ZZZ_B, ASR_WIDE_ZZZ_H, ASR_WIDE_ZZZ_S)>; 2336 2337// [15] "asr $Zd, $Zn, $imm"; 2338def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ASR_ZZI_B, ASR_ZZI_D, ASR_ZZI_H, ASR_ZZI_S)>; 2339 2340// [16] "asr $Zdn, $Pg/m, $_Zdn, $Zm"; 2341def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ASR_WIDE_ZPmZ_B, ASR_WIDE_ZPmZ_H, ASR_WIDE_ZPmZ_S, ASR_ZPmZ_B, ASR_ZPmZ_D, ASR_ZPmZ_H, ASR_ZPmZ_S)>; 2342 2343// [17] "asr $Zdn, $Pg/m, $_Zdn, $imm"; 2344def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ASR_ZPmI_B, ASR_ZPmI_D, ASR_ZPmI_H, ASR_ZPmI_S)>; 2345 2346// [18] "asrd $Zdn, $Pg/m, $_Zdn, $imm"; 2347def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ASRD_ZPmI_B, ASRD_ZPmI_D, ASRD_ZPmI_H, ASRD_ZPmI_S)>; 2348 2349// [19] "asrr $Zdn, $Pg/m, $_Zdn, $Zm"; 2350def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ASRR_ZPmZ_B, ASRR_ZPmZ_D, ASRR_ZPmZ_H, ASRR_ZPmZ_S)>; 2351 2352// [20] "bic $Pd, $Pg/z, $Pn, $Pm"; 2353def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BIC_PPzPP)>; 2354 2355// [21] "bic $Zd, $Zn, $Zm"; 2356def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs BIC_ZZZ)>; 2357 2358// [22] "bic $Zdn, $Pg/m, $_Zdn, $Zm"; 2359def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs BIC_ZPmZ_B, BIC_ZPmZ_D, BIC_ZPmZ_H, BIC_ZPmZ_S)>; 2360 2361// [23] "bics $Pd, $Pg/z, $Pn, $Pm"; 2362def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BICS_PPzPP)>; 2363 2364// [24] "brka $Pd, $Pg/m, $Pn"; 2365def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKA_PPmP)>; 2366 2367// [25] "brka $Pd, $Pg/z, $Pn"; 2368def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKA_PPzP)>; 2369 2370// [26] "brkas $Pd, $Pg/z, $Pn"; 2371def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKAS_PPzP)>; 2372 2373// [27] "brkb $Pd, $Pg/m, $Pn"; 2374def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKB_PPmP)>; 2375 2376// [28] "brkb $Pd, $Pg/z, $Pn"; 2377def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKB_PPzP)>; 2378 2379// [29] "brkbs $Pd, $Pg/z, $Pn"; 2380def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKBS_PPzP)>; 2381 2382// [30] "brkn $Pdm, $Pg/z, $Pn, $_Pdm"; 2383def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKN_PPzP)>; 2384 2385// [31] "brkns $Pdm, $Pg/z, $Pn, $_Pdm"; 2386def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKNS_PPzP)>; 2387 2388// [32] "brkpa $Pd, $Pg/z, $Pn, $Pm"; 2389def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKPA_PPzPP)>; 2390 2391// [33] "brkpas $Pd, $Pg/z, $Pn, $Pm"; 2392def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKPAS_PPzPP)>; 2393 2394// [34] "brkpb $Pd, $Pg/z, $Pn, $Pm"; 2395def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKPB_PPzPP)>; 2396 2397// [35] "brkpbs $Pd, $Pg/z, $Pn, $Pm"; 2398def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs BRKPBS_PPzPP)>; 2399 2400// [36] "clasta $Rdn, $Pg, $_Rdn, $Zm"; 2401def : InstRW<[A64FXWrite_29Cyc_GI0256], (instrs CLASTA_RPZ_B, CLASTA_RPZ_D, CLASTA_RPZ_H, CLASTA_RPZ_S)>; 2402 2403// [37] "clasta $Vdn, $Pg, $_Vdn, $Zm"; 2404def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs CLASTA_VPZ_B, CLASTA_VPZ_D, CLASTA_VPZ_H, CLASTA_VPZ_S)>; 2405 2406// [38] "clasta $Zdn, $Pg, $_Zdn, $Zm"; 2407def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs CLASTA_ZPZ_B, CLASTA_ZPZ_D, CLASTA_ZPZ_H, CLASTA_ZPZ_S)>; 2408 2409// [39] "clastb $Rdn, $Pg, $_Rdn, $Zm"; 2410def : InstRW<[A64FXWrite_29Cyc_GI0256], (instrs CLASTB_RPZ_B, CLASTB_RPZ_D, CLASTB_RPZ_H, CLASTB_RPZ_S)>; 2411 2412// [40] "clastb $Vdn, $Pg, $_Vdn, $Zm"; 2413def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs CLASTB_VPZ_B, CLASTB_VPZ_D, CLASTB_VPZ_H, CLASTB_VPZ_S)>; 2414 2415// [41] "clastb $Zdn, $Pg, $_Zdn, $Zm"; 2416def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs CLASTB_ZPZ_B, CLASTB_ZPZ_D, CLASTB_ZPZ_H, CLASTB_ZPZ_S)>; 2417 2418// [42] "cls $Zd, $Pg/m, $Zn"; 2419def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs CLS_ZPmZ_B, CLS_ZPmZ_D, CLS_ZPmZ_H, CLS_ZPmZ_S)>; 2420 2421// [43] "clz $Zd, $Pg/m, $Zn"; 2422def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs CLZ_ZPmZ_B, CLZ_ZPmZ_D, CLZ_ZPmZ_H, CLZ_ZPmZ_S)>; 2423 2424// [44] "cmpeq $Pd, $Pg/z, $Zn, $Zm"; 2425def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPEQ_PPzZZ_B, CMPEQ_PPzZZ_D, CMPEQ_PPzZZ_H, CMPEQ_PPzZZ_S, CMPEQ_WIDE_PPzZZ_B, CMPEQ_WIDE_PPzZZ_H, CMPEQ_WIDE_PPzZZ_S)>; 2426 2427// [45] "cmpeq $Pd, $Pg/z, $Zn, $imm5"; 2428def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPEQ_PPzZI_B, CMPEQ_PPzZI_D, CMPEQ_PPzZI_H, CMPEQ_PPzZI_S)>; 2429 2430// [46] "cmpge $Pd, $Pg/z, $Zn, $Zm"; 2431def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPGE_PPzZZ_B, CMPGE_PPzZZ_D, CMPGE_PPzZZ_H, CMPGE_PPzZZ_S, CMPGE_WIDE_PPzZZ_B, CMPGE_WIDE_PPzZZ_H, CMPGE_WIDE_PPzZZ_S)>; 2432 2433// [47] "cmpge $Pd, $Pg/z, $Zn, $imm5"; 2434def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPGE_PPzZI_B, CMPGE_PPzZI_D, CMPGE_PPzZI_H, CMPGE_PPzZI_S)>; 2435 2436// [48] "cmpgt $Pd, $Pg/z, $Zn, $Zm"; 2437def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPGT_PPzZZ_B, CMPGT_PPzZZ_D, CMPGT_PPzZZ_H, CMPGT_PPzZZ_S, CMPGT_WIDE_PPzZZ_B, CMPGT_WIDE_PPzZZ_H, CMPGT_WIDE_PPzZZ_S)>; 2438 2439// [49] "cmpgt $Pd, $Pg/z, $Zn, $imm5"; 2440def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPGT_PPzZI_B, CMPGT_PPzZI_D, CMPGT_PPzZI_H, CMPGT_PPzZI_S)>; 2441 2442// [50] "cmphi $Pd, $Pg/z, $Zn, $Zm"; 2443def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPHI_PPzZZ_B, CMPHI_PPzZZ_D, CMPHI_PPzZZ_H, CMPHI_PPzZZ_S, CMPHI_WIDE_PPzZZ_B, CMPHI_WIDE_PPzZZ_H, CMPHI_WIDE_PPzZZ_S)>; 2444 2445// [51] "cmphi $Pd, $Pg/z, $Zn, $imm7"; 2446def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPHI_PPzZI_B, CMPHI_PPzZI_D, CMPHI_PPzZI_H, CMPHI_PPzZI_S)>; 2447 2448// [52] "cmphs $Pd, $Pg/z, $Zn, $Zm"; 2449def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPHS_PPzZZ_B, CMPHS_PPzZZ_D, CMPHS_PPzZZ_H, CMPHS_PPzZZ_S, CMPHS_WIDE_PPzZZ_B, CMPHS_WIDE_PPzZZ_H, CMPHS_WIDE_PPzZZ_S)>; 2450 2451// [53] "cmphs $Pd, $Pg/z, $Zn, $imm7"; 2452def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPHS_PPzZI_B, CMPHS_PPzZI_D, CMPHS_PPzZI_H, CMPHS_PPzZI_S)>; 2453 2454// [54] "cmple $Pd, $Pg/z, $Zn, $Zm"; 2455def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPLE_WIDE_PPzZZ_B, CMPLE_WIDE_PPzZZ_H, CMPLE_WIDE_PPzZZ_S)>; 2456 2457// [55] "cmple $Pd, $Pg/z, $Zn, $imm5"; 2458def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPLE_PPzZI_B, CMPLE_PPzZI_D, CMPLE_PPzZI_H, CMPLE_PPzZI_S)>; 2459 2460// [56] "cmplo $Pd, $Pg/z, $Zn, $Zm"; 2461def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPLO_WIDE_PPzZZ_B, CMPLO_WIDE_PPzZZ_H, CMPLO_WIDE_PPzZZ_S)>; 2462 2463// [57] "cmplo $Pd, $Pg/z, $Zn, $imm7"; 2464def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPLO_PPzZI_B, CMPLO_PPzZI_D, CMPLO_PPzZI_H, CMPLO_PPzZI_S)>; 2465 2466// [58] "cmpls $Pd, $Pg/z, $Zn, $Zm"; 2467def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPLS_WIDE_PPzZZ_B, CMPLS_WIDE_PPzZZ_H, CMPLS_WIDE_PPzZZ_S)>; 2468 2469// [59] "cmpls $Pd, $Pg/z, $Zn, $imm7"; 2470def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPLS_PPzZI_B, CMPLS_PPzZI_D, CMPLS_PPzZI_H, CMPLS_PPzZI_S)>; 2471 2472// [60] "cmplt $Pd, $Pg/z, $Zn, $Zm"; 2473def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPLT_WIDE_PPzZZ_B, CMPLT_WIDE_PPzZZ_H, CMPLT_WIDE_PPzZZ_S)>; 2474 2475// [61] "cmplt $Pd, $Pg/z, $Zn, $imm5"; 2476def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPLT_PPzZI_B, CMPLT_PPzZI_D, CMPLT_PPzZI_H, CMPLT_PPzZI_S)>; 2477 2478// [62] "cmpne $Pd, $Pg/z, $Zn, $Zm"; 2479def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPNE_PPzZZ_B, CMPNE_PPzZZ_D, CMPNE_PPzZZ_H, CMPNE_PPzZZ_S, CMPNE_WIDE_PPzZZ_B, CMPNE_WIDE_PPzZZ_H, CMPNE_WIDE_PPzZZ_S)>; 2480 2481// [63] "cmpne $Pd, $Pg/z, $Zn, $imm5"; 2482def : InstRW<[A64FXWrite_4Cyc_GI01], (instrs CMPNE_PPzZI_B, CMPNE_PPzZI_D, CMPNE_PPzZI_H, CMPNE_PPzZI_S)>; 2483 2484// [64] "cnot $Zd, $Pg/m, $Zn"; 2485def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs CNOT_ZPmZ_B, CNOT_ZPmZ_D, CNOT_ZPmZ_H, CNOT_ZPmZ_S)>; 2486 2487// [65] "cnt $Zd, $Pg/m, $Zn"; 2488def : InstRW<[A64FXWrite_4Cyc_GI3], (instrs CNT_ZPmZ_B, CNT_ZPmZ_D, CNT_ZPmZ_H, CNT_ZPmZ_S)>; 2489 2490// [66] "cntb $Rd, $pattern, mul $imm4"; 2491def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs CNTB_XPiI)>; 2492 2493// [67] "cntd $Rd, $pattern, mul $imm4"; 2494def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs CNTD_XPiI)>; 2495 2496// [68] "cnth $Rd, $pattern, mul $imm4"; 2497def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs CNTH_XPiI)>; 2498 2499// [69] "cntp $Rd, $Pg, $Pn"; 2500def : InstRW<[A64FXWrite_6Cyc_GI01], (instrs CNTP_XPP_B, CNTP_XPP_D, CNTP_XPP_H, CNTP_XPP_S)>; 2501 2502// [70] "cntw $Rd, $pattern, mul $imm4"; 2503def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs CNTW_XPiI)>; 2504 2505// [71] "compact $Zd, $Pg, $Zn"; 2506def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs COMPACT_ZPZ_D, COMPACT_ZPZ_S)>; 2507 2508// [72] "cpy $Zd, $Pg/m, $Rn"; 2509//@@@ def : InstRW<[XXXXXX], (instrs CPY_ZPmR_B, CPY_ZPmR_D, CPY_ZPmR_H, CPY_ZPmR_S)>; 2510 2511// [73] "cpy $Zd, $Pg/m, $Vn"; 2512//@@@ def : InstRW<[XXXXXX], (instrs CPY_ZPmV_B, CPY_ZPmV_D, CPY_ZPmV_H, CPY_ZPmV_S)>; 2513 2514// [74] "cpy $Zd, $Pg/m, $imm"; 2515//@@@ def : InstRW<[XXXXXX], (instrs CPY_ZPmI_B, CPY_ZPmI_D, CPY_ZPmI_H, CPY_ZPmI_S)>; 2516 2517// [75] "cpy $Zd, $Pg/z, $imm"; 2518//@@@ def : InstRW<[XXXXXX], (instrs CPY_ZPzI_B, CPY_ZPzI_D, CPY_ZPzI_H, CPY_ZPzI_S)>; 2519 2520// [76] "ctermeq $Rn, $Rm"; 2521def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs CTERMEQ_WW, CTERMEQ_XX)>; 2522 2523// [77] "ctermne $Rn, $Rm"; 2524def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs CTERMNE_WW, CTERMNE_XX)>; 2525 2526// [78] "decb $Rdn, $pattern, mul $imm4"; 2527def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs DECB_XPiI)>; 2528 2529// [79] "decd $Rdn, $pattern, mul $imm4"; 2530def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs DECD_XPiI)>; 2531 2532// [80] "decd $Zdn, $pattern, mul $imm4"; 2533def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs DECD_ZPiI)>; 2534 2535// [81] "dech $Rdn, $pattern, mul $imm4"; 2536def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs DECH_XPiI)>; 2537 2538// [82] "dech $Zdn, $pattern, mul $imm4"; 2539def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs DECH_ZPiI)>; 2540 2541// [83] "decp $Rdn, $Pg"; 2542def : InstRW<[A64FXWrite_6Cyc_GI124], (instrs DECP_XP_B, DECP_XP_D, DECP_XP_H, DECP_XP_S)>; 2543 2544// [84] "decp $Zdn, $Pg"; 2545def : InstRW<[A64FXWrite_12Cyc_GI01], (instrs DECP_ZP_D, DECP_ZP_H, DECP_ZP_S)>; 2546 2547// [85] "decw $Rdn, $pattern, mul $imm4"; 2548def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs DECW_XPiI)>; 2549 2550// [86] "decw $Zdn, $pattern, mul $imm4"; 2551def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs DECW_ZPiI)>; 2552 2553// [87] "dup $Zd, $Rn"; 2554def : InstRW<[A64FXWrite_8Cyc_GI01], (instrs DUP_ZR_B, DUP_ZR_D, DUP_ZR_H, DUP_ZR_S)>; 2555 2556// [88] "dup $Zd, $Zn$idx"; 2557def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs DUP_ZZI_B, DUP_ZZI_D, DUP_ZZI_H, DUP_ZZI_Q, DUP_ZZI_S)>; 2558 2559// [89] "dup $Zd, $imm"; 2560def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs DUP_ZI_B, DUP_ZI_D, DUP_ZI_H, DUP_ZI_S)>; 2561 2562// [90] "dupm $Zd, $imms"; 2563def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs DUPM_ZI)>; 2564 2565// [91] "eor $Pd, $Pg/z, $Pn, $Pm"; 2566def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs EOR_PPzPP)>; 2567 2568// [92] "eor $Zd, $Zn, $Zm"; 2569def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs EOR_ZZZ)>; 2570 2571// [93] "eor $Zdn, $Pg/m, $_Zdn, $Zm"; 2572def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs EOR_ZPmZ_B, EOR_ZPmZ_D, EOR_ZPmZ_H, EOR_ZPmZ_S)>; 2573 2574// [94] "eor $Zdn, $_Zdn, $imms13"; 2575def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs EOR_ZI)>; 2576 2577// [95] "eors $Pd, $Pg/z, $Pn, $Pm"; 2578def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs EORS_PPzPP)>; 2579 2580// [96] "eorv $Vd, $Pg, $Zn"; 2581def : InstRW<[A64FXWrite_14Cyc_GI03], (instrs EORV_VPZ_B, EORV_VPZ_D, EORV_VPZ_H, EORV_VPZ_S)>; 2582 2583// [97] "ext $Zdn, $_Zdn, $Zm, $imm8"; 2584def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs EXT_ZZI)>; 2585 2586// [99] "fabd $Zdn, $Pg/m, $_Zdn, $Zm"; 2587def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FABD_ZPmZ_D, FABD_ZPmZ_H, FABD_ZPmZ_S)>; 2588 2589// [100] "fabs $Zd, $Pg/m, $Zn"; 2590def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FABS_ZPmZ_D, FABS_ZPmZ_H, FABS_ZPmZ_S)>; 2591 2592// [101] "facge $Pd, $Pg/z, $Zn, $Zm"; 2593def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FACGE_PPzZZ_D, FACGE_PPzZZ_H, FACGE_PPzZZ_S)>; 2594 2595// [102] "facgt $Pd, $Pg/z, $Zn, $Zm"; 2596def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FACGT_PPzZZ_D, FACGT_PPzZZ_H, FACGT_PPzZZ_S)>; 2597 2598// [103] "fadd $Zd, $Zn, $Zm"; def is line 1638 2599def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FADD_ZZZ_D, FADD_ZZZ_H, FADD_ZZZ_S)>; 2600 2601// [104] "fadd $Zdn, $Pg/m, $_Zdn, $Zm"; def is line 1638 2602def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FADD_ZPmZ_D, FADD_ZPmZ_H, FADD_ZPmZ_S)>; 2603 2604// [105] "fadd $Zdn, $Pg/m, $_Zdn, $i1"; def is line 1638 2605def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FADD_ZPmI_D, FADD_ZPmI_H, FADD_ZPmI_S)>; 2606 2607// [106] "fadda $Vdn, $Pg, $_Vdn, $Zm"; 2608def : InstRW<[A64FXWrite_18Cyc_GI03], (instrs FADDA_VPZ_D, FADDA_VPZ_H, FADDA_VPZ_S)>; 2609 2610// [107] "faddv $Vd, $Pg, $Zn"; 2611// H : 4 / 6 / ([1,2]9 / [1]6) x 4 / [1,2]9 = 75 cycle 2612// S : 4 / 6 / ([1,2]9 / [1]6) x 3 / [1,2]9 = 60 cycle 2613// D : 4 / 6 / ([1,2]9 / [1]6) x 2 / [1,2]9 = 45 cycle 2614def : InstRW<[A64FXWrite_75Cyc_GI03], (instrs FADDV_VPZ_H)>; 2615def : InstRW<[A64FXWrite_60Cyc_GI03], (instrs FADDV_VPZ_S)>; 2616def : InstRW<[A64FXWrite_45Cyc_GI03], (instrs FADDV_VPZ_D)>; 2617 2618// [108] "fcadd $Zdn, $Pg/m, $_Zdn, $Zm, $imm"; 2619def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FCADD_ZPmZ_D, FCADD_ZPmZ_H, FCADD_ZPmZ_S)>; 2620 2621// [109] "fcmeq $Pd, $Pg/z, $Zn, #0.0"; 2622def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMEQ_PPzZ0_D, FCMEQ_PPzZ0_H, FCMEQ_PPzZ0_S)>; 2623 2624// [110] "fcmeq $Pd, $Pg/z, $Zn, $Zm"; 2625def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMEQ_PPzZZ_D, FCMEQ_PPzZZ_H, FCMEQ_PPzZZ_S)>; 2626 2627// [111] "fcmge $Pd, $Pg/z, $Zn, #0.0"; 2628def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMGE_PPzZ0_D, FCMGE_PPzZ0_H, FCMGE_PPzZ0_S)>; 2629 2630// [112] "fcmge $Pd, $Pg/z, $Zn, $Zm"; 2631def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMGE_PPzZZ_D, FCMGE_PPzZZ_H, FCMGE_PPzZZ_S)>; 2632 2633// [113] "fcmgt $Pd, $Pg/z, $Zn, #0.0"; 2634def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMGT_PPzZ0_D, FCMGT_PPzZ0_H, FCMGT_PPzZ0_S)>; 2635 2636// [114] "fcmgt $Pd, $Pg/z, $Zn, $Zm"; 2637def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMGT_PPzZZ_D, FCMGT_PPzZZ_H, FCMGT_PPzZZ_S)>; 2638 2639// [115] "fcmla $Zda, $Pg/m, $Zn, $Zm, $imm"; 2640def : InstRW<[A64FXWrite_15Cyc_GI03], (instrs FCMLA_ZPmZZ_D, FCMLA_ZPmZZ_H, FCMLA_ZPmZZ_S)>; 2641 2642// [116] "fcmla $Zda, $Zn, $Zm$iop, $imm"; 2643def : InstRW<[A64FXWrite_15Cyc_GI03], (instrs FCMLA_ZZZI_H, FCMLA_ZZZI_S)>; 2644 2645// [117] "fcmle $Pd, $Pg/z, $Zn, #0.0"; 2646def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMLE_PPzZ0_D, FCMLE_PPzZ0_H, FCMLE_PPzZ0_S)>; 2647 2648// [118] "fcmlt $Pd, $Pg/z, $Zn, #0.0"; 2649def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMLT_PPzZ0_D, FCMLT_PPzZ0_H, FCMLT_PPzZ0_S)>; 2650 2651// [119] "fcmne $Pd, $Pg/z, $Zn, #0.0"; 2652def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMNE_PPzZ0_D, FCMNE_PPzZ0_H, FCMNE_PPzZ0_S)>; 2653 2654// [120] "fcmne $Pd, $Pg/z, $Zn, $Zm"; 2655def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMNE_PPzZZ_D, FCMNE_PPzZZ_H, FCMNE_PPzZZ_S)>; 2656 2657// [121] "fcmuo $Pd, $Pg/z, $Zn, $Zm"; 2658def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCMUO_PPzZZ_D, FCMUO_PPzZZ_H, FCMUO_PPzZZ_S)>; 2659 2660// [122] "fcpy $Zd, $Pg/m, $imm8"; 2661def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FCPY_ZPmI_D, FCPY_ZPmI_H, FCPY_ZPmI_S)>; 2662 2663// [123] "fcvt $Zd, $Pg/m, $Zn"; 2664def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FCVT_ZPmZ_DtoH, FCVT_ZPmZ_DtoS, FCVT_ZPmZ_HtoD, FCVT_ZPmZ_HtoS, FCVT_ZPmZ_StoD, FCVT_ZPmZ_StoH)>; 2665 2666// [124] "fcvtzs $Zd, $Pg/m, $Zn"; 2667def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FCVTZS_ZPmZ_DtoD, FCVTZS_ZPmZ_DtoS, FCVTZS_ZPmZ_HtoD, FCVTZS_ZPmZ_HtoH, FCVTZS_ZPmZ_HtoS, FCVTZS_ZPmZ_StoD, FCVTZS_ZPmZ_StoS)>; 2668 2669// [125] "fcvtzu $Zd, $Pg/m, $Zn"; 2670def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FCVTZU_ZPmZ_DtoD, FCVTZU_ZPmZ_DtoS, FCVTZU_ZPmZ_HtoD, FCVTZU_ZPmZ_HtoH, FCVTZU_ZPmZ_HtoS, FCVTZU_ZPmZ_StoD, FCVTZU_ZPmZ_StoS)>; 2671 2672// [126] "fdiv $Zdn, $Pg/m, $_Zdn, $Zm"; 2673def : InstRW<[A64FXWrite_154Cyc_GI0], (instrs FDIV_ZPmZ_D)>; 2674def : InstRW<[A64FXWrite_134Cyc_GI0], (instrs FDIV_ZPmZ_H)>; 2675def : InstRW<[A64FXWrite_98Cyc_GI0], (instrs FDIV_ZPmZ_S)>; 2676 2677// [127] "fdivr $Zdn, $Pg/m, $_Zdn, $Zm"; 2678def : InstRW<[A64FXWrite_154Cyc_GI0], (instrs FDIVR_ZPmZ_D)>; 2679def : InstRW<[A64FXWrite_134Cyc_GI0], (instrs FDIVR_ZPmZ_H)>; 2680def : InstRW<[A64FXWrite_98Cyc_GI0], (instrs FDIVR_ZPmZ_S)>; 2681 2682// [128] "fdup $Zd, $imm8"; 2683def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FDUP_ZI_D, FDUP_ZI_H, FDUP_ZI_S)>; 2684 2685// [129] "fexpa $Zd, $Zn"; 2686def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FEXPA_ZZ_D, FEXPA_ZZ_H, FEXPA_ZZ_S)>; 2687 2688// [130] "fmad $Zdn, $Pg/m, $Zm, $Za"; 2689def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FMAD_ZPmZZ_D, FMAD_ZPmZZ_H, FMAD_ZPmZZ_S)>; 2690 2691// [131] "fmax $Zdn, $Pg/m, $_Zdn, $Zm"; 2692def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FMAX_ZPmZ_D, FMAX_ZPmZ_H, FMAX_ZPmZ_S)>; 2693 2694// [132] "fmax $Zdn, $Pg/m, $_Zdn, $i1"; 2695def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FMAX_ZPmI_D, FMAX_ZPmI_H, FMAX_ZPmI_S)>; 2696 2697// [133] "fmaxnm $Zdn, $Pg/m, $_Zdn, $Zm"; 2698def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FMAXNM_ZPmZ_D, FMAXNM_ZPmZ_H, FMAXNM_ZPmZ_S)>; 2699 2700// [134] "fmaxnm $Zdn, $Pg/m, $_Zdn, $i1"; 2701def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FMAXNM_ZPmI_D, FMAXNM_ZPmI_H, FMAXNM_ZPmI_S)>; 2702 2703// [135] "fmaxnmv $Vd, $Pg, $Zn"; 2704def : InstRW<[A64FXWrite_10Cyc_GI03], (instrs FMAXNMV_VPZ_D, FMAXNMV_VPZ_H, FMAXNMV_VPZ_S)>; 2705 2706// [136] "fmaxv $Vd, $Pg, $Zn"; 2707def : InstRW<[A64FXWrite_10Cyc_GI03], (instrs FMAXV_VPZ_D, FMAXV_VPZ_H, FMAXV_VPZ_S)>; 2708 2709// [137] "fmin $Zdn, $Pg/m, $_Zdn, $Zm"; 2710def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FMIN_ZPmZ_D, FMIN_ZPmZ_H, FMIN_ZPmZ_S)>; 2711 2712// [138] "fmin $Zdn, $Pg/m, $_Zdn, $i1"; 2713def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FMIN_ZPmI_D, FMIN_ZPmI_H, FMIN_ZPmI_S)>; 2714 2715// [139] "fminnm $Zdn, $Pg/m, $_Zdn, $Zm"; 2716def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FMINNM_ZPmZ_D, FMINNM_ZPmZ_H, FMINNM_ZPmZ_S)>; 2717 2718// [140] "fminnm $Zdn, $Pg/m, $_Zdn, $i1"; 2719def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs FMINNM_ZPmI_D, FMINNM_ZPmI_H, FMINNM_ZPmI_S)>; 2720 2721// [141] "fminnmv $Vd, $Pg, $Zn"; 2722def : InstRW<[A64FXWrite_10Cyc_GI03], (instrs FMINNMV_VPZ_D, FMINNMV_VPZ_H, FMINNMV_VPZ_S)>; 2723 2724// [142] "fminv $Vd, $Pg, $Zn"; 2725def : InstRW<[A64FXWrite_10Cyc_GI03], (instrs FMINV_VPZ_D, FMINV_VPZ_H, FMINV_VPZ_S)>; 2726 2727// [143] "fmla $Zda, $Pg/m, $Zn, $Zm"; 2728def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FMLA_ZPmZZ_D, FMLA_ZPmZZ_H, FMLA_ZPmZZ_S)>; 2729 2730// [144] "fmla $Zda, $Zn, $Zm$iop"; 2731def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FMLA_ZZZI_D, FMLA_ZZZI_H, FMLA_ZZZI_S)>; 2732 2733// [145] "fmls $Zda, $Pg/m, $Zn, $Zm"; 2734def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FMLS_ZPmZZ_D, FMLS_ZPmZZ_H, FMLS_ZPmZZ_S)>; 2735 2736// [146] "fmls $Zda, $Zn, $Zm$iop"; 2737def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FMLS_ZZZI_D, FMLS_ZZZI_H, FMLS_ZZZI_S)>; 2738 2739// [147] "fmsb $Zdn, $Pg/m, $Zm, $Za"; 2740 2741// [148] "fmul $Zd, $Zn, $Zm"; 2742 2743// [149] "fmul $Zd, $Zn, $Zm$iop"; 2744 2745// [150] "fmul $Zdn, $Pg/m, $_Zdn, $Zm"; 2746 2747// [151] "fmul $Zdn, $Pg/m, $_Zdn, $i1"; 2748 2749// [152] "fmulx $Zdn, $Pg/m, $_Zdn, $Zm"; 2750 2751// [153] "fneg $Zd, $Pg/m, $Zn"; 2752def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FNEG_ZPmZ_D, FNEG_ZPmZ_H, FNEG_ZPmZ_S)>; 2753 2754// [154] "fnmad $Zdn, $Pg/m, $Zm, $Za"; 2755def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FNMAD_ZPmZZ_D, FNMAD_ZPmZZ_H, FNMAD_ZPmZZ_S)>; 2756 2757// [155] "fnmla $Zda, $Pg/m, $Zn, $Zm"; 2758def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FNMLA_ZPmZZ_D, FNMLA_ZPmZZ_H, FNMLA_ZPmZZ_S)>; 2759 2760// [156] "fnmls $Zda, $Pg/m, $Zn, $Zm"; 2761def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FNMLS_ZPmZZ_D, FNMLS_ZPmZZ_H, FNMLS_ZPmZZ_S)>; 2762 2763// [157] "fnmsb $Zdn, $Pg/m, $Zm, $Za"; 2764def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FNMSB_ZPmZZ_D, FNMSB_ZPmZZ_H, FNMSB_ZPmZZ_S)>; 2765 2766// [158] "frecpe $Zd, $Zn"; 2767def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FRECPE_ZZ_D, FRECPE_ZZ_H, FRECPE_ZZ_S)>; 2768 2769// [159] "frecps $Zd, $Zn, $Zm"; 2770def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FRECPS_ZZZ_D, FRECPS_ZZZ_H, FRECPS_ZZZ_S)>; 2771 2772// [160] "frecpx $Zd, $Pg/m, $Zn"; 2773def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FRECPX_ZPmZ_D, FRECPX_ZPmZ_H, FRECPX_ZPmZ_S)>; 2774 2775// [161] "frinta $Zd, $Pg/m, $Zn"; 2776def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FRINTA_ZPmZ_D, FRINTA_ZPmZ_H, FRINTA_ZPmZ_S)>; 2777 2778// [162] "frinti $Zd, $Pg/m, $Zn"; 2779def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FRINTI_ZPmZ_D, FRINTI_ZPmZ_H, FRINTI_ZPmZ_S)>; 2780 2781// [163] "frintm $Zd, $Pg/m, $Zn"; 2782def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FRINTM_ZPmZ_D, FRINTM_ZPmZ_H, FRINTM_ZPmZ_S)>; 2783 2784// [164] "frintn $Zd, $Pg/m, $Zn"; 2785def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FRINTN_ZPmZ_D, FRINTN_ZPmZ_H, FRINTN_ZPmZ_S)>; 2786 2787// [165] "frintp $Zd, $Pg/m, $Zn"; 2788def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FRINTP_ZPmZ_D, FRINTP_ZPmZ_H, FRINTP_ZPmZ_S)>; 2789 2790// [166] "frintx $Zd, $Pg/m, $Zn"; 2791def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FRINTX_ZPmZ_D, FRINTX_ZPmZ_H, FRINTX_ZPmZ_S)>; 2792 2793// [167] "frintz $Zd, $Pg/m, $Zn"; 2794def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FRINTZ_ZPmZ_D, FRINTZ_ZPmZ_H, FRINTZ_ZPmZ_S)>; 2795 2796// [168] "frsqrte $Zd, $Zn"; 2797def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FRSQRTE_ZZ_D, FRSQRTE_ZZ_H, FRSQRTE_ZZ_S)>; 2798 2799// [169] "frsqrts $Zd, $Zn, $Zm"; 2800def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs FRSQRTS_ZZZ_D, FRSQRTS_ZZZ_H, FRSQRTS_ZZZ_S)>; 2801 2802// [170] "fscale $Zdn, $Pg/m, $_Zdn, $Zm"; 2803def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FSCALE_ZPmZ_D, FSCALE_ZPmZ_H, FSCALE_ZPmZ_S)>; 2804 2805// [171] "fsqrt $Zd, $Pg/m, $Zn"; 2806def : InstRW<[A64FXWrite_154Cyc_GI0], (instrs FSQRT_ZPmZ_D)>; 2807def : InstRW<[A64FXWrite_134Cyc_GI0], (instrs FSQRT_ZPmZ_H)>; 2808def : InstRW<[A64FXWrite_98Cyc_GI0], (instrs FSQRT_ZPmZ_S)>; 2809 2810// [172] "fsub $Zd, $Zn, $Zm"; 2811def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FSUB_ZZZ_D, FSUB_ZZZ_H, FSUB_ZZZ_S)>; 2812 2813// [173] "fsub $Zdn, $Pg/m, $_Zdn, $Zm"; 2814def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FSUB_ZPmZ_D, FSUB_ZPmZ_H, FSUB_ZPmZ_S)>; 2815 2816// [174] "fsub $Zdn, $Pg/m, $_Zdn, $i1"; 2817def : InstRW<[A64FXWrite_9Cyc_GI0], (instrs FSUB_ZPmI_D, FSUB_ZPmI_H, FSUB_ZPmI_S)>; 2818 2819// [175] "fsubr $Zdn, $Pg/m, $_Zdn, $Zm"; 2820def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FSUBR_ZPmZ_D, FSUBR_ZPmZ_H, FSUBR_ZPmZ_S)>; 2821 2822// [176] "fsubr $Zdn, $Pg/m, $_Zdn, $i1"; 2823def : InstRW<[A64FXWrite_9Cyc_GI0], (instrs FSUBR_ZPmI_D, FSUBR_ZPmI_H, FSUBR_ZPmI_S)>; 2824 2825// [177] "ftmad $Zdn, $_Zdn, $Zm, $imm3"; 2826def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FTMAD_ZZI_D, FTMAD_ZZI_H, FTMAD_ZZI_S)>; 2827 2828// [178] "ftsmul $Zd, $Zn, $Zm"; 2829def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs FTSMUL_ZZZ_D, FTSMUL_ZZZ_H, FTSMUL_ZZZ_S)>; 2830 2831// [180] "incb $Rdn, $pattern, mul $imm4"; 2832def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs INCB_XPiI)>; 2833 2834// [181] "incd $Rdn, $pattern, mul $imm4"; 2835def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs INCD_XPiI)>; 2836 2837// [182] "incd $Zdn, $pattern, mul $imm4"; 2838def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs INCD_ZPiI)>; 2839 2840// [183] "inch $Rdn, $pattern, mul $imm4"; 2841def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs INCH_XPiI)>; 2842 2843// [184] "inch $Zdn, $pattern, mul $imm4"; 2844def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs INCH_ZPiI)>; 2845 2846// [185] "incp $Rdn, $Pg"; 2847def : InstRW<[A64FXWrite_6Cyc_GI124], (instrs INCP_XP_B, INCP_XP_D, INCP_XP_H, INCP_XP_S)>; 2848 2849// [186] "incp $Zdn, $Pg"; 2850def : InstRW<[A64FXWrite_12Cyc_GI01], (instrs INCP_ZP_D, INCP_ZP_H, INCP_ZP_S)>; 2851 2852// [187] "incw $Rdn, $pattern, mul $imm4"; 2853def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs INCW_XPiI)>; 2854 2855// [188] "incw $Zdn, $pattern, mul $imm4"; 2856def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs INCW_ZPiI)>; 2857 2858// [189] "index $Zd, $Rn, $Rm"; 2859def : InstRW<[A64FXWrite_17Cyc_GI02], (instrs INDEX_RR_B, INDEX_RR_D, INDEX_RR_H, INDEX_RR_S)>; 2860 2861// [190] "index $Zd, $Rn, $imm5"; 2862def : InstRW<[A64FXWrite_21Cyc_GI02], (instrs INDEX_RI_B, INDEX_RI_D, INDEX_RI_H, INDEX_RI_S)>; 2863 2864// [191] "index $Zd, $imm5, $Rm"; 2865def : InstRW<[A64FXWrite_21Cyc_GI02], (instrs INDEX_IR_B, INDEX_IR_D, INDEX_IR_H, INDEX_IR_S)>; 2866 2867// [192] "index $Zd, $imm5, $imm5b"; 2868def : InstRW<[A64FXWrite_13Cyc_GI0], (instrs INDEX_II_B, INDEX_II_D, INDEX_II_H, INDEX_II_S)>; 2869 2870// [193] "insr $Zdn, $Rm"; 2871def : InstRW<[A64FXWrite_10Cyc_GI02], (instrs INSR_ZR_B, INSR_ZR_D, INSR_ZR_H, INSR_ZR_S)>; 2872 2873// [194] "insr $Zdn, $Vm"; 2874def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs INSR_ZV_B, INSR_ZV_D, INSR_ZV_H, INSR_ZV_S)>; 2875 2876// [195] "lasta $Rd, $Pg, $Zn"; 2877def : InstRW<[A64FXWrite_25Cyc_GI056], (instrs LASTA_RPZ_B, LASTA_RPZ_D, LASTA_RPZ_H, LASTA_RPZ_S)>; 2878 2879// [196] "lasta $Vd, $Pg, $Zn"; 2880def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs LASTA_VPZ_B, LASTA_VPZ_D, LASTA_VPZ_H, LASTA_VPZ_S)>; 2881 2882// [197] "lastb $Rd, $Pg, $Zn"; 2883def : InstRW<[A64FXWrite_25Cyc_GI056], (instrs LASTB_RPZ_B, LASTB_RPZ_D, LASTB_RPZ_H, LASTB_RPZ_S)>; 2884 2885// [198] "lastb $Vd, $Pg, $Zn"; 2886def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs LASTB_VPZ_B, LASTB_VPZ_D, LASTB_VPZ_H, LASTB_VPZ_S)>; 2887 2888// [199] "ld1b $Zt, $Pg/z, [$Rn, $Rm]"; 2889def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1B, LD1B_D, LD1B_H, LD1B_S)>; 2890 2891// [200] "ld1b $Zt, $Pg/z, [$Rn, $Zm]"; 2892def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLD1B_D_REAL, GLD1B_D_SXTW_REAL, GLD1B_D_UXTW_REAL, GLD1B_S_SXTW_REAL, GLD1B_S_UXTW_REAL)>; 2893 2894// [201] "ld1b $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 2895def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1B_D_IMM_REAL, LD1B_H_IMM_REAL, LD1B_IMM_REAL, LD1B_S_IMM_REAL)>; 2896 2897// [202] "ld1b $Zt, $Pg/z, [$Zn, $imm5]"; 2898def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLD1B_D_IMM_REAL, GLD1B_S_IMM_REAL)>; 2899 2900// [203] "ld1d $Zt, $Pg/z, [$Rn, $Rm]"; 2901def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1D)>; 2902 2903// [204] "ld1d $Zt, $Pg/z, [$Rn, $Zm]"; 2904def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLD1D_REAL, GLD1D_SCALED_REAL, GLD1D_SXTW_REAL, GLD1D_SXTW_SCALED_REAL, GLD1D_UXTW_REAL, GLD1D_UXTW_SCALED_REAL)>; 2905 2906// [205] "ld1d $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 2907def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1D_IMM_REAL)>; 2908 2909// [206] "ld1d $Zt, $Pg/z, [$Zn, $imm5]"; 2910def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLD1D_IMM_REAL)>; 2911 2912// [207] "ld1h $Zt, $Pg/z, [$Rn, $Rm]"; 2913def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1H, LD1H_D, LD1H_S)>; 2914 2915// [208] "ld1h $Zt, $Pg/z, [$Rn, $Zm]"; 2916def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLD1H_D_REAL, GLD1H_D_SCALED_REAL, GLD1H_D_SXTW_REAL, GLD1H_D_SXTW_SCALED_REAL, GLD1H_D_UXTW_REAL, GLD1H_D_UXTW_SCALED_REAL, GLD1H_S_SXTW_REAL, GLD1H_S_SXTW_SCALED_REAL, GLD1H_S_UXTW_REAL, GLD1H_S_UXTW_SCALED_REAL)>; 2917 2918// [209] "ld1h $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 2919def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1H_D_IMM_REAL, LD1H_IMM_REAL, LD1H_S_IMM_REAL)>; 2920 2921// [210] "ld1h $Zt, $Pg/z, [$Zn, $imm5]"; 2922def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLD1H_D_IMM_REAL, GLD1H_S_IMM_REAL)>; 2923 2924// [211] "ld1rb $Zt, $Pg/z, [$Rn, $imm6]"; 2925def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RB_D_IMM, LD1RB_H_IMM, LD1RB_IMM, LD1RB_S_IMM)>; 2926 2927// [212] "ld1rd $Zt, $Pg/z, [$Rn, $imm6]"; 2928def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RD_IMM)>; 2929 2930// [213] "ld1rh $Zt, $Pg/z, [$Rn, $imm6]"; 2931def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RH_D_IMM, LD1RH_IMM, LD1RH_S_IMM)>; 2932 2933// [214] "ld1rqb $Zt, $Pg/z, [$Rn, $Rm]"; 2934def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RQ_B)>; 2935 2936// [215] "ld1rqb $Zt, $Pg/z, [$Rn, $imm4]"; 2937def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RQ_B_IMM)>; 2938 2939// [216] "ld1rqd $Zt, $Pg/z, [$Rn, $Rm]"; 2940def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RQ_D)>; 2941 2942// [217] "ld1rqd $Zt, $Pg/z, [$Rn, $imm4]"; 2943def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RQ_D_IMM)>; 2944 2945// [218] "ld1rqh $Zt, $Pg/z, [$Rn, $Rm]"; 2946def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RQ_H)>; 2947 2948// [219] "ld1rqh $Zt, $Pg/z, [$Rn, $imm4]"; 2949def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RQ_H_IMM)>; 2950 2951// [220] "ld1rqw $Zt, $Pg/z, [$Rn, $Rm]"; 2952def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RQ_W)>; 2953 2954// [221] "ld1rqw $Zt, $Pg/z, [$Rn, $imm4]"; 2955def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RQ_W_IMM)>; 2956 2957// [222] "ld1rsb $Zt, $Pg/z, [$Rn, $imm6]"; 2958def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RSB_D_IMM, LD1RSB_H_IMM, LD1RSB_S_IMM)>; 2959 2960// [223] "ld1rsh $Zt, $Pg/z, [$Rn, $imm6]"; 2961def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RSH_D_IMM, LD1RSH_S_IMM)>; 2962 2963// [224] "ld1rsw $Zt, $Pg/z, [$Rn, $imm6]"; 2964def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RSW_IMM)>; 2965 2966// [225] "ld1rw $Zt, $Pg/z, [$Rn, $imm6]"; 2967def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1RW_D_IMM, LD1RW_IMM)>; 2968 2969// [226] "ld1sb $Zt, $Pg/z, [$Rn, $Rm]"; 2970def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1SB_D, LD1SB_H, LD1SB_S)>; 2971 2972// [227] "ld1sb $Zt, $Pg/z, [$Rn, $Zm]"; 2973def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLD1SB_D_REAL, GLD1SB_D_SXTW_REAL, GLD1SB_D_UXTW_REAL, GLD1SB_S_SXTW_REAL, GLD1SB_S_UXTW_REAL)>; 2974 2975// [228] "ld1sb $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 2976def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1SB_D_IMM_REAL, LD1SB_H_IMM_REAL, LD1SB_S_IMM_REAL)>; 2977 2978// [229] "ld1sb $Zt, $Pg/z, [$Zn, $imm5]"; 2979def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLD1SB_D_IMM_REAL, GLD1SB_S_IMM_REAL)>; 2980 2981// [230] "ld1sh $Zt, $Pg/z, [$Rn, $Rm]"; 2982def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1SH_D, LD1SH_S)>; 2983 2984// [231] "ld1sh $Zt, $Pg/z, [$Rn, $Zm]"; 2985def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLD1SH_D_REAL, GLD1SH_D_SCALED_REAL, GLD1SH_D_SXTW_REAL, GLD1SH_D_SXTW_SCALED_REAL, GLD1SH_D_UXTW_REAL, GLD1SH_D_UXTW_SCALED_REAL, GLD1SH_S_SXTW_REAL, GLD1SH_S_SXTW_SCALED_REAL, GLD1SH_S_UXTW_REAL, GLD1SH_S_UXTW_SCALED_REAL)>; 2986 2987// [232] "ld1sh $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 2988def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1SH_D_IMM_REAL, LD1SH_S_IMM_REAL)>; 2989 2990// [233] "ld1sh $Zt, $Pg/z, [$Zn, $imm5]"; 2991def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLD1SH_D_IMM_REAL, GLD1SH_S_IMM_REAL)>; 2992 2993// [234] "ld1sw $Zt, $Pg/z, [$Rn, $Rm]"; 2994def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1SW_D)>; 2995 2996// [235] "ld1sw $Zt, $Pg/z, [$Rn, $Zm]"; 2997def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLD1SW_D_REAL, GLD1SW_D_SCALED_REAL, GLD1SW_D_SXTW_REAL, GLD1SW_D_SXTW_SCALED_REAL, GLD1SW_D_UXTW_REAL, GLD1SW_D_UXTW_SCALED_REAL)>; 2998 2999// [236] "ld1sw $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3000def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1SW_D_IMM_REAL)>; 3001 3002// [237] "ld1sw $Zt, $Pg/z, [$Zn, $imm5]"; 3003def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLD1SW_D_IMM_REAL)>; 3004 3005// [238] "ld1w $Zt, $Pg/z, [$Rn, $Rm]"; 3006def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1W, LD1W_D)>; 3007 3008// [239] "ld1w $Zt, $Pg/z, [$Rn, $Zm]"; 3009def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLD1W_D_REAL, GLD1W_D_SCALED_REAL, GLD1W_D_SXTW_REAL, GLD1W_D_SXTW_SCALED_REAL, GLD1W_D_UXTW_REAL, GLD1W_D_UXTW_SCALED_REAL, GLD1W_SXTW_REAL, GLD1W_SXTW_SCALED_REAL, GLD1W_UXTW_REAL, GLD1W_UXTW_SCALED_REAL)>; 3010 3011// [240] "ld1w $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3012def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD1W_D_IMM_REAL, LD1W_IMM_REAL)>; 3013 3014// [241] "ld1w $Zt, $Pg/z, [$Zn, $imm5]"; 3015def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLD1W_D_IMM_REAL, GLD1W_IMM_REAL)>; 3016 3017// [242] "ld2b $Zt, $Pg/z, [$Rn, $Rm]"; 3018def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD2B)>; 3019 3020// [243] "ld2b $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3021def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD2B_IMM)>; 3022 3023// [244] "ld2d $Zt, $Pg/z, [$Rn, $Rm]"; 3024def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD2D)>; 3025 3026// [245] "ld2d $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3027def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD2D_IMM)>; 3028 3029// [246] "ld2h $Zt, $Pg/z, [$Rn, $Rm]"; 3030def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD2H)>; 3031 3032// [247] "ld2h $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3033def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD2H_IMM)>; 3034 3035// [248] "ld2w $Zt, $Pg/z, [$Rn, $Rm]"; 3036def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD2W)>; 3037 3038// [249] "ld2w $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3039def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD2W_IMM)>; 3040 3041// [250] "ld3b $Zt, $Pg/z, [$Rn, $Rm]"; 3042def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD3B)>; 3043 3044// [251] "ld3b $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3045def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD3B_IMM)>; 3046 3047// [252] "ld3d $Zt, $Pg/z, [$Rn, $Rm]"; 3048def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD3D)>; 3049 3050// [253] "ld3d $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3051def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD3D_IMM)>; 3052 3053// [254] "ld3h $Zt, $Pg/z, [$Rn, $Rm]"; 3054def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD3H)>; 3055 3056// [255] "ld3h $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3057def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD3H_IMM)>; 3058 3059// [256] "ld3w $Zt, $Pg/z, [$Rn, $Rm]"; 3060def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD3W)>; 3061 3062// [257] "ld3w $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3063def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD3W_IMM)>; 3064 3065// [258] "ld4b $Zt, $Pg/z, [$Rn, $Rm]"; 3066def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD4B)>; 3067 3068// [259] "ld4b $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3069def : InstRW<[A64FXWrite_44Cyc_GI56], (instrs LD4B_IMM)>; 3070 3071// [260] "ld4d $Zt, $Pg/z, [$Rn, $Rm]"; 3072def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD4D)>; 3073 3074// [261] "ld4d $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3075def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD4D_IMM)>; 3076 3077// [262] "ld4h $Zt, $Pg/z, [$Rn, $Rm]"; 3078def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD4H)>; 3079 3080// [263] "ld4h $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3081def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD4H_IMM)>; 3082 3083// [264] "ld4w $Zt, $Pg/z, [$Rn, $Rm]"; 3084def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD4W)>; 3085 3086// [265] "ld4w $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3087def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LD4W_IMM)>; 3088 3089// [266] "ldff1b $Zt, $Pg/z, [$Rn, $Rm]"; 3090def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDFF1B_D_REAL, LDFF1B_H_REAL, LDFF1B_REAL, LDFF1B_S_REAL)>; 3091 3092// [267] "ldff1b $Zt, $Pg/z, [$Rn, $Zm]"; 3093def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLDFF1B_D_REAL, GLDFF1B_D_SXTW_REAL, GLDFF1B_D_UXTW_REAL, GLDFF1B_S_SXTW_REAL, GLDFF1B_S_UXTW_REAL)>; 3094 3095// [268] "ldff1b $Zt, $Pg/z, [$Zn, $imm5]"; 3096def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLDFF1B_D_IMM_REAL, GLDFF1B_S_IMM_REAL)>; 3097 3098// [269] "ldff1d $Zt, $Pg/z, [$Rn, $Rm]"; 3099def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDFF1D_REAL)>; 3100 3101// [270] "ldff1d $Zt, $Pg/z, [$Rn, $Zm]"; 3102def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLDFF1D_REAL, GLDFF1D_SCALED_REAL, GLDFF1D_SXTW_REAL, GLDFF1D_SXTW_SCALED_REAL, GLDFF1D_UXTW_REAL, GLDFF1D_UXTW_SCALED_REAL)>; 3103 3104// [271] "ldff1d $Zt, $Pg/z, [$Zn, $imm5]"; 3105def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLDFF1D_IMM_REAL)>; 3106 3107// [272] "ldff1h $Zt, $Pg/z, [$Rn, $Rm]"; 3108def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDFF1H_D_REAL, LDFF1H_REAL, LDFF1H_S_REAL)>; 3109 3110// [273] "ldff1h $Zt, $Pg/z, [$Rn, $Zm]"; 3111def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLDFF1H_D_REAL, GLDFF1H_D_SCALED_REAL, GLDFF1H_D_SXTW_REAL, GLDFF1H_D_SXTW_SCALED_REAL, GLDFF1H_D_UXTW_REAL, GLDFF1H_D_UXTW_SCALED_REAL, GLDFF1H_S_SXTW_REAL, GLDFF1H_S_SXTW_SCALED_REAL, GLDFF1H_S_UXTW_REAL, GLDFF1H_S_UXTW_SCALED_REAL)>; 3112 3113// [274] "ldff1h $Zt, $Pg/z, [$Zn, $imm5]"; 3114def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLDFF1H_D_IMM_REAL, GLDFF1H_S_IMM_REAL)>; 3115 3116// [275] "ldff1sb $Zt, $Pg/z, [$Rn, $Rm]"; 3117def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDFF1SB_D_REAL, LDFF1SB_H_REAL, LDFF1SB_S_REAL)>; 3118 3119// [276] "ldff1sb $Zt, $Pg/z, [$Rn, $Zm]"; 3120def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLDFF1SB_D_REAL, GLDFF1SB_D_SXTW_REAL, GLDFF1SB_D_UXTW_REAL, GLDFF1SB_S_SXTW_REAL, GLDFF1SB_S_UXTW_REAL)>; 3121 3122// [277] "ldff1sb $Zt, $Pg/z, [$Zn, $imm5]"; 3123def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLDFF1SB_D_IMM_REAL, GLDFF1SB_S_IMM_REAL)>; 3124 3125// [278] "ldff1sh $Zt, $Pg/z, [$Rn, $Rm]"; 3126def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDFF1SH_D_REAL, LDFF1SH_S_REAL)>; 3127 3128// [279] "ldff1sh $Zt, $Pg/z, [$Rn, $Zm]"; 3129def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLDFF1SH_D_REAL, GLDFF1SH_D_SCALED_REAL, GLDFF1SH_D_SXTW_REAL, GLDFF1SH_D_SXTW_SCALED_REAL, GLDFF1SH_D_UXTW_REAL, GLDFF1SH_D_UXTW_SCALED_REAL, GLDFF1SH_S_SXTW_REAL, GLDFF1SH_S_SXTW_SCALED_REAL, GLDFF1SH_S_UXTW_REAL, GLDFF1SH_S_UXTW_SCALED_REAL)>; 3130 3131// [280] "ldff1sh $Zt, $Pg/z, [$Zn, $imm5]"; 3132def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLDFF1SH_D_IMM_REAL, GLDFF1SH_S_IMM_REAL)>; 3133 3134// [281] "ldff1sw $Zt, $Pg/z, [$Rn, $Rm]"; 3135def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDFF1SW_D_REAL)>; 3136 3137// [282] "ldff1sw $Zt, $Pg/z, [$Rn, $Zm]"; 3138def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLDFF1SW_D_REAL, GLDFF1SW_D_SCALED_REAL, GLDFF1SW_D_SXTW_REAL, GLDFF1SW_D_SXTW_SCALED_REAL, GLDFF1SW_D_UXTW_REAL, GLDFF1SW_D_UXTW_SCALED_REAL)>; 3139 3140// [283] "ldff1sw $Zt, $Pg/z, [$Zn, $imm5]"; 3141def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLDFF1SW_D_IMM_REAL)>; 3142 3143// [284] "ldff1w $Zt, $Pg/z, [$Rn, $Rm]"; 3144def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDFF1W_D_REAL, LDFF1W_REAL)>; 3145 3146// [285] "ldff1w $Zt, $Pg/z, [$Rn, $Zm]"; 3147def : InstRW<[A64FXWrite_19Cyc_GI0256], (instrs GLDFF1W_D_REAL, GLDFF1W_D_SCALED_REAL, GLDFF1W_D_SXTW_REAL, GLDFF1W_D_SXTW_SCALED_REAL, GLDFF1W_D_UXTW_REAL, GLDFF1W_D_UXTW_SCALED_REAL, GLDFF1W_SXTW_REAL, GLDFF1W_SXTW_SCALED_REAL, GLDFF1W_UXTW_REAL, GLDFF1W_UXTW_SCALED_REAL)>; 3148 3149// [286] "ldff1w $Zt, $Pg/z, [$Zn, $imm5]"; 3150def : InstRW<[A64FXWrite_15Cyc_GI056], (instrs GLDFF1W_D_IMM_REAL, GLDFF1W_IMM_REAL)>; 3151 3152// [287] "ldnf1b $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3153def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNF1B_D_IMM_REAL, LDNF1B_H_IMM_REAL, LDNF1B_IMM_REAL, LDNF1B_S_IMM_REAL)>; 3154 3155// [288] "ldnf1d $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3156def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNF1D_IMM_REAL)>; 3157 3158// [289] "ldnf1h $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3159def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNF1H_D_IMM_REAL, LDNF1H_IMM_REAL, LDNF1H_S_IMM_REAL)>; 3160 3161// [290] "ldnf1sb $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3162def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNF1SB_D_IMM_REAL, LDNF1SB_H_IMM_REAL, LDNF1SB_S_IMM_REAL)>; 3163 3164// [291] "ldnf1sh $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3165def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNF1SH_D_IMM_REAL, LDNF1SH_S_IMM_REAL)>; 3166 3167// [292] "ldnf1sw $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3168def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNF1SW_D_IMM_REAL)>; 3169 3170// [293] "ldnf1w $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3171def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNF1W_D_IMM_REAL, LDNF1W_IMM_REAL)>; 3172 3173// [294] "ldnt1b $Zt, $Pg/z, [$Rn, $Rm]"; 3174def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNT1B_ZRR)>; 3175 3176// [295] "ldnt1b $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3177def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNT1B_ZRI)>; 3178 3179// [296] "ldnt1d $Zt, $Pg/z, [$Rn, $Rm]"; 3180def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNT1D_ZRR)>; 3181 3182// [297] "ldnt1d $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3183def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNT1D_ZRI)>; 3184 3185// [298] "ldnt1h $Zt, $Pg/z, [$Rn, $Rm]"; 3186def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNT1H_ZRR)>; 3187 3188// [299] "ldnt1h $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3189def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNT1H_ZRI)>; 3190 3191// [300] "ldnt1w $Zt, $Pg/z, [$Rn, $Rm]"; 3192def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNT1W_ZRR)>; 3193 3194// [301] "ldnt1w $Zt, $Pg/z, [$Rn, $imm4, mul vl]"; 3195def : InstRW<[A64FXWrite_11Cyc_GI56], (instrs LDNT1W_ZRI)>; 3196 3197// [302] "ldr $Pt, [$Rn, $imm9, mul vl]"; 3198def : InstRW<[A64FXWrite_11Cyc_GI5], (instrs LDR_PXI)>; 3199 3200// [303] "ldr $Zt, [$Rn, $imm9, mul vl]"; 3201def : InstRW<[A64FXWrite_11Cyc_GI5], (instrs LDR_ZXI)>; 3202 3203// [304] "lsl $Zd, $Zn, $Zm"; 3204def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSL_WIDE_ZZZ_B, LSL_WIDE_ZZZ_H, LSL_WIDE_ZZZ_S)>; 3205 3206// [305] "lsl $Zd, $Zn, $imm"; 3207def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSL_ZZI_B, LSL_ZZI_D, LSL_ZZI_H, LSL_ZZI_S)>; 3208 3209// [306] "lsl $Zdn, $Pg/m, $_Zdn, $Zm"; 3210def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSL_WIDE_ZPmZ_B, LSL_WIDE_ZPmZ_H, LSL_WIDE_ZPmZ_S, LSL_ZPmZ_B, LSL_ZPmZ_D, LSL_ZPmZ_H, LSL_ZPmZ_S)>; 3211 3212// [307] "lsl $Zdn, $Pg/m, $_Zdn, $imm"; 3213def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSL_ZPmI_B, LSL_ZPmI_D, LSL_ZPmI_H, LSL_ZPmI_S)>; 3214 3215// [308] "lslr $Zdn, $Pg/m, $_Zdn, $Zm"; 3216def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSLR_ZPmZ_B, LSLR_ZPmZ_D, LSLR_ZPmZ_H, LSLR_ZPmZ_S)>; 3217 3218// [309] "lsr $Zd, $Zn, $Zm"; 3219def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSR_WIDE_ZZZ_B, LSR_WIDE_ZZZ_H, LSR_WIDE_ZZZ_S)>; 3220 3221// [310] "lsr $Zd, $Zn, $imm"; 3222def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSR_ZZI_B, LSR_ZZI_D, LSR_ZZI_H, LSR_ZZI_S)>; 3223 3224// [311] "lsr $Zdn, $Pg/m, $_Zdn, $Zm"; 3225def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSR_WIDE_ZPmZ_B, LSR_WIDE_ZPmZ_H, LSR_WIDE_ZPmZ_S, LSR_ZPmZ_B, LSR_ZPmZ_D, LSR_ZPmZ_H, LSR_ZPmZ_S)>; 3226 3227// [312] "lsr $Zdn, $Pg/m, $_Zdn, $imm"; 3228def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSR_ZPmI_B, LSR_ZPmI_D, LSR_ZPmI_H, LSR_ZPmI_S)>; 3229 3230// [313] "lsrr $Zdn, $Pg/m, $_Zdn, $Zm"; 3231def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs LSRR_ZPmZ_B, LSRR_ZPmZ_D, LSRR_ZPmZ_H, LSRR_ZPmZ_S)>; 3232 3233// [314] "mad $Zdn, $Pg/m, $Zm, $Za"; 3234def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs MAD_ZPmZZ_B, MAD_ZPmZZ_D, MAD_ZPmZZ_H, MAD_ZPmZZ_S)>; 3235 3236// [315] "mla $Zda, $Pg/m, $Zn, $Zm"; 3237def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs MLA_ZPmZZ_B, MLA_ZPmZZ_D, MLA_ZPmZZ_H, MLA_ZPmZZ_S)>; 3238 3239// [316] "mls $Zda, $Pg/m, $Zn, $Zm"; 3240def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs MLS_ZPmZZ_B, MLS_ZPmZZ_D, MLS_ZPmZZ_H, MLS_ZPmZZ_S)>; 3241 3242// [317] "movprfx $Zd, $Pg/m, $Zn"; 3243def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs MOVPRFX_ZPmZ_B, MOVPRFX_ZPmZ_D, MOVPRFX_ZPmZ_H, MOVPRFX_ZPmZ_S)>; 3244 3245// [318] "movprfx $Zd, $Pg/z, $Zn"; 3246def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs MOVPRFX_ZPzZ_B, MOVPRFX_ZPzZ_D, MOVPRFX_ZPzZ_H, MOVPRFX_ZPzZ_S)>; 3247 3248// [319] "movprfx $Zd, $Zn"; 3249def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs MOVPRFX_ZZ)>; 3250 3251// [320] "msb $Zdn, $Pg/m, $Zm, $Za"; 3252def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs MSB_ZPmZZ_B, MSB_ZPmZZ_D, MSB_ZPmZZ_H, MSB_ZPmZZ_S)>; 3253 3254// [321] "mul $Zdn, $Pg/m, $_Zdn, $Zm"; 3255def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs MUL_ZPmZ_B, MUL_ZPmZ_D, MUL_ZPmZ_H, MUL_ZPmZ_S)>; 3256 3257// [322] "mul $Zdn, $_Zdn, $imm"; 3258def : InstRW<[A64FXWrite_9Cyc_GI0], (instrs MUL_ZI_B, MUL_ZI_D, MUL_ZI_H, MUL_ZI_S)>; 3259 3260// [323] "nand $Pd, $Pg/z, $Pn, $Pm"; 3261def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs NAND_PPzPP)>; 3262 3263// [324] "nands $Pd, $Pg/z, $Pn, $Pm"; 3264def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs NANDS_PPzPP)>; 3265 3266// [325] "neg $Zd, $Pg/m, $Zn"; 3267def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs NEG_ZPmZ_B, NEG_ZPmZ_D, NEG_ZPmZ_H, NEG_ZPmZ_S)>; 3268 3269// [326] "nor $Pd, $Pg/z, $Pn, $Pm"; 3270def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs NOR_PPzPP)>; 3271 3272// [327] "nors $Pd, $Pg/z, $Pn, $Pm"; 3273def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs NORS_PPzPP)>; 3274 3275// [328] "not $Zd, $Pg/m, $Zn"; 3276def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs NOT_ZPmZ_B, NOT_ZPmZ_D, NOT_ZPmZ_H, NOT_ZPmZ_S)>; 3277 3278// [329] "orn $Pd, $Pg/z, $Pn, $Pm"; 3279def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs ORN_PPzPP)>; 3280 3281// [330] "orns $Pd, $Pg/z, $Pn, $Pm"; 3282def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs ORNS_PPzPP)>; 3283 3284// [331] "orr $Pd, $Pg/z, $Pn, $Pm"; 3285def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs ORR_PPzPP)>; 3286 3287// [332] "orr $Zd, $Zn, $Zm"; 3288def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ORR_ZZZ)>; 3289 3290// [333] "orr $Zdn, $Pg/m, $_Zdn, $Zm"; 3291def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs ORR_ZPmZ_B, ORR_ZPmZ_D, ORR_ZPmZ_H, ORR_ZPmZ_S)>; 3292 3293// [334] "orr $Zdn, $_Zdn, $imms13"; 3294def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs ORR_ZI)>; 3295 3296// [335] "orrs $Pd, $Pg/z, $Pn, $Pm"; 3297def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs ORRS_PPzPP)>; 3298 3299// [336] "orv $Vd, $Pg, $Zn"; 3300def : InstRW<[A64FXWrite_14Cyc_GI03], (instrs ORV_VPZ_B, ORV_VPZ_D, ORV_VPZ_H, ORV_VPZ_S)>; 3301 3302// [337] "pfalse $Pd"; 3303def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs PFALSE)>; 3304 3305// [338] "pnext $Pdn, $Pg, $_Pdn"; 3306def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs PNEXT_B, PNEXT_D, PNEXT_H, PNEXT_S)>; 3307 3308// [339] "prfb $prfop, $Pg, [$Rn, $Rm]"; 3309def : InstRW<[A64FXWrite_6Cyc_GI56], (instrs PRFB_PRR)>; 3310 3311// [340] "prfb $prfop, $Pg, [$Rn, $Zm]"; 3312def : InstRW<[A64FXWrite_14Cyc_GI0256], (instrs PRFB_D_SCALED, PRFB_D_SXTW_SCALED, PRFB_D_UXTW_SCALED, PRFB_S_SXTW_SCALED, PRFB_S_UXTW_SCALED)>; 3313 3314// [341] "prfb $prfop, $Pg, [$Rn, $imm6, mul vl]"; 3315def : InstRW<[A64FXWrite_6Cyc_GI56], (instrs PRFB_PRI)>; 3316 3317// [342] "prfb $prfop, $Pg, [$Zn, $imm5]"; 3318def : InstRW<[A64FXWrite_10Cyc_GI056], (instrs PRFB_D_PZI, PRFB_S_PZI)>; 3319 3320// [343] "prfd $prfop, $Pg, [$Rn, $Rm]"; 3321def : InstRW<[A64FXWrite_6Cyc_GI56], (instrs PRFD_PRR)>; 3322 3323// [344] "prfd $prfop, $Pg, [$Rn, $Zm]"; 3324def : InstRW<[A64FXWrite_14Cyc_GI0256], (instrs PRFD_D_SCALED, PRFD_D_SXTW_SCALED, PRFD_D_UXTW_SCALED, PRFD_S_SXTW_SCALED, PRFD_S_UXTW_SCALED)>; 3325 3326// [345] "prfd $prfop, $Pg, [$Rn, $imm6, mul vl]"; 3327def : InstRW<[A64FXWrite_6Cyc_GI56], (instrs PRFD_PRI)>; 3328 3329// [346] "prfd $prfop, $Pg, [$Zn, $imm5]"; 3330def : InstRW<[A64FXWrite_10Cyc_GI056], (instrs PRFD_D_PZI, PRFD_S_PZI)>; 3331 3332// [347] "prfh $prfop, $Pg, [$Rn, $Rm]"; 3333def : InstRW<[A64FXWrite_6Cyc_GI56], (instrs PRFH_PRR)>; 3334 3335// [348] "prfh $prfop, $Pg, [$Rn, $Zm]"; 3336def : InstRW<[A64FXWrite_14Cyc_GI0256], (instrs PRFH_D_SCALED, PRFH_D_SXTW_SCALED, PRFH_D_UXTW_SCALED, PRFH_S_SXTW_SCALED, PRFH_S_UXTW_SCALED)>; 3337 3338// [349] "prfh $prfop, $Pg, [$Rn, $imm6, mul vl]"; 3339def : InstRW<[A64FXWrite_6Cyc_GI56], (instrs PRFH_PRI)>; 3340 3341// [350] "prfh $prfop, $Pg, [$Zn, $imm5]"; 3342def : InstRW<[A64FXWrite_10Cyc_GI056], (instrs PRFH_D_PZI, PRFH_S_PZI)>; 3343 3344// [351] "prfw $prfop, $Pg, [$Rn, $Rm]"; 3345def : InstRW<[A64FXWrite_6Cyc_GI56], (instrs PRFS_PRR)>; 3346 3347// [352] "prfw $prfop, $Pg, [$Rn, $Zm]"; 3348def : InstRW<[A64FXWrite_14Cyc_GI0256], (instrs PRFW_D_SCALED, PRFW_D_SXTW_SCALED, PRFW_D_UXTW_SCALED, PRFW_S_SXTW_SCALED, PRFW_S_UXTW_SCALED)>; 3349 3350// [353] "prfw $prfop, $Pg, [$Rn, $imm6, mul vl]"; 3351def : InstRW<[A64FXWrite_6Cyc_GI56], (instrs PRFW_PRI)>; 3352 3353// [354] "prfw $prfop, $Pg, [$Zn, $imm5]"; 3354def : InstRW<[A64FXWrite_10Cyc_GI056], (instrs PRFW_D_PZI, PRFW_S_PZI)>; 3355 3356// [355] "ptest $Pg, $Pn"; 3357def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs PTEST_PP)>; 3358 3359// [356] "ptrue $Pd, $pattern"; 3360def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs PTRUE_B, PTRUE_D, PTRUE_H, PTRUE_S)>; 3361 3362// [357] "ptrues $Pd, $pattern"; 3363def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs PTRUES_B, PTRUES_D, PTRUES_H, PTRUES_S)>; 3364 3365// [358] "punpkhi $Pd, $Pn"; 3366def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs PUNPKHI_PP)>; 3367 3368// [359] "punpklo $Pd, $Pn"; 3369def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs PUNPKLO_PP)>; 3370 3371// [360] "rbit $Zd, $Pg/m, $Zn"; 3372def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs RBIT_ZPmZ_B, RBIT_ZPmZ_D, RBIT_ZPmZ_H, RBIT_ZPmZ_S)>; 3373 3374// [361] "rdffr $Pd"; 3375def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs RDFFR_P)>; 3376 3377// [362] "rdffr $Pd, $Pg/z"; 3378def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs RDFFR_PPz)>; 3379 3380// [363] "rdffrs $Pd, $Pg/z"; 3381def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs RDFFRS_PPz)>; 3382 3383// [364] "rdvl $Rd, $imm6"; 3384def : InstRW<[A64FXWrite_1Cyc_GI24], (instrs RDVLI_XI)>; 3385 3386// [365] "rev $Pd, $Pn"; 3387def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs REV_PP_B, REV_PP_D, REV_PP_H, REV_PP_S)>; 3388 3389// [366] "rev $Zd, $Zn"; 3390def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs REV_ZZ_B, REV_ZZ_D, REV_ZZ_H, REV_ZZ_S)>; 3391 3392// [367] "revb $Zd, $Pg/m, $Zn"; 3393def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs REVB_ZPmZ_D, REVB_ZPmZ_H, REVB_ZPmZ_S)>; 3394 3395// [368] "revh $Zd, $Pg/m, $Zn"; 3396def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs REVH_ZPmZ_D, REVH_ZPmZ_S)>; 3397 3398// [369] "revw $Zd, $Pg/m, $Zn"; 3399def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs REVW_ZPmZ_D)>; 3400 3401// [370] "sabd $Zdn, $Pg/m, $_Zdn, $Zm"; 3402def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SABD_ZPmZ_B, SABD_ZPmZ_D, SABD_ZPmZ_H, SABD_ZPmZ_S)>; 3403 3404// [371] "saddv $Vd, $Pg, $Zn"; 3405def : InstRW<[A64FXWrite_12Cyc_GI03], (instrs SADDV_VPZ_B, SADDV_VPZ_H, SADDV_VPZ_S)>; 3406 3407// [372] "scvtf $Zd, $Pg/m, $Zn"; 3408def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs SCVTF_ZPmZ_DtoD, SCVTF_ZPmZ_DtoH, SCVTF_ZPmZ_DtoS, SCVTF_ZPmZ_HtoH, SCVTF_ZPmZ_StoD, SCVTF_ZPmZ_StoH, SCVTF_ZPmZ_StoS)>; 3409 3410// [373] "sdiv $Zdn, $Pg/m, $_Zdn, $Zm"; 3411def : InstRW<[A64FXWrite_37Cyc_GI0], (instrs SDIV_ZPmZ_D, SDIV_ZPmZ_S)>; 3412 3413// [374] "sdivr $Zdn, $Pg/m, $_Zdn, $Zm"; 3414def : InstRW<[A64FXWrite_37Cyc_GI0], (instrs SDIVR_ZPmZ_D, SDIVR_ZPmZ_S)>; 3415 3416// [375] "sdot $Zda, $Zn, $Zm"; 3417def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs SDOT_ZZZ_D, SDOT_ZZZ_S)>; 3418 3419// [376] "sdot $Zda, $Zn, $Zm$iop"; 3420def : InstRW<[A64FXWrite_15Cyc_NGI03], (instrs SDOT_ZZZI_D, SDOT_ZZZI_S)>; 3421 3422// [377] "sel $Pd, $Pg, $Pn, $Pm"; 3423def : InstRW<[A64FXWrite_3Cyc_GI1], (instrs SEL_PPPP)>; 3424 3425// [378] "sel $Zd, $Pg, $Zn, $Zm"; 3426def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SEL_ZPZZ_B, SEL_ZPZZ_D, SEL_ZPZZ_H, SEL_ZPZZ_S)>; 3427 3428// [379] "setffr"; 3429def : InstRW<[A64FXWrite_6Cyc], (instrs SETFFR)>; 3430 3431// [380] "smax $Zdn, $Pg/m, $_Zdn, $Zm"; 3432def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SMAX_ZPmZ_B, SMAX_ZPmZ_D, SMAX_ZPmZ_H, SMAX_ZPmZ_S)>; 3433 3434// [381] "smax $Zdn, $_Zdn, $imm"; 3435def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs SMAX_ZI_B, SMAX_ZI_D, SMAX_ZI_H, SMAX_ZI_S)>; 3436 3437// [382] "smaxv $Vd, $Pg, $Zn"; 3438def : InstRW<[A64FXWrite_14Cyc_GI03], (instrs SMAXV_VPZ_B, SMAXV_VPZ_D, SMAXV_VPZ_H, SMAXV_VPZ_S)>; 3439 3440// [383] "smin $Zdn, $Pg/m, $_Zdn, $Zm"; 3441def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SMIN_ZPmZ_B, SMIN_ZPmZ_D, SMIN_ZPmZ_H, SMIN_ZPmZ_S)>; 3442 3443// [384] "smin $Zdn, $_Zdn, $imm"; 3444def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs SMIN_ZI_B, SMIN_ZI_D, SMIN_ZI_H, SMIN_ZI_S)>; 3445 3446// [385] "sminv $Vd, $Pg, $Zn"; 3447def : InstRW<[A64FXWrite_14Cyc_GI03], (instrs SMINV_VPZ_B, SMINV_VPZ_D, SMINV_VPZ_H, SMINV_VPZ_S)>; 3448 3449// [386] "smulh $Zdn, $Pg/m, $_Zdn, $Zm"; 3450def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs SMULH_ZPmZ_B, SMULH_ZPmZ_D, SMULH_ZPmZ_H, SMULH_ZPmZ_S)>; 3451 3452// [387] "splice $Zdn, $Pg, $_Zdn, $Zm"; 3453def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs SPLICE_ZPZ_B, SPLICE_ZPZ_D, SPLICE_ZPZ_H, SPLICE_ZPZ_S)>; 3454 3455// [388] "sqadd $Zd, $Zn, $Zm"; 3456 3457// [389] "sqadd $Zdn, $_Zdn, $imm"; 3458 3459// [390] "sqdecb $Rdn, $_Rdn, $pattern, mul $imm4"; 3460def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQDECB_XPiWdI)>; 3461 3462// [391] "sqdecb $Rdn, $pattern, mul $imm4"; 3463def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQDECB_XPiI)>; 3464 3465// [392] "sqdecd $Rdn, $_Rdn, $pattern, mul $imm4"; 3466def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQDECD_XPiWdI)>; 3467 3468// [393] "sqdecd $Rdn, $pattern, mul $imm4"; 3469def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQDECD_XPiI)>; 3470 3471// [394] "sqdecd $Zdn, $pattern, mul $imm4"; 3472def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SQDECD_ZPiI)>; 3473 3474// [395] "sqdech $Rdn, $_Rdn, $pattern, mul $imm4"; 3475def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQDECH_XPiWdI)>; 3476 3477// [396] "sqdech $Rdn, $pattern, mul $imm4"; 3478def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQDECH_XPiI)>; 3479 3480// [397] "sqdech $Zdn, $pattern, mul $imm4"; 3481def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SQDECH_ZPiI)>; 3482 3483// [398] "sqdecp $Rdn, $Pg"; 3484def : InstRW<[A64FXWrite_8Cyc_GI124], (instrs SQDECP_XP_B, SQDECP_XP_D, SQDECP_XP_H, SQDECP_XP_S)>; 3485 3486// [399] "sqdecp $Rdn, $Pg, $_Rdn"; 3487def : InstRW<[A64FXWrite_8Cyc_GI124], (instrs SQDECP_XPWd_B, SQDECP_XPWd_D, SQDECP_XPWd_H, SQDECP_XPWd_S)>; 3488 3489// [400] "sqdecp $Zdn, $Pg"; 3490def : InstRW<[A64FXWrite_12Cyc_GI01], (instrs SQDECP_ZP_D, SQDECP_ZP_H, SQDECP_ZP_S)>; 3491 3492// [401] "sqdecw $Rdn, $_Rdn, $pattern, mul $imm4"; 3493def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQDECW_XPiWdI)>; 3494 3495// [402] "sqdecw $Rdn, $pattern, mul $imm4"; 3496def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQDECW_XPiI)>; 3497 3498// [403] "sqdecw $Zdn, $pattern, mul $imm4"; 3499def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SQDECW_ZPiI)>; 3500 3501// [404] "sqincb $Rdn, $_Rdn, $pattern, mul $imm4"; 3502def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQINCB_XPiWdI)>; 3503 3504// [405] "sqincb $Rdn, $pattern, mul $imm4"; 3505def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQINCB_XPiI)>; 3506 3507// [406] "sqincd $Rdn, $_Rdn, $pattern, mul $imm4"; 3508def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQINCD_XPiWdI)>; 3509 3510// [407] "sqincd $Rdn, $pattern, mul $imm4"; 3511def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQINCD_XPiI)>; 3512 3513// [408] "sqincd $Zdn, $pattern, mul $imm4"; 3514def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SQINCD_ZPiI)>; 3515 3516// [409] "sqinch $Rdn, $_Rdn, $pattern, mul $imm4"; 3517def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQINCH_XPiWdI)>; 3518 3519// [410] "sqinch $Rdn, $pattern, mul $imm4"; 3520def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQINCH_XPiI)>; 3521 3522// [411] "sqinch $Zdn, $pattern, mul $imm4"; 3523def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SQINCH_ZPiI)>; 3524 3525// [412] "sqincp $Rdn, $Pg"; 3526def : InstRW<[A64FXWrite_8Cyc_GI124], (instrs SQINCP_XP_B, SQINCP_XP_D, SQINCP_XP_H, SQINCP_XP_S)>; 3527 3528// [413] "sqincp $Rdn, $Pg, $_Rdn"; 3529def : InstRW<[A64FXWrite_8Cyc_GI124], (instrs SQINCP_XPWd_B, SQINCP_XPWd_D, SQINCP_XPWd_H, SQINCP_XPWd_S)>; 3530 3531// [414] "sqincp $Zdn, $Pg"; 3532def : InstRW<[A64FXWrite_12Cyc_GI01], (instrs SQINCP_ZP_D, SQINCP_ZP_H, SQINCP_ZP_S)>; 3533 3534// [415] "sqincw $Rdn, $_Rdn, $pattern, mul $imm4"; 3535def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQINCW_XPiWdI)>; 3536 3537// [416] "sqincw $Rdn, $pattern, mul $imm4"; 3538def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs SQINCW_XPiI)>; 3539 3540// [417] "sqincw $Zdn, $pattern, mul $imm4"; 3541def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SQINCW_ZPiI)>; 3542 3543// [418] "sqsub $Zd, $Zn, $Zm"; 3544 3545// [419] "sqsub $Zdn, $_Zdn, $imm"; 3546 3547// [420] "st1b $Zt, $Pg, [$Rn, $Rm]"; 3548def : InstRW<[A64FXWrite_ST1W_6], (instrs ST1B, ST1B_D, ST1B_H, ST1B_S)>; 3549 3550// [421] "st1b $Zt, $Pg, [$Rn, $Zm]"; 3551def : InstRW<[A64FXWrite_ST1W_19], (instrs SST1B_D_REAL, SST1B_D_SXTW, SST1B_D_UXTW, SST1B_S_SXTW, SST1B_S_UXTW)>; 3552 3553// [422] "st1b $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3554def : InstRW<[A64FXWrite_ST1W_6], (instrs ST1B_D_IMM, ST1B_H_IMM, ST1B_IMM, ST1B_S_IMM)>; 3555 3556// [423] "st1b $Zt, $Pg, [$Zn, $imm5]"; 3557def : InstRW<[A64FXWrite_ST1W_15], (instrs SST1B_D_IMM, SST1B_S_IMM)>; 3558 3559// [424] "st1d $Zt, $Pg, [$Rn, $Rm]"; 3560def : InstRW<[A64FXWrite_ST1W_6], (instrs ST1D)>; 3561 3562// [425] "st1d $Zt, $Pg, [$Rn, $Zm]"; 3563def : InstRW<[A64FXWrite_ST1W_19], (instrs SST1D_REAL, SST1D_SCALED_SCALED_REAL, SST1D_SXTW, SST1D_SXTW_SCALED, SST1D_UXTW, SST1D_UXTW_SCALED)>; 3564 3565// [426] "st1d $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3566def : InstRW<[A64FXWrite_ST1W_6], (instrs ST1D_IMM)>; 3567 3568// [427] "st1d $Zt, $Pg, [$Zn, $imm5]"; 3569def : InstRW<[A64FXWrite_ST1W_15], (instrs SST1D_IMM)>; 3570 3571// [428] "st1h $Zt, $Pg, [$Rn, $Rm]"; 3572def : InstRW<[A64FXWrite_ST1W_6], (instrs ST1H, ST1H_D, ST1H_S)>; 3573 3574// [429] "st1h $Zt, $Pg, [$Rn, $Zm]"; 3575def : InstRW<[A64FXWrite_ST1W_19], (instrs SST1H_D_REAL, SST1H_D_SCALED_SCALED_REAL, SST1H_D_SXTW, SST1H_D_SXTW_SCALED, SST1H_D_UXTW, SST1H_D_UXTW_SCALED, SST1H_S_SXTW, SST1H_S_SXTW_SCALED, SST1H_S_UXTW, SST1H_S_UXTW_SCALED)>; 3576 3577// [430] "st1h $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3578def : InstRW<[A64FXWrite_ST1W_6], (instrs ST1H_D_IMM, ST1H_IMM, ST1H_S_IMM)>; 3579 3580// [431] "st1h $Zt, $Pg, [$Zn, $imm5]"; 3581def : InstRW<[A64FXWrite_ST1W_15], (instrs SST1H_D_IMM, SST1H_S_IMM)>; 3582 3583// [432] "st1w $Zt, $Pg, [$Rn, $Rm]"; 3584def : InstRW<[A64FXWrite_ST1W_6], (instrs ST1W, ST1W_D)>; 3585 3586// [433] "st1w $Zt, $Pg, [$Rn, $Zm]"; 3587def : InstRW<[A64FXWrite_ST1W_19], (instrs SST1W_D_REAL, SST1W_D_SCALED_SCALED_REAL, SST1W_D_SXTW, SST1W_D_SXTW_SCALED, SST1W_D_UXTW, SST1W_D_UXTW_SCALED, SST1W_SXTW, SST1W_SXTW_SCALED, SST1W_UXTW, SST1W_UXTW_SCALED)>; 3588 3589// [434] "st1w $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3590def : InstRW<[A64FXWrite_ST1W_6], (instrs ST1W_D_IMM, ST1W_IMM)>; 3591 3592// [435] "st1w $Zt, $Pg, [$Zn, $imm5]"; 3593def : InstRW<[A64FXWrite_ST1W_15], (instrs SST1W_D_IMM, SST1W_IMM)>; 3594 3595// [436] "st2b $Zt, $Pg, [$Rn, $Rm]"; 3596def : InstRW<[A64FXWrite_ST2W_7], (instrs ST2B)>; 3597 3598// [437] "st2b $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3599def : InstRW<[A64FXWrite_ST2W_7], (instrs ST2B_IMM)>; 3600 3601// [438] "st2d $Zt, $Pg, [$Rn, $Rm]"; 3602def : InstRW<[A64FXWrite_ST2W_7], (instrs ST2D)>; 3603 3604// [439] "st2d $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3605def : InstRW<[A64FXWrite_ST2W_7], (instrs ST2D_IMM)>; 3606 3607// [440] "st2h $Zt, $Pg, [$Rn, $Rm]"; 3608def : InstRW<[A64FXWrite_ST2W_7], (instrs ST2H)>; 3609 3610// [441] "st2h $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3611def : InstRW<[A64FXWrite_ST2W_7], (instrs ST2H_IMM)>; 3612 3613// [442] "st2w $Zt, $Pg, [$Rn, $Rm]"; 3614def : InstRW<[A64FXWrite_ST2W_7], (instrs ST2W)>; 3615 3616// [443] "st2w $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3617def : InstRW<[A64FXWrite_ST2W_7], (instrs ST2W_IMM)>; 3618 3619// [444] "st3b $Zt, $Pg, [$Rn, $Rm]"; 3620def : InstRW<[A64FXWrite_ST3W_8], (instrs ST3B)>; 3621 3622// [445] "st3b $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3623def : InstRW<[A64FXWrite_ST3W_8], (instrs ST3B_IMM)>; 3624 3625// [446] "st3d $Zt, $Pg, [$Rn, $Rm]"; 3626def : InstRW<[A64FXWrite_ST3W_8], (instrs ST3D)>; 3627 3628// [447] "st3d $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3629def : InstRW<[A64FXWrite_ST3W_8], (instrs ST3D_IMM)>; 3630 3631// [448] "st3h $Zt, $Pg, [$Rn, $Rm]"; 3632def : InstRW<[A64FXWrite_ST3W_8], (instrs ST3H)>; 3633 3634// [449] "st3h $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3635def : InstRW<[A64FXWrite_ST3W_8], (instrs ST3H_IMM)>; 3636 3637// [450] "st3w $Zt, $Pg, [$Rn, $Rm]"; 3638def : InstRW<[A64FXWrite_ST3W_8], (instrs ST3W)>; 3639 3640// [451] "st3w $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3641def : InstRW<[A64FXWrite_ST3W_8], (instrs ST3W_IMM)>; 3642 3643// [452] "st4b $Zt, $Pg, [$Rn, $Rm]"; 3644def : InstRW<[A64FXWrite_ST4W_9], (instrs ST4B)>; 3645 3646// [453] "st4b $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3647def : InstRW<[A64FXWrite_ST4W_9], (instrs ST4B_IMM)>; 3648 3649// [454] "st4d $Zt, $Pg, [$Rn, $Rm]"; 3650def : InstRW<[A64FXWrite_ST4W_9], (instrs ST4D)>; 3651 3652// [455] "st4d $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3653def : InstRW<[A64FXWrite_ST4W_9], (instrs ST4D_IMM)>; 3654 3655// [456] "st4h $Zt, $Pg, [$Rn, $Rm]"; 3656def : InstRW<[A64FXWrite_ST4W_9], (instrs ST4H)>; 3657 3658// [457] "st4h $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3659def : InstRW<[A64FXWrite_ST4W_9], (instrs ST4H_IMM)>; 3660 3661// [458] "st4w $Zt, $Pg, [$Rn, $Rm]"; 3662def : InstRW<[A64FXWrite_ST4W_9], (instrs ST4W)>; 3663 3664// [459] "st4w $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3665def : InstRW<[A64FXWrite_ST4W_9], (instrs ST4W_IMM)>; 3666 3667// [460] "stnt1b $Zt, $Pg, [$Rn, $Rm]"; 3668def : InstRW<[A64FXWrite_ST1W_6], (instrs STNT1B_ZRR)>; 3669 3670// [461] "stnt1b $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3671def : InstRW<[A64FXWrite_ST1W_6], (instrs STNT1B_ZRI)>; 3672 3673// [462] "stnt1d $Zt, $Pg, [$Rn, $Rm]"; 3674def : InstRW<[A64FXWrite_ST1W_6], (instrs STNT1D_ZRR)>; 3675 3676// [463] "stnt1d $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3677def : InstRW<[A64FXWrite_ST1W_6], (instrs STNT1D_ZRI)>; 3678 3679// [464] "stnt1h $Zt, $Pg, [$Rn, $Rm]"; 3680def : InstRW<[A64FXWrite_ST1W_6], (instrs STNT1H_ZRR)>; 3681 3682// [465] "stnt1h $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3683def : InstRW<[A64FXWrite_ST1W_6], (instrs STNT1H_ZRI)>; 3684 3685// [466] "stnt1w $Zt, $Pg, [$Rn, $Rm]"; 3686def : InstRW<[A64FXWrite_ST1W_6], (instrs STNT1W_ZRR)>; 3687 3688// [467] "stnt1w $Zt, $Pg, [$Rn, $imm4, mul vl]"; 3689def : InstRW<[A64FXWrite_ST1W_6], (instrs STNT1W_ZRI)>; 3690 3691// [468] "str $Pt, [$Rn, $imm9, mul vl]"; 3692def : InstRW<[A64FXWrite_6Cyc_GI15], (instrs STR_PXI)>; 3693 3694// [469] "str $Zt, [$Rn, $imm9, mul vl]"; 3695def : InstRW<[A64FXWrite_6Cyc_GI05], (instrs STR_ZXI)>; 3696 3697// [470] "sub $Zd, $Zn, $Zm"; 3698def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SUB_ZZZ_B, SUB_ZZZ_D, SUB_ZZZ_H, SUB_ZZZ_S)>; 3699 3700// [471] "sub $Zdn, $Pg/m, $_Zdn, $Zm"; 3701def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SUB_ZPmZ_B, SUB_ZPmZ_D, SUB_ZPmZ_H, SUB_ZPmZ_S)>; 3702 3703// [472] "sub $Zdn, $_Zdn, $imm"; 3704def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SUB_ZI_B, SUB_ZI_D, SUB_ZI_H, SUB_ZI_S)>; 3705 3706// [473] "subr $Zdn, $Pg/m, $_Zdn, $Zm"; 3707def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SUBR_ZPmZ_B, SUBR_ZPmZ_D, SUBR_ZPmZ_H, SUBR_ZPmZ_S)>; 3708 3709// [474] "subr $Zdn, $_Zdn, $imm"; 3710def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs SUBR_ZI_B, SUBR_ZI_D, SUBR_ZI_H, SUBR_ZI_S)>; 3711 3712// [475] "sunpkhi $Zd, $Zn"; 3713def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs SUNPKHI_ZZ_D, SUNPKHI_ZZ_H, SUNPKHI_ZZ_S)>; 3714 3715// [476] "sunpklo $Zd, $Zn"; 3716def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs SUNPKLO_ZZ_D, SUNPKLO_ZZ_H, SUNPKLO_ZZ_S)>; 3717 3718// [477] "sxtb $Zd, $Pg/m, $Zn"; 3719def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SXTB_ZPmZ_D, SXTB_ZPmZ_H, SXTB_ZPmZ_S)>; 3720 3721// [478] "sxth $Zd, $Pg/m, $Zn"; 3722def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SXTH_ZPmZ_D, SXTH_ZPmZ_S)>; 3723 3724// [479] "sxtw $Zd, $Pg/m, $Zn"; 3725def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs SXTW_ZPmZ_D)>; 3726 3727// [480] "tbl $Zd, $Zn, $Zm"; 3728def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs TBL_ZZZ_B, TBL_ZZZ_D, TBL_ZZZ_H, TBL_ZZZ_S)>; 3729 3730// [481] "trn1 $Pd, $Pn, $Pm"; 3731 3732// [482] "trn1 $Zd, $Zn, $Zm"; 3733 3734// [483] "trn2 $Pd, $Pn, $Pm"; 3735 3736// [484] "trn2 $Zd, $Zn, $Zm"; 3737 3738// [486] "uabd $Zdn, $Pg/m, $_Zdn, $Zm"; 3739def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UABD_ZPmZ_B, UABD_ZPmZ_D, UABD_ZPmZ_H, UABD_ZPmZ_S)>; 3740 3741// [487] "uaddv $Vd, $Pg, $Zn"; 3742def : InstRW<[A64FXWrite_12Cyc_GI03], (instrs UADDV_VPZ_B, UADDV_VPZ_D, UADDV_VPZ_H, UADDV_VPZ_S)>; 3743 3744// [488] "ucvtf $Zd, $Pg/m, $Zn"; 3745def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs UCVTF_ZPmZ_DtoD, UCVTF_ZPmZ_DtoH, UCVTF_ZPmZ_DtoS, UCVTF_ZPmZ_HtoH, UCVTF_ZPmZ_StoD, UCVTF_ZPmZ_StoH, UCVTF_ZPmZ_StoS)>; 3746 3747// [489] "udiv $Zdn, $Pg/m, $_Zdn, $Zm"; 3748def : InstRW<[A64FXWrite_37Cyc_GI0], (instrs UDIV_ZPmZ_D, UDIV_ZPmZ_S)>; 3749 3750// [490] "udivr $Zdn, $Pg/m, $_Zdn, $Zm"; 3751def : InstRW<[A64FXWrite_37Cyc_GI0], (instrs UDIVR_ZPmZ_D, UDIVR_ZPmZ_S)>; 3752 3753// [491] "udot $Zda, $Zn, $Zm"; 3754def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs UDOT_ZZZ_D, UDOT_ZZZ_S)>; 3755 3756// [492] "udot $Zda, $Zn, $Zm$iop"; 3757def : InstRW<[A64FXWrite_15Cyc_NGI03], (instrs UDOT_ZZZI_D, UDOT_ZZZI_S)>; 3758 3759// [493] "umax $Zdn, $Pg/m, $_Zdn, $Zm"; 3760def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UMAX_ZPmZ_B, UMAX_ZPmZ_D, UMAX_ZPmZ_H, UMAX_ZPmZ_S)>; 3761 3762// [494] "umax $Zdn, $_Zdn, $imm"; 3763def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs UMAX_ZI_B, UMAX_ZI_D, UMAX_ZI_H, UMAX_ZI_S)>; 3764 3765// [495] "umaxv $Vd, $Pg, $Zn"; 3766def : InstRW<[A64FXWrite_14Cyc_GI03], (instrs UMAXV_VPZ_B, UMAXV_VPZ_D, UMAXV_VPZ_H, UMAXV_VPZ_S)>; 3767 3768// [496] "umin $Zdn, $Pg/m, $_Zdn, $Zm"; 3769def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UMIN_ZPmZ_B, UMIN_ZPmZ_D, UMIN_ZPmZ_H, UMIN_ZPmZ_S)>; 3770 3771// [497] "umin $Zdn, $_Zdn, $imm"; 3772def : InstRW<[A64FXWrite_4Cyc_GI0], (instrs UMIN_ZI_B, UMIN_ZI_D, UMIN_ZI_H, UMIN_ZI_S)>; 3773 3774// [498] "uminv $Vd, $Pg, $Zn"; 3775def : InstRW<[A64FXWrite_14Cyc_GI03], (instrs UMINV_VPZ_B, UMINV_VPZ_D, UMINV_VPZ_H, UMINV_VPZ_S)>; 3776 3777// [499] "umulh $Zdn, $Pg/m, $_Zdn, $Zm"; 3778def : InstRW<[A64FXWrite_9Cyc_GI03], (instrs UMULH_ZPmZ_B, UMULH_ZPmZ_D, UMULH_ZPmZ_H, UMULH_ZPmZ_S)>; 3779 3780// [500] "uqadd $Zd, $Zn, $Zm"; 3781 3782// [501] "uqadd $Zdn, $_Zdn, $imm"; 3783 3784// [502] "uqdecb $Rdn, $pattern, mul $imm4"; 3785def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs UQDECB_WPiI, UQDECB_XPiI)>; 3786 3787// [503] "uqdecd $Rdn, $pattern, mul $imm4"; 3788def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs UQDECD_WPiI, UQDECD_XPiI)>; 3789 3790// [504] "uqdecd $Zdn, $pattern, mul $imm4"; 3791def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UQDECD_ZPiI)>; 3792 3793// [505] "uqdech $Rdn, $pattern, mul $imm4"; 3794def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs UQDECH_WPiI, UQDECH_XPiI)>; 3795 3796// [506] "uqdech $Zdn, $pattern, mul $imm4"; 3797def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UQDECH_ZPiI)>; 3798 3799// [507] "uqdecp $Rdn, $Pg"; 3800def : InstRW<[A64FXWrite_8Cyc_GI124], (instrs UQDECP_WP_B, UQDECP_WP_D, UQDECP_WP_H, UQDECP_WP_S, UQDECP_XP_B, UQDECP_XP_D, UQDECP_XP_H, UQDECP_XP_S)>; 3801 3802// [508] "uqdecp $Zdn, $Pg"; 3803def : InstRW<[A64FXWrite_12Cyc_GI01], (instrs UQDECP_ZP_D, UQDECP_ZP_H, UQDECP_ZP_S)>; 3804 3805// [509] "uqdecw $Rdn, $pattern, mul $imm4"; 3806def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs UQDECW_WPiI, UQDECW_XPiI)>; 3807 3808// [510] "uqdecw $Zdn, $pattern, mul $imm4"; 3809def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UQDECW_ZPiI)>; 3810 3811// [511] "uqincb $Rdn, $pattern, mul $imm4"; 3812def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs UQINCB_WPiI, UQINCB_XPiI)>; 3813 3814// [512] "uqincd $Rdn, $pattern, mul $imm4"; 3815def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs UQINCD_WPiI, UQINCD_XPiI)>; 3816 3817// [513] "uqincd $Zdn, $pattern, mul $imm4"; 3818def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UQINCD_ZPiI)>; 3819 3820// [514] "uqinch $Rdn, $pattern, mul $imm4"; 3821def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs UQINCH_WPiI, UQINCH_XPiI)>; 3822 3823// [515] "uqinch $Zdn, $pattern, mul $imm4"; 3824def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UQINCH_ZPiI)>; 3825 3826// [516] "uqincp $Rdn, $Pg"; 3827def : InstRW<[A64FXWrite_8Cyc_GI124], (instrs UQINCP_WP_B, UQINCP_WP_D, UQINCP_WP_H, UQINCP_WP_S, UQINCP_XP_B, UQINCP_XP_D, UQINCP_XP_H, UQINCP_XP_S)>; 3828 3829// [517] "uqincp $Zdn, $Pg"; 3830def : InstRW<[A64FXWrite_12Cyc_GI01], (instrs UQINCP_ZP_D, UQINCP_ZP_H, UQINCP_ZP_S)>; 3831 3832// [518] "uqincw $Rdn, $pattern, mul $imm4"; 3833def : InstRW<[A64FXWrite_2Cyc_GI24], (instrs UQINCW_WPiI, UQINCW_XPiI)>; 3834 3835// [519] "uqincw $Zdn, $pattern, mul $imm4"; 3836def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UQINCW_ZPiI)>; 3837 3838// [520] "uqsub $Zd, $Zn, $Zm"; 3839//@@@ def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UQSUB_ZZZ_B, UQSUB_ZZZ_D, UQSUB_ZZZ_H, UQSUB_ZZZ_S)>; 3840 3841// [521] "uqsub $Zdn, $_Zdn, $imm"; 3842//@@@ def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UQSUB_ZI_B, UQSUB_ZI_D, UQSUB_ZI_H, UQSUB_ZI_S)>; 3843 3844// [522] "uunpkhi $Zd, $Zn"; 3845def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs UUNPKHI_ZZ_D, UUNPKHI_ZZ_H, UUNPKHI_ZZ_S)>; 3846 3847// [523] "uunpklo $Zd, $Zn"; 3848def : InstRW<[A64FXWrite_6Cyc_GI0], (instrs UUNPKLO_ZZ_D, UUNPKLO_ZZ_H, UUNPKLO_ZZ_S)>; 3849 3850// [524] "uxtb $Zd, $Pg/m, $Zn"; 3851def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UXTB_ZPmZ_D, UXTB_ZPmZ_H, UXTB_ZPmZ_S)>; 3852 3853// [525] "uxth $Zd, $Pg/m, $Zn"; 3854def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UXTH_ZPmZ_D, UXTH_ZPmZ_S)>; 3855 3856// [526] "uxtw $Zd, $Pg/m, $Zn"; 3857def : InstRW<[A64FXWrite_4Cyc_GI03], (instrs UXTW_ZPmZ_D)>; 3858 3859// [527] "uzp1 $Pd, $Pn, $Pm"; 3860 3861// [528] "uzp1 $Zd, $Zn, $Zm"; 3862 3863// [529] "uzp2 $Pd, $Pn, $Pm"; 3864 3865// [530] "uzp2 $Zd, $Zn, $Zm"; 3866 3867// [531] "whilele $Pd, $Rn, $Rm"; 3868def : InstRW<[A64FXWrite_4Cyc_GI12], (instrs WHILELE_PWW_B, WHILELE_PWW_D, WHILELE_PWW_H, WHILELE_PWW_S, WHILELE_PXX_B, WHILELE_PXX_D, WHILELE_PXX_H, WHILELE_PXX_S)>; 3869 3870// [532] "whilelo $Pd, $Rn, $Rm"; 3871def : InstRW<[A64FXWrite_4Cyc_GI12], (instrs WHILELO_PWW_B, WHILELO_PWW_D, WHILELO_PWW_H, WHILELO_PWW_S, WHILELO_PXX_B, WHILELO_PXX_D, WHILELO_PXX_H, WHILELO_PXX_S)>; 3872 3873// [533] "whilels $Pd, $Rn, $Rm"; 3874def : InstRW<[A64FXWrite_4Cyc_GI12], (instrs WHILELS_PWW_B, WHILELS_PWW_D, WHILELS_PWW_H, WHILELS_PWW_S, WHILELS_PXX_B, WHILELS_PXX_D, WHILELS_PXX_H, WHILELS_PXX_S)>; 3875 3876// [534] "whilelt $Pd, $Rn, $Rm"; 3877def : InstRW<[A64FXWrite_4Cyc_GI12], (instrs WHILELT_PWW_B, WHILELT_PWW_D, WHILELT_PWW_H, WHILELT_PWW_S, WHILELT_PXX_B, WHILELT_PXX_D, WHILELT_PXX_H, WHILELT_PXX_S)>; 3878 3879// [535] "wrffr $Pn"; 3880def : InstRW<[A64FXWrite_6Cyc_NGI1], (instrs WRFFR)>; 3881 3882// [536] "zip1 $Pd, $Pn, $Pm"; 3883 3884// [537] "zip1 $Zd, $Zn, $Zm"; 3885 3886// [538] "zip2 $Pd, $Pn, $Pm"; 3887 3888// [539] "zip2 $Zd, $Zn, $Zm"; 3889 3890} // SchedModel = A64FXModel 3891