1 ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu \ 2 ; RUN: -mattr=+spe | FileCheck %s 3 4 declare float @llvm.fabs.float(float) 5 define float @test_float_abs(float %a) #0 { 6 entry: 7 %0 = tail call float @llvm.fabs.float(float %a) 8 ret float %0 9 ; CHECK-LABEL: test_float_abs 10 ; CHECK: efsabs 3, 3 11 ; CHECK: blr 12 } 13 14 define float @test_fnabs(float %a) #0 { 15 entry: 16 %0 = tail call float @llvm.fabs.float(float %a) 17 %sub = fsub float -0.000000e+00, %0 18 ret float %sub 19 ; CHECK-LABEL: @test_fnabs 20 ; CHECK: efsnabs 21 ; CHECK: blr 22 } 23 24 define float @test_fdiv(float %a, float %b) { 25 entry: 26 %v = fdiv float %a, %b 27 ret float %v 28 29 ; CHECK-LABEL: test_fdiv 30 ; CHECK: efsdiv 31 ; CHECK: blr 32 } 33 34 define float @test_fmul(float %a, float %b) { 35 entry: 36 %v = fmul float %a, %b 37 ret float %v 38 ; CHECK-LABEL @test_fmul 39 ; CHECK: efsmul 40 ; CHECK: blr 41 } 42 43 define float @test_fadd(float %a, float %b) { 44 entry: 45 %v = fadd float %a, %b 46 ret float %v 47 ; CHECK-LABEL @test_fadd 48 ; CHECK: efsadd 49 ; CHECK: blr 50 } 51 52 define float @test_fsub(float %a, float %b) { 53 entry: 54 %v = fsub float %a, %b 55 ret float %v 56 ; CHECK-LABEL @test_fsub 57 ; CHECK: efssub 58 ; CHECK: blr 59 } 60 61 define float @test_fneg(float %a) { 62 entry: 63 %v = fsub float -0.0, %a 64 ret float %v 65 66 ; CHECK-LABEL @test_fneg 67 ; CHECK: efsneg 68 ; CHECK: blr 69 } 70 71 define float @test_dtos(double %a) { 72 entry: 73 %v = fptrunc double %a to float 74 ret float %v 75 ; CHECK-LABEL: test_dtos 76 ; CHECK: efscfd 77 ; CHECK: blr 78 } 79 80 define i1 @test_fcmpgt(float %a, float %b) { 81 entry: 82 %r = fcmp ogt float %a, %b 83 ret i1 %r 84 ; CHECK-LABEL: test_fcmpgt 85 ; CHECK: efscmpgt 86 ; CHECK: blr 87 } 88 89 define i1 @test_fcmpugt(float %a, float %b) { 90 entry: 91 %r = fcmp ugt float %a, %b 92 ret i1 %r 93 ; CHECK-LABEL: test_fcmpugt 94 ; CHECK: efscmpgt 95 ; CHECK: blr 96 } 97 98 define i1 @test_fcmple(float %a, float %b) { 99 entry: 100 %r = fcmp ole float %a, %b 101 ret i1 %r 102 ; CHECK-LABEL: test_fcmple 103 ; CHECK: efscmpgt 104 ; CHECK: blr 105 } 106 107 define i1 @test_fcmpule(float %a, float %b) { 108 entry: 109 %r = fcmp ule float %a, %b 110 ret i1 %r 111 ; CHECK-LABEL: test_fcmpule 112 ; CHECK: efscmpgt 113 ; CHECK: blr 114 } 115 116 define i1 @test_fcmpeq(float %a, float %b) { 117 entry: 118 %r = fcmp oeq float %a, %b 119 ret i1 %r 120 ; CHECK-LABEL: test_fcmpeq 121 ; CHECK: efscmpeq 122 ; CHECK: blr 123 } 124 125 ; (un)ordered tests are expanded to une and oeq so verify 126 define i1 @test_fcmpuno(float %a, float %b) { 127 entry: 128 %r = fcmp uno float %a, %b 129 ret i1 %r 130 ; CHECK-LABEL: test_fcmpuno 131 ; CHECK: efscmpeq 132 ; CHECK: efscmpeq 133 ; CHECK: crand 134 ; CHECK: blr 135 } 136 137 define i1 @test_fcmpord(float %a, float %b) { 138 entry: 139 %r = fcmp ord float %a, %b 140 ret i1 %r 141 ; CHECK-LABEL: test_fcmpord 142 ; CHECK: efscmpeq 143 ; CHECK: efscmpeq 144 ; CHECK: crnand 145 ; CHECK: blr 146 } 147 148 define i1 @test_fcmpueq(float %a, float %b) { 149 entry: 150 %r = fcmp ueq float %a, %b 151 ret i1 %r 152 ; CHECK-LABEL: test_fcmpueq 153 ; CHECK: efscmpeq 154 ; CHECK: blr 155 } 156 157 define i1 @test_fcmpne(float %a, float %b) { 158 entry: 159 %r = fcmp one float %a, %b 160 ret i1 %r 161 ; CHECK-LABEL: test_fcmpne 162 ; CHECK: efscmpeq 163 ; CHECK: blr 164 } 165 166 define i1 @test_fcmpune(float %a, float %b) { 167 entry: 168 %r = fcmp une float %a, %b 169 ret i1 %r 170 ; CHECK-LABEL: test_fcmpune 171 ; CHECK: efscmpeq 172 ; CHECK: blr 173 } 174 175 define i1 @test_fcmplt(float %a, float %b) { 176 entry: 177 %r = fcmp olt float %a, %b 178 ret i1 %r 179 ; CHECK-LABEL: test_fcmplt 180 ; CHECK: efscmplt 181 ; CHECK: blr 182 } 183 184 define i1 @test_fcmpult(float %a, float %b) { 185 entry: 186 %r = fcmp ult float %a, %b 187 ret i1 %r 188 ; CHECK-LABEL: test_fcmpult 189 ; CHECK: efscmplt 190 ; CHECK: blr 191 } 192 193 define i1 @test_fcmpge(float %a, float %b) { 194 entry: 195 %r = fcmp oge float %a, %b 196 ret i1 %r 197 ; CHECK-LABEL: test_fcmpge 198 ; CHECK: efscmplt 199 ; CHECK: blr 200 } 201 202 define i1 @test_fcmpuge(float %a, float %b) { 203 entry: 204 %r = fcmp uge float %a, %b 205 ret i1 %r 206 ; CHECK-LABEL: test_fcmpuge 207 ; CHECK: efscmplt 208 ; CHECK: blr 209 } 210 211 define i32 @test_ftoui(float %a) { 212 %v = fptoui float %a to i32 213 ret i32 %v 214 ; CHECK-LABEL: test_ftoui 215 ; CHECK: efsctuiz 216 } 217 218 define i32 @test_ftosi(float %a) { 219 %v = fptosi float %a to i32 220 ret i32 %v 221 ; CHECK-LABEL: test_ftosi 222 ; CHECK: efsctsiz 223 } 224 225 define float @test_ffromui(i32 %a) { 226 %v = uitofp i32 %a to float 227 ret float %v 228 ; CHECK-LABEL: test_ffromui 229 ; CHECK: efscfui 230 } 231 232 define float @test_ffromsi(i32 %a) { 233 %v = sitofp i32 %a to float 234 ret float %v 235 ; CHECK-LABEL: test_ffromsi 236 ; CHECK: efscfsi 237 } 238 239 define i32 @test_fasmconst(float %x) { 240 entry: 241 %x.addr = alloca float, align 8 242 store float %x, float* %x.addr, align 8 243 %0 = load float, float* %x.addr, align 8 244 %1 = call i32 asm sideeffect "efsctsi $0, $1", "=f,f"(float %0) 245 ret i32 %1 246 ; CHECK-LABEL: test_fasmconst 247 ; Check that it's not loading a double 248 ; CHECK-NOT: evldd 249 ; CHECK: #APP 250 ; CHECK: efsctsi 251 ; CHECK: #NO_APP 252 } 253 254 ; Double tests 255 256 define void @test_double_abs(double * %aa) #0 { 257 entry: 258 %0 = load double, double * %aa 259 %1 = tail call double @llvm.fabs.f64(double %0) #2 260 store double %1, double * %aa 261 ret void 262 ; CHECK-LABEL: test_double_abs 263 ; CHECK: efdabs 264 ; CHECK: blr 265 } 266 267 ; Function Attrs: nounwind readnone 268 declare double @llvm.fabs.f64(double) #1 269 270 define void @test_dnabs(double * %aa) #0 { 271 entry: 272 %0 = load double, double * %aa 273 %1 = tail call double @llvm.fabs.f64(double %0) #2 274 %sub = fsub double -0.000000e+00, %1 275 store double %sub, double * %aa 276 ret void 277 } 278 ; CHECK-LABEL: @test_dnabs 279 ; CHECK: efdnabs 280 ; CHECK: blr 281 282 define double @test_ddiv(double %a, double %b) { 283 entry: 284 %v = fdiv double %a, %b 285 ret double %v 286 287 ; CHECK-LABEL: test_ddiv 288 ; CHECK: efddiv 289 ; CHECK: blr 290 } 291 292 define double @test_dmul(double %a, double %b) { 293 entry: 294 %v = fmul double %a, %b 295 ret double %v 296 ; CHECK-LABEL @test_dmul 297 ; CHECK: efdmul 298 ; CHECK: blr 299 } 300 301 define double @test_dadd(double %a, double %b) { 302 entry: 303 %v = fadd double %a, %b 304 ret double %v 305 ; CHECK-LABEL @test_dadd 306 ; CHECK: efdadd 307 ; CHECK: blr 308 } 309 310 define double @test_dsub(double %a, double %b) { 311 entry: 312 %v = fsub double %a, %b 313 ret double %v 314 ; CHECK-LABEL @test_dsub 315 ; CHECK: efdsub 316 ; CHECK: blr 317 } 318 319 define double @test_dneg(double %a) { 320 entry: 321 %v = fsub double -0.0, %a 322 ret double %v 323 324 ; CHECK-LABEL @test_dneg 325 ; CHECK: blr 326 } 327 328 define double @test_stod(float %a) { 329 entry: 330 %v = fpext float %a to double 331 ret double %v 332 ; CHECK-LABEL: test_stod 333 ; CHECK: efdcfs 334 ; CHECK: blr 335 } 336 337 ; (un)ordered tests are expanded to une and oeq so verify 338 define i1 @test_dcmpuno(double %a, double %b) { 339 entry: 340 %r = fcmp uno double %a, %b 341 ret i1 %r 342 ; CHECK-LABEL: test_dcmpuno 343 ; CHECK: efdcmpeq 344 ; CHECK: efdcmpeq 345 ; CHECK: crand 346 ; CHECK: blr 347 } 348 349 define i1 @test_dcmpord(double %a, double %b) { 350 entry: 351 %r = fcmp ord double %a, %b 352 ret i1 %r 353 ; CHECK-LABEL: test_dcmpord 354 ; CHECK: efdcmpeq 355 ; CHECK: efdcmpeq 356 ; CHECK: crnand 357 ; CHECK: blr 358 } 359 360 define i1 @test_dcmpgt(double %a, double %b) { 361 entry: 362 %r = fcmp ogt double %a, %b 363 ret i1 %r 364 ; CHECK-LABEL: test_dcmpgt 365 ; CHECK: efdcmpgt 366 ; CHECK: blr 367 } 368 369 define i1 @test_dcmpugt(double %a, double %b) { 370 entry: 371 %r = fcmp ugt double %a, %b 372 ret i1 %r 373 ; CHECK-LABEL: test_dcmpugt 374 ; CHECK: efdcmpgt 375 ; CHECK: blr 376 } 377 378 define i1 @test_dcmple(double %a, double %b) { 379 entry: 380 %r = fcmp ole double %a, %b 381 ret i1 %r 382 ; CHECK-LABEL: test_dcmple 383 ; CHECK: efdcmpgt 384 ; CHECK: blr 385 } 386 387 define i1 @test_dcmpule(double %a, double %b) { 388 entry: 389 %r = fcmp ule double %a, %b 390 ret i1 %r 391 ; CHECK-LABEL: test_dcmpule 392 ; CHECK: efdcmpgt 393 ; CHECK: blr 394 } 395 396 define i1 @test_dcmpeq(double %a, double %b) { 397 entry: 398 %r = fcmp oeq double %a, %b 399 ret i1 %r 400 ; CHECK-LABEL: test_dcmpeq 401 ; CHECK: efdcmpeq 402 ; CHECK: blr 403 } 404 405 define i1 @test_dcmpueq(double %a, double %b) { 406 entry: 407 %r = fcmp ueq double %a, %b 408 ret i1 %r 409 ; CHECK-LABEL: test_dcmpueq 410 ; CHECK: efdcmpeq 411 ; CHECK: blr 412 } 413 414 define i1 @test_dcmpne(double %a, double %b) { 415 entry: 416 %r = fcmp one double %a, %b 417 ret i1 %r 418 ; CHECK-LABEL: test_dcmpne 419 ; CHECK: efdcmpeq 420 ; CHECK: blr 421 } 422 423 define i1 @test_dcmpune(double %a, double %b) { 424 entry: 425 %r = fcmp une double %a, %b 426 ret i1 %r 427 ; CHECK-LABEL: test_dcmpune 428 ; CHECK: efdcmpeq 429 ; CHECK: blr 430 } 431 432 define i1 @test_dcmplt(double %a, double %b) { 433 entry: 434 %r = fcmp olt double %a, %b 435 ret i1 %r 436 ; CHECK-LABEL: test_dcmplt 437 ; CHECK: efdcmplt 438 ; CHECK: blr 439 } 440 441 define i1 @test_dcmpult(double %a, double %b) { 442 entry: 443 %r = fcmp ult double %a, %b 444 ret i1 %r 445 ; CHECK-LABEL: test_dcmpult 446 ; CHECK: efdcmplt 447 ; CHECK: blr 448 } 449 450 define i1 @test_dcmpge(double %a, double %b) { 451 entry: 452 %r = fcmp oge double %a, %b 453 ret i1 %r 454 ; CHECK-LABEL: test_dcmpge 455 ; CHECK: efdcmplt 456 ; CHECK: blr 457 } 458 459 define i1 @test_dcmpuge(double %a, double %b) { 460 entry: 461 %r = fcmp uge double %a, %b 462 ret i1 %r 463 ; CHECK-LABEL: test_dcmpuge 464 ; CHECK: efdcmplt 465 ; CHECK: blr 466 } 467 468 define double @test_dselect(double %a, double %b, i1 %c) { 469 entry: 470 %r = select i1 %c, double %a, double %b 471 ret double %r 472 ; CHECK-LABEL: test_dselect 473 ; CHECK: andi. 474 ; CHECK: bc 475 ; CHECK: evldd 476 ; CHECK: b 477 ; CHECK: evldd 478 ; CHECK: evstdd 479 ; CHECK: blr 480 } 481 482 define i32 @test_dtoui(double %a) { 483 entry: 484 %v = fptoui double %a to i32 485 ret i32 %v 486 ; CHECK-LABEL: test_dtoui 487 ; CHECK: efdctuiz 488 } 489 490 define i32 @test_dtosi(double %a) { 491 entry: 492 %v = fptosi double %a to i32 493 ret i32 %v 494 ; CHECK-LABEL: test_dtosi 495 ; CHECK: efdctsiz 496 } 497 498 define double @test_dfromui(i32 %a) { 499 entry: 500 %v = uitofp i32 %a to double 501 ret double %v 502 ; CHECK-LABEL: test_dfromui 503 ; CHECK: efdcfui 504 } 505 506 define double @test_dfromsi(i32 %a) { 507 entry: 508 %v = sitofp i32 %a to double 509 ret double %v 510 ; CHECK-LABEL: test_dfromsi 511 ; CHECK: efdcfsi 512 } 513 514 define i32 @test_dasmconst(double %x) { 515 entry: 516 %x.addr = alloca double, align 8 517 store double %x, double* %x.addr, align 8 518 %0 = load double, double* %x.addr, align 8 519 %1 = call i32 asm sideeffect "efdctsi $0, $1", "=d,d"(double %0) 520 ret i32 %1 521 ; CHECK-LABEL: test_dasmconst 522 ; CHECK: evldd 523 ; CHECK: #APP 524 ; CHECK: efdctsi 525 ; CHECK: #NO_APP 526 } 527 528 define double @test_spill(double %a) nounwind { 529 entry: 530 %0 = fadd double %a, %a 531 call void asm sideeffect "","~{r0},~{r3},~{s4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15},~{r16},~{r17},~{r18},~{r19},~{r20},~{r21},~{r22},~{r23},~{r24},~{r25},~{r26},~{r27},~{r28},~{r29},~{r30},~{r31}"() nounwind 532 %1 = fadd double %0, 3.14159 533 br label %return 534 535 return: 536 ret double %1 537 538 ; CHECK-LABEL: test_spill 539 ; CHECK: efdadd 540 ; CHECK: evstdd 541 ; CHECK: evldd 542 } 543