aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbill_ofarrell <billo@ca.ibm.com>2018-06-28 18:39:37 -0400
committerIan Lance Taylor <iant@golang.org>2018-07-17 02:26:40 +0000
commitf865b5fefeafaf76ce6ff99e44d41c52cb6b884b (patch)
treedce65e05878000deedd909a2bce86c18d2face41
parent1746cff738c7c801988f18cd25ca0cb488889873 (diff)
downloadgo-release-branch.go1.9.tar.gz
go-release-branch.go1.9.zip
[release-branch.go1.9] bytes, strings: fix comparison of long byte slices on s390xrelease-branch.go1.9
The existing implementation of bytes.Compare on s390x doesn't work properly for slices longer than 256 elements. This change fixes that. Added tests for long strings and slices of bytes. Fixes #26118 Change-Id: If6d8b68ee6dbcf99a24f867a1d3438b1f208954f Reviewed-on: https://go-review.googlesource.com/121495 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-on: https://go-review.googlesource.com/124137 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/bytes/compare_test.go15
-rw-r--r--src/runtime/asm_s390x.s2
-rw-r--r--src/strings/compare_test.go15
3 files changed, 28 insertions, 4 deletions
diff --git a/src/bytes/compare_test.go b/src/bytes/compare_test.go
index 35088a1b2e..3e33c27c9c 100644
--- a/src/bytes/compare_test.go
+++ b/src/bytes/compare_test.go
@@ -6,6 +6,7 @@ package bytes_test
import (
. "bytes"
+ "internal/testenv"
"testing"
)
@@ -58,10 +59,20 @@ func TestCompareIdenticalSlice(t *testing.T) {
}
func TestCompareBytes(t *testing.T) {
- n := 128
+ lengths := make([]int, 0) // lengths to test in ascending order
+ for i := 0; i <= 128; i++ {
+ lengths = append(lengths, i)
+ }
+ lengths = append(lengths, 256, 512, 1024, 1333, 4095, 4096, 4097)
+
+ if !testing.Short() || testenv.Builder() != "" {
+ lengths = append(lengths, 65535, 65536, 65537, 99999)
+ }
+
+ n := lengths[len(lengths)-1]
a := make([]byte, n+1)
b := make([]byte, n+1)
- for len := 0; len < 128; len++ {
+ for _, len := range lengths {
// randomish but deterministic data. No 0 or 255.
for i := 0; i < len; i++ {
a[i] = byte(1 + 31*i%254)
diff --git a/src/runtime/asm_s390x.s b/src/runtime/asm_s390x.s
index 20e740b927..686e3db411 100644
--- a/src/runtime/asm_s390x.s
+++ b/src/runtime/asm_s390x.s
@@ -1004,6 +1004,8 @@ loop:
BGT gt
BLT lt
SUB $256, R8
+ MOVD $256(R3), R3
+ MOVD $256(R5), R5
CMP R8, $256
BGT loop
tail:
diff --git a/src/strings/compare_test.go b/src/strings/compare_test.go
index bc12e421b0..712e5a741e 100644
--- a/src/strings/compare_test.go
+++ b/src/strings/compare_test.go
@@ -8,6 +8,7 @@ package strings_test
// Benchmarks omitted since the underlying implementation is identical.
import (
+ "internal/testenv"
. "strings"
"testing"
)
@@ -52,10 +53,20 @@ func TestCompareIdenticalString(t *testing.T) {
}
func TestCompareStrings(t *testing.T) {
- n := 128
+ lengths := make([]int, 0) // lengths to test in ascending order
+ for i := 0; i <= 128; i++ {
+ lengths = append(lengths, i)
+ }
+ lengths = append(lengths, 256, 512, 1024, 1333, 4095, 4096, 4097)
+
+ if !testing.Short() || testenv.Builder() != "" {
+ lengths = append(lengths, 65535, 65536, 65537, 99999)
+ }
+
+ n := lengths[len(lengths)-1]
a := make([]byte, n+1)
b := make([]byte, n+1)
- for len := 0; len < 128; len++ {
+ for _, len := range lengths {
// randomish but deterministic data. No 0 or 255.
for i := 0; i < len; i++ {
a[i] = byte(1 + 31*i%254)