1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mcpu=pwr7 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 3; RUN: -mtriple=powerpc64-unknown-unknown -verify-machineinstrs < %s | \ 4; RUN: FileCheck %s --check-prefix=BE 5; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 6; RUN: -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs < %s | \ 7; RUN: FileCheck %s 8; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 9; RUN: -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs < %s \ 10; RUN: --enable-unsafe-fp-math | FileCheck %s --check-prefix=FAST 11define dso_local i64 @test_lrint(double %d) local_unnamed_addr { 12; BE-LABEL: test_lrint: 13; BE: # %bb.0: # %entry 14; BE-NEXT: mflr r0 15; BE-NEXT: std r0, 16(r1) 16; BE-NEXT: stdu r1, -112(r1) 17; BE-NEXT: .cfi_def_cfa_offset 112 18; BE-NEXT: .cfi_offset lr, 16 19; BE-NEXT: bl lrint 20; BE-NEXT: nop 21; BE-NEXT: addi r1, r1, 112 22; BE-NEXT: ld r0, 16(r1) 23; BE-NEXT: mtlr r0 24; BE-NEXT: blr 25; 26; CHECK-LABEL: test_lrint: 27; CHECK: # %bb.0: # %entry 28; CHECK-NEXT: mflr r0 29; CHECK-NEXT: std r0, 16(r1) 30; CHECK-NEXT: stdu r1, -32(r1) 31; CHECK-NEXT: .cfi_def_cfa_offset 32 32; CHECK-NEXT: .cfi_offset lr, 16 33; CHECK-NEXT: bl lrint 34; CHECK-NEXT: nop 35; CHECK-NEXT: addi r1, r1, 32 36; CHECK-NEXT: ld r0, 16(r1) 37; CHECK-NEXT: mtlr r0 38; CHECK-NEXT: blr 39; 40; FAST-LABEL: test_lrint: 41; FAST: # %bb.0: # %entry 42; FAST-NEXT: fctid f0, f1 43; FAST-NEXT: mffprd r3, f0 44; FAST-NEXT: blr 45entry: 46 %0 = tail call i64 @llvm.lrint.i64.f64(double %d) 47 ret i64 %0 48} 49 50declare i64 @llvm.lrint.i64.f64(double) 51 52define dso_local i64 @test_lrintf(float %f) local_unnamed_addr { 53; BE-LABEL: test_lrintf: 54; BE: # %bb.0: # %entry 55; BE-NEXT: mflr r0 56; BE-NEXT: std r0, 16(r1) 57; BE-NEXT: stdu r1, -112(r1) 58; BE-NEXT: .cfi_def_cfa_offset 112 59; BE-NEXT: .cfi_offset lr, 16 60; BE-NEXT: bl lrintf 61; BE-NEXT: nop 62; BE-NEXT: addi r1, r1, 112 63; BE-NEXT: ld r0, 16(r1) 64; BE-NEXT: mtlr r0 65; BE-NEXT: blr 66; 67; CHECK-LABEL: test_lrintf: 68; CHECK: # %bb.0: # %entry 69; CHECK-NEXT: mflr r0 70; CHECK-NEXT: std r0, 16(r1) 71; CHECK-NEXT: stdu r1, -32(r1) 72; CHECK-NEXT: .cfi_def_cfa_offset 32 73; CHECK-NEXT: .cfi_offset lr, 16 74; CHECK-NEXT: bl lrintf 75; CHECK-NEXT: nop 76; CHECK-NEXT: addi r1, r1, 32 77; CHECK-NEXT: ld r0, 16(r1) 78; CHECK-NEXT: mtlr r0 79; CHECK-NEXT: blr 80; 81; FAST-LABEL: test_lrintf: 82; FAST: # %bb.0: # %entry 83; FAST-NEXT: fctid f0, f1 84; FAST-NEXT: mffprd r3, f0 85; FAST-NEXT: blr 86entry: 87 %0 = tail call i64 @llvm.lrint.i64.f32(float %f) 88 ret i64 %0 89} 90 91declare i64 @llvm.lrint.i64.f32(float) 92 93define dso_local i64 @test_llrint(double %d) local_unnamed_addr { 94; BE-LABEL: test_llrint: 95; BE: # %bb.0: # %entry 96; BE-NEXT: mflr r0 97; BE-NEXT: std r0, 16(r1) 98; BE-NEXT: stdu r1, -112(r1) 99; BE-NEXT: .cfi_def_cfa_offset 112 100; BE-NEXT: .cfi_offset lr, 16 101; BE-NEXT: bl llrint 102; BE-NEXT: nop 103; BE-NEXT: addi r1, r1, 112 104; BE-NEXT: ld r0, 16(r1) 105; BE-NEXT: mtlr r0 106; BE-NEXT: blr 107; 108; CHECK-LABEL: test_llrint: 109; CHECK: # %bb.0: # %entry 110; CHECK-NEXT: mflr r0 111; CHECK-NEXT: std r0, 16(r1) 112; CHECK-NEXT: stdu r1, -32(r1) 113; CHECK-NEXT: .cfi_def_cfa_offset 32 114; CHECK-NEXT: .cfi_offset lr, 16 115; CHECK-NEXT: bl llrint 116; CHECK-NEXT: nop 117; CHECK-NEXT: addi r1, r1, 32 118; CHECK-NEXT: ld r0, 16(r1) 119; CHECK-NEXT: mtlr r0 120; CHECK-NEXT: blr 121; 122; FAST-LABEL: test_llrint: 123; FAST: # %bb.0: # %entry 124; FAST-NEXT: fctid f0, f1 125; FAST-NEXT: mffprd r3, f0 126; FAST-NEXT: blr 127entry: 128 %0 = tail call i64 @llvm.llrint.i64.f64(double %d) 129 ret i64 %0 130} 131 132declare i64 @llvm.llrint.i64.f64(double) 133 134define dso_local i64 @test_llrintf(float %f) local_unnamed_addr { 135; BE-LABEL: test_llrintf: 136; BE: # %bb.0: # %entry 137; BE-NEXT: mflr r0 138; BE-NEXT: std r0, 16(r1) 139; BE-NEXT: stdu r1, -112(r1) 140; BE-NEXT: .cfi_def_cfa_offset 112 141; BE-NEXT: .cfi_offset lr, 16 142; BE-NEXT: bl llrintf 143; BE-NEXT: nop 144; BE-NEXT: addi r1, r1, 112 145; BE-NEXT: ld r0, 16(r1) 146; BE-NEXT: mtlr r0 147; BE-NEXT: blr 148; 149; CHECK-LABEL: test_llrintf: 150; CHECK: # %bb.0: # %entry 151; CHECK-NEXT: mflr r0 152; CHECK-NEXT: std r0, 16(r1) 153; CHECK-NEXT: stdu r1, -32(r1) 154; CHECK-NEXT: .cfi_def_cfa_offset 32 155; CHECK-NEXT: .cfi_offset lr, 16 156; CHECK-NEXT: bl llrintf 157; CHECK-NEXT: nop 158; CHECK-NEXT: addi r1, r1, 32 159; CHECK-NEXT: ld r0, 16(r1) 160; CHECK-NEXT: mtlr r0 161; CHECK-NEXT: blr 162; 163; FAST-LABEL: test_llrintf: 164; FAST: # %bb.0: # %entry 165; FAST-NEXT: fctid f0, f1 166; FAST-NEXT: mffprd r3, f0 167; FAST-NEXT: blr 168entry: 169 %0 = tail call i64 @llvm.llrint.i64.f32(float %f) 170 ret i64 %0 171} 172 173declare i64 @llvm.llrint.i64.f32(float) 174 175define dso_local i64 @test_lround(double %d) local_unnamed_addr { 176; BE-LABEL: test_lround: 177; BE: # %bb.0: # %entry 178; BE-NEXT: mflr r0 179; BE-NEXT: std r0, 16(r1) 180; BE-NEXT: stdu r1, -112(r1) 181; BE-NEXT: .cfi_def_cfa_offset 112 182; BE-NEXT: .cfi_offset lr, 16 183; BE-NEXT: bl lround 184; BE-NEXT: nop 185; BE-NEXT: addi r1, r1, 112 186; BE-NEXT: ld r0, 16(r1) 187; BE-NEXT: mtlr r0 188; BE-NEXT: blr 189; 190; CHECK-LABEL: test_lround: 191; CHECK: # %bb.0: # %entry 192; CHECK-NEXT: mflr r0 193; CHECK-NEXT: std r0, 16(r1) 194; CHECK-NEXT: stdu r1, -32(r1) 195; CHECK-NEXT: .cfi_def_cfa_offset 32 196; CHECK-NEXT: .cfi_offset lr, 16 197; CHECK-NEXT: bl lround 198; CHECK-NEXT: nop 199; CHECK-NEXT: addi r1, r1, 32 200; CHECK-NEXT: ld r0, 16(r1) 201; CHECK-NEXT: mtlr r0 202; CHECK-NEXT: blr 203; 204; FAST-LABEL: test_lround: 205; FAST: # %bb.0: # %entry 206; FAST-NEXT: xsrdpi f0, f1 207; FAST-NEXT: fctid f0, f0 208; FAST-NEXT: mffprd r3, f0 209; FAST-NEXT: blr 210entry: 211 %0 = tail call i64 @llvm.lround.i64.f64(double %d) 212 ret i64 %0 213} 214 215declare i64 @llvm.lround.i64.f64(double) 216 217define dso_local i64 @test_lroundf(float %f) local_unnamed_addr { 218; BE-LABEL: test_lroundf: 219; BE: # %bb.0: # %entry 220; BE-NEXT: mflr r0 221; BE-NEXT: std r0, 16(r1) 222; BE-NEXT: stdu r1, -112(r1) 223; BE-NEXT: .cfi_def_cfa_offset 112 224; BE-NEXT: .cfi_offset lr, 16 225; BE-NEXT: bl lroundf 226; BE-NEXT: nop 227; BE-NEXT: addi r1, r1, 112 228; BE-NEXT: ld r0, 16(r1) 229; BE-NEXT: mtlr r0 230; BE-NEXT: blr 231; 232; CHECK-LABEL: test_lroundf: 233; CHECK: # %bb.0: # %entry 234; CHECK-NEXT: mflr r0 235; CHECK-NEXT: std r0, 16(r1) 236; CHECK-NEXT: stdu r1, -32(r1) 237; CHECK-NEXT: .cfi_def_cfa_offset 32 238; CHECK-NEXT: .cfi_offset lr, 16 239; CHECK-NEXT: bl lroundf 240; CHECK-NEXT: nop 241; CHECK-NEXT: addi r1, r1, 32 242; CHECK-NEXT: ld r0, 16(r1) 243; CHECK-NEXT: mtlr r0 244; CHECK-NEXT: blr 245; 246; FAST-LABEL: test_lroundf: 247; FAST: # %bb.0: # %entry 248; FAST-NEXT: xsrdpi f0, f1 249; FAST-NEXT: fctid f0, f0 250; FAST-NEXT: mffprd r3, f0 251; FAST-NEXT: blr 252entry: 253 %0 = tail call i64 @llvm.lround.i64.f32(float %f) 254 ret i64 %0 255} 256 257declare i64 @llvm.lround.i64.f32(float) 258 259define dso_local i64 @test_llround(double %d) local_unnamed_addr { 260; BE-LABEL: test_llround: 261; BE: # %bb.0: # %entry 262; BE-NEXT: mflr r0 263; BE-NEXT: std r0, 16(r1) 264; BE-NEXT: stdu r1, -112(r1) 265; BE-NEXT: .cfi_def_cfa_offset 112 266; BE-NEXT: .cfi_offset lr, 16 267; BE-NEXT: bl llround 268; BE-NEXT: nop 269; BE-NEXT: addi r1, r1, 112 270; BE-NEXT: ld r0, 16(r1) 271; BE-NEXT: mtlr r0 272; BE-NEXT: blr 273; 274; CHECK-LABEL: test_llround: 275; CHECK: # %bb.0: # %entry 276; CHECK-NEXT: mflr r0 277; CHECK-NEXT: std r0, 16(r1) 278; CHECK-NEXT: stdu r1, -32(r1) 279; CHECK-NEXT: .cfi_def_cfa_offset 32 280; CHECK-NEXT: .cfi_offset lr, 16 281; CHECK-NEXT: bl llround 282; CHECK-NEXT: nop 283; CHECK-NEXT: addi r1, r1, 32 284; CHECK-NEXT: ld r0, 16(r1) 285; CHECK-NEXT: mtlr r0 286; CHECK-NEXT: blr 287; 288; FAST-LABEL: test_llround: 289; FAST: # %bb.0: # %entry 290; FAST-NEXT: xsrdpi f0, f1 291; FAST-NEXT: fctid f0, f0 292; FAST-NEXT: mffprd r3, f0 293; FAST-NEXT: blr 294entry: 295 %0 = tail call i64 @llvm.llround.i64.f64(double %d) 296 ret i64 %0 297} 298 299declare i64 @llvm.llround.i64.f64(double) 300 301define dso_local i64 @test_llroundf(float %f) local_unnamed_addr { 302; BE-LABEL: test_llroundf: 303; BE: # %bb.0: # %entry 304; BE-NEXT: mflr r0 305; BE-NEXT: std r0, 16(r1) 306; BE-NEXT: stdu r1, -112(r1) 307; BE-NEXT: .cfi_def_cfa_offset 112 308; BE-NEXT: .cfi_offset lr, 16 309; BE-NEXT: bl llroundf 310; BE-NEXT: nop 311; BE-NEXT: addi r1, r1, 112 312; BE-NEXT: ld r0, 16(r1) 313; BE-NEXT: mtlr r0 314; BE-NEXT: blr 315; 316; CHECK-LABEL: test_llroundf: 317; CHECK: # %bb.0: # %entry 318; CHECK-NEXT: mflr r0 319; CHECK-NEXT: std r0, 16(r1) 320; CHECK-NEXT: stdu r1, -32(r1) 321; CHECK-NEXT: .cfi_def_cfa_offset 32 322; CHECK-NEXT: .cfi_offset lr, 16 323; CHECK-NEXT: bl llroundf 324; CHECK-NEXT: nop 325; CHECK-NEXT: addi r1, r1, 32 326; CHECK-NEXT: ld r0, 16(r1) 327; CHECK-NEXT: mtlr r0 328; CHECK-NEXT: blr 329; 330; FAST-LABEL: test_llroundf: 331; FAST: # %bb.0: # %entry 332; FAST-NEXT: xsrdpi f0, f1 333; FAST-NEXT: fctid f0, f0 334; FAST-NEXT: mffprd r3, f0 335; FAST-NEXT: blr 336entry: 337 %0 = tail call i64 @llvm.llround.i64.f32(float %f) 338 ret i64 %0 339} 340 341declare i64 @llvm.llround.i64.f32(float) 342 343define dso_local double @test_nearbyint(double %d) local_unnamed_addr { 344; BE-LABEL: test_nearbyint: 345; BE: # %bb.0: # %entry 346; BE: bl nearbyint 347; BE: blr 348; 349; CHECK-LABEL: test_nearbyint: 350; CHECK: # %bb.0: # %entry 351; CHECK: bl nearbyint 352; CHECK: blr 353; 354; FAST-LABEL: test_nearbyint: 355; FAST: # %bb.0: # %entry 356; FAST-NEXT: xsrdpic f1, f1 357; FAST-NEXT: blr 358entry: 359 %0 = tail call double @llvm.nearbyint.f64(double %d) 360 ret double %0 361} 362 363declare double @llvm.nearbyint.f64(double) 364 365define dso_local float @test_nearbyintf(float %f) local_unnamed_addr { 366; BE-LABEL: test_nearbyintf: 367; BE: # %bb.0: # %entry 368; BE: bl nearbyint 369; BE: blr 370; 371; CHECK-LABEL: test_nearbyintf: 372; CHECK: # %bb.0: # %entry 373; CHECK: bl nearbyintf 374; CHECK: blr 375; 376; FAST-LABEL: test_nearbyintf: 377; FAST: # %bb.0: # %entry 378; FAST-NEXT: xsrdpic f1, f1 379; FAST-NEXT: blr 380entry: 381 %0 = tail call float @llvm.nearbyint.f32(float %f) 382 ret float %0 383} 384 385declare float @llvm.nearbyint.f32(float) 386 387define dso_local double @test_round(double %d) local_unnamed_addr { 388; BE-LABEL: test_round: 389; BE: # %bb.0: # %entry 390; BE-NEXT: xsrdpi f1, f1 391; BE-NEXT: blr 392; 393; CHECK-LABEL: test_round: 394; CHECK: # %bb.0: # %entry 395; CHECK-NEXT: xsrdpi f1, f1 396; CHECK-NEXT: blr 397; 398; FAST-LABEL: test_round: 399; FAST: # %bb.0: # %entry 400; FAST-NEXT: xsrdpi f1, f1 401; FAST-NEXT: blr 402entry: 403 %0 = tail call double @llvm.round.f64(double %d) 404 ret double %0 405} 406 407declare double @llvm.round.f64(double) 408 409define dso_local float @test_roundf(float %f) local_unnamed_addr { 410; BE-LABEL: test_roundf: 411; BE: # %bb.0: # %entry 412; BE-NEXT: xsrdpi f1, f1 413; BE-NEXT: blr 414; 415; CHECK-LABEL: test_roundf: 416; CHECK: # %bb.0: # %entry 417; CHECK-NEXT: xsrdpi f1, f1 418; CHECK-NEXT: blr 419; 420; FAST-LABEL: test_roundf: 421; FAST: # %bb.0: # %entry 422; FAST-NEXT: xsrdpi f1, f1 423; FAST-NEXT: blr 424entry: 425 %0 = tail call float @llvm.round.f32(float %f) 426 ret float %0 427} 428 429declare float @llvm.round.f32(float) 430 431define dso_local double @test_trunc(double %d) local_unnamed_addr { 432; BE-LABEL: test_trunc: 433; BE: # %bb.0: # %entry 434; BE-NEXT: xsrdpiz f1, f1 435; BE-NEXT: blr 436; 437; CHECK-LABEL: test_trunc: 438; CHECK: # %bb.0: # %entry 439; CHECK-NEXT: xsrdpiz f1, f1 440; CHECK-NEXT: blr 441; 442; FAST-LABEL: test_trunc: 443; FAST: # %bb.0: # %entry 444; FAST-NEXT: xsrdpiz f1, f1 445; FAST-NEXT: blr 446entry: 447 %0 = tail call double @llvm.trunc.f64(double %d) 448 ret double %0 449} 450 451declare double @llvm.trunc.f64(double) 452 453define dso_local float @test_truncf(float %f) local_unnamed_addr { 454; BE-LABEL: test_truncf: 455; BE: # %bb.0: # %entry 456; BE-NEXT: xsrdpiz f1, f1 457; BE-NEXT: blr 458; 459; CHECK-LABEL: test_truncf: 460; CHECK: # %bb.0: # %entry 461; CHECK-NEXT: xsrdpiz f1, f1 462; CHECK-NEXT: blr 463; 464; FAST-LABEL: test_truncf: 465; FAST: # %bb.0: # %entry 466; FAST-NEXT: xsrdpiz f1, f1 467; FAST-NEXT: blr 468entry: 469 %0 = tail call float @llvm.trunc.f32(float %f) 470 ret float %0 471} 472 473declare float @llvm.trunc.f32(float) 474 475define dso_local double @test_floor(double %d) local_unnamed_addr { 476; BE-LABEL: test_floor: 477; BE: # %bb.0: # %entry 478; BE-NEXT: xsrdpim f1, f1 479; BE-NEXT: blr 480; 481; CHECK-LABEL: test_floor: 482; CHECK: # %bb.0: # %entry 483; CHECK-NEXT: xsrdpim f1, f1 484; CHECK-NEXT: blr 485; 486; FAST-LABEL: test_floor: 487; FAST: # %bb.0: # %entry 488; FAST-NEXT: xsrdpim f1, f1 489; FAST-NEXT: blr 490entry: 491 %0 = tail call double @llvm.floor.f64(double %d) 492 ret double %0 493} 494 495declare double @llvm.floor.f64(double) 496 497define dso_local float @test_floorf(float %f) local_unnamed_addr { 498; BE-LABEL: test_floorf: 499; BE: # %bb.0: # %entry 500; BE-NEXT: xsrdpim f1, f1 501; BE-NEXT: blr 502; 503; CHECK-LABEL: test_floorf: 504; CHECK: # %bb.0: # %entry 505; CHECK-NEXT: xsrdpim f1, f1 506; CHECK-NEXT: blr 507; 508; FAST-LABEL: test_floorf: 509; FAST: # %bb.0: # %entry 510; FAST-NEXT: xsrdpim f1, f1 511; FAST-NEXT: blr 512entry: 513 %0 = tail call float @llvm.floor.f32(float %f) 514 ret float %0 515} 516 517declare float @llvm.floor.f32(float) 518 519define dso_local double @test_ceil(double %d) local_unnamed_addr { 520; BE-LABEL: test_ceil: 521; BE: # %bb.0: # %entry 522; BE-NEXT: xsrdpip f1, f1 523; BE-NEXT: blr 524; 525; CHECK-LABEL: test_ceil: 526; CHECK: # %bb.0: # %entry 527; CHECK-NEXT: xsrdpip f1, f1 528; CHECK-NEXT: blr 529; 530; FAST-LABEL: test_ceil: 531; FAST: # %bb.0: # %entry 532; FAST-NEXT: xsrdpip f1, f1 533; FAST-NEXT: blr 534entry: 535 %0 = tail call double @llvm.ceil.f64(double %d) 536 ret double %0 537} 538 539declare double @llvm.ceil.f64(double) 540 541define dso_local float @test_ceilf(float %f) local_unnamed_addr { 542; BE-LABEL: test_ceilf: 543; BE: # %bb.0: # %entry 544; BE-NEXT: xsrdpip f1, f1 545; BE-NEXT: blr 546; 547; CHECK-LABEL: test_ceilf: 548; CHECK: # %bb.0: # %entry 549; CHECK-NEXT: xsrdpip f1, f1 550; CHECK-NEXT: blr 551; 552; FAST-LABEL: test_ceilf: 553; FAST: # %bb.0: # %entry 554; FAST-NEXT: xsrdpip f1, f1 555; FAST-NEXT: blr 556entry: 557 %0 = tail call float @llvm.ceil.f32(float %f) 558 ret float %0 559} 560 561declare float @llvm.ceil.f32(float) 562