Skip to content

runtime: math.Sqrt mishandled when GOARM=5 #10641

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
4a6f656c opened this issue Apr 30, 2015 · 10 comments
Closed

runtime: math.Sqrt mishandled when GOARM=5 #10641

4a6f656c opened this issue Apr 30, 2015 · 10 comments
Milestone

Comments

@4a6f656c
Copy link
Contributor

Currently GOARM=5 platforms (on at least the linux-arm-arm5 and openbsd-arm builders) are failing the test/bench/shootout/nbody test due to invalid floating point results - this appears to be caused by a compiler or softfloat related bug. The failure is reproducible with the following:

package main

import (
        "fmt"
        "math"
)

func main() {
        dt := 0.1

        dx := -4.841431442464721
        dy := 1.1603200440274284
        dz := 0.10362204447112311

        dSquared := dx*dx + dy*dy + dz*dz
        distance := math.Sqrt(dSquared)
        mag := dt / (dSquared * distance)

        fmt.Println(mag)
}

Adding a fmt.Println(dSquared) immediately after dSquared is assigned "fixes" the problem and produces correct results.

The main from go tool objdump of the broken version contains:

TEXT main.main(SB) /tmp/nbody.go
        nbody.go:8      0x10c00 e59a1008        MOVW 0x8(R10), R1
        nbody.go:8      0x10c04 e15d0001        CMP R1, R13
        nbody.go:8      0x10c08 91a0300e        MOVW.LS R14, R3
        nbody.go:8      0x10c0c 9b0151bd        BL.LS runtime.morestack_noctxt(SB)
        nbody.go:8      0x10c10 9afffffa        B.LS main.main(SB)
        nbody.go:8      0x10c14 e52de040        MOVW.W R14, -0x40(R13)
        nbody.go:9      0x10c18 eb015ead        BL _sfloat(SB)
        nbody.go:9      0x10c1c e59fb0e4        MOVW 0xe4(R15), R11
        nbody.go:9      0x10c20 ed9b5b00        VLDR [R11], D5
        nbody.go:11     0x10c24 e59fb0e0        MOVW 0xe0(R15), R11
        nbody.go:11     0x10c28 ed9b2b00        VLDR [R11], D2
        nbody.go:12     0x10c2c e59fb0dc        MOVW 0xdc(R15), R11
        nbody.go:12     0x10c30 ed9b4b00        VLDR [R11], D4
        nbody.go:13     0x10c34 e59fb0d8        MOVW 0xd8(R15), R11
        nbody.go:13     0x10c38 ed9b3b00        VLDR [R11], D3
        nbody.go:15     0x10c3c ee220b02        VMUL.F64 D2, D2, D0
        nbody.go:15     0x10c40 ee241b04        VMUL.F64 D4, D4, D1
        nbody.go:15     0x10c44 ee300b01        VADD.F64 D1, D0, D0
        nbody.go:15     0x10c48 ee231b03        VMUL.F64 D3, D3, D1
        nbody.go:15     0x10c4c ee300b01        VADD.F64 D1, D0, D0
        nbody.go:15     0x10c50 eeb02b40        VMOV.F64 D0, D2
        nbody.go:16     0x10c54 eeb10bc0        VSQRT.F64 D0, D0
        nbody.go:16     0x10c58 eeb03b40        VMOV.F64 D0, D3
        nbody.go:17     0x10c5c eb015e9c        BL _sfloat(SB)
        nbody.go:17     0x10c60 ee220b00        VMUL.F64 D0, D2, D0
        nbody.go:17     0x10c64 ee851b00        VDIV.F64 D0, D5, D1
        nbody.go:17     0x10c68 eeb02b41        VMOV.F64 D1, D2
        nbody.go:19     0x10c6c ed8d1b07        VSTR [SP, #28], D1
        nbody.go:19     0x10c70 e3a00000        MOVW $0, R0
        nbody.go:19     0x10c74 e58d002c        MOVW R0, 0x2c(R13)
        nbody.go:19     0x10c78 e58d0030        MOVW R0, 0x30(R13)
        nbody.go:19     0x10c7c e28d202c        ADD $44, R13, R2
        nbody.go:19     0x10c80 e3520000        CMP $0, R2
        nbody.go:19     0x10c84 05822000        MOVW.EQ R2, (R2)
        nbody.go:19     0x10c88 e3a04001        MOVW $1, R4
        nbody.go:19     0x10c8c e3a03001        MOVW $1, R3
        nbody.go:19     0x10c90 e58d2034        MOVW R2, 0x34(R13)
        nbody.go:19     0x10c94 e58d4038        MOVW R4, 0x38(R13)
        nbody.go:19     0x10c98 e58d303c        MOVW R3, 0x3c(R13)
        nbody.go:19     0x10c9c e59f0074        MOVW 0x74(R15), R0
        nbody.go:19     0x10ca0 e58d0004        MOVW R0, 0x4(R13)
        nbody.go:19     0x10ca4 e28d001c        ADD $28, R13, R0
        nbody.go:19     0x10ca8 e58d0008        MOVW R0, 0x8(R13)
        nbody.go:19     0x10cac e3a00000        MOVW $0, R0
        nbody.go:19     0x10cb0 e58d000c        MOVW R0, 0xc(R13)
        nbody.go:19     0x10cb4 eb002812        BL runtime.convT2E(SB)
        nbody.go:19     0x10cb8 e59d3010        MOVW 0x10(R13), R3
        nbody.go:19     0x10cbc e59d2014        MOVW 0x14(R13), R2
        nbody.go:19     0x10cc0 e28d0034        ADD $52, R13, R0
        nbody.go:19     0x10cc4 e5900000        MOVW (R0), R0
        nbody.go:19     0x10cc8 e2800000        ADD $0, R0, R0
        nbody.go:19     0x10ccc e58d0004        MOVW R0, 0x4(R13)
        nbody.go:19     0x10cd0 e58d3024        MOVW R3, 0x24(R13)
        nbody.go:19     0x10cd4 e58d3008        MOVW R3, 0x8(R13)
        nbody.go:19     0x10cd8 e58d2028        MOVW R2, 0x28(R13)
        nbody.go:19     0x10cdc e58d200c        MOVW R2, 0xc(R13)
        nbody.go:19     0x10ce0 eb0035d5        BL runtime.writebarrieriface(SB)
        nbody.go:19     0x10ce4 e59d0034        MOVW 0x34(R13), R0
        nbody.go:19     0x10ce8 e58d0004        MOVW R0, 0x4(R13)
        nbody.go:19     0x10cec e59d0038        MOVW 0x38(R13), R0
        nbody.go:19     0x10cf0 e58d0008        MOVW R0, 0x8(R13)
        nbody.go:19     0x10cf4 e59d003c        MOVW 0x3c(R13), R0
        nbody.go:19     0x10cf8 e58d000c        MOVW R0, 0xc(R13)
        nbody.go:19     0x10cfc eb017223        BL fmt.Println(SB)
        nbody.go:20     0x10d00 e49df040        RET #64
        nbody.go:20     0x10d04 eafffffe        B 0x10d04
        nbody.go:20     0x10d08 0011e368        AND.S.EQ R8@>$6, R1, R14
        nbody.go:20     0x10d0c 0011e3e8        AND.S.EQ R8@>$7, R1, R14
        nbody.go:20     0x10d10 0011e3a0        AND.S.EQ R0>>$7, R1, R14
        nbody.go:20     0x10d14 0011e370        AND.S.EQ R0@>R3, R1, R14
        nbody.go:20     0x10d18 000cec78        AND.EQ R8@>R12, R12, R14

While the working version with the additional fmt.Println has:

TEXT main.main(SB) /tmp/nbody.go
        nbody.go:8      0x10c00 e59a1008        MOVW 0x8(R10), R1
        nbody.go:8      0x10c04 e15d0001        CMP R1, R13
        nbody.go:8      0x10c08 91a0300e        MOVW.LS R14, R3
        nbody.go:8      0x10c0c 9b0151e6        BL.LS runtime.morestack_noctxt(SB)
        nbody.go:8      0x10c10 9afffffa        B.LS main.main(SB)
        nbody.go:8      0x10c14 e52de05c        MOVW.W R14, -0x5c(R13)
        nbody.go:9      0x10c18 eb015ed6        BL _sfloat(SB)
        nbody.go:9      0x10c1c e59fb188        MOVW 0x188(R15), R11
        nbody.go:9      0x10c20 ed9b0b00        VLDR [R11], D0
        nbody.go:9      0x10c24 ed8d0b07        VSTR [SP, #28], D0
        nbody.go:11     0x10c28 e59fb180        MOVW 0x180(R15), R11
        nbody.go:11     0x10c2c ed9b2b00        VLDR [R11], D2
        nbody.go:12     0x10c30 e59fb17c        MOVW 0x17c(R15), R11
        nbody.go:12     0x10c34 ed9b4b00        VLDR [R11], D4
        nbody.go:13     0x10c38 e59fb178        MOVW 0x178(R15), R11
        nbody.go:13     0x10c3c ed9b3b00        VLDR [R11], D3
        nbody.go:15     0x10c40 ee220b02        VMUL.F64 D2, D2, D0
        nbody.go:15     0x10c44 ee241b04        VMUL.F64 D4, D4, D1
        nbody.go:15     0x10c48 ee300b01        VADD.F64 D1, D0, D0
        nbody.go:15     0x10c4c ee231b03        VMUL.F64 D3, D3, D1
        nbody.go:15     0x10c50 ee300b01        VADD.F64 D1, D0, D0
        nbody.go:15     0x10c54 eeb02b40        VMOV.F64 D0, D2
        nbody.go:16     0x10c58 ed8d0b09        VSTR [SP, #36], D0
        nbody.go:16     0x10c5c ed8d0b0b        VSTR [SP, #44], D0
        nbody.go:16     0x10c60 e3a00000        MOVW $0, R0
        nbody.go:16     0x10c64 e58d003c        MOVW R0, 0x3c(R13)
        nbody.go:16     0x10c68 e58d0040        MOVW R0, 0x40(R13)
        nbody.go:16     0x10c6c e28d203c        ADD $60, R13, R2
        nbody.go:16     0x10c70 e3520000        CMP $0, R2
        nbody.go:16     0x10c74 05822000        MOVW.EQ R2, (R2)
        nbody.go:16     0x10c78 e3a04001        MOVW $1, R4
        nbody.go:16     0x10c7c e3a03001        MOVW $1, R3
        nbody.go:16     0x10c80 e58d2050        MOVW R2, 0x50(R13)
        nbody.go:16     0x10c84 e58d4054        MOVW R4, 0x54(R13)
        nbody.go:16     0x10c88 e58d3058        MOVW R3, 0x58(R13)
        nbody.go:16     0x10c8c e59f0128        MOVW 0x128(R15), R0
        nbody.go:16     0x10c90 e58d0004        MOVW R0, 0x4(R13)
        nbody.go:16     0x10c94 e28d002c        ADD $44, R13, R0
        nbody.go:16     0x10c98 e58d0008        MOVW R0, 0x8(R13)
        nbody.go:16     0x10c9c e3a00000        MOVW $0, R0
        nbody.go:16     0x10ca0 e58d000c        MOVW R0, 0xc(R13)
        nbody.go:16     0x10ca4 eb00283f        BL runtime.convT2E(SB)
        nbody.go:16     0x10ca8 e59d3010        MOVW 0x10(R13), R3
        nbody.go:16     0x10cac e59d2014        MOVW 0x14(R13), R2
        nbody.go:16     0x10cb0 e28d0050        ADD $80, R13, R0
        nbody.go:16     0x10cb4 e5900000        MOVW (R0), R0
        nbody.go:16     0x10cb8 e2800000        ADD $0, R0, R0
        nbody.go:16     0x10cbc e58d0004        MOVW R0, 0x4(R13)
        nbody.go:16     0x10cc0 e58d3034        MOVW R3, 0x34(R13)
        nbody.go:16     0x10cc4 e58d3008        MOVW R3, 0x8(R13)
        nbody.go:16     0x10cc8 e58d2038        MOVW R2, 0x38(R13)
        nbody.go:16     0x10ccc e58d200c        MOVW R2, 0xc(R13)
        nbody.go:16     0x10cd0 eb003602        BL runtime.writebarrieriface(SB)
        nbody.go:16     0x10cd4 e59d0050        MOVW 0x50(R13), R0
        nbody.go:16     0x10cd8 e58d0004        MOVW R0, 0x4(R13)
        nbody.go:16     0x10cdc e59d0054        MOVW 0x54(R13), R0
        nbody.go:16     0x10ce0 e58d0008        MOVW R0, 0x8(R13)
        nbody.go:16     0x10ce4 e59d0058        MOVW 0x58(R13), R0
        nbody.go:16     0x10ce8 e58d000c        MOVW R0, 0xc(R13)
        nbody.go:16     0x10cec eb017250        BL fmt.Println(SB)
        nbody.go:16     0x10cf0 eb015ea0        BL _sfloat(SB)
        nbody.go:16     0x10cf4 ed9d3b09        VLDR [SP, #36], D3
        nbody.go:18     0x10cf8 eeb10bc3        VSQRT.F64 D3, D0
        nbody.go:19     0x10cfc eb015e9d        BL _sfloat(SB)
        nbody.go:19     0x10d00 ee230b00        VMUL.F64 D0, D3, D0
        nbody.go:19     0x10d04 ed9d2b07        VLDR [SP, #28], D2
        nbody.go:19     0x10d08 ee822b00        VDIV.F64 D0, D2, D2
        nbody.go:19     0x10d0c eeb01b42        VMOV.F64 D2, D1
        nbody.go:21     0x10d10 ed8d2b0b        VSTR [SP, #44], D2
        nbody.go:21     0x10d14 e3a00000        MOVW $0, R0
        nbody.go:21     0x10d18 e58d003c        MOVW R0, 0x3c(R13)
        nbody.go:21     0x10d1c e58d0040        MOVW R0, 0x40(R13)
        nbody.go:21     0x10d20 e28d203c        ADD $60, R13, R2
        nbody.go:21     0x10d24 e3520000        CMP $0, R2
        nbody.go:21     0x10d28 05822000        MOVW.EQ R2, (R2)
        nbody.go:21     0x10d2c e3a03001        MOVW $1, R3
        nbody.go:21     0x10d30 e3a04001        MOVW $1, R4
        nbody.go:21     0x10d34 e58d2044        MOVW R2, 0x44(R13)
        nbody.go:21     0x10d38 e58d3048        MOVW R3, 0x48(R13)
        nbody.go:21     0x10d3c e58d404c        MOVW R4, 0x4c(R13)
        nbody.go:21     0x10d40 e59f0074        MOVW 0x74(R15), R0
        nbody.go:21     0x10d44 e58d0004        MOVW R0, 0x4(R13)
        nbody.go:21     0x10d48 e28d002c        ADD $44, R13, R0
        nbody.go:21     0x10d4c e58d0008        MOVW R0, 0x8(R13)
        nbody.go:21     0x10d50 e3a00000        MOVW $0, R0
        nbody.go:21     0x10d54 e58d000c        MOVW R0, 0xc(R13)
        nbody.go:21     0x10d58 eb002812        BL runtime.convT2E(SB)
        nbody.go:21     0x10d5c e59d3010        MOVW 0x10(R13), R3
        nbody.go:21     0x10d60 e59d2014        MOVW 0x14(R13), R2
        nbody.go:21     0x10d64 e28d0044        ADD $68, R13, R0
        nbody.go:21     0x10d68 e5900000        MOVW (R0), R0
        nbody.go:21     0x10d6c e2800000        ADD $0, R0, R0
        nbody.go:21     0x10d70 e58d0004        MOVW R0, 0x4(R13)
        nbody.go:21     0x10d74 e58d3034        MOVW R3, 0x34(R13)
        nbody.go:21     0x10d78 e58d3008        MOVW R3, 0x8(R13)
        nbody.go:21     0x10d7c e58d2038        MOVW R2, 0x38(R13)
        nbody.go:21     0x10d80 e58d200c        MOVW R2, 0xc(R13)
        nbody.go:21     0x10d84 eb0035d5        BL runtime.writebarrieriface(SB)
        nbody.go:21     0x10d88 e59d0044        MOVW 0x44(R13), R0
        nbody.go:21     0x10d8c e58d0004        MOVW R0, 0x4(R13)
        nbody.go:21     0x10d90 e59d0048        MOVW 0x48(R13), R0
        nbody.go:21     0x10d94 e58d0008        MOVW R0, 0x8(R13)
        nbody.go:21     0x10d98 e59d004c        MOVW 0x4c(R13), R0
        nbody.go:21     0x10d9c e58d000c        MOVW R0, 0xc(R13)
        nbody.go:21     0x10da0 eb017223        BL fmt.Println(SB)
        nbody.go:22     0x10da4 e49df05c        RET #92
        nbody.go:22     0x10da8 eafffffe        B 0x10da8
        nbody.go:22     0x10dac 0011e368        AND.S.EQ R8@>$6, R1, R14
        nbody.go:22     0x10db0 0011e3e8        AND.S.EQ R8@>$7, R1, R14
        nbody.go:22     0x10db4 0011e3a0        AND.S.EQ R0>>$7, R1, R14
        nbody.go:22     0x10db8 0011e370        AND.S.EQ R0@>R3, R1, R14
        nbody.go:22     0x10dbc 000cec78        AND.EQ R8@>R12, R12, R14
@josharian
Copy link
Contributor

Dup of #10629?

@4a6f656c
Copy link
Contributor Author

This was caused by https://go-review.googlesource.com/8356, which failed on the linux-arm-arm5 builder (whereas the previous build completed successfully).

@4a6f656c
Copy link
Contributor Author

@josharian it would seem so (I had searched with "softfloat" instead of "soft float" - seems github is not smart enough to find it :) - I'm reluctant to close this in favour of the other issue since there is a reproducible test case and assembly dumps here...

@josharian
Copy link
Contributor

Closed #10629; we'll leave this one.

@josharian josharian added this to the Go1.5 milestone Apr 30, 2015
@josharian josharian changed the title arm compiler/softfloat bug (GOARM=5) cmd/5g: math.Sqrt mishandled when GOARM=5 Apr 30, 2015
@davecheney
Copy link
Contributor

Thanks for the much more through issue report.

On Fri, 1 May 2015 02:27 Josh Bleecher Snyder notifications@github.com
wrote:

Closed #10629 #10629; we'll leave
this one.


Reply to this email directly or view it on GitHub
#10641 (comment).

@4a6f656c
Copy link
Contributor Author

I've just sent https://go-review.googlesource.com/9524 to disable OSQRT on GOARM=5, which avoids producing incorrect results until the actual problem can be found/fixed.

@gopherbot
Copy link
Contributor

CL https://golang.org/cl/9524 mentions this issue.

@minux
Copy link
Member

minux commented Apr 30, 2015 via email

@minux minux changed the title cmd/5g: math.Sqrt mishandled when GOARM=5 runtime: math.Sqrt mishandled when GOARM=5 Apr 30, 2015
@gopherbot
Copy link
Contributor

CL https://golang.org/cl/9570 mentions this issue.

mk0x9 pushed a commit to mk0x9/go that referenced this issue May 5, 2015
OSQRT currently produces incorrect results when used on arm with softfloat.
Disable it on GOARM=5 until the actual problem is found and fixed.

Updates golang#10641

Change-Id: Ia6f6879fbbb05cb24399c2feee93c1be21113e73
Reviewed-on: https://go-review.googlesource.com/9524
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Dave Cheney <dave@cheney.net>
@minux minux closed this as completed in 102436e May 5, 2015
@gopherbot
Copy link
Contributor

CL https://golang.org/cl/9720 mentions this issue.

minux added a commit that referenced this issue May 5, 2015
I just submitted the real fix for #10641.

This reverts commit 3120adc.

Change-Id: I55051515f697e27ca887ed21c2ac985f0b9b062b
Reviewed-on: https://go-review.googlesource.com/9720
Reviewed-by: Joel Sing <jsing@google.com>
@golang golang locked and limited conversation to collaborators Jun 25, 2016
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

5 participants