return a / b
}
+func neg64_ssa(a, b float64) float64 {
+ switch {
+ }
+ return -a + -1*b
+}
+
func add32_ssa(a, b float32) float32 {
switch {
}
return a / b
}
+func neg32_ssa(a, b float32) float32 {
+ switch {
+ }
+ return -a + -1*b
+}
+
func conv2Float64_ssa(a int8, b uint8, c int16, d uint16,
e int32, f uint32, g int64, h uint64, i float32) (aa, bb, cc, dd, ee, ff, gg, hh, ii float64) {
switch {
fails += fail64("*", mul64_ssa, a, b, 12.0)
fails += fail64("-", sub64_ssa, a, b, -1.0)
fails += fail64("/", div64_ssa, a, b, 0.75)
+ fails += fail64("neg", neg64_ssa, a, b, -7)
fails += fail32("+", add32_ssa, c, d, 7.0)
fails += fail32("*", mul32_ssa, c, d, 12.0)
fails += fail32("-", sub32_ssa, c, d, -1.0)
fails += fail32("/", div32_ssa, c, d, 0.75)
+ fails += fail32("neg", neg32_ssa, c, d, -7)
// denorm-squared should underflow to zero.
fails += fail32("*", mul32_ssa, tiny, tiny, 0)
// Convert AMOVSS $(0), Xx to AXORPS Xx, Xx
case AMOVSS:
if p.From.Type == obj.TYPE_FCONST {
- if p.From.Val.(float64) == 0 {
+ // f == 0 can't be used here due to -0, so use Float64bits
+ if f := p.From.Val.(float64); math.Float64bits(f) == 0 {
if p.To.Type == obj.TYPE_REG && REG_X0 <= p.To.Reg && p.To.Reg <= REG_X15 {
p.As = AXORPS
p.From = p.To
case AMOVSD:
// Convert AMOVSD $(0), Xx to AXORPS Xx, Xx
if p.From.Type == obj.TYPE_FCONST {
- if p.From.Val.(float64) == 0 {
+ // f == 0 can't be used here due to -0, so use Float64bits
+ if f := p.From.Val.(float64); math.Float64bits(f) == 0 {
if p.To.Type == obj.TYPE_REG && REG_X0 <= p.To.Reg && p.To.Reg <= REG_X15 {
p.As = AXORPS
p.From = p.To