1 /* 2 * String's indexOf. 3 * 4 * Requires a0 to have been previously checked for null. Will 5 * return index of match of a1 in v0. 6 * 7 * IMPORTANT NOTE: 8 * 9 * This code relies on hard-coded offsets for string objects, and must be 10 * kept in sync wth definitions in UtfString.h See asm-constants.h 11 * 12 * On entry: 13 * a0: string object pointer 14 * a1: char to match 15 * a2: Starting offset in string data 16 */ 17 18 lw t0, STRING_FIELDOFF_OFFSET(a0) 19 lw t1, STRING_FIELDOFF_COUNT(a0) 20 lw v0, STRING_FIELDOFF_VALUE(a0) 21 22 /* 23 * At this point, we have: 24 * v0: object pointer 25 * a1: char to match 26 * a2: starting offset 27 * t0: offset 28 * t1: string length 29 */ 30 31 /* Point to first element */ 32 addu v0, 16 # point to contents[0] 33 34 /* Build pointer to start of string data */ 35 sll t7, t0, 1 # multiply offset by 2 36 addu v0, v0, t7 37 38 /* Save a copy of starting data in v1 */ 39 move v1, v0 40 41 /* Clamp start to [0..count] */ 42 slt t7, a2, zero 43 movn a2, zero, t7 44 sgt t7, a2, t1 45 movn a2, t1, t7 46 47 /* Build pointer to start of data to compare */ 48 sll t7, a2, 1 # multiply offset by 2 49 addu v0, v0, t7 50 51 /* Compute iteration count */ 52 subu a3, t1, a2 53 54 /* 55 * At this point we have: 56 * v0: start of data to test 57 * a1: char to compare 58 * a3: iteration count 59 * v1: original start of string 60 * t0-t7 available for loading string data 61 */ 62 subu a3, 4 63 bltz a3, indexof_remainder 64 65 indexof_loop4: 66 lhu t0, 0(v0) 67 beq t0, a1, match_0 68 lhu t0, 2(v0) 69 beq t0, a1, match_1 70 lhu t0, 4(v0) 71 beq t0, a1, match_2 72 lhu t0, 6(v0) 73 beq t0, a1, match_3 74 addu v0, 8 # offset to contents[i+4] 75 subu a3, 4 76 bgez a3, indexof_loop4 77 78 indexof_remainder: 79 addu a3, 4 80 beqz a3, indexof_nomatch 81 82 indexof_loop1: 83 lhu t0, 0(v0) 84 beq t0, a1, match_0 85 addu v0, 2 # offset to contents[i+1] 86 subu a3, 1 87 bnez a3, indexof_loop1 88 89 indexof_nomatch: 90 li v0, -1 91 RETURN 92 93 match_0: 94 subu v0, v1 95 sra v0, v0, 1 # divide by 2 96 RETURN 97 match_1: 98 addu v0, 2 99 subu v0, v1 100 sra v0, v0, 1 # divide by 2 101 RETURN 102 match_2: 103 addu v0, 4 104 subu v0, v1 105 sra v0, v0, 1 # divide by 2 106 RETURN 107 match_3: 108 addu v0, 6 109 subu v0, v1 110 sra v0, v0, 1 # divide by 2 111 RETURN 112