authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-17 02:14:18+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2025-07-17 02:14:18+02:00
log680358767e30ac386e6727ffc9295820c598d6b9
tree038619f013a1ec2e8bd1a5f409ca277048bb0b3c
parentd772c062720c96cc4e1c601814f422dfa1efb5a5
parentaf084e537adbf571d3d1f69ef5ee3de7abd27ccd
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #24419 from ziglang/asm-clobbers

inline assembly: use types for clobbers

65 files changed, 3385 insertions(+), 890 deletions(-)

doc/langref/Assembly Syntax Explained.zig +1-2
...@@ -53,8 +53,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {...@@ -53,8 +53,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {
53 // memory locations - not only the memory pointed to by a declared indirect53 // memory locations - not only the memory pointed to by a declared indirect
54 // output. In this example we list $rcx and $r11 because it is known the54 // output. In this example we list $rcx and $r11 because it is known the
55 // kernel syscall does not preserve these registers.55 // kernel syscall does not preserve these registers.
56 : "rcx", "r11"56 : .{ .rcx = true, .r11 = true });
57 );
58}57}
5958
60// syntax59// syntax
doc/langref/inline_assembly.zig+2-4
...@@ -15,8 +15,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {...@@ -15,8 +15,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {
15 : [ret] "={rax}" (-> usize),15 : [ret] "={rax}" (-> usize),
16 : [number] "{rax}" (number),16 : [number] "{rax}" (number),
17 [arg1] "{rdi}" (arg1),17 [arg1] "{rdi}" (arg1),
18 : "rcx", "r11"18 : .{ .rcx = true, .r11 = true });
19 );
20}19}
2120
22pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {21pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -26,8 +25,7 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -26,8 +25,7 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
26 [arg1] "{rdi}" (arg1),25 [arg1] "{rdi}" (arg1),
27 [arg2] "{rsi}" (arg2),26 [arg2] "{rsi}" (arg2),
28 [arg3] "{rdx}" (arg3),27 [arg3] "{rdx}" (arg3),
29 : "rcx", "r11"28 : .{ .rcx = true, .r11 = true });
30 );
31}29}
3230
33// exe=succeed31// exe=succeed
lib/compiler_rt/aarch64_outline_atomics.zig+100-200
...@@ -28,8 +28,7 @@ fn __aarch64_cas1_relax() align(16) callconv(.naked) void {...@@ -28,8 +28,7 @@ fn __aarch64_cas1_relax() align(16) callconv(.naked) void {
28 \\ ret28 \\ ret
29 :29 :
30 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),30 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
31 : "w15", "w16", "w17", "memory"31 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
32 );
33 unreachable;32 unreachable;
34}33}
35fn __aarch64_swp1_relax() align(16) callconv(.naked) void {34fn __aarch64_swp1_relax() align(16) callconv(.naked) void {
...@@ -48,8 +47,7 @@ fn __aarch64_swp1_relax() align(16) callconv(.naked) void {...@@ -48,8 +47,7 @@ fn __aarch64_swp1_relax() align(16) callconv(.naked) void {
48 \\ ret47 \\ ret
49 :48 :
50 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),49 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
51 : "w15", "w16", "w17", "memory"50 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
52 );
53 unreachable;51 unreachable;
54}52}
55fn __aarch64_ldadd1_relax() align(16) callconv(.naked) void {53fn __aarch64_ldadd1_relax() align(16) callconv(.naked) void {
...@@ -69,8 +67,7 @@ fn __aarch64_ldadd1_relax() align(16) callconv(.naked) void {...@@ -69,8 +67,7 @@ fn __aarch64_ldadd1_relax() align(16) callconv(.naked) void {
69 \\ ret67 \\ ret
70 :68 :
71 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),69 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
72 : "w15", "w16", "w17", "memory"70 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
73 );
74 unreachable;71 unreachable;
75}72}
76fn __aarch64_ldclr1_relax() align(16) callconv(.naked) void {73fn __aarch64_ldclr1_relax() align(16) callconv(.naked) void {
...@@ -90,8 +87,7 @@ fn __aarch64_ldclr1_relax() align(16) callconv(.naked) void {...@@ -90,8 +87,7 @@ fn __aarch64_ldclr1_relax() align(16) callconv(.naked) void {
90 \\ ret87 \\ ret
91 :88 :
92 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),89 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
93 : "w15", "w16", "w17", "memory"90 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
94 );
95 unreachable;91 unreachable;
96}92}
97fn __aarch64_ldeor1_relax() align(16) callconv(.naked) void {93fn __aarch64_ldeor1_relax() align(16) callconv(.naked) void {
...@@ -111,8 +107,7 @@ fn __aarch64_ldeor1_relax() align(16) callconv(.naked) void {...@@ -111,8 +107,7 @@ fn __aarch64_ldeor1_relax() align(16) callconv(.naked) void {
111 \\ ret107 \\ ret
112 :108 :
113 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),109 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
114 : "w15", "w16", "w17", "memory"110 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
115 );
116 unreachable;111 unreachable;
117}112}
118fn __aarch64_ldset1_relax() align(16) callconv(.naked) void {113fn __aarch64_ldset1_relax() align(16) callconv(.naked) void {
...@@ -132,8 +127,7 @@ fn __aarch64_ldset1_relax() align(16) callconv(.naked) void {...@@ -132,8 +127,7 @@ fn __aarch64_ldset1_relax() align(16) callconv(.naked) void {
132 \\ ret127 \\ ret
133 :128 :
134 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),129 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
135 : "w15", "w16", "w17", "memory"130 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
136 );
137 unreachable;131 unreachable;
138}132}
139fn __aarch64_cas1_acq() align(16) callconv(.naked) void {133fn __aarch64_cas1_acq() align(16) callconv(.naked) void {
...@@ -154,8 +148,7 @@ fn __aarch64_cas1_acq() align(16) callconv(.naked) void {...@@ -154,8 +148,7 @@ fn __aarch64_cas1_acq() align(16) callconv(.naked) void {
154 \\ ret148 \\ ret
155 :149 :
156 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),150 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
157 : "w15", "w16", "w17", "memory"151 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
158 );
159 unreachable;152 unreachable;
160}153}
161fn __aarch64_swp1_acq() align(16) callconv(.naked) void {154fn __aarch64_swp1_acq() align(16) callconv(.naked) void {
...@@ -174,8 +167,7 @@ fn __aarch64_swp1_acq() align(16) callconv(.naked) void {...@@ -174,8 +167,7 @@ fn __aarch64_swp1_acq() align(16) callconv(.naked) void {
174 \\ ret167 \\ ret
175 :168 :
176 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),169 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
177 : "w15", "w16", "w17", "memory"170 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
178 );
179 unreachable;171 unreachable;
180}172}
181fn __aarch64_ldadd1_acq() align(16) callconv(.naked) void {173fn __aarch64_ldadd1_acq() align(16) callconv(.naked) void {
...@@ -195,8 +187,7 @@ fn __aarch64_ldadd1_acq() align(16) callconv(.naked) void {...@@ -195,8 +187,7 @@ fn __aarch64_ldadd1_acq() align(16) callconv(.naked) void {
195 \\ ret187 \\ ret
196 :188 :
197 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),189 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
198 : "w15", "w16", "w17", "memory"190 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
199 );
200 unreachable;191 unreachable;
201}192}
202fn __aarch64_ldclr1_acq() align(16) callconv(.naked) void {193fn __aarch64_ldclr1_acq() align(16) callconv(.naked) void {
...@@ -216,8 +207,7 @@ fn __aarch64_ldclr1_acq() align(16) callconv(.naked) void {...@@ -216,8 +207,7 @@ fn __aarch64_ldclr1_acq() align(16) callconv(.naked) void {
216 \\ ret207 \\ ret
217 :208 :
218 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),209 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
219 : "w15", "w16", "w17", "memory"210 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
220 );
221 unreachable;211 unreachable;
222}212}
223fn __aarch64_ldeor1_acq() align(16) callconv(.naked) void {213fn __aarch64_ldeor1_acq() align(16) callconv(.naked) void {
...@@ -237,8 +227,7 @@ fn __aarch64_ldeor1_acq() align(16) callconv(.naked) void {...@@ -237,8 +227,7 @@ fn __aarch64_ldeor1_acq() align(16) callconv(.naked) void {
237 \\ ret227 \\ ret
238 :228 :
239 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),229 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
240 : "w15", "w16", "w17", "memory"230 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
241 );
242 unreachable;231 unreachable;
243}232}
244fn __aarch64_ldset1_acq() align(16) callconv(.naked) void {233fn __aarch64_ldset1_acq() align(16) callconv(.naked) void {
...@@ -258,8 +247,7 @@ fn __aarch64_ldset1_acq() align(16) callconv(.naked) void {...@@ -258,8 +247,7 @@ fn __aarch64_ldset1_acq() align(16) callconv(.naked) void {
258 \\ ret247 \\ ret
259 :248 :
260 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),249 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
261 : "w15", "w16", "w17", "memory"250 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
262 );
263 unreachable;251 unreachable;
264}252}
265fn __aarch64_cas1_rel() align(16) callconv(.naked) void {253fn __aarch64_cas1_rel() align(16) callconv(.naked) void {
...@@ -280,8 +268,7 @@ fn __aarch64_cas1_rel() align(16) callconv(.naked) void {...@@ -280,8 +268,7 @@ fn __aarch64_cas1_rel() align(16) callconv(.naked) void {
280 \\ ret268 \\ ret
281 :269 :
282 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),270 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
283 : "w15", "w16", "w17", "memory"271 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
284 );
285 unreachable;272 unreachable;
286}273}
287fn __aarch64_swp1_rel() align(16) callconv(.naked) void {274fn __aarch64_swp1_rel() align(16) callconv(.naked) void {
...@@ -300,8 +287,7 @@ fn __aarch64_swp1_rel() align(16) callconv(.naked) void {...@@ -300,8 +287,7 @@ fn __aarch64_swp1_rel() align(16) callconv(.naked) void {
300 \\ ret287 \\ ret
301 :288 :
302 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),289 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
303 : "w15", "w16", "w17", "memory"290 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
304 );
305 unreachable;291 unreachable;
306}292}
307fn __aarch64_ldadd1_rel() align(16) callconv(.naked) void {293fn __aarch64_ldadd1_rel() align(16) callconv(.naked) void {
...@@ -321,8 +307,7 @@ fn __aarch64_ldadd1_rel() align(16) callconv(.naked) void {...@@ -321,8 +307,7 @@ fn __aarch64_ldadd1_rel() align(16) callconv(.naked) void {
321 \\ ret307 \\ ret
322 :308 :
323 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),309 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
324 : "w15", "w16", "w17", "memory"310 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
325 );
326 unreachable;311 unreachable;
327}312}
328fn __aarch64_ldclr1_rel() align(16) callconv(.naked) void {313fn __aarch64_ldclr1_rel() align(16) callconv(.naked) void {
...@@ -342,8 +327,7 @@ fn __aarch64_ldclr1_rel() align(16) callconv(.naked) void {...@@ -342,8 +327,7 @@ fn __aarch64_ldclr1_rel() align(16) callconv(.naked) void {
342 \\ ret327 \\ ret
343 :328 :
344 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),329 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
345 : "w15", "w16", "w17", "memory"330 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
346 );
347 unreachable;331 unreachable;
348}332}
349fn __aarch64_ldeor1_rel() align(16) callconv(.naked) void {333fn __aarch64_ldeor1_rel() align(16) callconv(.naked) void {
...@@ -363,8 +347,7 @@ fn __aarch64_ldeor1_rel() align(16) callconv(.naked) void {...@@ -363,8 +347,7 @@ fn __aarch64_ldeor1_rel() align(16) callconv(.naked) void {
363 \\ ret347 \\ ret
364 :348 :
365 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),349 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
366 : "w15", "w16", "w17", "memory"350 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
367 );
368 unreachable;351 unreachable;
369}352}
370fn __aarch64_ldset1_rel() align(16) callconv(.naked) void {353fn __aarch64_ldset1_rel() align(16) callconv(.naked) void {
...@@ -384,8 +367,7 @@ fn __aarch64_ldset1_rel() align(16) callconv(.naked) void {...@@ -384,8 +367,7 @@ fn __aarch64_ldset1_rel() align(16) callconv(.naked) void {
384 \\ ret367 \\ ret
385 :368 :
386 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),369 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
387 : "w15", "w16", "w17", "memory"370 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
388 );
389 unreachable;371 unreachable;
390}372}
391fn __aarch64_cas1_acq_rel() align(16) callconv(.naked) void {373fn __aarch64_cas1_acq_rel() align(16) callconv(.naked) void {
...@@ -406,8 +388,7 @@ fn __aarch64_cas1_acq_rel() align(16) callconv(.naked) void {...@@ -406,8 +388,7 @@ fn __aarch64_cas1_acq_rel() align(16) callconv(.naked) void {
406 \\ ret388 \\ ret
407 :389 :
408 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),390 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
409 : "w15", "w16", "w17", "memory"391 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
410 );
411 unreachable;392 unreachable;
412}393}
413fn __aarch64_swp1_acq_rel() align(16) callconv(.naked) void {394fn __aarch64_swp1_acq_rel() align(16) callconv(.naked) void {
...@@ -426,8 +407,7 @@ fn __aarch64_swp1_acq_rel() align(16) callconv(.naked) void {...@@ -426,8 +407,7 @@ fn __aarch64_swp1_acq_rel() align(16) callconv(.naked) void {
426 \\ ret407 \\ ret
427 :408 :
428 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),409 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
429 : "w15", "w16", "w17", "memory"410 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
430 );
431 unreachable;411 unreachable;
432}412}
433fn __aarch64_ldadd1_acq_rel() align(16) callconv(.naked) void {413fn __aarch64_ldadd1_acq_rel() align(16) callconv(.naked) void {
...@@ -447,8 +427,7 @@ fn __aarch64_ldadd1_acq_rel() align(16) callconv(.naked) void {...@@ -447,8 +427,7 @@ fn __aarch64_ldadd1_acq_rel() align(16) callconv(.naked) void {
447 \\ ret427 \\ ret
448 :428 :
449 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),429 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
450 : "w15", "w16", "w17", "memory"430 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
451 );
452 unreachable;431 unreachable;
453}432}
454fn __aarch64_ldclr1_acq_rel() align(16) callconv(.naked) void {433fn __aarch64_ldclr1_acq_rel() align(16) callconv(.naked) void {
...@@ -468,8 +447,7 @@ fn __aarch64_ldclr1_acq_rel() align(16) callconv(.naked) void {...@@ -468,8 +447,7 @@ fn __aarch64_ldclr1_acq_rel() align(16) callconv(.naked) void {
468 \\ ret447 \\ ret
469 :448 :
470 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),449 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
471 : "w15", "w16", "w17", "memory"450 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
472 );
473 unreachable;451 unreachable;
474}452}
475fn __aarch64_ldeor1_acq_rel() align(16) callconv(.naked) void {453fn __aarch64_ldeor1_acq_rel() align(16) callconv(.naked) void {
...@@ -489,8 +467,7 @@ fn __aarch64_ldeor1_acq_rel() align(16) callconv(.naked) void {...@@ -489,8 +467,7 @@ fn __aarch64_ldeor1_acq_rel() align(16) callconv(.naked) void {
489 \\ ret467 \\ ret
490 :468 :
491 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),469 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
492 : "w15", "w16", "w17", "memory"470 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
493 );
494 unreachable;471 unreachable;
495}472}
496fn __aarch64_ldset1_acq_rel() align(16) callconv(.naked) void {473fn __aarch64_ldset1_acq_rel() align(16) callconv(.naked) void {
...@@ -510,8 +487,7 @@ fn __aarch64_ldset1_acq_rel() align(16) callconv(.naked) void {...@@ -510,8 +487,7 @@ fn __aarch64_ldset1_acq_rel() align(16) callconv(.naked) void {
510 \\ ret487 \\ ret
511 :488 :
512 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),489 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
513 : "w15", "w16", "w17", "memory"490 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
514 );
515 unreachable;491 unreachable;
516}492}
517fn __aarch64_cas2_relax() align(16) callconv(.naked) void {493fn __aarch64_cas2_relax() align(16) callconv(.naked) void {
...@@ -532,8 +508,7 @@ fn __aarch64_cas2_relax() align(16) callconv(.naked) void {...@@ -532,8 +508,7 @@ fn __aarch64_cas2_relax() align(16) callconv(.naked) void {
532 \\ ret508 \\ ret
533 :509 :
534 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),510 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
535 : "w15", "w16", "w17", "memory"511 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
536 );
537 unreachable;512 unreachable;
538}513}
539fn __aarch64_swp2_relax() align(16) callconv(.naked) void {514fn __aarch64_swp2_relax() align(16) callconv(.naked) void {
...@@ -552,8 +527,7 @@ fn __aarch64_swp2_relax() align(16) callconv(.naked) void {...@@ -552,8 +527,7 @@ fn __aarch64_swp2_relax() align(16) callconv(.naked) void {
552 \\ ret527 \\ ret
553 :528 :
554 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),529 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
555 : "w15", "w16", "w17", "memory"530 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
556 );
557 unreachable;531 unreachable;
558}532}
559fn __aarch64_ldadd2_relax() align(16) callconv(.naked) void {533fn __aarch64_ldadd2_relax() align(16) callconv(.naked) void {
...@@ -573,8 +547,7 @@ fn __aarch64_ldadd2_relax() align(16) callconv(.naked) void {...@@ -573,8 +547,7 @@ fn __aarch64_ldadd2_relax() align(16) callconv(.naked) void {
573 \\ ret547 \\ ret
574 :548 :
575 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),549 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
576 : "w15", "w16", "w17", "memory"550 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
577 );
578 unreachable;551 unreachable;
579}552}
580fn __aarch64_ldclr2_relax() align(16) callconv(.naked) void {553fn __aarch64_ldclr2_relax() align(16) callconv(.naked) void {
...@@ -594,8 +567,7 @@ fn __aarch64_ldclr2_relax() align(16) callconv(.naked) void {...@@ -594,8 +567,7 @@ fn __aarch64_ldclr2_relax() align(16) callconv(.naked) void {
594 \\ ret567 \\ ret
595 :568 :
596 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),569 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
597 : "w15", "w16", "w17", "memory"570 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
598 );
599 unreachable;571 unreachable;
600}572}
601fn __aarch64_ldeor2_relax() align(16) callconv(.naked) void {573fn __aarch64_ldeor2_relax() align(16) callconv(.naked) void {
...@@ -615,8 +587,7 @@ fn __aarch64_ldeor2_relax() align(16) callconv(.naked) void {...@@ -615,8 +587,7 @@ fn __aarch64_ldeor2_relax() align(16) callconv(.naked) void {
615 \\ ret587 \\ ret
616 :588 :
617 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),589 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
618 : "w15", "w16", "w17", "memory"590 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
619 );
620 unreachable;591 unreachable;
621}592}
622fn __aarch64_ldset2_relax() align(16) callconv(.naked) void {593fn __aarch64_ldset2_relax() align(16) callconv(.naked) void {
...@@ -636,8 +607,7 @@ fn __aarch64_ldset2_relax() align(16) callconv(.naked) void {...@@ -636,8 +607,7 @@ fn __aarch64_ldset2_relax() align(16) callconv(.naked) void {
636 \\ ret607 \\ ret
637 :608 :
638 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),609 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
639 : "w15", "w16", "w17", "memory"610 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
640 );
641 unreachable;611 unreachable;
642}612}
643fn __aarch64_cas2_acq() align(16) callconv(.naked) void {613fn __aarch64_cas2_acq() align(16) callconv(.naked) void {
...@@ -658,8 +628,7 @@ fn __aarch64_cas2_acq() align(16) callconv(.naked) void {...@@ -658,8 +628,7 @@ fn __aarch64_cas2_acq() align(16) callconv(.naked) void {
658 \\ ret628 \\ ret
659 :629 :
660 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),630 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
661 : "w15", "w16", "w17", "memory"631 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
662 );
663 unreachable;632 unreachable;
664}633}
665fn __aarch64_swp2_acq() align(16) callconv(.naked) void {634fn __aarch64_swp2_acq() align(16) callconv(.naked) void {
...@@ -678,8 +647,7 @@ fn __aarch64_swp2_acq() align(16) callconv(.naked) void {...@@ -678,8 +647,7 @@ fn __aarch64_swp2_acq() align(16) callconv(.naked) void {
678 \\ ret647 \\ ret
679 :648 :
680 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),649 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
681 : "w15", "w16", "w17", "memory"650 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
682 );
683 unreachable;651 unreachable;
684}652}
685fn __aarch64_ldadd2_acq() align(16) callconv(.naked) void {653fn __aarch64_ldadd2_acq() align(16) callconv(.naked) void {
...@@ -699,8 +667,7 @@ fn __aarch64_ldadd2_acq() align(16) callconv(.naked) void {...@@ -699,8 +667,7 @@ fn __aarch64_ldadd2_acq() align(16) callconv(.naked) void {
699 \\ ret667 \\ ret
700 :668 :
701 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),669 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
702 : "w15", "w16", "w17", "memory"670 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
703 );
704 unreachable;671 unreachable;
705}672}
706fn __aarch64_ldclr2_acq() align(16) callconv(.naked) void {673fn __aarch64_ldclr2_acq() align(16) callconv(.naked) void {
...@@ -720,8 +687,7 @@ fn __aarch64_ldclr2_acq() align(16) callconv(.naked) void {...@@ -720,8 +687,7 @@ fn __aarch64_ldclr2_acq() align(16) callconv(.naked) void {
720 \\ ret687 \\ ret
721 :688 :
722 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),689 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
723 : "w15", "w16", "w17", "memory"690 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
724 );
725 unreachable;691 unreachable;
726}692}
727fn __aarch64_ldeor2_acq() align(16) callconv(.naked) void {693fn __aarch64_ldeor2_acq() align(16) callconv(.naked) void {
...@@ -741,8 +707,7 @@ fn __aarch64_ldeor2_acq() align(16) callconv(.naked) void {...@@ -741,8 +707,7 @@ fn __aarch64_ldeor2_acq() align(16) callconv(.naked) void {
741 \\ ret707 \\ ret
742 :708 :
743 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),709 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
744 : "w15", "w16", "w17", "memory"710 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
745 );
746 unreachable;711 unreachable;
747}712}
748fn __aarch64_ldset2_acq() align(16) callconv(.naked) void {713fn __aarch64_ldset2_acq() align(16) callconv(.naked) void {
...@@ -762,8 +727,7 @@ fn __aarch64_ldset2_acq() align(16) callconv(.naked) void {...@@ -762,8 +727,7 @@ fn __aarch64_ldset2_acq() align(16) callconv(.naked) void {
762 \\ ret727 \\ ret
763 :728 :
764 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),729 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
765 : "w15", "w16", "w17", "memory"730 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
766 );
767 unreachable;731 unreachable;
768}732}
769fn __aarch64_cas2_rel() align(16) callconv(.naked) void {733fn __aarch64_cas2_rel() align(16) callconv(.naked) void {
...@@ -784,8 +748,7 @@ fn __aarch64_cas2_rel() align(16) callconv(.naked) void {...@@ -784,8 +748,7 @@ fn __aarch64_cas2_rel() align(16) callconv(.naked) void {
784 \\ ret748 \\ ret
785 :749 :
786 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),750 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
787 : "w15", "w16", "w17", "memory"751 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
788 );
789 unreachable;752 unreachable;
790}753}
791fn __aarch64_swp2_rel() align(16) callconv(.naked) void {754fn __aarch64_swp2_rel() align(16) callconv(.naked) void {
...@@ -804,8 +767,7 @@ fn __aarch64_swp2_rel() align(16) callconv(.naked) void {...@@ -804,8 +767,7 @@ fn __aarch64_swp2_rel() align(16) callconv(.naked) void {
804 \\ ret767 \\ ret
805 :768 :
806 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),769 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
807 : "w15", "w16", "w17", "memory"770 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
808 );
809 unreachable;771 unreachable;
810}772}
811fn __aarch64_ldadd2_rel() align(16) callconv(.naked) void {773fn __aarch64_ldadd2_rel() align(16) callconv(.naked) void {
...@@ -825,8 +787,7 @@ fn __aarch64_ldadd2_rel() align(16) callconv(.naked) void {...@@ -825,8 +787,7 @@ fn __aarch64_ldadd2_rel() align(16) callconv(.naked) void {
825 \\ ret787 \\ ret
826 :788 :
827 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),789 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
828 : "w15", "w16", "w17", "memory"790 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
829 );
830 unreachable;791 unreachable;
831}792}
832fn __aarch64_ldclr2_rel() align(16) callconv(.naked) void {793fn __aarch64_ldclr2_rel() align(16) callconv(.naked) void {
...@@ -846,8 +807,7 @@ fn __aarch64_ldclr2_rel() align(16) callconv(.naked) void {...@@ -846,8 +807,7 @@ fn __aarch64_ldclr2_rel() align(16) callconv(.naked) void {
846 \\ ret807 \\ ret
847 :808 :
848 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),809 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
849 : "w15", "w16", "w17", "memory"810 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
850 );
851 unreachable;811 unreachable;
852}812}
853fn __aarch64_ldeor2_rel() align(16) callconv(.naked) void {813fn __aarch64_ldeor2_rel() align(16) callconv(.naked) void {
...@@ -867,8 +827,7 @@ fn __aarch64_ldeor2_rel() align(16) callconv(.naked) void {...@@ -867,8 +827,7 @@ fn __aarch64_ldeor2_rel() align(16) callconv(.naked) void {
867 \\ ret827 \\ ret
868 :828 :
869 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),829 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
870 : "w15", "w16", "w17", "memory"830 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
871 );
872 unreachable;831 unreachable;
873}832}
874fn __aarch64_ldset2_rel() align(16) callconv(.naked) void {833fn __aarch64_ldset2_rel() align(16) callconv(.naked) void {
...@@ -888,8 +847,7 @@ fn __aarch64_ldset2_rel() align(16) callconv(.naked) void {...@@ -888,8 +847,7 @@ fn __aarch64_ldset2_rel() align(16) callconv(.naked) void {
888 \\ ret847 \\ ret
889 :848 :
890 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),849 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
891 : "w15", "w16", "w17", "memory"850 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
892 );
893 unreachable;851 unreachable;
894}852}
895fn __aarch64_cas2_acq_rel() align(16) callconv(.naked) void {853fn __aarch64_cas2_acq_rel() align(16) callconv(.naked) void {
...@@ -910,8 +868,7 @@ fn __aarch64_cas2_acq_rel() align(16) callconv(.naked) void {...@@ -910,8 +868,7 @@ fn __aarch64_cas2_acq_rel() align(16) callconv(.naked) void {
910 \\ ret868 \\ ret
911 :869 :
912 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),870 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
913 : "w15", "w16", "w17", "memory"871 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
914 );
915 unreachable;872 unreachable;
916}873}
917fn __aarch64_swp2_acq_rel() align(16) callconv(.naked) void {874fn __aarch64_swp2_acq_rel() align(16) callconv(.naked) void {
...@@ -930,8 +887,7 @@ fn __aarch64_swp2_acq_rel() align(16) callconv(.naked) void {...@@ -930,8 +887,7 @@ fn __aarch64_swp2_acq_rel() align(16) callconv(.naked) void {
930 \\ ret887 \\ ret
931 :888 :
932 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),889 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
933 : "w15", "w16", "w17", "memory"890 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
934 );
935 unreachable;891 unreachable;
936}892}
937fn __aarch64_ldadd2_acq_rel() align(16) callconv(.naked) void {893fn __aarch64_ldadd2_acq_rel() align(16) callconv(.naked) void {
...@@ -951,8 +907,7 @@ fn __aarch64_ldadd2_acq_rel() align(16) callconv(.naked) void {...@@ -951,8 +907,7 @@ fn __aarch64_ldadd2_acq_rel() align(16) callconv(.naked) void {
951 \\ ret907 \\ ret
952 :908 :
953 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),909 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
954 : "w15", "w16", "w17", "memory"910 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
955 );
956 unreachable;911 unreachable;
957}912}
958fn __aarch64_ldclr2_acq_rel() align(16) callconv(.naked) void {913fn __aarch64_ldclr2_acq_rel() align(16) callconv(.naked) void {
...@@ -972,8 +927,7 @@ fn __aarch64_ldclr2_acq_rel() align(16) callconv(.naked) void {...@@ -972,8 +927,7 @@ fn __aarch64_ldclr2_acq_rel() align(16) callconv(.naked) void {
972 \\ ret927 \\ ret
973 :928 :
974 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),929 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
975 : "w15", "w16", "w17", "memory"930 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
976 );
977 unreachable;931 unreachable;
978}932}
979fn __aarch64_ldeor2_acq_rel() align(16) callconv(.naked) void {933fn __aarch64_ldeor2_acq_rel() align(16) callconv(.naked) void {
...@@ -993,8 +947,7 @@ fn __aarch64_ldeor2_acq_rel() align(16) callconv(.naked) void {...@@ -993,8 +947,7 @@ fn __aarch64_ldeor2_acq_rel() align(16) callconv(.naked) void {
993 \\ ret947 \\ ret
994 :948 :
995 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),949 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
996 : "w15", "w16", "w17", "memory"950 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
997 );
998 unreachable;951 unreachable;
999}952}
1000fn __aarch64_ldset2_acq_rel() align(16) callconv(.naked) void {953fn __aarch64_ldset2_acq_rel() align(16) callconv(.naked) void {
...@@ -1014,8 +967,7 @@ fn __aarch64_ldset2_acq_rel() align(16) callconv(.naked) void {...@@ -1014,8 +967,7 @@ fn __aarch64_ldset2_acq_rel() align(16) callconv(.naked) void {
1014 \\ ret967 \\ ret
1015 :968 :
1016 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),969 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1017 : "w15", "w16", "w17", "memory"970 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1018 );
1019 unreachable;971 unreachable;
1020}972}
1021fn __aarch64_cas4_relax() align(16) callconv(.naked) void {973fn __aarch64_cas4_relax() align(16) callconv(.naked) void {
...@@ -1036,8 +988,7 @@ fn __aarch64_cas4_relax() align(16) callconv(.naked) void {...@@ -1036,8 +988,7 @@ fn __aarch64_cas4_relax() align(16) callconv(.naked) void {
1036 \\ ret988 \\ ret
1037 :989 :
1038 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),990 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1039 : "w15", "w16", "w17", "memory"991 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1040 );
1041 unreachable;992 unreachable;
1042}993}
1043fn __aarch64_swp4_relax() align(16) callconv(.naked) void {994fn __aarch64_swp4_relax() align(16) callconv(.naked) void {
...@@ -1056,8 +1007,7 @@ fn __aarch64_swp4_relax() align(16) callconv(.naked) void {...@@ -1056,8 +1007,7 @@ fn __aarch64_swp4_relax() align(16) callconv(.naked) void {
1056 \\ ret1007 \\ ret
1057 :1008 :
1058 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1009 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1059 : "w15", "w16", "w17", "memory"1010 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1060 );
1061 unreachable;1011 unreachable;
1062}1012}
1063fn __aarch64_ldadd4_relax() align(16) callconv(.naked) void {1013fn __aarch64_ldadd4_relax() align(16) callconv(.naked) void {
...@@ -1077,8 +1027,7 @@ fn __aarch64_ldadd4_relax() align(16) callconv(.naked) void {...@@ -1077,8 +1027,7 @@ fn __aarch64_ldadd4_relax() align(16) callconv(.naked) void {
1077 \\ ret1027 \\ ret
1078 :1028 :
1079 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1029 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1080 : "w15", "w16", "w17", "memory"1030 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1081 );
1082 unreachable;1031 unreachable;
1083}1032}
1084fn __aarch64_ldclr4_relax() align(16) callconv(.naked) void {1033fn __aarch64_ldclr4_relax() align(16) callconv(.naked) void {
...@@ -1098,8 +1047,7 @@ fn __aarch64_ldclr4_relax() align(16) callconv(.naked) void {...@@ -1098,8 +1047,7 @@ fn __aarch64_ldclr4_relax() align(16) callconv(.naked) void {
1098 \\ ret1047 \\ ret
1099 :1048 :
1100 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1049 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1101 : "w15", "w16", "w17", "memory"1050 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1102 );
1103 unreachable;1051 unreachable;
1104}1052}
1105fn __aarch64_ldeor4_relax() align(16) callconv(.naked) void {1053fn __aarch64_ldeor4_relax() align(16) callconv(.naked) void {
...@@ -1119,8 +1067,7 @@ fn __aarch64_ldeor4_relax() align(16) callconv(.naked) void {...@@ -1119,8 +1067,7 @@ fn __aarch64_ldeor4_relax() align(16) callconv(.naked) void {
1119 \\ ret1067 \\ ret
1120 :1068 :
1121 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1069 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1122 : "w15", "w16", "w17", "memory"1070 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1123 );
1124 unreachable;1071 unreachable;
1125}1072}
1126fn __aarch64_ldset4_relax() align(16) callconv(.naked) void {1073fn __aarch64_ldset4_relax() align(16) callconv(.naked) void {
...@@ -1140,8 +1087,7 @@ fn __aarch64_ldset4_relax() align(16) callconv(.naked) void {...@@ -1140,8 +1087,7 @@ fn __aarch64_ldset4_relax() align(16) callconv(.naked) void {
1140 \\ ret1087 \\ ret
1141 :1088 :
1142 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1089 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1143 : "w15", "w16", "w17", "memory"1090 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1144 );
1145 unreachable;1091 unreachable;
1146}1092}
1147fn __aarch64_cas4_acq() align(16) callconv(.naked) void {1093fn __aarch64_cas4_acq() align(16) callconv(.naked) void {
...@@ -1162,8 +1108,7 @@ fn __aarch64_cas4_acq() align(16) callconv(.naked) void {...@@ -1162,8 +1108,7 @@ fn __aarch64_cas4_acq() align(16) callconv(.naked) void {
1162 \\ ret1108 \\ ret
1163 :1109 :
1164 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1110 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1165 : "w15", "w16", "w17", "memory"1111 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1166 );
1167 unreachable;1112 unreachable;
1168}1113}
1169fn __aarch64_swp4_acq() align(16) callconv(.naked) void {1114fn __aarch64_swp4_acq() align(16) callconv(.naked) void {
...@@ -1182,8 +1127,7 @@ fn __aarch64_swp4_acq() align(16) callconv(.naked) void {...@@ -1182,8 +1127,7 @@ fn __aarch64_swp4_acq() align(16) callconv(.naked) void {
1182 \\ ret1127 \\ ret
1183 :1128 :
1184 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1129 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1185 : "w15", "w16", "w17", "memory"1130 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1186 );
1187 unreachable;1131 unreachable;
1188}1132}
1189fn __aarch64_ldadd4_acq() align(16) callconv(.naked) void {1133fn __aarch64_ldadd4_acq() align(16) callconv(.naked) void {
...@@ -1203,8 +1147,7 @@ fn __aarch64_ldadd4_acq() align(16) callconv(.naked) void {...@@ -1203,8 +1147,7 @@ fn __aarch64_ldadd4_acq() align(16) callconv(.naked) void {
1203 \\ ret1147 \\ ret
1204 :1148 :
1205 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1149 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1206 : "w15", "w16", "w17", "memory"1150 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1207 );
1208 unreachable;1151 unreachable;
1209}1152}
1210fn __aarch64_ldclr4_acq() align(16) callconv(.naked) void {1153fn __aarch64_ldclr4_acq() align(16) callconv(.naked) void {
...@@ -1224,8 +1167,7 @@ fn __aarch64_ldclr4_acq() align(16) callconv(.naked) void {...@@ -1224,8 +1167,7 @@ fn __aarch64_ldclr4_acq() align(16) callconv(.naked) void {
1224 \\ ret1167 \\ ret
1225 :1168 :
1226 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1169 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1227 : "w15", "w16", "w17", "memory"1170 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1228 );
1229 unreachable;1171 unreachable;
1230}1172}
1231fn __aarch64_ldeor4_acq() align(16) callconv(.naked) void {1173fn __aarch64_ldeor4_acq() align(16) callconv(.naked) void {
...@@ -1245,8 +1187,7 @@ fn __aarch64_ldeor4_acq() align(16) callconv(.naked) void {...@@ -1245,8 +1187,7 @@ fn __aarch64_ldeor4_acq() align(16) callconv(.naked) void {
1245 \\ ret1187 \\ ret
1246 :1188 :
1247 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1189 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1248 : "w15", "w16", "w17", "memory"1190 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1249 );
1250 unreachable;1191 unreachable;
1251}1192}
1252fn __aarch64_ldset4_acq() align(16) callconv(.naked) void {1193fn __aarch64_ldset4_acq() align(16) callconv(.naked) void {
...@@ -1266,8 +1207,7 @@ fn __aarch64_ldset4_acq() align(16) callconv(.naked) void {...@@ -1266,8 +1207,7 @@ fn __aarch64_ldset4_acq() align(16) callconv(.naked) void {
1266 \\ ret1207 \\ ret
1267 :1208 :
1268 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1209 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1269 : "w15", "w16", "w17", "memory"1210 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1270 );
1271 unreachable;1211 unreachable;
1272}1212}
1273fn __aarch64_cas4_rel() align(16) callconv(.naked) void {1213fn __aarch64_cas4_rel() align(16) callconv(.naked) void {
...@@ -1288,8 +1228,7 @@ fn __aarch64_cas4_rel() align(16) callconv(.naked) void {...@@ -1288,8 +1228,7 @@ fn __aarch64_cas4_rel() align(16) callconv(.naked) void {
1288 \\ ret1228 \\ ret
1289 :1229 :
1290 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1230 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1291 : "w15", "w16", "w17", "memory"1231 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1292 );
1293 unreachable;1232 unreachable;
1294}1233}
1295fn __aarch64_swp4_rel() align(16) callconv(.naked) void {1234fn __aarch64_swp4_rel() align(16) callconv(.naked) void {
...@@ -1308,8 +1247,7 @@ fn __aarch64_swp4_rel() align(16) callconv(.naked) void {...@@ -1308,8 +1247,7 @@ fn __aarch64_swp4_rel() align(16) callconv(.naked) void {
1308 \\ ret1247 \\ ret
1309 :1248 :
1310 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1249 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1311 : "w15", "w16", "w17", "memory"1250 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1312 );
1313 unreachable;1251 unreachable;
1314}1252}
1315fn __aarch64_ldadd4_rel() align(16) callconv(.naked) void {1253fn __aarch64_ldadd4_rel() align(16) callconv(.naked) void {
...@@ -1329,8 +1267,7 @@ fn __aarch64_ldadd4_rel() align(16) callconv(.naked) void {...@@ -1329,8 +1267,7 @@ fn __aarch64_ldadd4_rel() align(16) callconv(.naked) void {
1329 \\ ret1267 \\ ret
1330 :1268 :
1331 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1269 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1332 : "w15", "w16", "w17", "memory"1270 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1333 );
1334 unreachable;1271 unreachable;
1335}1272}
1336fn __aarch64_ldclr4_rel() align(16) callconv(.naked) void {1273fn __aarch64_ldclr4_rel() align(16) callconv(.naked) void {
...@@ -1350,8 +1287,7 @@ fn __aarch64_ldclr4_rel() align(16) callconv(.naked) void {...@@ -1350,8 +1287,7 @@ fn __aarch64_ldclr4_rel() align(16) callconv(.naked) void {
1350 \\ ret1287 \\ ret
1351 :1288 :
1352 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1289 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1353 : "w15", "w16", "w17", "memory"1290 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1354 );
1355 unreachable;1291 unreachable;
1356}1292}
1357fn __aarch64_ldeor4_rel() align(16) callconv(.naked) void {1293fn __aarch64_ldeor4_rel() align(16) callconv(.naked) void {
...@@ -1371,8 +1307,7 @@ fn __aarch64_ldeor4_rel() align(16) callconv(.naked) void {...@@ -1371,8 +1307,7 @@ fn __aarch64_ldeor4_rel() align(16) callconv(.naked) void {
1371 \\ ret1307 \\ ret
1372 :1308 :
1373 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1309 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1374 : "w15", "w16", "w17", "memory"1310 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1375 );
1376 unreachable;1311 unreachable;
1377}1312}
1378fn __aarch64_ldset4_rel() align(16) callconv(.naked) void {1313fn __aarch64_ldset4_rel() align(16) callconv(.naked) void {
...@@ -1392,8 +1327,7 @@ fn __aarch64_ldset4_rel() align(16) callconv(.naked) void {...@@ -1392,8 +1327,7 @@ fn __aarch64_ldset4_rel() align(16) callconv(.naked) void {
1392 \\ ret1327 \\ ret
1393 :1328 :
1394 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1329 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1395 : "w15", "w16", "w17", "memory"1330 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1396 );
1397 unreachable;1331 unreachable;
1398}1332}
1399fn __aarch64_cas4_acq_rel() align(16) callconv(.naked) void {1333fn __aarch64_cas4_acq_rel() align(16) callconv(.naked) void {
...@@ -1414,8 +1348,7 @@ fn __aarch64_cas4_acq_rel() align(16) callconv(.naked) void {...@@ -1414,8 +1348,7 @@ fn __aarch64_cas4_acq_rel() align(16) callconv(.naked) void {
1414 \\ ret1348 \\ ret
1415 :1349 :
1416 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1350 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1417 : "w15", "w16", "w17", "memory"1351 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1418 );
1419 unreachable;1352 unreachable;
1420}1353}
1421fn __aarch64_swp4_acq_rel() align(16) callconv(.naked) void {1354fn __aarch64_swp4_acq_rel() align(16) callconv(.naked) void {
...@@ -1434,8 +1367,7 @@ fn __aarch64_swp4_acq_rel() align(16) callconv(.naked) void {...@@ -1434,8 +1367,7 @@ fn __aarch64_swp4_acq_rel() align(16) callconv(.naked) void {
1434 \\ ret1367 \\ ret
1435 :1368 :
1436 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1369 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1437 : "w15", "w16", "w17", "memory"1370 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1438 );
1439 unreachable;1371 unreachable;
1440}1372}
1441fn __aarch64_ldadd4_acq_rel() align(16) callconv(.naked) void {1373fn __aarch64_ldadd4_acq_rel() align(16) callconv(.naked) void {
...@@ -1455,8 +1387,7 @@ fn __aarch64_ldadd4_acq_rel() align(16) callconv(.naked) void {...@@ -1455,8 +1387,7 @@ fn __aarch64_ldadd4_acq_rel() align(16) callconv(.naked) void {
1455 \\ ret1387 \\ ret
1456 :1388 :
1457 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1389 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1458 : "w15", "w16", "w17", "memory"1390 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1459 );
1460 unreachable;1391 unreachable;
1461}1392}
1462fn __aarch64_ldclr4_acq_rel() align(16) callconv(.naked) void {1393fn __aarch64_ldclr4_acq_rel() align(16) callconv(.naked) void {
...@@ -1476,8 +1407,7 @@ fn __aarch64_ldclr4_acq_rel() align(16) callconv(.naked) void {...@@ -1476,8 +1407,7 @@ fn __aarch64_ldclr4_acq_rel() align(16) callconv(.naked) void {
1476 \\ ret1407 \\ ret
1477 :1408 :
1478 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1409 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1479 : "w15", "w16", "w17", "memory"1410 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1480 );
1481 unreachable;1411 unreachable;
1482}1412}
1483fn __aarch64_ldeor4_acq_rel() align(16) callconv(.naked) void {1413fn __aarch64_ldeor4_acq_rel() align(16) callconv(.naked) void {
...@@ -1497,8 +1427,7 @@ fn __aarch64_ldeor4_acq_rel() align(16) callconv(.naked) void {...@@ -1497,8 +1427,7 @@ fn __aarch64_ldeor4_acq_rel() align(16) callconv(.naked) void {
1497 \\ ret1427 \\ ret
1498 :1428 :
1499 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1429 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1500 : "w15", "w16", "w17", "memory"1430 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1501 );
1502 unreachable;1431 unreachable;
1503}1432}
1504fn __aarch64_ldset4_acq_rel() align(16) callconv(.naked) void {1433fn __aarch64_ldset4_acq_rel() align(16) callconv(.naked) void {
...@@ -1518,8 +1447,7 @@ fn __aarch64_ldset4_acq_rel() align(16) callconv(.naked) void {...@@ -1518,8 +1447,7 @@ fn __aarch64_ldset4_acq_rel() align(16) callconv(.naked) void {
1518 \\ ret1447 \\ ret
1519 :1448 :
1520 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1449 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1521 : "w15", "w16", "w17", "memory"1450 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1522 );
1523 unreachable;1451 unreachable;
1524}1452}
1525fn __aarch64_cas8_relax() align(16) callconv(.naked) void {1453fn __aarch64_cas8_relax() align(16) callconv(.naked) void {
...@@ -1540,8 +1468,7 @@ fn __aarch64_cas8_relax() align(16) callconv(.naked) void {...@@ -1540,8 +1468,7 @@ fn __aarch64_cas8_relax() align(16) callconv(.naked) void {
1540 \\ ret1468 \\ ret
1541 :1469 :
1542 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1470 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1543 : "w15", "w16", "w17", "memory"1471 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1544 );
1545 unreachable;1472 unreachable;
1546}1473}
1547fn __aarch64_swp8_relax() align(16) callconv(.naked) void {1474fn __aarch64_swp8_relax() align(16) callconv(.naked) void {
...@@ -1560,8 +1487,7 @@ fn __aarch64_swp8_relax() align(16) callconv(.naked) void {...@@ -1560,8 +1487,7 @@ fn __aarch64_swp8_relax() align(16) callconv(.naked) void {
1560 \\ ret1487 \\ ret
1561 :1488 :
1562 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1489 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1563 : "w15", "w16", "w17", "memory"1490 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1564 );
1565 unreachable;1491 unreachable;
1566}1492}
1567fn __aarch64_ldadd8_relax() align(16) callconv(.naked) void {1493fn __aarch64_ldadd8_relax() align(16) callconv(.naked) void {
...@@ -1581,8 +1507,7 @@ fn __aarch64_ldadd8_relax() align(16) callconv(.naked) void {...@@ -1581,8 +1507,7 @@ fn __aarch64_ldadd8_relax() align(16) callconv(.naked) void {
1581 \\ ret1507 \\ ret
1582 :1508 :
1583 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1509 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1584 : "w15", "w16", "w17", "memory"1510 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1585 );
1586 unreachable;1511 unreachable;
1587}1512}
1588fn __aarch64_ldclr8_relax() align(16) callconv(.naked) void {1513fn __aarch64_ldclr8_relax() align(16) callconv(.naked) void {
...@@ -1602,8 +1527,7 @@ fn __aarch64_ldclr8_relax() align(16) callconv(.naked) void {...@@ -1602,8 +1527,7 @@ fn __aarch64_ldclr8_relax() align(16) callconv(.naked) void {
1602 \\ ret1527 \\ ret
1603 :1528 :
1604 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1529 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1605 : "w15", "w16", "w17", "memory"1530 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1606 );
1607 unreachable;1531 unreachable;
1608}1532}
1609fn __aarch64_ldeor8_relax() align(16) callconv(.naked) void {1533fn __aarch64_ldeor8_relax() align(16) callconv(.naked) void {
...@@ -1623,8 +1547,7 @@ fn __aarch64_ldeor8_relax() align(16) callconv(.naked) void {...@@ -1623,8 +1547,7 @@ fn __aarch64_ldeor8_relax() align(16) callconv(.naked) void {
1623 \\ ret1547 \\ ret
1624 :1548 :
1625 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1549 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1626 : "w15", "w16", "w17", "memory"1550 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1627 );
1628 unreachable;1551 unreachable;
1629}1552}
1630fn __aarch64_ldset8_relax() align(16) callconv(.naked) void {1553fn __aarch64_ldset8_relax() align(16) callconv(.naked) void {
...@@ -1644,8 +1567,7 @@ fn __aarch64_ldset8_relax() align(16) callconv(.naked) void {...@@ -1644,8 +1567,7 @@ fn __aarch64_ldset8_relax() align(16) callconv(.naked) void {
1644 \\ ret1567 \\ ret
1645 :1568 :
1646 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1569 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1647 : "w15", "w16", "w17", "memory"1570 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1648 );
1649 unreachable;1571 unreachable;
1650}1572}
1651fn __aarch64_cas8_acq() align(16) callconv(.naked) void {1573fn __aarch64_cas8_acq() align(16) callconv(.naked) void {
...@@ -1666,8 +1588,7 @@ fn __aarch64_cas8_acq() align(16) callconv(.naked) void {...@@ -1666,8 +1588,7 @@ fn __aarch64_cas8_acq() align(16) callconv(.naked) void {
1666 \\ ret1588 \\ ret
1667 :1589 :
1668 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1590 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1669 : "w15", "w16", "w17", "memory"1591 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1670 );
1671 unreachable;1592 unreachable;
1672}1593}
1673fn __aarch64_swp8_acq() align(16) callconv(.naked) void {1594fn __aarch64_swp8_acq() align(16) callconv(.naked) void {
...@@ -1686,8 +1607,7 @@ fn __aarch64_swp8_acq() align(16) callconv(.naked) void {...@@ -1686,8 +1607,7 @@ fn __aarch64_swp8_acq() align(16) callconv(.naked) void {
1686 \\ ret1607 \\ ret
1687 :1608 :
1688 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1609 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1689 : "w15", "w16", "w17", "memory"1610 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1690 );
1691 unreachable;1611 unreachable;
1692}1612}
1693fn __aarch64_ldadd8_acq() align(16) callconv(.naked) void {1613fn __aarch64_ldadd8_acq() align(16) callconv(.naked) void {
...@@ -1707,8 +1627,7 @@ fn __aarch64_ldadd8_acq() align(16) callconv(.naked) void {...@@ -1707,8 +1627,7 @@ fn __aarch64_ldadd8_acq() align(16) callconv(.naked) void {
1707 \\ ret1627 \\ ret
1708 :1628 :
1709 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1629 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1710 : "w15", "w16", "w17", "memory"1630 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1711 );
1712 unreachable;1631 unreachable;
1713}1632}
1714fn __aarch64_ldclr8_acq() align(16) callconv(.naked) void {1633fn __aarch64_ldclr8_acq() align(16) callconv(.naked) void {
...@@ -1728,8 +1647,7 @@ fn __aarch64_ldclr8_acq() align(16) callconv(.naked) void {...@@ -1728,8 +1647,7 @@ fn __aarch64_ldclr8_acq() align(16) callconv(.naked) void {
1728 \\ ret1647 \\ ret
1729 :1648 :
1730 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1649 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1731 : "w15", "w16", "w17", "memory"1650 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1732 );
1733 unreachable;1651 unreachable;
1734}1652}
1735fn __aarch64_ldeor8_acq() align(16) callconv(.naked) void {1653fn __aarch64_ldeor8_acq() align(16) callconv(.naked) void {
...@@ -1749,8 +1667,7 @@ fn __aarch64_ldeor8_acq() align(16) callconv(.naked) void {...@@ -1749,8 +1667,7 @@ fn __aarch64_ldeor8_acq() align(16) callconv(.naked) void {
1749 \\ ret1667 \\ ret
1750 :1668 :
1751 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1669 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1752 : "w15", "w16", "w17", "memory"1670 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1753 );
1754 unreachable;1671 unreachable;
1755}1672}
1756fn __aarch64_ldset8_acq() align(16) callconv(.naked) void {1673fn __aarch64_ldset8_acq() align(16) callconv(.naked) void {
...@@ -1770,8 +1687,7 @@ fn __aarch64_ldset8_acq() align(16) callconv(.naked) void {...@@ -1770,8 +1687,7 @@ fn __aarch64_ldset8_acq() align(16) callconv(.naked) void {
1770 \\ ret1687 \\ ret
1771 :1688 :
1772 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1689 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1773 : "w15", "w16", "w17", "memory"1690 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1774 );
1775 unreachable;1691 unreachable;
1776}1692}
1777fn __aarch64_cas8_rel() align(16) callconv(.naked) void {1693fn __aarch64_cas8_rel() align(16) callconv(.naked) void {
...@@ -1792,8 +1708,7 @@ fn __aarch64_cas8_rel() align(16) callconv(.naked) void {...@@ -1792,8 +1708,7 @@ fn __aarch64_cas8_rel() align(16) callconv(.naked) void {
1792 \\ ret1708 \\ ret
1793 :1709 :
1794 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1710 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1795 : "w15", "w16", "w17", "memory"1711 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1796 );
1797 unreachable;1712 unreachable;
1798}1713}
1799fn __aarch64_swp8_rel() align(16) callconv(.naked) void {1714fn __aarch64_swp8_rel() align(16) callconv(.naked) void {
...@@ -1812,8 +1727,7 @@ fn __aarch64_swp8_rel() align(16) callconv(.naked) void {...@@ -1812,8 +1727,7 @@ fn __aarch64_swp8_rel() align(16) callconv(.naked) void {
1812 \\ ret1727 \\ ret
1813 :1728 :
1814 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1729 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1815 : "w15", "w16", "w17", "memory"1730 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1816 );
1817 unreachable;1731 unreachable;
1818}1732}
1819fn __aarch64_ldadd8_rel() align(16) callconv(.naked) void {1733fn __aarch64_ldadd8_rel() align(16) callconv(.naked) void {
...@@ -1833,8 +1747,7 @@ fn __aarch64_ldadd8_rel() align(16) callconv(.naked) void {...@@ -1833,8 +1747,7 @@ fn __aarch64_ldadd8_rel() align(16) callconv(.naked) void {
1833 \\ ret1747 \\ ret
1834 :1748 :
1835 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1749 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1836 : "w15", "w16", "w17", "memory"1750 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1837 );
1838 unreachable;1751 unreachable;
1839}1752}
1840fn __aarch64_ldclr8_rel() align(16) callconv(.naked) void {1753fn __aarch64_ldclr8_rel() align(16) callconv(.naked) void {
...@@ -1854,8 +1767,7 @@ fn __aarch64_ldclr8_rel() align(16) callconv(.naked) void {...@@ -1854,8 +1767,7 @@ fn __aarch64_ldclr8_rel() align(16) callconv(.naked) void {
1854 \\ ret1767 \\ ret
1855 :1768 :
1856 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1769 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1857 : "w15", "w16", "w17", "memory"1770 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1858 );
1859 unreachable;1771 unreachable;
1860}1772}
1861fn __aarch64_ldeor8_rel() align(16) callconv(.naked) void {1773fn __aarch64_ldeor8_rel() align(16) callconv(.naked) void {
...@@ -1875,8 +1787,7 @@ fn __aarch64_ldeor8_rel() align(16) callconv(.naked) void {...@@ -1875,8 +1787,7 @@ fn __aarch64_ldeor8_rel() align(16) callconv(.naked) void {
1875 \\ ret1787 \\ ret
1876 :1788 :
1877 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1789 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1878 : "w15", "w16", "w17", "memory"1790 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1879 );
1880 unreachable;1791 unreachable;
1881}1792}
1882fn __aarch64_ldset8_rel() align(16) callconv(.naked) void {1793fn __aarch64_ldset8_rel() align(16) callconv(.naked) void {
...@@ -1896,8 +1807,7 @@ fn __aarch64_ldset8_rel() align(16) callconv(.naked) void {...@@ -1896,8 +1807,7 @@ fn __aarch64_ldset8_rel() align(16) callconv(.naked) void {
1896 \\ ret1807 \\ ret
1897 :1808 :
1898 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1809 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1899 : "w15", "w16", "w17", "memory"1810 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1900 );
1901 unreachable;1811 unreachable;
1902}1812}
1903fn __aarch64_cas8_acq_rel() align(16) callconv(.naked) void {1813fn __aarch64_cas8_acq_rel() align(16) callconv(.naked) void {
...@@ -1918,8 +1828,7 @@ fn __aarch64_cas8_acq_rel() align(16) callconv(.naked) void {...@@ -1918,8 +1828,7 @@ fn __aarch64_cas8_acq_rel() align(16) callconv(.naked) void {
1918 \\ ret1828 \\ ret
1919 :1829 :
1920 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1830 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1921 : "w15", "w16", "w17", "memory"1831 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1922 );
1923 unreachable;1832 unreachable;
1924}1833}
1925fn __aarch64_swp8_acq_rel() align(16) callconv(.naked) void {1834fn __aarch64_swp8_acq_rel() align(16) callconv(.naked) void {
...@@ -1938,8 +1847,7 @@ fn __aarch64_swp8_acq_rel() align(16) callconv(.naked) void {...@@ -1938,8 +1847,7 @@ fn __aarch64_swp8_acq_rel() align(16) callconv(.naked) void {
1938 \\ ret1847 \\ ret
1939 :1848 :
1940 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1849 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1941 : "w15", "w16", "w17", "memory"1850 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1942 );
1943 unreachable;1851 unreachable;
1944}1852}
1945fn __aarch64_ldadd8_acq_rel() align(16) callconv(.naked) void {1853fn __aarch64_ldadd8_acq_rel() align(16) callconv(.naked) void {
...@@ -1959,8 +1867,7 @@ fn __aarch64_ldadd8_acq_rel() align(16) callconv(.naked) void {...@@ -1959,8 +1867,7 @@ fn __aarch64_ldadd8_acq_rel() align(16) callconv(.naked) void {
1959 \\ ret1867 \\ ret
1960 :1868 :
1961 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1869 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1962 : "w15", "w16", "w17", "memory"1870 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1963 );
1964 unreachable;1871 unreachable;
1965}1872}
1966fn __aarch64_ldclr8_acq_rel() align(16) callconv(.naked) void {1873fn __aarch64_ldclr8_acq_rel() align(16) callconv(.naked) void {
...@@ -1980,8 +1887,7 @@ fn __aarch64_ldclr8_acq_rel() align(16) callconv(.naked) void {...@@ -1980,8 +1887,7 @@ fn __aarch64_ldclr8_acq_rel() align(16) callconv(.naked) void {
1980 \\ ret1887 \\ ret
1981 :1888 :
1982 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1889 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1983 : "w15", "w16", "w17", "memory"1890 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1984 );
1985 unreachable;1891 unreachable;
1986}1892}
1987fn __aarch64_ldeor8_acq_rel() align(16) callconv(.naked) void {1893fn __aarch64_ldeor8_acq_rel() align(16) callconv(.naked) void {
...@@ -2001,8 +1907,7 @@ fn __aarch64_ldeor8_acq_rel() align(16) callconv(.naked) void {...@@ -2001,8 +1907,7 @@ fn __aarch64_ldeor8_acq_rel() align(16) callconv(.naked) void {
2001 \\ ret1907 \\ ret
2002 :1908 :
2003 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1909 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2004 : "w15", "w16", "w17", "memory"1910 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
2005 );
2006 unreachable;1911 unreachable;
2007}1912}
2008fn __aarch64_ldset8_acq_rel() align(16) callconv(.naked) void {1913fn __aarch64_ldset8_acq_rel() align(16) callconv(.naked) void {
...@@ -2022,8 +1927,7 @@ fn __aarch64_ldset8_acq_rel() align(16) callconv(.naked) void {...@@ -2022,8 +1927,7 @@ fn __aarch64_ldset8_acq_rel() align(16) callconv(.naked) void {
2022 \\ ret1927 \\ ret
2023 :1928 :
2024 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1929 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2025 : "w15", "w16", "w17", "memory"1930 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
2026 );
2027 unreachable;1931 unreachable;
2028}1932}
2029fn __aarch64_cas16_relax() align(16) callconv(.naked) void {1933fn __aarch64_cas16_relax() align(16) callconv(.naked) void {
...@@ -2046,8 +1950,7 @@ fn __aarch64_cas16_relax() align(16) callconv(.naked) void {...@@ -2046,8 +1950,7 @@ fn __aarch64_cas16_relax() align(16) callconv(.naked) void {
2046 \\ ret1950 \\ ret
2047 :1951 :
2048 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1952 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2049 : "w15", "w16", "w17", "memory"1953 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
2050 );
2051 unreachable;1954 unreachable;
2052}1955}
2053fn __aarch64_cas16_acq() align(16) callconv(.naked) void {1956fn __aarch64_cas16_acq() align(16) callconv(.naked) void {
...@@ -2070,8 +1973,7 @@ fn __aarch64_cas16_acq() align(16) callconv(.naked) void {...@@ -2070,8 +1973,7 @@ fn __aarch64_cas16_acq() align(16) callconv(.naked) void {
2070 \\ ret1973 \\ ret
2071 :1974 :
2072 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1975 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2073 : "w15", "w16", "w17", "memory"1976 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
2074 );
2075 unreachable;1977 unreachable;
2076}1978}
2077fn __aarch64_cas16_rel() align(16) callconv(.naked) void {1979fn __aarch64_cas16_rel() align(16) callconv(.naked) void {
...@@ -2094,8 +1996,7 @@ fn __aarch64_cas16_rel() align(16) callconv(.naked) void {...@@ -2094,8 +1996,7 @@ fn __aarch64_cas16_rel() align(16) callconv(.naked) void {
2094 \\ ret1996 \\ ret
2095 :1997 :
2096 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),1998 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2097 : "w15", "w16", "w17", "memory"1999 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
2098 );
2099 unreachable;2000 unreachable;
2100}2001}
2101fn __aarch64_cas16_acq_rel() align(16) callconv(.naked) void {2002fn __aarch64_cas16_acq_rel() align(16) callconv(.naked) void {
...@@ -2118,8 +2019,7 @@ fn __aarch64_cas16_acq_rel() align(16) callconv(.naked) void {...@@ -2118,8 +2019,7 @@ fn __aarch64_cas16_acq_rel() align(16) callconv(.naked) void {
2118 \\ ret2019 \\ ret
2119 :2020 :
2120 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),2021 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2121 : "w15", "w16", "w17", "memory"2022 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
2122 );
2123 unreachable;2023 unreachable;
2124}2024}
21252025
lib/compiler_rt/arm.zig+4-8
...@@ -142,8 +142,7 @@ pub fn __aeabi_uidivmod() callconv(.naked) void {...@@ -142,8 +142,7 @@ pub fn __aeabi_uidivmod() callconv(.naked) void {
142 \\ pop {pc}142 \\ pop {pc}
143 :143 :
144 : [__udivmodsi4] "X" (&__udivmodsi4),144 : [__udivmodsi4] "X" (&__udivmodsi4),
145 : "memory"145 : .{ .memory = true });
146 );
147 unreachable;146 unreachable;
148}147}
149148
...@@ -162,8 +161,7 @@ pub fn __aeabi_uldivmod() callconv(.naked) void {...@@ -162,8 +161,7 @@ pub fn __aeabi_uldivmod() callconv(.naked) void {
162 \\ pop {r4, pc}161 \\ pop {r4, pc}
163 :162 :
164 : [__udivmoddi4] "X" (&__udivmoddi4),163 : [__udivmoddi4] "X" (&__udivmoddi4),
165 : "memory"164 : .{ .memory = true });
166 );
167 unreachable;165 unreachable;
168}166}
169167
...@@ -180,8 +178,7 @@ pub fn __aeabi_idivmod() callconv(.naked) void {...@@ -180,8 +178,7 @@ pub fn __aeabi_idivmod() callconv(.naked) void {
180 \\ pop {pc}178 \\ pop {pc}
181 :179 :
182 : [__divmodsi4] "X" (&__divmodsi4),180 : [__divmodsi4] "X" (&__divmodsi4),
183 : "memory"181 : .{ .memory = true });
184 );
185 unreachable;182 unreachable;
186}183}
187184
...@@ -200,8 +197,7 @@ pub fn __aeabi_ldivmod() callconv(.naked) void {...@@ -200,8 +197,7 @@ pub fn __aeabi_ldivmod() callconv(.naked) void {
200 \\ pop {r4, pc}197 \\ pop {r4, pc}
201 :198 :
202 : [__divmoddi4] "X" (&__divmoddi4),199 : [__divmoddi4] "X" (&__divmoddi4),
203 : "memory"200 : .{ .memory = true });
204 );
205 unreachable;201 unreachable;
206}202}
207203
lib/compiler_rt/atomics.zig+2-4
...@@ -71,8 +71,7 @@ const SpinlockTable = struct {...@@ -71,8 +71,7 @@ const SpinlockTable = struct {
71 break :flag asm volatile ("ldstub [%[addr]], %[flag]"71 break :flag asm volatile ("ldstub [%[addr]], %[flag]"
72 : [flag] "=r" (-> @TypeOf(self.v)),72 : [flag] "=r" (-> @TypeOf(self.v)),
73 : [addr] "r" (&self.v),73 : [addr] "r" (&self.v),
74 : "memory"74 : .{ .memory = true });
75 );
76 } else flag: {75 } else flag: {
77 break :flag @atomicRmw(@TypeOf(self.v), &self.v, .Xchg, .Locked, .acquire);76 break :flag @atomicRmw(@TypeOf(self.v), &self.v, .Xchg, .Locked, .acquire);
78 };77 };
...@@ -88,8 +87,7 @@ const SpinlockTable = struct {...@@ -88,8 +87,7 @@ const SpinlockTable = struct {
88 _ = asm volatile ("clrb [%[addr]]"87 _ = asm volatile ("clrb [%[addr]]"
89 :88 :
90 : [addr] "r" (&self.v),89 : [addr] "r" (&self.v),
91 : "memory"90 : .{ .memory = true });
92 );
93 } else {91 } else {
94 @atomicStore(@TypeOf(self.v), &self.v, .Unlocked, .release);92 @atomicStore(@TypeOf(self.v), &self.v, .Unlocked, .release);
95 }93 }
lib/compiler_rt/clear_cache.zig+1-2
...@@ -103,8 +103,7 @@ fn clear_cache(start: usize, end: usize) callconv(.c) void {...@@ -103,8 +103,7 @@ fn clear_cache(start: usize, end: usize) callconv(.c) void {
103 : [_] "{$2}" (165), // nr = SYS_sysarch103 : [_] "{$2}" (165), // nr = SYS_sysarch
104 [_] "{$4}" (0), // op = MIPS_CACHEFLUSH104 [_] "{$4}" (0), // op = MIPS_CACHEFLUSH
105 [_] "{$5}" (&cfa), // args = &cfa105 [_] "{$5}" (&cfa), // args = &cfa
106 : "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"106 : .{ .r1 = true, .r2 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
107 );
108 exportIt();107 exportIt();
109 } else if (mips and os == .openbsd) {108 } else if (mips and os == .openbsd) {
110 // TODO109 // TODO
lib/docs/wasm/Walk.zig+2
...@@ -787,6 +787,8 @@ fn expr(w: *Walk, scope: *Scope, parent_decl: Decl.Index, node: Ast.Node.Index)...@@ -787,6 +787,8 @@ fn expr(w: *Walk, scope: *Scope, parent_decl: Decl.Index, node: Ast.Node.Index)
787 try expr(w, scope, parent_decl, full.ast.template);787 try expr(w, scope, parent_decl, full.ast.template);
788 },788 },
789789
790 .asm_legacy => {},
791
790 .builtin_call_two,792 .builtin_call_two,
791 .builtin_call_two_comma,793 .builtin_call_two_comma,
792 .builtin_call,794 .builtin_call,
lib/std/Thread.zig+12-24
...@@ -1198,8 +1198,7 @@ const LinuxThreadImpl = struct {...@@ -1198,8 +1198,7 @@ const LinuxThreadImpl = struct {
1198 :1198 :
1199 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1199 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1200 [len] "r" (self.mapped.len),1200 [len] "r" (self.mapped.len),
1201 : "memory"1201 : .{ .memory = true }),
1202 ),
1203 .x86_64 => asm volatile (1202 .x86_64 => asm volatile (
1204 \\ movq $11, %%rax # SYS_munmap1203 \\ movq $11, %%rax # SYS_munmap
1205 \\ syscall1204 \\ syscall
...@@ -1221,8 +1220,7 @@ const LinuxThreadImpl = struct {...@@ -1221,8 +1220,7 @@ const LinuxThreadImpl = struct {
1221 :1220 :
1222 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1221 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1223 [len] "r" (self.mapped.len),1222 [len] "r" (self.mapped.len),
1224 : "memory"1223 : .{ .memory = true }),
1225 ),
1226 .aarch64, .aarch64_be => asm volatile (1224 .aarch64, .aarch64_be => asm volatile (
1227 \\ mov x8, #215 // SYS_munmap1225 \\ mov x8, #215 // SYS_munmap
1228 \\ mov x0, %[ptr]1226 \\ mov x0, %[ptr]
...@@ -1234,8 +1232,7 @@ const LinuxThreadImpl = struct {...@@ -1234,8 +1232,7 @@ const LinuxThreadImpl = struct {
1234 :1232 :
1235 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1233 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1236 [len] "r" (self.mapped.len),1234 [len] "r" (self.mapped.len),
1237 : "memory"1235 : .{ .memory = true }),
1238 ),
1239 .hexagon => asm volatile (1236 .hexagon => asm volatile (
1240 \\ r6 = #215 // SYS_munmap1237 \\ r6 = #215 // SYS_munmap
1241 \\ r0 = %[ptr]1238 \\ r0 = %[ptr]
...@@ -1247,8 +1244,7 @@ const LinuxThreadImpl = struct {...@@ -1247,8 +1244,7 @@ const LinuxThreadImpl = struct {
1247 :1244 :
1248 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1245 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1249 [len] "r" (self.mapped.len),1246 [len] "r" (self.mapped.len),
1250 : "memory"1247 : .{ .memory = true }),
1251 ),
1252 // We set `sp` to the address of the current function as a workaround for a Linux1248 // We set `sp` to the address of the current function as a workaround for a Linux
1253 // kernel bug that caused syscalls to return EFAULT if the stack pointer is invalid.1249 // kernel bug that caused syscalls to return EFAULT if the stack pointer is invalid.
1254 // The bug was introduced in 46e12c07b3b9603c60fc1d421ff18618241cb081 and fixed in1250 // The bug was introduced in 46e12c07b3b9603c60fc1d421ff18618241cb081 and fixed in
...@@ -1265,8 +1261,7 @@ const LinuxThreadImpl = struct {...@@ -1265,8 +1261,7 @@ const LinuxThreadImpl = struct {
1265 :1261 :
1266 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1262 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1267 [len] "r" (self.mapped.len),1263 [len] "r" (self.mapped.len),
1268 : "memory"1264 : .{ .memory = true }),
1269 ),
1270 .mips64, .mips64el => asm volatile (1265 .mips64, .mips64el => asm volatile (
1271 \\ li $2, 5011 # SYS_munmap1266 \\ li $2, 5011 # SYS_munmap
1272 \\ move $4, %[ptr]1267 \\ move $4, %[ptr]
...@@ -1278,8 +1273,7 @@ const LinuxThreadImpl = struct {...@@ -1278,8 +1273,7 @@ const LinuxThreadImpl = struct {
1278 :1273 :
1279 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1274 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1280 [len] "r" (self.mapped.len),1275 [len] "r" (self.mapped.len),
1281 : "memory"1276 : .{ .memory = true }),
1282 ),
1283 .powerpc, .powerpcle, .powerpc64, .powerpc64le => asm volatile (1277 .powerpc, .powerpcle, .powerpc64, .powerpc64le => asm volatile (
1284 \\ li 0, 91 # SYS_munmap1278 \\ li 0, 91 # SYS_munmap
1285 \\ mr 3, %[ptr]1279 \\ mr 3, %[ptr]
...@@ -1292,8 +1286,7 @@ const LinuxThreadImpl = struct {...@@ -1292,8 +1286,7 @@ const LinuxThreadImpl = struct {
1292 :1286 :
1293 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1287 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1294 [len] "r" (self.mapped.len),1288 [len] "r" (self.mapped.len),
1295 : "memory"1289 : .{ .memory = true }),
1296 ),
1297 .riscv32, .riscv64 => asm volatile (1290 .riscv32, .riscv64 => asm volatile (
1298 \\ li a7, 215 # SYS_munmap1291 \\ li a7, 215 # SYS_munmap
1299 \\ mv a0, %[ptr]1292 \\ mv a0, %[ptr]
...@@ -1305,8 +1298,7 @@ const LinuxThreadImpl = struct {...@@ -1305,8 +1298,7 @@ const LinuxThreadImpl = struct {
1305 :1298 :
1306 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1299 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1307 [len] "r" (self.mapped.len),1300 [len] "r" (self.mapped.len),
1308 : "memory"1301 : .{ .memory = true }),
1309 ),
1310 .s390x => asm volatile (1302 .s390x => asm volatile (
1311 \\ lgr %%r2, %[ptr]1303 \\ lgr %%r2, %[ptr]
1312 \\ lgr %%r3, %[len]1304 \\ lgr %%r3, %[len]
...@@ -1316,8 +1308,7 @@ const LinuxThreadImpl = struct {...@@ -1316,8 +1308,7 @@ const LinuxThreadImpl = struct {
1316 :1308 :
1317 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1309 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1318 [len] "r" (self.mapped.len),1310 [len] "r" (self.mapped.len),
1319 : "memory"1311 : .{ .memory = true }),
1320 ),
1321 .sparc => asm volatile (1312 .sparc => asm volatile (
1322 \\ # See sparc64 comments below.1313 \\ # See sparc64 comments below.
1323 \\ 1:1314 \\ 1:
...@@ -1338,8 +1329,7 @@ const LinuxThreadImpl = struct {...@@ -1338,8 +1329,7 @@ const LinuxThreadImpl = struct {
1338 :1329 :
1339 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1330 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1340 [len] "r" (self.mapped.len),1331 [len] "r" (self.mapped.len),
1341 : "memory"1332 : .{ .memory = true }),
1342 ),
1343 .sparc64 => asm volatile (1333 .sparc64 => asm volatile (
1344 \\ # SPARCs really don't like it when active stack frames1334 \\ # SPARCs really don't like it when active stack frames
1345 \\ # is unmapped (it will result in a segfault), so we1335 \\ # is unmapped (it will result in a segfault), so we
...@@ -1365,8 +1355,7 @@ const LinuxThreadImpl = struct {...@@ -1365,8 +1355,7 @@ const LinuxThreadImpl = struct {
1365 :1355 :
1366 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1356 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1367 [len] "r" (self.mapped.len),1357 [len] "r" (self.mapped.len),
1368 : "memory"1358 : .{ .memory = true }),
1369 ),
1370 .loongarch32, .loongarch64 => asm volatile (1359 .loongarch32, .loongarch64 => asm volatile (
1371 \\ or $a0, $zero, %[ptr]1360 \\ or $a0, $zero, %[ptr]
1372 \\ or $a1, $zero, %[len]1361 \\ or $a1, $zero, %[len]
...@@ -1378,8 +1367,7 @@ const LinuxThreadImpl = struct {...@@ -1378,8 +1367,7 @@ const LinuxThreadImpl = struct {
1378 :1367 :
1379 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),1368 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
1380 [len] "r" (self.mapped.len),1369 [len] "r" (self.mapped.len),
1381 : "memory"1370 : .{ .memory = true }),
1382 ),
1383 else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)),1371 else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)),
1384 }1372 }
1385 unreachable;1373 unreachable;
lib/std/builtin.zig+4-3
...@@ -1,6 +1,10 @@...@@ -1,6 +1,10 @@
1//! Types and values provided by the Zig language.1//! Types and values provided by the Zig language.
22
3const builtin = @import("builtin");3const builtin = @import("builtin");
4const std = @import("std.zig");
5const root = @import("root");
6
7pub const assembly = @import("builtin/assembly.zig");
48
5/// `explicit_subsystem` is missing when the subsystem is automatically detected,9/// `explicit_subsystem` is missing when the subsystem is automatically detected,
6/// so Zig standard library has the subsystem detection logic here. This should generally be10/// so Zig standard library has the subsystem detection logic here. This should generally be
...@@ -1100,6 +1104,3 @@ pub noinline fn returnError() void {...@@ -1100,6 +1104,3 @@ pub noinline fn returnError() void {
1100 st.instruction_addresses[st.index] = @returnAddress();1104 st.instruction_addresses[st.index] = @returnAddress();
1101 st.index += 1;1105 st.index += 1;
1102}1106}
1103
1104const std = @import("std.zig");
1105const root = @import("root");
lib/std/builtin/assembly.zig created+2205
...@@ -0,0 +1,2205 @@
1pub const Clobbers = switch (@import("builtin").cpu.arch) {
2 .x86, .x86_64 => packed struct {
3 /// Whether the inline assembly code may perform stores to memory
4 /// addresses other than those derived from input pointer provenance.
5 memory: bool = false,
6
7 /// Condition codes. Subset of the bits in `eflags` and `rflags`.
8 cc: bool = false,
9 dirflag: bool = false,
10 eflags: bool = false,
11 flags: bool = false,
12 fpcr: bool = false,
13 fpsr: bool = false,
14 mxcsr: bool = false,
15 rflags: bool = false,
16
17 rax: bool = false,
18 rcx: bool = false,
19 rdx: bool = false,
20 rbx: bool = false,
21 rsp: bool = false,
22 rbp: bool = false,
23 rsi: bool = false,
24 rdi: bool = false,
25 r8: bool = false,
26 r9: bool = false,
27 r10: bool = false,
28 r11: bool = false,
29 r12: bool = false,
30 r13: bool = false,
31 r14: bool = false,
32 r15: bool = false,
33 eax: bool = false,
34 ecx: bool = false,
35 edx: bool = false,
36 ebx: bool = false,
37 esp: bool = false,
38 ebp: bool = false,
39 esi: bool = false,
40 edi: bool = false,
41 r8d: bool = false,
42 r9d: bool = false,
43 r10d: bool = false,
44 r11d: bool = false,
45 r12d: bool = false,
46 r13d: bool = false,
47 r14d: bool = false,
48 r15d: bool = false,
49 ax: bool = false,
50 cx: bool = false,
51 dx: bool = false,
52 bx: bool = false,
53 sp: bool = false,
54 bp: bool = false,
55 si: bool = false,
56 di: bool = false,
57 r8w: bool = false,
58 r9w: bool = false,
59 r10w: bool = false,
60 r11w: bool = false,
61 r12w: bool = false,
62 r13w: bool = false,
63 r14w: bool = false,
64 r15w: bool = false,
65 al: bool = false,
66 cl: bool = false,
67 dl: bool = false,
68 bl: bool = false,
69 spl: bool = false,
70 bpl: bool = false,
71 sil: bool = false,
72 dil: bool = false,
73 r8b: bool = false,
74 r9b: bool = false,
75 r10b: bool = false,
76 r11b: bool = false,
77 r12b: bool = false,
78 r13b: bool = false,
79 r14b: bool = false,
80 r15b: bool = false,
81 ah: bool = false,
82 ch: bool = false,
83 dh: bool = false,
84 bh: bool = false,
85 zmm0: bool = false,
86 zmm1: bool = false,
87 zmm2: bool = false,
88 zmm3: bool = false,
89 zmm4: bool = false,
90 zmm5: bool = false,
91 zmm6: bool = false,
92 zmm7: bool = false,
93 zmm8: bool = false,
94 zmm9: bool = false,
95 zmm10: bool = false,
96 zmm11: bool = false,
97 zmm12: bool = false,
98 zmm13: bool = false,
99 zmm14: bool = false,
100 zmm15: bool = false,
101 zmm16: bool = false,
102 zmm17: bool = false,
103 zmm18: bool = false,
104 zmm19: bool = false,
105 zmm20: bool = false,
106 zmm21: bool = false,
107 zmm22: bool = false,
108 zmm23: bool = false,
109 zmm24: bool = false,
110 zmm25: bool = false,
111 zmm26: bool = false,
112 zmm27: bool = false,
113 zmm28: bool = false,
114 zmm29: bool = false,
115 zmm30: bool = false,
116 zmm31: bool = false,
117 ymm0: bool = false,
118 ymm1: bool = false,
119 ymm2: bool = false,
120 ymm3: bool = false,
121 ymm4: bool = false,
122 ymm5: bool = false,
123 ymm6: bool = false,
124 ymm7: bool = false,
125 ymm8: bool = false,
126 ymm9: bool = false,
127 ymm10: bool = false,
128 ymm11: bool = false,
129 ymm12: bool = false,
130 ymm13: bool = false,
131 ymm14: bool = false,
132 ymm15: bool = false,
133 ymm16: bool = false,
134 ymm17: bool = false,
135 ymm18: bool = false,
136 ymm19: bool = false,
137 ymm20: bool = false,
138 ymm21: bool = false,
139 ymm22: bool = false,
140 ymm23: bool = false,
141 ymm24: bool = false,
142 ymm25: bool = false,
143 ymm26: bool = false,
144 ymm27: bool = false,
145 ymm28: bool = false,
146 ymm29: bool = false,
147 ymm30: bool = false,
148 ymm31: bool = false,
149 xmm0: bool = false,
150 xmm1: bool = false,
151 xmm2: bool = false,
152 xmm3: bool = false,
153 xmm4: bool = false,
154 xmm5: bool = false,
155 xmm6: bool = false,
156 xmm7: bool = false,
157 xmm8: bool = false,
158 xmm9: bool = false,
159 xmm10: bool = false,
160 xmm11: bool = false,
161 xmm12: bool = false,
162 xmm13: bool = false,
163 xmm14: bool = false,
164 xmm15: bool = false,
165 xmm16: bool = false,
166 xmm17: bool = false,
167 xmm18: bool = false,
168 xmm19: bool = false,
169 xmm20: bool = false,
170 xmm21: bool = false,
171 xmm22: bool = false,
172 xmm23: bool = false,
173 xmm24: bool = false,
174 xmm25: bool = false,
175 xmm26: bool = false,
176 xmm27: bool = false,
177 xmm28: bool = false,
178 xmm29: bool = false,
179 xmm30: bool = false,
180 xmm31: bool = false,
181 mm0: bool = false,
182 mm1: bool = false,
183 mm2: bool = false,
184 mm3: bool = false,
185 mm4: bool = false,
186 mm5: bool = false,
187 mm6: bool = false,
188 mm7: bool = false,
189 st0: bool = false,
190 st1: bool = false,
191 st2: bool = false,
192 st3: bool = false,
193 st4: bool = false,
194 st5: bool = false,
195 st6: bool = false,
196 st7: bool = false,
197 es: bool = false,
198 cs: bool = false,
199 ss: bool = false,
200 ds: bool = false,
201 fs: bool = false,
202 gs: bool = false,
203 },
204 .aarch64, .aarch64_be => packed struct {
205 /// Whether the inline assembly code may perform stores to memory
206 /// addresses other than those derived from input pointer provenance.
207 memory: bool = false,
208
209 nzcv: bool = false,
210
211 x0: bool = false,
212 x1: bool = false,
213 x2: bool = false,
214 x3: bool = false,
215 x4: bool = false,
216 x5: bool = false,
217 x6: bool = false,
218 x7: bool = false,
219 x8: bool = false,
220 x9: bool = false,
221 x10: bool = false,
222 x11: bool = false,
223 x12: bool = false,
224 x13: bool = false,
225 x14: bool = false,
226 x15: bool = false,
227 x16: bool = false,
228 x17: bool = false,
229 x18: bool = false,
230 x19: bool = false,
231 x20: bool = false,
232 x21: bool = false,
233 x22: bool = false,
234 x23: bool = false,
235 x24: bool = false,
236 x25: bool = false,
237 x26: bool = false,
238 x27: bool = false,
239 x28: bool = false,
240 x29: bool = false,
241 x30: bool = false,
242
243 w0: bool = false,
244 w1: bool = false,
245 w2: bool = false,
246 w3: bool = false,
247 w4: bool = false,
248 w5: bool = false,
249 w6: bool = false,
250 w7: bool = false,
251 w8: bool = false,
252 w9: bool = false,
253 w10: bool = false,
254 w11: bool = false,
255 w12: bool = false,
256 w13: bool = false,
257 w14: bool = false,
258 w15: bool = false,
259 w16: bool = false,
260 w17: bool = false,
261 w18: bool = false,
262 w19: bool = false,
263 w20: bool = false,
264 w21: bool = false,
265 w22: bool = false,
266 w23: bool = false,
267 w24: bool = false,
268 w25: bool = false,
269 w26: bool = false,
270 w27: bool = false,
271 w28: bool = false,
272 w29: bool = false,
273
274 lr: bool = false,
275 sp: bool = false,
276 wsp: bool = false,
277 fpcr: bool = false,
278 fpmr: bool = false,
279 fpsr: bool = false,
280 ffr: bool = false,
281
282 p0: bool = false,
283 p1: bool = false,
284 p2: bool = false,
285 p3: bool = false,
286 p4: bool = false,
287 p5: bool = false,
288 p6: bool = false,
289 p7: bool = false,
290 p8: bool = false,
291 p9: bool = false,
292 p10: bool = false,
293 p11: bool = false,
294 p12: bool = false,
295 p13: bool = false,
296 p14: bool = false,
297 p15: bool = false,
298
299 z0: bool = false,
300 z1: bool = false,
301 z2: bool = false,
302 z3: bool = false,
303 z4: bool = false,
304 z5: bool = false,
305 z6: bool = false,
306 z7: bool = false,
307 z8: bool = false,
308 z9: bool = false,
309 z10: bool = false,
310 z11: bool = false,
311 z12: bool = false,
312 z13: bool = false,
313 z14: bool = false,
314 z15: bool = false,
315 z16: bool = false,
316 z17: bool = false,
317 z18: bool = false,
318 z19: bool = false,
319 z20: bool = false,
320 z21: bool = false,
321 z22: bool = false,
322 z23: bool = false,
323 z24: bool = false,
324 z25: bool = false,
325 z26: bool = false,
326 z27: bool = false,
327 z28: bool = false,
328 z29: bool = false,
329 z30: bool = false,
330 z31: bool = false,
331
332 v0: bool = false,
333 v1: bool = false,
334 v2: bool = false,
335 v3: bool = false,
336 v4: bool = false,
337 v5: bool = false,
338 v6: bool = false,
339 v7: bool = false,
340 v8: bool = false,
341 v9: bool = false,
342 v10: bool = false,
343 v11: bool = false,
344 v12: bool = false,
345 v13: bool = false,
346 v14: bool = false,
347 v15: bool = false,
348 v16: bool = false,
349 v17: bool = false,
350 v18: bool = false,
351 v19: bool = false,
352 v20: bool = false,
353 v21: bool = false,
354 v22: bool = false,
355 v23: bool = false,
356 v24: bool = false,
357 v25: bool = false,
358 v26: bool = false,
359 v27: bool = false,
360 v28: bool = false,
361 v29: bool = false,
362 v30: bool = false,
363 v31: bool = false,
364
365 d0: bool = false,
366 d1: bool = false,
367 d2: bool = false,
368 d3: bool = false,
369 d4: bool = false,
370 d5: bool = false,
371 d6: bool = false,
372 d7: bool = false,
373 d8: bool = false,
374 d9: bool = false,
375 d10: bool = false,
376 d11: bool = false,
377 d12: bool = false,
378 d13: bool = false,
379 d14: bool = false,
380 d15: bool = false,
381 d16: bool = false,
382 d17: bool = false,
383 d18: bool = false,
384 d19: bool = false,
385 d20: bool = false,
386 d21: bool = false,
387 d22: bool = false,
388 d23: bool = false,
389 d24: bool = false,
390 d25: bool = false,
391 d26: bool = false,
392 d27: bool = false,
393 d28: bool = false,
394 d29: bool = false,
395 d30: bool = false,
396 d31: bool = false,
397
398 s0: bool = false,
399 s1: bool = false,
400 s2: bool = false,
401 s3: bool = false,
402 s4: bool = false,
403 s5: bool = false,
404 s6: bool = false,
405 s7: bool = false,
406 s8: bool = false,
407 s9: bool = false,
408 s10: bool = false,
409 s11: bool = false,
410 s12: bool = false,
411 s13: bool = false,
412 s14: bool = false,
413 s15: bool = false,
414 s16: bool = false,
415 s17: bool = false,
416 s18: bool = false,
417 s19: bool = false,
418 s20: bool = false,
419 s21: bool = false,
420 s22: bool = false,
421 s23: bool = false,
422 s24: bool = false,
423 s25: bool = false,
424 s26: bool = false,
425 s27: bool = false,
426 s28: bool = false,
427 s29: bool = false,
428 s30: bool = false,
429 s31: bool = false,
430
431 h0: bool = false,
432 h1: bool = false,
433 h2: bool = false,
434 h3: bool = false,
435 h4: bool = false,
436 h5: bool = false,
437 h6: bool = false,
438 h7: bool = false,
439 h8: bool = false,
440 h9: bool = false,
441 h10: bool = false,
442 h11: bool = false,
443 h12: bool = false,
444 h13: bool = false,
445 h14: bool = false,
446 h15: bool = false,
447 h16: bool = false,
448 h17: bool = false,
449 h18: bool = false,
450 h19: bool = false,
451 h20: bool = false,
452 h21: bool = false,
453 h22: bool = false,
454 h23: bool = false,
455 h24: bool = false,
456 h25: bool = false,
457 h26: bool = false,
458 h27: bool = false,
459 h28: bool = false,
460 h29: bool = false,
461 h30: bool = false,
462 h31: bool = false,
463
464 b0: bool = false,
465 b1: bool = false,
466 b2: bool = false,
467 b3: bool = false,
468 b4: bool = false,
469 b5: bool = false,
470 b6: bool = false,
471 b7: bool = false,
472 b8: bool = false,
473 b9: bool = false,
474 b10: bool = false,
475 b11: bool = false,
476 b12: bool = false,
477 b13: bool = false,
478 b14: bool = false,
479 b15: bool = false,
480 b16: bool = false,
481 b17: bool = false,
482 b18: bool = false,
483 b19: bool = false,
484 b20: bool = false,
485 b21: bool = false,
486 b22: bool = false,
487 b23: bool = false,
488 b24: bool = false,
489 b25: bool = false,
490 b26: bool = false,
491 b27: bool = false,
492 b28: bool = false,
493 b29: bool = false,
494 b30: bool = false,
495 b31: bool = false,
496
497 za0q: bool = false,
498 za1q: bool = false,
499 za2q: bool = false,
500 za3q: bool = false,
501 za4q: bool = false,
502 za5q: bool = false,
503 za6q: bool = false,
504 za7q: bool = false,
505 za8q: bool = false,
506 za9q: bool = false,
507 za10q: bool = false,
508 za11q: bool = false,
509 za12q: bool = false,
510 za13q: bool = false,
511 za14q: bool = false,
512 za15q: bool = false,
513
514 za0d: bool = false,
515 za1d: bool = false,
516 za2d: bool = false,
517 za3d: bool = false,
518 za4d: bool = false,
519 za5d: bool = false,
520 za6d: bool = false,
521 za7d: bool = false,
522
523 za0s: bool = false,
524 za1s: bool = false,
525 za2s: bool = false,
526 za3s: bool = false,
527
528 za0h: bool = false,
529 za1h: bool = false,
530 za0b: bool = false,
531
532 zt0: bool = false,
533 },
534 .arm, .armeb, .thumb, .thumbeb => packed struct {
535 /// Whether the inline assembly code may perform stores to memory
536 /// addresses other than those derived from input pointer provenance.
537 memory: bool = false,
538
539 apsr: bool = false,
540 cpsr: bool = false,
541 spsr: bool = false,
542 r0: bool = false,
543 r1: bool = false,
544 r2: bool = false,
545 r3: bool = false,
546 r4: bool = false,
547 r5: bool = false,
548 r6: bool = false,
549 r7: bool = false,
550 r8: bool = false,
551 r9: bool = false,
552 r10: bool = false,
553 r11: bool = false,
554 r12: bool = false,
555 r13: bool = false,
556 r14: bool = false,
557
558 fpscr: bool = false,
559 vpr: bool = false,
560
561 d0: bool = false,
562 d1: bool = false,
563 d2: bool = false,
564 d3: bool = false,
565 d4: bool = false,
566 d5: bool = false,
567 d6: bool = false,
568 d7: bool = false,
569 d8: bool = false,
570 d9: bool = false,
571 d10: bool = false,
572 d11: bool = false,
573 d12: bool = false,
574 d13: bool = false,
575 d14: bool = false,
576 d15: bool = false,
577 d16: bool = false,
578 d17: bool = false,
579 d18: bool = false,
580 d19: bool = false,
581 d20: bool = false,
582 d21: bool = false,
583 d22: bool = false,
584 d23: bool = false,
585 d24: bool = false,
586 d25: bool = false,
587 d26: bool = false,
588 d27: bool = false,
589 d28: bool = false,
590 d29: bool = false,
591 d30: bool = false,
592 d31: bool = false,
593
594 s0: bool = false,
595 s1: bool = false,
596 s2: bool = false,
597 s3: bool = false,
598 s4: bool = false,
599 s5: bool = false,
600 s6: bool = false,
601 s7: bool = false,
602 s8: bool = false,
603 s9: bool = false,
604 s10: bool = false,
605 s11: bool = false,
606 s12: bool = false,
607 s13: bool = false,
608 s14: bool = false,
609 s15: bool = false,
610 s16: bool = false,
611 s17: bool = false,
612 s18: bool = false,
613 s19: bool = false,
614 s20: bool = false,
615 s21: bool = false,
616 s22: bool = false,
617 s23: bool = false,
618 s24: bool = false,
619 s25: bool = false,
620 s26: bool = false,
621 s27: bool = false,
622 s28: bool = false,
623 s29: bool = false,
624 s30: bool = false,
625 s31: bool = false,
626
627 q0: bool = false,
628 q1: bool = false,
629 q2: bool = false,
630 q3: bool = false,
631 q4: bool = false,
632 q5: bool = false,
633 q6: bool = false,
634 q7: bool = false,
635 q8: bool = false,
636 q9: bool = false,
637 q10: bool = false,
638 q11: bool = false,
639 q12: bool = false,
640 q13: bool = false,
641 q14: bool = false,
642 q15: bool = false,
643 },
644 .riscv32, .riscv64 => packed struct {
645 /// Whether the inline assembly code may perform stores to memory
646 /// addresses other than those derived from input pointer provenance.
647 memory: bool = false,
648
649 ssp: bool = false,
650
651 x1: bool = false,
652 x2: bool = false,
653 x3: bool = false,
654 x4: bool = false,
655 x5: bool = false,
656 x6: bool = false,
657 x7: bool = false,
658 x8: bool = false,
659 x9: bool = false,
660 x10: bool = false,
661 x11: bool = false,
662 x12: bool = false,
663 x13: bool = false,
664 x14: bool = false,
665 x15: bool = false,
666 x16: bool = false,
667 x17: bool = false,
668 x18: bool = false,
669 x19: bool = false,
670 x20: bool = false,
671 x21: bool = false,
672 x22: bool = false,
673 x23: bool = false,
674 x24: bool = false,
675 x25: bool = false,
676 x26: bool = false,
677 x27: bool = false,
678 x28: bool = false,
679 x29: bool = false,
680 x30: bool = false,
681 x31: bool = false,
682
683 fflags: bool = false,
684 frm: bool = false,
685
686 f0: bool = false,
687 f1: bool = false,
688 f2: bool = false,
689 f3: bool = false,
690 f4: bool = false,
691 f5: bool = false,
692 f6: bool = false,
693 f7: bool = false,
694 f8: bool = false,
695 f9: bool = false,
696 f10: bool = false,
697 f11: bool = false,
698 f12: bool = false,
699 f13: bool = false,
700 f14: bool = false,
701 f15: bool = false,
702 f16: bool = false,
703 f17: bool = false,
704 f18: bool = false,
705 f19: bool = false,
706 f20: bool = false,
707 f21: bool = false,
708 f22: bool = false,
709 f23: bool = false,
710 f24: bool = false,
711 f25: bool = false,
712 f26: bool = false,
713 f27: bool = false,
714 f28: bool = false,
715 f29: bool = false,
716 f30: bool = false,
717 f31: bool = false,
718
719 vtype: bool = false,
720 vl: bool = false,
721 vxsat: bool = false,
722 vxrm: bool = false,
723 vcsr: bool = false,
724
725 v0: bool = false,
726 v1: bool = false,
727 v2: bool = false,
728 v3: bool = false,
729 v4: bool = false,
730 v5: bool = false,
731 v6: bool = false,
732 v7: bool = false,
733 v8: bool = false,
734 v9: bool = false,
735 v10: bool = false,
736 v11: bool = false,
737 v12: bool = false,
738 v13: bool = false,
739 v14: bool = false,
740 v15: bool = false,
741 v16: bool = false,
742 v17: bool = false,
743 v18: bool = false,
744 v19: bool = false,
745 v20: bool = false,
746 v21: bool = false,
747 v22: bool = false,
748 v23: bool = false,
749 v24: bool = false,
750 v25: bool = false,
751 v26: bool = false,
752 v27: bool = false,
753 v28: bool = false,
754 v29: bool = false,
755 v30: bool = false,
756 v31: bool = false,
757 },
758 .xcore => packed struct {
759 /// Whether the inline assembly code may perform stores to memory
760 /// addresses other than those derived from input pointer provenance.
761 memory: bool = false,
762
763 r0: bool = false,
764 r1: bool = false,
765 r2: bool = false,
766 r3: bool = false,
767 r4: bool = false,
768 r5: bool = false,
769 r6: bool = false,
770 r7: bool = false,
771 r8: bool = false,
772 r9: bool = false,
773 r10: bool = false,
774 r11: bool = false,
775
776 cp: bool = false,
777 dp: bool = false,
778 sp: bool = false,
779 lr: bool = false,
780 sr: bool = false,
781 },
782 .xtensa => packed struct {
783 /// Whether the inline assembly code may perform stores to memory
784 /// addresses other than those derived from input pointer provenance.
785 memory: bool = false,
786
787 sar: bool = false,
788 lbeg: bool = false,
789 lend: bool = false,
790 lcount: bool = false,
791 atomctl: bool = false,
792 scompare1: bool = false,
793 threadptr: bool = false,
794 litbase: bool = false,
795 windowbase: bool = false,
796 windowstart: bool = false,
797 ps: bool = false,
798
799 a0: bool = false,
800 a1: bool = false,
801 a2: bool = false,
802 a3: bool = false,
803 a4: bool = false,
804 a5: bool = false,
805 a6: bool = false,
806 a7: bool = false,
807 a8: bool = false,
808 a9: bool = false,
809 a10: bool = false,
810 a11: bool = false,
811 a12: bool = false,
812 a13: bool = false,
813 a14: bool = false,
814 a15: bool = false,
815
816 br: bool = false,
817 b0: bool = false,
818 b1: bool = false,
819 b2: bool = false,
820 b3: bool = false,
821 b4: bool = false,
822 b5: bool = false,
823 b6: bool = false,
824 b7: bool = false,
825 b8: bool = false,
826 b9: bool = false,
827 b10: bool = false,
828 b11: bool = false,
829 b12: bool = false,
830 b13: bool = false,
831 b14: bool = false,
832 b15: bool = false,
833
834 acchi: bool = false,
835 acclo: bool = false,
836 m0: bool = false,
837 m1: bool = false,
838 m2: bool = false,
839 m3: bool = false,
840 fcr: bool = false,
841 fsr: bool = false,
842
843 f0: bool = false,
844 f1: bool = false,
845 f2: bool = false,
846 f3: bool = false,
847 f4: bool = false,
848 f5: bool = false,
849 f6: bool = false,
850 f7: bool = false,
851 f8: bool = false,
852 f9: bool = false,
853 f10: bool = false,
854 f11: bool = false,
855 f12: bool = false,
856 f13: bool = false,
857 f14: bool = false,
858 f15: bool = false,
859 },
860 .lanai => packed struct {
861 /// Whether the inline assembly code may perform stores to memory
862 /// addresses other than those derived from input pointer provenance.
863 memory: bool = false,
864 /// Condition flags which aren't accessible outside of conditional execution.
865 sw: bool = false,
866
867 r3: bool = false,
868 r4: bool = false,
869 r5: bool = false,
870 r6: bool = false,
871 r7: bool = false,
872 r8: bool = false,
873 r9: bool = false,
874 r10: bool = false,
875 r11: bool = false,
876 r12: bool = false,
877 r13: bool = false,
878 r14: bool = false,
879 r15: bool = false,
880 r16: bool = false,
881 r17: bool = false,
882 r18: bool = false,
883 r19: bool = false,
884 r20: bool = false,
885 r21: bool = false,
886 r22: bool = false,
887 r23: bool = false,
888 r24: bool = false,
889 r25: bool = false,
890 r26: bool = false,
891 r27: bool = false,
892 r28: bool = false,
893 r29: bool = false,
894 r30: bool = false,
895 r31: bool = false,
896 },
897 .avr => packed struct {
898 /// Whether the inline assembly code may perform stores to memory
899 /// addresses other than those derived from input pointer provenance.
900 memory: bool = false,
901 flags: bool = false,
902 r0: bool = false,
903 r1: bool = false,
904 r2: bool = false,
905 r3: bool = false,
906 r4: bool = false,
907 r5: bool = false,
908 r6: bool = false,
909 r7: bool = false,
910 r8: bool = false,
911 r9: bool = false,
912 r10: bool = false,
913 r11: bool = false,
914 r12: bool = false,
915 r13: bool = false,
916 r14: bool = false,
917 r15: bool = false,
918 r16: bool = false,
919 r17: bool = false,
920 r18: bool = false,
921 r19: bool = false,
922 r20: bool = false,
923 r21: bool = false,
924 r22: bool = false,
925 r23: bool = false,
926 r24: bool = false,
927 r25: bool = false,
928 r26: bool = false,
929 r27: bool = false,
930 r28: bool = false,
931 r29: bool = false,
932 r30: bool = false,
933 r31: bool = false,
934 },
935 .msp430 => packed struct {
936 /// Whether the inline assembly code may perform stores to memory
937 /// addresses other than those derived from input pointer provenance.
938 memory: bool = false,
939
940 r0: bool = false,
941 r1: bool = false,
942 r2: bool = false,
943
944 r4: bool = false,
945 r5: bool = false,
946 r6: bool = false,
947 r7: bool = false,
948 r8: bool = false,
949 r9: bool = false,
950 r10: bool = false,
951 r11: bool = false,
952 r12: bool = false,
953 r13: bool = false,
954 r14: bool = false,
955 r15: bool = false,
956 },
957 .m68k => packed struct {
958 /// Whether the inline assembly code may perform stores to memory
959 /// addresses other than those derived from input pointer provenance.
960 memory: bool = false,
961
962 ccr: bool = false,
963
964 d0: bool = false,
965 d1: bool = false,
966 d2: bool = false,
967 d3: bool = false,
968 d4: bool = false,
969 d5: bool = false,
970 d6: bool = false,
971 d7: bool = false,
972
973 a0: bool = false,
974 a1: bool = false,
975 a2: bool = false,
976 a3: bool = false,
977 a4: bool = false,
978 a5: bool = false,
979 a6: bool = false,
980 a7: bool = false,
981
982 macsr: bool = false,
983 acc: bool = false,
984 acc0: bool = false,
985 acc1: bool = false,
986 acc2: bool = false,
987 acc3: bool = false,
988
989 mask: bool = false,
990 fpcr: bool = false,
991 fpsr: bool = false,
992
993 fp0: bool = false,
994 fp1: bool = false,
995 fp2: bool = false,
996 fp3: bool = false,
997 fp4: bool = false,
998 fp5: bool = false,
999 fp6: bool = false,
1000 fp7: bool = false,
1001 },
1002 .sparc, .sparc64 => packed struct {
1003 /// Whether the inline assembly code may perform stores to memory
1004 /// addresses other than those derived from input pointer provenance.
1005 memory: bool = false,
1006
1007 psr: bool = false,
1008 gsr: bool = false,
1009 y: bool = false,
1010
1011 /// asr2; v9+
1012 ccr: bool = false,
1013 /// Lower bits of `ccr`.
1014 icc: bool = false,
1015 /// Upper bits of `ccr`.
1016 xcc: bool = false,
1017
1018 g1: bool = false,
1019 g2: bool = false,
1020 g3: bool = false,
1021 g4: bool = false,
1022 g5: bool = false,
1023 g6: bool = false,
1024 g7: bool = false,
1025
1026 o0: bool = false,
1027 o1: bool = false,
1028 o2: bool = false,
1029 o3: bool = false,
1030 o4: bool = false,
1031 o5: bool = false,
1032 o6: bool = false,
1033 o7: bool = false,
1034
1035 l0: bool = false,
1036 l1: bool = false,
1037 l2: bool = false,
1038 l3: bool = false,
1039 l4: bool = false,
1040 l5: bool = false,
1041 l6: bool = false,
1042 l7: bool = false,
1043
1044 i0: bool = false,
1045 i1: bool = false,
1046 i2: bool = false,
1047 i3: bool = false,
1048 i4: bool = false,
1049 i5: bool = false,
1050 i6: bool = false,
1051 i7: bool = false,
1052
1053 fsr: bool = false,
1054 fprs: bool = false,
1055
1056 q0: bool = false,
1057 q1: bool = false,
1058 q2: bool = false,
1059 q3: bool = false,
1060 q4: bool = false,
1061 q5: bool = false,
1062 q6: bool = false,
1063 q7: bool = false,
1064 q8: bool = false,
1065 q9: bool = false,
1066 q10: bool = false,
1067 q11: bool = false,
1068 q12: bool = false,
1069 q13: bool = false,
1070 q14: bool = false,
1071 q15: bool = false,
1072 },
1073 .bpfel, .bpfeb => packed struct {
1074 /// Whether the inline assembly code may perform stores to memory
1075 /// addresses other than those derived from input pointer provenance.
1076 memory: bool = false,
1077
1078 r0: bool = false,
1079 r1: bool = false,
1080 r2: bool = false,
1081 r3: bool = false,
1082 r4: bool = false,
1083 r5: bool = false,
1084 r6: bool = false,
1085 r7: bool = false,
1086 r8: bool = false,
1087 r9: bool = false,
1088
1089 w0: bool = false,
1090 w1: bool = false,
1091 w2: bool = false,
1092 w3: bool = false,
1093 w4: bool = false,
1094 w5: bool = false,
1095 w6: bool = false,
1096 w7: bool = false,
1097 w8: bool = false,
1098 w9: bool = false,
1099 },
1100 .hexagon => packed struct {
1101 /// Whether the inline assembly code may perform stores to memory
1102 /// addresses other than those derived from input pointer provenance.
1103 memory: bool = false,
1104
1105 sa0: bool = false,
1106 sa1: bool = false,
1107 lc0: bool = false,
1108 lc1: bool = false,
1109 m0: bool = false,
1110 m1: bool = false,
1111 usr: bool = false,
1112 ugp: bool = false,
1113 gp: bool = false,
1114 cs0: bool = false,
1115 cs1: bool = false,
1116 framelimit: bool = false,
1117 framekey: bool = false,
1118
1119 p0: bool = false,
1120 p1: bool = false,
1121 p2: bool = false,
1122 p3: bool = false,
1123
1124 r0: bool = false,
1125 r1: bool = false,
1126 r2: bool = false,
1127 r3: bool = false,
1128 r4: bool = false,
1129 r5: bool = false,
1130 r6: bool = false,
1131 r7: bool = false,
1132 r8: bool = false,
1133 r9: bool = false,
1134 r10: bool = false,
1135 r11: bool = false,
1136 r12: bool = false,
1137 r13: bool = false,
1138 r14: bool = false,
1139 r15: bool = false,
1140 r16: bool = false,
1141 r17: bool = false,
1142 r18: bool = false,
1143 r19: bool = false,
1144 r20: bool = false,
1145 r21: bool = false,
1146 r22: bool = false,
1147 r23: bool = false,
1148 r24: bool = false,
1149 r25: bool = false,
1150 r26: bool = false,
1151 r27: bool = false,
1152 r28: bool = false,
1153 r29: bool = false,
1154 r30: bool = false,
1155 r31: bool = false,
1156
1157 q0: bool = false,
1158 q1: bool = false,
1159 q2: bool = false,
1160 q3: bool = false,
1161
1162 v0: bool = false,
1163 v1: bool = false,
1164 v2: bool = false,
1165 v3: bool = false,
1166 v4: bool = false,
1167 v5: bool = false,
1168 v6: bool = false,
1169 v7: bool = false,
1170 v8: bool = false,
1171 v9: bool = false,
1172 v10: bool = false,
1173 v11: bool = false,
1174 v12: bool = false,
1175 v13: bool = false,
1176 v14: bool = false,
1177 v15: bool = false,
1178 v16: bool = false,
1179 v17: bool = false,
1180 v18: bool = false,
1181 v19: bool = false,
1182 v20: bool = false,
1183 v21: bool = false,
1184 v22: bool = false,
1185 v23: bool = false,
1186 v24: bool = false,
1187 v25: bool = false,
1188 v26: bool = false,
1189 v27: bool = false,
1190 v28: bool = false,
1191 v29: bool = false,
1192 v30: bool = false,
1193 v31: bool = false,
1194 },
1195 .s390x => packed struct {
1196 /// Whether the inline assembly code may perform stores to memory
1197 /// addresses other than those derived from input pointer provenance.
1198 memory: bool = false,
1199
1200 ps: bool = false,
1201 r0: bool = false,
1202 r1: bool = false,
1203 r2: bool = false,
1204 r3: bool = false,
1205 r4: bool = false,
1206 r5: bool = false,
1207 r6: bool = false,
1208 r7: bool = false,
1209 r8: bool = false,
1210 r9: bool = false,
1211 r10: bool = false,
1212 r11: bool = false,
1213 r12: bool = false,
1214 r13: bool = false,
1215 r14: bool = false,
1216 r15: bool = false,
1217
1218 fpc: bool = false,
1219
1220 v0: bool = false,
1221 v1: bool = false,
1222 v2: bool = false,
1223 v3: bool = false,
1224 v4: bool = false,
1225 v5: bool = false,
1226 v6: bool = false,
1227 v7: bool = false,
1228 v8: bool = false,
1229 v9: bool = false,
1230 v10: bool = false,
1231 v11: bool = false,
1232 v12: bool = false,
1233 v13: bool = false,
1234 v14: bool = false,
1235 v15: bool = false,
1236 v16: bool = false,
1237 v17: bool = false,
1238 v18: bool = false,
1239 v19: bool = false,
1240 v20: bool = false,
1241 v21: bool = false,
1242 v22: bool = false,
1243 v23: bool = false,
1244 v24: bool = false,
1245 v25: bool = false,
1246 v26: bool = false,
1247 v27: bool = false,
1248 v28: bool = false,
1249 v29: bool = false,
1250 v30: bool = false,
1251 v31: bool = false,
1252
1253 f0: bool = false,
1254 f1: bool = false,
1255 f2: bool = false,
1256 f3: bool = false,
1257 f4: bool = false,
1258 f5: bool = false,
1259 f6: bool = false,
1260 f7: bool = false,
1261 f8: bool = false,
1262 f9: bool = false,
1263 f10: bool = false,
1264 f11: bool = false,
1265 f12: bool = false,
1266 f13: bool = false,
1267 f14: bool = false,
1268 f15: bool = false,
1269 },
1270 .ve => packed struct {
1271 /// Whether the inline assembly code may perform stores to memory
1272 /// addresses other than those derived from input pointer provenance.
1273 memory: bool = false,
1274
1275 psw: bool = false,
1276
1277 s0: bool = false,
1278 s1: bool = false,
1279 s2: bool = false,
1280 s3: bool = false,
1281 s4: bool = false,
1282 s5: bool = false,
1283 s6: bool = false,
1284 s7: bool = false,
1285 s8: bool = false,
1286 s9: bool = false,
1287 s10: bool = false,
1288 s11: bool = false,
1289 s12: bool = false,
1290 s13: bool = false,
1291 s14: bool = false,
1292 s15: bool = false,
1293 s16: bool = false,
1294 s17: bool = false,
1295 s18: bool = false,
1296 s19: bool = false,
1297 s20: bool = false,
1298 s21: bool = false,
1299 s22: bool = false,
1300 s23: bool = false,
1301 s24: bool = false,
1302 s25: bool = false,
1303 s26: bool = false,
1304 s27: bool = false,
1305 s28: bool = false,
1306 s29: bool = false,
1307 s30: bool = false,
1308 s31: bool = false,
1309 s32: bool = false,
1310 s33: bool = false,
1311 s34: bool = false,
1312 s35: bool = false,
1313 s36: bool = false,
1314 s37: bool = false,
1315 s38: bool = false,
1316 s39: bool = false,
1317 s40: bool = false,
1318 s41: bool = false,
1319 s42: bool = false,
1320 s43: bool = false,
1321 s44: bool = false,
1322 s45: bool = false,
1323 s46: bool = false,
1324 s47: bool = false,
1325 s48: bool = false,
1326 s49: bool = false,
1327 s50: bool = false,
1328 s51: bool = false,
1329 s52: bool = false,
1330 s53: bool = false,
1331 s54: bool = false,
1332 s55: bool = false,
1333 s56: bool = false,
1334 s57: bool = false,
1335 s58: bool = false,
1336 s59: bool = false,
1337 s60: bool = false,
1338 s61: bool = false,
1339 s62: bool = false,
1340 s63: bool = false,
1341
1342 vixr: bool = false,
1343 vl: bool = false,
1344
1345 vm0: bool = false,
1346 vm1: bool = false,
1347 vm2: bool = false,
1348 vm3: bool = false,
1349 vm4: bool = false,
1350 vm5: bool = false,
1351 vm6: bool = false,
1352 vm7: bool = false,
1353 vm8: bool = false,
1354 vm9: bool = false,
1355 vm10: bool = false,
1356 vm11: bool = false,
1357 vm12: bool = false,
1358 vm13: bool = false,
1359 vm14: bool = false,
1360 vm15: bool = false,
1361
1362 v0: bool = false,
1363 v1: bool = false,
1364 v2: bool = false,
1365 v3: bool = false,
1366 v4: bool = false,
1367 v5: bool = false,
1368 v6: bool = false,
1369 v7: bool = false,
1370 v8: bool = false,
1371 v9: bool = false,
1372 v10: bool = false,
1373 v11: bool = false,
1374 v12: bool = false,
1375 v13: bool = false,
1376 v14: bool = false,
1377 v15: bool = false,
1378 v16: bool = false,
1379 v17: bool = false,
1380 v18: bool = false,
1381 v19: bool = false,
1382 v20: bool = false,
1383 v21: bool = false,
1384 v22: bool = false,
1385 v23: bool = false,
1386 v24: bool = false,
1387 v25: bool = false,
1388 v26: bool = false,
1389 v27: bool = false,
1390 v28: bool = false,
1391 v29: bool = false,
1392 v30: bool = false,
1393 v31: bool = false,
1394 v32: bool = false,
1395 v33: bool = false,
1396 v34: bool = false,
1397 v35: bool = false,
1398 v36: bool = false,
1399 v37: bool = false,
1400 v38: bool = false,
1401 v39: bool = false,
1402 v40: bool = false,
1403 v41: bool = false,
1404 v42: bool = false,
1405 v43: bool = false,
1406 v44: bool = false,
1407 v45: bool = false,
1408 v46: bool = false,
1409 v47: bool = false,
1410 v48: bool = false,
1411 v49: bool = false,
1412 v50: bool = false,
1413 v51: bool = false,
1414 v52: bool = false,
1415 v53: bool = false,
1416 v54: bool = false,
1417 v55: bool = false,
1418 v56: bool = false,
1419 v57: bool = false,
1420 v58: bool = false,
1421 v59: bool = false,
1422 v60: bool = false,
1423 v61: bool = false,
1424 v62: bool = false,
1425 v63: bool = false,
1426 },
1427 .kalimba => packed struct {
1428 /// Whether the inline assembly code may perform stores to memory
1429 /// addresses other than those derived from input pointer provenance.
1430 memory: bool = false,
1431
1432 i0: bool = false,
1433 i1: bool = false,
1434 i2: bool = false,
1435 i3: bool = false,
1436 i4: bool = false,
1437 i5: bool = false,
1438 i6: bool = false,
1439 i7: bool = false,
1440
1441 m0: bool = false,
1442 m1: bool = false,
1443 m2: bool = false,
1444 m3: bool = false,
1445 l0: bool = false,
1446 l1: bool = false,
1447 l2: bool = false,
1448 l3: bool = false,
1449 l4: bool = false,
1450 l5: bool = false,
1451 doloopstart: bool = false,
1452 doloopend: bool = false,
1453 divresult: bool = false,
1454 divremainder: bool = false,
1455 rmac: bool = false,
1456 rmac0: bool = false,
1457 rmac1: bool = false,
1458 rmac2: bool = false,
1459 rlink: bool = false,
1460 rflags: bool = false,
1461 r0: bool = false,
1462 r1: bool = false,
1463 r2: bool = false,
1464 r3: bool = false,
1465 r4: bool = false,
1466 r5: bool = false,
1467 r6: bool = false,
1468 r7: bool = false,
1469 r8: bool = false,
1470 r9: bool = false,
1471 r10: bool = false,
1472 },
1473 .or1k => packed struct {
1474 /// Whether the inline assembly code may perform stores to memory
1475 /// addresses other than those derived from input pointer provenance.
1476 memory: bool = false,
1477
1478 maclo: bool = false,
1479 machi: bool = false,
1480 fpcsr: bool = false,
1481 fpmaddlo: bool = false,
1482 fpmaddhi: bool = false,
1483 vmaclo: bool = false,
1484 vmachi: bool = false,
1485
1486 r0: bool = false,
1487 r1: bool = false,
1488 r2: bool = false,
1489 r3: bool = false,
1490 r4: bool = false,
1491 r5: bool = false,
1492 r6: bool = false,
1493 r7: bool = false,
1494 r8: bool = false,
1495 r9: bool = false,
1496 r10: bool = false,
1497 r11: bool = false,
1498 r12: bool = false,
1499 r13: bool = false,
1500 r14: bool = false,
1501 r15: bool = false,
1502 r16: bool = false,
1503 r17: bool = false,
1504 r18: bool = false,
1505 r19: bool = false,
1506 r20: bool = false,
1507 r21: bool = false,
1508 r22: bool = false,
1509 r23: bool = false,
1510 r24: bool = false,
1511 r25: bool = false,
1512 r26: bool = false,
1513 r27: bool = false,
1514 r28: bool = false,
1515 r29: bool = false,
1516 r30: bool = false,
1517 r31: bool = false,
1518 },
1519 .csky => packed struct {
1520 /// Whether the inline assembly code may perform stores to memory
1521 /// addresses other than those derived from input pointer provenance.
1522 memory: bool = false,
1523
1524 psr: bool = false,
1525 hi: bool = false,
1526 lo: bool = false,
1527
1528 r0: bool = false,
1529 r1: bool = false,
1530 r2: bool = false,
1531 r3: bool = false,
1532 r4: bool = false,
1533 r5: bool = false,
1534 r6: bool = false,
1535 r7: bool = false,
1536 r8: bool = false,
1537 r9: bool = false,
1538 r10: bool = false,
1539 r11: bool = false,
1540 r12: bool = false,
1541 r13: bool = false,
1542 r14: bool = false,
1543 r15: bool = false,
1544 r16: bool = false,
1545 r17: bool = false,
1546 r18: bool = false,
1547 r19: bool = false,
1548 r20: bool = false,
1549 r21: bool = false,
1550 r22: bool = false,
1551 r23: bool = false,
1552 r24: bool = false,
1553 r25: bool = false,
1554 r26: bool = false,
1555 r27: bool = false,
1556 r28: bool = false,
1557 r29: bool = false,
1558 r30: bool = false,
1559 r31: bool = false,
1560
1561 vr0: bool = false,
1562 vr1: bool = false,
1563 vr2: bool = false,
1564 vr3: bool = false,
1565 vr4: bool = false,
1566 vr5: bool = false,
1567 vr6: bool = false,
1568 vr7: bool = false,
1569 vr8: bool = false,
1570 vr9: bool = false,
1571 vr10: bool = false,
1572 vr11: bool = false,
1573 vr12: bool = false,
1574 vr13: bool = false,
1575 vr14: bool = false,
1576 vr15: bool = false,
1577 vr16: bool = false,
1578 vr17: bool = false,
1579 vr18: bool = false,
1580 vr19: bool = false,
1581 vr20: bool = false,
1582 vr21: bool = false,
1583 vr22: bool = false,
1584 vr23: bool = false,
1585 vr24: bool = false,
1586 vr25: bool = false,
1587 vr26: bool = false,
1588 vr27: bool = false,
1589 vr28: bool = false,
1590 vr29: bool = false,
1591 vr30: bool = false,
1592 vr31: bool = false,
1593 },
1594 .arc => packed struct {
1595 /// Whether the inline assembly code may perform stores to memory
1596 /// addresses other than those derived from input pointer provenance.
1597 memory: bool = false,
1598
1599 status32: bool = false,
1600 aux_macmode: bool = false,
1601 mulhi: bool = false,
1602 lp_start: bool = false,
1603 lp_end: bool = false,
1604 jli_base: bool = false,
1605 ldi_base: bool = false,
1606 ei_base: bool = false,
1607
1608 r0: bool = false,
1609 r1: bool = false,
1610 r2: bool = false,
1611 r3: bool = false,
1612 r4: bool = false,
1613 r5: bool = false,
1614 r6: bool = false,
1615 r7: bool = false,
1616 r8: bool = false,
1617 r9: bool = false,
1618 r10: bool = false,
1619 r11: bool = false,
1620 r12: bool = false,
1621 r13: bool = false,
1622 r14: bool = false,
1623 r15: bool = false,
1624 r16: bool = false,
1625 r17: bool = false,
1626 r18: bool = false,
1627 r19: bool = false,
1628 r20: bool = false,
1629 r21: bool = false,
1630 r22: bool = false,
1631 r23: bool = false,
1632 r24: bool = false,
1633 r25: bool = false,
1634 r26: bool = false,
1635 r27: bool = false,
1636 r28: bool = false,
1637 r29: bool = false,
1638 r30: bool = false,
1639 r31: bool = false,
1640 r32: bool = false,
1641 r33: bool = false,
1642 r34: bool = false,
1643 r35: bool = false,
1644 r36: bool = false,
1645 r37: bool = false,
1646 r38: bool = false,
1647 r39: bool = false,
1648 r40: bool = false,
1649 r41: bool = false,
1650 r42: bool = false,
1651 r43: bool = false,
1652 r44: bool = false,
1653 r45: bool = false,
1654 r46: bool = false,
1655 r47: bool = false,
1656 r48: bool = false,
1657 r49: bool = false,
1658 r50: bool = false,
1659 r51: bool = false,
1660 r52: bool = false,
1661 r53: bool = false,
1662 r54: bool = false,
1663 r55: bool = false,
1664 r56: bool = false,
1665 r57: bool = false,
1666 r58: bool = false,
1667 r59: bool = false,
1668 r60: bool = false,
1669
1670 fmp_ctrl: bool = false,
1671 dsp_ctrl: bool = false,
1672 acc0_lo: bool = false,
1673 acc0_glo: bool = false,
1674 acc0_hi: bool = false,
1675 acc0_ghi: bool = false,
1676 fp_ctrl: bool = false,
1677 fpu_status: bool = false,
1678 vfpu_status: bool = false,
1679
1680 f0: bool = false,
1681 f1: bool = false,
1682 f2: bool = false,
1683 f3: bool = false,
1684 f4: bool = false,
1685 f5: bool = false,
1686 f6: bool = false,
1687 f7: bool = false,
1688 f8: bool = false,
1689 f9: bool = false,
1690 f10: bool = false,
1691 f11: bool = false,
1692 f12: bool = false,
1693 f13: bool = false,
1694 f14: bool = false,
1695 f15: bool = false,
1696 f16: bool = false,
1697 f17: bool = false,
1698 f18: bool = false,
1699 f19: bool = false,
1700 f20: bool = false,
1701 f21: bool = false,
1702 f22: bool = false,
1703 f23: bool = false,
1704 f24: bool = false,
1705 f25: bool = false,
1706 f26: bool = false,
1707 f27: bool = false,
1708 f28: bool = false,
1709 f29: bool = false,
1710 f30: bool = false,
1711 f31: bool = false,
1712 },
1713 .loongarch32, .loongarch64 => packed struct {
1714 /// Whether the inline assembly code may perform stores to memory
1715 /// addresses other than those derived from input pointer provenance.
1716 memory: bool = false,
1717
1718 r1: bool = false,
1719 r2: bool = false,
1720 r3: bool = false,
1721 r4: bool = false,
1722 r5: bool = false,
1723 r6: bool = false,
1724 r7: bool = false,
1725 r8: bool = false,
1726 r9: bool = false,
1727 r10: bool = false,
1728 r11: bool = false,
1729 r12: bool = false,
1730 r13: bool = false,
1731 r14: bool = false,
1732 r15: bool = false,
1733 r16: bool = false,
1734 r17: bool = false,
1735 r18: bool = false,
1736 r19: bool = false,
1737 r20: bool = false,
1738 r21: bool = false,
1739 r22: bool = false,
1740 r23: bool = false,
1741 r24: bool = false,
1742 r25: bool = false,
1743 r26: bool = false,
1744 r27: bool = false,
1745 r28: bool = false,
1746 r29: bool = false,
1747 r30: bool = false,
1748 r31: bool = false,
1749
1750 fcc0: bool = false,
1751 fcc1: bool = false,
1752 fcc2: bool = false,
1753 fcc3: bool = false,
1754 fcc4: bool = false,
1755 fcc5: bool = false,
1756 fcc6: bool = false,
1757 fcc7: bool = false,
1758
1759 fcsr0: bool = false,
1760 fcsr1: bool = false,
1761 fcsr2: bool = false,
1762 fcsr3: bool = false,
1763
1764 xr0: bool = false,
1765 xr1: bool = false,
1766 xr2: bool = false,
1767 xr3: bool = false,
1768 xr4: bool = false,
1769 xr5: bool = false,
1770 xr6: bool = false,
1771 xr7: bool = false,
1772 xr8: bool = false,
1773 xr9: bool = false,
1774 xr10: bool = false,
1775 xr11: bool = false,
1776 xr12: bool = false,
1777 xr13: bool = false,
1778 xr14: bool = false,
1779 xr15: bool = false,
1780 xr16: bool = false,
1781 xr17: bool = false,
1782 xr18: bool = false,
1783 xr19: bool = false,
1784 xr20: bool = false,
1785 xr21: bool = false,
1786 xr22: bool = false,
1787 xr23: bool = false,
1788 xr24: bool = false,
1789 xr25: bool = false,
1790 xr26: bool = false,
1791 xr27: bool = false,
1792 xr28: bool = false,
1793 xr29: bool = false,
1794 xr30: bool = false,
1795 xr31: bool = false,
1796
1797 vr0: bool = false,
1798 vr1: bool = false,
1799 vr2: bool = false,
1800 vr3: bool = false,
1801 vr4: bool = false,
1802 vr5: bool = false,
1803 vr6: bool = false,
1804 vr7: bool = false,
1805 vr8: bool = false,
1806 vr9: bool = false,
1807 vr10: bool = false,
1808 vr11: bool = false,
1809 vr12: bool = false,
1810 vr13: bool = false,
1811 vr14: bool = false,
1812 vr15: bool = false,
1813 vr16: bool = false,
1814 vr17: bool = false,
1815 vr18: bool = false,
1816 vr19: bool = false,
1817 vr20: bool = false,
1818 vr21: bool = false,
1819 vr22: bool = false,
1820 vr23: bool = false,
1821 vr24: bool = false,
1822 vr25: bool = false,
1823 vr26: bool = false,
1824 vr27: bool = false,
1825 vr28: bool = false,
1826 vr29: bool = false,
1827 vr30: bool = false,
1828 vr31: bool = false,
1829
1830 f0: bool = false,
1831 f1: bool = false,
1832 f2: bool = false,
1833 f3: bool = false,
1834 f4: bool = false,
1835 f5: bool = false,
1836 f6: bool = false,
1837 f7: bool = false,
1838 f8: bool = false,
1839 f9: bool = false,
1840 f10: bool = false,
1841 f11: bool = false,
1842 f12: bool = false,
1843 f13: bool = false,
1844 f14: bool = false,
1845 f15: bool = false,
1846 f16: bool = false,
1847 f17: bool = false,
1848 f18: bool = false,
1849 f19: bool = false,
1850 f20: bool = false,
1851 f21: bool = false,
1852 f22: bool = false,
1853 f23: bool = false,
1854 f24: bool = false,
1855 f25: bool = false,
1856 f26: bool = false,
1857 f27: bool = false,
1858 f28: bool = false,
1859 f29: bool = false,
1860 f30: bool = false,
1861 f31: bool = false,
1862 },
1863 .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct {
1864 /// Whether the inline assembly code may perform stores to memory
1865 /// addresses other than those derived from input pointer provenance.
1866 memory: bool = false,
1867
1868 cr0: bool = false,
1869 cr1: bool = false,
1870 cr2: bool = false,
1871 cr3: bool = false,
1872 cr4: bool = false,
1873 cr5: bool = false,
1874 cr6: bool = false,
1875 cr7: bool = false,
1876
1877 xer: bool = false,
1878 ctr: bool = false,
1879 lr: bool = false,
1880
1881 r0: bool = false,
1882 r1: bool = false,
1883 r2: bool = false,
1884 r3: bool = false,
1885 r4: bool = false,
1886 r5: bool = false,
1887 r6: bool = false,
1888 r7: bool = false,
1889 r8: bool = false,
1890 r9: bool = false,
1891 r10: bool = false,
1892 r11: bool = false,
1893 r12: bool = false,
1894 r13: bool = false,
1895 r14: bool = false,
1896 r15: bool = false,
1897 r16: bool = false,
1898 r17: bool = false,
1899 r18: bool = false,
1900 r19: bool = false,
1901 r20: bool = false,
1902 r21: bool = false,
1903 r22: bool = false,
1904 r23: bool = false,
1905 r24: bool = false,
1906 r25: bool = false,
1907 r26: bool = false,
1908 r27: bool = false,
1909 r28: bool = false,
1910 r29: bool = false,
1911 r30: bool = false,
1912 r31: bool = false,
1913
1914 fpscr: bool = false,
1915 vscr: bool = false,
1916
1917 vs0: bool = false,
1918 vs1: bool = false,
1919 vs2: bool = false,
1920 vs3: bool = false,
1921 vs4: bool = false,
1922 vs5: bool = false,
1923 vs6: bool = false,
1924 vs7: bool = false,
1925 vs8: bool = false,
1926 vs9: bool = false,
1927 vs10: bool = false,
1928 vs11: bool = false,
1929 vs12: bool = false,
1930 vs13: bool = false,
1931 vs14: bool = false,
1932 vs15: bool = false,
1933 vs16: bool = false,
1934 vs17: bool = false,
1935 vs18: bool = false,
1936 vs19: bool = false,
1937 vs20: bool = false,
1938 vs21: bool = false,
1939 vs22: bool = false,
1940 vs23: bool = false,
1941 vs24: bool = false,
1942 vs25: bool = false,
1943 vs26: bool = false,
1944 vs27: bool = false,
1945 vs28: bool = false,
1946 vs29: bool = false,
1947 vs30: bool = false,
1948 vs31: bool = false,
1949 vs32: bool = false,
1950 vs33: bool = false,
1951 vs34: bool = false,
1952 vs35: bool = false,
1953 vs36: bool = false,
1954 vs37: bool = false,
1955 vs38: bool = false,
1956 vs39: bool = false,
1957 vs40: bool = false,
1958 vs41: bool = false,
1959 vs42: bool = false,
1960 vs43: bool = false,
1961 vs44: bool = false,
1962 vs45: bool = false,
1963 vs46: bool = false,
1964 vs47: bool = false,
1965 vs48: bool = false,
1966 vs49: bool = false,
1967 vs50: bool = false,
1968 vs51: bool = false,
1969 vs52: bool = false,
1970 vs53: bool = false,
1971 vs54: bool = false,
1972 vs55: bool = false,
1973 vs56: bool = false,
1974 vs57: bool = false,
1975 vs58: bool = false,
1976 vs59: bool = false,
1977 vs60: bool = false,
1978 vs61: bool = false,
1979 vs62: bool = false,
1980 vs63: bool = false,
1981
1982 f0: bool = false,
1983 f1: bool = false,
1984 f2: bool = false,
1985 f3: bool = false,
1986 f4: bool = false,
1987 f5: bool = false,
1988 f6: bool = false,
1989 f7: bool = false,
1990 f8: bool = false,
1991 f9: bool = false,
1992 f10: bool = false,
1993 f11: bool = false,
1994 f12: bool = false,
1995 f13: bool = false,
1996 f14: bool = false,
1997 f15: bool = false,
1998 f16: bool = false,
1999 f17: bool = false,
2000 f18: bool = false,
2001 f19: bool = false,
2002 f20: bool = false,
2003 f21: bool = false,
2004 f22: bool = false,
2005 f23: bool = false,
2006 f24: bool = false,
2007 f25: bool = false,
2008 f26: bool = false,
2009 f27: bool = false,
2010 f28: bool = false,
2011 f29: bool = false,
2012 f30: bool = false,
2013 f31: bool = false,
2014
2015 v0: bool = false,
2016 v1: bool = false,
2017 v2: bool = false,
2018 v3: bool = false,
2019 v4: bool = false,
2020 v5: bool = false,
2021 v6: bool = false,
2022 v7: bool = false,
2023 v8: bool = false,
2024 v9: bool = false,
2025 v10: bool = false,
2026 v11: bool = false,
2027 v12: bool = false,
2028 v13: bool = false,
2029 v14: bool = false,
2030 v15: bool = false,
2031 v16: bool = false,
2032 v17: bool = false,
2033 v18: bool = false,
2034 v19: bool = false,
2035 v20: bool = false,
2036 v21: bool = false,
2037 v22: bool = false,
2038 v23: bool = false,
2039 v24: bool = false,
2040 v25: bool = false,
2041 v26: bool = false,
2042 v27: bool = false,
2043 v28: bool = false,
2044 v29: bool = false,
2045 v30: bool = false,
2046 v31: bool = false,
2047
2048 acc0: bool = false,
2049 acc1: bool = false,
2050 acc2: bool = false,
2051 acc3: bool = false,
2052 acc4: bool = false,
2053 acc5: bool = false,
2054 acc6: bool = false,
2055 acc7: bool = false,
2056
2057 acc: bool = false,
2058 spefsc: bool = false,
2059 },
2060 .mips, .mipsel, .mips64, .mips64el => packed struct {
2061 /// Whether the inline assembly code may perform stores to memory
2062 /// addresses other than those derived from input pointer provenance.
2063 memory: bool = false,
2064
2065 lr: bool = false,
2066
2067 hi: bool = false,
2068 lo: bool = false,
2069 ac0: bool = false,
2070 ac1: bool = false,
2071 ac2: bool = false,
2072 ac3: bool = false,
2073 acx: bool = false,
2074
2075 r1: bool = false,
2076 r2: bool = false,
2077 r3: bool = false,
2078 r4: bool = false,
2079 r5: bool = false,
2080 r6: bool = false,
2081 r7: bool = false,
2082 r8: bool = false,
2083 r9: bool = false,
2084 r10: bool = false,
2085 r11: bool = false,
2086 r12: bool = false,
2087 r13: bool = false,
2088 r14: bool = false,
2089 r15: bool = false,
2090 r16: bool = false,
2091 r17: bool = false,
2092 r18: bool = false,
2093 r19: bool = false,
2094 r20: bool = false,
2095 r21: bool = false,
2096 r22: bool = false,
2097 r23: bool = false,
2098 r24: bool = false,
2099 r25: bool = false,
2100 r26: bool = false,
2101 r27: bool = false,
2102 r28: bool = false,
2103 r29: bool = false,
2104 r30: bool = false,
2105 r31: bool = false,
2106
2107 fcsr: bool = false,
2108 fcc0: bool = false,
2109 fcc1: bool = false,
2110 fcc2: bool = false,
2111 fcc3: bool = false,
2112 fcc4: bool = false,
2113 fcc5: bool = false,
2114 fcc6: bool = false,
2115 fcc7: bool = false,
2116
2117 w0: bool = false,
2118 w1: bool = false,
2119 w2: bool = false,
2120 w3: bool = false,
2121 w4: bool = false,
2122 w5: bool = false,
2123 w6: bool = false,
2124 w7: bool = false,
2125 w8: bool = false,
2126 w9: bool = false,
2127 w10: bool = false,
2128 w11: bool = false,
2129 w12: bool = false,
2130 w13: bool = false,
2131 w14: bool = false,
2132 w15: bool = false,
2133 w16: bool = false,
2134 w17: bool = false,
2135 w18: bool = false,
2136 w19: bool = false,
2137 w20: bool = false,
2138 w21: bool = false,
2139 w22: bool = false,
2140 w23: bool = false,
2141 w24: bool = false,
2142 w25: bool = false,
2143 w26: bool = false,
2144 w27: bool = false,
2145 w28: bool = false,
2146 w29: bool = false,
2147 w30: bool = false,
2148 w31: bool = false,
2149
2150 f0: bool = false,
2151 f1: bool = false,
2152 f2: bool = false,
2153 f3: bool = false,
2154 f4: bool = false,
2155 f5: bool = false,
2156 f6: bool = false,
2157 f7: bool = false,
2158 f8: bool = false,
2159 f9: bool = false,
2160 f10: bool = false,
2161 f11: bool = false,
2162 f12: bool = false,
2163 f13: bool = false,
2164 f14: bool = false,
2165 f15: bool = false,
2166 f16: bool = false,
2167 f17: bool = false,
2168 f18: bool = false,
2169 f19: bool = false,
2170 f20: bool = false,
2171 f21: bool = false,
2172 f22: bool = false,
2173 f23: bool = false,
2174 f24: bool = false,
2175 f25: bool = false,
2176 f26: bool = false,
2177 f27: bool = false,
2178 f28: bool = false,
2179 f29: bool = false,
2180 f30: bool = false,
2181 f31: bool = false,
2182
2183 mpl0: bool = false,
2184 mpl1: bool = false,
2185 mpl2: bool = false,
2186
2187 p0: bool = false,
2188 p1: bool = false,
2189 p2: bool = false,
2190
2191 msa_ir: bool = false,
2192 msa_csr: bool = false,
2193 msa_access: bool = false,
2194 msa_save: bool = false,
2195 msa_modify: bool = false,
2196 msa_request: bool = false,
2197 msa_map: bool = false,
2198 msa_unmap: bool = false,
2199 },
2200 else => packed struct {
2201 /// Whether the inline assembly code may perform stores to memory
2202 /// addresses other than those derived from input pointer provenance.
2203 memory: bool = false,
2204 },
2205};
lib/std/crypto/sha2.zig+1-2
...@@ -229,8 +229,7 @@ fn Sha2x32(comptime iv: Iv32, digest_bits: comptime_int) type {...@@ -229,8 +229,7 @@ fn Sha2x32(comptime iv: Iv32, digest_bits: comptime_int) type {
229 : [_] "0" (x),229 : [_] "0" (x),
230 [_] "1" (y),230 [_] "1" (y),
231 [w] "w" (w),231 [w] "w" (w),
232 : "v0"232 : .{ .v0 = true });
233 );
234 }233 }
235234
236 d.s[0..4].* = x +% @as(V4u32, d.s[0..4].*);235 d.s[0..4].* = x +% @as(V4u32, d.s[0..4].*);
lib/std/debug.zig+1-1
...@@ -785,7 +785,7 @@ pub const StackIterator = struct {...@@ -785,7 +785,7 @@ pub const StackIterator = struct {
785 "flushw"785 "flushw"
786 else786 else
787 "ta 3" // ST_FLUSH_WINDOWS787 "ta 3" // ST_FLUSH_WINDOWS
788 ::: "memory");788 ::: .{ .memory = true });
789 }789 }
790790
791 return StackIterator{791 return StackIterator{
lib/std/debug/SelfInfo.zig+1-2
...@@ -1547,8 +1547,7 @@ pub inline fn stripInstructionPtrAuthCode(ptr: usize) usize {...@@ -1547,8 +1547,7 @@ pub inline fn stripInstructionPtrAuthCode(ptr: usize) usize {
1547 \\mov x30, x161547 \\mov x30, x16
1548 : [ret] "={x15}" (-> usize),1548 : [ret] "={x15}" (-> usize),
1549 : [ptr] "{x15}" (ptr),1549 : [ptr] "{x15}" (ptr),
1550 : "x16"1550 : .{ .x16 = true });
1551 );
1552 }1551 }
15531552
1554 return ptr;1553 return ptr;
lib/std/mem.zig+1-2
...@@ -4497,8 +4497,7 @@ pub fn doNotOptimizeAway(val: anytype) void {...@@ -4497,8 +4497,7 @@ pub fn doNotOptimizeAway(val: anytype) void {
4497 asm volatile (""4497 asm volatile (""
4498 :4498 :
4499 : [val] "m" (val),4499 : [val] "m" (val),
4500 : "memory"4500 : .{ .memory = true });
4501 );
4502 }4501 }
4503 },4502 },
4504 .array => {4503 .array => {
lib/std/os/linux/aarch64.zig+9-18
...@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {...@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {
18 return asm volatile ("svc #0"18 return asm volatile ("svc #0"
19 : [ret] "={x0}" (-> usize),19 : [ret] "={x0}" (-> usize),
20 : [number] "{x8}" (@intFromEnum(number)),20 : [number] "{x8}" (@intFromEnum(number)),
21 : "memory", "cc"21 : .{ .memory = true });
22 );
23}22}
2423
25pub fn syscall1(number: SYS, arg1: usize) usize {24pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
27 : [ret] "={x0}" (-> usize),26 : [ret] "={x0}" (-> usize),
28 : [number] "{x8}" (@intFromEnum(number)),27 : [number] "{x8}" (@intFromEnum(number)),
29 [arg1] "{x0}" (arg1),28 [arg1] "{x0}" (arg1),
30 : "memory", "cc"29 : .{ .memory = true });
31 );
32}30}
3331
34pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {32pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -37,8 +35,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -37,8 +35,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
37 : [number] "{x8}" (@intFromEnum(number)),35 : [number] "{x8}" (@intFromEnum(number)),
38 [arg1] "{x0}" (arg1),36 [arg1] "{x0}" (arg1),
39 [arg2] "{x1}" (arg2),37 [arg2] "{x1}" (arg2),
40 : "memory", "cc"38 : .{ .memory = true });
41 );
42}39}
4340
44pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {41pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -48,8 +45,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -48,8 +45,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
48 [arg1] "{x0}" (arg1),45 [arg1] "{x0}" (arg1),
49 [arg2] "{x1}" (arg2),46 [arg2] "{x1}" (arg2),
50 [arg3] "{x2}" (arg3),47 [arg3] "{x2}" (arg3),
51 : "memory", "cc"48 : .{ .memory = true });
52 );
53}49}
5450
55pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {51pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -60,8 +56,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -60,8 +56,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
60 [arg2] "{x1}" (arg2),56 [arg2] "{x1}" (arg2),
61 [arg3] "{x2}" (arg3),57 [arg3] "{x2}" (arg3),
62 [arg4] "{x3}" (arg4),58 [arg4] "{x3}" (arg4),
63 : "memory", "cc"59 : .{ .memory = true });
64 );
65}60}
6661
67pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {62pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -73,8 +68,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -73,8 +68,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
73 [arg3] "{x2}" (arg3),68 [arg3] "{x2}" (arg3),
74 [arg4] "{x3}" (arg4),69 [arg4] "{x3}" (arg4),
75 [arg5] "{x4}" (arg5),70 [arg5] "{x4}" (arg5),
76 : "memory", "cc"71 : .{ .memory = true });
77 );
78}72}
7973
80pub fn syscall6(74pub fn syscall6(
...@@ -95,8 +89,7 @@ pub fn syscall6(...@@ -95,8 +89,7 @@ pub fn syscall6(
95 [arg4] "{x3}" (arg4),89 [arg4] "{x3}" (arg4),
96 [arg5] "{x4}" (arg5),90 [arg5] "{x4}" (arg5),
97 [arg6] "{x5}" (arg6),91 [arg6] "{x5}" (arg6),
98 : "memory", "cc"92 : .{ .memory = true });
99 );
100}93}
10194
102pub fn clone() callconv(.naked) usize {95pub fn clone() callconv(.naked) usize {
...@@ -148,14 +141,12 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -148,14 +141,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
148 \\ svc #0141 \\ svc #0
149 :142 :
150 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),143 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
151 : "memory", "cc"144 : .{ .memory = true }),
152 ),
153 else => asm volatile (145 else => asm volatile (
154 \\ svc #0146 \\ svc #0
155 :147 :
156 : [number] "{x8}" (@intFromEnum(SYS.rt_sigreturn)),148 : [number] "{x8}" (@intFromEnum(SYS.rt_sigreturn)),
157 : "memory", "cc"149 : .{ .memory = true }),
158 ),
159 }150 }
160}151}
161152
lib/std/os/linux/arm.zig+11-22
...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
17 return asm volatile ("svc #0"17 return asm volatile ("svc #0"
18 : [ret] "={r0}" (-> usize),18 : [ret] "={r0}" (-> usize),
19 : [number] "{r7}" (@intFromEnum(number)),19 : [number] "{r7}" (@intFromEnum(number)),
20 : "memory"20 : .{ .memory = true });
21 );
22}21}
2322
24pub fn syscall1(number: SYS, arg1: usize) usize {23pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
26 : [ret] "={r0}" (-> usize),25 : [ret] "={r0}" (-> usize),
27 : [number] "{r7}" (@intFromEnum(number)),26 : [number] "{r7}" (@intFromEnum(number)),
28 [arg1] "{r0}" (arg1),27 [arg1] "{r0}" (arg1),
29 : "memory"28 : .{ .memory = true });
30 );
31}29}
3230
33pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {31pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
36 : [number] "{r7}" (@intFromEnum(number)),34 : [number] "{r7}" (@intFromEnum(number)),
37 [arg1] "{r0}" (arg1),35 [arg1] "{r0}" (arg1),
38 [arg2] "{r1}" (arg2),36 [arg2] "{r1}" (arg2),
39 : "memory"37 : .{ .memory = true });
40 );
41}38}
4239
43pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {40pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
47 [arg1] "{r0}" (arg1),44 [arg1] "{r0}" (arg1),
48 [arg2] "{r1}" (arg2),45 [arg2] "{r1}" (arg2),
49 [arg3] "{r2}" (arg3),46 [arg3] "{r2}" (arg3),
50 : "memory"47 : .{ .memory = true });
51 );
52}48}
5349
54pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {50pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
59 [arg2] "{r1}" (arg2),55 [arg2] "{r1}" (arg2),
60 [arg3] "{r2}" (arg3),56 [arg3] "{r2}" (arg3),
61 [arg4] "{r3}" (arg4),57 [arg4] "{r3}" (arg4),
62 : "memory"58 : .{ .memory = true });
63 );
64}59}
6560
66pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {61pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
72 [arg3] "{r2}" (arg3),67 [arg3] "{r2}" (arg3),
73 [arg4] "{r3}" (arg4),68 [arg4] "{r3}" (arg4),
74 [arg5] "{r4}" (arg5),69 [arg5] "{r4}" (arg5),
75 : "memory"70 : .{ .memory = true });
76 );
77}71}
7872
79pub fn syscall6(73pub fn syscall6(
...@@ -94,8 +88,7 @@ pub fn syscall6(...@@ -94,8 +88,7 @@ pub fn syscall6(
94 [arg4] "{r3}" (arg4),88 [arg4] "{r3}" (arg4),
95 [arg5] "{r4}" (arg5),89 [arg5] "{r4}" (arg5),
96 [arg6] "{r5}" (arg6),90 [arg6] "{r5}" (arg6),
97 : "memory"91 : .{ .memory = true });
98 );
99}92}
10093
101pub fn clone() callconv(.naked) usize {94pub fn clone() callconv(.naked) usize {
...@@ -141,14 +134,12 @@ pub fn restore() callconv(.naked) noreturn {...@@ -141,14 +134,12 @@ pub fn restore() callconv(.naked) noreturn {
141 \\ svc #0134 \\ svc #0
142 :135 :
143 : [number] "I" (@intFromEnum(SYS.sigreturn)),136 : [number] "I" (@intFromEnum(SYS.sigreturn)),
144 : "memory"137 : .{ .memory = true }),
145 ),
146 else => asm volatile (138 else => asm volatile (
147 \\ svc #0139 \\ svc #0
148 :140 :
149 : [number] "{r7}" (@intFromEnum(SYS.sigreturn)),141 : [number] "{r7}" (@intFromEnum(SYS.sigreturn)),
150 : "memory"142 : .{ .memory = true }),
151 ),
152 }143 }
153}144}
154145
...@@ -159,14 +150,12 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -159,14 +150,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
159 \\ svc #0150 \\ svc #0
160 :151 :
161 : [number] "I" (@intFromEnum(SYS.rt_sigreturn)),152 : [number] "I" (@intFromEnum(SYS.rt_sigreturn)),
162 : "memory"153 : .{ .memory = true }),
163 ),
164 else => asm volatile (154 else => asm volatile (
165 \\ svc #0155 \\ svc #0
166 :156 :
167 : [number] "{r7}" (@intFromEnum(SYS.rt_sigreturn)),157 : [number] "{r7}" (@intFromEnum(SYS.rt_sigreturn)),
168 : "memory"158 : .{ .memory = true }),
169 ),
170 }159 }
171}160}
172161
lib/std/os/linux/hexagon.zig+8-16
...@@ -15,8 +15,7 @@ pub fn syscall0(number: SYS) usize {...@@ -15,8 +15,7 @@ pub fn syscall0(number: SYS) usize {
15 return asm volatile ("trap0(#1)"15 return asm volatile ("trap0(#1)"
16 : [ret] "={r0}" (-> usize),16 : [ret] "={r0}" (-> usize),
17 : [number] "{r6}" (@intFromEnum(number)),17 : [number] "{r6}" (@intFromEnum(number)),
18 : "memory"18 : .{ .memory = true });
19 );
20}19}
2120
22pub fn syscall1(number: SYS, arg1: usize) usize {21pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -24,8 +23,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -24,8 +23,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
24 : [ret] "={r0}" (-> usize),23 : [ret] "={r0}" (-> usize),
25 : [number] "{r6}" (@intFromEnum(number)),24 : [number] "{r6}" (@intFromEnum(number)),
26 [arg1] "{r0}" (arg1),25 [arg1] "{r0}" (arg1),
27 : "memory"26 : .{ .memory = true });
28 );
29}27}
3028
31pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {29pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -34,8 +32,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -34,8 +32,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
34 : [number] "{r6}" (@intFromEnum(number)),32 : [number] "{r6}" (@intFromEnum(number)),
35 [arg1] "{r0}" (arg1),33 [arg1] "{r0}" (arg1),
36 [arg2] "{r1}" (arg2),34 [arg2] "{r1}" (arg2),
37 : "memory"35 : .{ .memory = true });
38 );
39}36}
4037
41pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {38pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -45,8 +42,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -45,8 +42,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
45 [arg1] "{r0}" (arg1),42 [arg1] "{r0}" (arg1),
46 [arg2] "{r1}" (arg2),43 [arg2] "{r1}" (arg2),
47 [arg3] "{r2}" (arg3),44 [arg3] "{r2}" (arg3),
48 : "memory"45 : .{ .memory = true });
49 );
50}46}
5147
52pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {48pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -57,8 +53,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -57,8 +53,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
57 [arg2] "{r1}" (arg2),53 [arg2] "{r1}" (arg2),
58 [arg3] "{r2}" (arg3),54 [arg3] "{r2}" (arg3),
59 [arg4] "{r3}" (arg4),55 [arg4] "{r3}" (arg4),
60 : "memory"56 : .{ .memory = true });
61 );
62}57}
6358
64pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {59pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -70,8 +65,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -70,8 +65,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
70 [arg3] "{r2}" (arg3),65 [arg3] "{r2}" (arg3),
71 [arg4] "{r3}" (arg4),66 [arg4] "{r3}" (arg4),
72 [arg5] "{r4}" (arg5),67 [arg5] "{r4}" (arg5),
73 : "memory"68 : .{ .memory = true });
74 );
75}69}
7670
77pub fn syscall6(71pub fn syscall6(
...@@ -92,8 +86,7 @@ pub fn syscall6(...@@ -92,8 +86,7 @@ pub fn syscall6(
92 [arg4] "{r3}" (arg4),86 [arg4] "{r3}" (arg4),
93 [arg5] "{r4}" (arg5),87 [arg5] "{r4}" (arg5),
94 [arg6] "{r5}" (arg6),88 [arg6] "{r5}" (arg6),
95 : "memory"89 : .{ .memory = true });
96 );
97}90}
9891
99pub fn clone() callconv(.naked) usize {92pub fn clone() callconv(.naked) usize {
...@@ -142,8 +135,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -142,8 +135,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
142 \\ trap0(#0)135 \\ trap0(#0)
143 :136 :
144 : [number] "{r6}" (@intFromEnum(SYS.rt_sigreturn)),137 : [number] "{r6}" (@intFromEnum(SYS.rt_sigreturn)),
145 : "memory"138 : .{ .memory = true });
146 );
147}139}
148140
149pub const F = struct {141pub const F = struct {
lib/std/os/linux/loongarch64.zig+8-16
...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
17 \\ syscall 017 \\ syscall 0
18 : [ret] "={$r4}" (-> usize),18 : [ret] "={$r4}" (-> usize),
19 : [number] "{$r11}" (@intFromEnum(number)),19 : [number] "{$r11}" (@intFromEnum(number)),
20 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"20 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
21 );
22}21}
2322
24pub fn syscall1(number: SYS, arg1: usize) usize {23pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
27 : [ret] "={$r4}" (-> usize),26 : [ret] "={$r4}" (-> usize),
28 : [number] "{$r11}" (@intFromEnum(number)),27 : [number] "{$r11}" (@intFromEnum(number)),
29 [arg1] "{$r4}" (arg1),28 [arg1] "{$r4}" (arg1),
30 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"29 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
31 );
32}30}
3331
34pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {32pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -38,8 +36,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -38,8 +36,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
38 : [number] "{$r11}" (@intFromEnum(number)),36 : [number] "{$r11}" (@intFromEnum(number)),
39 [arg1] "{$r4}" (arg1),37 [arg1] "{$r4}" (arg1),
40 [arg2] "{$r5}" (arg2),38 [arg2] "{$r5}" (arg2),
41 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"39 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
42 );
43}40}
4441
45pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {42pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -50,8 +47,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -50,8 +47,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
50 [arg1] "{$r4}" (arg1),47 [arg1] "{$r4}" (arg1),
51 [arg2] "{$r5}" (arg2),48 [arg2] "{$r5}" (arg2),
52 [arg3] "{$r6}" (arg3),49 [arg3] "{$r6}" (arg3),
53 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"50 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
54 );
55}51}
5652
57pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {53pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -63,8 +59,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -63,8 +59,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
63 [arg2] "{$r5}" (arg2),59 [arg2] "{$r5}" (arg2),
64 [arg3] "{$r6}" (arg3),60 [arg3] "{$r6}" (arg3),
65 [arg4] "{$r7}" (arg4),61 [arg4] "{$r7}" (arg4),
66 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"62 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
67 );
68}63}
6964
70pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {65pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -77,8 +72,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -77,8 +72,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
77 [arg3] "{$r6}" (arg3),72 [arg3] "{$r6}" (arg3),
78 [arg4] "{$r7}" (arg4),73 [arg4] "{$r7}" (arg4),
79 [arg5] "{$r8}" (arg5),74 [arg5] "{$r8}" (arg5),
80 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"75 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
81 );
82}76}
8377
84pub fn syscall6(78pub fn syscall6(
...@@ -100,8 +94,7 @@ pub fn syscall6(...@@ -100,8 +94,7 @@ pub fn syscall6(
100 [arg4] "{$r7}" (arg4),94 [arg4] "{$r7}" (arg4),
101 [arg5] "{$r8}" (arg5),95 [arg5] "{$r8}" (arg5),
102 [arg6] "{$r9}" (arg6),96 [arg6] "{$r9}" (arg6),
103 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"97 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
104 );
105}98}
10699
107pub fn clone() callconv(.naked) usize {100pub fn clone() callconv(.naked) usize {
...@@ -150,8 +143,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -150,8 +143,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
150 \\ syscall 0143 \\ syscall 0
151 :144 :
152 : [number] "r" (@intFromEnum(SYS.rt_sigreturn)),145 : [number] "r" (@intFromEnum(SYS.rt_sigreturn)),
153 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"146 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
154 );
155}147}
156148
157pub const msghdr = extern struct {149pub const msghdr = extern struct {
lib/std/os/linux/m68k.zig+8-16
...@@ -15,8 +15,7 @@ pub fn syscall0(number: SYS) usize {...@@ -15,8 +15,7 @@ pub fn syscall0(number: SYS) usize {
15 return asm volatile ("trap #0"15 return asm volatile ("trap #0"
16 : [ret] "={d0}" (-> usize),16 : [ret] "={d0}" (-> usize),
17 : [number] "{d0}" (@intFromEnum(number)),17 : [number] "{d0}" (@intFromEnum(number)),
18 : "memory"18 : .{ .memory = true });
19 );
20}19}
2120
22pub fn syscall1(number: SYS, arg1: usize) usize {21pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -24,8 +23,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -24,8 +23,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
24 : [ret] "={d0}" (-> usize),23 : [ret] "={d0}" (-> usize),
25 : [number] "{d0}" (@intFromEnum(number)),24 : [number] "{d0}" (@intFromEnum(number)),
26 [arg1] "{d1}" (arg1),25 [arg1] "{d1}" (arg1),
27 : "memory"26 : .{ .memory = true });
28 );
29}27}
3028
31pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {29pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -34,8 +32,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -34,8 +32,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
34 : [number] "{d0}" (@intFromEnum(number)),32 : [number] "{d0}" (@intFromEnum(number)),
35 [arg1] "{d1}" (arg1),33 [arg1] "{d1}" (arg1),
36 [arg2] "{d2}" (arg2),34 [arg2] "{d2}" (arg2),
37 : "memory"35 : .{ .memory = true });
38 );
39}36}
4037
41pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {38pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -45,8 +42,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -45,8 +42,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
45 [arg1] "{d1}" (arg1),42 [arg1] "{d1}" (arg1),
46 [arg2] "{d2}" (arg2),43 [arg2] "{d2}" (arg2),
47 [arg3] "{d3}" (arg3),44 [arg3] "{d3}" (arg3),
48 : "memory"45 : .{ .memory = true });
49 );
50}46}
5147
52pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {48pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -57,8 +53,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -57,8 +53,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
57 [arg2] "{d2}" (arg2),53 [arg2] "{d2}" (arg2),
58 [arg3] "{d3}" (arg3),54 [arg3] "{d3}" (arg3),
59 [arg4] "{d4}" (arg4),55 [arg4] "{d4}" (arg4),
60 : "memory"56 : .{ .memory = true });
61 );
62}57}
6358
64pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {59pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -70,8 +65,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -70,8 +65,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
70 [arg3] "{d3}" (arg3),65 [arg3] "{d3}" (arg3),
71 [arg4] "{d4}" (arg4),66 [arg4] "{d4}" (arg4),
72 [arg5] "{d5}" (arg5),67 [arg5] "{d5}" (arg5),
73 : "memory"68 : .{ .memory = true });
74 );
75}69}
7670
77pub fn syscall6(71pub fn syscall6(
...@@ -92,8 +86,7 @@ pub fn syscall6(...@@ -92,8 +86,7 @@ pub fn syscall6(
92 [arg4] "{d4}" (arg4),86 [arg4] "{d4}" (arg4),
93 [arg5] "{d5}" (arg5),87 [arg5] "{d5}" (arg5),
94 [arg6] "{a0}" (arg6),88 [arg6] "{a0}" (arg6),
95 : "memory"89 : .{ .memory = true });
96 );
97}90}
9891
99pub fn clone() callconv(.naked) usize {92pub fn clone() callconv(.naked) usize {
...@@ -155,8 +148,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -155,8 +148,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
155 asm volatile ("trap #0"148 asm volatile ("trap #0"
156 :149 :
157 : [number] "{d0}" (@intFromEnum(SYS.rt_sigreturn)),150 : [number] "{d0}" (@intFromEnum(SYS.rt_sigreturn)),
158 : "memory"151 : .{ .memory = true });
159 );
160}152}
161153
162pub const F = struct {154pub const F = struct {
lib/std/os/linux/mips.zig+11-22
...@@ -21,8 +21,7 @@ pub fn syscall0(number: SYS) usize {...@@ -21,8 +21,7 @@ pub fn syscall0(number: SYS) usize {
21 \\ 1:21 \\ 1:
22 : [ret] "={$2}" (-> usize),22 : [ret] "={$2}" (-> usize),
23 : [number] "{$2}" (@intFromEnum(number)),23 : [number] "{$2}" (@intFromEnum(number)),
24 : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"24 : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
25 );
26}25}
2726
28pub fn syscall_pipe(fd: *[2]i32) usize {27pub fn syscall_pipe(fd: *[2]i32) usize {
...@@ -41,8 +40,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {...@@ -41,8 +40,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
41 : [ret] "={$2}" (-> usize),40 : [ret] "={$2}" (-> usize),
42 : [number] "{$2}" (@intFromEnum(SYS.pipe)),41 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
43 [fd] "{$4}" (fd),42 [fd] "{$4}" (fd),
44 : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"43 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
45 );
46}44}
4745
48pub fn syscall1(number: SYS, arg1: usize) usize {46pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -55,8 +53,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -55,8 +53,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
55 : [ret] "={$2}" (-> usize),53 : [ret] "={$2}" (-> usize),
56 : [number] "{$2}" (@intFromEnum(number)),54 : [number] "{$2}" (@intFromEnum(number)),
57 [arg1] "{$4}" (arg1),55 [arg1] "{$4}" (arg1),
58 : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"56 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
59 );
60}57}
6158
62pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {59pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -70,8 +67,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -70,8 +67,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
70 : [number] "{$2}" (@intFromEnum(number)),67 : [number] "{$2}" (@intFromEnum(number)),
71 [arg1] "{$4}" (arg1),68 [arg1] "{$4}" (arg1),
72 [arg2] "{$5}" (arg2),69 [arg2] "{$5}" (arg2),
73 : "$1", "$3", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"70 : .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
74 );
75}71}
7672
77pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {73pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -86,8 +82,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -86,8 +82,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
86 [arg1] "{$4}" (arg1),82 [arg1] "{$4}" (arg1),
87 [arg2] "{$5}" (arg2),83 [arg2] "{$5}" (arg2),
88 [arg3] "{$6}" (arg3),84 [arg3] "{$6}" (arg3),
89 : "$1", "$3", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"85 : .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
90 );
91}86}
9287
93pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {88pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -103,8 +98,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -103,8 +98,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
103 [arg2] "{$5}" (arg2),98 [arg2] "{$5}" (arg2),
104 [arg3] "{$6}" (arg3),99 [arg3] "{$6}" (arg3),
105 [arg4] "{$7}" (arg4),100 [arg4] "{$7}" (arg4),
106 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"101 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
107 );
108}102}
109103
110pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {104pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -125,8 +119,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -125,8 +119,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
125 [arg3] "{$6}" (arg3),119 [arg3] "{$6}" (arg3),
126 [arg4] "{$7}" (arg4),120 [arg4] "{$7}" (arg4),
127 [arg5] "r" (arg5),121 [arg5] "r" (arg5),
128 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"122 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
129 );
130}123}
131124
132// NOTE: The o32 calling convention requires the callee to reserve 16 bytes for125// NOTE: The o32 calling convention requires the callee to reserve 16 bytes for
...@@ -160,8 +153,7 @@ pub fn syscall6(...@@ -160,8 +153,7 @@ pub fn syscall6(
160 [arg4] "{$7}" (arg4),153 [arg4] "{$7}" (arg4),
161 [arg5] "r" (arg5),154 [arg5] "r" (arg5),
162 [arg6] "r" (arg6),155 [arg6] "r" (arg6),
163 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"156 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
164 );
165}157}
166158
167pub fn syscall7(159pub fn syscall7(
...@@ -195,8 +187,7 @@ pub fn syscall7(...@@ -195,8 +187,7 @@ pub fn syscall7(
195 [arg5] "r" (arg5),187 [arg5] "r" (arg5),
196 [arg6] "r" (arg6),188 [arg6] "r" (arg6),
197 [arg7] "r" (arg7),189 [arg7] "r" (arg7),
198 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"190 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
199 );
200}191}
201192
202pub fn clone() callconv(.naked) usize {193pub fn clone() callconv(.naked) usize {
...@@ -255,8 +246,7 @@ pub fn restore() callconv(.naked) noreturn {...@@ -255,8 +246,7 @@ pub fn restore() callconv(.naked) noreturn {
255 \\ syscall246 \\ syscall
256 :247 :
257 : [number] "{$2}" (@intFromEnum(SYS.sigreturn)),248 : [number] "{$2}" (@intFromEnum(SYS.sigreturn)),
258 : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"249 : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
259 );
260}250}
261251
262pub fn restore_rt() callconv(.naked) noreturn {252pub fn restore_rt() callconv(.naked) noreturn {
...@@ -264,8 +254,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -264,8 +254,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
264 \\ syscall254 \\ syscall
265 :255 :
266 : [number] "{$2}" (@intFromEnum(SYS.rt_sigreturn)),256 : [number] "{$2}" (@intFromEnum(SYS.rt_sigreturn)),
267 : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"257 : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
268 );
269}258}
270259
271pub const F = struct {260pub const F = struct {
lib/std/os/linux/mips64.zig+11-22
...@@ -21,8 +21,7 @@ pub fn syscall0(number: SYS) usize {...@@ -21,8 +21,7 @@ pub fn syscall0(number: SYS) usize {
21 \\ 1:21 \\ 1:
22 : [ret] "={$2}" (-> usize),22 : [ret] "={$2}" (-> usize),
23 : [number] "{$2}" (@intFromEnum(number)),23 : [number] "{$2}" (@intFromEnum(number)),
24 : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"24 : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
25 );
26}25}
2726
28pub fn syscall_pipe(fd: *[2]i32) usize {27pub fn syscall_pipe(fd: *[2]i32) usize {
...@@ -41,8 +40,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {...@@ -41,8 +40,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
41 : [ret] "={$2}" (-> usize),40 : [ret] "={$2}" (-> usize),
42 : [number] "{$2}" (@intFromEnum(SYS.pipe)),41 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
43 [fd] "{$4}" (fd),42 [fd] "{$4}" (fd),
44 : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"43 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
45 );
46}44}
4745
48pub fn syscall1(number: SYS, arg1: usize) usize {46pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -56,8 +54,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -56,8 +54,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
56 : [ret] "={$2}" (-> usize),54 : [ret] "={$2}" (-> usize),
57 : [number] "{$2}" (@intFromEnum(number)),55 : [number] "{$2}" (@intFromEnum(number)),
58 [arg1] "{$4}" (arg1),56 [arg1] "{$4}" (arg1),
59 : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"57 : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
60 );
61}58}
6259
63pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {60pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -71,8 +68,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -71,8 +68,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
71 : [number] "{$2}" (@intFromEnum(number)),68 : [number] "{$2}" (@intFromEnum(number)),
72 [arg1] "{$4}" (arg1),69 [arg1] "{$4}" (arg1),
73 [arg2] "{$5}" (arg2),70 [arg2] "{$5}" (arg2),
74 : "$1", "$3", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"71 : .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
75 );
76}72}
7773
78pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {74pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -87,8 +83,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -87,8 +83,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
87 [arg1] "{$4}" (arg1),83 [arg1] "{$4}" (arg1),
88 [arg2] "{$5}" (arg2),84 [arg2] "{$5}" (arg2),
89 [arg3] "{$6}" (arg3),85 [arg3] "{$6}" (arg3),
90 : "$1", "$3", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"86 : .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
91 );
92}87}
9388
94pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {89pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -104,8 +99,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -104,8 +99,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
104 [arg2] "{$5}" (arg2),99 [arg2] "{$5}" (arg2),
105 [arg3] "{$6}" (arg3),100 [arg3] "{$6}" (arg3),
106 [arg4] "{$7}" (arg4),101 [arg4] "{$7}" (arg4),
107 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"102 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
108 );
109}103}
110104
111pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {105pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -122,8 +116,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -122,8 +116,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
122 [arg3] "{$6}" (arg3),116 [arg3] "{$6}" (arg3),
123 [arg4] "{$7}" (arg4),117 [arg4] "{$7}" (arg4),
124 [arg5] "{$8}" (arg5),118 [arg5] "{$8}" (arg5),
125 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"119 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
126 );
127}120}
128121
129pub fn syscall6(122pub fn syscall6(
...@@ -149,8 +142,7 @@ pub fn syscall6(...@@ -149,8 +142,7 @@ pub fn syscall6(
149 [arg4] "{$7}" (arg4),142 [arg4] "{$7}" (arg4),
150 [arg5] "{$8}" (arg5),143 [arg5] "{$8}" (arg5),
151 [arg6] "{$9}" (arg6),144 [arg6] "{$9}" (arg6),
152 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"145 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
153 );
154}146}
155147
156pub fn syscall7(148pub fn syscall7(
...@@ -178,8 +170,7 @@ pub fn syscall7(...@@ -178,8 +170,7 @@ pub fn syscall7(
178 [arg5] "{$8}" (arg5),170 [arg5] "{$8}" (arg5),
179 [arg6] "{$9}" (arg6),171 [arg6] "{$9}" (arg6),
180 [arg7] "{$10}" (arg7),172 [arg7] "{$10}" (arg7),
181 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"173 : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
182 );
183}174}
184175
185pub fn clone() callconv(.naked) usize {176pub fn clone() callconv(.naked) usize {
...@@ -234,8 +225,7 @@ pub fn restore() callconv(.naked) noreturn {...@@ -234,8 +225,7 @@ pub fn restore() callconv(.naked) noreturn {
234 \\ syscall225 \\ syscall
235 :226 :
236 : [number] "{$2}" (@intFromEnum(SYS.rt_sigreturn)),227 : [number] "{$2}" (@intFromEnum(SYS.rt_sigreturn)),
237 : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"228 : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
238 );
239}229}
240230
241pub fn restore_rt() callconv(.naked) noreturn {231pub fn restore_rt() callconv(.naked) noreturn {
...@@ -243,8 +233,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -243,8 +233,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
243 \\ syscall233 \\ syscall
244 :234 :
245 : [number] "{$2}" (@intFromEnum(SYS.rt_sigreturn)),235 : [number] "{$2}" (@intFromEnum(SYS.rt_sigreturn)),
246 : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"236 : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
247 );
248}237}
249238
250pub const F = struct {239pub const F = struct {
lib/std/os/linux/powerpc.zig+8-16
...@@ -22,8 +22,7 @@ pub fn syscall0(number: SYS) usize {...@@ -22,8 +22,7 @@ pub fn syscall0(number: SYS) usize {
22 \\ 1:22 \\ 1:
23 : [ret] "={r3}" (-> usize),23 : [ret] "={r3}" (-> usize),
24 : [number] "{r0}" (@intFromEnum(number)),24 : [number] "{r0}" (@intFromEnum(number)),
25 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"25 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
26 );
27}26}
2827
29pub fn syscall1(number: SYS, arg1: usize) usize {28pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -35,8 +34,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -35,8 +34,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
35 : [ret] "={r3}" (-> usize),34 : [ret] "={r3}" (-> usize),
36 : [number] "{r0}" (@intFromEnum(number)),35 : [number] "{r0}" (@intFromEnum(number)),
37 [arg1] "{r3}" (arg1),36 [arg1] "{r3}" (arg1),
38 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"37 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
39 );
40}38}
4139
42pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {40pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -49,8 +47,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -49,8 +47,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
49 : [number] "{r0}" (@intFromEnum(number)),47 : [number] "{r0}" (@intFromEnum(number)),
50 [arg1] "{r3}" (arg1),48 [arg1] "{r3}" (arg1),
51 [arg2] "{r4}" (arg2),49 [arg2] "{r4}" (arg2),
52 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"50 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
53 );
54}51}
5552
56pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {53pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -64,8 +61,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -64,8 +61,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
64 [arg1] "{r3}" (arg1),61 [arg1] "{r3}" (arg1),
65 [arg2] "{r4}" (arg2),62 [arg2] "{r4}" (arg2),
66 [arg3] "{r5}" (arg3),63 [arg3] "{r5}" (arg3),
67 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"64 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
68 );
69}65}
7066
71pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {67pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -80,8 +76,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -80,8 +76,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
80 [arg2] "{r4}" (arg2),76 [arg2] "{r4}" (arg2),
81 [arg3] "{r5}" (arg3),77 [arg3] "{r5}" (arg3),
82 [arg4] "{r6}" (arg4),78 [arg4] "{r6}" (arg4),
83 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"79 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
84 );
85}80}
8681
87pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {82pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -97,8 +92,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -97,8 +92,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
97 [arg3] "{r5}" (arg3),92 [arg3] "{r5}" (arg3),
98 [arg4] "{r6}" (arg4),93 [arg4] "{r6}" (arg4),
99 [arg5] "{r7}" (arg5),94 [arg5] "{r7}" (arg5),
100 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"95 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
101 );
102}96}
10397
104pub fn syscall6(98pub fn syscall6(
...@@ -123,8 +117,7 @@ pub fn syscall6(...@@ -123,8 +117,7 @@ pub fn syscall6(
123 [arg4] "{r6}" (arg4),117 [arg4] "{r6}" (arg4),
124 [arg5] "{r7}" (arg5),118 [arg5] "{r7}" (arg5),
125 [arg6] "{r8}" (arg6),119 [arg6] "{r8}" (arg6),
126 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"120 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
127 );
128}121}
129122
130pub fn clone() callconv(.naked) usize {123pub fn clone() callconv(.naked) usize {
...@@ -204,8 +197,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -204,8 +197,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
204 \\ sc197 \\ sc
205 :198 :
206 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),199 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
207 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"200 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
208 );
209}201}
210202
211pub const F = struct {203pub const F = struct {
lib/std/os/linux/powerpc64.zig+8-16
...@@ -22,8 +22,7 @@ pub fn syscall0(number: SYS) usize {...@@ -22,8 +22,7 @@ pub fn syscall0(number: SYS) usize {
22 \\ 1:22 \\ 1:
23 : [ret] "={r3}" (-> usize),23 : [ret] "={r3}" (-> usize),
24 : [number] "{r0}" (@intFromEnum(number)),24 : [number] "{r0}" (@intFromEnum(number)),
25 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"25 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
26 );
27}26}
2827
29pub fn syscall1(number: SYS, arg1: usize) usize {28pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -35,8 +34,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -35,8 +34,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
35 : [ret] "={r3}" (-> usize),34 : [ret] "={r3}" (-> usize),
36 : [number] "{r0}" (@intFromEnum(number)),35 : [number] "{r0}" (@intFromEnum(number)),
37 [arg1] "{r3}" (arg1),36 [arg1] "{r3}" (arg1),
38 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"37 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
39 );
40}38}
4139
42pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {40pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -49,8 +47,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -49,8 +47,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
49 : [number] "{r0}" (@intFromEnum(number)),47 : [number] "{r0}" (@intFromEnum(number)),
50 [arg1] "{r3}" (arg1),48 [arg1] "{r3}" (arg1),
51 [arg2] "{r4}" (arg2),49 [arg2] "{r4}" (arg2),
52 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"50 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
53 );
54}51}
5552
56pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {53pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -64,8 +61,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -64,8 +61,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
64 [arg1] "{r3}" (arg1),61 [arg1] "{r3}" (arg1),
65 [arg2] "{r4}" (arg2),62 [arg2] "{r4}" (arg2),
66 [arg3] "{r5}" (arg3),63 [arg3] "{r5}" (arg3),
67 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"64 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
68 );
69}65}
7066
71pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {67pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -80,8 +76,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -80,8 +76,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
80 [arg2] "{r4}" (arg2),76 [arg2] "{r4}" (arg2),
81 [arg3] "{r5}" (arg3),77 [arg3] "{r5}" (arg3),
82 [arg4] "{r6}" (arg4),78 [arg4] "{r6}" (arg4),
83 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"79 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
84 );
85}80}
8681
87pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {82pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -97,8 +92,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -97,8 +92,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
97 [arg3] "{r5}" (arg3),92 [arg3] "{r5}" (arg3),
98 [arg4] "{r6}" (arg4),93 [arg4] "{r6}" (arg4),
99 [arg5] "{r7}" (arg5),94 [arg5] "{r7}" (arg5),
100 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"95 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
101 );
102}96}
10397
104pub fn syscall6(98pub fn syscall6(
...@@ -123,8 +117,7 @@ pub fn syscall6(...@@ -123,8 +117,7 @@ pub fn syscall6(
123 [arg4] "{r6}" (arg4),117 [arg4] "{r6}" (arg4),
124 [arg5] "{r7}" (arg5),118 [arg5] "{r7}" (arg5),
125 [arg6] "{r8}" (arg6),119 [arg6] "{r8}" (arg6),
126 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"120 : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
127 );
128}121}
129122
130pub fn clone() callconv(.naked) usize {123pub fn clone() callconv(.naked) usize {
...@@ -189,8 +182,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -189,8 +182,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
189 \\ sc182 \\ sc
190 :183 :
191 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),184 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
192 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"185 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
193 );
194}186}
195187
196pub const F = struct {188pub const F = struct {
lib/std/os/linux/riscv32.zig+8-16
...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
17 return asm volatile ("ecall"17 return asm volatile ("ecall"
18 : [ret] "={x10}" (-> usize),18 : [ret] "={x10}" (-> usize),
19 : [number] "{x17}" (@intFromEnum(number)),19 : [number] "{x17}" (@intFromEnum(number)),
20 : "memory"20 : .{ .memory = true });
21 );
22}21}
2322
24pub fn syscall1(number: SYS, arg1: usize) usize {23pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
26 : [ret] "={x10}" (-> usize),25 : [ret] "={x10}" (-> usize),
27 : [number] "{x17}" (@intFromEnum(number)),26 : [number] "{x17}" (@intFromEnum(number)),
28 [arg1] "{x10}" (arg1),27 [arg1] "{x10}" (arg1),
29 : "memory"28 : .{ .memory = true });
30 );
31}29}
3230
33pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {31pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
36 : [number] "{x17}" (@intFromEnum(number)),34 : [number] "{x17}" (@intFromEnum(number)),
37 [arg1] "{x10}" (arg1),35 [arg1] "{x10}" (arg1),
38 [arg2] "{x11}" (arg2),36 [arg2] "{x11}" (arg2),
39 : "memory"37 : .{ .memory = true });
40 );
41}38}
4239
43pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {40pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
47 [arg1] "{x10}" (arg1),44 [arg1] "{x10}" (arg1),
48 [arg2] "{x11}" (arg2),45 [arg2] "{x11}" (arg2),
49 [arg3] "{x12}" (arg3),46 [arg3] "{x12}" (arg3),
50 : "memory"47 : .{ .memory = true });
51 );
52}48}
5349
54pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {50pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
59 [arg2] "{x11}" (arg2),55 [arg2] "{x11}" (arg2),
60 [arg3] "{x12}" (arg3),56 [arg3] "{x12}" (arg3),
61 [arg4] "{x13}" (arg4),57 [arg4] "{x13}" (arg4),
62 : "memory"58 : .{ .memory = true });
63 );
64}59}
6560
66pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {61pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
72 [arg3] "{x12}" (arg3),67 [arg3] "{x12}" (arg3),
73 [arg4] "{x13}" (arg4),68 [arg4] "{x13}" (arg4),
74 [arg5] "{x14}" (arg5),69 [arg5] "{x14}" (arg5),
75 : "memory"70 : .{ .memory = true });
76 );
77}71}
7872
79pub fn syscall6(73pub fn syscall6(
...@@ -94,8 +88,7 @@ pub fn syscall6(...@@ -94,8 +88,7 @@ pub fn syscall6(
94 [arg4] "{x13}" (arg4),88 [arg4] "{x13}" (arg4),
95 [arg5] "{x14}" (arg5),89 [arg5] "{x14}" (arg5),
96 [arg6] "{x15}" (arg6),90 [arg6] "{x15}" (arg6),
97 : "memory"91 : .{ .memory = true });
98 );
99}92}
10093
101pub fn clone() callconv(.naked) usize {94pub fn clone() callconv(.naked) usize {
...@@ -149,8 +142,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -149,8 +142,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
149 \\ ecall142 \\ ecall
150 :143 :
151 : [number] "{x17}" (@intFromEnum(SYS.rt_sigreturn)),144 : [number] "{x17}" (@intFromEnum(SYS.rt_sigreturn)),
152 : "memory"145 : .{ .memory = true });
153 );
154}146}
155147
156pub const F = struct {148pub const F = struct {
lib/std/os/linux/riscv64.zig+8-16
...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
17 return asm volatile ("ecall"17 return asm volatile ("ecall"
18 : [ret] "={x10}" (-> usize),18 : [ret] "={x10}" (-> usize),
19 : [number] "{x17}" (@intFromEnum(number)),19 : [number] "{x17}" (@intFromEnum(number)),
20 : "memory"20 : .{ .memory = true });
21 );
22}21}
2322
24pub fn syscall1(number: SYS, arg1: usize) usize {23pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
26 : [ret] "={x10}" (-> usize),25 : [ret] "={x10}" (-> usize),
27 : [number] "{x17}" (@intFromEnum(number)),26 : [number] "{x17}" (@intFromEnum(number)),
28 [arg1] "{x10}" (arg1),27 [arg1] "{x10}" (arg1),
29 : "memory"28 : .{ .memory = true });
30 );
31}29}
3230
33pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {31pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
36 : [number] "{x17}" (@intFromEnum(number)),34 : [number] "{x17}" (@intFromEnum(number)),
37 [arg1] "{x10}" (arg1),35 [arg1] "{x10}" (arg1),
38 [arg2] "{x11}" (arg2),36 [arg2] "{x11}" (arg2),
39 : "memory"37 : .{ .memory = true });
40 );
41}38}
4239
43pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {40pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
47 [arg1] "{x10}" (arg1),44 [arg1] "{x10}" (arg1),
48 [arg2] "{x11}" (arg2),45 [arg2] "{x11}" (arg2),
49 [arg3] "{x12}" (arg3),46 [arg3] "{x12}" (arg3),
50 : "memory"47 : .{ .memory = true });
51 );
52}48}
5349
54pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {50pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
59 [arg2] "{x11}" (arg2),55 [arg2] "{x11}" (arg2),
60 [arg3] "{x12}" (arg3),56 [arg3] "{x12}" (arg3),
61 [arg4] "{x13}" (arg4),57 [arg4] "{x13}" (arg4),
62 : "memory"58 : .{ .memory = true });
63 );
64}59}
6560
66pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {61pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
72 [arg3] "{x12}" (arg3),67 [arg3] "{x12}" (arg3),
73 [arg4] "{x13}" (arg4),68 [arg4] "{x13}" (arg4),
74 [arg5] "{x14}" (arg5),69 [arg5] "{x14}" (arg5),
75 : "memory"70 : .{ .memory = true });
76 );
77}71}
7872
79pub fn syscall6(73pub fn syscall6(
...@@ -94,8 +88,7 @@ pub fn syscall6(...@@ -94,8 +88,7 @@ pub fn syscall6(
94 [arg4] "{x13}" (arg4),88 [arg4] "{x13}" (arg4),
95 [arg5] "{x14}" (arg5),89 [arg5] "{x14}" (arg5),
96 [arg6] "{x15}" (arg6),90 [arg6] "{x15}" (arg6),
97 : "memory"91 : .{ .memory = true });
98 );
99}92}
10093
101pub fn clone() callconv(.naked) usize {94pub fn clone() callconv(.naked) usize {
...@@ -149,8 +142,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -149,8 +142,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
149 \\ ecall142 \\ ecall
150 :143 :
151 : [number] "{x17}" (@intFromEnum(SYS.rt_sigreturn)),144 : [number] "{x17}" (@intFromEnum(SYS.rt_sigreturn)),
152 : "memory"145 : .{ .memory = true });
153 );
154}146}
155147
156pub const F = struct {148pub const F = struct {
lib/std/os/linux/s390x.zig+8-16
...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {...@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
17 return asm volatile ("svc 0"17 return asm volatile ("svc 0"
18 : [ret] "={r2}" (-> usize),18 : [ret] "={r2}" (-> usize),
19 : [number] "{r1}" (@intFromEnum(number)),19 : [number] "{r1}" (@intFromEnum(number)),
20 : "memory"20 : .{ .memory = true });
21 );
22}21}
2322
24pub fn syscall1(number: SYS, arg1: usize) usize {23pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
26 : [ret] "={r2}" (-> usize),25 : [ret] "={r2}" (-> usize),
27 : [number] "{r1}" (@intFromEnum(number)),26 : [number] "{r1}" (@intFromEnum(number)),
28 [arg1] "{r2}" (arg1),27 [arg1] "{r2}" (arg1),
29 : "memory"28 : .{ .memory = true });
30 );
31}29}
3230
33pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {31pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
36 : [number] "{r1}" (@intFromEnum(number)),34 : [number] "{r1}" (@intFromEnum(number)),
37 [arg1] "{r2}" (arg1),35 [arg1] "{r2}" (arg1),
38 [arg2] "{r3}" (arg2),36 [arg2] "{r3}" (arg2),
39 : "memory"37 : .{ .memory = true });
40 );
41}38}
4239
43pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {40pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
47 [arg1] "{r2}" (arg1),44 [arg1] "{r2}" (arg1),
48 [arg2] "{r3}" (arg2),45 [arg2] "{r3}" (arg2),
49 [arg3] "{r4}" (arg3),46 [arg3] "{r4}" (arg3),
50 : "memory"47 : .{ .memory = true });
51 );
52}48}
5349
54pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {50pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
59 [arg2] "{r3}" (arg2),55 [arg2] "{r3}" (arg2),
60 [arg3] "{r4}" (arg3),56 [arg3] "{r4}" (arg3),
61 [arg4] "{r5}" (arg4),57 [arg4] "{r5}" (arg4),
62 : "memory"58 : .{ .memory = true });
63 );
64}59}
6560
66pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {61pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
72 [arg3] "{r4}" (arg3),67 [arg3] "{r4}" (arg3),
73 [arg4] "{r5}" (arg4),68 [arg4] "{r5}" (arg4),
74 [arg5] "{r6}" (arg5),69 [arg5] "{r6}" (arg5),
75 : "memory"70 : .{ .memory = true });
76 );
77}71}
7872
79pub fn syscall6(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize, arg6: usize) usize {73pub fn syscall6(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize, arg6: usize) usize {
...@@ -86,8 +80,7 @@ pub fn syscall6(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -86,8 +80,7 @@ pub fn syscall6(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
86 [arg4] "{r5}" (arg4),80 [arg4] "{r5}" (arg4),
87 [arg5] "{r6}" (arg5),81 [arg5] "{r6}" (arg5),
88 [arg6] "{r7}" (arg6),82 [arg6] "{r7}" (arg6),
89 : "memory"83 : .{ .memory = true });
90 );
91}84}
9285
93pub fn clone() callconv(.naked) usize {86pub fn clone() callconv(.naked) usize {
...@@ -161,8 +154,7 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -161,8 +154,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
161 \\svc 0154 \\svc 0
162 :155 :
163 : [number] "{r1}" (@intFromEnum(SYS.rt_sigreturn)),156 : [number] "{r1}" (@intFromEnum(SYS.rt_sigreturn)),
164 : "memory"157 : .{ .memory = true });
165 );
166}158}
167159
168pub const F = struct {160pub const F = struct {
lib/std/os/linux/sparc64.zig+10-20
...@@ -32,8 +32,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {...@@ -32,8 +32,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
32 : [ret] "={o0}" (-> usize),32 : [ret] "={o0}" (-> usize),
33 : [number] "{g1}" (@intFromEnum(SYS.pipe)),33 : [number] "{g1}" (@intFromEnum(SYS.pipe)),
34 [arg] "r" (fd),34 [arg] "r" (fd),
35 : "memory", "g3"35 : .{ .memory = true, .g3 = true });
36 );
37}36}
3837
39pub fn syscall_fork() usize {38pub fn syscall_fork() usize {
...@@ -55,8 +54,7 @@ pub fn syscall_fork() usize {...@@ -55,8 +54,7 @@ pub fn syscall_fork() usize {
55 \\ 2:54 \\ 2:
56 : [ret] "={o0}" (-> usize),55 : [ret] "={o0}" (-> usize),
57 : [number] "{g1}" (@intFromEnum(SYS.fork)),56 : [number] "{g1}" (@intFromEnum(SYS.fork)),
58 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"57 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
59 );
60}58}
6159
62pub fn syscall0(number: SYS) usize {60pub fn syscall0(number: SYS) usize {
...@@ -68,8 +66,7 @@ pub fn syscall0(number: SYS) usize {...@@ -68,8 +66,7 @@ pub fn syscall0(number: SYS) usize {
68 \\ 1:66 \\ 1:
69 : [ret] "={o0}" (-> usize),67 : [ret] "={o0}" (-> usize),
70 : [number] "{g1}" (@intFromEnum(number)),68 : [number] "{g1}" (@intFromEnum(number)),
71 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"69 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
72 );
73}70}
7471
75pub fn syscall1(number: SYS, arg1: usize) usize {72pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -82,8 +79,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -82,8 +79,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
82 : [ret] "={o0}" (-> usize),79 : [ret] "={o0}" (-> usize),
83 : [number] "{g1}" (@intFromEnum(number)),80 : [number] "{g1}" (@intFromEnum(number)),
84 [arg1] "{o0}" (arg1),81 [arg1] "{o0}" (arg1),
85 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"82 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
86 );
87}83}
8884
89pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {85pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -97,8 +93,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -97,8 +93,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
97 : [number] "{g1}" (@intFromEnum(number)),93 : [number] "{g1}" (@intFromEnum(number)),
98 [arg1] "{o0}" (arg1),94 [arg1] "{o0}" (arg1),
99 [arg2] "{o1}" (arg2),95 [arg2] "{o1}" (arg2),
100 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"96 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
101 );
102}97}
10398
104pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {99pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -113,8 +108,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -113,8 +108,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
113 [arg1] "{o0}" (arg1),108 [arg1] "{o0}" (arg1),
114 [arg2] "{o1}" (arg2),109 [arg2] "{o1}" (arg2),
115 [arg3] "{o2}" (arg3),110 [arg3] "{o2}" (arg3),
116 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"111 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
117 );
118}112}
119113
120pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {114pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -130,8 +124,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -130,8 +124,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
130 [arg2] "{o1}" (arg2),124 [arg2] "{o1}" (arg2),
131 [arg3] "{o2}" (arg3),125 [arg3] "{o2}" (arg3),
132 [arg4] "{o3}" (arg4),126 [arg4] "{o3}" (arg4),
133 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"127 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
134 );
135}128}
136129
137pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {130pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -148,8 +141,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -148,8 +141,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
148 [arg3] "{o2}" (arg3),141 [arg3] "{o2}" (arg3),
149 [arg4] "{o3}" (arg4),142 [arg4] "{o3}" (arg4),
150 [arg5] "{o4}" (arg5),143 [arg5] "{o4}" (arg5),
151 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"144 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
152 );
153}145}
154146
155pub fn syscall6(147pub fn syscall6(
...@@ -175,8 +167,7 @@ pub fn syscall6(...@@ -175,8 +167,7 @@ pub fn syscall6(
175 [arg4] "{o3}" (arg4),167 [arg4] "{o3}" (arg4),
176 [arg5] "{o4}" (arg5),168 [arg5] "{o4}" (arg5),
177 [arg6] "{o5}" (arg6),169 [arg6] "{o5}" (arg6),
178 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"170 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
179 );
180}171}
181172
182pub fn clone() callconv(.naked) usize {173pub fn clone() callconv(.naked) usize {
...@@ -242,8 +233,7 @@ pub fn restore_rt() callconv(.c) void {...@@ -242,8 +233,7 @@ pub fn restore_rt() callconv(.c) void {
242 return asm volatile ("t 0x6d"233 return asm volatile ("t 0x6d"
243 :234 :
244 : [number] "{g1}" (@intFromEnum(SYS.rt_sigreturn)),235 : [number] "{g1}" (@intFromEnum(SYS.rt_sigreturn)),
245 : "memory", "xcc", "o0", "o1", "o2", "o3", "o4", "o5", "o7"236 : .{ .memory = true, .xcc = true, .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
246 );
247}237}
248238
249pub const F = struct {239pub const F = struct {
lib/std/os/linux/thumb.zig+8-16
...@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {...@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {
18 \\ ldr r7, [%[tmp], #4]18 \\ ldr r7, [%[tmp], #4]
19 : [ret] "={r0}" (-> usize),19 : [ret] "={r0}" (-> usize),
20 : [tmp] "{r1}" (&buf),20 : [tmp] "{r1}" (&buf),
21 : "memory"21 : .{ .memory = true });
22 );
23}22}
2423
25pub fn syscall1(number: SYS, arg1: usize) usize {24pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -34,8 +33,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -34,8 +33,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
34 : [ret] "={r0}" (-> usize),33 : [ret] "={r0}" (-> usize),
35 : [tmp] "{r1}" (&buf),34 : [tmp] "{r1}" (&buf),
36 [arg1] "{r0}" (arg1),35 [arg1] "{r0}" (arg1),
37 : "memory"36 : .{ .memory = true });
38 );
39}37}
4038
41pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {39pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -51,8 +49,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -51,8 +49,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
51 : [tmp] "{r2}" (&buf),49 : [tmp] "{r2}" (&buf),
52 [arg1] "{r0}" (arg1),50 [arg1] "{r0}" (arg1),
53 [arg2] "{r1}" (arg2),51 [arg2] "{r1}" (arg2),
54 : "memory"52 : .{ .memory = true });
55 );
56}53}
5754
58pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {55pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -69,8 +66,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -69,8 +66,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
69 [arg1] "{r0}" (arg1),66 [arg1] "{r0}" (arg1),
70 [arg2] "{r1}" (arg2),67 [arg2] "{r1}" (arg2),
71 [arg3] "{r2}" (arg3),68 [arg3] "{r2}" (arg3),
72 : "memory"69 : .{ .memory = true });
73 );
74}70}
7571
76pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {72pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -88,8 +84,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -88,8 +84,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
88 [arg2] "{r1}" (arg2),84 [arg2] "{r1}" (arg2),
89 [arg3] "{r2}" (arg3),85 [arg3] "{r2}" (arg3),
90 [arg4] "{r3}" (arg4),86 [arg4] "{r3}" (arg4),
91 : "memory"87 : .{ .memory = true });
92 );
93}88}
9489
95pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {90pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -108,8 +103,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -108,8 +103,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
108 [arg3] "{r2}" (arg3),103 [arg3] "{r2}" (arg3),
109 [arg4] "{r3}" (arg4),104 [arg4] "{r3}" (arg4),
110 [arg5] "{r4}" (arg5),105 [arg5] "{r4}" (arg5),
111 : "memory"106 : .{ .memory = true });
112 );
113}107}
114108
115pub fn syscall6(109pub fn syscall6(
...@@ -137,8 +131,7 @@ pub fn syscall6(...@@ -137,8 +131,7 @@ pub fn syscall6(
137 [arg4] "{r3}" (arg4),131 [arg4] "{r3}" (arg4),
138 [arg5] "{r4}" (arg5),132 [arg5] "{r4}" (arg5),
139 [arg6] "{r5}" (arg6),133 [arg6] "{r5}" (arg6),
140 : "memory"134 : .{ .memory = true });
141 );
142}135}
143136
144pub const clone = @import("arm.zig").clone;137pub const clone = @import("arm.zig").clone;
...@@ -158,6 +151,5 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -158,6 +151,5 @@ pub fn restore_rt() callconv(.naked) noreturn {
158 \\ svc #0151 \\ svc #0
159 :152 :
160 : [number] "I" (@intFromEnum(SYS.rt_sigreturn)),153 : [number] "I" (@intFromEnum(SYS.rt_sigreturn)),
161 : "memory"154 : .{ .memory = true });
162 );
163}155}
lib/std/os/linux/tls.zig+1-2
...@@ -308,8 +308,7 @@ pub fn setThreadPointer(addr: usize) void {...@@ -308,8 +308,7 @@ pub fn setThreadPointer(addr: usize) void {
308 \\ sar %%a0, %%r0308 \\ sar %%a0, %%r0
309 :309 :
310 : [addr] "r" (addr),310 : [addr] "r" (addr),
311 : "r0"311 : .{ .r0 = true });
312 );
313 },312 },
314 .sparc, .sparc64 => {313 .sparc, .sparc64 => {
315 asm volatile (314 asm volatile (
lib/std/os/linux/x86.zig+14-28
...@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {...@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {
18 return asm volatile ("int $0x80"18 return asm volatile ("int $0x80"
19 : [ret] "={eax}" (-> usize),19 : [ret] "={eax}" (-> usize),
20 : [number] "{eax}" (@intFromEnum(number)),20 : [number] "{eax}" (@intFromEnum(number)),
21 : "memory"21 : .{ .memory = true });
22 );
23}22}
2423
25pub fn syscall1(number: SYS, arg1: usize) usize {24pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
27 : [ret] "={eax}" (-> usize),26 : [ret] "={eax}" (-> usize),
28 : [number] "{eax}" (@intFromEnum(number)),27 : [number] "{eax}" (@intFromEnum(number)),
29 [arg1] "{ebx}" (arg1),28 [arg1] "{ebx}" (arg1),
30 : "memory"29 : .{ .memory = true });
31 );
32}30}
3331
34pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {32pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -37,8 +35,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -37,8 +35,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
37 : [number] "{eax}" (@intFromEnum(number)),35 : [number] "{eax}" (@intFromEnum(number)),
38 [arg1] "{ebx}" (arg1),36 [arg1] "{ebx}" (arg1),
39 [arg2] "{ecx}" (arg2),37 [arg2] "{ecx}" (arg2),
40 : "memory"38 : .{ .memory = true });
41 );
42}39}
4340
44pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {41pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -48,8 +45,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -48,8 +45,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
48 [arg1] "{ebx}" (arg1),45 [arg1] "{ebx}" (arg1),
49 [arg2] "{ecx}" (arg2),46 [arg2] "{ecx}" (arg2),
50 [arg3] "{edx}" (arg3),47 [arg3] "{edx}" (arg3),
51 : "memory"48 : .{ .memory = true });
52 );
53}49}
5450
55pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {51pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -60,8 +56,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -60,8 +56,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
60 [arg2] "{ecx}" (arg2),56 [arg2] "{ecx}" (arg2),
61 [arg3] "{edx}" (arg3),57 [arg3] "{edx}" (arg3),
62 [arg4] "{esi}" (arg4),58 [arg4] "{esi}" (arg4),
63 : "memory"59 : .{ .memory = true });
64 );
65}60}
6661
67pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {62pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -73,8 +68,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -73,8 +68,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
73 [arg3] "{edx}" (arg3),68 [arg3] "{edx}" (arg3),
74 [arg4] "{esi}" (arg4),69 [arg4] "{esi}" (arg4),
75 [arg5] "{edi}" (arg5),70 [arg5] "{edi}" (arg5),
76 : "memory"71 : .{ .memory = true });
77 );
78}72}
7973
80pub fn syscall6(74pub fn syscall6(
...@@ -108,8 +102,7 @@ pub fn syscall6(...@@ -108,8 +102,7 @@ pub fn syscall6(
108 [arg4] "{esi}" (arg4),102 [arg4] "{esi}" (arg4),
109 [arg5] "rm" (arg5),103 [arg5] "rm" (arg5),
110 [arg6] "rm" (arg6),104 [arg6] "rm" (arg6),
111 : "memory"105 : .{ .memory = true });
112 );
113}106}
114107
115pub fn socketcall(call: usize, args: [*]const usize) usize {108pub fn socketcall(call: usize, args: [*]const usize) usize {
...@@ -118,8 +111,7 @@ pub fn socketcall(call: usize, args: [*]const usize) usize {...@@ -118,8 +111,7 @@ pub fn socketcall(call: usize, args: [*]const usize) usize {
118 : [number] "{eax}" (@intFromEnum(SYS.socketcall)),111 : [number] "{eax}" (@intFromEnum(SYS.socketcall)),
119 [arg1] "{ebx}" (call),112 [arg1] "{ebx}" (call),
120 [arg2] "{ecx}" (@intFromPtr(args)),113 [arg2] "{ecx}" (@intFromPtr(args)),
121 : "memory"114 : .{ .memory = true });
122 );
123}115}
124116
125pub fn clone() callconv(.naked) usize {117pub fn clone() callconv(.naked) usize {
...@@ -179,14 +171,12 @@ pub fn restore() callconv(.naked) noreturn {...@@ -179,14 +171,12 @@ pub fn restore() callconv(.naked) noreturn {
179 \\ int $0x80171 \\ int $0x80
180 :172 :
181 : [number] "i" (@intFromEnum(SYS.sigreturn)),173 : [number] "i" (@intFromEnum(SYS.sigreturn)),
182 : "memory"174 : .{ .memory = true }),
183 ),
184 else => asm volatile (175 else => asm volatile (
185 \\ int $0x80176 \\ int $0x80
186 :177 :
187 : [number] "{eax}" (@intFromEnum(SYS.sigreturn)),178 : [number] "{eax}" (@intFromEnum(SYS.sigreturn)),
188 : "memory"179 : .{ .memory = true }),
189 ),
190 }180 }
191}181}
192182
...@@ -197,14 +187,12 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -197,14 +187,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
197 \\ int $0x80187 \\ int $0x80
198 :188 :
199 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),189 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
200 : "memory"190 : .{ .memory = true }),
201 ),
202 else => asm volatile (191 else => asm volatile (
203 \\ int $0x80192 \\ int $0x80
204 :193 :
205 : [number] "{eax}" (@intFromEnum(SYS.rt_sigreturn)),194 : [number] "{eax}" (@intFromEnum(SYS.rt_sigreturn)),
206 : "memory"195 : .{ .memory = true }),
207 ),
208 }196 }
209}197}
210198
...@@ -442,8 +430,7 @@ pub fn getContextInternal() callconv(.naked) usize {...@@ -442,8 +430,7 @@ pub fn getContextInternal() callconv(.naked) usize {
442 [sigprocmask] "i" (@intFromEnum(linux.SYS.rt_sigprocmask)),430 [sigprocmask] "i" (@intFromEnum(linux.SYS.rt_sigprocmask)),
443 [sigmask_offset] "i" (@offsetOf(ucontext_t, "sigmask")),431 [sigmask_offset] "i" (@offsetOf(ucontext_t, "sigmask")),
444 [sigset_size] "i" (linux.NSIG / 8),432 [sigset_size] "i" (linux.NSIG / 8),
445 : "cc", "memory", "eax", "ecx", "edx"433 : .{ .cc = true, .memory = true, .eax = true, .ecx = true, .edx = true });
446 );
447}434}
448435
449pub inline fn getcontext(context: *ucontext_t) usize {436pub inline fn getcontext(context: *ucontext_t) usize {
...@@ -457,6 +444,5 @@ pub inline fn getcontext(context: *ucontext_t) usize {...@@ -457,6 +444,5 @@ pub inline fn getcontext(context: *ucontext_t) usize {
457 [_] "={edx}" (clobber_edx),444 [_] "={edx}" (clobber_edx),
458 : [_] "{edx}" (context),445 : [_] "{edx}" (context),
459 [getContextInternal] "X" (&getContextInternal),446 [getContextInternal] "X" (&getContextInternal),
460 : "cc", "memory", "ecx"447 : .{ .cc = true, .memory = true, .ecx = true });
461 );
462}448}
lib/std/os/linux/x86_64.zig+11-22
...@@ -20,8 +20,7 @@ pub fn syscall0(number: SYS) usize {...@@ -20,8 +20,7 @@ pub fn syscall0(number: SYS) usize {
20 return asm volatile ("syscall"20 return asm volatile ("syscall"
21 : [ret] "={rax}" (-> usize),21 : [ret] "={rax}" (-> usize),
22 : [number] "{rax}" (@intFromEnum(number)),22 : [number] "{rax}" (@intFromEnum(number)),
23 : "rcx", "r11", "memory"23 : .{ .rcx = true, .r11 = true, .memory = true });
24 );
25}24}
2625
27pub fn syscall1(number: SYS, arg1: usize) usize {26pub fn syscall1(number: SYS, arg1: usize) usize {
...@@ -29,8 +28,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {...@@ -29,8 +28,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
29 : [ret] "={rax}" (-> usize),28 : [ret] "={rax}" (-> usize),
30 : [number] "{rax}" (@intFromEnum(number)),29 : [number] "{rax}" (@intFromEnum(number)),
31 [arg1] "{rdi}" (arg1),30 [arg1] "{rdi}" (arg1),
32 : "rcx", "r11", "memory"31 : .{ .rcx = true, .r11 = true, .memory = true });
33 );
34}32}
3533
36pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {34pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
...@@ -39,8 +37,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {...@@ -39,8 +37,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
39 : [number] "{rax}" (@intFromEnum(number)),37 : [number] "{rax}" (@intFromEnum(number)),
40 [arg1] "{rdi}" (arg1),38 [arg1] "{rdi}" (arg1),
41 [arg2] "{rsi}" (arg2),39 [arg2] "{rsi}" (arg2),
42 : "rcx", "r11", "memory"40 : .{ .rcx = true, .r11 = true, .memory = true });
43 );
44}41}
4542
46pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {43pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
...@@ -50,8 +47,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -50,8 +47,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
50 [arg1] "{rdi}" (arg1),47 [arg1] "{rdi}" (arg1),
51 [arg2] "{rsi}" (arg2),48 [arg2] "{rsi}" (arg2),
52 [arg3] "{rdx}" (arg3),49 [arg3] "{rdx}" (arg3),
53 : "rcx", "r11", "memory"50 : .{ .rcx = true, .r11 = true, .memory = true });
54 );
55}51}
5652
57pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {53pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
...@@ -62,8 +58,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)...@@ -62,8 +58,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
62 [arg2] "{rsi}" (arg2),58 [arg2] "{rsi}" (arg2),
63 [arg3] "{rdx}" (arg3),59 [arg3] "{rdx}" (arg3),
64 [arg4] "{r10}" (arg4),60 [arg4] "{r10}" (arg4),
65 : "rcx", "r11", "memory"61 : .{ .rcx = true, .r11 = true, .memory = true });
66 );
67}62}
6863
69pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {64pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
...@@ -75,8 +70,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,...@@ -75,8 +70,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
75 [arg3] "{rdx}" (arg3),70 [arg3] "{rdx}" (arg3),
76 [arg4] "{r10}" (arg4),71 [arg4] "{r10}" (arg4),
77 [arg5] "{r8}" (arg5),72 [arg5] "{r8}" (arg5),
78 : "rcx", "r11", "memory"73 : .{ .rcx = true, .r11 = true, .memory = true });
79 );
80}74}
8175
82pub fn syscall6(76pub fn syscall6(
...@@ -97,8 +91,7 @@ pub fn syscall6(...@@ -97,8 +91,7 @@ pub fn syscall6(
97 [arg4] "{r10}" (arg4),91 [arg4] "{r10}" (arg4),
98 [arg5] "{r8}" (arg5),92 [arg5] "{r8}" (arg5),
99 [arg6] "{r9}" (arg6),93 [arg6] "{r9}" (arg6),
100 : "rcx", "r11", "memory"94 : .{ .rcx = true, .r11 = true, .memory = true });
101 );
102}95}
10396
104pub fn clone() callconv(.naked) usize {97pub fn clone() callconv(.naked) usize {
...@@ -144,14 +137,12 @@ pub fn restore_rt() callconv(.naked) noreturn {...@@ -144,14 +137,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
144 \\ syscall137 \\ syscall
145 :138 :
146 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),139 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
147 : "rcx", "r11", "memory"140 : .{ .rcx = true, .r11 = true, .memory = true }),
148 ),
149 else => asm volatile (141 else => asm volatile (
150 \\ syscall142 \\ syscall
151 :143 :
152 : [number] "{rax}" (@intFromEnum(SYS.rt_sigreturn)),144 : [number] "{rax}" (@intFromEnum(SYS.rt_sigreturn)),
153 : "rcx", "r11", "memory"145 : .{ .rcx = true, .r11 = true, .memory = true }),
154 ),
155 }146 }
156}147}
157148
...@@ -440,8 +431,7 @@ fn getContextInternal() callconv(.naked) usize {...@@ -440,8 +431,7 @@ fn getContextInternal() callconv(.naked) usize {
440 [sigprocmask] "i" (@intFromEnum(linux.SYS.rt_sigprocmask)),431 [sigprocmask] "i" (@intFromEnum(linux.SYS.rt_sigprocmask)),
441 [sigmask_offset] "i" (@offsetOf(ucontext_t, "sigmask")),432 [sigmask_offset] "i" (@offsetOf(ucontext_t, "sigmask")),
442 [sigset_size] "i" (@sizeOf(sigset_t)),433 [sigset_size] "i" (@sizeOf(sigset_t)),
443 : "cc", "memory", "rax", "rcx", "rdx", "rdi", "rsi", "r8", "r10", "r11"434 : .{ .cc = true, .memory = true, .rax = true, .rcx = true, .rdx = true, .rdi = true, .rsi = true, .r8 = true, .r10 = true, .r11 = true });
444 );
445}435}
446436
447pub inline fn getcontext(context: *ucontext_t) usize {437pub inline fn getcontext(context: *ucontext_t) usize {
...@@ -455,6 +445,5 @@ pub inline fn getcontext(context: *ucontext_t) usize {...@@ -455,6 +445,5 @@ pub inline fn getcontext(context: *ucontext_t) usize {
455 [_] "={rdi}" (clobber_rdi),445 [_] "={rdi}" (clobber_rdi),
456 : [_] "{rdi}" (context),446 : [_] "{rdi}" (context),
457 [getContextInternal] "X" (&getContextInternal),447 [getContextInternal] "X" (&getContextInternal),
458 : "cc", "memory", "rcx", "rdx", "rsi", "r8", "r10", "r11"448 : .{ .cc = true, .memory = true, .rcx = true, .rdx = true, .rsi = true, .r8 = true, .r10 = true, .r11 = true });
459 );
460}449}
lib/std/os/plan9/x86_64.zig+4-8
...@@ -11,8 +11,7 @@ pub fn syscall1(sys: plan9.SYS, arg0: usize) usize {...@@ -11,8 +11,7 @@ pub fn syscall1(sys: plan9.SYS, arg0: usize) usize {
11 : [ret] "={rax}" (-> usize),11 : [ret] "={rax}" (-> usize),
12 : [arg0] "{r8}" (arg0),12 : [arg0] "{r8}" (arg0),
13 [syscall_number] "{rbp}" (@intFromEnum(sys)),13 [syscall_number] "{rbp}" (@intFromEnum(sys)),
14 : "rcx", "rax", "rbp", "r11", "memory"14 : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
15 );
16}15}
17pub fn syscall2(sys: plan9.SYS, arg0: usize, arg1: usize) usize {16pub fn syscall2(sys: plan9.SYS, arg0: usize, arg1: usize) usize {
18 return asm volatile (17 return asm volatile (
...@@ -27,8 +26,7 @@ pub fn syscall2(sys: plan9.SYS, arg0: usize, arg1: usize) usize {...@@ -27,8 +26,7 @@ pub fn syscall2(sys: plan9.SYS, arg0: usize, arg1: usize) usize {
27 : [arg0] "{r8}" (arg0),26 : [arg0] "{r8}" (arg0),
28 [arg1] "{r9}" (arg1),27 [arg1] "{r9}" (arg1),
29 [syscall_number] "{rbp}" (@intFromEnum(sys)),28 [syscall_number] "{rbp}" (@intFromEnum(sys)),
30 : "rcx", "rax", "rbp", "r11", "memory"29 : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
31 );
32}30}
33pub fn syscall3(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize) usize {31pub fn syscall3(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize) usize {
34 return asm volatile (32 return asm volatile (
...@@ -46,8 +44,7 @@ pub fn syscall3(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize) usize {...@@ -46,8 +44,7 @@ pub fn syscall3(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize) usize {
46 [arg1] "{r9}" (arg1),44 [arg1] "{r9}" (arg1),
47 [arg2] "{r10}" (arg2),45 [arg2] "{r10}" (arg2),
48 [syscall_number] "{rbp}" (@intFromEnum(sys)),46 [syscall_number] "{rbp}" (@intFromEnum(sys)),
49 : "rcx", "rax", "rbp", "r11", "memory"47 : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
50 );
51}48}
52pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usize) usize {49pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usize) usize {
53 return asm volatile (50 return asm volatile (
...@@ -68,6 +65,5 @@ pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usi...@@ -68,6 +65,5 @@ pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usi
68 [arg2] "{r10}" (arg2),65 [arg2] "{r10}" (arg2),
69 [arg3] "{r11}" (arg3),66 [arg3] "{r11}" (arg3),
70 [syscall_number] "{rbp}" (@intFromEnum(sys)),67 [syscall_number] "{rbp}" (@intFromEnum(sys)),
71 : "rcx", "rax", "rbp", "r11", "memory"68 : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
72 );
73}69}
lib/std/pie.zig+5-10
...@@ -100,8 +100,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -100,8 +100,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
100 \\ %[ret] = add(r1, %[ret])100 \\ %[ret] = add(r1, %[ret])
101 : [ret] "=r" (-> [*]const elf.Dyn),101 : [ret] "=r" (-> [*]const elf.Dyn),
102 :102 :
103 : "r1"103 : .{ .r1 = true }),
104 ),
105 .loongarch32, .loongarch64 => asm volatile (104 .loongarch32, .loongarch64 => asm volatile (
106 \\ .weak _DYNAMIC105 \\ .weak _DYNAMIC
107 \\ .hidden _DYNAMIC106 \\ .hidden _DYNAMIC
...@@ -127,8 +126,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -127,8 +126,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
127 \\ addu %[ret], %[ret], $gp126 \\ addu %[ret], %[ret], $gp
128 : [ret] "=r" (-> [*]const elf.Dyn),127 : [ret] "=r" (-> [*]const elf.Dyn),
129 :128 :
130 : "lr"129 : .{ .lr = true }),
131 ),
132 .mips64, .mips64el => asm volatile (130 .mips64, .mips64el => asm volatile (
133 \\ .weak _DYNAMIC131 \\ .weak _DYNAMIC
134 \\ .hidden _DYNAMIC132 \\ .hidden _DYNAMIC
...@@ -140,8 +138,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -140,8 +138,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
140 \\ daddu %[ret], %[ret], $gp138 \\ daddu %[ret], %[ret], $gp
141 : [ret] "=r" (-> [*]const elf.Dyn),139 : [ret] "=r" (-> [*]const elf.Dyn),
142 :140 :
143 : "lr"141 : .{ .lr = true }),
144 ),
145 .powerpc, .powerpcle => asm volatile (142 .powerpc, .powerpcle => asm volatile (
146 \\ .weak _DYNAMIC143 \\ .weak _DYNAMIC
147 \\ .hidden _DYNAMIC144 \\ .hidden _DYNAMIC
...@@ -153,8 +150,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -153,8 +150,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
153 \\ add %[ret], 4, %[ret]150 \\ add %[ret], 4, %[ret]
154 : [ret] "=r" (-> [*]const elf.Dyn),151 : [ret] "=r" (-> [*]const elf.Dyn),
155 :152 :
156 : "lr", "r4"153 : .{ .lr = true, .r4 = true }),
157 ),
158 .powerpc64, .powerpc64le => asm volatile (154 .powerpc64, .powerpc64le => asm volatile (
159 \\ .weak _DYNAMIC155 \\ .weak _DYNAMIC
160 \\ .hidden _DYNAMIC156 \\ .hidden _DYNAMIC
...@@ -166,8 +162,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -166,8 +162,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
166 \\ add %[ret], 4, %[ret]162 \\ add %[ret], 4, %[ret]
167 : [ret] "=r" (-> [*]const elf.Dyn),163 : [ret] "=r" (-> [*]const elf.Dyn),
168 :164 :
169 : "lr", "r4"165 : .{ .lr = true, .r4 = true }),
170 ),
171 .riscv32, .riscv64 => asm volatile (166 .riscv32, .riscv64 => asm volatile (
172 \\ .weak _DYNAMIC167 \\ .weak _DYNAMIC
173 \\ .hidden _DYNAMIC168 \\ .hidden _DYNAMIC
lib/std/start.zig+4-8
...@@ -131,32 +131,28 @@ fn exit2(code: usize) noreturn {...@@ -131,32 +131,28 @@ fn exit2(code: usize) noreturn {
131 :131 :
132 : [number] "{rax}" (231),132 : [number] "{rax}" (231),
133 [arg1] "{rdi}" (code),133 [arg1] "{rdi}" (code),
134 : "rcx", "r11", "memory"134 : .{ .rcx = true, .r11 = true, .memory = true });
135 );
136 },135 },
137 .arm => {136 .arm => {
138 asm volatile ("svc #0"137 asm volatile ("svc #0"
139 :138 :
140 : [number] "{r7}" (1),139 : [number] "{r7}" (1),
141 [arg1] "{r0}" (code),140 [arg1] "{r0}" (code),
142 : "memory"141 : .{ .memory = true });
143 );
144 },142 },
145 .aarch64 => {143 .aarch64 => {
146 asm volatile ("svc #0"144 asm volatile ("svc #0"
147 :145 :
148 : [number] "{x8}" (93),146 : [number] "{x8}" (93),
149 [arg1] "{x0}" (code),147 [arg1] "{x0}" (code),
150 : "memory", "cc"148 : .{ .memory = true });
151 );
152 },149 },
153 .sparc64 => {150 .sparc64 => {
154 asm volatile ("ta 0x6d"151 asm volatile ("ta 0x6d"
155 :152 :
156 : [number] "{g1}" (1),153 : [number] "{g1}" (1),
157 [arg1] "{o0}" (code),154 [arg1] "{o0}" (code),
158 : "o0", "o1", "o2", "o3", "o4", "o5", "o6", "o7", "memory"155 : .{ .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o6 = true, .o7 = true, .memory = true });
159 );
160 },156 },
161 else => @compileError("TODO"),157 else => @compileError("TODO"),
162 },158 },
lib/std/valgrind.zig+10-20
...@@ -17,8 +17,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -17,8 +17,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
17 : [_] "={r3}" (-> usize),17 : [_] "={r3}" (-> usize),
18 : [_] "{r4}" (args),18 : [_] "{r4}" (args),
19 [_] "{r3}" (default),19 [_] "{r3}" (default),
20 : "cc", "memory"20 : .{ .memory = true }),
21 ),
22 .aarch64, .aarch64_be => asm volatile (21 .aarch64, .aarch64_be => asm volatile (
23 \\ ror x12, x12, #3 ; ror x12, x12, #1322 \\ ror x12, x12, #3 ; ror x12, x12, #13
24 \\ ror x12, x12, #51 ; ror x12, x12, #6123 \\ ror x12, x12, #51 ; ror x12, x12, #61
...@@ -26,8 +25,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -26,8 +25,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
26 : [_] "={x3}" (-> usize),25 : [_] "={x3}" (-> usize),
27 : [_] "{x4}" (args),26 : [_] "{x4}" (args),
28 [_] "{x3}" (default),27 [_] "{x3}" (default),
29 : "cc", "memory"28 : .{ .memory = true }),
30 ),
31 .mips, .mipsel => asm volatile (29 .mips, .mipsel => asm volatile (
32 \\ srl $0, $0, 1330 \\ srl $0, $0, 13
33 \\ srl $0, $0, 2931 \\ srl $0, $0, 29
...@@ -37,8 +35,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -37,8 +35,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
37 : [_] "={$11}" (-> usize),35 : [_] "={$11}" (-> usize),
38 : [_] "{$12}" (args),36 : [_] "{$12}" (args),
39 [_] "{$11}" (default),37 [_] "{$11}" (default),
40 : "memory"38 : .{ .memory = true }),
41 ),
42 .mips64, .mips64el => asm volatile (39 .mips64, .mips64el => asm volatile (
43 \\ dsll $0, $0, 3 ; dsll $0, $0, 1340 \\ dsll $0, $0, 3 ; dsll $0, $0, 13
44 \\ dsll $0, $0, 29 ; dsll $0, $0, 1941 \\ dsll $0, $0, 29 ; dsll $0, $0, 19
...@@ -46,8 +43,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -46,8 +43,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
46 : [_] "={$11}" (-> usize),43 : [_] "={$11}" (-> usize),
47 : [_] "{$12}" (args),44 : [_] "{$12}" (args),
48 [_] "{$11}" (default),45 [_] "{$11}" (default),
49 : "memory"46 : .{ .memory = true }),
50 ),
51 .powerpc, .powerpcle => asm volatile (47 .powerpc, .powerpcle => asm volatile (
52 \\ rlwinm 0, 0, 3, 0, 31 ; rlwinm 0, 0, 13, 0, 3148 \\ rlwinm 0, 0, 3, 0, 31 ; rlwinm 0, 0, 13, 0, 31
53 \\ rlwinm 0, 0, 29, 0, 31 ; rlwinm 0, 0, 19, 0, 3149 \\ rlwinm 0, 0, 29, 0, 31 ; rlwinm 0, 0, 19, 0, 31
...@@ -55,8 +51,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -55,8 +51,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
55 : [_] "={r3}" (-> usize),51 : [_] "={r3}" (-> usize),
56 : [_] "{r4}" (args),52 : [_] "{r4}" (args),
57 [_] "{r3}" (default),53 [_] "{r3}" (default),
58 : "cc", "memory"54 : .{ .memory = true }),
59 ),
60 .powerpc64, .powerpc64le => asm volatile (55 .powerpc64, .powerpc64le => asm volatile (
61 \\ rotldi 0, 0, 3 ; rotldi 0, 0, 1356 \\ rotldi 0, 0, 3 ; rotldi 0, 0, 13
62 \\ rotldi 0, 0, 61 ; rotldi 0, 0, 5157 \\ rotldi 0, 0, 61 ; rotldi 0, 0, 51
...@@ -64,8 +59,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -64,8 +59,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
64 : [_] "={r3}" (-> usize),59 : [_] "={r3}" (-> usize),
65 : [_] "{r4}" (args),60 : [_] "{r4}" (args),
66 [_] "{r3}" (default),61 [_] "{r3}" (default),
67 : "cc", "memory"62 : .{ .memory = true }),
68 ),
69 .riscv64 => asm volatile (63 .riscv64 => asm volatile (
70 \\ .option push64 \\ .option push
71 \\ .option norvc65 \\ .option norvc
...@@ -78,8 +72,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -78,8 +72,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
78 : [_] "={a3}" (-> usize),72 : [_] "={a3}" (-> usize),
79 : [_] "{a4}" (args),73 : [_] "{a4}" (args),
80 [_] "{a3}" (default),74 [_] "{a3}" (default),
81 : "cc", "memory"75 : .{ .memory = true }),
82 ),
83 .s390x => asm volatile (76 .s390x => asm volatile (
84 \\ lr %%r15, %%r1577 \\ lr %%r15, %%r15
85 \\ lr %%r1, %%r178 \\ lr %%r1, %%r1
...@@ -89,8 +82,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -89,8 +82,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
89 : [_] "={r3}" (-> usize),82 : [_] "={r3}" (-> usize),
90 : [_] "{r2}" (args),83 : [_] "{r2}" (args),
91 [_] "{r3}" (default),84 [_] "{r3}" (default),
92 : "cc", "memory"85 : .{ .memory = true }),
93 ),
94 .x86 => asm volatile (86 .x86 => asm volatile (
95 \\ roll $3, %%edi ; roll $13, %%edi87 \\ roll $3, %%edi ; roll $13, %%edi
96 \\ roll $29, %%edi ; roll $19, %%edi88 \\ roll $29, %%edi ; roll $19, %%edi
...@@ -98,8 +90,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -98,8 +90,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
98 : [_] "={edx}" (-> usize),90 : [_] "={edx}" (-> usize),
99 : [_] "{eax}" (args),91 : [_] "{eax}" (args),
100 [_] "{edx}" (default),92 [_] "{edx}" (default),
101 : "cc", "memory"93 : .{ .memory = true }),
102 ),
103 .x86_64 => asm volatile (94 .x86_64 => asm volatile (
104 \\ rolq $3, %%rdi ; rolq $13, %%rdi95 \\ rolq $3, %%rdi ; rolq $13, %%rdi
105 \\ rolq $61, %%rdi ; rolq $51, %%rdi96 \\ rolq $61, %%rdi ; rolq $51, %%rdi
...@@ -107,8 +98,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:...@@ -107,8 +98,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
107 : [_] "={rdx}" (-> usize),98 : [_] "={rdx}" (-> usize),
108 : [_] "{rax}" (args),99 : [_] "{rax}" (args),
109 [_] "{rdx}" (default),100 [_] "{rdx}" (default),
110 : "cc", "memory"101 : .{ .memory = true }),
111 ),
112 else => default,102 else => default,
113 };103 };
114}104}
lib/std/zig.zig+2
...@@ -740,6 +740,7 @@ pub const SimpleComptimeReason = enum(u32) {...@@ -740,6 +740,7 @@ pub const SimpleComptimeReason = enum(u32) {
740 generic_call_target,740 generic_call_target,
741 wasm_memory_index,741 wasm_memory_index,
742 work_group_dim_index,742 work_group_dim_index,
743 clobber,
743744
744 // Evaluating at comptime because types must be comptime-known.745 // Evaluating at comptime because types must be comptime-known.
745 // Reasons other than `.type` are just more specific messages.746 // Reasons other than `.type` are just more specific messages.
...@@ -820,6 +821,7 @@ pub const SimpleComptimeReason = enum(u32) {...@@ -820,6 +821,7 @@ pub const SimpleComptimeReason = enum(u32) {
820 .generic_call_target => "generic function being called must be comptime-known",821 .generic_call_target => "generic function being called must be comptime-known",
821 .wasm_memory_index => "wasm memory index must be comptime-known",822 .wasm_memory_index => "wasm memory index must be comptime-known",
822 .work_group_dim_index => "work group dimension index must be comptime-known",823 .work_group_dim_index => "work group dimension index must be comptime-known",
824 .clobber => "clobber must be comptime-known",
823825
824 .type => "types must be comptime-known",826 .type => "types must be comptime-known",
825 .array_sentinel => "array sentinel value must be comptime-known",827 .array_sentinel => "array sentinel value must be comptime-known",
lib/std/zig/Ast.zig+86-4
...@@ -634,6 +634,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {...@@ -634,6 +634,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
634 .@"nosuspend",634 .@"nosuspend",
635 .asm_simple,635 .asm_simple,
636 .@"asm",636 .@"asm",
637 .asm_legacy,
637 .array_type,638 .array_type,
638 .array_type_sentinel,639 .array_type_sentinel,
639 .error_value,640 .error_value,
...@@ -1047,6 +1048,11 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {...@@ -1047,6 +1048,11 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
1047 n = @enumFromInt(tree.extra_data[@intFromEnum(members.end) - 1]); // last parameter1048 n = @enumFromInt(tree.extra_data[@intFromEnum(members.end) - 1]); // last parameter
1048 }1049 }
1049 },1050 },
1051 .asm_legacy => {
1052 _, const extra_index = tree.nodeData(n).node_and_extra;
1053 const extra = tree.extraData(extra_index, Node.AsmLegacy);
1054 return extra.rparen + end_offset;
1055 },
1050 .@"asm" => {1056 .@"asm" => {
1051 _, const extra_index = tree.nodeData(n).node_and_extra;1057 _, const extra_index = tree.nodeData(n).node_and_extra;
1052 const extra = tree.extraData(extra_index, Node.Asm);1058 const extra = tree.extraData(extra_index, Node.Asm);
...@@ -1885,6 +1891,19 @@ pub fn asmSimple(tree: Ast, node: Node.Index) full.Asm {...@@ -1885,6 +1891,19 @@ pub fn asmSimple(tree: Ast, node: Node.Index) full.Asm {
1885 .template = template,1891 .template = template,
1886 .items = &.{},1892 .items = &.{},
1887 .rparen = rparen,1893 .rparen = rparen,
1894 .clobbers = .none,
1895 });
1896}
1897
1898pub fn asmLegacy(tree: Ast, node: Node.Index) full.AsmLegacy {
1899 const template, const extra_index = tree.nodeData(node).node_and_extra;
1900 const extra = tree.extraData(extra_index, Node.AsmLegacy);
1901 const items = tree.extraDataSlice(.{ .start = extra.items_start, .end = extra.items_end }, Node.Index);
1902 return tree.legacyAsmComponents(.{
1903 .asm_token = tree.nodeMainToken(node),
1904 .template = template,
1905 .items = items,
1906 .rparen = extra.rparen,
1888 });1907 });
1889}1908}
18901909
...@@ -1896,6 +1915,7 @@ pub fn asmFull(tree: Ast, node: Node.Index) full.Asm {...@@ -1896,6 +1915,7 @@ pub fn asmFull(tree: Ast, node: Node.Index) full.Asm {
1896 .asm_token = tree.nodeMainToken(node),1915 .asm_token = tree.nodeMainToken(node),
1897 .template = template,1916 .template = template,
1898 .items = items,1917 .items = items,
1918 .clobbers = extra.clobbers,
1899 .rparen = extra.rparen,1919 .rparen = extra.rparen,
1900 });1920 });
1901}1921}
...@@ -2192,8 +2212,8 @@ fn fullSwitchCaseComponents(tree: Ast, info: full.SwitchCase.Components, node: N...@@ -2192,8 +2212,8 @@ fn fullSwitchCaseComponents(tree: Ast, info: full.SwitchCase.Components, node: N
2192 return result;2212 return result;
2193}2213}
21942214
2195fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {2215fn legacyAsmComponents(tree: Ast, info: full.AsmLegacy.Components) full.AsmLegacy {
2196 var result: full.Asm = .{2216 var result: full.AsmLegacy = .{
2197 .ast = info,2217 .ast = info,
2198 .volatile_token = null,2218 .volatile_token = null,
2199 .inputs = &.{},2219 .inputs = &.{},
...@@ -2253,6 +2273,29 @@ fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {...@@ -2253,6 +2273,29 @@ fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
2253 return result;2273 return result;
2254}2274}
22552275
2276fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
2277 var result: full.Asm = .{
2278 .ast = info,
2279 .volatile_token = null,
2280 .inputs = &.{},
2281 .outputs = &.{},
2282 };
2283 if (tree.tokenTag(info.asm_token + 1) == .keyword_volatile) {
2284 result.volatile_token = info.asm_token + 1;
2285 }
2286 const outputs_end: usize = for (info.items, 0..) |item, i| {
2287 switch (tree.nodeTag(item)) {
2288 .asm_output => continue,
2289 else => break i,
2290 }
2291 } else info.items.len;
2292
2293 result.outputs = info.items[0..outputs_end];
2294 result.inputs = info.items[outputs_end..];
2295
2296 return result;
2297}
2298
2256fn fullWhileComponents(tree: Ast, info: full.While.Components) full.While {2299fn fullWhileComponents(tree: Ast, info: full.While.Components) full.While {
2257 var result: full.While = .{2300 var result: full.While = .{
2258 .ast = info,2301 .ast = info,
...@@ -2447,6 +2490,14 @@ pub fn fullAsm(tree: Ast, node: Node.Index) ?full.Asm {...@@ -2447,6 +2490,14 @@ pub fn fullAsm(tree: Ast, node: Node.Index) ?full.Asm {
2447 };2490 };
2448}2491}
24492492
2493/// To be deleted after 0.15.0 is tagged
2494pub fn legacyAsm(tree: Ast, node: Node.Index) ?full.AsmLegacy {
2495 return switch (tree.nodeTag(node)) {
2496 .asm_legacy => tree.asmLegacy(node),
2497 else => null,
2498 };
2499}
2500
2450pub fn fullCall(tree: Ast, buffer: *[1]Ast.Node.Index, node: Node.Index) ?full.Call {2501pub fn fullCall(tree: Ast, buffer: *[1]Ast.Node.Index, node: Node.Index) ?full.Call {
2451 return switch (tree.nodeTag(node)) {2502 return switch (tree.nodeTag(node)) {
2452 .call, .call_comma => tree.callFull(node),2503 .call, .call_comma => tree.callFull(node),
...@@ -2827,6 +2878,21 @@ pub const full = struct {...@@ -2827,6 +2878,21 @@ pub const full = struct {
2827 };2878 };
28282879
2829 pub const Asm = struct {2880 pub const Asm = struct {
2881 ast: Components,
2882 volatile_token: ?TokenIndex,
2883 outputs: []const Node.Index,
2884 inputs: []const Node.Index,
2885
2886 pub const Components = struct {
2887 asm_token: TokenIndex,
2888 template: Node.Index,
2889 items: []const Node.Index,
2890 clobbers: Node.OptionalIndex,
2891 rparen: TokenIndex,
2892 };
2893 };
2894
2895 pub const AsmLegacy = struct {
2830 ast: Components,2896 ast: Components,
2831 volatile_token: ?TokenIndex,2897 volatile_token: ?TokenIndex,
2832 first_clobber: ?TokenIndex,2898 first_clobber: ?TokenIndex,
...@@ -3833,15 +3899,22 @@ pub const Node = struct {...@@ -3833,15 +3899,22 @@ pub const Node = struct {
3833 /// Same as `block` except there is known to be a trailing comma before3899 /// Same as `block` except there is known to be a trailing comma before
3834 /// the final rbrace.3900 /// the final rbrace.
3835 block_semicolon,3901 block_semicolon,
3836 /// `asm(lhs)`.3902 /// `asm(a)`.
3837 ///3903 ///
3838 /// rhs is a `Token.Index` to the `)` token.
3839 /// The `main_token` field is the `asm` token.3904 /// The `main_token` field is the `asm` token.
3840 asm_simple,3905 asm_simple,
3841 /// `asm(lhs, a)`.3906 /// `asm(lhs, a)`.
3842 ///3907 ///
3843 /// The `data` field is a `.node_and_extra`:3908 /// The `data` field is a `.node_and_extra`:
3844 /// 1. a `Node.Index` to lhs.3909 /// 1. a `Node.Index` to lhs.
3910 /// 2. a `ExtraIndex` to `AsmLegacy`.
3911 ///
3912 /// The `main_token` field is the `asm` token.
3913 asm_legacy,
3914 /// `asm(a, b)`.
3915 ///
3916 /// The `data` field is a `.node_and_extra`:
3917 /// 1. a `Node.Index` to a.
3845 /// 2. a `ExtraIndex` to `Asm`.3918 /// 2. a `ExtraIndex` to `Asm`.
3846 ///3919 ///
3847 /// The `main_token` field is the `asm` token.3920 /// The `main_token` field is the `asm` token.
...@@ -4014,9 +4087,18 @@ pub const Node = struct {...@@ -4014,9 +4087,18 @@ pub const Node = struct {
4014 callconv_expr: OptionalIndex,4087 callconv_expr: OptionalIndex,
4015 };4088 };
40164089
4090 /// To be removed after 0.15.0 is tagged
4091 pub const AsmLegacy = struct {
4092 items_start: ExtraIndex,
4093 items_end: ExtraIndex,
4094 /// Needed to make lastToken() work.
4095 rparen: TokenIndex,
4096 };
4097
4017 pub const Asm = struct {4098 pub const Asm = struct {
4018 items_start: ExtraIndex,4099 items_start: ExtraIndex,
4019 items_end: ExtraIndex,4100 items_end: ExtraIndex,
4101 clobbers: OptionalIndex,
4020 /// Needed to make lastToken() work.4102 /// Needed to make lastToken() work.
4021 rparen: TokenIndex,4103 rparen: TokenIndex,
4022 };4104 };
lib/std/zig/AstGen.zig+27-41
...@@ -505,6 +505,7 @@ fn lvalExpr(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Ins...@@ -505,6 +505,7 @@ fn lvalExpr(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Ins
505 .bool_or,505 .bool_or,
506 .@"asm",506 .@"asm",
507 .asm_simple,507 .asm_simple,
508 .asm_legacy,
508 .string_literal,509 .string_literal,
509 .number_literal,510 .number_literal,
510 .call,511 .call,
...@@ -811,6 +812,12 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE...@@ -811,6 +812,12 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
811 .@"asm",812 .@"asm",
812 => return asmExpr(gz, scope, ri, node, tree.fullAsm(node).?),813 => return asmExpr(gz, scope, ri, node, tree.fullAsm(node).?),
813814
815 .asm_legacy => {
816 return astgen.failNodeNotes(node, "legacy asm clobbers syntax", .{}, &[_]u32{
817 try astgen.errNoteNode(node, "use 'zig fmt' to auto-upgrade", .{}),
818 });
819 },
820
814 .string_literal => return stringLiteral(gz, ri, node),821 .string_literal => return stringLiteral(gz, ri, node),
815 .multiline_string_literal => return multilineStringLiteral(gz, ri, node),822 .multiline_string_literal => return multilineStringLiteral(gz, ri, node),
816823
...@@ -8774,7 +8781,7 @@ fn asmExpr(...@@ -8774,7 +8781,7 @@ fn asmExpr(
8774 if (is_container_asm) {8781 if (is_container_asm) {
8775 if (full.volatile_token) |t|8782 if (full.volatile_token) |t|
8776 return astgen.failTok(t, "volatile is meaningless on global assembly", .{});8783 return astgen.failTok(t, "volatile is meaningless on global assembly", .{});
8777 if (full.outputs.len != 0 or full.inputs.len != 0 or full.first_clobber != null)8784 if (full.outputs.len != 0 or full.inputs.len != 0 or full.ast.clobbers != .none)
8778 return astgen.failNode(node, "global assembly cannot have inputs, outputs, or clobbers", .{});8785 return astgen.failNode(node, "global assembly cannot have inputs, outputs, or clobbers", .{});
8779 } else {8786 } else {
8780 if (full.outputs.len == 0 and full.volatile_token == null) {8787 if (full.outputs.len == 0 and full.volatile_token == null) {
...@@ -8839,32 +8846,12 @@ fn asmExpr(...@@ -8839,32 +8846,12 @@ fn asmExpr(
8839 };8846 };
8840 }8847 }
88418848
8842 var clobbers_buffer: [63]u32 = undefined;8849 const clobbers: Zir.Inst.Ref = if (full.ast.clobbers.unwrap()) |clobbers_node|
8843 var clobber_i: usize = 0;8850 try comptimeExpr(gz, scope, .{ .rl = .{
8844 if (full.first_clobber) |first_clobber| clobbers: {8851 .coerced_ty = try gz.addBuiltinValue(clobbers_node, .clobbers),
8845 // asm ("foo" ::: "a", "b")8852 } }, clobbers_node, .clobber)
8846 // asm ("foo" ::: "a", "b",)8853 else
8847 var tok_i = first_clobber;8854 .none;
8848 while (true) : (tok_i += 1) {
8849 if (clobber_i >= clobbers_buffer.len) {
8850 return astgen.failTok(tok_i, "too many asm clobbers", .{});
8851 }
8852 clobbers_buffer[clobber_i] = @intFromEnum((try astgen.strLitAsString(tok_i)).index);
8853 clobber_i += 1;
8854 tok_i += 1;
8855 switch (tree.tokenTag(tok_i)) {
8856 .r_paren => break :clobbers,
8857 .comma => {
8858 if (tree.tokenTag(tok_i + 1) == .r_paren) {
8859 break :clobbers;
8860 } else {
8861 continue;
8862 }
8863 },
8864 else => unreachable,
8865 }
8866 }
8867 }
88688855
8869 const result = try gz.addAsm(.{8856 const result = try gz.addAsm(.{
8870 .tag = tag_and_tmpl.tag,8857 .tag = tag_and_tmpl.tag,
...@@ -8874,7 +8861,7 @@ fn asmExpr(...@@ -8874,7 +8861,7 @@ fn asmExpr(
8874 .output_type_bits = output_type_bits,8861 .output_type_bits = output_type_bits,
8875 .outputs = outputs,8862 .outputs = outputs,
8876 .inputs = inputs,8863 .inputs = inputs,
8877 .clobbers = clobbers_buffer[0..clobber_i],8864 .clobbers = clobbers,
8878 });8865 });
8879 return rvalue(gz, ri, result, node);8866 return rvalue(gz, ri, result, node);
8880}8867}
...@@ -10332,6 +10319,7 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev...@@ -10332,6 +10319,7 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev
1033210319
10333 .@"asm",10320 .@"asm",
10334 .asm_simple,10321 .asm_simple,
10322 .asm_legacy,
10335 .identifier,10323 .identifier,
10336 .field_access,10324 .field_access,
10337 .deref,10325 .deref,
...@@ -10575,6 +10563,7 @@ fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.In...@@ -10575,6 +10563,7 @@ fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.In
10575 .tagged_union_enum_tag_trailing,10563 .tagged_union_enum_tag_trailing,
10576 .@"asm",10564 .@"asm",
10577 .asm_simple,10565 .asm_simple,
10566 .asm_legacy,
10578 .add,10567 .add,
10579 .add_wrap,10568 .add_wrap,
10580 .add_sat,10569 .add_sat,
...@@ -10813,6 +10802,7 @@ fn nodeImpliesComptimeOnly(tree: *const Ast, start_node: Ast.Node.Index) bool {...@@ -10813,6 +10802,7 @@ fn nodeImpliesComptimeOnly(tree: *const Ast, start_node: Ast.Node.Index) bool {
10813 .tagged_union_enum_tag_trailing,10802 .tagged_union_enum_tag_trailing,
10814 .@"asm",10803 .@"asm",
10815 .asm_simple,10804 .asm_simple,
10805 .asm_legacy,
10816 .add,10806 .add,
10817 .add_wrap,10807 .add_wrap,
10818 .add_sat,10808 .add_sat,
...@@ -12806,7 +12796,7 @@ const GenZir = struct {...@@ -12806,7 +12796,7 @@ const GenZir = struct {
12806 is_volatile: bool,12796 is_volatile: bool,
12807 outputs: []const Zir.Inst.Asm.Output,12797 outputs: []const Zir.Inst.Asm.Output,
12808 inputs: []const Zir.Inst.Asm.Input,12798 inputs: []const Zir.Inst.Asm.Input,
12809 clobbers: []const u32,12799 clobbers: Zir.Inst.Ref,
12810 },12800 },
12811 ) !Zir.Inst.Ref {12801 ) !Zir.Inst.Ref {
12812 const astgen = gz.astgen;12802 const astgen = gz.astgen;
...@@ -12816,13 +12806,13 @@ const GenZir = struct {...@@ -12816,13 +12806,13 @@ const GenZir = struct {
12816 try astgen.instructions.ensureUnusedCapacity(gpa, 1);12806 try astgen.instructions.ensureUnusedCapacity(gpa, 1);
12817 try astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Asm).@"struct".fields.len +12807 try astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Asm).@"struct".fields.len +
12818 args.outputs.len * @typeInfo(Zir.Inst.Asm.Output).@"struct".fields.len +12808 args.outputs.len * @typeInfo(Zir.Inst.Asm.Output).@"struct".fields.len +
12819 args.inputs.len * @typeInfo(Zir.Inst.Asm.Input).@"struct".fields.len +12809 args.inputs.len * @typeInfo(Zir.Inst.Asm.Input).@"struct".fields.len);
12820 args.clobbers.len);
1282112810
12822 const payload_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.Asm{12811 const payload_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.Asm{
12823 .src_node = gz.nodeIndexToRelative(args.node),12812 .src_node = gz.nodeIndexToRelative(args.node),
12824 .asm_source = args.asm_source,12813 .asm_source = args.asm_source,
12825 .output_type_bits = args.output_type_bits,12814 .output_type_bits = args.output_type_bits,
12815 .clobbers = args.clobbers,
12826 });12816 });
12827 for (args.outputs) |output| {12817 for (args.outputs) |output| {
12828 _ = gz.astgen.addExtraAssumeCapacity(output);12818 _ = gz.astgen.addExtraAssumeCapacity(output);
...@@ -12830,23 +12820,19 @@ const GenZir = struct {...@@ -12830,23 +12820,19 @@ const GenZir = struct {
12830 for (args.inputs) |input| {12820 for (args.inputs) |input| {
12831 _ = gz.astgen.addExtraAssumeCapacity(input);12821 _ = gz.astgen.addExtraAssumeCapacity(input);
12832 }12822 }
12833 gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers);
1283412823
12835 // * 0b00000000_0000XXXX - `outputs_len`.12824 const small: Zir.Inst.Asm.Small = .{
12836 // * 0b0000000X_XXXX0000 - `inputs_len`.12825 .outputs_len = @intCast(args.outputs.len),
12837 // * 0b0XXXXXX0_00000000 - `clobbers_len`.12826 .inputs_len = @intCast(args.inputs.len),
12838 // * 0bX0000000_00000000 - is volatile12827 .is_volatile = args.is_volatile,
12839 const small: u16 = @as(u16, @as(u4, @intCast(args.outputs.len))) << 0 |12828 };
12840 @as(u16, @as(u5, @intCast(args.inputs.len))) << 4 |
12841 @as(u16, @as(u6, @intCast(args.clobbers.len))) << 9 |
12842 @as(u16, @intFromBool(args.is_volatile)) << 15;
1284312829
12844 const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len);12830 const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len);
12845 astgen.instructions.appendAssumeCapacity(.{12831 astgen.instructions.appendAssumeCapacity(.{
12846 .tag = .extended,12832 .tag = .extended,
12847 .data = .{ .extended = .{12833 .data = .{ .extended = .{
12848 .opcode = args.tag,12834 .opcode = args.tag,
12849 .small = small,12835 .small = @bitCast(small),
12850 .operand = payload_index,12836 .operand = payload_index,
12851 } },12837 } },
12852 });12838 });
lib/std/zig/AstRlAnnotate.zig+1
...@@ -310,6 +310,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI...@@ -310,6 +310,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
310 .unreachable_literal,310 .unreachable_literal,
311 .asm_simple,311 .asm_simple,
312 .@"asm",312 .@"asm",
313 .asm_legacy,
313 .enum_literal,314 .enum_literal,
314 .error_value,315 .error_value,
315 .anyframe_literal,316 .anyframe_literal,
lib/std/zig/Parse.zig+27-4
...@@ -2801,7 +2801,7 @@ fn expectSwitchSuffix(p: *Parse, main_token: TokenIndex) !Node.Index {...@@ -2801,7 +2801,7 @@ fn expectSwitchSuffix(p: *Parse, main_token: TokenIndex) !Node.Index {
2801///2801///
2802/// AsmInput <- COLON AsmInputList AsmClobbers?2802/// AsmInput <- COLON AsmInputList AsmClobbers?
2803///2803///
2804/// AsmClobbers <- COLON StringList2804/// AsmClobbers <- COLON Expr
2805///2805///
2806/// StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL?2806/// StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL?
2807///2807///
...@@ -2841,7 +2841,8 @@ fn expectAsmExpr(p: *Parse) !Node.Index {...@@ -2841,7 +2841,8 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
2841 else => try p.warnExpected(.comma),2841 else => try p.warnExpected(.comma),
2842 }2842 }
2843 }2843 }
2844 if (p.eatToken(.colon)) |_| {2844
2845 const clobbers: Node.OptionalIndex = if (p.eatToken(.colon)) |_| clobbers: {
2845 while (true) {2846 while (true) {
2846 const input_item = try p.parseAsmInputItem() orelse break;2847 const input_item = try p.parseAsmInputItem() orelse break;
2847 try p.scratch.append(p.gpa, input_item);2848 try p.scratch.append(p.gpa, input_item);
...@@ -2853,7 +2854,11 @@ fn expectAsmExpr(p: *Parse) !Node.Index {...@@ -2853,7 +2854,11 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
2853 else => try p.warnExpected(.comma),2854 else => try p.warnExpected(.comma),
2854 }2855 }
2855 }2856 }
2856 if (p.eatToken(.colon)) |_| {2857
2858 _ = p.eatToken(.colon) orelse break :clobbers .none;
2859
2860 // For automatic upgrades; delete after 0.15.0 released.
2861 if (p.tokenTag(p.tok_i) == .string_literal) {
2857 while (p.eatToken(.string_literal)) |_| {2862 while (p.eatToken(.string_literal)) |_| {
2858 switch (p.tokenTag(p.tok_i)) {2863 switch (p.tokenTag(p.tok_i)) {
2859 .comma => p.tok_i += 1,2864 .comma => p.tok_i += 1,
...@@ -2862,8 +2867,25 @@ fn expectAsmExpr(p: *Parse) !Node.Index {...@@ -2862,8 +2867,25 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
2862 else => try p.warnExpected(.comma),2867 else => try p.warnExpected(.comma),
2863 }2868 }
2864 }2869 }
2870 const rparen = try p.expectToken(.r_paren);
2871 const span = try p.listToSpan(p.scratch.items[scratch_top..]);
2872 return p.addNode(.{
2873 .tag = .asm_legacy,
2874 .main_token = asm_token,
2875 .data = .{ .node_and_extra = .{
2876 template,
2877 try p.addExtra(Node.AsmLegacy{
2878 .items_start = span.start,
2879 .items_end = span.end,
2880 .rparen = rparen,
2881 }),
2882 } },
2883 });
2865 }2884 }
2866 }2885
2886 break :clobbers (try p.expectExpr()).toOptional();
2887 } else .none;
2888
2867 const rparen = try p.expectToken(.r_paren);2889 const rparen = try p.expectToken(.r_paren);
2868 const span = try p.listToSpan(p.scratch.items[scratch_top..]);2890 const span = try p.listToSpan(p.scratch.items[scratch_top..]);
2869 return p.addNode(.{2891 return p.addNode(.{
...@@ -2874,6 +2896,7 @@ fn expectAsmExpr(p: *Parse) !Node.Index {...@@ -2874,6 +2896,7 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
2874 try p.addExtra(Node.Asm{2896 try p.addExtra(Node.Asm{
2875 .items_start = span.start,2897 .items_start = span.start,
2876 .items_end = span.end,2898 .items_end = span.end,
2899 .clobbers = clobbers,
2877 .rparen = rparen,2900 .rparen = rparen,
2878 }),2901 }),
2879 } },2902 } },
lib/std/zig/Zir.zig+8-6
...@@ -1939,11 +1939,6 @@ pub const Inst = struct {...@@ -1939,11 +1939,6 @@ pub const Inst = struct {
1939 /// `operand` is payload index to `BinNode`.1939 /// `operand` is payload index to `BinNode`.
1940 builtin_extern,1940 builtin_extern,
1941 /// Inline assembly.1941 /// Inline assembly.
1942 /// `small`:
1943 /// * 0b00000000_000XXXXX - `outputs_len`.
1944 /// * 0b000000XX_XXX00000 - `inputs_len`.
1945 /// * 0b0XXXXX00_00000000 - `clobbers_len`.
1946 /// * 0bX0000000_00000000 - is volatile
1947 /// `operand` is payload index to `Asm`.1942 /// `operand` is payload index to `Asm`.
1948 @"asm",1943 @"asm",
1949 /// Same as `asm` except the assembly template is not a string literal but a comptime1944 /// Same as `asm` except the assembly template is not a string literal but a comptime
...@@ -2495,7 +2490,6 @@ pub const Inst = struct {...@@ -2495,7 +2490,6 @@ pub const Inst = struct {
2495 /// Trailing:2490 /// Trailing:
2496 /// 0. Output for every outputs_len2491 /// 0. Output for every outputs_len
2497 /// 1. Input for every inputs_len2492 /// 1. Input for every inputs_len
2498 /// 2. clobber: NullTerminatedString // index into string_bytes (null terminated) for every clobbers_len.
2499 pub const Asm = struct {2493 pub const Asm = struct {
2500 src_node: Ast.Node.Offset,2494 src_node: Ast.Node.Offset,
2501 // null-terminated string index2495 // null-terminated string index
...@@ -2505,6 +2499,13 @@ pub const Inst = struct {...@@ -2505,6 +2499,13 @@ pub const Inst = struct {
2505 /// 0b1 - operand is a type; asm expression has the output as the result.2499 /// 0b1 - operand is a type; asm expression has the output as the result.
2506 /// 0b0X is the first output, 0bX0 is the second, etc.2500 /// 0b0X is the first output, 0bX0 is the second, etc.
2507 output_type_bits: u32,2501 output_type_bits: u32,
2502 clobbers: Ref,
2503
2504 pub const Small = packed struct(u16) {
2505 is_volatile: bool,
2506 outputs_len: u7,
2507 inputs_len: u8,
2508 };
25082509
2509 pub const Output = struct {2510 pub const Output = struct {
2510 /// index into string_bytes (null terminated)2511 /// index into string_bytes (null terminated)
...@@ -3482,6 +3483,7 @@ pub const Inst = struct {...@@ -3482,6 +3483,7 @@ pub const Inst = struct {
3482 extern_options,3483 extern_options,
3483 type_info,3484 type_info,
3484 branch_hint,3485 branch_hint,
3486 clobbers,
3485 // Values3487 // Values
3486 calling_convention_c,3488 calling_convention_c,
3487 calling_convention_inline,3489 calling_convention_inline,
lib/std/zig/ZonGen.zig+1-1
...@@ -227,7 +227,7 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator...@@ -227,7 +227,7 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
227 => try zg.addErrorNode(node, "control flow is not allowed in ZON", .{}),227 => try zg.addErrorNode(node, "control flow is not allowed in ZON", .{}),
228228
229 .@"comptime" => try zg.addErrorNode(node, "keyword 'comptime' is not allowed in ZON", .{}),229 .@"comptime" => try zg.addErrorNode(node, "keyword 'comptime' is not allowed in ZON", .{}),
230 .asm_simple, .@"asm" => try zg.addErrorNode(node, "inline asm is not allowed in ZON", .{}),230 .asm_simple, .@"asm", .asm_legacy => try zg.addErrorNode(node, "inline asm is not allowed in ZON", .{}),
231231
232 .builtin_call_two,232 .builtin_call_two,
233 .builtin_call_two_comma,233 .builtin_call_two_comma,
lib/std/zig/parser_test.zig+54-11
...@@ -32,7 +32,7 @@ test "zig fmt: tuple struct" {...@@ -32,7 +32,7 @@ test "zig fmt: tuple struct" {
32}32}
3333
34test "zig fmt: preserves clobbers in inline asm with stray comma" {34test "zig fmt: preserves clobbers in inline asm with stray comma" {
35 try testCanonical(35 try testTransform(
36 \\fn foo() void {36 \\fn foo() void {
37 \\ asm volatile (""37 \\ asm volatile (""
38 \\ : [_] "" (-> type),38 \\ : [_] "" (-> type),
...@@ -46,6 +46,20 @@ test "zig fmt: preserves clobbers in inline asm with stray comma" {...@@ -46,6 +46,20 @@ test "zig fmt: preserves clobbers in inline asm with stray comma" {
46 \\ );46 \\ );
47 \\}47 \\}
48 \\48 \\
49 ,
50 \\fn foo() void {
51 \\ asm volatile (""
52 \\ : [_] "" (-> type),
53 \\ :
54 \\ : .{ .clobber = true }
55 \\ );
56 \\ asm volatile (""
57 \\ :
58 \\ : [_] "" (type),
59 \\ : .{ .clobber = true }
60 \\ );
61 \\}
62 \\
49 );63 );
50}64}
5165
...@@ -64,7 +78,7 @@ test "zig fmt: remove trailing comma at the end of assembly clobber" {...@@ -64,7 +78,7 @@ test "zig fmt: remove trailing comma at the end of assembly clobber" {
64 \\ asm volatile (""78 \\ asm volatile (""
65 \\ : [_] "" (-> type),79 \\ : [_] "" (-> type),
66 \\ :80 \\ :
67 \\ : "clobber1", "clobber2"81 \\ : .{ .clobber1 = true, .clobber2 = true }
68 \\ );82 \\ );
69 \\}83 \\}
70 \\84 \\
...@@ -628,7 +642,7 @@ test "zig fmt: builtin call with trailing comma" {...@@ -628,7 +642,7 @@ test "zig fmt: builtin call with trailing comma" {
628}642}
629643
630test "zig fmt: asm expression with comptime content" {644test "zig fmt: asm expression with comptime content" {
631 try testCanonical(645 try testTransform(
632 \\comptime {646 \\comptime {
633 \\ asm ("foo" ++ "bar");647 \\ asm ("foo" ++ "bar");
634 \\}648 \\}
...@@ -648,6 +662,26 @@ test "zig fmt: asm expression with comptime content" {...@@ -648,6 +662,26 @@ test "zig fmt: asm expression with comptime content" {
648 \\ );662 \\ );
649 \\}663 \\}
650 \\664 \\
665 ,
666 \\comptime {
667 \\ asm ("foo" ++ "bar");
668 \\}
669 \\pub fn main() void {
670 \\ asm volatile ("foo" ++ "bar");
671 \\ asm volatile ("foo" ++ "bar"
672 \\ : [_] "" (x),
673 \\ );
674 \\ asm volatile ("foo" ++ "bar"
675 \\ : [_] "" (x),
676 \\ : [_] "" (y),
677 \\ );
678 \\ asm volatile ("foo" ++ "bar"
679 \\ : [_] "" (x),
680 \\ : [_] "" (y),
681 \\ : .{ .h = true, .e = true, .l = true, .l = true, .o = true }
682 \\ );
683 \\}
684 \\
651 );685 );
652}686}
653687
...@@ -2182,7 +2216,7 @@ test "zig fmt: simple asm" {...@@ -2182,7 +2216,7 @@ test "zig fmt: simple asm" {
2182 \\ : [a] "x" (-> i32),2216 \\ : [a] "x" (-> i32),
2183 \\ : [a] "x" (1),2217 \\ : [a] "x" (1),
2184 \\ );2218 \\ );
2185 \\ asm ("still not real assembly" ::: "a", "b");2219 \\ asm ("still not real assembly" ::: .{ .a = true, .b = true });
2186 \\}2220 \\}
2187 \\2221 \\
2188 );2222 );
...@@ -3907,7 +3941,7 @@ test "zig fmt: fn type" {...@@ -3907,7 +3941,7 @@ test "zig fmt: fn type" {
3907}3941}
39083942
3909test "zig fmt: inline asm" {3943test "zig fmt: inline asm" {
3910 try testCanonical(3944 try testTransform(
3911 \\pub fn syscall1(number: usize, arg1: usize) usize {3945 \\pub fn syscall1(number: usize, arg1: usize) usize {
3912 \\ return asm volatile ("syscall"3946 \\ return asm volatile ("syscall"
3913 \\ : [ret] "={rax}" (-> usize),3947 \\ : [ret] "={rax}" (-> usize),
...@@ -3917,6 +3951,16 @@ test "zig fmt: inline asm" {...@@ -3917,6 +3951,16 @@ test "zig fmt: inline asm" {
3917 \\ );3951 \\ );
3918 \\}3952 \\}
3919 \\3953 \\
3954 ,
3955 \\pub fn syscall1(number: usize, arg1: usize) usize {
3956 \\ return asm volatile ("syscall"
3957 \\ : [ret] "={rax}" (-> usize),
3958 \\ : [number] "{rax}" (number),
3959 \\ [arg1] "{rdi}" (arg1),
3960 \\ : .{ .rcx = true, .r11 = true }
3961 \\ );
3962 \\}
3963 \\
3920 );3964 );
3921}3965}
39223966
...@@ -3998,7 +4042,7 @@ test "zig fmt: inline asm parameter alignment" {...@@ -3998,7 +4042,7 @@ test "zig fmt: inline asm parameter alignment" {
3998 \\ asm volatile (4042 \\ asm volatile (
3999 \\ \\ foo4043 \\ \\ foo
4000 \\ \\ bar4044 \\ \\ bar
4001 \\ ::: "", "");4045 \\ ::: .{ .a = true, .b = true });
4002 \\ asm volatile (4046 \\ asm volatile (
4003 \\ \\ foo4047 \\ \\ foo
4004 \\ \\ bar4048 \\ \\ bar
...@@ -4006,8 +4050,7 @@ test "zig fmt: inline asm parameter alignment" {...@@ -4006,8 +4050,7 @@ test "zig fmt: inline asm parameter alignment" {
4006 \\ [_] "" (-> usize),4050 \\ [_] "" (-> usize),
4007 \\ : [_] "" (0),4051 \\ : [_] "" (0),
4008 \\ [_] "" (0),4052 \\ [_] "" (0),
4009 \\ : "", ""4053 \\ : .{});
4010 \\ );
4011 \\}4054 \\}
4012 \\4055 \\
4013 );4056 );
...@@ -5325,7 +5368,7 @@ test "zig fmt: make single-line if no trailing comma, fmt: off" {...@@ -5325,7 +5368,7 @@ test "zig fmt: make single-line if no trailing comma, fmt: off" {
5325 \\ asm ("not real assembly"5368 \\ asm ("not real assembly"
5326 \\ :[a] "x" (->i32),:[a] "x" (1),);5369 \\ :[a] "x" (->i32),:[a] "x" (1),);
5327 \\ asm volatile ("still not real assembly"5370 \\ asm volatile ("still not real assembly"
5328 \\ :::"a","b",);5371 \\ :::.{.a = true,.b = true,});
5329 \\ }5372 \\ }
5330 \\}5373 \\}
5331 );5374 );
...@@ -5737,7 +5780,7 @@ test "zig fmt: canonicalize symbols (asm)" {...@@ -5737,7 +5780,7 @@ test "zig fmt: canonicalize symbols (asm)" {
5737 \\ [@"arg1"] "{rdi}" (arg),5780 \\ [@"arg1"] "{rdi}" (arg),
5738 \\ [arg2] "{rsi}" (arg),5781 \\ [arg2] "{rsi}" (arg),
5739 \\ [arg3] "{rdx}" (arg),5782 \\ [arg3] "{rdx}" (arg),
5740 \\ : "rcx", "r11"5783 \\ : "rcx", "fn"
5741 \\ );5784 \\ );
5742 \\5785 \\
5743 \\ const @"false": usize = 10;5786 \\ const @"false": usize = 10;
...@@ -5759,7 +5802,7 @@ test "zig fmt: canonicalize symbols (asm)" {...@@ -5759,7 +5802,7 @@ test "zig fmt: canonicalize symbols (asm)" {
5759 \\ [arg1] "{rdi}" (arg),5802 \\ [arg1] "{rdi}" (arg),
5760 \\ [arg2] "{rsi}" (arg),5803 \\ [arg2] "{rsi}" (arg),
5761 \\ [arg3] "{rdx}" (arg),5804 \\ [arg3] "{rdx}" (arg),
5762 \\ : "rcx", "r11"5805 \\ : .{ .rcx = true, .@"fn" = true }
5763 \\ );5806 \\ );
5764 \\5807 \\
5765 \\ const @"false": usize = 10;5808 \\ const @"false": usize = 10;
lib/std/zig/render.zig+167-10
...@@ -852,6 +852,9 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {...@@ -852,6 +852,9 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
852 .@"asm",852 .@"asm",
853 => return renderAsm(r, tree.fullAsm(node).?, space),853 => return renderAsm(r, tree.fullAsm(node).?, space),
854854
855 // To be removed after 0.15.0 is tagged
856 .asm_legacy => return renderAsmLegacy(r, tree.legacyAsm(node).?, space),
857
855 .enum_literal => {858 .enum_literal => {
856 try renderToken(r, tree.nodeMainToken(node) - 1, .none); // .859 try renderToken(r, tree.nodeMainToken(node) - 1, .none); // .
857 return renderIdentifier(r, tree.nodeMainToken(node), space, .eagerly_unquote); // name860 return renderIdentifier(r, tree.nodeMainToken(node), space, .eagerly_unquote); // name
...@@ -2363,9 +2366,9 @@ fn renderContainerDecl(...@@ -2363,9 +2366,9 @@ fn renderContainerDecl(
2363 return renderToken(r, rbrace, space); // rbrace2366 return renderToken(r, rbrace, space); // rbrace
2364}2367}
23652368
2366fn renderAsm(2369fn renderAsmLegacy(
2367 r: *Render,2370 r: *Render,
2368 asm_node: Ast.full.Asm,2371 asm_node: Ast.full.AsmLegacy,
2369 space: Space,2372 space: Space,
2370) Error!void {2373) Error!void {
2371 const tree = r.tree;2374 const tree = r.tree;
...@@ -2391,17 +2394,24 @@ fn renderAsm(...@@ -2391,17 +2394,24 @@ fn renderAsm(
2391 try renderToken(r, first_clobber - 2, .none);2394 try renderToken(r, first_clobber - 2, .none);
2392 try renderToken(r, first_clobber - 1, .space);2395 try renderToken(r, first_clobber - 1, .space);
23932396
2397 try ais.writer().writeAll(".{ ");
2398
2394 var tok_i = first_clobber;2399 var tok_i = first_clobber;
2395 while (true) : (tok_i += 1) {2400 while (true) : (tok_i += 1) {
2396 try renderToken(r, tok_i, .none);2401 try ais.writer().writeByte('.');
2402 _ = try writeStringLiteralAsIdentifier(r, tok_i);
2403 try ais.writer().writeAll(" = true");
2404
2397 tok_i += 1;2405 tok_i += 1;
2398 switch (tree.tokenTag(tok_i)) {2406 switch (tree.tokenTag(tok_i)) {
2399 .r_paren => {2407 .r_paren => {
2408 try ais.writer().writeAll(" }");
2400 ais.popIndent();2409 ais.popIndent();
2401 return renderToken(r, tok_i, space);2410 return renderToken(r, tok_i, space);
2402 },2411 },
2403 .comma => {2412 .comma => {
2404 if (tree.tokenTag(tok_i + 1) == .r_paren) {2413 if (tree.tokenTag(tok_i + 1) == .r_paren) {
2414 try ais.writer().writeAll(" }");
2405 ais.popIndent();2415 ais.popIndent();
2406 return renderToken(r, tok_i + 1, space);2416 return renderToken(r, tok_i + 1, space);
2407 } else {2417 } else {
...@@ -2412,10 +2422,7 @@ fn renderAsm(...@@ -2412,10 +2422,7 @@ fn renderAsm(
2412 }2422 }
2413 }2423 }
2414 } else {2424 } else {
2415 // asm ("foo")2425 unreachable;
2416 try renderExpression(r, asm_node.ast.template, .none);
2417 ais.popIndent();
2418 return renderToken(r, asm_node.ast.rparen, space); // rparen
2419 }2426 }
2420 }2427 }
24212428
...@@ -2499,13 +2506,17 @@ fn renderAsm(...@@ -2499,13 +2506,17 @@ fn renderAsm(
2499 };2506 };
25002507
2501 try renderToken(r, colon3, .space); // :2508 try renderToken(r, colon3, .space); // :
2509 try ais.writer().writeAll(".{ ");
2502 const first_clobber = asm_node.first_clobber.?;2510 const first_clobber = asm_node.first_clobber.?;
2503 var tok_i = first_clobber;2511 var tok_i = first_clobber;
2504 while (true) {2512 while (true) {
2505 switch (tree.tokenTag(tok_i + 1)) {2513 switch (tree.tokenTag(tok_i + 1)) {
2506 .r_paren => {2514 .r_paren => {
2507 ais.setIndentDelta(indent_delta);2515 ais.setIndentDelta(indent_delta);
2508 try renderToken(r, tok_i, .newline);2516 try ais.writer().writeByte('.');
2517 const lexeme_len = try writeStringLiteralAsIdentifier(r, tok_i);
2518 try ais.writer().writeAll(" = true }");
2519 try renderSpace(r, tok_i, lexeme_len, .newline);
2509 ais.popIndent();2520 ais.popIndent();
2510 return renderToken(r, tok_i + 1, space);2521 return renderToken(r, tok_i + 1, space);
2511 },2522 },
...@@ -2513,12 +2524,17 @@ fn renderAsm(...@@ -2513,12 +2524,17 @@ fn renderAsm(
2513 switch (tree.tokenTag(tok_i + 2)) {2524 switch (tree.tokenTag(tok_i + 2)) {
2514 .r_paren => {2525 .r_paren => {
2515 ais.setIndentDelta(indent_delta);2526 ais.setIndentDelta(indent_delta);
2516 try renderToken(r, tok_i, .newline);2527 try ais.writer().writeByte('.');
2528 const lexeme_len = try writeStringLiteralAsIdentifier(r, tok_i);
2529 try ais.writer().writeAll(" = true }");
2530 try renderSpace(r, tok_i, lexeme_len, .newline);
2517 ais.popIndent();2531 ais.popIndent();
2518 return renderToken(r, tok_i + 2, space);2532 return renderToken(r, tok_i + 2, space);
2519 },2533 },
2520 else => {2534 else => {
2521 try renderToken(r, tok_i, .none);2535 try ais.writer().writeByte('.');
2536 _ = try writeStringLiteralAsIdentifier(r, tok_i);
2537 try ais.writer().writeAll(" = true");
2522 try renderToken(r, tok_i + 1, .space);2538 try renderToken(r, tok_i + 1, .space);
2523 tok_i += 2;2539 tok_i += 2;
2524 },2540 },
...@@ -2529,6 +2545,131 @@ fn renderAsm(...@@ -2529,6 +2545,131 @@ fn renderAsm(
2529 }2545 }
2530}2546}
25312547
2548fn renderAsm(
2549 r: *Render,
2550 asm_node: Ast.full.Asm,
2551 space: Space,
2552) Error!void {
2553 const tree = r.tree;
2554 const ais = r.ais;
2555
2556 try renderToken(r, asm_node.ast.asm_token, .space); // asm
2557
2558 if (asm_node.volatile_token) |volatile_token| {
2559 try renderToken(r, volatile_token, .space); // volatile
2560 try renderToken(r, volatile_token + 1, .none); // lparen
2561 } else {
2562 try renderToken(r, asm_node.ast.asm_token + 1, .none); // lparen
2563 }
2564
2565 if (asm_node.ast.items.len == 0) {
2566 try ais.forcePushIndent(.normal);
2567 if (asm_node.ast.clobbers.unwrap()) |clobbers| {
2568 // asm ("foo" ::: clobbers)
2569 try renderExpression(r, asm_node.ast.template, .space);
2570 // Render the three colons.
2571 const first_clobber = tree.firstToken(clobbers);
2572 try renderToken(r, first_clobber - 3, .none);
2573 try renderToken(r, first_clobber - 2, .none);
2574 try renderToken(r, first_clobber - 1, .space);
2575 try renderExpression(r, clobbers, .none);
2576 ais.popIndent();
2577 return renderToken(r, asm_node.ast.rparen, space); // rparen
2578 }
2579
2580 // asm ("foo")
2581 try renderExpression(r, asm_node.ast.template, .none);
2582 ais.popIndent();
2583 return renderToken(r, asm_node.ast.rparen, space); // rparen
2584 }
2585
2586 try ais.forcePushIndent(.normal);
2587 try renderExpression(r, asm_node.ast.template, .newline);
2588 ais.setIndentDelta(asm_indent_delta);
2589 const colon1 = tree.lastToken(asm_node.ast.template) + 1;
2590
2591 const colon2 = if (asm_node.outputs.len == 0) colon2: {
2592 try renderToken(r, colon1, .newline); // :
2593 break :colon2 colon1 + 1;
2594 } else colon2: {
2595 try renderToken(r, colon1, .space); // :
2596
2597 try ais.forcePushIndent(.normal);
2598 for (asm_node.outputs, 0..) |asm_output, i| {
2599 if (i + 1 < asm_node.outputs.len) {
2600 const next_asm_output = asm_node.outputs[i + 1];
2601 try renderAsmOutput(r, asm_output, .none);
2602
2603 const comma = tree.firstToken(next_asm_output) - 1;
2604 try renderToken(r, comma, .newline); // ,
2605 try renderExtraNewlineToken(r, tree.firstToken(next_asm_output));
2606 } else if (asm_node.inputs.len == 0 and asm_node.ast.clobbers == .none) {
2607 try ais.pushSpace(.comma);
2608 try renderAsmOutput(r, asm_output, .comma);
2609 ais.popSpace();
2610 ais.popIndent();
2611 ais.setIndentDelta(indent_delta);
2612 ais.popIndent();
2613 return renderToken(r, asm_node.ast.rparen, space); // rparen
2614 } else {
2615 try ais.pushSpace(.comma);
2616 try renderAsmOutput(r, asm_output, .comma);
2617 ais.popSpace();
2618 const comma_or_colon = tree.lastToken(asm_output) + 1;
2619 ais.popIndent();
2620 break :colon2 switch (tree.tokenTag(comma_or_colon)) {
2621 .comma => comma_or_colon + 1,
2622 else => comma_or_colon,
2623 };
2624 }
2625 } else unreachable;
2626 };
2627
2628 const colon3 = if (asm_node.inputs.len == 0) colon3: {
2629 try renderToken(r, colon2, .newline); // :
2630 break :colon3 colon2 + 1;
2631 } else colon3: {
2632 try renderToken(r, colon2, .space); // :
2633 try ais.forcePushIndent(.normal);
2634 for (asm_node.inputs, 0..) |asm_input, i| {
2635 if (i + 1 < asm_node.inputs.len) {
2636 const next_asm_input = asm_node.inputs[i + 1];
2637 try renderAsmInput(r, asm_input, .none);
2638
2639 const first_token = tree.firstToken(next_asm_input);
2640 try renderToken(r, first_token - 1, .newline); // ,
2641 try renderExtraNewlineToken(r, first_token);
2642 } else if (asm_node.ast.clobbers == .none) {
2643 try ais.pushSpace(.comma);
2644 try renderAsmInput(r, asm_input, .comma);
2645 ais.popSpace();
2646 ais.popIndent();
2647 ais.setIndentDelta(indent_delta);
2648 ais.popIndent();
2649 return renderToken(r, asm_node.ast.rparen, space); // rparen
2650 } else {
2651 try ais.pushSpace(.comma);
2652 try renderAsmInput(r, asm_input, .comma);
2653 ais.popSpace();
2654 const comma_or_colon = tree.lastToken(asm_input) + 1;
2655 ais.popIndent();
2656 break :colon3 switch (tree.tokenTag(comma_or_colon)) {
2657 .comma => comma_or_colon + 1,
2658 else => comma_or_colon,
2659 };
2660 }
2661 }
2662 unreachable;
2663 };
2664
2665 try renderToken(r, colon3, .space); // :
2666 const clobbers = asm_node.ast.clobbers.unwrap().?;
2667 try renderExpression(r, clobbers, .none);
2668 ais.setIndentDelta(indent_delta);
2669 ais.popIndent();
2670 return renderToken(r, asm_node.ast.rparen, space); // rparen
2671}
2672
2532fn renderCall(2673fn renderCall(
2533 r: *Render,2674 r: *Render,
2534 call: Ast.full.Call,2675 call: Ast.full.Call,
...@@ -3090,6 +3231,22 @@ fn tokenSliceForRender(tree: Ast, token_index: Ast.TokenIndex) []const u8 {...@@ -3090,6 +3231,22 @@ fn tokenSliceForRender(tree: Ast, token_index: Ast.TokenIndex) []const u8 {
3090 return ret;3231 return ret;
3091}3232}
30923233
3234fn writeStringLiteralAsIdentifier(r: *Render, token_index: Ast.TokenIndex) !usize {
3235 const tree = r.tree;
3236 const ais = r.ais;
3237 assert(tree.tokenTag(token_index) == .string_literal);
3238 const lexeme = tokenSliceForRender(tree, token_index);
3239 const unquoted = lexeme[1..][0 .. lexeme.len - 2];
3240 if (std.zig.isValidId(unquoted)) {
3241 try ais.writer().writeAll(unquoted);
3242 return unquoted.len;
3243 } else {
3244 try ais.writer().writeByte('@');
3245 try ais.writer().writeAll(lexeme);
3246 return lexeme.len + 1;
3247 }
3248}
3249
3093fn hasSameLineComment(tree: Ast, token_index: Ast.TokenIndex) bool {3250fn hasSameLineComment(tree: Ast, token_index: Ast.TokenIndex) bool {
3094 const between_source = tree.source[tree.tokenStart(token_index)..tree.tokenStart(token_index + 1)];3251 const between_source = tree.source[tree.tokenStart(token_index)..tree.tokenStart(token_index + 1)];
3095 for (between_source) |byte| switch (byte) {3252 for (between_source) |byte| switch (byte) {
lib/std/zig/system/x86.zig+1-2
...@@ -783,6 +783,5 @@ fn getXCR0() u32 {...@@ -783,6 +783,5 @@ fn getXCR0() u32 {
783 \\ xgetbv783 \\ xgetbv
784 : [_] "={eax}" (-> u32),784 : [_] "={eax}" (-> u32),
785 :785 :
786 : "edx", "ecx"786 : .{ .edx = true, .ecx = true });
787 );
788}787}
src/Air.zig+10-9
...@@ -1413,19 +1413,20 @@ pub const ShuffleTwoMask = enum(u32) {...@@ -1413,19 +1413,20 @@ pub const ShuffleTwoMask = enum(u32) {
1413/// terminated string.1413/// terminated string.
1414/// - name: memory at this position is reinterpreted as a null1414/// - name: memory at this position is reinterpreted as a null
1415/// terminated string. pad to the next u32 after the null byte.1415/// terminated string. pad to the next u32 after the null byte.
1416/// 4. for every clobbers_len1416/// 4. A number of u32 elements follow according to the equation `(source_len + 3) / 4`.
1417/// - clobber_name: memory at this position is reinterpreted as a null
1418/// terminated string. pad to the next u32 after the null byte.
1419/// 5. A number of u32 elements follow according to the equation `(source_len + 3) / 4`.
1420/// Memory starting at this position is reinterpreted as the source bytes.1417/// Memory starting at this position is reinterpreted as the source bytes.
1421pub const Asm = struct {1418pub const Asm = struct {
1422 /// Length of the assembly source in bytes.1419 /// Length of the assembly source in bytes.
1423 source_len: u32,1420 source_len: u32,
1424 outputs_len: u32,
1425 inputs_len: u32,1421 inputs_len: u32,
1426 /// The MSB is `is_volatile`.1422 /// A comptime `std.builtin.assembly.Clobbers` value for the target architecture.
1427 /// The rest of the bits are `clobbers_len`.1423 clobbers: InternPool.Index,
1428 flags: u32,1424 flags: Flags,
1425
1426 pub const Flags = packed struct(u32) {
1427 outputs_len: u31,
1428 is_volatile: bool,
1429 };
1429};1430};
14301431
1431pub const Cmpxchg = struct {1432pub const Cmpxchg = struct {
...@@ -1749,7 +1750,7 @@ pub fn extraData(air: Air, comptime T: type, index: usize) struct { data: T, end...@@ -1749,7 +1750,7 @@ pub fn extraData(air: Air, comptime T: type, index: usize) struct { data: T, end
1749 @field(result, field.name) = switch (field.type) {1750 @field(result, field.name) = switch (field.type) {
1750 u32 => air.extra.items[i],1751 u32 => air.extra.items[i],
1751 InternPool.Index, Inst.Ref => @enumFromInt(air.extra.items[i]),1752 InternPool.Index, Inst.Ref => @enumFromInt(air.extra.items[i]),
1752 i32, CondBr.BranchHints => @bitCast(air.extra.items[i]),1753 i32, CondBr.BranchHints, Asm.Flags => @bitCast(air.extra.items[i]),
1753 else => @compileError("bad field type: " ++ @typeName(field.type)),1754 else => @compileError("bad field type: " ++ @typeName(field.type)),
1754 };1755 };
1755 i += 1;1756 i += 1;
src/Air/Liveness.zig+2-1
...@@ -1208,8 +1208,9 @@ fn analyzeInst(...@@ -1208,8 +1208,9 @@ fn analyzeInst(
12081208
1209 .assembly => {1209 .assembly => {
1210 const extra = a.air.extraData(Air.Asm, inst_datas[@intFromEnum(inst)].ty_pl.payload);1210 const extra = a.air.extraData(Air.Asm, inst_datas[@intFromEnum(inst)].ty_pl.payload);
1211 const outputs_len = extra.data.flags.outputs_len;
1211 var extra_i: usize = extra.end;1212 var extra_i: usize = extra.end;
1212 const outputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..extra.data.outputs_len]));1213 const outputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..outputs_len]));
1213 extra_i += outputs.len;1214 extra_i += outputs.len;
1214 const inputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..extra.data.inputs_len]));1215 const inputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..extra.data.inputs_len]));
1215 extra_i += inputs.len;1216 extra_i += inputs.len;
src/Air/Liveness/Verify.zig+3-8
...@@ -366,16 +366,11 @@ fn verifyBody(self: *Verify, body: []const Air.Inst.Index) Error!void {...@@ -366,16 +366,11 @@ fn verifyBody(self: *Verify, body: []const Air.Inst.Index) Error!void {
366 .assembly => {366 .assembly => {
367 const ty_pl = data[@intFromEnum(inst)].ty_pl;367 const ty_pl = data[@intFromEnum(inst)].ty_pl;
368 const extra = self.air.extraData(Air.Asm, ty_pl.payload);368 const extra = self.air.extraData(Air.Asm, ty_pl.payload);
369 const outputs_len = extra.data.flags.outputs_len;
369 var extra_i = extra.end;370 var extra_i = extra.end;
370 const outputs = @as(371 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..outputs_len]);
371 []const Air.Inst.Ref,
372 @ptrCast(self.air.extra.items[extra_i..][0..extra.data.outputs_len]),
373 );
374 extra_i += outputs.len;372 extra_i += outputs.len;
375 const inputs = @as(373 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
376 []const Air.Inst.Ref,
377 @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]),
378 );
379 extra_i += inputs.len;374 extra_i += inputs.len;
380375
381 var bt = self.liveness.iterateBigTomb(inst);376 var bt = self.liveness.iterateBigTomb(inst);
src/Air/print.zig+35-18
...@@ -1,5 +1,6 @@...@@ -1,5 +1,6 @@
1const std = @import("std");1const std = @import("std");
2const Allocator = std.mem.Allocator;2const Allocator = std.mem.Allocator;
3const assert = std.debug.assert;
34
4const build_options = @import("build_options");5const build_options = @import("build_options");
5const Zcu = @import("../Zcu.zig");6const Zcu = @import("../Zcu.zig");
...@@ -9,7 +10,7 @@ const Air = @import("../Air.zig");...@@ -9,7 +10,7 @@ const Air = @import("../Air.zig");
9const InternPool = @import("../InternPool.zig");10const InternPool = @import("../InternPool.zig");
1011
11pub fn write(air: Air, stream: *std.io.Writer, pt: Zcu.PerThread, liveness: ?Air.Liveness) void {12pub fn write(air: Air, stream: *std.io.Writer, pt: Zcu.PerThread, liveness: ?Air.Liveness) void {
12 comptime std.debug.assert(build_options.enable_debug_extensions);13 comptime assert(build_options.enable_debug_extensions);
13 const instruction_bytes = air.instructions.len *14 const instruction_bytes = air.instructions.len *
14 // Here we don't use @sizeOf(Air.Inst.Data) because it would include15 // Here we don't use @sizeOf(Air.Inst.Data) because it would include
15 // the debug safety tag but we want to measure release size.16 // the debug safety tag but we want to measure release size.
...@@ -59,7 +60,7 @@ pub fn writeInst(...@@ -59,7 +60,7 @@ pub fn writeInst(
59 pt: Zcu.PerThread,60 pt: Zcu.PerThread,
60 liveness: ?Air.Liveness,61 liveness: ?Air.Liveness,
61) void {62) void {
62 comptime std.debug.assert(build_options.enable_debug_extensions);63 comptime assert(build_options.enable_debug_extensions);
63 var writer: Writer = .{64 var writer: Writer = .{
64 .pt = pt,65 .pt = pt,
65 .gpa = pt.zcu.gpa,66 .gpa = pt.zcu.gpa,
...@@ -643,8 +644,8 @@ const Writer = struct {...@@ -643,8 +644,8 @@ const Writer = struct {
643 fn writeAssembly(w: *Writer, s: *std.io.Writer, inst: Air.Inst.Index) Error!void {644 fn writeAssembly(w: *Writer, s: *std.io.Writer, inst: Air.Inst.Index) Error!void {
644 const ty_pl = w.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;645 const ty_pl = w.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
645 const extra = w.air.extraData(Air.Asm, ty_pl.payload);646 const extra = w.air.extraData(Air.Asm, ty_pl.payload);
646 const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;647 const is_volatile = extra.data.flags.is_volatile;
647 const clobbers_len = @as(u31, @truncate(extra.data.flags));648 const outputs_len = extra.data.flags.outputs_len;
648 var extra_i: usize = extra.end;649 var extra_i: usize = extra.end;
649 var op_index: usize = 0;650 var op_index: usize = 0;
650651
...@@ -655,7 +656,7 @@ const Writer = struct {...@@ -655,7 +656,7 @@ const Writer = struct {
655 try s.writeAll(", volatile");656 try s.writeAll(", volatile");
656 }657 }
657658
658 const outputs = @as([]const Air.Inst.Ref, @ptrCast(w.air.extra.items[extra_i..][0..extra.data.outputs_len]));659 const outputs = @as([]const Air.Inst.Ref, @ptrCast(w.air.extra.items[extra_i..][0..outputs_len]));
659 extra_i += outputs.len;660 extra_i += outputs.len;
660 const inputs = @as([]const Air.Inst.Ref, @ptrCast(w.air.extra.items[extra_i..][0..extra.data.inputs_len]));661 const inputs = @as([]const Air.Inst.Ref, @ptrCast(w.air.extra.items[extra_i..][0..extra.data.inputs_len]));
661 extra_i += inputs.len;662 extra_i += inputs.len;
...@@ -695,19 +696,35 @@ const Writer = struct {...@@ -695,19 +696,35 @@ const Writer = struct {
695 try s.writeByte(')');696 try s.writeByte(')');
696 }697 }
697698
698 {699 const zcu = w.pt.zcu;
699 var clobber_i: u32 = 0;700 const ip = &zcu.intern_pool;
700 while (clobber_i < clobbers_len) : (clobber_i += 1) {701 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
701 const extra_bytes = std.mem.sliceAsBytes(w.air.extra.items[extra_i..]);702 const struct_type: Type = .fromInterned(aggregate.ty);
702 const clobber = std.mem.sliceTo(extra_bytes, 0);703 switch (aggregate.storage) {
703 // This equation accounts for the fact that even if we have exactly 4 bytes704 .elems => |elems| for (elems, 0..) |elem, i| {
704 // for the string, we still use the next u32 for the null terminator.705 switch (elem) {
705 extra_i += clobber.len / 4 + 1;706 .bool_true => {
706707 const clobber = struct_type.structFieldName(i, zcu).toSlice(ip).?;
707 try s.writeAll(", ~{");708 assert(clobber.len != 0);
708 try s.writeAll(clobber);709 try s.writeAll(", ~{");
709 try s.writeAll("}");710 try s.writeAll(clobber);
710 }711 try s.writeAll("}");
712 },
713 .bool_false => continue,
714 else => unreachable,
715 }
716 },
717 .repeated_elem => |elem| {
718 try s.writeAll(", ");
719 try s.writeAll(switch (elem) {
720 .bool_true => "<all clobbers>",
721 .bool_false => "<no clobbers>",
722 else => unreachable,
723 });
724 },
725 .bytes => |bytes| {
726 try s.print(", {x}", .{bytes});
727 },
711 }728 }
712 const asm_source = std.mem.sliceAsBytes(w.air.extra.items[extra_i..])[0..extra.data.source_len];729 const asm_source = std.mem.sliceAsBytes(w.air.extra.items[extra_i..])[0..extra.data.source_len];
713 try s.print(", \"{f}\"", .{std.zig.fmtString(asm_source)});730 try s.print(", \"{f}\"", .{std.zig.fmtString(asm_source)});
src/Air/types_resolved.zig+3-2
...@@ -416,8 +416,9 @@ fn checkBody(air: Air, body: []const Air.Inst.Index, zcu: *Zcu) bool {...@@ -416,8 +416,9 @@ fn checkBody(air: Air, body: []const Air.Inst.Index, zcu: *Zcu) bool {
416 if (!checkType(data.ty_pl.ty.toType(), zcu)) return false;416 if (!checkType(data.ty_pl.ty.toType(), zcu)) return false;
417 // Luckily, we only care about the inputs and outputs, so we don't have to do417 // Luckily, we only care about the inputs and outputs, so we don't have to do
418 // the whole null-terminated string dance.418 // the whole null-terminated string dance.
419 const outputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end..][0..extra.data.outputs_len]);419 const outputs_len = extra.data.flags.outputs_len;
420 const inputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end + extra.data.outputs_len ..][0..extra.data.inputs_len]);420 const outputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end..][0..outputs_len]);
421 const inputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end + outputs_len ..][0..extra.data.inputs_len]);
421 for (outputs) |output| if (output != .none and !checkRef(output, zcu)) return false;422 for (outputs) |output| if (output != .none and !checkRef(output, zcu)) return false;
422 for (inputs) |input| if (input != .none and !checkRef(input, zcu)) return false;423 for (inputs) |input| if (input != .none and !checkRef(input, zcu)) return false;
423 },424 },
src/InternPool.zig+6
...@@ -54,6 +54,7 @@ namespace_name_deps: std.AutoArrayHashMapUnmanaged(NamespaceNameKey, DepEntry.In...@@ -54,6 +54,7 @@ namespace_name_deps: std.AutoArrayHashMapUnmanaged(NamespaceNameKey, DepEntry.In
54memoized_state_main_deps: DepEntry.Index.Optional,54memoized_state_main_deps: DepEntry.Index.Optional,
55memoized_state_panic_deps: DepEntry.Index.Optional,55memoized_state_panic_deps: DepEntry.Index.Optional,
56memoized_state_va_list_deps: DepEntry.Index.Optional,56memoized_state_va_list_deps: DepEntry.Index.Optional,
57memoized_state_assembly_deps: DepEntry.Index.Optional,
5758
58/// Given a `Depender`, points to an entry in `dep_entries` whose `depender`59/// Given a `Depender`, points to an entry in `dep_entries` whose `depender`
59/// matches. The `next_dependee` field can be used to iterate all such entries60/// matches. The `next_dependee` field can be used to iterate all such entries
...@@ -96,6 +97,7 @@ pub const empty: InternPool = .{...@@ -96,6 +97,7 @@ pub const empty: InternPool = .{
96 .memoized_state_main_deps = .none,97 .memoized_state_main_deps = .none,
97 .memoized_state_panic_deps = .none,98 .memoized_state_panic_deps = .none,
98 .memoized_state_va_list_deps = .none,99 .memoized_state_va_list_deps = .none,
100 .memoized_state_assembly_deps = .none,
99 .first_dependency = .empty,101 .first_dependency = .empty,
100 .dep_entries = .empty,102 .dep_entries = .empty,
101 .free_dep_entries = .empty,103 .free_dep_entries = .empty,
...@@ -458,6 +460,8 @@ pub const MemoizedStateStage = enum(u32) {...@@ -458,6 +460,8 @@ pub const MemoizedStateStage = enum(u32) {
458 panic,460 panic,
459 /// Specifically `std.builtin.VaList`. See `Zcu.BuiltinDecl.stage`.461 /// Specifically `std.builtin.VaList`. See `Zcu.BuiltinDecl.stage`.
460 va_list,462 va_list,
463 /// Everything within `std.builtin.assembly`. See `Zcu.BuiltinDecl.stage`.
464 assembly,
461};465};
462466
463pub const ComptimeUnit = extern struct {467pub const ComptimeUnit = extern struct {
...@@ -880,6 +884,7 @@ pub fn dependencyIterator(ip: *const InternPool, dependee: Dependee) DependencyI...@@ -880,6 +884,7 @@ pub fn dependencyIterator(ip: *const InternPool, dependee: Dependee) DependencyI
880 .main => ip.memoized_state_main_deps.unwrap(),884 .main => ip.memoized_state_main_deps.unwrap(),
881 .panic => ip.memoized_state_panic_deps.unwrap(),885 .panic => ip.memoized_state_panic_deps.unwrap(),
882 .va_list => ip.memoized_state_va_list_deps.unwrap(),886 .va_list => ip.memoized_state_va_list_deps.unwrap(),
887 .assembly => ip.memoized_state_assembly_deps.unwrap(),
883 },888 },
884 } orelse return .{889 } orelse return .{
885 .ip = ip,890 .ip = ip,
...@@ -915,6 +920,7 @@ pub fn addDependency(ip: *InternPool, gpa: Allocator, depender: AnalUnit, depend...@@ -915,6 +920,7 @@ pub fn addDependency(ip: *InternPool, gpa: Allocator, depender: AnalUnit, depend
915 .main => &ip.memoized_state_main_deps,920 .main => &ip.memoized_state_main_deps,
916 .panic => &ip.memoized_state_panic_deps,921 .panic => &ip.memoized_state_panic_deps,
917 .va_list => &ip.memoized_state_va_list_deps,922 .va_list => &ip.memoized_state_va_list_deps,
923 .assembly => &ip.memoized_state_assembly_deps,
918 };924 };
919925
920 if (deps.unwrap()) |first| {926 if (deps.unwrap()) |first| {
src/Sema.zig+17-23
...@@ -16413,10 +16413,10 @@ fn zirAsm(...@@ -16413,10 +16413,10 @@ fn zirAsm(
16413 const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand);16413 const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand);
16414 const src = block.nodeOffset(extra.data.src_node);16414 const src = block.nodeOffset(extra.data.src_node);
16415 const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node });16415 const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node });
16416 const outputs_len: u4 = @truncate(extended.small);16416 const small: Zir.Inst.Asm.Small = @bitCast(extended.small);
16417 const inputs_len: u5 = @truncate(extended.small >> 4);16417 const outputs_len = small.outputs_len;
16418 const clobbers_len: u6 = @truncate(extended.small >> 9);16418 const inputs_len = small.inputs_len;
16419 const is_volatile = @as(u1, @truncate(extended.small >> 15)) != 0;16419 const is_volatile = small.is_volatile;
16420 const is_global_assembly = sema.func_index == .none;16420 const is_global_assembly = sema.func_index == .none;
16421 const zir_tags = sema.code.instructions.items(.tag);16421 const zir_tags = sema.code.instructions.items(.tag);
1642216422
...@@ -16432,7 +16432,7 @@ fn zirAsm(...@@ -16432,7 +16432,7 @@ fn zirAsm(
16432 if (inputs_len != 0) {16432 if (inputs_len != 0) {
16433 return sema.fail(block, src, "module-level assembly does not support inputs", .{});16433 return sema.fail(block, src, "module-level assembly does not support inputs", .{});
16434 }16434 }
16435 if (clobbers_len != 0) {16435 if (extra.data.clobbers != .none) {
16436 return sema.fail(block, src, "module-level assembly does not support clobbers", .{});16436 return sema.fail(block, src, "module-level assembly does not support clobbers", .{});
16437 }16437 }
16438 if (is_volatile) {16438 if (is_volatile) {
...@@ -16506,15 +16506,11 @@ fn zirAsm(...@@ -16506,15 +16506,11 @@ fn zirAsm(
16506 inputs[arg_i] = .{ .c = constraint, .n = name };16506 inputs[arg_i] = .{ .c = constraint, .n = name };
16507 }16507 }
1650816508
16509 const clobbers = try sema.arena.alloc([]const u8, clobbers_len);16509 const clobbers = if (extra.data.clobbers == .none) empty: {
16510 for (clobbers) |*name| {16510 const clobbers_ty = try sema.getBuiltinType(src, .@"assembly.Clobbers");
16511 const name_index: Zir.NullTerminatedString = @enumFromInt(sema.code.extra[extra_i]);16511 break :empty try sema.structInitEmpty(block, clobbers_ty, src, src);
16512 name.* = sema.code.nullTerminatedString(name_index);16512 } else try sema.resolveInst(extra.data.clobbers); // Already coerced by AstGen.
16513 extra_i += 1;16513 const clobbers_val = try sema.resolveConstDefinedValue(block, src, clobbers, .{ .simple = .clobber });
16514
16515 needed_capacity += name.*.len / 4 + 1;
16516 }
16517
16518 needed_capacity += (asm_source.len + 3) / 4;16514 needed_capacity += (asm_source.len + 3) / 4;
1651916515
16520 const gpa = sema.gpa;16516 const gpa = sema.gpa;
...@@ -16525,9 +16521,12 @@ fn zirAsm(...@@ -16525,9 +16521,12 @@ fn zirAsm(
16525 .ty = expr_ty,16521 .ty = expr_ty,
16526 .payload = sema.addExtraAssumeCapacity(Air.Asm{16522 .payload = sema.addExtraAssumeCapacity(Air.Asm{
16527 .source_len = @intCast(asm_source.len),16523 .source_len = @intCast(asm_source.len),
16528 .outputs_len = outputs_len,
16529 .inputs_len = @intCast(args.len),16524 .inputs_len = @intCast(args.len),
16530 .flags = (@as(u32, @intFromBool(is_volatile)) << 31) | @as(u32, @intCast(clobbers.len)),16525 .clobbers = clobbers_val.toIntern(),
16526 .flags = .{
16527 .is_volatile = is_volatile,
16528 .outputs_len = outputs_len,
16529 },
16531 }),16530 }),
16532 } },16531 } },
16533 });16532 });
...@@ -16549,12 +16548,6 @@ fn zirAsm(...@@ -16549,12 +16548,6 @@ fn zirAsm(
16549 buffer[input.c.len + 1 + input.n.len] = 0;16548 buffer[input.c.len + 1 + input.n.len] = 0;
16550 sema.air_extra.items.len += (input.c.len + input.n.len + (2 + 3)) / 4;16549 sema.air_extra.items.len += (input.c.len + input.n.len + (2 + 3)) / 4;
16551 }16550 }
16552 for (clobbers) |clobber| {
16553 const buffer = mem.sliceAsBytes(sema.air_extra.unusedCapacitySlice());
16554 @memcpy(buffer[0..clobber.len], clobber);
16555 buffer[clobber.len] = 0;
16556 sema.air_extra.items.len += clobber.len / 4 + 1;
16557 }
16558 {16551 {
16559 const buffer = mem.sliceAsBytes(sema.air_extra.unusedCapacitySlice());16552 const buffer = mem.sliceAsBytes(sema.air_extra.unusedCapacitySlice());
16560 @memcpy(buffer[0..asm_source.len], asm_source);16553 @memcpy(buffer[0..asm_source.len], asm_source);
...@@ -26197,6 +26190,7 @@ fn zirBuiltinValue(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD...@@ -26197,6 +26190,7 @@ fn zirBuiltinValue(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD
26197 .extern_options => try sema.getBuiltinType(src, .ExternOptions),26190 .extern_options => try sema.getBuiltinType(src, .ExternOptions),
26198 .type_info => try sema.getBuiltinType(src, .Type),26191 .type_info => try sema.getBuiltinType(src, .Type),
26199 .branch_hint => try sema.getBuiltinType(src, .BranchHint),26192 .branch_hint => try sema.getBuiltinType(src, .BranchHint),
26193 .clobbers => try sema.getBuiltinType(src, .@"assembly.Clobbers"),
26200 // zig fmt: on26194 // zig fmt: on
2620126195
26202 // Values are handled here.26196 // Values are handled here.
...@@ -36546,7 +36540,7 @@ fn payloadToExtraItems(data: anytype) [@typeInfo(@TypeOf(data)).@"struct".fields...@@ -36546,7 +36540,7 @@ fn payloadToExtraItems(data: anytype) [@typeInfo(@TypeOf(data)).@"struct".fields
36546 inline for (&result, fields) |*val, field| {36540 inline for (&result, fields) |*val, field| {
36547 val.* = switch (field.type) {36541 val.* = switch (field.type) {
36548 u32 => @field(data, field.name),36542 u32 => @field(data, field.name),
36549 i32, Air.CondBr.BranchHints => @bitCast(@field(data, field.name)),36543 i32, Air.CondBr.BranchHints, Air.Asm.Flags => @bitCast(@field(data, field.name)),
36550 Air.Inst.Ref, InternPool.Index => @intFromEnum(@field(data, field.name)),36544 Air.Inst.Ref, InternPool.Index => @intFromEnum(@field(data, field.name)),
36551 else => @compileError("bad field type: " ++ @typeName(field.type)),36545 else => @compileError("bad field type: " ++ @typeName(field.type)),
36552 };36546 };
src/Zcu.zig+19-7
...@@ -460,6 +460,9 @@ pub const BuiltinDecl = enum {...@@ -460,6 +460,9 @@ pub const BuiltinDecl = enum {
460460
461 VaList,461 VaList,
462462
463 assembly,
464 @"assembly.Clobbers",
465
463 /// Determines what kind of validation will be done to the decl's value.466 /// Determines what kind of validation will be done to the decl's value.
464 pub fn kind(decl: BuiltinDecl) enum { type, func, string } {467 pub fn kind(decl: BuiltinDecl) enum { type, func, string } {
465 return switch (decl) {468 return switch (decl) {
...@@ -480,6 +483,8 @@ pub const BuiltinDecl = enum {...@@ -480,6 +483,8 @@ pub const BuiltinDecl = enum {
480 .ExportOptions,483 .ExportOptions,
481 .ExternOptions,484 .ExternOptions,
482 .BranchHint,485 .BranchHint,
486 .assembly,
487 .@"assembly.Clobbers",
483 => .type,488 => .type,
484489
485 .Type,490 .Type,
...@@ -540,6 +545,7 @@ pub const BuiltinDecl = enum {...@@ -540,6 +545,7 @@ pub const BuiltinDecl = enum {
540 /// Resolution of these values is done in three distinct stages:545 /// Resolution of these values is done in three distinct stages:
541 /// * Resolution of `std.builtin.Panic` and everything under it546 /// * Resolution of `std.builtin.Panic` and everything under it
542 /// * Resolution of `VaList`547 /// * Resolution of `VaList`
548 /// * Resolution of `assembly`
543 /// * Everything else549 /// * Everything else
544 ///550 ///
545 /// Panics are separated because they are provided by the user, so must be able to use551 /// Panics are separated because they are provided by the user, so must be able to use
...@@ -548,14 +554,20 @@ pub const BuiltinDecl = enum {...@@ -548,14 +554,20 @@ pub const BuiltinDecl = enum {
548 /// `VaList` is separate because its value depends on the target, so it needs some reflection554 /// `VaList` is separate because its value depends on the target, so it needs some reflection
549 /// machinery to work; additionally, it is `@compileError` on some targets, so must be referenced555 /// machinery to work; additionally, it is `@compileError` on some targets, so must be referenced
550 /// by itself.556 /// by itself.
557 ///
558 /// `assembly` is separate because its value depends on the target.
551 pub fn stage(decl: BuiltinDecl) InternPool.MemoizedStateStage {559 pub fn stage(decl: BuiltinDecl) InternPool.MemoizedStateStage {
552 if (decl == .VaList) return .va_list;560 return switch (decl) {
553561 .VaList => .va_list,
554 if (@intFromEnum(decl) <= @intFromEnum(BuiltinDecl.@"Type.Declaration")) {562 .assembly, .@"assembly.Clobbers" => .assembly,
555 return .main;563 else => {
556 } else {564 if (@intFromEnum(decl) <= @intFromEnum(BuiltinDecl.@"Type.Declaration")) {
557 return .panic;565 return .main;
558 }566 } else {
567 return .panic;
568 }
569 },
570 };
559 }571 }
560572
561 /// Based on the tag name, determines how to access this decl; either as a direct child of the573 /// Based on the tag name, determines how to access this decl; either as a direct child of the
src/Zcu/PerThread.zig+1
...@@ -635,6 +635,7 @@ pub fn ensureMemoizedStateUpToDate(pt: Zcu.PerThread, stage: InternPool.Memoized...@@ -635,6 +635,7 @@ pub fn ensureMemoizedStateUpToDate(pt: Zcu.PerThread, stage: InternPool.Memoized
635 .main => .Type,635 .main => .Type,
636 .panic => .panic,636 .panic => .panic,
637 .va_list => .VaList,637 .va_list => .VaList,
638 .assembly => .assembly,
638 };639 };
639 if (zcu.builtin_decl_values.get(to_check) != .none) return;640 if (zcu.builtin_decl_values.get(to_check) != .none) return;
640 }641 }
src/arch/riscv64/CodeGen.zig+28-16
...@@ -6047,10 +6047,10 @@ fn airBoolOp(func: *Func, inst: Air.Inst.Index) !void {...@@ -6047,10 +6047,10 @@ fn airBoolOp(func: *Func, inst: Air.Inst.Index) !void {
6047fn airAsm(func: *Func, inst: Air.Inst.Index) !void {6047fn airAsm(func: *Func, inst: Air.Inst.Index) !void {
6048 const ty_pl = func.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;6048 const ty_pl = func.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
6049 const extra = func.air.extraData(Air.Asm, ty_pl.payload);6049 const extra = func.air.extraData(Air.Asm, ty_pl.payload);
6050 const clobbers_len: u31 = @truncate(extra.data.flags);6050 const outputs_len = extra.data.flags.outputs_len;
6051 var extra_i: usize = extra.end;6051 var extra_i: usize = extra.end;
6052 const outputs: []const Air.Inst.Ref =6052 const outputs: []const Air.Inst.Ref =
6053 @ptrCast(func.air.extra.items[extra_i..][0..extra.data.outputs_len]);6053 @ptrCast(func.air.extra.items[extra_i..][0..outputs_len]);
6054 extra_i += outputs.len;6054 extra_i += outputs.len;
6055 const inputs: []const Air.Inst.Ref = @ptrCast(func.air.extra.items[extra_i..][0..extra.data.inputs_len]);6055 const inputs: []const Air.Inst.Ref = @ptrCast(func.air.extra.items[extra_i..][0..extra.data.inputs_len]);
6056 extra_i += inputs.len;6056 extra_i += inputs.len;
...@@ -6161,21 +6161,33 @@ fn airAsm(func: *Func, inst: Air.Inst.Index) !void {...@@ -6161,21 +6161,33 @@ fn airAsm(func: *Func, inst: Air.Inst.Index) !void {
6161 args.appendAssumeCapacity(arg_mcv);6161 args.appendAssumeCapacity(arg_mcv);
6162 }6162 }
61636163
6164 {6164 const zcu = func.pt.zcu;
6165 var clobber_i: u32 = 0;6165 const ip = &zcu.intern_pool;
6166 while (clobber_i < clobbers_len) : (clobber_i += 1) {6166 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
6167 const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(func.air.extra.items[extra_i..]), 0);6167 const struct_type: Type = .fromInterned(aggregate.ty);
6168 // This equation accounts for the fact that even if we have exactly 4 bytes6168 switch (aggregate.storage) {
6169 // for the string, we still use the next u32 for the null terminator.6169 .elems => |elems| for (elems, 0..) |elem, i| {
6170 extra_i += clobber.len / 4 + 1;6170 switch (elem) {
61716171 .bool_true => {
6172 if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory")) {6172 const clobber = struct_type.structFieldName(i, zcu).toSlice(ip).?;
6173 // nothing really to do6173 assert(clobber.len != 0);
6174 } else {6174 if (std.mem.eql(u8, clobber, "memory")) {
6175 try func.register_manager.getReg(parseRegName(clobber) orelse6175 // nothing really to do
6176 return func.fail("invalid clobber: '{s}'", .{clobber}), null);6176 } else {
6177 try func.register_manager.getReg(parseRegName(clobber) orelse
6178 return func.fail("invalid clobber: '{s}'", .{clobber}), null);
6179 }
6180 },
6181 .bool_false => continue,
6182 else => unreachable,
6177 }6183 }
6178 }6184 },
6185 .repeated_elem => |elem| switch (elem) {
6186 .bool_true => @panic("TODO"),
6187 .bool_false => {},
6188 else => unreachable,
6189 },
6190 .bytes => @panic("TODO"),
6179 }6191 }
61806192
6181 const Label = struct {6193 const Label = struct {
src/arch/sparc64/CodeGen.zig+5-14
...@@ -873,10 +873,10 @@ fn airArrayToSlice(self: *Self, inst: Air.Inst.Index) !void {...@@ -873,10 +873,10 @@ fn airArrayToSlice(self: *Self, inst: Air.Inst.Index) !void {
873fn airAsm(self: *Self, inst: Air.Inst.Index) !void {873fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
874 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;874 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
875 const extra = self.air.extraData(Air.Asm, ty_pl.payload);875 const extra = self.air.extraData(Air.Asm, ty_pl.payload);
876 const is_volatile = (extra.data.flags & 0x80000000) != 0;876 const is_volatile = extra.data.flags.is_volatile;
877 const clobbers_len: u31 = @truncate(extra.data.flags);877 const outputs_len = extra.data.flags.outputs_len;
878 var extra_i: usize = extra.end;878 var extra_i: usize = extra.end;
879 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i .. extra_i + extra.data.outputs_len]);879 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i .. extra_i + outputs_len]);
880 extra_i += outputs.len;880 extra_i += outputs.len;
881 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i .. extra_i + extra.data.inputs_len]);881 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i .. extra_i + extra.data.inputs_len]);
882 extra_i += inputs.len;882 extra_i += inputs.len;
...@@ -921,17 +921,8 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {...@@ -921,17 +921,8 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
921 try self.genSetReg(self.typeOf(input), reg, arg_mcv);921 try self.genSetReg(self.typeOf(input), reg, arg_mcv);
922 }922 }
923923
924 {924 // TODO honor the clobbers
925 var clobber_i: u32 = 0;925 _ = extra.data.clobbers;
926 while (clobber_i < clobbers_len) : (clobber_i += 1) {
927 const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);
928 // This equation accounts for the fact that even if we have exactly 4 bytes
929 // for the string, we still use the next u32 for the null terminator.
930 extra_i += clobber.len / 4 + 1;
931
932 // TODO honor these
933 }
934 }
935926
936 const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];927 const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];
937928
src/arch/x86_64/CodeGen.zig+38-26
...@@ -179788,9 +179788,9 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -179788,9 +179788,9 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {
179788 const zcu = pt.zcu;179788 const zcu = pt.zcu;
179789 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;179789 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
179790 const extra = self.air.extraData(Air.Asm, ty_pl.payload);179790 const extra = self.air.extraData(Air.Asm, ty_pl.payload);
179791 const clobbers_len: u31 = @truncate(extra.data.flags);179791 const outputs_len = extra.data.flags.outputs_len;
179792 var extra_i: usize = extra.end;179792 var extra_i: usize = extra.end;
179793 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.outputs_len]);179793 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..outputs_len]);
179794 extra_i += outputs.len;179794 extra_i += outputs.len;
179795 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);179795 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
179796 extra_i += inputs.len;179796 extra_i += inputs.len;
...@@ -179981,30 +179981,42 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -179981,30 +179981,42 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {
179981 args.appendAssumeCapacity(arg_mcv);179981 args.appendAssumeCapacity(arg_mcv);
179982 }179982 }
179983179983
179984 {179984 const ip = &zcu.intern_pool;
179985 var clobber_i: u32 = 0;179985 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
179986 while (clobber_i < clobbers_len) : (clobber_i += 1) {179986 const struct_type: Type = .fromInterned(aggregate.ty);
179987 const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);179987 switch (aggregate.storage) {
179988 // This equation accounts for the fact that even if we have exactly 4 bytes179988 .elems => |elems| for (elems, 0..) |elem, i| switch (elem) {
179989 // for the string, we still use the next u32 for the null terminator.179989 .bool_true => {
179990 extra_i += clobber.len / 4 + 1;179990 const clobber = struct_type.structFieldName(i, zcu).toSlice(ip).?;
179991179991 assert(clobber.len != 0);
179992 if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory") or179992
179993 std.mem.eql(u8, clobber, "fpsr") or std.mem.eql(u8, clobber, "fpcr") or179993 if (std.mem.eql(u8, clobber, "memory") or
179994 std.mem.eql(u8, clobber, "mxcsr") or std.mem.eql(u8, clobber, "dirflag"))179994 std.mem.eql(u8, clobber, "fpsr") or
179995 {179995 std.mem.eql(u8, clobber, "fpcr") or
179996 // ok, sure179996 std.mem.eql(u8, clobber, "mxcsr") or
179997 } else if (std.mem.eql(u8, clobber, "cc") or179997 std.mem.eql(u8, clobber, "dirflag"))
179998 std.mem.eql(u8, clobber, "flags") or179998 {
179999 std.mem.eql(u8, clobber, "eflags") or179999 // ok, sure
180000 std.mem.eql(u8, clobber, "rflags"))180000 } else if (std.mem.eql(u8, clobber, "cc") or
180001 {180001 std.mem.eql(u8, clobber, "flags") or
180002 try self.spillEflagsIfOccupied();180002 std.mem.eql(u8, clobber, "eflags") or
180003 } else {180003 std.mem.eql(u8, clobber, "rflags"))
180004 try self.register_manager.getReg(parseRegName(clobber) orelse180004 {
180005 return self.fail("invalid clobber: '{s}'", .{clobber}), null);180005 try self.spillEflagsIfOccupied();
180006 }180006 } else {
180007 }180007 try self.register_manager.getReg(parseRegName(clobber) orelse
180008 return self.fail("invalid clobber: '{s}'", .{clobber}), null);
180009 }
180010 },
180011 .bool_false => continue,
180012 else => unreachable,
180013 },
180014 .repeated_elem => |elem| switch (elem) {
180015 .bool_true => @panic("TODO"),
180016 .bool_false => {},
180017 else => unreachable,
180018 },
180019 .bytes => @panic("TODO"),
180008 }180020 }
180009180021
180010 const Label = struct {180022 const Label = struct {
src/codegen/c.zig+24-19
...@@ -5545,11 +5545,11 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -5545,11 +5545,11 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
5545 const zcu = pt.zcu;5545 const zcu = pt.zcu;
5546 const ty_pl = f.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;5546 const ty_pl = f.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
5547 const extra = f.air.extraData(Air.Asm, ty_pl.payload);5547 const extra = f.air.extraData(Air.Asm, ty_pl.payload);
5548 const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;5548 const is_volatile = extra.data.flags.is_volatile;
5549 const clobbers_len: u31 = @truncate(extra.data.flags);5549 const outputs_len = extra.data.flags.outputs_len;
5550 const gpa = f.object.dg.gpa;5550 const gpa = f.object.dg.gpa;
5551 var extra_i: usize = extra.end;5551 var extra_i: usize = extra.end;
5552 const outputs: []const Air.Inst.Ref = @ptrCast(f.air.extra.items[extra_i..][0..extra.data.outputs_len]);5552 const outputs: []const Air.Inst.Ref = @ptrCast(f.air.extra.items[extra_i..][0..outputs_len]);
5553 extra_i += outputs.len;5553 extra_i += outputs.len;
5554 const inputs: []const Air.Inst.Ref = @ptrCast(f.air.extra.items[extra_i..][0..extra.data.inputs_len]);5554 const inputs: []const Air.Inst.Ref = @ptrCast(f.air.extra.items[extra_i..][0..extra.data.inputs_len]);
5555 extra_i += inputs.len;5555 extra_i += inputs.len;
...@@ -5645,12 +5645,6 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -5645,12 +5645,6 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
5645 try f.object.newline();5645 try f.object.newline();
5646 }5646 }
5647 }5647 }
5648 for (0..clobbers_len) |_| {
5649 const clobber = mem.sliceTo(mem.sliceAsBytes(f.air.extra.items[extra_i..]), 0);
5650 // This equation accounts for the fact that even if we have exactly 4 bytes
5651 // for the string, we still use the next u32 for the null terminator.
5652 extra_i += clobber.len / 4 + 1;
5653 }
56545648
5655 {5649 {
5656 const asm_source = mem.sliceAsBytes(f.air.extra.items[extra_i..])[0..extra.data.source_len];5650 const asm_source = mem.sliceAsBytes(f.air.extra.items[extra_i..])[0..extra.data.source_len];
...@@ -5757,17 +5751,28 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -5757,17 +5751,28 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
5757 try w.writeByte(')');5751 try w.writeByte(')');
5758 }5752 }
5759 try w.writeByte(':');5753 try w.writeByte(':');
5760 for (0..clobbers_len) |clobber_i| {5754 const ip = &zcu.intern_pool;
5761 const clobber = mem.sliceTo(mem.sliceAsBytes(f.air.extra.items[extra_i..]), 0);5755 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
5762 // This equation accounts for the fact that even if we have exactly 4 bytes5756 const struct_type: Type = .fromInterned(aggregate.ty);
5763 // for the string, we still use the next u32 for the null terminator.5757 switch (aggregate.storage) {
5764 extra_i += clobber.len / 4 + 1;5758 .elems => |elems| for (elems, 0..) |elem, i| switch (elem) {
57655759 .bool_true => {
5766 if (clobber.len == 0) continue;5760 const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
57675761 assert(name.len != 0);
5768 if (clobber_i > 0) try w.writeByte(',');5762 try w.print(" {f}", .{fmtStringLiteral(name, null)});
5769 try w.print(" {f}", .{fmtStringLiteral(clobber, null)});5763 (try w.writableArray(1))[0] = ',';
5764 },
5765 .bool_false => continue,
5766 else => unreachable,
5767 },
5768 .repeated_elem => |elem| switch (elem) {
5769 .bool_true => @panic("TODO"),
5770 .bool_false => {},
5771 else => unreachable,
5772 },
5773 .bytes => @panic("TODO"),
5770 }5774 }
5775 w.undo(1); // erase the last comma
5771 try w.writeAll(");");5776 try w.writeAll(");");
5772 try f.object.newline();5777 try f.object.newline();
57735778
src/codegen/llvm.zig+294-33
...@@ -7241,19 +7241,20 @@ pub const FuncGen = struct {...@@ -7241,19 +7241,20 @@ pub const FuncGen = struct {
7241 const o = self.ng.object;7241 const o = self.ng.object;
7242 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;7242 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
7243 const extra = self.air.extraData(Air.Asm, ty_pl.payload);7243 const extra = self.air.extraData(Air.Asm, ty_pl.payload);
7244 const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;7244 const is_volatile = extra.data.flags.is_volatile;
7245 const clobbers_len: u31 = @truncate(extra.data.flags);7245 const outputs_len = extra.data.flags.outputs_len;
7246 const gpa = self.gpa;
7246 var extra_i: usize = extra.end;7247 var extra_i: usize = extra.end;
72477248
7248 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.outputs_len]);7249 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..outputs_len]);
7249 extra_i += outputs.len;7250 extra_i += outputs.len;
7250 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);7251 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
7251 extra_i += inputs.len;7252 extra_i += inputs.len;
72527253
7253 var llvm_constraints: std.ArrayListUnmanaged(u8) = .empty;7254 var llvm_constraints: std.ArrayListUnmanaged(u8) = .empty;
7254 defer llvm_constraints.deinit(self.gpa);7255 defer llvm_constraints.deinit(gpa);
72557256
7256 var arena_allocator = std.heap.ArenaAllocator.init(self.gpa);7257 var arena_allocator = std.heap.ArenaAllocator.init(gpa);
7257 defer arena_allocator.deinit();7258 defer arena_allocator.deinit();
7258 const arena = arena_allocator.allocator();7259 const arena = arena_allocator.allocator();
72597260
...@@ -7276,7 +7277,7 @@ pub const FuncGen = struct {...@@ -7276,7 +7277,7 @@ pub const FuncGen = struct {
72767277
7277 var llvm_ret_i: usize = 0;7278 var llvm_ret_i: usize = 0;
7278 var llvm_param_i: usize = 0;7279 var llvm_param_i: usize = 0;
7279 var total_i: u16 = 0;7280 var total_i: usize = 0;
72807281
7281 var name_map: std.StringArrayHashMapUnmanaged(u16) = .empty;7282 var name_map: std.StringArrayHashMapUnmanaged(u16) = .empty;
7282 try name_map.ensureUnusedCapacity(arena, max_param_count);7283 try name_map.ensureUnusedCapacity(arena, max_param_count);
...@@ -7290,7 +7291,7 @@ pub const FuncGen = struct {...@@ -7290,7 +7291,7 @@ pub const FuncGen = struct {
7290 // for the string, we still use the next u32 for the null terminator.7291 // for the string, we still use the next u32 for the null terminator.
7291 extra_i += (constraint.len + name.len + (2 + 3)) / 4;7292 extra_i += (constraint.len + name.len + (2 + 3)) / 4;
72927293
7293 try llvm_constraints.ensureUnusedCapacity(self.gpa, constraint.len + 3);7294 try llvm_constraints.ensureUnusedCapacity(gpa, constraint.len + 3);
7294 if (total_i != 0) {7295 if (total_i != 0) {
7295 llvm_constraints.appendAssumeCapacity(',');7296 llvm_constraints.appendAssumeCapacity(',');
7296 }7297 }
...@@ -7358,7 +7359,7 @@ pub const FuncGen = struct {...@@ -7358,7 +7359,7 @@ pub const FuncGen = struct {
7358 if (!std.mem.eql(u8, name, "_")) {7359 if (!std.mem.eql(u8, name, "_")) {
7359 const gop = name_map.getOrPutAssumeCapacity(name);7360 const gop = name_map.getOrPutAssumeCapacity(name);
7360 if (gop.found_existing) return self.todo("duplicate asm output name '{s}'", .{name});7361 if (gop.found_existing) return self.todo("duplicate asm output name '{s}'", .{name});
7361 gop.value_ptr.* = total_i;7362 gop.value_ptr.* = @intCast(total_i);
7362 }7363 }
7363 total_i += 1;7364 total_i += 1;
7364 }7365 }
...@@ -7399,7 +7400,7 @@ pub const FuncGen = struct {...@@ -7399,7 +7400,7 @@ pub const FuncGen = struct {
7399 }7400 }
7400 }7401 }
74017402
7402 try llvm_constraints.ensureUnusedCapacity(self.gpa, constraint.len + 1);7403 try llvm_constraints.ensureUnusedCapacity(gpa, constraint.len + 1);
7403 if (total_i != 0) {7404 if (total_i != 0) {
7404 llvm_constraints.appendAssumeCapacity(',');7405 llvm_constraints.appendAssumeCapacity(',');
7405 }7406 }
...@@ -7413,7 +7414,7 @@ pub const FuncGen = struct {...@@ -7413,7 +7414,7 @@ pub const FuncGen = struct {
7413 if (!std.mem.eql(u8, name, "_")) {7414 if (!std.mem.eql(u8, name, "_")) {
7414 const gop = name_map.getOrPutAssumeCapacity(name);7415 const gop = name_map.getOrPutAssumeCapacity(name);
7415 if (gop.found_existing) return self.todo("duplicate asm input name '{s}'", .{name});7416 if (gop.found_existing) return self.todo("duplicate asm input name '{s}'", .{name});
7416 gop.value_ptr.* = total_i;7417 gop.value_ptr.* = @intCast(total_i);
7417 }7418 }
74187419
7419 // In the case of indirect inputs, LLVM requires the callsite to have7420 // In the case of indirect inputs, LLVM requires the callsite to have
...@@ -7456,7 +7457,7 @@ pub const FuncGen = struct {...@@ -7456,7 +7457,7 @@ pub const FuncGen = struct {
7456 llvm_param_types[llvm_param_i] = llvm_elem_ty;7457 llvm_param_types[llvm_param_i] = llvm_elem_ty;
7457 }7458 }
74587459
7459 try llvm_constraints.print(self.gpa, ",{d}", .{output_index});7460 try llvm_constraints.print(gpa, ",{d}", .{output_index});
74607461
7461 // In the case of indirect inputs, LLVM requires the callsite to have7462 // In the case of indirect inputs, LLVM requires the callsite to have
7462 // an elementtype(<ty>) attribute.7463 // an elementtype(<ty>) attribute.
...@@ -7466,24 +7467,30 @@ pub const FuncGen = struct {...@@ -7466,24 +7467,30 @@ pub const FuncGen = struct {
7466 total_i += 1;7467 total_i += 1;
7467 }7468 }
74687469
7469 {7470 const ip = &zcu.intern_pool;
7470 var clobber_i: u32 = 0;7471 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
7471 while (clobber_i < clobbers_len) : (clobber_i += 1) {7472 const struct_type: Type = .fromInterned(aggregate.ty);
7472 const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);7473 if (total_i != 0) try llvm_constraints.append(gpa, ',');
7473 // This equation accounts for the fact that even if we have exactly 4 bytes7474 switch (aggregate.storage) {
7474 // for the string, we still use the next u32 for the null terminator.7475 .elems => |elems| for (elems, 0..) |elem, i| {
7475 extra_i += clobber.len / 4 + 1;7476 switch (elem) {
74767477 .bool_true => {
7477 try llvm_constraints.ensureUnusedCapacity(self.gpa, clobber.len + 4);7478 const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
7478 if (total_i != 0) {7479 total_i += try appendConstraints(gpa, &llvm_constraints, name, target);
7479 llvm_constraints.appendAssumeCapacity(',');7480 },
7481 .bool_false => continue,
7482 else => unreachable,
7480 }7483 }
7481 llvm_constraints.appendSliceAssumeCapacity("~{");7484 },
7482 llvm_constraints.appendSliceAssumeCapacity(clobber);7485 .repeated_elem => |elem| switch (elem) {
7483 llvm_constraints.appendSliceAssumeCapacity("}");7486 .bool_true => for (0..struct_type.structFieldCount(zcu)) |i| {
74847487 const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
7485 total_i += 1;7488 total_i += try appendConstraints(gpa, &llvm_constraints, name, target);
7486 }7489 },
7490 .bool_false => {},
7491 else => unreachable,
7492 },
7493 .bytes => @panic("TODO"),
7487 }7494 }
74887495
7489 // We have finished scanning through all inputs/outputs, so the number of7496 // We have finished scanning through all inputs/outputs, so the number of
...@@ -7497,22 +7504,22 @@ pub const FuncGen = struct {...@@ -7497,22 +7504,22 @@ pub const FuncGen = struct {
7497 // to be buggy and regress often.7504 // to be buggy and regress often.
7498 switch (target.cpu.arch) {7505 switch (target.cpu.arch) {
7499 .x86_64, .x86 => {7506 .x86_64, .x86 => {
7500 if (total_i != 0) try llvm_constraints.append(self.gpa, ',');7507 try llvm_constraints.appendSlice(gpa, "~{dirflag},~{fpsr},~{flags},");
7501 try llvm_constraints.appendSlice(self.gpa, "~{dirflag},~{fpsr},~{flags}");
7502 total_i += 3;7508 total_i += 3;
7503 },7509 },
7504 .mips, .mipsel, .mips64, .mips64el => {7510 .mips, .mipsel, .mips64, .mips64el => {
7505 if (total_i != 0) try llvm_constraints.append(self.gpa, ',');7511 try llvm_constraints.appendSlice(gpa, "~{$1},");
7506 try llvm_constraints.appendSlice(self.gpa, "~{$1}");
7507 total_i += 1;7512 total_i += 1;
7508 },7513 },
7509 else => {},7514 else => {},
7510 }7515 }
75117516
7517 if (std.mem.endsWith(u8, llvm_constraints.items, ",")) llvm_constraints.items.len -= 1;
7518
7512 const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];7519 const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];
75137520
7514 // hackety hacks until stage2 has proper inline asm in the frontend.7521 // hackety hacks until stage2 has proper inline asm in the frontend.
7515 var rendered_template = std.ArrayList(u8).init(self.gpa);7522 var rendered_template = std.ArrayList(u8).init(gpa);
7516 defer rendered_template.deinit();7523 defer rendered_template.deinit();
75177524
7518 const State = enum { start, percent, input, modifier };7525 const State = enum { start, percent, input, modifier };
...@@ -13188,3 +13195,257 @@ fn maxIntConst(b: *Builder, max_ty: Type, as_ty: Builder.Type, zcu: *const Zcu)...@@ -13188,3 +13195,257 @@ fn maxIntConst(b: *Builder, max_ty: Type, as_ty: Builder.Type, zcu: *const Zcu)
13188 try res.setTwosCompIntLimit(.max, info.signedness, info.bits);13195 try res.setTwosCompIntLimit(.max, info.signedness, info.bits);
13189 return b.bigIntConst(as_ty, res.toConst());13196 return b.bigIntConst(as_ty, res.toConst());
13190}13197}
13198
13199/// Appends zero or more LLVM constraints to `llvm_constraints`, returning how many were added.
13200fn appendConstraints(
13201 gpa: Allocator,
13202 llvm_constraints: *std.ArrayListUnmanaged(u8),
13203 zig_name: []const u8,
13204 target: *const std.Target,
13205) error{OutOfMemory}!usize {
13206 switch (target.cpu.arch) {
13207 .mips, .mipsel, .mips64, .mips64el => if (mips_clobber_overrides.get(zig_name)) |llvm_tag| {
13208 const llvm_name = @tagName(llvm_tag);
13209 try llvm_constraints.ensureUnusedCapacity(gpa, llvm_name.len + 4);
13210 llvm_constraints.appendSliceAssumeCapacity("~{");
13211 llvm_constraints.appendSliceAssumeCapacity(llvm_name);
13212 llvm_constraints.appendSliceAssumeCapacity("},");
13213 return 1;
13214 },
13215 else => {},
13216 }
13217
13218 try llvm_constraints.ensureUnusedCapacity(gpa, zig_name.len + 4);
13219 llvm_constraints.appendSliceAssumeCapacity("~{");
13220 llvm_constraints.appendSliceAssumeCapacity(zig_name);
13221 llvm_constraints.appendSliceAssumeCapacity("},");
13222 return 1;
13223}
13224
13225const mips_clobber_overrides = std.StaticStringMap(enum {
13226 @"$msair",
13227 @"$msacsr",
13228 @"$msaaccess",
13229 @"$msasave",
13230 @"$msamodify",
13231 @"$msarequest",
13232 @"$msamap",
13233 @"$msaunmap",
13234 @"$f0",
13235 @"$f1",
13236 @"$f2",
13237 @"$f3",
13238 @"$f4",
13239 @"$f5",
13240 @"$f6",
13241 @"$f7",
13242 @"$f8",
13243 @"$f9",
13244 @"$f10",
13245 @"$f11",
13246 @"$f12",
13247 @"$f13",
13248 @"$f14",
13249 @"$f15",
13250 @"$f16",
13251 @"$f17",
13252 @"$f18",
13253 @"$f19",
13254 @"$f20",
13255 @"$f21",
13256 @"$f22",
13257 @"$f23",
13258 @"$f24",
13259 @"$f25",
13260 @"$f26",
13261 @"$f27",
13262 @"$f28",
13263 @"$f29",
13264 @"$f30",
13265 @"$f31",
13266 @"$fcc0",
13267 @"$fcc1",
13268 @"$fcc2",
13269 @"$fcc3",
13270 @"$fcc4",
13271 @"$fcc5",
13272 @"$fcc6",
13273 @"$fcc7",
13274 @"$w0",
13275 @"$w1",
13276 @"$w2",
13277 @"$w3",
13278 @"$w4",
13279 @"$w5",
13280 @"$w6",
13281 @"$w7",
13282 @"$w8",
13283 @"$w9",
13284 @"$w10",
13285 @"$w11",
13286 @"$w12",
13287 @"$w13",
13288 @"$w14",
13289 @"$w15",
13290 @"$w16",
13291 @"$w17",
13292 @"$w18",
13293 @"$w19",
13294 @"$w20",
13295 @"$w21",
13296 @"$w22",
13297 @"$w23",
13298 @"$w24",
13299 @"$w25",
13300 @"$w26",
13301 @"$w27",
13302 @"$w28",
13303 @"$w29",
13304 @"$w30",
13305 @"$w31",
13306 @"$0",
13307 @"$1",
13308 @"$2",
13309 @"$3",
13310 @"$4",
13311 @"$5",
13312 @"$6",
13313 @"$7",
13314 @"$8",
13315 @"$9",
13316 @"$10",
13317 @"$11",
13318 @"$12",
13319 @"$13",
13320 @"$14",
13321 @"$15",
13322 @"$16",
13323 @"$17",
13324 @"$18",
13325 @"$19",
13326 @"$20",
13327 @"$21",
13328 @"$22",
13329 @"$23",
13330 @"$24",
13331 @"$25",
13332 @"$26",
13333 @"$27",
13334 @"$28",
13335 @"$29",
13336 @"$30",
13337 @"$31",
13338}).initComptime(.{
13339 .{ "msa_ir", .@"$msair" },
13340 .{ "msa_csr", .@"$msacsr" },
13341 .{ "msa_access", .@"$msaaccess" },
13342 .{ "msa_save", .@"$msasave" },
13343 .{ "msa_modify", .@"$msamodify" },
13344 .{ "msa_request", .@"$msarequest" },
13345 .{ "msa_map", .@"$msamap" },
13346 .{ "msa_unmap", .@"$msaunmap" },
13347 .{ "f0", .@"$f0" },
13348 .{ "f1", .@"$f1" },
13349 .{ "f2", .@"$f2" },
13350 .{ "f3", .@"$f3" },
13351 .{ "f4", .@"$f4" },
13352 .{ "f5", .@"$f5" },
13353 .{ "f6", .@"$f6" },
13354 .{ "f7", .@"$f7" },
13355 .{ "f8", .@"$f8" },
13356 .{ "f9", .@"$f9" },
13357 .{ "f10", .@"$f10" },
13358 .{ "f11", .@"$f11" },
13359 .{ "f12", .@"$f12" },
13360 .{ "f13", .@"$f13" },
13361 .{ "f14", .@"$f14" },
13362 .{ "f15", .@"$f15" },
13363 .{ "f16", .@"$f16" },
13364 .{ "f17", .@"$f17" },
13365 .{ "f18", .@"$f18" },
13366 .{ "f19", .@"$f19" },
13367 .{ "f20", .@"$f20" },
13368 .{ "f21", .@"$f21" },
13369 .{ "f22", .@"$f22" },
13370 .{ "f23", .@"$f23" },
13371 .{ "f24", .@"$f24" },
13372 .{ "f25", .@"$f25" },
13373 .{ "f26", .@"$f26" },
13374 .{ "f27", .@"$f27" },
13375 .{ "f28", .@"$f28" },
13376 .{ "f29", .@"$f29" },
13377 .{ "f30", .@"$f30" },
13378 .{ "f31", .@"$f31" },
13379 .{ "fcc0", .@"$fcc0" },
13380 .{ "fcc1", .@"$fcc1" },
13381 .{ "fcc2", .@"$fcc2" },
13382 .{ "fcc3", .@"$fcc3" },
13383 .{ "fcc4", .@"$fcc4" },
13384 .{ "fcc5", .@"$fcc5" },
13385 .{ "fcc6", .@"$fcc6" },
13386 .{ "fcc7", .@"$fcc7" },
13387 .{ "w0", .@"$w0" },
13388 .{ "w1", .@"$w1" },
13389 .{ "w2", .@"$w2" },
13390 .{ "w3", .@"$w3" },
13391 .{ "w4", .@"$w4" },
13392 .{ "w5", .@"$w5" },
13393 .{ "w6", .@"$w6" },
13394 .{ "w7", .@"$w7" },
13395 .{ "w8", .@"$w8" },
13396 .{ "w9", .@"$w9" },
13397 .{ "w10", .@"$w10" },
13398 .{ "w11", .@"$w11" },
13399 .{ "w12", .@"$w12" },
13400 .{ "w13", .@"$w13" },
13401 .{ "w14", .@"$w14" },
13402 .{ "w15", .@"$w15" },
13403 .{ "w16", .@"$w16" },
13404 .{ "w17", .@"$w17" },
13405 .{ "w18", .@"$w18" },
13406 .{ "w19", .@"$w19" },
13407 .{ "w20", .@"$w20" },
13408 .{ "w21", .@"$w21" },
13409 .{ "w22", .@"$w22" },
13410 .{ "w23", .@"$w23" },
13411 .{ "w24", .@"$w24" },
13412 .{ "w25", .@"$w25" },
13413 .{ "w26", .@"$w26" },
13414 .{ "w27", .@"$w27" },
13415 .{ "w28", .@"$w28" },
13416 .{ "w29", .@"$w29" },
13417 .{ "w30", .@"$w30" },
13418 .{ "w31", .@"$w31" },
13419 .{ "r0", .@"$0" },
13420 .{ "r1", .@"$1" },
13421 .{ "r2", .@"$2" },
13422 .{ "r3", .@"$3" },
13423 .{ "r4", .@"$4" },
13424 .{ "r5", .@"$5" },
13425 .{ "r6", .@"$6" },
13426 .{ "r7", .@"$7" },
13427 .{ "r8", .@"$8" },
13428 .{ "r9", .@"$9" },
13429 .{ "r10", .@"$10" },
13430 .{ "r11", .@"$11" },
13431 .{ "r12", .@"$12" },
13432 .{ "r13", .@"$13" },
13433 .{ "r14", .@"$14" },
13434 .{ "r15", .@"$15" },
13435 .{ "r16", .@"$16" },
13436 .{ "r17", .@"$17" },
13437 .{ "r18", .@"$18" },
13438 .{ "r19", .@"$19" },
13439 .{ "r20", .@"$20" },
13440 .{ "r21", .@"$21" },
13441 .{ "r22", .@"$22" },
13442 .{ "r23", .@"$23" },
13443 .{ "r24", .@"$24" },
13444 .{ "r25", .@"$25" },
13445 .{ "r26", .@"$26" },
13446 .{ "r27", .@"$27" },
13447 .{ "r28", .@"$28" },
13448 .{ "r29", .@"$29" },
13449 .{ "r30", .@"$30" },
13450 .{ "r31", .@"$31" },
13451});
src/codegen/spirv.zig+6-12
...@@ -6387,13 +6387,13 @@ const NavGen = struct {...@@ -6387,13 +6387,13 @@ const NavGen = struct {
6387 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;6387 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
6388 const extra = self.air.extraData(Air.Asm, ty_pl.payload);6388 const extra = self.air.extraData(Air.Asm, ty_pl.payload);
63896389
6390 const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;6390 const is_volatile = extra.data.flags.is_volatile;
6391 const clobbers_len: u31 = @truncate(extra.data.flags);6391 const outputs_len = extra.data.flags.outputs_len;
63926392
6393 if (!is_volatile and self.liveness.isUnused(inst)) return null;6393 if (!is_volatile and self.liveness.isUnused(inst)) return null;
63946394
6395 var extra_i: usize = extra.end;6395 var extra_i: usize = extra.end;
6396 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.outputs_len]);6396 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..outputs_len]);
6397 extra_i += outputs.len;6397 extra_i += outputs.len;
6398 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);6398 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
6399 extra_i += inputs.len;6399 extra_i += inputs.len;
...@@ -6402,7 +6402,7 @@ const NavGen = struct {...@@ -6402,7 +6402,7 @@ const NavGen = struct {
6402 return self.todo("implement inline asm with more than 1 output", .{});6402 return self.todo("implement inline asm with more than 1 output", .{});
6403 }6403 }
64046404
6405 var as = SpvAssembler{6405 var as: SpvAssembler = .{
6406 .gpa = self.gpa,6406 .gpa = self.gpa,
6407 .spv = self.spv,6407 .spv = self.spv,
6408 .func = &self.func,6408 .func = &self.func,
...@@ -6486,14 +6486,8 @@ const NavGen = struct {...@@ -6486,14 +6486,8 @@ const NavGen = struct {
6486 }6486 }
6487 }6487 }
64886488
6489 {6489 // TODO: do something with clobbers
6490 var clobber_i: u32 = 0;6490 _ = extra.data.clobbers;
6491 while (clobber_i < clobbers_len) : (clobber_i += 1) {
6492 const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);
6493 extra_i += clobber.len / 4 + 1;
6494 // TODO: Record clobber and use it somewhere.
6495 }
6496 }
64976491
6498 const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];6492 const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];
64996493
stage1/zig1.wasm
Binary files a/stage1/zig1.wasm and b/stage1/zig1.wasm differ
test/behavior/asm.zig+3-15
...@@ -55,13 +55,11 @@ test "output constraint modifiers" {...@@ -55,13 +55,11 @@ test "output constraint modifiers" {
55 asm volatile (""55 asm volatile (""
56 : [_] "=m,r" (a),56 : [_] "=m,r" (a),
57 :57 :
58 : ""58 : .{});
59 );
60 asm volatile (""59 asm volatile (""
61 : [_] "=r,m" (a),60 : [_] "=r,m" (a),
62 :61 :
63 : ""62 : .{});
64 );
65}63}
6664
67test "alternative constraints" {65test "alternative constraints" {
...@@ -79,7 +77,6 @@ test "alternative constraints" {...@@ -79,7 +77,6 @@ test "alternative constraints" {
79 asm volatile (""77 asm volatile (""
80 : [_] "=r,m" (a),78 : [_] "=r,m" (a),
81 : [_] "r,m" (a),79 : [_] "r,m" (a),
82 : ""
83 );80 );
84}81}
8582
...@@ -96,42 +93,34 @@ test "sized integer/float in asm input" {...@@ -96,42 +93,34 @@ test "sized integer/float in asm input" {
96 asm volatile (""93 asm volatile (""
97 :94 :
98 : [_] "m" (@as(usize, 3)),95 : [_] "m" (@as(usize, 3)),
99 : ""
100 );96 );
101 asm volatile (""97 asm volatile (""
102 :98 :
103 : [_] "m" (@as(i15, -3)),99 : [_] "m" (@as(i15, -3)),
104 : ""
105 );100 );
106 asm volatile (""101 asm volatile (""
107 :102 :
108 : [_] "m" (@as(u3, 3)),103 : [_] "m" (@as(u3, 3)),
109 : ""
110 );104 );
111 asm volatile (""105 asm volatile (""
112 :106 :
113 : [_] "m" (@as(i3, 3)),107 : [_] "m" (@as(i3, 3)),
114 : ""
115 );108 );
116 asm volatile (""109 asm volatile (""
117 :110 :
118 : [_] "m" (@as(u121, 3)),111 : [_] "m" (@as(u121, 3)),
119 : ""
120 );112 );
121 asm volatile (""113 asm volatile (""
122 :114 :
123 : [_] "m" (@as(i121, 3)),115 : [_] "m" (@as(i121, 3)),
124 : ""
125 );116 );
126 asm volatile (""117 asm volatile (""
127 :118 :
128 : [_] "m" (@as(f32, 3.17)),119 : [_] "m" (@as(f32, 3.17)),
129 : ""
130 );120 );
131 asm volatile (""121 asm volatile (""
132 :122 :
133 : [_] "m" (@as(f64, 3.17)),123 : [_] "m" (@as(f64, 3.17)),
134 : ""
135 );124 );
136}125}
137126
...@@ -172,8 +161,7 @@ test "rw constraint (x86_64)" {...@@ -172,8 +161,7 @@ test "rw constraint (x86_64)" {
172 asm ("addl %[b], %[a]"161 asm ("addl %[b], %[a]"
173 : [a] "+r" (res),162 : [a] "+r" (res),
174 : [b] "r" (@as(i32, 13)),163 : [b] "r" (@as(i32, 13)),
175 : "flags"164 : .{ .flags = true });
176 );
177 try expectEqual(@as(i32, 18), res);165 try expectEqual(@as(i32, 18), res);
178}166}
179167
test/cases/llvm/f_segment_address_space_reading_and_writing.zig+2-2
...@@ -9,7 +9,7 @@ fn setFs(value: c_ulong) void {...@@ -9,7 +9,7 @@ fn setFs(value: c_ulong) void {
9 : [number] "{rax}" (158),9 : [number] "{rax}" (158),
10 [code] "{rdi}" (0x1002),10 [code] "{rdi}" (0x1002),
11 [val] "{rsi}" (value),11 [val] "{rsi}" (value),
12 : "rcx", "r11", "memory"12 : .{ .rcx = true, .r11 = true, .memory = true }
13 );13 );
14}14}
1515
...@@ -21,7 +21,7 @@ fn getFs() c_ulong {...@@ -21,7 +21,7 @@ fn getFs() c_ulong {
21 : [number] "{rax}" (158),21 : [number] "{rax}" (158),
22 [code] "{rdi}" (0x1003),22 [code] "{rdi}" (0x1003),
23 [ptr] "{rsi}" (@intFromPtr(&result)),23 [ptr] "{rsi}" (@intFromPtr(&result)),
24 : "rcx", "r11", "memory"24 : .{ .rcx = true, .r11 = true, .memory = true }
25 );25 );
26 return result;26 return result;
27}27}
test/standalone/stack_iterator/unwind.zig+4-4
...@@ -31,7 +31,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {...@@ -31,7 +31,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
31 \\movl $7, %%edi31 \\movl $7, %%edi
32 \\movl $6, %%esi32 \\movl $6, %%esi
33 \\movl $5, %%ebp33 \\movl $5, %%ebp
34 ::: "ebx", "ecx", "edx", "edi", "esi", "ebp");34 ::: .{ .ebx = true, .ecx = true, .edx = true, .edi = true, .esi = true, .ebp = true });
35 } else {35 } else {
36 asm volatile (36 asm volatile (
37 \\movl $3, %%ebx37 \\movl $3, %%ebx
...@@ -39,7 +39,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {...@@ -39,7 +39,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
39 \\movl $2, %%edx39 \\movl $2, %%edx
40 \\movl $7, %%edi40 \\movl $7, %%edi
41 \\movl $6, %%esi41 \\movl $6, %%esi
42 ::: "ebx", "ecx", "edx", "edi", "esi");42 ::: .{ .ebx = true, .ecx = true, .edx = true, .edi = true, .esi = true });
43 }43 }
44 },44 },
45 .x86_64 => {45 .x86_64 => {
...@@ -51,7 +51,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {...@@ -51,7 +51,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
51 \\movq $14, %%r1451 \\movq $14, %%r14
52 \\movq $15, %%r1552 \\movq $15, %%r15
53 \\movq $6, %%rbp53 \\movq $6, %%rbp
54 ::: "rbx", "r12", "r13", "r14", "r15", "rbp");54 ::: .{ .rbx = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .rbp = true });
55 } else {55 } else {
56 asm volatile (56 asm volatile (
57 \\movq $3, %%rbx57 \\movq $3, %%rbx
...@@ -59,7 +59,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {...@@ -59,7 +59,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
59 \\movq $13, %%r1359 \\movq $13, %%r13
60 \\movq $14, %%r1460 \\movq $14, %%r14
61 \\movq $15, %%r1561 \\movq $15, %%r15
62 ::: "rbx", "r12", "r13", "r14", "r15");62 ::: .{ .rbx = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true });
63 }63 }
64 },64 },
65 else => {},65 else => {},
test/standalone/stack_iterator/unwind_freestanding.zig+1-2
...@@ -58,8 +58,7 @@ export fn _start() callconv(.c) noreturn {...@@ -58,8 +58,7 @@ export fn _start() callconv(.c) noreturn {
58 \\syscall58 \\syscall
59 :59 :
60 : [missed] "{edi}" (missed),60 : [missed] "{edi}" (missed),
61 : "edi", "eax"61 : .{ .edi = true, .eax = true });
62 );
6362
64 while (true) {} // unreached63 while (true) {} // unreached
65}64}