1 /* { dg-do run } */
2 /* { dg-require-effective-target xop } */
3 /* { dg-options "-O2 -mxop" } */
4
5 #include "xop-check.h"
6
7 #include <x86intrin.h>
8
9 void
check_mm_vmfrcz_sd(__m128d __A,__m128d __B)10 check_mm_vmfrcz_sd (__m128d __A, __m128d __B)
11 {
12 union128d a, b, c;
13 double d[2];
14
15 a.x = __A;
16 b.x = __B;
17 c.x = _mm_frcz_sd (__A, __B);
18 d[0] = b.a[0] - (int)b.a[0] ;
19 d[1] = a.a[1];
20 if (check_union128d (c, d))
21 abort ();
22 }
23
24 void
check_mm_vmfrcz_ss(__m128 __A,__m128 __B)25 check_mm_vmfrcz_ss (__m128 __A, __m128 __B)
26 {
27 union128 a, b, c;
28 float f[4];
29
30 a.x = __A;
31 b.x = __B;
32 c.x = _mm_frcz_ss (__A, __B);
33 f[0] = b.a[0] - (int)b.a[0] ;
34 f[1] = a.a[1];
35 f[2] = a.a[2];
36 f[3] = a.a[3];
37 if (check_union128 (c, f))
38 abort ();
39 }
40
41 static void
xop_test(void)42 xop_test (void)
43 {
44 union128 a, b;
45 union128d c,d;
46 int i;
47
48 for (i = 0; i < 4; i++)
49 {
50 a.a[i] = i + 3.5;
51 b.a[i] = i + 7.9;
52 }
53 for (i = 0; i < 2; i++)
54 {
55 c.a[i] = i + 3.5;
56 d.a[i] = i + 7.987654321;
57 }
58 check_mm_vmfrcz_ss (a.x, b.x);
59 check_mm_vmfrcz_sd (c.x, d.x);
60 }
61