You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
4.4KB

  1. @
  2. @ ARMv4 optimized DSP utils
  3. @ Copyright (c) 2004 AGAWA Koji <i (AT) atty (DOT) jp>
  4. @
  5. @ This file is part of Libav.
  6. @
  7. @ Libav is free software; you can redistribute it and/or
  8. @ modify it under the terms of the GNU Lesser General Public
  9. @ License as published by the Free Software Foundation; either
  10. @ version 2.1 of the License, or (at your option) any later version.
  11. @
  12. @ Libav is distributed in the hope that it will be useful,
  13. @ but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. @ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. @ Lesser General Public License for more details.
  16. @
  17. @ You should have received a copy of the GNU Lesser General Public
  18. @ License along with Libav; if not, write to the Free Software
  19. @ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. @
  21. #include "config.h"
  22. #include "libavutil/arm/asm.S"
  23. #if !HAVE_ARMV5TE_EXTERNAL
  24. #define pld @
  25. #endif
  26. .align 5
  27. @ void ff_add_pixels_clamped_arm(int16_t *block, uint8_t *dest, int stride)
  28. function ff_add_pixels_clamped_arm, export=1
  29. push {r4-r10}
  30. mov r10, #8
  31. 1:
  32. ldr r4, [r1] /* load dest */
  33. /* block[0] and block[1]*/
  34. ldrsh r5, [r0]
  35. ldrsh r7, [r0, #2]
  36. and r6, r4, #0xFF
  37. and r8, r4, #0xFF00
  38. add r6, r6, r5
  39. add r8, r7, r8, lsr #8
  40. mvn r5, r5
  41. mvn r7, r7
  42. tst r6, #0x100
  43. it ne
  44. movne r6, r5, lsr #24
  45. tst r8, #0x100
  46. it ne
  47. movne r8, r7, lsr #24
  48. mov r9, r6
  49. ldrsh r5, [r0, #4] /* moved form [A] */
  50. orr r9, r9, r8, lsl #8
  51. /* block[2] and block[3] */
  52. /* [A] */
  53. ldrsh r7, [r0, #6]
  54. and r6, r4, #0xFF0000
  55. and r8, r4, #0xFF000000
  56. add r6, r5, r6, lsr #16
  57. add r8, r7, r8, lsr #24
  58. mvn r5, r5
  59. mvn r7, r7
  60. tst r6, #0x100
  61. it ne
  62. movne r6, r5, lsr #24
  63. tst r8, #0x100
  64. it ne
  65. movne r8, r7, lsr #24
  66. orr r9, r9, r6, lsl #16
  67. ldr r4, [r1, #4] /* moved form [B] */
  68. orr r9, r9, r8, lsl #24
  69. /* store dest */
  70. ldrsh r5, [r0, #8] /* moved form [C] */
  71. str r9, [r1]
  72. /* load dest */
  73. /* [B] */
  74. /* block[4] and block[5] */
  75. /* [C] */
  76. ldrsh r7, [r0, #10]
  77. and r6, r4, #0xFF
  78. and r8, r4, #0xFF00
  79. add r6, r6, r5
  80. add r8, r7, r8, lsr #8
  81. mvn r5, r5
  82. mvn r7, r7
  83. tst r6, #0x100
  84. it ne
  85. movne r6, r5, lsr #24
  86. tst r8, #0x100
  87. it ne
  88. movne r8, r7, lsr #24
  89. mov r9, r6
  90. ldrsh r5, [r0, #12] /* moved from [D] */
  91. orr r9, r9, r8, lsl #8
  92. /* block[6] and block[7] */
  93. /* [D] */
  94. ldrsh r7, [r0, #14]
  95. and r6, r4, #0xFF0000
  96. and r8, r4, #0xFF000000
  97. add r6, r5, r6, lsr #16
  98. add r8, r7, r8, lsr #24
  99. mvn r5, r5
  100. mvn r7, r7
  101. tst r6, #0x100
  102. it ne
  103. movne r6, r5, lsr #24
  104. tst r8, #0x100
  105. it ne
  106. movne r8, r7, lsr #24
  107. orr r9, r9, r6, lsl #16
  108. add r0, r0, #16 /* moved from [E] */
  109. orr r9, r9, r8, lsl #24
  110. subs r10, r10, #1 /* moved from [F] */
  111. /* store dest */
  112. str r9, [r1, #4]
  113. /* [E] */
  114. /* [F] */
  115. add r1, r1, r2
  116. bne 1b
  117. pop {r4-r10}
  118. bx lr
  119. endfunc