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