memcmp.s 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. TEXT memcmp(SB), $0
  2. #define BDNZ BC 16,0,
  3. MOVW R3, s1+0(FP) /* R3 is pointer1 */
  4. /*
  5. * performance:
  6. * 67mb/sec aligned; 16mb/sec unaligned
  7. */
  8. MOVW n+8(FP), R4 /* R4 is count */
  9. MOVW s2+4(FP), R5 /* R5 is pointer2 */
  10. /*
  11. * let LSW do the work for 4 characters or less; aligned and unaligned
  12. */
  13. CMP R4, $0
  14. BLE eq
  15. CMP R4, $4
  16. BLE out
  17. XOR R3, R5, R9
  18. ANDCC $3, R9
  19. BNE l4 /* pointers misaligned; use LSW loop */
  20. /*
  21. * do enough bytes to align pointers
  22. */
  23. ANDCC $3,R3, R9
  24. BEQ l2
  25. SUBC R9, $4, R9
  26. MOVW R9, XER
  27. LSW (R3), R10
  28. ADD R9, R3
  29. LSW (R5), R14
  30. ADD R9, R5
  31. SUB R9, R4
  32. CMPU R10, R14
  33. BNE ne
  34. /*
  35. * compare 16 at a time
  36. */
  37. l2:
  38. SRAWCC $4, R4, R9
  39. BLE l4
  40. MOVW R9, CTR
  41. SUB $4, R3
  42. SUB $4, R5
  43. l3:
  44. MOVWU 4(R3), R10
  45. MOVWU 4(R5), R12
  46. MOVWU 4(R3), R11
  47. MOVWU 4(R5), R13
  48. CMPU R10, R12
  49. BNE ne
  50. MOVWU 4(R3), R10
  51. MOVWU 4(R5), R12
  52. CMPU R11, R13
  53. BNE ne
  54. MOVWU 4(R3), R11
  55. MOVWU 4(R5), R13
  56. CMPU R10, R12
  57. BNE ne
  58. CMPU R11, R13
  59. BNE ne
  60. BDNZ l3
  61. ADD $4, R3
  62. ADD $4, R5
  63. RLWNMCC $0, R4, $15, R4 /* residue */
  64. BEQ eq
  65. /*
  66. * do remaining words with LSW; also does unaligned case
  67. */
  68. l4:
  69. SRAWCC $2, R4, R9
  70. BLE out
  71. MOVW R9, CTR
  72. l5:
  73. LSW (R3), $4, R10
  74. ADD $4, R3
  75. LSW (R5), $4, R11
  76. ADD $4, R5
  77. CMPU R10, R11
  78. BNE ne
  79. BDNZ l5
  80. RLWNMCC $0, R4, $3, R4 /* residue */
  81. BEQ eq
  82. /*
  83. * do remaining bytes with final LSW
  84. */
  85. out:
  86. MOVW R4, XER
  87. LSW (R3), R10
  88. LSW (R5), R11
  89. CMPU R10, R11
  90. BNE ne
  91. eq:
  92. MOVW $0, R3
  93. RETURN
  94. ne:
  95. MOVW $1, R3
  96. BGE ret
  97. MOVW $-1,R3
  98. ret:
  99. RETURN
  100. END