summaryrefslogtreecommitdiff
path: root/src/cmd/gc/const.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/gc/const.c')
-rw-r--r--src/cmd/gc/const.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c
index f16c52d58..0cf6922d7 100644
--- a/src/cmd/gc/const.c
+++ b/src/cmd/gc/const.c
@@ -9,8 +9,8 @@ static Val tocplx(Val);
static Val toflt(Val);
static Val tostr(Val);
static Val copyval(Val);
-static void cmplxmpy(Mpcplx *v, Mpcplx *rv);
-static void cmplxdiv(Mpcplx *v, Mpcplx *rv);
+static void cmplxmpy(Mpcplx*, Mpcplx*);
+static void cmplxdiv(Mpcplx*, Mpcplx*);
/*
* truncate float literal fv to 32-bit or 64-bit precision
@@ -589,6 +589,7 @@ evconst(Node *n)
case TUP(OXOR, CTINT):
mpxorfixfix(v.u.xval, rv.u.xval);
break;
+
case TUP(OADD, CTFLT):
mpaddfltflt(v.u.fval, rv.u.fval);
break;
@@ -619,6 +620,13 @@ evconst(Node *n)
cmplxmpy(v.u.cval, rv.u.cval);
break;
case TUP(ODIV, CTCPLX):
+ if(mpcmpfltc(&rv.u.cval->real, 0) == 0 &&
+ mpcmpfltc(&rv.u.cval->imag, 0) == 0) {
+ yyerror("complex division by zero");
+ mpmovecflt(&rv.u.cval->real, 1.0);
+ mpmovecflt(&rv.u.cval->imag, 0.0);
+ break;
+ }
cmplxdiv(v.u.cval, rv.u.cval);
break;
@@ -677,6 +685,17 @@ evconst(Node *n)
goto settrue;
goto setfalse;
+ case TUP(OEQ, CTCPLX):
+ if(mpcmpfltflt(&v.u.cval->real, &rv.u.cval->real) == 0 &&
+ mpcmpfltflt(&v.u.cval->imag, &rv.u.cval->imag) == 0)
+ goto settrue;
+ goto setfalse;
+ case TUP(ONE, CTCPLX):
+ if(mpcmpfltflt(&v.u.cval->real, &rv.u.cval->real) != 0 ||
+ mpcmpfltflt(&v.u.cval->imag, &rv.u.cval->imag) != 0)
+ goto settrue;
+ goto setfalse;
+
case TUP(OEQ, CTSTR):
if(cmpslit(nl, nr) == 0)
goto settrue;