memcmp.S 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #ifdef __LITTLE_ENDIAN__
  7. #define WORD2 r2
  8. #define SHIFT r3
  9. #else /* __BIG_ENDIAN__ */
  10. #define WORD2 r3
  11. #define SHIFT r2
  12. #endif /* _ENDIAN__ */
  13. .global memcmp
  14. .align 4
  15. memcmp:
  16. or %r12, %r0, %r1
  17. asl_s %r12, %r12, 30
  18. sub %r3, %r2, 1
  19. brls %r2, %r12, .Lbytewise
  20. ld %r4, [%r0, 0]
  21. ld %r5, [%r1, 0]
  22. lsr.f %lp_count, %r3, 3
  23. lpne .Loop_end
  24. ld_s WORD2, [%r0, 4]
  25. ld_s %r12, [%r1, 4]
  26. brne %r4, %r5, .Leven
  27. ld.a %r4, [%r0, 8]
  28. ld.a %r5, [%r1, 8]
  29. brne WORD2, %r12, .Lodd
  30. .Loop_end:
  31. asl_s SHIFT, SHIFT, 3
  32. bhs_s .Last_cmp
  33. brne %r4, %r5, .Leven
  34. ld %r4, [%r0, 4]
  35. ld %r5, [%r1, 4]
  36. #ifdef __LITTLE_ENDIAN__
  37. nop_s
  38. /* one more load latency cycle */
  39. .Last_cmp:
  40. xor %r0, %r4, %r5
  41. bset %r0, %r0, SHIFT
  42. sub_s %r1, %r0, 1
  43. bic_s %r1, %r1, %r0
  44. norm %r1, %r1
  45. b.d .Leven_cmp
  46. and %r1, %r1, 24
  47. .Leven:
  48. xor %r0, %r4, %r5
  49. sub_s %r1, %r0, 1
  50. bic_s %r1, %r1, %r0
  51. norm %r1, %r1
  52. /* slow track insn */
  53. and %r1, %r1, 24
  54. .Leven_cmp:
  55. asl %r2, %r4, %r1
  56. asl %r12, %r5, %r1
  57. lsr_s %r2, %r2, 1
  58. lsr_s %r12, %r12, 1
  59. j_s.d [%blink]
  60. sub %r0, %r2, %r12
  61. .balign 4
  62. .Lodd:
  63. xor %r0, WORD2, %r12
  64. sub_s %r1, %r0, 1
  65. bic_s %r1, %r1, %r0
  66. norm %r1, %r1
  67. /* slow track insn */
  68. and %r1, %r1, 24
  69. asl_s %r2, %r2, %r1
  70. asl_s %r12, %r12, %r1
  71. lsr_s %r2, %r2, 1
  72. lsr_s %r12, %r12, 1
  73. j_s.d [%blink]
  74. sub %r0, %r2, %r12
  75. #else /* __BIG_ENDIAN__ */
  76. .Last_cmp:
  77. neg_s SHIFT, SHIFT
  78. lsr %r4, %r4, SHIFT
  79. lsr %r5, %r5, SHIFT
  80. /* slow track insn */
  81. .Leven:
  82. sub.f %r0, %r4, %r5
  83. mov.ne %r0, 1
  84. j_s.d [%blink]
  85. bset.cs %r0, %r0, 31
  86. .Lodd:
  87. cmp_s WORD2, %r12
  88. mov_s %r0, 1
  89. j_s.d [%blink]
  90. bset.cs %r0, %r0, 31
  91. #endif /* _ENDIAN__ */
  92. .balign 4
  93. .Lbytewise:
  94. breq %r2, 0, .Lnil
  95. ldb %r4, [%r0, 0]
  96. ldb %r5, [%r1, 0]
  97. lsr.f %lp_count, %r3
  98. lpne .Lbyte_end
  99. ldb_s %r3, [%r0, 1]
  100. ldb %r12, [%r1, 1]
  101. brne %r4, %r5, .Lbyte_even
  102. ldb.a %r4, [%r0, 2]
  103. ldb.a %r5, [%r1, 2]
  104. brne %r3, %r12, .Lbyte_odd
  105. .Lbyte_end:
  106. bcc .Lbyte_even
  107. brne %r4, %r5, .Lbyte_even
  108. ldb_s %r3, [%r0, 1]
  109. ldb_s %r12, [%r1, 1]
  110. .Lbyte_odd:
  111. j_s.d [%blink]
  112. sub %r0, %r3, %r12
  113. .Lbyte_even:
  114. j_s.d [%blink]
  115. sub %r0, %r4, %r5
  116. .Lnil:
  117. j_s.d [%blink]
  118. mov %r0, 0