1 /**
2 *** Copyright (C) 1985-1999 Intel Corporation.  All rights reserved.
3 ***
4 *** The information and source code contained herein is the exclusive
5 *** property of Intel Corporation and may not be disclosed, examined
6 *** or reproduced in whole or in part without explicit written authorization
7 *** from the company.
8 ***
9 **/
10
11 /*
12  * Definitions and declarations for use with compiler intrinsics.
13  */
14
15 #ifndef _MMINTRIN_H_INCLUDED
16 #define _MMINTRIN_H_INCLUDED
17 #ifndef __midl
18
19 #include <crtdefs.h>
20
21 #if defined(_M_CEE_PURE)
22              #error ERROR: MM intrinsics not supported in the pure mode!
23 #else
24
25 #if defined __cplusplus
26 extern "C" { /* Begin "C" */
27 /* Intrinsics use C name-mangling.
28  */
29 #endif /* __cplusplus */
30
31 typedef union __declspec(intrin_type) _CRT_ALIGN(8) __m64
32 {
33       unsigned __int64      m64_u64;
34       float                         m64_f32[2];
35       __int8                       m64_i8[8];
36       __int16                     m64_i16[4];
37       __int32                     m64_i32[2];      
38       __int64                     m64_i64;
39       unsigned __int8        m64_u8[8];
40       unsigned __int16      m64_u16[4];
41       unsigned __int32      m64_u32[2];
42 } __m64;
43
44 /* General support intrinsics */
45 void  _m_empty(void);
46 __m64 _m_from_int(int _I);
47 int     _m_to_int(__m64 _M);
48 __m64 _m_packsswb(__m64 _MM1, __m64 _MM2);
49 __m64 _m_packssdw(__m64 _MM1, __m64 _MM2);
50 __m64 _m_packuswb(__m64 _MM1, __m64 _MM2);
51 __m64 _m_punpckhbw(__m64 _MM1, __m64 _MM2);
52 __m64 _m_punpckhwd(__m64 _MM1, __m64 _MM2);
53 __m64 _m_punpckhdq(__m64 _MM1, __m64 _MM2);
54 __m64 _m_punpcklbw(__m64 _MM1, __m64 _MM2);
55 __m64 _m_punpcklwd(__m64 _MM1, __m64 _MM2);
56 __m64 _m_punpckldq(__m64 _MM1, __m64 _MM2);
57
58 /* Packed arithmetic intrinsics */
59 __m64 _m_paddb(__m64 _MM1, __m64 _MM2);
60 __m64 _m_paddw(__m64 _MM1, __m64 _MM2);
61 __m64 _m_paddd(__m64 _MM1, __m64 _MM2);
62 __m64 _m_paddsb(__m64 _MM1, __m64 _MM2);
63 __m64 _m_paddsw(__m64 _MM1, __m64 _MM2);
64 __m64 _m_paddusb(__m64 _MM1, __m64 _MM2);
65 __m64 _m_paddusw(__m64 _MM1, __m64 _MM2);
66 __m64 _m_psubb(__m64 _MM1, __m64 _MM2);
67 __m64 _m_psubw(__m64 _MM1, __m64 _MM2);
68 __m64 _m_psubd(__m64 _MM1, __m64 _MM2);
69 __m64 _m_psubsb(__m64 _MM1, __m64 _MM2);
70 __m64 _m_psubsw(__m64 _MM1, __m64 _MM2);
71 __m64 _m_psubusb(__m64 _MM1, __m64 _MM2);
72 __m64 _m_psubusw(__m64 _MM1, __m64 _MM2);
73 __m64 _m_pmaddwd(__m64 _MM1, __m64 _MM2);
74 __m64 _m_pmulhw(__m64 _MM1, __m64 _MM2);
75 __m64 _m_pmullw(__m64 _MM1, __m64 _MM2);
76
77 /* Shift intrinsics */
78 __m64 _m_psllw(__m64 _M, __m64 _Count);
79 __m64 _m_psllwi(__m64 _M, int _Count);
80 __m64 _m_pslld(__m64 _M, __m64 _Count);
81 __m64 _m_pslldi(__m64 _M, int _Count);
82 __m64 _m_psllq(__m64 _M, __m64 _Count);
83 __m64 _m_psllqi(__m64 _M, int _Count);
84 __m64 _m_psraw(__m64 _M, __m64 _Count);
85 __m64 _m_psrawi(__m64 _M, int _Count);
86 __m64 _m_psrad(__m64 _M, __m64 _Count);
87 __m64 _m_psradi(__m64 _M, int _Count);
88 __m64 _m_psrlw(__m64 _M, __m64 _Count);
89 __m64 _m_psrlwi(__m64 _M, int _Count);
90 __m64 _m_psrld(__m64 _M, __m64 _Count);
91 __m64 _m_psrldi(__m64 _M, int _Count);
92 __m64 _m_psrlq(__m64 _M, __m64 _Count);
93 __m64 _m_psrlqi(__m64 _M, int _Count);
94
95 /* Logical intrinsics */
96 __m64 _m_pand(__m64 _MM1, __m64 _MM2);
97 __m64 _m_pandn(__m64 _MM1, __m64 _MM2);
Lines 98 ... 107 are skipped.
108
109 /* Utility intrinsics */
110 __m64 _mm_setzero_si64(void);
111 __m64 _mm_set_pi32(int _I1, int _I0);
112 __m64 _mm_set_pi16(short _S3, short _S2, short _S1, short _S0);
113 __m64 _mm_set_pi8(char _B7, char _B6, char _B5, char _B4,
114                               char _B3, char _B2, char _B1, char _B0);
115 __m64 _mm_set1_pi32(int _I);
116 __m64 _mm_set1_pi16(short _S);
117 __m64 _mm_set1_pi8(char _B);
118 __m64 _mm_setr_pi32(int _I1, int _I0);
119 __m64 _mm_setr_pi16(short _S3, short _S2, short _S1, short _S0);
120 __m64 _mm_setr_pi8(char _B7, char _B6, char _B5, char _B4,
121                                char _B3, char _B2, char _B1, char _B0);
122
123 /* Alternate intrinsic name definitions */
124 #define _mm_empty               _m_empty
125 #define _mm_cvtsi32_si64  _m_from_int
126 #define _mm_cvtsi64_si32  _m_to_int
127 #define _mm_packs_pi16      _m_packsswb
128 #define _mm_packs_pi32      _m_packssdw
129 #define _mm_packs_pu16      _m_packuswb
130 #define _mm_unpackhi_pi8  _m_punpckhbw
131 #define _mm_unpackhi_pi16 _m_punpckhwd
132 #define _mm_unpackhi_pi32 _m_punpckhdq
133 #define _mm_unpacklo_pi8  _m_punpcklbw
134 #define _mm_unpacklo_pi16 _m_punpcklwd
135 #define _mm_unpacklo_pi32 _m_punpckldq
136 #define _mm_add_pi8           _m_paddb
137 #define _mm_add_pi16          _m_paddw
138 #define _mm_add_pi32          _m_paddd
139 #define _mm_adds_pi8          _m_paddsb
140 #define _mm_adds_pi16        _m_paddsw
141 #define _mm_adds_pu8          _m_paddusb
142 #define _mm_adds_pu16        _m_paddusw
143 #define _mm_sub_pi8           _m_psubb
144 #define _mm_sub_pi16          _m_psubw
145 #define _mm_sub_pi32          _m_psubd
146 #define _mm_subs_pi8          _m_psubsb
147 #define _mm_subs_pi16        _m_psubsw
148 #define _mm_subs_pu8          _m_psubusb
149 #define _mm_subs_pu16        _m_psubusw
150 #define _mm_madd_pi16        _m_pmaddwd
151 #define _mm_mulhi_pi16      _m_pmulhw
152 #define _mm_mullo_pi16      _m_pmullw
153 #define _mm_sll_pi16          _m_psllw
154 #define _mm_slli_pi16        _m_psllwi
155 #define _mm_sll_pi32          _m_pslld
156 #define _mm_slli_pi32        _m_pslldi
157 #define _mm_sll_si64          _m_psllq
158 #define _mm_slli_si64        _m_psllqi
159 #define _mm_sra_pi16          _m_psraw
160 #define _mm_srai_pi16        _m_psrawi
161 #define _mm_sra_pi32          _m_psrad
162 #define _mm_srai_pi32        _m_psradi
163 #define _mm_srl_pi16          _m_psrlw
164 #define _mm_srli_pi16        _m_psrlwi
165 #define _mm_srl_pi32          _m_psrld
166 #define _mm_srli_pi32        _m_psrldi
167 #define _mm_srl_si64          _m_psrlq
168 #define _mm_srli_si64        _m_psrlqi
169 #define _mm_and_si64          _m_pand
170 #define _mm_andnot_si64     _m_pandn
171 #define _mm_or_si64           _m_por
172 #define _mm_xor_si64          _m_pxor
173 #define _mm_cmpeq_pi8        _m_pcmpeqb
174 #define _mm_cmpeq_pi16      _m_pcmpeqw
175 #define _mm_cmpeq_pi32      _m_pcmpeqd
176 #define _mm_cmpgt_pi8        _m_pcmpgtb
177 #define _mm_cmpgt_pi16      _m_pcmpgtw
178 #define _mm_cmpgt_pi32      _m_pcmpgtd
179
180
181 #if defined __cplusplus
182 }; /* End "C" */
183 #endif /* __cplusplus */
184
185 #endif /* defined(_M_CEE_PURE) */
186 #endif
187 #endif /* _MMINTRIN_H_INCLUDED */
188
189