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