111
|
1 /* Tests for _FloatN / _FloatNx types: compile and execution tests for
|
|
2 valid code with complex arithmetic. Before including this file,
|
|
3 define WIDTH as the value N; define EXT to 1 for _FloatNx and 0 for
|
|
4 _FloatN. */
|
|
5
|
|
6 #define CONCATX(X, Y) X ## Y
|
|
7 #define CONCAT(X, Y) CONCATX (X, Y)
|
|
8 #define CONCAT3(X, Y, Z) CONCAT (CONCAT (X, Y), Z)
|
|
9 #define CONCAT4(W, X, Y, Z) CONCAT (CONCAT (CONCAT (W, X), Y), Z)
|
|
10
|
|
11 #if EXT
|
|
12 # define TYPE CONCAT3 (_Float, WIDTH, x)
|
|
13 # define CST(C) CONCAT4 (C, f, WIDTH, x)
|
|
14 # define CSTI(C) CONCAT4 (C, if, WIDTH, x)
|
|
15 # define CSTI2(C) CONCAT4 (C, F, WIDTH, xi)
|
|
16 #else
|
|
17 # define TYPE CONCAT (_Float, WIDTH)
|
|
18 # define CST(C) CONCAT3 (C, f, WIDTH)
|
|
19 # define CSTI(C) CONCAT3 (C, if, WIDTH)
|
|
20 # define CSTI2(C) CONCAT4 (C, F, WIDTH, i)
|
|
21 #endif
|
|
22
|
|
23 extern void exit (int);
|
|
24 extern void abort (void);
|
|
25
|
|
26 volatile TYPE a = CST (1.0);
|
|
27 volatile _Complex TYPE b = CST (2.0) + CSTI (3.0);
|
|
28 volatile _Complex TYPE c = CST (2.0) + CSTI2 (3.0);
|
|
29 volatile _Complex TYPE d = __builtin_complex (CST (2.0), CST (3.0));
|
|
30
|
|
31 _Complex TYPE
|
|
32 fn (_Complex TYPE arg)
|
|
33 {
|
|
34 return arg / 4;
|
|
35 }
|
|
36
|
|
37 int
|
|
38 main (void)
|
|
39 {
|
|
40 volatile _Complex TYPE r;
|
|
41 if (b != c)
|
|
42 abort ();
|
|
43 if (b != d)
|
|
44 abort ();
|
|
45 r = a + b;
|
|
46 if (__real__ r != CST (3.0) || __imag__ r != CST (3.0))
|
|
47 abort ();
|
|
48 r += d;
|
|
49 if (__real__ r != CST (5.0) || __imag__ r != CST (6.0))
|
|
50 abort ();
|
|
51 r -= a;
|
|
52 if (__real__ r != CST (4.0) || __imag__ r != CST (6.0))
|
|
53 abort ();
|
|
54 r /= (a + a);
|
|
55 if (__real__ r != CST (2.0) || __imag__ r != CST (3.0))
|
|
56 abort ();
|
|
57 r *= (a + a);
|
|
58 if (__real__ r != CST (4.0) || __imag__ r != CST (6.0))
|
|
59 abort ();
|
|
60 r -= b;
|
|
61 if (__real__ r != CST (2.0) || __imag__ r != CST (3.0))
|
|
62 abort ();
|
|
63 r *= r;
|
|
64 if (__real__ r != -CST (5.0) || __imag__ r != CST (12.0))
|
|
65 abort ();
|
|
66 /* Division may not be exact, so round result before comparing. */
|
|
67 r /= b;
|
|
68 r += __builtin_complex (CST (100.0), CST (100.0));
|
|
69 r -= __builtin_complex (CST (100.0), CST (100.0));
|
|
70 if (r != b)
|
|
71 abort ();
|
|
72 r = fn (r);
|
|
73 if (__real__ r != CST (0.5) || __imag__ r != CST (0.75))
|
|
74 abort ();
|
|
75 exit (0);
|
|
76 }
|