@@ -4128,11 +4128,12 @@ defm MVE_VMINNMAf16 : MVE_VMINNMA<MVE_v8f16, 0b1>;
4128
4128
4129
4129
// start of MVE compares
4130
4130
4131
+ // Base class for comparing two vector registers
4131
4132
class MVE_VCMPqq<string suffix, bit bit_28, bits<2> bits_21_20,
4132
4133
VCMPPredicateOperand predtype, bits<2> vecsize, list<dag> pattern=[]>
4133
4134
: MVE_p<(outs VCCR:$P0), (ins MQPR:$Qn, MQPR:$Qm, predtype:$fc),
4134
4135
NoItinerary, "vcmp", suffix, "$fc, $Qn, $Qm", vpred_n, "", vecsize, pattern> {
4135
- // Base class for comparing two vector registers
4136
+ bits<0> P0;
4136
4137
bits<3> fc;
4137
4138
bits<4> Qn;
4138
4139
bits<4> Qm;
@@ -4152,16 +4153,6 @@ class MVE_VCMPqq<string suffix, bit bit_28, bits<2> bits_21_20,
4152
4153
let Inst{0} = fc{1};
4153
4154
4154
4155
let Constraints = "";
4155
-
4156
- // We need a custom decoder method for these instructions because of
4157
- // the output VCCR operand, which isn't encoded in the instruction
4158
- // bits anywhere (there is only one choice for it) but has to be
4159
- // included in the MC operands so that codegen will be able to track
4160
- // its data flow between instructions, spill/reload it when
4161
- // necessary, etc. There seems to be no way to get the Tablegen
4162
- // decoder to emit an operand that isn't affected by any instruction
4163
- // bit.
4164
- let DecoderMethod = "DecodeMVEVCMP<false," # predtype.DecoderMethod # ">";
4165
4156
let validForTailPredication = 1;
4166
4157
}
4167
4158
@@ -4202,11 +4193,12 @@ def MVE_VCMPs8 : MVE_VCMPqqs<"s8", 0b00>;
4202
4193
def MVE_VCMPs16 : MVE_VCMPqqs<"s16", 0b01>;
4203
4194
def MVE_VCMPs32 : MVE_VCMPqqs<"s32", 0b10>;
4204
4195
4196
+ // Base class for comparing a vector register with a scalar
4205
4197
class MVE_VCMPqr<string suffix, bit bit_28, bits<2> bits_21_20,
4206
4198
VCMPPredicateOperand predtype, bits<2> vecsize, list<dag> pattern=[]>
4207
4199
: MVE_p<(outs VCCR:$P0), (ins MQPR:$Qn, GPRwithZR:$Rm, predtype:$fc),
4208
4200
NoItinerary, "vcmp", suffix, "$fc, $Qn, $Rm", vpred_n, "", vecsize, pattern> {
4209
- // Base class for comparing a vector register with a scalar
4201
+ bits<0> P0;
4210
4202
bits<3> fc;
4211
4203
bits<4> Qn;
4212
4204
bits<4> Rm;
@@ -4225,8 +4217,6 @@ class MVE_VCMPqr<string suffix, bit bit_28, bits<2> bits_21_20,
4225
4217
let Inst{3-0} = Rm{3-0};
4226
4218
4227
4219
let Constraints = "";
4228
- // Custom decoder method, for the same reason as MVE_VCMPqq
4229
- let DecoderMethod = "DecodeMVEVCMP<true," # predtype.DecoderMethod # ">";
4230
4220
let validForTailPredication = 1;
4231
4221
}
4232
4222
@@ -5762,6 +5752,7 @@ let isReMaterializable = 1 in
5762
5752
class MVE_VCTPInst<string suffix, bits<2> size, list<dag> pattern=[]>
5763
5753
: MVE_p<(outs VCCR:$P0), (ins rGPR:$Rn), NoItinerary, "vctp", suffix,
5764
5754
"$Rn", vpred_n, "", size, pattern> {
5755
+ bits<0> P0;
5765
5756
bits<4> Rn;
5766
5757
5767
5758
let Inst{28-27} = 0b10;
@@ -5773,7 +5764,6 @@ class MVE_VCTPInst<string suffix, bits<2> size, list<dag> pattern=[]>
5773
5764
let Unpredictable{10-0} = 0b11111111111;
5774
5765
5775
5766
let Constraints = "";
5776
- let DecoderMethod = "DecodeMveVCTP";
5777
5767
let validForTailPredication = 1;
5778
5768
}
5779
5769
@@ -6813,14 +6803,15 @@ let Predicates = [HasMVEFloat] in {
6813
6803
6814
6804
def MVE_VPNOT : MVE_p<(outs VCCR:$P0), (ins VCCR:$P0_in), NoItinerary,
6815
6805
"vpnot", "", "", vpred_n, "", 0b00, []> {
6806
+ bits<0> P0;
6807
+ bits<0> P0_in;
6816
6808
let Inst{31-0} = 0b11111110001100010000111101001101;
6817
6809
let Unpredictable{19-17} = 0b111;
6818
6810
let Unpredictable{12} = 0b1;
6819
6811
let Unpredictable{7} = 0b1;
6820
6812
let Unpredictable{5} = 0b1;
6821
6813
6822
6814
let Constraints = "";
6823
- let DecoderMethod = "DecodeMVEVPNOT";
6824
6815
}
6825
6816
6826
6817
let Predicates = [HasMVEInt] in {
0 commit comments