@@ -45,6 +45,7 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
45
45
bool UseX87 = !Subtarget.useSoftFloat () && Subtarget.hasX87 ();
46
46
bool HasPOPCNT = Subtarget.hasPOPCNT ();
47
47
bool HasLZCNT = Subtarget.hasLZCNT ();
48
+ bool HasBMI = Subtarget.hasBMI ();
48
49
49
50
const LLT p0 = LLT::pointer (0 , TM.getPointerSizeInBits (0 ));
50
51
const LLT s1 = LLT::scalar (1 );
@@ -264,15 +265,19 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
264
265
.scalarSameSizeAs (0 , 1 );
265
266
266
267
// count trailing zeros
267
- getActionDefinitionsBuilder ({G_CTTZ_ZERO_UNDEF, G_CTTZ})
268
- .legalIf ([=](const LegalityQuery &Query) -> bool {
269
- return (Query.Opcode == G_CTTZ_ZERO_UNDEF || Subtarget.hasBMI ()) &&
270
- (typePairInSet (0 , 1 , {{s16, s16}, {s32, s32}})(Query) ||
271
- (Is64Bit && typePairInSet (0 , 1 , {{s64, s64}})(Query)));
272
- })
268
+ getActionDefinitionsBuilder (G_CTTZ_ZERO_UNDEF)
269
+ .legalFor ({{s16, s16}, {s32, s32}})
270
+ .legalFor (Is64Bit, {{s64, s64}})
273
271
.widenScalarToNextPow2 (1 , /* Min=*/ 16 )
274
272
.clampScalar (1 , s16, sMaxScalar )
275
273
.scalarSameSizeAs (0 , 1 );
274
+
275
+ getActionDefinitionsBuilder (G_CTTZ)
276
+ .legalFor (HasBMI, {{s16, s16}, {s32, s32}})
277
+ .legalFor (HasBMI && Is64Bit, {{s64, s64}})
278
+ .widenScalarToNextPow2 (1 , /* Min=*/ 16 )
279
+ .clampScalar (1 , s16, sMaxScalar )
280
+ .scalarSameSizeAs (0 , 1 );
276
281
277
282
// control flow
278
283
getActionDefinitionsBuilder (G_PHI)
@@ -379,12 +384,18 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
379
384
}
380
385
381
386
// sext, zext, and anyext
382
- getActionDefinitionsBuilder ({G_SEXT, G_ZEXT, G_ANYEXT})
383
- .legalIf ([=](const LegalityQuery &Query) {
384
- return typeInSet (0 , {s8, s16, s32})(Query) ||
385
- (Query.Opcode == G_ANYEXT && Query.Types [0 ] == s128) ||
386
- (Is64Bit && Query.Types [0 ] == s64);
387
- })
387
+ getActionDefinitionsBuilder (G_ANYEXT)
388
+ .legalFor ({s8, s16, s32, s128})
389
+ .legalFor (Is64Bit, {s64})
390
+ .widenScalarToNextPow2 (0 , /* Min=*/ 8 )
391
+ .clampScalar (0 , s8, sMaxScalar )
392
+ .widenScalarToNextPow2 (1 , /* Min=*/ 8 )
393
+ .clampScalar (1 , s8, sMaxScalar )
394
+ .scalarize (0 );
395
+
396
+ getActionDefinitionsBuilder ({G_SEXT, G_ZEXT})
397
+ .legalFor ({s8, s16, s32})
398
+ .legalFor (Is64Bit, {s64})
388
399
.widenScalarToNextPow2 (0 , /* Min=*/ 8 )
389
400
.clampScalar (0 , s8, sMaxScalar )
390
401
.widenScalarToNextPow2 (1 , /* Min=*/ 8 )
0 commit comments