strchr-thumb.s 745 B

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