Skip to content

Commit ec93f40

Browse files
committed
Implement 48-bit libcalls
1 parent 87dbcb9 commit ec93f40

File tree

4 files changed

+189
-141
lines changed

4 files changed

+189
-141
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.def

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,39 +36,46 @@ HANDLE_LIBCALL(SEXT_I24_I32, nullptr)
3636
HANDLE_LIBCALL(NOT_I16, nullptr)
3737
HANDLE_LIBCALL(NOT_I24, nullptr)
3838
HANDLE_LIBCALL(NOT_I32, nullptr)
39+
HANDLE_LIBCALL(NOT_I48, nullptr)
3940
HANDLE_LIBCALL(NOT_I64, nullptr)
4041
HANDLE_LIBCALL(AND_I8, nullptr)
4142
HANDLE_LIBCALL(AND_I16, nullptr)
4243
HANDLE_LIBCALL(AND_I24, nullptr)
4344
HANDLE_LIBCALL(AND_I32, nullptr)
45+
HANDLE_LIBCALL(AND_I48, nullptr)
4446
HANDLE_LIBCALL(AND_I64, nullptr)
4547
HANDLE_LIBCALL(AND_I128, nullptr)
4648
HANDLE_LIBCALL(OR_I8, nullptr)
4749
HANDLE_LIBCALL(OR_I16, nullptr)
4850
HANDLE_LIBCALL(OR_I24, nullptr)
4951
HANDLE_LIBCALL(OR_I32, nullptr)
52+
HANDLE_LIBCALL(OR_I48, nullptr)
5053
HANDLE_LIBCALL(OR_I64, nullptr)
5154
HANDLE_LIBCALL(OR_I128, nullptr)
5255
HANDLE_LIBCALL(XOR_I8, nullptr)
5356
HANDLE_LIBCALL(XOR_I16, nullptr)
5457
HANDLE_LIBCALL(XOR_I24, nullptr)
5558
HANDLE_LIBCALL(XOR_I32, nullptr)
59+
HANDLE_LIBCALL(XOR_I48, nullptr)
5660
HANDLE_LIBCALL(XOR_I64, nullptr)
5761
HANDLE_LIBCALL(XOR_I128, nullptr)
5862
HANDLE_LIBCALL(SHL_I8, nullptr)
5963
HANDLE_LIBCALL(SHL_I16, "__ashlhi3")
6064
HANDLE_LIBCALL(SHL_I24, nullptr)
6165
HANDLE_LIBCALL(SHL_I32, "__ashlsi3")
66+
HANDLE_LIBCALL(SHL_I48, nullptr)
6267
HANDLE_LIBCALL(SHL_I64, "__ashldi3")
6368
HANDLE_LIBCALL(SHL_I128, "__ashlti3")
6469
HANDLE_LIBCALL(SHL_I16_I8, nullptr)
6570
HANDLE_LIBCALL(SHL_I24_I8, nullptr)
71+
HANDLE_LIBCALL(SHL_I48_I8, nullptr)
6672
HANDLE_LIBCALL(SRL_I8, nullptr)
6773
HANDLE_LIBCALL(SRL_I16, "__lshrhi3")
6874
HANDLE_LIBCALL(SRL_I16_I8, nullptr)
6975
HANDLE_LIBCALL(SRL_I24, nullptr)
7076
HANDLE_LIBCALL(SRL_I24_I8, nullptr)
7177
HANDLE_LIBCALL(SRL_I32, "__lshrsi3")
78+
HANDLE_LIBCALL(SRL_I48, nullptr)
7279
HANDLE_LIBCALL(SRL_I64, "__lshrdi3")
7380
HANDLE_LIBCALL(SRL_I128, "__lshrti3")
7481
HANDLE_LIBCALL(SRA_I8, nullptr)
@@ -77,17 +84,21 @@ HANDLE_LIBCALL(SRA_I16_I8, nullptr)
7784
HANDLE_LIBCALL(SRA_I24, nullptr)
7885
HANDLE_LIBCALL(SRA_I24_I8, nullptr)
7986
HANDLE_LIBCALL(SRA_I32, "__ashrsi3")
87+
HANDLE_LIBCALL(SRA_I48, nullptr)
8088
HANDLE_LIBCALL(SRA_I64, "__ashrdi3")
8189
HANDLE_LIBCALL(SRA_I128, "__ashrti3")
8290
HANDLE_LIBCALL(CMP_I32, nullptr)
91+
HANDLE_LIBCALL(CMP_I48, nullptr)
8392
HANDLE_LIBCALL(CMP_I64, nullptr)
8493
HANDLE_LIBCALL(CMP_I16_0, nullptr)
8594
HANDLE_LIBCALL(CMP_I24_0, nullptr)
8695
HANDLE_LIBCALL(CMP_I32_0, nullptr)
96+
HANDLE_LIBCALL(CMP_I48_0, nullptr)
8797
HANDLE_LIBCALL(CMP_I64_0, nullptr)
8898
HANDLE_LIBCALL(SCMP_I16, nullptr)
8999
HANDLE_LIBCALL(SCMP_I24, nullptr)
90100
HANDLE_LIBCALL(SCMP_I32, nullptr)
101+
HANDLE_LIBCALL(SCMP_I48, nullptr)
91102
HANDLE_LIBCALL(SCMP_I64, nullptr)
92103
HANDLE_LIBCALL(SCMP, nullptr)
93104
HANDLE_LIBCALL(ADD_I32, nullptr)
@@ -102,6 +113,7 @@ HANDLE_LIBCALL(MUL_I16, "__mulhi3")
102113
HANDLE_LIBCALL(MUL_I24, nullptr)
103114
HANDLE_LIBCALL(MUL_I24_I8, nullptr)
104115
HANDLE_LIBCALL(MUL_I32, "__mulsi3")
116+
HANDLE_LIBCALL(MUL_I48, nullptr)
105117
HANDLE_LIBCALL(MUL_I64, "__muldi3")
106118
HANDLE_LIBCALL(MUL_I128, "__multi3")
107119
HANDLE_LIBCALL(MUL_IEXT, nullptr)
@@ -113,6 +125,7 @@ HANDLE_LIBCALL(SDIV_I8, "__divqi3")
113125
HANDLE_LIBCALL(SDIV_I16, "__divhi3")
114126
HANDLE_LIBCALL(SDIV_I24, nullptr)
115127
HANDLE_LIBCALL(SDIV_I32, "__divsi3")
128+
HANDLE_LIBCALL(SDIV_I48, nullptr)
116129
HANDLE_LIBCALL(SDIV_I64, "__divdi3")
117130
HANDLE_LIBCALL(SDIV_I128, "__divti3")
118131
HANDLE_LIBCALL(SDIV_IEXT, "__divei4")
@@ -121,6 +134,7 @@ HANDLE_LIBCALL(UDIV_I8, "__udivqi3")
121134
HANDLE_LIBCALL(UDIV_I16, "__udivhi3")
122135
HANDLE_LIBCALL(UDIV_I24, nullptr)
123136
HANDLE_LIBCALL(UDIV_I32, "__udivsi3")
137+
HANDLE_LIBCALL(UDIV_I48, nullptr)
124138
HANDLE_LIBCALL(UDIV_I64, "__udivdi3")
125139
HANDLE_LIBCALL(UDIV_I128, "__udivti3")
126140
HANDLE_LIBCALL(UDIV_IEXT, "__udivei4")
@@ -129,6 +143,7 @@ HANDLE_LIBCALL(SREM_I8, "__modqi3")
129143
HANDLE_LIBCALL(SREM_I16, "__modhi3")
130144
HANDLE_LIBCALL(SREM_I24, nullptr)
131145
HANDLE_LIBCALL(SREM_I32, "__modsi3")
146+
HANDLE_LIBCALL(SREM_I48, nullptr)
132147
HANDLE_LIBCALL(SREM_I64, "__moddi3")
133148
HANDLE_LIBCALL(SREM_I128, "__modti3")
134149
HANDLE_LIBCALL(SREM_IEXT, "__modei4")
@@ -137,6 +152,7 @@ HANDLE_LIBCALL(UREM_I8, "__umodqi3")
137152
HANDLE_LIBCALL(UREM_I16, "__umodhi3")
138153
HANDLE_LIBCALL(UREM_I24, nullptr)
139154
HANDLE_LIBCALL(UREM_I32, "__umodsi3")
155+
HANDLE_LIBCALL(UREM_I48, nullptr)
140156
HANDLE_LIBCALL(UREM_I64, "__umoddi3")
141157
HANDLE_LIBCALL(UREM_I128, "__umodti3")
142158
HANDLE_LIBCALL(UREM_IEXT, "__umodei4")
@@ -146,42 +162,49 @@ HANDLE_LIBCALL(SDIVREM_I16, nullptr)
146162
HANDLE_LIBCALL(SDIVREM_I24, nullptr)
147163
HANDLE_LIBCALL(SDIVREM_I32, nullptr)
148164
HANDLE_LIBCALL(SDIVREM_I64, nullptr)
165+
HANDLE_LIBCALL(SDIVREM_I48, nullptr)
149166
HANDLE_LIBCALL(SDIVREM_I128, nullptr)
150167
HANDLE_LIBCALL(SDIVREM_IEXT, nullptr)
151168

