io-writesw-armv3.S 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * linux/arch/arm/lib/io-writesw-armv3.S
  4. *
  5. * Copyright (C) 1995-2000 Russell King
  6. */
  7. #include <linux/linkage.h>
  8. #include <asm/assembler.h>
  9. .Loutsw_bad_alignment:
  10. adr r0, .Loutsw_bad_align_msg
  11. mov r2, lr
  12. b panic
  13. .Loutsw_bad_align_msg:
  14. .asciz "outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
  15. .align
  16. .Loutsw_align: tst r1, #1
  17. bne .Loutsw_bad_alignment
  18. add r1, r1, #2
  19. ldr r3, [r1, #-4]
  20. mov r3, r3, lsr #16
  21. orr r3, r3, r3, lsl #16
  22. str r3, [r0]
  23. subs r2, r2, #1
  24. reteq lr
  25. ENTRY(__raw_writesw)
  26. teq r2, #0 @ do we have to check for the zero len?
  27. reteq lr
  28. tst r1, #3
  29. bne .Loutsw_align
  30. stmfd sp!, {r4, r5, r6, lr}
  31. subs r2, r2, #8
  32. bmi .Lno_outsw_8
  33. .Loutsw_8_lp: ldmia r1!, {r3, r4, r5, r6}
  34. mov ip, r3, lsl #16
  35. orr ip, ip, ip, lsr #16
  36. str ip, [r0]
  37. mov ip, r3, lsr #16
  38. orr ip, ip, ip, lsl #16
  39. str ip, [r0]
  40. mov ip, r4, lsl #16
  41. orr ip, ip, ip, lsr #16
  42. str ip, [r0]
  43. mov ip, r4, lsr #16
  44. orr ip, ip, ip, lsl #16
  45. str ip, [r0]
  46. mov ip, r5, lsl #16
  47. orr ip, ip, ip, lsr #16
  48. str ip, [r0]
  49. mov ip, r5, lsr #16
  50. orr ip, ip, ip, lsl #16
  51. str ip, [r0]
  52. mov ip, r6, lsl #16
  53. orr ip, ip, ip, lsr #16
  54. str ip, [r0]
  55. mov ip, r6, lsr #16
  56. orr ip, ip, ip, lsl #16
  57. str ip, [r0]
  58. subs r2, r2, #8
  59. bpl .Loutsw_8_lp
  60. tst r2, #7
  61. ldmfdeq sp!, {r4, r5, r6, pc}
  62. .Lno_outsw_8: tst r2, #4
  63. beq .Lno_outsw_4
  64. ldmia r1!, {r3, r4}
  65. mov ip, r3, lsl #16
  66. orr ip, ip, ip, lsr #16
  67. str ip, [r0]
  68. mov ip, r3, lsr #16
  69. orr ip, ip, ip, lsl #16
  70. str ip, [r0]
  71. mov ip, r4, lsl #16
  72. orr ip, ip, ip, lsr #16
  73. str ip, [r0]
  74. mov ip, r4, lsr #16
  75. orr ip, ip, ip, lsl #16
  76. str ip, [r0]
  77. .Lno_outsw_4: tst r2, #2
  78. beq .Lno_outsw_2
  79. ldr r3, [r1], #4
  80. mov ip, r3, lsl #16
  81. orr ip, ip, ip, lsr #16
  82. str ip, [r0]
  83. mov ip, r3, lsr #16
  84. orr ip, ip, ip, lsl #16
  85. str ip, [r0]
  86. .Lno_outsw_2: tst r2, #1
  87. ldrne r3, [r1]
  88. movne ip, r3, lsl #16
  89. orrne ip, ip, ip, lsr #16
  90. strne ip, [r0]
  91. ldmfd sp!, {r4, r5, r6, pc}