LegacyLegalizeActions::Legal);
LegacyInfo.setAction({G_MERGE_VALUES, 1, s128}, LegacyLegalizeActions::Legal);
LegacyInfo.setAction({G_UNMERGE_VALUES, s128}, LegacyLegalizeActions::Legal);
+
+ if (Subtarget.hasPOPCNT()) {
+ // popcount
+ getActionDefinitionsBuilder(G_CTPOP)
+ .legalFor({{s16, s16}, {s32, s32}, {s64, s64}})
+ .widenScalarToNextPow2(1, /*Min=*/16)
+ .clampScalar(1, s16, s64);
+ }
+
+ if (Subtarget.hasLZCNT()) {
+ // count leading zeros (LZCNT)
+ getActionDefinitionsBuilder(G_CTLZ)
+ .legalFor({{s16, s16}, {s32, s32}, {s64, s64}})
+ .widenScalarToNextPow2(1, /*Min=*/16)
+ .clampScalar(1, s16, s64);
+ }
+
}
void X86LegalizerInfo::setLegalizerInfoSSE1() {
if (!Subtarget.hasSSE42())
return;
- const LLT s16 = LLT::scalar(16);
- const LLT s32 = LLT::scalar(32);
- const LLT s64 = LLT::scalar(64);
-
- // popcount
- getActionDefinitionsBuilder(G_CTPOP)
- .legalFor({{s16, s16}, {s32, s32}, {s64, s64}})
- .widenScalarToNextPow2(1, /*Min=*/16)
- .clampScalar(1, s16, s64);
-
- // count leading zeros (LZCNT)
- getActionDefinitionsBuilder(G_CTLZ)
- .legalFor({{s16, s16}, {s32, s32}, {s64, s64}})
- .widenScalarToNextPow2(1, /*Min=*/16)
- .clampScalar(1, s16, s64);
}
void X86LegalizerInfo::setLegalizerInfoAVX() {