Fix for inline string indexof; added regression tests
diff --git a/vm/compiler/template/out/CompilerTemplateAsm-armv5te.S b/vm/compiler/template/out/CompilerTemplateAsm-armv5te.S
index 75388fb..fbfaf86 100644
--- a/vm/compiler/template/out/CompilerTemplateAsm-armv5te.S
+++ b/vm/compiler/template/out/CompilerTemplateAsm-armv5te.S
@@ -930,81 +930,94 @@
/*
* At this point, we have:
- * value: r0
- * offset: r7
- * count: r8
+ * r0: object pointer
+ * r1: char to match
+ * r2: starting offset
+ * r7: offset
+ * r8: string length
*/
+ /* Build pointer to start of string data */
+ add r0, #16
+ add r0, r0, r7, lsl #1
+
+ /* Save a copy of starting data in r7 */
+ mov r7, r0
+
/* Clamp start to [0..count] */
cmp r2, #0
movlt r2, #0
cmp r2, r8
- movgt r2, r0
+ movgt r2, r8
- /* Fold start & offset, and set data pointer to contents[-1] */
- add r2, r7
+ /* Build pointer to start of data to compare and pre-bias */
add r0, r0, r2, lsl #1
- add r0, #16-2 @ offset to contents[-1]
- add r2, r0, #2 @ remember true start of data
+ sub r0, #2
+
+ /* Compute iteration count */
+ sub r8, r2
/*
* At this point we have:
- * r0: *next[-1] char to test
- * r2: *start
- * r1: char to compare
- * r8: max count
- * r3, r4, r7, r9, r12 available for loading string data
+ * r0: start of data to test
+ * r1: chat to compare
+ * r8: iteration count
+ * r7: original start of string
+ * r3, r4, r9, r10, r11, r12 available for loading string data
*/
- /* Unroll x 4 */
+ sub r8, #4
+ blt indexof_remainder
- cmp r8, #4
- blt do_rest
-loopback_quad:
+indexof_loop4:
ldrh r3, [r0, #2]!
ldrh r4, [r0, #2]!
- ldrh r7, [r0, #2]!
- ldrh r9, [r0, #2]!
+ ldrh r10, [r0, #2]!
+ ldrh r11, [r0, #2]!
cmp r3, r1
beq match_0
cmp r4, r1
beq match_1
- cmp r7, r1
+ cmp r10, r1
beq match_2
- cmp r9, r1
+ cmp r11, r1
beq match_3
subs r8, #4
- bgt loopback_quad
+ bge indexof_loop4
-do_rest:
- cmp r8, #0
- beq no_match
+indexof_remainder:
+ adds r8, #4
+ beq indexof_nomatch
-loopback_indexof:
+indexof_loop1:
ldrh r3, [r0, #2]!
cmp r3, r1
beq match_3
subs r8, #1
- bne loopback_indexof
+ bne indexof_loop1
-no_match:
+indexof_nomatch:
mov r0, #-1
bx lr
match_0:
sub r0, #6
- sub r0, r2
+ sub r0, r7
+ asr r0, r0, #1
bx lr
match_1:
sub r0, #4
- sub r0, r2
+ sub r0, r7
+ asr r0, r0, #1
bx lr
match_2:
sub r0, #2
- sub r0, r2
+ sub r0, r7
+ asr r0, r0, #1
bx lr
match_3:
- sub r0, r2
+ sub r0, r7
+ asr r0, r0, #1
bx lr