1 1.1 joerg //===-- muldc3_test.c - Test __muldc3 -------------------------------------===// 2 1.1 joerg // 3 1.1 joerg // The LLVM Compiler Infrastructure 4 1.1 joerg // 5 1.1 joerg // This file is dual licensed under the MIT and the University of Illinois Open 6 1.1 joerg // Source Licenses. See LICENSE.TXT for details. 7 1.1 joerg // 8 1.1 joerg //===----------------------------------------------------------------------===// 9 1.1 joerg // 10 1.1 joerg // This file tests __muldc3 for the compiler_rt library. 11 1.1 joerg // 12 1.1 joerg //===----------------------------------------------------------------------===// 13 1.1 joerg 14 1.1 joerg #include "int_lib.h" 15 1.1 joerg #include <math.h> 16 1.1 joerg #include <complex.h> 17 1.1 joerg #include <stdio.h> 18 1.1 joerg 19 1.1 joerg // Returns: the product of a + ib and c + id 20 1.1 joerg 21 1.1 joerg double _Complex __muldc3(double __a, double __b, double __c, double __d); 22 1.1 joerg 23 1.1 joerg enum {zero, non_zero, inf, NaN, non_zero_nan}; 24 1.1 joerg 25 1.1 joerg int 26 1.1 joerg classify(double _Complex x) 27 1.1 joerg { 28 1.1 joerg if (x == 0) 29 1.1 joerg return zero; 30 1.1 joerg if (isinf(creal(x)) || isinf(cimag(x))) 31 1.1 joerg return inf; 32 1.1 joerg if (isnan(creal(x)) && isnan(cimag(x))) 33 1.1 joerg return NaN; 34 1.1 joerg if (isnan(creal(x))) 35 1.1 joerg { 36 1.1 joerg if (cimag(x) == 0) 37 1.1 joerg return NaN; 38 1.1 joerg return non_zero_nan; 39 1.1 joerg } 40 1.1 joerg if (isnan(cimag(x))) 41 1.1 joerg { 42 1.1 joerg if (creal(x) == 0) 43 1.1 joerg return NaN; 44 1.1 joerg return non_zero_nan; 45 1.1 joerg } 46 1.1 joerg return non_zero; 47 1.1 joerg } 48 1.1 joerg 49 1.1 joerg int test__muldc3(double a, double b, double c, double d) 50 1.1 joerg { 51 1.1 joerg double _Complex r = __muldc3(a, b, c, d); 52 1.1 joerg // printf("test__muldc3(%f, %f, %f, %f) = %f + I%f\n", 53 1.1 joerg // a, b, c, d, creal(r), cimag(r)); 54 1.1 joerg double _Complex dividend; 55 1.1 joerg double _Complex divisor; 56 1.1 joerg 57 1.1 joerg __real__ dividend = a; 58 1.1 joerg __imag__ dividend = b; 59 1.1 joerg __real__ divisor = c; 60 1.1 joerg __imag__ divisor = d; 61 1.1 joerg 62 1.1 joerg switch (classify(dividend)) 63 1.1 joerg { 64 1.1 joerg case zero: 65 1.1 joerg switch (classify(divisor)) 66 1.1 joerg { 67 1.1 joerg case zero: 68 1.1 joerg if (classify(r) != zero) 69 1.1 joerg return 1; 70 1.1 joerg break; 71 1.1 joerg case non_zero: 72 1.1 joerg if (classify(r) != zero) 73 1.1 joerg return 1; 74 1.1 joerg break; 75 1.1 joerg case inf: 76 1.1 joerg if (classify(r) != NaN) 77 1.1 joerg return 1; 78 1.1 joerg break; 79 1.1 joerg case NaN: 80 1.1 joerg if (classify(r) != NaN) 81 1.1 joerg return 1; 82 1.1 joerg break; 83 1.1 joerg case non_zero_nan: 84 1.1 joerg if (classify(r) != NaN) 85 1.1 joerg return 1; 86 1.1 joerg break; 87 1.1 joerg } 88 1.1 joerg break; 89 1.1 joerg case non_zero: 90 1.1 joerg switch (classify(divisor)) 91 1.1 joerg { 92 1.1 joerg case zero: 93 1.1 joerg if (classify(r) != zero) 94 1.1 joerg return 1; 95 1.1 joerg break; 96 1.1 joerg case non_zero: 97 1.1 joerg if (classify(r) != non_zero) 98 1.1 joerg return 1; 99 1.1 joerg if (r != a * c - b * d + _Complex_I*(a * d + b * c)) 100 1.1 joerg return 1; 101 1.1 joerg break; 102 1.1 joerg case inf: 103 1.1 joerg if (classify(r) != inf) 104 1.1 joerg return 1; 105 1.1 joerg break; 106 1.1 joerg case NaN: 107 1.1 joerg if (classify(r) != NaN) 108 1.1 joerg return 1; 109 1.1 joerg break; 110 1.1 joerg case non_zero_nan: 111 1.1 joerg if (classify(r) != NaN) 112 1.1 joerg return 1; 113 1.1 joerg break; 114 1.1 joerg } 115 1.1 joerg break; 116 1.1 joerg case inf: 117 1.1 joerg switch (classify(divisor)) 118 1.1 joerg { 119 1.1 joerg case zero: 120 1.1 joerg if (classify(r) != NaN) 121 1.1 joerg return 1; 122 1.1 joerg break; 123 1.1 joerg case non_zero: 124 1.1 joerg if (classify(r) != inf) 125 1.1 joerg return 1; 126 1.1 joerg break; 127 1.1 joerg case inf: 128 1.1 joerg if (classify(r) != inf) 129 1.1 joerg return 1; 130 1.1 joerg break; 131 1.1 joerg case NaN: 132 1.1 joerg if (classify(r) != NaN) 133 1.1 joerg return 1; 134 1.1 joerg break; 135 1.1 joerg case non_zero_nan: 136 1.1 joerg if (classify(r) != inf) 137 1.1 joerg return 1; 138 1.1 joerg break; 139 1.1 joerg } 140 1.1 joerg break; 141 1.1 joerg case NaN: 142 1.1 joerg switch (classify(divisor)) 143 1.1 joerg { 144 1.1 joerg case zero: 145 1.1 joerg if (classify(r) != NaN) 146 1.1 joerg return 1; 147 1.1 joerg break; 148 1.1 joerg case non_zero: 149 1.1 joerg if (classify(r) != NaN) 150 1.1 joerg return 1; 151 1.1 joerg break; 152 1.1 joerg case inf: 153 1.1 joerg if (classify(r) != NaN) 154 1.1 joerg return 1; 155 1.1 joerg break; 156 1.1 joerg case NaN: 157 1.1 joerg if (classify(r) != NaN) 158 1.1 joerg return 1; 159 1.1 joerg break; 160 1.1 joerg case non_zero_nan: 161 1.1 joerg if (classify(r) != NaN) 162 1.1 joerg return 1; 163 1.1 joerg break; 164 1.1 joerg } 165 1.1 joerg break; 166 1.1 joerg case non_zero_nan: 167 1.1 joerg switch (classify(divisor)) 168 1.1 joerg { 169 1.1 joerg case zero: 170 1.1 joerg if (classify(r) != NaN) 171 1.1 joerg return 1; 172 1.1 joerg break; 173 1.1 joerg case non_zero: 174 1.1 joerg if (classify(r) != NaN) 175 1.1 joerg return 1; 176 1.1 joerg break; 177 1.1 joerg case inf: 178 1.1 joerg if (classify(r) != inf) 179 1.1 joerg return 1; 180 1.1 joerg break; 181 1.1 joerg case NaN: 182 1.1 joerg if (classify(r) != NaN) 183 1.1 joerg return 1; 184 1.1 joerg break; 185 1.1 joerg case non_zero_nan: 186 1.1 joerg if (classify(r) != NaN) 187 1.1 joerg return 1; 188 1.1 joerg break; 189 1.1 joerg } 190 1.1 joerg break; 191 1.1 joerg } 192 1.1 joerg 193 1.1 joerg return 0; 194 1.1 joerg } 195 1.1 joerg 196 1.1 joerg double x[][2] = 197 1.1 joerg { 198 1.1 joerg { 1.e-6, 1.e-6}, 199 1.1 joerg {-1.e-6, 1.e-6}, 200 1.1 joerg {-1.e-6, -1.e-6}, 201 1.1 joerg { 1.e-6, -1.e-6}, 202 1.1 joerg 203 1.1 joerg { 1.e+6, 1.e-6}, 204 1.1 joerg {-1.e+6, 1.e-6}, 205 1.1 joerg {-1.e+6, -1.e-6}, 206 1.1 joerg { 1.e+6, -1.e-6}, 207 1.1 joerg 208 1.1 joerg { 1.e-6, 1.e+6}, 209 1.1 joerg {-1.e-6, 1.e+6}, 210 1.1 joerg {-1.e-6, -1.e+6}, 211 1.1 joerg { 1.e-6, -1.e+6}, 212 1.1 joerg 213 1.1 joerg { 1.e+6, 1.e+6}, 214 1.1 joerg {-1.e+6, 1.e+6}, 215 1.1 joerg {-1.e+6, -1.e+6}, 216 1.1 joerg { 1.e+6, -1.e+6}, 217 1.1 joerg 218 1.1 joerg {NAN, NAN}, 219 1.1 joerg {-INFINITY, NAN}, 220 1.1 joerg {-2, NAN}, 221 1.1 joerg {-1, NAN}, 222 1.1 joerg {-0.5, NAN}, 223 1.1 joerg {-0., NAN}, 224 1.1 joerg {+0., NAN}, 225 1.1 joerg {0.5, NAN}, 226 1.1 joerg {1, NAN}, 227 1.1 joerg {2, NAN}, 228 1.1 joerg {INFINITY, NAN}, 229 1.1 joerg 230 1.1 joerg {NAN, -INFINITY}, 231 1.1 joerg {-INFINITY, -INFINITY}, 232 1.1 joerg {-2, -INFINITY}, 233 1.1 joerg {-1, -INFINITY}, 234 1.1 joerg {-0.5, -INFINITY}, 235 1.1 joerg {-0., -INFINITY}, 236 1.1 joerg {+0., -INFINITY}, 237 1.1 joerg {0.5, -INFINITY}, 238 1.1 joerg {1, -INFINITY}, 239 1.1 joerg {2, -INFINITY}, 240 1.1 joerg {INFINITY, -INFINITY}, 241 1.1 joerg 242 1.1 joerg {NAN, -2}, 243 1.1 joerg {-INFINITY, -2}, 244 1.1 joerg {-2, -2}, 245 1.1 joerg {-1, -2}, 246 1.1 joerg {-0.5, -2}, 247 1.1 joerg {-0., -2}, 248 1.1 joerg {+0., -2}, 249 1.1 joerg {0.5, -2}, 250 1.1 joerg {1, -2}, 251 1.1 joerg {2, -2}, 252 1.1 joerg {INFINITY, -2}, 253 1.1 joerg 254 1.1 joerg {NAN, -1}, 255 1.1 joerg {-INFINITY, -1}, 256 1.1 joerg {-2, -1}, 257 1.1 joerg {-1, -1}, 258 1.1 joerg {-0.5, -1}, 259 1.1 joerg {-0., -1}, 260 1.1 joerg {+0., -1}, 261 1.1 joerg {0.5, -1}, 262 1.1 joerg {1, -1}, 263 1.1 joerg {2, -1}, 264 1.1 joerg {INFINITY, -1}, 265 1.1 joerg 266 1.1 joerg {NAN, -0.5}, 267 1.1 joerg {-INFINITY, -0.5}, 268 1.1 joerg {-2, -0.5}, 269 1.1 joerg {-1, -0.5}, 270 1.1 joerg {-0.5, -0.5}, 271 1.1 joerg {-0., -0.5}, 272 1.1 joerg {+0., -0.5}, 273 1.1 joerg {0.5, -0.5}, 274 1.1 joerg {1, -0.5}, 275 1.1 joerg {2, -0.5}, 276 1.1 joerg {INFINITY, -0.5}, 277 1.1 joerg 278 1.1 joerg {NAN, -0.}, 279 1.1 joerg {-INFINITY, -0.}, 280 1.1 joerg {-2, -0.}, 281 1.1 joerg {-1, -0.}, 282 1.1 joerg {-0.5, -0.}, 283 1.1 joerg {-0., -0.}, 284 1.1 joerg {+0., -0.}, 285 1.1 joerg {0.5, -0.}, 286 1.1 joerg {1, -0.}, 287 1.1 joerg {2, -0.}, 288 1.1 joerg {INFINITY, -0.}, 289 1.1 joerg 290 1.1 joerg {NAN, 0.}, 291 1.1 joerg {-INFINITY, 0.}, 292 1.1 joerg {-2, 0.}, 293 1.1 joerg {-1, 0.}, 294 1.1 joerg {-0.5, 0.}, 295 1.1 joerg {-0., 0.}, 296 1.1 joerg {+0., 0.}, 297 1.1 joerg {0.5, 0.}, 298 1.1 joerg {1, 0.}, 299 1.1 joerg {2, 0.}, 300 1.1 joerg {INFINITY, 0.}, 301 1.1 joerg 302 1.1 joerg {NAN, 0.5}, 303 1.1 joerg {-INFINITY, 0.5}, 304 1.1 joerg {-2, 0.5}, 305 1.1 joerg {-1, 0.5}, 306 1.1 joerg {-0.5, 0.5}, 307 1.1 joerg {-0., 0.5}, 308 1.1 joerg {+0., 0.5}, 309 1.1 joerg {0.5, 0.5}, 310 1.1 joerg {1, 0.5}, 311 1.1 joerg {2, 0.5}, 312 1.1 joerg {INFINITY, 0.5}, 313 1.1 joerg 314 1.1 joerg {NAN, 1}, 315 1.1 joerg {-INFINITY, 1}, 316 1.1 joerg {-2, 1}, 317 1.1 joerg {-1, 1}, 318 1.1 joerg {-0.5, 1}, 319 1.1 joerg {-0., 1}, 320 1.1 joerg {+0., 1}, 321 1.1 joerg {0.5, 1}, 322 1.1 joerg {1, 1}, 323 1.1 joerg {2, 1}, 324 1.1 joerg {INFINITY, 1}, 325 1.1 joerg 326 1.1 joerg {NAN, 2}, 327 1.1 joerg {-INFINITY, 2}, 328 1.1 joerg {-2, 2}, 329 1.1 joerg {-1, 2}, 330 1.1 joerg {-0.5, 2}, 331 1.1 joerg {-0., 2}, 332 1.1 joerg {+0., 2}, 333 1.1 joerg {0.5, 2}, 334 1.1 joerg {1, 2}, 335 1.1 joerg {2, 2}, 336 1.1 joerg {INFINITY, 2}, 337 1.1 joerg 338 1.1 joerg {NAN, INFINITY}, 339 1.1 joerg {-INFINITY, INFINITY}, 340 1.1 joerg {-2, INFINITY}, 341 1.1 joerg {-1, INFINITY}, 342 1.1 joerg {-0.5, INFINITY}, 343 1.1 joerg {-0., INFINITY}, 344 1.1 joerg {+0., INFINITY}, 345 1.1 joerg {0.5, INFINITY}, 346 1.1 joerg {1, INFINITY}, 347 1.1 joerg {2, INFINITY}, 348 1.1 joerg {INFINITY, INFINITY} 349 1.1 joerg 350 1.1 joerg }; 351 1.1 joerg 352 1.1 joerg int main() 353 1.1 joerg { 354 1.1 joerg const unsigned N = sizeof(x) / sizeof(x[0]); 355 1.1 joerg unsigned i, j; 356 1.1 joerg for (i = 0; i < N; ++i) 357 1.1 joerg { 358 1.1 joerg for (j = 0; j < N; ++j) 359 1.1 joerg { 360 1.1 joerg if (test__muldc3(x[i][0], x[i][1], x[j][0], x[j][1])) 361 1.1 joerg return 1; 362 1.1 joerg } 363 1.1 joerg } 364 1.1 joerg 365 1.1 joerg return 0; 366 1.1 joerg } 367