Optimize vp8 loop filter with mmi, four functions optimized: 1. ff_vp8_h_loop_filter8uv_mmi. 2. ff_vp8_v_loop_filter8uv_mmi. 3. ff_vp8_h_loop_filter16_mmi. 4. ff_vp8_v_loop_filter16_mmi. Vp8 decoding speed improved about 50%(from 73fps to 110fps, Tested on loongson 3A3000).
Unified · Split
| @@ -25,6 +25,221 @@ · 24 unmodified lines | |||
| 25 | #include "constants.h" | 25 | #include "constants.h" |
| 26 | #include "libavutil/mips/mmiutils.h" | 26 | #include "libavutil/mips/mmiutils.h" |
| 27 | 27 | ||
| 28 | #define DECLARE_DOUBLE_1 double db_1 | ||
| 29 | #define DECLARE_DOUBLE_2 double db_2 | ||
| 30 | #define DECLARE_UINT32_T uint32_t it_1 | ||
| 31 | #define RESTRICT_ASM_DOUBLE_1 [db_1]"=&f"(db_1) | ||
| 32 | #define RESTRICT_ASM_DOUBLE_2 [db_2]"=&f"(db_2) | ||
| 33 | #define RESTRICT_ASM_UINT32_T [it_1]"=&r"(it_1) | ||
| 34 | |||
| 35 | #define MMI_PCMPGTUB(dst, src1, src2) \ | ||
| 36 | "pcmpeqb %[db_1], "#src1", "#src2" \n\t" \ | ||
| 37 | "pmaxub %[db_2], "#src1", "#src2" \n\t" \ | ||
| 38 | "pcmpeqb %[db_2], %[db_2], "#src1" \n\t" \ | ||
| 39 | "xor "#dst", %[db_2], %[db_1] \n\t" | ||
| 40 | |||
| 41 | #define MMI_BTOH(dst_l, dst_r, src) \ | ||
| 42 | "xor %[db_1], %[db_1], %[db_1] \n\t" \ | ||
| 43 | "pcmpgtb %[db_2], %[db_1], "#src" \n\t" \ | ||
| 44 | "punpcklbh "#dst_r", "#src", %[db_2] \n\t" \ | ||
| 45 | "punpckhbh "#dst_l", "#src", %[db_2] \n\t" | ||
| 46 | |||
| 47 | #define MMI_TRANSPOSE8x8_UB_UB(src_0, src_1, src_2, src_3, \ | ||
| 48 | src_4, src_5, src_6, src_7, \ | ||
| 49 | dst_0, dst_1, dst_2, dst_3, \ | ||
| 50 | dst_4, dst_5, dst_6, dst_7) \ | ||
| 51 | "li %[it_1], 0xe4 \n\t" \ | ||
| 52 | "dmtc1 %[it_1], %[db_1] \n\t" \ | ||
| 53 | "pshufh %[db_2], "#src_0", %[db_1] \n\t" \ | ||
| 54 | "punpcklbh "#dst_0", "#src_0", "#src_1" \n\t" \ | ||
| 55 | "punpckhbh "#dst_1", %[db_2], "#src_1" \n\t" \ | ||
| 56 | "pshufh %[db_2], "#src_2", %[db_1] \n\t" \ | ||
| 57 | "punpcklbh "#dst_2", "#src_2", "#src_3" \n\t" \ | ||
| 58 | "punpckhbh "#dst_3", %[db_2], "#src_3" \n\t" \ | ||
| 59 | "pshufh %[db_2], "#src_4", %[db_1] \n\t" \ | ||
| 60 | "punpcklbh "#dst_4", "#src_4", "#src_5" \n\t" \ | ||
| 61 | "punpckhbh "#dst_5", %[db_2], "#src_5" \n\t" \ | ||
| 62 | "pshufh %[db_2], "#src_6", %[db_1] \n\t" \ | ||
| 63 | "punpcklbh "#dst_6", "#src_6", "#src_7" \n\t" \ | ||
| 64 | "punpckhbh "#dst_7", %[db_2], "#src_7" \n\t" \ | ||
| 65 | \ | ||
| 66 | "pshufh %[db_2], "#dst_0", %[db_1] \n\t" \ | ||
| 67 | "punpcklhw "#dst_0", "#dst_0", "#dst_2" \n\t" \ | ||
| 68 | "punpckhhw "#dst_2", %[db_2], "#dst_2" \n\t" \ | ||
| 69 | "pshufh %[db_2], "#dst_1", %[db_1] \n\t" \ | ||
| 70 | "punpcklhw "#dst_1", "#dst_1", "#dst_3" \n\t" \ | ||
| 71 | "punpckhhw "#dst_3", %[db_2], "#dst_3" \n\t" \ | ||
| 72 | "pshufh %[db_2], "#dst_4", %[db_1] \n\t" \ | ||
| 73 | "punpcklhw "#dst_4", "#dst_4", "#dst_6" \n\t" \ | ||
| 74 | "punpckhhw "#dst_6", %[db_2], "#dst_6" \n\t" \ | ||
| 75 | "pshufh %[db_2], "#dst_5", %[db_1] \n\t" \ | ||
| 76 | "punpcklhw "#dst_5", "#dst_5", "#dst_7" \n\t" \ | ||
| 77 | "punpckhhw "#dst_7", %[db_2], "#dst_7" \n\t" \ | ||
| 78 | \ | ||
| 79 | "pshufh %[db_2], "#dst_0", %[db_1] \n\t" \ | ||
| 80 | "punpcklwd "#dst_0", "#dst_0", "#dst_4" \n\t" \ | ||
| 81 | "punpckhwd "#dst_4", %[db_2], "#dst_4" \n\t" \ | ||
| 82 | "pshufh %[db_2], "#dst_1", %[db_1] \n\t" \ | ||
| 83 | "punpcklwd "#dst_1", "#dst_1", "#dst_5" \n\t" \ | ||
| 84 | "punpckhwd "#dst_5", %[db_2], "#dst_5" \n\t" \ | ||
| 85 | "pshufh %[db_2], "#dst_2", %[db_1] \n\t" \ | ||
| 86 | "punpcklwd "#dst_2", "#dst_2", "#dst_6" \n\t" \ | ||
| 87 | "punpckhwd "#dst_6", %[db_2], "#dst_6" \n\t" \ | ||
| 88 | "pshufh %[db_2], "#dst_3", %[db_1] \n\t" \ | ||
| 89 | "punpcklwd "#dst_3", "#dst_3", "#dst_7" \n\t" \ | ||
| 90 | "punpckhwd "#dst_7", %[db_2], "#dst_7" \n\t" \ | ||
| 91 | \ | ||
| 92 | "pshufh %[db_2], "#dst_1", %[db_1] \n\t" \ | ||
| 93 | "pshufh "#dst_1", "#dst_4", %[db_1] \n\t" \ | ||
| 94 | "pshufh "#dst_4", %[db_2], %[db_1] \n\t" \ | ||
| 95 | "pshufh %[db_2], "#dst_3", %[db_1] \n\t" \ | ||
| 96 | "pshufh "#dst_3", "#dst_6", %[db_1] \n\t" \ | ||
| 97 | "pshufh "#dst_6", %[db_2], %[db_1] \n\t" | ||
| 98 | |||
| 99 | #define MMI_VP8_LOOP_FILTER \ | ||
| 100 | /* Calculation of hev */ \ | ||
| 101 | "dmtc1 %[thresh], %[ftmp3] \n\t" \ | ||
| 102 | "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 103 | "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 104 | "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 105 | "pasubub %[ftmp0], %[p1], %[p0] \n\t" \ | ||
| 106 | "pasubub %[ftmp1], %[q1], %[q0] \n\t" \ | ||
| 107 | "pmaxub %[ftmp0], %[ftmp0], %[ftmp1] \n\t" \ | ||
| 108 | MMI_PCMPGTUB(%[hev], %[ftmp0], %[ftmp3]) \ | ||
| 109 | /* Calculation of mask */ \ | ||
| 110 | "pasubub %[ftmp1], %[p0], %[q0] \n\t" \ | ||
| 111 | "paddusb %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \ | ||
| 112 | "pasubub %[ftmp2], %[p1], %[q1] \n\t" \ | ||
| 113 | "li %[tmp0], 0x09 \n\t" \ | ||
| 114 | "dmtc1 %[tmp0], %[ftmp3] \n\t" \ | ||
| 115 | PSRLB_MMI(%[ftmp2], %[ftmp3], %[ftmp4], %[ftmp5], %[ftmp2]) \ | ||
| 116 | "paddusb %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \ | ||
| 117 | "dmtc1 %[e], %[ftmp3] \n\t" \ | ||
| 118 | "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 119 | "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 120 | "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 121 | MMI_PCMPGTUB(%[mask], %[ftmp1], %[ftmp3]) \ | ||
| 122 | "pmaxub %[mask], %[mask], %[ftmp0] \n\t" \ | ||
| 123 | "pasubub %[ftmp1], %[p3], %[p2] \n\t" \ | ||
| 124 | "pasubub %[ftmp2], %[p2], %[p1] \n\t" \ | ||
| 125 | "pmaxub %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \ | ||
| 126 | "pmaxub %[mask], %[mask], %[ftmp1] \n\t" \ | ||
| 127 | "pasubub %[ftmp1], %[q3], %[q2] \n\t" \ | ||
| 128 | "pasubub %[ftmp2], %[q2], %[q1] \n\t" \ | ||
| 129 | "pmaxub %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \ | ||
| 130 | "pmaxub %[mask], %[mask], %[ftmp1] \n\t" \ | ||
| 131 | "dmtc1 %[i], %[ftmp3] \n\t" \ | ||
| 132 | "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 133 | "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 134 | "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 135 | MMI_PCMPGTUB(%[mask], %[mask], %[ftmp3]) \ | ||
| 136 | "pcmpeqw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ | ||
| 137 | "xor %[mask], %[mask], %[ftmp3] \n\t" \ | ||
| 138 | /* VP8_MBFILTER */ \ | ||
| 139 | "li %[tmp0], 0x80808080 \n\t" \ | ||
| 140 | "dmtc1 %[tmp0], %[ftmp7] \n\t" \ | ||
| 141 | "punpcklwd %[ftmp7], %[ftmp7], %[ftmp7] \n\t" \ | ||
| 142 | "xor %[p2], %[p2], %[ftmp7] \n\t" \ | ||
| 143 | "xor %[p1], %[p1], %[ftmp7] \n\t" \ | ||
| 144 | "xor %[p0], %[p0], %[ftmp7] \n\t" \ | ||
| 145 | "xor %[q0], %[q0], %[ftmp7] \n\t" \ | ||
| 146 | "xor %[q1], %[q1], %[ftmp7] \n\t" \ | ||
| 147 | "xor %[q2], %[q2], %[ftmp7] \n\t" \ | ||
| 148 | "psubsb %[ftmp4], %[p1], %[q1] \n\t" \ | ||
| 149 | "psubb %[ftmp5], %[q0], %[p0] \n\t" \ | ||
| 150 | MMI_BTOH(%[ftmp1], %[ftmp0], %[ftmp5]) \ | ||
| 151 | MMI_BTOH(%[ftmp3], %[ftmp2], %[ftmp4]) \ | ||
| 152 | /* Right part */ \ | ||
| 153 | "paddh %[ftmp5], %[ftmp0], %[ftmp0] \n\t" \ | ||
| 154 | "paddh %[ftmp0], %[ftmp0], %[ftmp5] \n\t" \ | ||
| 155 | "paddh %[ftmp0], %[ftmp2], %[ftmp0] \n\t" \ | ||
| 156 | /* Left part */ \ | ||
| 157 | "paddh %[ftmp5], %[ftmp1], %[ftmp1] \n\t" \ | ||
| 158 | "paddh %[ftmp1], %[ftmp1], %[ftmp5] \n\t" \ | ||
| 159 | "paddh %[ftmp1], %[ftmp3], %[ftmp1] \n\t" \ | ||
| 160 | /* Combine left and right part */ \ | ||
| 161 | "packsshb %[ftmp1], %[ftmp0], %[ftmp1] \n\t" \ | ||
| 162 | "and %[ftmp1], %[ftmp1], %[mask] \n\t" \ | ||
| 163 | "and %[ftmp2], %[ftmp1], %[hev] \n\t" \ | ||
| 164 | "li %[tmp0], 0x04040404 \n\t" \ | ||
| 165 | "dmtc1 %[tmp0], %[ftmp0] \n\t" \ | ||
| 166 | "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \ | ||
| 167 | "paddsb %[ftmp3], %[ftmp2], %[ftmp0] \n\t" \ | ||
| 168 | "li %[tmp0], 0x0B \n\t" \ | ||
| 169 | "dmtc1 %[tmp0], %[ftmp4] \n\t" \ | ||
| 170 | PSRAB_MMI(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6], %[ftmp3]) \ | ||
| 171 | "li %[tmp0], 0x03030303 \n\t" \ | ||
| 172 | "dmtc1 %[tmp0], %[ftmp0] \n\t" \ | ||
| 173 | "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \ | ||
| 174 | "paddsb %[ftmp4], %[ftmp2], %[ftmp0] \n\t" \ | ||
| 175 | "li %[tmp0], 0x0B \n\t" \ | ||
| 176 | "dmtc1 %[tmp0], %[ftmp2] \n\t" \ | ||
| 177 | PSRAB_MMI(%[ftmp4], %[ftmp2], %[ftmp5], %[ftmp6], %[ftmp4]) \ | ||
| 178 | "psubsb %[q0], %[q0], %[ftmp3] \n\t" \ | ||
| 179 | "paddsb %[p0], %[p0], %[ftmp4] \n\t" \ | ||
| 180 | /* filt_val &= ~hev */ \ | ||
| 181 | "pcmpeqw %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \ | ||
| 182 | "xor %[hev], %[hev], %[ftmp0] \n\t" \ | ||
| 183 | "and %[ftmp1], %[ftmp1], %[hev] \n\t" \ | ||
| 184 | MMI_BTOH(%[ftmp5], %[ftmp6], %[ftmp1]) \ | ||
| 185 | "li %[tmp0], 0x07 \n\t" \ | ||
| 186 | "dmtc1 %[tmp0], %[ftmp2] \n\t" \ | ||
| 187 | "li %[tmp0], 0x001b001b \n\t" \ | ||
| 188 | "dmtc1 %[tmp0], %[ftmp1] \n\t" \ | ||
| 189 | "punpcklwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \ | ||
| 190 | "li %[tmp0], 0x003f003f \n\t" \ | ||
| 191 | "dmtc1 %[tmp0], %[ftmp0] \n\t" \ | ||
| 192 | "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \ | ||
| 193 | /* Right part */ \ | ||
| 194 | "pmullh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \ | ||
| 195 | "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \ | ||
| 196 | "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \ | ||
| 197 | /* Left part */ \ | ||
| 198 | "pmullh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \ | ||
| 199 | "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \ | ||
| 200 | "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \ | ||
| 201 | /* Combine left and right part */ \ | ||
| 202 | "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \ | ||
| 203 | "psubsb %[q0], %[q0], %[ftmp4] \n\t" \ | ||
| 204 | "xor %[q0], %[q0], %[ftmp7] \n\t" \ | ||
| 205 | "paddsb %[p0], %[p0], %[ftmp4] \n\t" \ | ||
| 206 | "xor %[p0], %[p0], %[ftmp7] \n\t" \ | ||
| 207 | "li %[tmp0], 0x00120012 \n\t" \ | ||
| 208 | "dmtc1 %[tmp0], %[ftmp1] \n\t" \ | ||
| 209 | "punpcklwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \ | ||
| 210 | /* Right part */ \ | ||
| 211 | "pmullh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \ | ||
| 212 | "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \ | ||
| 213 | "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \ | ||
| 214 | /* Left part */ \ | ||
| 215 | "pmullh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \ | ||
| 216 | "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \ | ||
| 217 | "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \ | ||
| 218 | /* Combine left and right part */ \ | ||
| 219 | "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \ | ||
| 220 | "psubsb %[q1], %[q1], %[ftmp4] \n\t" \ | ||
| 221 | "xor %[q1], %[q1], %[ftmp7] \n\t" \ | ||
| 222 | "paddsb %[p1], %[p1], %[ftmp4] \n\t" \ | ||
| 223 | "xor %[p1], %[p1], %[ftmp7] \n\t" \ | ||
| 224 | "li %[tmp0], 0x03 \n\t" \ | ||
| 225 | "dmtc1 %[tmp0], %[ftmp1] \n\t" \ | ||
| 226 | /* Right part */ \ | ||
| 227 | "psllh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \ | ||
| 228 | "paddh %[ftmp3], %[ftmp3], %[ftmp6] \n\t" \ | ||
| 229 | "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \ | ||
| 230 | "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \ | ||
| 231 | /* Left part */ \ | ||
| 232 | "psllh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \ | ||
| 233 | "paddh %[ftmp4], %[ftmp4], %[ftmp5] \n\t" \ | ||
| 234 | "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \ | ||
| 235 | "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \ | ||
| 236 | /* Combine left and right part */ \ | ||
| 237 | "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \ | ||
| 238 | "psubsb %[q2], %[q2], %[ftmp4] \n\t" \ | ||
| 239 | "xor %[q2], %[q2], %[ftmp7] \n\t" \ | ||
| 240 | "paddsb %[p2], %[p2], %[ftmp4] \n\t" \ | ||
| 241 | "xor %[p2], %[p2], %[ftmp7] \n\t" | ||
| 242 | |||
| 28 | #define PUT_VP8_EPEL4_H6_MMI(src, dst) \ | 243 | #define PUT_VP8_EPEL4_H6_MMI(src, dst) \ |
| 29 | MMI_ULWC1(%[ftmp1], src, 0x00) \ | 244 | MMI_ULWC1(%[ftmp1], src, 0x00) \ |
| 30 | "punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n\t" \ | 245 | "punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n\t" \ |
| @@ -621,15 +836,71 @@ static av_always_inline int vp8_normal_limit(uint8_t *p, ptrdiff_t stride, · 590 unmodified lines | |||
| 621 | static av_always_inline void vp8_v_loop_filter8_mmi(uint8_t *dst, | 836 | static av_always_inline void vp8_v_loop_filter8_mmi(uint8_t *dst, |
| 622 | ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh) | 837 | ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh) |
| 623 | { | 838 | { |
| 624 | int i; | 839 | double ftmp[18]; |
| 625 | 840 | uint32_t tmp[1]; | |
| 626 | for (i = 0; i < 8; i++) | 841 | DECLARE_DOUBLE_1; |
| 627 | if (vp8_normal_limit(dst + i * 1, stride, flim_E, flim_I)) { | 842 | DECLARE_DOUBLE_2; |
| 628 | if (hev(dst + i * 1, stride, hev_thresh)) | 843 | DECLARE_UINT32_T; |
| 629 | vp8_filter_common_is4tap(dst + i * 1, stride); | 844 | __asm__ volatile( |
| 630 | else | 845 | /* Get data from dst */ |
| 631 | filter_mbedge(dst + i * 1, stride); | 846 | "gsldlc1 %[q0], 0x07(%[dst]) \n\t" |
| 632 | } | 847 | "gsldrc1 %[q0], 0x00(%[dst]) \n\t" |
| 848 | PTR_SUBU "%[tmp0], %[dst], %[stride] \n\t" | ||
| 849 | "gsldlc1 %[p0], 0x07(%[tmp0]) \n\t" | ||
| 850 | "gsldrc1 %[p0], 0x00(%[tmp0]) \n\t" | ||
| 851 | PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 852 | "gsldlc1 %[p1], 0x07(%[tmp0]) \n\t" | ||
| 853 | "gsldrc1 %[p1], 0x00(%[tmp0]) \n\t" | ||
| 854 | PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 855 | "gsldlc1 %[p2], 0x07(%[tmp0]) \n\t" | ||
| 856 | "gsldrc1 %[p2], 0x00(%[tmp0]) \n\t" | ||
| 857 | PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 858 | "gsldlc1 %[p3], 0x07(%[tmp0]) \n\t" | ||
| 859 | "gsldrc1 %[p3], 0x00(%[tmp0]) \n\t" | ||
| 860 | PTR_ADDU "%[tmp0], %[dst], %[stride] \n\t" | ||
| 861 | "gsldlc1 %[q1], 0x07(%[tmp0]) \n\t" | ||
| 862 | "gsldrc1 %[q1], 0x00(%[tmp0]) \n\t" | ||
| 863 | PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 864 | "gsldlc1 %[q2], 0x07(%[tmp0]) \n\t" | ||
| 865 | "gsldrc1 %[q2], 0x00(%[tmp0]) \n\t" | ||
| 866 | PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 867 | "gsldlc1 %[q3], 0x07(%[tmp0]) \n\t" | ||
| 868 | "gsldrc1 %[q3], 0x00(%[tmp0]) \n\t" | ||
| 869 | MMI_VP8_LOOP_FILTER | ||
| 870 | /* Move to dst */ | ||
| 871 | "gssdlc1 %[q0], 0x07(%[dst]) \n\t" | ||
| 872 | "gssdrc1 %[q0], 0x00(%[dst]) \n\t" | ||
| 873 | PTR_SUBU "%[tmp0], %[dst], %[stride] \n\t" | ||
| 874 | "gssdlc1 %[p0], 0x07(%[tmp0]) \n\t" | ||
| 875 | "gssdrc1 %[p0], 0x00(%[tmp0]) \n\t" | ||
| 876 | PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 877 | "gssdlc1 %[p1], 0x07(%[tmp0]) \n\t" | ||
| 878 | "gssdrc1 %[p1], 0x00(%[tmp0]) \n\t" | ||
| 879 | PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 880 | "gssdlc1 %[p2], 0x07(%[tmp0]) \n\t" | ||
| 881 | "gssdrc1 %[p2], 0x00(%[tmp0]) \n\t" | ||
| 882 | PTR_ADDU "%[tmp0], %[dst], %[stride] \n\t" | ||
| 883 | "gssdlc1 %[q1], 0x07(%[tmp0]) \n\t" | ||
| 884 | "gssdrc1 %[q1], 0x00(%[tmp0]) \n\t" | ||
| 885 | PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 886 | "gssdlc1 %[q2], 0x07(%[tmp0]) \n\t" | ||
| 887 | "gssdrc1 %[q2], 0x00(%[tmp0]) \n\t" | ||
| 888 | : [p3]"=&f"(ftmp[0]), [p2]"=&f"(ftmp[1]), | ||
| 889 | [p1]"=&f"(ftmp[2]), [p0]"=&f"(ftmp[3]), | ||
| 890 | [q0]"=&f"(ftmp[4]), [q1]"=&f"(ftmp[5]), | ||
| 891 | [q2]"=&f"(ftmp[6]), [q3]"=&f"(ftmp[7]), | ||
| 892 | [ftmp0]"=&f"(ftmp[8]), [ftmp1]"=&f"(ftmp[9]), | ||
| 893 | [ftmp2]"=&f"(ftmp[10]), [ftmp3]"=&f"(ftmp[11]), | ||
| 894 | [hev]"=&f"(ftmp[12]), [mask]"=&f"(ftmp[13]), | ||
| 895 | [ftmp4]"=&f"(ftmp[14]), [ftmp5]"=&f"(ftmp[15]), | ||
| 896 | [ftmp6]"=&f"(ftmp[16]), [ftmp7]"=&f"(ftmp[17]), | ||
| 897 | [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]), | ||
| 898 | RESTRICT_ASM_DOUBLE_1, RESTRICT_ASM_DOUBLE_2, | ||
| 899 | RESTRICT_ASM_UINT32_T | ||
| 900 | : [e]"r"((mips_reg)flim_E), [thresh]"r"((mips_reg)hev_thresh), | ||
| 901 | [i]"r"((mips_reg)flim_I), [stride]"r"((mips_reg)stride) | ||
| 902 | : "memory" | ||
| 903 | ); | ||
| 633 | } | 904 | } |
| 634 | 905 | ||
| 635 | static av_always_inline void vp8_v_loop_filter8_inner_mmi(uint8_t *dst, | 906 | static av_always_inline void vp8_v_loop_filter8_inner_mmi(uint8_t *dst, |
| @@ -650,15 +921,87 @@ static av_always_inline void vp8_v_loop_filter8_inner_mmi(uint8_t *dst, · 14 unmodified lines | |||
| 650 | static av_always_inline void vp8_h_loop_filter8_mmi(uint8_t *dst, | 921 | static av_always_inline void vp8_h_loop_filter8_mmi(uint8_t *dst, |
| 651 | ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh) | 922 | ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh) |
| 652 | { | 923 | { |
| 653 | int i; | 924 | double ftmp[18]; |
| 654 | 925 | uint32_t tmp[1]; | |
| 655 | for (i = 0; i < 8; i++) | 926 | DECLARE_DOUBLE_1; |
| 656 | if (vp8_normal_limit(dst + i * stride, 1, flim_E, flim_I)) { | 927 | DECLARE_DOUBLE_2; |
| 657 | if (hev(dst + i * stride, 1, hev_thresh)) | 928 | DECLARE_UINT32_T; |
| 658 | vp8_filter_common_is4tap(dst + i * stride, 1); | 929 | __asm__ volatile( |
| 659 | else | 930 | /* Get data from dst */ |
| 660 | filter_mbedge(dst + i * stride, 1); | 931 | "gsldlc1 %[p3], 0x03(%[dst]) \n\t" |
| 661 | } | 932 | "gsldrc1 %[p3], -0x04(%[dst]) \n\t" |
| 933 | PTR_ADDU "%[tmp0], %[dst], %[stride] \n\t" | ||
| 934 | "gsldlc1 %[p2], 0x03(%[tmp0]) \n\t" | ||
| 935 | "gsldrc1 %[p2], -0x04(%[tmp0]) \n\t" | ||
| 936 | PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 937 | "gsldlc1 %[p1], 0x03(%[tmp0]) \n\t" | ||
| 938 | "gsldrc1 %[p1], -0x04(%[tmp0]) \n\t" | ||
| 939 | PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 940 | "gsldlc1 %[p0], 0x03(%[tmp0]) \n\t" | ||
| 941 | "gsldrc1 %[p0], -0x04(%[tmp0]) \n\t" | ||
| 942 | PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 943 | "gsldlc1 %[q0], 0x03(%[tmp0]) \n\t" | ||
| 944 | "gsldrc1 %[q0], -0x04(%[tmp0]) \n\t" | ||
| 945 | PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 946 | "gsldlc1 %[q1], 0x03(%[tmp0]) \n\t" | ||
| 947 | "gsldrc1 %[q1], -0x04(%[tmp0]) \n\t" | ||
| 948 | PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 949 | "gsldlc1 %[q2], 0x03(%[tmp0]) \n\t" | ||
| 950 | "gsldrc1 %[q2], -0x04(%[tmp0]) \n\t" | ||
| 951 | PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" | ||
| 952 | "gsldlc1 %[q3], 0x03(%[tmp0]) \n\t" | ||
| 953 | "gsldrc1 %[q3], -0x04(%[tmp0]) \n\t" | ||
| 954 | /* Matrix transpose */ | ||
| 955 | MMI_TRANSPOSE8x8_UB_UB(%[p3], %[p2], %[p1], %[p0], | ||
| 956 | %[q0], %[q1], %[q2], %[q3], | ||
| 957 | %[p3], %[p2], %[p1], %[p0], | ||
| 958 | %[q0], %[q1], %[q2], %[q3]) | ||
| 959 | MMI_VP8_LOOP_FILTER | ||
| 960 | /* Matrix transpose */ | ||
| 961 | MMI_TRANSPOSE8x8_UB_UB(%[p3], %[p2], %[p1], %[p0], | ||
| 962 | %[q0], %[q1], %[q2], %[q3], | ||
| 963 | %[p3], %[p2], %[p1], %[p0], | ||
| 964 | %[q0], %[q1], %[q2], %[q3]) | ||
| 965 | /* Move to dst */ | ||
| 966 | "gssdlc1 %[p3], 0x03(%[dst]) \n\t" | ||
| 967 | "gssdrc1 %[p3], -0x04(%[dst]) \n\t" | ||
| 968 | PTR_ADDU "%[dst], %[dst], %[stride] \n\t" | ||
| 969 | "gssdlc1 %[p2], 0x03(%[dst]) \n\t" | ||
| 970 | "gssdrc1 %[p2], -0x04(%[dst]) \n\t" | ||
| 971 | PTR_ADDU "%[dst], %[dst], %[stride] \n\t" | ||
| 972 | "gssdlc1 %[p1], 0x03(%[dst]) \n\t" | ||
| 973 | "gssdrc1 %[p1], -0x04(%[dst]) \n\t" | ||
| 974 | PTR_ADDU "%[dst], %[dst], %[stride] \n\t" | ||
| 975 | "gssdlc1 %[p0], 0x03(%[dst]) \n\t" | ||
| 976 | "gssdrc1 %[p0], -0x04(%[dst]) \n\t" | ||
| 977 | PTR_ADDU "%[dst], %[dst], %[stride] \n\t" | ||
| 978 | "gssdlc1 %[q0], 0x03(%[dst]) \n\t" | ||
| 979 | "gssdrc1 %[q0], -0x04(%[dst]) \n\t" | ||
| 980 | PTR_ADDU "%[dst], %[dst], %[stride] \n\t" | ||
| 981 | "gssdlc1 %[q1], 0x03(%[dst]) \n\t" | ||
| 982 | "gssdrc1 %[q1], -0x04(%[dst]) \n\t" | ||
| 983 | PTR_ADDU "%[dst], %[dst], %[stride] \n\t" | ||
| 984 | "gssdlc1 %[q2], 0x03(%[dst]) \n\t" | ||
| 985 | "gssdrc1 %[q2], -0x04(%[dst]) \n\t" | ||
| 986 | PTR_ADDU "%[dst], %[dst], %[stride] \n\t" | ||
| 987 | "gssdlc1 %[q3], 0x03(%[dst]) \n\t" | ||
| 988 | "gssdrc1 %[q3], -0x04(%[dst]) \n\t" | ||
| 989 | : [p3]"=&f"(ftmp[0]), [p2]"=&f"(ftmp[1]), | ||
| 990 | [p1]"=&f"(ftmp[2]), [p0]"=&f"(ftmp[3]), | ||
| 991 | [q0]"=&f"(ftmp[4]), [q1]"=&f"(ftmp[5]), | ||
| 992 | [q2]"=&f"(ftmp[6]), [q3]"=&f"(ftmp[7]), | ||
| 993 | [ftmp0]"=&f"(ftmp[8]), [ftmp1]"=&f"(ftmp[9]), | ||
| 994 | [ftmp2]"=&f"(ftmp[10]), [ftmp3]"=&f"(ftmp[11]), | ||
| 995 | [hev]"=&f"(ftmp[12]), [mask]"=&f"(ftmp[13]), | ||
| 996 | [ftmp4]"=&f"(ftmp[14]), [ftmp5]"=&f"(ftmp[15]), | ||
| 997 | [ftmp6]"=&f"(ftmp[16]), [ftmp7]"=&f"(ftmp[17]), | ||
| 998 | [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]), | ||
| 999 | RESTRICT_ASM_DOUBLE_1, RESTRICT_ASM_DOUBLE_2, | ||
| 1000 | RESTRICT_ASM_UINT32_T | ||
| 1001 | : [e]"r"((mips_reg)flim_E), [thresh]"r"((mips_reg)hev_thresh), | ||
| 1002 | [i]"r"((mips_reg)flim_I), [stride]"r"((mips_reg)stride) | ||
| 1003 | : "memory" | ||
| 1004 | ); | ||
| 662 | } | 1005 | } |
| 663 | 1006 | ||
| 664 | static av_always_inline void vp8_h_loop_filter8_inner_mmi(uint8_t *dst, | 1007 | static av_always_inline void vp8_h_loop_filter8_inner_mmi(uint8_t *dst, |
| @@ -1083,29 +1426,16 @@ void ff_vp8_idct_dc_add4uv_mmi(uint8_t *dst, int16_t block[4][16], · 418 unmodified lines | |||
| 1083 | void ff_vp8_v_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E, | 1426 | void ff_vp8_v_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E, |
| 1084 | int flim_I, int hev_thresh) | 1427 | int flim_I, int hev_thresh) |
| 1085 | { | 1428 | { |
| 1086 | int i; | 1429 | vp8_v_loop_filter8_mmi(dst, stride, flim_E, flim_I, hev_thresh); |
| 1087 | 1430 | vp8_v_loop_filter8_mmi(dst + 8, stride, flim_E, flim_I, hev_thresh); | |
| 1088 | for (i = 0; i < 16; i++) | ||
| 1089 | if (vp8_normal_limit(dst + i * 1, stride, flim_E, flim_I)) { | ||
| 1090 | if (hev(dst + i * 1, stride, hev_thresh)) | ||
| 1091 | vp8_filter_common_is4tap(dst + i * 1, stride); | ||
| 1092 | else | ||
| 1093 | filter_mbedge(dst + i * 1, stride); | ||
| 1094 | } | ||
| 1095 | } | 1431 | } |
| 1096 | 1432 | ||
| 1097 | void ff_vp8_h_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E, | 1433 | void ff_vp8_h_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E, |
| 1098 | int flim_I, int hev_thresh) | 1434 | int flim_I, int hev_thresh) |
| 1099 | { | 1435 | { |
| 1100 | int i; | 1436 | vp8_h_loop_filter8_mmi(dst, stride, flim_E, flim_I, hev_thresh); |
| 1101 | 1437 | vp8_h_loop_filter8_mmi(dst + 8 * stride, stride, flim_E, flim_I, | |
| 1102 | for (i = 0; i < 16; i++) | 1438 | hev_thresh); |
| 1103 | if (vp8_normal_limit(dst + i * stride, 1, flim_E, flim_I)) { | ||
| 1104 | if (hev(dst + i * stride, 1, hev_thresh)) | ||
| 1105 | vp8_filter_common_is4tap(dst + i * stride, 1); | ||
| 1106 | else | ||
| 1107 | filter_mbedge(dst + i * stride, 1); | ||
| 1108 | } | ||
| 1109 | } | 1439 | } |
| 1110 | 1440 | ||
| 1111 | void ff_vp8_v_loop_filter8uv_mmi(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, | 1441 | void ff_vp8_v_loop_filter8uv_mmi(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, |
| @@ -275,6 +275,34 @@ · 274 unmodified lines | |||
| 275 | "punpcklwd "#m3", "#t2", "#t4" \n\t" \ | 275 | "punpcklwd "#m3", "#t2", "#t4" \n\t" \ |
| 276 | "punpckhwd "#m4", "#t2", "#t4" \n\t" | 276 | "punpckhwd "#m4", "#t2", "#t4" \n\t" |
| 277 | 277 | ||
| 278 | /** | ||
| 279 | * brief: Parallel SRA for 8 byte packaged data. | ||
| 280 | * fr_i0: src | ||
| 281 | * fr_i1: SRA number(SRAB number + 8) | ||
| 282 | * fr_t0, fr_t1: temporary register | ||
| 283 | * fr_d0: dst | ||
| 284 | */ | ||
| 285 | #define PSRAB_MMI(fr_i0, fr_i1, fr_t0, fr_t1, fr_d0) \ | ||
| 286 | "punpcklbh "#fr_t0", "#fr_t0", "#fr_i0" \n\t" \ | ||
| 287 | "punpckhbh "#fr_t1", "#fr_t1", "#fr_i0" \n\t" \ | ||
| 288 | "psrah "#fr_t0", "#fr_t0", "#fr_i1" \n\t" \ | ||
| 289 | "psrah "#fr_t1", "#fr_t1", "#fr_i1" \n\t" \ | ||
| 290 | "packsshb "#fr_d0", "#fr_t0", "#fr_t1" \n\t" | ||
| 291 | |||
| 292 | /** | ||
| 293 | * brief: Parallel SRL for 8 byte packaged data. | ||
| 294 | * fr_i0: src | ||
| 295 | * fr_i1: SRL number(SRLB number + 8) | ||
| 296 | * fr_t0, fr_t1: temporary register | ||
| 297 | * fr_d0: dst | ||
| 298 | */ | ||
| 299 | #define PSRLB_MMI(fr_i0, fr_i1, fr_t0, fr_t1, fr_d0) \ | ||
| 300 | "punpcklbh "#fr_t0", "#fr_t0", "#fr_i0" \n\t" \ | ||
| 301 | "punpckhbh "#fr_t1", "#fr_t1", "#fr_i0" \n\t" \ | ||
| 302 | "psrlh "#fr_t0", "#fr_t0", "#fr_i1" \n\t" \ | ||
| 303 | "psrlh "#fr_t1", "#fr_t1", "#fr_i1" \n\t" \ | ||
| 304 | "packsshb "#fr_d0", "#fr_t0", "#fr_t1" \n\t" | ||
| 305 | |||
| 278 | 306 | ||
| 279 | #define PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift) \ | 307 | #define PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift) \ |
| 280 | "psrah "#fp1", "#fp1", "#shift" \n\t" \ | 308 | "psrah "#fp1", "#fp1", "#shift" \n\t" \ |