From 045ceb72406ee725fd0ea9b8267e8bcd4d2afd5b Mon Sep 17 00:00:00 2001 From: Guoqi Chen Date: Wed, 4 Feb 2026 15:25:07 +0800 Subject: [PATCH] cmd/compile: allow equal functions to perform unaligned load on loong64 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The Go compiler always generates Loong64 binaries, which can execute any processor of LA364, LA464, LA664 or higher core. And these processors support unaligned memory access [1]. goos: linux goarch: loong64 pkg: strings cpu: Loongson-3A6000 @ 2500.00MHz | old.txt | new.txt | | sec/op | sec/op vs base | StringPrefix3 4.0040n ± 0% 0.4003n ± 0% -90.00% (p=0.000 n=10) StringPrefix5 4.0040n ± 0% 0.4003n ± 0% -90.00% (p=0.000 n=10) StringPrefix6 3.6030n ± 0% 0.4002n ± 0% -88.89% (p=0.000 n=10) StringPrefix7 4.0040n ± 0% 0.4002n ± 0% -90.00% (p=0.000 n=10) geomean 3.900n 0.4003n -89.74% goos: linux goarch: loong64 pkg: strings cpu: Loongson-3A5000-HV @ 2500.00MHz | old.txt │ new.txt | | sec/op │ sec/op vs base | StringPrefix3 5.6160n ± 0% 0.4011n ± 0% -92.86% (p=0.000 n=10) StringPrefix5 5.6180n ± 0% 0.4011n ± 0% -92.86% (p=0.000 n=10) StringPrefix6 5.2170n ± 0% 0.4011n ± 0% -92.31% (p=0.000 n=10) StringPrefix7 5.6170n ± 0% 0.4009n ± 0% -92.86% (p=0.000 n=10) geomean 5.514n 0.4010n -92.73% goos: linux goarch: loong64 pkg: strings cpu: Loongson-3B6000M @ 2400.00MHz | old.txt │ new.txt | | sec/op │ sec/op vs base | StringPrefix3 5.0060n ± 0% 0.4223n ± 1% -91.56% (p=0.000 n=10) StringPrefix5 4.5890n ± 0% 0.4214n ± 0% -90.82% (p=0.000 n=10) StringPrefix6 4.5890n ± 0% 0.4190n ± 1% -90.87% (p=0.000 n=10) StringPrefix7 4.5890n ± 0% 0.4226n ± 1% -90.79% (p=0.000 n=10) geomean 4.690n 0.4213n -91.02% [1]: https://go.dev/wiki/MinimumRequirements#loong64 Change-Id: I1870080e0122a7d136685e3045699d0cf1e4194d Reviewed-on: https://go-review.googlesource.com/c/go/+/742260 LUCI-TryBot-Result: Go LUCI Reviewed-by: Meidan Li Reviewed-by: Michael Pratt Reviewed-by: Michael Knyszek Auto-Submit: Michael Pratt --- src/cmd/internal/sys/arch.go | 2 +- test/codegen/comparisons.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/cmd/internal/sys/arch.go b/src/cmd/internal/sys/arch.go index 14b1cde22b..2738fe3b54 100644 --- a/src/cmd/internal/sys/arch.go +++ b/src/cmd/internal/sys/arch.go @@ -143,7 +143,7 @@ var ArchLoong64 = &Arch{ PtrSize: 8, RegSize: 8, MinLC: 4, - Alignment: 8, // Unaligned accesses are not guaranteed to be fast + Alignment: 1, CanMergeLoads: true, CanJumpTable: true, HasLR: true, diff --git a/test/codegen/comparisons.go b/test/codegen/comparisons.go index 70852377f7..330497c656 100644 --- a/test/codegen/comparisons.go +++ b/test/codegen/comparisons.go @@ -597,6 +597,7 @@ func equalConstString1() bool { b := string("Z") // amd64:-".*memequal" // arm64:-".*memequal" + // loong64:-".*memequal" // ppc64x:-".*memequal" return a == b } @@ -605,6 +606,7 @@ func equalVarString1(a string) bool { b := string("Z") // amd64:-".*memequal" // arm64:-".*memequal" + // loong64:-".*memequal" // ppc64x:-".*memequal" return a[:1] == b } @@ -614,6 +616,7 @@ func equalConstString2() bool { b := string("ZZ") // amd64:-".*memequal" // arm64:-".*memequal" + // loong64:-".*memequal" // ppc64x:-".*memequal" return a == b } @@ -622,6 +625,7 @@ func equalVarString2(a string) bool { b := string("ZZ") // amd64:-".*memequal" // arm64:-".*memequal" + // loong64:-".*memequal" // ppc64x:-".*memequal" return a[:2] == b } @@ -631,6 +635,7 @@ func equalConstString4() bool { b := string("ZZZZ") // amd64:-".*memequal" // arm64:-".*memequal" + // loong64:-".*memequal" // ppc64x:-".*memequal" return a == b } @@ -639,6 +644,7 @@ func equalVarString4(a string) bool { b := string("ZZZZ") // amd64:-".*memequal" // arm64:-".*memequal" + // loong64:-".*memequal" // ppc64x:-".*memequal" return a[:4] == b } @@ -648,6 +654,7 @@ func equalConstString8() bool { b := string("ZZZZZZZZ") // amd64:-".*memequal" // arm64:-".*memequal" + // loong64:-".*memequal" // ppc64x:-".*memequal" return a == b } @@ -656,6 +663,7 @@ func equalVarString8(a string) bool { b := string("ZZZZZZZZ") // amd64:-".*memequal" // arm64:-".*memequal" + // loong64:-".*memequal" // ppc64x:-".*memequal" return a[:8] == b } -- 2.52.0