| OLD | NEW |
| (Empty) | |
| 1 /* |
| 2 * Copyright (c) 2015 The WebM project authors. All Rights Reserved. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ |
| 10 |
| 11 #ifndef VP9_ENCODER_MIPS_MSA_VP9_FDCT_MSA_H_ |
| 12 #define VP9_ENCODER_MIPS_MSA_VP9_FDCT_MSA_H_ |
| 13 |
| 14 #include "vpx_ports/mem.h" |
| 15 #include "vp9/common/vp9_idct.h" |
| 16 #include "vp9/common/mips/msa/vp9_macros_msa.h" |
| 17 |
| 18 #define VP9_DOTP_CONST_PAIR(reg0, reg1, cnst0, cnst1, out0, out1) { \ |
| 19 v8i16 k0_m = __msa_fill_h(cnst0); \ |
| 20 v4i32 s0_m, s1_m, s2_m, s3_m; \ |
| 21 \ |
| 22 s0_m = (v4i32)__msa_fill_h(cnst1); \ |
| 23 k0_m = __msa_ilvev_h((v8i16)s0_m, k0_m); \ |
| 24 \ |
| 25 ILVRL_H2_SW((-reg1), reg0, s1_m, s0_m); \ |
| 26 ILVRL_H2_SW(reg0, reg1, s3_m, s2_m); \ |
| 27 DOTP_SH2_SW(s1_m, s0_m, k0_m, k0_m, s1_m, s0_m); \ |
| 28 SRARI_W2_SW(s1_m, s0_m, DCT_CONST_BITS); \ |
| 29 out0 = __msa_pckev_h((v8i16)s0_m, (v8i16)s1_m); \ |
| 30 \ |
| 31 DOTP_SH2_SW(s3_m, s2_m, k0_m, k0_m, s1_m, s0_m); \ |
| 32 SRARI_W2_SW(s1_m, s0_m, DCT_CONST_BITS); \ |
| 33 out1 = __msa_pckev_h((v8i16)s0_m, (v8i16)s1_m); \ |
| 34 } |
| 35 |
| 36 #define VP9_DOT_ADD_SUB_SRARI_PCK(in0, in1, in2, in3, in4, in5, in6, in7, \ |
| 37 dst0, dst1, dst2, dst3) { \ |
| 38 v4i32 tp0_m, tp1_m, tp2_m, tp3_m, tp4_m; \ |
| 39 v4i32 tp5_m, tp6_m, tp7_m, tp8_m, tp9_m; \ |
| 40 \ |
| 41 DOTP_SH4_SW(in0, in1, in0, in1, in4, in4, in5, in5, \ |
| 42 tp0_m, tp2_m, tp3_m, tp4_m); \ |
| 43 DOTP_SH4_SW(in2, in3, in2, in3, in6, in6, in7, in7, \ |
| 44 tp5_m, tp6_m, tp7_m, tp8_m); \ |
| 45 BUTTERFLY_4(tp0_m, tp3_m, tp7_m, tp5_m, tp1_m, tp9_m, tp7_m, tp5_m); \ |
| 46 BUTTERFLY_4(tp2_m, tp4_m, tp8_m, tp6_m, tp3_m, tp0_m, tp4_m, tp2_m); \ |
| 47 SRARI_W4_SW(tp1_m, tp9_m, tp7_m, tp5_m, DCT_CONST_BITS); \ |
| 48 SRARI_W4_SW(tp3_m, tp0_m, tp4_m, tp2_m, DCT_CONST_BITS); \ |
| 49 PCKEV_H4_SH(tp1_m, tp3_m, tp9_m, tp0_m, tp7_m, tp4_m, tp5_m, tp2_m, \ |
| 50 dst0, dst1, dst2, dst3); \ |
| 51 } |
| 52 |
| 53 #define VP9_DOT_SHIFT_RIGHT_PCK_H(in0, in1, in2) ({ \ |
| 54 v8i16 dst_m; \ |
| 55 v4i32 tp0_m, tp1_m; \ |
| 56 \ |
| 57 DOTP_SH2_SW(in0, in1, in2, in2, tp1_m, tp0_m); \ |
| 58 SRARI_W2_SW(tp1_m, tp0_m, DCT_CONST_BITS); \ |
| 59 dst_m = __msa_pckev_h((v8i16)tp1_m, (v8i16)tp0_m); \ |
| 60 \ |
| 61 dst_m; \ |
| 62 }) |
| 63 |
| 64 #define VP9_ADST8(in0, in1, in2, in3, in4, in5, in6, in7, \ |
| 65 out0, out1, out2, out3, out4, out5, out6, out7) { \ |
| 66 v8i16 cnst0_m, cnst1_m, cnst2_m, cnst3_m, cnst4_m; \ |
| 67 v8i16 vec0_m, vec1_m, vec2_m, vec3_m, s0_m, s1_m; \ |
| 68 v8i16 coeff0_m = { cospi_2_64, cospi_6_64, cospi_10_64, cospi_14_64, \ |
| 69 cospi_18_64, cospi_22_64, cospi_26_64, cospi_30_64 }; \ |
| 70 v8i16 coeff1_m = { cospi_8_64, -cospi_8_64, cospi_16_64, -cospi_16_64, \ |
| 71 cospi_24_64, -cospi_24_64, 0, 0 }; \ |
| 72 \ |
| 73 SPLATI_H2_SH(coeff0_m, 0, 7, cnst0_m, cnst1_m); \ |
| 74 cnst2_m = -cnst0_m; \ |
| 75 ILVEV_H2_SH(cnst0_m, cnst1_m, cnst1_m, cnst2_m, cnst0_m, cnst1_m); \ |
| 76 SPLATI_H2_SH(coeff0_m, 4, 3, cnst2_m, cnst3_m); \ |
| 77 cnst4_m = -cnst2_m; \ |
| 78 ILVEV_H2_SH(cnst2_m, cnst3_m, cnst3_m, cnst4_m, cnst2_m, cnst3_m); \ |
| 79 \ |
| 80 ILVRL_H2_SH(in0, in7, vec1_m, vec0_m); \ |
| 81 ILVRL_H2_SH(in4, in3, vec3_m, vec2_m); \ |
| 82 VP9_DOT_ADD_SUB_SRARI_PCK(vec0_m, vec1_m, vec2_m, vec3_m, cnst0_m, \ |
| 83 cnst1_m, cnst2_m, cnst3_m, in7, in0, \ |
| 84 in4, in3); \ |
| 85 \ |
| 86 SPLATI_H2_SH(coeff0_m, 2, 5, cnst0_m, cnst1_m); \ |
| 87 cnst2_m = -cnst0_m; \ |
| 88 ILVEV_H2_SH(cnst0_m, cnst1_m, cnst1_m, cnst2_m, cnst0_m, cnst1_m); \ |
| 89 SPLATI_H2_SH(coeff0_m, 6, 1, cnst2_m, cnst3_m); \ |
| 90 cnst4_m = -cnst2_m; \ |
| 91 ILVEV_H2_SH(cnst2_m, cnst3_m, cnst3_m, cnst4_m, cnst2_m, cnst3_m); \ |
| 92 \ |
| 93 ILVRL_H2_SH(in2, in5, vec1_m, vec0_m); \ |
| 94 ILVRL_H2_SH(in6, in1, vec3_m, vec2_m); \ |
| 95 \ |
| 96 VP9_DOT_ADD_SUB_SRARI_PCK(vec0_m, vec1_m, vec2_m, vec3_m, cnst0_m, \ |
| 97 cnst1_m, cnst2_m, cnst3_m, in5, in2, \ |
| 98 in6, in1); \ |
| 99 BUTTERFLY_4(in7, in0, in2, in5, s1_m, s0_m, in2, in5); \ |
| 100 out7 = -s0_m; \ |
| 101 out0 = s1_m; \ |
| 102 \ |
| 103 SPLATI_H4_SH(coeff1_m, 0, 4, 1, 5, cnst0_m, cnst1_m, cnst2_m, cnst3_m); \ |
| 104 \ |
| 105 ILVEV_H2_SH(cnst3_m, cnst0_m, cnst1_m, cnst2_m, cnst3_m, cnst2_m); \ |
| 106 cnst0_m = __msa_ilvev_h(cnst1_m, cnst0_m); \ |
| 107 cnst1_m = cnst0_m; \ |
| 108 \ |
| 109 ILVRL_H2_SH(in4, in3, vec1_m, vec0_m); \ |
| 110 ILVRL_H2_SH(in6, in1, vec3_m, vec2_m); \ |
| 111 VP9_DOT_ADD_SUB_SRARI_PCK(vec0_m, vec1_m, vec2_m, vec3_m, cnst0_m, \ |
| 112 cnst2_m, cnst3_m, cnst1_m, out1, out6, \ |
| 113 s0_m, s1_m); \ |
| 114 \ |
| 115 SPLATI_H2_SH(coeff1_m, 2, 3, cnst0_m, cnst1_m); \ |
| 116 cnst1_m = __msa_ilvev_h(cnst1_m, cnst0_m); \ |
| 117 \ |
| 118 ILVRL_H2_SH(in2, in5, vec1_m, vec0_m); \ |
| 119 ILVRL_H2_SH(s0_m, s1_m, vec3_m, vec2_m); \ |
| 120 out3 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst0_m); \ |
| 121 out4 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst1_m); \ |
| 122 out2 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2_m, vec3_m, cnst0_m); \ |
| 123 out5 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2_m, vec3_m, cnst1_m); \ |
| 124 \ |
| 125 out1 = -out1; \ |
| 126 out3 = -out3; \ |
| 127 out5 = -out5; \ |
| 128 } |
| 129 |
| 130 #define VP9_MADD_SHORT(m0, m1, c0, c1, res0, res1) { \ |
| 131 v4i32 madd0_m, madd1_m, madd2_m, madd3_m; \ |
| 132 v8i16 madd_s0_m, madd_s1_m; \ |
| 133 \ |
| 134 ILVRL_H2_SH(m1, m0, madd_s0_m, madd_s1_m); \ |
| 135 DOTP_SH4_SW(madd_s0_m, madd_s1_m, madd_s0_m, madd_s1_m, \ |
| 136 c0, c0, c1, c1, madd0_m, madd1_m, madd2_m, madd3_m); \ |
| 137 SRARI_W4_SW(madd0_m, madd1_m, madd2_m, madd3_m, DCT_CONST_BITS); \ |
| 138 PCKEV_H2_SH(madd1_m, madd0_m, madd3_m, madd2_m, res0, res1); \ |
| 139 } |
| 140 |
| 141 #define VP9_MADD_BF(inp0, inp1, inp2, inp3, cst0, cst1, cst2, cst3, \ |
| 142 out0, out1, out2, out3) { \ |
| 143 v8i16 madd_s0_m, madd_s1_m, madd_s2_m, madd_s3_m; \ |
| 144 v4i32 tmp0_m, tmp1_m, tmp2_m, tmp3_m, m4_m, m5_m; \ |
| 145 \ |
| 146 ILVRL_H2_SH(inp1, inp0, madd_s0_m, madd_s1_m); \ |
| 147 ILVRL_H2_SH(inp3, inp2, madd_s2_m, madd_s3_m); \ |
| 148 DOTP_SH4_SW(madd_s0_m, madd_s1_m, madd_s2_m, madd_s3_m, \ |
| 149 cst0, cst0, cst2, cst2, tmp0_m, tmp1_m, tmp2_m, tmp3_m); \ |
| 150 BUTTERFLY_4(tmp0_m, tmp1_m, tmp3_m, tmp2_m, \ |
| 151 m4_m, m5_m, tmp3_m, tmp2_m); \ |
| 152 SRARI_W4_SW(m4_m, m5_m, tmp2_m, tmp3_m, DCT_CONST_BITS); \ |
| 153 PCKEV_H2_SH(m5_m, m4_m, tmp3_m, tmp2_m, out0, out1); \ |
| 154 DOTP_SH4_SW(madd_s0_m, madd_s1_m, madd_s2_m, madd_s3_m, \ |
| 155 cst1, cst1, cst3, cst3, tmp0_m, tmp1_m, tmp2_m, tmp3_m); \ |
| 156 BUTTERFLY_4(tmp0_m, tmp1_m, tmp3_m, tmp2_m, \ |
| 157 m4_m, m5_m, tmp3_m, tmp2_m); \ |
| 158 SRARI_W4_SW(m4_m, m5_m, tmp2_m, tmp3_m, DCT_CONST_BITS); \ |
| 159 PCKEV_H2_SH(m5_m, m4_m, tmp3_m, tmp2_m, out2, out3); \ |
| 160 } |
| 161 |
| 162 #define VP9_LD_HADD(psrc, stride) ({ \ |
| 163 v8i16 in0_m, in1_m, in2_m, in3_m, in4_m, in5_m, in6_m, in7_m; \ |
| 164 v4i32 vec_w_m; \ |
| 165 \ |
| 166 LD_SH4((psrc), stride, in0_m, in1_m, in2_m, in3_m); \ |
| 167 ADD2(in0_m, in1_m, in2_m, in3_m, in0_m, in2_m); \ |
| 168 LD_SH4(((psrc) + 4 * stride), stride, in4_m, in5_m, in6_m, in7_m); \ |
| 169 ADD4(in4_m, in5_m, in6_m, in7_m, in0_m, in2_m, in4_m, in6_m, \ |
| 170 in4_m, in6_m, in0_m, in4_m); \ |
| 171 in0_m += in4_m; \ |
| 172 \ |
| 173 vec_w_m = __msa_hadd_s_w(in0_m, in0_m); \ |
| 174 HADD_SW_S32(vec_w_m); \ |
| 175 }) |
| 176 |
| 177 #define VP9_FDCT_POSTPROC_2V_NEG_H(vec0, vec1) { \ |
| 178 v8i16 tp0_m, tp1_m; \ |
| 179 v8i16 one_m = __msa_ldi_h(1); \ |
| 180 \ |
| 181 tp0_m = __msa_clti_s_h(vec0, 0); \ |
| 182 tp1_m = __msa_clti_s_h(vec1, 0); \ |
| 183 vec0 += 1; \ |
| 184 vec1 += 1; \ |
| 185 tp0_m = one_m & tp0_m; \ |
| 186 tp1_m = one_m & tp1_m; \ |
| 187 vec0 += tp0_m; \ |
| 188 vec1 += tp1_m; \ |
| 189 vec0 >>= 2; \ |
| 190 vec1 >>= 2; \ |
| 191 } |
| 192 |
| 193 #define VP9_FDCT4(in0, in1, in2, in3, out0, out1, out2, out3) { \ |
| 194 v8i16 cnst0_m, cnst1_m, cnst2_m, cnst3_m; \ |
| 195 v8i16 vec0_m, vec1_m, vec2_m, vec3_m; \ |
| 196 v4i32 vec4_m, vec5_m, vec6_m, vec7_m; \ |
| 197 v8i16 coeff_m = { cospi_16_64, -cospi_16_64, cospi_8_64, \ |
| 198 cospi_24_64, -cospi_8_64, 0, 0, 0 }; \ |
| 199 \ |
| 200 BUTTERFLY_4(in0, in1, in2, in3, vec0_m, vec1_m, vec2_m, vec3_m); \ |
| 201 ILVR_H2_SH(vec1_m, vec0_m, vec3_m, vec2_m, vec0_m, vec2_m); \ |
| 202 SPLATI_H2_SH(coeff_m, 0, 1, cnst0_m, cnst1_m); \ |
| 203 cnst1_m = __msa_ilvev_h(cnst1_m, cnst0_m); \ |
| 204 vec5_m = __msa_dotp_s_w(vec0_m, cnst1_m); \ |
| 205 \ |
| 206 SPLATI_H2_SH(coeff_m, 4, 3, cnst2_m, cnst3_m); \ |
| 207 cnst2_m = __msa_ilvev_h(cnst3_m, cnst2_m); \ |
| 208 vec7_m = __msa_dotp_s_w(vec2_m, cnst2_m); \ |
| 209 \ |
| 210 vec4_m = __msa_dotp_s_w(vec0_m, cnst0_m); \ |
| 211 cnst2_m = __msa_splati_h(coeff_m, 2); \ |
| 212 cnst2_m = __msa_ilvev_h(cnst2_m, cnst3_m); \ |
| 213 vec6_m = __msa_dotp_s_w(vec2_m, cnst2_m); \ |
| 214 \ |
| 215 SRARI_W4_SW(vec4_m, vec5_m, vec6_m, vec7_m, DCT_CONST_BITS); \ |
| 216 PCKEV_H4_SH(vec4_m, vec4_m, vec5_m, vec5_m, vec6_m, vec6_m, \ |
| 217 vec7_m, vec7_m, out0, out2, out1, out3); \ |
| 218 } |
| 219 |
| 220 #define VP9_FADST4(in0, in1, in2, in3, out0, out1, out2, out3) { \ |
| 221 v4i32 s0_m, s1_m, s2_m, s3_m, constant_m; \ |
| 222 v4i32 in0_r_m, in1_r_m, in2_r_m, in3_r_m; \ |
| 223 \ |
| 224 UNPCK_R_SH_SW(in0, in0_r_m); \ |
| 225 UNPCK_R_SH_SW(in1, in1_r_m); \ |
| 226 UNPCK_R_SH_SW(in2, in2_r_m); \ |
| 227 UNPCK_R_SH_SW(in3, in3_r_m); \ |
| 228 \ |
| 229 constant_m = __msa_fill_w(sinpi_4_9); \ |
| 230 MUL2(in0_r_m, constant_m, in3_r_m, constant_m, s1_m, s0_m); \ |
| 231 \ |
| 232 constant_m = __msa_fill_w(sinpi_1_9); \ |
| 233 s0_m += in0_r_m * constant_m; \ |
| 234 s1_m -= in1_r_m * constant_m; \ |
| 235 \ |
| 236 constant_m = __msa_fill_w(sinpi_2_9); \ |
| 237 s0_m += in1_r_m * constant_m; \ |
| 238 s1_m += in3_r_m * constant_m; \ |
| 239 \ |
| 240 s2_m = in0_r_m + in1_r_m - in3_r_m; \ |
| 241 \ |
| 242 constant_m = __msa_fill_w(sinpi_3_9); \ |
| 243 MUL2(in2_r_m, constant_m, s2_m, constant_m, s3_m, in1_r_m); \ |
| 244 \ |
| 245 in0_r_m = s0_m + s3_m; \ |
| 246 s2_m = s1_m - s3_m; \ |
| 247 s3_m = s1_m - s0_m + s3_m; \ |
| 248 \ |
| 249 SRARI_W4_SW(in0_r_m, in1_r_m, s2_m, s3_m, DCT_CONST_BITS); \ |
| 250 PCKEV_H4_SH(in0_r_m, in0_r_m, in1_r_m, in1_r_m, s2_m, s2_m, \ |
| 251 s3_m, s3_m, out0, out1, out2, out3); \ |
| 252 } |
| 253 |
| 254 #define VP9_FDCT8(in0, in1, in2, in3, in4, in5, in6, in7, \ |
| 255 out0, out1, out2, out3, out4, out5, out6, out7) { \ |
| 256 v8i16 s0_m, s1_m, s2_m, s3_m, s4_m, s5_m, s6_m; \ |
| 257 v8i16 s7_m, x0_m, x1_m, x2_m, x3_m; \ |
| 258 v8i16 coeff_m = { cospi_16_64, -cospi_16_64, cospi_8_64, \ |
| 259 cospi_24_64, cospi_4_64, cospi_28_64, \ |
| 260 cospi_12_64, cospi_20_64 }; \ |
| 261 \ |
| 262 /* FDCT stage1 */ \ |
| 263 BUTTERFLY_8(in0, in1, in2, in3, in4, in5, in6, in7, \ |
| 264 s0_m, s1_m, s2_m, s3_m, s4_m, s5_m, s6_m, s7_m); \ |
| 265 BUTTERFLY_4(s0_m, s1_m, s2_m, s3_m, x0_m, x1_m, x2_m, x3_m); \ |
| 266 ILVL_H2_SH(x1_m, x0_m, x3_m, x2_m, s0_m, s2_m); \ |
| 267 ILVR_H2_SH(x1_m, x0_m, x3_m, x2_m, s1_m, s3_m); \ |
| 268 SPLATI_H2_SH(coeff_m, 0, 1, x0_m, x1_m); \ |
| 269 x1_m = __msa_ilvev_h(x1_m, x0_m); \ |
| 270 out4 = VP9_DOT_SHIFT_RIGHT_PCK_H(s0_m, s1_m, x1_m); \ |
| 271 \ |
| 272 SPLATI_H2_SH(coeff_m, 2, 3, x2_m, x3_m); \ |
| 273 x2_m = -x2_m; \ |
| 274 x2_m = __msa_ilvev_h(x3_m, x2_m); \ |
| 275 out6 = VP9_DOT_SHIFT_RIGHT_PCK_H(s2_m, s3_m, x2_m); \ |
| 276 \ |
| 277 out0 = VP9_DOT_SHIFT_RIGHT_PCK_H(s0_m, s1_m, x0_m); \ |
| 278 x2_m = __msa_splati_h(coeff_m, 2); \ |
| 279 x2_m = __msa_ilvev_h(x2_m, x3_m); \ |
| 280 out2 = VP9_DOT_SHIFT_RIGHT_PCK_H(s2_m, s3_m, x2_m); \ |
| 281 \ |
| 282 /* stage2 */ \ |
| 283 ILVRL_H2_SH(s5_m, s6_m, s1_m, s0_m); \ |
| 284 \ |
| 285 s6_m = VP9_DOT_SHIFT_RIGHT_PCK_H(s0_m, s1_m, x0_m); \ |
| 286 s5_m = VP9_DOT_SHIFT_RIGHT_PCK_H(s0_m, s1_m, x1_m); \ |
| 287 \ |
| 288 /* stage3 */ \ |
| 289 BUTTERFLY_4(s4_m, s7_m, s6_m, s5_m, x0_m, x3_m, x2_m, x1_m); \ |
| 290 \ |
| 291 /* stage4 */ \ |
| 292 ILVL_H2_SH(x3_m, x0_m, x2_m, x1_m, s4_m, s6_m); \ |
| 293 ILVR_H2_SH(x3_m, x0_m, x2_m, x1_m, s5_m, s7_m); \ |
| 294 \ |
| 295 SPLATI_H2_SH(coeff_m, 4, 5, x0_m, x1_m); \ |
| 296 x1_m = __msa_ilvev_h(x0_m, x1_m); \ |
| 297 out1 = VP9_DOT_SHIFT_RIGHT_PCK_H(s4_m, s5_m, x1_m); \ |
| 298 \ |
| 299 SPLATI_H2_SH(coeff_m, 6, 7, x2_m, x3_m); \ |
| 300 x2_m = __msa_ilvev_h(x3_m, x2_m); \ |
| 301 out5 = VP9_DOT_SHIFT_RIGHT_PCK_H(s6_m, s7_m, x2_m); \ |
| 302 \ |
| 303 x1_m = __msa_splati_h(coeff_m, 5); \ |
| 304 x0_m = -x0_m; \ |
| 305 x0_m = __msa_ilvev_h(x1_m, x0_m); \ |
| 306 out7 = VP9_DOT_SHIFT_RIGHT_PCK_H(s4_m, s5_m, x0_m); \ |
| 307 \ |
| 308 x2_m = __msa_splati_h(coeff_m, 6); \ |
| 309 x3_m = -x3_m; \ |
| 310 x2_m = __msa_ilvev_h(x2_m, x3_m); \ |
| 311 out3 = VP9_DOT_SHIFT_RIGHT_PCK_H(s6_m, s7_m, x2_m); \ |
| 312 } |
| 313 |
| 314 #define VP9_SRLI_AVE_S_4V_H(in0, in1, in2, in3, in4, in5, in6, in7) { \ |
| 315 v8i16 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \ |
| 316 \ |
| 317 SRLI_H4_SH(in0, in1, in2, in3, vec0_m, vec1_m, vec2_m, vec3_m, 15); \ |
| 318 SRLI_H4_SH(in4, in5, in6, in7, vec4_m, vec5_m, vec6_m, vec7_m, 15); \ |
| 319 AVE_SH4_SH(vec0_m, in0, vec1_m, in1, vec2_m, in2, vec3_m, in3, \ |
| 320 in0, in1, in2, in3); \ |
| 321 AVE_SH4_SH(vec4_m, in4, vec5_m, in5, vec6_m, in6, vec7_m, in7, \ |
| 322 in4, in5, in6, in7); \ |
| 323 } |
| 324 |
| 325 #define VP9_FDCT8x16_EVEN(in0, in1, in2, in3, in4, in5, in6, in7, \ |
| 326 out0, out1, out2, out3, out4, out5, out6, out7) { \ |
| 327 v8i16 s0_m, s1_m, s2_m, s3_m, s4_m, s5_m, s6_m, s7_m; \ |
| 328 v8i16 x0_m, x1_m, x2_m, x3_m; \ |
| 329 v8i16 coeff_m = { cospi_16_64, -cospi_16_64, cospi_8_64, cospi_24_64, \ |
| 330 cospi_4_64, cospi_28_64, cospi_12_64, cospi_20_64 }; \ |
| 331 \ |
| 332 /* FDCT stage1 */ \ |
| 333 BUTTERFLY_8(in0, in1, in2, in3, in4, in5, in6, in7, \ |
| 334 s0_m, s1_m, s2_m, s3_m, s4_m, s5_m, s6_m, s7_m); \ |
| 335 BUTTERFLY_4(s0_m, s1_m, s2_m, s3_m, x0_m, x1_m, x2_m, x3_m); \ |
| 336 ILVL_H2_SH(x1_m, x0_m, x3_m, x2_m, s0_m, s2_m); \ |
| 337 ILVR_H2_SH(x1_m, x0_m, x3_m, x2_m, s1_m, s3_m); \ |
| 338 SPLATI_H2_SH(coeff_m, 0, 1, x0_m, x1_m); \ |
| 339 x1_m = __msa_ilvev_h(x1_m, x0_m); \ |
| 340 out4 = VP9_DOT_SHIFT_RIGHT_PCK_H(s0_m, s1_m, x1_m); \ |
| 341 \ |
| 342 SPLATI_H2_SH(coeff_m, 2, 3, x2_m, x3_m); \ |
| 343 x2_m = -x2_m; \ |
| 344 x2_m = __msa_ilvev_h(x3_m, x2_m); \ |
| 345 out6 = VP9_DOT_SHIFT_RIGHT_PCK_H(s2_m, s3_m, x2_m); \ |
| 346 \ |
| 347 out0 = VP9_DOT_SHIFT_RIGHT_PCK_H(s0_m, s1_m, x0_m); \ |
| 348 x2_m = __msa_splati_h(coeff_m, 2); \ |
| 349 x2_m = __msa_ilvev_h(x2_m, x3_m); \ |
| 350 out2 = VP9_DOT_SHIFT_RIGHT_PCK_H(s2_m, s3_m, x2_m); \ |
| 351 \ |
| 352 /* stage2 */ \ |
| 353 ILVRL_H2_SH(s5_m, s6_m, s1_m, s0_m); \ |
| 354 \ |
| 355 s6_m = VP9_DOT_SHIFT_RIGHT_PCK_H(s0_m, s1_m, x0_m); \ |
| 356 s5_m = VP9_DOT_SHIFT_RIGHT_PCK_H(s0_m, s1_m, x1_m); \ |
| 357 \ |
| 358 /* stage3 */ \ |
| 359 BUTTERFLY_4(s4_m, s7_m, s6_m, s5_m, x0_m, x3_m, x2_m, x1_m); \ |
| 360 \ |
| 361 /* stage4 */ \ |
| 362 ILVL_H2_SH(x3_m, x0_m, x2_m, x1_m, s4_m, s6_m); \ |
| 363 ILVR_H2_SH(x3_m, x0_m, x2_m, x1_m, s5_m, s7_m); \ |
| 364 \ |
| 365 SPLATI_H2_SH(coeff_m, 4, 5, x0_m, x1_m); \ |
| 366 x1_m = __msa_ilvev_h(x0_m, x1_m); \ |
| 367 out1 = VP9_DOT_SHIFT_RIGHT_PCK_H(s4_m, s5_m, x1_m); \ |
| 368 \ |
| 369 SPLATI_H2_SH(coeff_m, 6, 7, x2_m, x3_m); \ |
| 370 x2_m = __msa_ilvev_h(x3_m, x2_m); \ |
| 371 out5 = VP9_DOT_SHIFT_RIGHT_PCK_H(s6_m, s7_m, x2_m); \ |
| 372 \ |
| 373 x1_m = __msa_splati_h(coeff_m, 5); \ |
| 374 x0_m = -x0_m; \ |
| 375 x0_m = __msa_ilvev_h(x1_m, x0_m); \ |
| 376 out7 = VP9_DOT_SHIFT_RIGHT_PCK_H(s4_m, s5_m, x0_m); \ |
| 377 \ |
| 378 x2_m = __msa_splati_h(coeff_m, 6); \ |
| 379 x3_m = -x3_m; \ |
| 380 x2_m = __msa_ilvev_h(x2_m, x3_m); \ |
| 381 out3 = VP9_DOT_SHIFT_RIGHT_PCK_H(s6_m, s7_m, x2_m); \ |
| 382 } |
| 383 |
| 384 #define VP9_FDCT8x16_ODD(input0, input1, input2, input3, \ |
| 385 input4, input5, input6, input7, \ |
| 386 out1, out3, out5, out7, \ |
| 387 out9, out11, out13, out15) { \ |
| 388 v8i16 stp21_m, stp22_m, stp23_m, stp24_m, stp25_m, stp26_m; \ |
| 389 v8i16 stp30_m, stp31_m, stp32_m, stp33_m, stp34_m, stp35_m; \ |
| 390 v8i16 stp36_m, stp37_m, vec0_m, vec1_m; \ |
| 391 v8i16 vec2_m, vec3_m, vec4_m, vec5_m, vec6_m; \ |
| 392 v8i16 cnst0_m, cnst1_m, cnst4_m, cnst5_m; \ |
| 393 v8i16 coeff_m = { cospi_16_64, -cospi_16_64, cospi_8_64, \ |
| 394 cospi_24_64, -cospi_8_64, -cospi_24_64, \ |
| 395 cospi_12_64, cospi_20_64 }; \ |
| 396 v8i16 coeff1_m = { cospi_2_64, cospi_30_64, cospi_14_64, \ |
| 397 cospi_18_64, cospi_10_64, cospi_22_64, \ |
| 398 cospi_6_64, cospi_26_64 }; \ |
| 399 v8i16 coeff2_m = { -cospi_2_64, -cospi_10_64, -cospi_18_64, \ |
| 400 -cospi_26_64, 0, 0, 0, 0 }; \ |
| 401 \ |
| 402 /* stp 1 */ \ |
| 403 ILVL_H2_SH(input2, input5, input3, input4, vec2_m, vec4_m); \ |
| 404 ILVR_H2_SH(input2, input5, input3, input4, vec3_m, vec5_m); \ |
| 405 \ |
| 406 cnst4_m = __msa_splati_h(coeff_m, 0); \ |
| 407 stp25_m = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2_m, vec3_m, cnst4_m); \ |
| 408 \ |
| 409 cnst5_m = __msa_splati_h(coeff_m, 1); \ |
| 410 cnst5_m = __msa_ilvev_h(cnst5_m, cnst4_m); \ |
| 411 stp22_m = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2_m, vec3_m, cnst5_m); \ |
| 412 stp24_m = VP9_DOT_SHIFT_RIGHT_PCK_H(vec4_m, vec5_m, cnst4_m); \ |
| 413 stp23_m = VP9_DOT_SHIFT_RIGHT_PCK_H(vec4_m, vec5_m, cnst5_m); \ |
| 414 \ |
| 415 /* stp2 */ \ |
| 416 BUTTERFLY_4(input0, input1, stp22_m, stp23_m, \ |
| 417 stp30_m, stp31_m, stp32_m, stp33_m); \ |
| 418 BUTTERFLY_4(input7, input6, stp25_m, stp24_m, \ |
| 419 stp37_m, stp36_m, stp35_m, stp34_m); \ |
| 420 \ |
| 421 ILVL_H2_SH(stp36_m, stp31_m, stp35_m, stp32_m, vec2_m, vec4_m); \ |
| 422 ILVR_H2_SH(stp36_m, stp31_m, stp35_m, stp32_m, vec3_m, vec5_m); \ |
| 423 \ |
| 424 SPLATI_H2_SH(coeff_m, 2, 3, cnst0_m, cnst1_m); \ |
| 425 cnst0_m = __msa_ilvev_h(cnst0_m, cnst1_m); \ |
| 426 stp26_m = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2_m, vec3_m, cnst0_m); \ |
| 427 \ |
| 428 cnst0_m = __msa_splati_h(coeff_m, 4); \ |
| 429 cnst1_m = __msa_ilvev_h(cnst1_m, cnst0_m); \ |
| 430 stp21_m = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2_m, vec3_m, cnst1_m); \ |
| 431 \ |
| 432 SPLATI_H2_SH(coeff_m, 5, 2, cnst0_m, cnst1_m); \ |
| 433 cnst1_m = __msa_ilvev_h(cnst0_m, cnst1_m); \ |
| 434 stp25_m = VP9_DOT_SHIFT_RIGHT_PCK_H(vec4_m, vec5_m, cnst1_m); \ |
| 435 \ |
| 436 cnst0_m = __msa_splati_h(coeff_m, 3); \ |
| 437 cnst1_m = __msa_ilvev_h(cnst1_m, cnst0_m); \ |
| 438 stp22_m = VP9_DOT_SHIFT_RIGHT_PCK_H(vec4_m, vec5_m, cnst1_m); \ |
| 439 \ |
| 440 /* stp4 */ \ |
| 441 BUTTERFLY_4(stp30_m, stp37_m, stp26_m, stp21_m, \ |
| 442 vec6_m, vec2_m, vec4_m, vec5_m); \ |
| 443 BUTTERFLY_4(stp33_m, stp34_m, stp25_m, stp22_m, \ |
| 444 stp21_m, stp23_m, stp24_m, stp31_m); \ |
| 445 \ |
| 446 ILVRL_H2_SH(vec2_m, vec6_m, vec1_m, vec0_m); \ |
| 447 SPLATI_H2_SH(coeff1_m, 0, 1, cnst0_m, cnst1_m); \ |
| 448 cnst0_m = __msa_ilvev_h(cnst0_m, cnst1_m); \ |
| 449 \ |
| 450 out1 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst0_m); \ |
| 451 \ |
| 452 cnst0_m = __msa_splati_h(coeff2_m, 0); \ |
| 453 cnst0_m = __msa_ilvev_h(cnst1_m, cnst0_m); \ |
| 454 out15 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst0_m); \ |
| 455 \ |
| 456 ILVRL_H2_SH(vec4_m, vec5_m, vec1_m, vec0_m); \ |
| 457 SPLATI_H2_SH(coeff1_m, 2, 3, cnst0_m, cnst1_m); \ |
| 458 cnst1_m = __msa_ilvev_h(cnst1_m, cnst0_m); \ |
| 459 \ |
| 460 out9 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst1_m); \ |
| 461 \ |
| 462 cnst1_m = __msa_splati_h(coeff2_m, 2); \ |
| 463 cnst0_m = __msa_ilvev_h(cnst0_m, cnst1_m); \ |
| 464 out7 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst0_m); \ |
| 465 \ |
| 466 ILVRL_H2_SH(stp23_m, stp21_m, vec1_m, vec0_m); \ |
| 467 SPLATI_H2_SH(coeff1_m, 4, 5, cnst0_m, cnst1_m); \ |
| 468 cnst0_m = __msa_ilvev_h(cnst0_m, cnst1_m); \ |
| 469 out5 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst0_m); \ |
| 470 \ |
| 471 cnst0_m = __msa_splati_h(coeff2_m, 1); \ |
| 472 cnst0_m = __msa_ilvev_h(cnst1_m, cnst0_m); \ |
| 473 out11 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst0_m); \ |
| 474 \ |
| 475 ILVRL_H2_SH(stp24_m, stp31_m, vec1_m, vec0_m); \ |
| 476 SPLATI_H2_SH(coeff1_m, 6, 7, cnst0_m, cnst1_m); \ |
| 477 cnst1_m = __msa_ilvev_h(cnst1_m, cnst0_m); \ |
| 478 \ |
| 479 out13 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst1_m); \ |
| 480 \ |
| 481 cnst1_m = __msa_splati_h(coeff2_m, 3); \ |
| 482 cnst0_m = __msa_ilvev_h(cnst0_m, cnst1_m); \ |
| 483 out3 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0_m, vec1_m, cnst0_m); \ |
| 484 } |
| 485 |
| 486 #define VP9_FDCT32_POSTPROC_NEG_W(vec) { \ |
| 487 v4i32 temp_m; \ |
| 488 v4i32 one_m = __msa_ldi_w(1); \ |
| 489 \ |
| 490 temp_m = __msa_clti_s_w(vec, 0); \ |
| 491 vec += 1; \ |
| 492 temp_m = one_m & temp_m; \ |
| 493 vec += temp_m; \ |
| 494 vec >>= 2; \ |
| 495 } |
| 496 |
| 497 #define VP9_FDCT32_POSTPROC_2V_POS_H(vec0, vec1) { \ |
| 498 v8i16 tp0_m, tp1_m; \ |
| 499 v8i16 one = __msa_ldi_h(1); \ |
| 500 \ |
| 501 tp0_m = __msa_clei_s_h(vec0, 0); \ |
| 502 tp1_m = __msa_clei_s_h(vec1, 0); \ |
| 503 tp0_m = (v8i16)__msa_xori_b((v16u8)tp0_m, 255); \ |
| 504 tp1_m = (v8i16)__msa_xori_b((v16u8)tp1_m, 255); \ |
| 505 vec0 += 1; \ |
| 506 vec1 += 1; \ |
| 507 tp0_m = one & tp0_m; \ |
| 508 tp1_m = one & tp1_m; \ |
| 509 vec0 += tp0_m; \ |
| 510 vec1 += tp1_m; \ |
| 511 vec0 >>= 2; \ |
| 512 vec1 >>= 2; \ |
| 513 } |
| 514 |
| 515 #define VP9_DOTP_CONST_PAIR_W(reg0_left, reg1_left, reg0_right, \ |
| 516 reg1_right, const0, const1, \ |
| 517 out0, out1, out2, out3) { \ |
| 518 v4i32 s0_m, s1_m, s2_m, s3_m, s4_m, s5_m, s6_m, s7_m; \ |
| 519 v2i64 tp0_m, tp1_m, tp2_m, tp3_m; \ |
| 520 v4i32 k0_m = __msa_fill_w((int32_t) const0); \ |
| 521 \ |
| 522 s0_m = __msa_fill_w((int32_t) const1); \ |
| 523 k0_m = __msa_ilvev_w(s0_m, k0_m); \ |
| 524 \ |
| 525 ILVRL_W2_SW(-reg1_left, reg0_left, s1_m, s0_m); \ |
| 526 ILVRL_W2_SW(reg0_left, reg1_left, s3_m, s2_m); \ |
| 527 ILVRL_W2_SW(-reg1_right, reg0_right, s5_m, s4_m); \ |
| 528 ILVRL_W2_SW(reg0_right, reg1_right, s7_m, s6_m); \ |
| 529 \ |
| 530 DOTP_SW2_SD(s0_m, s1_m, k0_m, k0_m, tp0_m, tp1_m); \ |
| 531 DOTP_SW2_SD(s4_m, s5_m, k0_m, k0_m, tp2_m, tp3_m); \ |
| 532 tp0_m = __msa_srari_d(tp0_m, DCT_CONST_BITS); \ |
| 533 tp1_m = __msa_srari_d(tp1_m, DCT_CONST_BITS); \ |
| 534 tp2_m = __msa_srari_d(tp2_m, DCT_CONST_BITS); \ |
| 535 tp3_m = __msa_srari_d(tp3_m, DCT_CONST_BITS); \ |
| 536 out0 = __msa_pckev_w((v4i32)tp0_m, (v4i32)tp1_m); \ |
| 537 out1 = __msa_pckev_w((v4i32)tp2_m, (v4i32)tp3_m); \ |
| 538 \ |
| 539 DOTP_SW2_SD(s2_m, s3_m, k0_m, k0_m, tp0_m, tp1_m); \ |
| 540 DOTP_SW2_SD(s6_m, s7_m, k0_m, k0_m, tp2_m, tp3_m); \ |
| 541 tp0_m = __msa_srari_d(tp0_m, DCT_CONST_BITS); \ |
| 542 tp1_m = __msa_srari_d(tp1_m, DCT_CONST_BITS); \ |
| 543 tp2_m = __msa_srari_d(tp2_m, DCT_CONST_BITS); \ |
| 544 tp3_m = __msa_srari_d(tp3_m, DCT_CONST_BITS); \ |
| 545 out2 = __msa_pckev_w((v4i32)tp0_m, (v4i32)tp1_m); \ |
| 546 out3 = __msa_pckev_w((v4i32)tp2_m, (v4i32)tp3_m); \ |
| 547 } |
| 548 #endif /* VP9_ENCODER_MIPS_MSA_VP9_FDCT_MSA_H_ */ |
| OLD | NEW |