mirror of
https://github.com/golang/go.git
synced 2025-05-29 03:11:26 +00:00
[dev.ssa] cmd/compile/internal/ssa: add == and != for complex
Change-Id: Iefabce4eb0dbc313dd1863513b45307cc76c545a Reviewed-on: https://go-review.googlesource.com/14468 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
2f51807157
commit
db380bf44b
@ -1476,6 +1476,22 @@ func (s *state) expr(n *Node) *ssa.Value {
|
|||||||
case OLT, OEQ, ONE, OLE, OGE, OGT:
|
case OLT, OEQ, ONE, OLE, OGE, OGT:
|
||||||
a := s.expr(n.Left)
|
a := s.expr(n.Left)
|
||||||
b := s.expr(n.Right)
|
b := s.expr(n.Right)
|
||||||
|
if n.Left.Type.IsComplex() {
|
||||||
|
pt := floatForComplex(n.Type)
|
||||||
|
op := s.ssaOp(OEQ, pt)
|
||||||
|
r := s.newValue2(op, Types[TBOOL], s.newValue1(ssa.OpComplexReal, pt, a), s.newValue1(ssa.OpComplexReal, pt, b))
|
||||||
|
i := s.newValue2(op, Types[TBOOL], s.newValue1(ssa.OpComplexImag, pt, a), s.newValue1(ssa.OpComplexImag, pt, b))
|
||||||
|
c := s.newValue2(ssa.OpAnd8, Types[TBOOL], r, i)
|
||||||
|
switch n.Op {
|
||||||
|
case OEQ:
|
||||||
|
return c
|
||||||
|
case ONE:
|
||||||
|
return s.newValue1(ssa.OpNot, Types[TBOOL], c)
|
||||||
|
default:
|
||||||
|
s.Fatalf("ordered complex compare %s", opnames[n.Op])
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
return s.newValue2(s.ssaOp(n.Op, n.Left.Type), Types[TBOOL], a, b)
|
return s.newValue2(s.ssaOp(n.Op, n.Left.Type), Types[TBOOL], a, b)
|
||||||
case OMUL:
|
case OMUL:
|
||||||
a := s.expr(n.Left)
|
a := s.expr(n.Left)
|
||||||
|
55
src/cmd/compile/internal/gc/testdata/fp_ssa.go
vendored
55
src/cmd/compile/internal/gc/testdata/fp_ssa.go
vendored
@ -1557,6 +1557,45 @@ func cx64imag_ssa(a complex64) float32 {
|
|||||||
return imag(a)
|
return imag(a)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func cx128eq_ssa(a, b complex128) bool {
|
||||||
|
switch { // prevent inlining
|
||||||
|
}
|
||||||
|
return a == b
|
||||||
|
}
|
||||||
|
|
||||||
|
func cx128ne_ssa(a, b complex128) bool {
|
||||||
|
switch { // prevent inlining
|
||||||
|
}
|
||||||
|
return a != b
|
||||||
|
}
|
||||||
|
|
||||||
|
func cx64eq_ssa(a, b complex64) bool {
|
||||||
|
switch { // prevent inlining
|
||||||
|
}
|
||||||
|
return a == b
|
||||||
|
}
|
||||||
|
|
||||||
|
func cx64ne_ssa(a, b complex64) bool {
|
||||||
|
switch { // prevent inlining
|
||||||
|
}
|
||||||
|
return a != b
|
||||||
|
}
|
||||||
|
|
||||||
|
func expectTrue(s string, b bool) int {
|
||||||
|
if !b {
|
||||||
|
println("expected true for", s, ", got false")
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
func expectFalse(s string, b bool) int {
|
||||||
|
if b {
|
||||||
|
println("expected false for", s, ", got true")
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
func complexTest128() int {
|
func complexTest128() int {
|
||||||
fails := 0
|
fails := 0
|
||||||
var a complex128 = 1 + 2i
|
var a complex128 = 1 + 2i
|
||||||
@ -1569,6 +1608,10 @@ func complexTest128() int {
|
|||||||
r := cx128real_ssa(a)
|
r := cx128real_ssa(a)
|
||||||
i := cx128imag_ssa(a)
|
i := cx128imag_ssa(a)
|
||||||
cnst := cx128cnst_ssa(a)
|
cnst := cx128cnst_ssa(a)
|
||||||
|
c1 := cx128eq_ssa(a, a)
|
||||||
|
c2 := cx128eq_ssa(a, b)
|
||||||
|
c3 := cx128ne_ssa(a, a)
|
||||||
|
c4 := cx128ne_ssa(a, b)
|
||||||
|
|
||||||
fails += expectCx128("sum", sum, 4+8i)
|
fails += expectCx128("sum", sum, 4+8i)
|
||||||
fails += expectCx128("diff", diff, 2+4i)
|
fails += expectCx128("diff", diff, 2+4i)
|
||||||
@ -1578,6 +1621,10 @@ func complexTest128() int {
|
|||||||
fails += expect64("real", r, 1)
|
fails += expect64("real", r, 1)
|
||||||
fails += expect64("imag", i, 2)
|
fails += expect64("imag", i, 2)
|
||||||
fails += expectCx128("cnst", cnst, -4+7i)
|
fails += expectCx128("cnst", cnst, -4+7i)
|
||||||
|
fails += expectTrue(fmt.Sprintf("%v==%v", a, a), c1)
|
||||||
|
fails += expectFalse(fmt.Sprintf("%v==%v", a, b), c2)
|
||||||
|
fails += expectFalse(fmt.Sprintf("%v!=%v", a, a), c3)
|
||||||
|
fails += expectTrue(fmt.Sprintf("%v!=%v", a, b), c4)
|
||||||
|
|
||||||
return fails
|
return fails
|
||||||
}
|
}
|
||||||
@ -1593,6 +1640,10 @@ func complexTest64() int {
|
|||||||
neg := cx64neg_ssa(a)
|
neg := cx64neg_ssa(a)
|
||||||
r := cx64real_ssa(a)
|
r := cx64real_ssa(a)
|
||||||
i := cx64imag_ssa(a)
|
i := cx64imag_ssa(a)
|
||||||
|
c1 := cx64eq_ssa(a, a)
|
||||||
|
c2 := cx64eq_ssa(a, b)
|
||||||
|
c3 := cx64ne_ssa(a, a)
|
||||||
|
c4 := cx64ne_ssa(a, b)
|
||||||
|
|
||||||
fails += expectCx64("sum", sum, 4+8i)
|
fails += expectCx64("sum", sum, 4+8i)
|
||||||
fails += expectCx64("diff", diff, 2+4i)
|
fails += expectCx64("diff", diff, 2+4i)
|
||||||
@ -1601,6 +1652,10 @@ func complexTest64() int {
|
|||||||
fails += expectCx64("neg", neg, -1-2i)
|
fails += expectCx64("neg", neg, -1-2i)
|
||||||
fails += expect32("real", r, 1)
|
fails += expect32("real", r, 1)
|
||||||
fails += expect32("imag", i, 2)
|
fails += expect32("imag", i, 2)
|
||||||
|
fails += expectTrue(fmt.Sprintf("%v==%v", a, a), c1)
|
||||||
|
fails += expectFalse(fmt.Sprintf("%v==%v", a, b), c2)
|
||||||
|
fails += expectFalse(fmt.Sprintf("%v!=%v", a, a), c3)
|
||||||
|
fails += expectTrue(fmt.Sprintf("%v!=%v", a, b), c4)
|
||||||
|
|
||||||
return fails
|
return fails
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user