io-readsb.S 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * linux/arch/arm/lib/io-readsb.S
  3. *
  4. * Copyright (C) 1995-2000 Russell King
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. */
  10. #include <linux/linkage.h>
  11. #include <asm/assembler.h>
  12. #include <asm/export.h>
  13. .Linsb_align: rsb ip, ip, #4
  14. cmp ip, r2
  15. movgt ip, r2
  16. cmp ip, #2
  17. ldrb r3, [r0]
  18. strb r3, [r1], #1
  19. ldrgeb r3, [r0]
  20. strgeb r3, [r1], #1
  21. ldrgtb r3, [r0]
  22. strgtb r3, [r1], #1
  23. subs r2, r2, ip
  24. bne .Linsb_aligned
  25. ENTRY(__raw_readsb)
  26. teq r2, #0 @ do we have to check for the zero len?
  27. reteq lr
  28. ands ip, r1, #3
  29. bne .Linsb_align
  30. .Linsb_aligned: stmfd sp!, {r4 - r6, lr}
  31. subs r2, r2, #16
  32. bmi .Linsb_no_16
  33. .Linsb_16_lp: ldrb r3, [r0]
  34. ldrb r4, [r0]
  35. ldrb r5, [r0]
  36. mov r3, r3, put_byte_0
  37. ldrb r6, [r0]
  38. orr r3, r3, r4, put_byte_1
  39. ldrb r4, [r0]
  40. orr r3, r3, r5, put_byte_2
  41. ldrb r5, [r0]
  42. orr r3, r3, r6, put_byte_3
  43. ldrb r6, [r0]
  44. mov r4, r4, put_byte_0
  45. ldrb ip, [r0]
  46. orr r4, r4, r5, put_byte_1
  47. ldrb r5, [r0]
  48. orr r4, r4, r6, put_byte_2
  49. ldrb r6, [r0]
  50. orr r4, r4, ip, put_byte_3
  51. ldrb ip, [r0]
  52. mov r5, r5, put_byte_0
  53. ldrb lr, [r0]
  54. orr r5, r5, r6, put_byte_1
  55. ldrb r6, [r0]
  56. orr r5, r5, ip, put_byte_2
  57. ldrb ip, [r0]
  58. orr r5, r5, lr, put_byte_3
  59. ldrb lr, [r0]
  60. mov r6, r6, put_byte_0
  61. orr r6, r6, ip, put_byte_1
  62. ldrb ip, [r0]
  63. orr r6, r6, lr, put_byte_2
  64. orr r6, r6, ip, put_byte_3
  65. stmia r1!, {r3 - r6}
  66. subs r2, r2, #16
  67. bpl .Linsb_16_lp
  68. tst r2, #15
  69. ldmeqfd sp!, {r4 - r6, pc}
  70. .Linsb_no_16: tst r2, #8
  71. beq .Linsb_no_8
  72. ldrb r3, [r0]
  73. ldrb r4, [r0]
  74. ldrb r5, [r0]
  75. mov r3, r3, put_byte_0
  76. ldrb r6, [r0]
  77. orr r3, r3, r4, put_byte_1
  78. ldrb r4, [r0]
  79. orr r3, r3, r5, put_byte_2
  80. ldrb r5, [r0]
  81. orr r3, r3, r6, put_byte_3
  82. ldrb r6, [r0]
  83. mov r4, r4, put_byte_0
  84. ldrb ip, [r0]
  85. orr r4, r4, r5, put_byte_1
  86. orr r4, r4, r6, put_byte_2
  87. orr r4, r4, ip, put_byte_3
  88. stmia r1!, {r3, r4}
  89. .Linsb_no_8: tst r2, #4
  90. beq .Linsb_no_4
  91. ldrb r3, [r0]
  92. ldrb r4, [r0]
  93. ldrb r5, [r0]
  94. ldrb r6, [r0]
  95. mov r3, r3, put_byte_0
  96. orr r3, r3, r4, put_byte_1
  97. orr r3, r3, r5, put_byte_2
  98. orr r3, r3, r6, put_byte_3
  99. str r3, [r1], #4
  100. .Linsb_no_4: ands r2, r2, #3
  101. ldmeqfd sp!, {r4 - r6, pc}
  102. cmp r2, #2
  103. ldrb r3, [r0]
  104. strb r3, [r1], #1
  105. ldrgeb r3, [r0]
  106. strgeb r3, [r1], #1
  107. ldrgtb r3, [r0]
  108. strgtb r3, [r1]
  109. ldmfd sp!, {r4 - r6, pc}
  110. ENDPROC(__raw_readsb)
  111. EXPORT_SYMBOL(__raw_readsb)