Skip to content

Commit cce048b

Browse files
committed
Provide implementations of __builtin_ia32_vec_ext_*
These built-ins extract an element of a vector. Fixes: #5903
1 parent 63c6557 commit cce048b

File tree

4 files changed

+100
-0
lines changed

4 files changed

+100
-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 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+
}

src/ansi-c/library/intrin.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,3 +342,45 @@ inline char _InterlockedCompareExchange8(char volatile *p, char v1, char v2)
342342
__CPROVER_atomic_end();
343343
return old;
344344
}
345+
346+
/* FUNCTION: _mm_set_epi32 */
347+
348+
#ifdef _MSC_VER
349+
# ifndef __CPROVER_INTRIN_H_INCLUDED
350+
# include <intrin.h>
351+
# define __CPROVER_INTRIN_H_INCLUDED
352+
# endif
353+
354+
inline __m128i _mm_set_epi32(int e3, int e2, int e1, int e0)
355+
{
356+
return (__m128i){.m128i_i32 = {e0, e1, e2, e3}};
357+
}
358+
#endif
359+
360+
/* FUNCTION: _mm_setr_epi32 */
361+
362+
#ifdef _MSC_VER
363+
# ifndef __CPROVER_INTRIN_H_INCLUDED
364+
# include <intrin.h>
365+
# define __CPROVER_INTRIN_H_INCLUDED
366+
# endif
367+
368+
inline __m128i _mm_setr_epi32(int e3, int e2, int e1, int e0)
369+
{
370+
return (__m128i){.m128i_i32 = {e3, e2, e1, e0}};
371+
}
372+
#endif
373+
374+
/* FUNCTION: _mm_extract_epi32 */
375+
376+
#ifdef _MSC_VER
377+
# ifndef __CPROVER_INTRIN_H_INCLUDED
378+
# include <intrin.h>
379+
# define __CPROVER_INTRIN_H_INCLUDED
380+
# endif
381+
382+
inline int _mm_extract_epi32(__m128i a, const int imm8)
383+
{
384+
return a.m128i_i32[imm8];
385+
}
386+
#endif

0 commit comments

Comments
 (0)