Browse Source

Merge commit 'd0bf20a4f25ac5de021c860a0c8ad05638ee2078'

* commit 'd0bf20a4f25ac5de021c860a0c8ad05638ee2078':
  ppc: vsx: Implement diff_pixels and get_pixels

Merged-by: Michael Niedermayer <michaelni@gmx.at>
tags/n2.7
Michael Niedermayer 10 years ago
parent
commit
1ff47770ca
2 changed files with 56 additions and 0 deletions
  1. +44
    -0
      libavcodec/ppc/pixblockdsp.c
  2. +12
    -0
      libavutil/ppc/util_altivec.h

+ 44
- 0
libavcodec/ppc/pixblockdsp.c View File

@@ -228,6 +228,40 @@ static void diff_pixels_altivec(int16_t *restrict block, const uint8_t *s1,

#endif /* HAVE_ALTIVEC */

#if HAVE_VSX
static void get_pixels_vsx(int16_t *restrict block, const uint8_t *pixels,
int line_size)
{
int i;
for (i = 0; i < 8; i++) {
vec_s16 shorts = vsx_ld_u8_s16(0, pixels);

vec_vsx_st(shorts, i * 16, block);

pixels += line_size;
}
}

static void diff_pixels_vsx(int16_t *restrict block, const uint8_t *s1,
const uint8_t *s2, int stride)
{
int i;
vec_s16 shorts1, shorts2;
for (i = 0; i < 8; i++) {
shorts1 = vsx_ld_u8_s16(0, s1);
shorts2 = vsx_ld_u8_s16(0, s2);

shorts1 = vec_sub(shorts1, shorts2);

vec_vsx_st(shorts1, 0, block);

s1 += stride;
s2 += stride;
block += 8;
}
}
#endif /* HAVE_VSX */

av_cold void ff_pixblockdsp_init_ppc(PixblockDSPContext *c,
AVCodecContext *avctx,
unsigned high_bit_depth)
@@ -242,4 +276,14 @@ av_cold void ff_pixblockdsp_init_ppc(PixblockDSPContext *c,
c->get_pixels = get_pixels_altivec;
}
#endif /* HAVE_ALTIVEC */

#if HAVE_VSX
if (!PPC_VSX(av_get_cpu_flags()))
return;

c->diff_pixels = diff_pixels_vsx;

if (!high_bit_depth)
c->get_pixels = get_pixels_vsx;
#endif /* HAVE_VSX */
}

+ 12
- 0
libavutil/ppc/util_altivec.h View File

@@ -162,4 +162,16 @@ static inline vec_u8 load_with_perm_vec(int offset, const uint8_t *src, vec_u8 p

#endif /* HAVE_ALTIVEC */

#if HAVE_VSX
#if HAVE_BIGENDIAN
#define vsx_ld_u8_s16(off, p) \
((vec_s16)vec_mergeh((vec_u8)vec_splat_u8(0), \
(vec_u8)vec_vsx_ld((off), (p))))
#else
#define vsx_ld_u8_s16(off, p) \
((vec_s16)vec_mergeh((vec_u8)vec_vsx_ld((off), (p)), \
(vec_u8)vec_splat_u8(0)))
#endif /* HAVE_BIGENDIAN */
#endif /* HAVE_VSX */

#endif /* AVUTIL_PPC_UTIL_ALTIVEC_H */

Loading…
Cancel
Save