summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-02-02 13:41:38 -0800
committerRuss Cox <rsc@golang.org>2009-02-02 13:41:38 -0800
commit6f02f374aeeb27111e13ca1fa11079cae591eb89 (patch)
tree0f7b0f76fc2aa87d541cd4bd636c8ae3d1f2bd50
parentb383fce4eda49f685b66673bf7e11248755f70c5 (diff)
downloadgolang-6f02f374aeeb27111e13ca1fa11079cae591eb89.tar.gz
6g return struct fix:
make t->width of funarg struct be width of struct. emit MOVSL for 4-byte copy. R=ken OCL=24108 CL=24111
-rw-r--r--src/cmd/6g/align.c7
-rw-r--r--src/cmd/6g/cgen.c8
-rw-r--r--src/cmd/6g/gsubr.c4
3 files changed, 10 insertions, 9 deletions
diff --git a/src/cmd/6g/align.c b/src/cmd/6g/align.c
index 5d55e2ca9..a2a8e2808 100644
--- a/src/cmd/6g/align.c
+++ b/src/cmd/6g/align.c
@@ -68,7 +68,12 @@ widstruct(Type *t, uint32 o, int flag)
// final width is rounded
if(flag)
o = rnd(o, maxround);
- t->width = o;
+
+ // type width only includes back to first field's offset
+ if(t->type == T)
+ t->width = 0;
+ else
+ t->width = o - t->type->width;
return o;
}
diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c
index 4a7404e8c..05dd256ff 100644
--- a/src/cmd/6g/cgen.c
+++ b/src/cmd/6g/cgen.c
@@ -906,11 +906,9 @@ sgen(Node *n, Node *ns, int32 w)
}
if(c >= 4) {
- gconreg(AMOVQ, c, D_CX);
- gins(AREP, N, N); // repeat
- gins(AMOVSB, N, N); // MOVB *(SI)+,*(DI)+
-
- } else
+ gins(AMOVSL, N, N); // MOVL *(SI)+,*(DI)+
+ c -= 4;
+ }
while(c > 0) {
gins(AMOVSB, N, N); // MOVB *(SI)+,*(DI)+
c--;
diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c
index 67def9952..4d091da64 100644
--- a/src/cmd/6g/gsubr.c
+++ b/src/cmd/6g/gsubr.c
@@ -1887,11 +1887,9 @@ lsort(Sig *l, int(*f)(Sig*, Sig*))
void
setmaxarg(Type *t)
{
- Type *to;
int32 w;
- to = *getoutarg(t);
- w = to->width;
+ w = t->argwid;
if(w > maxarg)
maxarg = w;
}