strchr.s 840 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. TEXT strchr(SB), $0
  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. TST.NE R4>>8, R3
  27. TST.NE R4>>16, R3
  28. TST.NE R4>>24, R3
  29. BNE _loop
  30. TST R4, R3 /* its somewhere, find it and correct */
  31. BEQ _sub4
  32. TST R4>>8, R3
  33. BEQ _sub3
  34. TST R4>>16, R3
  35. BEQ _sub2
  36. _sub1: /* compensate for pointer increment */
  37. SUB $1, R0
  38. RET
  39. _sub2:
  40. SUB $2, R0
  41. RET
  42. _sub3:
  43. SUB $3, R0
  44. RET
  45. _sub4:
  46. SUB $4, R0
  47. RET