@@ -266,6 +266,322 @@ def VABAVu8 : t2VABAV<"u8", 0b1, 0b00>;
266
266
def VABAVu16 : t2VABAV<"u16", 0b1, 0b01>;
267
267
def VABAVu32 : t2VABAV<"u32", 0b1, 0b10>;
268
268
269
+ class t2VADDV<string iname, string suffix, dag iops, string cstr,
270
+ bit A, bit U, bits<2> size, list<dag> pattern=[]>
271
+ : MVE_rDest<(outs tGPREven:$Rda), iops, NoItinerary,
272
+ iname, suffix, "$Rda, $Qm", cstr, pattern> {
273
+ bits<3> Qm;
274
+ bits<4> Rda;
275
+
276
+ let Inst{28} = U;
277
+ let Inst{22-20} = 0b111;
278
+ let Inst{19-18} = size{1-0};
279
+ let Inst{17-16} = 0b01;
280
+ let Inst{15-13} = Rda{3-1};
281
+ let Inst{12} = 0b0;
282
+ let Inst{8-6} = 0b100;
283
+ let Inst{5} = A;
284
+ let Inst{3-1} = Qm{2-0};
285
+ let Inst{0} = 0b0;
286
+ }
287
+
288
+ multiclass t2VADDV_A<string suffix, bit U, bits<2> size, list<dag> pattern=[]> {
289
+ def acc : t2VADDV<"vaddva", suffix,
290
+ (ins tGPREven:$Rda_src, MQPR:$Qm), "$Rda = $Rda_src",
291
+ 0b1, U, size, pattern>;
292
+ def no_acc : t2VADDV<"vaddv", suffix,
293
+ (ins MQPR:$Qm), "",
294
+ 0b0, U, size, pattern>;
295
+ }
296
+
297
+ defm VADDVs8 : t2VADDV_A<"s8", 0b0, 0b00>;
298
+ defm VADDVs16 : t2VADDV_A<"s16", 0b0, 0b01>;
299
+ defm VADDVs32 : t2VADDV_A<"s32", 0b0, 0b10>;
300
+ defm VADDVu8 : t2VADDV_A<"u8", 0b1, 0b00>;
301
+ defm VADDVu16 : t2VADDV_A<"u16", 0b1, 0b01>;
302
+ defm VADDVu32 : t2VADDV_A<"u32", 0b1, 0b10>;
303
+
304
+ class t2VADDLV<string iname, string suffix, dag iops, string cstr,
305
+ bit A, bit U, list<dag> pattern=[]>
306
+ : MVE_rDest<(outs tGPREven:$RdaLo, tGPROdd:$RdaHi), iops, NoItinerary, iname,
307
+ suffix, "$RdaLo, $RdaHi, $Qm", cstr, pattern> {
308
+ bits<3> Qm;
309
+ bits<4> RdaLo;
310
+ bits<4> RdaHi;
311
+
312
+ let Inst{28} = U;
313
+ let Inst{22-20} = RdaHi{3-1};
314
+ let Inst{19-18} = 0b10;
315
+ let Inst{17-16} = 0b01;
316
+ let Inst{15-13} = RdaLo{3-1};
317
+ let Inst{12} = 0b0;
318
+ let Inst{8-6} = 0b100;
319
+ let Inst{5} = A;
320
+ let Inst{3-1} = Qm{2-0};
321
+ let Inst{0} = 0b0;
322
+ }
323
+
324
+ multiclass t2VADDLV_A<string suffix, bit U, list<dag> pattern=[]> {
325
+ def acc : t2VADDLV<"vaddlva", suffix,
326
+ (ins tGPREven:$RdaLo_src, tGPROdd:$RdaHi_src, MQPR:$Qm),
327
+ "$RdaLo = $RdaLo_src,$RdaHi = $RdaHi_src",
328
+ 0b1, U, pattern>;
329
+ def no_acc : t2VADDLV<"vaddlv", suffix,
330
+ (ins MQPR:$Qm), "",
331
+ 0b0, U, pattern>;
332
+ }
333
+
334
+
335
+ defm VADDLVs32 : t2VADDLV_A<"s32", 0b0>;
336
+ defm VADDLVu32 : t2VADDLV_A<"u32", 0b1>;
337
+
338
+ class t2VMINMAXNMV<string iname, string suffix, bit sz, bit bit_17, bit bit_7,
339
+ list<dag> pattern=[]>
340
+ : MVE_rDest<(outs rGPR:$RdaDest), (ins rGPR:$RdaSrc, MQPR:$Qm),
341
+ NoItinerary, iname, suffix, "$RdaSrc, $Qm",
342
+ "$RdaDest = $RdaSrc", pattern> {
343
+ bits<3> Qm;
344
+ bits<4> RdaDest;
345
+
346
+ let Inst{28} = sz;
347
+ let Inst{22-20} = 0b110;
348
+ let Inst{19-18} = 0b11;
349
+ let Inst{17} = bit_17;
350
+ let Inst{16} = 0b0;
351
+ let Inst{15-12} = RdaDest{3-0};
352
+ let Inst{8} = 0b1;
353
+ let Inst{7} = bit_7;
354
+ let Inst{6-5} = 0b00;
355
+ let Inst{3-1} = Qm{2-0};
356
+ let Inst{0} = 0b0;
357
+
358
+ let Predicates = [HasMVEFloat];
359
+ }
360
+
361
+ multiclass t2VMINMAXNMV_fty<string iname, bit bit_7, list<dag> pattern=[]> {
362
+ def f32 : t2VMINMAXNMV<iname, "f32", 0b0, 0b1, bit_7, pattern>;
363
+ def f16 : t2VMINMAXNMV<iname, "f16", 0b1, 0b1, bit_7, pattern>;
364
+ }
365
+
366
+ defm VMINNMV : t2VMINMAXNMV_fty<"vminnmv", 0b1>;
367
+ defm VMAXNMV : t2VMINMAXNMV_fty<"vmaxnmv", 0b0>;
368
+
369
+ multiclass t2VMINMAXNMAV_fty<string iname, bit bit_7, list<dag> pattern=[]> {
370
+ def f32 : t2VMINMAXNMV<iname, "f32", 0b0, 0b0, bit_7, pattern>;
371
+ def f16 : t2VMINMAXNMV<iname, "f16", 0b1, 0b0, bit_7, pattern>;
372
+ }
373
+
374
+ defm VMINNMAV : t2VMINMAXNMAV_fty<"vminnmav", 0b1>;
375
+ defm VMAXNMAV : t2VMINMAXNMAV_fty<"vmaxnmav", 0b0>;
376
+
377
+ class t2VMINMAXV<string iname, string suffix, bit U, bits<2> size,
378
+ bit bit_17, bit bit_7, list<dag> pattern=[]>
379
+ : MVE_rDest<(outs rGPR:$RdaDest), (ins rGPR:$RdaSrc, MQPR:$Qm), NoItinerary,
380
+ iname, suffix, "$RdaSrc, $Qm", "$RdaDest = $RdaSrc", pattern> {
381
+ bits<3> Qm;
382
+ bits<4> RdaDest;
383
+
384
+ let Inst{28} = U;
385
+ let Inst{22-20} = 0b110;
386
+ let Inst{19-18} = size{1-0};
387
+ let Inst{17} = bit_17;
388
+ let Inst{16} = 0b0;
389
+ let Inst{15-12} = RdaDest{3-0};
390
+ let Inst{8} = 0b1;
391
+ let Inst{7} = bit_7;
392
+ let Inst{6-5} = 0b00;
393
+ let Inst{3-1} = Qm{2-0};
394
+ let Inst{0} = 0b0;
395
+ }
396
+
397
+ multiclass t2VMINMAXV_ty<string iname, bit bit_7, list<dag> pattern=[]> {
398
+ def s8 : t2VMINMAXV<iname, "s8", 0b0, 0b00, 0b1, bit_7>;
399
+ def s16 : t2VMINMAXV<iname, "s16", 0b0, 0b01, 0b1, bit_7>;
400
+ def s32 : t2VMINMAXV<iname, "s32", 0b0, 0b10, 0b1, bit_7>;
401
+ def u8 : t2VMINMAXV<iname, "u8", 0b1, 0b00, 0b1, bit_7>;
402
+ def u16 : t2VMINMAXV<iname, "u16", 0b1, 0b01, 0b1, bit_7>;
403
+ def u32 : t2VMINMAXV<iname, "u32", 0b1, 0b10, 0b1, bit_7>;
404
+ }
405
+
406
+ // Prefixed with MVE to prevent conflict with A57 scheduler.
407
+ defm MVE_VMINV : t2VMINMAXV_ty<"vminv", 0b1>;
408
+ defm MVE_VMAXV : t2VMINMAXV_ty<"vmaxv", 0b0>;
409
+
410
+ multiclass t2VMINMAXAV_ty<string iname, bit bit_7, list<dag> pattern=[]> {
411
+ def s8 : t2VMINMAXV<iname, "s8", 0b0, 0b00, 0b0, bit_7>;
412
+ def s16 : t2VMINMAXV<iname, "s16", 0b0, 0b01, 0b0, bit_7>;
413
+ def s32 : t2VMINMAXV<iname, "s32", 0b0, 0b10, 0b0, bit_7>;
414
+ }
415
+
416
+ defm MVE_VMINAV : t2VMINMAXAV_ty<"vminav", 0b1>;
417
+ defm MVE_VMAXAV : t2VMINMAXAV_ty<"vmaxav", 0b0>;
418
+
419
+ class t2VMLAMLSDAV<string iname, string suffix, dag iops, string cstr,
420
+ bit sz, bit bit_28, bit A, bit X, bit bit_8, bit bit_0,
421
+ list<dag> pattern=[]>
422
+ : MVE_rDest<(outs tGPREven:$RdaDest), iops, NoItinerary, iname, suffix,
423
+ "$RdaDest, $Qn, $Qm", cstr, pattern> {
424
+ bits<4> RdaDest;
425
+ bits<3> Qm;
426
+ bits<3> Qn;
427
+
428
+ let Inst{28} = bit_28;
429
+ let Inst{22-20} = 0b111;
430
+ let Inst{19-17} = Qn{2-0};
431
+ let Inst{16} = sz;
432
+ let Inst{15-13} = RdaDest{3-1};
433
+ let Inst{12} = X;
434
+ let Inst{8} = bit_8;
435
+ let Inst{7-6} = 0b00;
436
+ let Inst{5} = A;
437
+ let Inst{3-1} = Qm{2-0};
438
+ let Inst{0} = bit_0;
439
+ }
440
+
441
+ multiclass t2VMLAMLSDAV_X<string iname, string suffix, dag iops, string cstr,
442
+ bit sz, bit bit_28, bit A, bit bit_8, bit bit_0,
443
+ list<dag> pattern=[]> {
444
+ def _noexch : t2VMLAMLSDAV<iname, suffix, iops, cstr, sz,
445
+ bit_28, A, 0b0, bit_8, bit_0, pattern>;
446
+ def _exch : t2VMLAMLSDAV<iname # "x", suffix, iops, cstr, sz,
447
+ bit_28, A, 0b1, bit_8, bit_0, pattern>;
448
+ }
449
+
450
+ multiclass t2VMLAMLSDAV_XA<string iname, string suffix, bit sz, bit bit_28,
451
+ bit bit_8, bit bit_0, list<dag> pattern=[]> {
452
+ defm _noacc : t2VMLAMLSDAV_X<iname, suffix, (ins MQPR:$Qn, MQPR:$Qm), "",
453
+ sz, bit_28, 0b0, bit_8, bit_0, pattern>;
454
+ defm _acc : t2VMLAMLSDAV_X<iname # "a", suffix,
455
+ (ins tGPREven:$RdaSrc, MQPR:$Qn, MQPR:$Qm),
456
+ "$RdaDest = $RdaSrc",
457
+ sz, bit_28, 0b1, bit_8, bit_0, pattern>;
458
+ }
459
+
460
+ multiclass t2VMLADAV_multi<string suffix, bit sz, bit U, bit bit_8,
461
+ list<dag> pattern=[]> {
462
+ defm "" : t2VMLAMLSDAV_XA<"vmladav", suffix, sz, U, bit_8, 0b0, pattern>;
463
+ }
464
+
465
+ defm VMLADAVs16 : t2VMLADAV_multi<"s16", 0b0, 0b0, 0b0>;
466
+ defm VMLADAVs32 : t2VMLADAV_multi<"s32", 0b1, 0b0, 0b0>;
467
+ defm VMLADAVu16 : t2VMLADAV_multi<"u16", 0b0, 0b1, 0b0>;
468
+ defm VMLADAVu32 : t2VMLADAV_multi<"u32", 0b1, 0b1, 0b0>;
469
+
470
+ defm VMLADAVs8 : t2VMLADAV_multi<"s8", 0b0, 0b0, 0b1>;
471
+ defm VMLADAVu8 : t2VMLADAV_multi<"u8", 0b0, 0b1, 0b1>;
472
+
473
+ // vmlav aliases vmladav
474
+ foreach acc = ["_acc", "_noacc"] in {
475
+ foreach suffix = ["s8", "s16", "s32", "u8", "u16", "u32"] in {
476
+ def : MVEInstAlias<!strconcat("vmlav", !if(!eq(acc, "_acc"), "a", ""),
477
+ "${vp}.", suffix, "\t$RdaDest, $Qn, $Qm"),
478
+ (!cast<Instruction>(!strconcat("VMLADAV", suffix, acc, "_noexch")) tGPREven:$RdaDest, MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>;
479
+ }
480
+ }
481
+
482
+ multiclass t2VMLSDAV_multi<string suffix, bit sz, bit bit_28,
483
+ list<dag> pattern=[]> {
484
+ defm "" : t2VMLAMLSDAV_XA<"vmlsdav", suffix, sz, bit_28, 0b0, 0b1, pattern>;
485
+ }
486
+
487
+ defm t2VMLSDAVs8 : t2VMLSDAV_multi<"s8", 0, 0b1>;
488
+ defm t2VMLSDAVs16 : t2VMLSDAV_multi<"s16", 0, 0b0>;
489
+ defm t2VMLSDAVs32 : t2VMLSDAV_multi<"s32", 1, 0b0>;
490
+
491
+ // Base class for VMLALDAV and VMLSLDAV, VRMLALDAVH, VRMLSLDAVH
492
+ class t2VMLALDAVBase<string iname, string suffix, dag iops, string cstr, bit sz,
493
+ bit bit_28, bit A, bit X, bit bit_8, bit bit_0,
494
+ list<dag> pattern=[]>
495
+ : MVE_rDest<(outs tGPREven:$RdaLoDest, tGPROdd:$RdaHiDest), iops, NoItinerary,
496
+ iname, suffix, "$RdaLoDest, $RdaHiDest, $Qn, $Qm", cstr, pattern> {
497
+ bits<4> RdaLoDest;
498
+ bits<4> RdaHiDest;
499
+ bits<3> Qm;
500
+ bits<3> Qn;
501
+
502
+ let Inst{28} = bit_28;
503
+ let Inst{22-20} = RdaHiDest{3-1};
504
+ let Inst{19-17} = Qn{2-0};
505
+ let Inst{16} = sz;
506
+ let Inst{15-13} = RdaLoDest{3-1};
507
+ let Inst{12} = X;
508
+ let Inst{8} = bit_8;
509
+ let Inst{7-6} = 0b00;
510
+ let Inst{5} = A;
511
+ let Inst{3-1} = Qm{2-0};
512
+ let Inst{0} = bit_0;
513
+ }
514
+
515
+ multiclass t2VMLALDAVBase_X<string iname, string suffix, dag iops, string cstr,
516
+ bit sz, bit bit_28, bit A, bit bit_8, bit bit_0,
517
+ list<dag> pattern=[]> {
518
+ def _noexch : t2VMLALDAVBase<iname, suffix, iops, cstr, sz,
519
+ bit_28, A, 0b0, bit_8, bit_0, pattern>;
520
+ def _exch : t2VMLALDAVBase<iname # "x", suffix, iops, cstr, sz,
521
+ bit_28, A, 0b1, bit_8, bit_0, pattern>;
522
+ }
523
+
524
+ multiclass t2VMLALDAVBase_XA<string iname, string suffix, bit sz, bit bit_28,
525
+ bit bit_8, bit bit_0, list<dag> pattern=[]> {
526
+ defm _noacc : t2VMLALDAVBase_X<iname, suffix,
527
+ (ins MQPR:$Qn, MQPR:$Qm), "",
528
+ sz, bit_28, 0b0, bit_8, bit_0, pattern>;
529
+ defm _acc : t2VMLALDAVBase_X<iname # "a", suffix,
530
+ (ins tGPREven:$RdaLoSrc, tGPROdd:$RdaHiSrc, MQPR:$Qn, MQPR:$Qm),
531
+ "$RdaLoDest = $RdaLoSrc,$RdaHiDest = $RdaHiSrc",
532
+ sz, bit_28, 0b1, bit_8, bit_0, pattern>;
533
+ }
534
+
535
+ multiclass t2VRMLALDAVH_multi<string suffix, bit U, list<dag> pattern=[]> {
536
+ defm "" : t2VMLALDAVBase_XA<"vrmlaldavh", suffix, 0b0, U, 0b1, 0b0, pattern>;
537
+ }
538
+
539
+ defm t2VRMLALDAVHs32 : t2VRMLALDAVH_multi<"s32", 0>;
540
+ defm t2VRMLALDAVHu32 : t2VRMLALDAVH_multi<"u32", 1>;
541
+
542
+ // vrmlalvh aliases for vrmlaldavh
543
+ def : MVEInstAlias<"vrmlalvh${vp}.s32\t$RdaLo, $RdaHi, $Qn, $Qm",
544
+ (t2VRMLALDAVHs32_noacc_noexch tGPREven:$RdaLo, tGPROdd:$RdaHi,
545
+ MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>;
546
+ def : MVEInstAlias<"vrmlalvha${vp}.s32\t$RdaLo, $RdaHi, $Qn, $Qm",
547
+ (t2VRMLALDAVHs32_acc_noexch tGPREven:$RdaLo, tGPROdd:$RdaHi,
548
+ MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>;
549
+ def : MVEInstAlias<"vrmlalvh${vp}.u32\t$RdaLo, $RdaHi, $Qn, $Qm",
550
+ (t2VRMLALDAVHu32_noacc_noexch tGPREven:$RdaLo, tGPROdd:$RdaHi,
551
+ MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>;
552
+ def : MVEInstAlias<"vrmlalvha${vp}.u32\t$RdaLo, $RdaHi, $Qn, $Qm",
553
+ (t2VRMLALDAVHu32_acc_noexch tGPREven:$RdaLo, tGPROdd:$RdaHi,
554
+ MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>;
555
+
556
+ multiclass t2VMLALDAV_multi<string suffix, bit sz, bit U, list<dag> pattern=[]> {
557
+ defm "" : t2VMLALDAVBase_XA<"vmlaldav", suffix, sz, U, 0b0, 0b0, pattern>;
558
+ }
559
+
560
+ defm VMLALDAVs16 : t2VMLALDAV_multi<"s16", 0b0, 0b0>;
561
+ defm VMLALDAVs32 : t2VMLALDAV_multi<"s32", 0b1, 0b0>;
562
+ defm VMLALDAVu16 : t2VMLALDAV_multi<"u16", 0b0, 0b1>;
563
+ defm VMLALDAVu32 : t2VMLALDAV_multi<"u32", 0b1, 0b1>;
564
+
565
+ // vmlalv aliases vmlaldav
566
+ foreach acc = ["_acc", "_noacc"] in {
567
+ foreach suffix = ["s16", "s32", "u16", "u32"] in {
568
+ def : MVEInstAlias<!strconcat("vmlalv", !if(!eq(acc, "_acc"), "a", ""),
569
+ "${vp}.", suffix, "\t$RdaLoDest, $RdaHiDest, $Qn, $Qm"),
570
+ (!cast<Instruction>(!strconcat("VMLALDAV", suffix, acc, "_noexch"))
571
+ tGPREven:$RdaLoDest, tGPROdd:$RdaHiDest,
572
+ MQPR:$Qn, MQPR:$Qm, vpred_n:$vp)>;
573
+ }
574
+ }
575
+
576
+ multiclass t2VMLSLDAV_multi<string iname, string suffix, bit sz,
577
+ bit bit_28, list<dag> pattern=[]> {
578
+ defm "" : t2VMLALDAVBase_XA<iname, suffix, sz, bit_28, 0b0, 0b1, pattern>;
579
+ }
580
+
581
+ defm t2VMLSLDAVs16 : t2VMLSLDAV_multi<"vmlsldav", "s16", 0b0, 0b0>;
582
+ defm t2VMLSLDAVs32 : t2VMLSLDAV_multi<"vmlsldav", "s32", 0b1, 0b0>;
583
+ defm t2VRMLSLDAVHs32 : t2VMLSLDAV_multi<"vrmlsldavh", "s32", 0b0, 0b1>;
584
+
269
585
// end of mve_rDest instructions
270
586
271
587
// start of mve_comp instructions
0 commit comments