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