@@ -363,38 +363,52 @@ class BinOpAIF_AF<bits<8> o, string m, X86TypeInfo t, Register areg,
363
363
// UnaryOpR - Instructions that read "reg".
364
364
class UnaryOpR<bits<8> o, Format f, string m, string args, X86TypeInfo t,
365
365
dag out, list<dag> p>
366
- : ITy<o, f, t, out, (ins t.RegClass:$src ), m, args, p>, Sched<[WriteALU]>;
366
+ : ITy<o, f, t, out, (ins t.RegClass:$src1 ), m, args, p>, Sched<[WriteALU]>;
367
367
// UnaryOpR_R - Instructions that read "reg" and write "reg".
368
368
class UnaryOpR_R<bits<8> o, Format f, string m, X86TypeInfo t,
369
- SDPatternOperator node>
370
- : UnaryOpR<o, f, m, unaryop_args, t, (outs t.RegClass:$dst),
371
- [(set t.RegClass:$dst, (node t.RegClass:$src))]>;
369
+ SDPatternOperator node, bit ndd = 0>
370
+ : UnaryOpR<o, f, m, !if(!eq(ndd, 0), unaryop_args, unaryop_ndd_args), t,
371
+ (outs t.RegClass:$dst),
372
+ [(set t.RegClass:$dst, (node t.RegClass:$src1))]>, NDD<ndd>;
372
373
// UnaryOpR_RF - Instructions that read "reg" and write "reg"/EFLAGS.
373
374
class UnaryOpR_RF<bits<8> o, Format f, string m, X86TypeInfo t,
374
- SDPatternOperator node>
375
- : UnaryOpR<o, f, m, unaryop_args, t, (outs t.RegClass:$dst),
376
- [(set t.RegClass:$dst, (node t.RegClass:$src)),
377
- (implicit EFLAGS)]>, DefEFLAGS;
375
+ SDPatternOperator node, bit ndd = 0>
376
+ : UnaryOpR<o, f, m, !if(!eq(ndd, 0), unaryop_args, unaryop_ndd_args), t,
377
+ (outs t.RegClass:$dst),
378
+ [(set t.RegClass:$dst, (node t.RegClass:$src1)),
379
+ (implicit EFLAGS)]>, DefEFLAGS, NDD<ndd>;
378
380
379
381
// UnaryOpM - Instructions that read "[mem]".
380
382
class UnaryOpM<bits<8> o, Format f, string m, string args, X86TypeInfo t,
381
383
dag out, list<dag> p>
382
- : ITy<o, f, t, out, (ins t.MemOperand:$src ), m, args, p> {
384
+ : ITy<o, f, t, out, (ins t.MemOperand:$src1 ), m, args, p> {
383
385
let mayLoad = 1;
384
386
}
387
+ // UnaryOpM_R - Instructions that read "[mem]" and writes "reg".
388
+ class UnaryOpM_R<bits<8> o, Format f, string m, X86TypeInfo t,
389
+ SDPatternOperator node>
390
+ : UnaryOpM<o, f, m, unaryop_ndd_args, t, (outs t.RegClass:$dst),
391
+ [(set t.RegClass:$dst, (node (t.LoadNode addr:$src1)))]>,
392
+ Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>, NDD<1>;
393
+ // UnaryOpM_RF - Instructions that read "[mem]" and writes "reg"/EFLAGS.
394
+ class UnaryOpM_RF<bits<8> o, Format f, string m, X86TypeInfo t,
395
+ SDPatternOperator node>
396
+ : UnaryOpM<o, f, m, unaryop_ndd_args, t, (outs t.RegClass:$dst),
397
+ [(set t.RegClass:$dst, EFLAGS, (node (t.LoadNode addr:$src1)))]>,
398
+ Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>, DefEFLAGS, NDD<1>;
385
399
// UnaryOpM_M - Instructions that read "[mem]" and writes "[mem]".
386
400
class UnaryOpM_M<bits<8> o, Format f, string m, X86TypeInfo t,
387
401
SDPatternOperator node>
388
402
: UnaryOpM<o, f, m, unaryop_args, t, (outs),
389
- [(store (node (t.LoadNode addr:$src )), addr:$src )]>,
403
+ [(store (node (t.LoadNode addr:$src1 )), addr:$src1 )]>,
390
404
Sched<[WriteALURMW]>{
391
405
let mayStore = 1;
392
406
}
393
407
// UnaryOpM_MF - Instructions that read "[mem]" and writes "[mem]"/EFLAGS.
394
408
class UnaryOpM_MF<bits<8> o, Format f, string m, X86TypeInfo t,
395
409
SDPatternOperator node>
396
410
: UnaryOpM<o, f, m, unaryop_args, t, (outs),
397
- [(store (node (t.LoadNode addr:$src )), addr:$src ),
411
+ [(store (node (t.LoadNode addr:$src1 )), addr:$src1 ),
398
412
(implicit EFLAGS)]>, Sched<[WriteALURMW]>, DefEFLAGS {
399
413
let mayStore = 1;
400
414
}
@@ -404,13 +418,13 @@ class UnaryOpM_MF<bits<8> o, Format f, string m, X86TypeInfo t,
404
418
//
405
419
class MulDivOpR<bits<8> o, Format f, string m, X86TypeInfo t,
406
420
X86FoldableSchedWrite sched, list<dag> p>
407
- : UnaryOpR<o, f, m, "$src ", t, (outs), p> {
421
+ : UnaryOpR<o, f, m, "$src1 ", t, (outs), p> {
408
422
let SchedRW = [sched];
409
423
}
410
424
411
425
class MulDivOpM<bits<8> o, Format f, string m, X86TypeInfo t,
412
426
X86FoldableSchedWrite sched, list<dag> p>
413
- : UnaryOpM<o, f, m, "$src ", t, (outs), p> {
427
+ : UnaryOpM<o, f, m, "$src1 ", t, (outs), p> {
414
428
let SchedRW =
415
429
[sched.Folded,
416
430
// Memory operand.
@@ -428,7 +442,7 @@ multiclass Mul<bits<8> o, string m, Format RegMRM, Format MemMRM, SDPatternOpera
428
442
// syntax can be accepted.
429
443
let Defs = [AL,EFLAGS,AX], Uses = [AL] in
430
444
def 8r : MulDivOpR<o, RegMRM, m, Xi8, WriteIMul8,
431
- [(set AL, (node AL, GR8:$src )), (implicit EFLAGS)]>;
445
+ [(set AL, (node AL, GR8:$src1 )), (implicit EFLAGS)]>;
432
446
let Defs = [AX,DX,EFLAGS], Uses = [AX] in
433
447
def 16r : MulDivOpR<o, RegMRM, m, Xi16, WriteIMul16, []>, OpSize16;
434
448
let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in
@@ -437,7 +451,7 @@ multiclass Mul<bits<8> o, string m, Format RegMRM, Format MemMRM, SDPatternOpera
437
451
def 64r : MulDivOpR<o, RegMRM, m, Xi64, WriteIMul64, []>;
438
452
let Defs = [AL,EFLAGS,AX], Uses = [AL] in
439
453
def 8m : MulDivOpM<o, MemMRM, m, Xi8, WriteIMul8,
440
- [(set AL, (node AL, (loadi8 addr:$src ))), (implicit EFLAGS)]>;
454
+ [(set AL, (node AL, (loadi8 addr:$src1 ))), (implicit EFLAGS)]>;
441
455
let Defs = [AX,DX,EFLAGS], Uses = [AX] in
442
456
def 16m : MulDivOpM<o, MemMRM, m, Xi16, WriteIMul16, []>, OpSize16;
443
457
let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in
@@ -543,26 +557,26 @@ def IMUL64rmi32 : IMulOpMI_R<Xi64, WriteIMul64Imm>;
543
557
//
544
558
class IncOpR_RF<X86TypeInfo t> : UnaryOpR_RF<0xFF, MRM0r, "inc", t, null_frag> {
545
559
let Pattern = [(set t.RegClass:$dst, EFLAGS,
546
- (X86add_flag_nocf t.RegClass:$src , 1))];
560
+ (X86add_flag_nocf t.RegClass:$src1 , 1))];
547
561
}
548
562
class DecOpR_RF<X86TypeInfo t> : UnaryOpR_RF<0xFF, MRM1r, "dec", t, null_frag> {
549
563
let Pattern = [(set t.RegClass:$dst, EFLAGS,
550
- (X86sub_flag_nocf t.RegClass:$src , 1))];
564
+ (X86sub_flag_nocf t.RegClass:$src1 , 1))];
551
565
}
552
566
class IncOpM_M<X86TypeInfo t> : UnaryOpM_MF<0xFF, MRM0m, "inc", t, null_frag> {
553
- let Pattern = [(store (add (t.LoadNode addr:$src ), 1), addr:$src ),
567
+ let Pattern = [(store (add (t.LoadNode addr:$src1 ), 1), addr:$src1 ),
554
568
(implicit EFLAGS)];
555
569
}
556
570
class DecOpM_M<X86TypeInfo t> : UnaryOpM_MF<0xFF, MRM1m, "dec", t, null_frag> {
557
- let Pattern = [(store (add (t.LoadNode addr:$src ), -1), addr:$src ),
571
+ let Pattern = [(store (add (t.LoadNode addr:$src1 ), -1), addr:$src1 ),
558
572
(implicit EFLAGS)];
559
573
}
560
574
// IncDec_Alt - Instructions like "inc reg" short forms.
561
575
// Short forms only valid in 32-bit mode. Selected during MCInst lowering.
562
576
class IncDec_Alt<bits<8> o, string m, X86TypeInfo t>
563
577
: UnaryOpR_RF<o, AddRegFrm, m, t, null_frag>, Requires<[Not64BitMode]>;
564
578
565
- let Constraints = "$src = $dst", isConvertibleToThreeAddress = 1 in {
579
+ let isConvertibleToThreeAddress = 1 in {
566
580
def INC16r_alt : IncDec_Alt<0x40, "inc", Xi16>, OpSize16;
567
581
def INC32r_alt : IncDec_Alt<0x40, "inc", Xi32>, OpSize32;
568
582
def DEC16r_alt : IncDec_Alt<0x48, "dec", Xi16>, OpSize16;
@@ -592,34 +606,108 @@ def DEC64m : DecOpM_M<Xi64>;
592
606
//===----------------------------------------------------------------------===//
593
607
// NEG and NOT Instructions
594
608
//
595
- class NegOpR_RF<X86TypeInfo t> : UnaryOpR_RF<0xF7, MRM3r, "neg", t, ineg>;
609
+ class NegOpR_R<X86TypeInfo t, bit ndd = 0>
610
+ : UnaryOpR_R<0xF7, MRM3r, "neg", t, ineg, ndd>;
611
+ class NegOpR_RF<X86TypeInfo t, bit ndd = 0>
612
+ : UnaryOpR_RF<0xF7, MRM3r, "neg", t, ineg, ndd>;
613
+ class NegOpM_M<X86TypeInfo t> : UnaryOpM_M<0xF7, MRM3m, "neg", t, null_frag>;
596
614
class NegOpM_MF<X86TypeInfo t> : UnaryOpM_MF<0xF7, MRM3m, "neg", t, ineg>;
615
+ class NegOpM_R<X86TypeInfo t> : UnaryOpM_R<0xF7, MRM3m, "neg", t, null_frag>;
616
+ class NegOpM_RF<X86TypeInfo t> : UnaryOpM_RF<0xF7, MRM3m, "neg", t, ineg>;
597
617
598
- class NotOpR_R<X86TypeInfo t> : UnaryOpR_R<0xF7, MRM2r, "not", t, not>;
618
+ class NotOpR_R<X86TypeInfo t, bit ndd = 0>
619
+ : UnaryOpR_R<0xF7, MRM2r, "not", t, not, ndd>;
599
620
class NotOpM_M<X86TypeInfo t> : UnaryOpM_M<0xF7, MRM2m, "not", t, not>;
621
+ class NotOpM_R<X86TypeInfo t> : UnaryOpM_R<0xF7, MRM2m, "not", t, not>;
600
622
601
- let Constraints = "$src = $dst" in {
623
+ let Predicates = [NoNDD] in {
602
624
def NEG8r : NegOpR_RF<Xi8>;
603
625
def NEG16r : NegOpR_RF<Xi16>, OpSize16;
604
626
def NEG32r : NegOpR_RF<Xi32>, OpSize32;
605
627
def NEG64r : NegOpR_RF<Xi64>;
606
-
607
628
def NOT8r : NotOpR_R<Xi8>;
608
629
def NOT16r : NotOpR_R<Xi16>, OpSize16;
609
630
def NOT32r : NotOpR_R<Xi32>, OpSize32;
610
631
def NOT64r : NotOpR_R<Xi64>;
611
632
}
612
633
634
+ let Predicates = [HasNDD, In64BitMode] in {
635
+ def NEG8r_ND : NegOpR_RF<Xi8, 1>;
636
+ def NEG16r_ND : NegOpR_RF<Xi16, 1>, PD;
637
+ def NEG32r_ND : NegOpR_RF<Xi32, 1>;
638
+ def NEG64r_ND : NegOpR_RF<Xi64, 1>;
639
+
640
+ def NOT8r_ND : NotOpR_R<Xi8, 1>;
641
+ def NOT16r_ND : NotOpR_R<Xi16, 1>, PD;
642
+ def NOT32r_ND : NotOpR_R<Xi32, 1>;
643
+ def NOT64r_ND : NotOpR_R<Xi64, 1>;
644
+
645
+ def NEG8r_NF_ND : NegOpR_R<Xi8, 1>, EVEX_NF;
646
+ def NEG16r_NF_ND : NegOpR_R<Xi16, 1>, EVEX_NF, PD;
647
+ def NEG32r_NF_ND : NegOpR_R<Xi32, 1>, EVEX_NF;
648
+ def NEG64r_NF_ND : NegOpR_R<Xi64, 1>, EVEX_NF;
649
+ }
650
+
613
651
def NEG8m : NegOpM_MF<Xi8>;
614
652
def NEG16m : NegOpM_MF<Xi16>, OpSize16;
615
653
def NEG32m : NegOpM_MF<Xi32>, OpSize32;
616
654
def NEG64m : NegOpM_MF<Xi64>, Requires<[In64BitMode]>;
617
655
656
+ let Predicates = [HasNDD, In64BitMode] in {
657
+ def NEG8m_ND : NegOpM_RF<Xi8>;
658
+ def NEG16m_ND : NegOpM_RF<Xi16>, PD;
659
+ def NEG32m_ND : NegOpM_RF<Xi32>;
660
+ def NEG64m_ND : NegOpM_RF<Xi64>;
661
+
662
+ def NEG8m_NF_ND : NegOpM_R<Xi8>, EVEX_NF;
663
+ def NEG16m_NF_ND : NegOpM_R<Xi16>, EVEX_NF, PD;
664
+ def NEG32m_NF_ND : NegOpM_R<Xi32>, EVEX_NF;
665
+ def NEG64m_NF_ND : NegOpM_R<Xi64>, EVEX_NF;
666
+ }
667
+
618
668
def NOT8m : NotOpM_M<Xi8>;
619
669
def NOT16m : NotOpM_M<Xi16>, OpSize16;
620
670
def NOT32m : NotOpM_M<Xi32>, OpSize32;
621
671
def NOT64m : NotOpM_M<Xi64>, Requires<[In64BitMode]>;
622
672
673
+ let Predicates = [HasNDD, In64BitMode] in {
674
+ def NOT8m_ND : NotOpM_R<Xi8>;
675
+ def NOT16m_ND : NotOpM_R<Xi16>, PD;
676
+ def NOT32m_ND : NotOpM_R<Xi32>;
677
+ def NOT64m_ND : NotOpM_R<Xi64>;
678
+ }
679
+
680
+ let Predicates = [In64BitMode], Pattern = [(null_frag)] in {
681
+ def NEG8r_NF : NegOpR_R<Xi8>, NF;
682
+ def NEG16r_NF : NegOpR_R<Xi16>, NF, PD;
683
+ def NEG32r_NF : NegOpR_R<Xi32>, NF;
684
+ def NEG64r_NF : NegOpR_R<Xi64>, NF;
685
+ def NEG8m_NF : NegOpM_M<Xi8>, NF;
686
+ def NEG16m_NF : NegOpM_M<Xi16>, NF, PD;
687
+ def NEG32m_NF : NegOpM_M<Xi32>, NF;
688
+ def NEG64m_NF : NegOpM_M<Xi64>, NF;
689
+
690
+ def NEG8r_EVEX : NegOpR_RF<Xi8>, PL;
691
+ def NEG16r_EVEX : NegOpR_RF<Xi16>, PL, PD;
692
+ def NEG32r_EVEX : NegOpR_RF<Xi32>, PL;
693
+ def NEG64r_EVEX : NegOpR_RF<Xi64>, PL;
694
+
695
+ def NOT8r_EVEX : NotOpR_R<Xi8>, PL;
696
+ def NOT16r_EVEX : NotOpR_R<Xi16>, PL, PD;
697
+ def NOT32r_EVEX : NotOpR_R<Xi32>, PL;
698
+ def NOT64r_EVEX : NotOpR_R<Xi64>, PL;
699
+
700
+ def NEG8m_EVEX : NegOpM_MF<Xi8>, PL;
701
+ def NEG16m_EVEX : NegOpM_MF<Xi16>, PL, PD;
702
+ def NEG32m_EVEX : NegOpM_MF<Xi32>, PL;
703
+ def NEG64m_EVEX : NegOpM_MF<Xi64>, PL;
704
+
705
+ def NOT8m_EVEX : NotOpM_M<Xi8>, PL;
706
+ def NOT16m_EVEX : NotOpM_M<Xi16>, PL, PD;
707
+ def NOT32m_EVEX : NotOpM_M<Xi32>, PL;
708
+ def NOT64m_EVEX : NotOpM_M<Xi64>, PL;
709
+ }
710
+
623
711
/// ArithBinOp_RF - This is an arithmetic binary operator where the pattern is
624
712
/// defined with "(set GPR:$dst, EFLAGS, (...".
625
713
///
0 commit comments