ll_char_wr.S 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * linux/arch/arm/lib/ll_char_wr.S
  4. *
  5. * Copyright (C) 1995, 1996 Russell King.
  6. *
  7. * Speedups & 1bpp code (C) 1996 Philip Blundell & Russell King.
  8. *
  9. * 10-04-96 RMK Various cleanups & reduced register usage.
  10. * 08-04-98 RMK Shifts re-ordered
  11. */
  12. @ Regs: [] = corruptible
  13. @ {} = used
  14. @ () = do not use
  15. #include <linux/linkage.h>
  16. #include <asm/assembler.h>
  17. .text
  18. LC0: .word LC0
  19. .word bytes_per_char_h
  20. .word video_size_row
  21. .word acorndata_8x8
  22. .word con_charconvtable
  23. /*
  24. * r0 = ptr
  25. * r1 = char
  26. * r2 = white
  27. */
  28. ENTRY(ll_write_char)
  29. stmfd sp!, {r4 - r7, lr}
  30. @
  31. @ Smashable regs: {r0 - r3}, [r4 - r7], (r8 - fp), [ip], (sp), [lr], (pc)
  32. @
  33. /*
  34. * calculate offset into character table
  35. */
  36. mov r1, r1, lsl #3
  37. /*
  38. * calculate offset required for each row.
  39. */
  40. adr ip, LC0
  41. ldmia ip, {r3, r4, r5, r6, lr}
  42. sub ip, ip, r3
  43. add r6, r6, ip
  44. add lr, lr, ip
  45. ldr r4, [r4, ip]
  46. ldr r5, [r5, ip]
  47. /*
  48. * Go to resolution-dependent routine...
  49. */
  50. cmp r4, #4
  51. blt Lrow1bpp
  52. add r0, r0, r5, lsl #3 @ Move to bottom of character
  53. orr r1, r1, #7
  54. ldrb r7, [r6, r1]
  55. teq r4, #8
  56. beq Lrow8bpplp
  57. @
  58. @ Smashable regs: {r0 - r3}, [r4], {r5 - r7}, (r8 - fp), [ip], (sp), {lr}, (pc)
  59. @
  60. Lrow4bpplp:
  61. ldr r7, [lr, r7, lsl #2]
  62. mul r7, r2, r7
  63. sub r1, r1, #1 @ avoid using r7 directly after
  64. str r7, [r0, -r5]!
  65. ldrb r7, [r6, r1]
  66. ldr r7, [lr, r7, lsl #2]
  67. mul r7, r2, r7
  68. tst r1, #7 @ avoid using r7 directly after
  69. str r7, [r0, -r5]!
  70. subne r1, r1, #1
  71. ldrbne r7, [r6, r1]
  72. bne Lrow4bpplp
  73. ldmfd sp!, {r4 - r7, pc}
  74. @
  75. @ Smashable regs: {r0 - r3}, [r4], {r5 - r7}, (r8 - fp), [ip], (sp), {lr}, (pc)
  76. @
  77. Lrow8bpplp:
  78. mov ip, r7, lsr #4
  79. ldr ip, [lr, ip, lsl #2]
  80. mul r4, r2, ip
  81. and ip, r7, #15 @ avoid r4
  82. ldr ip, [lr, ip, lsl #2] @ avoid r4
  83. mul ip, r2, ip @ avoid r4
  84. sub r1, r1, #1 @ avoid ip
  85. sub r0, r0, r5 @ avoid ip
  86. stmia r0, {r4, ip}
  87. ldrb r7, [r6, r1]
  88. mov ip, r7, lsr #4
  89. ldr ip, [lr, ip, lsl #2]
  90. mul r4, r2, ip
  91. and ip, r7, #15 @ avoid r4
  92. ldr ip, [lr, ip, lsl #2] @ avoid r4
  93. mul ip, r2, ip @ avoid r4
  94. tst r1, #7 @ avoid ip
  95. sub r0, r0, r5 @ avoid ip
  96. stmia r0, {r4, ip}
  97. subne r1, r1, #1
  98. ldrbne r7, [r6, r1]
  99. bne Lrow8bpplp
  100. ldmfd sp!, {r4 - r7, pc}
  101. @
  102. @ Smashable regs: {r0 - r3}, [r4], {r5, r6}, [r7], (r8 - fp), [ip], (sp), [lr], (pc)
  103. @
  104. Lrow1bpp:
  105. add r6, r6, r1
  106. ldmia r6, {r4, r7}
  107. strb r4, [r0], r5
  108. mov r4, r4, lsr #8
  109. strb r4, [r0], r5
  110. mov r4, r4, lsr #8
  111. strb r4, [r0], r5
  112. mov r4, r4, lsr #8
  113. strb r4, [r0], r5
  114. strb r7, [r0], r5
  115. mov r7, r7, lsr #8
  116. strb r7, [r0], r5
  117. mov r7, r7, lsr #8
  118. strb r7, [r0], r5
  119. mov r7, r7, lsr #8
  120. strb r7, [r0], r5
  121. ldmfd sp!, {r4 - r7, pc}
  122. .bss
  123. ENTRY(con_charconvtable)
  124. .space 1024