]> Cypherpunks repositories - gostls13.git/commitdiff
math: optimize the floating-point pipeline on loong64
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>
Wed, 6 Aug 2025 03:34:12 +0000 (11:34 +0800)
committerabner chenc <chenguoqi@loongson.cn>
Thu, 29 Jan 2026 01:01:37 +0000 (17:01 -0800)
Using the FSEL instruction on loong64 to eliminate branches and reduce
pipeline interruptions.

On the Loongson CPU 3A6000, there is a 0.09% performance improvement, as follows:
goos: linux
goarch: loong64
pkg: math/big
cpu: Loongson-3A6000-HV @ 2500.00MHz
        │  old.bench  │             new.bench              │
        │   sec/op    │   sec/op     vs base               │
Exp       7.748m ± 0%   7.740m ± 0%  -0.10% (p=0.001 n=10)
Exp2      7.747m ± 0%   7.741m ± 0%  -0.09% (p=0.002 n=10)
geomean   7.747m        7.740m       -0.09%

Change-Id: If62f2e81bf345c83a1fa9350ace131240cfa3b9b
Reviewed-on: https://go-review.googlesource.com/c/go/+/693458
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Meidan Li <limeidan@loongson.cn>
src/math/exp_loong64.s

index bf2823f888510b61562d1b1490dc7bf3dd227e84..8420a2254e148bd0482875ad337805af3752db88 100644 (file)
@@ -62,13 +62,9 @@ TEXT ·archExp(SB),$0-16
        MOVD    8(R10), F3
        MOVD    48(R10), F2
        CMPGTD  F0, F5, FCC0
-       BFPT    add             // x > 0
-sub:
-       FMSUBD  F3, F2, F0, F3  // Log2e*x - 0.5
-       JMP     2(PC)
-add:
+       FMSUBD  F3, F2, F0, F4  // Log2e*x - 0.5
        FMADDD  F3, F2, F0, F3  // Log2e*x + 0.5
-
+       FSEL    FCC0, F3, F4, F3
        FTINTRZVD F3, F4        // float64 -> int64
        MOVV    F4, R5          // R5 = int(k)
        FFINTDV F4, F3          // int64 -> float64
@@ -162,13 +158,9 @@ TEXT ·archExp2(SB),$0-16
        MOVD    0(R10), F10
        MOVD    8(R10), F2
        CMPGTD  F0, F10, FCC0
-       BFPT    add
-sub:
-       SUBD    F2, F0, F3      // x - 0.5
-       JMP     2(PC)
-add:
+       SUBD    F2, F0, F4      // x - 0.5
        ADDD    F2, F0, F3      // x + 0.5
-
+       FSEL    FCC0, F3, F4, F3
        FTINTRZVD F3, F4
        MOVV    F4, R5
        FFINTDV F4, F3