| 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 #include "./vp9_rtcd.h" |
| 12 #include "vp9/encoder/mips/msa/vp9_fdct_msa.h" |
| 13 |
| 14 static void fdct8x32_1d_column_load_butterfly(const int16_t *input, |
| 15 int32_t src_stride, |
| 16 int16_t *temp_buff) { |
| 17 v8i16 in0, in1, in2, in3, in4, in5, in6, in7; |
| 18 v8i16 step0, step1, step2, step3; |
| 19 v8i16 in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1; |
| 20 v8i16 step0_1, step1_1, step2_1, step3_1; |
| 21 |
| 22 /* 1st and 2nd set */ |
| 23 LD_SH4(input, src_stride, in0, in1, in2, in3); |
| 24 LD_SH4(input + (28 * src_stride), src_stride, in4, in5, in6, in7); |
| 25 LD_SH4(input + (4 * src_stride), src_stride, in0_1, in1_1, in2_1, in3_1); |
| 26 LD_SH4(input + (24 * src_stride), src_stride, in4_1, in5_1, in6_1, in7_1); |
| 27 SLLI_4V(in0, in1, in2, in3, 2); |
| 28 SLLI_4V(in4, in5, in6, in7, 2); |
| 29 SLLI_4V(in0_1, in1_1, in2_1, in3_1, 2); |
| 30 SLLI_4V(in4_1, in5_1, in6_1, in7_1, 2); |
| 31 BUTTERFLY_8(in0, in1, in2, in3, in4, in5, in6, in7, |
| 32 step0, step1, step2, step3, in4, in5, in6, in7); |
| 33 BUTTERFLY_8(in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1, |
| 34 step0_1, step1_1, step2_1, step3_1, in4_1, in5_1, in6_1, in7_1); |
| 35 ST_SH4(step0, step1, step2, step3, temp_buff, 8); |
| 36 ST_SH4(in4, in5, in6, in7, temp_buff + (28 * 8), 8); |
| 37 ST_SH4(step0_1, step1_1, step2_1, step3_1, temp_buff + (4 * 8), 8); |
| 38 ST_SH4(in4_1, in5_1, in6_1, in7_1, temp_buff + (24 * 8), 8); |
| 39 |
| 40 /* 3rd and 4th set */ |
| 41 LD_SH4(input + (8 * src_stride), src_stride, in0, in1, in2, in3); |
| 42 LD_SH4(input + (20 * src_stride), src_stride, in4, in5, in6, in7); |
| 43 LD_SH4(input + (12 * src_stride), src_stride, in0_1, in1_1, in2_1, in3_1); |
| 44 LD_SH4(input + (16 * src_stride), src_stride, in4_1, in5_1, in6_1, in7_1); |
| 45 SLLI_4V(in0, in1, in2, in3, 2); |
| 46 SLLI_4V(in4, in5, in6, in7, 2); |
| 47 SLLI_4V(in0_1, in1_1, in2_1, in3_1, 2); |
| 48 SLLI_4V(in4_1, in5_1, in6_1, in7_1, 2); |
| 49 BUTTERFLY_8(in0, in1, in2, in3, in4, in5, in6, in7, |
| 50 step0, step1, step2, step3, in4, in5, in6, in7); |
| 51 BUTTERFLY_8(in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1, |
| 52 step0_1, step1_1, step2_1, step3_1, in4_1, in5_1, in6_1, in7_1); |
| 53 ST_SH4(step0, step1, step2, step3, temp_buff + (8 * 8), 8); |
| 54 ST_SH4(in4, in5, in6, in7, temp_buff + (20 * 8), 8); |
| 55 ST_SH4(step0_1, step1_1, step2_1, step3_1, temp_buff + (12 * 8), 8); |
| 56 ST_SH4(in4_1, in5_1, in6_1, in7_1, temp_buff + (15 * 8) + 8, 8); |
| 57 } |
| 58 |
| 59 static void fdct8x32_1d_column_even_store(int16_t *input, int16_t *temp) { |
| 60 v8i16 in0, in1, in2, in3, in4, in5, in6, in7; |
| 61 v8i16 in8, in9, in10, in11, in12, in13, in14, in15; |
| 62 v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7; |
| 63 v8i16 temp0, temp1; |
| 64 |
| 65 /* fdct even */ |
| 66 LD_SH4(input, 8, in0, in1, in2, in3); |
| 67 LD_SH4(input + 96, 8, in12, in13, in14, in15); |
| 68 BUTTERFLY_8(in0, in1, in2, in3, in12, in13, in14, in15, |
| 69 vec0, vec1, vec2, vec3, in12, in13, in14, in15); |
| 70 LD_SH4(input + 32, 8, in4, in5, in6, in7); |
| 71 LD_SH4(input + 64, 8, in8, in9, in10, in11); |
| 72 BUTTERFLY_8(in4, in5, in6, in7, in8, in9, in10, in11, |
| 73 vec4, vec5, vec6, vec7, in8, in9, in10, in11); |
| 74 |
| 75 /* Stage 3 */ |
| 76 ADD4(vec0, vec7, vec1, vec6, vec2, vec5, vec3, vec4, in0, in1, in2, in3); |
| 77 BUTTERFLY_4(in0, in1, in2, in3, temp0, in4, in1, in0); |
| 78 VP9_DOTP_CONST_PAIR(temp0, in4, cospi_16_64, cospi_16_64, temp1, temp0); |
| 79 VP9_FDCT32_POSTPROC_2V_POS_H(temp0, temp1); |
| 80 ST_SH(temp0, temp); |
| 81 ST_SH(temp1, temp + 512); |
| 82 |
| 83 VP9_DOTP_CONST_PAIR(in0, in1, cospi_24_64, cospi_8_64, temp1, temp0); |
| 84 VP9_FDCT32_POSTPROC_2V_POS_H(temp0, temp1); |
| 85 ST_SH(temp0, temp + 256); |
| 86 ST_SH(temp1, temp + 768); |
| 87 |
| 88 SUB4(vec0, vec7, vec1, vec6, vec2, vec5, vec3, vec4, vec7, vec6, vec5, vec4); |
| 89 VP9_DOTP_CONST_PAIR(vec6, vec5, cospi_16_64, cospi_16_64, vec5, vec6); |
| 90 ADD2(vec4, vec5, vec7, vec6, vec0, vec1); |
| 91 VP9_DOTP_CONST_PAIR(vec1, vec0, cospi_28_64, cospi_4_64, temp1, temp0); |
| 92 VP9_FDCT32_POSTPROC_2V_POS_H(temp0, temp1); |
| 93 ST_SH(temp0, temp + 128); |
| 94 ST_SH(temp1, temp + 896); |
| 95 |
| 96 SUB2(vec4, vec5, vec7, vec6, vec4, vec7); |
| 97 VP9_DOTP_CONST_PAIR(vec7, vec4, cospi_12_64, cospi_20_64, temp1, temp0); |
| 98 VP9_FDCT32_POSTPROC_2V_POS_H(temp0, temp1); |
| 99 ST_SH(temp0, temp + 640); |
| 100 ST_SH(temp1, temp + 384); |
| 101 |
| 102 VP9_DOTP_CONST_PAIR(in13, in10, cospi_16_64, cospi_16_64, vec2, vec5); |
| 103 VP9_DOTP_CONST_PAIR(in12, in11, cospi_16_64, cospi_16_64, vec3, vec4); |
| 104 ADD4(in8, vec3, in9, vec2, in14, vec5, in15, vec4, in0, vec1, vec6, in2); |
| 105 VP9_DOTP_CONST_PAIR(vec6, vec1, cospi_24_64, cospi_8_64, in1, in3); |
| 106 ADD2(in0, in1, in2, in3, vec0, vec7); |
| 107 VP9_DOTP_CONST_PAIR(vec7, vec0, cospi_30_64, cospi_2_64, temp1, temp0); |
| 108 VP9_FDCT32_POSTPROC_2V_POS_H(temp0, temp1); |
| 109 ST_SH(temp0, temp + 64); |
| 110 ST_SH(temp1, temp + 960); |
| 111 |
| 112 SUB2(in0, in1, in2, in3, in0, in2); |
| 113 VP9_DOTP_CONST_PAIR(in2, in0, cospi_14_64, cospi_18_64, temp1, temp0); |
| 114 VP9_FDCT32_POSTPROC_2V_POS_H(temp0, temp1); |
| 115 ST_SH(temp0, temp + 576); |
| 116 ST_SH(temp1, temp + 448); |
| 117 |
| 118 SUB2(in9, vec2, in14, vec5, vec2, vec5); |
| 119 VP9_DOTP_CONST_PAIR((-vec2), vec5, cospi_24_64, cospi_8_64, in2, in1); |
| 120 SUB4(in8, vec3, in15, vec4, in3, in2, in0, in1, in3, in0, vec2, vec5); |
| 121 VP9_DOTP_CONST_PAIR(vec5, vec2, cospi_22_64, cospi_10_64, temp1, temp0); |
| 122 VP9_FDCT32_POSTPROC_2V_POS_H(temp0, temp1); |
| 123 ST_SH(temp0, temp + 320); |
| 124 ST_SH(temp1, temp + 704); |
| 125 |
| 126 ADD2(in3, in2, in0, in1, vec3, vec4); |
| 127 VP9_DOTP_CONST_PAIR(vec4, vec3, cospi_6_64, cospi_26_64, temp0, temp1); |
| 128 VP9_FDCT32_POSTPROC_2V_POS_H(temp0, temp1); |
| 129 ST_SH(temp0, temp + 192); |
| 130 ST_SH(temp1, temp + 832); |
| 131 } |
| 132 |
| 133 static void fdct8x32_1d_column_odd_store(int16_t *input, int16_t *temp_ptr) { |
| 134 v8i16 in16, in17, in18, in19, in20, in21, in22, in23; |
| 135 v8i16 in24, in25, in26, in27, in28, in29, in30, in31, vec4, vec5; |
| 136 |
| 137 in20 = LD_SH(input + 32); |
| 138 in21 = LD_SH(input + 40); |
| 139 in26 = LD_SH(input + 80); |
| 140 in27 = LD_SH(input + 88); |
| 141 |
| 142 VP9_DOTP_CONST_PAIR(in27, in20, cospi_16_64, cospi_16_64, in20, in27); |
| 143 VP9_DOTP_CONST_PAIR(in26, in21, cospi_16_64, cospi_16_64, in21, in26); |
| 144 |
| 145 in18 = LD_SH(input + 16); |
| 146 in19 = LD_SH(input + 24); |
| 147 in28 = LD_SH(input + 96); |
| 148 in29 = LD_SH(input + 104); |
| 149 |
| 150 vec4 = in19 - in20; |
| 151 ST_SH(vec4, input + 32); |
| 152 vec4 = in18 - in21; |
| 153 ST_SH(vec4, input + 40); |
| 154 vec4 = in29 - in26; |
| 155 ST_SH(vec4, input + 80); |
| 156 vec4 = in28 - in27; |
| 157 ST_SH(vec4, input + 88); |
| 158 |
| 159 in21 = in18 + in21; |
| 160 in20 = in19 + in20; |
| 161 in27 = in28 + in27; |
| 162 in26 = in29 + in26; |
| 163 |
| 164 LD_SH4(input + 48, 8, in22, in23, in24, in25); |
| 165 VP9_DOTP_CONST_PAIR(in25, in22, cospi_16_64, cospi_16_64, in22, in25); |
| 166 VP9_DOTP_CONST_PAIR(in24, in23, cospi_16_64, cospi_16_64, in23, in24); |
| 167 |
| 168 in16 = LD_SH(input); |
| 169 in17 = LD_SH(input + 8); |
| 170 in30 = LD_SH(input + 112); |
| 171 in31 = LD_SH(input + 120); |
| 172 |
| 173 vec4 = in17 - in22; |
| 174 ST_SH(vec4, input + 16); |
| 175 vec4 = in16 - in23; |
| 176 ST_SH(vec4, input + 24); |
| 177 vec4 = in31 - in24; |
| 178 ST_SH(vec4, input + 96); |
| 179 vec4 = in30 - in25; |
| 180 ST_SH(vec4, input + 104); |
| 181 |
| 182 ADD4(in16, in23, in17, in22, in30, in25, in31, in24, in16, in17, in30, in31); |
| 183 VP9_DOTP_CONST_PAIR(in26, in21, cospi_24_64, cospi_8_64, in18, in29); |
| 184 VP9_DOTP_CONST_PAIR(in27, in20, cospi_24_64, cospi_8_64, in19, in28); |
| 185 ADD4(in16, in19, in17, in18, in30, in29, in31, in28, in27, in22, in21, in25); |
| 186 VP9_DOTP_CONST_PAIR(in21, in22, cospi_28_64, cospi_4_64, in26, in24); |
| 187 ADD2(in27, in26, in25, in24, in23, in20); |
| 188 VP9_DOTP_CONST_PAIR(in20, in23, cospi_31_64, cospi_1_64, vec4, vec5); |
| 189 VP9_FDCT32_POSTPROC_2V_POS_H(vec5, vec4); |
| 190 ST_SH(vec5, temp_ptr); |
| 191 ST_SH(vec4, temp_ptr + 960); |
| 192 |
| 193 SUB2(in27, in26, in25, in24, in22, in21); |
| 194 VP9_DOTP_CONST_PAIR(in21, in22, cospi_15_64, cospi_17_64, vec5, vec4); |
| 195 VP9_FDCT32_POSTPROC_2V_POS_H(vec5, vec4); |
| 196 ST_SH(vec5, temp_ptr + 448); |
| 197 ST_SH(vec4, temp_ptr + 512); |
| 198 |
| 199 SUB4(in17, in18, in16, in19, in31, in28, in30, in29, in23, in26, in24, in20); |
| 200 VP9_DOTP_CONST_PAIR((-in23), in20, cospi_28_64, cospi_4_64, in27, in25); |
| 201 SUB2(in26, in27, in24, in25, in23, in20); |
| 202 VP9_DOTP_CONST_PAIR(in20, in23, cospi_23_64, cospi_9_64, vec4, vec5); |
| 203 VP9_FDCT32_POSTPROC_2V_POS_H(vec5, vec4); |
| 204 ST_SH(vec4, temp_ptr + 704); |
| 205 ST_SH(vec5, temp_ptr + 256); |
| 206 |
| 207 ADD2(in26, in27, in24, in25, in22, in21); |
| 208 VP9_DOTP_CONST_PAIR(in21, in22, cospi_7_64, cospi_25_64, vec4, vec5); |
| 209 VP9_FDCT32_POSTPROC_2V_POS_H(vec5, vec4); |
| 210 ST_SH(vec4, temp_ptr + 192); |
| 211 ST_SH(vec5, temp_ptr + 768); |
| 212 |
| 213 LD_SH4(input + 16, 8, in22, in23, in20, in21); |
| 214 LD_SH4(input + 80, 8, in26, in27, in24, in25); |
| 215 in16 = in20; |
| 216 in17 = in21; |
| 217 VP9_DOTP_CONST_PAIR(-in16, in27, cospi_24_64, cospi_8_64, in20, in27); |
| 218 VP9_DOTP_CONST_PAIR(-in17, in26, cospi_24_64, cospi_8_64, in21, in26); |
| 219 SUB4(in23, in20, in22, in21, in25, in26, in24, in27, in28, in17, in18, in31); |
| 220 VP9_DOTP_CONST_PAIR(in18, in17, cospi_12_64, cospi_20_64, in29, in30); |
| 221 ADD2(in28, in29, in31, in30, in16, in19); |
| 222 VP9_DOTP_CONST_PAIR(in19, in16, cospi_27_64, cospi_5_64, vec5, vec4); |
| 223 VP9_FDCT32_POSTPROC_2V_POS_H(vec5, vec4); |
| 224 ST_SH(vec5, temp_ptr + 832); |
| 225 ST_SH(vec4, temp_ptr + 128); |
| 226 |
| 227 SUB2(in28, in29, in31, in30, in17, in18); |
| 228 VP9_DOTP_CONST_PAIR(in18, in17, cospi_11_64, cospi_21_64, vec5, vec4); |
| 229 VP9_FDCT32_POSTPROC_2V_POS_H(vec5, vec4); |
| 230 ST_SH(vec5, temp_ptr + 320); |
| 231 ST_SH(vec4, temp_ptr + 640); |
| 232 ADD4(in22, in21, in23, in20, in24, in27, in25, in26, in16, in29, in30, in19); |
| 233 VP9_DOTP_CONST_PAIR(-in16, in19, cospi_12_64, cospi_20_64, in28, in31); |
| 234 SUB2(in29, in28, in30, in31, in16, in19); |
| 235 VP9_DOTP_CONST_PAIR(in19, in16, cospi_19_64, cospi_13_64, vec5, vec4); |
| 236 VP9_FDCT32_POSTPROC_2V_POS_H(vec5, vec4); |
| 237 ST_SH(vec5, temp_ptr + 576); |
| 238 ST_SH(vec4, temp_ptr + 384); |
| 239 |
| 240 ADD2(in29, in28, in30, in31, in17, in18); |
| 241 VP9_DOTP_CONST_PAIR(in18, in17, cospi_3_64, cospi_29_64, vec5, vec4); |
| 242 VP9_FDCT32_POSTPROC_2V_POS_H(vec5, vec4); |
| 243 ST_SH(vec5, temp_ptr + 64); |
| 244 ST_SH(vec4, temp_ptr + 896); |
| 245 } |
| 246 |
| 247 static void fdct8x32_1d_column(const int16_t *input, int32_t src_stride, |
| 248 int16_t *tmp_buf, int16_t *tmp_buf_big) { |
| 249 fdct8x32_1d_column_load_butterfly(input, src_stride, tmp_buf); |
| 250 fdct8x32_1d_column_even_store(tmp_buf, tmp_buf_big); |
| 251 fdct8x32_1d_column_odd_store(tmp_buf + 128, (tmp_buf_big + 32)); |
| 252 } |
| 253 |
| 254 static void fdct8x32_1d_row_load_butterfly(int16_t *temp_buff, |
| 255 int16_t *output) { |
| 256 v8i16 in0, in1, in2, in3, in4, in5, in6, in7; |
| 257 v8i16 in8, in9, in10, in11, in12, in13, in14, in15; |
| 258 v8i16 step0, step1, step2, step3, step4, step5, step6, step7; |
| 259 |
| 260 LD_SH8(temp_buff, 32, in0, in1, in2, in3, in4, in5, in6, in7); |
| 261 LD_SH8(temp_buff + 24, 32, in8, in9, in10, in11, in12, in13, in14, in15); |
| 262 TRANSPOSE8x8_SH_SH(in0, in1, in2, in3, in4, in5, in6, in7, |
| 263 in0, in1, in2, in3, in4, in5, in6, in7); |
| 264 TRANSPOSE8x8_SH_SH(in8, in9, in10, in11, in12, in13, in14, in15, |
| 265 in8, in9, in10, in11, in12, in13, in14, in15); |
| 266 BUTTERFLY_16(in0, in1, in2, in3, in4, in5, in6, in7, |
| 267 in8, in9, in10, in11, in12, in13, in14, in15, |
| 268 step0, step1, step2, step3, step4, step5, step6, step7, |
| 269 in8, in9, in10, in11, in12, in13, in14, in15); |
| 270 ST_SH8(step0, step1, step2, step3, step4, step5, step6, step7, output, 8); |
| 271 ST_SH8(in8, in9, in10, in11, in12, in13, in14, in15, (output + 24 * 8), 8); |
| 272 |
| 273 /* 2nd set */ |
| 274 LD_SH8(temp_buff + 8, 32, in0, in1, in2, in3, in4, in5, in6, in7); |
| 275 LD_SH8(temp_buff + 16, 32, in8, in9, in10, in11, in12, in13, in14, in15); |
| 276 TRANSPOSE8x8_SH_SH(in0, in1, in2, in3, in4, in5, in6, in7, |
| 277 in0, in1, in2, in3, in4, in5, in6, in7); |
| 278 TRANSPOSE8x8_SH_SH(in8, in9, in10, in11, in12, in13, in14, in15, |
| 279 in8, in9, in10, in11, in12, in13, in14, in15); |
| 280 BUTTERFLY_16(in0, in1, in2, in3, in4, in5, in6, in7, |
| 281 in8, in9, in10, in11, in12, in13, in14, in15, |
| 282 step0, step1, step2, step3, step4, step5, step6, step7, |
| 283 in8, in9, in10, in11, in12, in13, in14, in15); |
| 284 ST_SH8(step0, step1, step2, step3, step4, step5, step6, step7, |
| 285 (output + 8 * 8), 8); |
| 286 ST_SH8(in8, in9, in10, in11, in12, in13, in14, in15, (output + 16 * 8), 8); |
| 287 } |
| 288 |
| 289 static void fdct8x32_1d_row_even_4x(int16_t *input, int16_t *interm_ptr, |
| 290 int16_t *out) { |
| 291 v8i16 in0, in1, in2, in3, in4, in5, in6, in7; |
| 292 v8i16 in8, in9, in10, in11, in12, in13, in14, in15; |
| 293 v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7; |
| 294 v4i32 vec0_l, vec1_l, vec2_l, vec3_l, vec4_l, vec5_l, vec6_l, vec7_l; |
| 295 v4i32 vec0_r, vec1_r, vec2_r, vec3_r, vec4_r, vec5_r, vec6_r, vec7_r; |
| 296 v4i32 tmp0_w, tmp1_w, tmp2_w, tmp3_w; |
| 297 |
| 298 /* fdct32 even */ |
| 299 /* stage 2 */ |
| 300 LD_SH8(input, 8, in0, in1, in2, in3, in4, in5, in6, in7); |
| 301 LD_SH8(input + 64, 8, in8, in9, in10, in11, in12, in13, in14, in15); |
| 302 |
| 303 BUTTERFLY_16(in0, in1, in2, in3, in4, in5, in6, in7, |
| 304 in8, in9, in10, in11, in12, in13, in14, in15, |
| 305 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, |
| 306 in8, in9, in10, in11, in12, in13, in14, in15); |
| 307 ST_SH8(vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, interm_ptr, 8); |
| 308 ST_SH8(in8, in9, in10, in11, in12, in13, in14, in15, interm_ptr + 64, 8); |
| 309 |
| 310 /* Stage 3 */ |
| 311 UNPCK_SH_SW(vec0, vec0_l, vec0_r); |
| 312 UNPCK_SH_SW(vec1, vec1_l, vec1_r); |
| 313 UNPCK_SH_SW(vec2, vec2_l, vec2_r); |
| 314 UNPCK_SH_SW(vec3, vec3_l, vec3_r); |
| 315 UNPCK_SH_SW(vec4, vec4_l, vec4_r); |
| 316 UNPCK_SH_SW(vec5, vec5_l, vec5_r); |
| 317 UNPCK_SH_SW(vec6, vec6_l, vec6_r); |
| 318 UNPCK_SH_SW(vec7, vec7_l, vec7_r); |
| 319 ADD4(vec0_r, vec7_r, vec1_r, vec6_r, vec2_r, vec5_r, vec3_r, vec4_r, |
| 320 tmp0_w, tmp1_w, tmp2_w, tmp3_w); |
| 321 BUTTERFLY_4(tmp0_w, tmp1_w, tmp2_w, tmp3_w, vec4_r, vec6_r, vec7_r, vec5_r); |
| 322 ADD4(vec0_l, vec7_l, vec1_l, vec6_l, vec2_l, vec5_l, vec3_l, vec4_l, |
| 323 vec0_r, vec1_r, vec2_r, vec3_r); |
| 324 |
| 325 tmp3_w = vec0_r + vec3_r; |
| 326 vec0_r = vec0_r - vec3_r; |
| 327 vec3_r = vec1_r + vec2_r; |
| 328 vec1_r = vec1_r - vec2_r; |
| 329 |
| 330 VP9_DOTP_CONST_PAIR_W(vec4_r, vec6_r, tmp3_w, vec3_r, cospi_16_64, |
| 331 cospi_16_64, vec4_r, tmp3_w, vec6_r, vec3_r); |
| 332 VP9_FDCT32_POSTPROC_NEG_W(vec4_r); |
| 333 VP9_FDCT32_POSTPROC_NEG_W(tmp3_w); |
| 334 VP9_FDCT32_POSTPROC_NEG_W(vec6_r); |
| 335 VP9_FDCT32_POSTPROC_NEG_W(vec3_r); |
| 336 PCKEV_H2_SH(vec4_r, tmp3_w, vec6_r, vec3_r, vec4, vec5); |
| 337 ST_SH2(vec5, vec4, out, 8); |
| 338 |
| 339 VP9_DOTP_CONST_PAIR_W(vec5_r, vec7_r, vec0_r, vec1_r, cospi_24_64, |
| 340 cospi_8_64, vec4_r, tmp3_w, vec6_r, vec3_r); |
| 341 VP9_FDCT32_POSTPROC_NEG_W(vec4_r); |
| 342 VP9_FDCT32_POSTPROC_NEG_W(tmp3_w); |
| 343 VP9_FDCT32_POSTPROC_NEG_W(vec6_r); |
| 344 VP9_FDCT32_POSTPROC_NEG_W(vec3_r); |
| 345 PCKEV_H2_SH(vec4_r, tmp3_w, vec6_r, vec3_r, vec4, vec5); |
| 346 ST_SH2(vec5, vec4, out + 16, 8); |
| 347 |
| 348 LD_SH8(interm_ptr, 8, vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7); |
| 349 SUB4(vec3, vec4, vec2, vec5, vec1, vec6, vec0, vec7, vec4, vec5, vec6, vec7); |
| 350 VP9_DOTP_CONST_PAIR(vec6, vec5, cospi_16_64, cospi_16_64, vec5, vec6); |
| 351 ADD2(vec4, vec5, vec7, vec6, vec0, vec1); |
| 352 VP9_DOTP_CONST_PAIR(vec1, vec0, cospi_28_64, cospi_4_64, in5, in4); |
| 353 VP9_FDCT_POSTPROC_2V_NEG_H(in4, in5); |
| 354 ST_SH(in4, out + 32); |
| 355 ST_SH(in5, out + 56); |
| 356 |
| 357 SUB2(vec4, vec5, vec7, vec6, vec4, vec7); |
| 358 VP9_DOTP_CONST_PAIR(vec7, vec4, cospi_12_64, cospi_20_64, in5, in4); |
| 359 VP9_FDCT_POSTPROC_2V_NEG_H(in4, in5); |
| 360 ST_SH(in4, out + 40); |
| 361 ST_SH(in5, out + 48); |
| 362 |
| 363 LD_SH8(interm_ptr + 64, 8, in8, in9, in10, in11, in12, in13, in14, in15); |
| 364 VP9_DOTP_CONST_PAIR(in13, in10, cospi_16_64, cospi_16_64, vec2, vec5); |
| 365 VP9_DOTP_CONST_PAIR(in12, in11, cospi_16_64, cospi_16_64, vec3, vec4); |
| 366 ADD4(in8, vec3, in9, vec2, in14, vec5, in15, vec4, in0, vec1, vec6, in2); |
| 367 VP9_DOTP_CONST_PAIR(vec6, vec1, cospi_24_64, cospi_8_64, in1, in3); |
| 368 ADD2(in0, in1, in2, in3, vec0, vec7); |
| 369 VP9_DOTP_CONST_PAIR(vec7, vec0, cospi_30_64, cospi_2_64, in5, in4); |
| 370 VP9_FDCT_POSTPROC_2V_NEG_H(in4, in5); |
| 371 ST_SH(in4, out + 64); |
| 372 ST_SH(in5, out + 120); |
| 373 |
| 374 SUB2(in0, in1, in2, in3, in0, in2); |
| 375 VP9_DOTP_CONST_PAIR(in2, in0, cospi_14_64, cospi_18_64, in5, in4); |
| 376 VP9_FDCT_POSTPROC_2V_NEG_H(in4, in5); |
| 377 ST_SH(in4, out + 72); |
| 378 ST_SH(in5, out + 112); |
| 379 |
| 380 SUB2(in9, vec2, in14, vec5, vec2, vec5); |
| 381 VP9_DOTP_CONST_PAIR((-vec2), vec5, cospi_24_64, cospi_8_64, in2, in1); |
| 382 SUB4(in8, vec3, in15, vec4, in3, in2, in0, in1, in3, in0, vec2, vec5); |
| 383 VP9_DOTP_CONST_PAIR(vec5, vec2, cospi_22_64, cospi_10_64, in5, in4); |
| 384 VP9_FDCT_POSTPROC_2V_NEG_H(in4, in5); |
| 385 ST_SH(in4, out + 80); |
| 386 ST_SH(in5, out + 104); |
| 387 |
| 388 ADD2(in3, in2, in0, in1, vec3, vec4); |
| 389 VP9_DOTP_CONST_PAIR(vec4, vec3, cospi_6_64, cospi_26_64, in4, in5); |
| 390 VP9_FDCT_POSTPROC_2V_NEG_H(in4, in5); |
| 391 ST_SH(in4, out + 96); |
| 392 ST_SH(in5, out + 88); |
| 393 } |
| 394 |
| 395 static void fdct8x32_1d_row_even(int16_t *temp, int16_t *out) { |
| 396 v8i16 in0, in1, in2, in3, in4, in5, in6, in7; |
| 397 v8i16 in8, in9, in10, in11, in12, in13, in14, in15; |
| 398 v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, temp0, temp1; |
| 399 |
| 400 /* fdct32 even */ |
| 401 /* stage 2 */ |
| 402 LD_SH8(temp, 8, in0, in1, in2, in3, in4, in5, in6, in7); |
| 403 LD_SH8(temp + 64, 8, in8, in9, in10, in11, in12, in13, in14, in15); |
| 404 |
| 405 BUTTERFLY_16(in0, in1, in2, in3, in4, in5, in6, in7, |
| 406 in8, in9, in10, in11, in12, in13, in14, in15, |
| 407 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, |
| 408 in8, in9, in10, in11, in12, in13, in14, in15); |
| 409 |
| 410 /* Stage 3 */ |
| 411 ADD4(vec0, vec7, vec1, vec6, vec2, vec5, vec3, vec4, in0, in1, in2, in3); |
| 412 BUTTERFLY_4(in0, in1, in2, in3, temp0, in4, in1, in0); |
| 413 VP9_DOTP_CONST_PAIR(temp0, in4, cospi_16_64, cospi_16_64, temp1, temp0); |
| 414 VP9_FDCT_POSTPROC_2V_NEG_H(temp0, temp1); |
| 415 ST_SH(temp0, out); |
| 416 ST_SH(temp1, out + 8); |
| 417 |
| 418 VP9_DOTP_CONST_PAIR(in0, in1, cospi_24_64, cospi_8_64, temp1, temp0); |
| 419 VP9_FDCT_POSTPROC_2V_NEG_H(temp0, temp1); |
| 420 ST_SH(temp0, out + 16); |
| 421 ST_SH(temp1, out + 24); |
| 422 |
| 423 SUB4(vec3, vec4, vec2, vec5, vec1, vec6, vec0, vec7, vec4, vec5, vec6, vec7); |
| 424 VP9_DOTP_CONST_PAIR(vec6, vec5, cospi_16_64, cospi_16_64, vec5, vec6); |
| 425 ADD2(vec4, vec5, vec7, vec6, vec0, vec1); |
| 426 VP9_DOTP_CONST_PAIR(vec1, vec0, cospi_28_64, cospi_4_64, temp1, temp0); |
| 427 VP9_FDCT_POSTPROC_2V_NEG_H(temp0, temp1); |
| 428 ST_SH(temp0, out + 32); |
| 429 ST_SH(temp1, out + 56); |
| 430 |
| 431 SUB2(vec4, vec5, vec7, vec6, vec4, vec7); |
| 432 VP9_DOTP_CONST_PAIR(vec7, vec4, cospi_12_64, cospi_20_64, temp1, temp0); |
| 433 VP9_FDCT_POSTPROC_2V_NEG_H(temp0, temp1); |
| 434 ST_SH(temp0, out + 40); |
| 435 ST_SH(temp1, out + 48); |
| 436 |
| 437 VP9_DOTP_CONST_PAIR(in13, in10, cospi_16_64, cospi_16_64, vec2, vec5); |
| 438 VP9_DOTP_CONST_PAIR(in12, in11, cospi_16_64, cospi_16_64, vec3, vec4); |
| 439 ADD4(in8, vec3, in9, vec2, in14, vec5, in15, vec4, in0, vec1, vec6, in2); |
| 440 VP9_DOTP_CONST_PAIR(vec6, vec1, cospi_24_64, cospi_8_64, in1, in3); |
| 441 ADD2(in0, in1, in2, in3, vec0, vec7); |
| 442 VP9_DOTP_CONST_PAIR(vec7, vec0, cospi_30_64, cospi_2_64, temp1, temp0); |
| 443 VP9_FDCT_POSTPROC_2V_NEG_H(temp0, temp1); |
| 444 ST_SH(temp0, out + 64); |
| 445 ST_SH(temp1, out + 120); |
| 446 |
| 447 SUB2(in0, in1, in2, in3, in0, in2); |
| 448 VP9_DOTP_CONST_PAIR(in2, in0, cospi_14_64, cospi_18_64, temp1, temp0); |
| 449 VP9_FDCT_POSTPROC_2V_NEG_H(temp0, temp1); |
| 450 ST_SH(temp0, out + 72); |
| 451 ST_SH(temp1, out + 112); |
| 452 |
| 453 SUB2(in9, vec2, in14, vec5, vec2, vec5); |
| 454 VP9_DOTP_CONST_PAIR((-vec2), vec5, cospi_24_64, cospi_8_64, in2, in1); |
| 455 SUB4(in8, vec3, in15, vec4, in3, in2, in0, in1, in3, in0, vec2, vec5) |
| 456 VP9_DOTP_CONST_PAIR(vec5, vec2, cospi_22_64, cospi_10_64, temp1, temp0); |
| 457 VP9_FDCT_POSTPROC_2V_NEG_H(temp0, temp1); |
| 458 ST_SH(temp0, out + 80); |
| 459 ST_SH(temp1, out + 104); |
| 460 |
| 461 ADD2(in3, in2, in0, in1, vec3, vec4); |
| 462 VP9_DOTP_CONST_PAIR(vec4, vec3, cospi_6_64, cospi_26_64, temp0, temp1); |
| 463 VP9_FDCT_POSTPROC_2V_NEG_H(temp0, temp1); |
| 464 ST_SH(temp0, out + 96); |
| 465 ST_SH(temp1, out + 88); |
| 466 } |
| 467 |
| 468 static void fdct8x32_1d_row_odd(int16_t *temp, int16_t *interm_ptr, |
| 469 int16_t *out) { |
| 470 v8i16 in16, in17, in18, in19, in20, in21, in22, in23; |
| 471 v8i16 in24, in25, in26, in27, in28, in29, in30, in31, vec4, vec5; |
| 472 |
| 473 in20 = LD_SH(temp + 32); |
| 474 in21 = LD_SH(temp + 40); |
| 475 in26 = LD_SH(temp + 80); |
| 476 in27 = LD_SH(temp + 88); |
| 477 |
| 478 VP9_DOTP_CONST_PAIR(in27, in20, cospi_16_64, cospi_16_64, in20, in27); |
| 479 VP9_DOTP_CONST_PAIR(in26, in21, cospi_16_64, cospi_16_64, in21, in26); |
| 480 |
| 481 in18 = LD_SH(temp + 16); |
| 482 in19 = LD_SH(temp + 24); |
| 483 in28 = LD_SH(temp + 96); |
| 484 in29 = LD_SH(temp + 104); |
| 485 |
| 486 vec4 = in19 - in20; |
| 487 ST_SH(vec4, interm_ptr + 32); |
| 488 vec4 = in18 - in21; |
| 489 ST_SH(vec4, interm_ptr + 88); |
| 490 vec4 = in28 - in27; |
| 491 ST_SH(vec4, interm_ptr + 56); |
| 492 vec4 = in29 - in26; |
| 493 ST_SH(vec4, interm_ptr + 64); |
| 494 |
| 495 ADD4(in18, in21, in19, in20, in28, in27, in29, in26, in21, in20, in27, in26); |
| 496 |
| 497 in22 = LD_SH(temp + 48); |
| 498 in23 = LD_SH(temp + 56); |
| 499 in24 = LD_SH(temp + 64); |
| 500 in25 = LD_SH(temp + 72); |
| 501 |
| 502 VP9_DOTP_CONST_PAIR(in25, in22, cospi_16_64, cospi_16_64, in22, in25); |
| 503 VP9_DOTP_CONST_PAIR(in24, in23, cospi_16_64, cospi_16_64, in23, in24); |
| 504 |
| 505 in16 = LD_SH(temp); |
| 506 in17 = LD_SH(temp + 8); |
| 507 in30 = LD_SH(temp + 112); |
| 508 in31 = LD_SH(temp + 120); |
| 509 |
| 510 vec4 = in17 - in22; |
| 511 ST_SH(vec4, interm_ptr + 40); |
| 512 vec4 = in30 - in25; |
| 513 ST_SH(vec4, interm_ptr + 48); |
| 514 vec4 = in31 - in24; |
| 515 ST_SH(vec4, interm_ptr + 72); |
| 516 vec4 = in16 - in23; |
| 517 ST_SH(vec4, interm_ptr + 80); |
| 518 |
| 519 ADD4(in16, in23, in17, in22, in30, in25, in31, in24, in16, in17, in30, in31); |
| 520 VP9_DOTP_CONST_PAIR(in26, in21, cospi_24_64, cospi_8_64, in18, in29); |
| 521 VP9_DOTP_CONST_PAIR(in27, in20, cospi_24_64, cospi_8_64, in19, in28); |
| 522 |
| 523 ADD4(in16, in19, in17, in18, in30, in29, in31, in28, in27, in22, in21, in25); |
| 524 VP9_DOTP_CONST_PAIR(in21, in22, cospi_28_64, cospi_4_64, in26, in24); |
| 525 ADD2(in27, in26, in25, in24, in23, in20); |
| 526 |
| 527 VP9_DOTP_CONST_PAIR(in20, in23, cospi_31_64, cospi_1_64, vec4, vec5); |
| 528 VP9_FDCT_POSTPROC_2V_NEG_H(vec5, vec4); |
| 529 ST_SH(vec5, out); |
| 530 ST_SH(vec4, out + 120); |
| 531 |
| 532 SUB2(in27, in26, in25, in24, in22, in21); |
| 533 |
| 534 VP9_DOTP_CONST_PAIR(in21, in22, cospi_15_64, cospi_17_64, vec5, vec4); |
| 535 VP9_FDCT_POSTPROC_2V_NEG_H(vec5, vec4); |
| 536 ST_SH(vec5, out + 112); |
| 537 ST_SH(vec4, out + 8); |
| 538 |
| 539 SUB4(in17, in18, in16, in19, in31, in28, in30, in29, in23, in26, in24, in20); |
| 540 VP9_DOTP_CONST_PAIR((-in23), in20, cospi_28_64, cospi_4_64, in27, in25); |
| 541 SUB2(in26, in27, in24, in25, in23, in20); |
| 542 |
| 543 VP9_DOTP_CONST_PAIR(in20, in23, cospi_23_64, cospi_9_64, vec4, vec5); |
| 544 VP9_FDCT_POSTPROC_2V_NEG_H(vec5, vec4); |
| 545 ST_SH(vec4, out + 16); |
| 546 ST_SH(vec5, out + 104); |
| 547 |
| 548 ADD2(in26, in27, in24, in25, in22, in21); |
| 549 VP9_DOTP_CONST_PAIR(in21, in22, cospi_7_64, cospi_25_64, vec4, vec5); |
| 550 VP9_FDCT_POSTPROC_2V_NEG_H(vec5, vec4); |
| 551 ST_SH(vec4, out + 24); |
| 552 ST_SH(vec5, out + 96); |
| 553 |
| 554 in20 = LD_SH(interm_ptr + 32); |
| 555 in21 = LD_SH(interm_ptr + 88); |
| 556 in27 = LD_SH(interm_ptr + 56); |
| 557 in26 = LD_SH(interm_ptr + 64); |
| 558 |
| 559 in16 = in20; |
| 560 in17 = in21; |
| 561 VP9_DOTP_CONST_PAIR(-in16, in27, cospi_24_64, cospi_8_64, in20, in27); |
| 562 VP9_DOTP_CONST_PAIR(-in17, in26, cospi_24_64, cospi_8_64, in21, in26); |
| 563 |
| 564 in22 = LD_SH(interm_ptr + 40); |
| 565 in25 = LD_SH(interm_ptr + 48); |
| 566 in24 = LD_SH(interm_ptr + 72); |
| 567 in23 = LD_SH(interm_ptr + 80); |
| 568 |
| 569 SUB4(in23, in20, in22, in21, in25, in26, in24, in27, in28, in17, in18, in31); |
| 570 VP9_DOTP_CONST_PAIR(in18, in17, cospi_12_64, cospi_20_64, in29, in30); |
| 571 ADD2(in28, in29, in31, in30, in16, in19); |
| 572 VP9_DOTP_CONST_PAIR(in19, in16, cospi_27_64, cospi_5_64, vec5, vec4); |
| 573 VP9_FDCT_POSTPROC_2V_NEG_H(vec5, vec4); |
| 574 ST_SH(vec5, out + 32); |
| 575 ST_SH(vec4, out + 88); |
| 576 |
| 577 SUB2(in28, in29, in31, in30, in17, in18); |
| 578 VP9_DOTP_CONST_PAIR(in18, in17, cospi_11_64, cospi_21_64, vec5, vec4); |
| 579 VP9_FDCT_POSTPROC_2V_NEG_H(vec5, vec4); |
| 580 ST_SH(vec5, out + 40); |
| 581 ST_SH(vec4, out + 80); |
| 582 |
| 583 ADD4(in22, in21, in23, in20, in24, in27, in25, in26, in16, in29, in30, in19); |
| 584 VP9_DOTP_CONST_PAIR(-in16, in19, cospi_12_64, cospi_20_64, in28, in31); |
| 585 SUB2(in29, in28, in30, in31, in16, in19); |
| 586 |
| 587 VP9_DOTP_CONST_PAIR(in19, in16, cospi_19_64, cospi_13_64, vec5, vec4); |
| 588 VP9_FDCT_POSTPROC_2V_NEG_H(vec5, vec4); |
| 589 ST_SH(vec5, out + 72); |
| 590 ST_SH(vec4, out + 48); |
| 591 |
| 592 ADD2(in29, in28, in30, in31, in17, in18); |
| 593 |
| 594 VP9_DOTP_CONST_PAIR(in18, in17, cospi_3_64, cospi_29_64, vec5, vec4); |
| 595 VP9_FDCT_POSTPROC_2V_NEG_H(vec5, vec4); |
| 596 ST_SH(vec4, out + 56); |
| 597 ST_SH(vec5, out + 64); |
| 598 } |
| 599 |
| 600 static void fdct8x32_1d_row_transpose_store(int16_t *temp, int16_t *output) { |
| 601 v8i16 in0, in1, in2, in3, in4, in5, in6, in7; |
| 602 v8i16 in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1; |
| 603 |
| 604 /* 1st set */ |
| 605 in0 = LD_SH(temp); |
| 606 in4 = LD_SH(temp + 32); |
| 607 in2 = LD_SH(temp + 64); |
| 608 in6 = LD_SH(temp + 96); |
| 609 in1 = LD_SH(temp + 128); |
| 610 in7 = LD_SH(temp + 152); |
| 611 in3 = LD_SH(temp + 192); |
| 612 in5 = LD_SH(temp + 216); |
| 613 |
| 614 TRANSPOSE8x8_SH_SH(in0, in1, in2, in3, in4, in5, in6, in7, |
| 615 in0, in1, in2, in3, in4, in5, in6, in7); |
| 616 |
| 617 /* 2nd set */ |
| 618 in0_1 = LD_SH(temp + 16); |
| 619 in1_1 = LD_SH(temp + 232); |
| 620 in2_1 = LD_SH(temp + 80); |
| 621 in3_1 = LD_SH(temp + 168); |
| 622 in4_1 = LD_SH(temp + 48); |
| 623 in5_1 = LD_SH(temp + 176); |
| 624 in6_1 = LD_SH(temp + 112); |
| 625 in7_1 = LD_SH(temp + 240); |
| 626 |
| 627 ST_SH8(in0, in1, in2, in3, in4, in5, in6, in7, output, 32); |
| 628 TRANSPOSE8x8_SH_SH(in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1, |
| 629 in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1); |
| 630 |
| 631 /* 3rd set */ |
| 632 in0 = LD_SH(temp + 8); |
| 633 in1 = LD_SH(temp + 136); |
| 634 in2 = LD_SH(temp + 72); |
| 635 in3 = LD_SH(temp + 200); |
| 636 in4 = LD_SH(temp + 40); |
| 637 in5 = LD_SH(temp + 208); |
| 638 in6 = LD_SH(temp + 104); |
| 639 in7 = LD_SH(temp + 144); |
| 640 |
| 641 ST_SH8(in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1, |
| 642 output + 8, 32); |
| 643 TRANSPOSE8x8_SH_SH(in0, in1, in2, in3, in4, in5, in6, in7, |
| 644 in0, in1, in2, in3, in4, in5, in6, in7); |
| 645 ST_SH8(in0, in1, in2, in3, in4, in5, in6, in7, output + 16, 32); |
| 646 |
| 647 /* 4th set */ |
| 648 in0_1 = LD_SH(temp + 24); |
| 649 in1_1 = LD_SH(temp + 224); |
| 650 in2_1 = LD_SH(temp + 88); |
| 651 in3_1 = LD_SH(temp + 160); |
| 652 in4_1 = LD_SH(temp + 56); |
| 653 in5_1 = LD_SH(temp + 184); |
| 654 in6_1 = LD_SH(temp + 120); |
| 655 in7_1 = LD_SH(temp + 248); |
| 656 |
| 657 TRANSPOSE8x8_SH_SH(in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1, |
| 658 in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1); |
| 659 ST_SH8(in0_1, in1_1, in2_1, in3_1, in4_1, in5_1, in6_1, in7_1, |
| 660 output + 24, 32); |
| 661 } |
| 662 |
| 663 static void fdct32x8_1d_row(int16_t *temp, int16_t *temp_buf, |
| 664 int16_t *output) { |
| 665 fdct8x32_1d_row_load_butterfly(temp, temp_buf); |
| 666 fdct8x32_1d_row_even(temp_buf, temp_buf); |
| 667 fdct8x32_1d_row_odd(temp_buf + 128, temp, temp_buf + 128); |
| 668 fdct8x32_1d_row_transpose_store(temp_buf, output); |
| 669 } |
| 670 |
| 671 static void fdct32x8_1d_row_4x(int16_t *tmp_buf_big, int16_t *tmp_buf, |
| 672 int16_t *output) { |
| 673 fdct8x32_1d_row_load_butterfly(tmp_buf_big, tmp_buf); |
| 674 fdct8x32_1d_row_even_4x(tmp_buf, tmp_buf_big, tmp_buf); |
| 675 fdct8x32_1d_row_odd(tmp_buf + 128, tmp_buf_big, tmp_buf + 128); |
| 676 fdct8x32_1d_row_transpose_store(tmp_buf, output); |
| 677 } |
| 678 |
| 679 void vp9_fdct32x32_msa(const int16_t *input, int16_t *output, |
| 680 int32_t src_stride) { |
| 681 int32_t i; |
| 682 DECLARE_ALIGNED(32, int16_t, tmp_buf_big[1024]); |
| 683 DECLARE_ALIGNED(32, int16_t, tmp_buf[256]); |
| 684 |
| 685 /* column transform */ |
| 686 for (i = 0; i < 4; ++i) { |
| 687 fdct8x32_1d_column(input + (8 * i), src_stride, tmp_buf, |
| 688 tmp_buf_big + (8 * i)); |
| 689 } |
| 690 |
| 691 /* row transform */ |
| 692 fdct32x8_1d_row_4x(tmp_buf_big, tmp_buf, output); |
| 693 |
| 694 /* row transform */ |
| 695 for (i = 1; i < 4; ++i) { |
| 696 fdct32x8_1d_row(tmp_buf_big + (i * 256), tmp_buf, output + (i * 256)); |
| 697 } |
| 698 } |
| 699 |
| 700 void vp9_fdct32x32_1_msa(const int16_t *input, int16_t *out, int32_t stride) { |
| 701 out[1] = 0; |
| 702 |
| 703 out[0] = VP9_LD_HADD(input, stride); |
| 704 out[0] += VP9_LD_HADD(input + 8, stride); |
| 705 out[0] += VP9_LD_HADD(input + 16, stride); |
| 706 out[0] += VP9_LD_HADD(input + 24, stride); |
| 707 out[0] += VP9_LD_HADD(input + 32 * 8, stride); |
| 708 out[0] += VP9_LD_HADD(input + 32 * 8 + 8, stride); |
| 709 out[0] += VP9_LD_HADD(input + 32 * 8 + 16, stride); |
| 710 out[0] += VP9_LD_HADD(input + 32 * 8 + 24, stride); |
| 711 out[0] += VP9_LD_HADD(input + 32 * 16, stride); |
| 712 out[0] += VP9_LD_HADD(input + 32 * 16 + 8, stride); |
| 713 out[0] += VP9_LD_HADD(input + 32 * 16 + 16, stride); |
| 714 out[0] += VP9_LD_HADD(input + 32 * 16 + 24, stride); |
| 715 out[0] += VP9_LD_HADD(input + 32 * 24, stride); |
| 716 out[0] += VP9_LD_HADD(input + 32 * 24 + 8, stride); |
| 717 out[0] += VP9_LD_HADD(input + 32 * 24 + 16, stride); |
| 718 out[0] += VP9_LD_HADD(input + 32 * 24 + 24, stride); |
| 719 out[0] >>= 3; |
| 720 } |
| 721 |
| 722 static void fdct8x32_1d_row_even_rd(int16_t *temp, int16_t *out) { |
| 723 v8i16 in0, in1, in2, in3, in4, in5, in6, in7; |
| 724 v8i16 in8, in9, in10, in11, in12, in13, in14, in15; |
| 725 v8i16 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, temp0, temp1; |
| 726 |
| 727 /* fdct32 even */ |
| 728 /* stage 2 */ |
| 729 LD_SH8(temp, 8, in0, in1, in2, in3, in4, in5, in6, in7); |
| 730 LD_SH8(temp + 64, 8, in8, in9, in10, in11, in12, in13, in14, in15); |
| 731 |
| 732 BUTTERFLY_16(in0, in1, in2, in3, in4, in5, in6, in7, |
| 733 in8, in9, in10, in11, in12, in13, in14, in15, |
| 734 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, |
| 735 in8, in9, in10, in11, in12, in13, in14, in15); |
| 736 VP9_FDCT_POSTPROC_2V_NEG_H(vec0, vec1); |
| 737 VP9_FDCT_POSTPROC_2V_NEG_H(vec2, vec3); |
| 738 VP9_FDCT_POSTPROC_2V_NEG_H(vec4, vec5); |
| 739 VP9_FDCT_POSTPROC_2V_NEG_H(vec6, vec7); |
| 740 VP9_FDCT_POSTPROC_2V_NEG_H(in8, in9); |
| 741 VP9_FDCT_POSTPROC_2V_NEG_H(in10, in11); |
| 742 VP9_FDCT_POSTPROC_2V_NEG_H(in12, in13); |
| 743 VP9_FDCT_POSTPROC_2V_NEG_H(in14, in15); |
| 744 |
| 745 /* Stage 3 */ |
| 746 ADD4(vec0, vec7, vec1, vec6, vec2, vec5, vec3, vec4, in0, in1, in2, in3); |
| 747 |
| 748 temp0 = in0 + in3; |
| 749 in0 = in0 - in3; |
| 750 in3 = in1 + in2; |
| 751 in1 = in1 - in2; |
| 752 |
| 753 VP9_DOTP_CONST_PAIR(temp0, in3, cospi_16_64, cospi_16_64, temp1, temp0); |
| 754 ST_SH(temp0, out); |
| 755 ST_SH(temp1, out + 8); |
| 756 |
| 757 VP9_DOTP_CONST_PAIR(in0, in1, cospi_24_64, cospi_8_64, temp1, temp0); |
| 758 ST_SH(temp0, out + 16); |
| 759 ST_SH(temp1, out + 24); |
| 760 |
| 761 SUB4(vec3, vec4, vec2, vec5, vec1, vec6, vec0, vec7, vec4, vec5, vec6, vec7); |
| 762 VP9_DOTP_CONST_PAIR(vec6, vec5, cospi_16_64, cospi_16_64, vec5, vec6); |
| 763 ADD2(vec4, vec5, vec7, vec6, vec0, vec1); |
| 764 VP9_DOTP_CONST_PAIR(vec1, vec0, cospi_28_64, cospi_4_64, temp1, temp0); |
| 765 ST_SH(temp0, out + 32); |
| 766 ST_SH(temp1, out + 56); |
| 767 |
| 768 SUB2(vec4, vec5, vec7, vec6, vec4, vec7); |
| 769 VP9_DOTP_CONST_PAIR(vec7, vec4, cospi_12_64, cospi_20_64, temp1, temp0); |
| 770 ST_SH(temp0, out + 40); |
| 771 ST_SH(temp1, out + 48); |
| 772 |
| 773 VP9_DOTP_CONST_PAIR(in13, in10, cospi_16_64, cospi_16_64, vec2, vec5); |
| 774 VP9_DOTP_CONST_PAIR(in12, in11, cospi_16_64, cospi_16_64, vec3, vec4); |
| 775 ADD4(in8, vec3, in9, vec2, in14, vec5, in15, vec4, in0, vec1, vec6, in2); |
| 776 VP9_DOTP_CONST_PAIR(vec6, vec1, cospi_24_64, cospi_8_64, in1, in3); |
| 777 ADD2(in0, in1, in2, in3, vec0, vec7); |
| 778 VP9_DOTP_CONST_PAIR(vec7, vec0, cospi_30_64, cospi_2_64, temp1, temp0); |
| 779 ST_SH(temp0, out + 64); |
| 780 ST_SH(temp1, out + 120); |
| 781 |
| 782 SUB2(in0, in1, in2, in3, in0, in2); |
| 783 VP9_DOTP_CONST_PAIR(in2, in0, cospi_14_64, cospi_18_64, temp1, temp0); |
| 784 ST_SH(temp0, out + 72); |
| 785 ST_SH(temp1, out + 112); |
| 786 |
| 787 SUB2(in9, vec2, in14, vec5, vec2, vec5); |
| 788 VP9_DOTP_CONST_PAIR((-vec2), vec5, cospi_24_64, cospi_8_64, in2, in1); |
| 789 SUB4(in8, vec3, in15, vec4, in3, in2, in0, in1, in3, in0, vec2, vec5); |
| 790 VP9_DOTP_CONST_PAIR(vec5, vec2, cospi_22_64, cospi_10_64, temp1, temp0); |
| 791 ST_SH(temp0, out + 80); |
| 792 ST_SH(temp1, out + 104); |
| 793 |
| 794 ADD2(in3, in2, in0, in1, vec3, vec4); |
| 795 VP9_DOTP_CONST_PAIR(vec4, vec3, cospi_6_64, cospi_26_64, temp0, temp1); |
| 796 ST_SH(temp0, out + 96); |
| 797 ST_SH(temp1, out + 88); |
| 798 } |
| 799 |
| 800 static void fdct8x32_1d_row_odd_rd(int16_t *temp, int16_t *interm_ptr, |
| 801 int16_t *out) { |
| 802 v8i16 in16, in17, in18, in19, in20, in21, in22, in23; |
| 803 v8i16 in24, in25, in26, in27, in28, in29, in30, in31; |
| 804 v8i16 vec4, vec5; |
| 805 |
| 806 in20 = LD_SH(temp + 32); |
| 807 in21 = LD_SH(temp + 40); |
| 808 in26 = LD_SH(temp + 80); |
| 809 in27 = LD_SH(temp + 88); |
| 810 |
| 811 VP9_DOTP_CONST_PAIR(in27, in20, cospi_16_64, cospi_16_64, in20, in27); |
| 812 VP9_DOTP_CONST_PAIR(in26, in21, cospi_16_64, cospi_16_64, in21, in26); |
| 813 |
| 814 VP9_FDCT_POSTPROC_2V_NEG_H(in20, in21); |
| 815 VP9_FDCT_POSTPROC_2V_NEG_H(in26, in27); |
| 816 |
| 817 in18 = LD_SH(temp + 16); |
| 818 in19 = LD_SH(temp + 24); |
| 819 in28 = LD_SH(temp + 96); |
| 820 in29 = LD_SH(temp + 104); |
| 821 |
| 822 VP9_FDCT_POSTPROC_2V_NEG_H(in18, in19); |
| 823 VP9_FDCT_POSTPROC_2V_NEG_H(in28, in29); |
| 824 |
| 825 vec4 = in19 - in20; |
| 826 ST_SH(vec4, interm_ptr + 32); |
| 827 vec4 = in18 - in21; |
| 828 ST_SH(vec4, interm_ptr + 88); |
| 829 vec4 = in29 - in26; |
| 830 ST_SH(vec4, interm_ptr + 64); |
| 831 vec4 = in28 - in27; |
| 832 ST_SH(vec4, interm_ptr + 56); |
| 833 |
| 834 ADD4(in18, in21, in19, in20, in28, in27, in29, in26, in21, in20, in27, in26); |
| 835 |
| 836 in22 = LD_SH(temp + 48); |
| 837 in23 = LD_SH(temp + 56); |
| 838 in24 = LD_SH(temp + 64); |
| 839 in25 = LD_SH(temp + 72); |
| 840 |
| 841 VP9_DOTP_CONST_PAIR(in25, in22, cospi_16_64, cospi_16_64, in22, in25); |
| 842 VP9_DOTP_CONST_PAIR(in24, in23, cospi_16_64, cospi_16_64, in23, in24); |
| 843 VP9_FDCT_POSTPROC_2V_NEG_H(in22, in23); |
| 844 VP9_FDCT_POSTPROC_2V_NEG_H(in24, in25); |
| 845 |
| 846 in16 = LD_SH(temp); |
| 847 in17 = LD_SH(temp + 8); |
| 848 in30 = LD_SH(temp + 112); |
| 849 in31 = LD_SH(temp + 120); |
| 850 |
| 851 VP9_FDCT_POSTPROC_2V_NEG_H(in16, in17); |
| 852 VP9_FDCT_POSTPROC_2V_NEG_H(in30, in31); |
| 853 |
| 854 vec4 = in17 - in22; |
| 855 ST_SH(vec4, interm_ptr + 40); |
| 856 vec4 = in30 - in25; |
| 857 ST_SH(vec4, interm_ptr + 48); |
| 858 vec4 = in31 - in24; |
| 859 ST_SH(vec4, interm_ptr + 72); |
| 860 vec4 = in16 - in23; |
| 861 ST_SH(vec4, interm_ptr + 80); |
| 862 |
| 863 ADD4(in16, in23, in17, in22, in30, in25, in31, in24, in16, in17, in30, in31); |
| 864 VP9_DOTP_CONST_PAIR(in26, in21, cospi_24_64, cospi_8_64, in18, in29); |
| 865 VP9_DOTP_CONST_PAIR(in27, in20, cospi_24_64, cospi_8_64, in19, in28); |
| 866 ADD4(in16, in19, in17, in18, in30, in29, in31, in28, in27, in22, in21, in25); |
| 867 VP9_DOTP_CONST_PAIR(in21, in22, cospi_28_64, cospi_4_64, in26, in24); |
| 868 ADD2(in27, in26, in25, in24, in23, in20); |
| 869 VP9_DOTP_CONST_PAIR(in20, in23, cospi_31_64, cospi_1_64, vec4, vec5); |
| 870 ST_SH(vec5, out); |
| 871 ST_SH(vec4, out + 120); |
| 872 |
| 873 SUB2(in27, in26, in25, in24, in22, in21); |
| 874 VP9_DOTP_CONST_PAIR(in21, in22, cospi_15_64, cospi_17_64, vec5, vec4); |
| 875 ST_SH(vec5, out + 112); |
| 876 ST_SH(vec4, out + 8); |
| 877 |
| 878 SUB4(in17, in18, in16, in19, in31, in28, in30, in29, in23, in26, in24, in20); |
| 879 VP9_DOTP_CONST_PAIR((-in23), in20, cospi_28_64, cospi_4_64, in27, in25); |
| 880 SUB2(in26, in27, in24, in25, in23, in20); |
| 881 VP9_DOTP_CONST_PAIR(in20, in23, cospi_23_64, cospi_9_64, vec4, vec5); |
| 882 ST_SH(vec4, out + 16); |
| 883 ST_SH(vec5, out + 104); |
| 884 |
| 885 ADD2(in26, in27, in24, in25, in22, in21); |
| 886 VP9_DOTP_CONST_PAIR(in21, in22, cospi_7_64, cospi_25_64, vec4, vec5); |
| 887 ST_SH(vec4, out + 24); |
| 888 ST_SH(vec5, out + 96); |
| 889 |
| 890 in20 = LD_SH(interm_ptr + 32); |
| 891 in21 = LD_SH(interm_ptr + 88); |
| 892 in27 = LD_SH(interm_ptr + 56); |
| 893 in26 = LD_SH(interm_ptr + 64); |
| 894 |
| 895 in16 = in20; |
| 896 in17 = in21; |
| 897 VP9_DOTP_CONST_PAIR(-in16, in27, cospi_24_64, cospi_8_64, in20, in27); |
| 898 VP9_DOTP_CONST_PAIR(-in17, in26, cospi_24_64, cospi_8_64, in21, in26); |
| 899 |
| 900 in22 = LD_SH(interm_ptr + 40); |
| 901 in25 = LD_SH(interm_ptr + 48); |
| 902 in24 = LD_SH(interm_ptr + 72); |
| 903 in23 = LD_SH(interm_ptr + 80); |
| 904 |
| 905 SUB4(in23, in20, in22, in21, in25, in26, in24, in27, in28, in17, in18, in31); |
| 906 VP9_DOTP_CONST_PAIR(in18, in17, cospi_12_64, cospi_20_64, in29, in30); |
| 907 in16 = in28 + in29; |
| 908 in19 = in31 + in30; |
| 909 VP9_DOTP_CONST_PAIR(in19, in16, cospi_27_64, cospi_5_64, vec5, vec4); |
| 910 ST_SH(vec5, out + 32); |
| 911 ST_SH(vec4, out + 88); |
| 912 |
| 913 SUB2(in28, in29, in31, in30, in17, in18); |
| 914 VP9_DOTP_CONST_PAIR(in18, in17, cospi_11_64, cospi_21_64, vec5, vec4); |
| 915 ST_SH(vec5, out + 40); |
| 916 ST_SH(vec4, out + 80); |
| 917 |
| 918 ADD4(in22, in21, in23, in20, in24, in27, in25, in26, in16, in29, in30, in19); |
| 919 VP9_DOTP_CONST_PAIR(-in16, in19, cospi_12_64, cospi_20_64, in28, in31); |
| 920 SUB2(in29, in28, in30, in31, in16, in19); |
| 921 VP9_DOTP_CONST_PAIR(in19, in16, cospi_19_64, cospi_13_64, vec5, vec4); |
| 922 ST_SH(vec5, out + 72); |
| 923 ST_SH(vec4, out + 48); |
| 924 |
| 925 ADD2(in29, in28, in30, in31, in17, in18); |
| 926 VP9_DOTP_CONST_PAIR(in18, in17, cospi_3_64, cospi_29_64, vec5, vec4); |
| 927 ST_SH(vec4, out + 56); |
| 928 ST_SH(vec5, out + 64); |
| 929 } |
| 930 |
| 931 static void fdct32x8_1d_row_rd(int16_t *tmp_buf_big, int16_t *tmp_buf, |
| 932 int16_t *output) { |
| 933 fdct8x32_1d_row_load_butterfly(tmp_buf_big, tmp_buf); |
| 934 fdct8x32_1d_row_even_rd(tmp_buf, tmp_buf); |
| 935 fdct8x32_1d_row_odd_rd((tmp_buf + 128), tmp_buf_big, (tmp_buf + 128)); |
| 936 fdct8x32_1d_row_transpose_store(tmp_buf, output); |
| 937 } |
| 938 |
| 939 void vp9_fdct32x32_rd_msa(const int16_t *input, int16_t *out, |
| 940 int32_t src_stride) { |
| 941 int32_t i; |
| 942 DECLARE_ALIGNED(32, int16_t, tmp_buf_big[1024]); |
| 943 DECLARE_ALIGNED(32, int16_t, tmp_buf[256]); |
| 944 |
| 945 /* column transform */ |
| 946 for (i = 0; i < 4; ++i) { |
| 947 fdct8x32_1d_column(input + (8 * i), src_stride, &tmp_buf[0], |
| 948 &tmp_buf_big[0] + (8 * i)); |
| 949 } |
| 950 |
| 951 /* row transform */ |
| 952 for (i = 0; i < 4; ++i) { |
| 953 fdct32x8_1d_row_rd(&tmp_buf_big[0] + (8 * i * 32), &tmp_buf[0], |
| 954 out + (8 * i * 32)); |
| 955 } |
| 956 } |
| OLD | NEW |