io-writesw-armv4.S 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * linux/arch/arm/lib/io-writesw-armv4.S
  4. *
  5. * Copyright (C) 1995-2000 Russell King
  6. */
  7. #include <linux/linkage.h>
  8. #include <asm/assembler.h>
  9. .macro outword, rd
  10. #ifndef __ARMEB__
  11. strh \rd, [r0]
  12. mov \rd, \rd, lsr #16
  13. strh \rd, [r0]
  14. #else
  15. mov lr, \rd, lsr #16
  16. strh lr, [r0]
  17. strh \rd, [r0]
  18. #endif
  19. .endm
  20. .Loutsw_align: movs ip, r1, lsl #31
  21. bne .Loutsw_noalign
  22. ldrh r3, [r1], #2
  23. sub r2, r2, #1
  24. strh r3, [r0]
  25. ENTRY(__raw_writesw)
  26. teq r2, #0
  27. reteq lr
  28. ands r3, r1, #3
  29. bne .Loutsw_align
  30. stmfd sp!, {r4, r5, lr}
  31. subs r2, r2, #8
  32. bmi .Lno_outsw_8
  33. .Loutsw_8_lp: ldmia r1!, {r3, r4, r5, ip}
  34. subs r2, r2, #8
  35. outword r3
  36. outword r4
  37. outword r5
  38. outword ip
  39. bpl .Loutsw_8_lp
  40. .Lno_outsw_8: tst r2, #4
  41. beq .Lno_outsw_4
  42. ldmia r1!, {r3, ip}
  43. outword r3
  44. outword ip
  45. .Lno_outsw_4: movs r2, r2, lsl #31
  46. bcc .Lno_outsw_2
  47. ldr r3, [r1], #4
  48. outword r3
  49. .Lno_outsw_2: ldrhne r3, [r1]
  50. strhne r3, [r0]
  51. ldmfd sp!, {r4, r5, pc}
  52. #ifdef __ARMEB__
  53. #define pull_hbyte0 lsl #8
  54. #define push_hbyte1 lsr #24
  55. #else
  56. #define pull_hbyte0 lsr #24
  57. #define push_hbyte1 lsl #8
  58. #endif
  59. .Loutsw_noalign:
  60. ARM( ldr r3, [r1, -r3]! )
  61. THUMB( rsb r3, r3, #0 )
  62. THUMB( ldr r3, [r1, r3] )
  63. THUMB( sub r1, r3 )
  64. subcs r2, r2, #1
  65. bcs 2f
  66. subs r2, r2, #2
  67. bmi 3f
  68. 1: mov ip, r3, lsr #8
  69. strh ip, [r0]
  70. 2: mov ip, r3, pull_hbyte0
  71. ldr r3, [r1, #4]!
  72. subs r2, r2, #2
  73. orr ip, ip, r3, push_hbyte1
  74. strh ip, [r0]
  75. bpl 1b
  76. tst r2, #1
  77. 3: movne ip, r3, lsr #8
  78. strhne ip, [r0]
  79. ret lr
  80. ENDPROC(__raw_writesw)