]> Cypherpunks repositories - gostls13.git/commitdiff
liblink: place TEXT/GLOBL flags in p->from3 always
authorRuss Cox <rsc@golang.org>
Thu, 29 Jan 2015 19:58:54 +0000 (14:58 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 3 Feb 2015 18:22:15 +0000 (18:22 +0000)
Before, amd64 and 386 stored the flags in p->from.scale
and arm and ppc64 stored the flags in p->reg.
Both caused special cases in printing and in handling of the
addresses.

To avoid possible conflicts with the real meaning of p->from
and to avoid storing a non-register value in a reg field,
use from3 to hold a TYPE_CONST value giving the flags.

There is still a special case for printing, because the flags
are specified without a $, and normally a TYPE_CONST prints
with a $. But that's much less special than what came before.

This allows us to remove the textflag and settextflag methods
from LinkArch. They are no longer architecture-specific.

Change-Id: I931da8e1ecd92e127cd9aa44ef5a73c42e730110
Reviewed-on: https://go-review.googlesource.com/3572
Reviewed-by: Austin Clements <austin@google.com>
37 files changed:
include/link.h
src/cmd/5a/a.h
src/cmd/5a/a.y
src/cmd/5a/lex.c
src/cmd/5a/y.tab.c
src/cmd/5g/gg.h
src/cmd/5g/gsubr.c
src/cmd/6a/a.h
src/cmd/6a/a.y
src/cmd/6a/lex.c
src/cmd/6a/y.tab.c
src/cmd/6g/gg.h
src/cmd/6g/gsubr.c
src/cmd/8a/a.h
src/cmd/8a/a.y
src/cmd/8a/lex.c
src/cmd/8a/y.tab.c
src/cmd/8g/gg.h
src/cmd/8g/gsubr.c
src/cmd/9a/a.h
src/cmd/9a/a.y
src/cmd/9a/lex.c
src/cmd/9a/y.tab.c
src/cmd/9g/gg.h
src/cmd/9g/gsubr.c
src/cmd/gc/pgen.c
src/liblink/asm5.c
src/liblink/asm9.c
src/liblink/list5.c
src/liblink/list6.c
src/liblink/list8.c
src/liblink/list9.c
src/liblink/obj5.c
src/liblink/obj6.c
src/liblink/obj8.c
src/liblink/obj9.c
src/liblink/objfile.c

index 42071dbb35f3cde7ab6ee970f9f2e39b7080252d..a72c66d17ef59371dfef3b660d4434183b612bef 100644 (file)
@@ -210,7 +210,7 @@ struct      Reloc
 };
 
 // TODO(rsc): Describe prog.
-// TOOD(rsc): Make ARM scond == 0 mean C_SCOND_NONE.
+// TODO(rsc): Describe TEXT/GLOBL flag in from3, DATA width in from3.
 struct Prog
 {
        vlong   pc;
@@ -224,7 +224,7 @@ struct      Prog
        int16   reg; // arm, ppc64 only (e.g., ADD from, reg, to);
                     // starts at 0 for both GPRs and FPRs;
                     // also used for ADATA width on arm, ppc64
-       Addr    from3; // ppc64 only (e.g., RLWM/FMADD from, reg, from3, to)
+       Addr    from3; // addl source argument (e.g., RLWM/FMADD from, reg, from3, to)
        Addr    to;
        
        // for 5g, 6g, 8g internal use
@@ -245,8 +245,6 @@ struct      Prog
 
        char    width;  /* fake for DATA */
        char    mode;   /* 16, 32, or 64 in 6l, 8l; internal use in 5g, 6g, 8g */
-       
-       /*c2go uchar TEXTFLAG; */
 };
 
 // prevent incompatible type signatures between liblink and 8l on Plan 9
@@ -604,8 +602,6 @@ struct LinkArch
        int     (*isdata)(Prog*);
        Prog*   (*prg)(void);
        void    (*progedit)(Link*, Prog*);
-       void    (*settextflag)(Prog*, int);
-       int     (*textflag)(Prog*);
 
        int     minlc;
        int     ptrsize;
index df9838ad37cea770abf54cd705e812f6f81b5814..296379b01c2b7e263efd8787a13eb25e22e74841 100644 (file)
@@ -127,6 +127,7 @@ EXTERN      int32   thunk;
 EXTERN Biobuf  obuf;
 EXTERN Link*   ctxt;
 EXTERN Biobuf  bstdout;
+EXTERN Prog*   lastpc;
 
 void*  alloc(int32);
 void*  allocn(void*, int32, int32);
index 330b844089e0a3b4dac8f09c9e8af3f5f2db5d7d..2248c05022665a4cfca6ceb02ef9f0bd577683c7 100644 (file)
@@ -220,7 +220,11 @@ inst:
 |      LTYPEB name ',' con ',' '$' textsize
        {
                settext($2.sym);
-               outcode($1, Always, &$2, $4, &$7);
+               outcode($1, Always, &$2, 0, &$7);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = $4;
+               }
        }
 /*
  * GLOBL
@@ -233,7 +237,11 @@ inst:
 |      LGLOBL name ',' con ',' imm
        {
                settext($2.sym);
-               outcode($1, Always, &$2, $4, &$6);
+               outcode($1, Always, &$2, 0, &$6);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = $4;
+               }
        }
 /*
  * DATA
index 4c4a3b79205e5f72a31256f21b482b405d8d795a..cfe0e1c520680a3adfc0976072958a263c5cf9a0 100644 (file)
@@ -497,8 +497,6 @@ static int bcode[] =
        ANOP,
 };
 
-static Prog *lastpc;
-
 void
 outcode(int a, int scond, Addr *g1, int reg, Addr *g2)
 {
index fe231af860cca2f0bd98edc5511d23f80555d3c8..0b6a695733113ce905a438303426b6ada78f7e1b 100644 (file)
@@ -577,17 +577,17 @@ static const yytype_uint16 yyrline[] =
        0,    68,    68,    70,    69,    77,    76,    85,    90,    96,
       97,    98,   104,   108,   112,   119,   126,   133,   137,   144,
      151,   158,   165,   172,   181,   193,   197,   201,   208,   215,
-     220,   228,   233,   241,   248,   255,   262,   266,   270,   274,
-     281,   303,   311,   320,   327,   336,   347,   353,   356,   360,
-     365,   366,   369,   375,   386,   392,   398,   404,   411,   417,
-     422,   428,   431,   437,   445,   449,   458,   464,   465,   466,
-     467,   472,   478,   484,   490,   491,   494,   495,   503,   512,
-     513,   522,   523,   529,   532,   533,   534,   536,   544,   552,
-     561,   567,   573,   579,   587,   593,   601,   602,   606,   614,
-     615,   621,   622,   630,   631,   634,   640,   648,   656,   664,
-     674,   677,   681,   687,   688,   689,   692,   693,   697,   701,
-     705,   709,   715,   718,   724,   725,   729,   733,   737,   741,
-     745,   749,   753,   757,   761
+     220,   232,   237,   249,   256,   263,   270,   274,   278,   282,
+     289,   311,   319,   328,   335,   344,   355,   361,   364,   368,
+     373,   374,   377,   383,   394,   400,   406,   412,   419,   425,
+     430,   436,   439,   445,   453,   457,   466,   472,   473,   474,
+     475,   480,   486,   492,   498,   499,   502,   503,   511,   520,
+     521,   530,   531,   537,   540,   541,   542,   544,   552,   560,
+     569,   575,   581,   587,   595,   601,   609,   610,   614,   622,
+     623,   629,   630,   638,   639,   642,   648,   656,   664,   672,
+     682,   685,   689,   695,   696,   697,   700,   701,   705,   709,
+     713,   717,   723,   726,   732,   733,   737,   741,   745,   749,
+     753,   757,   761,   765,   769
 };
 #endif
 
@@ -1941,12 +1941,16 @@ yyreduce:
 #line 221 "a.y"
     {
                settext((yyvsp[(2) - (7)].addr).sym);
-               outcode((yyvsp[(1) - (7)].lval), Always, &(yyvsp[(2) - (7)].addr), (yyvsp[(4) - (7)].lval), &(yyvsp[(7) - (7)].addr));
+               outcode((yyvsp[(1) - (7)].lval), Always, &(yyvsp[(2) - (7)].addr), 0, &(yyvsp[(7) - (7)].addr));
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = (yyvsp[(4) - (7)].lval);
+               }
        }
     break;
 
   case 31:
-#line 229 "a.y"
+#line 233 "a.y"
     {
                settext((yyvsp[(2) - (4)].addr).sym);
                outcode((yyvsp[(1) - (4)].lval), Always, &(yyvsp[(2) - (4)].addr), 0, &(yyvsp[(4) - (4)].addr));
@@ -1954,64 +1958,68 @@ yyreduce:
     break;
 
   case 32:
-#line 234 "a.y"
+#line 238 "a.y"
     {
                settext((yyvsp[(2) - (6)].addr).sym);
-               outcode((yyvsp[(1) - (6)].lval), Always, &(yyvsp[(2) - (6)].addr), (yyvsp[(4) - (6)].lval), &(yyvsp[(6) - (6)].addr));
+               outcode((yyvsp[(1) - (6)].lval), Always, &(yyvsp[(2) - (6)].addr), 0, &(yyvsp[(6) - (6)].addr));
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = (yyvsp[(4) - (6)].lval);
+               }
        }
     break;
 
   case 33:
-#line 242 "a.y"
+#line 250 "a.y"
     {
                outcode((yyvsp[(1) - (6)].lval), Always, &(yyvsp[(2) - (6)].addr), (yyvsp[(4) - (6)].lval), &(yyvsp[(6) - (6)].addr));
        }
     break;
 
   case 34:
-#line 249 "a.y"
+#line 257 "a.y"
     {
                outcode((yyvsp[(1) - (4)].lval), (yyvsp[(2) - (4)].lval), &(yyvsp[(3) - (4)].addr), 0, &nullgen);
        }
     break;
 
   case 35:
-#line 256 "a.y"
+#line 264 "a.y"
     {
                outcode((yyvsp[(1) - (3)].lval), Always, &nullgen, 0, &(yyvsp[(3) - (3)].addr));
        }
     break;
 
   case 36:
-#line 263 "a.y"
+#line 271 "a.y"
     {
                outcode((yyvsp[(1) - (5)].lval), (yyvsp[(2) - (5)].lval), &(yyvsp[(3) - (5)].addr), 0, &(yyvsp[(5) - (5)].addr));
        }
     break;
 
   case 37:
-#line 267 "a.y"
+#line 275 "a.y"
     {
                outcode((yyvsp[(1) - (5)].lval), (yyvsp[(2) - (5)].lval), &(yyvsp[(3) - (5)].addr), 0, &(yyvsp[(5) - (5)].addr));
        }
     break;
 
   case 38:
-#line 271 "a.y"
+#line 279 "a.y"
     {
                outcode((yyvsp[(1) - (7)].lval), (yyvsp[(2) - (7)].lval), &(yyvsp[(3) - (7)].addr), (yyvsp[(5) - (7)].lval), &(yyvsp[(7) - (7)].addr));
        }
     break;
 
   case 39:
-#line 275 "a.y"
+#line 283 "a.y"
     {
                outcode((yyvsp[(1) - (6)].lval), (yyvsp[(2) - (6)].lval), &(yyvsp[(3) - (6)].addr), (yyvsp[(5) - (6)].addr).reg, &nullgen);
        }
     break;
 
   case 40:
-#line 282 "a.y"
+#line 290 "a.y"
     {
                Addr g;
 
@@ -2033,14 +2041,14 @@ yyreduce:
     break;
 
   case 41:
-#line 304 "a.y"
+#line 312 "a.y"
     {
                outcode((yyvsp[(1) - (7)].lval), (yyvsp[(2) - (7)].lval), &(yyvsp[(3) - (7)].addr), (yyvsp[(5) - (7)].addr).reg, &(yyvsp[(7) - (7)].addr));
        }
     break;
 
   case 42:
-#line 312 "a.y"
+#line 320 "a.y"
     {
                (yyvsp[(7) - (9)].addr).type = TYPE_REGREG2;
                (yyvsp[(7) - (9)].addr).offset = (yyvsp[(9) - (9)].lval);
@@ -2049,14 +2057,14 @@ yyreduce:
     break;
 
   case 43:
-#line 321 "a.y"
+#line 329 "a.y"
     {
                outcode((yyvsp[(1) - (2)].lval), Always, &(yyvsp[(2) - (2)].addr), 0, &nullgen);
        }
     break;
 
   case 44:
-#line 328 "a.y"
+#line 336 "a.y"
     {
                if((yyvsp[(2) - (4)].addr).type != TYPE_CONST || (yyvsp[(4) - (4)].addr).type != TYPE_CONST)
                        yyerror("arguments to PCDATA must be integer constants");
@@ -2065,7 +2073,7 @@ yyreduce:
     break;
 
   case 45:
-#line 337 "a.y"
+#line 345 "a.y"
     {
                if((yyvsp[(2) - (4)].addr).type != TYPE_CONST)
                        yyerror("index for FUNCDATA must be integer constant");
@@ -2076,35 +2084,35 @@ yyreduce:
     break;
 
   case 46:
-#line 348 "a.y"
+#line 356 "a.y"
     {
                outcode((yyvsp[(1) - (2)].lval), Always, &nullgen, 0, &nullgen);
        }
     break;
 
   case 47:
-#line 353 "a.y"
+#line 361 "a.y"
     {
                (yyval.lval) = Always;
        }
     break;
 
   case 48:
-#line 357 "a.y"
+#line 365 "a.y"
     {
                (yyval.lval) = ((yyvsp[(1) - (2)].lval) & ~C_SCOND) | (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 49:
-#line 361 "a.y"
+#line 369 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (2)].lval) | (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 52:
-#line 370 "a.y"
+#line 378 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_BRANCH;
@@ -2113,7 +2121,7 @@ yyreduce:
     break;
 
   case 53:
-#line 376 "a.y"
+#line 384 "a.y"
     {
                (yyvsp[(1) - (2)].sym) = labellookup((yyvsp[(1) - (2)].sym));
                (yyval.addr) = nullgen;
@@ -2125,7 +2133,7 @@ yyreduce:
     break;
 
   case 54:
-#line 387 "a.y"
+#line 395 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = (yyvsp[(1) - (1)].lval);
@@ -2134,7 +2142,7 @@ yyreduce:
     break;
 
   case 55:
-#line 393 "a.y"
+#line 401 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = -(yyvsp[(2) - (2)].lval);
@@ -2143,7 +2151,7 @@ yyreduce:
     break;
 
   case 56:
-#line 399 "a.y"
+#line 407 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = (yyvsp[(1) - (3)].lval);
@@ -2152,7 +2160,7 @@ yyreduce:
     break;
 
   case 57:
-#line 405 "a.y"
+#line 413 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = -(yyvsp[(2) - (4)].lval);
@@ -2161,7 +2169,7 @@ yyreduce:
     break;
 
   case 58:
-#line 412 "a.y"
+#line 420 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_CONST;
@@ -2170,7 +2178,7 @@ yyreduce:
     break;
 
   case 59:
-#line 418 "a.y"
+#line 426 "a.y"
     {
                (yyval.addr) = (yyvsp[(2) - (2)].addr);
                (yyval.addr).type = TYPE_CONST;
@@ -2178,7 +2186,7 @@ yyreduce:
     break;
 
   case 60:
-#line 423 "a.y"
+#line 431 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_SCONST;
@@ -2187,7 +2195,7 @@ yyreduce:
     break;
 
   case 62:
-#line 432 "a.y"
+#line 440 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2196,7 +2204,7 @@ yyreduce:
     break;
 
   case 63:
-#line 438 "a.y"
+#line 446 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2205,14 +2213,14 @@ yyreduce:
     break;
 
   case 64:
-#line 446 "a.y"
+#line 454 "a.y"
     {
                (yyval.lval) = 1 << (yyvsp[(1) - (1)].lval);
        }
     break;
 
   case 65:
-#line 450 "a.y"
+#line 458 "a.y"
     {
                int i;
                (yyval.lval)=0;
@@ -2224,14 +2232,14 @@ yyreduce:
     break;
 
   case 66:
-#line 459 "a.y"
+#line 467 "a.y"
     {
                (yyval.lval) = (1<<(yyvsp[(1) - (3)].lval)) | (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 70:
-#line 468 "a.y"
+#line 476 "a.y"
     {
                (yyval.addr) = (yyvsp[(1) - (4)].addr);
                (yyval.addr).reg = (yyvsp[(3) - (4)].lval);
@@ -2239,7 +2247,7 @@ yyreduce:
     break;
 
   case 71:
-#line 473 "a.y"
+#line 481 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2248,7 +2256,7 @@ yyreduce:
     break;
 
   case 72:
-#line 479 "a.y"
+#line 487 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2257,7 +2265,7 @@ yyreduce:
     break;
 
   case 73:
-#line 485 "a.y"
+#line 493 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2266,7 +2274,7 @@ yyreduce:
     break;
 
   case 77:
-#line 496 "a.y"
+#line 504 "a.y"
     {
                (yyval.addr) = (yyvsp[(1) - (1)].addr);
                if((yyvsp[(1) - (1)].addr).name != NAME_EXTERN && (yyvsp[(1) - (1)].addr).name != NAME_STATIC) {
@@ -2275,7 +2283,7 @@ yyreduce:
     break;
 
   case 78:
-#line 504 "a.y"
+#line 512 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2285,7 +2293,7 @@ yyreduce:
     break;
 
   case 80:
-#line 514 "a.y"
+#line 522 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2295,7 +2303,7 @@ yyreduce:
     break;
 
   case 82:
-#line 524 "a.y"
+#line 532 "a.y"
     {
                (yyval.addr) = (yyvsp[(1) - (4)].addr);
                (yyval.addr).type = TYPE_MEM;
@@ -2304,7 +2312,7 @@ yyreduce:
     break;
 
   case 87:
-#line 537 "a.y"
+#line 545 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_CONST;
@@ -2313,7 +2321,7 @@ yyreduce:
     break;
 
   case 88:
-#line 545 "a.y"
+#line 553 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2322,7 +2330,7 @@ yyreduce:
     break;
 
   case 89:
-#line 553 "a.y"
+#line 561 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REGREG;
@@ -2332,7 +2340,7 @@ yyreduce:
     break;
 
   case 90:
-#line 562 "a.y"
+#line 570 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_SHIFT;
@@ -2341,7 +2349,7 @@ yyreduce:
     break;
 
   case 91:
-#line 568 "a.y"
+#line 576 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_SHIFT;
@@ -2350,7 +2358,7 @@ yyreduce:
     break;
 
   case 92:
-#line 574 "a.y"
+#line 582 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_SHIFT;
@@ -2359,7 +2367,7 @@ yyreduce:
     break;
 
   case 93:
-#line 580 "a.y"
+#line 588 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_SHIFT;
@@ -2368,7 +2376,7 @@ yyreduce:
     break;
 
   case 94:
-#line 588 "a.y"
+#line 596 "a.y"
     {
                if((yyval.lval) < REG_R0 || (yyval.lval) > REG_R15)
                        print("register value out of range in shift\n");
@@ -2377,7 +2385,7 @@ yyreduce:
     break;
 
   case 95:
-#line 594 "a.y"
+#line 602 "a.y"
     {
                if((yyval.lval) < 0 || (yyval.lval) >= 32)
                        print("shift value out of range\n");
@@ -2386,14 +2394,14 @@ yyreduce:
     break;
 
   case 97:
-#line 603 "a.y"
+#line 611 "a.y"
     {
                (yyval.lval) = REGPC;
        }
     break;
 
   case 98:
-#line 607 "a.y"
+#line 615 "a.y"
     {
                if((yyvsp[(3) - (4)].lval) < 0 || (yyvsp[(3) - (4)].lval) >= NREG)
                        print("register value out of range in R(...)\n");
@@ -2402,14 +2410,14 @@ yyreduce:
     break;
 
   case 100:
-#line 616 "a.y"
+#line 624 "a.y"
     {
                (yyval.lval) = REGSP;
        }
     break;
 
   case 102:
-#line 623 "a.y"
+#line 631 "a.y"
     {
                if((yyvsp[(3) - (4)].lval) < 0 || (yyvsp[(3) - (4)].lval) >= NREG)
                        print("register value out of range in C(...)\n");
@@ -2418,7 +2426,7 @@ yyreduce:
     break;
 
   case 105:
-#line 635 "a.y"
+#line 643 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2427,7 +2435,7 @@ yyreduce:
     break;
 
   case 106:
-#line 641 "a.y"
+#line 649 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2436,7 +2444,7 @@ yyreduce:
     break;
 
   case 107:
-#line 649 "a.y"
+#line 657 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2447,7 +2455,7 @@ yyreduce:
     break;
 
   case 108:
-#line 657 "a.y"
+#line 665 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2458,7 +2466,7 @@ yyreduce:
     break;
 
   case 109:
-#line 665 "a.y"
+#line 673 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2469,140 +2477,140 @@ yyreduce:
     break;
 
   case 110:
-#line 674 "a.y"
+#line 682 "a.y"
     {
                (yyval.lval) = 0;
        }
     break;
 
   case 111:
-#line 678 "a.y"
+#line 686 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 112:
-#line 682 "a.y"
+#line 690 "a.y"
     {
                (yyval.lval) = -(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 117:
-#line 694 "a.y"
+#line 702 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (1)].sym)->value;
        }
     break;
 
   case 118:
-#line 698 "a.y"
+#line 706 "a.y"
     {
                (yyval.lval) = -(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 119:
-#line 702 "a.y"
+#line 710 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 120:
-#line 706 "a.y"
+#line 714 "a.y"
     {
                (yyval.lval) = ~(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 121:
-#line 710 "a.y"
+#line 718 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (3)].lval);
        }
     break;
 
   case 122:
-#line 715 "a.y"
+#line 723 "a.y"
     {
                (yyval.lval) = 0;
        }
     break;
 
   case 123:
-#line 719 "a.y"
+#line 727 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 125:
-#line 726 "a.y"
+#line 734 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) + (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 126:
-#line 730 "a.y"
+#line 738 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) - (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 127:
-#line 734 "a.y"
+#line 742 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) * (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 128:
-#line 738 "a.y"
+#line 746 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) / (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 129:
-#line 742 "a.y"
+#line 750 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) % (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 130:
-#line 746 "a.y"
+#line 754 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (4)].lval) << (yyvsp[(4) - (4)].lval);
        }
     break;
 
   case 131:
-#line 750 "a.y"
+#line 758 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (4)].lval) >> (yyvsp[(4) - (4)].lval);
        }
     break;
 
   case 132:
-#line 754 "a.y"
+#line 762 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) & (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 133:
-#line 758 "a.y"
+#line 766 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) ^ (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 134:
-#line 762 "a.y"
+#line 770 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) | (yyvsp[(3) - (3)].lval);
        }
@@ -2610,7 +2618,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 2614 "y.tab.c"
+#line 2622 "y.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
index 8fbb7734739ea6c417a24d4f6cd0d638ccea2f21..6ee7008574d29d5f6e524bd33d439299a0664e1a 100644 (file)
@@ -9,8 +9,6 @@
 #include "../gc/go.h"
 #include "../5l/5.out.h"
 
-#define TEXTFLAG reg
-
 enum
 {
        REGALLOC_R0 = REG_R0,
index ab8feb6e0b9dcd1e91dce75f13a32042d9c8a76c..66acdedbd58ee268f7557a33187bb7449cffaf72 100644 (file)
@@ -200,9 +200,9 @@ ggloblnod(Node *nam)
        p->to.type = TYPE_CONST;
        p->to.offset = nam->type->width;
        if(nam->readonly)
-               p->reg = RODATA;
+               p->from3.offset = RODATA;
        if(nam->type != T && !haspointers(nam->type))
-               p->reg |= NOPTR;
+               p->from3.offset |= NOPTR;
 }
 
 void
@@ -217,7 +217,7 @@ ggloblsym(Sym *s, int32 width, int8 flags)
        p->to.type = TYPE_CONST;
        p->to.name = NAME_NONE;
        p->to.offset = width;
-       p->reg = flags;
+       p->from3.offset = flags;
 }
 
 void
index e1927b6d40e8505630a01af73157dddcc1b164f5..95c4babdfc9a31c64f4a0f795a4df88f9aadf1bc 100644 (file)
@@ -139,6 +139,7 @@ EXTERN      int32   thunk;
 EXTERN Biobuf  obuf;
 EXTERN Link*   ctxt;
 EXTERN Biobuf  bstdout;
+EXTERN Prog*   lastpc;
 
 void*  alloc(int32);
 void*  allocn(void*, int32, int32);
index 954884463cc5b6895b2b5866df73c34b6955f57e..61001142c5d81e5c6c68d2ed95bad7f3401c302b 100644 (file)
@@ -60,8 +60,8 @@
 %type  <lval>  con expr pointer offset
 %type  <addr>  mem imm reg nam rel rem rim rom omem nmem textsize
 %type  <addr2> nonnon nonrel nonrem rimnon rimrem remrim
-%type  <addr2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 spec9
-%type  <addr2> spec10 spec11 spec12 spec13
+%type  <addr2> spec1 spec3 spec4 spec5 spec6 spec7 spec8 spec9
+%type  <addr2> spec10 spec12 spec13
 %%
 prog:
 |      prog 
@@ -103,7 +103,7 @@ inst:
 |      LTYPE4 remrim   { outcode($1, &$2); }
 |      LTYPER nonrel   { outcode($1, &$2); }
 |      LTYPED spec1    { outcode($1, &$2); }
-|      LTYPET spec2    { outcode($1, &$2); }
+|      spec2
 |      LTYPEC spec3    { outcode($1, &$2); }
 |      LTYPEN spec4    { outcode($1, &$2); }
 |      LTYPES spec5    { outcode($1, &$2); }
@@ -112,7 +112,7 @@ inst:
 |      LTYPEXC spec8   { outcode($1, &$2); }
 |      LTYPEX spec9    { outcode($1, &$2); }
 |      LTYPERT spec10  { outcode($1, &$2); }
-|      LTYPEG spec11   { outcode($1, &$2); }
+|      spec11
 |      LTYPEPC spec12  { outcode($1, &$2); }
 |      LTYPEF spec13   { outcode($1, &$2); }
 
@@ -191,18 +191,47 @@ spec1:    /* DATA */
        }
 
 spec2: /* TEXT */
