small code improvement to
used scaled indexing
R=r
OCL=20308
CL=20310
diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c
index de54756..5e3d9ed 100644
--- a/src/cmd/6g/cgen.c
+++ b/src/cmd/6g/cgen.c
@@ -476,11 +476,6 @@
patch(p1, pc);
}
- if(w != 1) {
- nodconst(&n1, t, w); // w
- gins(optoas(OMUL, t), &n1, &n2);
- }
-
if(isptrdarray(nl->type)) {
n1 = n3;
n1.op = OINDREG;
@@ -488,9 +483,20 @@
n1.xoffset = offsetof(Array, array);
gmove(&n1, &n3);
}
- gins(optoas(OADD, types[tptr]), &n2, &n3);
- gmove(&n3, res);
+ if(w == 1 || w == 2 || w == 4 || w == 8) {
+ p1 = gins(ALEAQ, &n2, &n3);
+ p1->from.scale = w;
+ p1->from.index = p1->from.type;
+ p1->from.type = p1->to.type + D_INDIR;
+ } else {
+ nodconst(&n1, t, w);
+ gins(optoas(OMUL, t), &n1, &n2);
+ gins(optoas(OADD, types[tptr]), &n2, &n3);
+ gmove(&n3, res);
+ }
+
+ gmove(&n3, res);
regfree(&n2);
regfree(&n3);
break;