authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-16 18:19:56-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-16 18:19:56-07:00
log51ebebcea36bcc960e8f0f7ef17d795eb46ce1ce
tree0510fcd3f84ef6ff13032c7be07cb69dd5da5001
parent32ff9d802b6337bc10765d879cfd52e6b78ea532
parent680358767e30ac386e6727ffc9295820c598d6b9

Merge remote-tracking branch 'origin/master' into wrangle-writer-buffering


79 files changed, 3541 insertions(+), 995 deletions(-)

doc/langref/Assembly Syntax Explained.zig +1-2
......@@ -53,8 +53,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {
5353 // memory locations - not only the memory pointed to by a declared indirect
5454 // output. In this example we list $rcx and $r11 because it is known the
5555 // kernel syscall does not preserve these registers.
56 : "rcx", "r11"
57 );
56 : .{ .rcx = true, .r11 = true });
5857}
5958
6059// syntax
doc/langref/inline_assembly.zig+2-4
......@@ -15,8 +15,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {
1515 : [ret] "={rax}" (-> usize),
1616 : [number] "{rax}" (number),
1717 [arg1] "{rdi}" (arg1),
18 : "rcx", "r11"
19 );
18 : .{ .rcx = true, .r11 = true });
2019}
2120
2221pub 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 {
2625 [arg1] "{rdi}" (arg1),
2726 [arg2] "{rsi}" (arg2),
2827 [arg3] "{rdx}" (arg3),
29 : "rcx", "r11"
30 );
28 : .{ .rcx = true, .r11 = true });
3129}
3230
3331// exe=succeed
lib/compiler_rt/aarch64_outline_atomics.zig+100-200
......@@ -28,8 +28,7 @@ fn __aarch64_cas1_relax() align(16) callconv(.naked) void {
2828 \\ ret
2929 :
3030 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
31 : "w15", "w16", "w17", "memory"
32 );
31 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
3332 unreachable;
3433}
3534fn __aarch64_swp1_relax() align(16) callconv(.naked) void {
......@@ -48,8 +47,7 @@ fn __aarch64_swp1_relax() align(16) callconv(.naked) void {
4847 \\ ret
4948 :
5049 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
51 : "w15", "w16", "w17", "memory"
52 );
50 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
5351 unreachable;
5452}
5553fn __aarch64_ldadd1_relax() align(16) callconv(.naked) void {
......@@ -69,8 +67,7 @@ fn __aarch64_ldadd1_relax() align(16) callconv(.naked) void {
6967 \\ ret
7068 :
7169 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
72 : "w15", "w16", "w17", "memory"
73 );
70 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
7471 unreachable;
7572}
7673fn __aarch64_ldclr1_relax() align(16) callconv(.naked) void {
......@@ -90,8 +87,7 @@ fn __aarch64_ldclr1_relax() align(16) callconv(.naked) void {
9087 \\ ret
9188 :
9289 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
93 : "w15", "w16", "w17", "memory"
94 );
90 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
9591 unreachable;
9692}
9793fn __aarch64_ldeor1_relax() align(16) callconv(.naked) void {
......@@ -111,8 +107,7 @@ fn __aarch64_ldeor1_relax() align(16) callconv(.naked) void {
111107 \\ ret
112108 :
113109 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
114 : "w15", "w16", "w17", "memory"
115 );
110 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
116111 unreachable;
117112}
118113fn __aarch64_ldset1_relax() align(16) callconv(.naked) void {
......@@ -132,8 +127,7 @@ fn __aarch64_ldset1_relax() align(16) callconv(.naked) void {
132127 \\ ret
133128 :
134129 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
135 : "w15", "w16", "w17", "memory"
136 );
130 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
137131 unreachable;
138132}
139133fn __aarch64_cas1_acq() align(16) callconv(.naked) void {
......@@ -154,8 +148,7 @@ fn __aarch64_cas1_acq() align(16) callconv(.naked) void {
154148 \\ ret
155149 :
156150 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
157 : "w15", "w16", "w17", "memory"
158 );
151 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
159152 unreachable;
160153}
161154fn __aarch64_swp1_acq() align(16) callconv(.naked) void {
......@@ -174,8 +167,7 @@ fn __aarch64_swp1_acq() align(16) callconv(.naked) void {
174167 \\ ret
175168 :
176169 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
177 : "w15", "w16", "w17", "memory"
178 );
170 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
179171 unreachable;
180172}
181173fn __aarch64_ldadd1_acq() align(16) callconv(.naked) void {
......@@ -195,8 +187,7 @@ fn __aarch64_ldadd1_acq() align(16) callconv(.naked) void {
195187 \\ ret
196188 :
197189 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
198 : "w15", "w16", "w17", "memory"
199 );
190 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
200191 unreachable;
201192}
202193fn __aarch64_ldclr1_acq() align(16) callconv(.naked) void {
......@@ -216,8 +207,7 @@ fn __aarch64_ldclr1_acq() align(16) callconv(.naked) void {
216207 \\ ret
217208 :
218209 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
219 : "w15", "w16", "w17", "memory"
220 );
210 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
221211 unreachable;
222212}
223213fn __aarch64_ldeor1_acq() align(16) callconv(.naked) void {
......@@ -237,8 +227,7 @@ fn __aarch64_ldeor1_acq() align(16) callconv(.naked) void {
237227 \\ ret
238228 :
239229 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
240 : "w15", "w16", "w17", "memory"
241 );
230 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
242231 unreachable;
243232}
244233fn __aarch64_ldset1_acq() align(16) callconv(.naked) void {
......@@ -258,8 +247,7 @@ fn __aarch64_ldset1_acq() align(16) callconv(.naked) void {
258247 \\ ret
259248 :
260249 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
261 : "w15", "w16", "w17", "memory"
262 );
250 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
263251 unreachable;
264252}
265253fn __aarch64_cas1_rel() align(16) callconv(.naked) void {
......@@ -280,8 +268,7 @@ fn __aarch64_cas1_rel() align(16) callconv(.naked) void {
280268 \\ ret
281269 :
282270 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
283 : "w15", "w16", "w17", "memory"
284 );
271 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
285272 unreachable;
286273}
287274fn __aarch64_swp1_rel() align(16) callconv(.naked) void {
......@@ -300,8 +287,7 @@ fn __aarch64_swp1_rel() align(16) callconv(.naked) void {
300287 \\ ret
301288 :
302289 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
303 : "w15", "w16", "w17", "memory"
304 );
290 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
305291 unreachable;
306292}
307293fn __aarch64_ldadd1_rel() align(16) callconv(.naked) void {
......@@ -321,8 +307,7 @@ fn __aarch64_ldadd1_rel() align(16) callconv(.naked) void {
321307 \\ ret
322308 :
323309 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
324 : "w15", "w16", "w17", "memory"
325 );
310 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
326311 unreachable;
327312}
328313fn __aarch64_ldclr1_rel() align(16) callconv(.naked) void {
......@@ -342,8 +327,7 @@ fn __aarch64_ldclr1_rel() align(16) callconv(.naked) void {
342327 \\ ret
343328 :
344329 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
345 : "w15", "w16", "w17", "memory"
346 );
330 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
347331 unreachable;
348332}
349333fn __aarch64_ldeor1_rel() align(16) callconv(.naked) void {
......@@ -363,8 +347,7 @@ fn __aarch64_ldeor1_rel() align(16) callconv(.naked) void {
363347 \\ ret
364348 :
365349 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
366 : "w15", "w16", "w17", "memory"
367 );
350 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
368351 unreachable;
369352}
370353fn __aarch64_ldset1_rel() align(16) callconv(.naked) void {
......@@ -384,8 +367,7 @@ fn __aarch64_ldset1_rel() align(16) callconv(.naked) void {
384367 \\ ret
385368 :
386369 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
387 : "w15", "w16", "w17", "memory"
388 );
370 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
389371 unreachable;
390372}
391373fn __aarch64_cas1_acq_rel() align(16) callconv(.naked) void {
......@@ -406,8 +388,7 @@ fn __aarch64_cas1_acq_rel() align(16) callconv(.naked) void {
406388 \\ ret
407389 :
408390 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
409 : "w15", "w16", "w17", "memory"
410 );
391 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
411392 unreachable;
412393}
413394fn __aarch64_swp1_acq_rel() align(16) callconv(.naked) void {
......@@ -426,8 +407,7 @@ fn __aarch64_swp1_acq_rel() align(16) callconv(.naked) void {
426407 \\ ret
427408 :
428409 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
429 : "w15", "w16", "w17", "memory"
430 );
410 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
431411 unreachable;
432412}
433413fn __aarch64_ldadd1_acq_rel() align(16) callconv(.naked) void {
......@@ -447,8 +427,7 @@ fn __aarch64_ldadd1_acq_rel() align(16) callconv(.naked) void {
447427 \\ ret
448428 :
449429 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
450 : "w15", "w16", "w17", "memory"
451 );
430 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
452431 unreachable;
453432}
454433fn __aarch64_ldclr1_acq_rel() align(16) callconv(.naked) void {
......@@ -468,8 +447,7 @@ fn __aarch64_ldclr1_acq_rel() align(16) callconv(.naked) void {
468447 \\ ret
469448 :
470449 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
471 : "w15", "w16", "w17", "memory"
472 );
450 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
473451 unreachable;
474452}
475453fn __aarch64_ldeor1_acq_rel() align(16) callconv(.naked) void {
......@@ -489,8 +467,7 @@ fn __aarch64_ldeor1_acq_rel() align(16) callconv(.naked) void {
489467 \\ ret
490468 :
491469 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
492 : "w15", "w16", "w17", "memory"
493 );
470 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
494471 unreachable;
495472}
496473fn __aarch64_ldset1_acq_rel() align(16) callconv(.naked) void {
......@@ -510,8 +487,7 @@ fn __aarch64_ldset1_acq_rel() align(16) callconv(.naked) void {
510487 \\ ret
511488 :
512489 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
513 : "w15", "w16", "w17", "memory"
514 );
490 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
515491 unreachable;
516492}
517493fn __aarch64_cas2_relax() align(16) callconv(.naked) void {
......@@ -532,8 +508,7 @@ fn __aarch64_cas2_relax() align(16) callconv(.naked) void {
532508 \\ ret
533509 :
534510 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
535 : "w15", "w16", "w17", "memory"
536 );
511 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
537512 unreachable;
538513}
539514fn __aarch64_swp2_relax() align(16) callconv(.naked) void {
......@@ -552,8 +527,7 @@ fn __aarch64_swp2_relax() align(16) callconv(.naked) void {
552527 \\ ret
553528 :
554529 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
555 : "w15", "w16", "w17", "memory"
556 );
530 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
557531 unreachable;
558532}
559533fn __aarch64_ldadd2_relax() align(16) callconv(.naked) void {
......@@ -573,8 +547,7 @@ fn __aarch64_ldadd2_relax() align(16) callconv(.naked) void {
573547 \\ ret
574548 :
575549 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
576 : "w15", "w16", "w17", "memory"
577 );
550 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
578551 unreachable;
579552}
580553fn __aarch64_ldclr2_relax() align(16) callconv(.naked) void {
......@@ -594,8 +567,7 @@ fn __aarch64_ldclr2_relax() align(16) callconv(.naked) void {
594567 \\ ret
595568 :
596569 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
597 : "w15", "w16", "w17", "memory"
598 );
570 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
599571 unreachable;
600572}
601573fn __aarch64_ldeor2_relax() align(16) callconv(.naked) void {
......@@ -615,8 +587,7 @@ fn __aarch64_ldeor2_relax() align(16) callconv(.naked) void {
615587 \\ ret
616588 :
617589 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
618 : "w15", "w16", "w17", "memory"
619 );
590 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
620591 unreachable;
621592}
622593fn __aarch64_ldset2_relax() align(16) callconv(.naked) void {
......@@ -636,8 +607,7 @@ fn __aarch64_ldset2_relax() align(16) callconv(.naked) void {
636607 \\ ret
637608 :
638609 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
639 : "w15", "w16", "w17", "memory"
640 );
610 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
641611 unreachable;
642612}
643613fn __aarch64_cas2_acq() align(16) callconv(.naked) void {
......@@ -658,8 +628,7 @@ fn __aarch64_cas2_acq() align(16) callconv(.naked) void {
658628 \\ ret
659629 :
660630 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
661 : "w15", "w16", "w17", "memory"
662 );
631 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
663632 unreachable;
664633}
665634fn __aarch64_swp2_acq() align(16) callconv(.naked) void {
......@@ -678,8 +647,7 @@ fn __aarch64_swp2_acq() align(16) callconv(.naked) void {
678647 \\ ret
679648 :
680649 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
681 : "w15", "w16", "w17", "memory"
682 );
650 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
683651 unreachable;
684652}
685653fn __aarch64_ldadd2_acq() align(16) callconv(.naked) void {
......@@ -699,8 +667,7 @@ fn __aarch64_ldadd2_acq() align(16) callconv(.naked) void {
699667 \\ ret
700668 :
701669 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
702 : "w15", "w16", "w17", "memory"
703 );
670 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
704671 unreachable;
705672}
706673fn __aarch64_ldclr2_acq() align(16) callconv(.naked) void {
......@@ -720,8 +687,7 @@ fn __aarch64_ldclr2_acq() align(16) callconv(.naked) void {
720687 \\ ret
721688 :
722689 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
723 : "w15", "w16", "w17", "memory"
724 );
690 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
725691 unreachable;
726692}
727693fn __aarch64_ldeor2_acq() align(16) callconv(.naked) void {
......@@ -741,8 +707,7 @@ fn __aarch64_ldeor2_acq() align(16) callconv(.naked) void {
741707 \\ ret
742708 :
743709 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
744 : "w15", "w16", "w17", "memory"
745 );
710 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
746711 unreachable;
747712}
748713fn __aarch64_ldset2_acq() align(16) callconv(.naked) void {
......@@ -762,8 +727,7 @@ fn __aarch64_ldset2_acq() align(16) callconv(.naked) void {
762727 \\ ret
763728 :
764729 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
765 : "w15", "w16", "w17", "memory"
766 );
730 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
767731 unreachable;
768732}
769733fn __aarch64_cas2_rel() align(16) callconv(.naked) void {
......@@ -784,8 +748,7 @@ fn __aarch64_cas2_rel() align(16) callconv(.naked) void {
784748 \\ ret
785749 :
786750 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
787 : "w15", "w16", "w17", "memory"
788 );
751 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
789752 unreachable;
790753}
791754fn __aarch64_swp2_rel() align(16) callconv(.naked) void {
......@@ -804,8 +767,7 @@ fn __aarch64_swp2_rel() align(16) callconv(.naked) void {
804767 \\ ret
805768 :
806769 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
807 : "w15", "w16", "w17", "memory"
808 );
770 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
809771 unreachable;
810772}
811773fn __aarch64_ldadd2_rel() align(16) callconv(.naked) void {
......@@ -825,8 +787,7 @@ fn __aarch64_ldadd2_rel() align(16) callconv(.naked) void {
825787 \\ ret
826788 :
827789 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
828 : "w15", "w16", "w17", "memory"
829 );
790 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
830791 unreachable;
831792}
832793fn __aarch64_ldclr2_rel() align(16) callconv(.naked) void {
......@@ -846,8 +807,7 @@ fn __aarch64_ldclr2_rel() align(16) callconv(.naked) void {
846807 \\ ret
847808 :
848809 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
849 : "w15", "w16", "w17", "memory"
850 );
810 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
851811 unreachable;
852812}
853813fn __aarch64_ldeor2_rel() align(16) callconv(.naked) void {
......@@ -867,8 +827,7 @@ fn __aarch64_ldeor2_rel() align(16) callconv(.naked) void {
867827 \\ ret
868828 :
869829 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
870 : "w15", "w16", "w17", "memory"
871 );
830 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
872831 unreachable;
873832}
874833fn __aarch64_ldset2_rel() align(16) callconv(.naked) void {
......@@ -888,8 +847,7 @@ fn __aarch64_ldset2_rel() align(16) callconv(.naked) void {
888847 \\ ret
889848 :
890849 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
891 : "w15", "w16", "w17", "memory"
892 );
850 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
893851 unreachable;
894852}
895853fn __aarch64_cas2_acq_rel() align(16) callconv(.naked) void {
......@@ -910,8 +868,7 @@ fn __aarch64_cas2_acq_rel() align(16) callconv(.naked) void {
910868 \\ ret
911869 :
912870 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
913 : "w15", "w16", "w17", "memory"
914 );
871 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
915872 unreachable;
916873}
917874fn __aarch64_swp2_acq_rel() align(16) callconv(.naked) void {
......@@ -930,8 +887,7 @@ fn __aarch64_swp2_acq_rel() align(16) callconv(.naked) void {
930887 \\ ret
931888 :
932889 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
933 : "w15", "w16", "w17", "memory"
934 );
890 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
935891 unreachable;
936892}
937893fn __aarch64_ldadd2_acq_rel() align(16) callconv(.naked) void {
......@@ -951,8 +907,7 @@ fn __aarch64_ldadd2_acq_rel() align(16) callconv(.naked) void {
951907 \\ ret
952908 :
953909 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
954 : "w15", "w16", "w17", "memory"
955 );
910 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
956911 unreachable;
957912}
958913fn __aarch64_ldclr2_acq_rel() align(16) callconv(.naked) void {
......@@ -972,8 +927,7 @@ fn __aarch64_ldclr2_acq_rel() align(16) callconv(.naked) void {
972927 \\ ret
973928 :
974929 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
975 : "w15", "w16", "w17", "memory"
976 );
930 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
977931 unreachable;
978932}
979933fn __aarch64_ldeor2_acq_rel() align(16) callconv(.naked) void {
......@@ -993,8 +947,7 @@ fn __aarch64_ldeor2_acq_rel() align(16) callconv(.naked) void {
993947 \\ ret
994948 :
995949 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
996 : "w15", "w16", "w17", "memory"
997 );
950 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
998951 unreachable;
999952}
1000953fn __aarch64_ldset2_acq_rel() align(16) callconv(.naked) void {
......@@ -1014,8 +967,7 @@ fn __aarch64_ldset2_acq_rel() align(16) callconv(.naked) void {
1014967 \\ ret
1015968 :
1016969 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1017 : "w15", "w16", "w17", "memory"
1018 );
970 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1019971 unreachable;
1020972}
1021973fn __aarch64_cas4_relax() align(16) callconv(.naked) void {
......@@ -1036,8 +988,7 @@ fn __aarch64_cas4_relax() align(16) callconv(.naked) void {
1036988 \\ ret
1037989 :
1038990 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1039 : "w15", "w16", "w17", "memory"
1040 );
991 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
1041992 unreachable;
1042993}
1043994fn __aarch64_swp4_relax() align(16) callconv(.naked) void {
......@@ -1056,8 +1007,7 @@ fn __aarch64_swp4_relax() align(16) callconv(.naked) void {
10561007 \\ ret
10571008 :
10581009 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1059 : "w15", "w16", "w17", "memory"
1060 );
1010 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
10611011 unreachable;
10621012}
10631013fn __aarch64_ldadd4_relax() align(16) callconv(.naked) void {
......@@ -1077,8 +1027,7 @@ fn __aarch64_ldadd4_relax() align(16) callconv(.naked) void {
10771027 \\ ret
10781028 :
10791029 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1080 : "w15", "w16", "w17", "memory"
1081 );
1030 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
10821031 unreachable;
10831032}
10841033fn __aarch64_ldclr4_relax() align(16) callconv(.naked) void {
......@@ -1098,8 +1047,7 @@ fn __aarch64_ldclr4_relax() align(16) callconv(.naked) void {
10981047 \\ ret
10991048 :
11001049 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1101 : "w15", "w16", "w17", "memory"
1102 );
1050 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
11031051 unreachable;
11041052}
11051053fn __aarch64_ldeor4_relax() align(16) callconv(.naked) void {
......@@ -1119,8 +1067,7 @@ fn __aarch64_ldeor4_relax() align(16) callconv(.naked) void {
11191067 \\ ret
11201068 :
11211069 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1122 : "w15", "w16", "w17", "memory"
1123 );
1070 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
11241071 unreachable;
11251072}
11261073fn __aarch64_ldset4_relax() align(16) callconv(.naked) void {
......@@ -1140,8 +1087,7 @@ fn __aarch64_ldset4_relax() align(16) callconv(.naked) void {
11401087 \\ ret
11411088 :
11421089 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1143 : "w15", "w16", "w17", "memory"
1144 );
1090 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
11451091 unreachable;
11461092}
11471093fn __aarch64_cas4_acq() align(16) callconv(.naked) void {
......@@ -1162,8 +1108,7 @@ fn __aarch64_cas4_acq() align(16) callconv(.naked) void {
11621108 \\ ret
11631109 :
11641110 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1165 : "w15", "w16", "w17", "memory"
1166 );
1111 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
11671112 unreachable;
11681113}
11691114fn __aarch64_swp4_acq() align(16) callconv(.naked) void {
......@@ -1182,8 +1127,7 @@ fn __aarch64_swp4_acq() align(16) callconv(.naked) void {
11821127 \\ ret
11831128 :
11841129 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1185 : "w15", "w16", "w17", "memory"
1186 );
1130 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
11871131 unreachable;
11881132}
11891133fn __aarch64_ldadd4_acq() align(16) callconv(.naked) void {
......@@ -1203,8 +1147,7 @@ fn __aarch64_ldadd4_acq() align(16) callconv(.naked) void {
12031147 \\ ret
12041148 :
12051149 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1206 : "w15", "w16", "w17", "memory"
1207 );
1150 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
12081151 unreachable;
12091152}
12101153fn __aarch64_ldclr4_acq() align(16) callconv(.naked) void {
......@@ -1224,8 +1167,7 @@ fn __aarch64_ldclr4_acq() align(16) callconv(.naked) void {
12241167 \\ ret
12251168 :
12261169 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1227 : "w15", "w16", "w17", "memory"
1228 );
1170 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
12291171 unreachable;
12301172}
12311173fn __aarch64_ldeor4_acq() align(16) callconv(.naked) void {
......@@ -1245,8 +1187,7 @@ fn __aarch64_ldeor4_acq() align(16) callconv(.naked) void {
12451187 \\ ret
12461188 :
12471189 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1248 : "w15", "w16", "w17", "memory"
1249 );
1190 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
12501191 unreachable;
12511192}
12521193fn __aarch64_ldset4_acq() align(16) callconv(.naked) void {
......@@ -1266,8 +1207,7 @@ fn __aarch64_ldset4_acq() align(16) callconv(.naked) void {
12661207 \\ ret
12671208 :
12681209 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1269 : "w15", "w16", "w17", "memory"
1270 );
1210 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
12711211 unreachable;
12721212}
12731213fn __aarch64_cas4_rel() align(16) callconv(.naked) void {
......@@ -1288,8 +1228,7 @@ fn __aarch64_cas4_rel() align(16) callconv(.naked) void {
12881228 \\ ret
12891229 :
12901230 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1291 : "w15", "w16", "w17", "memory"
1292 );
1231 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
12931232 unreachable;
12941233}
12951234fn __aarch64_swp4_rel() align(16) callconv(.naked) void {
......@@ -1308,8 +1247,7 @@ fn __aarch64_swp4_rel() align(16) callconv(.naked) void {
13081247 \\ ret
13091248 :
13101249 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1311 : "w15", "w16", "w17", "memory"
1312 );
1250 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
13131251 unreachable;
13141252}
13151253fn __aarch64_ldadd4_rel() align(16) callconv(.naked) void {
......@@ -1329,8 +1267,7 @@ fn __aarch64_ldadd4_rel() align(16) callconv(.naked) void {
13291267 \\ ret
13301268 :
13311269 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1332 : "w15", "w16", "w17", "memory"
1333 );
1270 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
13341271 unreachable;
13351272}
13361273fn __aarch64_ldclr4_rel() align(16) callconv(.naked) void {
......@@ -1350,8 +1287,7 @@ fn __aarch64_ldclr4_rel() align(16) callconv(.naked) void {
13501287 \\ ret
13511288 :
13521289 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1353 : "w15", "w16", "w17", "memory"
1354 );
1290 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
13551291 unreachable;
13561292}
13571293fn __aarch64_ldeor4_rel() align(16) callconv(.naked) void {
......@@ -1371,8 +1307,7 @@ fn __aarch64_ldeor4_rel() align(16) callconv(.naked) void {
13711307 \\ ret
13721308 :
13731309 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1374 : "w15", "w16", "w17", "memory"
1375 );
1310 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
13761311 unreachable;
13771312}
13781313fn __aarch64_ldset4_rel() align(16) callconv(.naked) void {
......@@ -1392,8 +1327,7 @@ fn __aarch64_ldset4_rel() align(16) callconv(.naked) void {
13921327 \\ ret
13931328 :
13941329 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1395 : "w15", "w16", "w17", "memory"
1396 );
1330 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
13971331 unreachable;
13981332}
13991333fn __aarch64_cas4_acq_rel() align(16) callconv(.naked) void {
......@@ -1414,8 +1348,7 @@ fn __aarch64_cas4_acq_rel() align(16) callconv(.naked) void {
14141348 \\ ret
14151349 :
14161350 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1417 : "w15", "w16", "w17", "memory"
1418 );
1351 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
14191352 unreachable;
14201353}
14211354fn __aarch64_swp4_acq_rel() align(16) callconv(.naked) void {
......@@ -1434,8 +1367,7 @@ fn __aarch64_swp4_acq_rel() align(16) callconv(.naked) void {
14341367 \\ ret
14351368 :
14361369 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1437 : "w15", "w16", "w17", "memory"
1438 );
1370 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
14391371 unreachable;
14401372}
14411373fn __aarch64_ldadd4_acq_rel() align(16) callconv(.naked) void {
......@@ -1455,8 +1387,7 @@ fn __aarch64_ldadd4_acq_rel() align(16) callconv(.naked) void {
14551387 \\ ret
14561388 :
14571389 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1458 : "w15", "w16", "w17", "memory"
1459 );
1390 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
14601391 unreachable;
14611392}
14621393fn __aarch64_ldclr4_acq_rel() align(16) callconv(.naked) void {
......@@ -1476,8 +1407,7 @@ fn __aarch64_ldclr4_acq_rel() align(16) callconv(.naked) void {
14761407 \\ ret
14771408 :
14781409 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1479 : "w15", "w16", "w17", "memory"
1480 );
1410 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
14811411 unreachable;
14821412}
14831413fn __aarch64_ldeor4_acq_rel() align(16) callconv(.naked) void {
......@@ -1497,8 +1427,7 @@ fn __aarch64_ldeor4_acq_rel() align(16) callconv(.naked) void {
14971427 \\ ret
14981428 :
14991429 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1500 : "w15", "w16", "w17", "memory"
1501 );
1430 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
15021431 unreachable;
15031432}
15041433fn __aarch64_ldset4_acq_rel() align(16) callconv(.naked) void {
......@@ -1518,8 +1447,7 @@ fn __aarch64_ldset4_acq_rel() align(16) callconv(.naked) void {
15181447 \\ ret
15191448 :
15201449 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1521 : "w15", "w16", "w17", "memory"
1522 );
1450 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
15231451 unreachable;
15241452}
15251453fn __aarch64_cas8_relax() align(16) callconv(.naked) void {
......@@ -1540,8 +1468,7 @@ fn __aarch64_cas8_relax() align(16) callconv(.naked) void {
15401468 \\ ret
15411469 :
15421470 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1543 : "w15", "w16", "w17", "memory"
1544 );
1471 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
15451472 unreachable;
15461473}
15471474fn __aarch64_swp8_relax() align(16) callconv(.naked) void {
......@@ -1560,8 +1487,7 @@ fn __aarch64_swp8_relax() align(16) callconv(.naked) void {
15601487 \\ ret
15611488 :
15621489 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1563 : "w15", "w16", "w17", "memory"
1564 );
1490 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
15651491 unreachable;
15661492}
15671493fn __aarch64_ldadd8_relax() align(16) callconv(.naked) void {
......@@ -1581,8 +1507,7 @@ fn __aarch64_ldadd8_relax() align(16) callconv(.naked) void {
15811507 \\ ret
15821508 :
15831509 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1584 : "w15", "w16", "w17", "memory"
1585 );
1510 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
15861511 unreachable;
15871512}
15881513fn __aarch64_ldclr8_relax() align(16) callconv(.naked) void {
......@@ -1602,8 +1527,7 @@ fn __aarch64_ldclr8_relax() align(16) callconv(.naked) void {
16021527 \\ ret
16031528 :
16041529 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1605 : "w15", "w16", "w17", "memory"
1606 );
1530 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
16071531 unreachable;
16081532}
16091533fn __aarch64_ldeor8_relax() align(16) callconv(.naked) void {
......@@ -1623,8 +1547,7 @@ fn __aarch64_ldeor8_relax() align(16) callconv(.naked) void {
16231547 \\ ret
16241548 :
16251549 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1626 : "w15", "w16", "w17", "memory"
1627 );
1550 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
16281551 unreachable;
16291552}
16301553fn __aarch64_ldset8_relax() align(16) callconv(.naked) void {
......@@ -1644,8 +1567,7 @@ fn __aarch64_ldset8_relax() align(16) callconv(.naked) void {
16441567 \\ ret
16451568 :
16461569 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1647 : "w15", "w16", "w17", "memory"
1648 );
1570 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
16491571 unreachable;
16501572}
16511573fn __aarch64_cas8_acq() align(16) callconv(.naked) void {
......@@ -1666,8 +1588,7 @@ fn __aarch64_cas8_acq() align(16) callconv(.naked) void {
16661588 \\ ret
16671589 :
16681590 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1669 : "w15", "w16", "w17", "memory"
1670 );
1591 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
16711592 unreachable;
16721593}
16731594fn __aarch64_swp8_acq() align(16) callconv(.naked) void {
......@@ -1686,8 +1607,7 @@ fn __aarch64_swp8_acq() align(16) callconv(.naked) void {
16861607 \\ ret
16871608 :
16881609 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1689 : "w15", "w16", "w17", "memory"
1690 );
1610 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
16911611 unreachable;
16921612}
16931613fn __aarch64_ldadd8_acq() align(16) callconv(.naked) void {
......@@ -1707,8 +1627,7 @@ fn __aarch64_ldadd8_acq() align(16) callconv(.naked) void {
17071627 \\ ret
17081628 :
17091629 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1710 : "w15", "w16", "w17", "memory"
1711 );
1630 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
17121631 unreachable;
17131632}
17141633fn __aarch64_ldclr8_acq() align(16) callconv(.naked) void {
......@@ -1728,8 +1647,7 @@ fn __aarch64_ldclr8_acq() align(16) callconv(.naked) void {
17281647 \\ ret
17291648 :
17301649 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1731 : "w15", "w16", "w17", "memory"
1732 );
1650 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
17331651 unreachable;
17341652}
17351653fn __aarch64_ldeor8_acq() align(16) callconv(.naked) void {
......@@ -1749,8 +1667,7 @@ fn __aarch64_ldeor8_acq() align(16) callconv(.naked) void {
17491667 \\ ret
17501668 :
17511669 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1752 : "w15", "w16", "w17", "memory"
1753 );
1670 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
17541671 unreachable;
17551672}
17561673fn __aarch64_ldset8_acq() align(16) callconv(.naked) void {
......@@ -1770,8 +1687,7 @@ fn __aarch64_ldset8_acq() align(16) callconv(.naked) void {
17701687 \\ ret
17711688 :
17721689 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1773 : "w15", "w16", "w17", "memory"
1774 );
1690 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
17751691 unreachable;
17761692}
17771693fn __aarch64_cas8_rel() align(16) callconv(.naked) void {
......@@ -1792,8 +1708,7 @@ fn __aarch64_cas8_rel() align(16) callconv(.naked) void {
17921708 \\ ret
17931709 :
17941710 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1795 : "w15", "w16", "w17", "memory"
1796 );
1711 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
17971712 unreachable;
17981713}
17991714fn __aarch64_swp8_rel() align(16) callconv(.naked) void {
......@@ -1812,8 +1727,7 @@ fn __aarch64_swp8_rel() align(16) callconv(.naked) void {
18121727 \\ ret
18131728 :
18141729 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1815 : "w15", "w16", "w17", "memory"
1816 );
1730 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
18171731 unreachable;
18181732}
18191733fn __aarch64_ldadd8_rel() align(16) callconv(.naked) void {
......@@ -1833,8 +1747,7 @@ fn __aarch64_ldadd8_rel() align(16) callconv(.naked) void {
18331747 \\ ret
18341748 :
18351749 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1836 : "w15", "w16", "w17", "memory"
1837 );
1750 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
18381751 unreachable;
18391752}
18401753fn __aarch64_ldclr8_rel() align(16) callconv(.naked) void {
......@@ -1854,8 +1767,7 @@ fn __aarch64_ldclr8_rel() align(16) callconv(.naked) void {
18541767 \\ ret
18551768 :
18561769 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1857 : "w15", "w16", "w17", "memory"
1858 );
1770 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
18591771 unreachable;
18601772}
18611773fn __aarch64_ldeor8_rel() align(16) callconv(.naked) void {
......@@ -1875,8 +1787,7 @@ fn __aarch64_ldeor8_rel() align(16) callconv(.naked) void {
18751787 \\ ret
18761788 :
18771789 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1878 : "w15", "w16", "w17", "memory"
1879 );
1790 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
18801791 unreachable;
18811792}
18821793fn __aarch64_ldset8_rel() align(16) callconv(.naked) void {
......@@ -1896,8 +1807,7 @@ fn __aarch64_ldset8_rel() align(16) callconv(.naked) void {
18961807 \\ ret
18971808 :
18981809 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1899 : "w15", "w16", "w17", "memory"
1900 );
1810 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
19011811 unreachable;
19021812}
19031813fn __aarch64_cas8_acq_rel() align(16) callconv(.naked) void {
......@@ -1918,8 +1828,7 @@ fn __aarch64_cas8_acq_rel() align(16) callconv(.naked) void {
19181828 \\ ret
19191829 :
19201830 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1921 : "w15", "w16", "w17", "memory"
1922 );
1831 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
19231832 unreachable;
19241833}
19251834fn __aarch64_swp8_acq_rel() align(16) callconv(.naked) void {
......@@ -1938,8 +1847,7 @@ fn __aarch64_swp8_acq_rel() align(16) callconv(.naked) void {
19381847 \\ ret
19391848 :
19401849 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1941 : "w15", "w16", "w17", "memory"
1942 );
1850 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
19431851 unreachable;
19441852}
19451853fn __aarch64_ldadd8_acq_rel() align(16) callconv(.naked) void {
......@@ -1959,8 +1867,7 @@ fn __aarch64_ldadd8_acq_rel() align(16) callconv(.naked) void {
19591867 \\ ret
19601868 :
19611869 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1962 : "w15", "w16", "w17", "memory"
1963 );
1870 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
19641871 unreachable;
19651872}
19661873fn __aarch64_ldclr8_acq_rel() align(16) callconv(.naked) void {
......@@ -1980,8 +1887,7 @@ fn __aarch64_ldclr8_acq_rel() align(16) callconv(.naked) void {
19801887 \\ ret
19811888 :
19821889 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
1983 : "w15", "w16", "w17", "memory"
1984 );
1890 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
19851891 unreachable;
19861892}
19871893fn __aarch64_ldeor8_acq_rel() align(16) callconv(.naked) void {
......@@ -2001,8 +1907,7 @@ fn __aarch64_ldeor8_acq_rel() align(16) callconv(.naked) void {
20011907 \\ ret
20021908 :
20031909 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2004 : "w15", "w16", "w17", "memory"
2005 );
1910 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
20061911 unreachable;
20071912}
20081913fn __aarch64_ldset8_acq_rel() align(16) callconv(.naked) void {
......@@ -2022,8 +1927,7 @@ fn __aarch64_ldset8_acq_rel() align(16) callconv(.naked) void {
20221927 \\ ret
20231928 :
20241929 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2025 : "w15", "w16", "w17", "memory"
2026 );
1930 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
20271931 unreachable;
20281932}
20291933fn __aarch64_cas16_relax() align(16) callconv(.naked) void {
......@@ -2046,8 +1950,7 @@ fn __aarch64_cas16_relax() align(16) callconv(.naked) void {
20461950 \\ ret
20471951 :
20481952 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2049 : "w15", "w16", "w17", "memory"
2050 );
1953 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
20511954 unreachable;
20521955}
20531956fn __aarch64_cas16_acq() align(16) callconv(.naked) void {
......@@ -2070,8 +1973,7 @@ fn __aarch64_cas16_acq() align(16) callconv(.naked) void {
20701973 \\ ret
20711974 :
20721975 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2073 : "w15", "w16", "w17", "memory"
2074 );
1976 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
20751977 unreachable;
20761978}
20771979fn __aarch64_cas16_rel() align(16) callconv(.naked) void {
......@@ -2094,8 +1996,7 @@ fn __aarch64_cas16_rel() align(16) callconv(.naked) void {
20941996 \\ ret
20951997 :
20961998 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2097 : "w15", "w16", "w17", "memory"
2098 );
1999 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
20992000 unreachable;
21002001}
21012002fn __aarch64_cas16_acq_rel() align(16) callconv(.naked) void {
......@@ -2118,8 +2019,7 @@ fn __aarch64_cas16_acq_rel() align(16) callconv(.naked) void {
21182019 \\ ret
21192020 :
21202021 : [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
2121 : "w15", "w16", "w17", "memory"
2122 );
2022 : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
21232023 unreachable;
21242024}
21252025
lib/compiler_rt/arm.zig+4-8
......@@ -142,8 +142,7 @@ pub fn __aeabi_uidivmod() callconv(.naked) void {
142142 \\ pop {pc}
143143 :
144144 : [__udivmodsi4] "X" (&__udivmodsi4),
145 : "memory"
146 );
145 : .{ .memory = true });
147146 unreachable;
148147}
149148
......@@ -162,8 +161,7 @@ pub fn __aeabi_uldivmod() callconv(.naked) void {
162161 \\ pop {r4, pc}
163162 :
164163 : [__udivmoddi4] "X" (&__udivmoddi4),
165 : "memory"
166 );
164 : .{ .memory = true });
167165 unreachable;
168166}
169167
......@@ -180,8 +178,7 @@ pub fn __aeabi_idivmod() callconv(.naked) void {
180178 \\ pop {pc}
181179 :
182180 : [__divmodsi4] "X" (&__divmodsi4),
183 : "memory"
184 );
181 : .{ .memory = true });
185182 unreachable;
186183}
187184
......@@ -200,8 +197,7 @@ pub fn __aeabi_ldivmod() callconv(.naked) void {
200197 \\ pop {r4, pc}
201198 :
202199 : [__divmoddi4] "X" (&__divmoddi4),
203 : "memory"
204 );
200 : .{ .memory = true });
205201 unreachable;
206202}
207203
lib/compiler_rt/atomics.zig+2-4
......@@ -71,8 +71,7 @@ const SpinlockTable = struct {
7171 break :flag asm volatile ("ldstub [%[addr]], %[flag]"
7272 : [flag] "=r" (-> @TypeOf(self.v)),
7373 : [addr] "r" (&self.v),
74 : "memory"
75 );
74 : .{ .memory = true });
7675 } else flag: {
7776 break :flag @atomicRmw(@TypeOf(self.v), &self.v, .Xchg, .Locked, .acquire);
7877 };
......@@ -88,8 +87,7 @@ const SpinlockTable = struct {
8887 _ = asm volatile ("clrb [%[addr]]"
8988 :
9089 : [addr] "r" (&self.v),
91 : "memory"
92 );
90 : .{ .memory = true });
9391 } else {
9492 @atomicStore(@TypeOf(self.v), &self.v, .Unlocked, .release);
9593 }
lib/compiler_rt/clear_cache.zig+1-2
......@@ -103,8 +103,7 @@ fn clear_cache(start: usize, end: usize) callconv(.c) void {
103103 : [_] "{$2}" (165), // nr = SYS_sysarch
104104 [_] "{$4}" (0), // op = MIPS_CACHEFLUSH
105105 [_] "{$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"
107 );
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 });
108107 exportIt();
109108 } else if (mips and os == .openbsd) {
110109 // TODO
lib/docs/wasm/Walk.zig+2
......@@ -793,6 +793,8 @@ fn expr(w: *Walk, scope: *Scope, parent_decl: Decl.Index, node: Ast.Node.Index)
793793 try expr(w, scope, parent_decl, full.ast.template);
794794 },
795795
796 .asm_legacy => {},
797
796798 .builtin_call_two,
797799 .builtin_call_two_comma,
798800 .builtin_call,
lib/libc/include/generic-glibc/sys/single_threaded.h+4-4
......@@ -16,10 +16,10 @@
1616 License along with the GNU C Library; if not, see
1717 <https://www.gnu.org/licenses/>. */
1818
19// zig patch: sys/single_threaded.h header was added in glibc 2.35
20#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 35
21 #error "sys/single_threaded.h did not exist before glibc 2.35"
22#endif /* error for glibc before 2.35 */
19// zig patch: sys/single_threaded.h header was added in glibc 2.32
20#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 32
21 #error "sys/single_threaded.h did not exist before glibc 2.32"
22#endif /* error for glibc before 2.32 */
2323
2424#ifndef _SYS_SINGLE_THREADED_H
2525#define _SYS_SINGLE_THREADED_H
lib/std/Build/Cache.zig+1
......@@ -419,6 +419,7 @@ pub const Manifest = struct {
419419 fn addFileInner(self: *Manifest, prefixed_path: PrefixedPath, handle: ?fs.File, max_file_size: ?usize) usize {
420420 const gop = self.files.getOrPutAssumeCapacityAdapted(prefixed_path, FilesAdapter{});
421421 if (gop.found_existing) {
422 self.cache.gpa.free(prefixed_path.sub_path);
422423 gop.key_ptr.updateMaxSize(max_file_size);
423424 gop.key_ptr.updateHandle(handle);
424425 return gop.index;
lib/std/Io/Writer.zig+53-17
......@@ -464,34 +464,54 @@ pub fn writeVecAll(w: *Writer, data: [][]const u8) Error!void {
464464
465465/// The `data` parameter is mutable because this function needs to mutate the
466466/// fields in order to handle partial writes from `VTable.writeSplat`.
467/// `data` will be restored to its original state before returning.
467468pub fn writeSplatAll(w: *Writer, data: [][]const u8, splat: usize) Error!void {
468469 var index: usize = 0;
469470 var truncate: usize = 0;
470 var remaining_splat = splat;
471471 while (index + 1 < data.len) {
472472 {
473473 const untruncated = data[index];
474474 data[index] = untruncated[truncate..];
475475 defer data[index] = untruncated;
476 truncate += try w.writeSplat(data[index..], remaining_splat);
476 truncate += try w.writeSplat(data[index..], splat);
477477 }
478 while (truncate >= data[index].len) {
479 if (index + 1 < data.len) {
480 truncate -= data[index].len;
481 index += 1;
482 } else {
483 const last = data[data.len - 1];
484 remaining_splat -= @divExact(truncate, last.len);
485 while (remaining_splat > 0) {
486 const n = try w.writeSplat(data[data.len - 1 ..][0..1], remaining_splat);
487 remaining_splat -= @divExact(n, last.len);
488 }
489 return;
490 }
478 while (truncate >= data[index].len and index + 1 < data.len) {
479 truncate -= data[index].len;
480 index += 1;
481 }
482 }
483
484 // Deal with any left over splats
485 if (data.len != 0 and truncate < data[index].len * splat) {
486 std.debug.assert(index == data.len - 1);
487 var remaining_splat = splat;
488 while (true) {
489 remaining_splat -= truncate / data[index].len;
490 truncate %= data[index].len;
491 if (remaining_splat == 0) break;
492 truncate += try w.writeSplat(&.{ data[index][truncate..], data[index] }, remaining_splat - 1);
491493 }
492494 }
493495}
494496
497test writeSplatAll {
498 var aw: Writer.Allocating = .init(testing.allocator);
499 defer aw.deinit();
500
501 var buffers = [_][]const u8{ "ba", "na" };
502 try aw.writer.writeSplatAll(&buffers, 2);
503 try testing.expectEqualStrings("banana", aw.writer.buffered());
504}
505
506test "writeSplatAll works with a single buffer" {
507 var aw: Writer.Allocating = .init(testing.allocator);
508 defer aw.deinit();
509
510 var message: [1][]const u8 = .{"hello"};
511 try aw.writer.writeSplatAll(&message, 3);
512 try testing.expectEqualStrings("hellohellohello", aw.writer.buffered());
513}
514
495515pub fn write(w: *Writer, bytes: []const u8) Error!usize {
496516 if (w.end + bytes.len <= w.buffer.len) {
497517 @branchHint(.likely);
......@@ -763,6 +783,14 @@ pub fn splatByteAll(w: *Writer, byte: u8, n: usize) Error!void {
763783 while (remaining > 0) remaining -= try w.splatByte(byte, remaining);
764784}
765785
786test splatByteAll {
787 var aw: Writer.Allocating = .init(testing.allocator);
788 defer aw.deinit();
789
790 try aw.writer.splatByteAll('7', 45);
791 try testing.expectEqualStrings("7" ** 45, aw.writer.buffered());
792}
793
766794/// Writes the same byte many times, allowing short writes.
767795///
768796/// Does maximum of one underlying `VTable.drain`.
......@@ -778,13 +806,21 @@ pub fn splatBytesAll(w: *Writer, bytes: []const u8, splat: usize) Error!void {
778806 while (remaining_bytes > 0) {
779807 const leftover = remaining_bytes % bytes.len;
780808 const buffers: [2][]const u8 = .{ bytes[bytes.len - leftover ..], bytes };
781 remaining_bytes -= try w.splatBytes(&buffers, splat);
809 remaining_bytes -= try w.writeSplat(&buffers, splat);
782810 }
783811}
784812
813test splatBytesAll {
814 var aw: Writer.Allocating = .init(testing.allocator);
815 defer aw.deinit();
816
817 try aw.writer.splatBytesAll("hello", 3);
818 try testing.expectEqualStrings("hellohellohello", aw.writer.buffered());
819}
820
785821/// Writes the same slice many times, allowing short writes.
786822///
787/// Does maximum of one underlying `VTable.writeSplat`.
823/// Does maximum of one underlying `VTable.drain`.
788824pub fn splatBytes(w: *Writer, bytes: []const u8, n: usize) Error!usize {
789825 return writeSplat(w, &.{bytes}, n);
790826}
lib/std/Thread.zig+12-24
......@@ -1199,8 +1199,7 @@ const LinuxThreadImpl = struct {
11991199 :
12001200 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
12011201 [len] "r" (self.mapped.len),
1202 : "memory"
1203 ),
1202 : .{ .memory = true }),
12041203 .x86_64 => asm volatile (
12051204 \\ movq $11, %%rax # SYS_munmap
12061205 \\ syscall
......@@ -1222,8 +1221,7 @@ const LinuxThreadImpl = struct {
12221221 :
12231222 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
12241223 [len] "r" (self.mapped.len),
1225 : "memory"
1226 ),
1224 : .{ .memory = true }),
12271225 .aarch64, .aarch64_be => asm volatile (
12281226 \\ mov x8, #215 // SYS_munmap
12291227 \\ mov x0, %[ptr]
......@@ -1235,8 +1233,7 @@ const LinuxThreadImpl = struct {
12351233 :
12361234 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
12371235 [len] "r" (self.mapped.len),
1238 : "memory"
1239 ),
1236 : .{ .memory = true }),
12401237 .hexagon => asm volatile (
12411238 \\ r6 = #215 // SYS_munmap
12421239 \\ r0 = %[ptr]
......@@ -1248,8 +1245,7 @@ const LinuxThreadImpl = struct {
12481245 :
12491246 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
12501247 [len] "r" (self.mapped.len),
1251 : "memory"
1252 ),
1248 : .{ .memory = true }),
12531249 // We set `sp` to the address of the current function as a workaround for a Linux
12541250 // kernel bug that caused syscalls to return EFAULT if the stack pointer is invalid.
12551251 // The bug was introduced in 46e12c07b3b9603c60fc1d421ff18618241cb081 and fixed in
......@@ -1266,8 +1262,7 @@ const LinuxThreadImpl = struct {
12661262 :
12671263 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
12681264 [len] "r" (self.mapped.len),
1269 : "memory"
1270 ),
1265 : .{ .memory = true }),
12711266 .mips64, .mips64el => asm volatile (
12721267 \\ li $2, 5011 # SYS_munmap
12731268 \\ move $4, %[ptr]
......@@ -1279,8 +1274,7 @@ const LinuxThreadImpl = struct {
12791274 :
12801275 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
12811276 [len] "r" (self.mapped.len),
1282 : "memory"
1283 ),
1277 : .{ .memory = true }),
12841278 .powerpc, .powerpcle, .powerpc64, .powerpc64le => asm volatile (
12851279 \\ li 0, 91 # SYS_munmap
12861280 \\ mr 3, %[ptr]
......@@ -1293,8 +1287,7 @@ const LinuxThreadImpl = struct {
12931287 :
12941288 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
12951289 [len] "r" (self.mapped.len),
1296 : "memory"
1297 ),
1290 : .{ .memory = true }),
12981291 .riscv32, .riscv64 => asm volatile (
12991292 \\ li a7, 215 # SYS_munmap
13001293 \\ mv a0, %[ptr]
......@@ -1306,8 +1299,7 @@ const LinuxThreadImpl = struct {
13061299 :
13071300 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
13081301 [len] "r" (self.mapped.len),
1309 : "memory"
1310 ),
1302 : .{ .memory = true }),
13111303 .s390x => asm volatile (
13121304 \\ lgr %%r2, %[ptr]
13131305 \\ lgr %%r3, %[len]
......@@ -1317,8 +1309,7 @@ const LinuxThreadImpl = struct {
13171309 :
13181310 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
13191311 [len] "r" (self.mapped.len),
1320 : "memory"
1321 ),
1312 : .{ .memory = true }),
13221313 .sparc => asm volatile (
13231314 \\ # See sparc64 comments below.
13241315 \\ 1:
......@@ -1339,8 +1330,7 @@ const LinuxThreadImpl = struct {
13391330 :
13401331 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
13411332 [len] "r" (self.mapped.len),
1342 : "memory"
1343 ),
1333 : .{ .memory = true }),
13441334 .sparc64 => asm volatile (
13451335 \\ # SPARCs really don't like it when active stack frames
13461336 \\ # is unmapped (it will result in a segfault), so we
......@@ -1366,8 +1356,7 @@ const LinuxThreadImpl = struct {
13661356 :
13671357 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
13681358 [len] "r" (self.mapped.len),
1369 : "memory"
1370 ),
1359 : .{ .memory = true }),
13711360 .loongarch32, .loongarch64 => asm volatile (
13721361 \\ or $a0, $zero, %[ptr]
13731362 \\ or $a1, $zero, %[len]
......@@ -1379,8 +1368,7 @@ const LinuxThreadImpl = struct {
13791368 :
13801369 : [ptr] "r" (@intFromPtr(self.mapped.ptr)),
13811370 [len] "r" (self.mapped.len),
1382 : "memory"
1383 ),
1371 : .{ .memory = true }),
13841372 else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)),
13851373 }
13861374 unreachable;
lib/std/builtin.zig+4-3
......@@ -1,6 +1,10 @@
11//! Types and values provided by the Zig language.
22
33const builtin = @import("builtin");
4const std = @import("std.zig");
5const root = @import("root");
6
7pub const assembly = @import("builtin/assembly.zig");
48
59/// `explicit_subsystem` is missing when the subsystem is automatically detected,
610/// so Zig standard library has the subsystem detection logic here. This should generally be
......@@ -1102,6 +1106,3 @@ pub noinline fn returnError() void {
11021106 st.instruction_addresses[st.index] = @returnAddress();
11031107 st.index += 1;
11041108}
1105
1106const std = @import("std.zig");
1107const 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
......@@ -235,8 +235,7 @@ fn Sha2x32(comptime iv: Iv32, digest_bits: comptime_int) type {
235235 : [_] "0" (x),
236236 [_] "1" (y),
237237 [w] "w" (w),
238 : "v0"
239 );
238 : .{ .v0 = true });
240239 }
241240
242241 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 {
785785 "flushw"
786786 else
787787 "ta 3" // ST_FLUSH_WINDOWS
788 ::: "memory");
788 ::: .{ .memory = true });
789789 }
790790
791791 return StackIterator{
lib/std/debug/SelfInfo.zig+1-2
......@@ -1547,8 +1547,7 @@ pub inline fn stripInstructionPtrAuthCode(ptr: usize) usize {
15471547 \\mov x30, x16
15481548 : [ret] "={x15}" (-> usize),
15491549 : [ptr] "{x15}" (ptr),
1550 : "x16"
1551 );
1550 : .{ .x16 = true });
15521551 }
15531552
15541553 return ptr;
lib/std/mem.zig+1-2
......@@ -4497,8 +4497,7 @@ pub fn doNotOptimizeAway(val: anytype) void {
44974497 asm volatile (""
44984498 :
44994499 : [val] "m" (val),
4500 : "memory"
4501 );
4500 : .{ .memory = true });
45024501 }
45034502 },
45044503 .array => {
lib/std/os/linux/aarch64.zig+9-18
......@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {
1818 return asm volatile ("svc #0"
1919 : [ret] "={x0}" (-> usize),
2020 : [number] "{x8}" (@intFromEnum(number)),
21 : "memory", "cc"
22 );
21 : .{ .memory = true });
2322}
2423
2524pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2726 : [ret] "={x0}" (-> usize),
2827 : [number] "{x8}" (@intFromEnum(number)),
2928 [arg1] "{x0}" (arg1),
30 : "memory", "cc"
31 );
29 : .{ .memory = true });
3230}
3331
3432pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -37,8 +35,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3735 : [number] "{x8}" (@intFromEnum(number)),
3836 [arg1] "{x0}" (arg1),
3937 [arg2] "{x1}" (arg2),
40 : "memory", "cc"
41 );
38 : .{ .memory = true });
4239}
4340
4441pub 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 {
4845 [arg1] "{x0}" (arg1),
4946 [arg2] "{x1}" (arg2),
5047 [arg3] "{x2}" (arg3),
51 : "memory", "cc"
52 );
48 : .{ .memory = true });
5349}
5450
5551pub 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)
6056 [arg2] "{x1}" (arg2),
6157 [arg3] "{x2}" (arg3),
6258 [arg4] "{x3}" (arg4),
63 : "memory", "cc"
64 );
59 : .{ .memory = true });
6560}
6661
6762pub 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,
7368 [arg3] "{x2}" (arg3),
7469 [arg4] "{x3}" (arg4),
7570 [arg5] "{x4}" (arg5),
76 : "memory", "cc"
77 );
71 : .{ .memory = true });
7872}
7973
8074pub fn syscall6(
......@@ -95,8 +89,7 @@ pub fn syscall6(
9589 [arg4] "{x3}" (arg4),
9690 [arg5] "{x4}" (arg5),
9791 [arg6] "{x5}" (arg6),
98 : "memory", "cc"
99 );
92 : .{ .memory = true });
10093}
10194
10295pub fn clone() callconv(.naked) usize {
......@@ -148,14 +141,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
148141 \\ svc #0
149142 :
150143 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
151 : "memory", "cc"
152 ),
144 : .{ .memory = true }),
153145 else => asm volatile (
154146 \\ svc #0
155147 :
156148 : [number] "{x8}" (@intFromEnum(SYS.rt_sigreturn)),
157 : "memory", "cc"
158 ),
149 : .{ .memory = true }),
159150 }
160151}
161152
lib/std/os/linux/arm.zig+11-22
......@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
1717 return asm volatile ("svc #0"
1818 : [ret] "={r0}" (-> usize),
1919 : [number] "{r7}" (@intFromEnum(number)),
20 : "memory"
21 );
20 : .{ .memory = true });
2221}
2322
2423pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2625 : [ret] "={r0}" (-> usize),
2726 : [number] "{r7}" (@intFromEnum(number)),
2827 [arg1] "{r0}" (arg1),
29 : "memory"
30 );
28 : .{ .memory = true });
3129}
3230
3331pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3634 : [number] "{r7}" (@intFromEnum(number)),
3735 [arg1] "{r0}" (arg1),
3836 [arg2] "{r1}" (arg2),
39 : "memory"
40 );
37 : .{ .memory = true });
4138}
4239
4340pub 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 {
4744 [arg1] "{r0}" (arg1),
4845 [arg2] "{r1}" (arg2),
4946 [arg3] "{r2}" (arg3),
50 : "memory"
51 );
47 : .{ .memory = true });
5248}
5349
5450pub 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)
5955 [arg2] "{r1}" (arg2),
6056 [arg3] "{r2}" (arg3),
6157 [arg4] "{r3}" (arg4),
62 : "memory"
63 );
58 : .{ .memory = true });
6459}
6560
6661pub 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,
7267 [arg3] "{r2}" (arg3),
7368 [arg4] "{r3}" (arg4),
7469 [arg5] "{r4}" (arg5),
75 : "memory"
76 );
70 : .{ .memory = true });
7771}
7872
7973pub fn syscall6(
......@@ -94,8 +88,7 @@ pub fn syscall6(
9488 [arg4] "{r3}" (arg4),
9589 [arg5] "{r4}" (arg5),
9690 [arg6] "{r5}" (arg6),
97 : "memory"
98 );
91 : .{ .memory = true });
9992}
10093
10194pub fn clone() callconv(.naked) usize {
......@@ -141,14 +134,12 @@ pub fn restore() callconv(.naked) noreturn {
141134 \\ svc #0
142135 :
143136 : [number] "I" (@intFromEnum(SYS.sigreturn)),
144 : "memory"
145 ),
137 : .{ .memory = true }),
146138 else => asm volatile (
147139 \\ svc #0
148140 :
149141 : [number] "{r7}" (@intFromEnum(SYS.sigreturn)),
150 : "memory"
151 ),
142 : .{ .memory = true }),
152143 }
153144}
154145
......@@ -159,14 +150,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
159150 \\ svc #0
160151 :
161152 : [number] "I" (@intFromEnum(SYS.rt_sigreturn)),
162 : "memory"
163 ),
153 : .{ .memory = true }),
164154 else => asm volatile (
165155 \\ svc #0
166156 :
167157 : [number] "{r7}" (@intFromEnum(SYS.rt_sigreturn)),
168 : "memory"
169 ),
158 : .{ .memory = true }),
170159 }
171160}
172161
lib/std/os/linux/hexagon.zig+8-16
......@@ -15,8 +15,7 @@ pub fn syscall0(number: SYS) usize {
1515 return asm volatile ("trap0(#1)"
1616 : [ret] "={r0}" (-> usize),
1717 : [number] "{r6}" (@intFromEnum(number)),
18 : "memory"
19 );
18 : .{ .memory = true });
2019}
2120
2221pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -24,8 +23,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2423 : [ret] "={r0}" (-> usize),
2524 : [number] "{r6}" (@intFromEnum(number)),
2625 [arg1] "{r0}" (arg1),
27 : "memory"
28 );
26 : .{ .memory = true });
2927}
3028
3129pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -34,8 +32,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3432 : [number] "{r6}" (@intFromEnum(number)),
3533 [arg1] "{r0}" (arg1),
3634 [arg2] "{r1}" (arg2),
37 : "memory"
38 );
35 : .{ .memory = true });
3936}
4037
4138pub 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 {
4542 [arg1] "{r0}" (arg1),
4643 [arg2] "{r1}" (arg2),
4744 [arg3] "{r2}" (arg3),
48 : "memory"
49 );
45 : .{ .memory = true });
5046}
5147
5248pub 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)
5753 [arg2] "{r1}" (arg2),
5854 [arg3] "{r2}" (arg3),
5955 [arg4] "{r3}" (arg4),
60 : "memory"
61 );
56 : .{ .memory = true });
6257}
6358
6459pub 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,
7065 [arg3] "{r2}" (arg3),
7166 [arg4] "{r3}" (arg4),
7267 [arg5] "{r4}" (arg5),
73 : "memory"
74 );
68 : .{ .memory = true });
7569}
7670
7771pub fn syscall6(
......@@ -92,8 +86,7 @@ pub fn syscall6(
9286 [arg4] "{r3}" (arg4),
9387 [arg5] "{r4}" (arg5),
9488 [arg6] "{r5}" (arg6),
95 : "memory"
96 );
89 : .{ .memory = true });
9790}
9891
9992pub fn clone() callconv(.naked) usize {
......@@ -142,8 +135,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
142135 \\ trap0(#0)
143136 :
144137 : [number] "{r6}" (@intFromEnum(SYS.rt_sigreturn)),
145 : "memory"
146 );
138 : .{ .memory = true });
147139}
148140
149141pub const F = struct {
lib/std/os/linux/loongarch64.zig+8-16
......@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
1717 \\ syscall 0
1818 : [ret] "={$r4}" (-> usize),
1919 : [number] "{$r11}" (@intFromEnum(number)),
20 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
21 );
20 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
2221}
2322
2423pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2726 : [ret] "={$r4}" (-> usize),
2827 : [number] "{$r11}" (@intFromEnum(number)),
2928 [arg1] "{$r4}" (arg1),
30 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
31 );
29 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
3230}
3331
3432pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -38,8 +36,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3836 : [number] "{$r11}" (@intFromEnum(number)),
3937 [arg1] "{$r4}" (arg1),
4038 [arg2] "{$r5}" (arg2),
41 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
42 );
39 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
4340}
4441
4542pub 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 {
5047 [arg1] "{$r4}" (arg1),
5148 [arg2] "{$r5}" (arg2),
5249 [arg3] "{$r6}" (arg3),
53 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
54 );
50 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
5551}
5652
5753pub 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)
6359 [arg2] "{$r5}" (arg2),
6460 [arg3] "{$r6}" (arg3),
6561 [arg4] "{$r7}" (arg4),
66 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
67 );
62 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
6863}
6964
7065pub 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,
7772 [arg3] "{$r6}" (arg3),
7873 [arg4] "{$r7}" (arg4),
7974 [arg5] "{$r8}" (arg5),
80 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
81 );
75 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
8276}
8377
8478pub fn syscall6(
......@@ -100,8 +94,7 @@ pub fn syscall6(
10094 [arg4] "{$r7}" (arg4),
10195 [arg5] "{$r8}" (arg5),
10296 [arg6] "{$r9}" (arg6),
103 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
104 );
97 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
10598}
10699
107100pub fn clone() callconv(.naked) usize {
......@@ -150,8 +143,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
150143 \\ syscall 0
151144 :
152145 : [number] "r" (@intFromEnum(SYS.rt_sigreturn)),
153 : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
154 );
146 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
155147}
156148
157149pub const msghdr = extern struct {
lib/std/os/linux/m68k.zig+8-16
......@@ -15,8 +15,7 @@ pub fn syscall0(number: SYS) usize {
1515 return asm volatile ("trap #0"
1616 : [ret] "={d0}" (-> usize),
1717 : [number] "{d0}" (@intFromEnum(number)),
18 : "memory"
19 );
18 : .{ .memory = true });
2019}
2120
2221pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -24,8 +23,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2423 : [ret] "={d0}" (-> usize),
2524 : [number] "{d0}" (@intFromEnum(number)),
2625 [arg1] "{d1}" (arg1),
27 : "memory"
28 );
26 : .{ .memory = true });
2927}
3028
3129pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -34,8 +32,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3432 : [number] "{d0}" (@intFromEnum(number)),
3533 [arg1] "{d1}" (arg1),
3634 [arg2] "{d2}" (arg2),
37 : "memory"
38 );
35 : .{ .memory = true });
3936}
4037
4138pub 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 {
4542 [arg1] "{d1}" (arg1),
4643 [arg2] "{d2}" (arg2),
4744 [arg3] "{d3}" (arg3),
48 : "memory"
49 );
45 : .{ .memory = true });
5046}
5147
5248pub 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)
5753 [arg2] "{d2}" (arg2),
5854 [arg3] "{d3}" (arg3),
5955 [arg4] "{d4}" (arg4),
60 : "memory"
61 );
56 : .{ .memory = true });
6257}
6358
6459pub 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,
7065 [arg3] "{d3}" (arg3),
7166 [arg4] "{d4}" (arg4),
7267 [arg5] "{d5}" (arg5),
73 : "memory"
74 );
68 : .{ .memory = true });
7569}
7670
7771pub fn syscall6(
......@@ -92,8 +86,7 @@ pub fn syscall6(
9286 [arg4] "{d4}" (arg4),
9387 [arg5] "{d5}" (arg5),
9488 [arg6] "{a0}" (arg6),
95 : "memory"
96 );
89 : .{ .memory = true });
9790}
9891
9992pub fn clone() callconv(.naked) usize {
......@@ -155,8 +148,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
155148 asm volatile ("trap #0"
156149 :
157150 : [number] "{d0}" (@intFromEnum(SYS.rt_sigreturn)),
158 : "memory"
159 );
151 : .{ .memory = true });
160152}
161153
162154pub const F = struct {
lib/std/os/linux/mips.zig+11-22
......@@ -21,8 +21,7 @@ pub fn syscall0(number: SYS) usize {
2121 \\ 1:
2222 : [ret] "={$2}" (-> usize),
2323 : [number] "{$2}" (@intFromEnum(number)),
24 : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
25 );
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 });
2625}
2726
2827pub fn syscall_pipe(fd: *[2]i32) usize {
......@@ -41,8 +40,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
4140 : [ret] "={$2}" (-> usize),
4241 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
4342 [fd] "{$4}" (fd),
44 : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
45 );
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 });
4644}
4745
4846pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -55,8 +53,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
5553 : [ret] "={$2}" (-> usize),
5654 : [number] "{$2}" (@intFromEnum(number)),
5755 [arg1] "{$4}" (arg1),
58 : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
59 );
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 });
6057}
6158
6259pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -70,8 +67,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
7067 : [number] "{$2}" (@intFromEnum(number)),
7168 [arg1] "{$4}" (arg1),
7269 [arg2] "{$5}" (arg2),
73 : "$1", "$3", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
74 );
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 });
7571}
7672
7773pub 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 {
8682 [arg1] "{$4}" (arg1),
8783 [arg2] "{$5}" (arg2),
8884 [arg3] "{$6}" (arg3),
89 : "$1", "$3", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
90 );
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 });
9186}
9287
9388pub 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)
10398 [arg2] "{$5}" (arg2),
10499 [arg3] "{$6}" (arg3),
105100 [arg4] "{$7}" (arg4),
106 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
107 );
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 });
108102}
109103
110104pub 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,
125119 [arg3] "{$6}" (arg3),
126120 [arg4] "{$7}" (arg4),
127121 [arg5] "r" (arg5),
128 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
129 );
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 });
130123}
131124
132125// NOTE: The o32 calling convention requires the callee to reserve 16 bytes for
......@@ -160,8 +153,7 @@ pub fn syscall6(
160153 [arg4] "{$7}" (arg4),
161154 [arg5] "r" (arg5),
162155 [arg6] "r" (arg6),
163 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
164 );
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 });
165157}
166158
167159pub fn syscall7(
......@@ -195,8 +187,7 @@ pub fn syscall7(
195187 [arg5] "r" (arg5),
196188 [arg6] "r" (arg6),
197189 [arg7] "r" (arg7),
198 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
199 );
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 });
200191}
201192
202193pub fn clone() callconv(.naked) usize {
......@@ -255,8 +246,7 @@ pub fn restore() callconv(.naked) noreturn {
255246 \\ syscall
256247 :
257248 : [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"
259 );
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 });
260250}
261251
262252pub fn restore_rt() callconv(.naked) noreturn {
......@@ -264,8 +254,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
264254 \\ syscall
265255 :
266256 : [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"
268 );
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 });
269258}
270259
271260pub const F = struct {
lib/std/os/linux/mips64.zig+11-22
......@@ -21,8 +21,7 @@ pub fn syscall0(number: SYS) usize {
2121 \\ 1:
2222 : [ret] "={$2}" (-> usize),
2323 : [number] "{$2}" (@intFromEnum(number)),
24 : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
25 );
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 });
2625}
2726
2827pub fn syscall_pipe(fd: *[2]i32) usize {
......@@ -41,8 +40,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
4140 : [ret] "={$2}" (-> usize),
4241 : [number] "{$2}" (@intFromEnum(SYS.pipe)),
4342 [fd] "{$4}" (fd),
44 : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
45 );
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 });
4644}
4745
4846pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -56,8 +54,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
5654 : [ret] "={$2}" (-> usize),
5755 : [number] "{$2}" (@intFromEnum(number)),
5856 [arg1] "{$4}" (arg1),
59 : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
60 );
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 });
6158}
6259
6360pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -71,8 +68,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
7168 : [number] "{$2}" (@intFromEnum(number)),
7269 [arg1] "{$4}" (arg1),
7370 [arg2] "{$5}" (arg2),
74 : "$1", "$3", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
75 );
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 });
7672}
7773
7874pub 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 {
8783 [arg1] "{$4}" (arg1),
8884 [arg2] "{$5}" (arg2),
8985 [arg3] "{$6}" (arg3),
90 : "$1", "$3", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
91 );
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 });
9287}
9388
9489pub 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)
10499 [arg2] "{$5}" (arg2),
105100 [arg3] "{$6}" (arg3),
106101 [arg4] "{$7}" (arg4),
107 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
108 );
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 });
109103}
110104
111105pub 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,
122116 [arg3] "{$6}" (arg3),
123117 [arg4] "{$7}" (arg4),
124118 [arg5] "{$8}" (arg5),
125 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
126 );
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 });
127120}
128121
129122pub fn syscall6(
......@@ -149,8 +142,7 @@ pub fn syscall6(
149142 [arg4] "{$7}" (arg4),
150143 [arg5] "{$8}" (arg5),
151144 [arg6] "{$9}" (arg6),
152 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
153 );
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 });
154146}
155147
156148pub fn syscall7(
......@@ -178,8 +170,7 @@ pub fn syscall7(
178170 [arg5] "{$8}" (arg5),
179171 [arg6] "{$9}" (arg6),
180172 [arg7] "{$10}" (arg7),
181 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
182 );
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 });
183174}
184175
185176pub fn clone() callconv(.naked) usize {
......@@ -234,8 +225,7 @@ pub fn restore() callconv(.naked) noreturn {
234225 \\ syscall
235226 :
236227 : [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"
238 );
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 });
239229}
240230
241231pub fn restore_rt() callconv(.naked) noreturn {
......@@ -243,8 +233,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
243233 \\ syscall
244234 :
245235 : [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"
247 );
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 });
248237}
249238
250239pub const F = struct {
lib/std/os/linux/powerpc.zig+8-16
......@@ -22,8 +22,7 @@ pub fn syscall0(number: SYS) usize {
2222 \\ 1:
2323 : [ret] "={r3}" (-> usize),
2424 : [number] "{r0}" (@intFromEnum(number)),
25 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
26 );
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 });
2726}
2827
2928pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -35,8 +34,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
3534 : [ret] "={r3}" (-> usize),
3635 : [number] "{r0}" (@intFromEnum(number)),
3736 [arg1] "{r3}" (arg1),
38 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
39 );
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 });
4038}
4139
4240pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -49,8 +47,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
4947 : [number] "{r0}" (@intFromEnum(number)),
5048 [arg1] "{r3}" (arg1),
5149 [arg2] "{r4}" (arg2),
52 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
53 );
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 });
5451}
5552
5653pub 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 {
6461 [arg1] "{r3}" (arg1),
6562 [arg2] "{r4}" (arg2),
6663 [arg3] "{r5}" (arg3),
67 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
68 );
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 });
6965}
7066
7167pub 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)
8076 [arg2] "{r4}" (arg2),
8177 [arg3] "{r5}" (arg3),
8278 [arg4] "{r6}" (arg4),
83 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
84 );
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 });
8580}
8681
8782pub 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,
9792 [arg3] "{r5}" (arg3),
9893 [arg4] "{r6}" (arg4),
9994 [arg5] "{r7}" (arg5),
100 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
101 );
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 });
10296}
10397
10498pub fn syscall6(
......@@ -123,8 +117,7 @@ pub fn syscall6(
123117 [arg4] "{r6}" (arg4),
124118 [arg5] "{r7}" (arg5),
125119 [arg6] "{r8}" (arg6),
126 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
127 );
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 });
128121}
129122
130123pub fn clone() callconv(.naked) usize {
......@@ -204,8 +197,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
204197 \\ sc
205198 :
206199 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
207 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
208 );
200 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
209201}
210202
211203pub const F = struct {
lib/std/os/linux/powerpc64.zig+8-16
......@@ -22,8 +22,7 @@ pub fn syscall0(number: SYS) usize {
2222 \\ 1:
2323 : [ret] "={r3}" (-> usize),
2424 : [number] "{r0}" (@intFromEnum(number)),
25 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
26 );
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 });
2726}
2827
2928pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -35,8 +34,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
3534 : [ret] "={r3}" (-> usize),
3635 : [number] "{r0}" (@intFromEnum(number)),
3736 [arg1] "{r3}" (arg1),
38 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
39 );
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 });
4038}
4139
4240pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -49,8 +47,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
4947 : [number] "{r0}" (@intFromEnum(number)),
5048 [arg1] "{r3}" (arg1),
5149 [arg2] "{r4}" (arg2),
52 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
53 );
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 });
5451}
5552
5653pub 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 {
6461 [arg1] "{r3}" (arg1),
6562 [arg2] "{r4}" (arg2),
6663 [arg3] "{r5}" (arg3),
67 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
68 );
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 });
6965}
7066
7167pub 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)
8076 [arg2] "{r4}" (arg2),
8177 [arg3] "{r5}" (arg3),
8278 [arg4] "{r6}" (arg4),
83 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
84 );
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 });
8580}
8681
8782pub 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,
9792 [arg3] "{r5}" (arg3),
9893 [arg4] "{r6}" (arg4),
9994 [arg5] "{r7}" (arg5),
100 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
101 );
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 });
10296}
10397
10498pub fn syscall6(
......@@ -123,8 +117,7 @@ pub fn syscall6(
123117 [arg4] "{r6}" (arg4),
124118 [arg5] "{r7}" (arg5),
125119 [arg6] "{r8}" (arg6),
126 : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
127 );
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 });
128121}
129122
130123pub fn clone() callconv(.naked) usize {
......@@ -189,8 +182,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
189182 \\ sc
190183 :
191184 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
192 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
193 );
185 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
194186}
195187
196188pub const F = struct {
lib/std/os/linux/riscv32.zig+8-16
......@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
1717 return asm volatile ("ecall"
1818 : [ret] "={x10}" (-> usize),
1919 : [number] "{x17}" (@intFromEnum(number)),
20 : "memory"
21 );
20 : .{ .memory = true });
2221}
2322
2423pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2625 : [ret] "={x10}" (-> usize),
2726 : [number] "{x17}" (@intFromEnum(number)),
2827 [arg1] "{x10}" (arg1),
29 : "memory"
30 );
28 : .{ .memory = true });
3129}
3230
3331pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3634 : [number] "{x17}" (@intFromEnum(number)),
3735 [arg1] "{x10}" (arg1),
3836 [arg2] "{x11}" (arg2),
39 : "memory"
40 );
37 : .{ .memory = true });
4138}
4239
4340pub 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 {
4744 [arg1] "{x10}" (arg1),
4845 [arg2] "{x11}" (arg2),
4946 [arg3] "{x12}" (arg3),
50 : "memory"
51 );
47 : .{ .memory = true });
5248}
5349
5450pub 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)
5955 [arg2] "{x11}" (arg2),
6056 [arg3] "{x12}" (arg3),
6157 [arg4] "{x13}" (arg4),
62 : "memory"
63 );
58 : .{ .memory = true });
6459}
6560
6661pub 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,
7267 [arg3] "{x12}" (arg3),
7368 [arg4] "{x13}" (arg4),
7469 [arg5] "{x14}" (arg5),
75 : "memory"
76 );
70 : .{ .memory = true });
7771}
7872
7973pub fn syscall6(
......@@ -94,8 +88,7 @@ pub fn syscall6(
9488 [arg4] "{x13}" (arg4),
9589 [arg5] "{x14}" (arg5),
9690 [arg6] "{x15}" (arg6),
97 : "memory"
98 );
91 : .{ .memory = true });
9992}
10093
10194pub fn clone() callconv(.naked) usize {
......@@ -149,8 +142,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
149142 \\ ecall
150143 :
151144 : [number] "{x17}" (@intFromEnum(SYS.rt_sigreturn)),
152 : "memory"
153 );
145 : .{ .memory = true });
154146}
155147
156148pub const F = struct {
lib/std/os/linux/riscv64.zig+8-16
......@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
1717 return asm volatile ("ecall"
1818 : [ret] "={x10}" (-> usize),
1919 : [number] "{x17}" (@intFromEnum(number)),
20 : "memory"
21 );
20 : .{ .memory = true });
2221}
2322
2423pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2625 : [ret] "={x10}" (-> usize),
2726 : [number] "{x17}" (@intFromEnum(number)),
2827 [arg1] "{x10}" (arg1),
29 : "memory"
30 );
28 : .{ .memory = true });
3129}
3230
3331pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3634 : [number] "{x17}" (@intFromEnum(number)),
3735 [arg1] "{x10}" (arg1),
3836 [arg2] "{x11}" (arg2),
39 : "memory"
40 );
37 : .{ .memory = true });
4138}
4239
4340pub 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 {
4744 [arg1] "{x10}" (arg1),
4845 [arg2] "{x11}" (arg2),
4946 [arg3] "{x12}" (arg3),
50 : "memory"
51 );
47 : .{ .memory = true });
5248}
5349
5450pub 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)
5955 [arg2] "{x11}" (arg2),
6056 [arg3] "{x12}" (arg3),
6157 [arg4] "{x13}" (arg4),
62 : "memory"
63 );
58 : .{ .memory = true });
6459}
6560
6661pub 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,
7267 [arg3] "{x12}" (arg3),
7368 [arg4] "{x13}" (arg4),
7469 [arg5] "{x14}" (arg5),
75 : "memory"
76 );
70 : .{ .memory = true });
7771}
7872
7973pub fn syscall6(
......@@ -94,8 +88,7 @@ pub fn syscall6(
9488 [arg4] "{x13}" (arg4),
9589 [arg5] "{x14}" (arg5),
9690 [arg6] "{x15}" (arg6),
97 : "memory"
98 );
91 : .{ .memory = true });
9992}
10093
10194pub fn clone() callconv(.naked) usize {
......@@ -149,8 +142,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
149142 \\ ecall
150143 :
151144 : [number] "{x17}" (@intFromEnum(SYS.rt_sigreturn)),
152 : "memory"
153 );
145 : .{ .memory = true });
154146}
155147
156148pub const F = struct {
lib/std/os/linux/s390x.zig+8-16
......@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
1717 return asm volatile ("svc 0"
1818 : [ret] "={r2}" (-> usize),
1919 : [number] "{r1}" (@intFromEnum(number)),
20 : "memory"
21 );
20 : .{ .memory = true });
2221}
2322
2423pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2625 : [ret] "={r2}" (-> usize),
2726 : [number] "{r1}" (@intFromEnum(number)),
2827 [arg1] "{r2}" (arg1),
29 : "memory"
30 );
28 : .{ .memory = true });
3129}
3230
3331pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3634 : [number] "{r1}" (@intFromEnum(number)),
3735 [arg1] "{r2}" (arg1),
3836 [arg2] "{r3}" (arg2),
39 : "memory"
40 );
37 : .{ .memory = true });
4138}
4239
4340pub 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 {
4744 [arg1] "{r2}" (arg1),
4845 [arg2] "{r3}" (arg2),
4946 [arg3] "{r4}" (arg3),
50 : "memory"
51 );
47 : .{ .memory = true });
5248}
5349
5450pub 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)
5955 [arg2] "{r3}" (arg2),
6056 [arg3] "{r4}" (arg3),
6157 [arg4] "{r5}" (arg4),
62 : "memory"
63 );
58 : .{ .memory = true });
6459}
6560
6661pub 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,
7267 [arg3] "{r4}" (arg3),
7368 [arg4] "{r5}" (arg4),
7469 [arg5] "{r6}" (arg5),
75 : "memory"
76 );
70 : .{ .memory = true });
7771}
7872
7973pub 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,
8680 [arg4] "{r5}" (arg4),
8781 [arg5] "{r6}" (arg5),
8882 [arg6] "{r7}" (arg6),
89 : "memory"
90 );
83 : .{ .memory = true });
9184}
9285
9386pub fn clone() callconv(.naked) usize {
......@@ -161,8 +154,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
161154 \\svc 0
162155 :
163156 : [number] "{r1}" (@intFromEnum(SYS.rt_sigreturn)),
164 : "memory"
165 );
157 : .{ .memory = true });
166158}
167159
168160pub const F = struct {
lib/std/os/linux/sparc64.zig+10-20
......@@ -32,8 +32,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
3232 : [ret] "={o0}" (-> usize),
3333 : [number] "{g1}" (@intFromEnum(SYS.pipe)),
3434 [arg] "r" (fd),
35 : "memory", "g3"
36 );
35 : .{ .memory = true, .g3 = true });
3736}
3837
3938pub fn syscall_fork() usize {
......@@ -55,8 +54,7 @@ pub fn syscall_fork() usize {
5554 \\ 2:
5655 : [ret] "={o0}" (-> usize),
5756 : [number] "{g1}" (@intFromEnum(SYS.fork)),
58 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
59 );
57 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
6058}
6159
6260pub fn syscall0(number: SYS) usize {
......@@ -68,8 +66,7 @@ pub fn syscall0(number: SYS) usize {
6866 \\ 1:
6967 : [ret] "={o0}" (-> usize),
7068 : [number] "{g1}" (@intFromEnum(number)),
71 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
72 );
69 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
7370}
7471
7572pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -82,8 +79,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
8279 : [ret] "={o0}" (-> usize),
8380 : [number] "{g1}" (@intFromEnum(number)),
8481 [arg1] "{o0}" (arg1),
85 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
86 );
82 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
8783}
8884
8985pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -97,8 +93,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
9793 : [number] "{g1}" (@intFromEnum(number)),
9894 [arg1] "{o0}" (arg1),
9995 [arg2] "{o1}" (arg2),
100 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
101 );
96 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
10297}
10398
10499pub 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 {
113108 [arg1] "{o0}" (arg1),
114109 [arg2] "{o1}" (arg2),
115110 [arg3] "{o2}" (arg3),
116 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
117 );
111 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
118112}
119113
120114pub 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)
130124 [arg2] "{o1}" (arg2),
131125 [arg3] "{o2}" (arg3),
132126 [arg4] "{o3}" (arg4),
133 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
134 );
127 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
135128}
136129
137130pub 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,
148141 [arg3] "{o2}" (arg3),
149142 [arg4] "{o3}" (arg4),
150143 [arg5] "{o4}" (arg5),
151 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
152 );
144 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
153145}
154146
155147pub fn syscall6(
......@@ -175,8 +167,7 @@ pub fn syscall6(
175167 [arg4] "{o3}" (arg4),
176168 [arg5] "{o4}" (arg5),
177169 [arg6] "{o5}" (arg6),
178 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
179 );
170 : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
180171}
181172
182173pub fn clone() callconv(.naked) usize {
......@@ -242,8 +233,7 @@ pub fn restore_rt() callconv(.c) void {
242233 return asm volatile ("t 0x6d"
243234 :
244235 : [number] "{g1}" (@intFromEnum(SYS.rt_sigreturn)),
245 : "memory", "xcc", "o0", "o1", "o2", "o3", "o4", "o5", "o7"
246 );
236 : .{ .memory = true, .xcc = true, .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
247237}
248238
249239pub const F = struct {
lib/std/os/linux/thumb.zig+8-16
......@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {
1818 \\ ldr r7, [%[tmp], #4]
1919 : [ret] "={r0}" (-> usize),
2020 : [tmp] "{r1}" (&buf),
21 : "memory"
22 );
21 : .{ .memory = true });
2322}
2423
2524pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -34,8 +33,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
3433 : [ret] "={r0}" (-> usize),
3534 : [tmp] "{r1}" (&buf),
3635 [arg1] "{r0}" (arg1),
37 : "memory"
38 );
36 : .{ .memory = true });
3937}
4038
4139pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -51,8 +49,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
5149 : [tmp] "{r2}" (&buf),
5250 [arg1] "{r0}" (arg1),
5351 [arg2] "{r1}" (arg2),
54 : "memory"
55 );
52 : .{ .memory = true });
5653}
5754
5855pub 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 {
6966 [arg1] "{r0}" (arg1),
7067 [arg2] "{r1}" (arg2),
7168 [arg3] "{r2}" (arg3),
72 : "memory"
73 );
69 : .{ .memory = true });
7470}
7571
7672pub 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)
8884 [arg2] "{r1}" (arg2),
8985 [arg3] "{r2}" (arg3),
9086 [arg4] "{r3}" (arg4),
91 : "memory"
92 );
87 : .{ .memory = true });
9388}
9489
9590pub 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,
108103 [arg3] "{r2}" (arg3),
109104 [arg4] "{r3}" (arg4),
110105 [arg5] "{r4}" (arg5),
111 : "memory"
112 );
106 : .{ .memory = true });
113107}
114108
115109pub fn syscall6(
......@@ -137,8 +131,7 @@ pub fn syscall6(
137131 [arg4] "{r3}" (arg4),
138132 [arg5] "{r4}" (arg5),
139133 [arg6] "{r5}" (arg6),
140 : "memory"
141 );
134 : .{ .memory = true });
142135}
143136
144137pub const clone = @import("arm.zig").clone;
......@@ -158,6 +151,5 @@ pub fn restore_rt() callconv(.naked) noreturn {
158151 \\ svc #0
159152 :
160153 : [number] "I" (@intFromEnum(SYS.rt_sigreturn)),
161 : "memory"
162 );
154 : .{ .memory = true });
163155}
lib/std/os/linux/tls.zig+1-2
......@@ -308,8 +308,7 @@ pub fn setThreadPointer(addr: usize) void {
308308 \\ sar %%a0, %%r0
309309 :
310310 : [addr] "r" (addr),
311 : "r0"
312 );
311 : .{ .r0 = true });
313312 },
314313 .sparc, .sparc64 => {
315314 asm volatile (
lib/std/os/linux/x86.zig+14-28
......@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {
1818 return asm volatile ("int $0x80"
1919 : [ret] "={eax}" (-> usize),
2020 : [number] "{eax}" (@intFromEnum(number)),
21 : "memory"
22 );
21 : .{ .memory = true });
2322}
2423
2524pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2726 : [ret] "={eax}" (-> usize),
2827 : [number] "{eax}" (@intFromEnum(number)),
2928 [arg1] "{ebx}" (arg1),
30 : "memory"
31 );
29 : .{ .memory = true });
3230}
3331
3432pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -37,8 +35,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3735 : [number] "{eax}" (@intFromEnum(number)),
3836 [arg1] "{ebx}" (arg1),
3937 [arg2] "{ecx}" (arg2),
40 : "memory"
41 );
38 : .{ .memory = true });
4239}
4340
4441pub 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 {
4845 [arg1] "{ebx}" (arg1),
4946 [arg2] "{ecx}" (arg2),
5047 [arg3] "{edx}" (arg3),
51 : "memory"
52 );
48 : .{ .memory = true });
5349}
5450
5551pub 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)
6056 [arg2] "{ecx}" (arg2),
6157 [arg3] "{edx}" (arg3),
6258 [arg4] "{esi}" (arg4),
63 : "memory"
64 );
59 : .{ .memory = true });
6560}
6661
6762pub 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,
7368 [arg3] "{edx}" (arg3),
7469 [arg4] "{esi}" (arg4),
7570 [arg5] "{edi}" (arg5),
76 : "memory"
77 );
71 : .{ .memory = true });
7872}
7973
8074pub fn syscall6(
......@@ -108,8 +102,7 @@ pub fn syscall6(
108102 [arg4] "{esi}" (arg4),
109103 [arg5] "rm" (arg5),
110104 [arg6] "rm" (arg6),
111 : "memory"
112 );
105 : .{ .memory = true });
113106}
114107
115108pub fn socketcall(call: usize, args: [*]const usize) usize {
......@@ -118,8 +111,7 @@ pub fn socketcall(call: usize, args: [*]const usize) usize {
118111 : [number] "{eax}" (@intFromEnum(SYS.socketcall)),
119112 [arg1] "{ebx}" (call),
120113 [arg2] "{ecx}" (@intFromPtr(args)),
121 : "memory"
122 );
114 : .{ .memory = true });
123115}
124116
125117pub fn clone() callconv(.naked) usize {
......@@ -179,14 +171,12 @@ pub fn restore() callconv(.naked) noreturn {
179171 \\ int $0x80
180172 :
181173 : [number] "i" (@intFromEnum(SYS.sigreturn)),
182 : "memory"
183 ),
174 : .{ .memory = true }),
184175 else => asm volatile (
185176 \\ int $0x80
186177 :
187178 : [number] "{eax}" (@intFromEnum(SYS.sigreturn)),
188 : "memory"
189 ),
179 : .{ .memory = true }),
190180 }
191181}
192182
......@@ -197,14 +187,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
197187 \\ int $0x80
198188 :
199189 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
200 : "memory"
201 ),
190 : .{ .memory = true }),
202191 else => asm volatile (
203192 \\ int $0x80
204193 :
205194 : [number] "{eax}" (@intFromEnum(SYS.rt_sigreturn)),
206 : "memory"
207 ),
195 : .{ .memory = true }),
208196 }
209197}
210198
......@@ -442,8 +430,7 @@ pub fn getContextInternal() callconv(.naked) usize {
442430 [sigprocmask] "i" (@intFromEnum(linux.SYS.rt_sigprocmask)),
443431 [sigmask_offset] "i" (@offsetOf(ucontext_t, "sigmask")),
444432 [sigset_size] "i" (linux.NSIG / 8),
445 : "cc", "memory", "eax", "ecx", "edx"
446 );
433 : .{ .cc = true, .memory = true, .eax = true, .ecx = true, .edx = true });
447434}
448435
449436pub inline fn getcontext(context: *ucontext_t) usize {
......@@ -457,6 +444,5 @@ pub inline fn getcontext(context: *ucontext_t) usize {
457444 [_] "={edx}" (clobber_edx),
458445 : [_] "{edx}" (context),
459446 [getContextInternal] "X" (&getContextInternal),
460 : "cc", "memory", "ecx"
461 );
447 : .{ .cc = true, .memory = true, .ecx = true });
462448}
lib/std/os/linux/x86_64.zig+11-22
......@@ -20,8 +20,7 @@ pub fn syscall0(number: SYS) usize {
2020 return asm volatile ("syscall"
2121 : [ret] "={rax}" (-> usize),
2222 : [number] "{rax}" (@intFromEnum(number)),
23 : "rcx", "r11", "memory"
24 );
23 : .{ .rcx = true, .r11 = true, .memory = true });
2524}
2625
2726pub fn syscall1(number: SYS, arg1: usize) usize {
......@@ -29,8 +28,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
2928 : [ret] "={rax}" (-> usize),
3029 : [number] "{rax}" (@intFromEnum(number)),
3130 [arg1] "{rdi}" (arg1),
32 : "rcx", "r11", "memory"
33 );
31 : .{ .rcx = true, .r11 = true, .memory = true });
3432}
3533
3634pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
......@@ -39,8 +37,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3937 : [number] "{rax}" (@intFromEnum(number)),
4038 [arg1] "{rdi}" (arg1),
4139 [arg2] "{rsi}" (arg2),
42 : "rcx", "r11", "memory"
43 );
40 : .{ .rcx = true, .r11 = true, .memory = true });
4441}
4542
4643pub 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 {
5047 [arg1] "{rdi}" (arg1),
5148 [arg2] "{rsi}" (arg2),
5249 [arg3] "{rdx}" (arg3),
53 : "rcx", "r11", "memory"
54 );
50 : .{ .rcx = true, .r11 = true, .memory = true });
5551}
5652
5753pub 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)
6258 [arg2] "{rsi}" (arg2),
6359 [arg3] "{rdx}" (arg3),
6460 [arg4] "{r10}" (arg4),
65 : "rcx", "r11", "memory"
66 );
61 : .{ .rcx = true, .r11 = true, .memory = true });
6762}
6863
6964pub 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,
7570 [arg3] "{rdx}" (arg3),
7671 [arg4] "{r10}" (arg4),
7772 [arg5] "{r8}" (arg5),
78 : "rcx", "r11", "memory"
79 );
73 : .{ .rcx = true, .r11 = true, .memory = true });
8074}
8175
8276pub fn syscall6(
......@@ -97,8 +91,7 @@ pub fn syscall6(
9791 [arg4] "{r10}" (arg4),
9892 [arg5] "{r8}" (arg5),
9993 [arg6] "{r9}" (arg6),
100 : "rcx", "r11", "memory"
101 );
94 : .{ .rcx = true, .r11 = true, .memory = true });
10295}
10396
10497pub fn clone() callconv(.naked) usize {
......@@ -144,14 +137,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
144137 \\ syscall
145138 :
146139 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
147 : "rcx", "r11", "memory"
148 ),
140 : .{ .rcx = true, .r11 = true, .memory = true }),
149141 else => asm volatile (
150142 \\ syscall
151143 :
152144 : [number] "{rax}" (@intFromEnum(SYS.rt_sigreturn)),
153 : "rcx", "r11", "memory"
154 ),
145 : .{ .rcx = true, .r11 = true, .memory = true }),
155146 }
156147}
157148
......@@ -440,8 +431,7 @@ fn getContextInternal() callconv(.naked) usize {
440431 [sigprocmask] "i" (@intFromEnum(linux.SYS.rt_sigprocmask)),
441432 [sigmask_offset] "i" (@offsetOf(ucontext_t, "sigmask")),
442433 [sigset_size] "i" (@sizeOf(sigset_t)),
443 : "cc", "memory", "rax", "rcx", "rdx", "rdi", "rsi", "r8", "r10", "r11"
444 );
434 : .{ .cc = true, .memory = true, .rax = true, .rcx = true, .rdx = true, .rdi = true, .rsi = true, .r8 = true, .r10 = true, .r11 = true });
445435}
446436
447437pub inline fn getcontext(context: *ucontext_t) usize {
......@@ -455,6 +445,5 @@ pub inline fn getcontext(context: *ucontext_t) usize {
455445 [_] "={rdi}" (clobber_rdi),
456446 : [_] "{rdi}" (context),
457447 [getContextInternal] "X" (&getContextInternal),
458 : "cc", "memory", "rcx", "rdx", "rsi", "r8", "r10", "r11"
459 );
448 : .{ .cc = true, .memory = true, .rcx = true, .rdx = true, .rsi = true, .r8 = true, .r10 = true, .r11 = true });
460449}
lib/std/os/plan9/x86_64.zig+4-8
......@@ -11,8 +11,7 @@ pub fn syscall1(sys: plan9.SYS, arg0: usize) usize {
1111 : [ret] "={rax}" (-> usize),
1212 : [arg0] "{r8}" (arg0),
1313 [syscall_number] "{rbp}" (@intFromEnum(sys)),
14 : "rcx", "rax", "rbp", "r11", "memory"
15 );
14 : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
1615}
1716pub fn syscall2(sys: plan9.SYS, arg0: usize, arg1: usize) usize {
1817 return asm volatile (
......@@ -27,8 +26,7 @@ pub fn syscall2(sys: plan9.SYS, arg0: usize, arg1: usize) usize {
2726 : [arg0] "{r8}" (arg0),
2827 [arg1] "{r9}" (arg1),
2928 [syscall_number] "{rbp}" (@intFromEnum(sys)),
30 : "rcx", "rax", "rbp", "r11", "memory"
31 );
29 : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
3230}
3331pub fn syscall3(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize) usize {
3432 return asm volatile (
......@@ -46,8 +44,7 @@ pub fn syscall3(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize) usize {
4644 [arg1] "{r9}" (arg1),
4745 [arg2] "{r10}" (arg2),
4846 [syscall_number] "{rbp}" (@intFromEnum(sys)),
49 : "rcx", "rax", "rbp", "r11", "memory"
50 );
47 : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
5148}
5249pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usize) usize {
5350 return asm volatile (
......@@ -68,6 +65,5 @@ pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usi
6865 [arg2] "{r10}" (arg2),
6966 [arg3] "{r11}" (arg3),
7067 [syscall_number] "{rbp}" (@intFromEnum(sys)),
71 : "rcx", "rax", "rbp", "r11", "memory"
72 );
68 : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
7369}
lib/std/pie.zig+5-10
......@@ -100,8 +100,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
100100 \\ %[ret] = add(r1, %[ret])
101101 : [ret] "=r" (-> [*]const elf.Dyn),
102102 :
103 : "r1"
104 ),
103 : .{ .r1 = true }),
105104 .loongarch32, .loongarch64 => asm volatile (
106105 \\ .weak _DYNAMIC
107106 \\ .hidden _DYNAMIC
......@@ -127,8 +126,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
127126 \\ addu %[ret], %[ret], $gp
128127 : [ret] "=r" (-> [*]const elf.Dyn),
129128 :
130 : "lr"
131 ),
129 : .{ .lr = true }),
132130 .mips64, .mips64el => asm volatile (
133131 \\ .weak _DYNAMIC
134132 \\ .hidden _DYNAMIC
......@@ -140,8 +138,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
140138 \\ daddu %[ret], %[ret], $gp
141139 : [ret] "=r" (-> [*]const elf.Dyn),
142140 :
143 : "lr"
144 ),
141 : .{ .lr = true }),
145142 .powerpc, .powerpcle => asm volatile (
146143 \\ .weak _DYNAMIC
147144 \\ .hidden _DYNAMIC
......@@ -153,8 +150,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
153150 \\ add %[ret], 4, %[ret]
154151 : [ret] "=r" (-> [*]const elf.Dyn),
155152 :
156 : "lr", "r4"
157 ),
153 : .{ .lr = true, .r4 = true }),
158154 .powerpc64, .powerpc64le => asm volatile (
159155 \\ .weak _DYNAMIC
160156 \\ .hidden _DYNAMIC
......@@ -166,8 +162,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
166162 \\ add %[ret], 4, %[ret]
167163 : [ret] "=r" (-> [*]const elf.Dyn),
168164 :
169 : "lr", "r4"
170 ),
165 : .{ .lr = true, .r4 = true }),
171166 .riscv32, .riscv64 => asm volatile (
172167 \\ .weak _DYNAMIC
173168 \\ .hidden _DYNAMIC
lib/std/start.zig+4-8
......@@ -131,32 +131,28 @@ fn exit2(code: usize) noreturn {
131131 :
132132 : [number] "{rax}" (231),
133133 [arg1] "{rdi}" (code),
134 : "rcx", "r11", "memory"
135 );
134 : .{ .rcx = true, .r11 = true, .memory = true });
136135 },
137136 .arm => {
138137 asm volatile ("svc #0"
139138 :
140139 : [number] "{r7}" (1),
141140 [arg1] "{r0}" (code),
142 : "memory"
143 );
141 : .{ .memory = true });
144142 },
145143 .aarch64 => {
146144 asm volatile ("svc #0"
147145 :
148146 : [number] "{x8}" (93),
149147 [arg1] "{x0}" (code),
150 : "memory", "cc"
151 );
148 : .{ .memory = true });
152149 },
153150 .sparc64 => {
154151 asm volatile ("ta 0x6d"
155152 :
156153 : [number] "{g1}" (1),
157154 [arg1] "{o0}" (code),
158 : "o0", "o1", "o2", "o3", "o4", "o5", "o6", "o7", "memory"
159 );
155 : .{ .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o6 = true, .o7 = true, .memory = true });
160156 },
161157 else => @compileError("TODO"),
162158 },
lib/std/valgrind.zig+10-20
......@@ -17,8 +17,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
1717 : [_] "={r3}" (-> usize),
1818 : [_] "{r4}" (args),
1919 [_] "{r3}" (default),
20 : "cc", "memory"
21 ),
20 : .{ .memory = true }),
2221 .aarch64, .aarch64_be => asm volatile (
2322 \\ ror x12, x12, #3 ; ror x12, x12, #13
2423 \\ ror x12, x12, #51 ; ror x12, x12, #61
......@@ -26,8 +25,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
2625 : [_] "={x3}" (-> usize),
2726 : [_] "{x4}" (args),
2827 [_] "{x3}" (default),
29 : "cc", "memory"
30 ),
28 : .{ .memory = true }),
3129 .mips, .mipsel => asm volatile (
3230 \\ srl $0, $0, 13
3331 \\ srl $0, $0, 29
......@@ -37,8 +35,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
3735 : [_] "={$11}" (-> usize),
3836 : [_] "{$12}" (args),
3937 [_] "{$11}" (default),
40 : "memory"
41 ),
38 : .{ .memory = true }),
4239 .mips64, .mips64el => asm volatile (
4340 \\ dsll $0, $0, 3 ; dsll $0, $0, 13
4441 \\ dsll $0, $0, 29 ; dsll $0, $0, 19
......@@ -46,8 +43,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
4643 : [_] "={$11}" (-> usize),
4744 : [_] "{$12}" (args),
4845 [_] "{$11}" (default),
49 : "memory"
50 ),
46 : .{ .memory = true }),
5147 .powerpc, .powerpcle => asm volatile (
5248 \\ rlwinm 0, 0, 3, 0, 31 ; rlwinm 0, 0, 13, 0, 31
5349 \\ 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:
5551 : [_] "={r3}" (-> usize),
5652 : [_] "{r4}" (args),
5753 [_] "{r3}" (default),
58 : "cc", "memory"
59 ),
54 : .{ .memory = true }),
6055 .powerpc64, .powerpc64le => asm volatile (
6156 \\ rotldi 0, 0, 3 ; rotldi 0, 0, 13
6257 \\ rotldi 0, 0, 61 ; rotldi 0, 0, 51
......@@ -64,8 +59,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
6459 : [_] "={r3}" (-> usize),
6560 : [_] "{r4}" (args),
6661 [_] "{r3}" (default),
67 : "cc", "memory"
68 ),
62 : .{ .memory = true }),
6963 .riscv64 => asm volatile (
7064 \\ .option push
7165 \\ .option norvc
......@@ -78,8 +72,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
7872 : [_] "={a3}" (-> usize),
7973 : [_] "{a4}" (args),
8074 [_] "{a3}" (default),
81 : "cc", "memory"
82 ),
75 : .{ .memory = true }),
8376 .s390x => asm volatile (
8477 \\ lr %%r15, %%r15
8578 \\ lr %%r1, %%r1
......@@ -89,8 +82,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
8982 : [_] "={r3}" (-> usize),
9083 : [_] "{r2}" (args),
9184 [_] "{r3}" (default),
92 : "cc", "memory"
93 ),
85 : .{ .memory = true }),
9486 .x86 => asm volatile (
9587 \\ roll $3, %%edi ; roll $13, %%edi
9688 \\ roll $29, %%edi ; roll $19, %%edi
......@@ -98,8 +90,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
9890 : [_] "={edx}" (-> usize),
9991 : [_] "{eax}" (args),
10092 [_] "{edx}" (default),
101 : "cc", "memory"
102 ),
93 : .{ .memory = true }),
10394 .x86_64 => asm volatile (
10495 \\ rolq $3, %%rdi ; rolq $13, %%rdi
10596 \\ rolq $61, %%rdi ; rolq $51, %%rdi
......@@ -107,8 +98,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
10798 : [_] "={rdx}" (-> usize),
10899 : [_] "{rax}" (args),
109100 [_] "{rdx}" (default),
110 : "cc", "memory"
111 ),
101 : .{ .memory = true }),
112102 else => default,
113103 };
114104}
lib/std/zig.zig+2
......@@ -732,6 +732,7 @@ pub const SimpleComptimeReason = enum(u32) {
732732 generic_call_target,
733733 wasm_memory_index,
734734 work_group_dim_index,
735 clobber,
735736
736737 // Evaluating at comptime because types must be comptime-known.
737738 // Reasons other than `.type` are just more specific messages.
......@@ -812,6 +813,7 @@ pub const SimpleComptimeReason = enum(u32) {
812813 .generic_call_target => "generic function being called must be comptime-known",
813814 .wasm_memory_index => "wasm memory index must be comptime-known",
814815 .work_group_dim_index => "work group dimension index must be comptime-known",
816 .clobber => "clobber must be comptime-known",
815817
816818 .type => "types must be comptime-known",
817819 .array_sentinel => "array sentinel value must be comptime-known",
lib/std/zig/Ast.zig+86-4
......@@ -636,6 +636,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
636636 .@"nosuspend",
637637 .asm_simple,
638638 .@"asm",
639 .asm_legacy,
639640 .array_type,
640641 .array_type_sentinel,
641642 .error_value,
......@@ -1049,6 +1050,11 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
10491050 n = @enumFromInt(tree.extra_data[@intFromEnum(members.end) - 1]); // last parameter
10501051 }
10511052 },
1053 .asm_legacy => {
1054 _, const extra_index = tree.nodeData(n).node_and_extra;
1055 const extra = tree.extraData(extra_index, Node.AsmLegacy);
1056 return extra.rparen + end_offset;
1057 },
10521058 .@"asm" => {
10531059 _, const extra_index = tree.nodeData(n).node_and_extra;
10541060 const extra = tree.extraData(extra_index, Node.Asm);
......@@ -1887,6 +1893,19 @@ pub fn asmSimple(tree: Ast, node: Node.Index) full.Asm {
18871893 .template = template,
18881894 .items = &.{},
18891895 .rparen = rparen,
1896 .clobbers = .none,
1897 });
1898}
1899
1900pub fn asmLegacy(tree: Ast, node: Node.Index) full.AsmLegacy {
1901 const template, const extra_index = tree.nodeData(node).node_and_extra;
1902 const extra = tree.extraData(extra_index, Node.AsmLegacy);
1903 const items = tree.extraDataSlice(.{ .start = extra.items_start, .end = extra.items_end }, Node.Index);
1904 return tree.legacyAsmComponents(.{
1905 .asm_token = tree.nodeMainToken(node),
1906 .template = template,
1907 .items = items,
1908 .rparen = extra.rparen,
18901909 });
18911910}
18921911
......@@ -1898,6 +1917,7 @@ pub fn asmFull(tree: Ast, node: Node.Index) full.Asm {
18981917 .asm_token = tree.nodeMainToken(node),
18991918 .template = template,
19001919 .items = items,
1920 .clobbers = extra.clobbers,
19011921 .rparen = extra.rparen,
19021922 });
19031923}
......@@ -2194,8 +2214,8 @@ fn fullSwitchCaseComponents(tree: Ast, info: full.SwitchCase.Components, node: N
21942214 return result;
21952215}
21962216
2197fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
2198 var result: full.Asm = .{
2217fn legacyAsmComponents(tree: Ast, info: full.AsmLegacy.Components) full.AsmLegacy {
2218 var result: full.AsmLegacy = .{
21992219 .ast = info,
22002220 .volatile_token = null,
22012221 .inputs = &.{},
......@@ -2255,6 +2275,29 @@ fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
22552275 return result;
22562276}
22572277
2278fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
2279 var result: full.Asm = .{
2280 .ast = info,
2281 .volatile_token = null,
2282 .inputs = &.{},
2283 .outputs = &.{},
2284 };
2285 if (tree.tokenTag(info.asm_token + 1) == .keyword_volatile) {
2286 result.volatile_token = info.asm_token + 1;
2287 }
2288 const outputs_end: usize = for (info.items, 0..) |item, i| {
2289 switch (tree.nodeTag(item)) {
2290 .asm_output => continue,
2291 else => break i,
2292 }
2293 } else info.items.len;
2294
2295 result.outputs = info.items[0..outputs_end];
2296 result.inputs = info.items[outputs_end..];
2297
2298 return result;
2299}
2300
22582301fn fullWhileComponents(tree: Ast, info: full.While.Components) full.While {
22592302 var result: full.While = .{
22602303 .ast = info,
......@@ -2449,6 +2492,14 @@ pub fn fullAsm(tree: Ast, node: Node.Index) ?full.Asm {
24492492 };
24502493}
24512494
2495/// To be deleted after 0.15.0 is tagged
2496pub fn legacyAsm(tree: Ast, node: Node.Index) ?full.AsmLegacy {
2497 return switch (tree.nodeTag(node)) {
2498 .asm_legacy => tree.asmLegacy(node),
2499 else => null,
2500 };
2501}
2502
24522503pub fn fullCall(tree: Ast, buffer: *[1]Ast.Node.Index, node: Node.Index) ?full.Call {
24532504 return switch (tree.nodeTag(node)) {
24542505 .call, .call_comma => tree.callFull(node),
......@@ -2829,6 +2880,21 @@ pub const full = struct {
28292880 };
28302881
28312882 pub const Asm = struct {
2883 ast: Components,
2884 volatile_token: ?TokenIndex,
2885 outputs: []const Node.Index,
2886 inputs: []const Node.Index,
2887
2888 pub const Components = struct {
2889 asm_token: TokenIndex,
2890 template: Node.Index,
2891 items: []const Node.Index,
2892 clobbers: Node.OptionalIndex,
2893 rparen: TokenIndex,
2894 };
2895 };
2896
2897 pub const AsmLegacy = struct {
28322898 ast: Components,
28332899 volatile_token: ?TokenIndex,
28342900 first_clobber: ?TokenIndex,
......@@ -3835,15 +3901,22 @@ pub const Node = struct {
38353901 /// Same as `block` except there is known to be a trailing comma before
38363902 /// the final rbrace.
38373903 block_semicolon,
3838 /// `asm(lhs)`.
3904 /// `asm(a)`.
38393905 ///
3840 /// rhs is a `Token.Index` to the `)` token.
38413906 /// The `main_token` field is the `asm` token.
38423907 asm_simple,
38433908 /// `asm(lhs, a)`.
38443909 ///
38453910 /// The `data` field is a `.node_and_extra`:
38463911 /// 1. a `Node.Index` to lhs.
3912 /// 2. a `ExtraIndex` to `AsmLegacy`.
3913 ///
3914 /// The `main_token` field is the `asm` token.
3915 asm_legacy,
3916 /// `asm(a, b)`.
3917 ///
3918 /// The `data` field is a `.node_and_extra`:
3919 /// 1. a `Node.Index` to a.
38473920 /// 2. a `ExtraIndex` to `Asm`.
38483921 ///
38493922 /// The `main_token` field is the `asm` token.
......@@ -4016,9 +4089,18 @@ pub const Node = struct {
40164089 callconv_expr: OptionalIndex,
40174090 };
40184091
4092 /// To be removed after 0.15.0 is tagged
4093 pub const AsmLegacy = struct {
4094 items_start: ExtraIndex,
4095 items_end: ExtraIndex,
4096 /// Needed to make lastToken() work.
4097 rparen: TokenIndex,
4098 };
4099
40194100 pub const Asm = struct {
40204101 items_start: ExtraIndex,
40214102 items_end: ExtraIndex,
4103 clobbers: OptionalIndex,
40224104 /// Needed to make lastToken() work.
40234105 rparen: TokenIndex,
40244106 };
lib/std/zig/Ast/Render.zig+167-10
......@@ -855,6 +855,9 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
855855 .@"asm",
856856 => return renderAsm(r, tree.fullAsm(node).?, space),
857857
858 // To be removed after 0.15.0 is tagged
859 .asm_legacy => return renderAsmLegacy(r, tree.legacyAsm(node).?, space),
860
858861 .enum_literal => {
859862 try renderToken(r, tree.nodeMainToken(node) - 1, .none); // .
860863 return renderIdentifier(r, tree.nodeMainToken(node), space, .eagerly_unquote); // name
......@@ -2368,9 +2371,9 @@ fn renderContainerDecl(
23682371 return renderToken(r, rbrace, space); // rbrace
23692372}
23702373
2371fn renderAsm(
2374fn renderAsmLegacy(
23722375 r: *Render,
2373 asm_node: Ast.full.Asm,
2376 asm_node: Ast.full.AsmLegacy,
23742377 space: Space,
23752378) Error!void {
23762379 const tree = r.tree;
......@@ -2396,17 +2399,24 @@ fn renderAsm(
23962399 try renderToken(r, first_clobber - 2, .none);
23972400 try renderToken(r, first_clobber - 1, .space);
23982401
2402 try ais.writer().writeAll(".{ ");
2403
23992404 var tok_i = first_clobber;
24002405 while (true) : (tok_i += 1) {
2401 try renderToken(r, tok_i, .none);
2406 try ais.writer().writeByte('.');
2407 _ = try writeStringLiteralAsIdentifier(r, tok_i);
2408 try ais.writer().writeAll(" = true");
2409
24022410 tok_i += 1;
24032411 switch (tree.tokenTag(tok_i)) {
24042412 .r_paren => {
2413 try ais.writer().writeAll(" }");
24052414 ais.popIndent();
24062415 return renderToken(r, tok_i, space);
24072416 },
24082417 .comma => {
24092418 if (tree.tokenTag(tok_i + 1) == .r_paren) {
2419 try ais.writer().writeAll(" }");
24102420 ais.popIndent();
24112421 return renderToken(r, tok_i + 1, space);
24122422 } else {
......@@ -2417,10 +2427,7 @@ fn renderAsm(
24172427 }
24182428 }
24192429 } else {
2420 // asm ("foo")
2421 try renderExpression(r, asm_node.ast.template, .none);
2422 ais.popIndent();
2423 return renderToken(r, asm_node.ast.rparen, space); // rparen
2430 unreachable;
24242431 }
24252432 }
24262433
......@@ -2504,13 +2511,17 @@ fn renderAsm(
25042511 };
25052512
25062513 try renderToken(r, colon3, .space); // :
2514 try ais.writer().writeAll(".{ ");
25072515 const first_clobber = asm_node.first_clobber.?;
25082516 var tok_i = first_clobber;
25092517 while (true) {
25102518 switch (tree.tokenTag(tok_i + 1)) {
25112519 .r_paren => {
25122520 ais.setIndentDelta(indent_delta);
2513 try renderToken(r, tok_i, .newline);
2521 try ais.writer().writeByte('.');
2522 const lexeme_len = try writeStringLiteralAsIdentifier(r, tok_i);
2523 try ais.writer().writeAll(" = true }");
2524 try renderSpace(r, tok_i, lexeme_len, .newline);
25142525 ais.popIndent();
25152526 return renderToken(r, tok_i + 1, space);
25162527 },
......@@ -2518,12 +2529,17 @@ fn renderAsm(
25182529 switch (tree.tokenTag(tok_i + 2)) {
25192530 .r_paren => {
25202531 ais.setIndentDelta(indent_delta);
2521 try renderToken(r, tok_i, .newline);
2532 try ais.writer().writeByte('.');
2533 const lexeme_len = try writeStringLiteralAsIdentifier(r, tok_i);
2534 try ais.writer().writeAll(" = true }");
2535 try renderSpace(r, tok_i, lexeme_len, .newline);
25222536 ais.popIndent();
25232537 return renderToken(r, tok_i + 2, space);
25242538 },
25252539 else => {
2526 try renderToken(r, tok_i, .none);
2540 try ais.writer().writeByte('.');
2541 _ = try writeStringLiteralAsIdentifier(r, tok_i);
2542 try ais.writer().writeAll(" = true");
25272543 try renderToken(r, tok_i + 1, .space);
25282544 tok_i += 2;
25292545 },
......@@ -2534,6 +2550,131 @@ fn renderAsm(
25342550 }
25352551}
25362552
2553fn renderAsm(
2554 r: *Render,
2555 asm_node: Ast.full.Asm,
2556 space: Space,
2557) Error!void {
2558 const tree = r.tree;
2559 const ais = r.ais;
2560
2561 try renderToken(r, asm_node.ast.asm_token, .space); // asm
2562
2563 if (asm_node.volatile_token) |volatile_token| {
2564 try renderToken(r, volatile_token, .space); // volatile
2565 try renderToken(r, volatile_token + 1, .none); // lparen
2566 } else {
2567 try renderToken(r, asm_node.ast.asm_token + 1, .none); // lparen
2568 }
2569
2570 if (asm_node.ast.items.len == 0) {
2571 try ais.forcePushIndent(.normal);
2572 if (asm_node.ast.clobbers.unwrap()) |clobbers| {
2573 // asm ("foo" ::: clobbers)
2574 try renderExpression(r, asm_node.ast.template, .space);
2575 // Render the three colons.
2576 const first_clobber = tree.firstToken(clobbers);
2577 try renderToken(r, first_clobber - 3, .none);
2578 try renderToken(r, first_clobber - 2, .none);
2579 try renderToken(r, first_clobber - 1, .space);
2580 try renderExpression(r, clobbers, .none);
2581 ais.popIndent();
2582 return renderToken(r, asm_node.ast.rparen, space); // rparen
2583 }
2584
2585 // asm ("foo")
2586 try renderExpression(r, asm_node.ast.template, .none);
2587 ais.popIndent();
2588 return renderToken(r, asm_node.ast.rparen, space); // rparen
2589 }
2590
2591 try ais.forcePushIndent(.normal);
2592 try renderExpression(r, asm_node.ast.template, .newline);
2593 ais.setIndentDelta(asm_indent_delta);
2594 const colon1 = tree.lastToken(asm_node.ast.template) + 1;
2595
2596 const colon2 = if (asm_node.outputs.len == 0) colon2: {
2597 try renderToken(r, colon1, .newline); // :
2598 break :colon2 colon1 + 1;
2599 } else colon2: {
2600 try renderToken(r, colon1, .space); // :
2601
2602 try ais.forcePushIndent(.normal);
2603 for (asm_node.outputs, 0..) |asm_output, i| {
2604 if (i + 1 < asm_node.outputs.len) {
2605 const next_asm_output = asm_node.outputs[i + 1];
2606 try renderAsmOutput(r, asm_output, .none);
2607
2608 const comma = tree.firstToken(next_asm_output) - 1;
2609 try renderToken(r, comma, .newline); // ,
2610 try renderExtraNewlineToken(r, tree.firstToken(next_asm_output));
2611 } else if (asm_node.inputs.len == 0 and asm_node.ast.clobbers == .none) {
2612 try ais.pushSpace(.comma);
2613 try renderAsmOutput(r, asm_output, .comma);
2614 ais.popSpace();
2615 ais.popIndent();
2616 ais.setIndentDelta(indent_delta);
2617 ais.popIndent();
2618 return renderToken(r, asm_node.ast.rparen, space); // rparen
2619 } else {
2620 try ais.pushSpace(.comma);
2621 try renderAsmOutput(r, asm_output, .comma);
2622 ais.popSpace();
2623 const comma_or_colon = tree.lastToken(asm_output) + 1;
2624 ais.popIndent();
2625 break :colon2 switch (tree.tokenTag(comma_or_colon)) {
2626 .comma => comma_or_colon + 1,
2627 else => comma_or_colon,
2628 };
2629 }
2630 } else unreachable;
2631 };
2632
2633 const colon3 = if (asm_node.inputs.len == 0) colon3: {
2634 try renderToken(r, colon2, .newline); // :
2635 break :colon3 colon2 + 1;
2636 } else colon3: {
2637 try renderToken(r, colon2, .space); // :
2638 try ais.forcePushIndent(.normal);
2639 for (asm_node.inputs, 0..) |asm_input, i| {
2640 if (i + 1 < asm_node.inputs.len) {
2641 const next_asm_input = asm_node.inputs[i + 1];
2642 try renderAsmInput(r, asm_input, .none);
2643
2644 const first_token = tree.firstToken(next_asm_input);
2645 try renderToken(r, first_token - 1, .newline); // ,
2646 try renderExtraNewlineToken(r, first_token);
2647 } else if (asm_node.ast.clobbers == .none) {
2648 try ais.pushSpace(.comma);
2649 try renderAsmInput(r, asm_input, .comma);
2650 ais.popSpace();
2651 ais.popIndent();
2652 ais.setIndentDelta(indent_delta);
2653 ais.popIndent();
2654 return renderToken(r, asm_node.ast.rparen, space); // rparen
2655 } else {
2656 try ais.pushSpace(.comma);
2657 try renderAsmInput(r, asm_input, .comma);
2658 ais.popSpace();
2659 const comma_or_colon = tree.lastToken(asm_input) + 1;
2660 ais.popIndent();
2661 break :colon3 switch (tree.tokenTag(comma_or_colon)) {
2662 .comma => comma_or_colon + 1,
2663 else => comma_or_colon,
2664 };
2665 }
2666 }
2667 unreachable;
2668 };
2669
2670 try renderToken(r, colon3, .space); // :
2671 const clobbers = asm_node.ast.clobbers.unwrap().?;
2672 try renderExpression(r, clobbers, .none);
2673 ais.setIndentDelta(indent_delta);
2674 ais.popIndent();
2675 return renderToken(r, asm_node.ast.rparen, space); // rparen
2676}
2677
25372678fn renderCall(
25382679 r: *Render,
25392680 call: Ast.full.Call,
......@@ -3094,6 +3235,22 @@ fn tokenSliceForRender(tree: Ast, token_index: Ast.TokenIndex) []const u8 {
30943235 return ret;
30953236}
30963237
3238fn writeStringLiteralAsIdentifier(r: *Render, token_index: Ast.TokenIndex) !usize {
3239 const tree = r.tree;
3240 const ais = r.ais;
3241 assert(tree.tokenTag(token_index) == .string_literal);
3242 const lexeme = tokenSliceForRender(tree, token_index);
3243 const unquoted = lexeme[1..][0 .. lexeme.len - 2];
3244 if (std.zig.isValidId(unquoted)) {
3245 try ais.writer().writeAll(unquoted);
3246 return unquoted.len;
3247 } else {
3248 try ais.writer().writeByte('@');
3249 try ais.writer().writeAll(lexeme);
3250 return lexeme.len + 1;
3251 }
3252}
3253
30973254fn hasSameLineComment(tree: Ast, token_index: Ast.TokenIndex) bool {
30983255 const between_source = tree.source[tree.tokenStart(token_index)..tree.tokenStart(token_index + 1)];
30993256 for (between_source) |byte| switch (byte) {
lib/std/zig/AstGen.zig+27-41
......@@ -505,6 +505,7 @@ fn lvalExpr(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Ins
505505 .bool_or,
506506 .@"asm",
507507 .asm_simple,
508 .asm_legacy,
508509 .string_literal,
509510 .number_literal,
510511 .call,
......@@ -811,6 +812,12 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
811812 .@"asm",
812813 => 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
814821 .string_literal => return stringLiteral(gz, ri, node),
815822 .multiline_string_literal => return multilineStringLiteral(gz, ri, node),
816823
......@@ -8774,7 +8781,7 @@ fn asmExpr(
87748781 if (is_container_asm) {
87758782 if (full.volatile_token) |t|
87768783 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)
87788785 return astgen.failNode(node, "global assembly cannot have inputs, outputs, or clobbers", .{});
87798786 } else {
87808787 if (full.outputs.len == 0 and full.volatile_token == null) {
......@@ -8839,32 +8846,12 @@ fn asmExpr(
88398846 };
88408847 }
88418848
8842 var clobbers_buffer: [63]u32 = undefined;
8843 var clobber_i: usize = 0;
8844 if (full.first_clobber) |first_clobber| clobbers: {
8845 // asm ("foo" ::: "a", "b")
8846 // asm ("foo" ::: "a", "b",)
8847 var tok_i = first_clobber;
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 }
8849 const clobbers: Zir.Inst.Ref = if (full.ast.clobbers.unwrap()) |clobbers_node|
8850 try comptimeExpr(gz, scope, .{ .rl = .{
8851 .coerced_ty = try gz.addBuiltinValue(clobbers_node, .clobbers),
8852 } }, clobbers_node, .clobber)
8853 else
8854 .none;
88688855
88698856 const result = try gz.addAsm(.{
88708857 .tag = tag_and_tmpl.tag,
......@@ -8874,7 +8861,7 @@ fn asmExpr(
88748861 .output_type_bits = output_type_bits,
88758862 .outputs = outputs,
88768863 .inputs = inputs,
8877 .clobbers = clobbers_buffer[0..clobber_i],
8864 .clobbers = clobbers,
88788865 });
88798866 return rvalue(gz, ri, result, node);
88808867}
......@@ -10332,6 +10319,7 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev
1033210319
1033310320 .@"asm",
1033410321 .asm_simple,
10322 .asm_legacy,
1033510323 .identifier,
1033610324 .field_access,
1033710325 .deref,
......@@ -10575,6 +10563,7 @@ fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.In
1057510563 .tagged_union_enum_tag_trailing,
1057610564 .@"asm",
1057710565 .asm_simple,
10566 .asm_legacy,
1057810567 .add,
1057910568 .add_wrap,
1058010569 .add_sat,
......@@ -10813,6 +10802,7 @@ fn nodeImpliesComptimeOnly(tree: *const Ast, start_node: Ast.Node.Index) bool {
1081310802 .tagged_union_enum_tag_trailing,
1081410803 .@"asm",
1081510804 .asm_simple,
10805 .asm_legacy,
1081610806 .add,
1081710807 .add_wrap,
1081810808 .add_sat,
......@@ -12811,7 +12801,7 @@ const GenZir = struct {
1281112801 is_volatile: bool,
1281212802 outputs: []const Zir.Inst.Asm.Output,
1281312803 inputs: []const Zir.Inst.Asm.Input,
12814 clobbers: []const u32,
12804 clobbers: Zir.Inst.Ref,
1281512805 },
1281612806 ) !Zir.Inst.Ref {
1281712807 const astgen = gz.astgen;
......@@ -12821,13 +12811,13 @@ const GenZir = struct {
1282112811 try astgen.instructions.ensureUnusedCapacity(gpa, 1);
1282212812 try astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Asm).@"struct".fields.len +
1282312813 args.outputs.len * @typeInfo(Zir.Inst.Asm.Output).@"struct".fields.len +
12824 args.inputs.len * @typeInfo(Zir.Inst.Asm.Input).@"struct".fields.len +
12825 args.clobbers.len);
12814 args.inputs.len * @typeInfo(Zir.Inst.Asm.Input).@"struct".fields.len);
1282612815
1282712816 const payload_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.Asm{
1282812817 .src_node = gz.nodeIndexToRelative(args.node),
1282912818 .asm_source = args.asm_source,
1283012819 .output_type_bits = args.output_type_bits,
12820 .clobbers = args.clobbers,
1283112821 });
1283212822 for (args.outputs) |output| {
1283312823 _ = gz.astgen.addExtraAssumeCapacity(output);
......@@ -12835,23 +12825,19 @@ const GenZir = struct {
1283512825 for (args.inputs) |input| {
1283612826 _ = gz.astgen.addExtraAssumeCapacity(input);
1283712827 }
12838 gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers);
1283912828
12840 // * 0b00000000_0000XXXX - `outputs_len`.
12841 // * 0b0000000X_XXXX0000 - `inputs_len`.
12842 // * 0b0XXXXXX0_00000000 - `clobbers_len`.
12843 // * 0bX0000000_00000000 - is volatile
12844 const small: u16 = @as(u16, @as(u4, @intCast(args.outputs.len))) << 0 |
12845 @as(u16, @as(u5, @intCast(args.inputs.len))) << 4 |
12846 @as(u16, @as(u6, @intCast(args.clobbers.len))) << 9 |
12847 @as(u16, @intFromBool(args.is_volatile)) << 15;
12829 const small: Zir.Inst.Asm.Small = .{
12830 .outputs_len = @intCast(args.outputs.len),
12831 .inputs_len = @intCast(args.inputs.len),
12832 .is_volatile = args.is_volatile,
12833 };
1284812834
1284912835 const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len);
1285012836 astgen.instructions.appendAssumeCapacity(.{
1285112837 .tag = .extended,
1285212838 .data = .{ .extended = .{
1285312839 .opcode = args.tag,
12854 .small = small,
12840 .small = @bitCast(small),
1285512841 .operand = payload_index,
1285612842 } },
1285712843 });
lib/std/zig/AstRlAnnotate.zig+1
......@@ -310,6 +310,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
310310 .unreachable_literal,
311311 .asm_simple,
312312 .@"asm",
313 .asm_legacy,
313314 .enum_literal,
314315 .error_value,
315316 .anyframe_literal,
lib/std/zig/Parse.zig+27-4
......@@ -2801,7 +2801,7 @@ fn expectSwitchSuffix(p: *Parse, main_token: TokenIndex) !Node.Index {
28012801///
28022802/// AsmInput <- COLON AsmInputList AsmClobbers?
28032803///
2804/// AsmClobbers <- COLON StringList
2804/// AsmClobbers <- COLON Expr
28052805///
28062806/// StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL?
28072807///
......@@ -2841,7 +2841,8 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
28412841 else => try p.warnExpected(.comma),
28422842 }
28432843 }
2844 if (p.eatToken(.colon)) |_| {
2844
2845 const clobbers: Node.OptionalIndex = if (p.eatToken(.colon)) |_| clobbers: {
28452846 while (true) {
28462847 const input_item = try p.parseAsmInputItem() orelse break;
28472848 try p.scratch.append(p.gpa, input_item);
......@@ -2853,7 +2854,11 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
28532854 else => try p.warnExpected(.comma),
28542855 }
28552856 }
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) {
28572862 while (p.eatToken(.string_literal)) |_| {
28582863 switch (p.tokenTag(p.tok_i)) {
28592864 .comma => p.tok_i += 1,
......@@ -2862,8 +2867,25 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
28622867 else => try p.warnExpected(.comma),
28632868 }
28642869 }
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 });
28652884 }
2866 }
2885
2886 break :clobbers (try p.expectExpr()).toOptional();
2887 } else .none;
2888
28672889 const rparen = try p.expectToken(.r_paren);
28682890 const span = try p.listToSpan(p.scratch.items[scratch_top..]);
28692891 return p.addNode(.{
......@@ -2874,6 +2896,7 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
28742896 try p.addExtra(Node.Asm{
28752897 .items_start = span.start,
28762898 .items_end = span.end,
2899 .clobbers = clobbers,
28772900 .rparen = rparen,
28782901 }),
28792902 } },
lib/std/zig/Zir.zig+8-6
......@@ -1939,11 +1939,6 @@ pub const Inst = struct {
19391939 /// `operand` is payload index to `BinNode`.
19401940 builtin_extern,
19411941 /// Inline assembly.
1942 /// `small`:
1943 /// * 0b00000000_000XXXXX - `outputs_len`.
1944 /// * 0b000000XX_XXX00000 - `inputs_len`.
1945 /// * 0b0XXXXX00_00000000 - `clobbers_len`.
1946 /// * 0bX0000000_00000000 - is volatile
19471942 /// `operand` is payload index to `Asm`.
19481943 @"asm",
19491944 /// Same as `asm` except the assembly template is not a string literal but a comptime
......@@ -2495,7 +2490,6 @@ pub const Inst = struct {
24952490 /// Trailing:
24962491 /// 0. Output for every outputs_len
24972492 /// 1. Input for every inputs_len
2498 /// 2. clobber: NullTerminatedString // index into string_bytes (null terminated) for every clobbers_len.
24992493 pub const Asm = struct {
25002494 src_node: Ast.Node.Offset,
25012495 // null-terminated string index
......@@ -2505,6 +2499,13 @@ pub const Inst = struct {
25052499 /// 0b1 - operand is a type; asm expression has the output as the result.
25062500 /// 0b0X is the first output, 0bX0 is the second, etc.
25072501 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
25092510 pub const Output = struct {
25102511 /// index into string_bytes (null terminated)
......@@ -3482,6 +3483,7 @@ pub const Inst = struct {
34823483 extern_options,
34833484 type_info,
34843485 branch_hint,
3486 clobbers,
34853487 // Values
34863488 calling_convention_c,
34873489 calling_convention_inline,
lib/std/zig/ZonGen.zig+1-1
......@@ -238,7 +238,7 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
238238 => try zg.addErrorNode(node, "control flow is not allowed in ZON", .{}),
239239
240240 .@"comptime" => try zg.addErrorNode(node, "keyword 'comptime' is not allowed in ZON", .{}),
241 .asm_simple, .@"asm" => try zg.addErrorNode(node, "inline asm is not allowed in ZON", .{}),
241 .asm_simple, .@"asm", .asm_legacy => try zg.addErrorNode(node, "inline asm is not allowed in ZON", .{}),
242242
243243 .builtin_call_two,
244244 .builtin_call_two_comma,
lib/std/zig/parser_test.zig+54-11
......@@ -32,7 +32,7 @@ test "zig fmt: tuple struct" {
3232}
3333
3434test "zig fmt: preserves clobbers in inline asm with stray comma" {
35 try testCanonical(
35 try testTransform(
3636 \\fn foo() void {
3737 \\ asm volatile (""
3838 \\ : [_] "" (-> type),
......@@ -46,6 +46,20 @@ test "zig fmt: preserves clobbers in inline asm with stray comma" {
4646 \\ );
4747 \\}
4848 \\
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 \\
4963 );
5064}
5165
......@@ -64,7 +78,7 @@ test "zig fmt: remove trailing comma at the end of assembly clobber" {
6478 \\ asm volatile (""
6579 \\ : [_] "" (-> type),
6680 \\ :
67 \\ : "clobber1", "clobber2"
81 \\ : .{ .clobber1 = true, .clobber2 = true }
6882 \\ );
6983 \\}
7084 \\
......@@ -628,7 +642,7 @@ test "zig fmt: builtin call with trailing comma" {
628642}
629643
630644test "zig fmt: asm expression with comptime content" {
631 try testCanonical(
645 try testTransform(
632646 \\comptime {
633647 \\ asm ("foo" ++ "bar");
634648 \\}
......@@ -648,6 +662,26 @@ test "zig fmt: asm expression with comptime content" {
648662 \\ );
649663 \\}
650664 \\
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 \\
651685 );
652686}
653687
......@@ -2182,7 +2216,7 @@ test "zig fmt: simple asm" {
21822216 \\ : [a] "x" (-> i32),
21832217 \\ : [a] "x" (1),
21842218 \\ );
2185 \\ asm ("still not real assembly" ::: "a", "b");
2219 \\ asm ("still not real assembly" ::: .{ .a = true, .b = true });
21862220 \\}
21872221 \\
21882222 );
......@@ -3907,7 +3941,7 @@ test "zig fmt: fn type" {
39073941}
39083942
39093943test "zig fmt: inline asm" {
3910 try testCanonical(
3944 try testTransform(
39113945 \\pub fn syscall1(number: usize, arg1: usize) usize {
39123946 \\ return asm volatile ("syscall"
39133947 \\ : [ret] "={rax}" (-> usize),
......@@ -3917,6 +3951,16 @@ test "zig fmt: inline asm" {
39173951 \\ );
39183952 \\}
39193953 \\
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 \\
39203964 );
39213965}
39223966
......@@ -3998,7 +4042,7 @@ test "zig fmt: inline asm parameter alignment" {
39984042 \\ asm volatile (
39994043 \\ \\ foo
40004044 \\ \\ bar
4001 \\ ::: "", "");
4045 \\ ::: .{ .a = true, .b = true });
40024046 \\ asm volatile (
40034047 \\ \\ foo
40044048 \\ \\ bar
......@@ -4006,8 +4050,7 @@ test "zig fmt: inline asm parameter alignment" {
40064050 \\ [_] "" (-> usize),
40074051 \\ : [_] "" (0),
40084052 \\ [_] "" (0),
4009 \\ : "", ""
4010 \\ );
4053 \\ : .{});
40114054 \\}
40124055 \\
40134056 );
......@@ -5325,7 +5368,7 @@ test "zig fmt: make single-line if no trailing comma, fmt: off" {
53255368 \\ asm ("not real assembly"
53265369 \\ :[a] "x" (->i32),:[a] "x" (1),);
53275370 \\ asm volatile ("still not real assembly"
5328 \\ :::"a","b",);
5371 \\ :::.{.a = true,.b = true,});
53295372 \\ }
53305373 \\}
53315374 );
......@@ -5737,7 +5780,7 @@ test "zig fmt: canonicalize symbols (asm)" {
57375780 \\ [@"arg1"] "{rdi}" (arg),
57385781 \\ [arg2] "{rsi}" (arg),
57395782 \\ [arg3] "{rdx}" (arg),
5740 \\ : "rcx", "r11"
5783 \\ : "rcx", "fn"
57415784 \\ );
57425785 \\
57435786 \\ const @"false": usize = 10;
......@@ -5759,7 +5802,7 @@ test "zig fmt: canonicalize symbols (asm)" {
57595802 \\ [arg1] "{rdi}" (arg),
57605803 \\ [arg2] "{rsi}" (arg),
57615804 \\ [arg3] "{rdx}" (arg),
5762 \\ : "rcx", "r11"
5805 \\ : .{ .rcx = true, .@"fn" = true }
57635806 \\ );
57645807 \\
57655808 \\ const @"false": usize = 10;
lib/std/zig/system/x86.zig+1-2
......@@ -783,6 +783,5 @@ fn getXCR0() u32 {
783783 \\ xgetbv
784784 : [_] "={eax}" (-> u32),
785785 :
786 : "edx", "ecx"
787 );
786 : .{ .edx = true, .ecx = true });
788787}
src/Air.zig+10-9
......@@ -1414,19 +1414,20 @@ pub const ShuffleTwoMask = enum(u32) {
14141414/// terminated string.
14151415/// - name: memory at this position is reinterpreted as a null
14161416/// terminated string. pad to the next u32 after the null byte.
1417/// 4. for every clobbers_len
1418/// - clobber_name: memory at this position is reinterpreted as a null
1419/// terminated string. pad to the next u32 after the null byte.
1420/// 5. A number of u32 elements follow according to the equation `(source_len + 3) / 4`.
1417/// 4. A number of u32 elements follow according to the equation `(source_len + 3) / 4`.
14211418/// Memory starting at this position is reinterpreted as the source bytes.
14221419pub const Asm = struct {
14231420 /// Length of the assembly source in bytes.
14241421 source_len: u32,
1425 outputs_len: u32,
14261422 inputs_len: u32,
1427 /// The MSB is `is_volatile`.
1428 /// The rest of the bits are `clobbers_len`.
1429 flags: u32,
1423 /// A comptime `std.builtin.assembly.Clobbers` value for the target architecture.
1424 clobbers: InternPool.Index,
1425 flags: Flags,
1426
1427 pub const Flags = packed struct(u32) {
1428 outputs_len: u31,
1429 is_volatile: bool,
1430 };
14301431};
14311432
14321433pub const Cmpxchg = struct {
......@@ -1750,7 +1751,7 @@ pub fn extraData(air: Air, comptime T: type, index: usize) struct { data: T, end
17501751 @field(result, field.name) = switch (field.type) {
17511752 u32 => air.extra.items[i],
17521753 InternPool.Index, Inst.Ref => @enumFromInt(air.extra.items[i]),
1753 i32, CondBr.BranchHints => @bitCast(air.extra.items[i]),
1754 i32, CondBr.BranchHints, Asm.Flags => @bitCast(air.extra.items[i]),
17541755 else => @compileError("bad field type: " ++ @typeName(field.type)),
17551756 };
17561757 i += 1;
src/Air/Liveness.zig+2-1
......@@ -1209,8 +1209,9 @@ fn analyzeInst(
12091209
12101210 .assembly => {
12111211 const extra = a.air.extraData(Air.Asm, inst_datas[@intFromEnum(inst)].ty_pl.payload);
1212 const outputs_len = extra.data.flags.outputs_len;
12121213 var extra_i: usize = extra.end;
1213 const outputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..extra.data.outputs_len]));
1214 const outputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..outputs_len]));
12141215 extra_i += outputs.len;
12151216 const inputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..extra.data.inputs_len]));
12161217 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 {
366366 .assembly => {
367367 const ty_pl = data[@intFromEnum(inst)].ty_pl;
368368 const extra = self.air.extraData(Air.Asm, ty_pl.payload);
369 const outputs_len = extra.data.flags.outputs_len;
369370 var extra_i = extra.end;
370 const outputs = @as(
371 []const Air.Inst.Ref,
372 @ptrCast(self.air.extra.items[extra_i..][0..extra.data.outputs_len]),
373 );
371 const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..outputs_len]);
374372 extra_i += outputs.len;
375 const inputs = @as(
376 []const Air.Inst.Ref,
377 @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]),
378 );
373 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
379374 extra_i += inputs.len;
380375
381376 var bt = self.liveness.iterateBigTomb(inst);
src/Air/print.zig+35-18
......@@ -1,5 +1,6 @@
11const std = @import("std");
22const Allocator = std.mem.Allocator;
3const assert = std.debug.assert;
34
45const build_options = @import("build_options");
56const Zcu = @import("../Zcu.zig");
......@@ -9,7 +10,7 @@ const Air = @import("../Air.zig");
910const InternPool = @import("../InternPool.zig");
1011
1112pub 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);
1314 const instruction_bytes = air.instructions.len *
1415 // Here we don't use @sizeOf(Air.Inst.Data) because it would include
1516 // the debug safety tag but we want to measure release size.
......@@ -59,7 +60,7 @@ pub fn writeInst(
5960 pt: Zcu.PerThread,
6061 liveness: ?Air.Liveness,
6162) void {
62 comptime std.debug.assert(build_options.enable_debug_extensions);
63 comptime assert(build_options.enable_debug_extensions);
6364 var writer: Writer = .{
6465 .pt = pt,
6566 .gpa = pt.zcu.gpa,
......@@ -643,8 +644,8 @@ const Writer = struct {
643644 fn writeAssembly(w: *Writer, s: *std.io.Writer, inst: Air.Inst.Index) Error!void {
644645 const ty_pl = w.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
645646 const extra = w.air.extraData(Air.Asm, ty_pl.payload);
646 const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;
647 const clobbers_len = @as(u31, @truncate(extra.data.flags));
647 const is_volatile = extra.data.flags.is_volatile;
648 const outputs_len = extra.data.flags.outputs_len;
648649 var extra_i: usize = extra.end;
649650 var op_index: usize = 0;
650651
......@@ -655,7 +656,7 @@ const Writer = struct {
655656 try s.writeAll(", volatile");
656657 }
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]));
659660 extra_i += outputs.len;
660661 const inputs = @as([]const Air.Inst.Ref, @ptrCast(w.air.extra.items[extra_i..][0..extra.data.inputs_len]));
661662 extra_i += inputs.len;
......@@ -695,19 +696,35 @@ const Writer = struct {
695696 try s.writeByte(')');
696697 }
697698
698 {
699 var clobber_i: u32 = 0;
700 while (clobber_i < clobbers_len) : (clobber_i += 1) {
701 const extra_bytes = std.mem.sliceAsBytes(w.air.extra.items[extra_i..]);
702 const clobber = std.mem.sliceTo(extra_bytes, 0);
703 // This equation accounts for the fact that even if we have exactly 4 bytes
704 // for the string, we still use the next u32 for the null terminator.
705 extra_i += clobber.len / 4 + 1;
706
707 try s.writeAll(", ~{");
708 try s.writeAll(clobber);
709 try s.writeAll("}");
710 }
699 const zcu = w.pt.zcu;
700 const ip = &zcu.intern_pool;
701 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
702 const struct_type: Type = .fromInterned(aggregate.ty);
703 switch (aggregate.storage) {
704 .elems => |elems| for (elems, 0..) |elem, i| {
705 switch (elem) {
706 .bool_true => {
707 const clobber = struct_type.structFieldName(i, zcu).toSlice(ip).?;
708 assert(clobber.len != 0);
709 try s.writeAll(", ~{");
710 try s.writeAll(clobber);
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 },
711728 }
712729 const asm_source = std.mem.sliceAsBytes(w.air.extra.items[extra_i..])[0..extra.data.source_len];
713730 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 {
416416 if (!checkType(data.ty_pl.ty.toType(), zcu)) return false;
417417 // Luckily, we only care about the inputs and outputs, so we don't have to do
418418 // the whole null-terminated string dance.
419 const outputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end..][0..extra.data.outputs_len]);
420 const inputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end + extra.data.outputs_len ..][0..extra.data.inputs_len]);
419 const outputs_len = extra.data.flags.outputs_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]);
421422 for (outputs) |output| if (output != .none and !checkRef(output, zcu)) return false;
422423 for (inputs) |input| if (input != .none and !checkRef(input, zcu)) return false;
423424 },
src/InternPool.zig+6
......@@ -54,6 +54,7 @@ namespace_name_deps: std.AutoArrayHashMapUnmanaged(NamespaceNameKey, DepEntry.In
5454memoized_state_main_deps: DepEntry.Index.Optional,
5555memoized_state_panic_deps: DepEntry.Index.Optional,
5656memoized_state_va_list_deps: DepEntry.Index.Optional,
57memoized_state_assembly_deps: DepEntry.Index.Optional,
5758
5859/// Given a `Depender`, points to an entry in `dep_entries` whose `depender`
5960/// matches. The `next_dependee` field can be used to iterate all such entries
......@@ -96,6 +97,7 @@ pub const empty: InternPool = .{
9697 .memoized_state_main_deps = .none,
9798 .memoized_state_panic_deps = .none,
9899 .memoized_state_va_list_deps = .none,
100 .memoized_state_assembly_deps = .none,
99101 .first_dependency = .empty,
100102 .dep_entries = .empty,
101103 .free_dep_entries = .empty,
......@@ -458,6 +460,8 @@ pub const MemoizedStateStage = enum(u32) {
458460 panic,
459461 /// Specifically `std.builtin.VaList`. See `Zcu.BuiltinDecl.stage`.
460462 va_list,
463 /// Everything within `std.builtin.assembly`. See `Zcu.BuiltinDecl.stage`.
464 assembly,
461465};
462466
463467pub const ComptimeUnit = extern struct {
......@@ -880,6 +884,7 @@ pub fn dependencyIterator(ip: *const InternPool, dependee: Dependee) DependencyI
880884 .main => ip.memoized_state_main_deps.unwrap(),
881885 .panic => ip.memoized_state_panic_deps.unwrap(),
882886 .va_list => ip.memoized_state_va_list_deps.unwrap(),
887 .assembly => ip.memoized_state_assembly_deps.unwrap(),
883888 },
884889 } orelse return .{
885890 .ip = ip,
......@@ -915,6 +920,7 @@ pub fn addDependency(ip: *InternPool, gpa: Allocator, depender: AnalUnit, depend
915920 .main => &ip.memoized_state_main_deps,
916921 .panic => &ip.memoized_state_panic_deps,
917922 .va_list => &ip.memoized_state_va_list_deps,
923 .assembly => &ip.memoized_state_assembly_deps,
918924 };
919925
920926 if (deps.unwrap()) |first| {
src/Sema.zig+17-23
......@@ -16413,10 +16413,10 @@ fn zirAsm(
1641316413 const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand);
1641416414 const src = block.nodeOffset(extra.data.src_node);
1641516415 const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node });
16416 const outputs_len: u4 = @truncate(extended.small);
16417 const inputs_len: u5 = @truncate(extended.small >> 4);
16418 const clobbers_len: u6 = @truncate(extended.small >> 9);
16419 const is_volatile = @as(u1, @truncate(extended.small >> 15)) != 0;
16416 const small: Zir.Inst.Asm.Small = @bitCast(extended.small);
16417 const outputs_len = small.outputs_len;
16418 const inputs_len = small.inputs_len;
16419 const is_volatile = small.is_volatile;
1642016420 const is_global_assembly = sema.func_index == .none;
1642116421 const zir_tags = sema.code.instructions.items(.tag);
1642216422
......@@ -16432,7 +16432,7 @@ fn zirAsm(
1643216432 if (inputs_len != 0) {
1643316433 return sema.fail(block, src, "module-level assembly does not support inputs", .{});
1643416434 }
16435 if (clobbers_len != 0) {
16435 if (extra.data.clobbers != .none) {
1643616436 return sema.fail(block, src, "module-level assembly does not support clobbers", .{});
1643716437 }
1643816438 if (is_volatile) {
......@@ -16506,15 +16506,11 @@ fn zirAsm(
1650616506 inputs[arg_i] = .{ .c = constraint, .n = name };
1650716507 }
1650816508
16509 const clobbers = try sema.arena.alloc([]const u8, clobbers_len);
16510 for (clobbers) |*name| {
16511 const name_index: Zir.NullTerminatedString = @enumFromInt(sema.code.extra[extra_i]);
16512 name.* = sema.code.nullTerminatedString(name_index);
16513 extra_i += 1;
16514
16515 needed_capacity += name.*.len / 4 + 1;
16516 }
16517
16509 const clobbers = if (extra.data.clobbers == .none) empty: {
16510 const clobbers_ty = try sema.getBuiltinType(src, .@"assembly.Clobbers");
16511 break :empty try sema.structInitEmpty(block, clobbers_ty, src, src);
16512 } else try sema.resolveInst(extra.data.clobbers); // Already coerced by AstGen.
16513 const clobbers_val = try sema.resolveConstDefinedValue(block, src, clobbers, .{ .simple = .clobber });
1651816514 needed_capacity += (asm_source.len + 3) / 4;
1651916515
1652016516 const gpa = sema.gpa;
......@@ -16525,9 +16521,12 @@ fn zirAsm(
1652516521 .ty = expr_ty,
1652616522 .payload = sema.addExtraAssumeCapacity(Air.Asm{
1652716523 .source_len = @intCast(asm_source.len),
16528 .outputs_len = outputs_len,
1652916524 .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 },
1653116530 }),
1653216531 } },
1653316532 });
......@@ -16549,12 +16548,6 @@ fn zirAsm(
1654916548 buffer[input.c.len + 1 + input.n.len] = 0;
1655016549 sema.air_extra.items.len += (input.c.len + input.n.len + (2 + 3)) / 4;
1655116550 }
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 }
1655816551 {
1655916552 const buffer = mem.sliceAsBytes(sema.air_extra.unusedCapacitySlice());
1656016553 @memcpy(buffer[0..asm_source.len], asm_source);
......@@ -26197,6 +26190,7 @@ fn zirBuiltinValue(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD
2619726190 .extern_options => try sema.getBuiltinType(src, .ExternOptions),
2619826191 .type_info => try sema.getBuiltinType(src, .Type),
2619926192 .branch_hint => try sema.getBuiltinType(src, .BranchHint),
26193 .clobbers => try sema.getBuiltinType(src, .@"assembly.Clobbers"),
2620026194 // zig fmt: on
2620126195
2620226196 // Values are handled here.
......@@ -36546,7 +36540,7 @@ fn payloadToExtraItems(data: anytype) [@typeInfo(@TypeOf(data)).@"struct".fields
3654636540 inline for (&result, fields) |*val, field| {
3654736541 val.* = switch (field.type) {
3654836542 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)),
3655036544 Air.Inst.Ref, InternPool.Index => @intFromEnum(@field(data, field.name)),
3655136545 else => @compileError("bad field type: " ++ @typeName(field.type)),
3655236546 };
src/Zcu.zig+19-7
......@@ -460,6 +460,9 @@ pub const BuiltinDecl = enum {
460460
461461 VaList,
462462
463 assembly,
464 @"assembly.Clobbers",
465
463466 /// Determines what kind of validation will be done to the decl's value.
464467 pub fn kind(decl: BuiltinDecl) enum { type, func, string } {
465468 return switch (decl) {
......@@ -480,6 +483,8 @@ pub const BuiltinDecl = enum {
480483 .ExportOptions,
481484 .ExternOptions,
482485 .BranchHint,
486 .assembly,
487 .@"assembly.Clobbers",
483488 => .type,
484489
485490 .Type,
......@@ -540,6 +545,7 @@ pub const BuiltinDecl = enum {
540545 /// Resolution of these values is done in three distinct stages:
541546 /// * Resolution of `std.builtin.Panic` and everything under it
542547 /// * Resolution of `VaList`
548 /// * Resolution of `assembly`
543549 /// * Everything else
544550 ///
545551 /// Panics are separated because they are provided by the user, so must be able to use
......@@ -548,14 +554,20 @@ pub const BuiltinDecl = enum {
548554 /// `VaList` is separate because its value depends on the target, so it needs some reflection
549555 /// machinery to work; additionally, it is `@compileError` on some targets, so must be referenced
550556 /// by itself.
557 ///
558 /// `assembly` is separate because its value depends on the target.
551559 pub fn stage(decl: BuiltinDecl) InternPool.MemoizedStateStage {
552 if (decl == .VaList) return .va_list;
553
554 if (@intFromEnum(decl) <= @intFromEnum(BuiltinDecl.@"Type.Declaration")) {
555 return .main;
556 } else {
557 return .panic;
558 }
560 return switch (decl) {
561 .VaList => .va_list,
562 .assembly, .@"assembly.Clobbers" => .assembly,
563 else => {
564 if (@intFromEnum(decl) <= @intFromEnum(BuiltinDecl.@"Type.Declaration")) {
565 return .main;
566 } else {
567 return .panic;
568 }
569 },
570 };
559571 }
560572
561573 /// 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
635635 .main => .Type,
636636 .panic => .panic,
637637 .va_list => .VaList,
638 .assembly => .assembly,
638639 };
639640 if (zcu.builtin_decl_values.get(to_check) != .none) return;
640641 }
src/arch/riscv64/CodeGen.zig+28-16
......@@ -6048,10 +6048,10 @@ fn airBoolOp(func: *Func, inst: Air.Inst.Index) !void {
60486048fn airAsm(func: *Func, inst: Air.Inst.Index) !void {
60496049 const ty_pl = func.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
60506050 const extra = func.air.extraData(Air.Asm, ty_pl.payload);
6051 const clobbers_len: u31 = @truncate(extra.data.flags);
6051 const outputs_len = extra.data.flags.outputs_len;
60526052 var extra_i: usize = extra.end;
60536053 const outputs: []const Air.Inst.Ref =
6054 @ptrCast(func.air.extra.items[extra_i..][0..extra.data.outputs_len]);
6054 @ptrCast(func.air.extra.items[extra_i..][0..outputs_len]);
60556055 extra_i += outputs.len;
60566056 const inputs: []const Air.Inst.Ref = @ptrCast(func.air.extra.items[extra_i..][0..extra.data.inputs_len]);
60576057 extra_i += inputs.len;
......@@ -6162,21 +6162,33 @@ fn airAsm(func: *Func, inst: Air.Inst.Index) !void {
61626162 args.appendAssumeCapacity(arg_mcv);
61636163 }
61646164
6165 {
6166 var clobber_i: u32 = 0;
6167 while (clobber_i < clobbers_len) : (clobber_i += 1) {
6168 const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(func.air.extra.items[extra_i..]), 0);
6169 // This equation accounts for the fact that even if we have exactly 4 bytes
6170 // for the string, we still use the next u32 for the null terminator.
6171 extra_i += clobber.len / 4 + 1;
6172
6173 if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory")) {
6174 // nothing really to do
6175 } else {
6176 try func.register_manager.getReg(parseRegName(clobber) orelse
6177 return func.fail("invalid clobber: '{s}'", .{clobber}), null);
6165 const zcu = func.pt.zcu;
6166 const ip = &zcu.intern_pool;
6167 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
6168 const struct_type: Type = .fromInterned(aggregate.ty);
6169 switch (aggregate.storage) {
6170 .elems => |elems| for (elems, 0..) |elem, i| {
6171 switch (elem) {
6172 .bool_true => {
6173 const clobber = struct_type.structFieldName(i, zcu).toSlice(ip).?;
6174 assert(clobber.len != 0);
6175 if (std.mem.eql(u8, clobber, "memory")) {
6176 // nothing really to do
6177 } else {
6178 try func.register_manager.getReg(parseRegName(clobber) orelse
6179 return func.fail("invalid clobber: '{s}'", .{clobber}), null);
6180 }
6181 },
6182 .bool_false => continue,
6183 else => unreachable,
61786184 }
6179 }
6185 },
6186 .repeated_elem => |elem| switch (elem) {
6187 .bool_true => @panic("TODO"),
6188 .bool_false => {},
6189 else => unreachable,
6190 },
6191 .bytes => @panic("TODO"),
61806192 }
61816193
61826194 const Label = struct {
src/arch/sparc64/CodeGen.zig+5-14
......@@ -873,10 +873,10 @@ fn airArrayToSlice(self: *Self, inst: Air.Inst.Index) !void {
873873fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
874874 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
875875 const extra = self.air.extraData(Air.Asm, ty_pl.payload);
876 const is_volatile = (extra.data.flags & 0x80000000) != 0;
877 const clobbers_len: u31 = @truncate(extra.data.flags);
876 const is_volatile = extra.data.flags.is_volatile;
877 const outputs_len = extra.data.flags.outputs_len;
878878 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]);
880880 extra_i += outputs.len;
881881 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i .. extra_i + extra.data.inputs_len]);
882882 extra_i += inputs.len;
......@@ -921,17 +921,8 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
921921 try self.genSetReg(self.typeOf(input), reg, arg_mcv);
922922 }
923923
924 {
925 var clobber_i: u32 = 0;
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 }
924 // TODO honor the clobbers
925 _ = extra.data.clobbers;
935926
936927 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 {
179788179788 const zcu = pt.zcu;
179789179789 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
179790179790 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;
179792179792 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]);
179794179794 extra_i += outputs.len;
179795179795 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
179796179796 extra_i += inputs.len;
......@@ -179981,30 +179981,42 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {
179981179981 args.appendAssumeCapacity(arg_mcv);
179982179982 }
179983179983
179984 {
179985 var clobber_i: u32 = 0;
179986 while (clobber_i < clobbers_len) : (clobber_i += 1) {
179987 const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);
179988 // This equation accounts for the fact that even if we have exactly 4 bytes
179989 // for the string, we still use the next u32 for the null terminator.
179990 extra_i += clobber.len / 4 + 1;
179991
179992 if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory") or
179993 std.mem.eql(u8, clobber, "fpsr") or std.mem.eql(u8, clobber, "fpcr") or
179994 std.mem.eql(u8, clobber, "mxcsr") or std.mem.eql(u8, clobber, "dirflag"))
179995 {
179996 // ok, sure
179997 } else if (std.mem.eql(u8, clobber, "cc") or
179998 std.mem.eql(u8, clobber, "flags") or
179999 std.mem.eql(u8, clobber, "eflags") or
180000 std.mem.eql(u8, clobber, "rflags"))
180001 {
180002 try self.spillEflagsIfOccupied();
180003 } else {
180004 try self.register_manager.getReg(parseRegName(clobber) orelse
180005 return self.fail("invalid clobber: '{s}'", .{clobber}), null);
180006 }
180007 }
179984 const ip = &zcu.intern_pool;
179985 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
179986 const struct_type: Type = .fromInterned(aggregate.ty);
179987 switch (aggregate.storage) {
179988 .elems => |elems| for (elems, 0..) |elem, i| switch (elem) {
179989 .bool_true => {
179990 const clobber = struct_type.structFieldName(i, zcu).toSlice(ip).?;
179991 assert(clobber.len != 0);
179992
179993 if (std.mem.eql(u8, clobber, "memory") or
179994 std.mem.eql(u8, clobber, "fpsr") or
179995 std.mem.eql(u8, clobber, "fpcr") or
179996 std.mem.eql(u8, clobber, "mxcsr") or
179997 std.mem.eql(u8, clobber, "dirflag"))
179998 {
179999 // ok, sure
180000 } else if (std.mem.eql(u8, clobber, "cc") or
180001 std.mem.eql(u8, clobber, "flags") or
180002 std.mem.eql(u8, clobber, "eflags") or
180003 std.mem.eql(u8, clobber, "rflags"))
180004 {
180005 try self.spillEflagsIfOccupied();
180006 } else {
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"),
180008180020 }
180009180021
180010180022 const Label = struct {
src/codegen/c.zig+24-19
......@@ -5545,11 +5545,11 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
55455545 const zcu = pt.zcu;
55465546 const ty_pl = f.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
55475547 const extra = f.air.extraData(Air.Asm, ty_pl.payload);
5548 const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;
5549 const clobbers_len: u31 = @truncate(extra.data.flags);
5548 const is_volatile = extra.data.flags.is_volatile;
5549 const outputs_len = extra.data.flags.outputs_len;
55505550 const gpa = f.object.dg.gpa;
55515551 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]);
55535553 extra_i += outputs.len;
55545554 const inputs: []const Air.Inst.Ref = @ptrCast(f.air.extra.items[extra_i..][0..extra.data.inputs_len]);
55555555 extra_i += inputs.len;
......@@ -5645,12 +5645,6 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
56455645 try f.object.newline();
56465646 }
56475647 }
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
56555649 {
56565650 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 {
57575751 try w.writeByte(')');
57585752 }
57595753 try w.writeByte(':');
5760 for (0..clobbers_len) |clobber_i| {
5761 const clobber = mem.sliceTo(mem.sliceAsBytes(f.air.extra.items[extra_i..]), 0);
5762 // This equation accounts for the fact that even if we have exactly 4 bytes
5763 // for the string, we still use the next u32 for the null terminator.
5764 extra_i += clobber.len / 4 + 1;
5765
5766 if (clobber.len == 0) continue;
5767
5768 if (clobber_i > 0) try w.writeByte(',');
5769 try w.print(" {f}", .{fmtStringLiteral(clobber, null)});
5754 const ip = &zcu.intern_pool;
5755 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
5756 const struct_type: Type = .fromInterned(aggregate.ty);
5757 switch (aggregate.storage) {
5758 .elems => |elems| for (elems, 0..) |elem, i| switch (elem) {
5759 .bool_true => {
5760 const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
5761 assert(name.len != 0);
5762 try w.print(" {f}", .{fmtStringLiteral(name, 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"),
57705774 }
5775 w.undo(1); // erase the last comma
57715776 try w.writeAll(");");
57725777 try f.object.newline();
57735778
src/codegen/llvm.zig+294-33
......@@ -7241,19 +7241,20 @@ pub const FuncGen = struct {
72417241 const o = self.ng.object;
72427242 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
72437243 const extra = self.air.extraData(Air.Asm, ty_pl.payload);
7244 const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;
7245 const clobbers_len: u31 = @truncate(extra.data.flags);
7244 const is_volatile = extra.data.flags.is_volatile;
7245 const outputs_len = extra.data.flags.outputs_len;
7246 const gpa = self.gpa;
72467247 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]);
72497250 extra_i += outputs.len;
72507251 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
72517252 extra_i += inputs.len;
72527253
72537254 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);
72577258 defer arena_allocator.deinit();
72587259 const arena = arena_allocator.allocator();
72597260
......@@ -7276,7 +7277,7 @@ pub const FuncGen = struct {
72767277
72777278 var llvm_ret_i: usize = 0;
72787279 var llvm_param_i: usize = 0;
7279 var total_i: u16 = 0;
7280 var total_i: usize = 0;
72807281
72817282 var name_map: std.StringArrayHashMapUnmanaged(u16) = .empty;
72827283 try name_map.ensureUnusedCapacity(arena, max_param_count);
......@@ -7290,7 +7291,7 @@ pub const FuncGen = struct {
72907291 // for the string, we still use the next u32 for the null terminator.
72917292 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);
72947295 if (total_i != 0) {
72957296 llvm_constraints.appendAssumeCapacity(',');
72967297 }
......@@ -7358,7 +7359,7 @@ pub const FuncGen = struct {
73587359 if (!std.mem.eql(u8, name, "_")) {
73597360 const gop = name_map.getOrPutAssumeCapacity(name);
73607361 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);
73627363 }
73637364 total_i += 1;
73647365 }
......@@ -7399,7 +7400,7 @@ pub const FuncGen = struct {
73997400 }
74007401 }
74017402
7402 try llvm_constraints.ensureUnusedCapacity(self.gpa, constraint.len + 1);
7403 try llvm_constraints.ensureUnusedCapacity(gpa, constraint.len + 1);
74037404 if (total_i != 0) {
74047405 llvm_constraints.appendAssumeCapacity(',');
74057406 }
......@@ -7413,7 +7414,7 @@ pub const FuncGen = struct {
74137414 if (!std.mem.eql(u8, name, "_")) {
74147415 const gop = name_map.getOrPutAssumeCapacity(name);
74157416 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);
74177418 }
74187419
74197420 // In the case of indirect inputs, LLVM requires the callsite to have
......@@ -7456,7 +7457,7 @@ pub const FuncGen = struct {
74567457 llvm_param_types[llvm_param_i] = llvm_elem_ty;
74577458 }
74587459
7459 try llvm_constraints.print(self.gpa, ",{d}", .{output_index});
7460 try llvm_constraints.print(gpa, ",{d}", .{output_index});
74607461
74617462 // In the case of indirect inputs, LLVM requires the callsite to have
74627463 // an elementtype(<ty>) attribute.
......@@ -7466,24 +7467,30 @@ pub const FuncGen = struct {
74667467 total_i += 1;
74677468 }
74687469
7469 {
7470 var clobber_i: u32 = 0;
7471 while (clobber_i < clobbers_len) : (clobber_i += 1) {
7472 const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);
7473 // This equation accounts for the fact that even if we have exactly 4 bytes
7474 // for the string, we still use the next u32 for the null terminator.
7475 extra_i += clobber.len / 4 + 1;
7476
7477 try llvm_constraints.ensureUnusedCapacity(self.gpa, clobber.len + 4);
7478 if (total_i != 0) {
7479 llvm_constraints.appendAssumeCapacity(',');
7470 const ip = &zcu.intern_pool;
7471 const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
7472 const struct_type: Type = .fromInterned(aggregate.ty);
7473 if (total_i != 0) try llvm_constraints.append(gpa, ',');
7474 switch (aggregate.storage) {
7475 .elems => |elems| for (elems, 0..) |elem, i| {
7476 switch (elem) {
7477 .bool_true => {
7478 const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
7479 total_i += try appendConstraints(gpa, &llvm_constraints, name, target);
7480 },
7481 .bool_false => continue,
7482 else => unreachable,
74807483 }
7481 llvm_constraints.appendSliceAssumeCapacity("~{");
7482 llvm_constraints.appendSliceAssumeCapacity(clobber);
7483 llvm_constraints.appendSliceAssumeCapacity("}");
7484
7485 total_i += 1;
7486 }
7484 },
7485 .repeated_elem => |elem| switch (elem) {
7486 .bool_true => for (0..struct_type.structFieldCount(zcu)) |i| {
7487 const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
7488 total_i += try appendConstraints(gpa, &llvm_constraints, name, target);
7489 },
7490 .bool_false => {},
7491 else => unreachable,
7492 },
7493 .bytes => @panic("TODO"),
74877494 }
74887495
74897496 // We have finished scanning through all inputs/outputs, so the number of
......@@ -7497,22 +7504,22 @@ pub const FuncGen = struct {
74977504 // to be buggy and regress often.
74987505 switch (target.cpu.arch) {
74997506 .x86_64, .x86 => {
7500 if (total_i != 0) try llvm_constraints.append(self.gpa, ',');
7501 try llvm_constraints.appendSlice(self.gpa, "~{dirflag},~{fpsr},~{flags}");
7507 try llvm_constraints.appendSlice(gpa, "~{dirflag},~{fpsr},~{flags},");
75027508 total_i += 3;
75037509 },
75047510 .mips, .mipsel, .mips64, .mips64el => {
7505 if (total_i != 0) try llvm_constraints.append(self.gpa, ',');
7506 try llvm_constraints.appendSlice(self.gpa, "~{$1}");
7511 try llvm_constraints.appendSlice(gpa, "~{$1},");
75077512 total_i += 1;
75087513 },
75097514 else => {},
75107515 }
75117516
7517 if (std.mem.endsWith(u8, llvm_constraints.items, ",")) llvm_constraints.items.len -= 1;
7518
75127519 const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];
75137520
75147521 // 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);
75167523 defer rendered_template.deinit();
75177524
75187525 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)
1318813195 try res.setTwosCompIntLimit(.max, info.signedness, info.bits);
1318913196 return b.bigIntConst(as_ty, res.toConst());
1319013197}
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 {
63876387 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
63886388 const extra = self.air.extraData(Air.Asm, ty_pl.payload);
63896389
6390 const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;
6391 const clobbers_len: u31 = @truncate(extra.data.flags);
6390 const is_volatile = extra.data.flags.is_volatile;
6391 const outputs_len = extra.data.flags.outputs_len;
63926392
63936393 if (!is_volatile and self.liveness.isUnused(inst)) return null;
63946394
63956395 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]);
63976397 extra_i += outputs.len;
63986398 const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
63996399 extra_i += inputs.len;
......@@ -6402,7 +6402,7 @@ const NavGen = struct {
64026402 return self.todo("implement inline asm with more than 1 output", .{});
64036403 }
64046404
6405 var as = SpvAssembler{
6405 var as: SpvAssembler = .{
64066406 .gpa = self.gpa,
64076407 .spv = self.spv,
64086408 .func = &self.func,
......@@ -6486,14 +6486,8 @@ const NavGen = struct {
64866486 }
64876487 }
64886488
6489 {
6490 var clobber_i: u32 = 0;
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 }
6489 // TODO: do something with clobbers
6490 _ = extra.data.clobbers;
64976491
64986492 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" {
5555 asm volatile (""
5656 : [_] "=m,r" (a),
5757 :
58 : ""
59 );
58 : .{});
6059 asm volatile (""
6160 : [_] "=r,m" (a),
6261 :
63 : ""
64 );
62 : .{});
6563}
6664
6765test "alternative constraints" {
......@@ -79,7 +77,6 @@ test "alternative constraints" {
7977 asm volatile (""
8078 : [_] "=r,m" (a),
8179 : [_] "r,m" (a),
82 : ""
8380 );
8481}
8582
......@@ -96,42 +93,34 @@ test "sized integer/float in asm input" {
9693 asm volatile (""
9794 :
9895 : [_] "m" (@as(usize, 3)),
99 : ""
10096 );
10197 asm volatile (""
10298 :
10399 : [_] "m" (@as(i15, -3)),
104 : ""
105100 );
106101 asm volatile (""
107102 :
108103 : [_] "m" (@as(u3, 3)),
109 : ""
110104 );
111105 asm volatile (""
112106 :
113107 : [_] "m" (@as(i3, 3)),
114 : ""
115108 );
116109 asm volatile (""
117110 :
118111 : [_] "m" (@as(u121, 3)),
119 : ""
120112 );
121113 asm volatile (""
122114 :
123115 : [_] "m" (@as(i121, 3)),
124 : ""
125116 );
126117 asm volatile (""
127118 :
128119 : [_] "m" (@as(f32, 3.17)),
129 : ""
130120 );
131121 asm volatile (""
132122 :
133123 : [_] "m" (@as(f64, 3.17)),
134 : ""
135124 );
136125}
137126
......@@ -172,8 +161,7 @@ test "rw constraint (x86_64)" {
172161 asm ("addl %[b], %[a]"
173162 : [a] "+r" (res),
174163 : [b] "r" (@as(i32, 13)),
175 : "flags"
176 );
164 : .{ .flags = true });
177165 try expectEqual(@as(i32, 18), res);
178166}
179167
test/cases/llvm/f_segment_address_space_reading_and_writing.zig+2-2
......@@ -9,7 +9,7 @@ fn setFs(value: c_ulong) void {
99 : [number] "{rax}" (158),
1010 [code] "{rdi}" (0x1002),
1111 [val] "{rsi}" (value),
12 : "rcx", "r11", "memory"
12 : .{ .rcx = true, .r11 = true, .memory = true }
1313 );
1414}
1515
......@@ -21,7 +21,7 @@ fn getFs() c_ulong {
2121 : [number] "{rax}" (158),
2222 [code] "{rdi}" (0x1003),
2323 [ptr] "{rsi}" (@intFromPtr(&result)),
24 : "rcx", "r11", "memory"
24 : .{ .rcx = true, .r11 = true, .memory = true }
2525 );
2626 return result;
2727}
test/standalone/build.zig+19-1
......@@ -38,20 +38,38 @@ pub fn build(b: *std.Build) void {
3838 "../../tools/gen_spirv_spec.zig",
3939 "../../tools/gen_stubs.zig",
4040 "../../tools/generate_c_size_and_align_checks.zig",
41 "../../tools/generate_JSONTestSuite.zig",
4142 "../../tools/generate_linux_syscalls.zig",
4243 "../../tools/process_headers.zig",
44 "../../tools/migrate_langref.zig",
4345 "../../tools/update-linux-headers.zig",
4446 "../../tools/update_clang_options.zig",
4547 "../../tools/update_cpu_features.zig",
48 "../../tools/update_crc_catalog.zig",
4649 "../../tools/update_freebsd_libc.zig",
4750 "../../tools/update_glibc.zig",
51 "../../tools/update_mingw.zig",
4852 "../../tools/update_netbsd_libc.zig",
53 }) |tool_src_path| {
54 if (std.mem.endsWith(u8, tool_src_path, "dump-cov.zig") and tools_target.result.os.tag == .windows) continue;
55
56 const tool = b.addExecutable(.{
57 .name = std.fs.path.stem(tool_src_path),
58 .root_module = b.createModule(.{
59 .root_source_file = b.path(tool_src_path),
60 .target = tools_target,
61 }),
62 });
63 tools_tests_step.dependOn(&tool.step);
64 }
65 for ([_][]const u8{
66 // Alphabetically sorted. Only ones with `test` blocks.
67 "../../tools/doctest.zig",
4968 }) |tool_src_path| {
5069 const tool = b.addTest(.{
5170 .name = std.fs.path.stem(tool_src_path),
5271 .root_module = b.createModule(.{
5372 .root_source_file = b.path(tool_src_path),
54 .optimize = .Debug,
5573 .target = tools_target,
5674 }),
5775 });
test/standalone/stack_iterator/unwind.zig+4-4
......@@ -31,7 +31,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
3131 \\movl $7, %%edi
3232 \\movl $6, %%esi
3333 \\movl $5, %%ebp
34 ::: "ebx", "ecx", "edx", "edi", "esi", "ebp");
34 ::: .{ .ebx = true, .ecx = true, .edx = true, .edi = true, .esi = true, .ebp = true });
3535 } else {
3636 asm volatile (
3737 \\movl $3, %%ebx
......@@ -39,7 +39,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
3939 \\movl $2, %%edx
4040 \\movl $7, %%edi
4141 \\movl $6, %%esi
42 ::: "ebx", "ecx", "edx", "edi", "esi");
42 ::: .{ .ebx = true, .ecx = true, .edx = true, .edi = true, .esi = true });
4343 }
4444 },
4545 .x86_64 => {
......@@ -51,7 +51,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
5151 \\movq $14, %%r14
5252 \\movq $15, %%r15
5353 \\movq $6, %%rbp
54 ::: "rbx", "r12", "r13", "r14", "r15", "rbp");
54 ::: .{ .rbx = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .rbp = true });
5555 } else {
5656 asm volatile (
5757 \\movq $3, %%rbx
......@@ -59,7 +59,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
5959 \\movq $13, %%r13
6060 \\movq $14, %%r14
6161 \\movq $15, %%r15
62 ::: "rbx", "r12", "r13", "r14", "r15");
62 ::: .{ .rbx = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true });
6363 }
6464 },
6565 else => {},
test/standalone/stack_iterator/unwind_freestanding.zig+1-2
......@@ -58,8 +58,7 @@ export fn _start() callconv(.c) noreturn {
5858 \\syscall
5959 :
6060 : [missed] "{edi}" (missed),
61 : "edi", "eax"
62 );
61 : .{ .edi = true, .eax = true });
6362
6463 while (true) {} // unreached
6564}
test/tests.zig+4
......@@ -847,6 +847,7 @@ const test_targets = blk: {
847847 .arch_os_abi = "riscv32-linux-none",
848848 .cpu_features = "baseline-d-f",
849849 }) catch unreachable,
850 .extra_target = true,
850851 },
851852 .{
852853 .target = .{
......@@ -872,6 +873,7 @@ const test_targets = blk: {
872873 .cpu_features = "baseline-d-f",
873874 }) catch unreachable,
874875 .link_libc = true,
876 .extra_target = true,
875877 },
876878 .{
877879 .target = .{
......@@ -904,6 +906,7 @@ const test_targets = blk: {
904906 .arch_os_abi = "riscv64-linux-none",
905907 .cpu_features = "baseline-d-f",
906908 }) catch unreachable,
909 .extra_target = true,
907910 },
908911 .{
909912 .target = .{
......@@ -929,6 +932,7 @@ const test_targets = blk: {
929932 .cpu_features = "baseline-d-f",
930933 }) catch unreachable,
931934 .link_libc = true,
935 .extra_target = true,
932936 },
933937 .{
934938 .target = .{
tools/fetch_them_macos_headers.zig+5-9
......@@ -87,7 +87,7 @@ pub fn main() anyerror!void {
8787
8888 const sysroot_path = sysroot orelse blk: {
8989 const target = try std.zig.system.resolveTargetQuery(.{});
90 break :blk std.zig.system.darwin.getSdk(allocator, target) orelse
90 break :blk std.zig.system.darwin.getSdk(allocator, &target) orelse
9191 fatal("no SDK found; you can provide one explicitly with '--sysroot' flag", .{});
9292 };
9393
......@@ -112,7 +112,7 @@ pub fn main() anyerror!void {
112112 15 => .sequoia,
113113 else => unreachable,
114114 };
115 info("found SDK deployment target macOS {} aka '{s}'", .{ version, @tagName(os_ver) });
115 info("found SDK deployment target macOS {f} aka '{s}'", .{ version, @tagName(os_ver) });
116116
117117 var tmp = tmpDir(.{});
118118 defer tmp.cleanup();
......@@ -198,7 +198,7 @@ fn fetchTarget(
198198 var dirs = std.StringHashMap(fs.Dir).init(arena);
199199 try dirs.putNoClobber(".", dest_dir);
200200
201 const headers_list_str = try headers_list_file.reader().readAllAlloc(arena, std.math.maxInt(usize));
201 const headers_list_str = try headers_list_file.deprecatedReader().readAllAlloc(arena, std.math.maxInt(usize));
202202 const prefix = "/usr/include";
203203
204204 var it = mem.splitScalar(u8, headers_list_str, '\n');
......@@ -270,12 +270,8 @@ const Version = struct {
270270
271271 pub fn format(
272272 v: Version,
273 comptime unused_fmt_string: []const u8,
274 options: std.fmt.FormatOptions,
275 writer: anytype,
276 ) !void {
277 _ = unused_fmt_string;
278 _ = options;
273 writer: *std.Io.Writer,
274 ) std.Io.Writer.Error!void {
279275 try writer.print("{d}.{d}.{d}", .{ v.major, v.minor, v.patch });
280276 }
281277};
tools/gen_stubs.zig+1-1
......@@ -303,7 +303,7 @@ pub fn main() !void {
303303 libc_so_path,
304304 100 * 1024 * 1024,
305305 1 * 1024 * 1024,
306 @alignOf(elf.Elf64_Ehdr),
306 .of(elf.Elf64_Ehdr),
307307 null,
308308 ) catch |err| {
309309 std.debug.panic("unable to read '{s}/{s}': {s}", .{
tools/generate_linux_syscalls.zig+7-7
......@@ -477,7 +477,7 @@ fn processPreprocessedFile(
477477 const name = (getOverridenNameNew(value) orelse sys_name)["sys_".len..];
478478 const fixed_name = if (stdlib_renames_new.get(name)) |f| f else if (stdlib_renames.get(name)) |f| f else name;
479479
480 try writer.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), value });
480 try writer.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), value });
481481 }
482482}
483483
......@@ -510,7 +510,7 @@ fn processTableBasedArch(
510510 }
511511 const fixed_name = if (filters.fixedName) |fixedNameFn| fixedNameFn(name) else name;
512512
513 try writer.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
513 try writer.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
514514 }
515515}
516516
......@@ -543,7 +543,7 @@ fn processMipsBasedArch(
543543 }
544544 const fixed_name = if (filters.fixedName) |fixedNameFn| fixedNameFn(name) else name;
545545
546 try writer.print(" {p} = linux_base + {s},\n", .{ zig.fmtId(fixed_name), number });
546 try writer.print(" {f} = linux_base + {s},\n", .{ zig.fmtId(fixed_name), number });
547547 }
548548}
549549
......@@ -568,12 +568,12 @@ fn processPowerPcBasedArch(
568568 if (mem.eql(u8, abi, "spu")) {
569569 continue;
570570 } else if (mem.eql(u8, abi, "32")) {
571 try writer.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
571 try writer.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
572572 } else if (mem.eql(u8, abi, "64")) {
573 try optional_writer.?.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
573 try optional_writer.?.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
574574 } else { // common/nospu
575 try writer.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
576 try optional_writer.?.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
575 try writer.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
576 try optional_writer.?.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
577577 }
578578 }
579579}
tools/migrate_langref.zig+18-18
......@@ -27,9 +27,9 @@ pub fn main() !void {
2727 var out_dir = try fs.cwd().openDir(fs.path.dirname(output_file).?, .{});
2828 defer out_dir.close();
2929
30 const input_file_bytes = try in_file.reader().readAllAlloc(arena, std.math.maxInt(u32));
30 const input_file_bytes = try in_file.deprecatedReader().readAllAlloc(arena, std.math.maxInt(u32));
3131
32 var buffered_writer = io.bufferedWriter(out_file.writer());
32 var buffered_writer = io.bufferedWriter(out_file.deprecatedWriter());
3333
3434 var tokenizer = Tokenizer.init(input_file, input_file_bytes);
3535
......@@ -388,39 +388,39 @@ fn walk(arena: Allocator, tokenizer: *Tokenizer, out_dir: std.fs.Dir, w: anytype
388388 try file.writeAll("\n\n");
389389
390390 if (just_check_syntax) {
391 try file.writer().print("// syntax\n", .{});
391 try file.deprecatedWriter().print("// syntax\n", .{});
392392 } else switch (code_kind_id) {
393 .@"test" => try file.writer().print("// test\n", .{}),
394 .lib => try file.writer().print("// lib\n", .{}),
395 .test_error => |s| try file.writer().print("// test_error={s}\n", .{s}),
396 .test_safety => |s| try file.writer().print("// test_safety={s}\n", .{s}),
397 .exe => |s| try file.writer().print("// exe={s}\n", .{@tagName(s)}),
393 .@"test" => try file.deprecatedWriter().print("// test\n", .{}),
394 .lib => try file.deprecatedWriter().print("// lib\n", .{}),
395 .test_error => |s| try file.deprecatedWriter().print("// test_error={s}\n", .{s}),
396 .test_safety => |s| try file.deprecatedWriter().print("// test_safety={s}\n", .{s}),
397 .exe => |s| try file.deprecatedWriter().print("// exe={s}\n", .{@tagName(s)}),
398398 .obj => |opt| if (opt) |s| {
399 try file.writer().print("// obj={s}\n", .{s});
399 try file.deprecatedWriter().print("// obj={s}\n", .{s});
400400 } else {
401 try file.writer().print("// obj\n", .{});
401 try file.deprecatedWriter().print("// obj\n", .{});
402402 },
403403 }
404404
405405 if (mode != .Debug)
406 try file.writer().print("// optimize={s}\n", .{@tagName(mode)});
406 try file.deprecatedWriter().print("// optimize={s}\n", .{@tagName(mode)});
407407
408408 for (link_objects.items) |link_object| {
409 try file.writer().print("// link_object={s}\n", .{link_object});
409 try file.deprecatedWriter().print("// link_object={s}\n", .{link_object});
410410 }
411411
412412 if (target_str) |s|
413 try file.writer().print("// target={s}\n", .{s});
413 try file.deprecatedWriter().print("// target={s}\n", .{s});
414414
415 if (link_libc) try file.writer().print("// link_libc\n", .{});
416 if (disable_cache) try file.writer().print("// disable_cache\n", .{});
417 if (verbose_cimport) try file.writer().print("// verbose_cimport\n", .{});
415 if (link_libc) try file.deprecatedWriter().print("// link_libc\n", .{});
416 if (disable_cache) try file.deprecatedWriter().print("// disable_cache\n", .{});
417 if (verbose_cimport) try file.deprecatedWriter().print("// verbose_cimport\n", .{});
418418
419419 if (link_mode) |m|
420 try file.writer().print("// link_mode={s}\n", .{@tagName(m)});
420 try file.deprecatedWriter().print("// link_mode={s}\n", .{@tagName(m)});
421421
422422 for (additional_options.items) |o| {
423 try file.writer().print("// additional_option={s}\n", .{o});
423 try file.deprecatedWriter().print("// additional_option={s}\n", .{o});
424424 }
425425 try w.print("{{#code|{s}#}}\n", .{basename});
426426 } else {
tools/process_headers.zig+7-7
......@@ -266,10 +266,10 @@ pub fn main() !void {
266266 if (gop.found_existing) {
267267 max_bytes_saved += raw_bytes.len;
268268 gop.value_ptr.hit_count += 1;
269 std.debug.print("duplicate: {s} {s} ({:2})\n", .{
269 std.debug.print("duplicate: {s} {s} ({B})\n", .{
270270 libc_dir,
271271 rel_path,
272 std.fmt.fmtIntSizeDec(raw_bytes.len),
272 raw_bytes.len,
273273 });
274274 } else {
275275 gop.value_ptr.* = Contents{
......@@ -311,9 +311,9 @@ pub fn main() !void {
311311 std.debug.print("warning: libc target not found: {s}\n", .{libc_dir});
312312 }
313313 }
314 std.debug.print("summary: {:2} could be reduced to {:2}\n", .{
315 std.fmt.fmtIntSizeDec(total_bytes),
316 std.fmt.fmtIntSizeDec(total_bytes - max_bytes_saved),
314 std.debug.print("summary: {B} could be reduced to {B}\n", .{
315 total_bytes,
316 total_bytes - max_bytes_saved,
317317 });
318318 try std.fs.cwd().makePath(out_dir);
319319
......@@ -343,8 +343,8 @@ pub fn main() !void {
343343 if (contender.hit_count > 1) {
344344 const this_missed_bytes = contender.hit_count * contender.bytes.len;
345345 missed_opportunity_bytes += this_missed_bytes;
346 std.debug.print("Missed opportunity ({:2}): {s}\n", .{
347 std.fmt.fmtIntSizeDec(this_missed_bytes),
346 std.debug.print("Missed opportunity ({B}): {s}\n", .{
347 this_missed_bytes,
348348 path_kv.key_ptr.*,
349349 });
350350 } else break;
tools/update-linux-headers.zig+7-7
......@@ -218,10 +218,10 @@ pub fn main() !void {
218218 if (gop.found_existing) {
219219 max_bytes_saved += raw_bytes.len;
220220 gop.value_ptr.hit_count += 1;
221 std.debug.print("duplicate: {s} {s} ({:2})\n", .{
221 std.debug.print("duplicate: {s} {s} ({B})\n", .{
222222 linux_target.name,
223223 rel_path,
224 std.fmt.fmtIntSizeDec(raw_bytes.len),
224 raw_bytes.len,
225225 });
226226 } else {
227227 gop.value_ptr.* = Contents{
......@@ -249,9 +249,9 @@ pub fn main() !void {
249249 std.debug.print("warning: libc target not found: {s}\n", .{linux_target.name});
250250 }
251251 }
252 std.debug.print("summary: {:2} could be reduced to {:2}\n", .{
253 std.fmt.fmtIntSizeDec(total_bytes),
254 std.fmt.fmtIntSizeDec(total_bytes - max_bytes_saved),
252 std.debug.print("summary: {B} could be reduced to {B}\n", .{
253 total_bytes,
254 total_bytes - max_bytes_saved,
255255 });
256256 try std.fs.cwd().makePath(out_dir);
257257
......@@ -281,8 +281,8 @@ pub fn main() !void {
281281 if (contender.hit_count > 1) {
282282 const this_missed_bytes = contender.hit_count * contender.bytes.len;
283283 missed_opportunity_bytes += this_missed_bytes;
284 std.debug.print("Missed opportunity ({:2}): {s}\n", .{
285 std.fmt.fmtIntSizeDec(this_missed_bytes),
284 std.debug.print("Missed opportunity ({B}): {s}\n", .{
285 this_missed_bytes,
286286 path_kv.key_ptr.*,
287287 });
288288 } else break;
tools/update_clang_options.zig+6-10
......@@ -635,7 +635,7 @@ pub fn main() anyerror!void {
635635 const args = try std.process.argsAlloc(allocator);
636636
637637 var stdout_buffer: [4000]u8 = undefined;
638 var stdout_writer = fs.stdout().writerStreaming(&stdout_buffer);
638 var stdout_writer = fs.File.stdout().writerStreaming(&stdout_buffer);
639639 const stdout = &stdout_writer.interface;
640640
641641 if (args.len <= 1) printUsageAndExit(args[0]);
......@@ -767,7 +767,7 @@ pub fn main() anyerror!void {
767767 try stdout.print(
768768 \\.{{
769769 \\ .name = "{s}",
770 \\ .syntax = {s},
770 \\ .syntax = {f},
771771 \\ .zig_equivalent = .{s},
772772 \\ .pd1 = {},
773773 \\ .pd2 = {},
......@@ -797,7 +797,7 @@ pub fn main() anyerror!void {
797797 try stdout.print(
798798 \\.{{
799799 \\ .name = "{s}",
800 \\ .syntax = {s},
800 \\ .syntax = {f},
801801 \\ .zig_equivalent = .other,
802802 \\ .pd1 = {},
803803 \\ .pd2 = {},
......@@ -845,14 +845,10 @@ const Syntax = union(enum) {
845845
846846 pub fn format(
847847 self: Syntax,
848 comptime fmt: []const u8,
849 options: std.fmt.FormatOptions,
850 out_stream: anytype,
851 ) !void {
852 _ = fmt;
853 _ = options;
848 out_stream: *std.Io.Writer,
849 ) std.Io.Writer.Error!void {
854850 switch (self) {
855 .multi_arg => |n| return out_stream.print(".{{.{s}={}}}", .{ @tagName(self), n }),
851 .multi_arg => |n| return out_stream.print(".{{.{t}={d}}}", .{ self, n }),
856852 else => return out_stream.print(".{s}", .{@tagName(self)}),
857853 }
858854 }
tools/update_cpu_features.zig+22-22
......@@ -1906,7 +1906,7 @@ fn processOneTarget(job: Job) void {
19061906 var zig_code_file = try target_dir.createFile(zig_code_basename, .{});
19071907 defer zig_code_file.close();
19081908
1909 var bw = std.io.bufferedWriter(zig_code_file.writer());
1909 var bw = std.io.bufferedWriter(zig_code_file.deprecatedWriter());
19101910 const w = bw.writer();
19111911
19121912 try w.writeAll(
......@@ -1920,7 +1920,7 @@ fn processOneTarget(job: Job) void {
19201920 );
19211921
19221922 for (all_features.items, 0..) |feature, i| {
1923 try w.print("\n {p},", .{std.zig.fmtId(feature.zig_name)});
1923 try w.print("\n {f},", .{std.zig.fmtId(feature.zig_name)});
19241924
19251925 if (i == all_features.items.len - 1) try w.writeAll("\n");
19261926 }
......@@ -1949,27 +1949,27 @@ fn processOneTarget(job: Job) void {
19491949 for (all_features.items) |feature| {
19501950 if (feature.llvm_name) |llvm_name| {
19511951 try w.print(
1952 \\ result[@intFromEnum(Feature.{p_})] = .{{
1953 \\ .llvm_name = "{}",
1954 \\ .description = "{}",
1952 \\ result[@intFromEnum(Feature.{f})] = .{{
1953 \\ .llvm_name = "{f}",
1954 \\ .description = "{f}",
19551955 \\ .dependencies = featureSet(&[_]Feature{{
19561956 ,
19571957 .{
1958 std.zig.fmtId(feature.zig_name),
1959 std.zig.fmtEscapes(llvm_name),
1960 std.zig.fmtEscapes(feature.desc),
1958 std.zig.fmtIdPU(feature.zig_name),
1959 std.zig.fmtString(llvm_name),
1960 std.zig.fmtString(feature.desc),
19611961 },
19621962 );
19631963 } else {
19641964 try w.print(
1965 \\ result[@intFromEnum(Feature.{p_})] = .{{
1965 \\ result[@intFromEnum(Feature.{f})] = .{{
19661966 \\ .llvm_name = null,
1967 \\ .description = "{}",
1967 \\ .description = "{f}",
19681968 \\ .dependencies = featureSet(&[_]Feature{{
19691969 ,
19701970 .{
1971 std.zig.fmtId(feature.zig_name),
1972 std.zig.fmtEscapes(feature.desc),
1971 std.zig.fmtIdPU(feature.zig_name),
1972 std.zig.fmtString(feature.desc),
19731973 },
19741974 );
19751975 }
......@@ -1996,7 +1996,7 @@ fn processOneTarget(job: Job) void {
19961996 } else {
19971997 try w.writeAll("\n");
19981998 for (dependencies.items) |dep| {
1999 try w.print(" .{p_},\n", .{std.zig.fmtId(dep)});
1999 try w.print(" .{f},\n", .{std.zig.fmtIdPU(dep)});
20002000 }
20012001 try w.writeAll(
20022002 \\ }),
......@@ -2033,24 +2033,24 @@ fn processOneTarget(job: Job) void {
20332033 mem.sort([]const u8, cpu_features.items, {}, asciiLessThan);
20342034 if (cpu.llvm_name) |llvm_name| {
20352035 try w.print(
2036 \\ pub const {}: CpuModel = .{{
2037 \\ .name = "{}",
2038 \\ .llvm_name = "{}",
2036 \\ pub const {f}: CpuModel = .{{
2037 \\ .name = "{f}",
2038 \\ .llvm_name = "{f}",
20392039 \\ .features = featureSet(&[_]Feature{{
20402040 , .{
20412041 std.zig.fmtId(cpu.zig_name),
2042 std.zig.fmtEscapes(cpu.zig_name),
2043 std.zig.fmtEscapes(llvm_name),
2042 std.zig.fmtString(cpu.zig_name),
2043 std.zig.fmtString(llvm_name),
20442044 });
20452045 } else {
20462046 try w.print(
2047 \\ pub const {}: CpuModel = .{{
2048 \\ .name = "{}",
2047 \\ pub const {f}: CpuModel = .{{
2048 \\ .name = "{f}",
20492049 \\ .llvm_name = null,
20502050 \\ .features = featureSet(&[_]Feature{{
20512051 , .{
20522052 std.zig.fmtId(cpu.zig_name),
2053 std.zig.fmtEscapes(cpu.zig_name),
2053 std.zig.fmtString(cpu.zig_name),
20542054 });
20552055 }
20562056 if (cpu_features.items.len == 0) {
......@@ -2062,7 +2062,7 @@ fn processOneTarget(job: Job) void {
20622062 } else {
20632063 try w.writeAll("\n");
20642064 for (cpu_features.items) |feature_zig_name| {
2065 try w.print(" .{p_},\n", .{std.zig.fmtId(feature_zig_name)});
2065 try w.print(" .{f},\n", .{std.zig.fmtIdPU(feature_zig_name)});
20662066 }
20672067 try w.writeAll(
20682068 \\ }),
tools/update_crc_catalog.zig+2-2
......@@ -30,7 +30,7 @@ pub fn main() anyerror!void {
3030 var zig_code_file = try hash_target_dir.createFile("crc.zig", .{});
3131 defer zig_code_file.close();
3232
33 var cbw = std.io.bufferedWriter(zig_code_file.writer());
33 var cbw = std.io.bufferedWriter(zig_code_file.deprecatedWriter());
3434 defer cbw.flush() catch unreachable;
3535 const code_writer = cbw.writer();
3636
......@@ -55,7 +55,7 @@ pub fn main() anyerror!void {
5555 var zig_test_file = try crc_target_dir.createFile("test.zig", .{});
5656 defer zig_test_file.close();
5757
58 var tbw = std.io.bufferedWriter(zig_test_file.writer());
58 var tbw = std.io.bufferedWriter(zig_test_file.deprecatedWriter());
5959 defer tbw.flush() catch unreachable;
6060 const test_writer = tbw.writer();
6161