diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2017-05-11 01:07:09 +0000 |
---|---|---|
committer | James Zern <jzern@google.com> | 2017-05-12 17:22:55 +0200 |
commit | a7f8bd451b82f52fb9bb5d9e7926f4d09cc66831 (patch) | |
tree | 2bdf375dfe57184fc4d2b7fc936fc3a6e915308c /vpx_dsp/ppc/variance_vsx.c | |
parent | f7e767d8ee584aabc2074e425186b219d564cce3 (diff) | |
download | libvpx-a7f8bd451b82f52fb9bb5d9e7926f4d09cc66831.tar libvpx-a7f8bd451b82f52fb9bb5d9e7926f4d09cc66831.tar.gz libvpx-a7f8bd451b82f52fb9bb5d9e7926f4d09cc66831.tar.bz2 libvpx-a7f8bd451b82f52fb9bb5d9e7926f4d09cc66831.zip |
ppc: Add comp_avg_pred_vsx
Change-Id: I59788cd98231e707239c2ad95ae54f67cfe24e10
Diffstat (limited to 'vpx_dsp/ppc/variance_vsx.c')
-rw-r--r-- | vpx_dsp/ppc/variance_vsx.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/vpx_dsp/ppc/variance_vsx.c b/vpx_dsp/ppc/variance_vsx.c new file mode 100644 index 000000000..4f238dc95 --- /dev/null +++ b/vpx_dsp/ppc/variance_vsx.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2017 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include <assert.h> + +#include "./vpx_dsp_rtcd.h" +#include "vpx_dsp/ppc/types_vsx.h" + +void vpx_comp_avg_pred_vsx(uint8_t *comp_pred, const uint8_t *pred, int width, + int height, const uint8_t *ref, int ref_stride) { + int i, j; + /* comp_pred and pred must be 16 byte aligned. */ + assert(((intptr_t)comp_pred & 0xf) == 0); + assert(((intptr_t)pred & 0xf) == 0); + if (width >= 16) { + for (i = 0; i < height; ++i) { + for (j = 0; j < width; j += 16) { + const uint8x16_t v = vec_avg(vec_vsx_ld(j, pred), vec_vsx_ld(j, ref)); + vec_vsx_st(v, j, comp_pred); + } + comp_pred += width; + pred += width; + ref += ref_stride; + } + } else if (width == 8) { + // Process 2 lines at time + for (i = 0; i < height / 2; ++i) { + const uint8x16_t r0 = vec_vsx_ld(0, ref); + const uint8x16_t r1 = vec_vsx_ld(0, ref + ref_stride); + const uint8x16_t r = xxpermdi(r0, r1, 0); + const uint8x16_t v = vec_avg(vec_vsx_ld(0, pred), r); + vec_vsx_st(v, 0, comp_pred); + comp_pred += 16; // width * 2; + pred += 16; // width * 2; + ref += ref_stride * 2; + } + } else { + assert(width == 4); + // process 4 lines at time + for (i = 0; i < height / 4; ++i) { + const uint32x4_t r0 = (uint32x4_t)vec_vsx_ld(0, ref); + const uint32x4_t r1 = (uint32x4_t)vec_vsx_ld(0, ref + ref_stride); + const uint32x4_t r2 = (uint32x4_t)vec_vsx_ld(0, ref + ref_stride * 2); + const uint32x4_t r3 = (uint32x4_t)vec_vsx_ld(0, ref + ref_stride * 3); + const uint8x16_t r = + (uint8x16_t)xxpermdi(vec_mergeh(r0, r1), vec_mergeh(r2, r3), 0); + const uint8x16_t v = vec_avg(vec_vsx_ld(0, pred), r); + vec_vsx_st(v, 0, comp_pred); + comp_pred += 16; // width * 4; + pred += 16; // width * 4; + ref += ref_stride * 4; + } + } +} |