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: fabs 0, 1 753; CHECK-P7-NEXT: addis 3, 2, .LCPI20_2@toc@ha 754; CHECK-P7-NEXT: lfd 2, .LCPI20_2@toc@l(3) 755; CHECK-P7-NEXT: fcmpu 0, 0, 2 756; CHECK-P7-NEXT: blt 0, .LBB20_2 757; CHECK-P7-NEXT: # %bb.1: 758; CHECK-P7-NEXT: frsqrte 0, 1 759; CHECK-P7-NEXT: addis 3, 2, .LCPI20_0@toc@ha 760; CHECK-P7-NEXT: addis 4, 2, .LCPI20_1@toc@ha 761; CHECK-P7-NEXT: lfs 3, .LCPI20_0@toc@l(3) 762; CHECK-P7-NEXT: lfs 4, .LCPI20_1@toc@l(4) 763; CHECK-P7-NEXT: fmul 2, 1, 0 764; CHECK-P7-NEXT: fmadd 2, 2, 0, 3 765; CHECK-P7-NEXT: fmul 0, 0, 4 766; CHECK-P7-NEXT: fmul 0, 0, 2 767; CHECK-P7-NEXT: fmul 1, 1, 0 768; CHECK-P7-NEXT: fmadd 0, 1, 0, 3 769; CHECK-P7-NEXT: fmul 1, 1, 4 770; CHECK-P7-NEXT: fmul 1, 1, 0 771; CHECK-P7-NEXT: blr 772; CHECK-P7-NEXT: .LBB20_2: 773; CHECK-P7-NEXT: addis 3, 2, .LCPI20_3@toc@ha 774; CHECK-P7-NEXT: lfs 1, .LCPI20_3@toc@l(3) 775; CHECK-P7-NEXT: blr 776; 777; CHECK-P8-LABEL: foo3_fmf: 778; CHECK-P8: # %bb.0: 779; CHECK-P8-NEXT: xsabsdp 0, 1 780; CHECK-P8-NEXT: addis 3, 2, .LCPI20_2@toc@ha 781; CHECK-P8-NEXT: lfd 2, .LCPI20_2@toc@l(3) 782; CHECK-P8-NEXT: xscmpudp 0, 0, 2 783; CHECK-P8-NEXT: xxlxor 0, 0, 0 784; CHECK-P8-NEXT: blt 0, .LBB20_2 785; CHECK-P8-NEXT: # %bb.1: 786; CHECK-P8-NEXT: xsrsqrtedp 0, 1 787; CHECK-P8-NEXT: addis 3, 2, .LCPI20_0@toc@ha 788; CHECK-P8-NEXT: lfs 3, .LCPI20_0@toc@l(3) 789; CHECK-P8-NEXT: addis 3, 2, .LCPI20_1@toc@ha 790; CHECK-P8-NEXT: lfs 4, .LCPI20_1@toc@l(3) 791; CHECK-P8-NEXT: fmr 5, 3 792; CHECK-P8-NEXT: xsmuldp 2, 1, 0 793; CHECK-P8-NEXT: xsmaddadp 5, 2, 0 794; CHECK-P8-NEXT: xsmuldp 0, 0, 4 795; CHECK-P8-NEXT: xsmuldp 0, 0, 5 796; CHECK-P8-NEXT: xsmuldp 1, 1, 0 797; CHECK-P8-NEXT: xsmaddadp 3, 1, 0 798; CHECK-P8-NEXT: xsmuldp 0, 1, 4 799; CHECK-P8-NEXT: xsmuldp 0, 0, 3 800; CHECK-P8-NEXT: .LBB20_2: 801; CHECK-P8-NEXT: fmr 1, 0 802; CHECK-P8-NEXT: blr 803; 804; CHECK-P9-LABEL: foo3_fmf: 805; CHECK-P9: # %bb.0: 806; CHECK-P9-NEXT: addis 3, 2, .LCPI20_2@toc@ha 807; CHECK-P9-NEXT: lfd 2, .LCPI20_2@toc@l(3) 808; CHECK-P9-NEXT: xsabsdp 0, 1 809; CHECK-P9-NEXT: xscmpudp 0, 0, 2 810; CHECK-P9-NEXT: xxlxor 0, 0, 0 811; CHECK-P9-NEXT: blt 0, .LBB20_2 812; CHECK-P9-NEXT: # %bb.1: 813; CHECK-P9-NEXT: xsrsqrtedp 0, 1 814; CHECK-P9-NEXT: addis 3, 2, .LCPI20_0@toc@ha 815; CHECK-P9-NEXT: lfs 3, .LCPI20_0@toc@l(3) 816; CHECK-P9-NEXT: addis 3, 2, .LCPI20_1@toc@ha 817; CHECK-P9-NEXT: xsmuldp 2, 1, 0 818; CHECK-P9-NEXT: fmr 4, 3 819; CHECK-P9-NEXT: xsmaddadp 4, 2, 0 820; CHECK-P9-NEXT: lfs 2, .LCPI20_1@toc@l(3) 821; CHECK-P9-NEXT: xsmuldp 0, 0, 2 822; CHECK-P9-NEXT: xsmuldp 0, 0, 4 823; CHECK-P9-NEXT: xsmuldp 1, 1, 0 824; CHECK-P9-NEXT: xsmaddadp 3, 1, 0 825; CHECK-P9-NEXT: xsmuldp 0, 1, 2 826; CHECK-P9-NEXT: xsmuldp 0, 0, 3 827; CHECK-P9-NEXT: .LBB20_2: 828; CHECK-P9-NEXT: fmr 1, 0 829; CHECK-P9-NEXT: blr 830 %r = call reassoc ninf afn double @llvm.sqrt.f64(double %a) 831 ret double %r 832} 833 834define double @foo3_safe(double %a) nounwind { 835; CHECK-P7-LABEL: foo3_safe: 836; CHECK-P7: # %bb.0: 837; CHECK-P7-NEXT: fsqrt 1, 1 838; CHECK-P7-NEXT: blr 839; 840; CHECK-P8-LABEL: foo3_safe: 841; CHECK-P8: # %bb.0: 842; CHECK-P8-NEXT: xssqrtdp 1, 1 843; CHECK-P8-NEXT: blr 844; 845; CHECK-P9-LABEL: foo3_safe: 846; CHECK-P9: # %bb.0: 847; CHECK-P9-NEXT: xssqrtdp 1, 1 848; CHECK-P9-NEXT: blr 849 %r = call double @llvm.sqrt.f64(double %a) 850 ret double %r 851} 852 853define float @goo3_fmf(float %a) nounwind { 854; CHECK-P7-LABEL: goo3_fmf: 855; CHECK-P7: # %bb.0: 856; CHECK-P7-NEXT: fabs 0, 1 857; CHECK-P7-NEXT: addis 3, 2, .LCPI22_2@toc@ha 858; CHECK-P7-NEXT: lfs 2, .LCPI22_2@toc@l(3) 859; CHECK-P7-NEXT: fcmpu 0, 0, 2 860; CHECK-P7-NEXT: blt 0, .LBB22_2 861; CHECK-P7-NEXT: # %bb.1: 862; CHECK-P7-NEXT: frsqrtes 0, 1 863; CHECK-P7-NEXT: addis 3, 2, .LCPI22_0@toc@ha 864; CHECK-P7-NEXT: addis 4, 2, .LCPI22_1@toc@ha 865; CHECK-P7-NEXT: lfs 2, .LCPI22_0@toc@l(3) 866; CHECK-P7-NEXT: lfs 3, .LCPI22_1@toc@l(4) 867; CHECK-P7-NEXT: fmuls 1, 1, 0 868; CHECK-P7-NEXT: fmadds 0, 1, 0, 2 869; CHECK-P7-NEXT: fmuls 1, 1, 3 870; CHECK-P7-NEXT: fmuls 1, 1, 0 871; CHECK-P7-NEXT: blr 872; CHECK-P7-NEXT: .LBB22_2: 873; CHECK-P7-NEXT: addis 3, 2, .LCPI22_3@toc@ha 874; CHECK-P7-NEXT: lfs 1, .LCPI22_3@toc@l(3) 875; CHECK-P7-NEXT: blr 876; 877; CHECK-P8-LABEL: goo3_fmf: 878; CHECK-P8: # %bb.0: 879; CHECK-P8-NEXT: xsabsdp 0, 1 880; CHECK-P8-NEXT: addis 3, 2, .LCPI22_2@toc@ha 881; CHECK-P8-NEXT: lfs 2, .LCPI22_2@toc@l(3) 882; CHECK-P8-NEXT: fcmpu 0, 0, 2 883; CHECK-P8-NEXT: xxlxor 0, 0, 0 884; CHECK-P8-NEXT: blt 0, .LBB22_2 885; CHECK-P8-NEXT: # %bb.1: 886; CHECK-P8-NEXT: xsrsqrtesp 0, 1 887; CHECK-P8-NEXT: addis 3, 2, .LCPI22_0@toc@ha 888; CHECK-P8-NEXT: addis 4, 2, .LCPI22_1@toc@ha 889; CHECK-P8-NEXT: lfs 2, .LCPI22_0@toc@l(3) 890; CHECK-P8-NEXT: lfs 3, .LCPI22_1@toc@l(4) 891; CHECK-P8-NEXT: xsmulsp 1, 1, 0 892; CHECK-P8-NEXT: xsmaddasp 2, 1, 0 893; CHECK-P8-NEXT: xsmulsp 0, 1, 3 894; CHECK-P8-NEXT: xsmulsp 0, 0, 2 895; CHECK-P8-NEXT: .LBB22_2: 896; CHECK-P8-NEXT: fmr 1, 0 897; CHECK-P8-NEXT: blr 898; 899; CHECK-P9-LABEL: goo3_fmf: 900; CHECK-P9: # %bb.0: 901; CHECK-P9-NEXT: addis 3, 2, .LCPI22_2@toc@ha 902; CHECK-P9-NEXT: lfs 2, .LCPI22_2@toc@l(3) 903; CHECK-P9-NEXT: xsabsdp 0, 1 904; CHECK-P9-NEXT: fcmpu 0, 0, 2 905; CHECK-P9-NEXT: xxlxor 0, 0, 0 906; CHECK-P9-NEXT: blt 0, .LBB22_2 907; CHECK-P9-NEXT: # %bb.1: 908; CHECK-P9-NEXT: xsrsqrtesp 0, 1 909; CHECK-P9-NEXT: addis 3, 2, .LCPI22_0@toc@ha 910; CHECK-P9-NEXT: lfs 2, .LCPI22_0@toc@l(3) 911; CHECK-P9-NEXT: addis 3, 2, .LCPI22_1@toc@ha 912; CHECK-P9-NEXT: xsmulsp 1, 1, 0 913; CHECK-P9-NEXT: xsmaddasp 2, 1, 0 914; CHECK-P9-NEXT: lfs 0, .LCPI22_1@toc@l(3) 915; CHECK-P9-NEXT: xsmulsp 0, 1, 0 916; CHECK-P9-NEXT: xsmulsp 0, 0, 2 917; CHECK-P9-NEXT: .LBB22_2: 918; CHECK-P9-NEXT: fmr 1, 0 919; CHECK-P9-NEXT: blr 920 %r = call reassoc ninf afn float @llvm.sqrt.f32(float %a) 921 ret float %r 922} 923 924define float @goo3_safe(float %a) nounwind { 925; CHECK-P7-LABEL: goo3_safe: 926; CHECK-P7: # %bb.0: 927; CHECK-P7-NEXT: fsqrts 1, 1 928; CHECK-P7-NEXT: blr 929; 930; CHECK-P8-LABEL: goo3_safe: 931; CHECK-P8: # %bb.0: 932; CHECK-P8-NEXT: xssqrtsp 1, 1 933; CHECK-P8-NEXT: blr 934; 935; CHECK-P9-LABEL: goo3_safe: 936; CHECK-P9: # %bb.0: 937; CHECK-P9-NEXT: xssqrtsp 1, 1 938; CHECK-P9-NEXT: blr 939 %r = call float @llvm.sqrt.f32(float %a) 940 ret float %r 941} 942 943define <4 x float> @hoo3_fmf(<4 x float> %a) #1 { 944; CHECK-P7-LABEL: hoo3_fmf: 945; CHECK-P7: # %bb.0: 946; CHECK-P7-NEXT: vspltisw 3, -1 947; CHECK-P7-NEXT: addis 3, 2, .LCPI24_0@toc@ha 948; CHECK-P7-NEXT: vrsqrtefp 4, 2 949; CHECK-P7-NEXT: addi 3, 3, .LCPI24_0@toc@l 950; CHECK-P7-NEXT: lvx 0, 0, 3 951; CHECK-P7-NEXT: addis 3, 2, .LCPI24_1@toc@ha 952; CHECK-P7-NEXT: addi 3, 3, .LCPI24_1@toc@l 953; CHECK-P7-NEXT: lvx 1, 0, 3 954; CHECK-P7-NEXT: vslw 3, 3, 3 955; CHECK-P7-NEXT: vmaddfp 5, 2, 4, 3 956; CHECK-P7-NEXT: vmaddfp 4, 5, 4, 0 957; CHECK-P7-NEXT: vmaddfp 5, 5, 1, 3 958; CHECK-P7-NEXT: vxor 0, 0, 0 959; CHECK-P7-NEXT: vmaddfp 3, 5, 4, 3 960; CHECK-P7-NEXT: vcmpeqfp 2, 2, 0 961; CHECK-P7-NEXT: vsel 2, 3, 0, 2 962; CHECK-P7-NEXT: blr 963; 964; CHECK-P8-LABEL: hoo3_fmf: 965; CHECK-P8: # %bb.0: 966; CHECK-P8-NEXT: xvrsqrtesp 0, 34 967; CHECK-P8-NEXT: addis 3, 2, .LCPI24_0@toc@ha 968; CHECK-P8-NEXT: addis 4, 2, .LCPI24_1@toc@ha 969; CHECK-P8-NEXT: addi 3, 3, .LCPI24_0@toc@l 970; CHECK-P8-NEXT: lvx 3, 0, 3 971; CHECK-P8-NEXT: addi 3, 4, .LCPI24_1@toc@l 972; CHECK-P8-NEXT: lvx 4, 0, 3 973; CHECK-P8-NEXT: xvmulsp 1, 34, 0 974; CHECK-P8-NEXT: xvmaddasp 35, 1, 0 975; CHECK-P8-NEXT: xvmulsp 0, 1, 36 976; CHECK-P8-NEXT: xxlxor 1, 1, 1 977; CHECK-P8-NEXT: xvcmpeqsp 2, 34, 1 978; CHECK-P8-NEXT: xvmulsp 0, 0, 35 979; CHECK-P8-NEXT: xxsel 34, 0, 1, 2 980; CHECK-P8-NEXT: blr 981; 982; CHECK-P9-LABEL: hoo3_fmf: 983; CHECK-P9: # %bb.0: 984; CHECK-P9-NEXT: xvrsqrtesp 0, 34 985; CHECK-P9-NEXT: addis 3, 2, .LCPI24_0@toc@ha 986; CHECK-P9-NEXT: addi 3, 3, .LCPI24_0@toc@l 987; CHECK-P9-NEXT: lxvx 2, 0, 3 988; CHECK-P9-NEXT: addis 3, 2, .LCPI24_1@toc@ha 989; CHECK-P9-NEXT: addi 3, 3, .LCPI24_1@toc@l 990; CHECK-P9-NEXT: xvmulsp 1, 34, 0 991; CHECK-P9-NEXT: xvmaddasp 2, 1, 0 992; CHECK-P9-NEXT: lxvx 0, 0, 3 993; CHECK-P9-NEXT: xvmulsp 0, 1, 0 994; CHECK-P9-NEXT: xxlxor 1, 1, 1 995; CHECK-P9-NEXT: xvmulsp 0, 0, 2 996; CHECK-P9-NEXT: xvcmpeqsp 2, 34, 1 997; CHECK-P9-NEXT: xxsel 34, 0, 1, 2 998; CHECK-P9-NEXT: blr 999 %r = call reassoc ninf afn <4 x float> @llvm.sqrt.v4f32(<4 x float> %a) 1000 ret <4 x float> %r 1001} 1002 1003define <4 x float> @hoo3_safe(<4 x float> %a) nounwind { 1004; CHECK-P7-LABEL: hoo3_safe: 1005; CHECK-P7: # %bb.0: 1006; CHECK-P7-NEXT: addi 3, 1, -32 1007; CHECK-P7-NEXT: stvx 2, 0, 3 1008; CHECK-P7-NEXT: addi 3, 1, -16 1009; CHECK-P7-NEXT: lfs 0, -20(1) 1010; CHECK-P7-NEXT: fsqrts 0, 0 1011; CHECK-P7-NEXT: stfs 0, -4(1) 1012; CHECK-P7-NEXT: lfs 0, -24(1) 1013; CHECK-P7-NEXT: fsqrts 0, 0 1014; CHECK-P7-NEXT: stfs 0, -8(1) 1015; CHECK-P7-NEXT: lfs 0, -28(1) 1016; CHECK-P7-NEXT: fsqrts 0, 0 1017; CHECK-P7-NEXT: stfs 0, -12(1) 1018; CHECK-P7-NEXT: lfs 0, -32(1) 1019; CHECK-P7-NEXT: fsqrts 0, 0 1020; CHECK-P7-NEXT: stfs 0, -16(1) 1021; CHECK-P7-NEXT: lvx 2, 0, 3 1022; CHECK-P7-NEXT: blr 1023; 1024; CHECK-P8-LABEL: hoo3_safe: 1025; CHECK-P8: # %bb.0: 1026; CHECK-P8-NEXT: xvsqrtsp 34, 34 1027; CHECK-P8-NEXT: blr 1028; 1029; CHECK-P9-LABEL: hoo3_safe: 1030; CHECK-P9: # %bb.0: 1031; CHECK-P9-NEXT: xvsqrtsp 34, 34 1032; CHECK-P9-NEXT: blr 1033 %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a) 1034 ret <4 x float> %r 1035} 1036 1037define <2 x double> @hoo4_fmf(<2 x double> %a) #1 { 1038; CHECK-P7-LABEL: hoo4_fmf: 1039; CHECK-P7: # %bb.0: 1040; CHECK-P7-NEXT: addis 3, 2, .LCPI26_2@toc@ha 1041; CHECK-P7-NEXT: fmr 3, 1 1042; CHECK-P7-NEXT: addis 4, 2, .LCPI26_1@toc@ha 1043; CHECK-P7-NEXT: lfs 0, .LCPI26_2@toc@l(3) 1044; CHECK-P7-NEXT: addis 3, 2, .LCPI26_0@toc@ha 1045; CHECK-P7-NEXT: lfs 4, .LCPI26_1@toc@l(4) 1046; CHECK-P7-NEXT: lfs 5, .LCPI26_0@toc@l(3) 1047; CHECK-P7-NEXT: fcmpu 0, 1, 0 1048; CHECK-P7-NEXT: fmr 1, 0 1049; CHECK-P7-NEXT: bne 0, .LBB26_3 1050; CHECK-P7-NEXT: # %bb.1: 1051; CHECK-P7-NEXT: fcmpu 0, 2, 0 1052; CHECK-P7-NEXT: bne 0, .LBB26_4 1053; CHECK-P7-NEXT: .LBB26_2: 1054; CHECK-P7-NEXT: fmr 2, 0 1055; CHECK-P7-NEXT: blr 1056; CHECK-P7-NEXT: .LBB26_3: 1057; CHECK-P7-NEXT: frsqrte 1, 3 1058; CHECK-P7-NEXT: fmul 6, 3, 1 1059; CHECK-P7-NEXT: fmadd 6, 6, 1, 5 1060; CHECK-P7-NEXT: fmul 1, 1, 4 1061; CHECK-P7-NEXT: fmul 1, 1, 6 1062; CHECK-P7-NEXT: fmul 3, 3, 1 1063; CHECK-P7-NEXT: fmadd 1, 3, 1, 5 1064; CHECK-P7-NEXT: fmul 3, 3, 4 1065; CHECK-P7-NEXT: fmul 1, 3, 1 1066; CHECK-P7-NEXT: fcmpu 0, 2, 0 1067; CHECK-P7-NEXT: beq 0, .LBB26_2 1068; CHECK-P7-NEXT: .LBB26_4: 1069; CHECK-P7-NEXT: frsqrte 0, 2 1070; CHECK-P7-NEXT: fmul 3, 2, 0 1071; CHECK-P7-NEXT: fmadd 3, 3, 0, 5 1072; CHECK-P7-NEXT: fmul 0, 0, 4 1073; CHECK-P7-NEXT: fmul 0, 0, 3 1074; CHECK-P7-NEXT: fmul 2, 2, 0 1075; CHECK-P7-NEXT: fmadd 0, 2, 0, 5 1076; CHECK-P7-NEXT: fmul 2, 2, 4 1077; CHECK-P7-NEXT: fmul 0, 2, 0 1078; CHECK-P7-NEXT: fmr 2, 0 1079; CHECK-P7-NEXT: blr 1080; 1081; CHECK-P8-LABEL: hoo4_fmf: 1082; CHECK-P8: # %bb.0: 1083; CHECK-P8-NEXT: xvrsqrtedp 0, 34 1084; CHECK-P8-NEXT: addis 3, 2, .LCPI26_0@toc@ha 1085; CHECK-P8-NEXT: addi 3, 3, .LCPI26_0@toc@l 1086; CHECK-P8-NEXT: lxvd2x 1, 0, 3 1087; CHECK-P8-NEXT: addis 3, 2, .LCPI26_1@toc@ha 1088; CHECK-P8-NEXT: addi 3, 3, .LCPI26_1@toc@l 1089; CHECK-P8-NEXT: lxvd2x 3, 0, 3 1090; CHECK-P8-NEXT: xxswapd 1, 1 1091; CHECK-P8-NEXT: xvmuldp 2, 34, 0 1092; CHECK-P8-NEXT: xxswapd 3, 3 1093; CHECK-P8-NEXT: xxlor 4, 1, 1 1094; CHECK-P8-NEXT: xvmaddadp 4, 2, 0 1095; CHECK-P8-NEXT: xvmuldp 0, 0, 3 1096; CHECK-P8-NEXT: xvmuldp 0, 0, 4 1097; CHECK-P8-NEXT: xvmuldp 2, 34, 0 1098; CHECK-P8-NEXT: xvmaddadp 1, 2, 0 1099; CHECK-P8-NEXT: xvmuldp 0, 2, 3 1100; CHECK-P8-NEXT: xxlxor 2, 2, 2 1101; CHECK-P8-NEXT: xvcmpeqdp 34, 34, 2 1102; CHECK-P8-NEXT: xvmuldp 0, 0, 1 1103; CHECK-P8-NEXT: xxsel 34, 0, 2, 34 1104; CHECK-P8-NEXT: blr 1105; 1106; CHECK-P9-LABEL: hoo4_fmf: 1107; CHECK-P9: # %bb.0: 1108; CHECK-P9-NEXT: xvrsqrtedp 0, 34 1109; CHECK-P9-NEXT: addis 3, 2, .LCPI26_0@toc@ha 1110; CHECK-P9-NEXT: addi 3, 3, .LCPI26_0@toc@l 1111; CHECK-P9-NEXT: lxvx 2, 0, 3 1112; CHECK-P9-NEXT: addis 3, 2, .LCPI26_1@toc@ha 1113; CHECK-P9-NEXT: addi 3, 3, .LCPI26_1@toc@l 1114; CHECK-P9-NEXT: xvmuldp 1, 34, 0 1115; CHECK-P9-NEXT: xxlor 3, 2, 2 1116; CHECK-P9-NEXT: xvmaddadp 3, 1, 0 1117; CHECK-P9-NEXT: lxvx 1, 0, 3 1118; CHECK-P9-NEXT: xvmuldp 0, 0, 1 1119; CHECK-P9-NEXT: xvmuldp 0, 0, 3 1120; CHECK-P9-NEXT: xvmuldp 3, 34, 0 1121; CHECK-P9-NEXT: xvmaddadp 2, 3, 0 1122; CHECK-P9-NEXT: xvmuldp 0, 3, 1 1123; CHECK-P9-NEXT: xxlxor 1, 1, 1 1124; CHECK-P9-NEXT: xvcmpeqdp 34, 34, 1 1125; CHECK-P9-NEXT: xvmuldp 0, 0, 2 1126; CHECK-P9-NEXT: xxsel 34, 0, 1, 34 1127; CHECK-P9-NEXT: blr 1128 %r = call reassoc ninf afn <2 x double> @llvm.sqrt.v2f64(<2 x double> %a) 1129 ret <2 x double> %r 1130} 1131 1132define <2 x double> @hoo4_safe(<2 x double> %a) #1 { 1133; CHECK-P7-LABEL: hoo4_safe: 1134; CHECK-P7: # %bb.0: 1135; CHECK-P7-NEXT: fsqrt 1, 1 1136; CHECK-P7-NEXT: fsqrt 2, 2 1137; CHECK-P7-NEXT: blr 1138; 1139; CHECK-P8-LABEL: hoo4_safe: 1140; CHECK-P8: # %bb.0: 1141; CHECK-P8-NEXT: xvsqrtdp 34, 34 1142; CHECK-P8-NEXT: blr 1143; 1144; CHECK-P9-LABEL: hoo4_safe: 1145; CHECK-P9: # %bb.0: 1146; CHECK-P9-NEXT: xvsqrtdp 34, 34 1147; CHECK-P9-NEXT: blr 1148 %r = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %a) 1149 ret <2 x double> %r 1150} 1151 1152define fp128 @hoo5_fmf(fp128 %a) #1 { 1153; CHECK-P7-LABEL: hoo5_fmf: 1154; CHECK-P7: # %bb.0: 1155; CHECK-P7-NEXT: mflr 0 1156; CHECK-P7-NEXT: std 0, 16(1) 1157; CHECK-P7-NEXT: stdu 1, -112(1) 1158; CHECK-P7-NEXT: bl sqrtl 1159; CHECK-P7-NEXT: nop 1160; CHECK-P7-NEXT: addi 1, 1, 112 1161; CHECK-P7-NEXT: ld 0, 16(1) 1162; CHECK-P7-NEXT: mtlr 0 1163; CHECK-P7-NEXT: blr 1164; 1165; CHECK-P8-LABEL: hoo5_fmf: 1166; CHECK-P8: # %bb.0: 1167; CHECK-P8-NEXT: mflr 0 1168; CHECK-P8-NEXT: std 0, 16(1) 1169; CHECK-P8-NEXT: stdu 1, -32(1) 1170; CHECK-P8-NEXT: bl sqrtl 1171; CHECK-P8-NEXT: nop 1172; CHECK-P8-NEXT: addi 1, 1, 32 1173; CHECK-P8-NEXT: ld 0, 16(1) 1174; CHECK-P8-NEXT: mtlr 0 1175; CHECK-P8-NEXT: blr 1176; 1177; CHECK-P9-LABEL: hoo5_fmf: 1178; CHECK-P9: # %bb.0: 1179; CHECK-P9-NEXT: xssqrtqp 2, 2 1180; CHECK-P9-NEXT: blr 1181 %r = call reassoc ninf afn fp128 @llvm.sqrt.f128(fp128 %a) 1182 ret fp128 %r 1183} 1184 1185define fp128 @hoo5_safe(fp128 %a) #1 { 1186; CHECK-P7-LABEL: hoo5_safe: 1187; CHECK-P7: # %bb.0: 1188; CHECK-P7-NEXT: mflr 0 1189; CHECK-P7-NEXT: std 0, 16(1) 1190; CHECK-P7-NEXT: stdu 1, -112(1) 1191; CHECK-P7-NEXT: bl sqrtl 1192; CHECK-P7-NEXT: nop 1193; CHECK-P7-NEXT: addi 1, 1, 112 1194; CHECK-P7-NEXT: ld 0, 16(1) 1195; CHECK-P7-NEXT: mtlr 0 1196; CHECK-P7-NEXT: blr 1197; 1198; CHECK-P8-LABEL: hoo5_safe: 1199; CHECK-P8: # %bb.0: 1200; CHECK-P8-NEXT: mflr 0 1201; CHECK-P8-NEXT: std 0, 16(1) 1202; CHECK-P8-NEXT: stdu 1, -32(1) 1203; CHECK-P8-NEXT: bl sqrtl 1204; CHECK-P8-NEXT: nop 1205; CHECK-P8-NEXT: addi 1, 1, 32 1206; CHECK-P8-NEXT: ld 0, 16(1) 1207; CHECK-P8-NEXT: mtlr 0 1208; CHECK-P8-NEXT: blr 1209; 1210; CHECK-P9-LABEL: hoo5_safe: 1211; CHECK-P9: # %bb.0: 1212; CHECK-P9-NEXT: xssqrtqp 2, 2 1213; CHECK-P9-NEXT: blr 1214 %r = call fp128 @llvm.sqrt.f128(fp128 %a) 1215 ret fp128 %r 1216} 1217 1218attributes #0 = { nounwind "reciprocal-estimates"="sqrtf:0,sqrtd:0" } 1219attributes #1 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" } 1220