&& used instead of ||. now diagnostic for loop too far is correctly emitted. (don't ask how i found this. :-)) Reference: /n/sources/patch/applied/looptoofar Date: Mon Nov 28 00:48:47 CET 2011 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/6l/span.c Mon Nov 28 00:45:01 2011 +++ /sys/src/cmd/6l/span.c Mon Nov 28 00:44:58 2011 @@ -1385,7 +1385,7 @@ q = p->pcond; if(q) { v = q->pc - p->pc - 2; - if(v < -128 && v > 127) + if(v < -128 || v > 127) diag("loop too far: %P", p); *andptr++ = op; *andptr++ = v; --- /sys/src/cmd/8l/span.c Mon Nov 28 00:45:05 2011 +++ /sys/src/cmd/8l/span.c Mon Nov 28 00:45:03 2011 @@ -304,24 +304,6 @@ } int -prefixof(Adr *a) -{ - switch(a->type) { - case D_INDIR+D_CS: - return 0x2e; - case D_INDIR+D_DS: - return 0x3e; - case D_INDIR+D_ES: - return 0x26; - case D_INDIR+D_FS: - return 0x64; - case D_INDIR+D_GS: - return 0x65; - } - return 0; -} - -int oclass(Adr *a) { long v; @@ -352,8 +334,6 @@ return Yax; case D_CL: - return Ycl; - case D_DL: case D_BL: case D_AH: @@ -626,7 +606,7 @@ } if(t >= D_INDIR) { t -= D_INDIR; - if(t == D_NONE || D_CS <= t && t <= D_GS) { + if(t == D_NONE) { *andptr++ = (0 << 6) | (5 << 0) | (r << 3); put4(v); return; @@ -787,7 +767,6 @@ ASHRL, Ycol, Yml, 6, 0xac,0xad,0,0, /* extra imul */ - AIMULW, Yml, Yrl, 7, Pq,0xaf,0,0, AIMULL, Yml, Yrl, 7, Pm,0xaf,0,0, 0 }; @@ -842,14 +821,7 @@ Prog *q, pp; uchar *t; int z, op, ft, tt; - long v, pre; - - pre = prefixof(&p->from); - if(pre) - *andptr++ = pre; - pre = prefixof(&p->to); - if(pre) - *andptr++ = pre; + long v; o = &optab[p->as]; ft = oclass(&p->from) * Ymax; @@ -1089,7 +1061,7 @@ q = p->pcond; if(q) { v = q->pc - p->pc - 2; - if(v < -128 && v > 127) + if(v < -128 || v > 127) diag("loop too far: %P", p); *andptr++ = op; *andptr++ = v;