]> Cypherpunks repositories - gostls13.git/commitdiff
liblink, cmd/5a: fix reglist parsing/printing after changing REG_R0 to 32
authorShenghou Ma <minux@golang.org>
Thu, 5 Feb 2015 02:30:22 +0000 (21:30 -0500)
committerMinux Ma <minux@golang.org>
Thu, 5 Feb 2015 02:40:09 +0000 (02:40 +0000)
Fixes #9759.

Change-Id: I263f1251b9401371231374551c4f71c70cb6e359
Signed-off-by: Shenghou Ma <minux@golang.org>
Reviewed-on: https://go-review.googlesource.com/3931
Reviewed-by: Dave Cheney <dave@cheney.net>
src/cmd/5a/a.y
src/cmd/5a/y.tab.c
src/cmd/5a/y.tab.h
src/liblink/asm5.c
src/liblink/list5.c

index 429f7437c6e86d1a58fa215033efa313a49656f8..fbf583def403a4fda7ec29c98a83bb19bf7fae69 100644 (file)
@@ -38,7 +38,7 @@
 %union
 {
        Sym     *sym;
-       int32   lval;
+       int64   lval;
        double  dval;
        char    sval[8];
        Addr    addr;
@@ -460,20 +460,20 @@ fcon:
 reglist:
        spreg
        {
-               $$ = 1 << $1;
+               $$ = 1ULL << $1;
        }
 |      spreg '-' spreg
        {
                int i;
                $$=0;
                for(i=$1; i<=$3; i++)
-                       $$ |= 1<<i;
+                       $$ |= 1ULL<<i;
                for(i=$3; i<=$1; i++)
-                       $$ |= 1<<i;
+                       $$ |= 1ULL<<i;
        }
 |      spreg comma reglist
        {
-               $$ = (1<<$1) | $3;
+               $$ = (1ULL<<$1) | $3;
        }
 
 gen:
index d9af383d787109a44f6c9abd7ee5e8bb899248db..3db88a78052ece4d07ed8d37d5b9d4c3fd9c4753 100644 (file)
@@ -204,7 +204,7 @@ typedef union YYSTYPE
 #line 39 "a.y"
 {
        Sym     *sym;
-       int32   lval;
+       int64   lval;
        double  dval;
        char    sval[8];
        Addr    addr;
@@ -2223,7 +2223,7 @@ yyreduce:
   case 64:
 #line 462 "a.y"
     {
-               (yyval.lval) = 1 << (yyvsp[(1) - (1)].lval);
+               (yyval.lval) = 1ULL << (yyvsp[(1) - (1)].lval);
        }
     break;
 
@@ -2233,16 +2233,16 @@ yyreduce:
                int i;
                (yyval.lval)=0;
                for(i=(yyvsp[(1) - (3)].lval); i<=(yyvsp[(3) - (3)].lval); i++)
-                       (yyval.lval) |= 1<<i;
+                       (yyval.lval) |= 1ULL<<i;
                for(i=(yyvsp[(3) - (3)].lval); i<=(yyvsp[(1) - (3)].lval); i++)
-                       (yyval.lval) |= 1<<i;
+                       (yyval.lval) |= 1ULL<<i;
        }
     break;
 
   case 66:
 #line 475 "a.y"
     {
-               (yyval.lval) = (1<<(yyvsp[(1) - (3)].lval)) | (yyvsp[(3) - (3)].lval);
+               (yyval.lval) = (1ULL<<(yyvsp[(1) - (3)].lval)) | (yyvsp[(3) - (3)].lval);
        }
     break;
 
index fbbdbef99b0e48bdcf1b9929dbf713dc6fc35b4f..ef08534b1c077ed715e8fd2e0f57ba134f5a32c2 100644 (file)
@@ -149,7 +149,7 @@ typedef union YYSTYPE
 #line 39 "a.y"
 {
        Sym     *sym;
-       int32   lval;
+       int64   lval;
        double  dval;
        char    sval[8];
        Addr    addr;
index 8d597750b71a2e0a4574299c132f51bef91a865f..7a87abd0fd1d8568e681bdaeb12b343636e3329f 100644 (file)
@@ -1820,14 +1820,14 @@ if(0 /*debug['G']*/) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->na
                switch(o->type) {
                case 38:        /* movm $con,oreg -> stm */
                        o1 = (0x4 << 25);
-                       o1 |= p->from.offset & 0xffff;
+                       o1 |= (p->from.offset >> REG_R0) & 0xffff;
                        o1 |= (p->to.reg&15) << 16;
                        aclass(ctxt, &p->to);
                        break;
        
                case 39:        /* movm oreg,$con -> ldm */
                        o1 = (0x4 << 25) | (1 << 20);
-                       o1 |= p->to.offset & 0xffff;
+                       o1 |= (p->to.offset >> REG_R0) & 0xffff;
                        o1 |= (p->from.reg&15) << 16;
                        aclass(ctxt, &p->from);
                        break;
index 3d3e8e7d122853ba91d3b833e73fd1f79fb87b26..bce13c24fb28753006c70847e23aa4e4cd0fe148 100644 (file)
@@ -222,7 +222,8 @@ RAconv(Fmt *fp)
 {
        char str[STRINGSZ];
        Addr *a;
-       int i, v;
+       int i;
+       vlong v;
 
        a = va_arg(fp->args, Addr*);
        sprint(str, "GOK-reglist");
@@ -232,7 +233,7 @@ RAconv(Fmt *fp)
                        break;
                if(a->sym != nil)
                        break;
-               v = a->offset;
+               v = a->offset >> REG_R0;
                strcpy(str, "");
                for(i=0; i<NREG; i++) {
                        if(v & (1<<i)) {