strcmp.S 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include <features.h>
  2. #include <endian.h>
  3. #ifdef WANT_WIDE
  4. # define Wstrcmp wcscmp
  5. # define Wstrcoll wcscoll
  6. #else
  7. # define Wstrcmp strcmp
  8. # define Wstrcoll strcoll
  9. #endif
  10. /* FIXME attention!!! it may be a bug when WANT_WIDE define */
  11. /*libc_hidden_proto(Wstrcmp)*/
  12. .align 2
  13. .global Wstrcmp
  14. .type Wstrcmp, @function
  15. Wstrcmp:
  16. mov r6, r2
  17. or r2, r3
  18. andi r2, 0x3
  19. cmpnei r2, 0x0 /* d or s is aligned ?*/
  20. bt 4f /* if not aligned, goto 4f*/
  21. 1: /* if aligned, load word each time.*/
  22. ldw r2, (r6, 0)
  23. ldw r7, (r3, 0)
  24. cmpne r2, r7
  25. bt 1f /* if d[i] != s[i], goto 1f */
  26. tstnbz r2 /* if d[i] == s[i], check if d or s is at the end. */
  27. bf 3f /* if at the end, goto 3f (finish comparing) */
  28. ldw r2, (r6, 4)
  29. ldw r7, (r3, 4)
  30. cmpne r2, r7
  31. bt 1f
  32. tstnbz r2
  33. bf 3f
  34. ldw r2, (r6, 8)
  35. ldw r7, (r3, 8)
  36. cmpne r2, r7
  37. bt 1f
  38. tstnbz r2
  39. bf 3f
  40. ldw r2, (r6, 12)
  41. ldw r7, (r3, 12)
  42. cmpne r2, r7
  43. bt 1f
  44. tstnbz r2
  45. bf 3f
  46. ldw r2, (r6, 16)
  47. ldw r7, (r3, 16)
  48. cmpne r2, r7
  49. bt 1f
  50. tstnbz r2
  51. bf 3f
  52. ldw r2, (r6, 20)
  53. ldw r7, (r3, 20)
  54. cmpne r2, r7
  55. bt 1f
  56. tstnbz r2
  57. bf 3f
  58. ldw r2, (r6, 24)
  59. ldw r7, (r3, 24)
  60. cmpne r2, r7
  61. bt 1f
  62. tstnbz r2
  63. bf 3f
  64. ldw r2, (r6, 28)
  65. ldw r7, (r3, 28)
  66. cmpne r2, r7
  67. bt 1f
  68. tstnbz r2
  69. bf 3f
  70. addi r6, 32
  71. addi r3, 32
  72. br 1b
  73. #ifdef __CSKYBE__
  74. /* d[i] != s[i] in word, so we check byte 0 ? */
  75. 1:
  76. xtrb0 r1, r2
  77. mov r4, r1
  78. xtrb0 r1, r7
  79. cmpne r4, r1
  80. bt 2f
  81. cmpnei r4, 0
  82. bf 2f
  83. /* d[i] != s[i] in word, so we check byte 1 ? */
  84. xtrb1 r1, r2
  85. mov r4, r1
  86. xtrb1 r1, r7
  87. cmpne r4, r1
  88. bt 2f
  89. cmpnei r4, 0
  90. bf 2f
  91. /* d[i] != s[i] in word, so we check byte 1 ? */
  92. xtrb2 r1, r2
  93. mov r4, r1
  94. xtrb2 r1, r7
  95. cmpne r4, r1
  96. bt 2f
  97. cmpnei r4, 0
  98. bf 2f
  99. /* d[i] != s[i] in word, so we check byte 1 ? */
  100. xtrb3 r1, r2
  101. mov r4, r1
  102. xtrb3 r1, r7
  103. #else /* little endian */
  104. /* d[i] != s[i] in word, so we check byte 0 ? */
  105. 1:
  106. xtrb3 r1, r2
  107. mov r4, r1
  108. xtrb3 r1, r7
  109. cmpne r4, r1
  110. bt 2f
  111. cmpnei r4, 0
  112. bf 2f
  113. /* d[i] != s[i] in word, so we check byte 1 ? */
  114. xtrb2 r1, r2
  115. mov r4, r1
  116. xtrb2 r1, r7
  117. cmpne r4, r1
  118. bt 2f
  119. cmpnei r4, 0
  120. bf 2f
  121. /* d[i] != s[i] in word, so we check byte 1 ? */
  122. xtrb1 r1, r2
  123. mov r4, r1
  124. xtrb1 r1, r7
  125. cmpne r4, r1
  126. bt 2f
  127. cmpnei r4, 0
  128. bf 2f
  129. /* d[i] != s[i] in word, so we check byte 1 ? */
  130. xtrb0 r1, r2
  131. mov r4, r1
  132. xtrb0 r1, r7
  133. #endif
  134. /* get the result when d[i] != s[i] */
  135. 2:
  136. subu r4, r1
  137. mov r2, r4
  138. jmp r15
  139. /* return when d[i] == s[i] */
  140. 3:
  141. subu r2, r7
  142. jmp r15
  143. /* cmp when d or s is not aligned */
  144. 4:
  145. ldb r2, (r6,0)
  146. ldb r7, (r3, 0)
  147. cmpne r2, r7
  148. bt 3b
  149. addi r3, 1
  150. addi r6, 1
  151. cmpnei r2, 0
  152. bt 4b
  153. jmp r15
  154. .size Wstrcmp, .-Wstrcmp
  155. libc_hidden_def(Wstrcmp)
  156. .weak Wstrcmp
  157. #ifndef __UCLIBC_HAS_LOCALE__
  158. /* libc_hidden_proto(Wstrcoll) */
  159. strong_alias(Wstrcmp,Wstrcoll)
  160. libc_hidden_def(Wstrcoll)
  161. #endif