1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux \ 3; RUN: -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr | FileCheck \ 4; RUN: --check-prefix=P8 %s 5; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux \ 6; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr | FileCheck \ 7; RUN: --check-prefix=P9 %s 8 9; FIXME: Constrained fpext would fail if VSX feature disabled. Add no-vsx 10 11declare float @llvm.experimental.constrained.ceil.f32(float, metadata) 12declare double @llvm.experimental.constrained.ceil.f64(double, metadata) 13declare <4 x float> @llvm.experimental.constrained.ceil.v4f32(<4 x float>, metadata) 14declare <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double>, metadata) 15 16declare float @llvm.experimental.constrained.floor.f32(float, metadata) 17declare double @llvm.experimental.constrained.floor.f64(double, metadata) 18declare <4 x float> @llvm.experimental.constrained.floor.v4f32(<4 x float>, metadata) 19declare <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double>, metadata) 20 21declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata) 22declare <4 x float> @llvm.experimental.constrained.nearbyint.v4f32(<4 x float>, metadata, metadata) 23declare <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(<2 x double>, metadata, metadata) 24 25declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata) 26declare <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float>, metadata) 27 28declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata) 29declare <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(<4 x double>, metadata, metadata) 30declare <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double>, metadata, metadata) 31 32declare float @llvm.experimental.constrained.round.f32(float, metadata) 33declare double @llvm.experimental.constrained.round.f64(double, metadata) 34declare <4 x float> @llvm.experimental.constrained.round.v4f32(<4 x float>, metadata) 35declare <2 x double> @llvm.experimental.constrained.round.v2f64(<2 x double>, metadata) 36 37declare float @llvm.experimental.constrained.trunc.f32(float, metadata) 38declare double @llvm.experimental.constrained.trunc.f64(double, metadata) 39declare <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float>, metadata) 40declare <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double>, metadata) 41 42define float @ceil_f32(float %f1) { 43; P8-LABEL: ceil_f32: 44; P8: # %bb.0: 45; P8-NEXT: xsrdpip f1, f1 46; P8-NEXT: blr 47; 48; P9-LABEL: ceil_f32: 49; P9: # %bb.0: 50; P9-NEXT: xsrdpip f1, f1 51; P9-NEXT: blr 52 %res = call float @llvm.experimental.constrained.ceil.f32( 53 float %f1, 54 metadata !"fpexcept.strict") 55 ret float %res 56} 57 58define double @ceil_f64(double %f1) { 59; P8-LABEL: ceil_f64: 60; P8: # %bb.0: 61; P8-NEXT: xsrdpip f1, f1 62; P8-NEXT: blr 63; 64; P9-LABEL: ceil_f64: 65; P9: # %bb.0: 66; P9-NEXT: xsrdpip f1, f1 67; P9-NEXT: blr 68 %res = call double @llvm.experimental.constrained.ceil.f64( 69 double %f1, 70 metadata !"fpexcept.strict") 71 ret double %res 72} 73 74define <4 x float> @ceil_v4f32(<4 x float> %vf1) { 75; P8-LABEL: ceil_v4f32: 76; P8: # %bb.0: 77; P8-NEXT: xvrspip v2, v2 78; P8-NEXT: blr 79; 80; P9-LABEL: ceil_v4f32: 81; P9: # %bb.0: 82; P9-NEXT: xvrspip v2, v2 83; P9-NEXT: blr 84 %res = call <4 x float> @llvm.experimental.constrained.ceil.v4f32( 85 <4 x float> %vf1, 86 metadata !"fpexcept.strict") 87 ret <4 x float> %res 88} 89 90define <2 x double> @ceil_v2f64(<2 x double> %vf1) { 91; P8-LABEL: ceil_v2f64: 92; P8: # %bb.0: 93; P8-NEXT: xvrdpip v2, v2 94; P8-NEXT: blr 95; 96; P9-LABEL: ceil_v2f64: 97; P9: # %bb.0: 98; P9-NEXT: xvrdpip v2, v2 99; P9-NEXT: blr 100 %res = call <2 x double> @llvm.experimental.constrained.ceil.v2f64( 101 <2 x double> %vf1, 102 metadata !"fpexcept.strict") 103 ret <2 x double> %res 104} 105 106define float @floor_f32(float %f1) { 107; P8-LABEL: floor_f32: 108; P8: # %bb.0: 109; P8-NEXT: xsrdpim f1, f1 110; P8-NEXT: blr 111; 112; P9-LABEL: floor_f32: 113; P9: # %bb.0: 114; P9-NEXT: xsrdpim f1, f1 115; P9-NEXT: blr 116 %res = call float @llvm.experimental.constrained.floor.f32( 117 float %f1, 118 metadata !"fpexcept.strict") 119 ret float %res 120} 121 122define double @floor_f64(double %f1) { 123; P8-LABEL: floor_f64: 124; P8: # %bb.0: 125; P8-NEXT: xsrdpim f1, f1 126; P8-NEXT: blr 127; 128; P9-LABEL: floor_f64: 129; P9: # %bb.0: 130; P9-NEXT: xsrdpim f1, f1 131; P9-NEXT: blr 132 %res = call double @llvm.experimental.constrained.floor.f64( 133 double %f1, 134 metadata !"fpexcept.strict") 135 ret double %res; 136} 137 138define <4 x float> @floor_v4f32(<4 x float> %vf1) { 139; P8-LABEL: floor_v4f32: 140; P8: # %bb.0: 141; P8-NEXT: xvrspim v2, v2 142; P8-NEXT: blr 143; 144; P9-LABEL: floor_v4f32: 145; P9: # %bb.0: 146; P9-NEXT: xvrspim v2, v2 147; P9-NEXT: blr 148 %res = call <4 x float> @llvm.experimental.constrained.floor.v4f32( 149 <4 x float> %vf1, 150 metadata !"fpexcept.strict") 151 ret <4 x float> %res; 152} 153 154define <2 x double> @floor_v2f64(<2 x double> %vf1) { 155; P8-LABEL: floor_v2f64: 156; P8: # %bb.0: 157; P8-NEXT: xvrdpim v2, v2 158; P8-NEXT: blr 159; 160; P9-LABEL: floor_v2f64: 161; P9: # %bb.0: 162; P9-NEXT: xvrdpim v2, v2 163; P9-NEXT: blr 164 %res = call <2 x double> @llvm.experimental.constrained.floor.v2f64( 165 <2 x double> %vf1, 166 metadata !"fpexcept.strict") 167 ret <2 x double> %res; 168} 169 170define double @nearbyint_f64(double %f1, double %f2) { 171; P8-LABEL: nearbyint_f64: 172; P8: # %bb.0: 173; P8-NEXT: mflr r0 174; P8-NEXT: std r0, 16(r1) 175; P8-NEXT: stdu r1, -112(r1) 176; P8-NEXT: .cfi_def_cfa_offset 112 177; P8-NEXT: .cfi_offset lr, 16 178; P8-NEXT: bl nearbyint 179; P8-NEXT: nop 180; P8-NEXT: addi r1, r1, 112 181; P8-NEXT: ld r0, 16(r1) 182; P8-NEXT: mtlr r0 183; P8-NEXT: blr 184; 185; P9-LABEL: nearbyint_f64: 186; P9: # %bb.0: 187; P9-NEXT: mflr r0 188; P9-NEXT: std r0, 16(r1) 189; P9-NEXT: stdu r1, -32(r1) 190; P9-NEXT: .cfi_def_cfa_offset 32 191; P9-NEXT: .cfi_offset lr, 16 192; P9-NEXT: bl nearbyint 193; P9-NEXT: nop 194; P9-NEXT: addi r1, r1, 32 195; P9-NEXT: ld r0, 16(r1) 196; P9-NEXT: mtlr r0 197; P9-NEXT: blr 198 %res = call double @llvm.experimental.constrained.nearbyint.f64( 199 double %f1, 200 metadata !"round.dynamic", 201 metadata !"fpexcept.strict") 202 ret double %res 203} 204 205define <4 x float> @nearbyint_v4f32(<4 x float> %vf1, <4 x float> %vf2) { 206; P8-LABEL: nearbyint_v4f32: 207; P8: # %bb.0: 208; P8-NEXT: mflr r0 209; P8-NEXT: std r0, 16(r1) 210; P8-NEXT: stdu r1, -176(r1) 211; P8-NEXT: .cfi_def_cfa_offset 176 212; P8-NEXT: .cfi_offset lr, 16 213; P8-NEXT: .cfi_offset v29, -48 214; P8-NEXT: .cfi_offset v30, -32 215; P8-NEXT: .cfi_offset v31, -16 216; P8-NEXT: xxsldwi vs0, v2, v2, 3 217; P8-NEXT: li r3, 128 218; P8-NEXT: stxvd2x v29, r1, r3 # 16-byte Folded Spill 219; P8-NEXT: li r3, 144 220; P8-NEXT: stxvd2x v30, r1, r3 # 16-byte Folded Spill 221; P8-NEXT: li r3, 160 222; P8-NEXT: xscvspdpn f1, vs0 223; P8-NEXT: stxvd2x v31, r1, r3 # 16-byte Folded Spill 224; P8-NEXT: vmr v31, v2 225; P8-NEXT: bl nearbyintf 226; P8-NEXT: nop 227; P8-NEXT: xxsldwi vs0, v31, v31, 1 228; P8-NEXT: xxlor v30, f1, f1 229; P8-NEXT: xscvspdpn f1, vs0 230; P8-NEXT: bl nearbyintf 231; P8-NEXT: nop 232; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 233; P8-NEXT: xxmrghd vs0, vs1, v30 234; P8-NEXT: xscvspdpn f1, v31 235; P8-NEXT: xvcvdpsp v29, vs0 236; P8-NEXT: bl nearbyintf 237; P8-NEXT: nop 238; P8-NEXT: xxswapd vs0, v31 239; P8-NEXT: xxlor v30, f1, f1 240; P8-NEXT: xscvspdpn f1, vs0 241; P8-NEXT: bl nearbyintf 242; P8-NEXT: nop 243; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 244; P8-NEXT: xxmrghd vs0, v30, vs1 245; P8-NEXT: li r3, 160 246; P8-NEXT: lxvd2x v31, r1, r3 # 16-byte Folded Reload 247; P8-NEXT: li r3, 144 248; P8-NEXT: lxvd2x v30, r1, r3 # 16-byte Folded Reload 249; P8-NEXT: li r3, 128 250; P8-NEXT: xvcvdpsp v2, vs0 251; P8-NEXT: vmrgew v2, v2, v29 252; P8-NEXT: lxvd2x v29, r1, r3 # 16-byte Folded Reload 253; P8-NEXT: addi r1, r1, 176 254; P8-NEXT: ld r0, 16(r1) 255; P8-NEXT: mtlr r0 256; P8-NEXT: blr 257; 258; P9-LABEL: nearbyint_v4f32: 259; P9: # %bb.0: 260; P9-NEXT: mflr r0 261; P9-NEXT: std r0, 16(r1) 262; P9-NEXT: stdu r1, -80(r1) 263; P9-NEXT: .cfi_def_cfa_offset 80 264; P9-NEXT: .cfi_offset lr, 16 265; P9-NEXT: .cfi_offset v29, -48 266; P9-NEXT: .cfi_offset v30, -32 267; P9-NEXT: .cfi_offset v31, -16 268; P9-NEXT: xxsldwi vs0, v2, v2, 3 269; P9-NEXT: stxv v29, 32(r1) # 16-byte Folded Spill 270; P9-NEXT: xscvspdpn f1, vs0 271; P9-NEXT: stxv v30, 48(r1) # 16-byte Folded Spill 272; P9-NEXT: stxv v31, 64(r1) # 16-byte Folded Spill 273; P9-NEXT: vmr v31, v2 274; P9-NEXT: bl nearbyintf 275; P9-NEXT: nop 276; P9-NEXT: xxsldwi vs0, v31, v31, 1 277; P9-NEXT: xscpsgndp v30, f1, f1 278; P9-NEXT: xscvspdpn f1, vs0 279; P9-NEXT: bl nearbyintf 280; P9-NEXT: nop 281; P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 282; P9-NEXT: xxmrghd vs0, vs1, v30 283; P9-NEXT: xscvspdpn f1, v31 284; P9-NEXT: xvcvdpsp v29, vs0 285; P9-NEXT: bl nearbyintf 286; P9-NEXT: nop 287; P9-NEXT: xxswapd vs0, v31 288; P9-NEXT: xscpsgndp v30, f1, f1 289; P9-NEXT: xscvspdpn f1, vs0 290; P9-NEXT: bl nearbyintf 291; P9-NEXT: nop 292; P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 293; P9-NEXT: xxmrghd vs0, v30, vs1 294; P9-NEXT: lxv v31, 64(r1) # 16-byte Folded Reload 295; P9-NEXT: lxv v30, 48(r1) # 16-byte Folded Reload 296; P9-NEXT: xvcvdpsp v2, vs0 297; P9-NEXT: vmrgew v2, v2, v29 298; P9-NEXT: lxv v29, 32(r1) # 16-byte Folded Reload 299; P9-NEXT: addi r1, r1, 80 300; P9-NEXT: ld r0, 16(r1) 301; P9-NEXT: mtlr r0 302; P9-NEXT: blr 303 %res = call <4 x float> @llvm.experimental.constrained.nearbyint.v4f32( 304 <4 x float> %vf1, 305 metadata !"round.dynamic", 306 metadata !"fpexcept.strict") 307 ret <4 x float> %res 308} 309 310define <2 x double> @nearbyint_v2f64(<2 x double> %vf1, <2 x double> %vf2) { 311; P8-LABEL: nearbyint_v2f64: 312; P8: # %bb.0: 313; P8-NEXT: mflr r0 314; P8-NEXT: std r0, 16(r1) 315; P8-NEXT: stdu r1, -160(r1) 316; P8-NEXT: .cfi_def_cfa_offset 160 317; P8-NEXT: .cfi_offset lr, 16 318; P8-NEXT: .cfi_offset v30, -32 319; P8-NEXT: .cfi_offset v31, -16 320; P8-NEXT: li r3, 128 321; P8-NEXT: stxvd2x v30, r1, r3 # 16-byte Folded Spill 322; P8-NEXT: li r3, 144 323; P8-NEXT: stxvd2x v31, r1, r3 # 16-byte Folded Spill 324; P8-NEXT: vmr v31, v2 325; P8-NEXT: xxlor f1, v31, v31 326; P8-NEXT: bl nearbyint 327; P8-NEXT: nop 328; P8-NEXT: xxlor v30, f1, f1 329; P8-NEXT: xxswapd vs1, v31 330; P8-NEXT: # kill: def $f1 killed $f1 killed $vsl1 331; P8-NEXT: bl nearbyint 332; P8-NEXT: nop 333; P8-NEXT: li r3, 144 334; P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 335; P8-NEXT: xxmrghd v2, v30, vs1 336; P8-NEXT: lxvd2x v31, r1, r3 # 16-byte Folded Reload 337; P8-NEXT: li r3, 128 338; P8-NEXT: lxvd2x v30, r1, r3 # 16-byte Folded Reload 339; P8-NEXT: addi r1, r1, 160 340; P8-NEXT: ld r0, 16(r1) 341; P8-NEXT: mtlr r0 342; P8-NEXT: blr 343; 344; P9-LABEL: nearbyint_v2f64: 345; P9: # %bb.0: 346; P9-NEXT: mflr r0 347; P9-NEXT: std r0, 16(r1) 348; P9-NEXT: stdu r1, -64(r1) 349; P9-NEXT: .cfi_def_cfa_offset 64 350; P9-NEXT: .cfi_offset lr, 16 351; P9-NEXT: .cfi_offset v30, -32 352; P9-NEXT: .cfi_offset v31, -16 353; P9-NEXT: stxv v31, 48(r1) # 16-byte Folded Spill 354; P9-NEXT: vmr v31, v2 355; P9-NEXT: xscpsgndp f1, v31, v31 356; P9-NEXT: stxv v30, 32(r1) # 16-byte Folded Spill 357; P9-NEXT: bl nearbyint 358; P9-NEXT: nop 359; P9-NEXT: xscpsgndp v30, f1, f1 360; P9-NEXT: xxswapd vs1, v31 361; P9-NEXT: # kill: def $f1 killed $f1 killed $vsl1 362; P9-NEXT: bl nearbyint 363; P9-NEXT: nop 364; P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 365; P9-NEXT: xxmrghd v2, v30, vs1 366; P9-NEXT: lxv v31, 48(r1) # 16-byte Folded Reload 367; P9-NEXT: lxv v30, 32(r1) # 16-byte Folded Reload 368; P9-NEXT: addi r1, r1, 64 369; P9-NEXT: ld r0, 16(r1) 370; P9-NEXT: mtlr r0 371; P9-NEXT: blr 372 %res = call <2 x double> @llvm.experimental.constrained.nearbyint.v2f64( 373 <2 x double> %vf1, 374 metadata !"round.dynamic", 375 metadata !"fpexcept.strict") 376 ret <2 x double> %res 377} 378 379define <4 x double> @fpext_v4f64_v4f32(<4 x float> %vf1) { 380; P8-LABEL: fpext_v4f64_v4f32: 381; P8: # %bb.0: 382; P8-NEXT: xxsldwi vs0, v2, v2, 1 383; P8-NEXT: xxsldwi vs1, v2, v2, 3 384; P8-NEXT: xxswapd vs3, v2 385; P8-NEXT: xscvspdpn f2, v2 386; P8-NEXT: xscvspdpn f0, vs0 387; P8-NEXT: xscvspdpn f1, vs1 388; P8-NEXT: xscvspdpn f3, vs3 389; P8-NEXT: xxmrghd v2, vs2, vs0 390; P8-NEXT: xxmrghd v3, vs3, vs1 391; P8-NEXT: blr 392; 393; P9-LABEL: fpext_v4f64_v4f32: 394; P9: # %bb.0: 395; P9-NEXT: xxsldwi vs0, v2, v2, 3 396; P9-NEXT: xxswapd vs1, v2 397; P9-NEXT: xscvspdpn f0, vs0 398; P9-NEXT: xscvspdpn f1, vs1 399; P9-NEXT: xxsldwi vs2, v2, v2, 1 400; P9-NEXT: xscvspdpn f2, vs2 401; P9-NEXT: xxmrghd vs0, vs1, vs0 402; P9-NEXT: xscvspdpn f1, v2 403; P9-NEXT: xxmrghd v3, vs1, vs2 404; P9-NEXT: xxlor v2, vs0, vs0 405; P9-NEXT: blr 406 %res = call <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32( 407 <4 x float> %vf1, 408 metadata !"fpexcept.strict") 409 ret <4 x double> %res 410} 411 412define <2 x double> @fpext_v2f64_v2f32(<2 x float> %vf1) { 413; P8-LABEL: fpext_v2f64_v2f32: 414; P8: # %bb.0: 415; P8-NEXT: xxsldwi vs0, v2, v2, 1 416; P8-NEXT: xscvspdpn f1, v2 417; P8-NEXT: xscvspdpn f0, vs0 418; P8-NEXT: xxmrghd v2, vs1, vs0 419; P8-NEXT: blr 420; 421; P9-LABEL: fpext_v2f64_v2f32: 422; P9: # %bb.0: 423; P9-NEXT: xxsldwi vs0, v2, v2, 3 424; P9-NEXT: xxswapd vs1, v2 425; P9-NEXT: xscvspdpn f0, vs0 426; P9-NEXT: xscvspdpn f1, vs1 427; P9-NEXT: xxmrghd v2, vs1, vs0 428; P9-NEXT: blr 429 %res = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32( 430 <2 x float> %vf1, 431 metadata !"fpexcept.strict") 432 ret <2 x double> %res 433} 434 435define float @fptrunc_f32_f64(double %f1) { 436; P8-LABEL: fptrunc_f32_f64: 437; P8: # %bb.0: 438; P8-NEXT: xsrsp f1, f1 439; P8-NEXT: blr 440; 441; P9-LABEL: fptrunc_f32_f64: 442; P9: # %bb.0: 443; P9-NEXT: xsrsp f1, f1 444; P9-NEXT: blr 445 %res = call float @llvm.experimental.constrained.fptrunc.f32.f64( 446 double %f1, 447 metadata !"round.dynamic", 448 metadata !"fpexcept.strict") 449 ret float %res; 450} 451 452define <4 x float> @fptrunc_v4f32_v4f64(<4 x double> %vf1) { 453; P8-LABEL: fptrunc_v4f32_v4f64: 454; P8: # %bb.0: 455; P8-NEXT: xxmrgld vs0, v2, v3 456; P8-NEXT: xxmrghd vs1, v2, v3 457; P8-NEXT: xvcvdpsp v2, vs0 458; P8-NEXT: xvcvdpsp v3, vs1 459; P8-NEXT: vmrgew v2, v3, v2 460; P8-NEXT: blr 461; 462; P9-LABEL: fptrunc_v4f32_v4f64: 463; P9: # %bb.0: 464; P9-NEXT: xxmrgld vs0, v3, v2 465; P9-NEXT: xvcvdpsp v4, vs0 466; P9-NEXT: xxmrghd vs0, v3, v2 467; P9-NEXT: xvcvdpsp v2, vs0 468; P9-NEXT: vmrgew v2, v2, v4 469; P9-NEXT: blr 470 %res = call <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64( 471 <4 x double> %vf1, 472 metadata !"round.dynamic", 473 metadata !"fpexcept.strict") 474 ret <4 x float> %res 475} 476 477define <2 x float> @fptrunc_v2f32_v2f64(<2 x double> %vf1) { 478; P8-LABEL: fptrunc_v2f32_v2f64: 479; P8: # %bb.0: 480; P8-NEXT: xxswapd vs0, v2 481; P8-NEXT: xsrsp f1, v2 482; P8-NEXT: xsrsp f0, f0 483; P8-NEXT: xscvdpspn v2, f1 484; P8-NEXT: xscvdpspn v3, f0 485; P8-NEXT: vmrgow v2, v2, v3 486; P8-NEXT: blr 487; 488; P9-LABEL: fptrunc_v2f32_v2f64: 489; P9: # %bb.0: 490; P9-NEXT: xxswapd vs1, v2 491; P9-NEXT: xsrsp f0, v2 492; P9-NEXT: xsrsp f1, f1 493; P9-NEXT: xscvdpspn vs0, f0 494; P9-NEXT: xscvdpspn vs1, f1 495; P9-NEXT: xxmrghw v2, vs0, vs1 496; P9-NEXT: blr 497 %res = call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64( 498 <2 x double> %vf1, 499 metadata !"round.dynamic", 500 metadata !"fpexcept.strict") 501 ret <2 x float> %res 502} 503 504define float @round_f32(float %f1) { 505; P8-LABEL: round_f32: 506; P8: # %bb.0: 507; P8-NEXT: xsrdpi f1, f1 508; P8-NEXT: blr 509; 510; P9-LABEL: round_f32: 511; P9: # %bb.0: 512; P9-NEXT: xsrdpi f1, f1 513; P9-NEXT: blr 514 %res = call float @llvm.experimental.constrained.round.f32( 515 float %f1, 516 metadata !"fpexcept.strict") 517 ret float %res 518} 519 520define double @round_f64(double %f1) { 521; P8-LABEL: round_f64: 522; P8: # %bb.0: 523; P8-NEXT: xsrdpi f1, f1 524; P8-NEXT: blr 525; 526; P9-LABEL: round_f64: 527; P9: # %bb.0: 528; P9-NEXT: xsrdpi f1, f1 529; P9-NEXT: blr 530 %res = call double @llvm.experimental.constrained.round.f64( 531 double %f1, 532 metadata !"fpexcept.strict") 533 ret double %res 534} 535 536define <4 x float> @round_v4f32(<4 x float> %vf1) { 537; P8-LABEL: round_v4f32: 538; P8: # %bb.0: 539; P8-NEXT: xvrspi v2, v2 540; P8-NEXT: blr 541; 542; P9-LABEL: round_v4f32: 543; P9: # %bb.0: 544; P9-NEXT: xvrspi v2, v2 545; P9-NEXT: blr 546 %res = call <4 x float> @llvm.experimental.constrained.round.v4f32( 547 <4 x float> %vf1, 548 metadata !"fpexcept.strict") 549 ret <4 x float> %res 550} 551 552define <2 x double> @round_v2f64(<2 x double> %vf1) { 553; P8-LABEL: round_v2f64: 554; P8: # %bb.0: 555; P8-NEXT: xvrdpi v2, v2 556; P8-NEXT: blr 557; 558; P9-LABEL: round_v2f64: 559; P9: # %bb.0: 560; P9-NEXT: xvrdpi v2, v2 561; P9-NEXT: blr 562 %res = call <2 x double> @llvm.experimental.constrained.round.v2f64( 563 <2 x double> %vf1, 564 metadata !"fpexcept.strict") 565 ret <2 x double> %res 566} 567 568define float @trunc_f32(float %f1) { 569; P8-LABEL: trunc_f32: 570; P8: # %bb.0: 571; P8-NEXT: xsrdpiz f1, f1 572; P8-NEXT: blr 573; 574; P9-LABEL: trunc_f32: 575; P9: # %bb.0: 576; P9-NEXT: xsrdpiz f1, f1 577; P9-NEXT: blr 578 %res = call float @llvm.experimental.constrained.trunc.f32( 579 float %f1, 580 metadata !"fpexcept.strict") 581 ret float %res 582} 583 584define double @trunc_f64(double %f1) { 585; P8-LABEL: trunc_f64: 586; P8: # %bb.0: 587; P8-NEXT: xsrdpiz f1, f1 588; P8-NEXT: blr 589; 590; P9-LABEL: trunc_f64: 591; P9: # %bb.0: 592; P9-NEXT: xsrdpiz f1, f1 593; P9-NEXT: blr 594 %res = call double @llvm.experimental.constrained.trunc.f64( 595 double %f1, 596 metadata !"fpexcept.strict") 597 ret double %res 598} 599 600define <4 x float> @trunc_v4f32(<4 x float> %vf1) { 601; P8-LABEL: trunc_v4f32: 602; P8: # %bb.0: 603; P8-NEXT: xvrspiz v2, v2 604; P8-NEXT: blr 605; 606; P9-LABEL: trunc_v4f32: 607; P9: # %bb.0: 608; P9-NEXT: xvrspiz v2, v2 609; P9-NEXT: blr 610 %res = call <4 x float> @llvm.experimental.constrained.trunc.v4f32( 611 <4 x float> %vf1, 612 metadata !"fpexcept.strict") 613 ret <4 x float> %res 614} 615 616define <2 x double> @trunc_v2f64(<2 x double> %vf1) { 617; P8-LABEL: trunc_v2f64: 618; P8: # %bb.0: 619; P8-NEXT: xvrdpiz v2, v2 620; P8-NEXT: blr 621; 622; P9-LABEL: trunc_v2f64: 623; P9: # %bb.0: 624; P9-NEXT: xvrdpiz v2, v2 625; P9-NEXT: blr 626 %res = call <2 x double> @llvm.experimental.constrained.trunc.v2f64( 627 <2 x double> %vf1, 628 metadata !"fpexcept.strict") 629 ret <2 x double> %res 630} 631