| @@ -15,6 +15,127 @@ · 14 unmodified lines |
| 15 | #include "vpx_dsp/x86/bitdepth_conversion_avx2.h" | 15 | #include "vpx_dsp/x86/bitdepth_conversion_avx2.h" |
| 16 | #include "vpx_ports/mem.h" | 16 | #include "vpx_ports/mem.h" |
| 17 | | 17 | |
| | 18 | #if CONFIG_VP9_HIGHBITDEPTH |
| | 19 | static void highbd_hadamard_col8_avx2(__m256i *in, int iter) { |
| | 20 | __m256i a0 = in[0]; |
| | 21 | __m256i a1 = in[1]; |
| | 22 | __m256i a2 = in[2]; |
| | 23 | __m256i a3 = in[3]; |
| | 24 | __m256i a4 = in[4]; |
| | 25 | __m256i a5 = in[5]; |
| | 26 | __m256i a6 = in[6]; |
| | 27 | __m256i a7 = in[7]; |
| | 28 | |
| | 29 | __m256i b0 = _mm256_add_epi32(a0, a1); |
| | 30 | __m256i b1 = _mm256_sub_epi32(a0, a1); |
| | 31 | __m256i b2 = _mm256_add_epi32(a2, a3); |
| | 32 | __m256i b3 = _mm256_sub_epi32(a2, a3); |
| | 33 | __m256i b4 = _mm256_add_epi32(a4, a5); |
| | 34 | __m256i b5 = _mm256_sub_epi32(a4, a5); |
| | 35 | __m256i b6 = _mm256_add_epi32(a6, a7); |
| | 36 | __m256i b7 = _mm256_sub_epi32(a6, a7); |
| | 37 | |
| | 38 | a0 = _mm256_add_epi32(b0, b2); |
| | 39 | a1 = _mm256_add_epi32(b1, b3); |
| | 40 | a2 = _mm256_sub_epi32(b0, b2); |
| | 41 | a3 = _mm256_sub_epi32(b1, b3); |
| | 42 | a4 = _mm256_add_epi32(b4, b6); |
| | 43 | a5 = _mm256_add_epi32(b5, b7); |
| | 44 | a6 = _mm256_sub_epi32(b4, b6); |
| | 45 | a7 = _mm256_sub_epi32(b5, b7); |
| | 46 | |
| | 47 | if (iter == 0) { |
| | 48 | b0 = _mm256_add_epi32(a0, a4); |
| | 49 | b7 = _mm256_add_epi32(a1, a5); |
| | 50 | b3 = _mm256_add_epi32(a2, a6); |
| | 51 | b4 = _mm256_add_epi32(a3, a7); |
| | 52 | b2 = _mm256_sub_epi32(a0, a4); |
| | 53 | b6 = _mm256_sub_epi32(a1, a5); |
| | 54 | b1 = _mm256_sub_epi32(a2, a6); |
| | 55 | b5 = _mm256_sub_epi32(a3, a7); |
| | 56 | |
| | 57 | a0 = _mm256_unpacklo_epi32(b0, b1); |
| | 58 | a1 = _mm256_unpacklo_epi32(b2, b3); |
| | 59 | a2 = _mm256_unpackhi_epi32(b0, b1); |
| | 60 | a3 = _mm256_unpackhi_epi32(b2, b3); |
| | 61 | a4 = _mm256_unpacklo_epi32(b4, b5); |
| | 62 | a5 = _mm256_unpacklo_epi32(b6, b7); |
| | 63 | a6 = _mm256_unpackhi_epi32(b4, b5); |
| | 64 | a7 = _mm256_unpackhi_epi32(b6, b7); |
| | 65 | |
| | 66 | b0 = _mm256_unpacklo_epi64(a0, a1); |
| | 67 | b1 = _mm256_unpacklo_epi64(a4, a5); |
| | 68 | b2 = _mm256_unpackhi_epi64(a0, a1); |
| | 69 | b3 = _mm256_unpackhi_epi64(a4, a5); |
| | 70 | b4 = _mm256_unpacklo_epi64(a2, a3); |
| | 71 | b5 = _mm256_unpacklo_epi64(a6, a7); |
| | 72 | b6 = _mm256_unpackhi_epi64(a2, a3); |
| | 73 | b7 = _mm256_unpackhi_epi64(a6, a7); |
| | 74 | |
| | 75 | in[0] = _mm256_permute2x128_si256(b0, b1, 0x20); |
| | 76 | in[1] = _mm256_permute2x128_si256(b0, b1, 0x31); |
| | 77 | in[2] = _mm256_permute2x128_si256(b2, b3, 0x20); |
| | 78 | in[3] = _mm256_permute2x128_si256(b2, b3, 0x31); |
| | 79 | in[4] = _mm256_permute2x128_si256(b4, b5, 0x20); |
| | 80 | in[5] = _mm256_permute2x128_si256(b4, b5, 0x31); |
| | 81 | in[6] = _mm256_permute2x128_si256(b6, b7, 0x20); |
| | 82 | in[7] = _mm256_permute2x128_si256(b6, b7, 0x31); |
| | 83 | } else { |
| | 84 | in[0] = _mm256_add_epi32(a0, a4); |
| | 85 | in[7] = _mm256_add_epi32(a1, a5); |
| | 86 | in[3] = _mm256_add_epi32(a2, a6); |
| | 87 | in[4] = _mm256_add_epi32(a3, a7); |
| | 88 | in[2] = _mm256_sub_epi32(a0, a4); |
| | 89 | in[6] = _mm256_sub_epi32(a1, a5); |
| | 90 | in[1] = _mm256_sub_epi32(a2, a6); |
| | 91 | in[5] = _mm256_sub_epi32(a3, a7); |
| | 92 | } |
| | 93 | } |
| | 94 | |
| | 95 | void vpx_highbd_hadamard_8x8_avx2(const int16_t *src_diff, ptrdiff_t src_stride, |
| | 96 | tran_low_t *coeff) { |
| | 97 | __m128i src16[8]; |
| | 98 | __m256i src32[8]; |
| | 99 | |
| | 100 | src16[0] = _mm_loadu_si128((const __m128i *)src_diff); |
| | 101 | src16[1] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride)); |
| | 102 | src16[2] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride)); |
| | 103 | src16[3] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride)); |
| | 104 | src16[4] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride)); |
| | 105 | src16[5] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride)); |
| | 106 | src16[6] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride)); |
| | 107 | src16[7] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride)); |
| | 108 | |
| | 109 | src32[0] = _mm256_cvtepi16_epi32(src16[0]); |
| | 110 | src32[1] = _mm256_cvtepi16_epi32(src16[1]); |
| | 111 | src32[2] = _mm256_cvtepi16_epi32(src16[2]); |
| | 112 | src32[3] = _mm256_cvtepi16_epi32(src16[3]); |
| | 113 | src32[4] = _mm256_cvtepi16_epi32(src16[4]); |
| | 114 | src32[5] = _mm256_cvtepi16_epi32(src16[5]); |
| | 115 | src32[6] = _mm256_cvtepi16_epi32(src16[6]); |
| | 116 | src32[7] = _mm256_cvtepi16_epi32(src16[7]); |
| | 117 | |
| | 118 | highbd_hadamard_col8_avx2(src32, 0); |
| | 119 | highbd_hadamard_col8_avx2(src32, 1); |
| | 120 | |
| | 121 | _mm256_storeu_si256((__m256i *)coeff, src32[0]); |
| | 122 | coeff += 8; |
| | 123 | _mm256_storeu_si256((__m256i *)coeff, src32[1]); |
| | 124 | coeff += 8; |
| | 125 | _mm256_storeu_si256((__m256i *)coeff, src32[2]); |
| | 126 | coeff += 8; |
| | 127 | _mm256_storeu_si256((__m256i *)coeff, src32[3]); |
| | 128 | coeff += 8; |
| | 129 | _mm256_storeu_si256((__m256i *)coeff, src32[4]); |
| | 130 | coeff += 8; |
| | 131 | _mm256_storeu_si256((__m256i *)coeff, src32[5]); |
| | 132 | coeff += 8; |
| | 133 | _mm256_storeu_si256((__m256i *)coeff, src32[6]); |
| | 134 | coeff += 8; |
| | 135 | _mm256_storeu_si256((__m256i *)coeff, src32[7]); |
| | 136 | } |
| | 137 | #endif // CONFIG_VP9_HIGHBITDEPTH |
| | 138 | |
| 18 | static void hadamard_col8x2_avx2(__m256i *in, int iter) { | 139 | static void hadamard_col8x2_avx2(__m256i *in, int iter) { |
| 19 | __m256i a0 = in[0]; | 140 | __m256i a0 = in[0]; |
| 20 | __m256i a1 = in[1]; | 141 | __m256i a1 = in[1]; |