@@ -29,7 +29,13 @@ using namespace MIPatternMatch;
29
29
Z80LegalizerInfo::Z80LegalizerInfo (const Z80Subtarget &STI,
30
30
const Z80TargetMachine &TM)
31
31
: Subtarget(STI), TM(TM) {
32
+ using namespace LegalityPredicates ;
33
+ using namespace LegalizeMutations ;
34
+
32
35
bool Is24Bit = Subtarget.is24Bit ();
36
+ LegalityPredicate pred24Bit = [=](const LegalityQuery &) { return Is24Bit; };
37
+
38
+ LegalityPredicate predZ180Ops = [this ](const LegalityQuery &) { return Subtarget.hasZ180Ops (); };
33
39
34
40
std::array<LLT, 5 > p;
35
41
for (int AddrSpace = 0 ; AddrSpace != p.size (); ++AddrSpace)
@@ -39,6 +45,7 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
39
45
LLT s16 = LLT::scalar (16 );
40
46
LLT s24 = LLT::scalar (24 );
41
47
LLT s32 = LLT::scalar (32 );
48
+ LLT s48 = LLT::scalar (48 );
42
49
LLT s64 = LLT::scalar (64 );
43
50
LLT sMax = Is24Bit ? s24 : s16;
44
51
LLT sOther = Is24Bit ? s16 : s24;
@@ -159,13 +166,15 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
159
166
.legalForCartesianProduct (LegalScalars, {s1})
160
167
.clampScalar (0 , s8, sMax );
161
168
162
- {
163
- auto &&Mul = getActionDefinitionsBuilder (G_MUL);
164
- if (Subtarget.hasZ180Ops ())
165
- Mul.legalFor ({s8});
166
- Mul.libcallFor (LegalLibcallScalars)
167
- .clampScalar (0 , s8, s32);
168
- }
169
+ getActionDefinitionsBuilder (G_MUL)
170
+ .legalIf (all (predZ180Ops, typeIs (0 , s8)))
171
+ .libcallFor (LegalLibcallScalars)
172
+ .minScalar (0 , s8)
173
+ .minScalar (0 , s16)
174
+ .minScalarIf (pred24Bit, 0 , s24)
175
+ .minScalar (0 , s32)
176
+ .minScalar (0 , s64)
177
+ .maxScalar (0 , s64);
169
178
170
179
getActionDefinitionsBuilder ({G_SDIV, G_UDIV, G_SREM, G_UREM})
171
180
.libcallFor (LegalLibcallScalars)
@@ -179,7 +188,12 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
179
188
getActionDefinitionsBuilder ({G_SHL, G_LSHR, G_ASHR})
180
189
.customForCartesianProduct (LegalLibcallScalars, {s8})
181
190
.clampScalar (1 , s8, s8)
182
- .clampScalar (0 , s8, s64);
191
+ .minScalar (0 , s8)
192
+ .minScalar (0 , s16)
193
+ .minScalarIf (pred24Bit, 0 , s24)
194
+ .minScalar (0 , s32)
195
+ .minScalar (0 , s64)
196
+ .maxScalar (0 , s64);
183
197
184
198
getActionDefinitionsBuilder ({G_FSHL, G_FSHR, G_ROTR, G_ROTL, G_UMULO,
185
199
G_UMULFIX, G_SMULFIX, G_SMULFIXSAT, G_UMULFIXSAT,
0 commit comments