Skip to content

Commit 7e2f0a5

Browse files
authored
Merge pull request #5919 from tautschnig/fix-5903
Provide implementations of __builtin_ia32_vec_ext_*
2 parents f03779a + cce048b commit 7e2f0a5

File tree

8 files changed

+176
-2
lines changed

8 files changed

+176
-2
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/clang_builtin_headers.h

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,53 @@ __gcc_v2di __builtin_ia32_undef128(void);
22
__gcc_v4di __builtin_ia32_undef256(void);
33
__gcc_v8di __builtin_ia32_undef512(void);
44

5+
// clang-format off
6+
__gcc_v8hi __builtin_ia32_cvtne2ps2bf16_128(__gcc_v4sf, __gcc_v4sf);
7+
__gcc_v16hi __builtin_ia32_cvtne2ps2bf16_256(__gcc_v8sf, __gcc_v8sf);
8+
__gcc_v32hi __builtin_ia32_cvtne2ps2bf16_512(__gcc_v16sf, __gcc_v16sf);
9+
__gcc_v8hi __builtin_ia32_cvtneps2bf16_128_mask(__gcc_v4sf, __gcc_v8hi, unsigned char);
10+
__gcc_v8hi __builtin_ia32_cvtneps2bf16_256_mask(__gcc_v8sf, __gcc_v8hi, unsigned char);
11+
__gcc_v16si __builtin_ia32_cvtneps2bf16_512_mask(__gcc_v16sf, __gcc_v16hi, unsigned short);
12+
__gcc_v4sf __builtin_ia32_dpbf16ps_128(__gcc_v4sf, __gcc_v4si, __gcc_v4si);
13+
__gcc_v8sf __builtin_ia32_dpbf16ps_256(__gcc_v8sf, __gcc_v8si, __gcc_v8si);
14+
__gcc_v16sf __builtin_ia32_dpbf16ps_512(__gcc_v16sf, __gcc_v16si, __gcc_v16si);
15+
float __builtin_ia32_cvtsbf162ss_32(unsigned short);
16+
17+
void __builtin_ia32_vp2intersect_d_512(__gcc_v16si, __gcc_v16si, unsigned short *, unsigned short *);
18+
void __builtin_ia32_vp2intersect_d_256(__gcc_v8si, __gcc_v8si, unsigned char *, unsigned char *);
19+
void __builtin_ia32_vp2intersect_d_128(__gcc_v4si, __gcc_v4si, unsigned char *, unsigned char *);
20+
21+
__gcc_v16qi __builtin_ia32_selectb_128(unsigned short, __gcc_v16qi, __gcc_v16qi);
22+
__gcc_v32qi __builtin_ia32_selectb_256(unsigned int, __gcc_v32qi, __gcc_v32qi);
23+
__gcc_v64qi __builtin_ia32_selectb_512(unsigned long, __gcc_v64qi, __gcc_v64qi);
24+
__gcc_v8hi __builtin_ia32_selectw_128(unsigned char, __gcc_v8hi, __gcc_v8hi);
25+
__gcc_v16hi __builtin_ia32_selectw_256(unsigned short, __gcc_v16hi, __gcc_v16hi);
26+
__gcc_v32hi __builtin_ia32_selectw_512(unsigned int, __gcc_v32hi, __gcc_v32hi);
27+
__gcc_v4si __builtin_ia32_selectd_128(unsigned char, __gcc_v4si, __gcc_v4si);
28+
__gcc_v8si __builtin_ia32_selectd_256(unsigned char, __gcc_v8si, __gcc_v8si);
29+
__gcc_v16si __builtin_ia32_selectd_512(unsigned short, __gcc_v16si, __gcc_v16si);
30+
__gcc_v4sf __builtin_ia32_selectps_128(unsigned char, __gcc_v4sf, __gcc_v4sf);
31+
__gcc_v8sf __builtin_ia32_selectps_256(unsigned char, __gcc_v8sf, __gcc_v8sf);
32+
__gcc_v16sf __builtin_ia32_selectps_512(unsigned short, __gcc_v16sf, __gcc_v16sf);
33+
__gcc_v2df __builtin_ia32_selectpd_128(unsigned char, __gcc_v2df, __gcc_v2df);
34+
__gcc_v4df __builtin_ia32_selectpd_256(unsigned char, __gcc_v4df, __gcc_v4df);
35+
__gcc_v8df __builtin_ia32_selectpd_512(unsigned char, __gcc_v8df, __gcc_v8df);
36+
__gcc_v4sf __builtin_ia32_selectss_128(unsigned char, __gcc_v4sf, __gcc_v4sf);
37+
__gcc_v2df __builtin_ia32_selectsd_128(unsigned char, __gcc_v2df, __gcc_v2df);
38+
39+
__gcc_v4sf __builtin_ia32_vfmaddss3_mask(__gcc_v4sf, __gcc_v4sf, __gcc_v4sf, unsigned char, int);
40+
__gcc_v4sf __builtin_ia32_vfmaddss3_maskz(__gcc_v4sf, __gcc_v4sf, __gcc_v4sf, unsigned char, int);
41+
__gcc_v4sf __builtin_ia32_vfmaddss3_mask3(__gcc_v4sf, __gcc_v4sf, __gcc_v4sf, unsigned char, int);
42+
__gcc_v2df __builtin_ia32_vfmaddsd3_mask(__gcc_v2df, __gcc_v2df, __gcc_v2df, unsigned char, int);
43+
__gcc_v2df __builtin_ia32_vfmaddsd3_maskz(__gcc_v2df, __gcc_v2df, __gcc_v2df, unsigned char, int);
44+
__gcc_v2df __builtin_ia32_vfmaddsd3_mask3(__gcc_v2df, __gcc_v2df, __gcc_v2df, unsigned char, int);
45+
__gcc_v2df __builtin_ia32_vfmsubsd3_mask3(__gcc_v2df, __gcc_v2df, __gcc_v2df, unsigned char, int);
46+
__gcc_v4sf __builtin_ia32_vfmsubss3_mask3(__gcc_v4sf, __gcc_v4sf, __gcc_v4sf, unsigned char, int);
47+
48+
__gcc_v4sf __builtin_ia32_cvtsd2ss_round_mask(__gcc_v4sf, __gcc_v2df, __gcc_v4sf, unsigned char, int);
49+
__gcc_v2df __builtin_ia32_cvtss2sd_round_mask(__gcc_v2df, __gcc_v4sf, __gcc_v2df, unsigned char, int);
50+
// clang-format on
51+
552
void __builtin_nontemporal_store();
653
void __builtin_nontemporal_load();
754

