memccpy.s 674 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. TEXT memccpy(SB),$0
  2. MOVL n+24(FP), CX
  3. CMPL CX, $0
  4. JEQ none
  5. MOVQ p2+8(FP), DI
  6. MOVBLZX c+16(FP), AX
  7. CLD
  8. /*
  9. * find the character in the second string
  10. */
  11. REPN; SCASB
  12. JEQ found
  13. /*
  14. * if not found, set count to 'n'
  15. */
  16. none:
  17. MOVL $0, AX
  18. MOVL n+24(FP), BX
  19. JMP memcpy
  20. /*
  21. * if found, set count to bytes thru character
  22. */
  23. found:
  24. MOVQ DI, AX
  25. SUBQ p2+8(FP), AX
  26. MOVQ AX, BX
  27. ADDQ RARG, AX
  28. /*
  29. * copy the memory
  30. */
  31. memcpy:
  32. MOVQ RARG, DI
  33. MOVQ p2+8(FP), SI
  34. /*
  35. * copy whole longs, if aligned
  36. */
  37. MOVQ DI, DX
  38. ORQ SI, DX
  39. ANDL $3, DX
  40. JNE c3
  41. MOVL BX, CX
  42. SHRQ $2, CX
  43. REP; MOVSL
  44. /*
  45. * copy the rest, by bytes
  46. */
  47. ANDL $3, BX
  48. c3:
  49. MOVL BX, CX
  50. REP; MOVSB
  51. RET