summaryrefslogtreecommitdiff
path: root/src/cmd/5g/gsubr.c
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-10-15 19:41:51 -0700
committerKai Backman <kaib@golang.org>2009-10-15 19:41:51 -0700
commit88851e5f41fe70001685e8ad7f1590000e57edab (patch)
treee059cc88c353cf108a4c082ebfc061fd60a49ebc /src/cmd/5g/gsubr.c
parentacc59d6cfb8568cfc01cb102f27316eb5fd46bb3 (diff)
downloadgolang-88851e5f41fe70001685e8ad7f1590000e57edab.tar.gz
test/64bit.go passes but doesn't generate properly yet.
R=rsc APPROVED=rsc DELTA=235 (98 added, 38 deleted, 99 changed) OCL=35789 CL=35813
Diffstat (limited to 'src/cmd/5g/gsubr.c')
-rw-r--r--src/cmd/5g/gsubr.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c
index e9131b436..d22d4b468 100644
--- a/src/cmd/5g/gsubr.c
+++ b/src/cmd/5g/gsubr.c
@@ -965,15 +965,18 @@ gcmp(int as, Node *lhs, Node *rhs)
}
/* generate a constant shift
+ * arm encodes a shift by 32 as 0, thus asking for 0 shift is illegal.
*/
Prog*
gshift(int as, Node *lhs, int32 stype, int32 sval, Node *rhs)
{
Prog *p;
- if (sval < 0 || sval > 31)
+ if (sval <= 0 || sval > 32)
fatal("bad shift value: %d", sval);
+ sval = sval&0x1f;
+
p = gins(as, N, rhs);
p->from.type = D_SHIFT;
p->from.offset = stype | sval<<7 | lhs->val.u.reg;