-       mem ',' '$' textsize
+       LTYPET mem ',' '$' textsize
        {
-               settext($1.sym);
-               $$.from = $1;
-               $$.to = $4;
+               Addr2 a;
+               settext($2.sym);
+               a.from = $2;
+               a.to = $5;
+               outcode(ATEXT, &a);
        }
-|      mem ',' con ',' '$' textsize
+|      LTYPET mem ',' con ',' '$' textsize
        {
-               settext($1.sym);
-               $$.from = $1;
-               $$.from.scale = $3;
-               $$.to = $6;
+               Addr2 a;
+               settext($2.sym);
+               a.from = $2;
+               a.to = $7;
+               outcode(ATEXT, &a);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = $4;
+               }
+       }
+
+spec11:        /* GLOBL */
+       LTYPEG mem ',' imm
+       {
+               Addr2 a;
+               settext($2.sym);
+               a.from = $2;
+               a.to = $4;
+               outcode(AGLOBL, &a);
+       }
+|      LTYPEG mem ',' con ',' imm
+       {
+               Addr2 a;
+               settext($2.sym);
+               a.from = $2;
+               a.to = $6;
+               outcode(AGLOBL, &a);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = $4;
+               }
        }
 
 spec3: /* JMP/CALL */
@@ -297,19 +326,6 @@ spec10:    /* RET/RETF */
                $$.to = nullgen;
        }
 
-spec11:        /* GLOBL */
-       mem ',' imm
-       {
-               $$.from = $1;
-               $$.to = $3;
-       }
-|      mem ',' con ',' imm
-       {
-               $$.from = $1;
-               $$.from.scale = $3;
-               $$.to = $5;
-       }
-
 spec12:        /* PCDATA */
        rim ',' rim
        {
index d9e1e4555eaa2570fe54938a7d6129c4b652c234..c600796cd032d49a31554de67936ae94e8c678da 100644 (file)
@@ -1104,8 +1104,6 @@ cclean(void)
        outcode(AEND, &g2);
 }
 
-static Prog *lastpc;
-
 void
 outcode(int a, Addr2 *g2)
 {
index 61855c443122f3fa71dee6c0cdd11515cc7e91b2..3dd287ceb9d931c8626a4c7ff3b508b5560710c5 100644 (file)
@@ -411,7 +411,7 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   531
+#define YYLAST   515
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  56
@@ -471,18 +471,18 @@ static const yytype_uint16 yyprhs[] =
 {
        0,     0,     3,     4,     5,     9,    10,    15,    17,    20,
       23,    27,    31,    34,    37,    40,    43,    46,    49,    52,
-      55,    58,    61,    64,    67,    70,    73,    76,    79,    82,
-      85,    88,    89,    91,    95,    99,   102,   104,   107,   109,
-     112,   114,   118,   124,   129,   136,   139,   141,   143,   145,
-     149,   155,   159,   165,   168,   170,   174,   180,   186,   187,
-     189,   193,   199,   203,   207,   209,   211,   213,   215,   218,
-     221,   223,   225,   227,   229,   234,   237,   239,   241,   243,
-     245,   247,   249,   251,   254,   257,   260,   263,   268,   274,
-     278,   280,   282,   284,   289,   294,   299,   306,   316,   326,
-     330,   334,   340,   349,   351,   358,   364,   372,   373,   376,
-     379,   381,   383,   385,   387,   389,   392,   395,   398,   402,
-     404,   407,   411,   416,   418,   422,   426,   430,   434,   438,
-     443,   448,   452,   456
+      54,    57,    60,    63,    66,    69,    72,    75,    78,    80,
+      83,    86,    87,    89,    93,    97,   100,   102,   105,   107,
+     110,   112,   116,   122,   128,   136,   141,   148,   151,   153,
+     155,   157,   161,   167,   171,   177,   180,   182,   186,   192,
+     198,   199,   201,   205,   209,   211,   213,   215,   217,   220,
+     223,   225,   227,   229,   231,   236,   239,   241,   243,   245,
+     247,   249,   251,   253,   256,   259,   262,   265,   270,   276,
+     280,   282,   284,   286,   291,   296,   301,   308,   318,   328,
+     332,   336,   342,   351,   353,   360,   366,   374,   375,   378,
+     381,   383,   385,   387,   389,   391,   394,   397,   400,   404,
+     406,   409,   413,   418,   420,   424,   428,   432,   436,   440,
+     445,   450,   454,   458
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -493,47 +493,48 @@ static const yytype_int8 yyrhs[] =
        1,    49,    -1,    45,    50,    95,    -1,    47,    50,    95,
       -1,    13,    62,    -1,    14,    66,    -1,    15,    65,    -1,
       16,    63,    -1,    17,    64,    -1,    21,    67,    -1,    19,
-      68,    -1,    22,    69,    -1,    18,    70,    -1,    20,    71,
-      -1,    25,    72,    -1,    26,    73,    -1,    27,    74,    -1,
-      28,    75,    -1,    29,    76,    -1,    30,    77,    -1,    23,
-      78,    -1,    24,    79,    -1,    31,    80,    -1,    -1,    51,
-      -1,    83,    51,    81,    -1,    81,    51,    83,    -1,    83,
-      51,    -1,    83,    -1,    51,    81,    -1,    81,    -1,    51,
-      84,    -1,    84,    -1,    86,    51,    84,    -1,    90,    11,
-      93,    51,    86,    -1,    87,    51,    52,    94,    -1,    87,
-      51,    93,    51,    52,    94,    -1,    51,    82,    -1,    82,
-      -1,    62,    -1,    66,    -1,    83,    51,    81,    -1,    83,
-      51,    81,    48,    37,    -1,    83,    51,    81,    -1,    83,
-      51,    81,    48,    38,    -1,    83,    51,    -1,    83,    -1,
-      83,    51,    81,    -1,    85,    51,    81,    51,    93,    -1,
-      86,    51,    81,    51,    85,    -1,    -1,    86,    -1,    87,
-      51,    86,    -1,    87,    51,    93,    51,    86,    -1,    83,
-      51,    83,    -1,    83,    51,    83,    -1,    85,    -1,    87,
-      -1,    84,    -1,    89,    -1,    10,    85,    -1,    10,    88,
-      -1,    85,    -1,    88,    -1,    81,    -1,    86,    -1,    93,
-      53,    34,    54,    -1,    45,    91,    -1,    36,    -1,    39,
-      -1,    37,    -1,    40,    -1,    44,    -1,    38,    -1,    41,
-      -1,    52,    93,    -1,    52,    90,    -1,    52,    43,    -1,
-      52,    42,    -1,    52,    53,    42,    54,    -1,    52,    53,
-       9,    42,    54,    -1,    52,     9,    42,    -1,    88,    -1,
-      89,    -1,    93,    -1,    93,    53,    37,    54,    -1,    93,
-      53,    44,    54,    -1,    93,    53,    38,    54,    -1,    93,
-      53,    37,    10,    93,    54,    -1,    93,    53,    37,    54,
-      53,    37,    10,    93,    54,    -1,    93,    53,    37,    54,
-      53,    38,    10,    93,    54,    -1,    53,    37,    54,    -1,
-      53,    44,    54,    -1,    53,    37,    10,    93,    54,    -1,
-      53,    37,    54,    53,    37,    10,    93,    54,    -1,    90,
-      -1,    90,    53,    37,    10,    93,    54,    -1,    45,    91,
-      53,    92,    54,    -1,    45,     6,     7,    91,    53,    35,
-      54,    -1,    -1,     8,    93,    -1,     9,    93,    -1,    35,
-      -1,    44,    -1,    33,    -1,    32,    -1,    47,    -1,     9,
-      93,    -1,     8,    93,    -1,    55,    93,    -1,    53,    95,
-      54,    -1,    32,    -1,     9,    32,    -1,    32,     9,    32,
-      -1,     9,    32,     9,    32,    -1,    93,    -1,    95,     8,
-      95,    -1,    95,     9,    95,    -1,    95,    10,    95,    -1,
-      95,    11,    95,    -1,    95,    12,    95,    -1,    95,     6,
-       6,    95,    -1,    95,     7,     7,    95,    -1,    95,     5,
-      95,    -1,    95,     4,    95,    -1,    95,     3,    95,    -1
+      68,    -1,    69,    -1,    18,    71,    -1,    20,    72,    -1,
+      25,    73,    -1,    26,    74,    -1,    27,    75,    -1,    28,
+      76,    -1,    29,    77,    -1,    30,    78,    -1,    70,    -1,
+      24,    79,    -1,    31,    80,    -1,    -1,    51,    -1,    83,
+      51,    81,    -1,    81,    51,    83,    -1,    83,    51,    -1,
+      83,    -1,    51,    81,    -1,    81,    -1,    51,    84,    -1,
+      84,    -1,    86,    51,    84,    -1,    90,    11,    93,    51,
+      86,    -1,    22,    87,    51,    52,    94,    -1,    22,    87,
+      51,    93,    51,    52,    94,    -1,    23,    87,    51,    86,
+      -1,    23,    87,    51,    93,    51,    86,    -1,    51,    82,
+      -1,    82,    -1,    62,    -1,    66,    -1,    83,    51,    81,
+      -1,    83,    51,    81,    48,    37,    -1,    83,    51,    81,
+      -1,    83,    51,    81,    48,    38,    -1,    83,    51,    -1,
+      83,    -1,    83,    51,    81,    -1,    85,    51,    81,    51,
+      93,    -1,    86,    51,    81,    51,    85,    -1,    -1,    86,
+      -1,    83,    51,    83,    -1,    83,    51,    83,    -1,    85,
+      -1,    87,    -1,    84,    -1,    89,    -1,    10,    85,    -1,
+      10,    88,    -1,    85,    -1,    88,    -1,    81,    -1,    86,
+      -1,    93,    53,    34,    54,    -1,    45,    91,    -1,    36,
+      -1,    39,    -1,    37,    -1,    40,    -1,    44,    -1,    38,
+      -1,    41,    -1,    52,    93,    -1,    52,    90,    -1,    52,
+      43,    -1,    52,    42,    -1,    52,    53,    42,    54,    -1,
+      52,    53,     9,    42,    54,    -1,    52,     9,    42,    -1,
+      88,    -1,    89,    -1,    93,    -1,    93,    53,    37,    54,
+      -1,    93,    53,    44,    54,    -1,    93,    53,    38,    54,
+      -1,    93,    53,    37,    10,    93,    54,    -1,    93,    53,
+      37,    54,    53,    37,    10,    93,    54,    -1,    93,    53,
+      37,    54,    53,    38,    10,    93,    54,    -1,    53,    37,
+      54,    -1,    53,    44,    54,    -1,    53,    37,    10,    93,
+      54,    -1,    53,    37,    54,    53,    37,    10,    93,    54,
+      -1,    90,    -1,    90,    53,    37,    10,    93,    54,    -1,
+      45,    91,    53,    92,    54,    -1,    45,     6,     7,    91,
+      53,    35,    54,    -1,    -1,     8,    93,    -1,     9,    93,
+      -1,    35,    -1,    44,    -1,    33,    -1,    32,    -1,    47,
+      -1,     9,    93,    -1,     8,    93,    -1,    55,    93,    -1,
+      53,    95,    54,    -1,    32,    -1,     9,    32,    -1,    32,
+       9,    32,    -1,     9,    32,     9,    32,    -1,    93,    -1,
+      95,     8,    95,    -1,    95,     9,    95,    -1,    95,    10,
+      95,    -1,    95,    11,    95,    -1,    95,    12,    95,    -1,
+      95,     6,     6,    95,    -1,    95,     7,     7,    95,    -1,
+      95,     5,    95,    -1,    95,     4,    95,    -1,    95,     3,
+      95,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -543,16 +544,16 @@ static const yytype_uint16 yyrline[] =
       88,    93,    99,   100,   101,   102,   103,   104,   105,   106,
      107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
      117,   120,   124,   131,   138,   145,   150,   157,   162,   169,
-     174,   179,   186,   194,   200,   209,   214,   221,   222,   225,
-     230,   240,   245,   255,   260,   265,   272,   280,   290,   294,
-     301,   306,   314,   323,   334,   335,   338,   339,   340,   344,
-     348,   349,   352,   353,   356,   362,   373,   379,   385,   391,
-     397,   403,   409,   417,   423,   433,   439,   445,   451,   457,
-     465,   466,   469,   475,   482,   489,   496,   505,   515,   525,
-     531,   537,   545,   556,   560,   569,   577,   587,   590,   594,
-     600,   601,   605,   608,   609,   613,   617,   621,   625,   631,
-     637,   643,   649,   657,   658,   662,   666,   670,   674,   678,
-     682,   686,   690,   694
+     174,   179,   186,   194,   202,   216,   224,   238,   243,   250,
+     251,   254,   259,   269,   274,   284,   289,   294,   301,   309,
+     319,   323,   330,   339,   350,   351,   354,   355,   356,   360,
+     364,   365,   368,   369,   372,   378,   389,   395,   401,   407,
+     413,   419,   425,   433,   439,   449,   455,   461,   467,   473,
+     481,   482,   485,   491,   498,   505,   512,   521,   531,   541,
+     547,   553,   561,   572,   576,   585,   593,   603,   606,   610,
+     616,   617,   621,   624,   625,   629,   633,   637,   641,   647,
+     653,   659,   665,   673,   674,   678,   682,   686,   690,   694,
+     698,   702,   706,   710
 };
 #endif
 
@@ -569,8 +570,8 @@ static const char *const yytname[] =
   "LFREG", "LMREG", "LXREG", "LFCONST", "LSCONST", "LSP", "LNAME", "LLAB",
   "LVAR", "':'", "';'", "'='", "','", "'$'", "'('", "')'", "'~'",
   "$accept", "prog", "@1", "line", "@2", "inst", "nonnon", "rimrem",
-  "remrim", "rimnon", "nonrem", "nonrel", "spec1", "spec2", "spec3",
-  "spec4", "spec5", "spec6", "spec7", "spec8", "spec9", "spec10", "spec11",
+  "remrim", "rimnon", "nonrem", "nonrel", "spec1", "spec2", "spec11",
+  "spec3", "spec4", "spec5", "spec6", "spec7", "spec8", "spec9", "spec10",
   "spec12", "spec13", "rem", "rom", "rim", "rel", "reg", "imm", "mem",
   "omem", "nmem", "nam", "offset", "pointer", "con", "textsize", "expr", 0
 };
@@ -598,7 +599,7 @@ static const yytype_uint8 yyr1[] =
       61,    61,    61,    61,    61,    61,    61,    61,    61,    61,
       61,    62,    62,    63,    64,    65,    65,    66,    66,    67,
       67,    67,    68,    69,    69,    70,    70,    71,    71,    72,
-      72,    73,    73,    74,    74,    74,    75,    76,    77,    77,
+      72,    73,    73,    74,    74,    75,    75,    75,    76,    77,
       78,    78,    79,    80,    81,    81,    82,    82,    82,    82,
       82,    82,    83,    83,    84,    84,    85,    85,    85,    85,
       85,    85,    85,    86,    86,    86,    86,    86,    86,    86,
