]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.17] runtime: use correct constant when computing nsec remainder
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 4 Nov 2021 23:10:31 +0000 (00:10 +0100)
committerHeschi Kreinick <heschi@google.com>
Wed, 24 Nov 2021 19:34:05 +0000 (19:34 +0000)
A code comment on amd64 for windows and plan9 contained a snippet for
splitting apart the sec and nsec components of a unix timestamp, with
produced assembly below, which was then cleaned up by hand. When arm64
was ported, that code snippet in the comment went through the compiler
to produce some code that was then pasted and cleaned up. Unfortunately,
the comment had a typo in it, containing 8 zeros instead of 9.

This resulted in the constant used in the assembly being wrong, spotted
by @bufflig's eagle eyes. So, this commit fixes the comment on all three
platforms, and the assembly on windows/arm64.

Updates #48072.
Fixes #49369.

Change-Id: I786fe89147328b0d25544f52c927ddfdb9f6f1cf
Reviewed-on: https://go-review.googlesource.com/c/go/+/361474
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com>
Reviewed-by: Patrik Nyblom <pnyb@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-on: https://go-review.googlesource.com/c/go/+/361476

src/runtime/sys_plan9_amd64.s
src/runtime/time_windows_amd64.s
src/runtime/time_windows_arm64.s

index 731306ab448463217fd5a8dd1a5ab273d081e386..068200b7f362981e11898b53c4c0bba964c282ac 100644 (file)
@@ -94,7 +94,7 @@ TEXT runtime·walltime(SB),NOSPLIT,$8-12
        MOVQ    0(SP), AX
 
        // generated code for
-       //      func f(x uint64) (uint64, uint64) { return x/1000000000, x%100000000 }
+       //      func f(x uint64) (uint64, uint64) { return x/1000000000, x%1000000000 }
        // adapted to reduce duplication
        MOVQ    AX, CX
        MOVQ    $1360296554856532783, AX
index 045f64eb463fdbd466ee300f50f29b6d9cd293f9..70f6a008cddcec563802d8fcbf927b2ff959e70a 100644 (file)
@@ -25,7 +25,7 @@ TEXT time·now(SB),NOSPLIT,$0-24
        IMULQ   $100, AX
 
        // generated code for
-       //      func f(x uint64) (uint64, uint64) { return x/1000000000, x%100000000 }
+       //      func f(x uint64) (uint64, uint64) { return x/1000000000, x%1000000000 }
        // adapted to reduce duplication
        MOVQ    AX, CX
        MOVQ    $1360296554856532783, AX
index e8a0eb2f932f9a1ca335efc71ff5ab4d38da3b23..ef5b84847379fb217cd0f8db136ae7a992827413 100644 (file)
@@ -32,17 +32,14 @@ TEXT time·now(SB),NOSPLIT|NOFRAME,$0-24
        // Code stolen from compiler output for:
        //
        //      var x uint64
-       //      func f() (sec uint64, nsec uint32) { return x / 1000000000, uint32(x % 100000000) }
+       //      func f() (sec uint64, nsec uint32) { return x / 1000000000, uint32(x % 1000000000) }
        //
        LSR     $1, R0, R1
        MOVD    $-8543223759426509416, R2
-       UMULH   R2, R1, R1
+       UMULH   R1, R2, R1
        LSR     $28, R1, R1
        MOVD    R1, sec+0(FP)
-       MOVD    $-6067343680855748867, R1
-       UMULH   R0, R1, R1
-       LSR     $26, R1, R1
-       MOVD    $100000000, R2
+       MOVD    $1000000000, R2
        MSUB    R1, R0, R2, R0
        MOVW    R0, nsec+8(FP)
        RET