Commit 429bbf33 authored by Ilya Tocar's avatar Ilya Tocar Committed by Nigel Tao

strings: fix and reenable amd64 Index for 17-31 byte strings

Fixes #15689

Change-Id: I56d0103738cc35cd5bc5e77a0e0341c0dd55530e
Reviewed-on: https://go-review.googlesource.com/23440Reviewed-by: 's avatarKeith Randall <khr@golang.org>
Run-TryBot: Ilya Tocar <ilya.tocar@intel.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarNigel Tao <nigeltao@golang.org>
parent 42da35c6
...@@ -1787,7 +1787,7 @@ partial_success9to15: ...@@ -1787,7 +1787,7 @@ partial_success9to15:
JB loop9to15 JB loop9to15
JMP fail JMP fail
_16_or_more: _16_or_more:
CMPQ AX, $17 CMPQ AX, $16
JA _17_to_31 JA _17_to_31
MOVOU (BP), X1 MOVOU (BP), X1
LEAQ -15(DI)(DX*1), DX LEAQ -15(DI)(DX*1), DX
...@@ -1801,7 +1801,6 @@ loop16: ...@@ -1801,7 +1801,6 @@ loop16:
CMPQ DI,DX CMPQ DI,DX
JB loop16 JB loop16
JMP fail JMP fail
//TODO: the code below is wrong. Fix it. See #15679.
_17_to_31: _17_to_31:
LEAQ 1(DI)(DX*1), DX LEAQ 1(DI)(DX*1), DX
SUBQ AX, DX SUBQ AX, DX
......
...@@ -7,7 +7,7 @@ package strings ...@@ -7,7 +7,7 @@ package strings
// indexShortStr returns the index of the first instance of c in s, or -1 if c is not present in s. // indexShortStr returns the index of the first instance of c in s, or -1 if c is not present in s.
// indexShortStr requires 2 <= len(c) <= shortStringLen // indexShortStr requires 2 <= len(c) <= shortStringLen
func indexShortStr(s, c string) int // ../runtime/asm_$GOARCH.s func indexShortStr(s, c string) int // ../runtime/asm_$GOARCH.s
const shortStringLen = 16 // TODO: restore to 31 when #15679 is fixed const shortStringLen = 31
// Index returns the index of the first instance of sep in s, or -1 if sep is not present in s. // Index returns the index of the first instance of sep in s, or -1 if sep is not present in s.
func Index(s, sep string) int { func Index(s, sep string) int {
......
...@@ -190,6 +190,43 @@ func TestLastIndexByte(t *testing.T) { ...@@ -190,6 +190,43 @@ func TestLastIndexByte(t *testing.T) {
} }
} }
func simpleIndex(s, sep string) int {
n := len(sep)
for i := n; i <= len(s); i++ {
if s[i-n:i] == sep {
return i - n
}
}
return -1
}
func TestIndexRandom(t *testing.T) {
const chars = "abcdefghijklmnopqrstuvwxyz0123456789"
for times := 0; times < 10; times++ {
for strLen := 5 + rand.Intn(5); strLen < 140; strLen += 10 { // Arbitrary
s1 := make([]byte, strLen)
for i := range s1 {
s1[i] = chars[rand.Intn(len(chars))]
}
s := string(s1)
for i := 0; i < 50; i++ {
begin := rand.Intn(len(s) + 1)
end := begin + rand.Intn(len(s)+1-begin)
sep := s[begin:end]
if i%4 == 0 {
pos := rand.Intn(len(sep) + 1)
sep = sep[:pos] + "A" + sep[pos:]
}
want := simpleIndex(s, sep)
res := Index(s, sep)
if res != want {
t.Errorf("Index(%s,%s) = %d; want %d", s, sep, res, want)
}
}
}
}
}
var indexRuneTests = []struct { var indexRuneTests = []struct {
s string s string
rune rune rune rune
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment