@@ -45,6 +45,7 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
4545 bool UseX87 = !Subtarget.useSoftFloat () && Subtarget.hasX87 ();
4646 bool HasPOPCNT = Subtarget.hasPOPCNT ();
4747 bool HasLZCNT = Subtarget.hasLZCNT ();
48+ bool HasBMI = Subtarget.hasBMI ();
4849
4950 const LLT p0 = LLT::pointer (0 , TM.getPointerSizeInBits (0 ));
5051 const LLT s1 = LLT::scalar (1 );
@@ -264,12 +265,16 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
264265 .scalarSameSizeAs (0 , 1 );
265266
266267 // 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}})
271+ .widenScalarToNextPow2 (1 , /* Min=*/ 16 )
272+ .clampScalar (1 , s16, sMaxScalar )
273+ .scalarSameSizeAs (0 , 1 );
274+
275+ getActionDefinitionsBuilder (G_CTTZ)
276+ .legalFor (HasBMI, {{s16, s16}, {s32, s32}})
277+ .legalFor (HasBMI && Is64Bit, {{s64, s64}})
273278 .widenScalarToNextPow2 (1 , /* Min=*/ 16 )
274279 .clampScalar (1 , s16, sMaxScalar )
275280 .scalarSameSizeAs (0 , 1 );
@@ -379,12 +384,18 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
379384 }
380385
381386 // 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})
388399 .widenScalarToNextPow2 (0 , /* Min=*/ 8 )
389400 .clampScalar (0 , s8, sMaxScalar )
390401 .widenScalarToNextPow2 (1 , /* Min=*/ 8 )
0 commit comments