1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=-vsx | FileCheck --check-prefix=CHECK-P7 %s 3; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | FileCheck --check-prefix=CHECK-P8 %s 4; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 | FileCheck --check-prefix=CHECK-P9 %s 5 6target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" 7 8declare double @llvm.sqrt.f64(double) 9declare float @llvm.sqrt.f32(float) 10declare fp128 @llvm.sqrt.f128(fp128) 11declare <4 x float> @llvm.sqrt.v4f32(<4 x float>) 12declare <2 x double> @llvm.sqrt.v2f64(<2 x double>) 13 14define double @foo_fmf(double %a, double %b) nounwind { 15; CHECK-P7-LABEL: foo_fmf: 16; CHECK-P7: # %bb.0: 17; CHECK-P7-NEXT: frsqrte 0, 2 18; CHECK-P7-NEXT: addis 3, 2, .LCPI0_0@toc@ha 19; CHECK-P7-NEXT: addis 4, 2, .LCPI0_1@toc@ha 20; CHECK-P7-NEXT: lfs 4, .LCPI0_0@toc@l(3) 21; CHECK-P7-NEXT: lfs 5, .LCPI0_1@toc@l(4) 22; CHECK-P7-NEXT: fmul 3, 2, 0 23; CHECK-P7-NEXT: fmadd 3, 3, 0, 4 24; CHECK-P7-NEXT: fmul 0, 0, 5 25; CHECK-P7-NEXT: fmul 0, 0, 3 26; CHECK-P7-NEXT: fmul 2, 2, 0 27; CHECK-P7-NEXT: fmadd 2, 2, 0, 4 28; CHECK-P7-NEXT: fmul 0, 0, 5 29; CHECK-P7-NEXT: fmul 0, 0, 2 30; CHECK-P7-NEXT: fmul 1, 1, 0 31; CHECK-P7-NEXT: blr 32; 33; CHECK-P8-LABEL: foo_fmf: 34; CHECK-P8: # %bb.0: 35; CHECK-P8-NEXT: xsrsqrtedp 0, 2 36; CHECK-P8-NEXT: addis 3, 2, .LCPI0_0@toc@ha 37; CHECK-P8-NEXT: lfs 4, .LCPI0_0@toc@l(3) 38; CHECK-P8-NEXT: addis 3, 2, .LCPI0_1@toc@ha 39; CHECK-P8-NEXT: lfs 5, .LCPI0_1@toc@l(3) 40; CHECK-P8-NEXT: fmr 6, 4 41; CHECK-P8-NEXT: xsmuldp 3, 2, 0 42; CHECK-P8-NEXT: xsmaddadp 6, 3, 0 43; CHECK-P8-NEXT: xsmuldp 0, 0, 5 44; CHECK-P8-NEXT: xsmuldp 0, 0, 6 45; CHECK-P8-NEXT: xsmuldp 2, 2, 0 46; CHECK-P8-NEXT: xsmaddadp 4, 2, 0 47; CHECK-P8-NEXT: xsmuldp 0, 0, 5 48; CHECK-P8-NEXT: xsmuldp 0, 0, 4 49; CHECK-P8-NEXT: xsmuldp 1, 1, 0 50; CHECK-P8-NEXT: blr 51; 52; CHECK-P9-LABEL: foo_fmf: 53; CHECK-P9: # %bb.0: 54; CHECK-P9-NEXT: xsrsqrtedp 0, 2 55; CHECK-P9-NEXT: addis 3, 2, .LCPI0_0@toc@ha 56; CHECK-P9-NEXT: lfs 4, .LCPI0_0@toc@l(3) 57; CHECK-P9-NEXT: addis 3, 2, .LCPI0_1@toc@ha 58; CHECK-P9-NEXT: xsmuldp 3, 2, 0 59; CHECK-P9-NEXT: fmr 5, 4 60; CHECK-P9-NEXT: xsmaddadp 5, 3, 0 61; CHECK-P9-NEXT: lfs 3, .LCPI0_1@toc@l(3) 62; CHECK-P9-NEXT: xsmuldp 0, 0, 3 63; CHECK-P9-NEXT: xsmuldp 0, 0, 5 64; CHECK-P9-NEXT: xsmuldp 2, 2, 0 65; CHECK-P9-NEXT: xsmaddadp 4, 2, 0 66; CHECK-P9-NEXT: xsmuldp 0, 0, 3 67; CHECK-P9-NEXT: xsmuldp 0, 0, 4 68; CHECK-P9-NEXT: xsmuldp 1, 1, 0 69; CHECK-P9-NEXT: blr 70 %x = call arcp reassoc double @llvm.sqrt.f64(double %b) 71 %r = fdiv arcp reassoc double %a, %x 72 ret double %r 73} 74 75define double @foo_safe(double %a, double %b) nounwind { 76; CHECK-P7-LABEL: foo_safe: 77; CHECK-P7: # %bb.0: 78; CHECK-P7-NEXT: fsqrt 0, 2 79; CHECK-P7-NEXT: fdiv 1, 1, 0 80; CHECK-P7-NEXT: blr 81; 82; CHECK-P8-LABEL: foo_safe: 83; CHECK-P8: # %bb.0: 84; CHECK-P8-NEXT: xssqrtdp 0, 2 85; CHECK-P8-NEXT: xsdivdp 1, 1, 0 86; CHECK-P8-NEXT: blr 87; 88; CHECK-P9-LABEL: foo_safe: 89; CHECK-P9: # %bb.0: 90; CHECK-P9-NEXT: xssqrtdp 0, 2 91; CHECK-P9-NEXT: xsdivdp 1, 1, 0 92; CHECK-P9-NEXT: blr 93 %x = call double @llvm.sqrt.f64(double %b) 94 %r = fdiv double %a, %x 95 ret double %r 96} 97 98define double @no_estimate_refinement_f64(double %a, double %b) #0 { 99; CHECK-P7-LABEL: no_estimate_refinement_f64: 100; CHECK-P7: # %bb.0: 101; CHECK-P7-NEXT: frsqrte 0, 2 102; CHECK-P7-NEXT: fmul 1, 1, 0 103; CHECK-P7-NEXT: blr 104; 105; CHECK-P8-LABEL: no_estimate_refinement_f64: 106; CHECK-P8: # %bb.0: 107; CHECK-P8-NEXT: xsrsqrtedp 0, 2 108; CHECK-P8-NEXT: xsmuldp 1, 1, 0 109; CHECK-P8-NEXT: blr 110; 111; CHECK-P9-LABEL: no_estimate_refinement_f64: 112; CHECK-P9: # %bb.0: 113; CHECK-P9-NEXT: xsrsqrtedp 0, 2 114; CHECK-P9-NEXT: xsmuldp 1, 1, 0 115; CHECK-P9-NEXT: blr 116 %x = call arcp reassoc double @llvm.sqrt.f64(double %b) 117 %r = fdiv arcp reassoc double %a, %x 118 ret double %r 119} 120 121define double @foof_fmf(double %a, float %b) nounwind { 122; CHECK-P7-LABEL: foof_fmf: 123; CHECK-P7: # %bb.0: 124; CHECK-P7-NEXT: frsqrtes 0, 2 125; CHECK-P7-NEXT: addis 3, 2, .LCPI3_0@toc@ha 126; CHECK-P7-NEXT: addis 4, 2, .LCPI3_1@toc@ha 127; CHECK-P7-NEXT: lfs 3, .LCPI3_0@toc@l(3) 128; CHECK-P7-NEXT: lfs 4, .LCPI3_1@toc@l(4) 129; CHECK-P7-NEXT: fmuls 2, 2, 0 130; CHECK-P7-NEXT: fmadds 2, 2, 0, 3 131; CHECK-P7-NEXT: fmuls 0, 0, 4 132; CHECK-P7-NEXT: fmuls 0, 0, 2 133; CHECK-P7-NEXT: fmul 1, 1, 0 134; CHECK-P7-NEXT: blr 135; 136; CHECK-P8-LABEL: foof_fmf: 137; CHECK-P8: # %bb.0: 138; CHECK-P8-NEXT: xsrsqrtesp 0, 2 139; CHECK-P8-NEXT: addis 3, 2, .LCPI3_0@toc@ha 140; CHECK-P8-NEXT: addis 4, 2, .LCPI3_1@toc@ha 141; CHECK-P8-NEXT: lfs 3, .LCPI3_0@toc@l(3) 142; CHECK-P8-NEXT: lfs 4, .LCPI3_1@toc@l(4) 143; CHECK-P8-NEXT: xsmulsp 2, 2, 0 144; CHECK-P8-NEXT: xsmaddasp 3, 2, 0 145; CHECK-P8-NEXT: xsmulsp 0, 0, 4 146; CHECK-P8-NEXT: xsmulsp 0, 0, 3 147; CHECK-P8-NEXT: xsmuldp 1, 1, 0 148; CHECK-P8-NEXT: blr 149; 150; CHECK-P9-LABEL: foof_fmf: 151; CHECK-P9: # %bb.0: 152; CHECK-P9-NEXT: xsrsqrtesp 0, 2 153; CHECK-P9-NEXT: addis 3, 2, .LCPI3_0@toc@ha 154; CHECK-P9-NEXT: lfs 3, .LCPI3_0@toc@l(3) 155; CHECK-P9-NEXT: addis 3, 2, .LCPI3_1@toc@ha 156; CHECK-P9-NEXT: xsmulsp 2, 2, 0 157; CHECK-P9-NEXT: xsmaddasp 3, 2, 0 158; CHECK-P9-NEXT: lfs 2, .LCPI3_1@toc@l(3) 159; CHECK-P9-NEXT: xsmulsp 0, 0, 2 160; CHECK-P9-NEXT: xsmulsp 0, 0, 3 161; CHECK-P9-NEXT: xsmuldp 1, 1, 0 162; CHECK-P9-NEXT: blr 163 %x = call reassoc arcp float @llvm.sqrt.f32(float %b) 164 %y = fpext float %x to double 165 %r = fdiv reassoc arcp double %a, %y 166 ret double %r 167} 168 169define double @foof_safe(double %a, float %b) nounwind { 170; CHECK-P7-LABEL: foof_safe: 171; CHECK-P7: # %bb.0: 172; CHECK-P7-NEXT: fsqrts 0, 2 173; CHECK-P7-NEXT: fdiv 1, 1, 0 174; CHECK-P7-NEXT: blr 175; 176; CHECK-P8-LABEL: foof_safe: 177; CHECK-P8: # %bb.0: 178; CHECK-P8-NEXT: xssqrtsp 0, 2 179; CHECK-P8-NEXT: xsdivdp 1, 1, 0 180; CHECK-P8-NEXT: blr 181; 182; CHECK-P9-LABEL: foof_safe: 183; CHECK-P9: # %bb.0: 184; CHECK-P9-NEXT: xssqrtsp 0, 2 185; CHECK-P9-NEXT: xsdivdp 1, 1, 0 186; CHECK-P9-NEXT: blr 187 %x = call float @llvm.sqrt.f32(float %b) 188 %y = fpext float %x to double 189 %r = fdiv double %a, %y 190 ret double %r 191} 192 193define float @food_fmf(float %a, double %b) nounwind { 194; CHECK-P7-LABEL: food_fmf: 195; CHECK-P7: # %bb.0: 196; CHECK-P7-NEXT: frsqrte 0, 2 197; CHECK-P7-NEXT: addis 3, 2, .LCPI5_0@toc@ha 198; CHECK-P7-NEXT: addis 4, 2, .LCPI5_1@toc@ha 199; CHECK-P7-NEXT: lfs 4, .LCPI5_0@toc@l(3) 200; CHECK-P7-NEXT: lfs 5, .LCPI5_1@toc@l(4) 201; CHECK-P7-NEXT: fmul 3, 2, 0 202; CHECK-P7-NEXT: fmadd 3, 3, 0, 4 203; CHECK-P7-NEXT: fmul 0, 0, 5 204; CHECK-P7-NEXT: fmul 0, 0, 3 205; CHECK-P7-NEXT: fmul 2, 2, 0 206; CHECK-P7-NEXT: fmadd 2, 2, 0, 4 207; CHECK-P7-NEXT: fmul 0, 0, 5 208; CHECK-P7-NEXT: fmul 0, 0, 2 209; CHECK-P7-NEXT: frsp 0, 0 210; CHECK-P7-NEXT: fmuls 1, 1, 0 211; CHECK-P7-NEXT: blr 212; 213; CHECK-P8-LABEL: food_fmf: 214; CHECK-P8: # %bb.0: 215; CHECK-P8-NEXT: xsrsqrtedp 0, 2 216; CHECK-P8-NEXT: addis 3, 2, .LCPI5_0@toc@ha 217; CHECK-P8-NEXT: lfs 4, .LCPI5_0@toc@l(3) 218; CHECK-P8-NEXT: addis 3, 2, .LCPI5_1@toc@ha 219; CHECK-P8-NEXT: lfs 5, .LCPI5_1@toc@l(3) 220; CHECK-P8-NEXT: fmr 6, 4 221; CHECK-P8-NEXT: xsmuldp 3, 2, 0 222; CHECK-P8-NEXT: xsmaddadp 6, 3, 0 223; CHECK-P8-NEXT: xsmuldp 0, 0, 5 224; CHECK-P8-NEXT: xsmuldp 0, 0, 6 225; CHECK-P8-NEXT: xsmuldp 2, 2, 0 226; CHECK-P8-NEXT: xsmaddadp 4, 2, 0 227; CHECK-P8-NEXT: xsmuldp 0, 0, 5 228; CHECK-P8-NEXT: xsmuldp 0, 0, 4 229; CHECK-P8-NEXT: xsrsp 0, 0 230; CHECK-P8-NEXT: xsmulsp 1, 1, 0 231; CHECK-P8-NEXT: blr 232; 233; CHECK-P9-LABEL: food_fmf: 234; CHECK-P9: # %bb.0: 235; CHECK-P9-NEXT: xsrsqrtedp 0, 2 236; CHECK-P9-NEXT: addis 3, 2, .LCPI5_0@toc@ha 237; CHECK-P9-NEXT: lfs 4, .LCPI5_0@toc@l(3) 238; CHECK-P9-NEXT: addis 3, 2, .LCPI5_1@toc@ha 239; CHECK-P9-NEXT: xsmuldp 3, 2, 0 240; CHECK-P9-NEXT: fmr 5, 4 241; CHECK-P9-NEXT: xsmaddadp 5, 3, 0 242; CHECK-P9-NEXT: lfs 3, .LCPI5_1@toc@l(3) 243; CHECK-P9-NEXT: xsmuldp 0, 0, 3 244; CHECK-P9-NEXT: xsmuldp 0, 0, 5 245; CHECK-P9-NEXT: xsmuldp 2, 2, 0 246; CHECK-P9-NEXT: xsmaddadp 4, 2, 0 247; CHECK-P9-NEXT: xsmuldp 0, 0, 3 248; CHECK-P9-NEXT: xsmuldp 0, 0, 4 249; CHECK-P9-NEXT: xsrsp 0, 0 250; CHECK-P9-NEXT: xsmulsp 1, 1, 0 251; CHECK-P9-NEXT: blr 252 %x = call reassoc arcp double @llvm.sqrt.f64(double %b) 253 %y = fptrunc double %x to float 254 %r = fdiv reassoc arcp float %a, %y 255 ret float %r 256} 257 258define float @food_safe(float %a, double %b) nounwind { 259; CHECK-P7-LABEL: food_safe: 260; CHECK-P7: # %bb.0: 261; CHECK-P7-NEXT: fsqrt 0, 2 262; CHECK-P7-NEXT: frsp 0, 0 263; CHECK-P7-NEXT: fdivs 1, 1, 0 264; CHECK-P7-NEXT: blr 265; 266; CHECK-P8-LABEL: food_safe: 267; CHECK-P8: # %bb.0: 268; CHECK-P8-NEXT: xssqrtdp 0, 2 269; CHECK-P8-NEXT: xsrsp 0, 0 270; CHECK-P8-NEXT: xsdivsp 1, 1, 0 271; CHECK-P8-NEXT: blr 272; 273; CHECK-P9-LABEL: food_safe: 274; CHECK-P9: # %bb.0: 275; CHECK-P9-NEXT: xssqrtdp 0, 2 276; CHECK-P9-NEXT: xsrsp 0, 0 277; CHECK-P9-NEXT: xsdivsp 1, 1, 0 278; CHECK-P9-NEXT: blr 279 %x = call double @llvm.sqrt.f64(double %b) 280 %y = fptrunc double %x to float 281 %r = fdiv float %a, %y 282 ret float %r 283} 284 285define float @goo_fmf(float %a, float %b) nounwind { 286; CHECK-P7-LABEL: goo_fmf: 287; CHECK-P7: # %bb.0: 288; CHECK-P7-NEXT: frsqrtes 0, 2 289; CHECK-P7-NEXT: addis 3, 2, .LCPI7_0@toc@ha 290; CHECK-P7-NEXT: addis 4, 2, .LCPI7_1@toc@ha 291; CHECK-P7-NEXT: lfs 3, .LCPI7_0@toc@l(3) 292; CHECK-P7-NEXT: lfs 4, .LCPI7_1@toc@l(4) 293; CHECK-P7-NEXT: fmuls 2, 2, 0 294; CHECK-P7-NEXT: fmadds 2, 2, 0, 3 295; CHECK-P7-NEXT: fmuls 0, 0, 4 296; CHECK-P7-NEXT: fmuls 0, 0, 2 297; CHECK-P7-NEXT: fmuls 1, 1, 0 298; CHECK-P7-NEXT: blr 299; 300; CHECK-P8-LABEL: goo_fmf: 301; CHECK-P8: # %bb.0: 302; CHECK-P8-NEXT: xsrsqrtesp 0, 2 303; CHECK-P8-NEXT: addis 3, 2, .LCPI7_0@toc@ha 304; CHECK-P8-NEXT: addis 4, 2, .LCPI7_1@toc@ha 305; CHECK-P8-NEXT: lfs 3, .LCPI7_0@toc@l(3) 306; CHECK-P8-NEXT: lfs 4, .LCPI7_1@toc@l(4) 307; CHECK-P8-NEXT: xsmulsp 2, 2, 0 308; CHECK-P8-NEXT: xsmaddasp 3, 2, 0 309; CHECK-P8-NEXT: xsmulsp 0, 0, 4 310; CHECK-P8-NEXT: xsmulsp 0, 0, 3 311; CHECK-P8-NEXT: xsmulsp 1, 1, 0 312; CHECK-P8-NEXT: blr 313; 314; CHECK-P9-LABEL: goo_fmf: 315; CHECK-P9: # %bb.0: 316; CHECK-P9-NEXT: xsrsqrtesp 0, 2 317; CHECK-P9-NEXT: addis 3, 2, .LCPI7_0@toc@ha 318; CHECK-P9-NEXT: lfs 3, .LCPI7_0@toc@l(3) 319; CHECK-P9-NEXT: addis 3, 2, .LCPI7_1@toc@ha 320; CHECK-P9-NEXT: xsmulsp 2, 2, 0 321; CHECK-P9-NEXT: xsmaddasp 3, 2, 0 322; CHECK-P9-NEXT: lfs 2, .LCPI7_1@toc@l(3) 323; CHECK-P9-NEXT: xsmulsp 0, 0, 2 324; CHECK-P9-NEXT: xsmulsp 0, 0, 3 325; CHECK-P9-NEXT: xsmulsp 1, 1, 0 326; CHECK-P9-NEXT: blr 327 %x = call reassoc arcp float @llvm.sqrt.f32(float %b) 328 %r = fdiv reassoc arcp float %a, %x 329 ret float %r 330} 331 332define float @goo_safe(float %a, float %b) nounwind { 333; CHECK-P7-LABEL: goo_safe: 334; CHECK-P7: # %bb.0: 335; CHECK-P7-NEXT: fsqrts 0, 2 336; CHECK-P7-NEXT: fdivs 1, 1, 0 337; CHECK-P7-NEXT: blr 338; 339; CHECK-P8-LABEL: goo_safe: 340; CHECK-P8: # %bb.0: 341; CHECK-P8-NEXT: xssqrtsp 0, 2 342; CHECK-P8-NEXT: xsdivsp 1, 1, 0 343; CHECK-P8-NEXT: blr 344; 345; CHECK-P9-LABEL: goo_safe: 346; CHECK-P9: # %bb.0: 347; CHECK-P9-NEXT: xssqrtsp 0, 2 348; CHECK-P9-NEXT: xsdivsp 1, 1, 0 349; CHECK-P9-NEXT: blr 350 %x = call float @llvm.sqrt.f32(float %b) 351 %r = fdiv float %a, %x 352 ret float %r 353} 354 355define float @no_estimate_refinement_f32(float %a, float %b) #0 { 356; CHECK-P7-LABEL: no_estimate_refinement_f32: 357; CHECK-P7: # %bb.0: 358; CHECK-P7-NEXT: frsqrtes 0, 2 359; CHECK-P7-NEXT: fmuls 1, 1, 0 360; CHECK-P7-NEXT: blr 361; 362; CHECK-P8-LABEL: no_estimate_refinement_f32: 363; CHECK-P8: # %bb.0: 364; CHECK-P8-NEXT: xsrsqrtesp 0, 2 365; CHECK-P8-NEXT: xsmulsp 1, 1, 0 366; CHECK-P8-NEXT: blr 367; 368; CHECK-P9-LABEL: no_estimate_refinement_f32: 369; CHECK-P9: # %bb.0: 370; CHECK-P9-NEXT: xsrsqrtesp 0, 2 371; CHECK-P9-NEXT: xsmulsp 1, 1, 0 372; CHECK-P9-NEXT: blr 373 %x = call reassoc arcp float @llvm.sqrt.f32(float %b) 374 %r = fdiv reassoc arcp float %a, %x 375 ret float %r 376} 377 378define float @rsqrt_fmul_fmf(float %a, float %b, float %c) { 379; CHECK-P7-LABEL: rsqrt_fmul_fmf: 380; CHECK-P7: # %bb.0: 381; CHECK-P7-NEXT: frsqrtes 0, 1 382; CHECK-P7-NEXT: addis 3, 2, .LCPI10_0@toc@ha 383; CHECK-P7-NEXT: addis 4, 2, .LCPI10_1@toc@ha 384; CHECK-P7-NEXT: lfs 4, .LCPI10_0@toc@l(3) 385; CHECK-P7-NEXT: lfs 5, .LCPI10_1@toc@l(4) 386; CHECK-P7-NEXT: fmuls 1, 1, 0 387; CHECK-P7-NEXT: fmadds 1, 1, 0, 4 388; CHECK-P7-NEXT: fmuls 0, 0, 5 389; CHECK-P7-NEXT: fmuls 0, 0, 1 390; CHECK-P7-NEXT: fres 1, 2 391; CHECK-P7-NEXT: fmuls 4, 0, 1 392; CHECK-P7-NEXT: fnmsubs 0, 2, 4, 0 393; CHECK-P7-NEXT: fmadds 0, 1, 0, 4 394; CHECK-P7-NEXT: fmuls 1, 3, 0 395; CHECK-P7-NEXT: blr 396; 397; CHECK-P8-LABEL: rsqrt_fmul_fmf: 398; CHECK-P8: # %bb.0: 399; CHECK-P8-NEXT: xsrsqrtesp 0, 1 400; CHECK-P8-NEXT: addis 3, 2, .LCPI10_0@toc@ha 401; CHECK-P8-NEXT: addis 4, 2, .LCPI10_1@toc@ha 402; CHECK-P8-NEXT: lfs 4, .LCPI10_0@toc@l(3) 403; CHECK-P8-NEXT: lfs 5, .LCPI10_1@toc@l(4) 404; CHECK-P8-NEXT: xsmulsp 1, 1, 0 405; CHECK-P8-NEXT: xsmaddasp 4, 1, 0 406; CHECK-P8-NEXT: xsmulsp 0, 0, 5 407; CHECK-P8-NEXT: xsresp 1, 2 408; CHECK-P8-NEXT: xsmulsp 0, 0, 4 409; CHECK-P8-NEXT: xsmulsp 4, 0, 1 410; CHECK-P8-NEXT: xsnmsubasp 0, 2, 4 411; CHECK-P8-NEXT: xsmaddasp 4, 1, 0 412; CHECK-P8-NEXT: xsmulsp 1, 3, 4 413; CHECK-P8-NEXT: blr 414; 415; CHECK-P9-LABEL: rsqrt_fmul_fmf: 416; CHECK-P9: # %bb.0: 417; CHECK-P9-NEXT: xsrsqrtesp 0, 1 418; CHECK-P9-NEXT: addis 3, 2, .LCPI10_0@toc@ha 419; CHECK-P9-NEXT: lfs 4, .LCPI10_0@toc@l(3) 420; CHECK-P9-NEXT: addis 3, 2, .LCPI10_1@toc@ha 421; CHECK-P9-NEXT: xsmulsp 1, 1, 0 422; CHECK-P9-NEXT: xsmaddasp 4, 1, 0 423; CHECK-P9-NEXT: lfs 1, .LCPI10_1@toc@l(3) 424; CHECK-P9-NEXT: xsmulsp 0, 0, 1 425; CHECK-P9-NEXT: xsresp 1, 2 426; CHECK-P9-NEXT: xsmulsp 0, 0, 4 427; CHECK-P9-NEXT: xsmulsp 4, 0, 1 428; CHECK-P9-NEXT: xsnmsubasp 0, 2, 4 429; CHECK-P9-NEXT: xsmaddasp 4, 1, 0 430; CHECK-P9-NEXT: xsmulsp 1, 3, 4 431; CHECK-P9-NEXT: blr 432 %x = call reassoc arcp nsz float @llvm.sqrt.f32(float %a) 433 %y = fmul reassoc nsz float %x, %b 434 %z = fdiv reassoc arcp nsz ninf float %c, %y 435 ret float %z 436} 437 438define float @rsqrt_fmul_safe(float %a, float %b, float %c) { 439; CHECK-P7-LABEL: rsqrt_fmul_safe: 440; CHECK-P7: # %bb.0: 441; CHECK-P7-NEXT: fsqrts 0, 1 442; CHECK-P7-NEXT: fmuls 0, 0, 2 443; CHECK-P7-NEXT: fdivs 1, 3, 0 444; CHECK-P7-NEXT: blr 445; 446; CHECK-P8-LABEL: rsqrt_fmul_safe: 447; CHECK-P8: # %bb.0: 448; CHECK-P8-NEXT: xssqrtsp 0, 1 449; CHECK-P8-NEXT: xsmulsp 0, 0, 2 450; CHECK-P8-NEXT: xsdivsp 1, 3, 0 451; CHECK-P8-NEXT: blr 452; 453; CHECK-P9-LABEL: rsqrt_fmul_safe: 454; CHECK-P9: # %bb.0: 455; CHECK-P9-NEXT: xssqrtsp 0, 1 456; CHECK-P9-NEXT: xsmulsp 0, 0, 2 457; CHECK-P9-NEXT: xsdivsp 1, 3, 0 458; CHECK-P9-NEXT: blr 459 %x = call float @llvm.sqrt.f32(float %a) 460 %y = fmul float %x, %b 461 %z = fdiv float %c, %y 462 ret float %z 463} 464 465define <4 x float> @hoo_fmf(<4 x float> %a, <4 x float> %b) nounwind { 466; CHECK-P7-LABEL: hoo_fmf: 467; CHECK-P7: # %bb.0: 468; CHECK-P7-NEXT: vspltisw 4, -1 469; CHECK-P7-NEXT: addis 3, 2, .LCPI12_0@toc@ha 470; CHECK-P7-NEXT: vrsqrtefp 5, 3 471; CHECK-P7-NEXT: addi 3, 3, .LCPI12_0@toc@l 472; CHECK-P7-NEXT: lvx 0, 0, 3 473; CHECK-P7-NEXT: addis 3, 2, .LCPI12_1@toc@ha 474; CHECK-P7-NEXT: addi 3, 3, .LCPI12_1@toc@l 475; CHECK-P7-NEXT: lvx 1, 0, 3 476; CHECK-P7-NEXT: vslw 4, 4, 4 477; CHECK-P7-NEXT: vmaddfp 3, 3, 5, 4 478; CHECK-P7-NEXT: vmaddfp 3, 3, 5, 0 479; CHECK-P7-NEXT: vmaddfp 5, 5, 1, 4 480; CHECK-P7-NEXT: vmaddfp 3, 5, 3, 4 481; CHECK-P7-NEXT: vmaddfp 2, 2, 3, 4 482; CHECK-P7-NEXT: blr 483; 484; CHECK-P8-LABEL: hoo_fmf: 485; CHECK-P8: # %bb.0: 486; CHECK-P8-NEXT: xvrsqrtesp 0, 35 487; CHECK-P8-NEXT: addis 3, 2, .LCPI12_0@toc@ha 488; CHECK-P8-NEXT: addis 4, 2, .LCPI12_1@toc@ha 489; CHECK-P8-NEXT: addi 3, 3, .LCPI12_0@toc@l 490; CHECK-P8-NEXT: xvmulsp 1, 35, 0 491; CHECK-P8-NEXT: lvx 3, 0, 3 492; CHECK-P8-NEXT: addi 3, 4, .LCPI12_1@toc@l 493; CHECK-P8-NEXT: lvx 4, 0, 3 494; CHECK-P8-NEXT: xvmaddasp 35, 1, 0 495; CHECK-P8-NEXT: xvmulsp 0, 0, 36 496; CHECK-P8-NEXT: xvmulsp 0, 0, 35 497; CHECK-P8-NEXT: xvmulsp 34, 34, 0 498; CHECK-P8-NEXT: blr 499; 500; CHECK-P9-LABEL: hoo_fmf: 501; CHECK-P9: # %bb.0: 502; CHECK-P9-NEXT: xvrsqrtesp 0, 35 503; CHECK-P9-NEXT: addis 3, 2, .LCPI12_0@toc@ha 504; CHECK-P9-NEXT: addi 3, 3, .LCPI12_0@toc@l 505; CHECK-P9-NEXT: lxvx 2, 0, 3 506; CHECK-P9-NEXT: addis 3, 2, .LCPI12_1@toc@ha 507; CHECK-P9-NEXT: addi 3, 3, .LCPI12_1@toc@l 508; CHECK-P9-NEXT: xvmulsp 1, 35, 0 509; CHECK-P9-NEXT: xvmaddasp 2, 1, 0 510; CHECK-P9-NEXT: lxvx 1, 0, 3 511; CHECK-P9-NEXT: xvmulsp 0, 0, 1 512; CHECK-P9-NEXT: xvmulsp 0, 0, 2 513; CHECK-P9-NEXT: xvmulsp 34, 34, 0 514; CHECK-P9-NEXT: blr 515 %x = call reassoc arcp <4 x float> @llvm.sqrt.v4f32(<4 x float> %b) 516 %r = fdiv reassoc arcp <4 x float> %a, %x 517 ret <4 x float> %r 518} 519 520define <4 x float> @hoo_safe(<4 x float> %a, <4 x float> %b) nounwind { 521; CHECK-P7-LABEL: hoo_safe: 522; CHECK-P7: # %bb.0: 523; CHECK-P7-NEXT: addi 3, 1, -32 524; CHECK-P7-NEXT: stvx 3, 0, 3 525; CHECK-P7-NEXT: addi 3, 1, -48 526; CHECK-P7-NEXT: lfs 0, -20(1) 527; CHECK-P7-NEXT: lfs 3, -24(1) 528; CHECK-P7-NEXT: lfs 1, -32(1) 529; CHECK-P7-NEXT: lfs 2, -28(1) 530; CHECK-P7-NEXT: stvx 2, 0, 3 531; CHECK-P7-NEXT: addi 3, 1, -16 532; CHECK-P7-NEXT: fsqrts 0, 0 533; CHECK-P7-NEXT: lfs 4, -36(1) 534; CHECK-P7-NEXT: fsqrts 3, 3 535; CHECK-P7-NEXT: fsqrts 2, 2 536; CHECK-P7-NEXT: fsqrts 1, 1 537; CHECK-P7-NEXT: fdivs 0, 4, 0 538; CHECK-P7-NEXT: stfs 0, -4(1) 539; CHECK-P7-NEXT: lfs 0, -40(1) 540; CHECK-P7-NEXT: fdivs 0, 0, 3 541; CHECK-P7-NEXT: stfs 0, -8(1) 542; CHECK-P7-NEXT: lfs 0, -44(1) 543; CHECK-P7-NEXT: fdivs 0, 0, 2 544; CHECK-P7-NEXT: stfs 0, -12(1) 545; CHECK-P7-NEXT: lfs 0, -48(1) 546; CHECK-P7-NEXT: fdivs 0, 0, 1 547; CHECK-P7-NEXT: stfs 0, -16(1) 548; CHECK-P7-NEXT: lvx 2, 0, 3 549; CHECK-P7-NEXT: blr 550; 551; CHECK-P8-LABEL: hoo_safe: 552; CHECK-P8: # %bb.0: 553; CHECK-P8-NEXT: xvsqrtsp 0, 35 554; CHECK-P8-NEXT: xvdivsp 34, 34, 0 555; CHECK-P8-NEXT: blr 556; 557; CHECK-P9-LABEL: hoo_safe: 558; CHECK-P9: # %bb.0: 559; CHECK-P9-NEXT: xvsqrtsp 0, 35 560; CHECK-P9-NEXT: xvdivsp 34, 34, 0 561; CHECK-P9-NEXT: blr 562 %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b) 563 %r = fdiv <4 x float> %a, %x 564 ret <4 x float> %r 565} 566 567define double @foo2_fmf(double %a, double %b) nounwind { 568; CHECK-P7-LABEL: foo2_fmf: 569; CHECK-P7: # %bb.0: 570; CHECK-P7-NEXT: fre 0, 2 571; CHECK-P7-NEXT: addis 3, 2, .LCPI14_0@toc@ha 572; CHECK-P7-NEXT: lfs 3, .LCPI14_0@toc@l(3) 573; CHECK-P7-NEXT: fmadd 3, 2, 0, 3 574; CHECK-P7-NEXT: fnmsub 0, 0, 3, 0 575; CHECK-P7-NEXT: fmul 3, 1, 0 576; CHECK-P7-NEXT: fnmsub 1, 2, 3, 1 577; CHECK-P7-NEXT: fmadd 1, 0, 1, 3 578; CHECK-P7-NEXT: blr 579; 580; CHECK-P8-LABEL: foo2_fmf: 581; CHECK-P8: # %bb.0: 582; CHECK-P8-NEXT: xsredp 3, 2 583; CHECK-P8-NEXT: addis 3, 2, .LCPI14_0@toc@ha 584; CHECK-P8-NEXT: lfs 0, .LCPI14_0@toc@l(3) 585; CHECK-P8-NEXT: xsmaddadp 0, 2, 3 586; CHECK-P8-NEXT: xsnmsubadp 3, 3, 0 587; CHECK-P8-NEXT: xsmuldp 0, 1, 3 588; CHECK-P8-NEXT: xsnmsubadp 1, 2, 0 589; CHECK-P8-NEXT: xsmaddadp 0, 3, 1 590; CHECK-P8-NEXT: fmr 1, 0 591; CHECK-P8-NEXT: blr 592; 593; CHECK-P9-LABEL: foo2_fmf: 594; CHECK-P9: # %bb.0: 595; CHECK-P9-NEXT: addis 3, 2, .LCPI14_0@toc@ha 596; CHECK-P9-NEXT: xsredp 3, 2 597; CHECK-P9-NEXT: lfs 0, .LCPI14_0@toc@l(3) 598; CHECK-P9-NEXT: xsmaddadp 0, 2, 3 599; CHECK-P9-NEXT: xsnmsubadp 3, 3, 0 600; CHECK-P9-NEXT: xsmuldp 0, 1, 3 601; CHECK-P9-NEXT: xsnmsubadp 1, 2, 0 602; CHECK-P9-NEXT: xsmaddadp 0, 3, 1 603; CHECK-P9-NEXT: fmr 1, 0 604; CHECK-P9-NEXT: blr 605 %r = fdiv reassoc arcp nsz ninf double %a, %b 606 ret double %r 607} 608 609define double @foo2_safe(double %a, double %b) nounwind { 610; CHECK-P7-LABEL: foo2_safe: 611; CHECK-P7: # %bb.0: 612; CHECK-P7-NEXT: fdiv 1, 1, 2 613; CHECK-P7-NEXT: blr 614; 615; CHECK-P8-LABEL: foo2_safe: 616; CHECK-P8: # %bb.0: 617; CHECK-P8-NEXT: xsdivdp 1, 1, 2 618; CHECK-P8-NEXT: blr 619; 620; CHECK-P9-LABEL: foo2_safe: 621; CHECK-P9: # %bb.0: 622; CHECK-P9-NEXT: xsdivdp 1, 1, 2 623; CHECK-P9-NEXT: blr 624 %r = fdiv double %a, %b 625 ret double %r 626} 627 628define float @goo2_fmf(float %a, float %b) nounwind { 629; CHECK-P7-LABEL: goo2_fmf: 630; CHECK-P7: # %bb.0: 631; CHECK-P7-NEXT: fres 0, 2 632; CHECK-P7-NEXT: fmuls 3, 1, 0 633; CHECK-P7-NEXT: fnmsubs 1, 2, 3, 1 634; CHECK-P7-NEXT: fmadds 1, 0, 1, 3 635; CHECK-P7-NEXT: blr 636; 637; CHECK-P8-LABEL: goo2_fmf: 638; CHECK-P8: # %bb.0: 639; CHECK-P8-NEXT: xsresp 3, 2 640; CHECK-P8-NEXT: xsmulsp 0, 1, 3 641; CHECK-P8-NEXT: xsnmsubasp 1, 2, 0 642; CHECK-P8-NEXT: xsmaddasp 0, 3, 1 643; CHECK-P8-NEXT: fmr 1, 0 644; CHECK-P8-NEXT: blr 645; 646; CHECK-P9-LABEL: goo2_fmf: 647; CHECK-P9: # %bb.0: 648; CHECK-P9-NEXT: xsresp 3, 2 649; CHECK-P9-NEXT: xsmulsp 0, 1, 3 650; CHECK-P9-NEXT: xsnmsubasp 1, 2, 0 651; CHECK-P9-NEXT: xsmaddasp 0, 3, 1 652; CHECK-P9-NEXT: fmr 1, 0 653; CHECK-P9-NEXT: blr 654 %r = fdiv reassoc arcp nsz ninf float %a, %b 655 ret float %r 656} 657 658define float @goo2_safe(float %a, float %b) nounwind { 659; CHECK-P7-LABEL: goo2_safe: 660; CHECK-P7: # %bb.0: 661; CHECK-P7-NEXT: fdivs 1, 1, 2 662; CHECK-P7-NEXT: blr 663; 664; CHECK-P8-LABEL: goo2_safe: 665; CHECK-P8: # %bb.0: 666; CHECK-P8-NEXT: xsdivsp 1, 1, 2 667; CHECK-P8-NEXT: blr 668; 669; CHECK-P9-LABEL: goo2_safe: 670; CHECK-P9: # %bb.0: 671; CHECK-P9-NEXT: xsdivsp 1, 1, 2 672; CHECK-P9-NEXT: blr 673 %r = fdiv float %a, %b 674 ret float %r 675} 676 677define <4 x float> @hoo2_fmf(<4 x float> %a, <4 x float> %b) nounwind { 678; CHECK-P7-LABEL: hoo2_fmf: 679; CHECK-P7: # %bb.0: 680; CHECK-P7-NEXT: vspltisw 4, -1 681; CHECK-P7-NEXT: vrefp 5, 3 682; CHECK-P7-NEXT: vslw 4, 4, 4 683; CHECK-P7-NEXT: vmaddfp 4, 2, 5, 4 684; CHECK-P7-NEXT: vnmsubfp 2, 3, 4, 2 685; CHECK-P7-NEXT: vmaddfp 2, 5, 2, 4 686; CHECK-P7-NEXT: blr 687; 688; CHECK-P8-LABEL: hoo2_fmf: 689; CHECK-P8: # %bb.0: 690; CHECK-P8-NEXT: xvresp 1, 35 691; CHECK-P8-NEXT: xvmulsp 0, 34, 1 692; CHECK-P8-NEXT: xvnmsubasp 34, 35, 0 693; CHECK-P8-NEXT: xvmaddasp 0, 1, 34 694; CHECK-P8-NEXT: xxlor 34, 0, 0 695; CHECK-P8-NEXT: blr 696; 697; CHECK-P9-LABEL: hoo2_fmf: 698; CHECK-P9: # %bb.0: 699; CHECK-P9-NEXT: xvresp 1, 35 700; CHECK-P9-NEXT: xvmulsp 0, 34, 1 701; CHECK-P9-NEXT: xvnmsubasp 34, 35, 0 702; CHECK-P9-NEXT: xvmaddasp 0, 1, 34 703; CHECK-P9-NEXT: xxlor 34, 0, 0 704; CHECK-P9-NEXT: blr 705 %r = fdiv reassoc arcp nsz ninf <4 x float> %a, %b 706 ret <4 x float> %r 707} 708 709define <4 x float> @hoo2_safe(<4 x float> %a, <4 x float> %b) nounwind { 710; CHECK-P7-LABEL: hoo2_safe: 711; CHECK-P7: # %bb.0: 712; CHECK-P7-NEXT: addi 3, 1, -32 713; CHECK-P7-NEXT: addi 4, 1, -48 714; CHECK-P7-NEXT: stvx 3, 0, 3 715; CHECK-P7-NEXT: stvx 2, 0, 4 716; CHECK-P7-NEXT: lfs 0, -20(1) 717; CHECK-P7-NEXT: lfs 1, -36(1) 718; CHECK-P7-NEXT: addi 3, 1, -16 719; CHECK-P7-NEXT: fdivs 0, 1, 0 720; CHECK-P7-NEXT: lfs 1, -40(1) 721; CHECK-P7-NEXT: stfs 0, -4(1) 722; CHECK-P7-NEXT: lfs 0, -24(1) 723; CHECK-P7-NEXT: fdivs 0, 1, 0 724; CHECK-P7-NEXT: lfs 1, -44(1) 725; CHECK-P7-NEXT: stfs 0, -8(1) 726; CHECK-P7-NEXT: lfs 0, -28(1) 727; CHECK-P7-NEXT: fdivs 0, 1, 0 728; CHECK-P7-NEXT: lfs 1, -48(1) 729; CHECK-P7-NEXT: stfs 0, -12(1) 730; CHECK-P7-NEXT: lfs 0, -32(1) 731; CHECK-P7-NEXT: fdivs 0, 1, 0 732; CHECK-P7-NEXT: stfs 0, -16(1) 733; CHECK-P7-NEXT: lvx 2, 0, 3 734; CHECK-P7-NEXT: blr 735; 736; CHECK-P8-LABEL: hoo2_safe: 737; CHECK-P8: # %bb.0: 738; CHECK-P8-NEXT: xvdivsp 34, 34, 35 739; CHECK-P8-NEXT: blr 740; 741; CHECK-P9-LABEL: hoo2_safe: 742; CHECK-P9: # %bb.0: 743; CHECK-P9-NEXT: xvdivsp 34, 34, 35 744; CHECK-P9-NEXT: blr 745 %r = fdiv <4 x float> %a, %b 746 ret <4 x float> %r 747} 748 749define double @foo3_fmf(double %a) nounwind { 750; CHECK-P7-LABEL: foo3_fmf: 751; CHECK-P7: # %bb.0: 752; CHECK-P7-NEXT: ftsqrt 0, 1 753; CHECK-P7-NEXT: bc 12, 2, .LBB20_2 754; CHECK-P7-NEXT: # %bb.1: 755; CHECK-P7-NEXT: frsqrte 0, 1 756; CHECK-P7-NEXT: addis 3, 2, .LCPI20_0@toc@ha 757; CHECK-P7-NEXT: addis 4, 2, .LCPI20_1@toc@ha 758; CHECK-P7-NEXT: lfs 3, .LCPI20_0@toc@l(3) 759; CHECK-P7-NEXT: lfs 4, .LCPI20_1@toc@l(4) 760; CHECK-P7-NEXT: fmul 2, 1, 0 761; CHECK-P7-NEXT: fmadd 2, 2, 0, 3 762; CHECK-P7-NEXT: fmul 0, 0, 4 763; CHECK-P7-NEXT: fmul 0, 0, 2 764; CHECK-P7-NEXT: fmul 1, 1, 0 765; CHECK-P7-NEXT: fmadd 0, 1, 0, 3 766; CHECK-P7-NEXT: fmul 1, 1, 4 767; CHECK-P7-NEXT: fmul 1, 1, 0 768; CHECK-P7-NEXT: blr 769; CHECK-P7-NEXT: .LBB20_2: 770; CHECK-P7-NEXT: fsqrt 1, 1 771; CHECK-P7-NEXT: blr 772; 773; CHECK-P8-LABEL: foo3_fmf: 774; CHECK-P8: # %bb.0: 775; CHECK-P8-NEXT: xstsqrtdp 0, 1 776; CHECK-P8-NEXT: bc 12, 2, .LBB20_2 777; CHECK-P8-NEXT: # %bb.1: 778; CHECK-P8-NEXT: xsrsqrtedp 0, 1 779; CHECK-P8-NEXT: addis 3, 2, .LCPI20_0@toc@ha 780; CHECK-P8-NEXT: lfs 3, .LCPI20_0@toc@l(3) 781; CHECK-P8-NEXT: addis 3, 2, .LCPI20_1@toc@ha 782; CHECK-P8-NEXT: lfs 4, .LCPI20_1@toc@l(3) 783; CHECK-P8-NEXT: fmr 5, 3 784; CHECK-P8-NEXT: xsmuldp 2, 1, 0 785; CHECK-P8-NEXT: xsmaddadp 5, 2, 0 786; CHECK-P8-NEXT: xsmuldp 0, 0, 4 787; CHECK-P8-NEXT: xsmuldp 0, 0, 5 788; CHECK-P8-NEXT: xsmuldp 1, 1, 0 789; CHECK-P8-NEXT: xsmaddadp 3, 1, 0 790; CHECK-P8-NEXT: xsmuldp 0, 1, 4 791; CHECK-P8-NEXT: xsmuldp 1, 0, 3 792; CHECK-P8-NEXT: blr 793; CHECK-P8-NEXT: .LBB20_2: 794; CHECK-P8-NEXT: xssqrtdp 1, 1 795; CHECK-P8-NEXT: blr 796; 797; CHECK-P9-LABEL: foo3_fmf: 798; CHECK-P9: # %bb.0: 799; CHECK-P9-NEXT: xstsqrtdp 0, 1 800; CHECK-P9-NEXT: bc 12, 2, .LBB20_2 801; CHECK-P9-NEXT: # %bb.1: 802; CHECK-P9-NEXT: xsrsqrtedp 0, 1 803; CHECK-P9-NEXT: addis 3, 2, .LCPI20_0@toc@ha 804; CHECK-P9-NEXT: lfs 3, .LCPI20_0@toc@l(3) 805; CHECK-P9-NEXT: addis 3, 2, .LCPI20_1@toc@ha 806; CHECK-P9-NEXT: xsmuldp 2, 1, 0 807; CHECK-P9-NEXT: fmr 4, 3 808; CHECK-P9-NEXT: xsmaddadp 4, 2, 0 809; CHECK-P9-NEXT: lfs 2, .LCPI20_1@toc@l(3) 810; CHECK-P9-NEXT: xsmuldp 0, 0, 2 811; CHECK-P9-NEXT: xsmuldp 0, 0, 4 812; CHECK-P9-NEXT: xsmuldp 1, 1, 0 813; CHECK-P9-NEXT: xsmaddadp 3, 1, 0 814; CHECK-P9-NEXT: xsmuldp 0, 1, 2 815; CHECK-P9-NEXT: xsmuldp 1, 0, 3 816; CHECK-P9-NEXT: blr 817; CHECK-P9-NEXT: .LBB20_2: 818; CHECK-P9-NEXT: xssqrtdp 1, 1 819; CHECK-P9-NEXT: blr 820 %r = call reassoc ninf afn double @llvm.sqrt.f64(double %a) 821 ret double %r 822} 823 824define double @foo3_fmf_crbits_off(double %a) #2 { 825; CHECK-P7-LABEL: foo3_fmf_crbits_off: 826; CHECK-P7: # %bb.0: 827; CHECK-P7-NEXT: fabs 0, 1 828; CHECK-P7-NEXT: addis 3, 2, .LCPI21_2@toc@ha 829; CHECK-P7-NEXT: lfd 2, .LCPI21_2@toc@l(3) 830; CHECK-P7-NEXT: fcmpu 0, 0, 2 831; CHECK-P7-NEXT: blt 0, .LBB21_2 832; CHECK-P7-NEXT: # %bb.1: 833; CHECK-P7-NEXT: frsqrte 0, 1 834; CHECK-P7-NEXT: addis 3, 2, .LCPI21_0@toc@ha 835; CHECK-P7-NEXT: addis 4, 2, .LCPI21_1@toc@ha 836; CHECK-P7-NEXT: lfs 3, .LCPI21_0@toc@l(3) 837; CHECK-P7-NEXT: lfs 4, .LCPI21_1@toc@l(4) 838; CHECK-P7-NEXT: fmul 2, 1, 0 839; CHECK-P7-NEXT: fmadd 2, 2, 0, 3 840; CHECK-P7-NEXT: fmul 0, 0, 4 841; CHECK-P7-NEXT: fmul 0, 0, 2 842; CHECK-P7-NEXT: fmul 1, 1, 0 843; CHECK-P7-NEXT: fmadd 0, 1, 0, 3 844; CHECK-P7-NEXT: fmul 1, 1, 4 845; CHECK-P7-NEXT: fmul 1, 1, 0 846; CHECK-P7-NEXT: blr 847; CHECK-P7-NEXT: .LBB21_2: 848; CHECK-P7-NEXT: fsqrt 1, 1 849; CHECK-P7-NEXT: blr 850; 851; CHECK-P8-LABEL: foo3_fmf_crbits_off: 852; CHECK-P8: # %bb.0: 853; CHECK-P8-NEXT: xsabsdp 0, 1 854; CHECK-P8-NEXT: addis 3, 2, .LCPI21_2@toc@ha 855; CHECK-P8-NEXT: lfd 2, .LCPI21_2@toc@l(3) 856; CHECK-P8-NEXT: xscmpudp 0, 0, 2 857; CHECK-P8-NEXT: blt 0, .LBB21_2 858; CHECK-P8-NEXT: # %bb.1: 859; CHECK-P8-NEXT: xsrsqrtedp 0, 1 860; CHECK-P8-NEXT: addis 3, 2, .LCPI21_0@toc@ha 861; CHECK-P8-NEXT: lfs 3, .LCPI21_0@toc@l(3) 862; CHECK-P8-NEXT: addis 3, 2, .LCPI21_1@toc@ha 863; CHECK-P8-NEXT: lfs 4, .LCPI21_1@toc@l(3) 864; CHECK-P8-NEXT: fmr 5, 3 865; CHECK-P8-NEXT: xsmuldp 2, 1, 0 866; CHECK-P8-NEXT: xsmaddadp 5, 2, 0 867; CHECK-P8-NEXT: xsmuldp 0, 0, 4 868; CHECK-P8-NEXT: xsmuldp 0, 0, 5 869; CHECK-P8-NEXT: xsmuldp 1, 1, 0 870; CHECK-P8-NEXT: xsmaddadp 3, 1, 0 871; CHECK-P8-NEXT: xsmuldp 0, 1, 4 872; CHECK-P8-NEXT: xsmuldp 1, 0, 3 873; CHECK-P8-NEXT: blr 874; CHECK-P8-NEXT: .LBB21_2: 875; CHECK-P8-NEXT: xssqrtdp 1, 1 876; CHECK-P8-NEXT: blr 877; 878; CHECK-P9-LABEL: foo3_fmf_crbits_off: 879; CHECK-P9: # %bb.0: 880; CHECK-P9-NEXT: addis 3, 2, .LCPI21_2@toc@ha 881; CHECK-P9-NEXT: xsabsdp 0, 1 882; CHECK-P9-NEXT: lfd 2, .LCPI21_2@toc@l(3) 883; CHECK-P9-NEXT: xscmpudp 0, 0, 2 884; CHECK-P9-NEXT: blt 0, .LBB21_2 885; CHECK-P9-NEXT: # %bb.1: 886; CHECK-P9-NEXT: xsrsqrtedp 0, 1 887; CHECK-P9-NEXT: addis 3, 2, .LCPI21_0@toc@ha 888; CHECK-P9-NEXT: lfs 3, .LCPI21_0@toc@l(3) 889; CHECK-P9-NEXT: addis 3, 2, .LCPI21_1@toc@ha 890; CHECK-P9-NEXT: xsmuldp 2, 1, 0 891; CHECK-P9-NEXT: fmr 4, 3 892; CHECK-P9-NEXT: xsmaddadp 4, 2, 0 893; CHECK-P9-NEXT: lfs 2, .LCPI21_1@toc@l(3) 894; CHECK-P9-NEXT: xsmuldp 0, 0, 2 895; CHECK-P9-NEXT: xsmuldp 0, 0, 4 896; CHECK-P9-NEXT: xsmuldp 1, 1, 0 897; CHECK-P9-NEXT: xsmaddadp 3, 1, 0 898; CHECK-P9-NEXT: xsmuldp 0, 1, 2 899; CHECK-P9-NEXT: xsmuldp 1, 0, 3 900; CHECK-P9-NEXT: blr 901; CHECK-P9-NEXT: .LBB21_2: 902; CHECK-P9-NEXT: xssqrtdp 1, 1 903; CHECK-P9-NEXT: blr 904 %r = call reassoc ninf afn double @llvm.sqrt.f64(double %a) 905 ret double %r 906} 907 908define double @foo3_safe(double %a) nounwind { 909; CHECK-P7-LABEL: foo3_safe: 910; CHECK-P7: # %bb.0: 911; CHECK-P7-NEXT: fsqrt 1, 1 912; CHECK-P7-NEXT: blr 913; 914; CHECK-P8-LABEL: foo3_safe: 915; CHECK-P8: # %bb.0: 916; CHECK-P8-NEXT: xssqrtdp 1, 1 917; CHECK-P8-NEXT: blr 918; 919; CHECK-P9-LABEL: foo3_safe: 920; CHECK-P9: # %bb.0: 921; CHECK-P9-NEXT: xssqrtdp 1, 1 922; CHECK-P9-NEXT: blr 923 %r = call double @llvm.sqrt.f64(double %a) 924 ret double %r 925} 926 927define float @goo3_fmf(float %a) nounwind { 928; CHECK-P7-LABEL: goo3_fmf: 929; CHECK-P7: # %bb.0: 930; CHECK-P7-NEXT: fabs 0, 1 931; CHECK-P7-NEXT: addis 3, 2, .LCPI23_2@toc@ha 932; CHECK-P7-NEXT: lfs 2, .LCPI23_2@toc@l(3) 933; CHECK-P7-NEXT: fcmpu 0, 0, 2 934; CHECK-P7-NEXT: blt 0, .LBB23_2 935; CHECK-P7-NEXT: # %bb.1: 936; CHECK-P7-NEXT: frsqrtes 0, 1 937; CHECK-P7-NEXT: addis 3, 2, .LCPI23_0@toc@ha 938; CHECK-P7-NEXT: addis 4, 2, .LCPI23_1@toc@ha 939; CHECK-P7-NEXT: lfs 2, .LCPI23_0@toc@l(3) 940; CHECK-P7-NEXT: lfs 3, .LCPI23_1@toc@l(4) 941; CHECK-P7-NEXT: fmuls 1, 1, 0 942; CHECK-P7-NEXT: fmadds 0, 1, 0, 2 943; CHECK-P7-NEXT: fmuls 1, 1, 3 944; CHECK-P7-NEXT: fmuls 1, 1, 0 945; CHECK-P7-NEXT: blr 946; CHECK-P7-NEXT: .LBB23_2: 947; CHECK-P7-NEXT: addis 3, 2, .LCPI23_3@toc@ha 948; CHECK-P7-NEXT: lfs 1, .LCPI23_3@toc@l(3) 949; CHECK-P7-NEXT: blr 950; 951; CHECK-P8-LABEL: goo3_fmf: 952; CHECK-P8: # %bb.0: 953; CHECK-P8-NEXT: xsabsdp 0, 1 954; CHECK-P8-NEXT: addis 3, 2, .LCPI23_2@toc@ha 955; CHECK-P8-NEXT: lfs 2, .LCPI23_2@toc@l(3) 956; CHECK-P8-NEXT: fcmpu 0, 0, 2 957; CHECK-P8-NEXT: xxlxor 0, 0, 0 958; CHECK-P8-NEXT: blt 0, .LBB23_2 959; CHECK-P8-NEXT: # %bb.1: 960; CHECK-P8-NEXT: xsrsqrtesp 0, 1 961; CHECK-P8-NEXT: addis 3, 2, .LCPI23_0@toc@ha 962; CHECK-P8-NEXT: addis 4, 2, .LCPI23_1@toc@ha 963; CHECK-P8-NEXT: lfs 2, .LCPI23_0@toc@l(3) 964; CHECK-P8-NEXT: lfs 3, .LCPI23_1@toc@l(4) 965; CHECK-P8-NEXT: xsmulsp 1, 1, 0 966; CHECK-P8-NEXT: xsmaddasp 2, 1, 0 967; CHECK-P8-NEXT: xsmulsp 0, 1, 3 968; CHECK-P8-NEXT: xsmulsp 0, 0, 2 969; CHECK-P8-NEXT: .LBB23_2: 970; CHECK-P8-NEXT: fmr 1, 0 971; CHECK-P8-NEXT: blr 972; 973; CHECK-P9-LABEL: goo3_fmf: 974; CHECK-P9: # %bb.0: 975; CHECK-P9-NEXT: addis 3, 2, .LCPI23_2@toc@ha 976; CHECK-P9-NEXT: xsabsdp 0, 1 977; CHECK-P9-NEXT: lfs 2, .LCPI23_2@toc@l(3) 978; CHECK-P9-NEXT: fcmpu 0, 0, 2 979; CHECK-P9-NEXT: xxlxor 0, 0, 0 980; CHECK-P9-NEXT: blt 0, .LBB23_2 981; CHECK-P9-NEXT: # %bb.1: 982; CHECK-P9-NEXT: xsrsqrtesp 0, 1 983; CHECK-P9-NEXT: addis 3, 2, .LCPI23_0@toc@ha 984; CHECK-P9-NEXT: lfs 2, .LCPI23_0@toc@l(3) 985; CHECK-P9-NEXT: addis 3, 2, .LCPI23_1@toc@ha 986; CHECK-P9-NEXT: xsmulsp 1, 1, 0 987; CHECK-P9-NEXT: xsmaddasp 2, 1, 0 988; CHECK-P9-NEXT: lfs 0, .LCPI23_1@toc@l(3) 989; CHECK-P9-NEXT: xsmulsp 0, 1, 0 990; CHECK-P9-NEXT: xsmulsp 0, 0, 2 991; CHECK-P9-NEXT: .LBB23_2: 992; CHECK-P9-NEXT: fmr 1, 0 993; CHECK-P9-NEXT: blr 994 %r = call reassoc ninf afn float @llvm.sqrt.f32(float %a) 995 ret float %r 996} 997 998define float @goo3_safe(float %a) nounwind { 999; CHECK-P7-LABEL: goo3_safe: 1000; CHECK-P7: # %bb.0: 1001; CHECK-P7-NEXT: fsqrts 1, 1 1002; CHECK-P7-NEXT: blr 1003; 1004; CHECK-P8-LABEL: goo3_safe: 1005; CHECK-P8: # %bb.0: 1006; CHECK-P8-NEXT: xssqrtsp 1, 1 1007; CHECK-P8-NEXT: blr 1008; 1009; CHECK-P9-LABEL: goo3_safe: 1010; CHECK-P9: # %bb.0: 1011; CHECK-P9-NEXT: xssqrtsp 1, 1 1012; CHECK-P9-NEXT: blr 1013 %r = call float @llvm.sqrt.f32(float %a) 1014 ret float %r 1015} 1016 1017define <4 x float> @hoo3_fmf(<4 x float> %a) #1 { 1018; CHECK-P7-LABEL: hoo3_fmf: 1019; CHECK-P7: # %bb.0: 1020; CHECK-P7-NEXT: vspltisw 3, -1 1021; CHECK-P7-NEXT: addis 3, 2, .LCPI25_0@toc@ha 1022; CHECK-P7-NEXT: vrsqrtefp 4, 2 1023; CHECK-P7-NEXT: addi 3, 3, .LCPI25_0@toc@l 1024; CHECK-P7-NEXT: lvx 0, 0, 3 1025; CHECK-P7-NEXT: addis 3, 2, .LCPI25_1@toc@ha 1026; CHECK-P7-NEXT: addi 3, 3, .LCPI25_1@toc@l 1027; CHECK-P7-NEXT: lvx 1, 0, 3 1028; CHECK-P7-NEXT: vslw 3, 3, 3 1029; CHECK-P7-NEXT: vmaddfp 5, 2, 4, 3 1030; CHECK-P7-NEXT: vmaddfp 4, 5, 4, 0 1031; CHECK-P7-NEXT: vmaddfp 5, 5, 1, 3 1032; CHECK-P7-NEXT: vxor 0, 0, 0 1033; CHECK-P7-NEXT: vmaddfp 3, 5, 4, 3 1034; CHECK-P7-NEXT: vcmpeqfp 2, 2, 0 1035; CHECK-P7-NEXT: vsel 2, 3, 0, 2 1036; CHECK-P7-NEXT: blr 1037; 1038; CHECK-P8-LABEL: hoo3_fmf: 1039; CHECK-P8: # %bb.0: 1040; CHECK-P8-NEXT: xvtsqrtsp 0, 34 1041; CHECK-P8-NEXT: bc 12, 2, .LBB25_2 1042; CHECK-P8-NEXT: # %bb.1: 1043; CHECK-P8-NEXT: xvrsqrtesp 0, 34 1044; CHECK-P8-NEXT: addis 3, 2, .LCPI25_0@toc@ha 1045; CHECK-P8-NEXT: addis 4, 2, .LCPI25_1@toc@ha 1046; CHECK-P8-NEXT: addi 3, 3, .LCPI25_0@toc@l 1047; CHECK-P8-NEXT: xvmulsp 1, 34, 0 1048; CHECK-P8-NEXT: lvx 2, 0, 3 1049; CHECK-P8-NEXT: addi 3, 4, .LCPI25_1@toc@l 1050; CHECK-P8-NEXT: lvx 3, 0, 3 1051; CHECK-P8-NEXT: xvmaddasp 34, 1, 0 1052; CHECK-P8-NEXT: xvmulsp 0, 1, 35 1053; CHECK-P8-NEXT: xvmulsp 34, 0, 34 1054; CHECK-P8-NEXT: blr 1055; CHECK-P8-NEXT: .LBB25_2: 1056; CHECK-P8-NEXT: xvsqrtsp 34, 34 1057; CHECK-P8-NEXT: blr 1058; 1059; CHECK-P9-LABEL: hoo3_fmf: 1060; CHECK-P9: # %bb.0: 1061; CHECK-P9-NEXT: xvtsqrtsp 0, 34 1062; CHECK-P9-NEXT: bc 12, 2, .LBB25_2 1063; CHECK-P9-NEXT: # %bb.1: 1064; CHECK-P9-NEXT: xvrsqrtesp 0, 34 1065; CHECK-P9-NEXT: addis 3, 2, .LCPI25_0@toc@ha 1066; CHECK-P9-NEXT: addi 3, 3, .LCPI25_0@toc@l 1067; CHECK-P9-NEXT: lxvx 2, 0, 3 1068; CHECK-P9-NEXT: addis 3, 2, .LCPI25_1@toc@ha 1069; CHECK-P9-NEXT: addi 3, 3, .LCPI25_1@toc@l 1070; CHECK-P9-NEXT: xvmulsp 1, 34, 0 1071; CHECK-P9-NEXT: xvmaddasp 2, 1, 0 1072; CHECK-P9-NEXT: lxvx 0, 0, 3 1073; CHECK-P9-NEXT: xvmulsp 0, 1, 0 1074; CHECK-P9-NEXT: xvmulsp 34, 0, 2 1075; CHECK-P9-NEXT: blr 1076; CHECK-P9-NEXT: .LBB25_2: 1077; CHECK-P9-NEXT: xvsqrtsp 34, 34 1078; CHECK-P9-NEXT: blr 1079 %r = call reassoc ninf afn <4 x float> @llvm.sqrt.v4f32(<4 x float> %a) 1080 ret <4 x float> %r 1081} 1082 1083define <4 x float> @hoo3_safe(<4 x float> %a) nounwind { 1084; CHECK-P7-LABEL: hoo3_safe: 1085; CHECK-P7: # %bb.0: 1086; CHECK-P7-NEXT: addi 3, 1, -32 1087; CHECK-P7-NEXT: stvx 2, 0, 3 1088; CHECK-P7-NEXT: addi 3, 1, -16 1089; CHECK-P7-NEXT: lfs 0, -20(1) 1090; CHECK-P7-NEXT: fsqrts 0, 0 1091; CHECK-P7-NEXT: stfs 0, -4(1) 1092; CHECK-P7-NEXT: lfs 0, -24(1) 1093; CHECK-P7-NEXT: fsqrts 0, 0 1094; CHECK-P7-NEXT: stfs 0, -8(1) 1095; CHECK-P7-NEXT: lfs 0, -28(1) 1096; CHECK-P7-NEXT: fsqrts 0, 0 1097; CHECK-P7-NEXT: stfs 0, -12(1) 1098; CHECK-P7-NEXT: lfs 0, -32(1) 1099; CHECK-P7-NEXT: fsqrts 0, 0 1100; CHECK-P7-NEXT: stfs 0, -16(1) 1101; CHECK-P7-NEXT: lvx 2, 0, 3 1102; CHECK-P7-NEXT: blr 1103; 1104; CHECK-P8-LABEL: hoo3_safe: 1105; CHECK-P8: # %bb.0: 1106; CHECK-P8-NEXT: xvsqrtsp 34, 34 1107; CHECK-P8-NEXT: blr 1108; 1109; CHECK-P9-LABEL: hoo3_safe: 1110; CHECK-P9: # %bb.0: 1111; CHECK-P9-NEXT: xvsqrtsp 34, 34 1112; CHECK-P9-NEXT: blr 1113 %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a) 1114 ret <4 x float> %r 1115} 1116 1117define <2 x double> @hoo4_fmf(<2 x double> %a) #1 { 1118; CHECK-P7-LABEL: hoo4_fmf: 1119; CHECK-P7: # %bb.0: 1120; CHECK-P7-NEXT: ftsqrt 0, 1 1121; CHECK-P7-NEXT: addis 3, 2, .LCPI27_0@toc@ha 1122; CHECK-P7-NEXT: addis 4, 2, .LCPI27_1@toc@ha 1123; CHECK-P7-NEXT: lfs 3, .LCPI27_0@toc@l(3) 1124; CHECK-P7-NEXT: lfs 0, .LCPI27_1@toc@l(4) 1125; CHECK-P7-NEXT: bc 12, 2, .LBB27_3 1126; CHECK-P7-NEXT: # %bb.1: 1127; CHECK-P7-NEXT: frsqrte 4, 1 1128; CHECK-P7-NEXT: fmul 5, 1, 4 1129; CHECK-P7-NEXT: fmadd 5, 5, 4, 3 1130; CHECK-P7-NEXT: fmul 4, 4, 0 1131; CHECK-P7-NEXT: fmul 4, 4, 5 1132; CHECK-P7-NEXT: fmul 1, 1, 4 1133; CHECK-P7-NEXT: fmadd 4, 1, 4, 3 1134; CHECK-P7-NEXT: fmul 1, 1, 0 1135; CHECK-P7-NEXT: fmul 1, 1, 4 1136; CHECK-P7-NEXT: ftsqrt 0, 2 1137; CHECK-P7-NEXT: bc 4, 2, .LBB27_4 1138; CHECK-P7-NEXT: .LBB27_2: 1139; CHECK-P7-NEXT: fsqrt 2, 2 1140; CHECK-P7-NEXT: blr 1141; CHECK-P7-NEXT: .LBB27_3: 1142; CHECK-P7-NEXT: fsqrt 1, 1 1143; CHECK-P7-NEXT: ftsqrt 0, 2 1144; CHECK-P7-NEXT: bc 12, 2, .LBB27_2 1145; CHECK-P7-NEXT: .LBB27_4: 1146; CHECK-P7-NEXT: frsqrte 4, 2 1147; CHECK-P7-NEXT: fmul 5, 2, 4 1148; CHECK-P7-NEXT: fmadd 5, 5, 4, 3 1149; CHECK-P7-NEXT: fmul 4, 4, 0 1150; CHECK-P7-NEXT: fmul 4, 4, 5 1151; CHECK-P7-NEXT: fmul 2, 2, 4 1152; CHECK-P7-NEXT: fmadd 3, 2, 4, 3 1153; CHECK-P7-NEXT: fmul 0, 2, 0 1154; CHECK-P7-NEXT: fmul 2, 0, 3 1155; CHECK-P7-NEXT: blr 1156; 1157; CHECK-P8-LABEL: hoo4_fmf: 1158; CHECK-P8: # %bb.0: 1159; CHECK-P8-NEXT: xvtsqrtdp 0, 34 1160; CHECK-P8-NEXT: bc 12, 2, .LBB27_2 1161; CHECK-P8-NEXT: # %bb.1: 1162; CHECK-P8-NEXT: xvrsqrtedp 0, 34 1163; CHECK-P8-NEXT: addis 3, 2, .LCPI27_0@toc@ha 1164; CHECK-P8-NEXT: addi 3, 3, .LCPI27_0@toc@l 1165; CHECK-P8-NEXT: lxvd2x 1, 0, 3 1166; CHECK-P8-NEXT: addis 3, 2, .LCPI27_1@toc@ha 1167; CHECK-P8-NEXT: addi 3, 3, .LCPI27_1@toc@l 1168; CHECK-P8-NEXT: lxvd2x 3, 0, 3 1169; CHECK-P8-NEXT: xxswapd 1, 1 1170; CHECK-P8-NEXT: xvmuldp 2, 34, 0 1171; CHECK-P8-NEXT: xxswapd 3, 3 1172; CHECK-P8-NEXT: xxlor 4, 1, 1 1173; CHECK-P8-NEXT: xvmaddadp 4, 2, 0 1174; CHECK-P8-NEXT: xvmuldp 0, 0, 3 1175; CHECK-P8-NEXT: xvmuldp 0, 0, 4 1176; CHECK-P8-NEXT: xvmuldp 2, 34, 0 1177; CHECK-P8-NEXT: xvmaddadp 1, 2, 0 1178; CHECK-P8-NEXT: xvmuldp 0, 2, 3 1179; CHECK-P8-NEXT: xvmuldp 34, 0, 1 1180; CHECK-P8-NEXT: blr 1181; CHECK-P8-NEXT: .LBB27_2: 1182; CHECK-P8-NEXT: xvsqrtdp 34, 34 1183; CHECK-P8-NEXT: blr 1184; 1185; CHECK-P9-LABEL: hoo4_fmf: 1186; CHECK-P9: # %bb.0: 1187; CHECK-P9-NEXT: xvtsqrtdp 0, 34 1188; CHECK-P9-NEXT: bc 12, 2, .LBB27_2 1189; CHECK-P9-NEXT: # %bb.1: 1190; CHECK-P9-NEXT: xvrsqrtedp 0, 34 1191; CHECK-P9-NEXT: addis 3, 2, .LCPI27_0@toc@ha 1192; CHECK-P9-NEXT: addi 3, 3, .LCPI27_0@toc@l 1193; CHECK-P9-NEXT: lxvx 2, 0, 3 1194; CHECK-P9-NEXT: addis 3, 2, .LCPI27_1@toc@ha 1195; CHECK-P9-NEXT: addi 3, 3, .LCPI27_1@toc@l 1196; CHECK-P9-NEXT: xvmuldp 1, 34, 0 1197; CHECK-P9-NEXT: xxlor 3, 2, 2 1198; CHECK-P9-NEXT: xvmaddadp 3, 1, 0 1199; CHECK-P9-NEXT: lxvx 1, 0, 3 1200; CHECK-P9-NEXT: xvmuldp 0, 0, 1 1201; CHECK-P9-NEXT: xvmuldp 0, 0, 3 1202; CHECK-P9-NEXT: xvmuldp 3, 34, 0 1203; CHECK-P9-NEXT: xvmaddadp 2, 3, 0 1204; CHECK-P9-NEXT: xvmuldp 0, 3, 1 1205; CHECK-P9-NEXT: xvmuldp 34, 0, 2 1206; CHECK-P9-NEXT: blr 1207; CHECK-P9-NEXT: .LBB27_2: 1208; CHECK-P9-NEXT: xvsqrtdp 34, 34 1209; CHECK-P9-NEXT: blr 1210 %r = call reassoc ninf afn <2 x double> @llvm.sqrt.v2f64(<2 x double> %a) 1211 ret <2 x double> %r 1212} 1213 1214define <2 x double> @hoo4_safe(<2 x double> %a) #1 { 1215; CHECK-P7-LABEL: hoo4_safe: 1216; CHECK-P7: # %bb.0: 1217; CHECK-P7-NEXT: fsqrt 1, 1 1218; CHECK-P7-NEXT: fsqrt 2, 2 1219; CHECK-P7-NEXT: blr 1220; 1221; CHECK-P8-LABEL: hoo4_safe: 1222; CHECK-P8: # %bb.0: 1223; CHECK-P8-NEXT: xvsqrtdp 34, 34 1224; CHECK-P8-NEXT: blr 1225; 1226; CHECK-P9-LABEL: hoo4_safe: 1227; CHECK-P9: # %bb.0: 1228; CHECK-P9-NEXT: xvsqrtdp 34, 34 1229; CHECK-P9-NEXT: blr 1230 %r = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %a) 1231 ret <2 x double> %r 1232} 1233 1234define fp128 @hoo5_fmf(fp128 %a) #1 { 1235; CHECK-P7-LABEL: hoo5_fmf: 1236; CHECK-P7: # %bb.0: 1237; CHECK-P7-NEXT: mflr 0 1238; CHECK-P7-NEXT: std 0, 16(1) 1239; CHECK-P7-NEXT: stdu 1, -112(1) 1240; CHECK-P7-NEXT: bl sqrtf128 1241; CHECK-P7-NEXT: nop 1242; CHECK-P7-NEXT: addi 1, 1, 112 1243; CHECK-P7-NEXT: ld 0, 16(1) 1244; CHECK-P7-NEXT: mtlr 0 1245; CHECK-P7-NEXT: blr 1246; 1247; CHECK-P8-LABEL: hoo5_fmf: 1248; CHECK-P8: # %bb.0: 1249; CHECK-P8-NEXT: mflr 0 1250; CHECK-P8-NEXT: std 0, 16(1) 1251; CHECK-P8-NEXT: stdu 1, -32(1) 1252; CHECK-P8-NEXT: bl sqrtf128 1253; CHECK-P8-NEXT: nop 1254; CHECK-P8-NEXT: addi 1, 1, 32 1255; CHECK-P8-NEXT: ld 0, 16(1) 1256; CHECK-P8-NEXT: mtlr 0 1257; CHECK-P8-NEXT: blr 1258; 1259; CHECK-P9-LABEL: hoo5_fmf: 1260; CHECK-P9: # %bb.0: 1261; CHECK-P9-NEXT: xssqrtqp 2, 2 1262; CHECK-P9-NEXT: blr 1263 %r = call reassoc ninf afn fp128 @llvm.sqrt.f128(fp128 %a) 1264 ret fp128 %r 1265} 1266 1267define fp128 @hoo5_safe(fp128 %a) #1 { 1268; CHECK-P7-LABEL: hoo5_safe: 1269; CHECK-P7: # %bb.0: 1270; CHECK-P7-NEXT: mflr 0 1271; CHECK-P7-NEXT: std 0, 16(1) 1272; CHECK-P7-NEXT: stdu 1, -112(1) 1273; CHECK-P7-NEXT: bl sqrtf128 1274; CHECK-P7-NEXT: nop 1275; CHECK-P7-NEXT: addi 1, 1, 112 1276; CHECK-P7-NEXT: ld 0, 16(1) 1277; CHECK-P7-NEXT: mtlr 0 1278; CHECK-P7-NEXT: blr 1279; 1280; CHECK-P8-LABEL: hoo5_safe: 1281; CHECK-P8: # %bb.0: 1282; CHECK-P8-NEXT: mflr 0 1283; CHECK-P8-NEXT: std 0, 16(1) 1284; CHECK-P8-NEXT: stdu 1, -32(1) 1285; CHECK-P8-NEXT: bl sqrtf128 1286; CHECK-P8-NEXT: nop 1287; CHECK-P8-NEXT: addi 1, 1, 32 1288; CHECK-P8-NEXT: ld 0, 16(1) 1289; CHECK-P8-NEXT: mtlr 0 1290; CHECK-P8-NEXT: blr 1291; 1292; CHECK-P9-LABEL: hoo5_safe: 1293; CHECK-P9: # %bb.0: 1294; CHECK-P9-NEXT: xssqrtqp 2, 2 1295; CHECK-P9-NEXT: blr 1296 %r = call fp128 @llvm.sqrt.f128(fp128 %a) 1297 ret fp128 %r 1298} 1299 1300attributes #0 = { nounwind "reciprocal-estimates"="sqrtf:0,sqrtd:0" } 1301attributes #1 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" } 1302attributes #2 = { nounwind readnone "target-features"="-crbits" } 1303