annotate lib/Target/X86/X86LegalizerInfo.cpp @ 137:dc788094b8e4

force SROA and TailRecursionElimination on non optimize mode for code segment
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 06 Mar 2018 08:58:23 +0900
parents 3a76565eade5
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
1 //===- X86LegalizerInfo.cpp --------------------------------------*- C++ -*-==//
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
2 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
4 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
7 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
9 /// \file
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
10 /// This file implements the targeting of the Machinelegalizer class for X86.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
11 /// \todo This should be generated by TableGen.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
13
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
14 #include "X86LegalizerInfo.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
15 #include "X86Subtarget.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
16 #include "X86TargetMachine.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
17 #include "llvm/CodeGen/TargetOpcodes.h"
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
18 #include "llvm/CodeGen/ValueTypes.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
19 #include "llvm/IR/DerivedTypes.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
20 #include "llvm/IR/Type.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
21
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
22 using namespace llvm;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
23 using namespace TargetOpcode;
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
24 using namespace LegalizeActions;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
25
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
26 /// FIXME: The following static functions are SizeChangeStrategy functions
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
27 /// that are meant to temporarily mimic the behaviour of the old legalization
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
28 /// based on doubling/halving non-legal types as closely as possible. This is
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
29 /// not entirly possible as only legalizing the types that are exactly a power
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
30 /// of 2 times the size of the legal types would require specifying all those
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
31 /// sizes explicitly.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
32 /// In practice, not specifying those isn't a problem, and the below functions
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
33 /// should disappear quickly as we add support for legalizing non-power-of-2
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
34 /// sized types further.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
35 static void
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
36 addAndInterleaveWithUnsupported(LegalizerInfo::SizeAndActionsVec &result,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
37 const LegalizerInfo::SizeAndActionsVec &v) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
38 for (unsigned i = 0; i < v.size(); ++i) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
39 result.push_back(v[i]);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
40 if (i + 1 < v[i].first && i + 1 < v.size() &&
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
41 v[i + 1].first != v[i].first + 1)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
42 result.push_back({v[i].first + 1, Unsupported});
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
43 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
44 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
45
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
46 static LegalizerInfo::SizeAndActionsVec
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
47 widen_1(const LegalizerInfo::SizeAndActionsVec &v) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
48 assert(v.size() >= 1);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
49 assert(v[0].first > 1);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
50 LegalizerInfo::SizeAndActionsVec result = {{1, WidenScalar},
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
51 {2, Unsupported}};
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
52 addAndInterleaveWithUnsupported(result, v);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
53 auto Largest = result.back().first;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
54 result.push_back({Largest + 1, Unsupported});
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
55 return result;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
56 }
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
57
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
58 X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
59 const X86TargetMachine &TM)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
60 : Subtarget(STI), TM(TM) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
61
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
62 setLegalizerInfo32bit();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
63 setLegalizerInfo64bit();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
64 setLegalizerInfoSSE1();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
65 setLegalizerInfoSSE2();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
66 setLegalizerInfoSSE41();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
67 setLegalizerInfoAVX();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
68 setLegalizerInfoAVX2();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
69 setLegalizerInfoAVX512();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
70 setLegalizerInfoAVX512DQ();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
71 setLegalizerInfoAVX512BW();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
72
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
73 setLegalizeScalarToDifferentSizeStrategy(G_PHI, 0, widen_1);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
74 for (unsigned BinOp : {G_SUB, G_MUL, G_AND, G_OR, G_XOR})
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
75 setLegalizeScalarToDifferentSizeStrategy(BinOp, 0, widen_1);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
76 for (unsigned MemOp : {G_LOAD, G_STORE})
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
77 setLegalizeScalarToDifferentSizeStrategy(MemOp, 0,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
78 narrowToSmallerAndWidenToSmallest);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
79 setLegalizeScalarToDifferentSizeStrategy(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
80 G_GEP, 1, widenToLargerTypesUnsupportedOtherwise);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
81 setLegalizeScalarToDifferentSizeStrategy(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
82 G_CONSTANT, 0, widenToLargerTypesAndNarrowToLargest);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
83
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
84 computeTables();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
85 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
86
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
87 void X86LegalizerInfo::setLegalizerInfo32bit() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
88
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
89 const LLT p0 = LLT::pointer(0, TM.getPointerSize() * 8);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
90 const LLT s1 = LLT::scalar(1);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
91 const LLT s8 = LLT::scalar(8);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
92 const LLT s16 = LLT::scalar(16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
93 const LLT s32 = LLT::scalar(32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
94 const LLT s64 = LLT::scalar(64);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
95 const LLT s128 = LLT::scalar(128);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
96
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
97 for (auto Ty : {p0, s1, s8, s16, s32})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
98 setAction({G_IMPLICIT_DEF, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
99
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
100 for (auto Ty : {s8, s16, s32, p0})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
101 setAction({G_PHI, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
102
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
103 for (unsigned BinOp : {G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR})
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
104 for (auto Ty : {s8, s16, s32})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
105 setAction({BinOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
106
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
107 for (unsigned Op : {G_UADDE}) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
108 setAction({Op, s32}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
109 setAction({Op, 1, s1}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
110 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
111
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
112 for (unsigned MemOp : {G_LOAD, G_STORE}) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
113 for (auto Ty : {s8, s16, s32, p0})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
114 setAction({MemOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
115
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
116 // And everything's fine in addrspace 0.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
117 setAction({MemOp, 1, p0}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
118 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
119
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
120 // Pointer-handling
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
121 setAction({G_FRAME_INDEX, p0}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
122 setAction({G_GLOBAL_VALUE, p0}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
123
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
124 setAction({G_GEP, p0}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
125 setAction({G_GEP, 1, s32}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
126
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
127 // Control-flow
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
128 setAction({G_BRCOND, s1}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
129
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
130 // Constants
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
131 for (auto Ty : {s8, s16, s32, p0})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
132 setAction({TargetOpcode::G_CONSTANT, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
133
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
134 // Extensions
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
135 for (auto Ty : {s8, s16, s32}) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
136 setAction({G_ZEXT, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
137 setAction({G_SEXT, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
138 setAction({G_ANYEXT, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
139 }
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
140 setAction({G_ANYEXT, s128}, Legal);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
141
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
142 // Comparison
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
143 setAction({G_ICMP, s1}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
144
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
145 for (auto Ty : {s8, s16, s32, p0})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
146 setAction({G_ICMP, 1, Ty}, Legal);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
147
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
148 // Merge/Unmerge
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
149 for (const auto &Ty : {s16, s32, s64}) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
150 setAction({G_MERGE_VALUES, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
151 setAction({G_UNMERGE_VALUES, 1, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
152 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
153 for (const auto &Ty : {s8, s16, s32}) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
154 setAction({G_MERGE_VALUES, 1, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
155 setAction({G_UNMERGE_VALUES, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
156 }
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
157 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
158
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
159 void X86LegalizerInfo::setLegalizerInfo64bit() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
160
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
161 if (!Subtarget.is64Bit())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
162 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
163
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
164 const LLT s64 = LLT::scalar(64);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
165 const LLT s128 = LLT::scalar(128);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
166
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
167 setAction({G_IMPLICIT_DEF, s64}, Legal);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
168 // Need to have that, as tryFoldImplicitDef will create this pattern:
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
169 // s128 = EXTEND (G_IMPLICIT_DEF s32/s64) -> s128 = G_IMPLICIT_DEF
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
170 setAction({G_IMPLICIT_DEF, s128}, Legal);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
171
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
172 setAction({G_PHI, s64}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
173
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
174 for (unsigned BinOp : {G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
175 setAction({BinOp, s64}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
176
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
177 for (unsigned MemOp : {G_LOAD, G_STORE})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
178 setAction({MemOp, s64}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
179
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
180 // Pointer-handling
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
181 setAction({G_GEP, 1, s64}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
182
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
183 // Constants
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
184 setAction({TargetOpcode::G_CONSTANT, s64}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
185
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
186 // Extensions
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
187 for (unsigned extOp : {G_ZEXT, G_SEXT, G_ANYEXT}) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
188 setAction({extOp, s64}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
189 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
190
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
191 // Comparison
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
192 setAction({G_ICMP, 1, s64}, Legal);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
193
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
194 // Merge/Unmerge
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
195 setAction({G_MERGE_VALUES, s128}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
196 setAction({G_UNMERGE_VALUES, 1, s128}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
197 setAction({G_MERGE_VALUES, 1, s128}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
198 setAction({G_UNMERGE_VALUES, s128}, Legal);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
199 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
200
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
201 void X86LegalizerInfo::setLegalizerInfoSSE1() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
202 if (!Subtarget.hasSSE1())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
203 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
204
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
205 const LLT s32 = LLT::scalar(32);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
206 const LLT s64 = LLT::scalar(64);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
207 const LLT v4s32 = LLT::vector(4, 32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
208 const LLT v2s64 = LLT::vector(2, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
209
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
210 for (unsigned BinOp : {G_FADD, G_FSUB, G_FMUL, G_FDIV})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
211 for (auto Ty : {s32, v4s32})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
212 setAction({BinOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
213
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
214 for (unsigned MemOp : {G_LOAD, G_STORE})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
215 for (auto Ty : {v4s32, v2s64})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
216 setAction({MemOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
217
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
218 // Constants
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
219 setAction({TargetOpcode::G_FCONSTANT, s32}, Legal);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
220
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
221 // Merge/Unmerge
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
222 for (const auto &Ty : {v4s32, v2s64}) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
223 setAction({G_MERGE_VALUES, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
224 setAction({G_UNMERGE_VALUES, 1, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
225 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
226 setAction({G_MERGE_VALUES, 1, s64}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
227 setAction({G_UNMERGE_VALUES, s64}, Legal);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
228 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
229
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
230 void X86LegalizerInfo::setLegalizerInfoSSE2() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
231 if (!Subtarget.hasSSE2())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
232 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
233
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
234 const LLT s32 = LLT::scalar(32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
235 const LLT s64 = LLT::scalar(64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
236 const LLT v16s8 = LLT::vector(16, 8);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
237 const LLT v8s16 = LLT::vector(8, 16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
238 const LLT v4s32 = LLT::vector(4, 32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
239 const LLT v2s64 = LLT::vector(2, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
240
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
241 const LLT v32s8 = LLT::vector(32, 8);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
242 const LLT v16s16 = LLT::vector(16, 16);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
243 const LLT v8s32 = LLT::vector(8, 32);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
244 const LLT v4s64 = LLT::vector(4, 64);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
245
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
246 for (unsigned BinOp : {G_FADD, G_FSUB, G_FMUL, G_FDIV})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
247 for (auto Ty : {s64, v2s64})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
248 setAction({BinOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
249
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
250 for (unsigned BinOp : {G_ADD, G_SUB})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
251 for (auto Ty : {v16s8, v8s16, v4s32, v2s64})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
252 setAction({BinOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
253
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
254 setAction({G_MUL, v8s16}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
255
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
256 setAction({G_FPEXT, s64}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
257 setAction({G_FPEXT, 1, s32}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
258
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
259 // Constants
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
260 setAction({TargetOpcode::G_FCONSTANT, s64}, Legal);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
261
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
262 // Merge/Unmerge
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
263 for (const auto &Ty :
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
264 {v16s8, v32s8, v8s16, v16s16, v4s32, v8s32, v2s64, v4s64}) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
265 setAction({G_MERGE_VALUES, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
266 setAction({G_UNMERGE_VALUES, 1, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
267 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
268 for (const auto &Ty : {v16s8, v8s16, v4s32, v2s64}) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
269 setAction({G_MERGE_VALUES, 1, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
270 setAction({G_UNMERGE_VALUES, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
271 }
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
272 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
273
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
274 void X86LegalizerInfo::setLegalizerInfoSSE41() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
275 if (!Subtarget.hasSSE41())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
276 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
277
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
278 const LLT v4s32 = LLT::vector(4, 32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
279
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
280 setAction({G_MUL, v4s32}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
281 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
282
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
283 void X86LegalizerInfo::setLegalizerInfoAVX() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
284 if (!Subtarget.hasAVX())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
285 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
286
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
287 const LLT v16s8 = LLT::vector(16, 8);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
288 const LLT v8s16 = LLT::vector(8, 16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
289 const LLT v4s32 = LLT::vector(4, 32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
290 const LLT v2s64 = LLT::vector(2, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
291
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
292 const LLT v32s8 = LLT::vector(32, 8);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
293 const LLT v64s8 = LLT::vector(64, 8);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
294 const LLT v16s16 = LLT::vector(16, 16);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
295 const LLT v32s16 = LLT::vector(32, 16);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
296 const LLT v8s32 = LLT::vector(8, 32);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
297 const LLT v16s32 = LLT::vector(16, 32);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
298 const LLT v4s64 = LLT::vector(4, 64);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
299 const LLT v8s64 = LLT::vector(8, 64);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
300
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
301 for (unsigned MemOp : {G_LOAD, G_STORE})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
302 for (auto Ty : {v8s32, v4s64})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
303 setAction({MemOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
304
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
305 for (auto Ty : {v32s8, v16s16, v8s32, v4s64}) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
306 setAction({G_INSERT, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
307 setAction({G_EXTRACT, 1, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
308 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
309 for (auto Ty : {v16s8, v8s16, v4s32, v2s64}) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
310 setAction({G_INSERT, 1, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
311 setAction({G_EXTRACT, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
312 }
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
313 // Merge/Unmerge
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
314 for (const auto &Ty :
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
315 {v32s8, v64s8, v16s16, v32s16, v8s32, v16s32, v4s64, v8s64}) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
316 setAction({G_MERGE_VALUES, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
317 setAction({G_UNMERGE_VALUES, 1, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
318 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
319 for (const auto &Ty :
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
320 {v16s8, v32s8, v8s16, v16s16, v4s32, v8s32, v2s64, v4s64}) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
321 setAction({G_MERGE_VALUES, 1, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
322 setAction({G_UNMERGE_VALUES, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
323 }
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
324 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
325
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
326 void X86LegalizerInfo::setLegalizerInfoAVX2() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
327 if (!Subtarget.hasAVX2())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
328 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
329
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
330 const LLT v32s8 = LLT::vector(32, 8);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
331 const LLT v16s16 = LLT::vector(16, 16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
332 const LLT v8s32 = LLT::vector(8, 32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
333 const LLT v4s64 = LLT::vector(4, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
334
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
335 const LLT v64s8 = LLT::vector(64, 8);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
336 const LLT v32s16 = LLT::vector(32, 16);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
337 const LLT v16s32 = LLT::vector(16, 32);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
338 const LLT v8s64 = LLT::vector(8, 64);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
339
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
340 for (unsigned BinOp : {G_ADD, G_SUB})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
341 for (auto Ty : {v32s8, v16s16, v8s32, v4s64})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
342 setAction({BinOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
343
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
344 for (auto Ty : {v16s16, v8s32})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
345 setAction({G_MUL, Ty}, Legal);
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
346
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
347 // Merge/Unmerge
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
348 for (const auto &Ty : {v64s8, v32s16, v16s32, v8s64}) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
349 setAction({G_MERGE_VALUES, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
350 setAction({G_UNMERGE_VALUES, 1, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
351 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
352 for (const auto &Ty : {v32s8, v16s16, v8s32, v4s64}) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
353 setAction({G_MERGE_VALUES, 1, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
354 setAction({G_UNMERGE_VALUES, Ty}, Legal);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
355 }
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
356 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
357
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
358 void X86LegalizerInfo::setLegalizerInfoAVX512() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
359 if (!Subtarget.hasAVX512())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
360 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
361
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
362 const LLT v16s8 = LLT::vector(16, 8);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
363 const LLT v8s16 = LLT::vector(8, 16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
364 const LLT v4s32 = LLT::vector(4, 32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
365 const LLT v2s64 = LLT::vector(2, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
366
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
367 const LLT v32s8 = LLT::vector(32, 8);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
368 const LLT v16s16 = LLT::vector(16, 16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
369 const LLT v8s32 = LLT::vector(8, 32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
370 const LLT v4s64 = LLT::vector(4, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
371
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
372 const LLT v64s8 = LLT::vector(64, 8);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
373 const LLT v32s16 = LLT::vector(32, 16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
374 const LLT v16s32 = LLT::vector(16, 32);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
375 const LLT v8s64 = LLT::vector(8, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
376
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
377 for (unsigned BinOp : {G_ADD, G_SUB})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
378 for (auto Ty : {v16s32, v8s64})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
379 setAction({BinOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
380
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
381 setAction({G_MUL, v16s32}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
382
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
383 for (unsigned MemOp : {G_LOAD, G_STORE})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
384 for (auto Ty : {v16s32, v8s64})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
385 setAction({MemOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
386
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
387 for (auto Ty : {v64s8, v32s16, v16s32, v8s64}) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
388 setAction({G_INSERT, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
389 setAction({G_EXTRACT, 1, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
390 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
391 for (auto Ty : {v32s8, v16s16, v8s32, v4s64, v16s8, v8s16, v4s32, v2s64}) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
392 setAction({G_INSERT, 1, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
393 setAction({G_EXTRACT, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
394 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
395
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
396 /************ VLX *******************/
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
397 if (!Subtarget.hasVLX())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
398 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
399
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
400 for (auto Ty : {v4s32, v8s32})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
401 setAction({G_MUL, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
402 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
403
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
404 void X86LegalizerInfo::setLegalizerInfoAVX512DQ() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
405 if (!(Subtarget.hasAVX512() && Subtarget.hasDQI()))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
406 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
407
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
408 const LLT v8s64 = LLT::vector(8, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
409
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
410 setAction({G_MUL, v8s64}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
411
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
412 /************ VLX *******************/
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
413 if (!Subtarget.hasVLX())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
414 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
415
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
416 const LLT v2s64 = LLT::vector(2, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
417 const LLT v4s64 = LLT::vector(4, 64);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
418
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
419 for (auto Ty : {v2s64, v4s64})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
420 setAction({G_MUL, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
421 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
422
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
423 void X86LegalizerInfo::setLegalizerInfoAVX512BW() {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
424 if (!(Subtarget.hasAVX512() && Subtarget.hasBWI()))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
425 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
426
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
427 const LLT v64s8 = LLT::vector(64, 8);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
428 const LLT v32s16 = LLT::vector(32, 16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
429
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
430 for (unsigned BinOp : {G_ADD, G_SUB})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
431 for (auto Ty : {v64s8, v32s16})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
432 setAction({BinOp, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
433
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
434 setAction({G_MUL, v32s16}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
435
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
436 /************ VLX *******************/
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
437 if (!Subtarget.hasVLX())
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
438 return;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
439
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
440 const LLT v8s16 = LLT::vector(8, 16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
441 const LLT v16s16 = LLT::vector(16, 16);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
442
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
443 for (auto Ty : {v8s16, v16s16})
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
444 setAction({G_MUL, Ty}, Legal);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
445 }