io-readsl.S 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * linux/arch/arm/lib/io-readsl.S
  4. *
  5. * Copyright (C) 1995-2000 Russell King
  6. */
  7. #include <linux/linkage.h>
  8. #include <asm/assembler.h>
  9. ENTRY(__raw_readsl)
  10. teq r2, #0 @ do we have to check for the zero len?
  11. reteq lr
  12. ands ip, r1, #3
  13. bne 3f
  14. subs r2, r2, #4
  15. bmi 2f
  16. stmfd sp!, {r4, lr}
  17. 1: ldr r3, [r0, #0]
  18. ldr r4, [r0, #0]
  19. ldr ip, [r0, #0]
  20. ldr lr, [r0, #0]
  21. subs r2, r2, #4
  22. stmia r1!, {r3, r4, ip, lr}
  23. bpl 1b
  24. ldmfd sp!, {r4, lr}
  25. 2: movs r2, r2, lsl #31
  26. ldrcs r3, [r0, #0]
  27. ldrcs ip, [r0, #0]
  28. stmiacs r1!, {r3, ip}
  29. ldrne r3, [r0, #0]
  30. strne r3, [r1, #0]
  31. ret lr
  32. 3: ldr r3, [r0]
  33. cmp ip, #2
  34. mov ip, r3, get_byte_0
  35. strb ip, [r1], #1
  36. bgt 6f
  37. mov ip, r3, get_byte_1
  38. strb ip, [r1], #1
  39. beq 5f
  40. mov ip, r3, get_byte_2
  41. strb ip, [r1], #1
  42. 4: subs r2, r2, #1
  43. mov ip, r3, lspull #24
  44. ldrne r3, [r0]
  45. orrne ip, ip, r3, lspush #8
  46. strne ip, [r1], #4
  47. bne 4b
  48. b 8f
  49. 5: subs r2, r2, #1
  50. mov ip, r3, lspull #16
  51. ldrne r3, [r0]
  52. orrne ip, ip, r3, lspush #16
  53. strne ip, [r1], #4
  54. bne 5b
  55. b 7f
  56. 6: subs r2, r2, #1
  57. mov ip, r3, lspull #8
  58. ldrne r3, [r0]
  59. orrne ip, ip, r3, lspush #24
  60. strne ip, [r1], #4
  61. bne 6b
  62. mov r3, ip, get_byte_2
  63. strb r3, [r1, #2]
  64. 7: mov r3, ip, get_byte_1
  65. strb r3, [r1, #1]
  66. 8: mov r3, ip, get_byte_0
  67. strb r3, [r1, #0]
  68. ret lr
  69. ENDPROC(__raw_readsl)