xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64SchedA64FX.td (revision 0d8fe2373503aeac48492f28073049a8bfa4feb5)
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