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(i16* nocapture readonly %a) local_unnamed_addr #0 { 14; P8-LABEL: loadd: 15; P8: # %bb.0: # %entry 16; P8-NEXT: mflr r0 17; P8-NEXT: std r0, 16(r1) 18; P8-NEXT: stdu r1, -32(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: std r0, 16(r1) 38; SOFT-NEXT: stdu r1, -32(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, i16* %a, i64 1 50 %0 = load i16, i16* %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(i16* nocapture readonly %a) local_unnamed_addr #0 { 58; P8-LABEL: loadf: 59; P8: # %bb.0: # %entry 60; P8-NEXT: mflr r0 61; P8-NEXT: std r0, 16(r1) 62; P8-NEXT: stdu r1, -32(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: std r0, 16(r1) 82; SOFT-NEXT: stdu r1, -32(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, i16* %a, i64 1 92 %0 = load i16, i16* %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(i16* 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: std r0, 16(r1) 105; P8-NEXT: stdu r1, -48(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: std r0, 16(r1) 127; SOFT-NEXT: stdu r1, -48(r1) 128; SOFT-NEXT: mr r30, r3 129; SOFT-NEXT: mr r3, r4 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, i16* %a, align 2 146 ret void 147} 148 149declare i16 @llvm.convert.to.fp16.f64(double) 150 151define dso_local void @storef(i16* 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: std r0, 16(r1) 157; P8-NEXT: stdu r1, -48(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: std r0, 16(r1) 179; SOFT-NEXT: stdu r1, -48(r1) 180; SOFT-NEXT: mr r30, r3 181; SOFT-NEXT: clrldi r3, r4, 32 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, i16* %a, align 2 198 ret void 199} 200 201declare i16 @llvm.convert.to.fp16.f32(float) 202define void @test_load_store(half* %in, half* %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: std r0, 16(r1) 220; SOFT-NEXT: stdu r1, -48(r1) 221; SOFT-NEXT: lhz r3, 0(r3) 222; SOFT-NEXT: mr r30, r4 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, half* %in 234 store half %val, half* %out 235 ret void 236} 237define i16 @test_bitcast_from_half(half* %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, half* %addr 253 %val_int = bitcast half %val to i16 254 ret i16 %val_int 255} 256define void @test_bitcast_to_half(half* %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, half* %addr 273 ret void 274} 275define float @test_extend32(half* %addr) #0 { 276; P8-LABEL: test_extend32: 277; P8: # %bb.0: 278; P8-NEXT: mflr r0 279; P8-NEXT: std r0, 16(r1) 280; P8-NEXT: stdu r1, -32(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: std r0, 16(r1) 299; SOFT-NEXT: stdu r1, -32(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, half* %addr 308 %val32 = fpext half %val16 to float 309 ret float %val32 310} 311define double @test_extend64(half* %addr) #0 { 312; P8-LABEL: test_extend64: 313; P8: # %bb.0: 314; P8-NEXT: mflr r0 315; P8-NEXT: std r0, 16(r1) 316; P8-NEXT: stdu r1, -32(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: std r0, 16(r1) 335; SOFT-NEXT: stdu r1, -32(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, half* %addr 346 %val32 = fpext half %val16 to double 347 ret double %val32 348} 349define void @test_trunc32(float %in, half* %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: std r0, 16(r1) 355; P8-NEXT: stdu r1, -48(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: std r0, 16(r1) 377; SOFT-NEXT: stdu r1, -48(r1) 378; SOFT-NEXT: clrldi r3, r3, 32 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, half* %addr 395 ret void 396} 397define void @test_trunc64(double %in, half* %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: std r0, 16(r1) 403; P8-NEXT: stdu r1, -48(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: std r0, 16(r1) 425; SOFT-NEXT: stdu r1, -48(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, half* %addr 442 ret void 443} 444define i64 @test_fptosi_i64(half* %p) #0 { 445; P8-LABEL: test_fptosi_i64: 446; P8: # %bb.0: 447; P8-NEXT: mflr r0 448; P8-NEXT: std r0, 16(r1) 449; P8-NEXT: stdu r1, -32(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: std r0, 16(r1) 473; SOFT-NEXT: stdu r1, -32(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, half* %p, align 2 484 %r = fptosi half %a to i64 485 ret i64 %r 486} 487define void @test_sitofp_i64(i64 %a, half* %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: std r0, 16(r1) 493; P8-NEXT: stdu r1, -48(r1) 494; P8-NEXT: mtfprd f0, r3 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: std r0, 16(r1) 520; SOFT-NEXT: stdu r1, -48(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, half* %p 540 ret void 541} 542define i64 @test_fptoui_i64(half* %p) #0 { 543; P8-LABEL: test_fptoui_i64: 544; P8: # %bb.0: 545; P8-NEXT: mflr r0 546; P8-NEXT: std r0, 16(r1) 547; P8-NEXT: stdu r1, -32(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: std r0, 16(r1) 571; SOFT-NEXT: stdu r1, -32(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, half* %p, align 2 582 %r = fptoui half %a to i64 583 ret i64 %r 584} 585define void @test_uitofp_i64(i64 %a, half* %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: std r0, 16(r1) 591; P8-NEXT: stdu r1, -48(r1) 592; P8-NEXT: mtfprd f0, r3 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: std r0, 16(r1) 618; SOFT-NEXT: stdu r1, -48(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, half* %p 637 ret void 638} 639define <4 x float> @test_extend32_vec4(<4 x half>* %p) #0 { 640; P8-LABEL: test_extend32_vec4: 641; P8: # %bb.0: 642; P8-NEXT: mflr r0 643; P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 644; P8-NEXT: std r0, 16(r1) 645; P8-NEXT: stdu r1, -112(r1) 646; P8-NEXT: mr r30, r3 647; P8-NEXT: lhz r3, 6(r3) 648; P8-NEXT: bl __gnu_h2f_ieee 649; P8-NEXT: nop 650; P8-NEXT: li r3, 80 651; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 652; P8-NEXT: stxvd2x vs1, r1, r3 # 16-byte Folded Spill 653; P8-NEXT: lhz r3, 2(r30) 654; P8-NEXT: bl __gnu_h2f_ieee 655; P8-NEXT: nop 656; P8-NEXT: li r3, 64 657; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 658; P8-NEXT: stxvd2x vs1, r1, r3 # 16-byte Folded Spill 659; P8-NEXT: lhz r3, 4(r30) 660; P8-NEXT: bl __gnu_h2f_ieee 661; P8-NEXT: nop 662; P8-NEXT: li r3, 48 663; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 664; P8-NEXT: stxvd2x vs1, r1, r3 # 16-byte Folded Spill 665; P8-NEXT: lhz r3, 0(r30) 666; P8-NEXT: bl __gnu_h2f_ieee 667; P8-NEXT: nop 668; P8-NEXT: li r3, 80 669; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 670; P8-NEXT: lxvd2x vs0, r1, r3 # 16-byte Folded Reload 671; P8-NEXT: li r3, 64 672; P8-NEXT: lxvd2x vs2, r1, r3 # 16-byte Folded Reload 673; P8-NEXT: li r3, 48 674; P8-NEXT: xxmrghd vs0, vs0, vs2 675; P8-NEXT: lxvd2x vs2, r1, r3 # 16-byte Folded Reload 676; P8-NEXT: xxmrghd vs1, vs2, vs1 677; P8-NEXT: xvcvdpsp vs34, vs0 678; P8-NEXT: xvcvdpsp vs35, vs1 679; P8-NEXT: vmrgew v2, v2, v3 680; P8-NEXT: addi r1, r1, 112 681; P8-NEXT: ld r0, 16(r1) 682; P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 683; P8-NEXT: mtlr r0 684; P8-NEXT: blr 685; 686; CHECK-LABEL: test_extend32_vec4: 687; CHECK: # %bb.0: 688; CHECK-NEXT: lhz r4, 6(r3) 689; CHECK-NEXT: mtfprwz f0, r4 690; CHECK-NEXT: xscvhpdp f0, f0 691; CHECK-NEXT: lhz r4, 2(r3) 692; CHECK-NEXT: mtfprwz f1, r4 693; CHECK-NEXT: xscvhpdp f1, f1 694; CHECK-NEXT: lhz r4, 4(r3) 695; CHECK-NEXT: mtfprwz f2, r4 696; CHECK-NEXT: xscvhpdp f2, f2 697; CHECK-NEXT: lhz r3, 0(r3) 698; CHECK-NEXT: xxmrghd vs0, vs0, vs1 699; CHECK-NEXT: mtfprwz f3, r3 700; CHECK-NEXT: xvcvdpsp vs35, vs0 701; CHECK-NEXT: xscvhpdp f3, f3 702; CHECK-NEXT: xxmrghd vs2, vs2, vs3 703; CHECK-NEXT: xvcvdpsp vs34, vs2 704; CHECK-NEXT: vmrgew v2, v3, v2 705; CHECK-NEXT: blr 706; 707; SOFT-LABEL: test_extend32_vec4: 708; SOFT: # %bb.0: 709; SOFT-NEXT: mflr r0 710; SOFT-NEXT: std r27, -40(r1) # 8-byte Folded Spill 711; SOFT-NEXT: std r28, -32(r1) # 8-byte Folded Spill 712; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 713; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 714; SOFT-NEXT: std r0, 16(r1) 715; SOFT-NEXT: stdu r1, -80(r1) 716; SOFT-NEXT: mr r30, r3 717; SOFT-NEXT: lhz r3, 0(r3) 718; SOFT-NEXT: bl __gnu_h2f_ieee 719; SOFT-NEXT: nop 720; SOFT-NEXT: mr r29, r3 721; SOFT-NEXT: lhz r3, 2(r30) 722; SOFT-NEXT: bl __gnu_h2f_ieee 723; SOFT-NEXT: nop 724; SOFT-NEXT: mr r28, r3 725; SOFT-NEXT: lhz r3, 4(r30) 726; SOFT-NEXT: bl __gnu_h2f_ieee 727; SOFT-NEXT: nop 728; SOFT-NEXT: mr r27, r3 729; SOFT-NEXT: lhz r3, 6(r30) 730; SOFT-NEXT: bl __gnu_h2f_ieee 731; SOFT-NEXT: nop 732; SOFT-NEXT: mr r6, r3 733; SOFT-NEXT: mr r3, r29 734; SOFT-NEXT: mr r4, r28 735; SOFT-NEXT: mr r5, r27 736; SOFT-NEXT: addi r1, r1, 80 737; SOFT-NEXT: ld r0, 16(r1) 738; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 739; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 740; SOFT-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 741; SOFT-NEXT: mtlr r0 742; SOFT-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 743; SOFT-NEXT: blr 744 %a = load <4 x half>, <4 x half>* %p, align 8 745 %b = fpext <4 x half> %a to <4 x float> 746 ret <4 x float> %b 747} 748define <4 x double> @test_extend64_vec4(<4 x half>* %p) #0 { 749; P8-LABEL: test_extend64_vec4: 750; P8: # %bb.0: 751; P8-NEXT: mflr r0 752; P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 753; P8-NEXT: std r0, 16(r1) 754; P8-NEXT: stdu r1, -112(r1) 755; P8-NEXT: mr r30, r3 756; P8-NEXT: lhz r3, 6(r3) 757; P8-NEXT: bl __gnu_h2f_ieee 758; P8-NEXT: nop 759; P8-NEXT: li r3, 80 760; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 761; P8-NEXT: stxvd2x vs1, r1, r3 # 16-byte Folded Spill 762; P8-NEXT: lhz r3, 4(r30) 763; P8-NEXT: bl __gnu_h2f_ieee 764; P8-NEXT: nop 765; P8-NEXT: li r3, 64 766; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 767; P8-NEXT: stxvd2x vs1, r1, r3 # 16-byte Folded Spill 768; P8-NEXT: lhz r3, 2(r30) 769; P8-NEXT: bl __gnu_h2f_ieee 770; P8-NEXT: nop 771; P8-NEXT: li r3, 48 772; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 773; P8-NEXT: stxvd2x vs1, r1, r3 # 16-byte Folded Spill 774; P8-NEXT: lhz r3, 0(r30) 775; P8-NEXT: bl __gnu_h2f_ieee 776; P8-NEXT: nop 777; P8-NEXT: li r3, 80 778; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 779; P8-NEXT: lxvd2x vs0, r1, r3 # 16-byte Folded Reload 780; P8-NEXT: li r3, 64 781; P8-NEXT: lxvd2x vs2, r1, r3 # 16-byte Folded Reload 782; P8-NEXT: li r3, 48 783; P8-NEXT: xxmrghd vs35, vs0, vs2 784; P8-NEXT: lxvd2x vs0, r1, r3 # 16-byte Folded Reload 785; P8-NEXT: xxmrghd vs34, vs0, vs1 786; P8-NEXT: addi r1, r1, 112 787; P8-NEXT: ld r0, 16(r1) 788; P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 789; P8-NEXT: mtlr r0 790; P8-NEXT: blr 791; 792; CHECK-LABEL: test_extend64_vec4: 793; CHECK: # %bb.0: 794; CHECK-NEXT: lhz r4, 6(r3) 795; CHECK-NEXT: lhz r5, 4(r3) 796; CHECK-NEXT: lhz r6, 2(r3) 797; CHECK-NEXT: lhz r3, 0(r3) 798; CHECK-NEXT: mtfprwz f0, r3 799; CHECK-NEXT: mtfprwz f1, r6 800; CHECK-NEXT: xscvhpdp f0, f0 801; CHECK-NEXT: xscvhpdp f1, f1 802; CHECK-NEXT: xxmrghd vs34, vs1, vs0 803; CHECK-NEXT: mtfprwz f0, r5 804; CHECK-NEXT: mtfprwz f1, r4 805; CHECK-NEXT: xscvhpdp f0, f0 806; CHECK-NEXT: xscvhpdp f1, f1 807; CHECK-NEXT: xxmrghd vs35, vs1, vs0 808; CHECK-NEXT: blr 809; 810; SOFT-LABEL: test_extend64_vec4: 811; SOFT: # %bb.0: 812; SOFT-NEXT: mflr r0 813; SOFT-NEXT: std r27, -40(r1) # 8-byte Folded Spill 814; SOFT-NEXT: std r28, -32(r1) # 8-byte Folded Spill 815; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 816; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 817; SOFT-NEXT: std r0, 16(r1) 818; SOFT-NEXT: stdu r1, -80(r1) 819; SOFT-NEXT: mr r30, r3 820; SOFT-NEXT: lhz r3, 0(r3) 821; SOFT-NEXT: bl __gnu_h2f_ieee 822; SOFT-NEXT: nop 823; SOFT-NEXT: bl __extendsfdf2 824; SOFT-NEXT: nop 825; SOFT-NEXT: mr r29, r3 826; SOFT-NEXT: lhz r3, 2(r30) 827; SOFT-NEXT: bl __gnu_h2f_ieee 828; SOFT-NEXT: nop 829; SOFT-NEXT: bl __extendsfdf2 830; SOFT-NEXT: nop 831; SOFT-NEXT: mr r28, r3 832; SOFT-NEXT: lhz r3, 4(r30) 833; SOFT-NEXT: bl __gnu_h2f_ieee 834; SOFT-NEXT: nop 835; SOFT-NEXT: bl __extendsfdf2 836; SOFT-NEXT: nop 837; SOFT-NEXT: mr r27, r3 838; SOFT-NEXT: lhz r3, 6(r30) 839; SOFT-NEXT: bl __gnu_h2f_ieee 840; SOFT-NEXT: nop 841; SOFT-NEXT: bl __extendsfdf2 842; SOFT-NEXT: nop 843; SOFT-NEXT: mr r6, r3 844; SOFT-NEXT: mr r3, r29 845; SOFT-NEXT: mr r4, r28 846; SOFT-NEXT: mr r5, r27 847; SOFT-NEXT: addi r1, r1, 80 848; SOFT-NEXT: ld r0, 16(r1) 849; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 850; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 851; SOFT-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 852; SOFT-NEXT: mtlr r0 853; SOFT-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 854; SOFT-NEXT: blr 855 %a = load <4 x half>, <4 x half>* %p, align 8 856 %b = fpext <4 x half> %a to <4 x double> 857 ret <4 x double> %b 858} 859define void @test_trunc32_vec4(<4 x float> %a, <4 x half>* %p) #0 { 860; P8-LABEL: test_trunc32_vec4: 861; P8: # %bb.0: 862; P8-NEXT: mflr r0 863; P8-NEXT: std r0, 16(r1) 864; P8-NEXT: stdu r1, -112(r1) 865; P8-NEXT: xxsldwi vs0, vs34, vs34, 3 866; P8-NEXT: li r3, 48 867; P8-NEXT: std r27, 72(r1) # 8-byte Folded Spill 868; P8-NEXT: std r28, 80(r1) # 8-byte Folded Spill 869; P8-NEXT: std r29, 88(r1) # 8-byte Folded Spill 870; P8-NEXT: std r30, 96(r1) # 8-byte Folded Spill 871; P8-NEXT: mr r30, r5 872; P8-NEXT: xscvspdpn f1, vs0 873; P8-NEXT: stxvd2x vs63, r1, r3 # 16-byte Folded Spill 874; P8-NEXT: vmr v31, v2 875; P8-NEXT: bl __gnu_f2h_ieee 876; P8-NEXT: nop 877; P8-NEXT: xxswapd vs0, vs63 878; P8-NEXT: mr r29, r3 879; P8-NEXT: xscvspdpn f1, vs0 880; P8-NEXT: bl __gnu_f2h_ieee 881; P8-NEXT: nop 882; P8-NEXT: xxsldwi vs0, vs63, vs63, 1 883; P8-NEXT: mr r28, r3 884; P8-NEXT: xscvspdpn f1, vs0 885; P8-NEXT: bl __gnu_f2h_ieee 886; P8-NEXT: nop 887; P8-NEXT: xscvspdpn f1, vs63 888; P8-NEXT: mr r27, r3 889; P8-NEXT: bl __gnu_f2h_ieee 890; P8-NEXT: nop 891; P8-NEXT: sth r3, 6(r30) 892; P8-NEXT: li r3, 48 893; P8-NEXT: sth r27, 4(r30) 894; P8-NEXT: ld r27, 72(r1) # 8-byte Folded Reload 895; P8-NEXT: sth r28, 2(r30) 896; P8-NEXT: sth r29, 0(r30) 897; P8-NEXT: ld r30, 96(r1) # 8-byte Folded Reload 898; P8-NEXT: ld r29, 88(r1) # 8-byte Folded Reload 899; P8-NEXT: lxvd2x vs63, r1, r3 # 16-byte Folded Reload 900; P8-NEXT: ld r28, 80(r1) # 8-byte Folded Reload 901; P8-NEXT: addi r1, r1, 112 902; P8-NEXT: ld r0, 16(r1) 903; P8-NEXT: mtlr r0 904; P8-NEXT: blr 905; 906; CHECK-LABEL: test_trunc32_vec4: 907; CHECK: # %bb.0: 908; CHECK-NEXT: xxsldwi vs0, vs34, vs34, 3 909; CHECK-NEXT: xxsldwi vs1, vs34, vs34, 1 910; CHECK-NEXT: xscvspdpn f0, vs0 911; CHECK-NEXT: xscvspdpn f1, vs1 912; CHECK-NEXT: xscvdphp f0, f0 913; CHECK-NEXT: mffprwz r3, f0 914; CHECK-NEXT: xxswapd vs0, vs34 915; CHECK-NEXT: xscvspdpn f0, vs0 916; CHECK-NEXT: xscvdphp f0, f0 917; CHECK-NEXT: xscvdphp f1, f1 918; CHECK-NEXT: mffprwz r4, f1 919; CHECK-NEXT: xscvspdpn f1, vs34 920; CHECK-NEXT: xscvdphp f1, f1 921; CHECK-NEXT: sth r4, 4(r5) 922; CHECK-NEXT: mffprwz r4, f0 923; CHECK-NEXT: sth r3, 0(r5) 924; CHECK-NEXT: sth r4, 2(r5) 925; CHECK-NEXT: mffprwz r6, f1 926; CHECK-NEXT: sth r6, 6(r5) 927; CHECK-NEXT: blr 928; 929; SOFT-LABEL: test_trunc32_vec4: 930; SOFT: # %bb.0: 931; SOFT-NEXT: mflr r0 932; SOFT-NEXT: std r26, -48(r1) # 8-byte Folded Spill 933; SOFT-NEXT: std r27, -40(r1) # 8-byte Folded Spill 934; SOFT-NEXT: std r28, -32(r1) # 8-byte Folded Spill 935; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 936; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 937; SOFT-NEXT: std r0, 16(r1) 938; SOFT-NEXT: stdu r1, -80(r1) 939; SOFT-NEXT: mr r27, r3 940; SOFT-NEXT: clrldi r3, r6, 32 941; SOFT-NEXT: mr r30, r7 942; SOFT-NEXT: mr r29, r5 943; SOFT-NEXT: mr r28, r4 944; SOFT-NEXT: bl __gnu_f2h_ieee 945; SOFT-NEXT: nop 946; SOFT-NEXT: mr r26, r3 947; SOFT-NEXT: clrldi r3, r29, 32 948; SOFT-NEXT: bl __gnu_f2h_ieee 949; SOFT-NEXT: nop 950; SOFT-NEXT: mr r29, r3 951; SOFT-NEXT: clrldi r3, r28, 32 952; SOFT-NEXT: bl __gnu_f2h_ieee 953; SOFT-NEXT: nop 954; SOFT-NEXT: mr r28, r3 955; SOFT-NEXT: clrldi r3, r27, 32 956; SOFT-NEXT: bl __gnu_f2h_ieee 957; SOFT-NEXT: nop 958; SOFT-NEXT: clrldi r3, r3, 48 959; SOFT-NEXT: bl __gnu_h2f_ieee 960; SOFT-NEXT: nop 961; SOFT-NEXT: mr r27, r3 962; SOFT-NEXT: clrldi r3, r28, 48 963; SOFT-NEXT: bl __gnu_h2f_ieee 964; SOFT-NEXT: nop 965; SOFT-NEXT: mr r28, r3 966; SOFT-NEXT: clrldi r3, r29, 48 967; SOFT-NEXT: bl __gnu_h2f_ieee 968; SOFT-NEXT: nop 969; SOFT-NEXT: mr r29, r3 970; SOFT-NEXT: clrldi r3, r26, 48 971; SOFT-NEXT: bl __gnu_h2f_ieee 972; SOFT-NEXT: nop 973; SOFT-NEXT: bl __gnu_f2h_ieee 974; SOFT-NEXT: nop 975; SOFT-NEXT: sth r3, 6(r30) 976; SOFT-NEXT: mr r3, r29 977; SOFT-NEXT: bl __gnu_f2h_ieee 978; SOFT-NEXT: nop 979; SOFT-NEXT: sth r3, 4(r30) 980; SOFT-NEXT: mr r3, r28 981; SOFT-NEXT: bl __gnu_f2h_ieee 982; SOFT-NEXT: nop 983; SOFT-NEXT: sth r3, 2(r30) 984; SOFT-NEXT: mr r3, r27 985; SOFT-NEXT: bl __gnu_f2h_ieee 986; SOFT-NEXT: nop 987; SOFT-NEXT: sth r3, 0(r30) 988; SOFT-NEXT: addi r1, r1, 80 989; SOFT-NEXT: ld r0, 16(r1) 990; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 991; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 992; SOFT-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 993; SOFT-NEXT: mtlr r0 994; SOFT-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 995; SOFT-NEXT: ld r26, -48(r1) # 8-byte Folded Reload 996; SOFT-NEXT: blr 997 %v = fptrunc <4 x float> %a to <4 x half> 998 store <4 x half> %v, <4 x half>* %p 999 ret void 1000} 1001define void @test_trunc64_vec4(<4 x double> %a, <4 x half>* %p) #0 { 1002; P8-LABEL: test_trunc64_vec4: 1003; P8: # %bb.0: 1004; P8-NEXT: mflr r0 1005; P8-NEXT: std r0, 16(r1) 1006; P8-NEXT: stdu r1, -128(r1) 1007; P8-NEXT: li r3, 48 1008; P8-NEXT: xxswapd vs1, vs34 1009; P8-NEXT: std r27, 88(r1) # 8-byte Folded Spill 1010; P8-NEXT: std r28, 96(r1) # 8-byte Folded Spill 1011; P8-NEXT: std r29, 104(r1) # 8-byte Folded Spill 1012; P8-NEXT: std r30, 112(r1) # 8-byte Folded Spill 1013; P8-NEXT: mr r30, r7 1014; P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 1015; P8-NEXT: stxvd2x vs62, r1, r3 # 16-byte Folded Spill 1016; P8-NEXT: li r3, 64 1017; P8-NEXT: vmr v30, v2 1018; P8-NEXT: stxvd2x vs63, r1, r3 # 16-byte Folded Spill 1019; P8-NEXT: vmr v31, v3 1020; P8-NEXT: bl __truncdfhf2 1021; P8-NEXT: nop 1022; P8-NEXT: xxswapd vs1, vs63 1023; P8-NEXT: mr r29, r3 1024; P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 1025; P8-NEXT: bl __truncdfhf2 1026; P8-NEXT: nop 1027; P8-NEXT: xxlor f1, vs62, vs62 1028; P8-NEXT: mr r28, r3 1029; P8-NEXT: bl __truncdfhf2 1030; P8-NEXT: nop 1031; P8-NEXT: xxlor f1, vs63, vs63 1032; P8-NEXT: mr r27, r3 1033; P8-NEXT: bl __truncdfhf2 1034; P8-NEXT: nop 1035; P8-NEXT: sth r3, 6(r30) 1036; P8-NEXT: li r3, 64 1037; P8-NEXT: sth r27, 2(r30) 1038; P8-NEXT: ld r27, 88(r1) # 8-byte Folded Reload 1039; P8-NEXT: sth r28, 4(r30) 1040; P8-NEXT: sth r29, 0(r30) 1041; P8-NEXT: ld r30, 112(r1) # 8-byte Folded Reload 1042; P8-NEXT: ld r29, 104(r1) # 8-byte Folded Reload 1043; P8-NEXT: lxvd2x vs63, r1, r3 # 16-byte Folded Reload 1044; P8-NEXT: li r3, 48 1045; P8-NEXT: ld r28, 96(r1) # 8-byte Folded Reload 1046; P8-NEXT: lxvd2x vs62, r1, r3 # 16-byte Folded Reload 1047; P8-NEXT: addi r1, r1, 128 1048; P8-NEXT: ld r0, 16(r1) 1049; P8-NEXT: mtlr r0 1050; P8-NEXT: blr 1051; 1052; CHECK-LABEL: test_trunc64_vec4: 1053; CHECK: # %bb.0: 1054; CHECK-NEXT: xxswapd vs0, vs34 1055; CHECK-NEXT: xscvdphp f0, f0 1056; CHECK-NEXT: mffprwz r3, f0 1057; CHECK-NEXT: xxswapd vs0, vs35 1058; CHECK-NEXT: xscvdphp f0, f0 1059; CHECK-NEXT: xscvdphp f1, vs34 1060; CHECK-NEXT: mffprwz r4, f1 1061; CHECK-NEXT: xscvdphp f1, vs35 1062; CHECK-NEXT: sth r3, 0(r7) 1063; CHECK-NEXT: sth r4, 2(r7) 1064; CHECK-NEXT: mffprwz r4, f0 1065; CHECK-NEXT: sth r4, 4(r7) 1066; CHECK-NEXT: mffprwz r5, f1 1067; CHECK-NEXT: sth r5, 6(r7) 1068; CHECK-NEXT: blr 1069; 1070; SOFT-LABEL: test_trunc64_vec4: 1071; SOFT: # %bb.0: 1072; SOFT-NEXT: mflr r0 1073; SOFT-NEXT: std r26, -48(r1) # 8-byte Folded Spill 1074; SOFT-NEXT: std r27, -40(r1) # 8-byte Folded Spill 1075; SOFT-NEXT: std r28, -32(r1) # 8-byte Folded Spill 1076; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 1077; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 1078; SOFT-NEXT: std r0, 16(r1) 1079; SOFT-NEXT: stdu r1, -80(r1) 1080; SOFT-NEXT: mr r27, r3 1081; SOFT-NEXT: mr r3, r6 1082; SOFT-NEXT: mr r30, r7 1083; SOFT-NEXT: mr r29, r5 1084; SOFT-NEXT: mr r28, r4 1085; SOFT-NEXT: bl __truncdfhf2 1086; SOFT-NEXT: nop 1087; SOFT-NEXT: mr r26, r3 1088; SOFT-NEXT: mr r3, r29 1089; SOFT-NEXT: bl __truncdfhf2 1090; SOFT-NEXT: nop 1091; SOFT-NEXT: mr r29, r3 1092; SOFT-NEXT: mr r3, r28 1093; SOFT-NEXT: bl __truncdfhf2 1094; SOFT-NEXT: nop 1095; SOFT-NEXT: mr r28, r3 1096; SOFT-NEXT: mr r3, r27 1097; SOFT-NEXT: bl __truncdfhf2 1098; SOFT-NEXT: nop 1099; SOFT-NEXT: clrldi r3, r3, 48 1100; SOFT-NEXT: bl __gnu_h2f_ieee 1101; SOFT-NEXT: nop 1102; SOFT-NEXT: mr r27, r3 1103; SOFT-NEXT: clrldi r3, r28, 48 1104; SOFT-NEXT: bl __gnu_h2f_ieee 1105; SOFT-NEXT: nop 1106; SOFT-NEXT: mr r28, r3 1107; SOFT-NEXT: clrldi r3, r29, 48 1108; SOFT-NEXT: bl __gnu_h2f_ieee 1109; SOFT-NEXT: nop 1110; SOFT-NEXT: mr r29, r3 1111; SOFT-NEXT: clrldi r3, r26, 48 1112; SOFT-NEXT: bl __gnu_h2f_ieee 1113; SOFT-NEXT: nop 1114; SOFT-NEXT: bl __gnu_f2h_ieee 1115; SOFT-NEXT: nop 1116; SOFT-NEXT: sth r3, 6(r30) 1117; SOFT-NEXT: mr r3, r29 1118; SOFT-NEXT: bl __gnu_f2h_ieee 1119; SOFT-NEXT: nop 1120; SOFT-NEXT: sth r3, 4(r30) 1121; SOFT-NEXT: mr r3, r28 1122; SOFT-NEXT: bl __gnu_f2h_ieee 1123; SOFT-NEXT: nop 1124; SOFT-NEXT: sth r3, 2(r30) 1125; SOFT-NEXT: mr r3, r27 1126; SOFT-NEXT: bl __gnu_f2h_ieee 1127; SOFT-NEXT: nop 1128; SOFT-NEXT: sth r3, 0(r30) 1129; SOFT-NEXT: addi r1, r1, 80 1130; SOFT-NEXT: ld r0, 16(r1) 1131; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 1132; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 1133; SOFT-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 1134; SOFT-NEXT: mtlr r0 1135; SOFT-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 1136; SOFT-NEXT: ld r26, -48(r1) # 8-byte Folded Reload 1137; SOFT-NEXT: blr 1138 %v = fptrunc <4 x double> %a to <4 x half> 1139 store <4 x half> %v, <4 x half>* %p 1140 ret void 1141} 1142define float @test_sitofp_fadd_i32(i32 %a, half* %b) #0 { 1143; P8-LABEL: test_sitofp_fadd_i32: 1144; P8: # %bb.0: 1145; P8-NEXT: mflr r0 1146; P8-NEXT: std r30, -24(r1) # 8-byte Folded Spill 1147; P8-NEXT: stfd f31, -8(r1) # 8-byte Folded Spill 1148; P8-NEXT: std r0, 16(r1) 1149; P8-NEXT: stdu r1, -64(r1) 1150; P8-NEXT: mr r30, r3 1151; P8-NEXT: lhz r3, 0(r4) 1152; P8-NEXT: bl __gnu_h2f_ieee 1153; P8-NEXT: nop 1154; P8-NEXT: mtfprwa f0, r30 1155; P8-NEXT: fmr f31, f1 1156; P8-NEXT: xscvsxdsp f1, f0 1157; P8-NEXT: bl __gnu_f2h_ieee 1158; P8-NEXT: nop 1159; P8-NEXT: clrldi r3, r3, 48 1160; P8-NEXT: bl __gnu_h2f_ieee 1161; P8-NEXT: nop 1162; P8-NEXT: xsaddsp f1, f31, f1 1163; P8-NEXT: addi r1, r1, 64 1164; P8-NEXT: ld r0, 16(r1) 1165; P8-NEXT: lfd f31, -8(r1) # 8-byte Folded Reload 1166; P8-NEXT: ld r30, -24(r1) # 8-byte Folded Reload 1167; P8-NEXT: mtlr r0 1168; P8-NEXT: blr 1169; 1170; CHECK-LABEL: test_sitofp_fadd_i32: 1171; CHECK: # %bb.0: 1172; CHECK-NEXT: mtfprwa f1, r3 1173; CHECK-NEXT: lhz r4, 0(r4) 1174; CHECK-NEXT: xscvsxdsp f1, f1 1175; CHECK-NEXT: mtfprwz f0, r4 1176; CHECK-NEXT: xscvhpdp f0, f0 1177; CHECK-NEXT: xscvdphp f1, f1 1178; CHECK-NEXT: mffprwz r3, f1 1179; CHECK-NEXT: clrlwi r3, r3, 16 1180; CHECK-NEXT: mtfprwz f1, r3 1181; CHECK-NEXT: xscvhpdp f1, f1 1182; CHECK-NEXT: xsaddsp f1, f0, f1 1183; CHECK-NEXT: blr 1184; 1185; SOFT-LABEL: test_sitofp_fadd_i32: 1186; SOFT: # %bb.0: 1187; SOFT-NEXT: mflr r0 1188; SOFT-NEXT: std r29, -24(r1) # 8-byte Folded Spill 1189; SOFT-NEXT: std r30, -16(r1) # 8-byte Folded Spill 1190; SOFT-NEXT: std r0, 16(r1) 1191; SOFT-NEXT: stdu r1, -64(r1) 1192; SOFT-NEXT: mr r30, r3 1193; SOFT-NEXT: lhz r3, 0(r4) 1194; SOFT-NEXT: bl __gnu_h2f_ieee 1195; SOFT-NEXT: nop 1196; SOFT-NEXT: mr r29, r3 1197; SOFT-NEXT: extsw r3, r30 1198; SOFT-NEXT: bl __floatsisf 1199; SOFT-NEXT: nop 1200; SOFT-NEXT: clrldi r3, r3, 32 1201; SOFT-NEXT: bl __gnu_f2h_ieee 1202; SOFT-NEXT: nop 1203; SOFT-NEXT: clrldi r3, r3, 48 1204; SOFT-NEXT: bl __gnu_h2f_ieee 1205; SOFT-NEXT: nop 1206; SOFT-NEXT: mr r4, r3 1207; SOFT-NEXT: mr r3, r29 1208; SOFT-NEXT: bl __addsf3 1209; SOFT-NEXT: nop 1210; SOFT-NEXT: addi r1, r1, 64 1211; SOFT-NEXT: ld r0, 16(r1) 1212; SOFT-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 1213; SOFT-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 1214; SOFT-NEXT: mtlr r0 1215; SOFT-NEXT: blr 1216 %tmp0 = load half, half* %b 1217 %tmp1 = sitofp i32 %a to half 1218 %tmp2 = fadd half %tmp0, %tmp1 1219 %tmp3 = fpext half %tmp2 to float 1220 ret float %tmp3 1221} 1222define half @PR40273(half) #0 { 1223; P8-LABEL: PR40273: 1224; P8: # %bb.0: 1225; P8-NEXT: mflr r0 1226; P8-NEXT: std r0, 16(r1) 1227; P8-NEXT: stdu r1, -32(r1) 1228; P8-NEXT: bl __gnu_f2h_ieee 1229; P8-NEXT: nop 1230; P8-NEXT: clrldi r3, r3, 48 1231; P8-NEXT: bl __gnu_h2f_ieee 1232; P8-NEXT: nop 1233; P8-NEXT: xxlxor f0, f0, f0 1234; P8-NEXT: fcmpu cr0, f1, f0 1235; P8-NEXT: beq cr0, .LBB20_2 1236; P8-NEXT: # %bb.1: 1237; P8-NEXT: addis r3, r2, .LCPI20_0@toc@ha 1238; P8-NEXT: lfs f0, .LCPI20_0@toc@l(r3) 1239; P8-NEXT: .LBB20_2: 1240; P8-NEXT: fmr f1, f0 1241; P8-NEXT: addi r1, r1, 32 1242; P8-NEXT: ld r0, 16(r1) 1243; P8-NEXT: mtlr r0 1244; P8-NEXT: blr 1245; 1246; CHECK-LABEL: PR40273: 1247; CHECK: # %bb.0: 1248; CHECK-NEXT: xscvdphp f0, f1 1249; CHECK-NEXT: xxlxor f1, f1, f1 1250; CHECK-NEXT: mffprwz r3, f0 1251; CHECK-NEXT: clrlwi r3, r3, 16 1252; CHECK-NEXT: mtfprwz f0, r3 1253; CHECK-NEXT: xscvhpdp f0, f0 1254; CHECK-NEXT: fcmpu cr0, f0, f1 1255; CHECK-NEXT: beqlr cr0 1256; CHECK-NEXT: # %bb.1: 1257; CHECK-NEXT: addis r3, r2, .LCPI20_0@toc@ha 1258; CHECK-NEXT: lfs f1, .LCPI20_0@toc@l(r3) 1259; CHECK-NEXT: blr 1260; 1261; SOFT-LABEL: PR40273: 1262; SOFT: # %bb.0: 1263; SOFT-NEXT: mflr r0 1264; SOFT-NEXT: std r0, 16(r1) 1265; SOFT-NEXT: stdu r1, -32(r1) 1266; SOFT-NEXT: clrldi r3, r3, 48 1267; SOFT-NEXT: bl __gnu_h2f_ieee 1268; SOFT-NEXT: nop 1269; SOFT-NEXT: li r4, 0 1270; SOFT-NEXT: bl __nesf2 1271; SOFT-NEXT: nop 1272; SOFT-NEXT: cmplwi r3, 0 1273; SOFT-NEXT: lis r3, 16256 1274; SOFT-NEXT: iseleq r3, 0, r3 1275; SOFT-NEXT: bl __gnu_f2h_ieee 1276; SOFT-NEXT: nop 1277; SOFT-NEXT: addi r1, r1, 32 1278; SOFT-NEXT: ld r0, 16(r1) 1279; SOFT-NEXT: mtlr r0 1280; SOFT-NEXT: blr 1281 %2 = fcmp une half %0, 0xH0000 1282 %3 = uitofp i1 %2 to half 1283 ret half %3 1284} 1285attributes #0 = { nounwind } 1286