1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-- \ 3; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names < %s | FileCheck %s 4; RUN: llc -verify-machineinstrs -target-abi=elfv2 -mtriple=powerpc64-- \ 5; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names < %s | FileCheck %s 6; RUN: llc -verify-machineinstrs -target-abi=elfv2 -mtriple=powerpc64-- \ 7; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=CHECK-P9 8 9 define float @FloatConstantPool() { 10; CHECK-LABEL: FloatConstantPool: 11; CHECK: # %bb.0: # %entry 12; CHECK-NEXT: plfs f1, .LCPI0_0@PCREL(0), 1 13; CHECK-NEXT: blr 14; 15; CHECK-P9-LABEL: FloatConstantPool: 16; CHECK-P9: # %bb.0: # %entry 17; CHECK-P9-NEXT: addis r3, r2, .LCPI0_0@toc@ha 18; CHECK-P9-NEXT: lfs f1, .LCPI0_0@toc@l(r3) 19; CHECK-P9-NEXT: blr 20entry: 21 ret float 0x380FFFF840000000 22} 23 24 define double @DoubleConstantPool() { 25; CHECK-LABEL: DoubleConstantPool: 26; CHECK: # %bb.0: # %entry 27; CHECK-NEXT: plfd f1, .LCPI1_0@PCREL(0), 1 28; CHECK-NEXT: blr 29; 30; CHECK-P9-LABEL: DoubleConstantPool: 31; CHECK-P9: # %bb.0: # %entry 32; CHECK-P9-NEXT: addis r3, r2, .LCPI1_0@toc@ha 33; CHECK-P9-NEXT: lfd f1, .LCPI1_0@toc@l(r3) 34; CHECK-P9-NEXT: blr 35entry: 36 ret double 2.225070e-308 37} 38 39 define ppc_fp128 @LongDoubleConstantPool() { 40; CHECK-LABEL: LongDoubleConstantPool: 41; CHECK: # %bb.0: # %entry 42; CHECK-NEXT: plfd f1, .LCPI2_0@PCREL(0), 1 43; CHECK-NEXT: plfd f2, .LCPI2_1@PCREL(0), 1 44; CHECK-NEXT: blr 45; 46; CHECK-P9-LABEL: LongDoubleConstantPool: 47; CHECK-P9: # %bb.0: # %entry 48; CHECK-P9-NEXT: addis r3, r2, .LCPI2_0@toc@ha 49; CHECK-P9-NEXT: lfd f1, .LCPI2_0@toc@l(r3) 50; CHECK-P9-NEXT: addis r3, r2, .LCPI2_1@toc@ha 51; CHECK-P9-NEXT: lfd f2, .LCPI2_1@toc@l(r3) 52; CHECK-P9-NEXT: blr 53entry: 54 ret ppc_fp128 0xM03600000DBA876CC800D16974FD9D27B 55} 56 57 define fp128 @__Float128ConstantPool() { 58; CHECK-LABEL: __Float128ConstantPool: 59; CHECK: # %bb.0: # %entry 60; CHECK-NEXT: plxv vs34, .LCPI3_0@PCREL(0), 1 61; CHECK-NEXT: blr 62; 63; CHECK-P9-LABEL: __Float128ConstantPool: 64; CHECK-P9: # %bb.0: # %entry 65; CHECK-P9-NEXT: addis r3, r2, .LCPI3_0@toc@ha 66; CHECK-P9-NEXT: addi r3, r3, .LCPI3_0@toc@l 67; CHECK-P9-NEXT: lxvx vs34, 0, r3 68; CHECK-P9-NEXT: blr 69entry: 70 ret fp128 0xL00000000000000003C00FFFFC5D02B3A 71} 72 73 define <16 x i8> @VectorCharConstantPool() { 74; CHECK-LABEL: VectorCharConstantPool: 75; CHECK: # %bb.0: # %entry 76; CHECK-NEXT: plxv vs34, .LCPI4_0@PCREL(0), 1 77; CHECK-NEXT: blr 78; 79; CHECK-P9-LABEL: VectorCharConstantPool: 80; CHECK-P9: # %bb.0: # %entry 81; CHECK-P9-NEXT: addis r3, r2, .LCPI4_0@toc@ha 82; CHECK-P9-NEXT: addi r3, r3, .LCPI4_0@toc@l 83; CHECK-P9-NEXT: lxvx vs34, 0, r3 84; CHECK-P9-NEXT: blr 85entry: 86 ret <16 x i8> <i8 -128, i8 -127, i8 -126, i8 -125, i8 -124, i8 -123, i8 -122, i8 -121, i8 -120, i8 -119, i8 -118, i8 -117, i8 -116, i8 -115, i8 -114, i8 -113> 87} 88 89 define <8 x i16> @VectorShortConstantPool() { 90; CHECK-LABEL: VectorShortConstantPool: 91; CHECK: # %bb.0: # %entry 92; CHECK-NEXT: plxv vs34, .LCPI5_0@PCREL(0), 1 93; CHECK-NEXT: blr 94; 95; CHECK-P9-LABEL: VectorShortConstantPool: 96; CHECK-P9: # %bb.0: # %entry 97; CHECK-P9-NEXT: addis r3, r2, .LCPI5_0@toc@ha 98; CHECK-P9-NEXT: addi r3, r3, .LCPI5_0@toc@l 99; CHECK-P9-NEXT: lxvx vs34, 0, r3 100; CHECK-P9-NEXT: blr 101entry: 102 ret <8 x i16> <i16 -32768, i16 -32767, i16 -32766, i16 -32765, i16 -32764, i16 -32763, i16 -32762, i16 -32761> 103} 104 105 define <4 x i32> @VectorIntConstantPool() { 106; CHECK-LABEL: VectorIntConstantPool: 107; CHECK: # %bb.0: # %entry 108; CHECK-NEXT: plxv vs34, .LCPI6_0@PCREL(0), 1 109; CHECK-NEXT: blr 110; 111; CHECK-P9-LABEL: VectorIntConstantPool: 112; CHECK-P9: # %bb.0: # %entry 113; CHECK-P9-NEXT: addis r3, r2, .LCPI6_0@toc@ha 114; CHECK-P9-NEXT: addi r3, r3, .LCPI6_0@toc@l 115; CHECK-P9-NEXT: lxvx vs34, 0, r3 116; CHECK-P9-NEXT: blr 117entry: 118 ret <4 x i32> <i32 -2147483648, i32 -2147483647, i32 -2147483646, i32 -2147483645> 119} 120 121 define <2 x i64> @VectorLongLongConstantPool() { 122; CHECK-LABEL: VectorLongLongConstantPool: 123; CHECK: # %bb.0: # %entry 124; CHECK-NEXT: plxv vs34, .LCPI7_0@PCREL(0), 1 125; CHECK-NEXT: blr 126; 127; CHECK-P9-LABEL: VectorLongLongConstantPool: 128; CHECK-P9: # %bb.0: # %entry 129; CHECK-P9-NEXT: addis r3, r2, .LCPI7_0@toc@ha 130; CHECK-P9-NEXT: addi r3, r3, .LCPI7_0@toc@l 131; CHECK-P9-NEXT: lxvx vs34, 0, r3 132; CHECK-P9-NEXT: blr 133entry: 134 ret <2 x i64> <i64 -9223372036854775808, i64 -9223372036854775807> 135} 136 137 define <1 x i128> @VectorInt128ConstantPool() { 138; CHECK-LABEL: VectorInt128ConstantPool: 139; CHECK: # %bb.0: # %entry 140; CHECK-NEXT: plxv vs34, .LCPI8_0@PCREL(0), 1 141; CHECK-NEXT: blr 142; 143; CHECK-P9-LABEL: VectorInt128ConstantPool: 144; CHECK-P9: # %bb.0: # %entry 145; CHECK-P9-NEXT: addis r3, r2, .LCPI8_0@toc@ha 146; CHECK-P9-NEXT: addi r3, r3, .LCPI8_0@toc@l 147; CHECK-P9-NEXT: lxvx vs34, 0, r3 148; CHECK-P9-NEXT: blr 149entry: 150 ret <1 x i128> <i128 -27670116110564327424> 151} 152 153 define <4 x float> @VectorFloatConstantPool() { 154; CHECK-LABEL: VectorFloatConstantPool: 155; CHECK: # %bb.0: # %entry 156; CHECK-NEXT: plxv vs34, .LCPI9_0@PCREL(0), 1 157; CHECK-NEXT: blr 158; 159; CHECK-P9-LABEL: VectorFloatConstantPool: 160; CHECK-P9: # %bb.0: # %entry 161; CHECK-P9-NEXT: addis r3, r2, .LCPI9_0@toc@ha 162; CHECK-P9-NEXT: addi r3, r3, .LCPI9_0@toc@l 163; CHECK-P9-NEXT: lxvx vs34, 0, r3 164; CHECK-P9-NEXT: blr 165entry: 166 ret <4 x float> <float 0x380FFFF840000000, float 0x380FFF57C0000000, float 0x3843FFFB20000000, float 0x3843FF96C0000000> 167} 168 169 define <2 x double> @VectorDoubleConstantPool() { 170; CHECK-LABEL: VectorDoubleConstantPool: 171; CHECK: # %bb.0: # %entry 172; CHECK-NEXT: plxv vs34, .LCPI10_0@PCREL(0), 1 173; CHECK-NEXT: blr 174; 175; CHECK-P9-LABEL: VectorDoubleConstantPool: 176; CHECK-P9: # %bb.0: # %entry 177; CHECK-P9-NEXT: addis r3, r2, .LCPI10_0@toc@ha 178; CHECK-P9-NEXT: addi r3, r3, .LCPI10_0@toc@l 179; CHECK-P9-NEXT: lxvx vs34, 0, r3 180; CHECK-P9-NEXT: blr 181entry: 182 ret <2 x double> <double 2.225070e-308, double 2.225000e-308> 183} 184 185define double @two_constants(double %a) { 186; CHECK-LABEL: two_constants: 187; CHECK: # %bb.0: # %entry 188; CHECK-NEXT: plfd f0, .LCPI11_0@PCREL(0), 1 189; CHECK-NEXT: xsadddp f0, f1, f0 190; CHECK-NEXT: plfd f1, .LCPI11_1@PCREL(0), 1 191; CHECK-NEXT: xsadddp f1, f0, f1 192; CHECK-NEXT: blr 193; 194; CHECK-P9-LABEL: two_constants: 195; CHECK-P9: # %bb.0: # %entry 196; CHECK-P9-NEXT: addis r3, r2, .LCPI11_0@toc@ha 197; CHECK-P9-NEXT: lfd f0, .LCPI11_0@toc@l(r3) 198; CHECK-P9-NEXT: addis r3, r2, .LCPI11_1@toc@ha 199; CHECK-P9-NEXT: xsadddp f0, f1, f0 200; CHECK-P9-NEXT: lfd f1, .LCPI11_1@toc@l(r3) 201; CHECK-P9-NEXT: xsadddp f1, f0, f1 202; CHECK-P9-NEXT: blr 203entry: 204 %0 = fadd double %a, 3.344000e+00 205 %1 = fadd double %0, 2.344000e+00 206 ret double %1 207} 208 209define double @two_constants_two_bb(i32 %m, double %a) { 210; CHECK-LABEL: two_constants_two_bb: 211; CHECK: # %bb.0: # %entry 212; CHECK-NEXT: cmplwi r3, 0 213; CHECK-NEXT: beq cr0, .LBB12_2 214; CHECK-NEXT: # %bb.1: 215; CHECK-NEXT: plfd f1, .LCPI12_0@PCREL(0), 1 216; CHECK-NEXT: blr 217; CHECK-NEXT: .LBB12_2: # %if.end 218; CHECK-NEXT: plfd f0, .LCPI12_1@PCREL(0), 1 219; CHECK-NEXT: xsadddp f1, f1, f0 220; CHECK-NEXT: blr 221; 222; CHECK-P9-LABEL: two_constants_two_bb: 223; CHECK-P9: # %bb.0: # %entry 224; CHECK-P9-NEXT: cmplwi r3, 0 225; CHECK-P9-NEXT: beq cr0, .LBB12_2 226; CHECK-P9-NEXT: # %bb.1: 227; CHECK-P9-NEXT: addis r3, r2, .LCPI12_0@toc@ha 228; CHECK-P9-NEXT: lfd f1, .LCPI12_0@toc@l(r3) 229; CHECK-P9-NEXT: blr 230; CHECK-P9-NEXT: .LBB12_2: # %if.end 231; CHECK-P9-NEXT: addis r3, r2, .LCPI12_1@toc@ha 232; CHECK-P9-NEXT: lfd f0, .LCPI12_1@toc@l(r3) 233; CHECK-P9-NEXT: xsadddp f1, f1, f0 234; CHECK-P9-NEXT: blr 235entry: 236 %tobool.not = icmp eq i32 %m, 0 237 br i1 %tobool.not, label %if.end, label %return 238 239if.end: 240 %add = fadd double %a, 9.880000e+00 241 br label %return 242 243return: 244 %retval.0 = phi double [ %add, %if.end ], [ 4.555000e+00, %entry ] 245 ret double %retval.0 246} 247 248define double @three_constants_f64(double %a, double %c) { 249; CHECK-LABEL: three_constants_f64: 250; CHECK: # %bb.0: # %entry 251; CHECK-NEXT: plfd f0, .LCPI13_0@PCREL(0), 1 252; CHECK-NEXT: xsadddp f0, f1, f0 253; CHECK-NEXT: plfd f1, .LCPI13_1@PCREL(0), 1 254; CHECK-NEXT: xsadddp f0, f0, f1 255; CHECK-NEXT: plfd f1, .LCPI13_2@PCREL(0), 1 256; CHECK-NEXT: xsadddp f1, f0, f1 257; CHECK-NEXT: blr 258; 259; CHECK-P9-LABEL: three_constants_f64: 260; CHECK-P9: # %bb.0: # %entry 261; CHECK-P9-NEXT: addis r3, r2, .LCPI13_0@toc@ha 262; CHECK-P9-NEXT: lfd f0, .LCPI13_0@toc@l(r3) 263; CHECK-P9-NEXT: addis r3, r2, .LCPI13_1@toc@ha 264; CHECK-P9-NEXT: xsadddp f0, f1, f0 265; CHECK-P9-NEXT: lfd f1, .LCPI13_1@toc@l(r3) 266; CHECK-P9-NEXT: addis r3, r2, .LCPI13_2@toc@ha 267; CHECK-P9-NEXT: xsadddp f0, f0, f1 268; CHECK-P9-NEXT: lfd f1, .LCPI13_2@toc@l(r3) 269; CHECK-P9-NEXT: xsadddp f1, f0, f1 270; CHECK-P9-NEXT: blr 271entry: 272 %0 = fadd double %a, 3.344000e+00 273 %1 = fadd double %0, 2.344000e+00 274 %2 = fadd double %1, 2.394000e+00 275 ret double %2 276} 277 278define float @three_constants_f32(float %a, float %c) { 279; CHECK-LABEL: three_constants_f32: 280; CHECK: # %bb.0: # %entry 281; CHECK-NEXT: xxspltidp vs0, 1083294351 282; CHECK-NEXT: xsaddsp f0, f1, f0 283; CHECK-NEXT: xxspltidp vs1, 1083296911 284; CHECK-NEXT: xsaddsp f0, f0, f1 285; CHECK-NEXT: xxspltidp vs1, 1083292559 286; CHECK-NEXT: xsaddsp f1, f0, f1 287; CHECK-NEXT: blr 288; 289; CHECK-P9-LABEL: three_constants_f32: 290; CHECK-P9: # %bb.0: # %entry 291; CHECK-P9-NEXT: addis r3, r2, .LCPI14_0@toc@ha 292; CHECK-P9-NEXT: lfs f0, .LCPI14_0@toc@l(r3) 293; CHECK-P9-NEXT: addis r3, r2, .LCPI14_1@toc@ha 294; CHECK-P9-NEXT: xsaddsp f0, f1, f0 295; CHECK-P9-NEXT: lfs f1, .LCPI14_1@toc@l(r3) 296; CHECK-P9-NEXT: addis r3, r2, .LCPI14_2@toc@ha 297; CHECK-P9-NEXT: xsaddsp f0, f0, f1 298; CHECK-P9-NEXT: lfs f1, .LCPI14_2@toc@l(r3) 299; CHECK-P9-NEXT: xsaddsp f1, f0, f1 300; CHECK-P9-NEXT: blr 301entry: 302 %0 = fadd float %a, 0x40123851E0000000 303 %1 = fadd float %0, 0x40123991E0000000 304 %2 = fadd float %1, 0x40123771E0000000 305 ret float %2 306} 307 308define fp128 @three_constants_f128(fp128 %a, fp128 %c) { 309; CHECK-LABEL: three_constants_f128: 310; CHECK: # %bb.0: # %entry 311; CHECK-NEXT: plxv vs35, .LCPI15_0@PCREL(0), 1 312; CHECK-NEXT: xsaddqp v2, v2, v3 313; CHECK-NEXT: plxv vs35, .LCPI15_1@PCREL(0), 1 314; CHECK-NEXT: xsaddqp v2, v2, v3 315; CHECK-NEXT: plxv vs35, .LCPI15_2@PCREL(0), 1 316; CHECK-NEXT: xsaddqp v2, v2, v3 317; CHECK-NEXT: blr 318; 319; CHECK-P9-LABEL: three_constants_f128: 320; CHECK-P9: # %bb.0: # %entry 321; CHECK-P9-NEXT: addis r3, r2, .LCPI15_0@toc@ha 322; CHECK-P9-NEXT: addi r3, r3, .LCPI15_0@toc@l 323; CHECK-P9-NEXT: lxvx vs35, 0, r3 324; CHECK-P9-NEXT: addis r3, r2, .LCPI15_1@toc@ha 325; CHECK-P9-NEXT: addi r3, r3, .LCPI15_1@toc@l 326; CHECK-P9-NEXT: xsaddqp v2, v2, v3 327; CHECK-P9-NEXT: lxvx vs35, 0, r3 328; CHECK-P9-NEXT: addis r3, r2, .LCPI15_2@toc@ha 329; CHECK-P9-NEXT: addi r3, r3, .LCPI15_2@toc@l 330; CHECK-P9-NEXT: xsaddqp v2, v2, v3 331; CHECK-P9-NEXT: lxvx vs35, 0, r3 332; CHECK-P9-NEXT: xsaddqp v2, v2, v3 333; CHECK-P9-NEXT: blr 334entry: 335 %0 = fadd fp128 %a, 0xL8000000000000000400123851EB851EB 336 %1 = fadd fp128 %0, 0xL8000000000000000400123851EB991EB 337 %2 = fadd fp128 %1, 0xL8000000000000000400123851EB771EB 338 ret fp128 %2 339} 340 341define ppc_fp128 @three_constants_ppcf128(ppc_fp128 %a, ppc_fp128 %c) { 342; CHECK-LABEL: three_constants_ppcf128: 343; CHECK: .localentry three_constants_ppcf128, 1 344; CHECK-NEXT: # %bb.0: # %entry 345; CHECK-NEXT: mflr r0 346; CHECK-NEXT: std r0, 16(r1) 347; CHECK-NEXT: stdu r1, -32(r1) 348; CHECK-NEXT: .cfi_def_cfa_offset 32 349; CHECK-NEXT: .cfi_offset lr, 16 350; CHECK-NEXT: plfd f3, .LCPI16_0@PCREL(0), 1 351; CHECK-NEXT: xxlxor f4, f4, f4 352; CHECK-NEXT: bl __gcc_qadd@notoc 353; CHECK-NEXT: plfd f3, .LCPI16_1@PCREL(0), 1 354; CHECK-NEXT: xxlxor f4, f4, f4 355; CHECK-NEXT: bl __gcc_qadd@notoc 356; CHECK-NEXT: plfd f3, .LCPI16_2@PCREL(0), 1 357; CHECK-NEXT: xxlxor f4, f4, f4 358; CHECK-NEXT: bl __gcc_qadd@notoc 359; CHECK-NEXT: addi r1, r1, 32 360; CHECK-NEXT: ld r0, 16(r1) 361; CHECK-NEXT: mtlr r0 362; CHECK-NEXT: blr 363; 364; CHECK-P9-LABEL: three_constants_ppcf128: 365; CHECK-P9: # %bb.0: # %entry 366; CHECK-P9-NEXT: mflr r0 367; CHECK-P9-NEXT: std r0, 16(r1) 368; CHECK-P9-NEXT: stdu r1, -32(r1) 369; CHECK-P9-NEXT: .cfi_def_cfa_offset 32 370; CHECK-P9-NEXT: .cfi_offset lr, 16 371; CHECK-P9-NEXT: addis r3, r2, .LCPI16_0@toc@ha 372; CHECK-P9-NEXT: xxlxor f4, f4, f4 373; CHECK-P9-NEXT: lfd f3, .LCPI16_0@toc@l(r3) 374; CHECK-P9-NEXT: bl __gcc_qadd 375; CHECK-P9-NEXT: nop 376; CHECK-P9-NEXT: addis r3, r2, .LCPI16_1@toc@ha 377; CHECK-P9-NEXT: xxlxor f4, f4, f4 378; CHECK-P9-NEXT: lfd f3, .LCPI16_1@toc@l(r3) 379; CHECK-P9-NEXT: bl __gcc_qadd 380; CHECK-P9-NEXT: nop 381; CHECK-P9-NEXT: addis r3, r2, .LCPI16_2@toc@ha 382; CHECK-P9-NEXT: xxlxor f4, f4, f4 383; CHECK-P9-NEXT: lfd f3, .LCPI16_2@toc@l(r3) 384; CHECK-P9-NEXT: bl __gcc_qadd 385; CHECK-P9-NEXT: nop 386; CHECK-P9-NEXT: addi r1, r1, 32 387; CHECK-P9-NEXT: ld r0, 16(r1) 388; CHECK-P9-NEXT: mtlr r0 389; CHECK-P9-NEXT: blr 390entry: 391 %0 = fadd ppc_fp128 %a, 0xM40123851EB851EB80000000000000000 392 %1 = fadd ppc_fp128 %0, 0xM4012385199851EB80000000000000000 393 %2 = fadd ppc_fp128 %1, 0xM4012385100851EB80000000000000000 394 ret ppc_fp128 %2 395} 396 397define <2 x double> @three_constants_vector(<2 x double> %a, <2 x double> %c) { 398; CHECK-LABEL: three_constants_vector: 399; CHECK: # %bb.0: # %entry 400; CHECK-NEXT: plxv vs0, .LCPI17_0@PCREL(0), 1 401; CHECK-NEXT: plxv vs2, .LCPI17_1@PCREL(0), 1 402; CHECK-NEXT: xvadddp vs1, vs34, vs0 403; CHECK-NEXT: xvadddp vs1, vs1, vs2 404; CHECK-NEXT: xvadddp vs34, vs1, vs0 405; CHECK-NEXT: blr 406; 407; CHECK-P9-LABEL: three_constants_vector: 408; CHECK-P9: # %bb.0: # %entry 409; CHECK-P9-NEXT: addis r3, r2, .LCPI17_0@toc@ha 410; CHECK-P9-NEXT: addi r3, r3, .LCPI17_0@toc@l 411; CHECK-P9-NEXT: lxvx vs0, 0, r3 412; CHECK-P9-NEXT: addis r3, r2, .LCPI17_1@toc@ha 413; CHECK-P9-NEXT: addi r3, r3, .LCPI17_1@toc@l 414; CHECK-P9-NEXT: lxvx vs2, 0, r3 415; CHECK-P9-NEXT: xvadddp vs1, vs34, vs0 416; CHECK-P9-NEXT: xvadddp vs1, vs1, vs2 417; CHECK-P9-NEXT: xvadddp vs34, vs1, vs0 418; CHECK-P9-NEXT: blr 419entry: 420 %0 = fadd <2 x double> %a, <double 4.555000e+00, double 9.880000e+00> 421 %1 = fadd <2 x double> %0, <double 4.555000e+00, double 9.980000e+00> 422 %2 = fadd <2 x double> %1, <double 4.555000e+00, double 9.880000e+00> 423 ret <2 x double> %2 424} 425