Skip to content

Commit 2749318

Browse files
committed
cmd/compile: change cmplx{mpy,div} into Mpcplx methods
Passes toolstash-check. Change-Id: Icae55fe4fa1bb8e4f2f83b7c69e08d30a5559d9e Reviewed-on: https://go-review.googlesource.com/105047 Run-TryBot: Matthew Dempsky <[email protected]> Reviewed-by: Daniel Martí <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent fcb7488 commit 2749318

File tree

2 files changed

+73
-94
lines changed

2 files changed

+73
-94
lines changed

src/cmd/compile/internal/gc/const.go

Lines changed: 2 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,10 +1014,10 @@ func evconst(n *Node) {
10141014
v.U.(*Mpcplx).Imag.Sub(&rv.U.(*Mpcplx).Imag)
10151015

10161016
case OMUL_ | CTCPLX_:
1017-
cmplxmpy(v.U.(*Mpcplx), rv.U.(*Mpcplx))
1017+
v.U.(*Mpcplx).Mul(rv.U.(*Mpcplx))
10181018

10191019
case ODIV_ | CTCPLX_:
1020-
if !cmplxdiv(v.U.(*Mpcplx), rv.U.(*Mpcplx)) {
1020+
if !v.U.(*Mpcplx).Div(rv.U.(*Mpcplx)) {
10211021
yyerror("complex division by zero")
10221022
rv.U.(*Mpcplx).Real.SetFloat64(1.0)
10231023
rv.U.(*Mpcplx).Imag.SetFloat64(0.0)
@@ -1522,98 +1522,6 @@ func nonnegintconst(n *Node) int64 {
15221522
return vi.Int64()
15231523
}
15241524

1525-
// complex multiply v *= rv
1526-
// (a, b) * (c, d) = (a*c - b*d, b*c + a*d)
1527-
func cmplxmpy(v *Mpcplx, rv *Mpcplx) {
1528-
var ac Mpflt
1529-
var bd Mpflt
1530-
var bc Mpflt
1531-
var ad Mpflt
1532-
1533-
ac.Set(&v.Real)
1534-
ac.Mul(&rv.Real) // ac
1535-
1536-
bd.Set(&v.Imag)
1537-
1538-
bd.Mul(&rv.Imag) // bd
1539-
1540-
bc.Set(&v.Imag)
1541-
1542-
bc.Mul(&rv.Real) // bc
1543-
1544-
ad.Set(&v.Real)
1545-
1546-
ad.Mul(&rv.Imag) // ad
1547-
1548-
v.Real.Set(&ac)
1549-
1550-
v.Real.Sub(&bd) // ac-bd
1551-
1552-
v.Imag.Set(&bc)
1553-
1554-
v.Imag.Add(&ad) // bc+ad
1555-
}
1556-
1557-
// complex divide v /= rv
1558-
// (a, b) / (c, d) = ((a*c + b*d), (b*c - a*d))/(c*c + d*d)
1559-
func cmplxdiv(v *Mpcplx, rv *Mpcplx) bool {
1560-
if rv.Real.CmpFloat64(0) == 0 && rv.Imag.CmpFloat64(0) == 0 {
1561-
return false
1562-
}
1563-
1564-
var ac Mpflt
1565-
var bd Mpflt
1566-
var bc Mpflt
1567-
var ad Mpflt
1568-
var cc_plus_dd Mpflt
1569-
1570-
cc_plus_dd.Set(&rv.Real)
1571-
1572-
cc_plus_dd.Mul(&rv.Real) // cc
1573-
1574-
ac.Set(&rv.Imag)
1575-
1576-
ac.Mul(&rv.Imag) // dd
1577-
1578-
cc_plus_dd.Add(&ac) // cc+dd
1579-
1580-
// We already checked that c and d are not both zero, but we can't
1581-
// assume that c²+d² != 0 follows, because for tiny values of c
1582-
// and/or d c²+d² can underflow to zero. Check that c²+d² is
1583-
// nonzero,return if it's not.
1584-
if cc_plus_dd.CmpFloat64(0) == 0 {
1585-
return false
1586-
}
1587-
1588-
ac.Set(&v.Real)
1589-
1590-
ac.Mul(&rv.Real) // ac
1591-
1592-
bd.Set(&v.Imag)
1593-
1594-
bd.Mul(&rv.Imag) // bd
1595-
1596-
bc.Set(&v.Imag)
1597-
1598-
bc.Mul(&rv.Real) // bc
1599-
1600-
ad.Set(&v.Real)
1601-
1602-
ad.Mul(&rv.Imag) // ad
1603-
1604-
v.Real.Set(&ac)
1605-
1606-
v.Real.Add(&bd) // ac+bd
1607-
v.Real.Quo(&cc_plus_dd) // (ac+bd)/(cc+dd)
1608-
1609-
v.Imag.Set(&bc)
1610-
1611-
v.Imag.Sub(&ad) // bc-ad
1612-
v.Imag.Quo(&cc_plus_dd) // (bc+ad)/(cc+dd)
1613-
1614-
return true
1615-
}
1616-
16171525
// Is n a Go language constant (as opposed to a compile-time constant)?
16181526
// Expressions derived from nil, like string([]byte(nil)), while they
16191527
// may be known at compile time, are not Go language constants.

src/cmd/compile/internal/gc/mpfloat.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,3 +263,74 @@ func fconv(fvp *Mpflt, flag FmtFlag) string {
263263

264264
return fmt.Sprintf("%s%.6ge%+d", sign, m, e)
265265
}
266+
267+
// complex multiply v *= rv
268+
// (a, b) * (c, d) = (a*c - b*d, b*c + a*d)
269+
func (v *Mpcplx) Mul(rv *Mpcplx) {
270+
var ac, ad, bc, bd Mpflt
271+
272+
ac.Set(&v.Real)
273+
ac.Mul(&rv.Real) // ac
274+
275+
bd.Set(&v.Imag)
276+
bd.Mul(&rv.Imag) // bd
277+
278+
bc.Set(&v.Imag)
279+
bc.Mul(&rv.Real) // bc
280+
281+
ad.Set(&v.Real)
282+
ad.Mul(&rv.Imag) // ad
283+
284+
v.Real.Set(&ac)
285+
v.Real.Sub(&bd) // ac-bd
286+
287+
v.Imag.Set(&bc)
288+
v.Imag.Add(&ad) // bc+ad
289+
}
290+
291+
// complex divide v /= rv
292+
// (a, b) / (c, d) = ((a*c + b*d), (b*c - a*d))/(c*c + d*d)
293+
func (v *Mpcplx) Div(rv *Mpcplx) bool {
294+
if rv.Real.CmpFloat64(0) == 0 && rv.Imag.CmpFloat64(0) == 0 {
295+
return false
296+
}
297+
298+
var ac, ad, bc, bd, cc_plus_dd Mpflt
299+
300+
cc_plus_dd.Set(&rv.Real)
301+
cc_plus_dd.Mul(&rv.Real) // cc
302+
303+
ac.Set(&rv.Imag)
304+
ac.Mul(&rv.Imag) // dd
305+
cc_plus_dd.Add(&ac) // cc+dd
306+
307+
// We already checked that c and d are not both zero, but we can't
308+
// assume that c²+d² != 0 follows, because for tiny values of c
309+
// and/or d c²+d² can underflow to zero. Check that c²+d² is
310+
// nonzero, return if it's not.
311+
if cc_plus_dd.CmpFloat64(0) == 0 {
312+
return false
313+
}
314+
315+
ac.Set(&v.Real)
316+
ac.Mul(&rv.Real) // ac
317+
318+
bd.Set(&v.Imag)
319+
bd.Mul(&rv.Imag) // bd
320+
321+
bc.Set(&v.Imag)
322+
bc.Mul(&rv.Real) // bc
323+
324+
ad.Set(&v.Real)
325+
ad.Mul(&rv.Imag) // ad
326+
327+
v.Real.Set(&ac)
328+
v.Real.Add(&bd) // ac+bd
329+
v.Real.Quo(&cc_plus_dd) // (ac+bd)/(cc+dd)
330+
331+
v.Imag.Set(&bc)
332+
v.Imag.Sub(&ad) // bc-ad
333+
v.Imag.Quo(&cc_plus_dd) // (bc+ad)/(cc+dd)
334+
335+
return true
336+
}

0 commit comments

Comments
 (0)