src/ansi-c/gcc_builtin_headers_ia32-2.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,8 @@ __gcc_v8di __builtin_ia32_pternlogq512_mask(__gcc_v8di, __gcc_v8di, __gcc_v8di,
377377
__gcc_v8di __builtin_ia32_pternlogq512_maskz(__gcc_v8di, __gcc_v8di, __gcc_v8di, int, unsigned char);
378378
__gcc_v16sf __builtin_ia32_copysignps512(__gcc_v16sf, __gcc_v16sf);
379379
__gcc_v8df __builtin_ia32_copysignpd512(__gcc_v8df, __gcc_v8df);
380-
__gcc_v8df __builtin_ia32_sqrtpd512(__gcc_v8df);
381-
__gcc_v16sf __builtin_ia32_sqrtps512(__gcc_v16sf);
380+
__gcc_v8df __builtin_ia32_sqrtpd512(__gcc_v8df, ...);
381+
__gcc_v16sf __builtin_ia32_sqrtps512(__gcc_v16sf, ...);
382382
__gcc_v16sf __builtin_ia32_exp2ps(__gcc_v16sf);
383383
__gcc_v16si __builtin_ia32_roundpd_az_vec_pack_sfix512(__gcc_v8df, __gcc_v8df);
384384
__gcc_v16si __builtin_ia32_floorpd_vec_pack_sfix512(__gcc_v8df, __gcc_v8df, const int);

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

src/goto-programs/goto_program.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,13 @@ void goto_programt::instructiont::transform(
974974
change = true;
975975
}
976976

977+
auto new_function = f(new_call.function());
978+
if(new_function.has_value())
979+
{
980+
new_call.function() = *new_function;
981+
change = true;
982+
}
983+
977984
for(auto &a : new_call.arguments())
978985
{
979986
auto new_a = f(a);

src/goto-programs/remove_vector.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,18 @@ static bool have_to_remove_vector(const typet &type)
6464
if(have_to_remove_vector(c.type()))
6565
return true;
6666
}
67+
else if(type.id() == ID_code)
68+
{
69+
const code_typet &code_type = to_code_type(type);
70+
71+
if(have_to_remove_vector(code_type.return_type()))
72+
return true;
73+
for(auto &parameter : code_type.parameters())
74+
{
75+
if(have_to_remove_vector(parameter.type()))
76+
return true;
77+
}
78+
}
6779
else if(type.id()==ID_pointer ||
6880
type.id()==ID_complex ||
6981
type.id()==ID_array)
@@ -256,6 +268,14 @@ static void remove_vector(typet &type)
256268
remove_vector(it->type());
257269
}
258270
}
271+
else if(type.id() == ID_code)
272+
{
273+
code_typet &code_type = to_code_type(type);
274+
275+
remove_vector(code_type.return_type());
276+
for(auto &parameter : code_type.parameters())
277+
remove_vector(parameter.type());
278+
}
259279
else if(type.id()==ID_pointer ||
260280
type.id()==ID_complex ||
261281
type.id()==ID_array)

0 commit comments

Comments
 (0)