Skip to content

Commit da4abda

Browse files
committed
liblink, cmd/5a: fix reglist parsing/printing after changing REG_R0 to 32
Fixes #9759. Change-Id: I263f1251b9401371231374551c4f71c70cb6e359 Signed-off-by: Shenghou Ma <[email protected]> Reviewed-on: https://go-review.googlesource.com/3931 Reviewed-by: Dave Cheney <[email protected]>
1 parent 706cc13 commit da4abda

File tree

5 files changed

+16
-15
lines changed

5 files changed

+16
-15
lines changed

src/cmd/5a/a.y

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
%union
3939
{
4040
Sym *sym;
41-
int32 lval;
41+
int64 lval;
4242
double dval;
4343
char sval[8];
4444
Addr addr;
@@ -460,20 +460,20 @@ fcon:
460460
reglist:
461461
spreg
462462
{
463-
$$ = 1 << $1;
463+
$$ = 1ULL << $1;
464464
}
465465
| spreg '-' spreg
466466
{
467467
int i;
468468
$$=0;
469469
for(i=$1; i<=$3; i++)
470-
$$ |= 1<<i;
470+
$$ |= 1ULL<<i;
471471
for(i=$3; i<=$1; i++)
472-
$$ |= 1<<i;
472+
$$ |= 1ULL<<i;
473473
}
474474
| spreg comma reglist
475475
{
476-
$$ = (1<<$1) | $3;
476+
$$ = (1ULL<<$1) | $3;
477477
}
478478

479479
gen:

src/cmd/5a/y.tab.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ typedef union YYSTYPE
204204
#line 39 "a.y"
205205
{
206206
Sym *sym;
207-
int32 lval;
207+
int64 lval;
208208
double dval;
209209
char sval[8];
210210
Addr addr;
@@ -2223,7 +2223,7 @@ yyparse ()
22232223
case 64:
22242224
#line 462 "a.y"
22252225
{
2226-
(yyval.lval) = 1 << (yyvsp[(1) - (1)].lval);
2226+
(yyval.lval) = 1ULL << (yyvsp[(1) - (1)].lval);
22272227
}
22282228
break;
22292229

@@ -2233,16 +2233,16 @@ yyparse ()
22332233
int i;
22342234
(yyval.lval)=0;
22352235
for(i=(yyvsp[(1) - (3)].lval); i<=(yyvsp[(3) - (3)].lval); i++)
2236-
(yyval.lval) |= 1<<i;
2236+
(yyval.lval) |= 1ULL<<i;
22372237
for(i=(yyvsp[(3) - (3)].lval); i<=(yyvsp[(1) - (3)].lval); i++)
2238-
(yyval.lval) |= 1<<i;
2238+
(yyval.lval) |= 1ULL<<i;
22392239
}
22402240
break;
22412241

22422242
case 66:
22432243
#line 475 "a.y"
22442244
{
2245-
(yyval.lval) = (1<<(yyvsp[(1) - (3)].lval)) | (yyvsp[(3) - (3)].lval);
2245+
(yyval.lval) = (1ULL<<(yyvsp[(1) - (3)].lval)) | (yyvsp[(3) - (3)].lval);
22462246
}
22472247
break;
22482248

src/cmd/5a/y.tab.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ typedef union YYSTYPE
149149
#line 39 "a.y"
150150
{
151151
Sym *sym;
152-
int32 lval;
152+
int64 lval;
153153
double dval;
154154
char sval[8];
155155
Addr addr;

src/liblink/asm5.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1820,14 +1820,14 @@ if(0 /*debug['G']*/) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->na
18201820
switch(o->type) {
18211821
case 38: /* movm $con,oreg -> stm */
18221822
o1 = (0x4 << 25);
1823-
o1 |= p->from.offset & 0xffff;
1823+
o1 |= (p->from.offset >> REG_R0) & 0xffff;
18241824
o1 |= (p->to.reg&15) << 16;
18251825
aclass(ctxt, &p->to);
18261826
break;
18271827

18281828
case 39: /* movm oreg,$con -> ldm */
18291829
o1 = (0x4 << 25) | (1 << 20);
1830-
o1 |= p->to.offset & 0xffff;
1830+
o1 |= (p->to.offset >> REG_R0) & 0xffff;
18311831
o1 |= (p->from.reg&15) << 16;
18321832
aclass(ctxt, &p->from);
18331833
break;

src/liblink/list5.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,8 @@ RAconv(Fmt *fp)
222222
{
223223
char str[STRINGSZ];
224224
Addr *a;
225-
int i, v;
225+
int i;
226+
vlong v;
226227

227228
a = va_arg(fp->args, Addr*);
228229
sprint(str, "GOK-reglist");
@@ -232,7 +233,7 @@ RAconv(Fmt *fp)
232233
break;
233234
if(a->sym != nil)
234235
break;
235-
v = a->offset;
236+
v = a->offset >> REG_R0;
236237
strcpy(str, "");
237238
for(i=0; i<NREG; i++) {
238239
if(v & (1<<i)) {

0 commit comments

Comments
 (0)