io-readsb.S 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * linux/arch/arm26/lib/io-readsb.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/hardware.h>
  13. .insb_align: rsb ip, ip, #4
  14. cmp ip, r2
  15. movgt ip, r2
  16. cmp ip, #2
  17. ldrb r3, [r0]
  18. strb r3, [r1], #1
  19. ldrgeb r3, [r0]
  20. strgeb r3, [r1], #1
  21. ldrgtb r3, [r0]
  22. strgtb r3, [r1], #1
  23. subs r2, r2, ip
  24. bne .insb_aligned
  25. ENTRY(__raw_readsb)
  26. teq r2, #0 @ do we have to check for the zero len?
  27. moveq pc, lr
  28. ands ip, r1, #3
  29. bne .insb_align
  30. .insb_aligned: stmfd sp!, {r4 - r6, lr}
  31. subs r2, r2, #16
  32. bmi .insb_no_16
  33. .insb_16_lp: ldrb r3, [r0]
  34. ldrb r4, [r0]
  35. orr r3, r3, r4, lsl #8
  36. ldrb r4, [r0]
  37. orr r3, r3, r4, lsl #16
  38. ldrb r4, [r0]
  39. orr r3, r3, r4, lsl #24
  40. ldrb r4, [r0]
  41. ldrb r5, [r0]
  42. orr r4, r4, r5, lsl #8
  43. ldrb r5, [r0]
  44. orr r4, r4, r5, lsl #16
  45. ldrb r5, [r0]
  46. orr r4, r4, r5, lsl #24
  47. ldrb r5, [r0]
  48. ldrb r6, [r0]
  49. orr r5, r5, r6, lsl #8
  50. ldrb r6, [r0]
  51. orr r5, r5, r6, lsl #16
  52. ldrb r6, [r0]
  53. orr r5, r5, r6, lsl #24
  54. ldrb r6, [r0]
  55. ldrb ip, [r0]
  56. orr r6, r6, ip, lsl #8
  57. ldrb ip, [r0]
  58. orr r6, r6, ip, lsl #16
  59. ldrb ip, [r0]
  60. orr r6, r6, ip, lsl #24
  61. stmia r1!, {r3 - r6}
  62. subs r2, r2, #16
  63. bpl .insb_16_lp
  64. tst r2, #15
  65. LOADREGS(eqfd, sp!, {r4 - r6, pc})
  66. .insb_no_16: tst r2, #8
  67. beq .insb_no_8
  68. ldrb r3, [r0]
  69. ldrb r4, [r0]
  70. orr r3, r3, r4, lsl #8
  71. ldrb r4, [r0]
  72. orr r3, r3, r4, lsl #16
  73. ldrb r4, [r0]
  74. orr r3, r3, r4, lsl #24
  75. ldrb r4, [r0]
  76. ldrb r5, [r0]
  77. orr r4, r4, r5, lsl #8
  78. ldrb r5, [r0]
  79. orr r4, r4, r5, lsl #16
  80. ldrb r5, [r0]
  81. orr r4, r4, r5, lsl #24
  82. stmia r1!, {r3, r4}
  83. .insb_no_8: tst r2, #4
  84. beq .insb_no_4
  85. ldrb r3, [r0]
  86. ldrb r4, [r0]
  87. orr r3, r3, r4, lsl #8
  88. ldrb r4, [r0]
  89. orr r3, r3, r4, lsl #16
  90. ldrb r4, [r0]
  91. orr r3, r3, r4, lsl #24
  92. str r3, [r1], #4
  93. .insb_no_4: ands r2, r2, #3
  94. LOADREGS(eqfd, sp!, {r4 - r6, pc})
  95. cmp r2, #2
  96. ldrb r3, [r0]
  97. strb r3, [r1], #1
  98. ldrgeb r3, [r0]
  99. strgeb r3, [r1], #1
  100. ldrgtb r3, [r0]
  101. strgtb r3, [r1]
  102. LOADREGS(fd, sp!, {r4 - r6, pc})