@@ -613,12 +614,12 @@ static const yytype_uint8 yyr1[] =
 static const yytype_uint8 yyr2[] =
 {
        0,     2,     0,     0,     3,     0,     4,     1,     2,     2,
-       3,     3,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       3,     3,     2,     2,     2,     2,     2,     2,     2,     1,
+       2,     2,     2,     2,     2,     2,     2,     2,     1,     2,
        2,     0,     1,     3,     3,     2,     1,     2,     1,     2,
-       1,     3,     5,     4,     6,     2,     1,     1,     1,     3,
-       5,     3,     5,     2,     1,     3,     5,     5,     0,     1,
-       3,     5,     3,     3,     1,     1,     1,     1,     2,     2,
+       1,     3,     5,     5,     7,     4,     6,     2,     1,     1,
+       1,     3,     5,     3,     5,     2,     1,     3,     5,     5,
+       0,     1,     3,     3,     1,     1,     1,     1,     2,     2,
        1,     1,     1,     1,     4,     2,     1,     1,     1,     1,
        1,     1,     1,     2,     2,     2,     2,     4,     5,     3,
        1,     1,     1,     4,     4,     4,     6,     9,     9,     3,
@@ -635,30 +636,30 @@ static const yytype_uint8 yydefact[] =
 {
        2,     3,     1,     0,     0,    31,     0,     0,     0,     0,
        0,     0,    31,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    58,     0,     0,     0,     7,     4,     0,     9,
-      32,    12,     0,     0,   113,    76,    78,    81,    77,    79,
-      82,    80,   107,   114,     0,     0,     0,    13,    38,    64,
-      65,    90,    91,   103,    92,     0,    14,    72,    36,    73,
-      15,     0,    16,     0,     0,   107,     0,    20,    46,    66,
-      70,    71,    67,    92,    18,     0,    32,    47,    48,    21,
-     107,     0,     0,    17,    40,     0,     0,    19,     0,    28,
-       0,    29,     0,    22,     0,    23,     0,    24,    54,    25,
-       0,    26,     0,    27,    59,    30,     0,     5,     0,     0,
+       0,     0,    60,     0,     0,     0,     7,     4,     0,    19,
+      28,     9,    32,    12,     0,     0,   113,    76,    78,    81,
+      77,    79,    82,    80,   107,   114,     0,     0,     0,    13,
+      38,    64,    65,    90,    91,   103,    92,     0,    14,    72,
+      36,    73,    15,     0,    16,     0,     0,   107,     0,    20,
+      48,    66,    70,    71,    67,    92,    18,     0,    32,    49,
+      50,    21,   107,     0,     0,    17,    40,     0,     0,     0,
+       0,    29,     0,    22,     0,    23,     0,    24,    56,    25,
+       0,    26,     0,    27,    61,    30,     0,     5,     0,     0,
        8,   116,   115,     0,     0,     0,     0,    37,     0,     0,
      123,     0,   117,     0,     0,     0,    86,    85,     0,    84,
-      83,    35,     0,     0,    68,    69,    75,    45,     0,     0,
-      75,    39,     0,     0,     0,     0,     0,     0,     0,    53,
+      83,    35,     0,     0,    68,    69,    75,    47,     0,     0,
+      75,    39,     0,     0,     0,     0,     0,     0,     0,    55,
        0,     0,     0,     0,    10,    11,   107,   108,   109,     0,
        0,    99,   100,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,   118,     0,     0,     0,     0,    89,     0,
-       0,    33,    34,     0,     0,    41,     0,     0,    60,     0,
-      62,    49,    51,    55,     0,     0,    63,     6,     0,   112,
+       0,    33,    34,     0,     0,    41,     0,     0,    45,     0,
+      62,    51,    53,    57,     0,     0,    63,     6,     0,   112,
      110,   111,     0,     0,     0,   133,   132,   131,     0,     0,
      124,   125,   126,   127,   128,     0,     0,    93,    95,    94,
        0,    87,    74,     0,     0,   119,    43,     0,     0,     0,
        0,     0,     0,     0,   105,   101,     0,   129,   130,     0,
-       0,     0,    88,    42,   120,     0,     0,    61,    50,    52,
-      56,    57,     0,     0,   104,    96,     0,     0,     0,   121,
+       0,     0,    88,    42,   120,     0,     0,    46,    52,    54,
+      58,    59,     0,     0,   104,    96,     0,     0,     0,   121,
       44,   106,     0,     0,     0,   122,   102,     0,     0,    97,
       98
 };
@@ -666,54 +667,54 @@ static const yytype_uint8 yydefact[] =
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,     3,    27,   153,    28,    31,    60,    62,    56,
-      47,    83,    74,    87,    67,    79,    93,    95,    97,    99,
-     101,   103,    89,    91,   105,    57,    68,    58,    69,    49,
-      59,    50,    51,    52,    53,   116,   202,    54,   226,   121
+      -1,     1,     3,    27,   153,    28,    33,    62,    64,    58,
+      49,    85,    76,    29,    30,    69,    81,    93,    95,    97,
+      99,   101,   103,    91,   105,    59,    70,    60,    71,    51,
+      61,    52,    53,    54,    55,   116,   202,    56,   226,   121
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -89
+#define YYPACT_NINF -87
 static const yytype_int16 yypact[] =
 {
-     -89,    16,   -89,   163,     0,   -13,   219,   241,   241,   317,
-     193,    13,   267,   333,   164,   164,   241,   241,   241,   241,
-     472,    17,    17,   241,   -17,    23,   -89,   -89,    52,   -89,
-     -89,   -89,   433,   433,   -89,   -89,   -89,   -89,   -89,   -89,
-     -89,   -89,    45,   -89,   317,   358,   433,   -89,   -89,   -89,
-     -89,   -89,   -89,    50,    63,   351,   -89,   -89,    68,   -89,
-     -89,    71,   -89,    73,    70,    45,   292,   -89,   -89,   -89,
-     -89,   -89,   -89,    80,   -89,   117,   317,   -89,   -89,   -89,
-      38,   365,   433,   -89,   -89,    87,    86,   -89,    89,   -89,
-      90,   -89,    91,   -89,    92,   -89,   100,   -89,   101,   -89,
-     105,   -89,   114,   -89,   -89,   -89,   115,   -89,   433,   433,
-     -89,   -89,   -89,   160,   433,   433,   118,   -89,     5,   116,
-     -89,    82,   -89,   131,   -12,   383,   -89,   -89,   392,   -89,
-     -89,   -89,   317,   241,   -89,   -89,   118,   -89,     6,   433,
-     -89,   -89,   365,   140,   399,   408,   241,   317,   317,   317,
-     317,   317,   241,   163,   486,   486,    38,   -89,   -89,     4,
-     433,   122,   -89,   433,   433,   433,   189,   190,   433,   433,
-     433,   433,   433,   -89,   194,     7,   146,   153,   -89,   424,
-     159,   -89,   -89,   162,   167,   -89,     9,   171,   -89,   173,
-     -89,   166,   178,   -89,   184,   185,   -89,   -89,   186,   -89,
-     -89,   -89,   187,   188,   208,   495,   512,   519,   433,   433,
-      85,    85,   -89,   -89,   -89,   433,   433,   199,   -89,   -89,
-     207,   -89,   -89,    17,   215,   253,   -89,   213,    17,   230,
-     231,   433,   472,   233,   -89,   -89,   261,    55,    55,   229,
-     235,    75,   -89,   -89,   275,   255,     9,   -89,   -89,   -89,
-     -89,   -89,   236,   433,   -89,   -89,   281,   282,   263,   -89,
-     -89,   -89,   243,   433,   433,   -89,   -89,   244,   256,   -89,
-     -89
+     -87,     8,   -87,   211,   -34,   -31,   236,   256,   256,   330,
+     156,   -19,   290,     9,   384,   384,   256,   256,   256,   256,
+      72,   -20,   -20,   256,   -15,    -5,   -87,   -87,     4,   -87,
+     -87,   -87,   -87,   -87,    34,    34,   -87,   -87,   -87,   -87,
+     -87,   -87,   -87,   -87,   119,   -87,   330,   364,    34,   -87,
+     -87,   -87,   -87,   -87,   -87,   -13,    10,   270,   -87,   -87,
+      20,   -87,   -87,    37,   -87,    39,   350,   119,   310,   -87,
+     -87,   -87,   -87,   -87,   -87,    41,   -87,    44,   330,   -87,
+     -87,   -87,    60,   391,    34,   -87,   -87,    45,    50,    55,
+      66,   -87,    70,   -87,    73,   -87,    85,   -87,    92,   -87,
+     105,   -87,   116,   -87,   -87,   -87,   117,   -87,    34,    34,
+     -87,   -87,   -87,   107,    34,    34,    80,   -87,    21,   135,
+     -87,   168,   -87,   133,    82,   398,   -87,   -87,   401,   -87,
+     -87,   -87,   330,   256,   -87,   -87,    80,   -87,    63,    34,
+     -87,   -87,   391,   157,   417,   426,   256,   330,   330,   330,
+     330,   330,   256,   211,   486,   486,    60,   -87,   -87,    58,
+      34,   149,   -87,    34,    34,    34,   184,   197,    34,    34,
+      34,    34,    34,   -87,   198,    26,   159,   160,   -87,   433,
+     162,   -87,   -87,   163,   167,   -87,     7,   195,   -87,   196,
+     -87,   171,   200,   -87,   199,   201,   -87,   -87,   202,   -87,
+     -87,   -87,   203,   205,   173,   495,   503,   175,    34,    34,
+     128,   128,   -87,   -87,   -87,    34,    34,   208,   -87,   -87,
+     209,   -87,   -87,   -20,   217,   242,   -87,   210,   -20,   229,
+     231,    34,    72,   232,   -87,   -87,   260,    40,    40,   228,
+     230,   104,   -87,   -87,   262,   253,     7,   -87,   -87,   -87,
+     -87,   -87,   250,    34,   -87,   -87,   276,   280,   273,   -87,
+     -87,   -87,   252,    34,    34,   -87,   -87,   267,   278,   -87,
+     -87
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-     -89,   -89,   -89,   156,   -89,   -89,   301,   -89,   -89,   -89,
-     303,   -89,   -89,   -89,   -89,   -89,   -89,   -89,   -89,   -89,
-     -89,   -89,   -89,   -89,   -89,    -2,   250,    11,   -11,    -9,
-      -8,   112,    -4,     2,    -3,   -56,   -89,   -10,    77,   -88
+     -87,   -87,   -87,   154,   -87,   -87,   298,   -87,   -87,   -87,
+     302,   -87,   -87,   -87,   -87,   -87,   -87,   -87,   -87,   -87,
+     -87,   -87,   -87,   -87,   -87,    -2,   248,    11,   -11,    -9,
+      -8,   137,    -1,     2,    35,   -61,   -87,   -10,    78,   -86
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -723,118 +724,114 @@ static const yytype_int16 yypgoto[] =
 #define YYTABLE_NINF -1
 static const yytype_uint16 yytable[] =
 {
-      73,    70,    84,    86,    48,    85,    71,    63,    75,   136,
-      48,   100,    72,   102,   104,   160,     2,   216,   224,    61,
-     154,   155,   111,   112,   140,   175,   176,    92,    94,    96,
-      98,   107,   177,   108,   106,   120,   122,   199,    30,   200,
-     183,   225,   117,   175,   176,   130,   114,   115,   201,    29,
-     177,   113,   129,   114,   115,   134,    73,    70,    42,   161,
-     135,   217,    71,   168,   169,   170,   171,   172,    72,    55,
-     141,    86,   120,   109,   117,   205,   206,   207,    32,    33,
-     210,   211,   212,   213,   214,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   170,   171,   172,   120,   120,
-     198,   110,    34,   123,   157,   158,    35,    36,    37,    38,
-      39,    40,   256,   257,    41,   112,   124,    43,   120,   131,
-     237,   238,   132,    45,   133,    46,    88,    90,   139,   184,
-     181,   185,    86,   138,   187,   189,   173,   188,   142,   143,
-     144,   145,   146,   147,   182,   191,   192,   193,   194,   195,
-     203,   148,   149,   120,   120,   120,   150,   190,   120,   120,
-     120,   120,   120,   196,     4,   151,   152,   156,   174,   112,
-     162,   159,    32,    33,   183,   204,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,   208,    34,   209,   120,   120,
-     218,    32,    33,    64,   215,   239,   240,   219,    24,    42,
-      25,    43,    26,   221,   229,   243,   222,    45,   223,    46,
-     247,   250,   227,   251,   228,    34,   230,    32,    33,    35,
-      36,    37,    38,    39,    40,   231,   232,    41,    65,   233,
-      43,   234,   235,   262,    66,   236,    45,   244,    46,    32,
-      33,    34,   241,   267,   268,    35,    36,    37,    38,    39,
-      40,   242,   245,    41,    42,   246,    43,   248,   252,   249,
-      44,   253,    45,    34,    46,    32,    33,    35,    36,    37,
-      38,    39,    40,   254,   258,    41,    42,   259,    43,   255,
-     261,   263,   264,    55,    45,   265,    46,   266,   269,    34,
-      32,    33,    64,    35,    36,    37,    38,    39,    40,   197,
-     270,    41,    42,    77,    43,    78,   137,     0,    76,     0,
-      45,     0,    46,   260,    34,    32,    33,     0,    35,    36,
-      37,    38,    39,    40,     0,     0,    41,    65,     0,    43,
-       0,    32,    33,     0,     0,    45,     0,    46,     0,    34,
-       0,     0,     0,    35,    36,    37,    38,    39,    40,    32,
-     125,    41,    42,     0,    43,    34,    32,    33,     0,     0,
-      45,     0,    46,    32,    33,     0,     0,     0,    80,     0,
-      43,     0,     0,    34,    81,    55,    82,     0,    46,     0,
-      34,    32,    33,   126,   127,   118,    42,    34,    43,     0,
-      32,   179,   119,     0,   128,    43,    46,    32,    33,     0,
-      80,    82,    43,    46,     0,    34,    32,    33,    82,     0,
-      46,     0,     0,     0,    34,   178,     0,     0,     0,     0,
-      43,    34,    32,    33,   180,     0,    82,     0,    46,    43,
-      34,    32,    33,     0,     0,    82,    43,    46,     0,     0,
-       0,   186,    82,     0,    46,    43,    34,     0,     0,     0,
-      55,    82,     0,    46,     0,    34,   220,     0,     0,     0,
-       0,    43,     0,     0,     0,     0,     0,    82,     0,    46,
-      43,     0,     0,     0,     0,     0,    82,     0,    46,   163,
+      75,    72,    86,    88,    50,    87,   136,    65,     2,    73,
+      50,   100,    74,   102,   104,    31,   224,    34,    35,    63,
+      32,   140,   154,   155,   111,   112,    44,    92,    94,    96,
+      98,   160,    57,   107,   106,   108,   216,   120,   122,   225,
+     123,    36,    34,    35,   117,   109,    77,   130,   168,   169,
+     170,   171,   172,   110,    82,   139,    45,   134,    75,    72,
+      83,    57,    84,   124,    48,   135,    36,    73,   114,   115,
+      74,   131,   141,    88,   120,   161,   117,   205,   206,   207,
+     217,    45,   210,   211,   212,   213,   214,    84,   132,    48,
+     133,   199,   129,   200,   138,   198,   142,   183,   120,   120,
+     175,   176,   201,   143,   157,   158,   144,   177,    37,    38,
+      39,    40,    41,    42,   156,   112,    43,   145,   120,   175,
+     176,   146,   237,   238,   147,   113,   177,   114,   115,   184,
+     181,   185,    88,   159,   187,   189,   148,   188,   170,   171,
+     172,   256,   257,   149,   182,   191,   192,   193,   194,   195,
+     203,    89,    90,   120,   120,   120,   150,   190,   120,   120,
+     120,   120,   120,   196,    34,    35,    66,   151,   152,   112,
+     174,   163,   164,   165,   166,   167,   168,   169,   170,   171,
+     172,   166,   167,   168,   169,   170,   171,   172,    36,   162,
+     208,   183,    37,    38,    39,    40,    41,    42,   120,   120,
+      43,    67,   204,    45,   209,   239,   240,    68,   215,    47,
+     236,    48,     4,   218,   219,   243,   221,   222,   223,   229,
+     247,   250,   173,   251,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,   262,    34,    35,   227,   228,   230,   244,
+     231,   245,   232,   267,   268,   233,    24,   234,    25,   235,
+      26,   241,   246,   242,    34,    35,   248,   252,    36,   249,
+     253,   258,    37,    38,    39,    40,    41,    42,    34,   125,
+      43,    44,   254,    45,   255,   259,   263,    46,    36,    47,
+     264,    48,    37,    38,    39,    40,    41,    42,    34,    35,
+      43,    44,    36,    45,   261,   265,   266,   197,    57,    47,
+      79,    48,   126,   127,    80,    44,   137,    45,    34,    35,
+      66,   269,    36,   128,   260,    48,    37,    38,    39,    40,
+      41,    42,   270,     0,    43,    44,     0,    45,    34,    35,
+       0,    78,    36,    47,     0,    48,    37,    38,    39,    40,
+      41,    42,     0,     0,    43,    67,     0,    45,    34,    35,
+       0,     0,    36,    47,     0,    48,    37,    38,    39,    40,
+      41,    42,    34,    35,    43,    44,     0,    45,     0,     0,
+       0,     0,    36,    47,     0,    48,    37,    38,    39,    40,
+      41,    42,    34,    35,    43,     0,    36,    45,     0,    34,
+      35,   118,     0,    47,     0,    48,    34,    35,   119,    34,
+     179,    45,     0,     0,     0,     0,    36,    84,     0,    48,
+       0,     0,     0,    36,     0,    34,    35,     0,     0,    44,
+      36,    45,     0,    36,    34,    35,    82,    47,    45,    48,
+     178,    34,    35,   180,    84,    45,    48,     0,    45,    36,
+       0,    84,     0,    48,    84,     0,    48,     0,    36,     0,
+       0,     0,     0,     0,    45,    36,     0,     0,     0,   186,
+      84,     0,    48,    45,     0,   220,     0,     0,    57,    84,
+      45,    48,     0,     0,     0,     0,    84,     0,    48,   163,
      164,   165,   166,   167,   168,   169,   170,   171,   172,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,    35,    36,
-      37,    38,    39,    40,     0,     0,    41,   165,   166,   167,
-     168,   169,   170,   171,   172,   166,   167,   168,   169,   170,
-     171,   172
+     165,   166,   167,   168,   169,   170,   171,   172,   165,   166,
+     167,   168,   169,   170,   171,   172
 };
 
 static const yytype_int16 yycheck[] =
 {
-      10,    10,    13,    13,     6,    13,    10,     9,    11,    65,
-      12,    20,    10,    21,    22,    10,     0,    10,     9,     8,
-     108,   109,    32,    33,    80,    37,    38,    16,    17,    18,
-      19,    48,    44,    50,    23,    45,    46,    33,    51,    35,
-      34,    32,    44,    37,    38,    55,     8,     9,    44,    49,
-      44,     6,    55,     8,     9,    64,    66,    66,    45,    54,
-      64,    54,    66,     8,     9,    10,    11,    12,    66,    52,
-      81,    81,    82,    50,    76,   163,   164,   165,     8,     9,
-     168,   169,   170,   171,   172,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    10,    11,    12,   108,   109,
-     156,    49,    32,    53,   114,   115,    36,    37,    38,    39,
-      40,    41,    37,    38,    44,   125,    53,    47,   128,    51,
-     208,   209,    51,    53,    51,    55,    14,    15,    11,   139,
-     132,   142,   142,    53,   144,   145,    54,   145,    51,    53,
-      51,    51,    51,    51,   133,   147,   148,   149,   150,   151,
-     160,    51,    51,   163,   164,   165,    51,   146,   168,   169,
-     170,   171,   172,   152,     1,    51,    51,     7,    37,   179,
-      54,    53,     8,     9,    34,    53,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,     6,    32,     7,   208,   209,
-      54,     8,     9,    10,    10,   215,   216,    54,    45,    45,
-      47,    47,    49,    54,    48,   223,    54,    53,    51,    55,
-     228,   231,    51,   232,    51,    32,    48,     8,     9,    36,
-      37,    38,    39,    40,    41,    51,    51,    44,    45,    53,
-      47,    54,    54,   253,    51,    37,    53,    32,    55,     8,
-       9,    32,    53,   263,   264,    36,    37,    38,    39,    40,
-      41,    54,     9,    44,    45,    52,    47,    37,    35,    38,
-      51,    10,    53,    32,    55,     8,     9,    36,    37,    38,
-      39,    40,    41,    54,     9,    44,    45,    32,    47,    54,
-      54,    10,    10,    52,    53,    32,    55,    54,    54,    32,
-       8,     9,    10,    36,    37,    38,    39,    40,    41,   153,
-      54,    44,    45,    12,    47,    12,    66,    -1,    51,    -1,
-      53,    -1,    55,   246,    32,     8,     9,    -1,    36,    37,
-      38,    39,    40,    41,    -1,    -1,    44,    45,    -1,    47,
-      -1,     8,     9,    -1,    -1,    53,    -1,    55,    -1,    32,
-      -1,    -1,    -1,    36,    37,    38,    39,    40,    41,     8,
-       9,    44,    45,    -1,    47,    32,     8,     9,    -1,    -1,
-      53,    -1,    55,     8,     9,    -1,    -1,    -1,    45,    -1,
-      47,    -1,    -1,    32,    51,    52,    53,    -1,    55,    -1,
-      32,     8,     9,    42,    43,    37,    45,    32,    47,    -1,
-       8,     9,    44,    -1,    53,    47,    55,     8,     9,    -1,
-      45,    53,    47,    55,    -1,    32,     8,     9,    53,    -1,
-      55,    -1,    -1,    -1,    32,    42,    -1,    -1,    -1,    -1,
-      47,    32,     8,     9,    42,    -1,    53,    -1,    55,    47,
-      32,     8,     9,    -1,    -1,    53,    47,    55,    -1,    -1,
-      -1,    52,    53,    -1,    55,    47,    32,    -1,    -1,    -1,
-      52,    53,    -1,    55,    -1,    32,    42,    -1,    -1,    -1,
-      -1,    47,    -1,    -1,    -1,    -1,    -1,    53,    -1,    55,
-      47,    -1,    -1,    -1,    -1,    -1,    53,    -1,    55,     3,
+      10,    10,    13,    13,     6,    13,    67,     9,     0,    10,
+      12,    20,    10,    21,    22,    49,     9,     8,     9,     8,
+      51,    82,   108,   109,    34,    35,    45,    16,    17,    18,
+      19,    10,    52,    48,    23,    50,    10,    47,    48,    32,
+      53,    32,     8,     9,    46,    50,    11,    57,     8,     9,
+      10,    11,    12,    49,    45,    11,    47,    66,    68,    68,
+      51,    52,    53,    53,    55,    66,    32,    68,     8,     9,
+      68,    51,    83,    83,    84,    54,    78,   163,   164,   165,
+      54,    47,   168,   169,   170,   171,   172,    53,    51,    55,
+      51,    33,    57,    35,    53,   156,    51,    34,   108,   109,
+      37,    38,    44,    53,   114,   115,    51,    44,    36,    37,
+      38,    39,    40,    41,     7,   125,    44,    51,   128,    37,
+      38,    51,   208,   209,    51,     6,    44,     8,     9,   139,
+     132,   142,   142,    53,   144,   145,    51,   145,    10,    11,
+      12,    37,    38,    51,   133,   147,   148,   149,   150,   151,
+     160,    14,    15,   163,   164,   165,    51,   146,   168,   169,
+     170,   171,   172,   152,     8,     9,    10,    51,    51,   179,
+      37,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,     6,     7,     8,     9,    10,    11,    12,    32,    54,
+       6,    34,    36,    37,    38,    39,    40,    41,   208,   209,
+      44,    45,    53,    47,     7,   215,   216,    51,    10,    53,
+      37,    55,     1,    54,    54,   223,    54,    54,    51,    48,
+     228,   231,    54,   232,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,   253,     8,     9,    51,    51,    48,    32,
+      51,     9,    51,   263,   264,    53,    45,    54,    47,    54,
+      49,    53,    52,    54,     8,     9,    37,    35,    32,    38,
+      10,     9,    36,    37,    38,    39,    40,    41,     8,     9,
+      44,    45,    54,    47,    54,    32,    10,    51,    32,    53,
+      10,    55,    36,    37,    38,    39,    40,    41,     8,     9,
+      44,    45,    32,    47,    54,    32,    54,   153,    52,    53,
+      12,    55,    42,    43,    12,    45,    68,    47,     8,     9,
+      10,    54,    32,    53,   246,    55,    36,    37,    38,    39,
+      40,    41,    54,    -1,    44,    45,    -1,    47,     8,     9,
+      -1,    51,    32,    53,    -1,    55,    36,    37,    38,    39,
+      40,    41,    -1,    -1,    44,    45,    -1,    47,     8,     9,
+      -1,    -1,    32,    53,    -1,    55,    36,    37,    38,    39,
+      40,    41,     8,     9,    44,    45,    -1,    47,    -1,    -1,
+      -1,    -1,    32,    53,    -1,    55,    36,    37,    38,    39,
+      40,    41,     8,     9,    44,    -1,    32,    47,    -1,     8,
+       9,    37,    -1,    53,    -1,    55,     8,     9,    44,     8,
+       9,    47,    -1,    -1,    -1,    -1,    32,    53,    -1,    55,
+      -1,    -1,    -1,    32,    -1,     8,     9,    -1,    -1,    45,
+      32,    47,    -1,    32,     8,     9,    45,    53,    47,    55,
+      42,     8,     9,    42,    53,    47,    55,    -1,    47,    32,
+      -1,    53,    -1,    55,    53,    -1,    55,    -1,    32,    -1,
+      -1,    -1,    -1,    -1,    47,    32,    -1,    -1,    -1,    52,
+      53,    -1,    55,    47,    -1,    42,    -1,    -1,    52,    53,
+      47,    55,    -1,    -1,    -1,    -1,    53,    -1,    55,     3,
        4,     5,     6,     7,     8,     9,    10,    11,    12,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    36,    37,
-      38,    39,    40,    41,    -1,    -1,    44,     5,     6,     7,
-       8,     9,    10,    11,    12,     6,     7,     8,     9,    10,
-      11,    12
+       5,     6,     7,     8,     9,    10,    11,    12,     5,     6,
+       7,     8,     9,    10,    11,    12
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -843,15 +840,15 @@ static const yytype_uint8 yystos[] =
 {
        0,    57,     0,    58,     1,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    45,    47,    49,    59,    61,    49,
-      51,    62,     8,     9,    32,    36,    37,    38,    39,    40,
-      41,    44,    45,    47,    51,    53,    55,    66,    81,    85,
-      87,    88,    89,    90,    93,    52,    65,    81,    83,    86,
-      63,    83,    64,    81,    10,    45,    51,    70,    82,    84,
-      85,    88,    89,    93,    68,    90,    51,    62,    66,    71,
-      45,    51,    53,    67,    84,    86,    93,    69,    87,    78,
-      87,    79,    83,    72,    83,    73,    83,    74,    83,    75,
-      85,    76,    86,    77,    86,    80,    83,    48,    50,    50,
+      28,    29,    30,    31,    45,    47,    49,    59,    61,    69,
+      70,    49,    51,    62,     8,     9,    32,    36,    37,    38,
+      39,    40,    41,    44,    45,    47,    51,    53,    55,    66,
+      81,    85,    87,    88,    89,    90,    93,    52,    65,    81,
+      83,    86,    63,    83,    64,    81,    10,    45,    51,    71,
+      82,    84,    85,    88,    89,    93,    68,    90,    51,    62,
+      66,    72,    45,    51,    53,    67,    84,    86,    93,    87,
+      87,    79,    83,    73,    83,    74,    83,    75,    83,    76,
+      85,    77,    86,    78,    86,    80,    83,    48,    50,    50,
       49,    93,    93,     6,     8,     9,    91,    81,    37,    44,
       93,    95,    93,    53,    53,     9,    42,    43,    53,    90,
       93,    51,    51,    51,    85,    88,    91,    82,    53,    11,
@@ -1752,11 +1749,6 @@ yyreduce:
     { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
     break;
 
-  case 19:
-#line 106 "a.y"
-    { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
-    break;
-
   case 20:
 #line 107 "a.y"
     { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
@@ -1797,11 +1789,6 @@ yyreduce:
     { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
     break;
 
-  case 28:
-#line 115 "a.y"
-    { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
-    break;
-
   case 29:
 #line 116 "a.y"
     { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
@@ -1912,48 +1899,81 @@ yyreduce:
   case 43:
 #line 195 "a.y"
     {
-               settext((yyvsp[(1) - (4)].addr).sym);
-               (yyval.addr2).from = (yyvsp[(1) - (4)].addr);
-               (yyval.addr2).to = (yyvsp[(4) - (4)].addr);
+               Addr2 a;
+               settext((yyvsp[(2) - (5)].addr).sym);
+               a.from = (yyvsp[(2) - (5)].addr);
+               a.to = (yyvsp[(5) - (5)].addr);
+               outcode(ATEXT, &a);
        }
     break;
 
   case 44:
-#line 201 "a.y"
-    {
-               settext((yyvsp[(1) - (6)].addr).sym);
-               (yyval.addr2).from = (yyvsp[(1) - (6)].addr);
-               (yyval.addr2).from.scale = (yyvsp[(3) - (6)].lval);
-               (yyval.addr2).to = (yyvsp[(6) - (6)].addr);
+#line 203 "a.y"
+    {
+               Addr2 a;
+               settext((yyvsp[(2) - (7)].addr).sym);
+               a.from = (yyvsp[(2) - (7)].addr);
+               a.to = (yyvsp[(7) - (7)].addr);
+               outcode(ATEXT, &a);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = (yyvsp[(4) - (7)].lval);
+               }
        }
     break;
 
   case 45:
-#line 210 "a.y"
+#line 217 "a.y"
+    {
+               Addr2 a;
+               settext((yyvsp[(2) - (4)].addr).sym);
+               a.from = (yyvsp[(2) - (4)].addr);
+               a.to = (yyvsp[(4) - (4)].addr);
+               outcode(AGLOBL, &a);
+       }
+    break;
+
+  case 46:
+#line 225 "a.y"
+    {
+               Addr2 a;
+               settext((yyvsp[(2) - (6)].addr).sym);
+               a.from = (yyvsp[(2) - (6)].addr);
+               a.to = (yyvsp[(6) - (6)].addr);
+               outcode(AGLOBL, &a);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = (yyvsp[(4) - (6)].lval);
+               }
+       }
+    break;
+
+  case 47:
+#line 239 "a.y"
     {
                (yyval.addr2).from = nullgen;
                (yyval.addr2).to = (yyvsp[(2) - (2)].addr);
        }
     break;
 
-  case 46:
-#line 215 "a.y"
+  case 48:
+#line 244 "a.y"
     {
                (yyval.addr2).from = nullgen;
                (yyval.addr2).to = (yyvsp[(1) - (1)].addr);
        }
     break;
 
-  case 49:
-#line 226 "a.y"
+  case 51:
+#line 255 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (3)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (3)].addr);
        }
     break;
 
-  case 50:
-#line 231 "a.y"
+  case 52:
+#line 260 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (5)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (5)].addr);
@@ -1963,16 +1983,16 @@ yyreduce:
        }
     break;
 
-  case 51:
-#line 241 "a.y"
+  case 53:
+#line 270 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (3)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (3)].addr);
        }
     break;
 
-  case 52:
-#line 246 "a.y"
+  case 54:
+#line 275 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (5)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (5)].addr);
@@ -1982,32 +2002,32 @@ yyreduce:
        }
     break;
 
-  case 53:
-#line 256 "a.y"
+  case 55:
+#line 285 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (2)].addr);
                (yyval.addr2).to = nullgen;
        }
     break;
 
-  case 54:
-#line 261 "a.y"
+  case 56:
+#line 290 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (1)].addr);
                (yyval.addr2).to = nullgen;
        }
     break;
 
-  case 55:
-#line 266 "a.y"
+  case 57:
+#line 295 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (3)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (3)].addr);
        }
     break;
 
-  case 56:
-#line 273 "a.y"
+  case 58:
+#line 302 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (5)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (5)].addr);
@@ -2015,8 +2035,8 @@ yyreduce:
        }
     break;
 
-  case 57:
-#line 281 "a.y"
+  case 59:
+#line 310 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(3) - (5)].addr);
                (yyval.addr2).to = (yyvsp[(5) - (5)].addr);
@@ -2026,41 +2046,24 @@ yyreduce:
        }
     break;
 
