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.

121 lines
4.3KB

  1. @
  2. @ ARMv4-optimized IDCT functions
  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. @ void ff_add_pixels_clamped_arm(int16_t *block, uint8_t *dest, ptrdiff_t stride)
  24. function ff_add_pixels_clamped_arm, export=1, align=5
  25. push {r4-r10}
  26. mov r10, #8
  27. 1:
  28. ldr r4, [r1] /* load dest */
  29. /* block[0] and block[1]*/
  30. ldrsh r5, [r0]
  31. ldrsh r7, [r0, #2]
  32. and r6, r4, #0xFF
  33. and r8, r4, #0xFF00
  34. add r6, r6, r5
  35. add r8, r7, r8, lsr #8
  36. mvn r5, r5
  37. mvn r7, r7
  38. tst r6, #0x100
  39. it ne
  40. movne r6, r5, lsr #24
  41. tst r8, #0x100
  42. it ne
  43. movne r8, r7, lsr #24
  44. mov r9, r6
  45. ldrsh r5, [r0, #4] /* moved form [A] */
  46. orr r9, r9, r8, lsl #8
  47. /* block[2] and block[3] */
  48. /* [A] */
  49. ldrsh r7, [r0, #6]
  50. and r6, r4, #0xFF0000
  51. and r8, r4, #0xFF000000
  52. add r6, r5, r6, lsr #16
  53. add r8, r7, r8, lsr #24
  54. mvn r5, r5
  55. mvn r7, r7
  56. tst r6, #0x100
  57. it ne
  58. movne r6, r5, lsr #24
  59. tst r8, #0x100
  60. it ne
  61. movne r8, r7, lsr #24
  62. orr r9, r9, r6, lsl #16
  63. ldr r4, [r1, #4] /* moved form [B] */
  64. orr r9, r9, r8, lsl #24
  65. /* store dest */
  66. ldrsh r5, [r0, #8] /* moved form [C] */
  67. str r9, [r1]
  68. /* load dest */
  69. /* [B] */
  70. /* block[4] and block[5] */
  71. /* [C] */
  72. ldrsh r7, [r0, #10]
  73. and r6, r4, #0xFF
  74. and r8, r4, #0xFF00
  75. add r6, r6, r5
  76. add r8, r7, r8, lsr #8
  77. mvn r5, r5
  78. mvn r7, r7
  79. tst r6, #0x100
  80. it ne
  81. movne r6, r5, lsr #24
  82. tst r8, #0x100
  83. it ne
  84. movne r8, r7, lsr #24
  85. mov r9, r6
  86. ldrsh r5, [r0, #12] /* moved from [D] */
  87. orr r9, r9, r8, lsl #8
  88. /* block[6] and block[7] */
  89. /* [D] */
  90. ldrsh r7, [r0, #14]
  91. and r6, r4, #0xFF0000
  92. and r8, r4, #0xFF000000
  93. add r6, r5, r6, lsr #16
  94. add r8, r7, r8, lsr #24
  95. mvn r5, r5
  96. mvn r7, r7
  97. tst r6, #0x100
  98. it ne
  99. movne r6, r5, lsr #24
  100. tst r8, #0x100
  101. it ne
  102. movne r8, r7, lsr #24
  103. orr r9, r9, r6, lsl #16
  104. add r0, r0, #16 /* moved from [E] */
  105. orr r9, r9, r8, lsl #24
  106. subs r10, r10, #1 /* moved from [F] */
  107. /* store dest */
  108. str r9, [r1, #4]
  109. /* [E] */
  110. /* [F] */
  111. add r1, r1, r2
  112. bne 1b
  113. pop {r4-r10}
  114. bx lr
  115. endfunc