152169
HANDLE_LIBCALL(UDIVREM_I8, nullptr)
153170
HANDLE_LIBCALL(UDIVREM_I16, nullptr)
154171
HANDLE_LIBCALL(UDIVREM_I24, nullptr)
155172
HANDLE_LIBCALL(UDIVREM_I32, nullptr)
173+
HANDLE_LIBCALL(UDIVREM_I48, nullptr)
156174
HANDLE_LIBCALL(UDIVREM_I64, nullptr)
157175
HANDLE_LIBCALL(UDIVREM_I128, nullptr)
158176
HANDLE_LIBCALL(UDIVREM_IEXT, nullptr)
159177

160178
HANDLE_LIBCALL(NEG_I16, nullptr)
161179
HANDLE_LIBCALL(NEG_I24, nullptr)
162180
HANDLE_LIBCALL(NEG_I32, "__negsi2")
181+
HANDLE_LIBCALL(NEG_I48, nullptr)
163182
HANDLE_LIBCALL(NEG_I64, "__negdi2")
164183

165184
HANDLE_LIBCALL(CTLZ_I8, nullptr)
166185
HANDLE_LIBCALL(CTLZ_I16, nullptr)
167186
HANDLE_LIBCALL(CTLZ_I24, nullptr)
168187
HANDLE_LIBCALL(CTLZ_I32, "__clzsi2")
188+
HANDLE_LIBCALL(CTLZ_I48, nullptr)
169189
HANDLE_LIBCALL(CTLZ_I64, "__clzdi2")
170190
HANDLE_LIBCALL(CTLZ_I128, "__clzti2")
171191
HANDLE_LIBCALL(POPCNT_I8, nullptr)
172192
HANDLE_LIBCALL(POPCNT_I16, nullptr)
173193
HANDLE_LIBCALL(POPCNT_I24, nullptr)
174194
HANDLE_LIBCALL(POPCNT_I32, "__popcountsi2")
195+
HANDLE_LIBCALL(POPCNT_I48, nullptr)
175196
HANDLE_LIBCALL(POPCNT_I64, "__popcountdi2")
176197
HANDLE_LIBCALL(POPCNT_I128, nullptr)
177198
HANDLE_LIBCALL(BITREV_I8, nullptr)
178199
HANDLE_LIBCALL(BITREV_I16, nullptr)
179200
HANDLE_LIBCALL(BITREV_I24, nullptr)
180201
HANDLE_LIBCALL(BITREV_I32, nullptr)
202+
HANDLE_LIBCALL(BITREV_I48, nullptr)
181203
HANDLE_LIBCALL(BITREV_I64, nullptr)
182204
HANDLE_LIBCALL(BITREV_I128, nullptr)
183205
HANDLE_LIBCALL(BSWAP_I32, nullptr)
184206
HANDLE_LIBCALL(BSWAP_I64, nullptr)
207+
HANDLE_LIBCALL(BSWAP_I48, nullptr)
185208
HANDLE_LIBCALL(BSWAP_I128, nullptr)
186209

