/* * String's indexOf. * * Requires r0 to have been previously checked for null. Will * return index of match of r1 in r0. * * IMPORTANT NOTE: * * This code relies on hard-coded offsets for string objects, and must be * kept in sync wth definitions in UtfString.h See asm-constants.h * * On entry: * r0: string object pointer * r1: char to match * r2: Starting offset in string data */ ldr r3, [r0, #STRING_FIELDOFF_VALUE] ldr r7, [r0, #STRING_FIELDOFF_OFFSET] ldr r8, [r0, #STRING_FIELDOFF_COUNT] /* * At this point, we have: * r1: char to match * r2: starting offset * r3: object pointer (final result -> r0) * r7: offset * r8: string length */ /* Build pointer to start of string data */ add r3, #16 add r0, r3, 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, r8 /* Build pointer to start of data to compare and pre-bias */ add r0, r0, r2, lsl #1 sub r0, #2 /* Compute iteration count */ sub r8, r2 /* * At this point we have: * 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 */ subs r8, #4 blt indexof_remainder indexof_loop4: ldrh r3, [r0, #2]! ldrh r4, [r0, #2]! ldrh r10, [r0, #2]! ldrh r11, [r0, #2]! cmp r3, r1 beq match_0 cmp r4, r1 beq match_1 cmp r10, r1 beq match_2 cmp r11, r1 beq match_3 subs r8, #4 bge indexof_loop4 indexof_remainder: adds r8, #4 beq indexof_nomatch indexof_loop1: ldrh r3, [r0, #2]! cmp r3, r1 beq match_3 subs r8, #1 bne indexof_loop1 indexof_nomatch: mov r0, #-1 bx lr match_0: sub r0, #6 sub r0, r7 asr r0, r0, #1 bx lr match_1: sub r0, #4 sub r0, r7 asr r0, r0, #1 bx lr match_2: sub r0, #2 sub r0, r7 asr r0, r0, #1 bx lr match_3: sub r0, r7 asr r0, r0, #1 bx lr