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
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:
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:
{"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},