35 bool Is64Bit = Subtarget.is64Bit();
36 bool HasCMOV = Subtarget.canUseCMOV();
37 bool HasSSE1 = Subtarget.hasSSE1();
38 bool HasSSE2 = Subtarget.hasSSE2();
39 bool HasSSE41 = Subtarget.hasSSE41();
40 bool HasAVX = Subtarget.hasAVX();
41 bool HasAVX2 = Subtarget.hasAVX2();
42 bool HasAVX512 = Subtarget.hasAVX512();
43 bool HasVLX = Subtarget.hasVLX();
44 bool HasDQI = Subtarget.hasAVX512() && Subtarget.hasDQI();
45 bool HasBWI = Subtarget.hasAVX512() && Subtarget.hasBWI();
46 bool UseX87 = !Subtarget.useSoftFloat() && Subtarget.hasX87();
47 bool HasPOPCNT = Subtarget.hasPOPCNT();
48 bool HasLZCNT = Subtarget.hasLZCNT();
49 bool HasBMI = Subtarget.hasBMI();
59 const LLT sMaxScalar = Subtarget.is64Bit() ? s64 : s32;
80 const LLT s8MaxVector = HasAVX512 ? v64s8 : HasAVX ? v32s8 : v16s8;
81 const LLT s16MaxVector = HasAVX512 ? v32s16 : HasAVX ? v16s16 : v8s16;
82 const LLT s32MaxVector = HasAVX512 ? v16s32 : HasAVX ? v8s32 : v4s32;
83 const LLT s64MaxVector = HasAVX512 ? v8s64 : HasAVX ? v4s64 : v2s64;
92 .legalFor({p0, s1, s8, s16, s32, s64})
93 .legalFor(Is64Bit, {s128});
97 .legalFor(Is64Bit, {s64})
98 .widenScalarToNextPow2(0, 8)
102 G_FSIN, G_FSINH, G_FASIN, G_FTAN, G_FTANH,
103 G_FATAN, G_FATAN2, G_FPOW, G_FEXP, G_FEXP2,
104 G_FEXP10, G_FLOG, G_FLOG2, G_FLOG10, G_FPOWI,
105 G_FSINCOS, G_FCEIL, G_FFLOOR})
110 .legalFor(HasSSE2 || UseX87, {s64})
111 .legalFor(UseX87, {s80});
116 for (
unsigned Op : {G_MERGE_VALUES, G_UNMERGE_VALUES}) {
117 unsigned BigTyIdx =
Op == G_MERGE_VALUES ? 0 : 1;
118 unsigned LitTyIdx =
Op == G_MERGE_VALUES ? 1 : 0;
125 switch (Q.
Types[BigTyIdx].getSizeInBits()) {
136 switch (Q.
Types[LitTyIdx].getSizeInBits()) {
152 .legalFor({s8, s16, s32})
153 .legalFor(Is64Bit, {s64})
154 .legalFor(HasSSE2, {v16s8, v8s16, v4s32, v2s64})
155 .legalFor(HasAVX2, {v32s8, v16s16, v8s32, v4s64})
156 .legalFor(HasAVX512, {v16s32, v8s64})
157 .legalFor(HasBWI, {v64s8, v32s16})
158 .clampMinNumElements(0, s8, 16)
171 .legalFor({{s8, s1}, {s16, s1}, {s32, s1}})
172 .legalFor(Is64Bit, {{s64, s1}})
173 .widenScalarToNextPow2(0, 32)
181 .legalFor(Is64Bit, {s64})
182 .legalFor(HasSSE2, {v8s16})
183 .legalFor(HasSSE41, {v4s32})
184 .legalFor(HasAVX2, {v16s16, v8s32})
185 .legalFor(HasAVX512, {v16s32})
186 .legalFor(HasDQI, {v8s64})
187 .legalFor(HasDQI && HasVLX, {v2s64, v4s64})
188 .legalFor(HasBWI, {v32s16})
189 .clampMinNumElements(0, s16, 8)
200 .legalFor({s8, s16, s32})
201 .legalFor(Is64Bit, {s64})
202 .widenScalarToNextPow2(0, 32)
208 .legalFor({s8, s16, s32})
209 .legalFor(Is64Bit, {s64})
211 .clampScalar(0, s8, sMaxScalar);
215 .legalFor({{s8, s8}, {s16, s8}, {s32, s8}})
216 .legalFor(Is64Bit, {{s64, s8}})
217 .clampScalar(0, s8, sMaxScalar)
222 .legalFor({s8, s16, s32})
223 .legalFor(Is64Bit, {s64})
224 .legalFor(HasSSE2, {v16s8, v8s16, v4s32, v2s64})
225 .legalFor(HasAVX, {v32s8, v16s16, v8s32, v4s64})
226 .legalFor(HasAVX512, {v64s8, v32s16, v16s32, v8s64})
227 .clampMinNumElements(0, s8, 16)
240 const std::initializer_list<LLT> IntTypes32 = {s8, s16, s32, p0};
241 const std::initializer_list<LLT> IntTypes64 = {s8, s16, s32, s64, p0};
245 .clampScalar(0, s8, s8)
251 .legalFor(Is64Bit, {s64})
252 .widenScalarToNextPow2(0, 32)
257 .
legalFor(HasPOPCNT, {{s16, s16}, {s32, s32}})
258 .legalFor(HasPOPCNT && Is64Bit, {{s64, s64}})
259 .widenScalarToNextPow2(1, 16)
265 .
legalFor(HasLZCNT, {{s16, s16}, {s32, s32}})
266 .legalFor(HasLZCNT && Is64Bit, {{s64, s64}})
267 .widenScalarToNextPow2(1, 16)
274 .legalFor(Is64Bit, {{s64, s64}})
275 .widenScalarToNextPow2(1, 16)
280 .
legalFor(HasBMI, {{s16, s16}, {s32, s32}})
281 .legalFor(HasBMI && Is64Bit, {{s64, s64}})
282 .widenScalarToNextPow2(1, 16)
289 .legalFor(UseX87, {s80})
290 .legalFor(Is64Bit, {s64})
291 .legalFor(HasSSE1, {v16s8, v8s16, v4s32, v2s64})
292 .legalFor(HasAVX, {v32s8, v16s16, v8s32, v4s64})
293 .legalFor(HasAVX512, {v64s8, v32s16, v16s32, v8s64})
294 .clampMinNumElements(0, s8, 16)
309 const std::initializer_list<LLT> PtrTypes32 = {s1, s8, s16, s32};
310 const std::initializer_list<LLT> PtrTypes64 = {s1, s8, s16, s32, s64};
314 .maxScalar(0, sMaxScalar)
323 .legalFor(Is64Bit, {{p0, s64}})
324 .widenScalarToNextPow2(1, 32)
330 for (
unsigned Op : {G_LOAD, G_STORE}) {
332 Action.legalForTypesWithMemDesc({{s8, p0, s8, 1},
337 {v4s8, p0, v4s8, 1}});
339 Action.legalForTypesWithMemDesc(
340 {{s64, p0, s64, 1}, {v2s32, p0, v2s32, 1}});
343 Action.legalForTypesWithMemDesc({{v4s32, p0, v4s32, 1}});
345 Action.legalForTypesWithMemDesc({{v16s8, p0, v16s8, 1},
346 {v8s16, p0, v8s16, 1},
347 {v2s64, p0, v2s64, 1},
348 {v2p0, p0, v2p0, 1}});
350 Action.legalForTypesWithMemDesc({{v32s8, p0, v32s8, 1},
351 {v16s16, p0, v16s16, 1},
352 {v8s32, p0, v8s32, 1},
353 {v4s64, p0, v4s64, 1},
354 {v4p0, p0, v4p0, 1}});
356 Action.legalForTypesWithMemDesc({{v64s8, p0, v64s8, 1},
357 {v32s16, p0, v32s16, 1},
358 {v16s32, p0, v16s32, 1},
359 {v8s64, p0, v8s64, 1}});
363 Action.legalForTypesWithMemDesc({{s8, p0, s1, 1},
368 Action.legalForTypesWithMemDesc(
369 {{s64, p0, s8, 1}, {s64, p0, s16, 1}, {s64, p0, s32, 1}});
375 Action.widenScalarToNextPow2(0, 8)
376 .clampScalar(0, s8, sMaxScalar)
380 for (
unsigned Op : {G_SEXTLOAD, G_ZEXTLOAD}) {
382 Action.legalForTypesWithMemDesc(
383 {{s16, p0, s8, 1}, {s32, p0, s8, 1}, {s32, p0, s16, 1}});
385 Action.legalForTypesWithMemDesc(
386 {{s64, p0, s8, 1}, {s64, p0, s16, 1}, {s64, p0, s32, 1}});
393 .legalFor(Is64Bit, {s64})
394 .widenScalarToNextPow2(0, 8)
401 .legalFor({s8, s16, s32})
402 .legalFor(Is64Bit, {s64})
403 .widenScalarToNextPow2(0, 8)
414 .legalFor(UseX87, {s80});
418 .legalFor({s32, s64})
419 .legalFor(HasSSE1, {v4s32})
420 .legalFor(HasSSE2, {v2s64})
421 .legalFor(HasAVX, {v8s32, v4s64})
422 .legalFor(HasAVX512, {v16s32, v8s64})
423 .legalFor(UseX87, {s80});
427 .legalFor(UseX87 && !Is64Bit, {s64})
432 .
legalFor(HasSSE1 || UseX87, {s8, s32})
433 .legalFor(HasSSE2 || UseX87, {s8, s64})
434 .legalFor(UseX87, {s8, s80})
435 .clampScalar(0, s8, s8)
442 .legalFor(HasAVX, {{v4s64, v4s32}})
443 .legalFor(HasAVX512, {{v8s64, v8s32}});
447 .legalFor(HasAVX, {{v4s32, v4s64}})
448 .legalFor(HasAVX512, {{v8s32, v8s64}});
452 .legalFor(HasSSE1 && Is64Bit, {{s32, s64}})
453 .legalFor(HasSSE2, {{s64, s32}})
454 .legalFor(HasSSE2 && Is64Bit, {{s64, s64}})
455 .clampScalar(1, (UseX87 && !HasSSE1) ? s16 : s32, sMaxScalar)
458 .clampScalar(0, s32, HasSSE2 ? s64 : s32)
463 .legalFor(HasSSE1 && Is64Bit, {{s64, s32}})
464 .legalFor(HasSSE2, {{s32, s64}})
465 .legalFor(HasSSE2 && Is64Bit, {{s64, s64}})
466 .clampScalar(0, (UseX87 && !HasSSE1) ? s16 : s32, sMaxScalar)
469 .clampScalar(1, s32, HasSSE2 ? s64 : s32)
480 .
legalFor(HasAVX512, {{s32, s32}, {s32, s64}, {s64, s32}, {s64, s64}})
483 ((HasSSE1 &&
typeIs(0, s32)(Query)) ||
484 (HasSSE2 &&
typeIs(0, s64)(Query))) &&
490 ((HasSSE1 &&
typeIs(0, s32)(Query)) ||
491 (HasSSE2 &&
typeIs(0, s64)(Query))) &&
492 (Is64Bit &&
typeIs(1, s64)(Query));
494 .clampScalar(0, s32, HasSSE2 ? s64 : s32)
500 .
legalFor(HasAVX512, {{s32, s32}, {s32, s64}, {s64, s32}, {s64, s64}})
503 ((HasSSE1 &&
typeIs(1, s32)(Query)) ||
504 (HasSSE2 &&
typeIs(1, s64)(Query))) &&
513 ((HasSSE1 &&
typeIs(1, s32)(Query)) ||
514 (HasSSE2 &&
typeIs(1, s64)(Query))) &&
515 (Is64Bit &&
typeIs(0, s64)(Query));
517 .clampScalar(0, s32, sMaxScalar)
525 return (HasSSE1 &&
typeInSet(0, {v4s32})(Query)) ||
526 (HasSSE2 &&
typeInSet(0, {v2s64, v8s16, v16s8})(Query)) ||
527 (HasAVX &&
typeInSet(0, {v4s64, v8s32, v16s16, v32s8})(Query)) ||
528 (HasAVX512 &&
typeInSet(0, {v8s64, v16s32, v32s16, v64s8}));
530 .clampNumElements(0, v16s8, s8MaxVector)
538 unsigned SubIdx = Query.
Opcode == G_EXTRACT ? 0 : 1;
539 unsigned FullIdx = Query.
Opcode == G_EXTRACT ? 1 : 0;
544 {v2s64, v4s64}})(Query)) ||
553 {v4s64, v8s64}})(Query));
560 {{v32s8, v16s8}, {v16s16, v8s16}, {v8s32, v4s32}, {v4s64, v2s64}})
561 .legalFor(HasAVX, {{v64s8, v16s8},
572 .
legalFor({{s8, s32}, {s16, s32}, {s32, s32}, {s64, s32}, {p0, s32}})
573 .widenScalarToNextPow2(0, 8)
590 .legalFor({s8, s16, s32, s64, p0})
591 .widenScalarToNextPow2(0, 8)