Skip to content

Commit 36d4e2d

Browse files
committed
Provide implementations of __builtin_ia32_vec_ext_*
These built-ins extract an element of a vector. Fixes: #5903
1 parent 036c265 commit 36d4e2d

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed

regression/cbmc/SIMD1/main.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include <assert.h>
2+
#ifdef _MSC_VER
3+
# include <intrin.h>
4+
#else
5+
# include <immintrin.h>
6+
#endif
7+
8+
int main()
9+
{
10+
__m128i values = _mm_setr_epi32(0x1234, 0x2345, 0x3456, 0x4567);
11+
int val1 = _mm_extract_epi32(values, 0);
12+
assert(val1 == 0x1234);
13+
return 0;
14+
}

regression/cbmc/SIMD1/test.desc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE gcc-only broken-smt-backend
2+
main.c
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^VERIFICATION SUCCESSFUL$
7+
--
8+
^warning: ignoring

src/ansi-c/library/gcc.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,39 @@ __CPROVER_HIDE:;
191191
(void)ptr;
192192
return size <= sizeof(__CPROVER_size_t);
193193
}
194+
195+
/* FUNCTION: __builtin_ia32_vec_ext_v4si */
196+
197+
typedef int __gcc_v4si __attribute__((__vector_size__(16)));
198+
199+
int __builtin_ia32_vec_ext_v4si(__gcc_v4si vec, int offset)
200+
{
201+
return *((int *)&vec + offset);
202+
}
203+
204+
/* FUNCTION: __builtin_ia32_vec_ext_v2di */
205+
206+
typedef long long __gcc_v2di __attribute__((__vector_size__(16)));
207+
208+
long long __builtin_ia32_vec_ext_v2di(__gcc_v2di vec, int offset)
209+
{
210+
return *((long long *)&vec + offset);
211+
}
212+
213+
/* FUNCTION: __builtin_ia32_vec_ext_v16qi */
214+
215+
typedef char __gcc_v16qi __attribute__((__vector_size__(16)));
216+
217+
int __builtin_ia32_vec_ext_v16qi(__gcc_v16qi vec, int offset)
218+
{
219+
return *((char *)&vec + offset);
220+
}
221+
222+
/* FUNCTION: __builtin_ia32_vec_ext_v4sf */
223+
224+
typedef float __gcc_v4sf __attribute__((__vector_size__(16)));
225+
226+
float __builtin_ia32_vec_ext_v4sf(__gcc_v4sf vec, int offset)
227+
{
228+
return *((float *)&vec + offset);
229+
}

0 commit comments

Comments
 (0)