From: Archana R Date: Fri, 28 Oct 2022 07:42:39 +0000 (-0500) Subject: internal/bytealg: fix bug in index function for ppc64le/power9 X-Git-Tag: go1.20rc1~502 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6774ddfec758ecf2cc64d58392c438dd64660a00;p=gostls13.git 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 Reviewed-by: Heschi Kreinick Reviewed-by: Lynn Boger TryBot-Result: Gopher Robot Run-TryBot: Archana Ravindar --- diff --git a/src/internal/bytealg/index_ppc64x.s b/src/internal/bytealg/index_ppc64x.s index 38442ce27c..735159cd8e 100644 --- a/src/internal/bytealg/index_ppc64x.s +++ b/src/internal/bytealg/index_ppc64x.s @@ -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: diff --git a/src/strings/strings_test.go b/src/strings/strings_test.go index 27489c2d16..3991d12751 100644 --- a/src/strings/strings_test.go +++ b/src/strings/strings_test.go @@ -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},