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.

208 lines
7.3KB

  1. /*
  2. * Blackfin Pixel Operations
  3. * Copyright (C) 2007 Marc Hoffman <marc.hoffman@analog.com>
  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 "libavutil/bfin/asm.h"
  22. /*
  23. motion compensation
  24. primitives
  25. * Halfpel motion compensation with rounding (a+b+1)>>1.
  26. * This is an array[4][4] of motion compensation funcions for 4
  27. * horizontal blocksizes (8,16) and the 4 halfpel positions<br>
  28. * *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ]
  29. * @param block destination where the result is stored
  30. * @param pixels source
  31. * @param line_size number of bytes in a horizontal line of block
  32. * @param h height
  33. */
  34. DEFUN(put_pixels8uc,mL1,
  35. (uint8_t *block, const uint8_t *s0, const uint8_t *s1,
  36. int dest_size, int line_size, int h)):
  37. i3=r0; // dest
  38. i0=r1; // src0
  39. i1=r2; // src1
  40. r0=[sp+12]; // dest_size
  41. r2=[sp+16]; // line_size
  42. p0=[sp+20]; // h
  43. [--sp] = (r7:6);
  44. r0+=-4;
  45. m3=r0;
  46. r2+=-8;
  47. m0=r2;
  48. LSETUP(pp8$0,pp8$1) LC0=P0;
  49. DISALGNEXCPT || R0 = [I0++] || R2 =[I1++];
  50. pp8$0: DISALGNEXCPT || R1 = [I0++] || R3 =[I1++];
  51. R6 = BYTEOP1P(R1:0,R3:2) || R0 = [I0++M0]|| R2 =[I1++M0];
  52. R7 = BYTEOP1P(R1:0,R3:2)(R) || R0 = [I0++] || [I3++] = R6 ;
  53. pp8$1: DISALGNEXCPT || R2 = [I1++] || [I3++M3] = R7;
  54. (r7:6) = [sp++];
  55. RTS;
  56. DEFUN_END(put_pixels8uc)
  57. DEFUN(put_pixels16uc,mL1,
  58. (uint8_t *block, const uint8_t *s0, const uint8_t *s1,
  59. int dest_size, int line_size, int h)):
  60. link 0;
  61. [--sp] = (r7:6);
  62. i3=r0; // dest
  63. i0=r1; // src0
  64. i1=r2; // src1
  65. r0=[fp+20]; // dest_size
  66. r2=[fp+24]; // line_size
  67. p0=[fp+28]; // h
  68. r0+=-12;
  69. m3=r0; // line_size
  70. r2+=-16;
  71. m0=r2;
  72. LSETUP(pp16$0,pp16$1) LC0=P0;
  73. DISALGNEXCPT || R0 = [I0++] || R2 =[I1++];
  74. pp16$0: DISALGNEXCPT || R1 = [I0++] || R3 =[I1++];
  75. R6 = BYTEOP1P(R1:0,R3:2) || R0 = [I0++] || R2 =[I1++];
  76. R7 = BYTEOP1P(R1:0,R3:2)(R) || R1 = [I0++] || R3 =[I1++];
  77. [I3++] = R6;
  78. R6 = BYTEOP1P(R1:0,R3:2) || R0 = [I0++M0] || R2 =[I1++M0];
  79. R7 = BYTEOP1P(R1:0,R3:2)(R) || R0 = [I0++] || [I3++] = R7 ;
  80. [I3++] = R6;
  81. pp16$1: DISALGNEXCPT || R2 = [I1++] || [I3++M3] = R7;
  82. (r7:6) = [sp++];
  83. unlink;
  84. RTS;
  85. DEFUN_END(put_pixels16uc)
  86. DEFUN(z_put_pixels16_xy2,mL1,
  87. (uint8_t *block, const uint8_t *s0,
  88. int dest_size, int line_size, int h)):
  89. link 0;
  90. [--sp] = (r7:4);
  91. i3=r0; // dest
  92. i0=r1; // src0--> pixels
  93. i1=r1; // src1--> pixels + line_size
  94. r2+=-12;
  95. m2=r2; // m2=dest_width-4
  96. r2=[fp+20];
  97. m3=r2; // line_size
  98. p0=[fp+24]; // h
  99. r2+=-16;
  100. i1+=m3; /* src1 + line_size */
  101. m0=r2; /* line-size - 20 */
  102. B0 = I0;
  103. B1 = I1;
  104. B3 = I3;
  105. DISALGNEXCPT || R0 = [I0++] || R2 =[I1++];
  106. LSETUP(LS$16E,LE$16E) LC0=P0;
  107. LS$16E: DISALGNEXCPT || R1 = [I0++] || R3 =[I1++];
  108. R4 = BYTEOP2P (R3:2,R1:0) (RNDL) || R0 = [I0++] || R2 =[I1++];
  109. R5 = BYTEOP2P (R3:2,R1:0) (RNDL,R) || R1 = [I0++] || [I3++] = R4 ;
  110. DISALGNEXCPT || R3 = [I1++] || [I3++] = R5;
  111. R4 = BYTEOP2P (R3:2,R1:0) (RNDL) || R0 = [I0++M0]|| R2 = [I1++M0];
  112. R5 = BYTEOP2P (R3:2,R1:0) (RNDL,R) || R0 = [I0++] || [I3++] = R4 ;
  113. LE$16E: DISALGNEXCPT || R2 = [I1++] || [I3++M2] = R5;
  114. M1 = 1;
  115. I3 = B3;
  116. I1 = B1;
  117. I0 = B0;
  118. I0 += M1;
  119. I1 += M1;
  120. DISALGNEXCPT || R0 = [I0++] || R2 =[I1++];
  121. LSETUP(LS$16O,LE$16O) LC0=P0;
  122. LS$16O: DISALGNEXCPT || R1 = [I0++] || R3 =[I1++];
  123. R4 = BYTEOP2P (R3:2,R1:0) (RNDH) || R0 = [I0++] || R2 =[I1++];
  124. R5 = BYTEOP2P (R3:2,R1:0) (RNDH,R) || R1 = [I0++] || R6 =[I3++];
  125. R4 = R4 +|+ R6 || R7 = [I3--];
  126. R5 = R5 +|+ R7 || [I3++] = R4;
  127. DISALGNEXCPT || R3 =[I1++] || [I3++] = R5;
  128. R4 = BYTEOP2P (R3:2,R1:0) (RNDH) || R0 = [I0++M0]|| R2 = [I1++M0];
  129. R5 = BYTEOP2P (R3:2,R1:0) (RNDH,R) || R0 = [I0++] || R6 = [I3++];
  130. R4 = R4 +|+ R6 || R7 = [I3--];
  131. R5 = R5 +|+ R7 || [I3++] = R4;
  132. LE$16O: DISALGNEXCPT || R2 = [I1++] || [I3++M2] = R5;
  133. (r7:4) = [sp++];
  134. unlink;
  135. rts;
  136. DEFUN_END(z_put_pixels16_xy2)
  137. DEFUN(z_put_pixels8_xy2,mL1,
  138. (uint8_t *block, const uint8_t *s0,
  139. int dest_size, int line_size, int h)):
  140. link 0;
  141. [--sp] = (r7:4);
  142. i3=r0; // dest
  143. i0=r1; // src0--> pixels
  144. i1=r1; // src1--> pixels + line_size
  145. r2+=-4;
  146. m2=r2; // m2=dest_width-4
  147. r2=[fp+20];
  148. m3=r2; // line_size
  149. p0=[fp+24]; // h
  150. r2+=-8;
  151. i1+=m3; /* src1 + line_size */
  152. m0=r2; /* line-size - 20 */
  153. b0 = I0;
  154. b1 = I1;
  155. b3 = I3;
  156. LSETUP(LS$8E,LE$8E) LC0=P0;
  157. DISALGNEXCPT || R0 = [I0++] || R2 =[I1++];
  158. LS$8E: DISALGNEXCPT || R1 = [I0++] || R3 =[I1++];
  159. R4 = BYTEOP2P (R3:2,R1:0) (RNDL) || R0 = [I0++M0] || R2 =[I1++M0];
  160. R5 = BYTEOP2P (R3:2,R1:0) (RNDL,R) || R0 = [I0++] || [I3++] = R4 ;
  161. LE$8E: DISALGNEXCPT || R2 = [I1++] || [I3++M2] = R5;
  162. M1 = 1;
  163. I3 = b3;
  164. I1 = b1;
  165. I0 = b0;
  166. I0 += M1;
  167. I1 += M1;
  168. LSETUP(LS$8O,LE$8O) LC0=P0;
  169. DISALGNEXCPT || R0 = [I0++] || R2 =[I1++];
  170. LS$8O: DISALGNEXCPT || R1 = [I0++] || R3 =[I1++];
  171. R4 = BYTEOP2P (R3:2,R1:0) (RNDH) || R0 = [I0++M0] || R2 =[I1++M0];
  172. R5 = BYTEOP2P (R3:2,R1:0) (RNDH,R) || R0 = [I0++] || R6 =[I3++];
  173. R4 = R4 +|+ R6 || R7 = [I3--];
  174. R5 = R5 +|+ R7 || [I3++] = R4;
  175. LE$8O: DISALGNEXCPT || R2 =[I1++] || [I3++M2] = R5;
  176. (r7:4) = [sp++];
  177. unlink;
  178. rts;
  179. DEFUN_END(z_put_pixels8_xy2)