-  case 58:
-#line 290 "a.y"
+  case 60:
+#line 319 "a.y"
     {
                (yyval.addr2).from = nullgen;
                (yyval.addr2).to = nullgen;
        }
     break;
 
-  case 59:
-#line 295 "a.y"
+  case 61:
+#line 324 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (1)].addr);
                (yyval.addr2).to = nullgen;
        }
     break;
 
-  case 60:
-#line 302 "a.y"
-    {
-               (yyval.addr2).from = (yyvsp[(1) - (3)].addr);
-               (yyval.addr2).to = (yyvsp[(3) - (3)].addr);
-       }
-    break;
-
-  case 61:
-#line 307 "a.y"
-    {
-               (yyval.addr2).from = (yyvsp[(1) - (5)].addr);
-               (yyval.addr2).from.scale = (yyvsp[(3) - (5)].lval);
-               (yyval.addr2).to = (yyvsp[(5) - (5)].addr);
-       }
-    break;
-
   case 62:
-#line 315 "a.y"
+#line 331 "a.y"
     {
                if((yyvsp[(1) - (3)].addr).type != TYPE_CONST || (yyvsp[(3) - (3)].addr).type != TYPE_CONST)
                        yyerror("arguments to PCDATA must be integer constants");
@@ -2070,7 +2073,7 @@ yyreduce:
     break;
 
   case 63:
-#line 324 "a.y"
+#line 340 "a.y"
     {
                if((yyvsp[(1) - (3)].addr).type != TYPE_CONST)
                        yyerror("index for FUNCDATA must be integer constant");
@@ -2082,21 +2085,21 @@ yyreduce:
     break;
 
   case 68:
-#line 341 "a.y"
+#line 357 "a.y"
     {
                (yyval.addr) = (yyvsp[(2) - (2)].addr);
        }
     break;
 
   case 69:
-#line 345 "a.y"
+#line 361 "a.y"
     {
                (yyval.addr) = (yyvsp[(2) - (2)].addr);
        }
     break;
 
   case 74:
-#line 357 "a.y"
+#line 373 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_BRANCH;
@@ -2105,7 +2108,7 @@ yyreduce:
     break;
 
   case 75:
-#line 363 "a.y"
+#line 379 "a.y"
     {
                (yyvsp[(1) - (2)].sym) = labellookup((yyvsp[(1) - (2)].sym));
                (yyval.addr) = nullgen;
@@ -2117,7 +2120,7 @@ yyreduce:
     break;
 
   case 76:
-#line 374 "a.y"
+#line 390 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2126,7 +2129,7 @@ yyreduce:
     break;
 
   case 77:
-#line 380 "a.y"
+#line 396 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2135,7 +2138,7 @@ yyreduce:
     break;
 
   case 78:
-#line 386 "a.y"
+#line 402 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2144,7 +2147,7 @@ yyreduce:
     break;
 
   case 79:
-#line 392 "a.y"
+#line 408 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2153,7 +2156,7 @@ yyreduce:
     break;
 
   case 80:
-#line 398 "a.y"
+#line 414 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2162,7 +2165,7 @@ yyreduce:
     break;
 
   case 81:
-#line 404 "a.y"
+#line 420 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2171,7 +2174,7 @@ yyreduce:
     break;
 
   case 82:
-#line 410 "a.y"
+#line 426 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2180,7 +2183,7 @@ yyreduce:
     break;
 
   case 83:
-#line 418 "a.y"
+#line 434 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_CONST;
@@ -2189,7 +2192,7 @@ yyreduce:
     break;
 
   case 84:
-#line 424 "a.y"
+#line 440 "a.y"
     {
                (yyval.addr) = (yyvsp[(2) - (2)].addr);
                (yyval.addr).type = TYPE_ADDR;
@@ -2202,7 +2205,7 @@ yyreduce:
     break;
 
   case 85:
-#line 434 "a.y"
+#line 450 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_SCONST;
@@ -2211,7 +2214,7 @@ yyreduce:
     break;
 
   case 86:
-#line 440 "a.y"
+#line 456 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2220,7 +2223,7 @@ yyreduce:
     break;
 
   case 87:
-#line 446 "a.y"
+#line 462 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2229,7 +2232,7 @@ yyreduce:
     break;
 
   case 88:
-#line 452 "a.y"
+#line 468 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2238,7 +2241,7 @@ yyreduce:
     break;
 
   case 89:
-#line 458 "a.y"
+#line 474 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2247,7 +2250,7 @@ yyreduce:
     break;
 
   case 92:
-#line 470 "a.y"
+#line 486 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2256,7 +2259,7 @@ yyreduce:
     break;
 
   case 93:
-#line 476 "a.y"
+#line 492 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2266,7 +2269,7 @@ yyreduce:
     break;
 
   case 94:
-#line 483 "a.y"
+#line 499 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2276,7 +2279,7 @@ yyreduce:
     break;
 
   case 95:
-#line 490 "a.y"
+#line 506 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2286,7 +2289,7 @@ yyreduce:
     break;
 
   case 96:
-#line 497 "a.y"
+#line 513 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2298,7 +2301,7 @@ yyreduce:
     break;
 
   case 97:
-#line 506 "a.y"
+#line 522 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2311,7 +2314,7 @@ yyreduce:
     break;
 
   case 98:
-#line 516 "a.y"
+#line 532 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2324,7 +2327,7 @@ yyreduce:
     break;
 
   case 99:
-#line 526 "a.y"
+#line 542 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2333,7 +2336,7 @@ yyreduce:
     break;
 
   case 100:
-#line 532 "a.y"
+#line 548 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2342,7 +2345,7 @@ yyreduce:
     break;
 
   case 101:
-#line 538 "a.y"
+#line 554 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2353,7 +2356,7 @@ yyreduce:
     break;
 
   case 102:
-#line 546 "a.y"
+#line 562 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2365,14 +2368,14 @@ yyreduce:
     break;
 
   case 103:
-#line 557 "a.y"
+#line 573 "a.y"
     {
                (yyval.addr) = (yyvsp[(1) - (1)].addr);
        }
     break;
 
   case 104:
-#line 561 "a.y"
+#line 577 "a.y"
     {
                (yyval.addr) = (yyvsp[(1) - (6)].addr);
                (yyval.addr).index = (yyvsp[(3) - (6)].lval);
@@ -2382,7 +2385,7 @@ yyreduce:
     break;
 
   case 105:
-#line 570 "a.y"
+#line 586 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2393,7 +2396,7 @@ yyreduce:
     break;
 
   case 106:
-#line 578 "a.y"
+#line 594 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2404,70 +2407,70 @@ yyreduce:
     break;
 
   case 107:
-#line 587 "a.y"
+#line 603 "a.y"
     {
                (yyval.lval) = 0;
        }
     break;
 
   case 108:
-#line 591 "a.y"
+#line 607 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 109:
-#line 595 "a.y"
+#line 611 "a.y"
     {
                (yyval.lval) = -(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 111:
-#line 602 "a.y"
+#line 618 "a.y"
     {
                (yyval.lval) = NAME_AUTO;
        }
     break;
 
   case 114:
-#line 610 "a.y"
+#line 626 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (1)].sym)->value;
        }
     break;
 
   case 115:
-#line 614 "a.y"
+#line 630 "a.y"
     {
                (yyval.lval) = -(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 116:
-#line 618 "a.y"
+#line 634 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 117:
-#line 622 "a.y"
+#line 638 "a.y"
     {
                (yyval.lval) = ~(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 118:
-#line 626 "a.y"
+#line 642 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (3)].lval);
        }
     break;
 
   case 119:
-#line 632 "a.y"
+#line 648 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = (yyvsp[(1) - (1)].lval);
@@ -2476,7 +2479,7 @@ yyreduce:
     break;
 
   case 120:
-#line 638 "a.y"
+#line 654 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = -(yyvsp[(2) - (2)].lval);
@@ -2485,7 +2488,7 @@ yyreduce:
     break;
 
   case 121:
-#line 644 "a.y"
+#line 660 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = (yyvsp[(1) - (3)].lval);
@@ -2494,7 +2497,7 @@ yyreduce:
     break;
 
   case 122:
-#line 650 "a.y"
+#line 666 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = -(yyvsp[(2) - (4)].lval);
@@ -2503,70 +2506,70 @@ yyreduce:
     break;
 
   case 124:
-#line 659 "a.y"
+#line 675 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) + (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 125:
-#line 663 "a.y"
+#line 679 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) - (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 126:
-#line 667 "a.y"
+#line 683 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) * (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 127:
-#line 671 "a.y"
+#line 687 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) / (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 128:
-#line 675 "a.y"
+#line 691 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) % (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 129:
-#line 679 "a.y"
+#line 695 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (4)].lval) << (yyvsp[(4) - (4)].lval);
        }
     break;
 
   case 130:
-#line 683 "a.y"
+#line 699 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (4)].lval) >> (yyvsp[(4) - (4)].lval);
        }
     break;
 
   case 131:
-#line 687 "a.y"
+#line 703 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) & (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 132:
-#line 691 "a.y"
+#line 707 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) ^ (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 133:
-#line 695 "a.y"
+#line 711 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) | (yyvsp[(3) - (3)].lval);
        }
@@ -2574,7 +2577,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 2578 "y.tab.c"
+#line 2581 "y.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
index 581b7a231e8ff0b11bf8de9e2411ad0d640c6eea..7a7b824da1476dbbf0aedce0ac907290db894a9f 100644 (file)
@@ -9,8 +9,6 @@
 #include "../gc/go.h"
 #include "../6l/6.out.h"
 
-#define TEXTFLAG from.scale
-
 EXTERN int32   dynloc;
 EXTERN uchar   reg[MAXREG];
 EXTERN int32   pcloc;          // instruction counter
index 1e996ae16264f99f4257e595fe927780bbca3e4f..6c7cc89025f10e6c5263a4a4bf9137d469592fd5 100644 (file)
@@ -198,9 +198,9 @@ ggloblnod(Node *nam)
        p->to.type = TYPE_CONST;
        p->to.offset = nam->type->width;
        if(nam->readonly)
-               p->from.scale = RODATA;
+               p->from3.offset = RODATA;
        if(nam->type != T && !haspointers(nam->type))
-               p->from.scale |= NOPTR;
+               p->from3.offset |= NOPTR;
 }
 
 void
@@ -225,7 +225,7 @@ ggloblsym(Sym *s, int32 width, int8 flags)
        p->from.sym = linksym(s);
        p->to.type = TYPE_CONST;
        p->to.offset = width;
-       p->from.scale = flags;
+       p->from3.offset = flags;
 }
 
 int
index a1aca07aea7445458bcbed85d6f6c71d17925901..24654b0ab848ea6cc2c8d8018073cbf8cd3b3d20 100644 (file)
@@ -139,6 +139,7 @@ EXTERN      int32   thunk;
 EXTERN Biobuf  obuf;
 EXTERN Link*   ctxt;
 EXTERN Biobuf  bstdout;
+EXTERN Prog*   lastpc;
 
 void*  alloc(int32);
 void*  allocn(void*, int32, int32);
index 0203d660c1d55b8b212a212bb937e340ceabc7db..3276289ffbe4484a98c2e2f2eb7558243fd51cde 100644 (file)
@@ -59,7 +59,7 @@
 %type  <lval>  con expr pointer offset
 %type  <addr>  mem imm reg nam rel rem rim rom omem nmem textsize
 %type  <addr2> nonnon nonrel nonrem rimnon rimrem remrim
-%type  <addr2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 spec9 spec10 spec11 spec12
+%type  <addr2> spec1 spec3 spec4 spec5 spec6 spec7 spec9 spec10 spec11 spec12
 %%
 prog:
 |      prog
@@ -101,13 +101,13 @@ inst:
 |      LTYPE4 remrim   { outcode($1, &$2); }
 |      LTYPER nonrel   { outcode($1, &$2); }
 |      LTYPED spec1    { outcode($1, &$2); }
-|      LTYPET spec2    { outcode($1, &$2); }
+|      spec2
 |      LTYPEC spec3    { outcode($1, &$2); }
 |      LTYPEN spec4    { outcode($1, &$2); }
 |      LTYPES spec5    { outcode($1, &$2); }
 |      LTYPEM spec6    { outcode($1, &$2); }
 |      LTYPEI spec7    { outcode($1, &$2); }
-|      LTYPEG spec8    { outcode($1, &$2); }
+|      spec8
 |      LTYPEXC spec9   { outcode($1, &$2); }
 |      LTYPEX spec10   { outcode($1, &$2); }
 |      LTYPEPC spec11  { outcode($1, &$2); }
@@ -188,18 +188,47 @@ spec1:    /* DATA */
        }
 
 spec2: /* TEXT */
-       mem ',' '$' textsize
+       LTYPET mem ',' '$' textsize
        {
-               settext($1.sym);
-               $$.from = $1;
-               $$.to = $4;
+               Addr2 a;
+               settext($2.sym);
+               a.from = $2;
+               a.to = $5;
+               outcode(ATEXT, &a);
        }
-|      mem ',' con ',' '$' textsize
+|      LTYPET mem ',' con ',' '$' textsize
        {
-               settext($1.sym);
-               $$.from = $1;
-               $$.from.scale = $3;
-               $$.to = $6;
+               Addr2 a;
+               settext($2.sym);
+               a.from = $2;
+               a.to = $7;
+               outcode(ATEXT, &a);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = $4;
+               }
+       }
+
+spec8: /* GLOBL */
+       LTYPEG mem ',' imm
+       {
+               Addr2 a;
+               settext($2.sym);
+               a.from = $2;
+               a.to = $4;
+               outcode(AGLOBL, &a);
+       }
+|      LTYPEG mem ',' con ',' imm
+       {
+               Addr2 a;
+               settext($2.sym);
+               a.from = $2;
+               a.to = $6;
+               outcode(AGLOBL, &a);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = $4;
+               }
        }
 
 spec3: /* JMP/CALL */
@@ -271,19 +300,6 @@ spec7:
                $$.to = $3;
        }
 
-spec8: /* GLOBL */
-       mem ',' imm
-       {
-               $$.from = $1;
-               $$.to = $3;
-       }
-|      mem ',' con ',' imm
-       {
-               $$.from = $1;
-               $$.from.scale = $3;
-               $$.to = $5;
-       }
-
 spec9: /* CMPPS/CMPPD */
        reg ',' rem ',' con
        {
index 9ac56e5459683447b9e371fd4517b446a06d3e68..846f6c6dafbe311bd9a9824bda4c95f561d2c580 100644 (file)
@@ -881,8 +881,6 @@ cclean(void)
        outcode(AEND, &g2);
 }
 
