Commit b770def5 authored by Frank Galligan's avatar Frank Galligan Committed by Gerrit Code Review
Browse files

Merge "VP9_LPF_VERTICAL_16_DUAL_SSE2 optimization"

parents 340d82ef 3c5256d5
......@@ -1333,43 +1333,47 @@ static INLINE void transpose8x16(unsigned char *in0, unsigned char *in1,
__m128i x0, x1, x2, x3, x4, x5, x6, x7;
__m128i x8, x9, x10, x11, x12, x13, x14, x15;
// Read in 16 lines
x0 = _mm_loadl_epi64((__m128i *)in0);
x8 = _mm_loadl_epi64((__m128i *)in1);
x1 = _mm_loadl_epi64((__m128i *)(in0 + in_p));
x9 = _mm_loadl_epi64((__m128i *)(in1 + in_p));
x2 = _mm_loadl_epi64((__m128i *)(in0 + 2 * in_p));
x10 = _mm_loadl_epi64((__m128i *)(in1 + 2 * in_p));
x3 = _mm_loadl_epi64((__m128i *)(in0 + 3*in_p));
x11 = _mm_loadl_epi64((__m128i *)(in1 + 3*in_p));
x4 = _mm_loadl_epi64((__m128i *)(in0 + 4*in_p));
x12 = _mm_loadl_epi64((__m128i *)(in1 + 4*in_p));
x5 = _mm_loadl_epi64((__m128i *)(in0 + 5*in_p));
x13 = _mm_loadl_epi64((__m128i *)(in1 + 5*in_p));
x6 = _mm_loadl_epi64((__m128i *)(in0 + 6*in_p));
x14 = _mm_loadl_epi64((__m128i *)(in1 + 6*in_p));
x7 = _mm_loadl_epi64((__m128i *)(in0 + 7*in_p));
x15 = _mm_loadl_epi64((__m128i *)(in1 + 7*in_p));
x0 = _mm_unpacklo_epi8(x0, x1);
x1 = _mm_unpacklo_epi8(x2, x3);
x2 = _mm_unpacklo_epi8(x4, x5);
x3 = _mm_unpacklo_epi8(x6, x7);
x8 = _mm_unpacklo_epi8(x8, x9);
x9 = _mm_unpacklo_epi8(x10, x11);
x10 = _mm_unpacklo_epi8(x12, x13);
x11 = _mm_unpacklo_epi8(x14, x15);
x4 = _mm_unpacklo_epi16(x0, x1);
x5 = _mm_unpacklo_epi16(x2, x3);
x12 = _mm_unpacklo_epi16(x8, x9);
x13 = _mm_unpacklo_epi16(x10, x11);
x6 = _mm_unpacklo_epi32(x4, x5);
x7 = _mm_unpackhi_epi32(x4, x5);
x14 = _mm_unpacklo_epi32(x12, x13);
x15 = _mm_unpackhi_epi32(x12, x13);
// 2-way interleave w/hoisting of unpacks
x0 = _mm_loadl_epi64((__m128i *)in0); // 1
x1 = _mm_loadl_epi64((__m128i *)(in0 + in_p)); // 3
x0 = _mm_unpacklo_epi8(x0, x1); // 1
x2 = _mm_loadl_epi64((__m128i *)(in0 + 2 * in_p)); // 5
x3 = _mm_loadl_epi64((__m128i *)(in0 + 3*in_p)); // 7
x1 = _mm_unpacklo_epi8(x2, x3); // 2
x4 = _mm_loadl_epi64((__m128i *)(in0 + 4*in_p)); // 9
x5 = _mm_loadl_epi64((__m128i *)(in0 + 5*in_p)); // 11
x2 = _mm_unpacklo_epi8(x4, x5); // 3
x6 = _mm_loadl_epi64((__m128i *)(in0 + 6*in_p)); // 13
x7 = _mm_loadl_epi64((__m128i *)(in0 + 7*in_p)); // 15
x3 = _mm_unpacklo_epi8(x6, x7); // 4
x4 = _mm_unpacklo_epi16(x0, x1); // 9
x8 = _mm_loadl_epi64((__m128i *)in1); // 2
x9 = _mm_loadl_epi64((__m128i *)(in1 + in_p)); // 4
x8 = _mm_unpacklo_epi8(x8, x9); // 5
x5 = _mm_unpacklo_epi16(x2, x3); // 10
x10 = _mm_loadl_epi64((__m128i *)(in1 + 2 * in_p)); // 6
x11 = _mm_loadl_epi64((__m128i *)(in1 + 3*in_p)); // 8
x9 = _mm_unpacklo_epi8(x10, x11); // 6
x12 = _mm_loadl_epi64((__m128i *)(in1 + 4*in_p)); // 10
x13 = _mm_loadl_epi64((__m128i *)(in1 + 5*in_p)); // 12
x10 = _mm_unpacklo_epi8(x12, x13); // 7
x12 = _mm_unpacklo_epi16(x8, x9); // 11
x14 = _mm_loadl_epi64((__m128i *)(in1 + 6*in_p)); // 14
x15 = _mm_loadl_epi64((__m128i *)(in1 + 7*in_p)); // 16
x11 = _mm_unpacklo_epi8(x14, x15); // 8
x13 = _mm_unpacklo_epi16(x10, x11); // 12
x6 = _mm_unpacklo_epi32(x4, x5); // 13
x7 = _mm_unpackhi_epi32(x4, x5); // 14
x14 = _mm_unpacklo_epi32(x12, x13); // 15
x15 = _mm_unpackhi_epi32(x12, x13); // 16
// Store first 4-line result
_mm_storeu_si128((__m128i *)out, _mm_unpacklo_epi64(x6, x14));
......@@ -1405,33 +1409,36 @@ static INLINE void transpose(unsigned char *src[], int in_p,
x0 = _mm_loadl_epi64((__m128i *)(in + 0*in_p)); // 00 01 02 03 04 05 06 07
x1 = _mm_loadl_epi64((__m128i *)(in + 1*in_p)); // 10 11 12 13 14 15 16 17
x2 = _mm_loadl_epi64((__m128i *)(in + 2*in_p)); // 20 21 22 23 24 25 26 27
x3 = _mm_loadl_epi64((__m128i *)(in + 3*in_p)); // 30 31 32 33 34 35 36 37
x4 = _mm_loadl_epi64((__m128i *)(in + 4*in_p)); // 40 41 42 43 44 45 46 47
x5 = _mm_loadl_epi64((__m128i *)(in + 5*in_p)); // 50 51 52 53 54 55 56 57
x6 = _mm_loadl_epi64((__m128i *)(in + 6*in_p)); // 60 61 62 63 64 65 66 67
x7 = _mm_loadl_epi64((__m128i *)(in + 7*in_p)); // 70 71 72 73 74 75 76 77
// 00 10 01 11 02 12 03 13 04 14 05 15 06 16 07 17
x0 = _mm_unpacklo_epi8(x0, x1);
x2 = _mm_loadl_epi64((__m128i *)(in + 2*in_p)); // 20 21 22 23 24 25 26 27
x3 = _mm_loadl_epi64((__m128i *)(in + 3*in_p)); // 30 31 32 33 34 35 36 37
// 20 30 21 31 22 32 23 33 24 34 25 35 26 36 27 37
x1 = _mm_unpacklo_epi8(x2, x3);
x4 = _mm_loadl_epi64((__m128i *)(in + 4*in_p)); // 40 41 42 43 44 45 46 47
x5 = _mm_loadl_epi64((__m128i *)(in + 5*in_p)); // 50 51 52 53 54 55 56 57
// 40 50 41 51 42 52 43 53 44 54 45 55 46 56 47 57
x2 = _mm_unpacklo_epi8(x4, x5);
x6 = _mm_loadl_epi64((__m128i *)(in + 6*in_p)); // 60 61 62 63 64 65 66 67
x7 = _mm_loadl_epi64((__m128i *)(in + 7*in_p)); // 70 71 72 73 74 75 76 77
// 60 70 61 71 62 72 63 73 64 74 65 75 66 76 67 77
x3 = _mm_unpacklo_epi8(x6, x7);
// 00 10 20 30 01 11 21 31 02 12 22 32 03 13 23 33
x4 = _mm_unpacklo_epi16(x0, x1);
// 40 50 60 70 41 51 61 71 42 52 62 72 43 53 63 73
x5 = _mm_unpacklo_epi16(x2, x3);
// 00 10 20 30 40 50 60 70 01 11 21 31 41 51 61 71
x6 = _mm_unpacklo_epi32(x4, x5);
// 02 12 22 32 42 52 62 72 03 13 23 33 43 53 63 73
x7 = _mm_unpackhi_epi32(x4, x5);
_mm_storel_pd((double *)(out + 0*out_p),
_mm_castsi128_pd(x6)); // 00 10 20 30 40 50 60 70
_mm_storeh_pd((double *)(out + 1*out_p),
_mm_castsi128_pd(x6)); // 01 11 21 31 41 51 61 71
// 02 12 22 32 42 52 62 72 03 13 23 33 43 53 63 73
x7 = _mm_unpackhi_epi32(x4, x5);
_mm_storel_pd((double *)(out + 2*out_p),
_mm_castsi128_pd(x7)); // 02 12 22 32 42 52 62 72
_mm_storeh_pd((double *)(out + 3*out_p),
......@@ -1443,13 +1450,13 @@ static INLINE void transpose(unsigned char *src[], int in_p,
x5 = _mm_unpackhi_epi16(x2, x3);
// 04 14 24 34 44 54 64 74 05 15 25 35 45 55 65 75
x6 = _mm_unpacklo_epi32(x4, x5);
// 06 16 26 36 46 56 66 76 07 17 27 37 47 57 67 77
x7 = _mm_unpackhi_epi32(x4, x5);
_mm_storel_pd((double *)(out + 4*out_p),
_mm_castsi128_pd(x6)); // 04 14 24 34 44 54 64 74
_mm_storeh_pd((double *)(out + 5*out_p),
_mm_castsi128_pd(x6)); // 05 15 25 35 45 55 65 75
// 06 16 26 36 46 56 66 76 07 17 27 37 47 57 67 77
x7 = _mm_unpackhi_epi32(x4, x5);
_mm_storel_pd((double *)(out + 6*out_p),
_mm_castsi128_pd(x7)); // 06 16 26 36 46 56 66 76
_mm_storeh_pd((double *)(out + 7*out_p),
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment