@@ -441,7 +441,16 @@ def fsub_mlx : PatFrag<(ops node:$lhs, node:$rhs),(fsub node:$lhs, node:$rhs),[{
441
441
//
442
442
443
443
// Immediate operands with a shared generic asm render method.
444
- class ImmAsmOperand : AsmOperandClass { let RenderMethod = "addImmOperands"; }
444
+ class ImmAsmOperand<int Low, int High> : AsmOperandClass {
445
+ let RenderMethod = "addImmOperands";
446
+ let PredicateMethod = "isImmediate<" # Low # "," # High # ">";
447
+ let DiagnosticType = "ImmRange" # Low # "_" # High;
448
+ }
449
+
450
+ class ImmAsmOperandMinusOne<int Low, int High> : AsmOperandClass {
451
+ let PredicateMethod = "isImmediate<" # Low # "," # High # ">";
452
+ let DiagnosticType = "ImmRange" # Low # "_" # High;
453
+ }
445
454
446
455
// Operands that are part of a memory addressing mode.
447
456
class MemOperand : Operand<i32> { let OperandType = "OPERAND_MEMORY"; }
@@ -663,61 +672,71 @@ def arm_i32imm : PatLeaf<(imm), [{
663
672
}]>;
664
673
665
674
/// imm0_1 predicate - Immediate in the range [0,1].
666
- def Imm0_1AsmOperand: ImmAsmOperand { let Name = "Imm0_1"; }
675
+ def Imm0_1AsmOperand: ImmAsmOperand<0,1> { let Name = "Imm0_1"; }
667
676
def imm0_1 : Operand<i32> { let ParserMatchClass = Imm0_1AsmOperand; }
668
677
669
678
/// imm0_3 predicate - Immediate in the range [0,3].
670
- def Imm0_3AsmOperand: ImmAsmOperand { let Name = "Imm0_3"; }
679
+ def Imm0_3AsmOperand: ImmAsmOperand<0,3> { let Name = "Imm0_3"; }
671
680
def imm0_3 : Operand<i32> { let ParserMatchClass = Imm0_3AsmOperand; }
672
681
673
682
/// imm0_7 predicate - Immediate in the range [0,7].
674
- def Imm0_7AsmOperand: ImmAsmOperand { let Name = "Imm0_7"; }
683
+ def Imm0_7AsmOperand: ImmAsmOperand<0,7> {
684
+ let Name = "Imm0_7";
685
+ }
675
686
def imm0_7 : Operand<i32>, ImmLeaf<i32, [{
676
687
return Imm >= 0 && Imm < 8;
677
688
}]> {
678
689
let ParserMatchClass = Imm0_7AsmOperand;
679
690
}
680
691
692
+ /// imm8_255 predicate - Immediate in the range [8,255].
693
+ def Imm8_255AsmOperand: ImmAsmOperand<8,255> { let Name = "Imm8_255"; }
694
+ def imm8_255 : Operand<i32>, ImmLeaf<i32, [{
695
+ return Imm >= 8 && Imm < 256;
696
+ }]> {
697
+ let ParserMatchClass = Imm8_255AsmOperand;
698
+ }
699
+
681
700
/// imm8 predicate - Immediate is exactly 8.
682
- def Imm8AsmOperand: ImmAsmOperand { let Name = "Imm8"; }
701
+ def Imm8AsmOperand: ImmAsmOperand<8,8> { let Name = "Imm8"; }
683
702
def imm8 : Operand<i32>, ImmLeaf<i32, [{ return Imm == 8; }]> {
684
703
let ParserMatchClass = Imm8AsmOperand;
685
704
}
686
705
687
706
/// imm16 predicate - Immediate is exactly 16.
688
- def Imm16AsmOperand: ImmAsmOperand { let Name = "Imm16"; }
707
+ def Imm16AsmOperand: ImmAsmOperand<16,16> { let Name = "Imm16"; }
689
708
def imm16 : Operand<i32>, ImmLeaf<i32, [{ return Imm == 16; }]> {
690
709
let ParserMatchClass = Imm16AsmOperand;
691
710
}
692
711
693
712
/// imm32 predicate - Immediate is exactly 32.
694
- def Imm32AsmOperand: ImmAsmOperand { let Name = "Imm32"; }
713
+ def Imm32AsmOperand: ImmAsmOperand<32,32> { let Name = "Imm32"; }
695
714
def imm32 : Operand<i32>, ImmLeaf<i32, [{ return Imm == 32; }]> {
696
715
let ParserMatchClass = Imm32AsmOperand;
697
716
}
698
717
699
718
def imm8_or_16 : ImmLeaf<i32, [{ return Imm == 8 || Imm == 16;}]>;
700
719
701
720
/// imm1_7 predicate - Immediate in the range [1,7].
702
- def Imm1_7AsmOperand: ImmAsmOperand { let Name = "Imm1_7"; }
721
+ def Imm1_7AsmOperand: ImmAsmOperand<1,7> { let Name = "Imm1_7"; }
703
722
def imm1_7 : Operand<i32>, ImmLeaf<i32, [{ return Imm > 0 && Imm < 8; }]> {
704
723
let ParserMatchClass = Imm1_7AsmOperand;
705
724
}
706
725
707
726
/// imm1_15 predicate - Immediate in the range [1,15].
708
- def Imm1_15AsmOperand: ImmAsmOperand { let Name = "Imm1_15"; }
727
+ def Imm1_15AsmOperand: ImmAsmOperand<1,15> { let Name = "Imm1_15"; }
709
728
def imm1_15 : Operand<i32>, ImmLeaf<i32, [{ return Imm > 0 && Imm < 16; }]> {
710
729
let ParserMatchClass = Imm1_15AsmOperand;
711
730
}
712
731
713
732
/// imm1_31 predicate - Immediate in the range [1,31].
714
- def Imm1_31AsmOperand: ImmAsmOperand { let Name = "Imm1_31"; }
733
+ def Imm1_31AsmOperand: ImmAsmOperand<1,31> { let Name = "Imm1_31"; }
715
734
def imm1_31 : Operand<i32>, ImmLeaf<i32, [{ return Imm > 0 && Imm < 32; }]> {
716
735
let ParserMatchClass = Imm1_31AsmOperand;
717
736
}
718
737
719
738
/// imm0_15 predicate - Immediate in the range [0,15].
720
- def Imm0_15AsmOperand: ImmAsmOperand {
739
+ def Imm0_15AsmOperand: ImmAsmOperand<0,15> {
721
740
let Name = "Imm0_15";
722
741
let DiagnosticType = "ImmRange0_15";
723
742
}
@@ -728,31 +747,31 @@ def imm0_15 : Operand<i32>, ImmLeaf<i32, [{
728
747
}
729
748
730
749
/// imm0_31 predicate - True if the 32-bit immediate is in the range [0,31].
731
- def Imm0_31AsmOperand: ImmAsmOperand { let Name = "Imm0_31"; }
750
+ def Imm0_31AsmOperand: ImmAsmOperand<0,31> { let Name = "Imm0_31"; }
732
751
def imm0_31 : Operand<i32>, ImmLeaf<i32, [{
733
752
return Imm >= 0 && Imm < 32;
734
753
}]> {
735
754
let ParserMatchClass = Imm0_31AsmOperand;
736
755
}
737
756
738
757
/// imm0_32 predicate - True if the 32-bit immediate is in the range [0,32].
739
- def Imm0_32AsmOperand: ImmAsmOperand { let Name = "Imm0_32"; }
758
+ def Imm0_32AsmOperand: ImmAsmOperand<0,32> { let Name = "Imm0_32"; }
740
759
def imm0_32 : Operand<i32>, ImmLeaf<i32, [{
741
- return Imm >= 0 && Imm < 32 ;
760
+ return Imm >= 0 && Imm < 33 ;
742
761
}]> {
743
762
let ParserMatchClass = Imm0_32AsmOperand;
744
763
}
745
764
746
765
/// imm0_63 predicate - True if the 32-bit immediate is in the range [0,63].
747
- def Imm0_63AsmOperand: ImmAsmOperand { let Name = "Imm0_63"; }
766
+ def Imm0_63AsmOperand: ImmAsmOperand<0,63> { let Name = "Imm0_63"; }
748
767
def imm0_63 : Operand<i32>, ImmLeaf<i32, [{
749
768
return Imm >= 0 && Imm < 64;
750
769
}]> {
751
770
let ParserMatchClass = Imm0_63AsmOperand;
752
771
}
753
772
754
773
/// imm0_239 predicate - Immediate in the range [0,239].
755
- def Imm0_239AsmOperand : ImmAsmOperand {
774
+ def Imm0_239AsmOperand : ImmAsmOperand<0,239> {
756
775
let Name = "Imm0_239";
757
776
let DiagnosticType = "ImmRange0_239";
758
777
}
@@ -761,13 +780,13 @@ def imm0_239 : Operand<i32>, ImmLeaf<i32, [{ return Imm >= 0 && Imm < 240; }]> {
761
780
}
762
781
763
782
/// imm0_255 predicate - Immediate in the range [0,255].
764
- def Imm0_255AsmOperand : ImmAsmOperand { let Name = "Imm0_255"; }
783
+ def Imm0_255AsmOperand : ImmAsmOperand<0,255> { let Name = "Imm0_255"; }
765
784
def imm0_255 : Operand<i32>, ImmLeaf<i32, [{ return Imm >= 0 && Imm < 256; }]> {
766
785
let ParserMatchClass = Imm0_255AsmOperand;
767
786
}
768
787
769
- /// imm0_65535 - An immediate is in the range [0. 65535].
770
- def Imm0_65535AsmOperand: ImmAsmOperand { let Name = "Imm0_65535"; }
788
+ /// imm0_65535 - An immediate is in the range [0, 65535].
789
+ def Imm0_65535AsmOperand: ImmAsmOperand<0,65535> { let Name = "Imm0_65535"; }
771
790
def imm0_65535 : Operand<i32>, ImmLeaf<i32, [{
772
791
return Imm >= 0 && Imm < 65536;
773
792
}]> {
@@ -785,19 +804,23 @@ def imm0_65535_neg : Operand<i32>, ImmLeaf<i32, [{
785
804
// FIXME: This really needs a Thumb version separate from the ARM version.
786
805
// While the range is the same, and can thus use the same match class,
787
806
// the encoding is different so it should have a different encoder method.
788
- def Imm0_65535ExprAsmOperand: ImmAsmOperand { let Name = "Imm0_65535Expr"; }
807
+ def Imm0_65535ExprAsmOperand: AsmOperandClass {
808
+ let Name = "Imm0_65535Expr";
809
+ let RenderMethod = "addImmOperands";
810
+ }
811
+
789
812
def imm0_65535_expr : Operand<i32> {
790
813
let EncoderMethod = "getHiLo16ImmOpValue";
791
814
let ParserMatchClass = Imm0_65535ExprAsmOperand;
792
815
}
793
816
794
- def Imm256_65535ExprAsmOperand: ImmAsmOperand { let Name = "Imm256_65535Expr"; }
817
+ def Imm256_65535ExprAsmOperand: ImmAsmOperand<256,65535> { let Name = "Imm256_65535Expr"; }
795
818
def imm256_65535_expr : Operand<i32> {
796
819
let ParserMatchClass = Imm256_65535ExprAsmOperand;
797
820
}
798
821
799
822
/// imm24b - True if the 32-bit immediate is encodable in 24 bits.
800
- def Imm24bitAsmOperand: ImmAsmOperand { let Name = "Imm24bit"; }
823
+ def Imm24bitAsmOperand: ImmAsmOperand<0,0xffffff> { let Name = "Imm24bit"; }
801
824
def imm24b : Operand<i32>, ImmLeaf<i32, [{
802
825
return Imm >= 0 && Imm <= 0xffffff;
803
826
}]> {
@@ -826,7 +849,9 @@ def imm1_32_XFORM: SDNodeXForm<imm, [{
826
849
return CurDAG->getTargetConstant((int)N->getZExtValue() - 1, SDLoc(N),
827
850
MVT::i32);
828
851
}]>;
829
- def Imm1_32AsmOperand: AsmOperandClass { let Name = "Imm1_32"; }
852
+ def Imm1_32AsmOperand: ImmAsmOperandMinusOne<1,32> {
853
+ let Name = "Imm1_32";
854
+ }
830
855
def imm1_32 : Operand<i32>, PatLeaf<(imm), [{
831
856
uint64_t Imm = N->getZExtValue();
832
857
return Imm > 0 && Imm <= 32;
@@ -840,7 +865,7 @@ def imm1_16_XFORM: SDNodeXForm<imm, [{
840
865
return CurDAG->getTargetConstant((int)N->getZExtValue() - 1, SDLoc(N),
841
866
MVT::i32);
842
867
}]>;
843
- def Imm1_16AsmOperand: AsmOperandClass { let Name = "Imm1_16"; }
868
+ def Imm1_16AsmOperand: ImmAsmOperandMinusOne<1,16> { let Name = "Imm1_16"; }
844
869
def imm1_16 : Operand<i32>, PatLeaf<(imm), [{ return Imm > 0 && Imm <= 16; }],
845
870
imm1_16_XFORM> {
846
871
let PrintMethod = "printImmPlusOneOperand";
0 commit comments