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  * emmintrin.h
13  *
14  * Principal header file for Willamette New Instruction intrinsics
15  *
16  * The intrinsics package can be used in 2 ways, based whether or not
17  * _EMM_FUNCTIONALITY is defined; if it is, the C implementation
18  * will be used (the "functional intrinsics").
19  */
20
21 #pragma once
22 #ifndef __midl
23 #ifndef _INCLUDED_EMM
24 #define _INCLUDED_EMM
25
26 #if defined(_M_CEE_PURE)
27              #error ERROR: EMM intrinsics not supported in the pure mode!
28 #else
29
30 /*
31  * the __m128 & __m64 types are required for the intrinsics
32  */
33 #include <crtdefs.h>
34 #include <xmmintrin.h>
35
36 typedef union __declspec(intrin_type) _CRT_ALIGN(16) __m128i {
37       __int8                       m128i_i8[16];
38       __int16                     m128i_i16[8];
39       __int32                     m128i_i32[4];      
40       __int64                     m128i_i64[2];
41       unsigned __int8        m128i_u8[16];
42       unsigned __int16      m128i_u16[8];
43       unsigned __int32      m128i_u32[4];
44       unsigned __int64      m128i_u64[2];
45 } __m128i;
46
47 typedef struct __declspec(intrin_type) _CRT_ALIGN(16) __m128d {
48       double                       m128d_f64[2];
49 } __m128d;
50
51 /*
52  * Macro function for shuffle
53  */
54 #define _MM_SHUFFLE2(x,y) (((x)<<1) | (y))
55
56 /*****************************************************/
57 /*        INTRINSICS FUNCTION PROTOTYPES START HERE        */
58 /*****************************************************/
59
60 #if defined __cplusplus
61 extern "C" { /* Begin "C" */
62   /* Intrinsics use C name-mangling. */
63 #endif /* __cplusplus */
64
65 /*
66  * DP, arithmetic
67  */
68
69 extern __m128d _mm_add_sd(__m128d _A, __m128d _B);
70 extern __m128d _mm_add_pd(__m128d _A, __m128d _B);
71 extern __m128d _mm_sub_sd(__m128d _A, __m128d _B);
72 extern __m128d _mm_sub_pd(__m128d _A, __m128d _B);
73 extern __m128d _mm_mul_sd(__m128d _A, __m128d _B);
74 extern __m128d _mm_mul_pd(__m128d _A, __m128d _B);
75 extern __m128d _mm_sqrt_sd(__m128d _A, __m128d _B);
76 extern __m128d _mm_sqrt_pd(__m128d _A);
77 extern __m128d _mm_div_sd(__m128d _A, __m128d _B);
78 extern __m128d _mm_div_pd(__m128d _A, __m128d _B);
79 extern __m128d _mm_min_sd(__m128d _A, __m128d _B);
80 extern __m128d _mm_min_pd(__m128d _A, __m128d _B);
81 extern __m128d _mm_max_sd(__m128d _A, __m128d _B);
82 extern __m128d _mm_max_pd(__m128d _A, __m128d _B);
83
84 /*
85  * DP, logicals
86  */
87
88 extern __m128d _mm_and_pd(__m128d _A, __m128d _B);
89 extern __m128d _mm_andnot_pd(__m128d _A, __m128d _B);
90 extern __m128d _mm_or_pd(__m128d _A, __m128d _B);
91 extern __m128d _mm_xor_pd(__m128d _A, __m128d _B);
92
93 /*
94  * DP, comparisons
95  */
96
97 extern __m128d _mm_cmpeq_sd(__m128d _A, __m128d _B);
98 extern __m128d _mm_cmpeq_pd(__m128d _A, __m128d _B);
99 extern __m128d _mm_cmplt_sd(__m128d _A, __m128d _B);
100 extern __m128d _mm_cmplt_pd(__m128d _A, __m128d _B);
101 extern __m128d _mm_cmple_sd(__m128d _A, __m128d _B);
102 extern __m128d _mm_cmple_pd(__m128d _A, __m128d _B);
103 extern __m128d _mm_cmpgt_sd(__m128d _A, __m128d _B);
104 extern __m128d _mm_cmpgt_pd(__m128d _A, __m128d _B);
105 extern __m128d _mm_cmpge_sd(__m128d _A, __m128d _B);
106 extern __m128d _mm_cmpge_pd(__m128d _A, __m128d _B);
107 extern __m128d _mm_cmpneq_sd(__m128d _A, __m128d _B);
108 extern __m128d _mm_cmpneq_pd(__m128d _A, __m128d _B);
109 extern __m128d _mm_cmpnlt_sd(__m128d _A, __m128d _B);
110 extern __m128d _mm_cmpnlt_pd(__m128d _A, __m128d _B);
Lines 111 ... 349 are skipped.
350
351 extern void _mm_store_si128(__m128i *_P, __m128i _B);
352 extern void _mm_storeu_si128(__m128i *_P, __m128i _B);
353 extern void _mm_storel_epi64(__m128i *_P, __m128i _Q);
354 extern void _mm_maskmoveu_si128(__m128i _D, __m128i _N, char *_P);
355
356 /*
357  * Integer, moves
358  */
359
360 extern __m128i _mm_move_epi64(__m128i _Q);
361 extern __m128i _mm_movpi64_epi64(__m64 _Q);
362 extern __m64 _mm_movepi64_pi64(__m128i _Q);
363
364 /*
365  * Cacheability support
366  */
367
368 extern void _mm_stream_pd(double *_Dp, __m128d _A);
369 extern void _mm_stream_si128(__m128i *_P, __m128i _A);
370 extern void _mm_clflush(void const*_P);
371 extern void _mm_lfence(void);
372 extern void _mm_mfence(void);
373 extern void _mm_stream_si32(int *_P, int _I);
374 extern void _mm_pause(void);
375
376 /*
377  * New convert to float
378  */
379
380 extern double _mm_cvtsd_f64(__m128d _A);
381
382 /*
383  * Support for casting between various SP, DP, INT vector types.
384  * Note that these do no conversion of values, they just change
385  * the type.
386  */
387
388 extern __m128  _mm_castpd_ps(__m128d);
389 extern __m128i _mm_castpd_si128(__m128d);
390 extern __m128d _mm_castps_pd(__m128);
391 extern __m128i _mm_castps_si128(__m128);
392 extern __m128  _mm_castsi128_ps(__m128i);
393 extern __m128d _mm_castsi128_pd(__m128i);
394
395 /*
396  * Support for 64-bit extension intrinsics
397  */
398
399 #if defined(_M_AMD64)
400 extern __int64 _mm_cvtsd_si64(__m128d);
401 extern __int64 _mm_cvttsd_si64(__m128d);
402 extern __m128d _mm_cvtsi64_sd(__m128d, __int64);
403 extern __m128i _mm_cvtsi64_si128(__int64);
404 extern __int64 _mm_cvtsi128_si64(__m128i);
405 /* Alternate intrinsic name definitions */
406 #define _mm_stream_si64 _mm_stream_si64x
407 #endif
408
409 #if defined __cplusplus
410 }; /* End "C" */
411 #endif /* __cplusplus */
412
413 #endif /* defined(_M_CEE_PURE) */
414
415 #endif
416 #endif
417