strncmp_32.S 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * strncmp.S: Hand optimized Sparc assembly of GCC output from GNU libc
  3. * generic strncmp routine.
  4. */
  5. #include <linux/linkage.h>
  6. #include <asm/export.h>
  7. .text
  8. ENTRY(strncmp)
  9. mov %o0, %g3
  10. mov 0, %o3
  11. cmp %o2, 3
  12. ble 7f
  13. mov 0, %g2
  14. sra %o2, 2, %o4
  15. ldub [%g3], %o3
  16. 0:
  17. ldub [%o1], %g2
  18. add %g3, 1, %g3
  19. and %o3, 0xff, %o0
  20. cmp %o0, 0
  21. be 8f
  22. add %o1, 1, %o1
  23. cmp %o0, %g2
  24. be,a 1f
  25. ldub [%g3], %o3
  26. retl
  27. sub %o0, %g2, %o0
  28. 1:
  29. ldub [%o1], %g2
  30. add %g3,1, %g3
  31. and %o3, 0xff, %o0
  32. cmp %o0, 0
  33. be 8f
  34. add %o1, 1, %o1
  35. cmp %o0, %g2
  36. be,a 1f
  37. ldub [%g3], %o3
  38. retl
  39. sub %o0, %g2, %o0
  40. 1:
  41. ldub [%o1], %g2
  42. add %g3, 1, %g3
  43. and %o3, 0xff, %o0
  44. cmp %o0, 0
  45. be 8f
  46. add %o1, 1, %o1
  47. cmp %o0, %g2
  48. be,a 1f
  49. ldub [%g3], %o3
  50. retl
  51. sub %o0, %g2, %o0
  52. 1:
  53. ldub [%o1], %g2
  54. add %g3, 1, %g3
  55. and %o3, 0xff, %o0
  56. cmp %o0, 0
  57. be 8f
  58. add %o1, 1, %o1
  59. cmp %o0, %g2
  60. be 1f
  61. add %o4, -1, %o4
  62. retl
  63. sub %o0, %g2, %o0
  64. 1:
  65. cmp %o4, 0
  66. bg,a 0b
  67. ldub [%g3], %o3
  68. b 7f
  69. and %o2, 3, %o2
  70. 9:
  71. ldub [%o1], %g2
  72. add %g3, 1, %g3
  73. and %o3, 0xff, %o0
  74. cmp %o0, 0
  75. be 8f
  76. add %o1, 1, %o1
  77. cmp %o0, %g2
  78. be 7f
  79. add %o2, -1, %o2
  80. 8:
  81. retl
  82. sub %o0, %g2, %o0
  83. 7:
  84. cmp %o2, 0
  85. bg,a 9b
  86. ldub [%g3], %o3
  87. and %g2, 0xff, %o0
  88. retl
  89. sub %o3, %o0, %o0
  90. ENDPROC(strncmp)
  91. EXPORT_SYMBOL(strncmp)