1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \ 3; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s 4; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \ 5; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \ 6; RUN: -check-prefix=CHECK-P8 7 8; Function Attrs: norecurse nounwind readnone 9define fp128 @loadConstant() { 10; CHECK-LABEL: loadConstant: 11; CHECK: # %bb.0: # %entry 12; CHECK-NEXT: addis r3, r2, .LCPI0_0@toc@ha 13; CHECK-NEXT: addi r3, r3, .LCPI0_0@toc@l 14; CHECK-NEXT: lxvx v2, 0, r3 15; CHECK-NEXT: blr 16; 17; CHECK-P8-LABEL: loadConstant: 18; CHECK-P8: # %bb.0: # %entry 19; CHECK-P8-NEXT: addis r3, r2, .LCPI0_0@toc@ha 20; CHECK-P8-NEXT: addi r3, r3, .LCPI0_0@toc@l 21; CHECK-P8-NEXT: lvx v2, 0, r3 22; CHECK-P8-NEXT: blr 23 entry: 24 ret fp128 0xL00000000000000004001400000000000 25} 26 27; Function Attrs: norecurse nounwind readnone 28define fp128 @loadConstant2(fp128 %a, fp128 %b) { 29; CHECK-LABEL: loadConstant2: 30; CHECK: # %bb.0: # %entry 31; CHECK-NEXT: xsaddqp v2, v2, v3 32; CHECK-NEXT: addis r3, r2, .LCPI1_0@toc@ha 33; CHECK-NEXT: addi r3, r3, .LCPI1_0@toc@l 34; CHECK-NEXT: lxvx v3, 0, r3 35; CHECK-NEXT: xsaddqp v2, v2, v3 36; CHECK-NEXT: blr 37; 38; CHECK-P8-LABEL: loadConstant2: 39; CHECK-P8: # %bb.0: # %entry 40; CHECK-P8-NEXT: mflr r0 41; CHECK-P8-NEXT: std r0, 16(r1) 42; CHECK-P8-NEXT: stdu r1, -32(r1) 43; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 44; CHECK-P8-NEXT: .cfi_offset lr, 16 45; CHECK-P8-NEXT: bl __addkf3 46; CHECK-P8-NEXT: nop 47; CHECK-P8-NEXT: addis r3, r2, .LCPI1_0@toc@ha 48; CHECK-P8-NEXT: addi r3, r3, .LCPI1_0@toc@l 49; CHECK-P8-NEXT: lvx v3, 0, r3 50; CHECK-P8-NEXT: bl __addkf3 51; CHECK-P8-NEXT: nop 52; CHECK-P8-NEXT: addi r1, r1, 32 53; CHECK-P8-NEXT: ld r0, 16(r1) 54; CHECK-P8-NEXT: mtlr r0 55; CHECK-P8-NEXT: blr 56 entry: 57 %add = fadd fp128 %a, %b 58 %add1 = fadd fp128 %add, 0xL00000000000000004001400000000000 59 ret fp128 %add1 60} 61 62; Test passing float128 by value. 63; Function Attrs: norecurse nounwind readnone 64define signext i32 @fp128Param(fp128 %a) { 65; CHECK-LABEL: fp128Param: 66; CHECK: # %bb.0: # %entry 67; CHECK-NEXT: xscvqpswz v2, v2 68; CHECK-NEXT: mfvsrwz r3, v2 69; CHECK-NEXT: extsw r3, r3 70; CHECK-NEXT: blr 71; 72; CHECK-P8-LABEL: fp128Param: 73; CHECK-P8: # %bb.0: # %entry 74; CHECK-P8-NEXT: mflr r0 75; CHECK-P8-NEXT: std r0, 16(r1) 76; CHECK-P8-NEXT: stdu r1, -32(r1) 77; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 78; CHECK-P8-NEXT: .cfi_offset lr, 16 79; CHECK-P8-NEXT: bl __fixkfsi 80; CHECK-P8-NEXT: nop 81; CHECK-P8-NEXT: extsw r3, r3 82; CHECK-P8-NEXT: addi r1, r1, 32 83; CHECK-P8-NEXT: ld r0, 16(r1) 84; CHECK-P8-NEXT: mtlr r0 85; CHECK-P8-NEXT: blr 86entry: 87 %conv = fptosi fp128 %a to i32 88 ret i32 %conv 89} 90 91; Test float128 as return value. 92; Function Attrs: norecurse nounwind readnone 93define fp128 @fp128Return(fp128 %a, fp128 %b) { 94; CHECK-LABEL: fp128Return: 95; CHECK: # %bb.0: # %entry 96; CHECK-NEXT: xsaddqp v2, v2, v3 97; CHECK-NEXT: blr 98; 99; CHECK-P8-LABEL: fp128Return: 100; CHECK-P8: # %bb.0: # %entry 101; CHECK-P8-NEXT: mflr r0 102; CHECK-P8-NEXT: std r0, 16(r1) 103; CHECK-P8-NEXT: stdu r1, -32(r1) 104; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 105; CHECK-P8-NEXT: .cfi_offset lr, 16 106; CHECK-P8-NEXT: bl __addkf3 107; CHECK-P8-NEXT: nop 108; CHECK-P8-NEXT: addi r1, r1, 32 109; CHECK-P8-NEXT: ld r0, 16(r1) 110; CHECK-P8-NEXT: mtlr r0 111; CHECK-P8-NEXT: blr 112entry: 113 %add = fadd fp128 %a, %b 114 ret fp128 %add 115} 116 117; array of float128 types 118; Function Attrs: norecurse nounwind readonly 119define fp128 @fp128Array(fp128* nocapture readonly %farray, 120; CHECK-LABEL: fp128Array: 121; CHECK: # %bb.0: # %entry 122; CHECK-NEXT: sldi r4, r4, 4 123; CHECK-NEXT: lxv v2, 0(r3) 124; CHECK-NEXT: add r3, r3, r4 125; CHECK-NEXT: lxv v3, -16(r3) 126; CHECK-NEXT: xsaddqp v2, v2, v3 127; CHECK-NEXT: blr 128; 129; CHECK-P8-LABEL: fp128Array: 130; CHECK-P8: # %bb.0: # %entry 131; CHECK-P8-NEXT: mflr r0 132; CHECK-P8-NEXT: std r0, 16(r1) 133; CHECK-P8-NEXT: stdu r1, -32(r1) 134; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 135; CHECK-P8-NEXT: .cfi_offset lr, 16 136; CHECK-P8-NEXT: sldi r4, r4, 4 137; CHECK-P8-NEXT: lvx v2, 0, r3 138; CHECK-P8-NEXT: add r4, r3, r4 139; CHECK-P8-NEXT: addi r4, r4, -16 140; CHECK-P8-NEXT: lvx v3, 0, r4 141; CHECK-P8-NEXT: bl __addkf3 142; CHECK-P8-NEXT: nop 143; CHECK-P8-NEXT: addi r1, r1, 32 144; CHECK-P8-NEXT: ld r0, 16(r1) 145; CHECK-P8-NEXT: mtlr r0 146; CHECK-P8-NEXT: blr 147 i32 signext %loopcnt, fp128* nocapture readnone %sum) { 148entry: 149 %0 = load fp128, fp128* %farray, align 16 150 %sub = add nsw i32 %loopcnt, -1 151 %idxprom = sext i32 %sub to i64 152 %arrayidx1 = getelementptr inbounds fp128, fp128* %farray, i64 %idxprom 153 %1 = load fp128, fp128* %arrayidx1, align 16 154 %add = fadd fp128 %0, %1 155 ret fp128 %add 156} 157 158; Up to 12 qualified floating-point arguments can be passed in v2-v13. 159; Function to test passing 13 float128 parameters. 160; Function Attrs: norecurse nounwind readnone 161define fp128 @maxVecParam(fp128 %p1, fp128 %p2, fp128 %p3, fp128 %p4, fp128 %p5, 162; CHECK-LABEL: maxVecParam: 163; CHECK: # %bb.0: # %entry 164; CHECK-NEXT: xsaddqp v2, v2, v3 165; CHECK-NEXT: lxv v0, 224(r1) 166; CHECK-NEXT: xsaddqp v2, v2, v4 167; CHECK-NEXT: xsaddqp v2, v2, v5 168; CHECK-NEXT: xsaddqp v2, v2, v6 169; CHECK-NEXT: xsaddqp v2, v2, v7 170; CHECK-NEXT: xsaddqp v2, v2, v8 171; CHECK-NEXT: xsaddqp v2, v2, v9 172; CHECK-NEXT: xsaddqp v2, v2, v10 173; CHECK-NEXT: xsaddqp v2, v2, v11 174; CHECK-NEXT: xsaddqp v2, v2, v12 175; CHECK-NEXT: xsaddqp v2, v2, v13 176; CHECK-NEXT: xssubqp v2, v2, v0 177; CHECK-NEXT: blr 178; 179; CHECK-P8-LABEL: maxVecParam: 180; CHECK-P8: # %bb.0: # %entry 181; CHECK-P8-NEXT: mflr r0 182; CHECK-P8-NEXT: std r0, 16(r1) 183; CHECK-P8-NEXT: stdu r1, -224(r1) 184; CHECK-P8-NEXT: .cfi_def_cfa_offset 224 185; CHECK-P8-NEXT: .cfi_offset lr, 16 186; CHECK-P8-NEXT: .cfi_offset v21, -176 187; CHECK-P8-NEXT: .cfi_offset v22, -160 188; CHECK-P8-NEXT: .cfi_offset v23, -144 189; CHECK-P8-NEXT: .cfi_offset v24, -128 190; CHECK-P8-NEXT: .cfi_offset v25, -112 191; CHECK-P8-NEXT: .cfi_offset v26, -96 192; CHECK-P8-NEXT: .cfi_offset v27, -80 193; CHECK-P8-NEXT: .cfi_offset v28, -64 194; CHECK-P8-NEXT: .cfi_offset v29, -48 195; CHECK-P8-NEXT: .cfi_offset v30, -32 196; CHECK-P8-NEXT: .cfi_offset v31, -16 197; CHECK-P8-NEXT: li r3, 48 198; CHECK-P8-NEXT: stvx v21, r1, r3 # 16-byte Folded Spill 199; CHECK-P8-NEXT: li r3, 64 200; CHECK-P8-NEXT: vmr v21, v4 201; CHECK-P8-NEXT: stvx v22, r1, r3 # 16-byte Folded Spill 202; CHECK-P8-NEXT: li r3, 80 203; CHECK-P8-NEXT: vmr v22, v5 204; CHECK-P8-NEXT: stvx v23, r1, r3 # 16-byte Folded Spill 205; CHECK-P8-NEXT: li r3, 96 206; CHECK-P8-NEXT: vmr v23, v6 207; CHECK-P8-NEXT: stvx v24, r1, r3 # 16-byte Folded Spill 208; CHECK-P8-NEXT: li r3, 112 209; CHECK-P8-NEXT: vmr v24, v7 210; CHECK-P8-NEXT: stvx v25, r1, r3 # 16-byte Folded Spill 211; CHECK-P8-NEXT: li r3, 128 212; CHECK-P8-NEXT: vmr v25, v8 213; CHECK-P8-NEXT: stvx v26, r1, r3 # 16-byte Folded Spill 214; CHECK-P8-NEXT: li r3, 144 215; CHECK-P8-NEXT: vmr v26, v9 216; CHECK-P8-NEXT: stvx v27, r1, r3 # 16-byte Folded Spill 217; CHECK-P8-NEXT: li r3, 160 218; CHECK-P8-NEXT: vmr v27, v10 219; CHECK-P8-NEXT: stvx v28, r1, r3 # 16-byte Folded Spill 220; CHECK-P8-NEXT: li r3, 176 221; CHECK-P8-NEXT: vmr v28, v11 222; CHECK-P8-NEXT: stvx v29, r1, r3 # 16-byte Folded Spill 223; CHECK-P8-NEXT: li r3, 192 224; CHECK-P8-NEXT: stvx v30, r1, r3 # 16-byte Folded Spill 225; CHECK-P8-NEXT: li r3, 208 226; CHECK-P8-NEXT: vmr v30, v12 227; CHECK-P8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill 228; CHECK-P8-NEXT: addi r3, r1, 448 229; CHECK-P8-NEXT: vmr v31, v13 230; CHECK-P8-NEXT: lvx v29, 0, r3 231; CHECK-P8-NEXT: bl __addkf3 232; CHECK-P8-NEXT: nop 233; CHECK-P8-NEXT: vmr v3, v21 234; CHECK-P8-NEXT: bl __addkf3 235; CHECK-P8-NEXT: nop 236; CHECK-P8-NEXT: vmr v3, v22 237; CHECK-P8-NEXT: bl __addkf3 238; CHECK-P8-NEXT: nop 239; CHECK-P8-NEXT: vmr v3, v23 240; CHECK-P8-NEXT: bl __addkf3 241; CHECK-P8-NEXT: nop 242; CHECK-P8-NEXT: vmr v3, v24 243; CHECK-P8-NEXT: bl __addkf3 244; CHECK-P8-NEXT: nop 245; CHECK-P8-NEXT: vmr v3, v25 246; CHECK-P8-NEXT: bl __addkf3 247; CHECK-P8-NEXT: nop 248; CHECK-P8-NEXT: vmr v3, v26 249; CHECK-P8-NEXT: bl __addkf3 250; CHECK-P8-NEXT: nop 251; CHECK-P8-NEXT: vmr v3, v27 252; CHECK-P8-NEXT: bl __addkf3 253; CHECK-P8-NEXT: nop 254; CHECK-P8-NEXT: vmr v3, v28 255; CHECK-P8-NEXT: bl __addkf3 256; CHECK-P8-NEXT: nop 257; CHECK-P8-NEXT: vmr v3, v30 258; CHECK-P8-NEXT: bl __addkf3 259; CHECK-P8-NEXT: nop 260; CHECK-P8-NEXT: vmr v3, v31 261; CHECK-P8-NEXT: bl __addkf3 262; CHECK-P8-NEXT: nop 263; CHECK-P8-NEXT: vmr v3, v29 264; CHECK-P8-NEXT: bl __subkf3 265; CHECK-P8-NEXT: nop 266; CHECK-P8-NEXT: li r3, 208 267; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload 268; CHECK-P8-NEXT: li r3, 192 269; CHECK-P8-NEXT: lvx v30, r1, r3 # 16-byte Folded Reload 270; CHECK-P8-NEXT: li r3, 176 271; CHECK-P8-NEXT: lvx v29, r1, r3 # 16-byte Folded Reload 272; CHECK-P8-NEXT: li r3, 160 273; CHECK-P8-NEXT: lvx v28, r1, r3 # 16-byte Folded Reload 274; CHECK-P8-NEXT: li r3, 144 275; CHECK-P8-NEXT: lvx v27, r1, r3 # 16-byte Folded Reload 276; CHECK-P8-NEXT: li r3, 128 277; CHECK-P8-NEXT: lvx v26, r1, r3 # 16-byte Folded Reload 278; CHECK-P8-NEXT: li r3, 112 279; CHECK-P8-NEXT: lvx v25, r1, r3 # 16-byte Folded Reload 280; CHECK-P8-NEXT: li r3, 96 281; CHECK-P8-NEXT: lvx v24, r1, r3 # 16-byte Folded Reload 282; CHECK-P8-NEXT: li r3, 80 283; CHECK-P8-NEXT: lvx v23, r1, r3 # 16-byte Folded Reload 284; CHECK-P8-NEXT: li r3, 64 285; CHECK-P8-NEXT: lvx v22, r1, r3 # 16-byte Folded Reload 286; CHECK-P8-NEXT: li r3, 48 287; CHECK-P8-NEXT: lvx v21, r1, r3 # 16-byte Folded Reload 288; CHECK-P8-NEXT: addi r1, r1, 224 289; CHECK-P8-NEXT: ld r0, 16(r1) 290; CHECK-P8-NEXT: mtlr r0 291; CHECK-P8-NEXT: blr 292 fp128 %p6, fp128 %p7, fp128 %p8, fp128 %p9, fp128 %p10, 293 fp128 %p11, fp128 %p12, fp128 %p13) { 294entry: 295 %add = fadd fp128 %p1, %p2 296 %add1 = fadd fp128 %add, %p3 297 %add2 = fadd fp128 %add1, %p4 298 %add3 = fadd fp128 %add2, %p5 299 %add4 = fadd fp128 %add3, %p6 300 %add5 = fadd fp128 %add4, %p7 301 %add6 = fadd fp128 %add5, %p8 302 %add7 = fadd fp128 %add6, %p9 303 %add8 = fadd fp128 %add7, %p10 304 %add9 = fadd fp128 %add8, %p11 305 %add10 = fadd fp128 %add9, %p12 306 %sub = fsub fp128 %add10, %p13 307 ret fp128 %sub 308} 309 310; Passing a mix of float128 and other type parameters. 311; Function Attrs: norecurse nounwind readnone 312define fp128 @mixParam_01(fp128 %a, i32 signext %i, fp128 %b) { 313; CHECK-LABEL: mixParam_01: 314; CHECK: # %bb.0: # %entry 315; CHECK-NEXT: xsaddqp v2, v2, v3 316; CHECK-NEXT: mtvsrwa v3, r5 317; CHECK-NEXT: xscvsdqp v3, v3 318; CHECK-NEXT: xsaddqp v2, v2, v3 319; CHECK-NEXT: blr 320; 321; CHECK-P8-LABEL: mixParam_01: 322; CHECK-P8: # %bb.0: # %entry 323; CHECK-P8-NEXT: mflr r0 324; CHECK-P8-NEXT: std r0, 16(r1) 325; CHECK-P8-NEXT: stdu r1, -80(r1) 326; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 327; CHECK-P8-NEXT: .cfi_offset lr, 16 328; CHECK-P8-NEXT: .cfi_offset r30, -16 329; CHECK-P8-NEXT: .cfi_offset v31, -32 330; CHECK-P8-NEXT: li r3, 48 331; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill 332; CHECK-P8-NEXT: mr r30, r5 333; CHECK-P8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill 334; CHECK-P8-NEXT: bl __addkf3 335; CHECK-P8-NEXT: nop 336; CHECK-P8-NEXT: mr r3, r30 337; CHECK-P8-NEXT: vmr v31, v2 338; CHECK-P8-NEXT: bl __floatsikf 339; CHECK-P8-NEXT: nop 340; CHECK-P8-NEXT: vmr v3, v2 341; CHECK-P8-NEXT: vmr v2, v31 342; CHECK-P8-NEXT: bl __addkf3 343; CHECK-P8-NEXT: nop 344; CHECK-P8-NEXT: li r3, 48 345; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload 346; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload 347; CHECK-P8-NEXT: addi r1, r1, 80 348; CHECK-P8-NEXT: ld r0, 16(r1) 349; CHECK-P8-NEXT: mtlr r0 350; CHECK-P8-NEXT: blr 351entry: 352 %add = fadd fp128 %a, %b 353 %conv = sitofp i32 %i to fp128 354 %add1 = fadd fp128 %add, %conv 355 ret fp128 %add1 356} 357; Function Attrs: norecurse nounwind readnone 358define fastcc fp128 @mixParam_01f(fp128 %a, i32 signext %i, fp128 %b) { 359; CHECK-LABEL: mixParam_01f: 360; CHECK: # %bb.0: # %entry 361; CHECK-NEXT: xsaddqp v2, v2, v3 362; CHECK-NEXT: mtvsrwa v3, r3 363; CHECK-NEXT: xscvsdqp v3, v3 364; CHECK-NEXT: xsaddqp v2, v2, v3 365; CHECK-NEXT: blr 366; 367; CHECK-P8-LABEL: mixParam_01f: 368; CHECK-P8: # %bb.0: # %entry 369; CHECK-P8-NEXT: mflr r0 370; CHECK-P8-NEXT: std r0, 16(r1) 371; CHECK-P8-NEXT: stdu r1, -80(r1) 372; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 373; CHECK-P8-NEXT: .cfi_offset lr, 16 374; CHECK-P8-NEXT: .cfi_offset r30, -16 375; CHECK-P8-NEXT: .cfi_offset v31, -32 376; CHECK-P8-NEXT: li r4, 48 377; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill 378; CHECK-P8-NEXT: mr r30, r3 379; CHECK-P8-NEXT: stvx v31, r1, r4 # 16-byte Folded Spill 380; CHECK-P8-NEXT: bl __addkf3 381; CHECK-P8-NEXT: nop 382; CHECK-P8-NEXT: mr r3, r30 383; CHECK-P8-NEXT: vmr v31, v2 384; CHECK-P8-NEXT: bl __floatsikf 385; CHECK-P8-NEXT: nop 386; CHECK-P8-NEXT: vmr v3, v2 387; CHECK-P8-NEXT: vmr v2, v31 388; CHECK-P8-NEXT: bl __addkf3 389; CHECK-P8-NEXT: nop 390; CHECK-P8-NEXT: li r3, 48 391; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload 392; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload 393; CHECK-P8-NEXT: addi r1, r1, 80 394; CHECK-P8-NEXT: ld r0, 16(r1) 395; CHECK-P8-NEXT: mtlr r0 396; CHECK-P8-NEXT: blr 397entry: 398 %add = fadd fp128 %a, %b 399 %conv = sitofp i32 %i to fp128 400 %add1 = fadd fp128 %add, %conv 401 ret fp128 %add1 402} 403 404; Function Attrs: norecurse nounwind 405define fp128 @mixParam_02(fp128 %p1, double %p2, i64* nocapture %p3, 406; CHECK-LABEL: mixParam_02: 407; CHECK: # %bb.0: # %entry 408; CHECK-NEXT: lwz r3, 96(r1) 409; CHECK-NEXT: add r4, r7, r9 410; CHECK-NEXT: xscpsgndp v3, f1, f1 411; CHECK-NEXT: add r4, r4, r10 412; CHECK-NEXT: xscvdpqp v3, v3 413; CHECK-NEXT: add r3, r4, r3 414; CHECK-NEXT: clrldi r3, r3, 32 415; CHECK-NEXT: std r3, 0(r6) 416; CHECK-NEXT: lxv v4, 0(r8) 417; CHECK-NEXT: xsaddqp v2, v4, v2 418; CHECK-NEXT: xsaddqp v2, v2, v3 419; CHECK-NEXT: blr 420; 421; CHECK-P8-LABEL: mixParam_02: 422; CHECK-P8: # %bb.0: # %entry 423; CHECK-P8-NEXT: mflr r0 424; CHECK-P8-NEXT: std r0, 16(r1) 425; CHECK-P8-NEXT: stdu r1, -80(r1) 426; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 427; CHECK-P8-NEXT: .cfi_offset lr, 16 428; CHECK-P8-NEXT: .cfi_offset f31, -8 429; CHECK-P8-NEXT: .cfi_offset v31, -32 430; CHECK-P8-NEXT: li r3, 48 431; CHECK-P8-NEXT: add r4, r7, r9 432; CHECK-P8-NEXT: vmr v4, v2 433; CHECK-P8-NEXT: stfd f31, 72(r1) # 8-byte Folded Spill 434; CHECK-P8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill 435; CHECK-P8-NEXT: lwz r3, 176(r1) 436; CHECK-P8-NEXT: add r4, r4, r10 437; CHECK-P8-NEXT: fmr f31, f1 438; CHECK-P8-NEXT: add r3, r4, r3 439; CHECK-P8-NEXT: clrldi r3, r3, 32 440; CHECK-P8-NEXT: std r3, 0(r6) 441; CHECK-P8-NEXT: lvx v3, 0, r8 442; CHECK-P8-NEXT: vmr v2, v3 443; CHECK-P8-NEXT: vmr v3, v4 444; CHECK-P8-NEXT: bl __addkf3 445; CHECK-P8-NEXT: nop 446; CHECK-P8-NEXT: fmr f1, f31 447; CHECK-P8-NEXT: vmr v31, v2 448; CHECK-P8-NEXT: bl __extenddfkf2 449; CHECK-P8-NEXT: nop 450; CHECK-P8-NEXT: vmr v3, v2 451; CHECK-P8-NEXT: vmr v2, v31 452; CHECK-P8-NEXT: bl __addkf3 453; CHECK-P8-NEXT: nop 454; CHECK-P8-NEXT: li r3, 48 455; CHECK-P8-NEXT: lfd f31, 72(r1) # 8-byte Folded Reload 456; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload 457; CHECK-P8-NEXT: addi r1, r1, 80 458; CHECK-P8-NEXT: ld r0, 16(r1) 459; CHECK-P8-NEXT: mtlr r0 460; CHECK-P8-NEXT: blr 461 i16 signext %p4, fp128* nocapture readonly %p5, 462 i32 signext %p6, i8 zeroext %p7, i32 zeroext %p8) { 463entry: 464 %conv = sext i16 %p4 to i32 465 %add = add nsw i32 %conv, %p6 466 %conv1 = zext i8 %p7 to i32 467 %add2 = add nsw i32 %add, %conv1 468 %add3 = add i32 %add2, %p8 469 %conv4 = zext i32 %add3 to i64 470 store i64 %conv4, i64* %p3, align 8 471 %0 = load fp128, fp128* %p5, align 16 472 %add5 = fadd fp128 %0, %p1 473 %conv6 = fpext double %p2 to fp128 474 %add7 = fadd fp128 %add5, %conv6 475 ret fp128 %add7 476} 477 478; Function Attrs: norecurse nounwind 479define fastcc fp128 @mixParam_02f(fp128 %p1, double %p2, i64* nocapture %p3, 480; CHECK-LABEL: mixParam_02f: 481; CHECK: # %bb.0: # %entry 482; CHECK-NEXT: add r4, r4, r6 483; CHECK-NEXT: xscpsgndp v3, f1, f1 484; CHECK-NEXT: add r4, r4, r7 485; CHECK-NEXT: xscvdpqp v3, v3 486; CHECK-NEXT: add r4, r4, r8 487; CHECK-NEXT: clrldi r4, r4, 32 488; CHECK-NEXT: std r4, 0(r3) 489; CHECK-NEXT: lxv v4, 0(r5) 490; CHECK-NEXT: xsaddqp v2, v4, v2 491; CHECK-NEXT: xsaddqp v2, v2, v3 492; CHECK-NEXT: blr 493; 494; CHECK-P8-LABEL: mixParam_02f: 495; CHECK-P8: # %bb.0: # %entry 496; CHECK-P8-NEXT: mflr r0 497; CHECK-P8-NEXT: std r0, 16(r1) 498; CHECK-P8-NEXT: stdu r1, -80(r1) 499; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 500; CHECK-P8-NEXT: .cfi_offset lr, 16 501; CHECK-P8-NEXT: .cfi_offset f31, -8 502; CHECK-P8-NEXT: .cfi_offset v31, -32 503; CHECK-P8-NEXT: add r4, r4, r6 504; CHECK-P8-NEXT: vmr v4, v2 505; CHECK-P8-NEXT: li r9, 48 506; CHECK-P8-NEXT: stfd f31, 72(r1) # 8-byte Folded Spill 507; CHECK-P8-NEXT: add r4, r4, r7 508; CHECK-P8-NEXT: stvx v31, r1, r9 # 16-byte Folded Spill 509; CHECK-P8-NEXT: fmr f31, f1 510; CHECK-P8-NEXT: add r4, r4, r8 511; CHECK-P8-NEXT: clrldi r4, r4, 32 512; CHECK-P8-NEXT: std r4, 0(r3) 513; CHECK-P8-NEXT: lvx v3, 0, r5 514; CHECK-P8-NEXT: vmr v2, v3 515; CHECK-P8-NEXT: vmr v3, v4 516; CHECK-P8-NEXT: bl __addkf3 517; CHECK-P8-NEXT: nop 518; CHECK-P8-NEXT: fmr f1, f31 519; CHECK-P8-NEXT: vmr v31, v2 520; CHECK-P8-NEXT: bl __extenddfkf2 521; CHECK-P8-NEXT: nop 522; CHECK-P8-NEXT: vmr v3, v2 523; CHECK-P8-NEXT: vmr v2, v31 524; CHECK-P8-NEXT: bl __addkf3 525; CHECK-P8-NEXT: nop 526; CHECK-P8-NEXT: li r3, 48 527; CHECK-P8-NEXT: lfd f31, 72(r1) # 8-byte Folded Reload 528; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload 529; CHECK-P8-NEXT: addi r1, r1, 80 530; CHECK-P8-NEXT: ld r0, 16(r1) 531; CHECK-P8-NEXT: mtlr r0 532; CHECK-P8-NEXT: blr 533 i16 signext %p4, fp128* nocapture readonly %p5, 534 i32 signext %p6, i8 zeroext %p7, i32 zeroext %p8) { 535entry: 536 %conv = sext i16 %p4 to i32 537 %add = add nsw i32 %conv, %p6 538 %conv1 = zext i8 %p7 to i32 539 %add2 = add nsw i32 %add, %conv1 540 %add3 = add i32 %add2, %p8 541 %conv4 = zext i32 %add3 to i64 542 store i64 %conv4, i64* %p3, align 8 543 %0 = load fp128, fp128* %p5, align 16 544 %add5 = fadd fp128 %0, %p1 545 %conv6 = fpext double %p2 to fp128 546 %add7 = fadd fp128 %add5, %conv6 547 ret fp128 %add7 548} 549 550; Passing a mix of float128 and vector parameters. 551; Function Attrs: norecurse nounwind 552define void @mixParam_03(fp128 %f1, double* nocapture %d1, <4 x i32> %vec1, 553; CHECK-LABEL: mixParam_03: 554; CHECK: # %bb.0: # %entry 555; CHECK-NEXT: ld r3, 104(r1) 556; CHECK-NEXT: stxv v2, 0(r9) 557; CHECK-NEXT: stxvx v3, 0, r3 558; CHECK-NEXT: mtvsrwa v3, r10 559; CHECK-NEXT: lxv v2, 0(r9) 560; CHECK-NEXT: xscvsdqp v3, v3 561; CHECK-NEXT: xsaddqp v2, v2, v3 562; CHECK-NEXT: xscvqpdp v2, v2 563; CHECK-NEXT: stxsd v2, 0(r5) 564; CHECK-NEXT: blr 565; 566; CHECK-P8-LABEL: mixParam_03: 567; CHECK-P8: # %bb.0: # %entry 568; CHECK-P8-NEXT: mflr r0 569; CHECK-P8-NEXT: std r0, 16(r1) 570; CHECK-P8-NEXT: stdu r1, -80(r1) 571; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 572; CHECK-P8-NEXT: .cfi_offset lr, 16 573; CHECK-P8-NEXT: .cfi_offset r30, -16 574; CHECK-P8-NEXT: .cfi_offset v31, -32 575; CHECK-P8-NEXT: ld r4, 184(r1) 576; CHECK-P8-NEXT: li r3, 48 577; CHECK-P8-NEXT: stvx v2, 0, r9 578; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill 579; CHECK-P8-NEXT: mr r30, r5 580; CHECK-P8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill 581; CHECK-P8-NEXT: mr r3, r10 582; CHECK-P8-NEXT: stvx v3, 0, r4 583; CHECK-P8-NEXT: lvx v31, 0, r9 584; CHECK-P8-NEXT: bl __floatsikf 585; CHECK-P8-NEXT: nop 586; CHECK-P8-NEXT: vmr v3, v2 587; CHECK-P8-NEXT: vmr v2, v31 588; CHECK-P8-NEXT: bl __addkf3 589; CHECK-P8-NEXT: nop 590; CHECK-P8-NEXT: bl __trunckfdf2 591; CHECK-P8-NEXT: nop 592; CHECK-P8-NEXT: li r3, 48 593; CHECK-P8-NEXT: stfdx f1, 0, r30 594; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload 595; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload 596; CHECK-P8-NEXT: addi r1, r1, 80 597; CHECK-P8-NEXT: ld r0, 16(r1) 598; CHECK-P8-NEXT: mtlr r0 599; CHECK-P8-NEXT: blr 600 fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1, 601 <4 x i32>* nocapture %vec2) { 602entry: 603 store fp128 %f1, fp128* %f2, align 16 604 store <4 x i32> %vec1, <4 x i32>* %vec2, align 16 605 %0 = load fp128, fp128* %f2, align 16 606 %conv = sitofp i32 %i1 to fp128 607 %add = fadd fp128 %0, %conv 608 %conv1 = fptrunc fp128 %add to double 609 store double %conv1, double* %d1, align 8 610 ret void 611} 612 613; Function Attrs: norecurse nounwind 614define fastcc void @mixParam_03f(fp128 %f1, double* nocapture %d1, <4 x i32> %vec1, 615; CHECK-LABEL: mixParam_03f: 616; CHECK: # %bb.0: # %entry 617; CHECK-NEXT: stxv v2, 0(r4) 618; CHECK-NEXT: stxv v3, 0(r7) 619; CHECK-NEXT: lxv v2, 0(r4) 620; CHECK-NEXT: mtvsrwa v3, r5 621; CHECK-NEXT: xscvsdqp v3, v3 622; CHECK-NEXT: xsaddqp v2, v2, v3 623; CHECK-NEXT: xscvqpdp v2, v2 624; CHECK-NEXT: stxsd v2, 0(r3) 625; CHECK-NEXT: blr 626; 627; CHECK-P8-LABEL: mixParam_03f: 628; CHECK-P8: # %bb.0: # %entry 629; CHECK-P8-NEXT: mflr r0 630; CHECK-P8-NEXT: std r0, 16(r1) 631; CHECK-P8-NEXT: stdu r1, -80(r1) 632; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 633; CHECK-P8-NEXT: .cfi_offset lr, 16 634; CHECK-P8-NEXT: .cfi_offset r30, -16 635; CHECK-P8-NEXT: .cfi_offset v31, -32 636; CHECK-P8-NEXT: li r6, 48 637; CHECK-P8-NEXT: stvx v2, 0, r4 638; CHECK-P8-NEXT: stvx v3, 0, r7 639; CHECK-P8-NEXT: std r30, 64(r1) # 8-byte Folded Spill 640; CHECK-P8-NEXT: mr r30, r3 641; CHECK-P8-NEXT: mr r3, r5 642; CHECK-P8-NEXT: stvx v31, r1, r6 # 16-byte Folded Spill 643; CHECK-P8-NEXT: lvx v31, 0, r4 644; CHECK-P8-NEXT: bl __floatsikf 645; CHECK-P8-NEXT: nop 646; CHECK-P8-NEXT: vmr v3, v2 647; CHECK-P8-NEXT: vmr v2, v31 648; CHECK-P8-NEXT: bl __addkf3 649; CHECK-P8-NEXT: nop 650; CHECK-P8-NEXT: bl __trunckfdf2 651; CHECK-P8-NEXT: nop 652; CHECK-P8-NEXT: li r3, 48 653; CHECK-P8-NEXT: stfdx f1, 0, r30 654; CHECK-P8-NEXT: ld r30, 64(r1) # 8-byte Folded Reload 655; CHECK-P8-NEXT: lvx v31, r1, r3 # 16-byte Folded Reload 656; CHECK-P8-NEXT: addi r1, r1, 80 657; CHECK-P8-NEXT: ld r0, 16(r1) 658; CHECK-P8-NEXT: mtlr r0 659; CHECK-P8-NEXT: blr 660 fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1, 661 <4 x i32>* nocapture %vec2) { 662entry: 663 store fp128 %f1, fp128* %f2, align 16 664 store <4 x i32> %vec1, <4 x i32>* %vec2, align 16 665 %0 = load fp128, fp128* %f2, align 16 666 %conv = sitofp i32 %i1 to fp128 667 %add = fadd fp128 %0, %conv 668 %conv1 = fptrunc fp128 %add to double 669 store double %conv1, double* %d1, align 8 670 ret void 671} 672 673; Function Attrs: noinline optnone 674define signext i32 @noopt_call_crash() #0 { 675; CHECK-LABEL: noopt_call_crash: 676; CHECK: # %bb.0: # %entry 677; CHECK-NEXT: mflr r0 678; CHECK-NEXT: std r0, 16(r1) 679; CHECK-NEXT: stdu r1, -96(r1) 680; CHECK-NEXT: .cfi_def_cfa_offset 96 681; CHECK-NEXT: .cfi_offset lr, 16 682; CHECK-NEXT: bl in 683; CHECK-NEXT: nop 684; CHECK-NEXT: bl out 685; CHECK-NEXT: nop 686; CHECK-NEXT: li r3, 0 687; CHECK-NEXT: addi r1, r1, 96 688; CHECK-NEXT: ld r0, 16(r1) 689; CHECK-NEXT: mtlr r0 690; CHECK-NEXT: blr 691; 692; CHECK-P8-LABEL: noopt_call_crash: 693; CHECK-P8: # %bb.0: # %entry 694; CHECK-P8-NEXT: mflr r0 695; CHECK-P8-NEXT: std r0, 16(r1) 696; CHECK-P8-NEXT: stdu r1, -96(r1) 697; CHECK-P8-NEXT: .cfi_def_cfa_offset 96 698; CHECK-P8-NEXT: .cfi_offset lr, 16 699; CHECK-P8-NEXT: bl in 700; CHECK-P8-NEXT: nop 701; CHECK-P8-NEXT: bl out 702; CHECK-P8-NEXT: nop 703; CHECK-P8-NEXT: li r3, 0 704; CHECK-P8-NEXT: addi r1, r1, 96 705; CHECK-P8-NEXT: ld r0, 16(r1) 706; CHECK-P8-NEXT: mtlr r0 707; CHECK-P8-NEXT: blr 708entry: 709 %call = call fp128 @in() 710 call void @out(fp128 %call) 711 ret i32 0 712} 713 714declare void @out(fp128) 715declare fp128 @in() 716 717attributes #0 = { noinline optnone } 718