1251212Spfg/* Copyright (C) 2006, 2007 Free Software Foundation, Inc. 2219639Smm 3219639Smm This file is part of GCC. 4219639Smm 5219639Smm GCC is free software; you can redistribute it and/or modify 6219639Smm it under the terms of the GNU General Public License as published by 7219639Smm the Free Software Foundation; either version 2, or (at your option) 8219639Smm any later version. 9219639Smm 10219639Smm GCC is distributed in the hope that it will be useful, 11219639Smm but WITHOUT ANY WARRANTY; without even the implied warranty of 12219639Smm MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13219639Smm GNU General Public License for more details. 14219639Smm 15219639Smm You should have received a copy of the GNU General Public License 16219639Smm along with GCC; see the file COPYING. If not, write to 17219639Smm the Free Software Foundation, 59 Temple Place - Suite 330, 18219639Smm Boston, MA 02111-1307, USA. */ 19219639Smm 20219639Smm/* As a special exception, if you include this header file into source 21219639Smm files compiled by GCC, this header file does not by itself cause 22219639Smm the resulting executable to be covered by the GNU General Public 23219639Smm License. This exception does not however invalidate any other 24219639Smm reasons why the executable file might be covered by the GNU General 25219639Smm Public License. */ 26219639Smm 27219639Smm/* Implemented from the specification included in the Intel C++ Compiler 28219639Smm User Guide and Reference, version 9.1. */ 29219639Smm 30219639Smm#ifndef _TMMINTRIN_H_INCLUDED 31219639Smm#define _TMMINTRIN_H_INCLUDED 32219639Smm 33251212Spfg#ifndef __SSSE3__ 34251212Spfg# error "SSSE3 instruction set not enabled" 35251212Spfg#else 36251212Spfg 37251212Spfg/* We need definitions from the SSE3, SSE2 and SSE header files*/ 38237021Spfg#include <pmmintrin.h> 39219639Smm 40237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 41237021Spfg_mm_hadd_epi16 (__m128i __X, __m128i __Y) 42237021Spfg{ 43237021Spfg return (__m128i) __builtin_ia32_phaddw128 ((__v8hi)__X, (__v8hi)__Y); 44237021Spfg} 45237021Spfg 46237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 47237021Spfg_mm_hadd_epi32 (__m128i __X, __m128i __Y) 48237021Spfg{ 49237021Spfg return (__m128i) __builtin_ia32_phaddd128 ((__v4si)__X, (__v4si)__Y); 50237021Spfg} 51237021Spfg 52237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 53237021Spfg_mm_hadds_epi16 (__m128i __X, __m128i __Y) 54237021Spfg{ 55237021Spfg return (__m128i) __builtin_ia32_phaddsw128 ((__v8hi)__X, (__v8hi)__Y); 56237021Spfg} 57237021Spfg 58237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 59237021Spfg_mm_hadd_pi16 (__m64 __X, __m64 __Y) 60237021Spfg{ 61237021Spfg return (__m64) __builtin_ia32_phaddw ((__v4hi)__X, (__v4hi)__Y); 62237021Spfg} 63237021Spfg 64237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 65237021Spfg_mm_hadd_pi32 (__m64 __X, __m64 __Y) 66237021Spfg{ 67237021Spfg return (__m64) __builtin_ia32_phaddd ((__v2si)__X, (__v2si)__Y); 68237021Spfg} 69237021Spfg 70237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 71237021Spfg_mm_hadds_pi16 (__m64 __X, __m64 __Y) 72237021Spfg{ 73237021Spfg return (__m64) __builtin_ia32_phaddsw ((__v4hi)__X, (__v4hi)__Y); 74237021Spfg} 75237021Spfg 76237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 77237021Spfg_mm_hsub_epi16 (__m128i __X, __m128i __Y) 78237021Spfg{ 79237021Spfg return (__m128i) __builtin_ia32_phsubw128 ((__v8hi)__X, (__v8hi)__Y); 80237021Spfg} 81237021Spfg 82237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 83237021Spfg_mm_hsub_epi32 (__m128i __X, __m128i __Y) 84237021Spfg{ 85237021Spfg return (__m128i) __builtin_ia32_phsubd128 ((__v4si)__X, (__v4si)__Y); 86237021Spfg} 87237021Spfg 88237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 89237021Spfg_mm_hsubs_epi16 (__m128i __X, __m128i __Y) 90237021Spfg{ 91237021Spfg return (__m128i) __builtin_ia32_phsubsw128 ((__v8hi)__X, (__v8hi)__Y); 92237021Spfg} 93237021Spfg 94237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 95237021Spfg_mm_hsub_pi16 (__m64 __X, __m64 __Y) 96237021Spfg{ 97237021Spfg return (__m64) __builtin_ia32_phsubw ((__v4hi)__X, (__v4hi)__Y); 98237021Spfg} 99237021Spfg 100237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 101237021Spfg_mm_hsub_pi32 (__m64 __X, __m64 __Y) 102237021Spfg{ 103237021Spfg return (__m64) __builtin_ia32_phsubd ((__v2si)__X, (__v2si)__Y); 104237021Spfg} 105237021Spfg 106237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 107237021Spfg_mm_hsubs_pi16 (__m64 __X, __m64 __Y) 108237021Spfg{ 109237021Spfg return (__m64) __builtin_ia32_phsubsw ((__v4hi)__X, (__v4hi)__Y); 110237021Spfg} 111237021Spfg 112237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 113237021Spfg_mm_maddubs_epi16 (__m128i __X, __m128i __Y) 114237021Spfg{ 115237021Spfg return (__m128i) __builtin_ia32_pmaddubsw128 ((__v16qi)__X, (__v16qi)__Y); 116237021Spfg} 117237021Spfg 118237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 119237021Spfg_mm_maddubs_pi16 (__m64 __X, __m64 __Y) 120237021Spfg{ 121237021Spfg return (__m64) __builtin_ia32_pmaddubsw ((__v8qi)__X, (__v8qi)__Y); 122237021Spfg} 123237021Spfg 124237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 125237021Spfg_mm_mulhrs_epi16 (__m128i __X, __m128i __Y) 126237021Spfg{ 127237021Spfg return (__m128i) __builtin_ia32_pmulhrsw128 ((__v8hi)__X, (__v8hi)__Y); 128237021Spfg} 129237021Spfg 130237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 131237021Spfg_mm_mulhrs_pi16 (__m64 __X, __m64 __Y) 132237021Spfg{ 133237021Spfg return (__m64) __builtin_ia32_pmulhrsw ((__v4hi)__X, (__v4hi)__Y); 134237021Spfg} 135237021Spfg 136237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 137237021Spfg_mm_shuffle_epi8 (__m128i __X, __m128i __Y) 138237021Spfg{ 139237021Spfg return (__m128i) __builtin_ia32_pshufb128 ((__v16qi)__X, (__v16qi)__Y); 140237021Spfg} 141237021Spfg 142237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 143237021Spfg_mm_shuffle_pi8 (__m64 __X, __m64 __Y) 144237021Spfg{ 145237021Spfg return (__m64) __builtin_ia32_pshufb ((__v8qi)__X, (__v8qi)__Y); 146237021Spfg} 147237021Spfg 148237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 149237021Spfg_mm_sign_epi8 (__m128i __X, __m128i __Y) 150237021Spfg{ 151237021Spfg return (__m128i) __builtin_ia32_psignb128 ((__v16qi)__X, (__v16qi)__Y); 152237021Spfg} 153237021Spfg 154237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 155237021Spfg_mm_sign_epi16 (__m128i __X, __m128i __Y) 156237021Spfg{ 157237021Spfg return (__m128i) __builtin_ia32_psignw128 ((__v8hi)__X, (__v8hi)__Y); 158237021Spfg} 159237021Spfg 160237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 161237021Spfg_mm_sign_epi32 (__m128i __X, __m128i __Y) 162237021Spfg{ 163237021Spfg return (__m128i) __builtin_ia32_psignd128 ((__v4si)__X, (__v4si)__Y); 164237021Spfg} 165237021Spfg 166237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 167237021Spfg_mm_sign_pi8 (__m64 __X, __m64 __Y) 168237021Spfg{ 169237021Spfg return (__m64) __builtin_ia32_psignb ((__v8qi)__X, (__v8qi)__Y); 170237021Spfg} 171237021Spfg 172237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 173237021Spfg_mm_sign_pi16 (__m64 __X, __m64 __Y) 174237021Spfg{ 175237021Spfg return (__m64) __builtin_ia32_psignw ((__v4hi)__X, (__v4hi)__Y); 176237021Spfg} 177237021Spfg 178237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 179237021Spfg_mm_sign_pi32 (__m64 __X, __m64 __Y) 180237021Spfg{ 181237021Spfg return (__m64) __builtin_ia32_psignd ((__v2si)__X, (__v2si)__Y); 182237021Spfg} 183237021Spfg 184237021Spfg#define _mm_alignr_epi8(__X, __Y, __N) \ 185237021Spfg ((__m128i)__builtin_ia32_palignr128 ((__v2di) __X, (__v2di) __Y, (__N) * 8)) 186237021Spfg 187237021Spfg#define _mm_alignr_pi8(__X, __Y, __N) \ 188237021Spfg ((__m64)__builtin_ia32_palignr ((long long) (__X), (long long) (__Y), (__N) * 8)) 189237021Spfg 190237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 191237021Spfg_mm_abs_epi8 (__m128i __X) 192237021Spfg{ 193237021Spfg return (__m128i) __builtin_ia32_pabsb128 ((__v16qi)__X); 194237021Spfg} 195237021Spfg 196237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 197237021Spfg_mm_abs_epi16 (__m128i __X) 198237021Spfg{ 199237021Spfg return (__m128i) __builtin_ia32_pabsw128 ((__v8hi)__X); 200237021Spfg} 201237021Spfg 202237021Spfgstatic __inline __m128i __attribute__((__always_inline__)) 203237021Spfg_mm_abs_epi32 (__m128i __X) 204237021Spfg{ 205237021Spfg return (__m128i) __builtin_ia32_pabsd128 ((__v4si)__X); 206237021Spfg} 207237021Spfg 208237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 209237021Spfg_mm_abs_pi8 (__m64 __X) 210237021Spfg{ 211237021Spfg return (__m64) __builtin_ia32_pabsb ((__v8qi)__X); 212237021Spfg} 213237021Spfg 214237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 215237021Spfg_mm_abs_pi16 (__m64 __X) 216237021Spfg{ 217237021Spfg return (__m64) __builtin_ia32_pabsw ((__v4hi)__X); 218237021Spfg} 219237021Spfg 220237021Spfgstatic __inline __m64 __attribute__((__always_inline__)) 221237021Spfg_mm_abs_pi32 (__m64 __X) 222237021Spfg{ 223237021Spfg return (__m64) __builtin_ia32_pabsd ((__v2si)__X); 224237021Spfg} 225237021Spfg 226237021Spfg#endif /* __SSSE3__ */ 227237021Spfg 228237021Spfg#endif /* _TMMINTRIN_H_INCLUDED */ 229