History

Merge "ppc: Add vpx_iwht4x4_16_add_vsx"

James Zern committed 8 years ago

Commit c9bb5922 parents 3d8ea90 233aef03 files · +88 −10Browse files

Unified · Split

3 files
  1. test/dct_test.cc +10 −0
  2. vpx_dsp/ppc/inv_txfm_vsx.c +77 −9
  3. vpx_dsp/vpx_dsp_rtcd_defs.pl +1 −1
test/dct_test.cc+10−0
@@ -725,4 +725,14 @@ INSTANTIATE_TEST_CASE_P(SSE2, TransWHT, · 724 unmodified lines
725 ::testing::Values(make_tuple(0, &wht_sse2_func_info, 0,725 ::testing::Values(make_tuple(0, &wht_sse2_func_info, 0,
726 VPX_BITS_8)));726 VPX_BITS_8)));
727#endif // HAVE_SSE2 && !CONFIG_EMULATE_HARDWARE727#endif // HAVE_SSE2 && !CONFIG_EMULATE_HARDWARE
728
729#if HAVE_VSX && !CONFIG_EMULATE_HARDWARE && !CONFIG_VP9_HIGHBITDEPTH
730static const FuncInfo wht_vsx_func_info = {
731 &fdct_wrapper<vp9_fwht4x4_c>, &idct_wrapper<vpx_iwht4x4_16_add_vsx>, 4, 1
732};
733
734INSTANTIATE_TEST_CASE_P(VSX, TransWHT,
735 ::testing::Values(make_tuple(0, &wht_vsx_func_info, 0,
736 VPX_BITS_8)));
737#endif // HAVE_VSX && !CONFIG_EMULATE_HARDWARE
728} // namespace738} // namespace
vpx_dsp/ppc/inv_txfm_vsx.c+77−9
@@ -76,6 +76,8 @@ static int16x8_t cospi29_v = { 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404 }; · 75 unmodified lines
76static int16x8_t cospi30_v = { 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606 };76static int16x8_t cospi30_v = { 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606 };
77static int16x8_t cospi31_v = { 804, 804, 804, 804, 804, 804, 804, 804 };77static int16x8_t cospi31_v = { 804, 804, 804, 804, 804, 804, 804, 804 };
78 78
79static uint8x16_t mask1 = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
80 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };
79#define ROUND_SHIFT_INIT \81#define ROUND_SHIFT_INIT \
80 const int32x4_t shift = vec_sl(vec_splat_s32(1), vec_splat_u32(13)); \82 const int32x4_t shift = vec_sl(vec_splat_s32(1), vec_splat_u32(13)); \
81 const uint32x4_t shift14 = vec_splat_u32(14);83 const uint32x4_t shift14 = vec_splat_u32(14);
@@ -107,6 +109,15 @@ static int16x8_t cospi31_v = { 804, 804, 804, 804, 804, 804, 804, 804 }; · 25 unmodified lines
107 out1 = vec_sub(step0, step1); \109 out1 = vec_sub(step0, step1); \
108 out1 = vec_perm(out1, out1, mask0);110 out1 = vec_perm(out1, out1, mask0);
109 111
112#define PACK_STORE(v0, v1) \
113 tmp16_0 = vec_add(vec_perm(d_u0, d_u1, mask1), v0); \
114 tmp16_1 = vec_add(vec_perm(d_u2, d_u3, mask1), v1); \
115 output_v = vec_packsu(tmp16_0, tmp16_1); \
116 \
117 vec_vsx_st(output_v, 0, tmp_dest); \
118 for (i = 0; i < 4; i++) \
119 for (j = 0; j < 4; j++) dest[j * stride + i] = tmp_dest[j * 4 + i];
120
110void vpx_idct4x4_16_add_vsx(const tran_low_t *input, uint8_t *dest,121void vpx_idct4x4_16_add_vsx(const tran_low_t *input, uint8_t *dest,
111 int stride) {122 int stride) {
112 int i, j;123 int i, j;
@@ -114,13 +125,10 @@ void vpx_idct4x4_16_add_vsx(const tran_low_t *input, uint8_t *dest, · 1 unmodified line
114 int16x8_t step0, step1, tmp16_0, tmp16_1, t_out0, t_out1;125 int16x8_t step0, step1, tmp16_0, tmp16_1, t_out0, t_out1;
115 uint8x16_t mask0 = { 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF,126 uint8x16_t mask0 = { 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF,
116 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7 };127 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7 };
117 uint8x16_t mask1 = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
118 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };
119 int16x8_t v0 = load_tran_low(0, input);128 int16x8_t v0 = load_tran_low(0, input);
120 int16x8_t v1 = load_tran_low(8 * sizeof(*input), input);129 int16x8_t v1 = load_tran_low(8 * sizeof(*input), input);
121 int16x8_t t0 = vec_mergeh(v0, v1);130 int16x8_t t0 = vec_mergeh(v0, v1);
122 int16x8_t t1 = vec_mergel(v0, v1);131 int16x8_t t1 = vec_mergel(v0, v1);
123
124 uint8x16_t dest0 = vec_vsx_ld(0, dest);132 uint8x16_t dest0 = vec_vsx_ld(0, dest);
125 uint8x16_t dest1 = vec_vsx_ld(stride, dest);133 uint8x16_t dest1 = vec_vsx_ld(stride, dest);
126 uint8x16_t dest2 = vec_vsx_ld(2 * stride, dest);134 uint8x16_t dest2 = vec_vsx_ld(2 * stride, dest);
@@ -130,6 +138,7 @@ void vpx_idct4x4_16_add_vsx(const tran_low_t *input, uint8_t *dest, · 3 unmodified lines
130 int16x8_t d_u1 = (int16x8_t)vec_mergeh(dest1, zerov);138 int16x8_t d_u1 = (int16x8_t)vec_mergeh(dest1, zerov);
131 int16x8_t d_u2 = (int16x8_t)vec_mergeh(dest2, zerov);139 int16x8_t d_u2 = (int16x8_t)vec_mergeh(dest2, zerov);
132 int16x8_t d_u3 = (int16x8_t)vec_mergeh(dest3, zerov);140 int16x8_t d_u3 = (int16x8_t)vec_mergeh(dest3, zerov);
141
133 uint8x16_t output_v;142 uint8x16_t output_v;
134 uint8_t tmp_dest[16];143 uint8_t tmp_dest[16];
135 ROUND_SHIFT_INIT144 ROUND_SHIFT_INIT
@@ -148,13 +157,8 @@ void vpx_idct4x4_16_add_vsx(const tran_low_t *input, uint8_t *dest, · 12 unmodified lines
148 157
149 PIXEL_ADD4(v0, t_out0);158 PIXEL_ADD4(v0, t_out0);
150 PIXEL_ADD4(v1, t_out1);159 PIXEL_ADD4(v1, t_out1);
151 tmp16_0 = vec_add(vec_perm(d_u0, d_u1, mask1), v0);
152 tmp16_1 = vec_add(vec_perm(d_u2, d_u3, mask1), v1);
153 output_v = vec_packsu(tmp16_0, tmp16_1);
154 160
155 vec_vsx_st(output_v, 0, tmp_dest);161 PACK_STORE(v0, v1);
156 for (i = 0; i < 4; i++)
157 for (j = 0; j < 4; j++) dest[j * stride + i] = tmp_dest[j * 4 + i];
158}162}
159 163
160#define TRANSPOSE8x8(in0, in1, in2, in3, in4, in5, in6, in7, out0, out1, out2, \164#define TRANSPOSE8x8(in0, in1, in2, in3, in4, in5, in6, in7, out0, out1, out2, \
@@ -1062,3 +1066,67 @@ void vpx_idct32x32_1024_add_vsx(const tran_low_t *input, uint8_t *dest, · 901 unmodified lines
1062 ADD_STORE_BLOCK(src2, 16);1066 ADD_STORE_BLOCK(src2, 16);
1063 ADD_STORE_BLOCK(src3, 24);1067 ADD_STORE_BLOCK(src3, 24);
1064}1068}
1069
1070#define TRANSFORM_COLS \
1071 v32_a = vec_add(v32_a, v32_c); \
1072 v32_d = vec_sub(v32_d, v32_b); \
1073 v32_e = vec_sub(v32_a, v32_d); \
1074 v32_e = vec_sra(v32_e, one); \
1075 v32_b = vec_sub(v32_e, v32_b); \
1076 v32_c = vec_sub(v32_e, v32_c); \
1077 v32_a = vec_sub(v32_a, v32_b); \
1078 v32_d = vec_add(v32_d, v32_c); \
1079 v_a = vec_packs(v32_a, v32_b); \
1080 v_c = vec_packs(v32_c, v32_d);
1081
1082#define TRANSPOSE_WHT \
1083 tmp_a = vec_mergeh(v_a, v_c); \
1084 tmp_c = vec_mergel(v_a, v_c); \
1085 v_a = vec_mergeh(tmp_a, tmp_c); \
1086 v_c = vec_mergel(tmp_a, tmp_c);
1087
1088void vpx_iwht4x4_16_add_vsx(const tran_low_t *input, uint8_t *dest,
1089 int stride) {
1090 int16x8_t v_a = load_tran_low(0, input);
1091 int16x8_t v_c = load_tran_low(8 * sizeof(*input), input);
1092 int16x8_t tmp_a, tmp_c;
1093 uint16x8_t two = vec_splat_u16(2);
1094 uint32x4_t one = vec_splat_u32(1);
1095 int16x8_t tmp16_0, tmp16_1;
1096 int32x4_t v32_a, v32_c, v32_d, v32_b, v32_e;
1097 uint8x16_t dest0 = vec_vsx_ld(0, dest);
1098 uint8x16_t dest1 = vec_vsx_ld(stride, dest);
1099 uint8x16_t dest2 = vec_vsx_ld(2 * stride, dest);
1100 uint8x16_t dest3 = vec_vsx_ld(3 * stride, dest);
1101 int16x8_t d_u0 = (int16x8_t)unpack_to_u16_h(dest0);
1102 int16x8_t d_u1 = (int16x8_t)unpack_to_u16_h(dest1);
1103 int16x8_t d_u2 = (int16x8_t)unpack_to_u16_h(dest2);
1104 int16x8_t d_u3 = (int16x8_t)unpack_to_u16_h(dest3);
1105 uint8x16_t output_v;
1106 uint8_t tmp_dest[16];
1107 int i, j;
1108
1109 v_a = vec_sra(v_a, two);
1110 v_c = vec_sra(v_c, two);
1111
1112 TRANSPOSE_WHT;
1113
1114 v32_a = vec_unpackh(v_a);
1115 v32_c = vec_unpackl(v_a);
1116
1117 v32_d = vec_unpackh(v_c);
1118 v32_b = vec_unpackl(v_c);
1119
1120 TRANSFORM_COLS;
1121
1122 TRANSPOSE_WHT;
1123
1124 v32_a = vec_unpackh(v_a);
1125 v32_c = vec_unpackl(v_a);
1126 v32_d = vec_unpackh(v_c);
1127 v32_b = vec_unpackl(v_c);
1128
1129 TRANSFORM_COLS;
1130
1131 PACK_STORE(v_a, v_c);
1132}
vpx_dsp/vpx_dsp_rtcd_defs.pl+1−1
@@ -626,7 +626,7 @@ if (vpx_config("CONFIG_EMULATE_HARDWARE") ne "yes") { · 625 unmodified lines
626 specialize qw/vpx_idct32x32_135_add neon sse2 ssse3/;626 specialize qw/vpx_idct32x32_135_add neon sse2 ssse3/;
627 specialize qw/vpx_idct32x32_34_add neon sse2 ssse3/;627 specialize qw/vpx_idct32x32_34_add neon sse2 ssse3/;
628 specialize qw/vpx_idct32x32_1_add neon sse2/;628 specialize qw/vpx_idct32x32_1_add neon sse2/;
629 specialize qw/vpx_iwht4x4_16_add sse2/;629 specialize qw/vpx_iwht4x4_16_add sse2 vsx/;
630 630
631 if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") ne "yes") {631 if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") ne "yes") {
632 # Note that these specializations are appended to the above ones.632 # Note that these specializations are appended to the above ones.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t