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-16 19:59:17 +0000
commit0931e9fef3d0a654a86fdee57a05f4937265e291 (patch)
tree5eec5af866c58224c157473be6ed1accbefaacc9
parentb5375d70d1d626595ec68568b68cc28dddc859d1 (diff)
downloadgo-0931e9fef3d0a654a86fdee57a05f4937265e291.tar.gz
go-0931e9fef3d0a654a86fdee57a05f4937265e291.zip
[release-branch.go1.10] bytes, strings: fix comparison of long byte slices on s390x
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 #26117 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/124016 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 6b71830557..8b7a98d0c8 100644
--- a/src/runtime/asm_s390x.s
+++ b/src/runtime/asm_s390x.s
@@ -1032,6 +1032,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)