1
0
mirror of https://github.com/golang/go synced 2024-11-23 00:20:12 -07:00

internal/bytealg: fix bug in index function for ppc64le/power9

The index function was not handling certain corner cases where there
were two more bytes to be examined in the tail end of the string to
complete the comparison. Fix code to ensure that when the string has
to be shifted two more times the correct bytes are examined.
Also hoisted vsplat to V10 so that all paths use the correct value.
Some comments had incorrect register names and corrected the same.
Added the strings that were failing to strings test for verification.

Fixes #56457

Change-Id: Idba7cbc802e3d73c8f4fe89309871cc8447792f5
Reviewed-on: https://go-review.googlesource.com/c/go/+/446135
Reviewed-by: Bryan Mills <bcmills@google.com>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Archana Ravindar <ravindararchana@gmail.com>
This commit is contained in:
Archana R 2022-10-28 02:42:39 -05:00 committed by Lynn Boger
parent e09bbaec69
commit 6774ddfec7
2 changed files with 11 additions and 5 deletions

View File

@ -614,7 +614,7 @@ index4loop:
next4:
VSPLTISB $0, V10 // Clear
MOVD $3, R9 // Number of bytes beyond 16
LXVB16X (R7)(R9), V3 // Load 16 bytes @R7 into V2
LXVB16X (R7)(R9), V3 // Load 16 bytes @R7 into V3
VSLDOI $13, V3, V10, V3 // Shift left last 3 bytes
VSLDOI $1, V2, V3, V4 // V4=(V2:V3)<<1
VSLDOI $2, V2, V3, V9 // V9=(V2:V3)<<2
@ -654,11 +654,11 @@ index2to16:
ADD $19, R7, R9 // To check 4 indices per iteration, need at least 16+3 bytes
CMP R9, LASTBYTE
BGT index2to16tail
// At least 16 bytes of string left
// Mask the number of bytes in sep
VSPLTISB $0, V10 // Clear
BGT index2to16tail
MOVD $3, R17 // Number of bytes beyond 16
index2to16loop:
@ -720,14 +720,15 @@ extra2:
ADD $1, R7 // Not found, try next partial string
CMP R7, LASTSTR // Check for end of string
BGT notfound // If at end, then not found
VSLDOI $1, V1, V25, V1 // Shift string left by 1 byte
VOR V1, V1, V4 // save remaining string
VSLDOI $1, V1, V25, V1 // Shift string left by 1 byte for 17th byte
VAND V1, SEPMASK, V2 // Just compare size of sep
VCMPEQUBCC V0, V2, V3 // Compare sep and partial string
BLT CR6, found // Found
ADD $1, R7 // Not found, try next partial string
CMP R7, LASTSTR // Check for end of string
BGT notfound // If at end, then not found
VSLDOI $1, V1, V25, V1 // Shift string left by 1 byte
VSLDOI $2, V4, V25, V1 // Shift saved string left by 2 bytes for 18th byte
BR index2to16next // Check the remaining partial string in index2to16next
short:

View File

@ -54,6 +54,11 @@ var indexTests = []IndexTest{
{"foo", "", 0},
{"foo", "o", 1},
{"abcABCabc", "A", 3},
{"jrzm6jjhorimglljrea4w3rlgosts0w2gia17hno2td4qd1jz", "jz", 47},
{"ekkuk5oft4eq0ocpacknhwouic1uua46unx12l37nioq9wbpnocqks6", "ks6", 52},
{"999f2xmimunbuyew5vrkla9cpwhmxan8o98ec", "98ec", 33},
{"9lpt9r98i04k8bz6c6dsrthb96bhi", "96bhi", 24},
{"55u558eqfaod2r2gu42xxsu631xf0zobs5840vl", "5840vl", 33},
// cases with one byte strings - test special case in Index()
{"", "a", -1},
{"x", "a", -1},