summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2010-03-20 18:50:01 -0700
committerKen Thompson <ken@golang.org>2010-03-20 18:50:01 -0700
commit9e3bf9861d4e0a26951c0a5d2d500bcda33a82ef (patch)
tree943f64a395c82bdf0aedb57e61d2985659d7f5e9
parenta2544acf6e94bf8c0e466fbeed1952d7e312b544 (diff)
downloadgo-9e3bf9861d4e0a26951c0a5d2d500bcda33a82ef.tar.gz
issue 682
complex DATA statement fo initialization of complex variables. R=rsc CC=golang-dev http://codereview.appspot.com/634045
-rw-r--r--src/cmd/5g/gobj.c21
-rw-r--r--src/cmd/6g/gobj.c22
-rw-r--r--src/cmd/8g/gobj.c21
-rw-r--r--src/cmd/gc/cplx.c21
-rw-r--r--src/cmd/gc/go.h1
-rw-r--r--src/cmd/gc/sinit.c7
6 files changed, 71 insertions, 22 deletions
diff --git a/src/cmd/5g/gobj.c b/src/cmd/5g/gobj.c
index fffba011d..0e8220007 100644
--- a/src/cmd/5g/gobj.c
+++ b/src/cmd/5g/gobj.c
@@ -489,6 +489,27 @@ gdata(Node *nam, Node *nr, int wid)
}
void
+gdatacomplex(Node *nam, Mpcplx *cval)
+{
+ Prog *p;
+ int w;
+
+ w = cplxsubtype(nam->type->etype);
+ w = types[w]->width;
+
+ p = gins(ADATA, nam, N);
+ p->from.scale = w;
+ p->to.type = D_FCONST;
+ p->to.dval = mpgetflt(&cval->real);
+
+ p = gins(ADATA, nam, N);
+ p->from.scale = w;
+ p->from.offset += w;
+ p->to.type = D_FCONST;
+ p->to.dval = mpgetflt(&cval->imag);
+}
+
+void
gdatastring(Node *nam, Strlit *sval)
{
Prog *p;
diff --git a/src/cmd/6g/gobj.c b/src/cmd/6g/gobj.c
index 0d97c610d..e2db8c315 100644
--- a/src/cmd/6g/gobj.c
+++ b/src/cmd/6g/gobj.c
@@ -488,6 +488,27 @@ gdata(Node *nam, Node *nr, int wid)
}
void
+gdatacomplex(Node *nam, Mpcplx *cval)
+{
+ Prog *p;
+ int w;
+
+ w = cplxsubtype(nam->type->etype);
+ w = types[w]->width;
+
+ p = gins(ADATA, nam, N);
+ p->from.scale = w;
+ p->to.type = D_FCONST;
+ p->to.dval = mpgetflt(&cval->real);
+
+ p = gins(ADATA, nam, N);
+ p->from.scale = w;
+ p->from.offset += w;
+ p->to.type = D_FCONST;
+ p->to.dval = mpgetflt(&cval->imag);
+}
+
+void
gdatastring(Node *nam, Strlit *sval)
{
Prog *p;
@@ -506,7 +527,6 @@ gdatastring(Node *nam, Strlit *sval)
p->from.offset += types[tptr]->width;
}
-
int
dstringptr(Sym *s, int off, char *str)
{
diff --git a/src/cmd/8g/gobj.c b/src/cmd/8g/gobj.c
index 68ebd3d16..e48d2e196 100644
--- a/src/cmd/8g/gobj.c
+++ b/src/cmd/8g/gobj.c
@@ -496,6 +496,27 @@ gdata(Node *nam, Node *nr, int wid)
}
void
+gdatacomplex(Node *nam, Mpcplx *cval)
+{
+ Prog *p;
+ int w;
+
+ w = cplxsubtype(nam->type->etype);
+ w = types[w]->width;
+
+ p = gins(ADATA, nam, N);
+ p->from.scale = w;
+ p->to.type = D_FCONST;
+ p->to.dval = mpgetflt(&cval->real);
+
+ p = gins(ADATA, nam, N);
+ p->from.scale = w;
+ p->from.offset += w;
+ p->to.type = D_FCONST;
+ p->to.dval = mpgetflt(&cval->imag);
+}
+
+void
gdatastring(Node *nam, Strlit *sval)
{
Prog *p;
diff --git a/src/cmd/gc/cplx.c b/src/cmd/gc/cplx.c
index d7f29d837..a98cf49d8 100644
--- a/src/cmd/gc/cplx.c
+++ b/src/cmd/gc/cplx.c
@@ -5,7 +5,6 @@
#include "gg.h"
static void subnode(Node *nr, Node *ni, Node *nc);
-static void zero(Node *n);
static void minus(Node *nl, Node *res);
void complexminus(Node*, Node*);
void complexadd(int op, Node*, Node*, Node*);
@@ -340,26 +339,6 @@ subnode(Node *nr, Node *ni, Node *nc)
ni->xoffset += t->width;
}
-// generate code to zero addable dest nr
-static void
-zero(Node *nr)
-{
- Node nc;
- Mpflt fval;
-
- memset(&nc, 0, sizeof(nc));
- nc.op = OLITERAL;
- nc.addable = 1;
- ullmancalc(&nc);
- nc.val.u.fval = &fval;
- nc.val.ctype = CTFLT;
- nc.type = nr->type;
-
- mpmovecflt(nc.val.u.fval, 0.0);
-
- cgen(&nc, nr);
-}
-
// generate code res = -nl
static void
minus(Node *nl, Node *res)
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index a301a756c..46be44d5e 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -1218,6 +1218,7 @@ void cgen(Node*, Node*);
void gused(Node*);
void gdata(Node*, Node*, int);
void gdatastring(Node*, Strlit*);
+void gdatacomplex(Node*, Mpcplx*);
void dumptypestructs(void);
void dumpfuncs(void);
void dumpdata(void);
diff --git a/src/cmd/gc/sinit.c b/src/cmd/gc/sinit.c
index fd73dc0ad..6f0772b63 100644
--- a/src/cmd/gc/sinit.c
+++ b/src/cmd/gc/sinit.c
@@ -826,6 +826,13 @@ gen_as_init(Node *n)
gdata(&nam, nr, nr->type->width);
break;
+ case TCOMPLEX64:
+ case TCOMPLEX128:
+ case TCOMPLEX:
+ gused(N); // in case the data is the dest of a goto
+ gdatacomplex(&nam, nr->val.u.cval);
+ break;
+
case TSTRING:
gused(N); // in case the data is the dest of a goto
gdatastring(&nam, nr->val.u.sval);