io-readsb.S 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * linux/arch/arm/lib/io-readsb.S
  4. *
  5. * Copyright (C) 1995-2000 Russell King
  6. */
  7. #include <linux/linkage.h>
  8. #include <asm/assembler.h>
  9. .Linsb_align: rsb ip, ip, #4
  10. cmp ip, r2
  11. movgt ip, r2
  12. cmp ip, #2
  13. ldrb r3, [r0]
  14. strb r3, [r1], #1
  15. ldrbge r3, [r0]
  16. strbge r3, [r1], #1
  17. ldrbgt r3, [r0]
  18. strbgt r3, [r1], #1
  19. subs r2, r2, ip
  20. bne .Linsb_aligned
  21. ENTRY(__raw_readsb)
  22. teq r2, #0 @ do we have to check for the zero len?
  23. reteq lr
  24. ands ip, r1, #3
  25. bne .Linsb_align
  26. .Linsb_aligned: stmfd sp!, {r4 - r6, lr}
  27. subs r2, r2, #16
  28. bmi .Linsb_no_16
  29. .Linsb_16_lp: ldrb r3, [r0]
  30. ldrb r4, [r0]
  31. ldrb r5, [r0]
  32. mov r3, r3, put_byte_0
  33. ldrb r6, [r0]
  34. orr r3, r3, r4, put_byte_1
  35. ldrb r4, [r0]
  36. orr r3, r3, r5, put_byte_2
  37. ldrb r5, [r0]
  38. orr r3, r3, r6, put_byte_3
  39. ldrb r6, [r0]
  40. mov r4, r4, put_byte_0
  41. ldrb ip, [r0]
  42. orr r4, r4, r5, put_byte_1
  43. ldrb r5, [r0]
  44. orr r4, r4, r6, put_byte_2
  45. ldrb r6, [r0]
  46. orr r4, r4, ip, put_byte_3
  47. ldrb ip, [r0]
  48. mov r5, r5, put_byte_0
  49. ldrb lr, [r0]
  50. orr r5, r5, r6, put_byte_1
  51. ldrb r6, [r0]
  52. orr r5, r5, ip, put_byte_2
  53. ldrb ip, [r0]
  54. orr r5, r5, lr, put_byte_3
  55. ldrb lr, [r0]
  56. mov r6, r6, put_byte_0
  57. orr r6, r6, ip, put_byte_1
  58. ldrb ip, [r0]
  59. orr r6, r6, lr, put_byte_2
  60. orr r6, r6, ip, put_byte_3
  61. stmia r1!, {r3 - r6}
  62. subs r2, r2, #16
  63. bpl .Linsb_16_lp
  64. tst r2, #15
  65. ldmfdeq sp!, {r4 - r6, pc}
  66. .Linsb_no_16: tst r2, #8
  67. beq .Linsb_no_8
  68. ldrb r3, [r0]
  69. ldrb r4, [r0]
  70. ldrb r5, [r0]
  71. mov r3, r3, put_byte_0
  72. ldrb r6, [r0]
  73. orr r3, r3, r4, put_byte_1
  74. ldrb r4, [r0]
  75. orr r3, r3, r5, put_byte_2
  76. ldrb r5, [r0]
  77. orr r3, r3, r6, put_byte_3
  78. ldrb r6, [r0]
  79. mov r4, r4, put_byte_0
  80. ldrb ip, [r0]
  81. orr r4, r4, r5, put_byte_1
  82. orr r4, r4, r6, put_byte_2
  83. orr r4, r4, ip, put_byte_3
  84. stmia r1!, {r3, r4}
  85. .Linsb_no_8: tst r2, #4
  86. beq .Linsb_no_4
  87. ldrb r3, [r0]
  88. ldrb r4, [r0]
  89. ldrb r5, [r0]
  90. ldrb r6, [r0]
  91. mov r3, r3, put_byte_0
  92. orr r3, r3, r4, put_byte_1
  93. orr r3, r3, r5, put_byte_2
  94. orr r3, r3, r6, put_byte_3
  95. str r3, [r1], #4
  96. .Linsb_no_4: ands r2, r2, #3
  97. ldmfdeq sp!, {r4 - r6, pc}
  98. cmp r2, #2
  99. ldrb r3, [r0]
  100. strb r3, [r1], #1
  101. ldrbge r3, [r0]
  102. strbge r3, [r1], #1
  103. ldrbgt r3, [r0]
  104. strbgt r3, [r1]
  105. ldmfd sp!, {r4 - r6, pc}
  106. ENDPROC(__raw_readsb)