1 // RUN: %clang_cc1 %s -O1 -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s --check-prefix=X86 2 // RUN: %clang_cc1 %s -O1 -emit-llvm -triple x86_64-pc-win64 -o - | FileCheck %s --check-prefix=X86 3 // RUN: %clang_cc1 %s -O1 -emit-llvm -triple i686-unknown-unknown -o - | FileCheck %s --check-prefix=X86 4 // RUN: %clang_cc1 %s -O1 -emit-llvm -triple powerpc-unknown-unknown -o - | FileCheck %s --check-prefix=PPC 5 6 float _Complex add_float_rr(float a, float b) { 7 // X86-LABEL: @add_float_rr( 8 // X86: fadd 9 // X86-NOT: fadd 10 // X86: ret 11 return a + b; 12 } 13 float _Complex add_float_cr(float _Complex a, float b) { 14 // X86-LABEL: @add_float_cr( 15 // X86: fadd 16 // X86-NOT: fadd 17 // X86: ret 18 return a + b; 19 } 20 float _Complex add_float_rc(float a, float _Complex b) { 21 // X86-LABEL: @add_float_rc( 22 // X86: fadd 23 // X86-NOT: fadd 24 // X86: ret 25 return a + b; 26 } 27 float _Complex add_float_cc(float _Complex a, float _Complex b) { 28 // X86-LABEL: @add_float_cc( 29 // X86: fadd 30 // X86: fadd 31 // X86-NOT: fadd 32 // X86: ret 33 return a + b; 34 } 35 36 float _Complex sub_float_rr(float a, float b) { 37 // X86-LABEL: @sub_float_rr( 38 // X86: fsub 39 // X86-NOT: fsub 40 // X86: ret 41 return a - b; 42 } 43 float _Complex sub_float_cr(float _Complex a, float b) { 44 // X86-LABEL: @sub_float_cr( 45 // X86: fsub 46 // X86-NOT: fsub 47 // X86: ret 48 return a - b; 49 } 50 float _Complex sub_float_rc(float a, float _Complex b) { 51 // X86-LABEL: @sub_float_rc( 52 // X86: fsub 53 // X86: fsub float -0.{{0+}}e+00, 54 // X86-NOT: fsub 55 // X86: ret 56 return a - b; 57 } 58 float _Complex sub_float_cc(float _Complex a, float _Complex b) { 59 // X86-LABEL: @sub_float_cc( 60 // X86: fsub 61 // X86: fsub 62 // X86-NOT: fsub 63 // X86: ret 64 return a - b; 65 } 66 67 float _Complex mul_float_rr(float a, float b) { 68 // X86-LABEL: @mul_float_rr( 69 // X86: fmul 70 // X86-NOT: fmul 71 // X86: ret 72 return a * b; 73 } 74 float _Complex mul_float_cr(float _Complex a, float b) { 75 // X86-LABEL: @mul_float_cr( 76 // X86: fmul 77 // X86: fmul 78 // X86-NOT: fmul 79 // X86: ret 80 return a * b; 81 } 82 float _Complex mul_float_rc(float a, float _Complex b) { 83 // X86-LABEL: @mul_float_rc( 84 // X86: fmul 85 // X86: fmul 86 // X86-NOT: fmul 87 // X86: ret 88 return a * b; 89 } 90 float _Complex mul_float_cc(float _Complex a, float _Complex b) { 91 // X86-LABEL: @mul_float_cc( 92 // X86: %[[AC:[^ ]+]] = fmul 93 // X86: %[[BD:[^ ]+]] = fmul 94 // X86: %[[AD:[^ ]+]] = fmul 95 // X86: %[[BC:[^ ]+]] = fmul 96 // X86: %[[RR:[^ ]+]] = fsub float %[[AC]], %[[BD]] 97 // X86: %[[RI:[^ ]+]] = fadd float 98 // X86-DAG: %[[AD]] 99 // X86-DAG: , 100 // X86-DAG: %[[BC]] 101 // X86: fcmp uno float %[[RR]] 102 // X86: fcmp uno float %[[RI]] 103 // X86: call {{.*}} @__mulsc3( 104 // X86: ret 105 return a * b; 106 } 107 108 float _Complex div_float_rr(float a, float b) { 109 // X86-LABEL: @div_float_rr( 110 // X86: fdiv 111 // X86-NOT: fdiv 112 // X86: ret 113 return a / b; 114 } 115 float _Complex div_float_cr(float _Complex a, float b) { 116 // X86-LABEL: @div_float_cr( 117 // X86: fdiv 118 // X86: fdiv 119 // X86-NOT: fdiv 120 // X86: ret 121 return a / b; 122 } 123 float _Complex div_float_rc(float a, float _Complex b) { 124 // X86-LABEL: @div_float_rc( 125 // X86-NOT: fdiv 126 // X86: call {{.*}} @__divsc3( 127 // X86: ret 128 return a / b; 129 } 130 float _Complex div_float_cc(float _Complex a, float _Complex b) { 131 // X86-LABEL: @div_float_cc( 132 // X86-NOT: fdiv 133 // X86: call {{.*}} @__divsc3( 134 // X86: ret 135 return a / b; 136 } 137 138 double _Complex add_double_rr(double a, double b) { 139 // X86-LABEL: @add_double_rr( 140 // X86: fadd 141 // X86-NOT: fadd 142 // X86: ret 143 return a + b; 144 } 145 double _Complex add_double_cr(double _Complex a, double b) { 146 // X86-LABEL: @add_double_cr( 147 // X86: fadd 148 // X86-NOT: fadd 149 // X86: ret 150 return a + b; 151 } 152 double _Complex add_double_rc(double a, double _Complex b) { 153 // X86-LABEL: @add_double_rc( 154 // X86: fadd 155 // X86-NOT: fadd 156 // X86: ret 157 return a + b; 158 } 159 double _Complex add_double_cc(double _Complex a, double _Complex b) { 160 // X86-LABEL: @add_double_cc( 161 // X86: fadd 162 // X86: fadd 163 // X86-NOT: fadd 164 // X86: ret 165 return a + b; 166 } 167 168 double _Complex sub_double_rr(double a, double b) { 169 // X86-LABEL: @sub_double_rr( 170 // X86: fsub 171 // X86-NOT: fsub 172 // X86: ret 173 return a - b; 174 } 175 double _Complex sub_double_cr(double _Complex a, double b) { 176 // X86-LABEL: @sub_double_cr( 177 // X86: fsub 178 // X86-NOT: fsub 179 // X86: ret 180 return a - b; 181 } 182 double _Complex sub_double_rc(double a, double _Complex b) { 183 // X86-LABEL: @sub_double_rc( 184 // X86: fsub 185 // X86: fsub double -0.{{0+}}e+00, 186 // X86-NOT: fsub 187 // X86: ret 188 return a - b; 189 } 190 double _Complex sub_double_cc(double _Complex a, double _Complex b) { 191 // X86-LABEL: @sub_double_cc( 192 // X86: fsub 193 // X86: fsub 194 // X86-NOT: fsub 195 // X86: ret 196 return a - b; 197 } 198 199 double _Complex mul_double_rr(double a, double b) { 200 // X86-LABEL: @mul_double_rr( 201 // X86: fmul 202 // X86-NOT: fmul 203 // X86: ret 204 return a * b; 205 } 206 double _Complex mul_double_cr(double _Complex a, double b) { 207 // X86-LABEL: @mul_double_cr( 208 // X86: fmul 209 // X86: fmul 210 // X86-NOT: fmul 211 // X86: ret 212 return a * b; 213 } 214 double _Complex mul_double_rc(double a, double _Complex b) { 215 // X86-LABEL: @mul_double_rc( 216 // X86: fmul 217 // X86: fmul 218 // X86-NOT: fmul 219 // X86: ret 220 return a * b; 221 } 222 double _Complex mul_double_cc(double _Complex a, double _Complex b) { 223 // X86-LABEL: @mul_double_cc( 224 // X86: %[[AC:[^ ]+]] = fmul 225 // X86: %[[BD:[^ ]+]] = fmul 226 // X86: %[[AD:[^ ]+]] = fmul 227 // X86: %[[BC:[^ ]+]] = fmul 228 // X86: %[[RR:[^ ]+]] = fsub double %[[AC]], %[[BD]] 229 // X86: %[[RI:[^ ]+]] = fadd double 230 // X86-DAG: %[[AD]] 231 // X86-DAG: , 232 // X86-DAG: %[[BC]] 233 // X86: fcmp uno double %[[RR]] 234 // X86: fcmp uno double %[[RI]] 235 // X86: call {{.*}} @__muldc3( 236 // X86: ret 237 return a * b; 238 } 239 240 double _Complex div_double_rr(double a, double b) { 241 // X86-LABEL: @div_double_rr( 242 // X86: fdiv 243 // X86-NOT: fdiv 244 // X86: ret 245 return a / b; 246 } 247 double _Complex div_double_cr(double _Complex a, double b) { 248 // X86-LABEL: @div_double_cr( 249 // X86: fdiv 250 // X86: fdiv 251 // X86-NOT: fdiv 252 // X86: ret 253 return a / b; 254 } 255 double _Complex div_double_rc(double a, double _Complex b) { 256 // X86-LABEL: @div_double_rc( 257 // X86-NOT: fdiv 258 // X86: call {{.*}} @__divdc3( 259 // X86: ret 260 return a / b; 261 } 262 double _Complex div_double_cc(double _Complex a, double _Complex b) { 263 // X86-LABEL: @div_double_cc( 264 // X86-NOT: fdiv 265 // X86: call {{.*}} @__divdc3( 266 // X86: ret 267 return a / b; 268 } 269 270 long double _Complex add_long_double_rr(long double a, long double b) { 271 // X86-LABEL: @add_long_double_rr( 272 // X86: fadd 273 // X86-NOT: fadd 274 // X86: ret 275 return a + b; 276 } 277 long double _Complex add_long_double_cr(long double _Complex a, long double b) { 278 // X86-LABEL: @add_long_double_cr( 279 // X86: fadd 280 // X86-NOT: fadd 281 // X86: ret 282 return a + b; 283 } 284 long double _Complex add_long_double_rc(long double a, long double _Complex b) { 285 // X86-LABEL: @add_long_double_rc( 286 // X86: fadd 287 // X86-NOT: fadd 288 // X86: ret 289 return a + b; 290 } 291 long double _Complex add_long_double_cc(long double _Complex a, long double _Complex b) { 292 // X86-LABEL: @add_long_double_cc( 293 // X86: fadd 294 // X86: fadd 295 // X86-NOT: fadd 296 // X86: ret 297 return a + b; 298 } 299 300 long double _Complex sub_long_double_rr(long double a, long double b) { 301 // X86-LABEL: @sub_long_double_rr( 302 // X86: fsub 303 // X86-NOT: fsub 304 // X86: ret 305 return a - b; 306 } 307 long double _Complex sub_long_double_cr(long double _Complex a, long double b) { 308 // X86-LABEL: @sub_long_double_cr( 309 // X86: fsub 310 // X86-NOT: fsub 311 // X86: ret 312 return a - b; 313 } 314 long double _Complex sub_long_double_rc(long double a, long double _Complex b) { 315 // X86-LABEL: @sub_long_double_rc( 316 // X86: fsub 317 // X86: fsub x86_fp80 0xK8{{0+}}, 318 // X86-NOT: fsub 319 // X86: ret 320 return a - b; 321 } 322 long double _Complex sub_long_double_cc(long double _Complex a, long double _Complex b) { 323 // X86-LABEL: @sub_long_double_cc( 324 // X86: fsub 325 // X86: fsub 326 // X86-NOT: fsub 327 // X86: ret 328 return a - b; 329 } 330 331 long double _Complex mul_long_double_rr(long double a, long double b) { 332 // X86-LABEL: @mul_long_double_rr( 333 // X86: fmul 334 // X86-NOT: fmul 335 // X86: ret 336 return a * b; 337 } 338 long double _Complex mul_long_double_cr(long double _Complex a, long double b) { 339 // X86-LABEL: @mul_long_double_cr( 340 // X86: fmul 341 // X86: fmul 342 // X86-NOT: fmul 343 // X86: ret 344 return a * b; 345 } 346 long double _Complex mul_long_double_rc(long double a, long double _Complex b) { 347 // X86-LABEL: @mul_long_double_rc( 348 // X86: fmul 349 // X86: fmul 350 // X86-NOT: fmul 351 // X86: ret 352 return a * b; 353 } 354 long double _Complex mul_long_double_cc(long double _Complex a, long double _Complex b) { 355 // X86-LABEL: @mul_long_double_cc( 356 // X86: %[[AC:[^ ]+]] = fmul 357 // X86: %[[BD:[^ ]+]] = fmul 358 // X86: %[[AD:[^ ]+]] = fmul 359 // X86: %[[BC:[^ ]+]] = fmul 360 // X86: %[[RR:[^ ]+]] = fsub x86_fp80 %[[AC]], %[[BD]] 361 // X86: %[[RI:[^ ]+]] = fadd x86_fp80 362 // X86-DAG: %[[AD]] 363 // X86-DAG: , 364 // X86-DAG: %[[BC]] 365 // X86: fcmp uno x86_fp80 %[[RR]] 366 // X86: fcmp uno x86_fp80 %[[RI]] 367 // X86: call {{.*}} @__mulxc3( 368 // X86: ret 369 // PPC-LABEL: @mul_long_double_cc( 370 // PPC: %[[AC:[^ ]+]] = fmul 371 // PPC: %[[BD:[^ ]+]] = fmul 372 // PPC: %[[AD:[^ ]+]] = fmul 373 // PPC: %[[BC:[^ ]+]] = fmul 374 // PPC: %[[RR:[^ ]+]] = fsub ppc_fp128 %[[AC]], %[[BD]] 375 // PPC: %[[RI:[^ ]+]] = fadd ppc_fp128 376 // PPC-DAG: %[[AD]] 377 // PPC-DAG: , 378 // PPC-DAG: %[[BC]] 379 // PPC: fcmp uno ppc_fp128 %[[RR]] 380 // PPC: fcmp uno ppc_fp128 %[[RI]] 381 // PPC: call {{.*}} @__multc3( 382 // PPC: ret 383 return a * b; 384 } 385 386 long double _Complex div_long_double_rr(long double a, long double b) { 387 // X86-LABEL: @div_long_double_rr( 388 // X86: fdiv 389 // X86-NOT: fdiv 390 // X86: ret 391 return a / b; 392 } 393 long double _Complex div_long_double_cr(long double _Complex a, long double b) { 394 // X86-LABEL: @div_long_double_cr( 395 // X86: fdiv 396 // X86: fdiv 397 // X86-NOT: fdiv 398 // X86: ret 399 return a / b; 400 } 401 long double _Complex div_long_double_rc(long double a, long double _Complex b) { 402 // X86-LABEL: @div_long_double_rc( 403 // X86-NOT: fdiv 404 // X86: call {{.*}} @__divxc3( 405 // X86: ret 406 // PPC-LABEL: @div_long_double_rc( 407 // PPC-NOT: fdiv 408 // PPC: call {{.*}} @__divtc3( 409 // PPC: ret 410 return a / b; 411 } 412 long double _Complex div_long_double_cc(long double _Complex a, long double _Complex b) { 413 // X86-LABEL: @div_long_double_cc( 414 // X86-NOT: fdiv 415 // X86: call {{.*}} @__divxc3( 416 // X86: ret 417 // PPC-LABEL: @div_long_double_cc( 418 // PPC-NOT: fdiv 419 // PPC: call {{.*}} @__divtc3( 420 // PPC: ret 421 return a / b; 422 } 423 424 // Comparison operators don't rely on library calls or have interseting math 425 // properties, but test that mixed types work correctly here. 426 _Bool eq_float_cr(float _Complex a, float b) { 427 // X86-LABEL: @eq_float_cr( 428 // X86: fcmp oeq 429 // X86: fcmp oeq 430 // X86: and i1 431 // X86: ret 432 return a == b; 433 } 434 _Bool eq_float_rc(float a, float _Complex b) { 435 // X86-LABEL: @eq_float_rc( 436 // X86: fcmp oeq 437 // X86: fcmp oeq 438 // X86: and i1 439 // X86: ret 440 return a == b; 441 } 442 _Bool eq_float_cc(float _Complex a, float _Complex b) { 443 // X86-LABEL: @eq_float_cc( 444 // X86: fcmp oeq 445 // X86: fcmp oeq 446 // X86: and i1 447 // X86: ret 448 return a == b; 449 } 450 _Bool ne_float_cr(float _Complex a, float b) { 451 // X86-LABEL: @ne_float_cr( 452 // X86: fcmp une 453 // X86: fcmp une 454 // X86: or i1 455 // X86: ret 456 return a != b; 457 } 458 _Bool ne_float_rc(float a, float _Complex b) { 459 // X86-LABEL: @ne_float_rc( 460 // X86: fcmp une 461 // X86: fcmp une 462 // X86: or i1 463 // X86: ret 464 return a != b; 465 } 466 _Bool ne_float_cc(float _Complex a, float _Complex b) { 467 // X86-LABEL: @ne_float_cc( 468 // X86: fcmp une 469 // X86: fcmp une 470 // X86: or i1 471 // X86: ret 472 return a != b; 473 } 474