-static Prog *lastpc;
-
 void
 outcode(int a, Addr2 *g2)
 {
index 79439ccf8d60d844105a6f03c0cb864a1b26c3d8..66c11abd8307d17341ff9c379c84785f6aa8abde 100644 (file)
@@ -407,7 +407,7 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   544
+#define YYLAST   561
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  54
@@ -467,18 +467,18 @@ static const yytype_uint16 yyprhs[] =
 {
        0,     0,     3,     4,     5,     9,    10,    15,    17,    20,
       23,    27,    31,    34,    37,    40,    43,    46,    49,    52,
-      55,    58,    61,    64,    67,    70,    73,    76,    79,    82,
-      85,    86,    88,    92,    96,    99,   101,   104,   106,   109,
-     111,   115,   121,   126,   133,   136,   138,   141,   143,   145,
-     149,   155,   159,   165,   168,   170,   174,   178,   184,   190,
-     196,   200,   204,   206,   208,   210,   212,   215,   218,   220,
-     222,   224,   226,   228,   233,   236,   238,   240,   242,   244,
-     246,   248,   251,   254,   257,   260,   265,   271,   275,   277,
-     280,   284,   289,   291,   293,   295,   300,   305,   312,   322,
-     332,   336,   340,   345,   351,   360,   362,   369,   375,   383,
-     384,   387,   390,   392,   394,   396,   398,   400,   403,   406,
-     409,   413,   415,   419,   423,   427,   431,   435,   440,   445,
-     449,   453
+      54,    57,    60,    63,    66,    69,    71,    74,    77,    80,
+      83,    84,    86,    90,    94,    97,    99,   102,   104,   107,
+     109,   113,   119,   125,   133,   138,   145,   148,   150,   153,
+     155,   157,   161,   167,   171,   177,   180,   182,   186,   192,
+     198,   202,   206,   208,   210,   212,   214,   217,   220,   222,
+     224,   226,   228,   230,   235,   238,   240,   242,   244,   246,
+     248,   250,   253,   256,   259,   262,   267,   273,   277,   279,
+     282,   286,   291,   293,   295,   297,   302,   307,   314,   324,
+     334,   338,   342,   347,   353,   362,   364,   371,   377,   385,
+     386,   389,   392,   394,   396,   398,   400,   402,   405,   408,
+     411,   415,   417,   421,   425,   429,   433,   437,   442,   447,
+     451,   455
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -489,47 +489,47 @@ static const yytype_int8 yyrhs[] =
        1,    47,    -1,    43,    48,    92,    -1,    45,    48,    92,
       -1,    13,    60,    -1,    14,    64,    -1,    15,    63,    -1,
       16,    61,    -1,    17,    62,    -1,    21,    65,    -1,    19,
-      66,    -1,    22,    67,    -1,    18,    68,    -1,    20,    69,
-      -1,    23,    70,    -1,    24,    71,    -1,    25,    72,    -1,
-      26,    73,    -1,    27,    74,    -1,    28,    75,    -1,    29,
-      76,    -1,    30,    77,    -1,    -1,    49,    -1,    80,    49,
-      78,    -1,    78,    49,    80,    -1,    80,    49,    -1,    80,
-      -1,    49,    78,    -1,    78,    -1,    49,    81,    -1,    81,
-      -1,    83,    49,    81,    -1,    88,    11,    91,    49,    83,
-      -1,    85,    49,    50,    84,    -1,    85,    49,    91,    49,
-      50,    84,    -1,    49,    79,    -1,    79,    -1,    10,    88,
-      -1,    60,    -1,    64,    -1,    80,    49,    78,    -1,    80,
-      49,    78,    46,    36,    -1,    80,    49,    78,    -1,    80,
-      49,    78,    46,    37,    -1,    80,    49,    -1,    80,    -1,
-      80,    49,    78,    -1,    85,    49,    83,    -1,    85,    49,
-      91,    49,    83,    -1,    82,    49,    78,    49,    91,    -1,
-      83,    49,    78,    49,    82,    -1,    80,    49,    80,    -1,
-      80,    49,    80,    -1,    82,    -1,    85,    -1,    81,    -1,
-      87,    -1,    10,    82,    -1,    10,    86,    -1,    82,    -1,
-      86,    -1,    83,    -1,    78,    -1,    83,    -1,    91,    51,
-      33,    52,    -1,    43,    89,    -1,    35,    -1,    38,    -1,
-      36,    -1,    39,    -1,    42,    -1,    37,    -1,    50,    91,
-      -1,    50,    88,    -1,    50,    41,    -1,    50,    40,    -1,
-      50,    51,    40,    52,    -1,    50,    51,     9,    40,    52,
-      -1,    50,     9,    40,    -1,    31,    -1,     9,    31,    -1,
-      31,     9,    31,    -1,     9,    31,     9,    31,    -1,    86,
-      -1,    87,    -1,    91,    -1,    91,    51,    36,    52,    -1,
-      91,    51,    42,    52,    -1,    91,    51,    36,    10,    91,
-      52,    -1,    91,    51,    36,    52,    51,    36,    10,    91,
-      52,    -1,    91,    51,    36,    52,    51,    37,    10,    91,
-      52,    -1,    51,    36,    52,    -1,    51,    42,    52,    -1,
-      91,    51,    37,    52,    -1,    51,    36,    10,    91,    52,
-      -1,    51,    36,    52,    51,    36,    10,    91,    52,    -1,
-      88,    -1,    88,    51,    36,    10,    91,    52,    -1,    43,
-      89,    51,    90,    52,    -1,    43,     6,     7,    89,    51,
-      34,    52,    -1,    -1,     8,    91,    -1,     9,    91,    -1,
-      34,    -1,    42,    -1,    32,    -1,    31,    -1,    45,    -1,
-       9,    91,    -1,     8,    91,    -1,    53,    91,    -1,    51,
-      92,    52,    -1,    91,    -1,    92,     8,    92,    -1,    92,
-       9,    92,    -1,    92,    10,    92,    -1,    92,    11,    92,
-      -1,    92,    12,    92,    -1,    92,     6,     6,    92,    -1,
-      92,     7,     7,    92,    -1,    92,     5,    92,    -1,    92,
-       4,    92,    -1,    92,     3,    92,    -1
+      66,    -1,    67,    -1,    18,    69,    -1,    20,    70,    -1,
+      23,    71,    -1,    24,    72,    -1,    25,    73,    -1,    68,
+      -1,    27,    74,    -1,    28,    75,    -1,    29,    76,    -1,
+      30,    77,    -1,    -1,    49,    -1,    80,    49,    78,    -1,
+      78,    49,    80,    -1,    80,    49,    -1,    80,    -1,    49,
+      78,    -1,    78,    -1,    49,    81,    -1,    81,    -1,    83,
+      49,    81,    -1,    88,    11,    91,    49,    83,    -1,    22,
+      85,    49,    50,    84,    -1,    22,    85,    49,    91,    49,
+      50,    84,    -1,    26,    85,    49,    83,    -1,    26,    85,
+      49,    91,    49,    83,    -1,    49,    79,    -1,    79,    -1,
+      10,    88,    -1,    60,    -1,    64,    -1,    80,    49,    78,
+      -1,    80,    49,    78,    46,    36,    -1,    80,    49,    78,
+      -1,    80,    49,    78,    46,    37,    -1,    80,    49,    -1,
+      80,    -1,    80,    49,    78,    -1,    82,    49,    78,    49,
+      91,    -1,    83,    49,    78,    49,    82,    -1,    80,    49,
+      80,    -1,    80,    49,    80,    -1,    82,    -1,    85,    -1,
+      81,    -1,    87,    -1,    10,    82,    -1,    10,    86,    -1,
+      82,    -1,    86,    -1,    83,    -1,    78,    -1,    83,    -1,
+      91,    51,    33,    52,    -1,    43,    89,    -1,    35,    -1,
+      38,    -1,    36,    -1,    39,    -1,    42,    -1,    37,    -1,
+      50,    91,    -1,    50,    88,    -1,    50,    41,    -1,    50,
+      40,    -1,    50,    51,    40,    52,    -1,    50,    51,     9,
+      40,    52,    -1,    50,     9,    40,    -1,    31,    -1,     9,
+      31,    -1,    31,     9,    31,    -1,     9,    31,     9,    31,
+      -1,    86,    -1,    87,    -1,    91,    -1,    91,    51,    36,
+      52,    -1,    91,    51,    42,    52,    -1,    91,    51,    36,
+      10,    91,    52,    -1,    91,    51,    36,    52,    51,    36,
+      10,    91,    52,    -1,    91,    51,    36,    52,    51,    37,
+      10,    91,    52,    -1,    51,    36,    52,    -1,    51,    42,
+      52,    -1,    91,    51,    37,    52,    -1,    51,    36,    10,
+      91,    52,    -1,    51,    36,    52,    51,    36,    10,    91,
+      52,    -1,    88,    -1,    88,    51,    36,    10,    91,    52,
+      -1,    43,    89,    51,    90,    52,    -1,    43,     6,     7,
+      89,    51,    34,    52,    -1,    -1,     8,    91,    -1,     9,
+      91,    -1,    34,    -1,    42,    -1,    32,    -1,    31,    -1,
+      45,    -1,     9,    91,    -1,     8,    91,    -1,    53,    91,
+      -1,    51,    92,    52,    -1,    91,    -1,    92,     8,    92,
+      -1,    92,     9,    92,    -1,    92,    10,    92,    -1,    92,
+      11,    92,    -1,    92,    12,    92,    -1,    92,     6,     6,
+      92,    -1,    92,     7,     7,    92,    -1,    92,     5,    92,
+      -1,    92,     4,    92,    -1,    92,     3,    92,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -539,16 +539,16 @@ static const yytype_uint16 yyrline[] =
       86,    91,    97,    98,    99,   100,   101,   102,   103,   104,
      105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
      117,   121,   128,   135,   142,   147,   154,   159,   166,   171,
-     176,   183,   191,   197,   206,   211,   216,   224,   225,   228,
-     233,   243,   248,   258,   263,   268,   275,   280,   288,   296,
-     306,   315,   326,   327,   330,   331,   332,   336,   340,   341,
-     342,   345,   346,   349,   355,   366,   372,   378,   384,   390,
-     396,   404,   410,   420,   426,   432,   438,   444,   452,   458,
-     464,   470,   478,   479,   482,   489,   496,   503,   513,   523,
-     533,   539,   545,   552,   561,   572,   576,   585,   593,   603,
-     606,   610,   616,   617,   621,   624,   625,   629,   633,   637,
-     641,   647,   648,   652,   656,   660,   664,   668,   672,   676,
-     680,   684
+     176,   183,   191,   199,   213,   221,   235,   240,   245,   253,
+     254,   257,   262,   272,   277,   287,   292,   297,   304,   312,
+     322,   331,   342,   343,   346,   347,   348,   352,   356,   357,
+     358,   361,   362,   365,   371,   382,   388,   394,   400,   406,
+     412,   420,   426,   436,   442,   448,   454,   460,   468,   474,
+     480,   486,   494,   495,   498,   505,   512,   519,   529,   539,
+     549,   555,   561,   568,   577,   588,   592,   601,   609,   619,
+     622,   626,   632,   633,   637,   640,   641,   645,   649,   653,
+     657,   663,   664,   668,   672,   676,   680,   684,   688,   692,
+     696,   700
 };
 #endif
 
@@ -565,8 +565,8 @@ static const char *const yytname[] =
   "LXREG", "LFCONST", "LSCONST", "LSP", "LNAME", "LLAB", "LVAR", "':'",
   "';'", "'='", "','", "'$'", "'('", "')'", "'~'", "$accept", "prog", "@1",
   "line", "@2", "inst", "nonnon", "rimrem", "remrim", "rimnon", "nonrem",
-  "nonrel", "spec1", "spec2", "spec3", "spec4", "spec5", "spec6", "spec7",
-  "spec8", "spec9", "spec10", "spec11", "spec12", "rem", "rom", "rim",
+  "nonrel", "spec1", "spec2", "spec8", "spec3", "spec4", "spec5", "spec6",
+  "spec7", "spec9", "spec10", "spec11", "spec12", "rem", "rom", "rim",
   "rel", "reg", "imm", "textsize", "mem", "omem", "nmem", "nam", "offset",
   "pointer", "con", "expr", 0
 };
@@ -593,8 +593,8 @@ static const yytype_uint8 yyr1[] =
       59,    59,    59,    59,    59,    59,    59,    59,    59,    59,
       59,    59,    59,    59,    59,    59,    59,    59,    59,    59,
       60,    60,    61,    62,    63,    63,    64,    64,    65,    65,
-      65,    66,    67,    67,    68,    68,    68,    69,    69,    70,
-      70,    71,    71,    72,    72,    72,    73,    73,    74,    75,
+      65,    66,    67,    67,    68,    68,    69,    69,    69,    70,
+      70,    71,    71,    72,    72,    73,    73,    73,    74,    75,
       76,    77,    78,    78,    79,    79,    79,    79,    79,    79,
       79,    80,    80,    81,    81,    82,    82,    82,    82,    82,
       82,    83,    83,    83,    83,    83,    83,    83,    84,    84,