187210
// Floating-point

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,8 @@ static RTLIB::Libcall getRTLibDesc(unsigned Opcode, unsigned Size) {
521521
return RTLIB::LibcallPrefix##24; \
522522
case 32: \
523523
return RTLIB::LibcallPrefix##32; \
524+
case 48: \
525+
return RTLIB::LibcallPrefix##48; \
524526
case 64: \
525527
return RTLIB::LibcallPrefix##64; \
526528
case 128: \

llvm/lib/Target/Z80/GISel/Z80LegalizerInfo.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
6060
auto LegalScalars24 = {s8, s16, s24};
6161
auto LegalScalars16 = {s8, s16};
6262
auto LegalScalars = Is24Bit ? LegalScalars24 : LegalScalars16;
63-
auto LegalLibcallScalars24 = {s8, s16, s24, s32, s64};
63+
auto LegalLibcallScalars24 = {s8, s16, s24, s32, s48, s64};
6464
auto LegalLibcallScalars16 = {s8, s16, s32, s64};
6565
auto LegalLibcallScalars =
6666
Is24Bit ? LegalLibcallScalars24 : LegalLibcallScalars16;
@@ -158,6 +158,7 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
158158

159159
getActionDefinitionsBuilder({G_ADD, G_SUB})
160160
.legalFor({s8})
161+
.narrowScalarIf(all(pred24Bit, typeIs(0, s48)), changeTo(0, s24))
161162
.customFor(LegalLibcallScalars)
162163
.clampScalar(0, s8, sMax);
163164

@@ -173,8 +174,9 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
173174
.minScalar(0, s16)
174175
.minScalarIf(pred24Bit, 0, s24)
175176
.minScalar(0, s32)
177+
.minScalarIf(pred24Bit, 0, s48)
176178
.minScalar(0, s64)
177-
.maxScalar(0, s64);
179+
.maxScalar(0, s32);
178180

179181
getActionDefinitionsBuilder({G_SDIV, G_UDIV, G_SREM, G_UREM})
180182
.libcallFor(LegalLibcallScalars)

0 commit comments

Comments
 (0)