memcmp.s 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. TEXT memcmp(SB), $0
  2. /*
  3. * performance:
  4. * (tba)
  5. */
  6. MOVW R7, 0(FP)
  7. MOVW n+8(FP), R9 /* R9 is count */
  8. MOVW s1+0(FP), R10 /* R10 is pointer1 */
  9. MOVW s2+4(FP), R11 /* R11 is pointer2 */
  10. ADD R9,R10, R12 /* R12 is end pointer1 */
  11. /*
  12. * if not at least 4 chars,
  13. * dont even mess around.
  14. * 3 chars to guarantee any
  15. * rounding up to a word
  16. * boundary and 4 characters
  17. * to get at least maybe one
  18. * full word cmp.
  19. */
  20. SUBCC $4,R9, R0
  21. BL out
  22. /*
  23. * test if both pointers
  24. * are similarly word alligned
  25. */
  26. XOR R10,R11, R7
  27. ANDCC $3,R7, R0
  28. BNE out
  29. /*
  30. * byte at a time to word allign
  31. */
  32. l1:
  33. ANDCC $3,R10, R0
  34. BE l2
  35. MOVBU 0(R10), R16
  36. MOVBU 0(R11), R17
  37. ADD $1, R10
  38. SUBCC R16,R17, R0
  39. BNE ne
  40. ADD $1, R11
  41. JMP l1
  42. /*
  43. * turn R9 into end pointer1-15
  44. * cmp 16 at a time while theres room
  45. */
  46. l2:
  47. SUB $15,R12, R9
  48. l3:
  49. SUBCC R10,R9, R0
  50. BLEU l4
  51. MOVW 0(R10), R16
  52. MOVW 0(R11), R17
  53. MOVW 4(R10), R18
  54. SUBCC R16,R17, R0
  55. BNE ne
  56. MOVW 4(R11), R19
  57. MOVW 8(R10), R16
  58. SUBCC R18,R19, R0
  59. BNE ne
  60. MOVW 8(R11), R17
  61. MOVW 12(R10), R18
  62. SUBCC R16,R17, R0
  63. BNE ne
  64. MOVW 12(R11), R19
  65. ADD $16, R10
  66. SUBCC R18,R19, R0
  67. BNE ne
  68. SUBCC R16,R17, R0
  69. BNE ne
  70. ADD $16, R11
  71. JMP l3
  72. /*
  73. * turn R9 into end pointer1-3
  74. * cmp 4 at a time while theres room
  75. */
  76. l4:
  77. SUB $3,R12, R9
  78. l5:
  79. SUBCC R10,R9, R0
  80. BLEU out
  81. MOVW 0(R10), R16
  82. MOVW 0(R11), R17
  83. ADD $4, R10
  84. SUBCC R16,R17, R0 /* only works because big endian */
  85. BNE ne
  86. ADD $4, R11
  87. JMP l5
  88. /*
  89. * last loop, cmp byte at a time
  90. */
  91. out:
  92. SUBCC R10,R12, R0
  93. BE zero
  94. MOVBU 0(R10), R16
  95. MOVBU 0(R11), R17
  96. ADD $1, R10
  97. SUBCC R16,R17, R0
  98. BNE ne
  99. ADD $1, R11
  100. JMP out
  101. ne:
  102. BGU plus
  103. MOVW $1, R7
  104. RETURN
  105. plus:
  106. MOVW $-1, R7
  107. RETURN
  108. zero:
  109. MOVW R0, R7
  110. RETURN