authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-08 02:52:48+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-09 16:56:23+02:00
log3b947932abbb9f14710c64e3afa6fa88947d1ed1
treef226bf066c77916ce2a0fda299bfefd227f33343
parent3822af14071ec2ffe03427079c343549f0143d9b
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std: avoid pointless delay slots and lr writes in inline assembly

And fill in some delay slots where we can't avoid them.

6 files changed, 53 insertions(+), 40 deletions(-)

lib/std/Thread.zig+32-32
......@@ -1166,29 +1166,29 @@ const LinuxThreadImpl = struct {
11661166 posix.sigprocmask(std.posix.SIG.BLOCK, &std.os.linux.sigfillset(), null);
11671167 switch (target.cpu.arch) {
11681168 .x86 => asm volatile (
1169 \\ movl $91, %%eax # SYS_munmap
1170 \\ int $128
1171 \\ movl $1, %%eax # SYS_exit
1172 \\ movl $0, %%ebx
1173 \\ int $128
1169 \\ movl $91, %%eax # SYS_munmap
1170 \\ int $128
1171 \\ movl $1, %%eax # SYS_exit
1172 \\ movl $0, %%ebx
1173 \\ int $128
11741174 :
11751175 : [ptr] "{ebx}" (@intFromPtr(self.mapped.ptr)),
11761176 [len] "{ecx}" (self.mapped.len),
11771177 ),
11781178 .x86_64 => asm volatile (switch (target.abi) {
11791179 .gnux32, .muslx32, .x32 =>
1180 \\ movl $0x4000000b, %%eax # SYS_munmap
1181 \\ syscall
1182 \\ movl $0x4000003c, %%eax # SYS_exit
1183 \\ xor %%rdi, %%rdi
1184 \\ syscall
1180 \\ movl $0x4000000b, %%eax # SYS_munmap
1181 \\ syscall
1182 \\ movl $0x4000003c, %%eax # SYS_exit
1183 \\ xor %%rdi, %%rdi
1184 \\ syscall
11851185 ,
11861186 else =>
1187 \\ movl $11, %%eax # SYS_munmap
1188 \\ syscall
1189 \\ movl $60, %%eax # SYS_exit
1190 \\ xor %%rdi, %%rdi
1191 \\ syscall
1187 \\ movl $11, %%eax # SYS_munmap
1188 \\ syscall
1189 \\ movl $60, %%eax # SYS_exit
1190 \\ xor %%rdi, %%rdi
1191 \\ syscall
11921192 ,
11931193 }
11941194 :
......@@ -1196,21 +1196,21 @@ const LinuxThreadImpl = struct {
11961196 [len] "{rsi}" (self.mapped.len),
11971197 ),
11981198 .arm, .armeb, .thumb, .thumbeb => asm volatile (
1199 \\ mov r7, #91 // SYS_munmap
1200 \\ svc 0
1201 \\ mov r7, #1 // SYS_exit
1202 \\ mov r0, #0
1203 \\ svc 0
1199 \\ mov r7, #91 // SYS_munmap
1200 \\ svc 0
1201 \\ mov r7, #1 // SYS_exit
1202 \\ mov r0, #0
1203 \\ svc 0
12041204 :
12051205 : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)),
12061206 [len] "{r1}" (self.mapped.len),
12071207 ),
12081208 .aarch64, .aarch64_be => asm volatile (
1209 \\ mov x8, #215 // SYS_munmap
1210 \\ svc 0
1211 \\ mov x8, #93 // SYS_exit
1212 \\ mov x0, #0
1213 \\ svc 0
1209 \\ mov x8, #215 // SYS_munmap
1210 \\ svc 0
1211 \\ mov x8, #93 // SYS_exit
1212 \\ mov x0, #0
1213 \\ svc 0
12141214 :
12151215 : [ptr] "{x0}" (@intFromPtr(self.mapped.ptr)),
12161216 [len] "{x1}" (self.mapped.len),
......@@ -1236,21 +1236,21 @@ const LinuxThreadImpl = struct {
12361236 [len] "{r1}" (self.mapped.len),
12371237 ),
12381238 .hexagon => asm volatile (
1239 \\ r6 = #215 // SYS_munmap
1240 \\ trap0(#1)
1241 \\ r6 = #93 // SYS_exit
1242 \\ r0 = #0
1243 \\ trap0(#1)
1239 \\ r6 = #215 // SYS_munmap
1240 \\ trap0(#1)
1241 \\ r6 = #93 // SYS_exit
1242 \\ r0 = #0
1243 \\ trap0(#1)
12441244 :
12451245 : [ptr] "{r0}" (@intFromPtr(self.mapped.ptr)),
12461246 [len] "{r1}" (self.mapped.len),
12471247 ),
12481248 .hppa => asm volatile (
1249 \\ ldi 91, %%r20 /* SYS_munmap */
12501249 \\ ble 0x100(%%sr2, %%r0)
1251 \\ ldi 1, %%r20 /* SYS_exit */
1250 \\ ldi 91, %%r20 /* SYS_munmap */
12521251 \\ ldi 0, %%r26
12531252 \\ ble 0x100(%%sr2, %%r0)
1253 \\ ldi 1, %%r20 /* SYS_exit */
12541254 :
12551255 : [ptr] "{r26}" (@intFromPtr(self.mapped.ptr)),
12561256 [len] "{r25}" (self.mapped.len),
lib/std/debug/cpu_context.zig+5
......@@ -1039,6 +1039,7 @@ const Mips = extern struct {
10391039 \\ sd $fp, 240($t0)
10401040 \\ sd $ra, 248($t0)
10411041 \\ bal 1f
1042 \\ nop
10421043 \\1:
10431044 \\ sd $ra, 256($t0)
10441045 \\ .set pop
......@@ -1080,6 +1081,7 @@ const Mips = extern struct {
10801081 \\ sw $fp, 120($t4)
10811082 \\ sw $ra, 124($t4)
10821083 \\ bal 1f
1084 \\ nop
10831085 \\1:
10841086 \\ sw $ra, 128($t4)
10851087 \\ .set pop
......@@ -1164,6 +1166,7 @@ const Or1k = extern struct {
11641166 \\ l.sw 120(r15), r30
11651167 \\ l.sw 124(r15), r31
11661168 \\ l.jal 1f
1169 \\ l.nop
11671170 \\1:
11681171 \\ l.sw 128(r15), r9
11691172 :
......@@ -1558,6 +1561,7 @@ const Sparc = extern struct {
15581561 \\ stx %i6, [%l0 + 240]
15591562 \\ stx %i7, [%l0 + 248]
15601563 \\ call 1f
1564 \\ nop
15611565 \\1:
15621566 \\ stx %o7, [%l0 + 256]
15631567 else
......@@ -1578,6 +1582,7 @@ const Sparc = extern struct {
15781582 \\ std %i4, [%l0 + 112]
15791583 \\ std %i6, [%l0 + 120]
15801584 \\ call 1f
1585 \\ nop
15811586 \\1:
15821587 \\ st %o7, [%l0 + 128]
15831588 :
lib/std/os/linux/or1k.zig+3
......@@ -138,7 +138,9 @@ pub fn clone() callconv(.naked) u32 {
138138 \\ l.sys 1
139139 \\ l.sfeqi r11, 0
140140 \\ l.bf 1f
141 \\ l.nop
141142 \\ l.jr r9
143 \\ l.nop
142144 \\1:
143145 );
144146 if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
......@@ -151,6 +153,7 @@ pub fn clone() callconv(.naked) u32 {
151153 \\ l.lwz r11, 0(r1)
152154 \\ l.lwz r3, 4(r1)
153155 \\ l.jalr r11
156 \\ l.nop
154157 \\
155158 \\ l.ori r3, r11, 0
156159 \\ l.ori r11, r0, 93 # SYS_exit
lib/std/os/linux/tls.zig+1
......@@ -295,6 +295,7 @@ pub fn setThreadPointer(addr: usize) void {
295295 .hppa => {
296296 asm volatile (
297297 \\ ble 0xe0(%%sr2, %%r0)
298 \\ nop
298299 :
299300 : [addr] "={r26}" (addr),
300301 : .{ .r29 = true });
lib/std/pie.zig+2
......@@ -190,6 +190,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
190190 \\ .weak _DYNAMIC
191191 \\ .hidden _DYNAMIC
192192 \\ l.jal 1f
193 \\ l.nop
193194 \\ .word _DYNAMIC - .
194195 \\1:
195196 \\ l.lwz %[ret], 0(r9)
......@@ -245,6 +246,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
245246 \\ mov.l 1f, %[ret]
246247 \\ add r0, %[ret]
247248 \\ bra 2f
249 \\ nop
248250 \\1:
249251 \\ .balign 4
250252 \\ .long DYNAMIC - .
lib/std/start.zig+10-8
......@@ -295,7 +295,7 @@ fn _start() callconv(.naked) noreturn {
295295 \\ r29 = and(r29, #-8)
296296 \\ memw(r29 + #-8) = r29
297297 \\ r29 = add(r29, #-8)
298 \\ call %[posixCallMainAndExit]
298 \\ jump %[posixCallMainAndExit]
299299 ,
300300 .kvx =>
301301 \\ make $fp = 0
......@@ -327,7 +327,8 @@ fn _start() callconv(.naked) noreturn {
327327 \\ l.ori r9, r0, 0
328328 \\ l.ori r3, r1, 0
329329 \\ l.andi r1, r1, -4
330 \\ l.jal %[posixCallMainAndExit]
330 \\ l.j %[posixCallMainAndExit]
331 \\ l.nop
331332 ,
332333 .riscv32, .riscv32be, .riscv64, .riscv64be =>
333334 \\ li fp, 0
......@@ -356,7 +357,7 @@ fn _start() callconv(.naked) noreturn {
356357 \\ or %%r1, %%r0, %%r0
357358 \\ or %%r2, %%r31, %%r0
358359 \\ clr %%r31, %%r31, 4<0>
359 \\ br.n %[posixCallMainAndExit]
360 \\ br %[posixCallMainAndExit]
360361 ,
361362 .microblaze, .microblazeel =>
362363 // r1 = SP, r15 = LR, r19 = FP, r20 = GP
......@@ -366,7 +367,7 @@ fn _start() callconv(.naked) noreturn {
366367 \\ addi r20, r20, _GLOBAL_OFFSET_TABLE_ + 8
367368 \\ ori r5, r1, 0
368369 \\ andi r1, r1, -4
369 \\ brlid r15, %[posixCallMainAndExit]
370 \\ bri %[posixCallMainAndExit]
370371 ,
371372 .mips, .mipsel =>
372373 \\ move $fp, $zero
......@@ -385,7 +386,7 @@ fn _start() callconv(.naked) noreturn {
385386 \\ move $a0, $sp
386387 \\ and $sp, -8
387388 \\ subu $sp, $sp, 16
388 \\ jalr $t9
389 \\ jr $t9
389390 ,
390391 .mips64, .mips64el => switch (builtin.abi) {
391392 .gnuabin32, .muslabin32, .abin32 =>
......@@ -403,7 +404,7 @@ fn _start() callconv(.naked) noreturn {
403404 \\ move $a0, $sp
404405 \\ and $sp, -16
405406 \\ subu $sp, $sp, 16
406 \\ jalr $t9
407 \\ jr $t9
407408 ,
408409 else =>
409410 \\ move $fp, $zero
......@@ -424,7 +425,7 @@ fn _start() callconv(.naked) noreturn {
424425 \\ move $a0, $sp
425426 \\ and $sp, -16
426427 \\ dsubu $sp, $sp, 16
427 \\ jalr $t9
428 \\ jr $t9
428429 ,
429430 },
430431 .powerpc, .powerpcle =>
......@@ -476,7 +477,8 @@ fn _start() callconv(.naked) noreturn {
476477 \\ and r0, r15
477478 \\ mov.l 2f, r1
478479 \\1:
479 \\ bsrf r1
480 \\ braf r1
481 \\ nop
480482 \\2:
481483 \\ .balign 4
482484 \\ .long %[posixCallMainAndExit]@PCREL - (1b + 4 - .)