aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>2025-08-06 11:34:12 +0800
committerabner chenc <chenguoqi@loongson.cn>2026-01-28 17:01:37 -0800
commit7f0f67195194cb07122315d5ab563eb617dbe21a (patch)
treef8726a984eff7a4de1b88d6d309923f2c08972fc
parent985b0b3fe26661c10a3201470e80685765656363 (diff)
downloadgo-7f0f67195194cb07122315d5ab563eb617dbe21a.tar.xz
math: optimize the floating-point pipeline on loong64
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>
-rw-r--r--src/math/exp_loong64.s16
1 files changed, 4 insertions, 12 deletions
diff --git a/src/math/exp_loong64.s b/src/math/exp_loong64.s
index bf2823f888..8420a2254e 100644
--- a/src/math/exp_loong64.s
+++ b/src/math/exp_loong64.s
@@ -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