1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 3; RUN: < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr9 | FileCheck %s 4; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 5; RUN: < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr8 | FileCheck %s --check-prefix=CHECK-P8 6 7declare fp128 @llvm.experimental.constrained.fadd.f128(fp128, fp128, metadata, metadata) 8declare fp128 @llvm.experimental.constrained.fsub.f128(fp128, fp128, metadata, metadata) 9declare fp128 @llvm.experimental.constrained.fmul.f128(fp128, fp128, metadata, metadata) 10declare fp128 @llvm.experimental.constrained.fdiv.f128(fp128, fp128, metadata, metadata) 11 12declare fp128 @llvm.experimental.constrained.fma.f128(fp128, fp128, fp128, metadata, metadata) 13declare fp128 @llvm.experimental.constrained.sqrt.f128(fp128, metadata, metadata) 14 15define fp128 @fadd_f128(fp128 %f1, fp128 %f2) #0 { 16; CHECK-LABEL: fadd_f128: 17; CHECK: # %bb.0: 18; CHECK-NEXT: xsaddqp v2, v2, v3 19; CHECK-NEXT: blr 20; 21; CHECK-P8-LABEL: fadd_f128: 22; CHECK-P8: # %bb.0: 23; CHECK-P8-NEXT: mflr r0 24; CHECK-P8-NEXT: std r0, 16(r1) 25; CHECK-P8-NEXT: stdu r1, -32(r1) 26; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 27; CHECK-P8-NEXT: .cfi_offset lr, 16 28; CHECK-P8-NEXT: bl __addkf3 29; CHECK-P8-NEXT: nop 30; CHECK-P8-NEXT: addi r1, r1, 32 31; CHECK-P8-NEXT: ld r0, 16(r1) 32; CHECK-P8-NEXT: mtlr r0 33; CHECK-P8-NEXT: blr 34 %res = call fp128 @llvm.experimental.constrained.fadd.f128( 35 fp128 %f1, fp128 %f2, 36 metadata !"round.dynamic", 37 metadata !"fpexcept.strict") #0 38 ret fp128 %res 39} 40 41define fp128 @fsub_f128(fp128 %f1, fp128 %f2) #0 { 42; CHECK-LABEL: fsub_f128: 43; CHECK: # %bb.0: 44; CHECK-NEXT: xssubqp v2, v2, v3 45; CHECK-NEXT: blr 46; 47; CHECK-P8-LABEL: fsub_f128: 48; CHECK-P8: # %bb.0: 49; CHECK-P8-NEXT: mflr r0 50; CHECK-P8-NEXT: std r0, 16(r1) 51; CHECK-P8-NEXT: stdu r1, -32(r1) 52; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 53; CHECK-P8-NEXT: .cfi_offset lr, 16 54; CHECK-P8-NEXT: bl __subkf3 55; CHECK-P8-NEXT: nop 56; CHECK-P8-NEXT: addi r1, r1, 32 57; CHECK-P8-NEXT: ld r0, 16(r1) 58; CHECK-P8-NEXT: mtlr r0 59; CHECK-P8-NEXT: blr 60 %res = call fp128 @llvm.experimental.constrained.fsub.f128( 61 fp128 %f1, fp128 %f2, 62 metadata !"round.dynamic", 63 metadata !"fpexcept.strict") #0 64 ret fp128 %res 65} 66 67define fp128 @fmul_f128(fp128 %f1, fp128 %f2) #0 { 68; CHECK-LABEL: fmul_f128: 69; CHECK: # %bb.0: 70; CHECK-NEXT: xsmulqp v2, v2, v3 71; CHECK-NEXT: blr 72; 73; CHECK-P8-LABEL: fmul_f128: 74; CHECK-P8: # %bb.0: 75; CHECK-P8-NEXT: mflr r0 76; CHECK-P8-NEXT: std r0, 16(r1) 77; CHECK-P8-NEXT: stdu r1, -32(r1) 78; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 79; CHECK-P8-NEXT: .cfi_offset lr, 16 80; CHECK-P8-NEXT: bl __mulkf3 81; CHECK-P8-NEXT: nop 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 86 %res = call fp128 @llvm.experimental.constrained.fmul.f128( 87 fp128 %f1, fp128 %f2, 88 metadata !"round.dynamic", 89 metadata !"fpexcept.strict") #0 90 ret fp128 %res 91} 92 93define fp128 @fdiv_f128(fp128 %f1, fp128 %f2) #0 { 94; CHECK-LABEL: fdiv_f128: 95; CHECK: # %bb.0: 96; CHECK-NEXT: xsdivqp v2, v2, v3 97; CHECK-NEXT: blr 98; 99; CHECK-P8-LABEL: fdiv_f128: 100; CHECK-P8: # %bb.0: 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 __divkf3 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 112 %res = call fp128 @llvm.experimental.constrained.fdiv.f128( 113 fp128 %f1, fp128 %f2, 114 metadata !"round.dynamic", 115 metadata !"fpexcept.strict") #0 116 ret fp128 %res 117} 118 119define fp128 @fmadd_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 { 120; CHECK-LABEL: fmadd_f128: 121; CHECK: # %bb.0: 122; CHECK-NEXT: xsmaddqp v4, v2, v3 123; CHECK-NEXT: vmr v2, v4 124; CHECK-NEXT: blr 125; 126; CHECK-P8-LABEL: fmadd_f128: 127; CHECK-P8: # %bb.0: 128; CHECK-P8-NEXT: mflr r0 129; CHECK-P8-NEXT: std r0, 16(r1) 130; CHECK-P8-NEXT: stdu r1, -32(r1) 131; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 132; CHECK-P8-NEXT: .cfi_offset lr, 16 133; CHECK-P8-NEXT: bl fmal 134; CHECK-P8-NEXT: nop 135; CHECK-P8-NEXT: addi r1, r1, 32 136; CHECK-P8-NEXT: ld r0, 16(r1) 137; CHECK-P8-NEXT: mtlr r0 138; CHECK-P8-NEXT: blr 139 %res = call fp128 @llvm.experimental.constrained.fma.f128( 140 fp128 %f0, fp128 %f1, fp128 %f2, 141 metadata !"round.dynamic", 142 metadata !"fpexcept.strict") #0 143 ret fp128 %res 144} 145 146define fp128 @fmsub_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 { 147; CHECK-LABEL: fmsub_f128: 148; CHECK: # %bb.0: 149; CHECK-NEXT: xsmsubqp v4, v2, v3 150; CHECK-NEXT: vmr v2, v4 151; CHECK-NEXT: blr 152; 153; CHECK-P8-LABEL: fmsub_f128: 154; CHECK-P8: # %bb.0: 155; CHECK-P8-NEXT: mflr r0 156; CHECK-P8-NEXT: std r0, 16(r1) 157; CHECK-P8-NEXT: stdu r1, -32(r1) 158; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 159; CHECK-P8-NEXT: .cfi_offset lr, 16 160; CHECK-P8-NEXT: li r9, 1 161; CHECK-P8-NEXT: sldi r9, r9, 63 162; CHECK-P8-NEXT: xor r8, r8, r9 163; CHECK-P8-NEXT: bl fmal 164; CHECK-P8-NEXT: nop 165; CHECK-P8-NEXT: addi r1, r1, 32 166; CHECK-P8-NEXT: ld r0, 16(r1) 167; CHECK-P8-NEXT: mtlr r0 168; CHECK-P8-NEXT: blr 169 %neg = fneg fp128 %f2 170 %res = call fp128 @llvm.experimental.constrained.fma.f128( 171 fp128 %f0, fp128 %f1, fp128 %neg, 172 metadata !"round.dynamic", 173 metadata !"fpexcept.strict") #0 174 ret fp128 %res 175} 176 177define fp128 @fnmadd_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 { 178; CHECK-LABEL: fnmadd_f128: 179; CHECK: # %bb.0: 180; CHECK-NEXT: xsnmaddqp v4, v2, v3 181; CHECK-NEXT: vmr v2, v4 182; CHECK-NEXT: blr 183; 184; CHECK-P8-LABEL: fnmadd_f128: 185; CHECK-P8: # %bb.0: 186; CHECK-P8-NEXT: mflr r0 187; CHECK-P8-NEXT: std r0, 16(r1) 188; CHECK-P8-NEXT: stdu r1, -32(r1) 189; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 190; CHECK-P8-NEXT: .cfi_offset lr, 16 191; CHECK-P8-NEXT: bl fmal 192; CHECK-P8-NEXT: nop 193; CHECK-P8-NEXT: li r5, 1 194; CHECK-P8-NEXT: sldi r5, r5, 63 195; CHECK-P8-NEXT: xor r4, r4, r5 196; CHECK-P8-NEXT: addi r1, r1, 32 197; CHECK-P8-NEXT: ld r0, 16(r1) 198; CHECK-P8-NEXT: mtlr r0 199; CHECK-P8-NEXT: blr 200 %fma = call fp128 @llvm.experimental.constrained.fma.f128( 201 fp128 %f0, fp128 %f1, fp128 %f2, 202 metadata !"round.dynamic", 203 metadata !"fpexcept.strict") #0 204 %res = fneg fp128 %fma 205 ret fp128 %res 206} 207 208define fp128 @fnmsub_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 { 209; CHECK-LABEL: fnmsub_f128: 210; CHECK: # %bb.0: 211; CHECK-NEXT: xsnmsubqp v4, v2, v3 212; CHECK-NEXT: vmr v2, v4 213; CHECK-NEXT: blr 214; 215; CHECK-P8-LABEL: fnmsub_f128: 216; CHECK-P8: # %bb.0: 217; CHECK-P8-NEXT: mflr r0 218; CHECK-P8-NEXT: .cfi_def_cfa_offset 48 219; CHECK-P8-NEXT: .cfi_offset lr, 16 220; CHECK-P8-NEXT: .cfi_offset r30, -16 221; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 222; CHECK-P8-NEXT: std r0, 16(r1) 223; CHECK-P8-NEXT: stdu r1, -48(r1) 224; CHECK-P8-NEXT: li r9, 1 225; CHECK-P8-NEXT: sldi r30, r9, 63 226; CHECK-P8-NEXT: xor r8, r8, r30 227; CHECK-P8-NEXT: bl fmal 228; CHECK-P8-NEXT: nop 229; CHECK-P8-NEXT: xor r4, r4, r30 230; CHECK-P8-NEXT: addi r1, r1, 48 231; CHECK-P8-NEXT: ld r0, 16(r1) 232; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 233; CHECK-P8-NEXT: mtlr r0 234; CHECK-P8-NEXT: blr 235 %neg = fneg fp128 %f2 236 %fma = call fp128 @llvm.experimental.constrained.fma.f128( 237 fp128 %f0, fp128 %f1, fp128 %neg, 238 metadata !"round.dynamic", 239 metadata !"fpexcept.strict") #0 240 %res = fneg fp128 %fma 241 ret fp128 %res 242} 243 244 245define fp128 @fsqrt_f128(fp128 %f1) #0 { 246; CHECK-LABEL: fsqrt_f128: 247; CHECK: # %bb.0: 248; CHECK-NEXT: xssqrtqp v2, v2 249; CHECK-NEXT: blr 250; 251; CHECK-P8-LABEL: fsqrt_f128: 252; CHECK-P8: # %bb.0: 253; CHECK-P8-NEXT: mflr r0 254; CHECK-P8-NEXT: std r0, 16(r1) 255; CHECK-P8-NEXT: stdu r1, -32(r1) 256; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 257; CHECK-P8-NEXT: .cfi_offset lr, 16 258; CHECK-P8-NEXT: bl sqrtl 259; CHECK-P8-NEXT: nop 260; CHECK-P8-NEXT: addi r1, r1, 32 261; CHECK-P8-NEXT: ld r0, 16(r1) 262; CHECK-P8-NEXT: mtlr r0 263; CHECK-P8-NEXT: blr 264 %res = call fp128 @llvm.experimental.constrained.sqrt.f128( 265 fp128 %f1, 266 metadata !"round.dynamic", 267 metadata !"fpexcept.strict") #0 268 ret fp128 %res 269} 270 271attributes #0 = { strictfp } 272