@@ -609,11 +609,11 @@ static const yytype_uint8 yyr1[] =
 static const yytype_uint8 yyr2[] =
 {
        0,     2,     0,     0,     3,     0,     4,     1,     2,     2,
-       3,     3,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       3,     3,     2,     2,     2,     2,     2,     2,     2,     1,
+       2,     2,     2,     2,     2,     1,     2,     2,     2,     2,
        0,     1,     3,     3,     2,     1,     2,     1,     2,     1,
-       3,     5,     4,     6,     2,     1,     2,     1,     1,     3,
-       5,     3,     5,     2,     1,     3,     3,     5,     5,     5,
+       3,     5,     5,     7,     4,     6,     2,     1,     2,     1,
+       1,     3,     5,     3,     5,     2,     1,     3,     5,     5,
        3,     3,     1,     1,     1,     1,     2,     2,     1,     1,
        1,     1,     1,     4,     2,     1,     1,     1,     1,     1,
        1,     2,     2,     2,     2,     4,     5,     3,     1,     2,
@@ -631,29 +631,29 @@ static const yytype_uint8 yydefact[] =
 {
        2,     3,     1,     0,     0,    30,     0,     0,     0,     0,
        0,     0,    30,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     7,     4,     0,     9,    31,
-      12,     0,     0,   115,    75,    77,    80,    76,    78,    79,
-     109,   116,     0,     0,     0,    13,    37,    62,    63,    92,
-      93,   105,    94,     0,    14,    71,    35,    72,    15,     0,
-      16,     0,     0,   109,     0,    20,    45,    64,    68,    70,
-      69,    65,    94,    18,     0,    31,    47,    48,    21,   109,
-       0,     0,    17,    39,     0,     0,    19,     0,    22,     0,
-      23,     0,    24,    54,    25,     0,    26,     0,    27,     0,
+       0,     0,     0,     0,     0,     7,     4,     0,    19,    25,
+       9,    31,    12,     0,     0,   115,    75,    77,    80,    76,
+      78,    79,   109,   116,     0,     0,     0,    13,    37,    62,
+      63,    92,    93,   105,    94,     0,    14,    71,    35,    72,
+      15,     0,    16,     0,     0,   109,     0,    20,    47,    64,
+      68,    70,    69,    65,    94,    18,     0,    31,    49,    50,
+      21,   109,     0,     0,    17,    39,     0,     0,     0,    22,
+       0,    23,     0,    24,    56,     0,    26,     0,    27,     0,
       28,     0,    29,     0,     5,     0,     0,     8,   118,   117,
        0,     0,     0,     0,    36,     0,     0,   121,     0,   119,
        0,     0,     0,    84,    83,     0,    82,    81,    34,     0,
-       0,    66,    67,    46,    74,     0,    44,     0,     0,    74,
-      38,     0,     0,     0,     0,     0,    53,     0,     0,     0,
+       0,    66,    67,    48,    74,     0,    46,     0,     0,    74,
+      38,     0,     0,     0,     0,     0,    55,     0,     0,     0,
        0,     0,     0,    10,    11,   109,   110,   111,     0,     0,
      100,   101,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,   120,     0,     0,     0,     0,    87,     0,     0,
-      32,    33,     0,     0,    40,     0,     0,    49,    51,    55,
-      56,     0,     0,     0,    60,    61,     6,     0,   114,   112,
+      32,    33,     0,     0,    40,     0,     0,    51,    53,    57,
+      44,     0,     0,     0,    60,    61,     6,     0,   114,   112,
      113,     0,     0,     0,   131,   130,   129,     0,     0,   122,
      123,   124,   125,   126,     0,     0,    95,   102,    96,     0,
       85,    73,     0,     0,    88,    42,     0,     0,     0,     0,
        0,     0,     0,   107,   103,     0,   127,   128,     0,     0,
-       0,    86,    41,    89,     0,     0,    50,    52,    57,    58,
+       0,    86,    41,    89,     0,     0,    52,    54,    45,    58,
       59,     0,     0,   106,    97,     0,     0,     0,    90,    43,
      108,     0,     0,     0,    91,   104,     0,     0,    98,    99
 };
@@ -661,53 +661,53 @@ static const yytype_uint8 yydefact[] =
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,     3,    26,   152,    27,    30,    58,    60,    54,
-      45,    82,    73,    86,    65,    78,    88,    90,    92,    94,
-      96,    98,   100,   102,    55,    66,    56,    67,    47,    57,
-     225,    48,    49,    50,    51,   113,   201,    52,   118
+      -1,     1,     3,    26,   152,    27,    32,    60,    62,    56,
+      47,    84,    75,    28,    29,    67,    80,    89,    91,    93,
+      96,    98,   100,   102,    57,    68,    58,    69,    49,    59,
+     225,    50,    51,    52,    53,   113,   201,    54,   118
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -89
+#define YYPACT_NINF -87
 static const yytype_int16 yypact[] =
 {
-     -89,     8,   -89,   211,   -36,   -35,   164,   283,   283,   331,
-     235,     9,   307,    41,   409,   283,   283,   283,   409,   502,
-     -18,   283,   283,    60,    30,   -89,   -89,    21,   -89,   -89,
-     -89,   466,   466,   -89,   -89,   -89,   -89,   -89,   -89,   -89,
-      79,   -89,   331,   394,   466,   -89,   -89,   -89,   -89,   -89,
-     -89,    38,    46,   370,   -89,   -89,    58,   -89,   -89,    64,
-     -89,    65,   331,    79,   259,   -89,   -89,   -89,   -89,   -89,
-     -89,   -89,    66,   -89,   105,   331,   -89,   -89,   -89,    31,
-     418,   466,   -89,   -89,    69,    71,   -89,    75,   -89,    76,
-     -89,    78,   -89,    80,   -89,    87,   -89,    89,   -89,    91,
-     -89,    93,   -89,    95,   -89,   466,   466,   -89,   -89,   -89,
-     116,   466,   466,    94,   -89,    -1,    96,   -89,   171,   -89,
-     110,   -11,    90,   -89,   -89,   425,   -89,   -89,   -89,   331,
-     283,   -89,   -89,   -89,    94,   355,   -89,    67,   466,   -89,
-     -89,   418,   118,   435,   331,   331,   331,   442,   331,   331,
-     283,   283,   211,   181,   181,    31,   -89,   -89,    35,   466,
-     104,   -89,   466,   466,   466,   150,   158,   466,   466,   466,
-     466,   466,   -89,   159,    10,   142,   144,   -89,   459,   156,
-     -89,   -89,   166,   161,   -89,     7,   162,   170,   173,   -89,
-     -89,   197,   198,   199,   -89,   -89,   -89,   200,   -89,   -89,
-     -89,   203,   205,   213,   516,   524,   253,   466,   466,    53,
-      53,   -89,   -89,   -89,   466,   466,   224,   -89,   -89,   227,
-     -89,   -89,   -18,   219,   267,   -89,   231,   246,   250,   -18,
-     466,   502,   249,   -89,   -89,   279,    36,    36,   241,   247,
-      74,   -89,   -89,   291,   272,     7,   -89,   -89,   -89,   -89,
-     -89,   254,   466,   -89,   -89,   295,   297,   277,   -89,   -89,
-     -89,   261,   466,   466,   -89,   -89,   265,   271,   -89,   -89
+     -87,    14,   -87,   242,   -29,   -23,   164,   313,   313,   361,
+     265,   -14,   337,   180,   417,   313,   313,   313,   417,    81,
+      24,   313,   313,    16,    31,   -87,   -87,    33,   -87,   -87,
+     -87,   -87,   -87,   498,   498,   -87,   -87,   -87,   -87,   -87,
+     -87,   -87,    43,   -87,   361,    58,   498,   -87,   -87,   -87,
+     -87,   -87,   -87,    37,    39,   400,   -87,   -87,    42,   -87,
+     -87,    44,   -87,    48,   361,    43,   289,   -87,   -87,   -87,
+     -87,   -87,   -87,   -87,    62,   -87,    99,   361,   -87,   -87,
+     -87,    13,   424,   498,   -87,   -87,    65,    73,    76,   -87,
+      78,   -87,    80,   -87,    86,    87,   -87,    89,   -87,   102,
+     -87,   106,   -87,   113,   -87,   498,   498,   -87,   -87,   -87,
+     123,   498,   498,   112,   -87,    -2,   119,   -87,   175,   -87,
+     128,    50,   441,   -87,   -87,   448,   -87,   -87,   -87,   361,
+     313,   -87,   -87,   -87,   112,   385,   -87,    -5,   498,   -87,
+     -87,   424,   141,   465,   361,   361,   361,   474,   361,   361,
+     313,   313,   242,   549,   549,    13,   -87,   -87,    12,   498,
+     124,   -87,   498,   498,   498,   184,   185,   498,   498,   498,
+     498,   498,   -87,   181,     1,   142,   144,   -87,   481,   156,
+     -87,   -87,   158,   163,   -87,     7,   167,   147,   172,   -87,
+     -87,   170,   177,   179,   -87,   -87,   -87,   173,   -87,   -87,
+     -87,   199,   202,   196,   136,   229,   238,   498,   498,    59,
+      59,   -87,   -87,   -87,   498,   498,   225,   -87,   -87,   226,
+     -87,   -87,    24,   246,   270,   -87,   230,   245,   247,    24,
+     498,    81,   248,   -87,   -87,   273,    96,    96,   234,   236,
+       3,   -87,   -87,   281,   260,     7,   -87,   -87,   -87,   -87,
+     -87,   240,   498,   -87,   -87,   283,   284,   264,   -87,   -87,
+     -87,   253,   498,   498,   -87,   -87,   254,   257,   -87,   -87
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-     -89,   -89,   -89,   172,   -89,   -89,   299,   -89,   -89,   -89,
-     315,   -89,   -89,   -89,   -89,   -89,   -89,   -89,   -89,   -89,
-     -89,   -89,   -89,   -89,    18,   266,    20,    -7,    -9,    -8,
-      84,     5,    -3,    -6,     4,   -50,   -89,   -10,   -88
+     -87,   -87,   -87,   159,   -87,   -87,   300,   -87,   -87,   -87,
+     301,   -87,   -87,   -87,   -87,   -87,   -87,   -87,   -87,   -87,
+     -87,   -87,   -87,   -87,    21,   251,    26,    -7,    -9,    -8,
+      74,    -1,    -3,    -6,     4,   -56,   -87,   -10,   -86
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -717,120 +717,124 @@ static const yytype_int16 yypgoto[] =
 #define YYTABLE_NINF -1
 static const yytype_uint16 yytable[] =
 {
-      72,    68,    69,    85,    71,    84,    83,    70,     2,   159,
-      97,    28,    99,   134,    29,    74,   223,   153,   154,    87,
-     215,   108,   109,    95,    46,   174,   175,    61,    59,   139,
-      46,   176,    53,   117,   119,    89,    91,    93,   224,   111,
-     112,   101,   103,   127,   167,   168,   169,   170,   171,    31,
-      32,   160,    40,   131,    72,    68,    69,   126,    71,   132,
-     114,    70,   216,   169,   170,   171,   133,   198,   107,   199,
-      85,   117,    33,   140,   204,   205,   206,   200,   106,   209,
-     210,   211,   212,   213,    79,   110,    41,   111,   112,   120,
-      80,    53,    81,   114,    44,   117,   117,   121,    31,    32,
-     182,   156,   157,   174,   175,   197,   104,   128,   105,   176,
-     255,   256,   109,   129,   130,   117,   138,   137,   141,   236,
-     237,    33,   142,   155,   143,   144,   131,   145,   183,   146,
-     177,    85,   132,   186,   184,    41,   147,   191,   148,   190,
-     149,    81,   150,    44,   151,   158,   173,   180,   161,   202,
-     181,   182,   117,   117,   117,   203,   207,   117,   117,   117,
-     117,   117,   187,   188,   189,   208,   192,   193,   109,   214,
-     194,   195,    31,    32,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   217,    33,   218,   117,   117,    34,
-      35,    36,    37,    38,   238,   239,    39,    40,   220,    41,
-     222,   226,     4,    42,   242,    43,   227,    44,   221,   228,
-     249,   248,   250,   172,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,   261,    31,    32,    62,   229,   230,   231,   235,
-     243,   232,   266,   267,    23,   233,    24,   234,    25,   165,
-     166,   167,   168,   169,   170,   171,    33,    31,    32,   135,
-      34,    35,    36,    37,    38,   240,   244,    39,    63,   241,
-      41,   245,   246,   251,    64,    53,    43,   247,    44,   252,
-      33,    31,    32,   253,    34,    35,    36,    37,    38,   254,
-     257,    39,    63,   258,    41,   262,   260,   263,   264,    53,
-      43,    76,    44,   265,    33,    31,    32,   268,    34,    35,
-      36,    37,    38,   269,   196,    39,    40,    77,    41,   259,
-     136,     0,     0,    53,    43,     0,    44,     0,    33,    31,
-      32,     0,    34,    35,    36,    37,    38,     0,     0,    39,
-      40,     0,    41,     0,     0,     0,    75,     0,    43,     0,
-      44,     0,    33,    31,    32,     0,    34,    35,    36,    37,
-      38,     0,     0,    39,    40,     0,    41,     0,    31,   122,
-       0,     0,    43,     0,    44,     0,    33,     0,     0,     0,
-      34,    35,    36,    37,    38,     0,     0,    39,     0,     0,
-      41,    33,    31,    32,     0,     0,    43,     0,    44,     0,
-     123,   124,     0,    40,     0,    41,     0,    31,    32,     0,
-       0,   125,     0,    44,     0,    33,    31,    32,     0,     0,
-     115,     0,     0,    31,   178,     0,   116,     0,     0,    41,
-      33,     0,     0,    31,    32,    81,     0,    44,     0,    33,
-      31,    32,    40,     0,    41,     0,    33,     0,     0,     0,
-      43,    79,    44,    41,     0,   179,    33,    31,    32,    81,
-      41,    44,     0,    33,    31,    32,    81,     0,    44,     0,
-      41,     0,     0,     0,     0,   185,    81,    41,    44,     0,
-      33,     0,    53,    81,     0,    44,     0,    33,     0,   219,
-       0,     0,     0,     0,    41,     0,     0,     0,     0,     0,
-      81,    41,    44,     0,     0,     0,     0,    81,     0,    44,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   164,
-     165,   166,   167,   168,   169,   170,   171,    34,    35,    36,
-      37,    38,     0,     0,    39
+      74,    70,    71,    87,    73,    86,    85,    72,   159,   134,
+      97,   215,    99,    88,     2,    76,   223,    95,    30,   153,
+     154,   111,   112,   108,   109,   139,    31,    48,   182,    42,
+      63,   174,   175,    48,    61,   117,   119,   176,   224,   255,
+     256,    90,    92,    94,   198,   127,   199,   101,   103,   110,
+     160,   111,   112,   216,   200,   131,    74,    70,    71,   126,
+      73,   132,   104,    72,   105,   114,    33,    34,   133,   169,
+     170,   171,    87,   117,    55,   140,   204,   205,   206,   106,
+     107,   209,   210,   211,   212,   213,   174,   175,   120,    35,
+     121,   128,   176,   129,   115,   117,   117,   130,   114,   197,
+     116,   156,   157,    43,   167,   168,   169,   170,   171,    83,
+     138,    46,   109,   137,   141,   117,    36,    37,    38,    39,
+      40,   236,   237,    41,   142,   143,   131,   144,   183,   145,
+     155,    87,   132,   186,   184,   146,   147,   191,   148,   190,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   202,
+     180,   149,   117,   117,   117,   150,   181,   117,   117,   117,
+     117,   117,   151,   158,   173,   187,   188,   189,   109,   192,
+     193,   161,    33,    34,   182,   203,   194,   195,   162,   163,
+     164,   165,   166,   167,   168,   169,   170,   171,    33,    34,
+     207,   214,   208,   227,   217,    35,   218,   117,   117,    36,
+      37,    38,    39,    40,   238,   239,    41,    42,   220,    43,
+     221,    35,   222,    44,   242,    45,   226,    46,   228,   229,
+     249,   248,   250,    81,   232,    43,   230,   172,   231,    82,
+      55,    83,   235,    46,   164,   165,   166,   167,   168,   169,
+     170,   171,   261,     4,   165,   166,   167,   168,   169,   170,
+     171,   233,   266,   267,   234,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    33,    34,    64,   240,   243,   241,   244,
+     245,   246,   251,   252,   247,    23,   253,    24,   254,    25,
+     257,   258,   260,   262,   263,   264,    35,    33,    34,   135,
+      36,    37,    38,    39,    40,   265,   268,    41,    65,   269,
+      43,   196,    78,    79,    66,    55,    45,   136,    46,   259,
+      35,    33,    34,     0,    36,    37,    38,    39,    40,     0,
+       0,    41,    65,     0,    43,     0,     0,     0,     0,    55,
+      45,     0,    46,     0,    35,    33,    34,     0,    36,    37,
+      38,    39,    40,     0,     0,    41,    42,     0,    43,     0,
+       0,     0,     0,    55,    45,     0,    46,     0,    35,    33,
+      34,     0,    36,    37,    38,    39,    40,     0,     0,    41,
+      42,     0,    43,     0,     0,     0,    77,     0,    45,     0,
+      46,     0,    35,    33,    34,     0,    36,    37,    38,    39,
+      40,     0,     0,    41,    42,     0,    43,     0,    33,   122,
+       0,     0,    45,     0,    46,     0,    35,     0,     0,     0,
+      36,    37,    38,    39,    40,    33,    34,    41,     0,     0,
+      43,    35,    33,    34,     0,     0,    45,     0,    46,     0,
+     123,   124,     0,    42,     0,    43,     0,     0,    35,    33,
+      34,   125,     0,    46,     0,    35,    33,   178,     0,     0,
+      42,     0,    43,     0,     0,     0,     0,    81,    45,    43,
+      46,     0,    35,    33,    34,    83,     0,    46,     0,    35,
+       0,   177,    33,    34,     0,     0,    43,     0,   179,    33,
+      34,     0,    83,    43,    46,     0,    35,     0,     0,    83,
+       0,    46,     0,     0,     0,    35,    33,    34,     0,     0,
+      43,     0,    35,     0,     0,   185,    83,     0,    46,    43,
+       0,   219,     0,     0,    55,    83,    43,    46,     0,    35,
+       0,     0,    83,     0,    46,     0,     0,     0,     0,     0,
+       0,     0,     0,    43,     0,     0,     0,     0,     0,    83,
+       0,    46,   162,   163,   164,   165,   166,   167,   168,   169,
+     170,   171
 };
 
 static const yytype_int16 yycheck[] =
 {
-      10,    10,    10,    13,    10,    13,    13,    10,     0,    10,
-      19,    47,    20,    63,    49,    11,     9,   105,   106,    14,
-      10,    31,    32,    18,     6,    36,    37,     9,     8,    79,
-      12,    42,    50,    43,    44,    15,    16,    17,    31,     8,
-       9,    21,    22,    53,     8,     9,    10,    11,    12,     8,
-       9,    52,    43,    62,    64,    64,    64,    53,    64,    62,
-      42,    64,    52,    10,    11,    12,    62,    32,    47,    34,
-      80,    81,    31,    80,   162,   163,   164,    42,    48,   167,
-     168,   169,   170,   171,    43,     6,    45,     8,     9,    51,
-      49,    50,    51,    75,    53,   105,   106,    51,     8,     9,
-      33,   111,   112,    36,    37,   155,    46,    49,    48,    42,
-      36,    37,   122,    49,    49,   125,    11,    51,    49,   207,
-     208,    31,    51,     7,    49,    49,   135,    49,   138,    49,
-      40,   141,   135,   143,   141,    45,    49,   147,    49,   147,
-      49,    51,    49,    53,    49,    51,    36,   129,    52,   159,
-     130,    33,   162,   163,   164,    51,     6,   167,   168,   169,
-     170,   171,   144,   145,   146,     7,   148,   149,   178,    10,
-     150,   151,     8,     9,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    52,    31,    52,   207,   208,    35,
+      10,    10,    10,    13,    10,    13,    13,    10,    10,    65,
+      19,    10,    20,    14,     0,    11,     9,    18,    47,   105,
+     106,     8,     9,    33,    34,    81,    49,     6,    33,    43,
+       9,    36,    37,    12,     8,    45,    46,    42,    31,    36,
+      37,    15,    16,    17,    32,    55,    34,    21,    22,     6,
+      52,     8,     9,    52,    42,    64,    66,    66,    66,    55,
+      66,    64,    46,    66,    48,    44,     8,     9,    64,    10,
+      11,    12,    82,    83,    50,    82,   162,   163,   164,    48,
+      47,   167,   168,   169,   170,   171,    36,    37,    51,    31,
+      51,    49,    42,    49,    36,   105,   106,    49,    77,   155,
+      42,   111,   112,    45,     8,     9,    10,    11,    12,    51,
+      11,    53,   122,    51,    49,   125,    35,    36,    37,    38,
+      39,   207,   208,    42,    51,    49,   135,    49,   138,    49,
+       7,   141,   135,   143,   141,    49,    49,   147,    49,   147,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,   159,
+     129,    49,   162,   163,   164,    49,   130,   167,   168,   169,
+     170,   171,    49,    51,    36,   144,   145,   146,   178,   148,
+     149,    52,     8,     9,    33,    51,   150,   151,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,     8,     9,
+       6,    10,     7,    46,    52,    31,    52,   207,   208,    35,
       36,    37,    38,    39,   214,   215,    42,    43,    52,    45,
-      49,    49,     1,    49,   222,    51,    46,    53,    52,    46,
-     230,   229,   231,    52,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,   252,     8,     9,    10,    49,    49,    49,    36,
-      31,    51,   262,   263,    43,    52,    45,    52,    47,     6,
-       7,     8,     9,    10,    11,    12,    31,     8,     9,    10,
-      35,    36,    37,    38,    39,    51,     9,    42,    43,    52,
-      45,    50,    36,    34,    49,    50,    51,    37,    53,    10,
-      31,     8,     9,    52,    35,    36,    37,    38,    39,    52,
-       9,    42,    43,    31,    45,    10,    52,    10,    31,    50,
-      51,    12,    53,    52,    31,     8,     9,    52,    35,    36,
-      37,    38,    39,    52,   152,    42,    43,    12,    45,   245,
-      64,    -1,    -1,    50,    51,    -1,    53,    -1,    31,     8,
+      52,    31,    49,    49,   222,    51,    49,    53,    46,    49,
+     230,   229,   231,    43,    51,    45,    49,    52,    49,    49,
+      50,    51,    36,    53,     5,     6,     7,     8,     9,    10,
+      11,    12,   252,     1,     6,     7,     8,     9,    10,    11,
+      12,    52,   262,   263,    52,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,     8,     9,    10,    51,    31,    52,     9,
+      50,    36,    34,    10,    37,    43,    52,    45,    52,    47,
+       9,    31,    52,    10,    10,    31,    31,     8,     9,    10,
+      35,    36,    37,    38,    39,    52,    52,    42,    43,    52,
+      45,   152,    12,    12,    49,    50,    51,    66,    53,   245,
+      31,     8,     9,    -1,    35,    36,    37,    38,    39,    -1,
+      -1,    42,    43,    -1,    45,    -1,    -1,    -1,    -1,    50,
+      51,    -1,    53,    -1,    31,     8,     9,    -1,    35,    36,
+      37,    38,    39,    -1,    -1,    42,    43,    -1,    45,    -1,
+      -1,    -1,    -1,    50,    51,    -1,    53,    -1,    31,     8,
        9,    -1,    35,    36,    37,    38,    39,    -1,    -1,    42,
       43,    -1,    45,    -1,    -1,    -1,    49,    -1,    51,    -1,
       53,    -1,    31,     8,     9,    -1,    35,    36,    37,    38,
       39,    -1,    -1,    42,    43,    -1,    45,    -1,     8,     9,
       -1,    -1,    51,    -1,    53,    -1,    31,    -1,    -1,    -1,
-      35,    36,    37,    38,    39,    -1,    -1,    42,    -1,    -1,
+      35,    36,    37,    38,    39,     8,     9,    42,    -1,    -1,
       45,    31,     8,     9,    -1,    -1,    51,    -1,    53,    -1,
-      40,    41,    -1,    43,    -1,    45,    -1,     8,     9,    -1,
-      -1,    51,    -1,    53,    -1,    31,     8,     9,    -1,    -1,
-      36,    -1,    -1,     8,     9,    -1,    42,    -1,    -1,    45,
-      31,    -1,    -1,     8,     9,    51,    -1,    53,    -1,    31,
-       8,     9,    43,    -1,    45,    -1,    31,    -1,    -1,    -1,
-      51,    43,    53,    45,    -1,    40,    31,     8,     9,    51,
-      45,    53,    -1,    31,     8,     9,    51,    -1,    53,    -1,
-      45,    -1,    -1,    -1,    -1,    50,    51,    45,    53,    -1,
-      31,    -1,    50,    51,    -1,    53,    -1,    31,    -1,    40,
-      -1,    -1,    -1,    -1,    45,    -1,    -1,    -1,    -1,    -1,
-      51,    45,    53,    -1,    -1,    -1,    -1,    51,    -1,    53,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,     5,
-       6,     7,     8,     9,    10,    11,    12,    35,    36,    37,
-      38,    39,    -1,    -1,    42
+      40,    41,    -1,    43,    -1,    45,    -1,    -1,    31,     8,
+       9,    51,    -1,    53,    -1,    31,     8,     9,    -1,    -1,
+      43,    -1,    45,    -1,    -1,    -1,    -1,    43,    51,    45,
+      53,    -1,    31,     8,     9,    51,    -1,    53,    -1,    31,
+      -1,    40,     8,     9,    -1,    -1,    45,    -1,    40,     8,
+       9,    -1,    51,    45,    53,    -1,    31,    -1,    -1,    51,
+      -1,    53,    -1,    -1,    -1,    31,     8,     9,    -1,    -1,
+      45,    -1,    31,    -1,    -1,    50,    51,    -1,    53,    45,
+      -1,    40,    -1,    -1,    50,    51,    45,    53,    -1,    31,
+      -1,    -1,    51,    -1,    53,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    45,    -1,    -1,    -1,    -1,    -1,    51,
+      -1,    53,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -839,14 +843,14 @@ static const yytype_uint8 yystos[] =
 {
        0,    55,     0,    56,     1,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    43,    45,    47,    57,    59,    47,    49,
-      60,     8,     9,    31,    35,    36,    37,    38,    39,    42,
-      43,    45,    49,    51,    53,    64,    78,    82,    85,    86,
-      87,    88,    91,    50,    63,    78,    80,    83,    61,    80,
-      62,    78,    10,    43,    49,    68,    79,    81,    82,    83,
-      86,    87,    91,    66,    88,    49,    60,    64,    69,    43,
-      49,    51,    65,    81,    83,    91,    67,    85,    70,    80,
-      71,    80,    72,    80,    73,    85,    74,    82,    75,    83,
+      28,    29,    30,    43,    45,    47,    57,    59,    67,    68,
+      47,    49,    60,     8,     9,    31,    35,    36,    37,    38,
+      39,    42,    43,    45,    49,    51,    53,    64,    78,    82,
+      85,    86,    87,    88,    91,    50,    63,    78,    80,    83,
+      61,    80,    62,    78,    10,    43,    49,    69,    79,    81,
+      82,    83,    86,    87,    91,    66,    88,    49,    60,    64,
+      70,    43,    49,    51,    65,    81,    83,    91,    85,    71,
+      80,    72,    80,    73,    80,    85,    74,    82,    75,    83,
       76,    80,    77,    80,    46,    48,    48,    47,    91,    91,
        6,     8,     9,    89,    78,    36,    42,    91,    92,    91,
       51,    51,     9,    40,    41,    51,    88,    91,    49,    49,
@@ -1747,11 +1751,6 @@ yyreduce:
     { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
     break;
 
-  case 19:
-#line 104 "a.y"
-    { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
-    break;
-
   case 20:
 #line 105 "a.y"
     { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
@@ -1777,11 +1776,6 @@ yyreduce:
     { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
     break;
 
-  case 25:
-#line 110 "a.y"
-    { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
-    break;
-
   case 26:
 #line 111 "a.y"
     { outcode((yyvsp[(1) - (2)].lval), &(yyvsp[(2) - (2)].addr2)); }
@@ -1902,40 +1896,73 @@ yyreduce:
   case 42:
 #line 192 "a.y"
     {
-               settext((yyvsp[(1) - (4)].addr).sym);
-               (yyval.addr2).from = (yyvsp[(1) - (4)].addr);
-               (yyval.addr2).to = (yyvsp[(4) - (4)].addr);
+               Addr2 a;
+               settext((yyvsp[(2) - (5)].addr).sym);
+               a.from = (yyvsp[(2) - (5)].addr);
+               a.to = (yyvsp[(5) - (5)].addr);
+               outcode(ATEXT, &a);
        }
     break;
 
   case 43:
-#line 198 "a.y"
-    {
-               settext((yyvsp[(1) - (6)].addr).sym);
-               (yyval.addr2).from = (yyvsp[(1) - (6)].addr);
-               (yyval.addr2).from.scale = (yyvsp[(3) - (6)].lval);
-               (yyval.addr2).to = (yyvsp[(6) - (6)].addr);
+#line 200 "a.y"
+    {
+               Addr2 a;
+               settext((yyvsp[(2) - (7)].addr).sym);
+               a.from = (yyvsp[(2) - (7)].addr);
+               a.to = (yyvsp[(7) - (7)].addr);
+               outcode(ATEXT, &a);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = (yyvsp[(4) - (7)].lval);
+               }
        }
     break;
 
   case 44:
-#line 207 "a.y"
+#line 214 "a.y"
+    {
+               Addr2 a;
+               settext((yyvsp[(2) - (4)].addr).sym);
+               a.from = (yyvsp[(2) - (4)].addr);
+               a.to = (yyvsp[(4) - (4)].addr);
+               outcode(AGLOBL, &a);
+       }
+    break;
+
+  case 45:
+#line 222 "a.y"
+    {
+               Addr2 a;
+               settext((yyvsp[(2) - (6)].addr).sym);
+               a.from = (yyvsp[(2) - (6)].addr);
+               a.to = (yyvsp[(6) - (6)].addr);
+               outcode(AGLOBL, &a);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = (yyvsp[(4) - (6)].lval);
+               }
+       }
+    break;
+
+  case 46:
+#line 236 "a.y"
     {
                (yyval.addr2).from = nullgen;
                (yyval.addr2).to = (yyvsp[(2) - (2)].addr);
        }
     break;
 
-  case 45:
-#line 212 "a.y"
+  case 47:
+#line 241 "a.y"
     {
                (yyval.addr2).from = nullgen;
                (yyval.addr2).to = (yyvsp[(1) - (1)].addr);
        }
     break;
 
-  case 46:
-#line 217 "a.y"
+  case 48:
+#line 246 "a.y"
     {
                (yyval.addr2).from = nullgen;
                (yyval.addr2).to = (yyvsp[(2) - (2)].addr);
@@ -1943,16 +1970,16 @@ yyreduce:
        }
     break;
 
-  case 49:
-#line 229 "a.y"
+  case 51:
+#line 258 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (3)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (3)].addr);
        }
     break;
 
-  case 50:
-#line 234 "a.y"
+  case 52:
+#line 263 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (5)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (5)].addr);
@@ -1962,16 +1989,16 @@ yyreduce:
        }
     break;
 
-  case 51:
-#line 244 "a.y"
+  case 53:
+#line 273 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (3)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (3)].addr);
        }
     break;
 
-  case 52:
-#line 249 "a.y"
+  case 54:
+#line 278 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (5)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (5)].addr);
@@ -1981,49 +2008,32 @@ yyreduce:
        }
     break;
 
-  case 53:
-#line 259 "a.y"
+  case 55:
+#line 288 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (2)].addr);
                (yyval.addr2).to = nullgen;
        }
     break;
 
-  case 54:
-#line 264 "a.y"
+  case 56:
+#line 293 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (1)].addr);
                (yyval.addr2).to = nullgen;
        }
     break;
 
-  case 55:
-#line 269 "a.y"
-    {
-               (yyval.addr2).from = (yyvsp[(1) - (3)].addr);
-               (yyval.addr2).to = (yyvsp[(3) - (3)].addr);
-       }
-    break;
-
-  case 56:
-#line 276 "a.y"
+  case 57:
+#line 298 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (3)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (3)].addr);
        }
     break;
 
-  case 57:
-#line 281 "a.y"
-    {
-               (yyval.addr2).from = (yyvsp[(1) - (5)].addr);
-               (yyval.addr2).from.scale = (yyvsp[(3) - (5)].lval);
-               (yyval.addr2).to = (yyvsp[(5) - (5)].addr);
-       }
-    break;
-
   case 58:
-#line 289 "a.y"
+#line 305 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(1) - (5)].addr);
                (yyval.addr2).to = (yyvsp[(3) - (5)].addr);
@@ -2032,7 +2042,7 @@ yyreduce:
     break;
 
   case 59:
-#line 297 "a.y"
+#line 313 "a.y"
     {
                (yyval.addr2).from = (yyvsp[(3) - (5)].addr);
                (yyval.addr2).to = (yyvsp[(5) - (5)].addr);
@@ -2043,7 +2053,7 @@ yyreduce:
     break;
 
   case 60:
-#line 307 "a.y"
+#line 323 "a.y"
     {
                if((yyvsp[(1) - (3)].addr).type != TYPE_CONST || (yyvsp[(3) - (3)].addr).type != TYPE_CONST)
                        yyerror("arguments to PCDATA must be integer constants");
@@ -2053,7 +2063,7 @@ yyreduce:
     break;
 
   case 61:
-#line 316 "a.y"
+#line 332 "a.y"
     {
                if((yyvsp[(1) - (3)].addr).type != TYPE_CONST)
                        yyerror("index for FUNCDATA must be integer constant");
@@ -2065,21 +2075,21 @@ yyreduce:
     break;
 
   case 66:
-#line 333 "a.y"
+#line 349 "a.y"
     {
                (yyval.addr) = (yyvsp[(2) - (2)].addr);
        }
     break;
 
   case 67:
-#line 337 "a.y"
+#line 353 "a.y"
     {
                (yyval.addr) = (yyvsp[(2) - (2)].addr);
        }
     break;
 
   case 73:
-#line 350 "a.y"
+#line 366 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_BRANCH;
@@ -2088,7 +2098,7 @@ yyreduce:
     break;
 
   case 74:
-#line 356 "a.y"
+#line 372 "a.y"
     {
                (yyvsp[(1) - (2)].sym) = labellookup((yyvsp[(1) - (2)].sym));
                (yyval.addr) = nullgen;
@@ -2100,7 +2110,7 @@ yyreduce:
     break;
 
   case 75:
-#line 367 "a.y"
+#line 383 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2109,7 +2119,7 @@ yyreduce:
     break;
 
   case 76:
-#line 373 "a.y"
+#line 389 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2118,7 +2128,7 @@ yyreduce:
     break;
 
   case 77:
-#line 379 "a.y"
+#line 395 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2127,7 +2137,7 @@ yyreduce:
     break;
 
   case 78:
-#line 385 "a.y"
+#line 401 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2136,7 +2146,7 @@ yyreduce:
     break;
 
   case 79:
-#line 391 "a.y"
+#line 407 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2145,7 +2155,7 @@ yyreduce:
     break;
 
   case 80:
-#line 397 "a.y"
+#line 413 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2154,7 +2164,7 @@ yyreduce:
     break;
 
   case 81:
-#line 405 "a.y"
+#line 421 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_CONST;
@@ -2163,7 +2173,7 @@ yyreduce:
     break;
 
   case 82:
-#line 411 "a.y"
+#line 427 "a.y"
     {
                (yyval.addr) = (yyvsp[(2) - (2)].addr);
                (yyval.addr).type = TYPE_ADDR;
@@ -2176,7 +2186,7 @@ yyreduce:
     break;
 
   case 83:
-#line 421 "a.y"
+#line 437 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_SCONST;
@@ -2185,7 +2195,7 @@ yyreduce:
     break;
 
   case 84:
-#line 427 "a.y"
+#line 443 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2194,7 +2204,7 @@ yyreduce:
     break;
 
   case 85:
-#line 433 "a.y"
+#line 449 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2203,7 +2213,7 @@ yyreduce:
     break;
 
   case 86:
-#line 439 "a.y"
+#line 455 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2212,7 +2222,7 @@ yyreduce:
     break;
 
   case 87:
-#line 445 "a.y"
+#line 461 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -2221,7 +2231,7 @@ yyreduce:
     break;
 
   case 88:
-#line 453 "a.y"
+#line 469 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = (yyvsp[(1) - (1)].lval);
@@ -2230,7 +2240,7 @@ yyreduce:
     break;
 
   case 89:
-#line 459 "a.y"
+#line 475 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = -(yyvsp[(2) - (2)].lval);
@@ -2239,7 +2249,7 @@ yyreduce:
     break;
 
   case 90:
-#line 465 "a.y"
+#line 481 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = (yyvsp[(1) - (3)].lval);
@@ -2248,7 +2258,7 @@ yyreduce:
     break;
 
   case 91:
-#line 471 "a.y"
+#line 487 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = -(yyvsp[(2) - (4)].lval);
@@ -2257,7 +2267,7 @@ yyreduce:
     break;
 
   case 94:
-#line 483 "a.y"
+#line 499 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2267,7 +2277,7 @@ yyreduce:
     break;
 
   case 95:
-#line 490 "a.y"
+#line 506 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2277,7 +2287,7 @@ yyreduce:
     break;
 
   case 96:
-#line 497 "a.y"
+#line 513 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2287,7 +2297,7 @@ yyreduce:
     break;
 
   case 97:
-#line 504 "a.y"
+#line 520 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2300,7 +2310,7 @@ yyreduce:
     break;
 
   case 98:
-#line 514 "a.y"
+#line 530 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2313,7 +2323,7 @@ yyreduce:
     break;
 
   case 99:
-#line 524 "a.y"
+#line 540 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2326,7 +2336,7 @@ yyreduce:
     break;
 
   case 100:
-#line 534 "a.y"
+#line 550 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2335,7 +2345,7 @@ yyreduce:
     break;
 
   case 101:
-#line 540 "a.y"
+#line 556 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2344,7 +2354,7 @@ yyreduce:
     break;
 
   case 102:
-#line 546 "a.y"
+#line 562 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2354,7 +2364,7 @@ yyreduce:
     break;
 
   case 103:
-#line 553 "a.y"
+#line 569 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2366,7 +2376,7 @@ yyreduce:
     break;
 
   case 104:
-#line 562 "a.y"
+#line 578 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2378,14 +2388,14 @@ yyreduce:
     break;
 
   case 105:
-#line 573 "a.y"
+#line 589 "a.y"
     {
                (yyval.addr) = (yyvsp[(1) - (1)].addr);
        }
     break;
 
   case 106:
-#line 577 "a.y"
+#line 593 "a.y"
     {
                (yyval.addr) = (yyvsp[(1) - (6)].addr);
                (yyval.addr).index = (yyvsp[(3) - (6)].lval);
@@ -2395,7 +2405,7 @@ yyreduce:
     break;
 
   case 107:
-#line 586 "a.y"
+#line 602 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2406,7 +2416,7 @@ yyreduce:
     break;
 
   case 108:
-#line 594 "a.y"
+#line 610 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -2417,133 +2427,133 @@ yyreduce:
     break;
 
   case 109:
-#line 603 "a.y"
+#line 619 "a.y"
     {
                (yyval.lval) = 0;
        }
     break;
 
   case 110:
-#line 607 "a.y"
+#line 623 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 111:
-#line 611 "a.y"
+#line 627 "a.y"
     {
                (yyval.lval) = -(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 113:
-#line 618 "a.y"
+#line 634 "a.y"
     {
                (yyval.lval) = NAME_AUTO;
        }
     break;
 
   case 116:
-#line 626 "a.y"
+#line 642 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (1)].sym)->value;
        }
     break;
 
   case 117:
-#line 630 "a.y"
+#line 646 "a.y"
     {
                (yyval.lval) = -(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 118:
-#line 634 "a.y"
+#line 650 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 119:
-#line 638 "a.y"
+#line 654 "a.y"
     {
                (yyval.lval) = ~(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 120:
-#line 642 "a.y"
+#line 658 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (3)].lval);
        }
     break;
 
   case 122:
-#line 649 "a.y"
+#line 665 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) + (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 123:
-#line 653 "a.y"
+#line 669 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) - (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 124:
-#line 657 "a.y"
+#line 673 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) * (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 125:
-#line 661 "a.y"
+#line 677 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) / (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 126:
-#line 665 "a.y"
+#line 681 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) % (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 127:
-#line 669 "a.y"
+#line 685 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (4)].lval) << (yyvsp[(4) - (4)].lval);
        }
     break;
 
   case 128:
-#line 673 "a.y"
+#line 689 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (4)].lval) >> (yyvsp[(4) - (4)].lval);
        }
     break;
 
   case 129:
-#line 677 "a.y"
+#line 693 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) & (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 130:
-#line 681 "a.y"
+#line 697 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) ^ (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 131:
-#line 685 "a.y"
+#line 701 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) | (yyvsp[(3) - (3)].lval);
        }
@@ -2551,7 +2561,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 2555 "y.tab.c"
+#line 2565 "y.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
index 9fe2c498faea40a487eb89d0f23a9e1e111759f4..d9cc2e562f1fefc3ec0fb4940750a13f5b2452d7 100644 (file)
@@ -9,8 +9,6 @@
 #include "../gc/go.h"
 #include "../8l/8.out.h"
 
-#define TEXTFLAG from.scale
-
 // foptoas flags
 enum
 {
index b55d9d16c64e09a00b8364cd8bbd5359ea4cc23c..6f3a2c69068aa87aca6d1a4b36bacfb3a80959a1 100644 (file)
@@ -200,9 +200,9 @@ ggloblnod(Node *nam)
        p->to.type = TYPE_CONST;
        p->to.offset = nam->type->width;
        if(nam->readonly)
-               p->from.scale = RODATA;
+               p->from3.offset = RODATA;
        if(nam->type != T && !haspointers(nam->type))
-               p->from.scale |= NOPTR;
+               p->from3.offset |= NOPTR;
 }
 
 void
@@ -218,7 +218,7 @@ ggloblsym(Sym *s, int32 width, int8 flags)
        p->to.type = TYPE_CONST;
        p->to.index = REG_NONE;
        p->to.offset = width;
-       p->from.scale = flags;
+       p->from3.offset = flags;
 }
 
 void
index 7a01fc9479edcc9e22aa348d74563d533720e435..a2280b1e986b3a823955e551c65b75eb755ce4ea 100644 (file)
@@ -126,6 +126,7 @@ EXTERN      int32   thunk;
 EXTERN Biobuf  obuf;
 EXTERN Link*   ctxt;
 EXTERN Biobuf  bstdout;
+EXTERN Prog*   lastpc;
 
 void*  alloc(int32);
 void*  allocn(void*, int32, int32);
index 5d817922a399f63153cfc70430048def71e9429c..8e0b3956acb711c004048030ab9a63c919b65838 100644 (file)
@@ -621,7 +621,11 @@ inst:
 |      LTEXT name ',' con ',' '$' textsize
        {
                settext($2.sym);
-               outcode($1, &$2, $4, &$7);
+               outcode($1, &$2, 0, &$7);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = $4;
+               }
        }
 /*
  * GLOBL
@@ -634,7 +638,11 @@ inst:
 |      LGLOBL name ',' con ',' imm
        {
                settext($2.sym);
-               outcode($1, &$2, $4, &$6);
+               outcode($1, &$2, 0, &$6);
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = $4;
+               }
        }
 
 /*
index a8bf520219dbd70a29a4195538a7e310376b88ab..9b343f0d691c9fde462f351d0a2ab265674b29a2 100644 (file)
@@ -650,8 +650,6 @@ cclean(void)
        outcode(AEND, &nullgen, 0, &nullgen);
 }
 
-static Prog *lastpc;
-
 void
 outcode(int a, Addr *g1, int reg, Addr *g2)
 {
index 4207cdadbde2439d7adc238f1e81646f7f062fe4..ea8fdfd92968f9a22773aa157bfce766d5520cd0 100644 (file)
@@ -648,14 +648,14 @@ static const yytype_uint16 yyrline[] =
      428,   432,   436,   443,   447,   451,   455,   459,   463,   470,
      474,   478,   482,   489,   493,   497,   501,   508,   512,   520,
      524,   528,   532,   536,   540,   544,   551,   555,   559,   563,
-     567,   571,   578,   582,   589,   598,   609,   616,   621,   629,
-     634,   643,   647,   651,   658,   664,   670,   681,   689,   690,
-     693,   701,   709,   717,   725,   731,   739,   742,   750,   756,
-     764,   770,   778,   786,   807,   813,   819,   825,   833,   838,
-     846,   852,   859,   867,   868,   876,   883,   893,   894,   903,
-     911,   919,   928,   929,   932,   935,   939,   945,   946,   947,
-     950,   951,   955,   959,   963,   967,   973,   974,   978,   982,
-     986,   990,   994,   998,  1002,  1006,  1010
+     567,   571,   578,   582,   589,   598,   609,   616,   621,   633,
+     638,   651,   655,   659,   666,   672,   678,   689,   697,   698,
+     701,   709,   717,   725,   733,   739,   747,   750,   758,   764,
+     772,   778,   786,   794,   815,   821,   827,   833,   841,   846,
+     854,   860,   867,   875,   876,   884,   891,   901,   902,   911,
+     919,   927,   936,   937,   940,   943,   947,   953,   954,   955,
+     958,   959,   963,   967,   971,   975,   981,   982,   986,   990,
+     994,   998,  1002,  1006,  1010,  1014,  1018
 };
 #endif
 
@@ -2737,12 +2737,16 @@ yyreduce:
 #line 622 "a.y"
     {
                settext((yyvsp[(2) - (7)].addr).sym);
-               outcode((yyvsp[(1) - (7)].lval), &(yyvsp[(2) - (7)].addr), (yyvsp[(4) - (7)].lval), &(yyvsp[(7) - (7)].addr));
+               outcode((yyvsp[(1) - (7)].lval), &(yyvsp[(2) - (7)].addr), 0, &(yyvsp[(7) - (7)].addr));
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = (yyvsp[(4) - (7)].lval);
+               }
        }
     break;
 
   case 119:
-#line 630 "a.y"
+#line 634 "a.y"
     {
                settext((yyvsp[(2) - (4)].addr).sym);
                outcode((yyvsp[(1) - (4)].lval), &(yyvsp[(2) - (4)].addr), 0, &(yyvsp[(4) - (4)].addr));
@@ -2750,43 +2754,47 @@ yyreduce:
     break;
 
   case 120:
-#line 635 "a.y"
+#line 639 "a.y"
     {
                settext((yyvsp[(2) - (6)].addr).sym);
-               outcode((yyvsp[(1) - (6)].lval), &(yyvsp[(2) - (6)].addr), (yyvsp[(4) - (6)].lval), &(yyvsp[(6) - (6)].addr));
+               outcode((yyvsp[(1) - (6)].lval), &(yyvsp[(2) - (6)].addr), 0, &(yyvsp[(6) - (6)].addr));
+               if(pass > 1) {
+                       lastpc->from3.type = TYPE_CONST;
+                       lastpc->from3.offset = (yyvsp[(4) - (6)].lval);
+               }
        }
     break;
 
   case 121:
-#line 644 "a.y"
+#line 652 "a.y"
     {
                outcode((yyvsp[(1) - (6)].lval), &(yyvsp[(2) - (6)].addr), (yyvsp[(4) - (6)].lval), &(yyvsp[(6) - (6)].addr));
        }
     break;
 
   case 122:
-#line 648 "a.y"
+#line 656 "a.y"
     {
                outcode((yyvsp[(1) - (6)].lval), &(yyvsp[(2) - (6)].addr), (yyvsp[(4) - (6)].lval), &(yyvsp[(6) - (6)].addr));
        }
     break;
 
   case 123:
-#line 652 "a.y"
+#line 660 "a.y"
     {
                outcode((yyvsp[(1) - (6)].lval), &(yyvsp[(2) - (6)].addr), (yyvsp[(4) - (6)].lval), &(yyvsp[(6) - (6)].addr));
        }
     break;
 
   case 124:
-#line 659 "a.y"
+#line 667 "a.y"
     {
                outcode((yyvsp[(1) - (2)].lval), &nullgen, 0, &nullgen);
        }
     break;
 
   case 125:
-#line 665 "a.y"
+#line 673 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_BRANCH;
@@ -2795,7 +2803,7 @@ yyreduce:
     break;
 
   case 126:
-#line 671 "a.y"
+#line 679 "a.y"
     {
                (yyvsp[(1) - (2)].sym) = labellookup((yyvsp[(1) - (2)].sym));
                (yyval.addr) = nullgen;
@@ -2807,7 +2815,7 @@ yyreduce:
     break;
 
   case 127:
-#line 682 "a.y"
+#line 690 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2816,7 +2824,7 @@ yyreduce:
     break;
 
   case 130:
-#line 694 "a.y"
+#line 702 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2825,7 +2833,7 @@ yyreduce:
     break;
 
   case 131:
-#line 702 "a.y"
+#line 710 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2834,7 +2842,7 @@ yyreduce:
     break;
 
   case 132:
-#line 710 "a.y"
+#line 718 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2843,7 +2851,7 @@ yyreduce:
     break;
 
   case 133:
-#line 718 "a.y"
+#line 726 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2852,7 +2860,7 @@ yyreduce:
     break;
 
   case 134:
-#line 726 "a.y"
+#line 734 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2861,7 +2869,7 @@ yyreduce:
     break;
 
   case 135:
-#line 732 "a.y"
+#line 740 "a.y"
     {
                if((yyvsp[(3) - (4)].lval) < 0 || (yyvsp[(3) - (4)].lval) >= 1024)
                        yyerror("SPR/DCR out of range");
@@ -2872,7 +2880,7 @@ yyreduce:
     break;
 
   case 137:
-#line 743 "a.y"
+#line 751 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2881,7 +2889,7 @@ yyreduce:
     break;
 
   case 138:
-#line 751 "a.y"
+#line 759 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2890,7 +2898,7 @@ yyreduce:
     break;
 
   case 139:
-#line 757 "a.y"
+#line 765 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2899,7 +2907,7 @@ yyreduce:
     break;
 
   case 140:
-#line 765 "a.y"
+#line 773 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2908,7 +2916,7 @@ yyreduce:
     break;
 
   case 141:
-#line 771 "a.y"
+#line 779 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2917,7 +2925,7 @@ yyreduce:
     break;
 
   case 142:
-#line 779 "a.y"
+#line 787 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_REG;
@@ -2926,7 +2934,7 @@ yyreduce:
     break;
 
   case 143:
-#line 787 "a.y"
+#line 795 "a.y"
     {
                int mb, me;
                uint32 v;
@@ -2948,7 +2956,7 @@ yyreduce:
     break;
 
   case 144:
-#line 808 "a.y"
+#line 816 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = (yyvsp[(1) - (1)].lval);
@@ -2957,7 +2965,7 @@ yyreduce:
     break;
 
   case 145:
-#line 814 "a.y"
+#line 822 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = -(yyvsp[(2) - (2)].lval);
@@ -2966,7 +2974,7 @@ yyreduce:
     break;
 
   case 146:
-#line 820 "a.y"
+#line 828 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = (yyvsp[(1) - (3)].lval);
@@ -2975,7 +2983,7 @@ yyreduce:
     break;
 
   case 147:
-#line 826 "a.y"
+#line 834 "a.y"
     {
                (yyval.addr).type = TYPE_TEXTSIZE;
                (yyval.addr).offset = -(yyvsp[(2) - (4)].lval);
@@ -2984,7 +2992,7 @@ yyreduce:
     break;
 
   case 148:
-#line 834 "a.y"
+#line 842 "a.y"
     {
                (yyval.addr) = (yyvsp[(2) - (2)].addr);
                (yyval.addr).type = TYPE_CONST;
@@ -2992,7 +3000,7 @@ yyreduce:
     break;
 
   case 149:
-#line 839 "a.y"
+#line 847 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_SCONST;
@@ -3001,7 +3009,7 @@ yyreduce:
     break;
 
   case 150:
-#line 847 "a.y"
+#line 855 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -3010,7 +3018,7 @@ yyreduce:
     break;
 
   case 151:
-#line 853 "a.y"
+#line 861 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_FCONST;
@@ -3019,7 +3027,7 @@ yyreduce:
     break;
 
   case 152:
-#line 860 "a.y"
+#line 868 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_CONST;
@@ -3028,7 +3036,7 @@ yyreduce:
     break;
 
   case 154:
-#line 869 "a.y"
+#line 877 "a.y"
     {
                if((yyval.lval) < 0 || (yyval.lval) >= NREG)
                        print("register value out of range\n");
@@ -3037,7 +3045,7 @@ yyreduce:
     break;
 
   case 155:
-#line 877 "a.y"
+#line 885 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -3047,7 +3055,7 @@ yyreduce:
     break;
 
   case 156:
-#line 884 "a.y"
+#line 892 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -3058,7 +3066,7 @@ yyreduce:
     break;
 
   case 158:
-#line 895 "a.y"
+#line 903 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -3068,7 +3076,7 @@ yyreduce:
     break;
 
   case 159:
-#line 904 "a.y"
+#line 912 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -3079,7 +3087,7 @@ yyreduce:
     break;
 
   case 160:
-#line 912 "a.y"
+#line 920 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -3090,7 +3098,7 @@ yyreduce:
     break;
 
   case 161:
-#line 920 "a.y"
+#line 928 "a.y"
     {
                (yyval.addr) = nullgen;
                (yyval.addr).type = TYPE_MEM;
@@ -3101,126 +3109,126 @@ yyreduce:
     break;
 
   case 164:
-#line 932 "a.y"
+#line 940 "a.y"
     {
                (yyval.lval) = 0;
        }
     break;
 
   case 165:
-#line 936 "a.y"
+#line 944 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 166:
-#line 940 "a.y"
+#line 948 "a.y"
     {
                (yyval.lval) = -(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 171:
-#line 952 "a.y"
+#line 960 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (1)].sym)->value;
        }
     break;
 
   case 172:
-#line 956 "a.y"
+#line 964 "a.y"
     {
                (yyval.lval) = -(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 173:
-#line 960 "a.y"
+#line 968 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 174:
-#line 964 "a.y"
+#line 972 "a.y"
     {
                (yyval.lval) = ~(yyvsp[(2) - (2)].lval);
        }
     break;
 
   case 175:
-#line 968 "a.y"
+#line 976 "a.y"
     {
                (yyval.lval) = (yyvsp[(2) - (3)].lval);
        }
     break;
 
   case 177:
-#line 975 "a.y"
+#line 983 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) + (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 178:
-#line 979 "a.y"
+#line 987 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) - (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 179:
-#line 983 "a.y"
+#line 991 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) * (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 180:
-#line 987 "a.y"
+#line 995 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) / (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 181:
-#line 991 "a.y"
+#line 999 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) % (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 182:
-#line 995 "a.y"
+#line 1003 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (4)].lval) << (yyvsp[(4) - (4)].lval);
        }
     break;
 
   case 183:
-#line 999 "a.y"
+#line 1007 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (4)].lval) >> (yyvsp[(4) - (4)].lval);
        }
     break;
 
   case 184:
-#line 1003 "a.y"
+#line 1011 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) & (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 185:
-#line 1007 "a.y"
+#line 1015 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) ^ (yyvsp[(3) - (3)].lval);
        }
     break;
 
   case 186:
-#line 1011 "a.y"
+#line 1019 "a.y"
     {
                (yyval.lval) = (yyvsp[(1) - (3)].lval) | (yyvsp[(3) - (3)].lval);
        }
@@ -3228,7 +3236,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 3232 "y.tab.c"
+#line 3240 "y.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
index ea9d52db8ebd7117d5ebc074cae8cdc6d8ec0e90..983a22a27049b1dd9127a4b5715db1998f27ec0d 100644 (file)
@@ -12,8 +12,6 @@
 // TODO(minux): Remove when no longer used.
 #define noimpl sysfatal("%s not implemented (%s:%d).", __func__, __FILE__, __LINE__)
 
-#define TEXTFLAG reg
-
 EXTERN int32   dynloc;
 EXTERN uchar   reg[NREG+NFREG];
 EXTERN int32   pcloc;          // instruction counter
index bafc26c03e746d676088fefcaac3541342067ca7..5e8e21a9c76eb290aa228bd05fe7cafbde4de9af 100644 (file)
@@ -200,9 +200,9 @@ ggloblnod(Node *nam)
        p->to.type = TYPE_CONST;
        p->to.offset = nam->type->width;
        if(nam->readonly)
-               p->reg = RODATA;
+               p->from3.offset = RODATA;
        if(nam->type != T && !haspointers(nam->type))
-               p->reg |= NOPTR;
+               p->from3.offset |= NOPTR;
 }
 
 void
@@ -228,7 +228,7 @@ ggloblsym(Sym *s, int32 width, int8 flags)
        p->to.type = TYPE_CONST;
        p->to.name = NAME_NONE;
        p->to.offset = width;
-       p->reg = flags;
+       p->from3.offset = flags;
 }
 
 int
index 99644d201fa76f00480e2d2b55c2315cf349692b..183bd71426d0b7bb114cc772387b9daf53a711e0 100644 (file)
@@ -231,20 +231,20 @@ compile(Node *fn)
        nodconst(&nod1, types[TINT32], 0);
        ptxt = arch.gins(arch.ATEXT, isblank(curfn->nname) ? N : curfn->nname, &nod1);
        if(fn->dupok)
-               arch.thelinkarch->settextflag(ptxt, arch.thelinkarch->textflag(ptxt) | DUPOK);
+               ptxt->from3.offset |= DUPOK;
        if(fn->wrapper)
-               arch.thelinkarch->settextflag(ptxt, arch.thelinkarch->textflag(ptxt) | WRAPPER);
+               ptxt->from3.offset |= WRAPPER;
        if(fn->needctxt)
-               arch.thelinkarch->settextflag(ptxt, arch.thelinkarch->textflag(ptxt) | NEEDCTXT);
+               ptxt->from3.offset |= NEEDCTXT;
        if(fn->nosplit)
-               arch.thelinkarch->settextflag(ptxt, arch.thelinkarch->textflag(ptxt) | NOSPLIT);
+               ptxt->from3.offset |= NOSPLIT;
 
        // Clumsy but important.
        // See test/recover.go for test cases and src/reflect/value.go
        // for the actual functions being considered.
        if(myimportpath != nil && strcmp(myimportpath, "reflect") == 0) {
                if(strcmp(curfn->nname->sym->name, "callReflect") == 0 || strcmp(curfn->nname->sym->name, "callMethod") == 0)
-                       arch.thelinkarch->settextflag(ptxt, arch.thelinkarch->textflag(ptxt) | WRAPPER);
+                       ptxt->from3.offset |= WRAPPER;
        }       
        
        arch.afunclit(&ptxt->from, curfn->nname);
index 38a739972525e414769fa19ea04dddccdc514da8..8723553fa4e1eee4402e48f164f8f8d39a2672fd 100644 (file)
@@ -72,7 +72,6 @@ static Optab  optab[] =
        /* struct Optab:
          OPCODE,       from, prog->reg, to,             type,size,param,flag */
        { ATEXT,        C_ADDR, C_NONE, C_TEXTSIZE,      0, 0, 0 },
-       { ATEXT,        C_ADDR, C_REG,  C_TEXTSIZE,      0, 0, 0 },
 
        { AADD,         C_REG,  C_REG,  C_REG,           1, 4, 0 },
        { AADD,         C_REG,  C_NONE, C_REG,           1, 4, 0 },
index 9101c56c5118d8898dd255dd6e74b0874be028c9..bc3174d08f6f7747faaf59c717ac1df6db310155 100644 (file)
@@ -60,13 +60,9 @@ struct       Optab
 
 static Optab   optab[] = {
        { ATEXT,        C_LEXT, C_NONE, C_NONE,         C_TEXTSIZE,      0, 0, 0 },
-       { ATEXT,        C_LEXT, C_REG, C_NONE,  C_TEXTSIZE,      0, 0, 0 },
        { ATEXT,        C_LEXT, C_NONE, C_LCON,         C_TEXTSIZE,      0, 0, 0 },
-       { ATEXT,        C_LEXT, C_REG, C_LCON,  C_TEXTSIZE,      0, 0, 0 },
        { ATEXT,        C_ADDR, C_NONE, C_NONE,         C_TEXTSIZE,      0, 0, 0 },
-       { ATEXT,        C_ADDR, C_REG, C_NONE,  C_TEXTSIZE,      0, 0, 0 },
        { ATEXT,        C_ADDR, C_NONE, C_LCON,         C_TEXTSIZE,      0, 0, 0 },
-       { ATEXT,        C_ADDR, C_REG, C_LCON,  C_TEXTSIZE,      0, 0, 0 },
 
        /* move register */
        { AMOVD,        C_REG,  C_NONE, C_NONE,         C_REG,           1, 4, 0 },
index d04c8c27a8112aed411f1d5748f0fe1e11fe4677..a687400b08e9473e099c5df5415117593cbf25f8 100644 (file)
@@ -112,7 +112,7 @@ Pconv(Fmt *fp)
                sprint(str, "%.5lld (%L)        %A      %D/%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to);
        else
        if(p->as == ATEXT)
-               sprint(str, "%.5lld (%L)        %A      %D,%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to);
+               sprint(str, "%.5lld (%L)        %A      %D,%lld,%D", p->pc, p->lineno, a, &p->from, p->from3.offset, &p->to);
        else
        if(p->reg == 0)
                sprint(str, "%.5lld (%L)        %A%s    %D,%D", p->pc, p->lineno, a, sc, &p->from, &p->to);
index 2cb1777ba4ad821b0726bfcc6a1064c3067f6b9c..c3f13e921fbc4848c79c6a428a98d08d759f9735 100644 (file)
@@ -90,9 +90,9 @@ Pconv(Fmt *fp)
                break;
 
        case ATEXT:
-               if(p->from.scale) {
-                       sprint(str, "%.5lld (%L)        %A      %D,%d,%D",
-                               p->pc, p->lineno, p->as, &p->from, p->from.scale, &p->to);
+               if(p->from3.offset) {
+                       sprint(str, "%.5lld (%L)        %A      %D,%lld,%D",
+                               p->pc, p->lineno, p->as, &p->from, p->from3.offset, &p->to);
                        break;
                }
                sprint(str, "%.5lld (%L)        %A      %D,%D",
index 33c0791a1928a77343ac7607307178b6a2ef4a38..c8a4ca7e8cc1229cf7522921e871b454aab7b816 100644 (file)
@@ -77,9 +77,9 @@ Pconv(Fmt *fp)
                break;
 
        case ATEXT:
-               if(p->from.scale) {
-                       sprint(str, "%.5lld (%L)        %A      %D,%d,%D",
-                               p->pc, p->lineno, p->as, &p->from, p->from.scale, &p->to);
+               if(p->from3.offset) {
+                       sprint(str, "%.5lld (%L)        %A      %D,%lld,%D",
+                               p->pc, p->lineno, p->as, &p->from, p->from3.offset, &p->to);
                        break;
                }
                sprint(str, "%.5lld (%L)        %A      %D,%D",
index 149d713fe89877e9458715ca812e976f612bdc61..58eccb265db9480e89ca2d92c25c1ed8a104dfd6 100644 (file)
@@ -95,14 +95,9 @@ Pconv(Fmt *fp)
        str[0] = 0;
        if(a == ADATA || a == AINIT || a == ADYNT)
                sprint(str, "%.5lld (%L)        %A      %D/%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to);
-       else if(a == ATEXT) {
-               if(p->reg != 0)
-                       sprint(str, "%.5lld (%L)        %A      %D,%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to);
-               else
-                       sprint(str, "%.5lld (%L)        %A      %D,%D", p->pc, p->lineno, a, &p->from, &p->to);
-       } else if(a == AGLOBL) {
-               if(p->reg != 0)
-                       sprint(str, "%.5lld (%L)        %A      %D,%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to);
+       else if(a == ATEXT || a == AGLOBL) {
+               if(p->from3.offset != 0)
+                       sprint(str, "%.5lld (%L)        %A      %D,%lld,%D", p->pc, p->lineno, a, &p->from, p->from3.offset, &p->to);
                else
                        sprint(str, "%.5lld (%L)        %A      %D,%D", p->pc, p->lineno, a, &p->from, &p->to);
        } else {
index 0f2e9fa4f24894e5be82b59f1c67ca8ffc55340d..8d20173912de164359f676624b7943ddebf6d070 100644 (file)
@@ -58,18 +58,6 @@ datasize(Prog *p)
        return p->reg;
 }
 
-static int
-textflag(Prog *p)
-{
-       return p->reg;
-}
-
-static void
-settextflag(Prog *p, int f)
-{
-       p->reg = f;
-}
-
 static void
 progedit(Link *ctxt, Prog *p)
 {
@@ -268,7 +256,7 @@ preprocess(Link *ctxt, LSym *cursym)
        cursym->args = p->to.u.argsize;
 
        if(ctxt->debugzerostack) {
-               if(autoffset && !(p->reg&NOSPLIT)) {
+               if(autoffset && !(p->from3.offset&NOSPLIT)) {
                        // MOVW $4(R13), R1
                        p = appendp(ctxt, p);
                        p->as = AMOVW;
@@ -421,8 +409,8 @@ preprocess(Link *ctxt, LSym *cursym)
                                        break;
                        }
 
-                       if(!(p->reg & NOSPLIT))
-                               p = stacksplit(ctxt, p, autosize, !(cursym->text->reg&NEEDCTXT)); // emit split check
+                       if(!(p->from3.offset & NOSPLIT))
+                               p = stacksplit(ctxt, p, autosize, !(cursym->text->from3.offset&NEEDCTXT)); // emit split check
                        
                        // MOVW.W               R14,$-autosize(SP)
                        p = appendp(ctxt, p);
@@ -435,7 +423,7 @@ preprocess(Link *ctxt, LSym *cursym)
                        p->to.reg = REGSP;
                        p->spadj = autosize;
                        
-                       if(cursym->text->reg & WRAPPER) {
+                       if(cursym->text->from3.offset & WRAPPER) {
                                // if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
                                //
                                //      MOVW g_panic(g), R1
@@ -1048,8 +1036,6 @@ LinkArch linkarm = {
        .isdata = isdata,
        .prg = prg,
        .progedit = progedit,
-       .settextflag = settextflag,
-       .textflag = textflag,
 
        .minlc = 4,
        .ptrsize = 4,
index 2b51061a0bc572b8ef76a2d9bf04e8b9e2031ab0..12e0606453080e2e77483475c5ab81b4e549d35d 100644 (file)
@@ -78,18 +78,6 @@ datasize(Prog *p)
        return p->from.scale;
 }
 
-static int
-textflag(Prog *p)
-{
-       return p->from.scale;
-}
-
-static void
-settextflag(Prog *p, int f)
-{
-       p->from.scale = f;
-}
-
 static void nacladdr(Link*, Prog*, Addr*);
 
 static int
@@ -404,24 +392,24 @@ preprocess(Link *ctxt, LSym *cursym)
        cursym->args = textarg;
        cursym->locals = p->to.offset;
 
-       if(autoffset < StackSmall && !(p->from.scale & NOSPLIT)) {
+       if(autoffset < StackSmall && !(p->from3.offset & NOSPLIT)) {
                for(q = p; q != nil; q = q->link) {
                        if(q->as == ACALL)
                                goto noleaf;
                        if((q->as == ADUFFCOPY || q->as == ADUFFZERO) && autoffset >= StackSmall - 8)
                                goto noleaf;
                }
-               p->from.scale |= NOSPLIT;
+               p->from3.offset |= NOSPLIT;
        noleaf:;
        }
 
        q = nil;
-       if(!(p->from.scale & NOSPLIT) || (p->from.scale & WRAPPER)) {
+       if(!(p->from3.offset & NOSPLIT) || (p->from3.offset & WRAPPER)) {
                p = appendp(ctxt, p);
                p = load_g_cx(ctxt, p); // load g into CX
        }
-       if(!(cursym->text->from.scale & NOSPLIT))
-               p = stacksplit(ctxt, p, autoffset, textarg, !(cursym->text->from.scale&NEEDCTXT), &q); // emit split check
+       if(!(cursym->text->from3.offset & NOSPLIT))
+               p = stacksplit(ctxt, p, autoffset, textarg, !(cursym->text->from3.offset&NEEDCTXT), &q); // emit split check
 
        if(autoffset) {
                if(autoffset%ctxt->arch->regsize != 0)
@@ -468,7 +456,7 @@ preprocess(Link *ctxt, LSym *cursym)
                p->to.reg = REG_BP;
        }
        
-       if(cursym->text->from.scale & WRAPPER) {
+       if(cursym->text->from3.offset & WRAPPER) {
                // if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
                //
                //      MOVQ g_panic(CX), BX
@@ -564,7 +552,7 @@ preprocess(Link *ctxt, LSym *cursym)
                p2->pcond = p;
        }
 
-       if(ctxt->debugzerostack && autoffset && !(cursym->text->from.scale&NOSPLIT)) {
+       if(ctxt->debugzerostack && autoffset && !(cursym->text->from3.offset&NOSPLIT)) {
                // 6l -Z means zero the stack frame on entry.
                // This slows down function calls but can help avoid
                // false positives in garbage collection.
@@ -1093,8 +1081,6 @@ LinkArch linkamd64 = {
        .isdata = isdata,
        .prg = prg,
        .progedit = progedit,
-       .settextflag = settextflag,
-       .textflag = textflag,
 
        .minlc = 1,
        .ptrsize = 8,
@@ -1127,8 +1113,6 @@ LinkArch linkamd64p32 = {
        .isdata = isdata,
        .prg = prg,
        .progedit = progedit,
-       .settextflag = settextflag,
-       .textflag = textflag,
 
        .minlc = 1,
        .ptrsize = 4,
index cceeeb1b87ea16d60ad06f8c9bbd70c506949ee8..16b0e07eac4eefa4b6b58da37cb2824612e01544 100644 (file)
@@ -68,18 +68,6 @@ datasize(Prog *p)
        return p->from.scale;
 }
 
-static int
-textflag(Prog *p)
-{
-       return p->from.scale;
-}
-
-static void
-settextflag(Prog *p, int f)
-{
-       p->from.scale = f;
-}
-
 static int
 canuselocaltls(Link *ctxt)
 {
@@ -302,12 +290,12 @@ preprocess(Link *ctxt, LSym *cursym)
 
        q = nil;
 
-       if(!(p->from.scale & NOSPLIT) || (p->from.scale & WRAPPER)) {
+       if(!(p->from3.offset & NOSPLIT) || (p->from3.offset & WRAPPER)) {
                p = appendp(ctxt, p);
                p = load_g_cx(ctxt, p); // load g into CX
        }
-       if(!(cursym->text->from.scale & NOSPLIT))
-               p = stacksplit(ctxt, p, autoffset, !(cursym->text->from.scale&NEEDCTXT), &q); // emit split check
+       if(!(cursym->text->from3.offset & NOSPLIT))
+               p = stacksplit(ctxt, p, autoffset, !(cursym->text->from3.offset&NEEDCTXT), &q); // emit split check
 
        if(autoffset) {
                p = appendp(ctxt, p);
@@ -330,7 +318,7 @@ preprocess(Link *ctxt, LSym *cursym)
                q->pcond = p;
        deltasp = autoffset;
        
-       if(cursym->text->from.scale & WRAPPER) {
+       if(cursym->text->from3.offset & WRAPPER) {
                // if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
                //
                //      MOVL g_panic(CX), BX
@@ -401,7 +389,7 @@ preprocess(Link *ctxt, LSym *cursym)
                p2->pcond = p;
        }
        
-       if(ctxt->debugzerostack && autoffset && !(cursym->text->from.scale&NOSPLIT)) {
+       if(ctxt->debugzerostack && autoffset && !(cursym->text->from3.offset&NOSPLIT)) {
                // 8l -Z means zero the stack frame on entry.
                // This slows down function calls but can help avoid
                // false positives in garbage collection.
@@ -894,8 +882,6 @@ LinkArch link386 = {
        .isdata = isdata,
        .prg = prg,
        .progedit = progedit,
-       .settextflag = settextflag,
-       .textflag = textflag,
 
        .minlc = 1,
        .ptrsize = 4,
index 6f7652f5f831891f9d74f3b6bf8a1748f5d15a41..60fa1d66e13aec1d9acaed7474c801624ab2c491 100644 (file)
@@ -57,18 +57,6 @@ datasize(Prog *p)
        return p->reg;
 }
 
-static int
-textflag(Prog *p)
-{
-       return p->reg;
-}
-
-static void
-settextflag(Prog *p, int f)
-{
-       p->reg = f;
-}
-
 static void
 progedit(Link *ctxt, Prog *p)
 {
@@ -367,8 +355,8 @@ preprocess(Link *ctxt, LSym *cursym)
                                        autosize += 4;
                        p->to.offset = autosize-8;
 
-                       if(!(p->reg & NOSPLIT))
-                               p = stacksplit(ctxt, p, autosize, !(cursym->text->reg&NEEDCTXT)); // emit split check
+                       if(!(p->from3.offset & NOSPLIT))
+                               p = stacksplit(ctxt, p, autosize, !(cursym->text->from3.offset&NEEDCTXT)); // emit split check
 
                        q = p;
                        if(autosize) {
@@ -420,7 +408,7 @@ preprocess(Link *ctxt, LSym *cursym)
                        if(q->as == AMOVDU)
                                q->spadj = -aoffset;
 
-                       if(cursym->text->reg & WRAPPER) {
+                       if(cursym->text->from3.offset & WRAPPER) {
                                // if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
                                //
                                //      MOVD g_panic(g), R3
@@ -970,8 +958,6 @@ LinkArch linkppc64 = {
        .isdata = isdata,
        .prg = prg,
        .progedit = progedit,
-       .settextflag = settextflag,
-       .textflag = textflag,
 
        .minlc = 4,
        .ptrsize = 8,
@@ -1004,8 +990,6 @@ LinkArch linkppc64le = {
        .isdata = isdata,
        .prg = prg,
        .progedit = progedit,
-       .settextflag = settextflag,
-       .textflag = textflag,
 
        .minlc = 4,
        .ptrsize = 8,
index bdd63ccb644cd0d4b0f61a906330c0e54c49d76e..79a88db0bf56fdd23126acb9866abaf48ac3f1c8 100644 (file)
@@ -189,7 +189,7 @@ writeobj(Link *ctxt, Biobuf *b)
                                s->size = p->to.offset;
                                if(s->type == 0 || s->type == SXREF)
                                        s->type = SBSS;
-                               flag = ctxt->arch->textflag(p);
+                               flag = p->from3.offset;
                                if(flag & DUPOK)
                                        s->dupok = 1;
                                if(flag & RODATA)
@@ -222,7 +222,7 @@ writeobj(Link *ctxt, Biobuf *b)
                                else
                                        etext->next = s;
                                etext = s;
-                               flag = ctxt->arch->textflag(p);
+                               flag = p->from3.offset;
                                if(flag & DUPOK)
                                        s->dupok = 1;
                                if(flag & NOSPLIT)