]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.10] bytes, strings: fix comparison of long byte slices on s390x
authorbill_ofarrell <billo@ca.ibm.com>
Thu, 28 Jun 2018 22:39:37 +0000 (18:39 -0400)
committerIan Lance Taylor <iant@golang.org>
Mon, 16 Jul 2018 19:59:17 +0000 (19:59 +0000)
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>
src/bytes/compare_test.go
src/runtime/asm_s390x.s
src/strings/compare_test.go

index 35088a1b2e9b26691a6f0a0bed6611e0bb6b563e..3e33c27c9c961164419f1c2b68f80c96e5a8aa1f 100644 (file)
@@ -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)
index 6b71830557707b64ae950f71d8b925e2d614710b..8b7a98d0c8c67a9234b43f4c58968690f481de63 100644 (file)
@@ -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:
index bc12e421b0dd7919b680a641da1b96c5bb951631..712e5a741eae2878e33de6d488a9bf25f5efb0fe 100644 (file)
@@ -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)