authorgravatar for orichalcumcosmonaut@protonmail.comQuinn X. J. <orichalcumcosmonaut@protonmail.com> 2025-08-11 23:47:23+10:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-09-27 11:05:23+02:00
logfd0baa9834293be085fd15929437f83986fb2243
tree5b7b4abf7cef19d1ca4c4a39087844d7d9da4bb1
parentb46a7f3a25a61c68bbc25759087a01095dc8446e

Add __gnu_thumb1_case_{sqi,uqi,shi,uhi,si} to compiler_rt

Fixes ziglang/zig#24558

1 files changed, 83 insertions(+), 0 deletions(-)

lib/compiler_rt/arm.zig+83
...@@ -45,6 +45,12 @@ comptime {...@@ -45,6 +45,12 @@ comptime {
45 symbol(&__aeabi_read_tp, "__aeabi_read_tp");45 symbol(&__aeabi_read_tp, "__aeabi_read_tp");
46 }46 }
4747
48 symbol(&__gnu_thumb1_case_sqi, "__gnu_thumb1_case_sqi");
49 symbol(&__gnu_thumb1_case_uqi, "__gnu_thumb1_case_uqi");
50 symbol(&__gnu_thumb1_case_shi, "__gnu_thumb1_case_shi");
51 symbol(&__gnu_thumb1_case_uhi, "__gnu_thumb1_case_uhi");
52 symbol(&__gnu_thumb1_case_si, "__gnu_thumb1_case_si");
53
48 // floating-point helper functions (single+double-precision reverse subtraction, y – x), see subdf3.zig54 // floating-point helper functions (single+double-precision reverse subtraction, y – x), see subdf3.zig
49 symbol(&__aeabi_frsub, "__aeabi_frsub");55 symbol(&__aeabi_frsub, "__aeabi_frsub");
50 symbol(&__aeabi_drsub, "__aeabi_drsub");56 symbol(&__aeabi_drsub, "__aeabi_drsub");
...@@ -205,6 +211,83 @@ pub fn __aeabi_ldivmod() callconv(.naked) void {...@@ -205,6 +211,83 @@ pub fn __aeabi_ldivmod() callconv(.naked) void {
205 unreachable;211 unreachable;
206}212}
207213
214// GCC Thumb1 compressed switch tables: <https://gcc.gnu.org/legacy-ml/gcc-patches/2009-06/msg01698.html>
215
216pub fn __gnu_thumb1_case_sqi() callconv(.naked) noreturn {
217 asm volatile (
218 \\ push {r1}
219 \\ mov r1, lr
220 \\ lsrs r1, r1, #1
221 \\ lsls r1, r1, #1
222 \\ ldrsb r1, [r1, r0]
223 \\ lsls r1, r1, #1
224 \\ add lr, lr, r1
225 \\ pop {r1}
226 \\ bx lr
227 );
228}
229
230pub fn __gnu_thumb1_case_uqi() callconv(.naked) noreturn {
231 asm volatile (
232 \\ push {r1}
233 \\ mov r1, lr
234 \\ lsrs r1, r1, #1
235 \\ lsls r1, r1, #1
236 \\ ldrb r1, [r1, r0]
237 \\ lsls r1, r1, #1
238 \\ add lr, lr, r1
239 \\ pop {r1}
240 \\ bx lr
241 );
242}
243
244pub fn __gnu_thumb1_case_shi() callconv(.naked) noreturn {
245 asm volatile (
246 \\ push {r0, r1}
247 \\ mov r1, lr
248 \\ lsrs r1, r1, #1
249 \\ lsls r0, r0, #1
250 \\ lsls r1, r1, #1
251 \\ ldrsh r1, [r1, r0]
252 \\ lsls r1, r1, #1
253 \\ add lr, lr, r1
254 \\ pop {r0, r1}
255 \\ bx lr
256 );
257}
258
259pub fn __gnu_thumb1_case_uhi() callconv(.naked) noreturn {
260 asm volatile (
261 \\ push {r0, r1}
262 \\ mov r1, lr
263 \\ lsrs r1, r1, #1
264 \\ lsls r0, r0, #1
265 \\ lsls r1, r1, #1
266 \\ ldrh r1, [r1, r0]
267 \\ lsls r1, r1, #1
268 \\ add lr, lr, r1
269 \\ pop {r0, r1}
270 \\ bx lr
271 );
272}
273
274pub fn __gnu_thumb1_case_si() callconv(.naked) noreturn {
275 asm volatile (
276 \\ push {r0, r1}
277 \\ mov r1, lr
278 \\ adds r1, r1, #2
279 \\ lsrs r1, r1, #2
280 \\ lsls r0, r0, #2
281 \\ lsls r1, r1, #2
282 \\ ldr r0, [r1, r0]
283 \\ adds r0, r0, r1
284 \\ adds r0, r0, #1
285 \\ mov lr, r0
286 \\ pop {r0, r1}
287 \\ bx lr
288 );
289}
290
208// Float Arithmetic291// Float Arithmetic
209292
210fn __aeabi_frsub(a: f32, b: f32) callconv(.{ .arm_aapcs = .{} }) f32 {293fn __aeabi_frsub(a: f32, b: f32) callconv(.{ .arm_aapcs = .{} }) f32 {