10a39d0a697ff3603e8c100300fda363658e10b23James Zern/*
20a39d0a697ff3603e8c100300fda363658e10b23James Zern *  Copyright (c) 2017 The WebM project authors. All Rights Reserved.
30a39d0a697ff3603e8c100300fda363658e10b23James Zern *
40a39d0a697ff3603e8c100300fda363658e10b23James Zern *  Use of this source code is governed by a BSD-style license
50a39d0a697ff3603e8c100300fda363658e10b23James Zern *  that can be found in the LICENSE file in the root of the source
60a39d0a697ff3603e8c100300fda363658e10b23James Zern *  tree. An additional intellectual property rights grant can be found
70a39d0a697ff3603e8c100300fda363658e10b23James Zern *  in the file PATENTS.  All contributing project authors may
80a39d0a697ff3603e8c100300fda363658e10b23James Zern *  be found in the AUTHORS file in the root of the source tree.
90a39d0a697ff3603e8c100300fda363658e10b23James Zern */
100a39d0a697ff3603e8c100300fda363658e10b23James Zern
110a39d0a697ff3603e8c100300fda363658e10b23James Zern#ifndef VPX_DSP_PPC_TYPES_VSX_H_
120a39d0a697ff3603e8c100300fda363658e10b23James Zern#define VPX_DSP_PPC_TYPES_VSX_H_
130a39d0a697ff3603e8c100300fda363658e10b23James Zern
140a39d0a697ff3603e8c100300fda363658e10b23James Zern#include <altivec.h>
150a39d0a697ff3603e8c100300fda363658e10b23James Zern
160a39d0a697ff3603e8c100300fda363658e10b23James Zerntypedef vector signed char int8x16_t;
170a39d0a697ff3603e8c100300fda363658e10b23James Zerntypedef vector unsigned char uint8x16_t;
180a39d0a697ff3603e8c100300fda363658e10b23James Zerntypedef vector signed short int16x8_t;
190a39d0a697ff3603e8c100300fda363658e10b23James Zerntypedef vector unsigned short uint16x8_t;
200a39d0a697ff3603e8c100300fda363658e10b23James Zerntypedef vector signed int int32x4_t;
210a39d0a697ff3603e8c100300fda363658e10b23James Zerntypedef vector unsigned int uint32x4_t;
220a39d0a697ff3603e8c100300fda363658e10b23James Zern
230a39d0a697ff3603e8c100300fda363658e10b23James Zern#ifdef __clang__
240a39d0a697ff3603e8c100300fda363658e10b23James Zernstatic const uint8x16_t xxpermdi0_perm = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
250a39d0a697ff3603e8c100300fda363658e10b23James Zern                                           0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
260a39d0a697ff3603e8c100300fda363658e10b23James Zern                                           0x14, 0x15, 0x16, 0x17 };
270a39d0a697ff3603e8c100300fda363658e10b23James Zernstatic const uint8x16_t xxpermdi1_perm = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
280a39d0a697ff3603e8c100300fda363658e10b23James Zern                                           0x06, 0x07, 0x18, 0x19, 0x1A, 0x1B,
290a39d0a697ff3603e8c100300fda363658e10b23James Zern                                           0x1C, 0x1D, 0x1E, 0x1F };
300a39d0a697ff3603e8c100300fda363658e10b23James Zernstatic const uint8x16_t xxpermdi2_perm = { 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
310a39d0a697ff3603e8c100300fda363658e10b23James Zern                                           0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13,
320a39d0a697ff3603e8c100300fda363658e10b23James Zern                                           0x14, 0x15, 0x16, 0x17 };
330a39d0a697ff3603e8c100300fda363658e10b23James Zernstatic const uint8x16_t xxpermdi3_perm = { 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
340a39d0a697ff3603e8c100300fda363658e10b23James Zern                                           0x0E, 0x0F, 0x18, 0x19, 0x1A, 0x1B,
350a39d0a697ff3603e8c100300fda363658e10b23James Zern                                           0x1C, 0x1D, 0x1E, 0x1F };
360a39d0a697ff3603e8c100300fda363658e10b23James Zern#define xxpermdi(a, b, c) vec_perm(a, b, xxpermdi##c##_perm)
370a39d0a697ff3603e8c100300fda363658e10b23James Zern#elif defined(__GNUC__) && \
380a39d0a697ff3603e8c100300fda363658e10b23James Zern    (__GNUC__ > 6 || (__GNUC__ == 6 && __GNUC_MINOR__ >= 3))
390a39d0a697ff3603e8c100300fda363658e10b23James Zern#define xxpermdi(a, b, c) vec_xxpermdi(a, b, c)
400a39d0a697ff3603e8c100300fda363658e10b23James Zern#endif
410a39d0a697ff3603e8c100300fda363658e10b23James Zern
420a39d0a697ff3603e8c100300fda363658e10b23James Zern#ifdef WORDS_BIGENDIAN
430a39d0a697ff3603e8c100300fda363658e10b23James Zern#define unpack_to_u16_h(v) \
440a39d0a697ff3603e8c100300fda363658e10b23James Zern  (uint16x8_t) vec_mergeh(vec_splat_u8(0), (uint8x16_t)v)
450a39d0a697ff3603e8c100300fda363658e10b23James Zern#define unpack_to_u16_l(v) \
460a39d0a697ff3603e8c100300fda363658e10b23James Zern  (uint16x8_t) vec_mergel(vec_splat_u8(0), (uint8x16_t)v)
470a39d0a697ff3603e8c100300fda363658e10b23James Zern#define unpack_to_s16_h(v) \
480a39d0a697ff3603e8c100300fda363658e10b23James Zern  (int16x8_t) vec_mergeh(vec_splat_u8(0), (uint8x16_t)v)
490a39d0a697ff3603e8c100300fda363658e10b23James Zern#define unpack_to_s16_l(v) \
500a39d0a697ff3603e8c100300fda363658e10b23James Zern  (int16x8_t) vec_mergel(vec_splat_u8(0), (uint8x16_t)v)
510a39d0a697ff3603e8c100300fda363658e10b23James Zern#ifndef xxpermdi
520a39d0a697ff3603e8c100300fda363658e10b23James Zern#define xxpermdi(a, b, c) vec_xxpermdi(a, b, c)
530a39d0a697ff3603e8c100300fda363658e10b23James Zern#endif
540a39d0a697ff3603e8c100300fda363658e10b23James Zern#else
550a39d0a697ff3603e8c100300fda363658e10b23James Zern#define unpack_to_u16_h(v) \
560a39d0a697ff3603e8c100300fda363658e10b23James Zern  (uint16x8_t) vec_mergeh((uint8x16_t)v, vec_splat_u8(0))
570a39d0a697ff3603e8c100300fda363658e10b23James Zern#define unpack_to_u16_l(v) \
580a39d0a697ff3603e8c100300fda363658e10b23James Zern  (uint16x8_t) vec_mergel((uint8x16_t)v, vec_splat_u8(0))
590a39d0a697ff3603e8c100300fda363658e10b23James Zern#define unpack_to_s16_h(v) \
600a39d0a697ff3603e8c100300fda363658e10b23James Zern  (int16x8_t) vec_mergeh((uint8x16_t)v, vec_splat_u8(0))
610a39d0a697ff3603e8c100300fda363658e10b23James Zern#define unpack_to_s16_l(v) \
620a39d0a697ff3603e8c100300fda363658e10b23James Zern  (int16x8_t) vec_mergel((uint8x16_t)v, vec_splat_u8(0))
630a39d0a697ff3603e8c100300fda363658e10b23James Zern#ifndef xxpermdi
640a39d0a697ff3603e8c100300fda363658e10b23James Zern#define xxpermdi(a, b, c) vec_xxpermdi(b, a, ((c >> 1) | (c & 1) << 1) ^ 3)
650a39d0a697ff3603e8c100300fda363658e10b23James Zern#endif
660a39d0a697ff3603e8c100300fda363658e10b23James Zern#endif
670a39d0a697ff3603e8c100300fda363658e10b23James Zern
680a39d0a697ff3603e8c100300fda363658e10b23James Zern#endif  // VPX_DSP_PPC_TYPES_VSX_H_
69