aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2010-10-20 13:18:00 -0700
committerKen Thompson <ken@golang.org>2010-10-20 13:18:00 -0700
commit6096fc83cd117b0690c3b3017778757e4389982f (patch)
tree3d92b5f4f56e5161808a612027066f7f6a98f115
parent6a3b29895f72b62fd7c49d1d808ed1a8ab49fdc5 (diff)
downloadgo-6096fc83cd117b0690c3b3017778757e4389982f.tar.gz
go-6096fc83cd117b0690c3b3017778757e4389982f.zip
code gen error for *(complex)++
includes array[i]++ and slice[i]++ R=rsc CC=golang-dev https://golang.org/cl/2614041
-rw-r--r--src/cmd/5g/ggen.c5
-rw-r--r--src/cmd/5g/gsubr.c14
2 files changed, 13 insertions, 6 deletions
diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c
index 55f6169465..d665f6158b 100644
--- a/src/cmd/5g/ggen.c
+++ b/src/cmd/5g/ggen.c
@@ -458,13 +458,14 @@ cgen_asop(Node *n)
}
if(nr->ullman < UINF)
if(sudoaddable(a, nl, &addr, &w)) {
+ w = optoas(OAS, nl->type);
regalloc(&n2, nl->type, N);
- p1 = gins(AMOVW, N, &n2);
+ p1 = gins(w, N, &n2);
p1->from = addr;
regalloc(&n3, nr->type, N);
cgen(nr, &n3);
gins(a, &n3, &n2);
- p1 = gins(AMOVW, &n2, N);
+ p1 = gins(w, &n2, N);
p1->to = addr;
regfree(&n2);
regfree(&n3);
diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c
index 6cccdac25f..b96e30cea7 100644
--- a/src/cmd/5g/gsubr.c
+++ b/src/cmd/5g/gsubr.c
@@ -1835,14 +1835,20 @@ oindex:
gmove(&n2, reg);
}
- if(*w == 1)
+ switch(*w) {
+ case 1:
gins(AADD, reg1, reg);
- else if(*w == 2)
+ break;
+ case 2:
gshift(AADD, reg1, SHIFT_LL, 1, reg);
- else if(*w == 4)
+ break;
+ case 4:
gshift(AADD, reg1, SHIFT_LL, 2, reg);
- else if(*w == 8)
+ break;
+ case 8:
gshift(AADD, reg1, SHIFT_LL, 3, reg);
+ break;
+ }
naddr(reg1, a, 1);
a->type = D_OREG;