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