180ee5cbfSDavid du ColombierTEXT strchr(SB), $-4 280ee5cbfSDavid du Colombier MOVBU c+4(FP), R1 380ee5cbfSDavid du Colombier CMP $0, R1 480ee5cbfSDavid du Colombier BEQ _null 580ee5cbfSDavid du Colombier 680ee5cbfSDavid du Colombier_strchr: /* not looking for a null, byte at a time */ 780ee5cbfSDavid du Colombier MOVBU.P 1(R0), R2 880ee5cbfSDavid du Colombier CMP R1, R2 980ee5cbfSDavid du Colombier BEQ _sub1 1080ee5cbfSDavid du Colombier 1180ee5cbfSDavid du Colombier CMP $0, R2 1280ee5cbfSDavid du Colombier BNE _strchr 1380ee5cbfSDavid du Colombier 1480ee5cbfSDavid du Colombier_return0: /* character not found in string, return 0 */ 1580ee5cbfSDavid du Colombier MOVW $0, R0 1680ee5cbfSDavid du Colombier RET 1780ee5cbfSDavid du Colombier 1880ee5cbfSDavid du Colombier_null: /* looking for null, align */ 1980ee5cbfSDavid du Colombier AND.S $3, R0, R2 2080ee5cbfSDavid du Colombier BEQ _aligned 2180ee5cbfSDavid du Colombier 2280ee5cbfSDavid du Colombier MOVBU.P 1(R0), R4 2380ee5cbfSDavid du Colombier CMP $0, R4 2480ee5cbfSDavid du Colombier BEQ _sub1 2580ee5cbfSDavid du Colombier B _null 2680ee5cbfSDavid du Colombier 2780ee5cbfSDavid du Colombier_aligned: 2880ee5cbfSDavid du Colombier MOVW $0xFF, R3 /* mask */ 2980ee5cbfSDavid du Colombier 3080ee5cbfSDavid du Colombier_loop: 3180ee5cbfSDavid du Colombier MOVW.P 4(R0), R4 /* 4 at a time */ 3280ee5cbfSDavid du Colombier TST R4, R3 /* AND.S R2, R3, Rx */ 33*2ddf2468SDavid du Colombier TST.NE R4>>8, R3 34*2ddf2468SDavid du Colombier TST.NE R4>>16, R3 35*2ddf2468SDavid du Colombier TST.NE R4>>24, R3 36*2ddf2468SDavid du Colombier BNE _loop 37*2ddf2468SDavid du Colombier 38*2ddf2468SDavid du Colombier TST R4, R3 /* its somewhere, find it and correct */ 3980ee5cbfSDavid du Colombier BEQ _sub4 4080ee5cbfSDavid du Colombier TST R4>>8, R3 4180ee5cbfSDavid du Colombier BEQ _sub3 4280ee5cbfSDavid du Colombier TST R4>>16, R3 4380ee5cbfSDavid du Colombier BEQ _sub2 4480ee5cbfSDavid du Colombier 4580ee5cbfSDavid du Colombier_sub1: /* compensate for pointer increment */ 4680ee5cbfSDavid du Colombier SUB $1, R0 4780ee5cbfSDavid du Colombier RET 4880ee5cbfSDavid du Colombier_sub2: 4980ee5cbfSDavid du Colombier SUB $2, R0 5080ee5cbfSDavid du Colombier RET 5180ee5cbfSDavid du Colombier_sub3: 5280ee5cbfSDavid du Colombier SUB $3, R0 5380ee5cbfSDavid du Colombier RET 5480ee5cbfSDavid du Colombier_sub4: 5580ee5cbfSDavid du Colombier SUB $4, R0 5680ee5cbfSDavid du Colombier RET 57