1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \ 3; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \ 4; RUN: --check-prefix=P8 5; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \ 6; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s 7; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -mattr=-hard-float \ 8; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \ 9; RUN: --check-prefix=SOFT 10 11; Tests for various operations on half precison float. Much of the test is 12; copied from test/CodeGen/X86/half.ll. 13define dso_local double @loadd(ptr nocapture readonly %a) local_unnamed_addr #0 { 14; P8-LABEL: loadd: 15; P8: # %bb.0: # %entry 16; P8-NEXT: mflr r0 17; P8-NEXT: stdu r1, -32(r1) 18; P8-NEXT: std r0, 48(r1) 19; P8-NEXT: lhz r3, 2(r3) 20; P8-NEXT: bl __gnu_h2f_ieee 21; P8-NEXT: nop 22; P8-NEXT: addi r1, r1, 32 23; P8-NEXT: ld r0, 16(r1) 24; P8-NEXT: mtlr r0 25; P8-NEXT: blr 26; 27; CHECK-LABEL: loadd: 28; CHECK: # %bb.0: # %entry 29; CHECK-NEXT: addi r3, r3, 2 30; CHECK-NEXT: lxsihzx f0, 0, r3 31; CHECK-NEXT: xscvhpdp f1, f0 32; CHECK-NEXT: blr 33; 34; SOFT-LABEL: loadd: 35; SOFT: # %bb.0: # %entry 36; SOFT-NEXT: mflr r0 37; SOFT-NEXT: stdu r1, -32(r1) 38; SOFT-NEXT: std r0, 48(r1) 39; SOFT-NEXT: lhz r3, 2(r3) 40; SOFT-NEXT: bl __gnu_h2f_ieee 41; SOFT-NEXT: nop 42; SOFT-NEXT: bl __extendsfdf2 43; SOFT-NEXT: nop 44; SOFT-NEXT: addi r1, r1, 32 45; SOFT-NEXT: ld r0, 16(r1) 46; SOFT-NEXT: mtlr r0 47; SOFT-NEXT: blr 48entry: 49 %arrayidx = getelementptr inbounds i16, ptr %a, i64 1 50 %0 = load i16, ptr %arrayidx, align 2 51 %1 = tail call double @llvm.convert.from.fp16.f64(i16 %0) 52 ret double %1 53} 54 55declare double @llvm.convert.from.fp16.f64(i16) 56 57define dso_local float @loadf(ptr nocapture readonly %a) local_unnamed_addr #0 { 58; P8-LABEL: loadf: 59; P8: # %bb.0: # %entry 60; P8-NEXT: mflr r0 61; P8-NEXT: stdu r1, -32(r1) 62; P8-NEXT: std r0, 48(r1) 63; P8-NEXT: lhz r3, 2(r3) 64; P8-NEXT: bl __gnu_h2f_ieee 65; P8-NEXT: nop 66; P8-NEXT: addi r1, r1, 32 67; P8-NEXT: ld r0, 16(r1) 68; P8-NEXT: mtlr r0 69; P8-NEXT: blr 70; 71; CHECK-LABEL: loadf: 72; CHECK: # %bb.0: # %entry 73; CHECK-NEXT: addi r3, r3, 2 74; CHECK-NEXT: lxsihzx f0, 0, r3 75; CHECK-NEXT: xscvhpdp f1, f0 76; CHECK-NEXT: blr 77; 78; SOFT-LABEL: loadf: 79; SOFT: # %bb.0: # %entry 80; SOFT-NEXT: mflr r0 81; SOFT-NEXT: stdu r1, -32(r1) 82; SOFT-NEXT: std r0, 48(r1) 83; SOFT-NEXT: lhz r3, 2(r3) 84; SOFT-NEXT: bl __gnu_h2f_ieee 85; SOFT-NEXT: nop 86; SOFT-NEXT: addi r1, r1, 32 87; SOFT-NEXT: ld r0, 16(r1) 88; SOFT-NEXT: mtlr r0 89; SOFT-NEXT: blr 90entry: 91 %arrayidx = getelementptr inbounds i16, ptr %a, i64 1 92 %0 = load i16, ptr %arrayidx, align 2 93 %1 = tail call float @llvm.convert.from.fp16.f32(i16 %0) 94 ret float %1 95} 96 97declare float @llvm.convert.from.fp16.f32(i16) 98 99define dso_local void @stored(ptr nocapture %a, double %b) local_unnamed_addr #0 { 100; P8-LABEL: stored: 101; P8: # %bb.0: # %entry 102; P8-NEXT: mflr r0 103; P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 104; P8-NEXT: stdu r1, -48(r1) 105; P8-NEXT: std r0, 64(r1) 106; P8-NEXT: mr r30, r3 107; P8-NEXT: bl __truncdfhf2 108; P8-NEXT: nop 109; P8-NEXT: sth r3, 0(r30) 110; P8-NEXT: addi r1, r1, 48 111; P8-NEXT: ld r0, 16(r1) 112; P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 113; P8-NEXT: mtlr r0 114; P8-NEXT: blr 115; 116; CHECK-LABEL: stored: 117; CHECK: # %bb.0: # %entry 118; CHECK-NEXT: xscvdphp f0, f1 119; CHECK-NEXT: stxsihx f0, 0, r3 120; CHECK-NEXT: blr 121; 122; SOFT-LABEL: stored: 123; SOFT: # %bb.0: # %entry 124; SOFT-NEXT: mflr r0 125; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 126; SOFT-NEXT: stdu r1, -48(r1) 127; SOFT-NEXT: mr r30, r3 128; SOFT-NEXT: mr r3, r4 129; SOFT-NEXT: std r0, 64(r1) 130; SOFT-NEXT: bl __truncdfhf2 131; SOFT-NEXT: nop 132; SOFT-NEXT: clrldi r3, r3, 48 133; SOFT-NEXT: bl __gnu_h2f_ieee 134; SOFT-NEXT: nop 135; SOFT-NEXT: bl __gnu_f2h_ieee 136; SOFT-NEXT: nop 137; SOFT-NEXT: sth r3, 0(r30) 138; SOFT-NEXT: addi r1, r1, 48 139; SOFT-NEXT: ld r0, 16(r1) 140; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 141; SOFT-NEXT: mtlr r0 142; SOFT-NEXT: blr 143entry: 144 %0 = tail call i16 @llvm.convert.to.fp16.f64(double %b) 145 store i16 %0, ptr %a, align 2 146 ret void 147} 148 149declare i16 @llvm.convert.to.fp16.f64(double) 150 151define dso_local void @storef(ptr nocapture %a, float %b) local_unnamed_addr #0 { 152; P8-LABEL: storef: 153; P8: # %bb.0: # %entry 154; P8-NEXT: mflr r0 155; P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 156; P8-NEXT: stdu r1, -48(r1) 157; P8-NEXT: std r0, 64(r1) 158; P8-NEXT: mr r30, r3 159; P8-NEXT: bl __gnu_f2h_ieee 160; P8-NEXT: nop 161; P8-NEXT: sth r3, 0(r30) 162; P8-NEXT: addi r1, r1, 48 163; P8-NEXT: ld r0, 16(r1) 164; P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 165; P8-NEXT: mtlr r0 166; P8-NEXT: blr 167; 168; CHECK-LABEL: storef: 169; CHECK: # %bb.0: # %entry 170; CHECK-NEXT: xscvdphp f0, f1 171; CHECK-NEXT: stxsihx f0, 0, r3 172; CHECK-NEXT: blr 173; 174; SOFT-LABEL: storef: 175; SOFT: # %bb.0: # %entry 176; SOFT-NEXT: mflr r0 177; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 178; SOFT-NEXT: stdu r1, -48(r1) 179; SOFT-NEXT: mr r30, r3 180; SOFT-NEXT: clrldi r3, r4, 32 181; SOFT-NEXT: std r0, 64(r1) 182; SOFT-NEXT: bl __gnu_f2h_ieee 183; SOFT-NEXT: nop 184; SOFT-NEXT: clrldi r3, r3, 48 185; SOFT-NEXT: bl __gnu_h2f_ieee 186; SOFT-NEXT: nop 187; SOFT-NEXT: bl __gnu_f2h_ieee 188; SOFT-NEXT: nop 189; SOFT-NEXT: sth r3, 0(r30) 190; SOFT-NEXT: addi r1, r1, 48 191; SOFT-NEXT: ld r0, 16(r1) 192; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 193; SOFT-NEXT: mtlr r0 194; SOFT-NEXT: blr 195entry: 196 %0 = tail call i16 @llvm.convert.to.fp16.f32(float %b) 197 store i16 %0, ptr %a, align 2 198 ret void 199} 200 201declare i16 @llvm.convert.to.fp16.f32(float) 202define void @test_load_store(ptr %in, ptr %out) #0 { 203; P8-LABEL: test_load_store: 204; P8: # %bb.0: 205; P8-NEXT: lhz r3, 0(r3) 206; P8-NEXT: sth r3, 0(r4) 207; P8-NEXT: blr 208; 209; CHECK-LABEL: test_load_store: 210; CHECK: # %bb.0: 211; CHECK-NEXT: lhz r3, 0(r3) 212; CHECK-NEXT: sth r3, 0(r4) 213; CHECK-NEXT: blr 214; 215; SOFT-LABEL: test_load_store: 216; SOFT: # %bb.0: 217; SOFT-NEXT: mflr r0 218; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 219; SOFT-NEXT: stdu r1, -48(r1) 220; SOFT-NEXT: std r0, 64(r1) 221; SOFT-NEXT: mr r30, r4 222; SOFT-NEXT: lhz r3, 0(r3) 223; SOFT-NEXT: bl __gnu_h2f_ieee 224; SOFT-NEXT: nop 225; SOFT-NEXT: bl __gnu_f2h_ieee 226; SOFT-NEXT: nop 227; SOFT-NEXT: sth r3, 0(r30) 228; SOFT-NEXT: addi r1, r1, 48 229; SOFT-NEXT: ld r0, 16(r1) 230; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 231; SOFT-NEXT: mtlr r0 232; SOFT-NEXT: blr 233 %val = load half, ptr %in 234 store half %val, ptr %out 235 ret void 236} 237define i16 @test_bitcast_from_half(ptr %addr) #0 { 238; P8-LABEL: test_bitcast_from_half: 239; P8: # %bb.0: 240; P8-NEXT: lhz r3, 0(r3) 241; P8-NEXT: blr 242; 243; CHECK-LABEL: test_bitcast_from_half: 244; CHECK: # %bb.0: 245; CHECK-NEXT: lhz r3, 0(r3) 246; CHECK-NEXT: blr 247; 248; SOFT-LABEL: test_bitcast_from_half: 249; SOFT: # %bb.0: 250; SOFT-NEXT: lhz r3, 0(r3) 251; SOFT-NEXT: blr 252 %val = load half, ptr %addr 253 %val_int = bitcast half %val to i16 254 ret i16 %val_int 255} 256define void @test_bitcast_to_half(ptr %addr, i16 %in) #0 { 257; P8-LABEL: test_bitcast_to_half: 258; P8: # %bb.0: 259; P8-NEXT: sth r4, 0(r3) 260; P8-NEXT: blr 261; 262; CHECK-LABEL: test_bitcast_to_half: 263; CHECK: # %bb.0: 264; CHECK-NEXT: sth r4, 0(r3) 265; CHECK-NEXT: blr 266; 267; SOFT-LABEL: test_bitcast_to_half: 268; SOFT: # %bb.0: 269; SOFT-NEXT: sth r4, 0(r3) 270; SOFT-NEXT: blr 271 %val_fp = bitcast i16 %in to half 272 store half %val_fp, ptr %addr 273 ret void 274} 275define float @test_extend32(ptr %addr) #0 { 276; P8-LABEL: test_extend32: 277; P8: # %bb.0: 278; P8-NEXT: mflr r0 279; P8-NEXT: stdu r1, -32(r1) 280; P8-NEXT: std r0, 48(r1) 281; P8-NEXT: lhz r3, 0(r3) 282; P8-NEXT: bl __gnu_h2f_ieee 283; P8-NEXT: nop 284; P8-NEXT: addi r1, r1, 32 285; P8-NEXT: ld r0, 16(r1) 286; P8-NEXT: mtlr r0 287; P8-NEXT: blr 288; 289; CHECK-LABEL: test_extend32: 290; CHECK: # %bb.0: 291; CHECK-NEXT: lxsihzx f0, 0, r3 292; CHECK-NEXT: xscvhpdp f1, f0 293; CHECK-NEXT: blr 294; 295; SOFT-LABEL: test_extend32: 296; SOFT: # %bb.0: 297; SOFT-NEXT: mflr r0 298; SOFT-NEXT: stdu r1, -32(r1) 299; SOFT-NEXT: std r0, 48(r1) 300; SOFT-NEXT: lhz r3, 0(r3) 301; SOFT-NEXT: bl __gnu_h2f_ieee 302; SOFT-NEXT: nop 303; SOFT-NEXT: addi r1, r1, 32 304; SOFT-NEXT: ld r0, 16(r1) 305; SOFT-NEXT: mtlr r0 306; SOFT-NEXT: blr 307 %val16 = load half, ptr %addr 308 %val32 = fpext half %val16 to float 309 ret float %val32 310} 311define double @test_extend64(ptr %addr) #0 { 312; P8-LABEL: test_extend64: 313; P8: # %bb.0: 314; P8-NEXT: mflr r0 315; P8-NEXT: stdu r1, -32(r1) 316; P8-NEXT: std r0, 48(r1) 317; P8-NEXT: lhz r3, 0(r3) 318; P8-NEXT: bl __gnu_h2f_ieee 319; P8-NEXT: nop 320; P8-NEXT: addi r1, r1, 32 321; P8-NEXT: ld r0, 16(r1) 322; P8-NEXT: mtlr r0 323; P8-NEXT: blr 324; 325; CHECK-LABEL: test_extend64: 326; CHECK: # %bb.0: 327; CHECK-NEXT: lxsihzx f0, 0, r3 328; CHECK-NEXT: xscvhpdp f1, f0 329; CHECK-NEXT: blr 330; 331; SOFT-LABEL: test_extend64: 332; SOFT: # %bb.0: 333; SOFT-NEXT: mflr r0 334; SOFT-NEXT: stdu r1, -32(r1) 335; SOFT-NEXT: std r0, 48(r1) 336; SOFT-NEXT: lhz r3, 0(r3) 337; SOFT-NEXT: bl __gnu_h2f_ieee 338; SOFT-NEXT: nop 339; SOFT-NEXT: bl __extendsfdf2 340; SOFT-NEXT: nop 341; SOFT-NEXT: addi r1, r1, 32 342; SOFT-NEXT: ld r0, 16(r1) 343; SOFT-NEXT: mtlr r0 344; SOFT-NEXT: blr 345 %val16 = load half, ptr %addr 346 %val32 = fpext half %val16 to double 347 ret double %val32 348} 349define void @test_trunc32(float %in, ptr %addr) #0 { 350; P8-LABEL: test_trunc32: 351; P8: # %bb.0: 352; P8-NEXT: mflr r0 353; P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 354; P8-NEXT: stdu r1, -48(r1) 355; P8-NEXT: std r0, 64(r1) 356; P8-NEXT: mr r30, r4 357; P8-NEXT: bl __gnu_f2h_ieee 358; P8-NEXT: nop 359; P8-NEXT: sth r3, 0(r30) 360; P8-NEXT: addi r1, r1, 48 361; P8-NEXT: ld r0, 16(r1) 362; P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 363; P8-NEXT: mtlr r0 364; P8-NEXT: blr 365; 366; CHECK-LABEL: test_trunc32: 367; CHECK: # %bb.0: 368; CHECK-NEXT: xscvdphp f0, f1 369; CHECK-NEXT: stxsihx f0, 0, r4 370; CHECK-NEXT: blr 371; 372; SOFT-LABEL: test_trunc32: 373; SOFT: # %bb.0: 374; SOFT-NEXT: mflr r0 375; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 376; SOFT-NEXT: stdu r1, -48(r1) 377; SOFT-NEXT: clrldi r3, r3, 32 378; SOFT-NEXT: std r0, 64(r1) 379; SOFT-NEXT: mr r30, r4 380; SOFT-NEXT: bl __gnu_f2h_ieee 381; SOFT-NEXT: nop 382; SOFT-NEXT: clrldi r3, r3, 48 383; SOFT-NEXT: bl __gnu_h2f_ieee 384; SOFT-NEXT: nop 385; SOFT-NEXT: bl __gnu_f2h_ieee 386; SOFT-NEXT: nop 387; SOFT-NEXT: sth r3, 0(r30) 388; SOFT-NEXT: addi r1, r1, 48 389; SOFT-NEXT: ld r0, 16(r1) 390; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 391; SOFT-NEXT: mtlr r0 392; SOFT-NEXT: blr 393 %val16 = fptrunc float %in to half 394 store half %val16, ptr %addr 395 ret void 396} 397define void @test_trunc64(double %in, ptr %addr) #0 { 398; P8-LABEL: test_trunc64: 399; P8: # %bb.0: 400; P8-NEXT: mflr r0 401; P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 402; P8-NEXT: stdu r1, -48(r1) 403; P8-NEXT: std r0, 64(r1) 404; P8-NEXT: mr r30, r4 405; P8-NEXT: bl __truncdfhf2 406; P8-NEXT: nop 407; P8-NEXT: sth r3, 0(r30) 408; P8-NEXT: addi r1, r1, 48 409; P8-NEXT: ld r0, 16(r1) 410; P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 411; P8-NEXT: mtlr r0 412; P8-NEXT: blr 413; 414; CHECK-LABEL: test_trunc64: 415; CHECK: # %bb.0: 416; CHECK-NEXT: xscvdphp f0, f1 417; CHECK-NEXT: stxsihx f0, 0, r4 418; CHECK-NEXT: blr 419; 420; SOFT-LABEL: test_trunc64: 421; SOFT: # %bb.0: 422; SOFT-NEXT: mflr r0 423; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 424; SOFT-NEXT: stdu r1, -48(r1) 425; SOFT-NEXT: std r0, 64(r1) 426; SOFT-NEXT: mr r30, r4 427; SOFT-NEXT: bl __truncdfhf2 428; SOFT-NEXT: nop 429; SOFT-NEXT: clrldi r3, r3, 48 430; SOFT-NEXT: bl __gnu_h2f_ieee 431; SOFT-NEXT: nop 432; SOFT-NEXT: bl __gnu_f2h_ieee 433; SOFT-NEXT: nop 434; SOFT-NEXT: sth r3, 0(r30) 435; SOFT-NEXT: addi r1, r1, 48 436; SOFT-NEXT: ld r0, 16(r1) 437; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 438; SOFT-NEXT: mtlr r0 439; SOFT-NEXT: blr 440 %val16 = fptrunc double %in to half 441 store half %val16, ptr %addr 442 ret void 443} 444define i64 @test_fptosi_i64(ptr %p) #0 { 445; P8-LABEL: test_fptosi_i64: 446; P8: # %bb.0: 447; P8-NEXT: mflr r0 448; P8-NEXT: stdu r1, -32(r1) 449; P8-NEXT: std r0, 48(r1) 450; P8-NEXT: lhz r3, 0(r3) 451; P8-NEXT: bl __gnu_h2f_ieee 452; P8-NEXT: nop 453; P8-NEXT: xscvdpsxds f0, f1 454; P8-NEXT: mffprd r3, f0 455; P8-NEXT: addi r1, r1, 32 456; P8-NEXT: ld r0, 16(r1) 457; P8-NEXT: mtlr r0 458; P8-NEXT: blr 459; 460; CHECK-LABEL: test_fptosi_i64: 461; CHECK: # %bb.0: 462; CHECK-NEXT: lhz r3, 0(r3) 463; CHECK-NEXT: mtfprwz f0, r3 464; CHECK-NEXT: xscvhpdp f0, f0 465; CHECK-NEXT: xscvdpsxds f0, f0 466; CHECK-NEXT: mffprd r3, f0 467; CHECK-NEXT: blr 468; 469; SOFT-LABEL: test_fptosi_i64: 470; SOFT: # %bb.0: 471; SOFT-NEXT: mflr r0 472; SOFT-NEXT: stdu r1, -32(r1) 473; SOFT-NEXT: std r0, 48(r1) 474; SOFT-NEXT: lhz r3, 0(r3) 475; SOFT-NEXT: bl __gnu_h2f_ieee 476; SOFT-NEXT: nop 477; SOFT-NEXT: bl __fixsfdi 478; SOFT-NEXT: nop 479; SOFT-NEXT: addi r1, r1, 32 480; SOFT-NEXT: ld r0, 16(r1) 481; SOFT-NEXT: mtlr r0 482; SOFT-NEXT: blr 483 %a = load half, ptr %p, align 2 484 %r = fptosi half %a to i64 485 ret i64 %r 486} 487define void @test_sitofp_i64(i64 %a, ptr %p) #0 { 488; P8-LABEL: test_sitofp_i64: 489; P8: # %bb.0: 490; P8-NEXT: mflr r0 491; P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 492; P8-NEXT: stdu r1, -48(r1) 493; P8-NEXT: mtfprd f0, r3 494; P8-NEXT: std r0, 64(r1) 495; P8-NEXT: mr r30, r4 496; P8-NEXT: xscvsxdsp f1, f0 497; P8-NEXT: bl __gnu_f2h_ieee 498; P8-NEXT: nop 499; P8-NEXT: sth r3, 0(r30) 500; P8-NEXT: addi r1, r1, 48 501; P8-NEXT: ld r0, 16(r1) 502; P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 503; P8-NEXT: mtlr r0 504; P8-NEXT: blr 505; 506; CHECK-LABEL: test_sitofp_i64: 507; CHECK: # %bb.0: 508; CHECK-NEXT: mtfprd f0, r3 509; CHECK-NEXT: xscvsxdsp f0, f0 510; CHECK-NEXT: xscvdphp f0, f0 511; CHECK-NEXT: mffprwz r3, f0 512; CHECK-NEXT: sth r3, 0(r4) 513; CHECK-NEXT: blr 514; 515; SOFT-LABEL: test_sitofp_i64: 516; SOFT: # %bb.0: 517; SOFT-NEXT: mflr r0 518; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 519; SOFT-NEXT: stdu r1, -48(r1) 520; SOFT-NEXT: std r0, 64(r1) 521; SOFT-NEXT: mr r30, r4 522; SOFT-NEXT: bl __floatdisf 523; SOFT-NEXT: nop 524; SOFT-NEXT: clrldi r3, r3, 32 525; SOFT-NEXT: bl __gnu_f2h_ieee 526; SOFT-NEXT: nop 527; SOFT-NEXT: clrldi r3, r3, 48 528; SOFT-NEXT: bl __gnu_h2f_ieee 529; SOFT-NEXT: nop 530; SOFT-NEXT: bl __gnu_f2h_ieee 531; SOFT-NEXT: nop 532; SOFT-NEXT: sth r3, 0(r30) 533; SOFT-NEXT: addi r1, r1, 48 534; SOFT-NEXT: ld r0, 16(r1) 535; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 536; SOFT-NEXT: mtlr r0 537; SOFT-NEXT: blr 538 %r = sitofp i64 %a to half 539 store half %r, ptr %p 540 ret void 541} 542define i64 @test_fptoui_i64(ptr %p) #0 { 543; P8-LABEL: test_fptoui_i64: 544; P8: # %bb.0: 545; P8-NEXT: mflr r0 546; P8-NEXT: stdu r1, -32(r1) 547; P8-NEXT: std r0, 48(r1) 548; P8-NEXT: lhz r3, 0(r3) 549; P8-NEXT: bl __gnu_h2f_ieee 550; P8-NEXT: nop 551; P8-NEXT: xscvdpuxds f0, f1 552; P8-NEXT: mffprd r3, f0 553; P8-NEXT: addi r1, r1, 32 554; P8-NEXT: ld r0, 16(r1) 555; P8-NEXT: mtlr r0 556; P8-NEXT: blr 557; 558; CHECK-LABEL: test_fptoui_i64: 559; CHECK: # %bb.0: 560; CHECK-NEXT: lhz r3, 0(r3) 561; CHECK-NEXT: mtfprwz f0, r3 562; CHECK-NEXT: xscvhpdp f0, f0 563; CHECK-NEXT: xscvdpuxds f0, f0 564; CHECK-NEXT: mffprd r3, f0 565; CHECK-NEXT: blr 566; 567; SOFT-LABEL: test_fptoui_i64: 568; SOFT: # %bb.0: 569; SOFT-NEXT: mflr r0 570; SOFT-NEXT: stdu r1, -32(r1) 571; SOFT-NEXT: std r0, 48(r1) 572; SOFT-NEXT: lhz r3, 0(r3) 573; SOFT-NEXT: bl __gnu_h2f_ieee 574; SOFT-NEXT: nop 575; SOFT-NEXT: bl __fixunssfdi 576; SOFT-NEXT: nop 577; SOFT-NEXT: addi r1, r1, 32 578; SOFT-NEXT: ld r0, 16(r1) 579; SOFT-NEXT: mtlr r0 580; SOFT-NEXT: blr 581 %a = load half, ptr %p, align 2 582 %r = fptoui half %a to i64 583 ret i64 %r 584} 585define void @test_uitofp_i64(i64 %a, ptr %p) #0 { 586; P8-LABEL: test_uitofp_i64: 587; P8: # %bb.0: 588; P8-NEXT: mflr r0 589; P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 590; P8-NEXT: stdu r1, -48(r1) 591; P8-NEXT: mtfprd f0, r3 592; P8-NEXT: std r0, 64(r1) 593; P8-NEXT: mr r30, r4 594; P8-NEXT: xscvuxdsp f1, f0 595; P8-NEXT: bl __gnu_f2h_ieee 596; P8-NEXT: nop 597; P8-NEXT: sth r3, 0(r30) 598; P8-NEXT: addi r1, r1, 48 599; P8-NEXT: ld r0, 16(r1) 600; P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 601; P8-NEXT: mtlr r0 602; P8-NEXT: blr 603; 604; CHECK-LABEL: test_uitofp_i64: 605; CHECK: # %bb.0: 606; CHECK-NEXT: mtfprd f0, r3 607; CHECK-NEXT: xscvuxdsp f0, f0 608; CHECK-NEXT: xscvdphp f0, f0 609; CHECK-NEXT: mffprwz r3, f0 610; CHECK-NEXT: sth r3, 0(r4) 611; CHECK-NEXT: blr 612; 613; SOFT-LABEL: test_uitofp_i64: 614; SOFT: # %bb.0: 615; SOFT-NEXT: mflr r0 616; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 617; SOFT-NEXT: stdu r1, -48(r1) 618; SOFT-NEXT: std r0, 64(r1) 619; SOFT-NEXT: mr r30, r4 620; SOFT-NEXT: bl __floatundisf 621; SOFT-NEXT: nop 622; SOFT-NEXT: bl __gnu_f2h_ieee 623; SOFT-NEXT: nop 624; SOFT-NEXT: clrldi r3, r3, 48 625; SOFT-NEXT: bl __gnu_h2f_ieee 626; SOFT-NEXT: nop 627; SOFT-NEXT: bl __gnu_f2h_ieee 628; SOFT-NEXT: nop 629; SOFT-NEXT: sth r3, 0(r30) 630; SOFT-NEXT: addi r1, r1, 48 631; SOFT-NEXT: ld r0, 16(r1) 632; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 633; SOFT-NEXT: mtlr r0 634; SOFT-NEXT: blr 635 %r = uitofp i64 %a to half 636 store half %r, ptr %p 637 ret void 638} 639define <4 x float> @test_extend32_vec4(ptr %p) #0 { 640; P8-LABEL: test_extend32_vec4: 641; P8: # %bb.0: 642; P8-NEXT: mflr r0 643; P8-NEXT: stdu r1, -112(r1) 644; P8-NEXT: li r4, 48 645; P8-NEXT: std r0, 128(r1) 646; P8-NEXT: std r30, 96(r1) # 8-byte Folded Spill 647; P8-NEXT: mr r30, r3 648; P8-NEXT: lhz r3, 6(r3) 649; P8-NEXT: stxvd2x vs61, r1, r4 # 16-byte Folded Spill 650; P8-NEXT: li r4, 64 651; P8-NEXT: stxvd2x vs62, r1, r4 # 16-byte Folded Spill 652; P8-NEXT: li r4, 80 653; P8-NEXT: stxvd2x vs63, r1, r4 # 16-byte Folded Spill 654; P8-NEXT: bl __gnu_h2f_ieee 655; P8-NEXT: nop 656; P8-NEXT: lhz r3, 2(r30) 657; P8-NEXT: xxlor vs63, f1, f1 658; P8-NEXT: bl __gnu_h2f_ieee 659; P8-NEXT: nop 660; P8-NEXT: lhz r3, 4(r30) 661; P8-NEXT: xxlor vs62, f1, f1 662; P8-NEXT: bl __gnu_h2f_ieee 663; P8-NEXT: nop 664; P8-NEXT: lhz r3, 0(r30) 665; P8-NEXT: xxlor vs61, f1, f1 666; P8-NEXT: bl __gnu_h2f_ieee 667; P8-NEXT: nop 668; P8-NEXT: li r3, 80 669; P8-NEXT: xxmrghd vs0, vs61, vs1 670; P8-NEXT: xxmrghd vs1, vs63, vs62 671; P8-NEXT: ld r30, 96(r1) # 8-byte Folded Reload 672; P8-NEXT: lxvd2x vs63, r1, r3 # 16-byte Folded Reload 673; P8-NEXT: li r3, 64 674; P8-NEXT: xvcvdpsp vs34, vs0 675; P8-NEXT: xvcvdpsp vs35, vs1 676; P8-NEXT: lxvd2x vs62, r1, r3 # 16-byte Folded Reload 677; P8-NEXT: li r3, 48 678; P8-NEXT: lxvd2x vs61, r1, r3 # 16-byte Folded Reload 679; P8-NEXT: vmrgew v2, v3, v2 680; P8-NEXT: addi r1, r1, 112 681; P8-NEXT: ld r0, 16(r1) 682; P8-NEXT: mtlr r0 683; P8-NEXT: blr 684; 685; CHECK-LABEL: test_extend32_vec4: 686; CHECK: # %bb.0: 687; CHECK-NEXT: lhz r4, 6(r3) 688; CHECK-NEXT: mtfprwz f0, r4 689; CHECK-NEXT: xscvhpdp f0, f0 690; CHECK-NEXT: lhz r4, 2(r3) 691; CHECK-NEXT: mtfprwz f1, r4 692; CHECK-NEXT: xscvhpdp f1, f1 693; CHECK-NEXT: lhz r4, 4(r3) 694; CHECK-NEXT: mtfprwz f2, r4 695; CHECK-NEXT: xscvhpdp f2, f2 696; CHECK-NEXT: lhz r3, 0(r3) 697; CHECK-NEXT: xxmrghd vs0, vs0, vs1 698; CHECK-NEXT: mtfprwz f3, r3 699; CHECK-NEXT: xvcvdpsp vs35, vs0 700; CHECK-NEXT: xscvhpdp f3, f3 701; CHECK-NEXT: xxmrghd vs2, vs2, vs3 702; CHECK-NEXT: xvcvdpsp vs34, vs2 703; CHECK-NEXT: vmrgew v2, v3, v2 704; CHECK-NEXT: blr 705; 706; SOFT-LABEL: test_extend32_vec4: 707; SOFT: # %bb.0: 708; SOFT-NEXT: mflr r0 709; SOFT-NEXT: std r27, -40(r1) # 8-byte Folded Spill 710; SOFT-NEXT: std r28, -32(r1) # 8-byte Folded Spill 711; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 712; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 713; SOFT-NEXT: stdu r1, -80(r1) 714; SOFT-NEXT: std r0, 96(r1) 715; SOFT-NEXT: mr r30, r3 716; SOFT-NEXT: lhz r3, 0(r3) 717; SOFT-NEXT: bl __gnu_h2f_ieee 718; SOFT-NEXT: nop 719; SOFT-NEXT: mr r29, r3 720; SOFT-NEXT: lhz r3, 2(r30) 721; SOFT-NEXT: bl __gnu_h2f_ieee 722; SOFT-NEXT: nop 723; SOFT-NEXT: mr r28, r3 724; SOFT-NEXT: lhz r3, 4(r30) 725; SOFT-NEXT: bl __gnu_h2f_ieee 726; SOFT-NEXT: nop 727; SOFT-NEXT: mr r27, r3 728; SOFT-NEXT: lhz r3, 6(r30) 729; SOFT-NEXT: bl __gnu_h2f_ieee 730; SOFT-NEXT: nop 731; SOFT-NEXT: mr r6, r3 732; SOFT-NEXT: mr r3, r29 733; SOFT-NEXT: mr r4, r28 734; SOFT-NEXT: mr r5, r27 735; SOFT-NEXT: addi r1, r1, 80 736; SOFT-NEXT: ld r0, 16(r1) 737; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 738; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 739; SOFT-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 740; SOFT-NEXT: mtlr r0 741; SOFT-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 742; SOFT-NEXT: blr 743 %a = load <4 x half>, ptr %p, align 8 744 %b = fpext <4 x half> %a to <4 x float> 745 ret <4 x float> %b 746} 747define <4 x double> @test_extend64_vec4(ptr %p) #0 { 748; P8-LABEL: test_extend64_vec4: 749; P8: # %bb.0: 750; P8-NEXT: mflr r0 751; P8-NEXT: stdu r1, -112(r1) 752; P8-NEXT: li r4, 48 753; P8-NEXT: std r0, 128(r1) 754; P8-NEXT: std r30, 96(r1) # 8-byte Folded Spill 755; P8-NEXT: mr r30, r3 756; P8-NEXT: lhz r3, 6(r3) 757; P8-NEXT: stxvd2x vs61, r1, r4 # 16-byte Folded Spill 758; P8-NEXT: li r4, 64 759; P8-NEXT: stxvd2x vs62, r1, r4 # 16-byte Folded Spill 760; P8-NEXT: li r4, 80 761; P8-NEXT: stxvd2x vs63, r1, r4 # 16-byte Folded Spill 762; P8-NEXT: bl __gnu_h2f_ieee 763; P8-NEXT: nop 764; P8-NEXT: lhz r3, 4(r30) 765; P8-NEXT: xxlor vs63, f1, f1 766; P8-NEXT: bl __gnu_h2f_ieee 767; P8-NEXT: nop 768; P8-NEXT: lhz r3, 2(r30) 769; P8-NEXT: xxlor vs62, f1, f1 770; P8-NEXT: bl __gnu_h2f_ieee 771; P8-NEXT: nop 772; P8-NEXT: lhz r3, 0(r30) 773; P8-NEXT: xxlor vs61, f1, f1 774; P8-NEXT: bl __gnu_h2f_ieee 775; P8-NEXT: nop 776; P8-NEXT: li r3, 80 777; P8-NEXT: xxmrghd vs35, vs63, vs62 778; P8-NEXT: xxmrghd vs34, vs61, vs1 779; P8-NEXT: ld r30, 96(r1) # 8-byte Folded Reload 780; P8-NEXT: lxvd2x vs63, r1, r3 # 16-byte Folded Reload 781; P8-NEXT: li r3, 64 782; P8-NEXT: lxvd2x vs62, r1, r3 # 16-byte Folded Reload 783; P8-NEXT: li r3, 48 784; P8-NEXT: lxvd2x vs61, r1, r3 # 16-byte Folded Reload 785; P8-NEXT: addi r1, r1, 112 786; P8-NEXT: ld r0, 16(r1) 787; P8-NEXT: mtlr r0 788; P8-NEXT: blr 789; 790; CHECK-LABEL: test_extend64_vec4: 791; CHECK: # %bb.0: 792; CHECK-NEXT: lhz r4, 6(r3) 793; CHECK-NEXT: lhz r5, 4(r3) 794; CHECK-NEXT: lhz r6, 2(r3) 795; CHECK-NEXT: lhz r3, 0(r3) 796; CHECK-NEXT: mtfprwz f0, r3 797; CHECK-NEXT: mtfprwz f1, r6 798; CHECK-NEXT: xscvhpdp f0, f0 799; CHECK-NEXT: xscvhpdp f1, f1 800; CHECK-NEXT: xxmrghd vs34, vs1, vs0 801; CHECK-NEXT: mtfprwz f0, r5 802; CHECK-NEXT: mtfprwz f1, r4 803; CHECK-NEXT: xscvhpdp f0, f0 804; CHECK-NEXT: xscvhpdp f1, f1 805; CHECK-NEXT: xxmrghd vs35, vs1, vs0 806; CHECK-NEXT: blr 807; 808; SOFT-LABEL: test_extend64_vec4: 809; SOFT: # %bb.0: 810; SOFT-NEXT: mflr r0 811; SOFT-NEXT: std r27, -40(r1) # 8-byte Folded Spill 812; SOFT-NEXT: std r28, -32(r1) # 8-byte Folded Spill 813; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 814; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 815; SOFT-NEXT: stdu r1, -80(r1) 816; SOFT-NEXT: std r0, 96(r1) 817; SOFT-NEXT: mr r30, r3 818; SOFT-NEXT: lhz r3, 0(r3) 819; SOFT-NEXT: bl __gnu_h2f_ieee 820; SOFT-NEXT: nop 821; SOFT-NEXT: bl __extendsfdf2 822; SOFT-NEXT: nop 823; SOFT-NEXT: mr r29, r3 824; SOFT-NEXT: lhz r3, 2(r30) 825; SOFT-NEXT: bl __gnu_h2f_ieee 826; SOFT-NEXT: nop 827; SOFT-NEXT: bl __extendsfdf2 828; SOFT-NEXT: nop 829; SOFT-NEXT: mr r28, r3 830; SOFT-NEXT: lhz r3, 4(r30) 831; SOFT-NEXT: bl __gnu_h2f_ieee 832; SOFT-NEXT: nop 833; SOFT-NEXT: bl __extendsfdf2 834; SOFT-NEXT: nop 835; SOFT-NEXT: mr r27, r3 836; SOFT-NEXT: lhz r3, 6(r30) 837; SOFT-NEXT: bl __gnu_h2f_ieee 838; SOFT-NEXT: nop 839; SOFT-NEXT: bl __extendsfdf2 840; SOFT-NEXT: nop 841; SOFT-NEXT: mr r6, r3 842; SOFT-NEXT: mr r3, r29 843; SOFT-NEXT: mr r4, r28 844; SOFT-NEXT: mr r5, r27 845; SOFT-NEXT: addi r1, r1, 80 846; SOFT-NEXT: ld r0, 16(r1) 847; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 848; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 849; SOFT-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 850; SOFT-NEXT: mtlr r0 851; SOFT-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 852; SOFT-NEXT: blr 853 %a = load <4 x half>, ptr %p, align 8 854 %b = fpext <4 x half> %a to <4 x double> 855 ret <4 x double> %b 856} 857define void @test_trunc32_vec4(<4 x float> %a, ptr %p) #0 { 858; P8-LABEL: test_trunc32_vec4: 859; P8: # %bb.0: 860; P8-NEXT: mflr r0 861; P8-NEXT: stdu r1, -112(r1) 862; P8-NEXT: xxsldwi vs0, vs34, vs34, 3 863; P8-NEXT: li r3, 48 864; P8-NEXT: std r0, 128(r1) 865; P8-NEXT: std r27, 72(r1) # 8-byte Folded Spill 866; P8-NEXT: std r28, 80(r1) # 8-byte Folded Spill 867; P8-NEXT: std r29, 88(r1) # 8-byte Folded Spill 868; P8-NEXT: xscvspdpn f1, vs0 869; P8-NEXT: std r30, 96(r1) # 8-byte Folded Spill 870; P8-NEXT: stxvd2x vs63, r1, r3 # 16-byte Folded Spill 871; P8-NEXT: mr r30, r5 872; P8-NEXT: vmr v31, v2 873; P8-NEXT: bl __gnu_f2h_ieee 874; P8-NEXT: nop 875; P8-NEXT: xxswapd vs0, vs63 876; P8-NEXT: mr r29, r3 877; P8-NEXT: xscvspdpn f1, vs0 878; P8-NEXT: bl __gnu_f2h_ieee 879; P8-NEXT: nop 880; P8-NEXT: xxsldwi vs0, vs63, vs63, 1 881; P8-NEXT: mr r28, r3 882; P8-NEXT: xscvspdpn f1, vs0 883; P8-NEXT: bl __gnu_f2h_ieee 884; P8-NEXT: nop 885; P8-NEXT: xscvspdpn f1, vs63 886; P8-NEXT: mr r27, r3 887; P8-NEXT: bl __gnu_f2h_ieee 888; P8-NEXT: nop 889; P8-NEXT: sth r3, 6(r30) 890; P8-NEXT: li r3, 48 891; P8-NEXT: sth r27, 4(r30) 892; P8-NEXT: ld r27, 72(r1) # 8-byte Folded Reload 893; P8-NEXT: sth r28, 2(r30) 894; P8-NEXT: sth r29, 0(r30) 895; P8-NEXT: ld r30, 96(r1) # 8-byte Folded Reload 896; P8-NEXT: ld r29, 88(r1) # 8-byte Folded Reload 897; P8-NEXT: lxvd2x vs63, r1, r3 # 16-byte Folded Reload 898; P8-NEXT: ld r28, 80(r1) # 8-byte Folded Reload 899; P8-NEXT: addi r1, r1, 112 900; P8-NEXT: ld r0, 16(r1) 901; P8-NEXT: mtlr r0 902; P8-NEXT: blr 903; 904; CHECK-LABEL: test_trunc32_vec4: 905; CHECK: # %bb.0: 906; CHECK-NEXT: xxsldwi vs0, vs34, vs34, 3 907; CHECK-NEXT: xxsldwi vs1, vs34, vs34, 1 908; CHECK-NEXT: xscvspdpn f0, vs0 909; CHECK-NEXT: xscvspdpn f1, vs1 910; CHECK-NEXT: xscvdphp f0, f0 911; CHECK-NEXT: mffprwz r3, f0 912; CHECK-NEXT: xxswapd vs0, vs34 913; CHECK-NEXT: xscvspdpn f0, vs0 914; CHECK-NEXT: xscvdphp f0, f0 915; CHECK-NEXT: xscvdphp f1, f1 916; CHECK-NEXT: mffprwz r4, f1 917; CHECK-NEXT: xscvspdpn f1, vs34 918; CHECK-NEXT: xscvdphp f1, f1 919; CHECK-NEXT: sth r4, 4(r5) 920; CHECK-NEXT: mffprwz r4, f0 921; CHECK-NEXT: sth r3, 0(r5) 922; CHECK-NEXT: sth r4, 2(r5) 923; CHECK-NEXT: mffprwz r6, f1 924; CHECK-NEXT: sth r6, 6(r5) 925; CHECK-NEXT: blr 926; 927; SOFT-LABEL: test_trunc32_vec4: 928; SOFT: # %bb.0: 929; SOFT-NEXT: mflr r0 930; SOFT-NEXT: std r26, -48(r1) # 8-byte Folded Spill 931; SOFT-NEXT: std r27, -40(r1) # 8-byte Folded Spill 932; SOFT-NEXT: std r28, -32(r1) # 8-byte Folded Spill 933; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 934; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 935; SOFT-NEXT: stdu r1, -80(r1) 936; SOFT-NEXT: mr r27, r3 937; SOFT-NEXT: clrldi r3, r6, 32 938; SOFT-NEXT: std r0, 96(r1) 939; SOFT-NEXT: mr r30, r7 940; SOFT-NEXT: mr r29, r5 941; SOFT-NEXT: mr r28, r4 942; SOFT-NEXT: bl __gnu_f2h_ieee 943; SOFT-NEXT: nop 944; SOFT-NEXT: mr r26, r3 945; SOFT-NEXT: clrldi r3, r29, 32 946; SOFT-NEXT: bl __gnu_f2h_ieee 947; SOFT-NEXT: nop 948; SOFT-NEXT: mr r29, r3 949; SOFT-NEXT: clrldi r3, r28, 32 950; SOFT-NEXT: bl __gnu_f2h_ieee 951; SOFT-NEXT: nop 952; SOFT-NEXT: mr r28, r3 953; SOFT-NEXT: clrldi r3, r27, 32 954; SOFT-NEXT: bl __gnu_f2h_ieee 955; SOFT-NEXT: nop 956; SOFT-NEXT: clrldi r3, r3, 48 957; SOFT-NEXT: bl __gnu_h2f_ieee 958; SOFT-NEXT: nop 959; SOFT-NEXT: mr r27, r3 960; SOFT-NEXT: clrldi r3, r28, 48 961; SOFT-NEXT: bl __gnu_h2f_ieee 962; SOFT-NEXT: nop 963; SOFT-NEXT: mr r28, r3 964; SOFT-NEXT: clrldi r3, r29, 48 965; SOFT-NEXT: bl __gnu_h2f_ieee 966; SOFT-NEXT: nop 967; SOFT-NEXT: mr r29, r3 968; SOFT-NEXT: clrldi r3, r26, 48 969; SOFT-NEXT: bl __gnu_h2f_ieee 970; SOFT-NEXT: nop 971; SOFT-NEXT: bl __gnu_f2h_ieee 972; SOFT-NEXT: nop 973; SOFT-NEXT: sth r3, 6(r30) 974; SOFT-NEXT: mr r3, r29 975; SOFT-NEXT: bl __gnu_f2h_ieee 976; SOFT-NEXT: nop 977; SOFT-NEXT: sth r3, 4(r30) 978; SOFT-NEXT: mr r3, r28 979; SOFT-NEXT: bl __gnu_f2h_ieee 980; SOFT-NEXT: nop 981; SOFT-NEXT: sth r3, 2(r30) 982; SOFT-NEXT: mr r3, r27 983; SOFT-NEXT: bl __gnu_f2h_ieee 984; SOFT-NEXT: nop 985; SOFT-NEXT: sth r3, 0(r30) 986; SOFT-NEXT: addi r1, r1, 80 987; SOFT-NEXT: ld r0, 16(r1) 988; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 989; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 990; SOFT-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 991; SOFT-NEXT: mtlr r0 992; SOFT-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 993; SOFT-NEXT: ld r26, -48(r1) # 8-byte Folded Reload 994; SOFT-NEXT: blr 995 %v = fptrunc <4 x float> %a to <4 x half> 996 store <4 x half> %v, ptr %p 997 ret void 998} 999define void @test_trunc64_vec4(<4 x double> %a, ptr %p) #0 { 1000; P8-LABEL: test_trunc64_vec4: 1001; P8: # %bb.0: 1002; P8-NEXT: mflr r0 1003; P8-NEXT: stdu r1, -128(r1) 1004; P8-NEXT: li r3, 48 1005; P8-NEXT: std r0, 144(r1) 1006; P8-NEXT: xxswapd vs1, vs34 1007; P8-NEXT: std r27, 88(r1) # 8-byte Folded Spill 1008; P8-NEXT: std r28, 96(r1) # 8-byte Folded Spill 1009; P8-NEXT: std r29, 104(r1) # 8-byte Folded Spill 1010; P8-NEXT: std r30, 112(r1) # 8-byte Folded Spill 1011; P8-NEXT: mr r30, r7 1012; P8-NEXT: stxvd2x vs62, r1, r3 # 16-byte Folded Spill 1013; P8-NEXT: li r3, 64 1014; P8-NEXT: vmr v30, v2 1015; P8-NEXT: stxvd2x vs63, r1, r3 # 16-byte Folded Spill 1016; P8-NEXT: vmr v31, v3 1017; P8-NEXT: bl __truncdfhf2 1018; P8-NEXT: nop 1019; P8-NEXT: xxswapd vs1, vs63 1020; P8-NEXT: mr r29, r3 1021; P8-NEXT: bl __truncdfhf2 1022; P8-NEXT: nop 1023; P8-NEXT: xxlor f1, vs62, vs62 1024; P8-NEXT: mr r28, r3 1025; P8-NEXT: bl __truncdfhf2 1026; P8-NEXT: nop 1027; P8-NEXT: xxlor f1, vs63, vs63 1028; P8-NEXT: mr r27, r3 1029; P8-NEXT: bl __truncdfhf2 1030; P8-NEXT: nop 1031; P8-NEXT: sth r3, 6(r30) 1032; P8-NEXT: li r3, 64 1033; P8-NEXT: sth r27, 2(r30) 1034; P8-NEXT: ld r27, 88(r1) # 8-byte Folded Reload 1035; P8-NEXT: sth r28, 4(r30) 1036; P8-NEXT: sth r29, 0(r30) 1037; P8-NEXT: ld r30, 112(r1) # 8-byte Folded Reload 1038; P8-NEXT: ld r29, 104(r1) # 8-byte Folded Reload 1039; P8-NEXT: lxvd2x vs63, r1, r3 # 16-byte Folded Reload 1040; P8-NEXT: li r3, 48 1041; P8-NEXT: ld r28, 96(r1) # 8-byte Folded Reload 1042; P8-NEXT: lxvd2x vs62, r1, r3 # 16-byte Folded Reload 1043; P8-NEXT: addi r1, r1, 128 1044; P8-NEXT: ld r0, 16(r1) 1045; P8-NEXT: mtlr r0 1046; P8-NEXT: blr 1047; 1048; CHECK-LABEL: test_trunc64_vec4: 1049; CHECK: # %bb.0: 1050; CHECK-NEXT: xxswapd vs0, vs34 1051; CHECK-NEXT: xscvdphp f0, f0 1052; CHECK-NEXT: mffprwz r3, f0 1053; CHECK-NEXT: xxswapd vs0, vs35 1054; CHECK-NEXT: xscvdphp f0, f0 1055; CHECK-NEXT: xscvdphp f1, vs34 1056; CHECK-NEXT: mffprwz r4, f1 1057; CHECK-NEXT: xscvdphp f1, vs35 1058; CHECK-NEXT: sth r3, 0(r7) 1059; CHECK-NEXT: sth r4, 2(r7) 1060; CHECK-NEXT: mffprwz r4, f0 1061; CHECK-NEXT: sth r4, 4(r7) 1062; CHECK-NEXT: mffprwz r5, f1 1063; CHECK-NEXT: sth r5, 6(r7) 1064; CHECK-NEXT: blr 1065; 1066; SOFT-LABEL: test_trunc64_vec4: 1067; SOFT: # %bb.0: 1068; SOFT-NEXT: mflr r0 1069; SOFT-NEXT: std r26, -48(r1) # 8-byte Folded Spill 1070; SOFT-NEXT: std r27, -40(r1) # 8-byte Folded Spill 1071; SOFT-NEXT: std r28, -32(r1) # 8-byte Folded Spill 1072; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 1073; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 1074; SOFT-NEXT: stdu r1, -80(r1) 1075; SOFT-NEXT: mr r27, r3 1076; SOFT-NEXT: mr r3, r6 1077; SOFT-NEXT: std r0, 96(r1) 1078; SOFT-NEXT: mr r30, r7 1079; SOFT-NEXT: mr r29, r5 1080; SOFT-NEXT: mr r28, r4 1081; SOFT-NEXT: bl __truncdfhf2 1082; SOFT-NEXT: nop 1083; SOFT-NEXT: mr r26, r3 1084; SOFT-NEXT: mr r3, r29 1085; SOFT-NEXT: bl __truncdfhf2 1086; SOFT-NEXT: nop 1087; SOFT-NEXT: mr r29, r3 1088; SOFT-NEXT: mr r3, r28 1089; SOFT-NEXT: bl __truncdfhf2 1090; SOFT-NEXT: nop 1091; SOFT-NEXT: mr r28, r3 1092; SOFT-NEXT: mr r3, r27 1093; SOFT-NEXT: bl __truncdfhf2 1094; SOFT-NEXT: nop 1095; SOFT-NEXT: clrldi r3, r3, 48 1096; SOFT-NEXT: bl __gnu_h2f_ieee 1097; SOFT-NEXT: nop 1098; SOFT-NEXT: mr r27, r3 1099; SOFT-NEXT: clrldi r3, r28, 48 1100; SOFT-NEXT: bl __gnu_h2f_ieee 1101; SOFT-NEXT: nop 1102; SOFT-NEXT: mr r28, r3 1103; SOFT-NEXT: clrldi r3, r29, 48 1104; SOFT-NEXT: bl __gnu_h2f_ieee 1105; SOFT-NEXT: nop 1106; SOFT-NEXT: mr r29, r3 1107; SOFT-NEXT: clrldi r3, r26, 48 1108; SOFT-NEXT: bl __gnu_h2f_ieee 1109; SOFT-NEXT: nop 1110; SOFT-NEXT: bl __gnu_f2h_ieee 1111; SOFT-NEXT: nop 1112; SOFT-NEXT: sth r3, 6(r30) 1113; SOFT-NEXT: mr r3, r29 1114; SOFT-NEXT: bl __gnu_f2h_ieee 1115; SOFT-NEXT: nop 1116; SOFT-NEXT: sth r3, 4(r30) 1117; SOFT-NEXT: mr r3, r28 1118; SOFT-NEXT: bl __gnu_f2h_ieee 1119; SOFT-NEXT: nop 1120; SOFT-NEXT: sth r3, 2(r30) 1121; SOFT-NEXT: mr r3, r27 1122; SOFT-NEXT: bl __gnu_f2h_ieee 1123; SOFT-NEXT: nop 1124; SOFT-NEXT: sth r3, 0(r30) 1125; SOFT-NEXT: addi r1, r1, 80 1126; SOFT-NEXT: ld r0, 16(r1) 1127; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 1128; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 1129; SOFT-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 1130; SOFT-NEXT: mtlr r0 1131; SOFT-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 1132; SOFT-NEXT: ld r26, -48(r1) # 8-byte Folded Reload 1133; SOFT-NEXT: blr 1134 %v = fptrunc <4 x double> %a to <4 x half> 1135 store <4 x half> %v, ptr %p 1136 ret void 1137} 1138define float @test_sitofp_fadd_i32(i32 %a, ptr %b) #0 { 1139; P8-LABEL: test_sitofp_fadd_i32: 1140; P8: # %bb.0: 1141; P8-NEXT: mflr r0 1142; P8-NEXT: std r30, -24(r1) # 8-byte Folded Spill 1143; P8-NEXT: stfd f31, -8(r1) # 8-byte Folded Spill 1144; P8-NEXT: stdu r1, -64(r1) 1145; P8-NEXT: std r0, 80(r1) 1146; P8-NEXT: mr r30, r3 1147; P8-NEXT: lhz r3, 0(r4) 1148; P8-NEXT: bl __gnu_h2f_ieee 1149; P8-NEXT: nop 1150; P8-NEXT: mtfprwa f0, r30 1151; P8-NEXT: fmr f31, f1 1152; P8-NEXT: xscvsxdsp f1, f0 1153; P8-NEXT: bl __gnu_f2h_ieee 1154; P8-NEXT: nop 1155; P8-NEXT: clrldi r3, r3, 48 1156; P8-NEXT: bl __gnu_h2f_ieee 1157; P8-NEXT: nop 1158; P8-NEXT: xsaddsp f1, f31, f1 1159; P8-NEXT: addi r1, r1, 64 1160; P8-NEXT: ld r0, 16(r1) 1161; P8-NEXT: lfd f31, -8(r1) # 8-byte Folded Reload 1162; P8-NEXT: ld r30, -24(r1) # 8-byte Folded Reload 1163; P8-NEXT: mtlr r0 1164; P8-NEXT: blr 1165; 1166; CHECK-LABEL: test_sitofp_fadd_i32: 1167; CHECK: # %bb.0: 1168; CHECK-NEXT: mtfprwa f1, r3 1169; CHECK-NEXT: lhz r4, 0(r4) 1170; CHECK-NEXT: xscvsxdsp f1, f1 1171; CHECK-NEXT: mtfprwz f0, r4 1172; CHECK-NEXT: xscvhpdp f0, f0 1173; CHECK-NEXT: xscvdphp f1, f1 1174; CHECK-NEXT: mffprwz r3, f1 1175; CHECK-NEXT: clrlwi r3, r3, 16 1176; CHECK-NEXT: mtfprwz f1, r3 1177; CHECK-NEXT: xscvhpdp f1, f1 1178; CHECK-NEXT: xsaddsp f1, f0, f1 1179; CHECK-NEXT: blr 1180; 1181; SOFT-LABEL: test_sitofp_fadd_i32: 1182; SOFT: # %bb.0: 1183; SOFT-NEXT: mflr r0 1184; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 1185; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 1186; SOFT-NEXT: stdu r1, -64(r1) 1187; SOFT-NEXT: std r0, 80(r1) 1188; SOFT-NEXT: mr r30, r3 1189; SOFT-NEXT: lhz r3, 0(r4) 1190; SOFT-NEXT: bl __gnu_h2f_ieee 1191; SOFT-NEXT: nop 1192; SOFT-NEXT: mr r29, r3 1193; SOFT-NEXT: extsw r3, r30 1194; SOFT-NEXT: bl __floatsisf 1195; SOFT-NEXT: nop 1196; SOFT-NEXT: clrldi r3, r3, 32 1197; SOFT-NEXT: bl __gnu_f2h_ieee 1198; SOFT-NEXT: nop 1199; SOFT-NEXT: clrldi r3, r3, 48 1200; SOFT-NEXT: bl __gnu_h2f_ieee 1201; SOFT-NEXT: nop 1202; SOFT-NEXT: mr r4, r3 1203; SOFT-NEXT: mr r3, r29 1204; SOFT-NEXT: bl __addsf3 1205; SOFT-NEXT: nop 1206; SOFT-NEXT: addi r1, r1, 64 1207; SOFT-NEXT: ld r0, 16(r1) 1208; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 1209; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 1210; SOFT-NEXT: mtlr r0 1211; SOFT-NEXT: blr 1212 %tmp0 = load half, ptr %b 1213 %tmp1 = sitofp i32 %a to half 1214 %tmp2 = fadd half %tmp0, %tmp1 1215 %tmp3 = fpext half %tmp2 to float 1216 ret float %tmp3 1217} 1218define half @PR40273(half) #0 { 1219; P8-LABEL: PR40273: 1220; P8: # %bb.0: 1221; P8-NEXT: mflr r0 1222; P8-NEXT: stdu r1, -32(r1) 1223; P8-NEXT: std r0, 48(r1) 1224; P8-NEXT: bl __gnu_f2h_ieee 1225; P8-NEXT: nop 1226; P8-NEXT: clrldi r3, r3, 48 1227; P8-NEXT: bl __gnu_h2f_ieee 1228; P8-NEXT: nop 1229; P8-NEXT: fmr f0, f1 1230; P8-NEXT: xxlxor f1, f1, f1 1231; P8-NEXT: fcmpu cr0, f0, f1 1232; P8-NEXT: beq cr0, .LBB20_2 1233; P8-NEXT: # %bb.1: 1234; P8-NEXT: vspltisw v2, 1 1235; P8-NEXT: xvcvsxwdp vs1, vs34 1236; P8-NEXT: .LBB20_2: 1237; P8-NEXT: addi r1, r1, 32 1238; P8-NEXT: ld r0, 16(r1) 1239; P8-NEXT: mtlr r0 1240; P8-NEXT: blr 1241; 1242; CHECK-LABEL: PR40273: 1243; CHECK: # %bb.0: 1244; CHECK-NEXT: xscvdphp f0, f1 1245; CHECK-NEXT: xxlxor f1, f1, f1 1246; CHECK-NEXT: mffprwz r3, f0 1247; CHECK-NEXT: clrlwi r3, r3, 16 1248; CHECK-NEXT: mtfprwz f0, r3 1249; CHECK-NEXT: xscvhpdp f0, f0 1250; CHECK-NEXT: fcmpu cr0, f0, f1 1251; CHECK-NEXT: beqlr cr0 1252; CHECK-NEXT: # %bb.1: 1253; CHECK-NEXT: vspltisw v2, 1 1254; CHECK-NEXT: xvcvsxwdp vs1, vs34 1255; CHECK-NEXT: blr 1256; 1257; SOFT-LABEL: PR40273: 1258; SOFT: # %bb.0: 1259; SOFT-NEXT: mflr r0 1260; SOFT-NEXT: stdu r1, -32(r1) 1261; SOFT-NEXT: clrldi r3, r3, 48 1262; SOFT-NEXT: std r0, 48(r1) 1263; SOFT-NEXT: bl __gnu_h2f_ieee 1264; SOFT-NEXT: nop 1265; SOFT-NEXT: li r4, 0 1266; SOFT-NEXT: bl __nesf2 1267; SOFT-NEXT: nop 1268; SOFT-NEXT: cmplwi r3, 0 1269; SOFT-NEXT: lis r3, 16256 1270; SOFT-NEXT: iseleq r3, 0, r3 1271; SOFT-NEXT: bl __gnu_f2h_ieee 1272; SOFT-NEXT: nop 1273; SOFT-NEXT: addi r1, r1, 32 1274; SOFT-NEXT: ld r0, 16(r1) 1275; SOFT-NEXT: mtlr r0 1276; SOFT-NEXT: blr 1277 %2 = fcmp une half %0, 0xH0000 1278 %3 = uitofp i1 %2 to half 1279 ret half %3 1280} 1281attributes #0 = { nounwind } 1282