io-writesb.S 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * linux/arch/arm/lib/io-writesb.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. .macro outword, rd
  14. #ifndef __ARMEB__
  15. strb \rd, [r0]
  16. mov \rd, \rd, lsr #8
  17. strb \rd, [r0]
  18. mov \rd, \rd, lsr #8
  19. strb \rd, [r0]
  20. mov \rd, \rd, lsr #8
  21. strb \rd, [r0]
  22. #else
  23. mov lr, \rd, lsr #24
  24. strb lr, [r0]
  25. mov lr, \rd, lsr #16
  26. strb lr, [r0]
  27. mov lr, \rd, lsr #8
  28. strb lr, [r0]
  29. strb \rd, [r0]
  30. #endif
  31. .endm
  32. .Loutsb_align: rsb ip, ip, #4
  33. cmp ip, r2
  34. movgt ip, r2
  35. cmp ip, #2
  36. ldrb r3, [r1], #1
  37. strb r3, [r0]
  38. ldrgeb r3, [r1], #1
  39. strgeb r3, [r0]
  40. ldrgtb r3, [r1], #1
  41. strgtb r3, [r0]
  42. subs r2, r2, ip
  43. bne .Loutsb_aligned
  44. ENTRY(__raw_writesb)
  45. teq r2, #0 @ do we have to check for the zero len?
  46. reteq lr
  47. ands ip, r1, #3
  48. bne .Loutsb_align
  49. .Loutsb_aligned:
  50. stmfd sp!, {r4, r5, lr}
  51. subs r2, r2, #16
  52. bmi .Loutsb_no_16
  53. .Loutsb_16_lp: ldmia r1!, {r3, r4, r5, ip}
  54. outword r3
  55. outword r4
  56. outword r5
  57. outword ip
  58. subs r2, r2, #16
  59. bpl .Loutsb_16_lp
  60. tst r2, #15
  61. ldmeqfd sp!, {r4, r5, pc}
  62. .Loutsb_no_16: tst r2, #8
  63. beq .Loutsb_no_8
  64. ldmia r1!, {r3, r4}
  65. outword r3
  66. outword r4
  67. .Loutsb_no_8: tst r2, #4
  68. beq .Loutsb_no_4
  69. ldr r3, [r1], #4
  70. outword r3
  71. .Loutsb_no_4: ands r2, r2, #3
  72. ldmeqfd sp!, {r4, r5, pc}
  73. cmp r2, #2
  74. ldrb r3, [r1], #1
  75. strb r3, [r0]
  76. ldrgeb r3, [r1], #1
  77. strgeb r3, [r0]
  78. ldrgtb r3, [r1]
  79. strgtb r3, [r0]
  80. ldmfd sp!, {r4, r5, pc}
  81. ENDPROC(__raw_writesb)
  82. EXPORT_SYMBOL(__raw_writesb)