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.

160 lines
6.7KB

  1. /*
  2. * Loongson SIMD optimized blockdsp
  3. *
  4. * Copyright (c) 2015 Loongson Technology Corporation Limited
  5. * Copyright (c) 2015 Zhou Xiaoyong <zhouxiaoyong@loongson.cn>
  6. *
  7. * This file is part of FFmpeg.
  8. *
  9. * FFmpeg is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation; either
  12. * version 2.1 of the License, or (at your option) any later version.
  13. *
  14. * FFmpeg is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with FFmpeg; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. */
  23. #include "blockdsp_mips.h"
  24. #include "libavutil/mips/mmiutils.h"
  25. void ff_fill_block16_mmi(uint8_t *block, uint8_t value, int line_size, int h)
  26. {
  27. double ftmp[1];
  28. DECLARE_VAR_ALL64;
  29. __asm__ volatile (
  30. "mtc1 %[value], %[ftmp0] \n\t"
  31. "punpcklbh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
  32. "punpcklbh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
  33. "punpcklbh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
  34. "1: \n\t"
  35. MMI_SDC1(%[ftmp0], %[block], 0x00)
  36. PTR_ADDI "%[h], %[h], -0x01 \n\t"
  37. MMI_SDC1(%[ftmp0], %[block], 0x08)
  38. PTR_ADDU "%[block], %[block], %[line_size] \n\t"
  39. "bnez %[h], 1b \n\t"
  40. : [ftmp0]"=&f"(ftmp[0]),
  41. RESTRICT_ASM_ALL64
  42. [block]"+&r"(block), [h]"+&r"(h)
  43. : [value]"r"(value), [line_size]"r"((mips_reg)line_size)
  44. : "memory"
  45. );
  46. }
  47. void ff_fill_block8_mmi(uint8_t *block, uint8_t value, int line_size, int h)
  48. {
  49. double ftmp0;
  50. DECLARE_VAR_ALL64;
  51. __asm__ volatile (
  52. "mtc1 %[value], %[ftmp0] \n\t"
  53. "punpcklbh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
  54. "punpcklbh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
  55. "punpcklbh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
  56. "1: \n\t"
  57. MMI_SDC1(%[ftmp0], %[block], 0x00)
  58. PTR_ADDI "%[h], %[h], -0x01 \n\t"
  59. PTR_ADDU "%[block], %[block], %[line_size] \n\t"
  60. "bnez %[h], 1b \n\t"
  61. : [ftmp0]"=&f"(ftmp0),
  62. RESTRICT_ASM_ALL64
  63. [block]"+&r"(block), [h]"+&r"(h)
  64. : [value]"r"(value), [line_size]"r"((mips_reg)line_size)
  65. : "memory"
  66. );
  67. }
  68. void ff_clear_block_mmi(int16_t *block)
  69. {
  70. double ftmp[2];
  71. __asm__ volatile (
  72. "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
  73. "xor %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
  74. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x00)
  75. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x10)
  76. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x20)
  77. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x30)
  78. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x40)
  79. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x50)
  80. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x60)
  81. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x70)
  82. : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1])
  83. : [block]"r"(block)
  84. : "memory"
  85. );
  86. }
  87. void ff_clear_blocks_mmi(int16_t *block)
  88. {
  89. double ftmp[2];
  90. __asm__ volatile (
  91. "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
  92. "xor %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
  93. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x00)
  94. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x10)
  95. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x20)
  96. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x30)
  97. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x40)
  98. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x50)
  99. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x60)
  100. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x70)
  101. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x80)
  102. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x90)
  103. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0xa0)
  104. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0xb0)
  105. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0xc0)
  106. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0xd0)
  107. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0xe0)
  108. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0xf0)
  109. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x100)
  110. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x110)
  111. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x120)
  112. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x130)
  113. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x140)
  114. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x150)
  115. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x160)
  116. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x170)
  117. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x180)
  118. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x190)
  119. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x1a0)
  120. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x1b0)
  121. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x1c0)
  122. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x1d0)
  123. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x1e0)
  124. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x1f0)
  125. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x200)
  126. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x210)
  127. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x220)
  128. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x230)
  129. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x240)
  130. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x250)
  131. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x260)
  132. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x270)
  133. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x280)
  134. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x290)
  135. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x2a0)
  136. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x2b0)
  137. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x2c0)
  138. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x2d0)
  139. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x2e0)
  140. MMI_SQC1(%[ftmp0], %[ftmp1], %[block], 0x2f0)
  141. : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1])
  142. : [block]"r"((uint64_t *)block)
  143. : "memory"
  144. );
  145. }