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: vmrghw v2, v2, v3 486; P8-NEXT: blr 487; 488; P9-LABEL: fptrunc_v2f32_v2f64: 489; P9: # %bb.0: 490; P9-NEXT: xsrsp f0, v2 491; P9-NEXT: xscvdpspn vs0, f0 492; P9-NEXT: xxsldwi v3, vs0, vs0, 3 493; P9-NEXT: xxswapd vs0, v2 494; P9-NEXT: xsrsp f0, f0 495; P9-NEXT: xscvdpspn vs0, f0 496; P9-NEXT: xxsldwi v2, vs0, vs0, 3 497; P9-NEXT: vmrghw v2, v3, v2 498; P9-NEXT: blr 499 %res = call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64( 500 <2 x double> %vf1, 501 metadata !"round.dynamic", 502 metadata !"fpexcept.strict") 503 ret <2 x float> %res 504} 505 506define float @round_f32(float %f1) { 507; P8-LABEL: round_f32: 508; P8: # %bb.0: 509; P8-NEXT: xsrdpi f1, f1 510; P8-NEXT: blr 511; 512; P9-LABEL: round_f32: 513; P9: # %bb.0: 514; P9-NEXT: xsrdpi f1, f1 515; P9-NEXT: blr 516 %res = call float @llvm.experimental.constrained.round.f32( 517 float %f1, 518 metadata !"fpexcept.strict") 519 ret float %res 520} 521 522define double @round_f64(double %f1) { 523; P8-LABEL: round_f64: 524; P8: # %bb.0: 525; P8-NEXT: xsrdpi f1, f1 526; P8-NEXT: blr 527; 528; P9-LABEL: round_f64: 529; P9: # %bb.0: 530; P9-NEXT: xsrdpi f1, f1 531; P9-NEXT: blr 532 %res = call double @llvm.experimental.constrained.round.f64( 533 double %f1, 534 metadata !"fpexcept.strict") 535 ret double %res 536} 537 538define <4 x float> @round_v4f32(<4 x float> %vf1) { 539; P8-LABEL: round_v4f32: 540; P8: # %bb.0: 541; P8-NEXT: xvrspi v2, v2 542; P8-NEXT: blr 543; 544; P9-LABEL: round_v4f32: 545; P9: # %bb.0: 546; P9-NEXT: xvrspi v2, v2 547; P9-NEXT: blr 548 %res = call <4 x float> @llvm.experimental.constrained.round.v4f32( 549 <4 x float> %vf1, 550 metadata !"fpexcept.strict") 551 ret <4 x float> %res 552} 553 554define <2 x double> @round_v2f64(<2 x double> %vf1) { 555; P8-LABEL: round_v2f64: 556; P8: # %bb.0: 557; P8-NEXT: xvrdpi v2, v2 558; P8-NEXT: blr 559; 560; P9-LABEL: round_v2f64: 561; P9: # %bb.0: 562; P9-NEXT: xvrdpi v2, v2 563; P9-NEXT: blr 564 %res = call <2 x double> @llvm.experimental.constrained.round.v2f64( 565 <2 x double> %vf1, 566 metadata !"fpexcept.strict") 567 ret <2 x double> %res 568} 569 570define float @trunc_f32(float %f1) { 571; P8-LABEL: trunc_f32: 572; P8: # %bb.0: 573; P8-NEXT: xsrdpiz f1, f1 574; P8-NEXT: blr 575; 576; P9-LABEL: trunc_f32: 577; P9: # %bb.0: 578; P9-NEXT: xsrdpiz f1, f1 579; P9-NEXT: blr 580 %res = call float @llvm.experimental.constrained.trunc.f32( 581 float %f1, 582 metadata !"fpexcept.strict") 583 ret float %res 584} 585 586define double @trunc_f64(double %f1) { 587; P8-LABEL: trunc_f64: 588; P8: # %bb.0: 589; P8-NEXT: xsrdpiz f1, f1 590; P8-NEXT: blr 591; 592; P9-LABEL: trunc_f64: 593; P9: # %bb.0: 594; P9-NEXT: xsrdpiz f1, f1 595; P9-NEXT: blr 596 %res = call double @llvm.experimental.constrained.trunc.f64( 597 double %f1, 598 metadata !"fpexcept.strict") 599 ret double %res 600} 601 602define <4 x float> @trunc_v4f32(<4 x float> %vf1) { 603; P8-LABEL: trunc_v4f32: 604; P8: # %bb.0: 605; P8-NEXT: xvrspiz v2, v2 606; P8-NEXT: blr 607; 608; P9-LABEL: trunc_v4f32: 609; P9: # %bb.0: 610; P9-NEXT: xvrspiz v2, v2 611; P9-NEXT: blr 612 %res = call <4 x float> @llvm.experimental.constrained.trunc.v4f32( 613 <4 x float> %vf1, 614 metadata !"fpexcept.strict") 615 ret <4 x float> %res 616} 617 618define <2 x double> @trunc_v2f64(<2 x double> %vf1) { 619; P8-LABEL: trunc_v2f64: 620; P8: # %bb.0: 621; P8-NEXT: xvrdpiz v2, v2 622; P8-NEXT: blr 623; 624; P9-LABEL: trunc_v2f64: 625; P9: # %bb.0: 626; P9-NEXT: xvrdpiz v2, v2 627; P9-NEXT: blr 628 %res = call <2 x double> @llvm.experimental.constrained.trunc.v2f64( 629 <2 x double> %vf1, 630 metadata !"fpexcept.strict") 631 ret <2 x double> %res 632} 633