History

make variadic args explicit

Some abis, like the riscv one, treat arguments differently depending on whether they are variadic or not. To prepare for the upcomming riscv target, we change the variadic call syntax and give meaning to the location of the '...' marker. # new syntax %ret =w call $f(w %regular, ..., w %variadic) By nature of their abis, the change is backwards compatible for existing targets.

Quentin Carbonneaux committed 5 years ago

Commit fcdef101 parent 9858a1213 files · +101 −75Browse files

Unified · Split

13 files
  1. all.h +1 −2
  2. amd64/sysv.c +21 −13
  3. arm64/abi.c +11 −6
  4. doc/il.txt +3 −3
  5. live.c +1 −1
  6. load.c +1 −1
  7. ops.h +1 −1
  8. parse.c +31 −17
  9. test/_slow.qbe +5 −5
  10. test/abi5.ssa +9 −9
  11. test/abi6.ssa +2 −2
  12. test/echo.ssa +1 −1
  13. test/vararg2.ssa +14 −14
all.h+1−2
@@ -171,12 +171,11 @@ enum { · 170 unmodified lines
171171 };
172172
173173 #define INRANGE(x, l, u) ((unsigned)(x) - l <= u - l) /* linear in x */
174−#define iscall(o) INRANGE(o, Ocall, Ovacall)
175174 #define isstore(o) INRANGE(o, Ostoreb, Ostored)
176175 #define isload(o) INRANGE(o, Oloadsb, Oload)
177176 #define isext(o) INRANGE(o, Oextsb, Oextuw)
178177 #define ispar(o) INRANGE(o, Opar, Opare)
179−#define isarg(o) INRANGE(o, Oarg, Oarge)
178+#define isarg(o) INRANGE(o, Oarg, Oargv)
180179 #define isret(j) INRANGE(j, Jret0, Jretc)
181180
182181 enum Class {
amd64/sysv.c+21−13
@@ -153,7 +153,7 @@ selret(Blk *b, Fn *fn) · 152 unmodified lines
153153 static int
154154 argsclass(Ins *i0, Ins *i1, AClass *ac, int op, AClass *aret, Ref *env)
155155 {
156− int nint, ni, nsse, ns, n, *pn;
156+ int varc, envc, nint, ni, nsse, ns, n, *pn;
157157 AClass *a;
158158 Ins *i;
159159
@@ -162,6 +162,8 @@ argsclass(Ins *i0, Ins *i1, AClass *ac, int op, AClass *aret, Ref *env) · 2 unmodified lines
162162 else
163163 nint = 6;
164164 nsse = 8;
165+ varc = 0;
166+ envc = 0;
165167 for (i=i0, a=ac; i<i1; i++, a++)
166168 switch (i->op - op + Oarg) {
167169 case Oarg:
@@ -196,14 +198,23 @@ argsclass(Ins *i0, Ins *i1, AClass *ac, int op, AClass *aret, Ref *env) · 28 unmodified lines
196198 a->inmem = 1;
197199 break;
198200 case Oarge:
201+ envc = 1;
199202 if (op == Opar)
200203 *env = i->to;
201204 else
202205 *env = i->arg[0];
203206 break;
207+ case Oargv:
208+ varc = 1;
209+ break;
210+ default:
211+ die("unreachable");
204212 }
205213
206− return (!req(R, *env) << 12) | ((6-nint) << 4) | ((8-nsse) << 8);
214+ if (varc && envc)
215+ err("sysv abi does not support variadic env calls");
216+
217+ return ((varc|envc) << 12) | ((6-nint) << 4) | ((8-nsse) << 8);
207218 }
208219
209220 int amd64_sysv_rsave[] = {
@@ -290,7 +301,7 @@ selcall(Fn *fn, Ins *i0, Ins *i1, RAlloc **rap) · 80 unmodified lines
290301 {
291302 Ins *i;
292303 AClass *ac, *a, aret;
293− int ca, ni, ns, al, varc, envc;
304+ int ca, ni, ns, al;
294305 uint stk, off;
295306 Ref r, r1, r2, reg[2], env;
296307 RAlloc *ra;
@@ -358,22 +369,20 @@ selcall(Fn *fn, Ins *i0, Ins *i1, RAlloc **rap) · 61 unmodified lines
358369 ca += 1 << 2;
359370 }
360371 }
361− envc = !req(R, env);
362− varc = i1->op == Ovacall;
363− if (varc && envc)
364− err("sysv abi does not support variadic env calls");
365− ca |= varc << 12; /* envc set in argsclass() */
372+
366373 emit(Ocall, i1->cls, R, i1->arg[0], CALL(ca));
367− if (envc)
374+
375+ if (!req(R, env))
368376 emit(Ocopy, Kl, TMP(RAX), env, R);
369− if (varc)
377+ else if ((ca >> 12) & 1) /* vararg call */
370378 emit(Ocopy, Kw, TMP(RAX), getcon((ca >> 8) & 15, fn), R);
371379
372380 ni = ns = 0;
373381 if (ra && aret.inmem)
374382 emit(Ocopy, Kl, rarg(Kl, &ni, &ns), ra->i.to, R); /* pass hidden argument */
383+
375384 for (i=i0, a=ac; i<i1; i++, a++) {
376− if (a->inmem || i->op == Oarge)
385+ if (i->op >= Oarge || a->inmem)
377386 continue;
378387 r1 = rarg(a->cls[0], &ni, &ns);
379388 if (i->op == Oargc) {
@@ -393,7 +402,7 @@ selcall(Fn *fn, Ins *i0, Ins *i1, RAlloc **rap) · 13 unmodified lines
393402
394403 r = newtmp("abi", Kl, fn);
395404 for (i=i0, a=ac, off=0; i<i1; i++, a++) {
396− if (!a->inmem)
405+ if (i->op >= Oarge || !a->inmem)
397406 continue;
398407 if (i->op == Oargc) {
399408 if (a->align == 4)
@@ -676,7 +685,6 @@ amd64_sysv_abi(Fn *fn) · 276 unmodified lines
676685 emiti(*i);
677686 break;
678687 case Ocall:
679− case Ovacall:
680688 for (i0=i; i0>b->ins; i0--)
681689 if (!isarg((i0-1)->op))
682690 break;
arm64/abi.c+11−6
@@ -255,6 +255,10 @@ argsclass(Ins *i0, Ins *i1, Class *carg, Ref *env) · 254 unmodified lines
255255 case Oarge:
256256 *env = i->arg[0];
257257 break;
258+ case Oargv:
259+ break;
260+ default:
261+ die("unreachable");
258262 }
259263
260264 return ((gp-gpreg) << 5) | ((fp-fpreg) << 9);
@@ -371,10 +375,11 @@ selcall(Fn *fn, Ins *i0, Ins *i1, Insl **ilp) · 110 unmodified lines
371375 }
372376 }
373377
378+ emit(Ocall, 0, R, i1->arg[0], CALL(cty));
379+
374380 envc = !req(R, env);
375381 if (envc)
376382 die("todo (arm abi): env calls");
377− emit(Ocall, 0, R, i1->arg[0], CALL(cty));
378383
379384 if (cty & (1 << 13))
380385 /* struct return argument */
@@ -383,9 +388,9 @@ selcall(Fn *fn, Ins *i0, Ins *i1, Insl **ilp) · 2 unmodified lines
383388 for (i=i0, c=ca; i<i1; i++, c++) {
384389 if ((c->class & Cstk) != 0)
385390 continue;
386− if (i->op != Oargc)
391+ if (i->op == Oarg)
387392 emit(Ocopy, *c->cls, TMP(*c->reg), i->arg[0], R);
388− else
393+ if (i->op == Oargc)
389394 ldregs(c->reg, c->cls, c->nreg, i->arg[1], fn);
390395 }
391396
@@ -393,11 +398,12 @@ selcall(Fn *fn, Ins *i0, Ins *i1, Insl **ilp) · 1 unmodified line
393398 for (i=i0, c=ca; i<i1; i++, c++) {
394399 if ((c->class & Cstk) == 0)
395400 continue;
396− if (i->op != Oargc) {
401+ if (i->op == Oarg) {
397402 r = newtmp("abi", Kl, fn);
398403 emit(Ostorel, 0, R, i->arg[0], r);
399404 emit(Oadd, Kl, r, TMP(SP), getcon(off, fn));
400− } else
405+ }
406+ if (i->op == Oargc)
401407 blit(TMP(SP), off, i->arg[1], c->size, fn);
402408 off += c->size;
403409 }
@@ -675,7 +681,6 @@ arm64_abi(Fn *fn) · 271 unmodified lines
675681 emiti(*i);
676682 break;
677683 case Ocall:
678− case Ovacall:
679684 for (i0=i; i0>b->ins; i0--)
680685 if (!isarg((i0-1)->op))
681686 break;
doc/il.txt+3−3
@@ -751,7 +751,7 @@ single-precision floating point number `%f` into `%rs`. · 750 unmodified lines
751751 ARG :=
752752 ABITY VAL # Regular argument
753753 | 'env' VAL # Environment argument (first)
754− | '...' # Variadic marker (last)
754+ | '...' # Variadic marker
755755
756756 ABITY := BASETY | :IDENT
757757
@@ -778,8 +778,8 @@ integer. If the called function does not expect an environment · 20 unmodified lines
778778 parameter, it will be safely discarded. See the <@ Functions >
779779 section for more information about environment parameters.
780780
781−When the called function is variadic, the last argument
782−must be `...`.
781+When the called function is variadic, there must be a `...`
782+marker separating the named and variadic arguments.
783783
784784 ~ Variadic
785785 ~~~~~~~~~~
live.c+1−1
@@ -82,7 +82,7 @@ Again: · 81 unmodified lines
8282 for (k=0; k<2; k++)
8383 b->nlive[k] = nlv[k];
8484 for (i=&b->ins[b->nins]; i!=b->ins;) {
85− if (iscall((--i)->op) && rtype(i->arg[1]) == RCall) {
85+ if ((--i)->op == Ocall && rtype(i->arg[1]) == RCall) {
8686 b->in->t[0] &= ~T.retregs(i->arg[1], m);
8787 for (k=0; k<2; k++) {
8888 nlv[k] -= m[k];
load.c+1−1
@@ -234,7 +234,7 @@ def(Slice sl, bits msk, Blk *b, Ins *i, Loc *il) · 233 unmodified lines
234234 while (i > b->ins) {
235235 --i;
236236 if (killsl(i->to, sl)
237− || (iscall(i->op) && escapes(sl.ref, curf)))
237+ || (i->op == Ocall && escapes(sl.ref, curf)))
238238 goto Load;
239239 ld = isload(i->op);
240240 if (ld) {
ops.h+1−1
@@ -137,8 +137,8 @@ O(pare, T(e,x,e,e, e,x,e,e), 0) X(0, 0, 0) · 136 unmodified lines
137137 O(arg, T(w,l,s,d, x,x,x,x), 0) X(0, 0, 0)
138138 O(argc, T(e,x,e,e, e,l,e,e), 0) X(0, 0, 0)
139139 O(arge, T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0)
140+O(argv, T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0)
140141 O(call, T(m,m,m,m, x,x,x,x), 0) X(0, 0, 0)
141−O(vacall, T(m,m,m,m, x,x,x,x), 0) X(0, 0, 0)
142142
143143 /* Flags Setting */
144144 O(flagieq, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1)
parse.c+31−17
@@ -450,25 +450,44 @@ parsecls(int *tyn) · 449 unmodified lines
450450 static int
451451 parserefl(int arg)
452452 {
453− int k, ty, env, hasenv;
453+ int k, ty, env, hasenv, vararg;
454454 Ref r;
455455
456456 hasenv = 0;
457+ vararg = 0;
457458 expect(Tlparen);
458− while (peek() != Trparen && peek() != Tdots) {
459+ while (peek() != Trparen) {
459460 if (curi - insb >= NIns)
460461 err("too many instructions (1)");
461− env = peek() == Tenv;
462− if (env) {
462+ if (!arg && vararg)
463+ err("no parameters allowed after '...'");
464+ switch (peek()) {
465+ case Tdots:
466+ if (vararg)
467+ err("only one '...' allowed");
468+ vararg = 1;
469+ if (arg) {
470+ *curi = (Ins){.op = Oargv};
471+ curi++;
472+ }
473+ next();
474+ goto Next;
475+ case Tenv:
476+ if (hasenv)
477+ err("only one environment allowed");
478+ hasenv = 1;
479+ env = 1;
463480 next();
464481 k = Kl;
465− } else
482+ break;
483+ default:
484+ env = 0;
466485 k = parsecls(&ty);
486+ break;
487+ }
467488 r = parseref();
468489 if (req(r, R))
469490 err("invalid argument");
470− if (hasenv && env)
471− err("only one environment allowed");
472491 if (!arg && rtype(r) != RTmp)
473492 err("invalid function parameter");
474493 if (k == 4)
@@ -487,16 +506,13 @@ parserefl(int arg) · 12 unmodified lines
487506 else
488507 *curi = (Ins){Opar, k, r, {R}};
489508 curi++;
490− hasenv |= env;
509+ Next:
491510 if (peek() == Trparen)
492511 break;
493512 expect(Tcomma);
494513 }
495− if (next() == Tdots) {
496− expect(Trparen);
497− return 1;
498− }
499− return 0;
514+ expect(Trparen);
515+ return vararg;
500516 }
501517
502518 static Blk *
@@ -621,10 +637,8 @@ DoOp: · 118 unmodified lines
621637 }
622638 if (op == Tcall) {
623639 arg[0] = parseref();
624− if (parserefl(1))
625− op = Ovacall;
626− else
627− op = Ocall;
640+ parserefl(1);
641+ op = Ocall;
628642 expect(Tnl);
629643 if (k == 4) {
630644 k = Kl;
test/_slow.qbe+5−5
@@ -3408,7 +3408,7 @@ function $transparent_crc(l %.1, l %.3, w %.5) { · 3407 unmodified lines
34083408 %.9 =l copy $.Lstring.93
34093409 %.10 =l loadl %.4
34103410 %.11 =l loadl %.2
3411− %.12 =w call $printf(l %.9, l %.10, l %.11, ...)
3411+ %.12 =w call $printf(l %.9, ..., l %.10, l %.11)
34123412 @if_false.679
34133413 %.13 =l loadl $crc32_context
34143414 %.14 =l loadl %.2
@@ -3461,7 +3461,7 @@ function $transparent_crc_bytes(l %.1, w %.3, l %.5, w %.7) { · 46 unmodified lines
34613461 %.28 =l loadl $crc32_context
34623462 %.29 =l copy 4294967295
34633463 %.30 =l xor %.28, %.29
3464− %.31 =w call $printf(l %.26, l %.27, l %.30, ...)
3464+ %.31 =w call $printf(l %.26, ..., l %.27, l %.30)
34653465 @if_false.687
34663466 ret
34673467 }
@@ -3480,7 +3480,7 @@ function $platform_main_end(l %.1, w %.3) { · 12 unmodified lines
34803480 @if_true.690
34813481 %.8 =l copy $.Lstring.97
34823482 %.9 =l loadl %.2
3483− %.10 =w call $printf(l %.8, l %.9, ...)
3483+ %.10 =w call $printf(l %.8, ..., l %.9)
34843484 @if_false.691
34853485 ret
34863486 }
@@ -35219,7 +35219,7 @@ function w $main(w %.1, l %.3) { · 31732 unmodified lines
3521935219 %.53 =w loadsw %.5
3522035220 %.54 =w loadsw %.6
3522135221 %.55 =w loadsw %.7
35222− %.56 =w call $printf(l %.52, w %.53, w %.54, w %.55, ...)
35222+ %.56 =w call $printf(l %.52, ..., w %.53, w %.54, w %.55)
3522335223 @if_false.1519
3522435224 @for_cont.1516
3522535225 %.57 =w loadsw %.7
@@ -35338,7 +35338,7 @@ function w $main(w %.1, l %.3) { · 112 unmodified lines
3533835338 @if_true.1524
3533935339 %.138 =l copy $.Lstring.129
3534035340 %.139 =w loadsw %.5
35341− %.140 =w call $printf(l %.138, w %.139, ...)
35341+ %.140 =w call $printf(l %.138, ..., w %.139)
3534235342 @if_false.1525
3534335343 @for_cont.1522
3534435344 %.141 =w loadsw %.5
test/abi5.ssa+9−9
@@ -25,41 +25,41 @@ export · 24 unmodified lines
2525 function $test() {
2626 @start
2727 %r1 =:st1 call $t1()
28− %i1 =w call $printf(l $fmt1, l %r1, ...)
28+ %i1 =w call $printf(l $fmt1, ..., l %r1)
2929
3030 %r2 =:st2 call $t2()
3131 %w2 =w loadw %r2
32− %i2 =w call $printf(l $fmt2, w %w2, ...)
32+ %i2 =w call $printf(l $fmt2, ..., w %w2)
3333
3434 %r3 =:st3 call $t3()
3535 %s3 =s loads %r3
3636 %r34 =l add %r3, 4
3737 %w3 =w loadw %r34
3838 %p3 =d exts %s3
39− %i3 =w call $printf(l $fmt3, d %p3, w %w3, ...)
39+ %i3 =w call $printf(l $fmt3, ..., d %p3, w %w3)
4040
4141 %r4 =:st4 call $t4()
4242 %w4 =w loadw %r4
4343 %r48 =l add 8, %r4
4444 %d4 =d loadd %r48
45− %i4 =w call $printf(l $fmt4, w %w4, d %d4, ...)
45+ %i4 =w call $printf(l $fmt4, ..., w %w4, d %d4)
4646
4747 %r5 =:st5 call $t5()
4848 %s5 =s loads %r5
4949 %d5 =d exts %s5
5050 %r58 =l add %r5, 8
5151 %l5 =l loadl %r58
52− %i5 =w call $printf(l $fmt5, d %d5, l %l5, ...)
52+ %i5 =w call $printf(l $fmt5, ..., d %d5, l %l5)
5353
5454 %r6 =:st6 call $t6()
55− %i6 =w call $printf(l $fmt6, l %r6, ...)
55+ %i6 =w call $printf(l $fmt6, ..., l %r6)
5656
5757 %r7 =:st7 call $t7()
5858 %s7 =s loads %r7
5959 %d71 =d exts %s7
6060 %r78 =l add %r7, 8
6161 %d72 =d loadd %r78
62− %i7 =w call $printf(l $fmt7, d %d71, d %d72, ...)
62+ %i7 =w call $printf(l $fmt7, ..., d %d71, d %d72)
6363
6464 %r8 =:st8 call $t8()
6565 %r84 =l add 4, %r8
@@ -69,14 +69,14 @@ function $test() { · 3 unmodified lines
6969 %w82 =w loadw %r84
7070 %w83 =w loadw %r88
7171 %w84 =w loadw %r812
72− %i8 =w call $printf(l $fmt8, w %w81, w %w82, w %w83, w %w84, ...)
72+ %i8 =w call $printf(l $fmt8, ..., w %w81, w %w82, w %w83, w %w84)
7373
7474 %r9 =:st9 call $t9()
7575 %r94 =l add 4, %r9
7676 %w9 =w loadw %r9
7777 %s9 =s loads %r94
7878 %d9 =d exts %s9
79− %i9 =w call $printf(l $fmt9, w %w9, d %d9, ...)
79+ %i9 =w call $printf(l $fmt9, ..., w %w9, d %d9)
8080
8181 ret
8282 }
test/abi6.ssa+2−2
@@ -13,8 +13,8 @@ function $f(:hfa3 %h1, :hfa3 %h2, d %d1, :hfa3 %h3, d %d2) { · 12 unmodified lines
1313 call $phfa3(:hfa3 %h1)
1414 call $phfa3(:hfa3 %h2)
1515 call $phfa3(:hfa3 %h3)
16− call $printf(l $dfmt, d %d1, ...)
17− call $printf(l $dfmt, d %d2, ...)
16+ call $printf(l $dfmt, ..., d %d1)
17+ call $printf(l $dfmt, ..., d %d2)
1818 ret
1919 }
2020
test/echo.ssa+1−1
@@ -20,7 +20,7 @@ function w $main(w %argc, l %argv) { · 19 unmodified lines
2020 @loop2
2121 %sep =w phi @last 10, @nolast 32
2222 %arg =l loadl %av
23− %r =w call $printf(l %fmt, l %arg, w %sep, ...)
23+ %r =w call $printf(l %fmt, ..., l %arg, w %sep)
2424 %av1 =l add %av, 8
2525 %ac1 =w sub %ac, 1
2626 jmp @loop
test/vararg2.ssa+14−14
@@ -19,11 +19,11 @@ export function $qbeprint0(l %fmt, ...) { · 18 unmodified lines
1919 jnz %isg, @casef, @cased
2020 @casef
2121 %dbl =d vaarg %vp
22− %r =w call $printf(l %fmtdbl, d %dbl, ...)
22+ %r =w call $printf(l %fmtdbl, ..., d %dbl)
2323 jmp @loop
2424 @cased
2525 %int =w vaarg %vp
26− %r =w call $printf(l %fmtint, w %int, ...)
26+ %r =w call $printf(l %fmtint, ..., w %int)
2727 jmp @loop
2828 @end
2929 %r =w call $puts(l %emptys)
@@ -59,11 +59,11 @@ export function $qbeprint1(w %argw0, l %fmt, ...) { · 29 unmodified lines
5959 jnz %isg, @casef, @cased
6060 @casef
6161 %dbl =d vaarg %vp
62− %r =w call $printf(l %fmtdbl, d %dbl, ...)
62+ %r =w call $printf(l %fmtdbl, ..., d %dbl)
6363 jmp @loop
6464 @cased
6565 %int =w vaarg %vp
66− %r =w call $printf(l %fmtint, w %int, ...)
66+ %r =w call $printf(l %fmtint, ..., w %int)
6767 jmp @loop
6868 @end
6969 %r =w call $puts(l %emptys)
@@ -99,11 +99,11 @@ export function $qbeprint2(d %argd0, l %fmt, ...) { · 29 unmodified lines
9999 jnz %isg, @casef, @cased
100100 @casef
101101 %dbl =d vaarg %vp
102− %r =w call $printf(l %fmtdbl, d %dbl, ...)
102+ %r =w call $printf(l %fmtdbl, ..., d %dbl)
103103 jmp @loop
104104 @cased
105105 %int =w vaarg %vp
106− %r =w call $printf(l %fmtint, w %int, ...)
106+ %r =w call $printf(l %fmtint, ..., w %int)
107107 jmp @loop
108108 @end
109109 %r =w call $puts(l %emptys)
@@ -139,11 +139,11 @@ export function $qbeprint3(w %argw0, w %argw1, w %argw2, w %argw3, l %fmt, ...) · 29 unmodified lines
139139 jnz %isg, @casef, @cased
140140 @casef
141141 %dbl =d vaarg %vp
142− %r =w call $printf(l %fmtdbl, d %dbl, ...)
142+ %r =w call $printf(l %fmtdbl, ..., d %dbl)
143143 jmp @loop
144144 @cased
145145 %int =w vaarg %vp
146− %r =w call $printf(l %fmtint, w %int, ...)
146+ %r =w call $printf(l %fmtint, ..., w %int)
147147 jmp @loop
148148 @end
149149 %r =w call $puts(l %emptys)
@@ -179,11 +179,11 @@ export function $qbeprint4(d %argd0, d %argd1, d %argd2, d %argd3, d %argd4, d % · 29 unmodified lines
179179 jnz %isg, @casef, @cased
180180 @casef
181181 %dbl =d vaarg %vp
182− %r =w call $printf(l %fmtdbl, d %dbl, ...)
182+ %r =w call $printf(l %fmtdbl, ..., d %dbl)
183183 jmp @loop
184184 @cased
185185 %int =w vaarg %vp
186− %r =w call $printf(l %fmtint, w %int, ...)
186+ %r =w call $printf(l %fmtint, ..., w %int)
187187 jmp @loop
188188 @end
189189 %r =w call $puts(l %emptys)
@@ -219,11 +219,11 @@ export function $qbeprint5(w %argw0, w %argw1, w %argw2, w %argw3, w %argw4, d % · 29 unmodified lines
219219 jnz %isg, @casef, @cased
220220 @casef
221221 %dbl =d vaarg %vp
222− %r =w call $printf(l %fmtdbl, d %dbl, ...)
222+ %r =w call $printf(l %fmtdbl, ..., d %dbl)
223223 jmp @loop
224224 @cased
225225 %int =w vaarg %vp
226− %r =w call $printf(l %fmtint, w %int, ...)
226+ %r =w call $printf(l %fmtint, ..., w %int)
227227 jmp @loop
228228 @end
229229 %r =w call $puts(l %emptys)
@@ -259,11 +259,11 @@ export function $qbeprint6(w %argw0, w %argw1, w %argw2, w %argw3, w %argw4, w % · 29 unmodified lines
259259 jnz %isg, @casef, @cased
260260 @casef
261261 %dbl =d vaarg %vp
262− %r =w call $printf(l %fmtdbl, d %dbl, ...)
262+ %r =w call $printf(l %fmtdbl, ..., d %dbl)
263263 jmp @loop
264264 @cased
265265 %int =w vaarg %vp
266− %r =w call $printf(l %fmtint, w %int, ...)
266+ %r =w call $printf(l %fmtint, ..., w %int)
267267 jmp @loop
268268 @end
269269 %r =w call $puts(l %emptys)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t