1/* { dg-do run } */
2/* { dg-options "-mips3d" } */
3
4/* Test MIPS-3D builtin functions */
5#include <stdlib.h>
6#include <stdio.h>
7
8typedef float v2sf __attribute__ ((vector_size(8)));
9
10NOMIPS16 int main ()
11{
12  int little_endian;
13  v2sf a, b, c, d;
14  float f1, f2, f3, f4, f5, f6;
15  double d1, d2, d3, d4, d5, d6, d7, d8, d9;
16  v2sf ps1, ps2, ps3, ps4, ps5, ps6;
17
18  union { long long ll; int i[2]; } endianness_test;
19  endianness_test.ll = 1;
20  little_endian = endianness_test.i[0];
21
22  /* addr.ps */
23  a = (v2sf) {12, 34};
24  b = (v2sf) {45, 67};
25  c = __builtin_mips_addr_ps (a, b);
26  if (little_endian)
27    d = (v2sf) {112, 46};
28  else
29    d = (v2sf) {46, 112};
30
31  if (!__builtin_mips_all_c_eq_ps(c, d))
32     abort ();
33
34  /* mulr.ps */
35  a = (v2sf) {12, 34};
36  b = (v2sf) {45, 67};
37  c = __builtin_mips_mulr_ps (a, b);
38  if (little_endian)
39    d = (v2sf) {3015, 408};
40  else
41    d = (v2sf) {408, 3015};
42
43  if (!__builtin_mips_all_c_eq_ps(c, d))
44     abort ();
45
46  /* cvt.pw.ps */
47  a = (v2sf) {12345.34, 67890.45};
48  b = __builtin_mips_cvt_pw_ps (a);
49
50  /* cvt.ps.pw */
51  c = __builtin_mips_cvt_ps_pw (b);
52  d = (v2sf) {12345.0, 67890.0};
53
54  if (!__builtin_mips_all_c_eq_ps(c, d))
55     abort ();
56
57  /* recip1.s recip2.s */
58  f1 = 40;
59  f2 = __builtin_mips_recip1_s (f1);
60  f3 = __builtin_mips_recip2_s (f2, f1);
61  f4 = f2 + f2 * f3;
62  f5 = 0.025;
63
64  if (f4 != f5)
65    abort ();
66
67  /* recip1.d recip2.d */
68  d1 = 80;
69  d2 = __builtin_mips_recip1_d (d1);
70  d3 = __builtin_mips_recip2_d (d2, d1);
71  d4 = d2 + d2 * d3;
72  d5 = __builtin_mips_recip2_d (d4, d1);
73  d6 = d4 + d4 * d5;
74  d7 = 0.0125;
75
76  if (d6 != d7)
77    abort ();
78
79  /* recip1.ps recip2.ps */
80  ps1 = (v2sf) {100, 200};
81  ps2 = __builtin_mips_recip1_ps (ps1);
82  ps3 = __builtin_mips_recip2_ps (ps2, ps1);
83  ps4 = ps2 + ps2 * ps3;
84  ps5 = (v2sf) {0.01, 0.005};
85
86  if (!__builtin_mips_all_c_eq_ps(ps4, ps5))
87    abort ();
88
89  /* rsqrt1.s rsqrt2.s */
90  f1 = 400;
91  f2 = __builtin_mips_rsqrt1_s (f1);
92  f3 = f2 * f1;
93  f4 = __builtin_mips_rsqrt2_s (f3, f2);
94  f5 = f2 + f2 * f4;
95  f6 = 0.05;
96
97  if (f5 != f6)
98    abort ();
99
100  /* rsqrt1.d rsqrt2.d */
101  d1 = 1600;
102  d2 = __builtin_mips_rsqrt1_d (d1);
103  d3 = d2 * d1;
104  d4 = __builtin_mips_rsqrt2_d (d3, d2);
105  d5 = d2 + d2 * d4;
106  d6 = d1 * d5;
107  d7 = __builtin_mips_rsqrt2_d (d6, d5);
108  d8 = d5 + d5 * d7;
109  d9 = 0.025;
110
111  if (d8 != d9)
112    abort ();
113
114  /* rsqrt1.ps rsqrt2.ps */
115  ps1 = (v2sf) {400, 100};
116  ps2 = __builtin_mips_rsqrt1_ps (ps1);
117  ps3 = ps2 * ps1;
118  ps4 = __builtin_mips_rsqrt2_ps (ps3, ps2);
119  ps5 = ps2 + ps2 * ps4;
120  ps6 = (v2sf) {0.05, 0.1};
121
122  if (!__builtin_mips_all_c_eq_ps(ps5, ps6))
123     abort ();
124
125  printf ("Test Passes\n");
126  exit (0);
127}
128