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: stdu r1, -32(r1) 25; CHECK-P8-NEXT: std r0, 48(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: stdu r1, -32(r1) 51; CHECK-P8-NEXT: std r0, 48(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: stdu r1, -32(r1) 77; CHECK-P8-NEXT: std r0, 48(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: stdu r1, -32(r1) 103; CHECK-P8-NEXT: std r0, 48(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: stdu r1, -32(r1) 130; CHECK-P8-NEXT: std r0, 48(r1) 131; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 132; CHECK-P8-NEXT: .cfi_offset lr, 16 133; CHECK-P8-NEXT: bl fmaf128 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: stdu r1, -48(r1) 157; CHECK-P8-NEXT: std r0, 64(r1) 158; CHECK-P8-NEXT: .cfi_def_cfa_offset 48 159; CHECK-P8-NEXT: .cfi_offset lr, 16 160; CHECK-P8-NEXT: xxswapd vs0, v4 161; CHECK-P8-NEXT: addi r3, r1, 32 162; CHECK-P8-NEXT: stxvd2x vs0, 0, r3 163; CHECK-P8-NEXT: lbz r4, 47(r1) 164; CHECK-P8-NEXT: xori r4, r4, 128 165; CHECK-P8-NEXT: stb r4, 47(r1) 166; CHECK-P8-NEXT: lxvd2x vs0, 0, r3 167; CHECK-P8-NEXT: xxswapd v4, vs0 168; CHECK-P8-NEXT: bl fmaf128 169; CHECK-P8-NEXT: nop 170; CHECK-P8-NEXT: addi r1, r1, 48 171; CHECK-P8-NEXT: ld r0, 16(r1) 172; CHECK-P8-NEXT: mtlr r0 173; CHECK-P8-NEXT: blr 174 %neg = fneg fp128 %f2 175 %res = call fp128 @llvm.experimental.constrained.fma.f128( 176 fp128 %f0, fp128 %f1, fp128 %neg, 177 metadata !"round.dynamic", 178 metadata !"fpexcept.strict") #0 179 ret fp128 %res 180} 181 182define fp128 @fnmadd_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 { 183; CHECK-LABEL: fnmadd_f128: 184; CHECK: # %bb.0: 185; CHECK-NEXT: xsnmaddqp v4, v2, v3 186; CHECK-NEXT: vmr v2, v4 187; CHECK-NEXT: blr 188; 189; CHECK-P8-LABEL: fnmadd_f128: 190; CHECK-P8: # %bb.0: 191; CHECK-P8-NEXT: mflr r0 192; CHECK-P8-NEXT: stdu r1, -48(r1) 193; CHECK-P8-NEXT: std r0, 64(r1) 194; CHECK-P8-NEXT: .cfi_def_cfa_offset 48 195; CHECK-P8-NEXT: .cfi_offset lr, 16 196; CHECK-P8-NEXT: bl fmaf128 197; CHECK-P8-NEXT: nop 198; CHECK-P8-NEXT: xxswapd vs0, v2 199; CHECK-P8-NEXT: addi r3, r1, 32 200; CHECK-P8-NEXT: stxvd2x vs0, 0, r3 201; CHECK-P8-NEXT: lbz r4, 47(r1) 202; CHECK-P8-NEXT: xori r4, r4, 128 203; CHECK-P8-NEXT: stb r4, 47(r1) 204; CHECK-P8-NEXT: lxvd2x vs0, 0, r3 205; CHECK-P8-NEXT: xxswapd v2, vs0 206; CHECK-P8-NEXT: addi r1, r1, 48 207; CHECK-P8-NEXT: ld r0, 16(r1) 208; CHECK-P8-NEXT: mtlr r0 209; CHECK-P8-NEXT: blr 210 %fma = call fp128 @llvm.experimental.constrained.fma.f128( 211 fp128 %f0, fp128 %f1, fp128 %f2, 212 metadata !"round.dynamic", 213 metadata !"fpexcept.strict") #0 214 %res = fneg fp128 %fma 215 ret fp128 %res 216} 217 218define fp128 @fnmsub_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 { 219; CHECK-LABEL: fnmsub_f128: 220; CHECK: # %bb.0: 221; CHECK-NEXT: xsnmsubqp v4, v2, v3 222; CHECK-NEXT: vmr v2, v4 223; CHECK-NEXT: blr 224; 225; CHECK-P8-LABEL: fnmsub_f128: 226; CHECK-P8: # %bb.0: 227; CHECK-P8-NEXT: mflr r0 228; CHECK-P8-NEXT: stdu r1, -64(r1) 229; CHECK-P8-NEXT: std r0, 80(r1) 230; CHECK-P8-NEXT: .cfi_def_cfa_offset 64 231; CHECK-P8-NEXT: .cfi_offset lr, 16 232; CHECK-P8-NEXT: xxswapd vs0, v4 233; CHECK-P8-NEXT: addi r3, r1, 32 234; CHECK-P8-NEXT: stxvd2x vs0, 0, r3 235; CHECK-P8-NEXT: lbz r4, 47(r1) 236; CHECK-P8-NEXT: xori r4, r4, 128 237; CHECK-P8-NEXT: stb r4, 47(r1) 238; CHECK-P8-NEXT: lxvd2x vs0, 0, r3 239; CHECK-P8-NEXT: xxswapd v4, vs0 240; CHECK-P8-NEXT: bl fmaf128 241; CHECK-P8-NEXT: nop 242; CHECK-P8-NEXT: xxswapd vs0, v2 243; CHECK-P8-NEXT: addi r3, r1, 48 244; CHECK-P8-NEXT: stxvd2x vs0, 0, r3 245; CHECK-P8-NEXT: lbz r4, 63(r1) 246; CHECK-P8-NEXT: xori r4, r4, 128 247; CHECK-P8-NEXT: stb r4, 63(r1) 248; CHECK-P8-NEXT: lxvd2x vs0, 0, r3 249; CHECK-P8-NEXT: xxswapd v2, vs0 250; CHECK-P8-NEXT: addi r1, r1, 64 251; CHECK-P8-NEXT: ld r0, 16(r1) 252; CHECK-P8-NEXT: mtlr r0 253; CHECK-P8-NEXT: blr 254 %neg = fneg fp128 %f2 255 %fma = call fp128 @llvm.experimental.constrained.fma.f128( 256 fp128 %f0, fp128 %f1, fp128 %neg, 257 metadata !"round.dynamic", 258 metadata !"fpexcept.strict") #0 259 %res = fneg fp128 %fma 260 ret fp128 %res 261} 262 263 264define fp128 @fsqrt_f128(fp128 %f1) #0 { 265; CHECK-LABEL: fsqrt_f128: 266; CHECK: # %bb.0: 267; CHECK-NEXT: xssqrtqp v2, v2 268; CHECK-NEXT: blr 269; 270; CHECK-P8-LABEL: fsqrt_f128: 271; CHECK-P8: # %bb.0: 272; CHECK-P8-NEXT: mflr r0 273; CHECK-P8-NEXT: stdu r1, -32(r1) 274; CHECK-P8-NEXT: std r0, 48(r1) 275; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 276; CHECK-P8-NEXT: .cfi_offset lr, 16 277; CHECK-P8-NEXT: bl sqrtf128 278; CHECK-P8-NEXT: nop 279; CHECK-P8-NEXT: addi r1, r1, 32 280; CHECK-P8-NEXT: ld r0, 16(r1) 281; CHECK-P8-NEXT: mtlr r0 282; CHECK-P8-NEXT: blr 283 %res = call fp128 @llvm.experimental.constrained.sqrt.f128( 284 fp128 %f1, 285 metadata !"round.dynamic", 286 metadata !"fpexcept.strict") #0 287 ret fp128 %res 288} 289 290attributes #0 = { strictfp } 291