]>
git.proxmox.com Git - rustc.git/blob - src/compiler-rt/test/builtins/Unit/divsc3_test.c
1 //===-- divsc3_test.c - Test __divsc3 -------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file tests __divsc3 for the compiler_rt library.
12 //===----------------------------------------------------------------------===//
19 // Returns: the quotient of (a + ib) / (c + id)
21 COMPILER_RT_ABI
float _Complex
22 __divsc3(float __a
, float __b
, float __c
, float __d
);
24 enum {zero
, non_zero
, inf
, NaN
, non_zero_nan
};
27 classify(float _Complex x
)
31 if (isinf(crealf(x
)) || isinf(cimagf(x
)))
33 if (isnan(crealf(x
)) && isnan(cimagf(x
)))
50 int test__divsc3(float a
, float b
, float c
, float d
)
52 float _Complex r
= __divsc3(a
, b
, c
, d
);
53 // printf("test__divsc3(%f, %f, %f, %f) = %f + I%f\n",
54 // a, b, c, d, crealf(r), cimagf(r));
55 float _Complex dividend
;
56 float _Complex divisor
;
58 __real__ dividend
= a
;
59 __imag__ dividend
= b
;
63 switch (classify(dividend
))
66 switch (classify(divisor
))
69 if (classify(r
) != NaN
)
73 if (classify(r
) != zero
)
77 if (classify(r
) != zero
)
81 if (classify(r
) != NaN
)
85 if (classify(r
) != NaN
)
91 switch (classify(divisor
))
94 if (classify(r
) != inf
)
98 if (classify(r
) != non_zero
)
101 float _Complex z
= (a
* c
+ b
* d
) / (c
* c
+ d
* d
)
102 + (b
* c
- a
* d
) / (c
* c
+ d
* d
) * _Complex_I
;
108 if (classify(r
) != zero
)
112 if (classify(r
) != NaN
)
116 if (classify(r
) != NaN
)
122 switch (classify(divisor
))
125 if (classify(r
) != inf
)
129 if (classify(r
) != inf
)
133 if (classify(r
) != NaN
)
137 if (classify(r
) != NaN
)
141 if (classify(r
) != NaN
)
147 switch (classify(divisor
))
150 if (classify(r
) != NaN
)
154 if (classify(r
) != NaN
)
158 if (classify(r
) != NaN
)
162 if (classify(r
) != NaN
)
166 if (classify(r
) != NaN
)
172 switch (classify(divisor
))
175 if (classify(r
) != inf
)
179 if (classify(r
) != NaN
)
183 if (classify(r
) != NaN
)
187 if (classify(r
) != NaN
)
191 if (classify(r
) != NaN
)
236 {-INFINITY
, -INFINITY
},
245 {INFINITY
, -INFINITY
},
344 {-INFINITY
, INFINITY
},
359 const unsigned N
= sizeof(x
) / sizeof(x
[0]);
361 for (i
= 0; i
< N
; ++i
)
363 for (j
= 0; j
< N
; ++j
)
365 if (test__divsc3(x
[i
][0], x
[i
][1], x
[j
][0], x
[j
][1]))