@@ -132,6 +132,38 @@ void EvexToVexInstPass::AddTableEntry(EvexToVexTableType &EvexToVexTable,
132
132
EvexToVexTable[EvexOp] = VexOp;
133
133
}
134
134
135
+ static bool usesExtendedRegister (const MachineInstr &MI) {
136
+ auto isHiRegIdx = [](unsigned Reg) {
137
+ // Check for XMM register with indexes between 16 - 31.
138
+ if (Reg >= X86::XMM16 && Reg <= X86::XMM31)
139
+ return true ;
140
+
141
+ // Check for YMM register with indexes between 16 - 31.
142
+ if (Reg >= X86::YMM16 && Reg <= X86::YMM31)
143
+ return true ;
144
+
145
+ return false ;
146
+ };
147
+
148
+ // Check that operands are not ZMM regs or
149
+ // XMM/YMM regs with hi indexes between 16 - 31.
150
+ for (const MachineOperand &MO : MI.explicit_operands ()) {
151
+ if (!MO.isReg ())
152
+ continue ;
153
+
154
+ unsigned Reg = MO.getReg ();
155
+
156
+ assert (!(Reg >= X86::ZMM0 && Reg <= X86::ZMM31) &&
157
+ " ZMM instructions should not be in the EVEX->VEX tables" );
158
+
159
+ if (isHiRegIdx (Reg))
160
+ return true ;
161
+ }
162
+
163
+ return false ;
164
+ }
165
+
166
+
135
167
// For EVEX instructions that can be encoded using VEX encoding
136
168
// replace them by the VEX encoding in order to reduce size.
137
169
bool EvexToVexInstPass::CompressEvexToVexImpl (MachineInstr &MI) const {
@@ -188,31 +220,8 @@ bool EvexToVexInstPass::CompressEvexToVexImpl(MachineInstr &MI) const {
188
220
if (!NewOpc)
189
221
return false ;
190
222
191
- auto isHiRegIdx = [](unsigned Reg) {
192
- // Check for XMM register with indexes between 16 - 31.
193
- if (Reg >= X86::XMM16 && Reg <= X86::XMM31)
194
- return true ;
195
-
196
- // Check for YMM register with indexes between 16 - 31.
197
- if (Reg >= X86::YMM16 && Reg <= X86::YMM31)
198
- return true ;
199
-
223
+ if (usesExtendedRegister (MI))
200
224
return false ;
201
- };
202
-
203
- // Check that operands are not ZMM regs or
204
- // XMM/YMM regs with hi indexes between 16 - 31.
205
- for (const MachineOperand &MO : MI.explicit_operands ()) {
206
- if (!MO.isReg ())
207
- continue ;
208
-
209
- unsigned Reg = MO.getReg ();
210
-
211
- assert (!(Reg >= X86::ZMM0 && Reg <= X86::ZMM31));
212
-
213
- if (isHiRegIdx (Reg))
214
- return false ;
215
- }
216
225
217
226
const MCInstrDesc &MCID = TII->get (NewOpc);
218
227
MI.setDesc (MCID);
0 commit comments