1 /* SPDX-License-Identifier: MIT
2  *
3  * Permission is hereby granted, free of charge, to any person
4  * obtaining a copy of this software and associated documentation
5  * files (the "Software"), to deal in the Software without
6  * restriction, including without limitation the rights to use, copy,
7  * modify, merge, publish, distribute, sublicense, and/or sell copies
8  * of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be
12  * included in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
18  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  *
23  * Copyright:
24  *   2020      Evan Nemerson <evan@nemerson.com>
25  *   2020      Christopher Moore <moore@free.fr>
26  */
27 
28 #if !defined(SIMDE_X86_AVX512_EXTRACT_H)
29 #define SIMDE_X86_AVX512_EXTRACT_H
30 
31 #include "types.h"
32 #include "mov.h"
33 
34 HEDLEY_DIAGNOSTIC_PUSH
35 SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
36 SIMDE_BEGIN_DECLS_
37 
38 SIMDE_FUNCTION_ATTRIBUTES
39 simde__m128
simde_mm512_extractf32x4_ps(simde__m512 a,int imm8)40 simde_mm512_extractf32x4_ps (simde__m512 a, int imm8)
41     SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
42   simde__m512_private a_ = simde__m512_to_private(a);
43 
44   /* GCC 6 generates an ICE */
45   #if defined(HEDLEY_GCC_VERSION) && !HEDLEY_GCC_VERSION_CHECK(7,0,0)
46     return a_.m128[imm8 & 3];
47   #else
48     simde__m128_private r_;
49     const size_t offset = HEDLEY_STATIC_CAST(size_t, imm8 & 3) * (sizeof(r_.f32) / sizeof(r_.f32[0]));
50 
51     SIMDE_VECTORIZE
52     for (size_t i = 0 ; i < (sizeof(r_.f32) / sizeof(r_.f32[0])) ; i++) {
53       r_.f32[i] = a_.f32[i + offset];
54     }
55 
56     return simde__m128_from_private(r_);
57   #endif
58 }
59 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
60   #define simde_mm512_extractf32x4_ps(a, imm8) _mm512_extractf32x4_ps(a, imm8)
61 #endif
62 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
63   #undef _mm512_extractf32x4_ps
64   #define _mm512_extractf32x4_ps(a, imm8) simde_mm512_extractf32x4_ps(a, imm8)
65 #endif
66 
67 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
68   #define simde_mm512_mask_extractf32x4_ps(src, k, a, imm8) _mm512_mask_extractf32x4_ps(src, k, a, imm8)
69 #else
70   #define simde_mm512_mask_extractf32x4_ps(src, k, a, imm8) simde_mm_mask_mov_ps(src, k, simde_mm512_extractf32x4_ps(a, imm8))
71 #endif
72 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
73   #undef _mm512_mask_extractf32x4_ps
74   #define _mm512_mask_extractf32x4_ps(src, k, a, imm8) simde_mm512_mask_extractf32x4_ps(src, k, a, imm8)
75 #endif
76 
77 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
78   #define simde_mm512_maskz_extractf32x4_ps(k, a, imm8) _mm512_maskz_extractf32x4_ps(k, a, imm8)
79 #else
80   #define simde_mm512_maskz_extractf32x4_ps(k, a, imm8) simde_mm_maskz_mov_ps(k, simde_mm512_extractf32x4_ps(a, imm8))
81 #endif
82 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
83   #undef _mm512_maskz_extractf32x4_ps
84   #define _mm512_maskz_extractf32x4_ps(k, a, imm8) simde_mm512_maskz_extractf32x4_ps(k, a, imm8)
85 #endif
86 
87 SIMDE_FUNCTION_ATTRIBUTES
88 simde__m256d
simde_mm512_extractf64x4_pd(simde__m512d a,int imm8)89 simde_mm512_extractf64x4_pd (simde__m512d a, int imm8)
90     SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
91   simde__m512d_private a_ = simde__m512d_to_private(a);
92 
93   return a_.m256d[imm8 & 1];
94 }
95 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
96   #define simde_mm512_extractf64x4_pd(a, imm8) _mm512_extractf64x4_pd(a, imm8)
97 #endif
98 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
99   #undef _mm512_extractf64x4_pd
100   #define _mm512_extractf64x4_pd(a, imm8) simde_mm512_extractf64x4_pd(a, imm8)
101 #endif
102 
103 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
104   #define simde_mm512_mask_extractf64x4_pd(src, k, a, imm8) _mm512_mask_extractf64x4_pd(src, k, a, imm8)
105 #else
106   #define simde_mm512_mask_extractf64x4_pd(src, k, a, imm8) simde_mm256_mask_mov_pd(src, k, simde_mm512_extractf64x4_pd(a, imm8))
107 #endif
108 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
109   #undef _mm512_mask_extractf64x4_pd
110   #define _mm512_mask_extractf64x4_pd(src, k, a, imm8) simde_mm512_mask_extractf64x4_pd(src, k, a, imm8)
111 #endif
112 
113 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0))
114   #define simde_mm512_maskz_extractf64x4_pd(k, a, imm8) _mm512_maskz_extractf64x4_pd(k, a, imm8)
115 #else
116   #define simde_mm512_maskz_extractf64x4_pd(k, a, imm8) simde_mm256_maskz_mov_pd(k, simde_mm512_extractf64x4_pd(a, imm8))
117 #endif
118 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
119   #undef _mm512_maskz_extractf64x4_pd
120   #define _mm512_maskz_extractf64x4_pd(k, a, imm8) simde_mm512_maskz_extractf64x4_pd(k, a, imm8)
121 #endif
122 
123 SIMDE_FUNCTION_ATTRIBUTES
124 simde__m128i
simde_mm512_extracti32x4_epi32(simde__m512i a,int imm8)125 simde_mm512_extracti32x4_epi32 (simde__m512i a, int imm8)
126     SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 3) {
127   simde__m512i_private a_ = simde__m512i_to_private(a);
128 
129   return a_.m128i[imm8 & 3];
130 }
131 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
132   #define simde_mm512_extracti32x4_epi32(a, imm8) _mm512_extracti32x4_epi32(a, imm8)
133 #endif
134 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
135   #undef _mm512_extracti32x4_epi32
136   #define _mm512_extracti32x4_epi32(a, imm8) simde_mm512_extracti32x4_epi32(a, imm8)
137 #endif
138 
139 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
140   #define simde_mm512_mask_extracti32x4_epi32(src, k, a, imm8) _mm512_mask_extracti32x4_epi32(src, k, a, imm8)
141 #else
142   #define simde_mm512_mask_extracti32x4_epi32(src, k, a, imm8) simde_mm_mask_mov_epi32(src, k, simde_mm512_extracti32x4_epi32(a, imm8))
143 #endif
144 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
145   #undef _mm512_mask_extracti32x4_epi32
146   #define _mm512_mask_extracti32x4_epi32(src, k, a, imm8) simde_mm512_mask_extracti32x4_epi32(src, k, a, imm8)
147 #endif
148 
149 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
150   #define simde_mm512_maskz_extracti32x4_epi32(k, a, imm8) _mm512_maskz_extracti32x4_epi32(k, a, imm8)
151 #else
152   #define simde_mm512_maskz_extracti32x4_epi32(k, a, imm8) simde_mm_maskz_mov_epi32(k, simde_mm512_extracti32x4_epi32(a, imm8))
153 #endif
154 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
155   #undef _mm512_maskz_extracti32x4_epi32
156   #define _mm512_maskz_extracti32x4_epi32(k, a, imm8) simde_mm512_maskz_extracti32x4_epi32(k, a, imm8)
157 #endif
158 
159 SIMDE_FUNCTION_ATTRIBUTES
160 simde__m256i
simde_mm512_extracti64x4_epi64(simde__m512i a,int imm8)161 simde_mm512_extracti64x4_epi64 (simde__m512i a, int imm8)
162     SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
163   simde__m512i_private a_ = simde__m512i_to_private(a);
164 
165   return a_.m256i[imm8 & 1];
166 }
167 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
168   #define simde_mm512_extracti64x4_epi64(a, imm8) _mm512_extracti64x4_epi64(a, imm8)
169 #endif
170 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
171   #undef _mm512_extracti64x4_epi64
172   #define _mm512_extracti64x4_epi64(a, imm8) simde_mm512_extracti64x4_epi64(a, imm8)
173 #endif
174 
175 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
176   #define simde_mm512_mask_extracti64x4_epi64(src, k, a, imm8) _mm512_mask_extracti64x4_epi64(src, k, a, imm8)
177 #else
178   #define simde_mm512_mask_extracti64x4_epi64(src, k, a, imm8) simde_mm256_mask_mov_epi64(src, k, simde_mm512_extracti64x4_epi64(a, imm8))
179 #endif
180 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
181   #undef _mm512_mask_extracti64x4_epi64
182   #define _mm512_mask_extracti64x4_epi64(src, k, a, imm8) simde_mm512_mask_extracti64x4_epi64(src, k, a, imm8)
183 #endif
184 
185 #if defined(SIMDE_X86_AVX512F_NATIVE) && (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(7,0,0)) && !defined(SIMDE_BUG_CLANG_REV_299346)
186   #define simde_mm512_maskz_extracti64x4_epi64(k, a, imm8) _mm512_maskz_extracti64x4_epi64(k, a, imm8)
187 #else
188   #define simde_mm512_maskz_extracti64x4_epi64(k, a, imm8) simde_mm256_maskz_mov_epi64(k, simde_mm512_extracti64x4_epi64(a, imm8))
189 #endif
190 #if defined(SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES)
191   #undef _mm512_maskz_extracti64x4_epi64
192   #define _mm512_maskz_extracti64x4_epi64(k, a, imm8) simde_mm512_maskz_extracti64x4_epi64(k, a, imm8)
193 #endif
194 
195 SIMDE_END_DECLS_
196 HEDLEY_DIAGNOSTIC_POP
197 
198 #endif /* !defined(SIMDE_X86_AVX512_EXTRACT_H) */
199