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.

168 lines
4.8KB

  1. /*
  2. * Alpha optimized DSP utils
  3. * Copyright (c) 2002 Falk Hueffner <falk@debian.org>
  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. /*
  22. * These functions are scheduled for pca56. They should work
  23. * reasonably on ev6, though.
  24. */
  25. #include "regdef.h"
  26. .set noat
  27. .set noreorder
  28. .arch pca56
  29. .text
  30. /************************************************************************
  31. * void put_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
  32. * int line_size)
  33. */
  34. .align 6
  35. .globl put_pixels_clamped_mvi_asm
  36. .ent put_pixels_clamped_mvi_asm
  37. put_pixels_clamped_mvi_asm:
  38. .frame sp, 0, ra
  39. .prologue 0
  40. lda t8, -1
  41. lda t9, 8 # loop counter
  42. zap t8, 0xaa, t8 # 00ff00ff00ff00ff
  43. .align 4
  44. 1: ldq t0, 0(a0)
  45. ldq t1, 8(a0)
  46. ldq t2, 16(a0)
  47. ldq t3, 24(a0)
  48. maxsw4 t0, zero, t0
  49. subq t9, 2, t9
  50. maxsw4 t1, zero, t1
  51. lda a0, 32(a0)
  52. maxsw4 t2, zero, t2
  53. addq a1, a2, ta
  54. maxsw4 t3, zero, t3
  55. minsw4 t0, t8, t0
  56. minsw4 t1, t8, t1
  57. minsw4 t2, t8, t2
  58. minsw4 t3, t8, t3
  59. pkwb t0, t0
  60. pkwb t1, t1
  61. pkwb t2, t2
  62. pkwb t3, t3
  63. stl t0, 0(a1)
  64. stl t1, 4(a1)
  65. addq ta, a2, a1
  66. stl t2, 0(ta)
  67. stl t3, 4(ta)
  68. bne t9, 1b
  69. ret
  70. .end put_pixels_clamped_mvi_asm
  71. /************************************************************************
  72. * void add_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
  73. * int line_size)
  74. */
  75. .align 6
  76. .globl add_pixels_clamped_mvi_asm
  77. .ent add_pixels_clamped_mvi_asm
  78. add_pixels_clamped_mvi_asm:
  79. .frame sp, 0, ra
  80. .prologue 0
  81. lda t1, -1
  82. lda th, 8
  83. zap t1, 0x33, tg
  84. nop
  85. srl tg, 1, t0
  86. xor tg, t0, tg # 0x8000800080008000
  87. zap t1, 0xaa, tf # 0x00ff00ff00ff00ff
  88. .align 4
  89. 1: ldl t1, 0(a1) # pix0 (try to hit cache line soon)
  90. ldl t4, 4(a1) # pix1
  91. addq a1, a2, te # pixels += line_size
  92. ldq t0, 0(a0) # shorts0
  93. ldl t7, 0(te) # pix2 (try to hit cache line soon)
  94. ldl ta, 4(te) # pix3
  95. ldq t3, 8(a0) # shorts1
  96. ldq t6, 16(a0) # shorts2
  97. ldq t9, 24(a0) # shorts3
  98. unpkbw t1, t1 # 0 0 (quarter/op no.)
  99. and t0, tg, t2 # 0 1
  100. unpkbw t4, t4 # 1 0
  101. bic t0, tg, t0 # 0 2
  102. unpkbw t7, t7 # 2 0
  103. and t3, tg, t5 # 1 1
  104. addq t0, t1, t0 # 0 3
  105. xor t0, t2, t0 # 0 4
  106. unpkbw ta, ta # 3 0
  107. and t6, tg, t8 # 2 1
  108. maxsw4 t0, zero, t0 # 0 5
  109. bic t3, tg, t3 # 1 2
  110. bic t6, tg, t6 # 2 2
  111. minsw4 t0, tf, t0 # 0 6
  112. addq t3, t4, t3 # 1 3
  113. pkwb t0, t0 # 0 7
  114. xor t3, t5, t3 # 1 4
  115. maxsw4 t3, zero, t3 # 1 5
  116. addq t6, t7, t6 # 2 3
  117. xor t6, t8, t6 # 2 4
  118. and t9, tg, tb # 3 1
  119. minsw4 t3, tf, t3 # 1 6
  120. bic t9, tg, t9 # 3 2
  121. maxsw4 t6, zero, t6 # 2 5
  122. addq t9, ta, t9 # 3 3
  123. stl t0, 0(a1) # 0 8
  124. minsw4 t6, tf, t6 # 2 6
  125. xor t9, tb, t9 # 3 4
  126. maxsw4 t9, zero, t9 # 3 5
  127. lda a0, 32(a0) # block += 16;
  128. pkwb t3, t3 # 1 7
  129. minsw4 t9, tf, t9 # 3 6
  130. subq th, 2, th
  131. pkwb t6, t6 # 2 7
  132. pkwb t9, t9 # 3 7
  133. stl t3, 4(a1) # 1 8
  134. addq te, a2, a1 # pixels += line_size
  135. stl t6, 0(te) # 2 8
  136. stl t9, 4(te) # 3 8
  137. bne th, 1b
  138. ret
  139. .end add_pixels_clamped_mvi_asm