1 /* { dg-do run } */
2 /* { dg-options "-O2 -fno-strict-aliasing -msse2" } */
3 /* { dg-additional-options "-mno-mmx" { target { ! ia32 } } } */
4 
5 #include <string.h>
6 #include "sse2-check.h"
7 
8 __attribute__((noinline, noclone))
9 static void
test_cvtpi32_ps(__m128 * i1,__m64 * i2,__m128 * r)10 test_cvtpi32_ps (__m128 *i1, __m64 *i2, __m128 *r)
11 {
12   *(__m128 *) r = _mm_cvtpi32_ps (*i1, *i2);
13 }
14 
15 /* Routine to manually compute the results */
16 static void
compute_correct_result(__m128 * dst_p,__m64 * src_p,__m128 * res_p)17 compute_correct_result (__m128 *dst_p, __m64 *src_p, __m128 *res_p)
18 {
19   int *src = (int *) src_p;
20   float *res = (float *) res_p;
21   *res_p = *dst_p;
22   int i;
23   __m128 r;
24   for (i = 0; i < 2; i++)
25     {
26       r = _mm_cvt_si2ss (*dst_p, src[i]);
27       res[i] = ((__v4sf) r)[0];
28     }
29 }
30 
31 static void
sse2_test(void)32 sse2_test (void)
33 {
34   __m128 r, ck;
35   __v4sf x = { 1.99f, -3.9f, -4.9f, 3.8f };
36   __v2si y = { 30, -39 };
37 
38   /* Run the MMX tests */
39   test_cvtpi32_ps ((__m128 *) &x, (__m64 *) &y, &r);
40   compute_correct_result ((__m128 *) &x, (__m64 *) &y, &ck);
41   if (memcmp (&ck, &r, sizeof (r)))
42     abort ();
43 }
44