1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
TEXT strchr(SB), $-4
MOVBU c+4(FP), R1
CMP $0, R1
BEQ _null
_strchr: /* not looking for a null, byte at a time */
MOVBU.P 1(R0), R2
CMP R1, R2
BEQ _sub1
CMP $0, R2
BNE _strchr
_return0: /* character not found in string, return 0 */
MOVW $0, R0
RET
_null: /* looking for null, align */
AND.S $3, R0, R2
BEQ _aligned
MOVBU.P 1(R0), R4
CMP $0, R4
BEQ _sub1
B _null
_aligned:
MOVW $0xFF, R3 /* mask */
_loop:
MOVW.P 4(R0), R4 /* 4 at a time */
TST R4, R3 /* AND.S R2, R3, Rx */
TST.NE R4>>8, R3
TST.NE R4>>16, R3
TST.NE R4>>24, R3
BNE _loop
TST R4, R3 /* its somewhere, find it and correct */
BEQ _sub4
TST R4>>8, R3
BEQ _sub3
TST R4>>16, R3
BEQ _sub2
_sub1: /* compensate for pointer increment */
SUB $1, R0
RET
_sub2:
SUB $2, R0
RET
_sub3:
SUB $3, R0
RET
_sub4:
SUB $4, R0
RET
|