1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s 6 7define <1 x half> @trunc_v1f16(<1 x half> %x) strictfp { 8; CHECK-LABEL: trunc_v1f16: 9; CHECK: # %bb.0: 10; CHECK-NEXT: vsetivli zero, 1, e16, mf4, ta, mu 11; CHECK-NEXT: vmfne.vv v0, v8, v8 12; CHECK-NEXT: lui a0, %hi(.LCPI0_0) 13; CHECK-NEXT: flh fa5, %lo(.LCPI0_0)(a0) 14; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 15; CHECK-NEXT: vfabs.v v9, v8 16; CHECK-NEXT: vmflt.vf v0, v9, fa5 17; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 18; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t 19; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t 20; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 21; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t 22; CHECK-NEXT: ret 23 %a = call <1 x half> @llvm.experimental.constrained.trunc.v1f16(<1 x half> %x, metadata !"fpexcept.strict") 24 ret <1 x half> %a 25} 26declare <1 x half> @llvm.experimental.constrained.trunc.v1f16(<1 x half>, metadata) 27 28define <2 x half> @trunc_v2f16(<2 x half> %x) strictfp { 29; CHECK-LABEL: trunc_v2f16: 30; CHECK: # %bb.0: 31; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, mu 32; CHECK-NEXT: vmfne.vv v0, v8, v8 33; CHECK-NEXT: lui a0, %hi(.LCPI1_0) 34; CHECK-NEXT: flh fa5, %lo(.LCPI1_0)(a0) 35; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 36; CHECK-NEXT: vfabs.v v9, v8 37; CHECK-NEXT: vmflt.vf v0, v9, fa5 38; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 39; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t 40; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t 41; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 42; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t 43; CHECK-NEXT: ret 44 %a = call <2 x half> @llvm.experimental.constrained.trunc.v2f16(<2 x half> %x, metadata !"fpexcept.strict") 45 ret <2 x half> %a 46} 47declare <2 x half> @llvm.experimental.constrained.trunc.v2f16(<2 x half>, metadata) 48 49define <4 x half> @trunc_v4f16(<4 x half> %x) strictfp { 50; CHECK-LABEL: trunc_v4f16: 51; CHECK: # %bb.0: 52; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, mu 53; CHECK-NEXT: vmfne.vv v0, v8, v8 54; CHECK-NEXT: lui a0, %hi(.LCPI2_0) 55; CHECK-NEXT: flh fa5, %lo(.LCPI2_0)(a0) 56; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 57; CHECK-NEXT: vfabs.v v9, v8 58; CHECK-NEXT: vmflt.vf v0, v9, fa5 59; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 60; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t 61; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t 62; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 63; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t 64; CHECK-NEXT: ret 65 %a = call <4 x half> @llvm.experimental.constrained.trunc.v4f16(<4 x half> %x, metadata !"fpexcept.strict") 66 ret <4 x half> %a 67} 68declare <4 x half> @llvm.experimental.constrained.trunc.v4f16(<4 x half>, metadata) 69 70define <8 x half> @trunc_v8f16(<8 x half> %x) strictfp { 71; CHECK-LABEL: trunc_v8f16: 72; CHECK: # %bb.0: 73; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, mu 74; CHECK-NEXT: vmfne.vv v0, v8, v8 75; CHECK-NEXT: lui a0, %hi(.LCPI3_0) 76; CHECK-NEXT: flh fa5, %lo(.LCPI3_0)(a0) 77; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 78; CHECK-NEXT: vfabs.v v9, v8 79; CHECK-NEXT: vmflt.vf v0, v9, fa5 80; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 81; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t 82; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t 83; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, mu 84; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t 85; CHECK-NEXT: ret 86 %a = call <8 x half> @llvm.experimental.constrained.trunc.v8f16(<8 x half> %x, metadata !"fpexcept.strict") 87 ret <8 x half> %a 88} 89declare <8 x half> @llvm.experimental.constrained.trunc.v8f16(<8 x half>, metadata) 90 91define <16 x half> @trunc_v16f16(<16 x half> %x) strictfp { 92; CHECK-LABEL: trunc_v16f16: 93; CHECK: # %bb.0: 94; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, mu 95; CHECK-NEXT: vmfne.vv v0, v8, v8 96; CHECK-NEXT: lui a0, %hi(.LCPI4_0) 97; CHECK-NEXT: flh fa5, %lo(.LCPI4_0)(a0) 98; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 99; CHECK-NEXT: vfabs.v v10, v8 100; CHECK-NEXT: vmflt.vf v0, v10, fa5 101; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 102; CHECK-NEXT: vfcvt.rtz.x.f.v v10, v8, v0.t 103; CHECK-NEXT: vfcvt.f.x.v v10, v10, v0.t 104; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, mu 105; CHECK-NEXT: vfsgnj.vv v8, v10, v8, v0.t 106; CHECK-NEXT: ret 107 %a = call <16 x half> @llvm.experimental.constrained.trunc.v16f16(<16 x half> %x, metadata !"fpexcept.strict") 108 ret <16 x half> %a 109} 110declare <16 x half> @llvm.experimental.constrained.trunc.v16f16(<16 x half>, metadata) 111 112define <32 x half> @trunc_v32f16(<32 x half> %x) strictfp { 113; CHECK-LABEL: trunc_v32f16: 114; CHECK: # %bb.0: 115; CHECK-NEXT: li a0, 32 116; CHECK-NEXT: lui a1, %hi(.LCPI5_0) 117; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, mu 118; CHECK-NEXT: vmfne.vv v0, v8, v8 119; CHECK-NEXT: flh fa5, %lo(.LCPI5_0)(a1) 120; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 121; CHECK-NEXT: vfabs.v v12, v8 122; CHECK-NEXT: vmflt.vf v0, v12, fa5 123; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 124; CHECK-NEXT: vfcvt.rtz.x.f.v v12, v8, v0.t 125; CHECK-NEXT: vfcvt.f.x.v v12, v12, v0.t 126; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, mu 127; CHECK-NEXT: vfsgnj.vv v8, v12, v8, v0.t 128; CHECK-NEXT: ret 129 %a = call <32 x half> @llvm.experimental.constrained.trunc.v32f16(<32 x half> %x, metadata !"fpexcept.strict") 130 ret <32 x half> %a 131} 132declare <32 x half> @llvm.experimental.constrained.trunc.v32f16(<32 x half>, metadata) 133 134define <1 x float> @trunc_v1f32(<1 x float> %x) strictfp { 135; CHECK-LABEL: trunc_v1f32: 136; CHECK: # %bb.0: 137; CHECK-NEXT: vsetivli zero, 1, e32, mf2, ta, mu 138; CHECK-NEXT: vmfne.vv v0, v8, v8 139; CHECK-NEXT: lui a0, 307200 140; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 141; CHECK-NEXT: fmv.w.x fa5, a0 142; CHECK-NEXT: vfabs.v v9, v8 143; CHECK-NEXT: vmflt.vf v0, v9, fa5 144; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 145; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t 146; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t 147; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 148; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t 149; CHECK-NEXT: ret 150 %a = call <1 x float> @llvm.experimental.constrained.trunc.v1f32(<1 x float> %x, metadata !"fpexcept.strict") 151 ret <1 x float> %a 152} 153declare <1 x float> @llvm.experimental.constrained.trunc.v1f32(<1 x float>, metadata) 154 155define <2 x float> @trunc_v2f32(<2 x float> %x) strictfp { 156; CHECK-LABEL: trunc_v2f32: 157; CHECK: # %bb.0: 158; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, mu 159; CHECK-NEXT: vmfne.vv v0, v8, v8 160; CHECK-NEXT: lui a0, 307200 161; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 162; CHECK-NEXT: fmv.w.x fa5, a0 163; CHECK-NEXT: vfabs.v v9, v8 164; CHECK-NEXT: vmflt.vf v0, v9, fa5 165; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 166; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t 167; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t 168; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 169; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t 170; CHECK-NEXT: ret 171 %a = call <2 x float> @llvm.experimental.constrained.trunc.v2f32(<2 x float> %x, metadata !"fpexcept.strict") 172 ret <2 x float> %a 173} 174declare <2 x float> @llvm.experimental.constrained.trunc.v2f32(<2 x float>, metadata) 175 176define <4 x float> @trunc_v4f32(<4 x float> %x) strictfp { 177; CHECK-LABEL: trunc_v4f32: 178; CHECK: # %bb.0: 179; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, mu 180; CHECK-NEXT: vmfne.vv v0, v8, v8 181; CHECK-NEXT: lui a0, 307200 182; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 183; CHECK-NEXT: fmv.w.x fa5, a0 184; CHECK-NEXT: vfabs.v v9, v8 185; CHECK-NEXT: vmflt.vf v0, v9, fa5 186; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 187; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t 188; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t 189; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, mu 190; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t 191; CHECK-NEXT: ret 192 %a = call <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float> %x, metadata !"fpexcept.strict") 193 ret <4 x float> %a 194} 195declare <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float>, metadata) 196 197define <8 x float> @trunc_v8f32(<8 x float> %x) strictfp { 198; CHECK-LABEL: trunc_v8f32: 199; CHECK: # %bb.0: 200; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, mu 201; CHECK-NEXT: vmfne.vv v0, v8, v8 202; CHECK-NEXT: lui a0, 307200 203; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 204; CHECK-NEXT: fmv.w.x fa5, a0 205; CHECK-NEXT: vfabs.v v10, v8 206; CHECK-NEXT: vmflt.vf v0, v10, fa5 207; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 208; CHECK-NEXT: vfcvt.rtz.x.f.v v10, v8, v0.t 209; CHECK-NEXT: vfcvt.f.x.v v10, v10, v0.t 210; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, mu 211; CHECK-NEXT: vfsgnj.vv v8, v10, v8, v0.t 212; CHECK-NEXT: ret 213 %a = call <8 x float> @llvm.experimental.constrained.trunc.v8f32(<8 x float> %x, metadata !"fpexcept.strict") 214 ret <8 x float> %a 215} 216declare <8 x float> @llvm.experimental.constrained.trunc.v8f32(<8 x float>, metadata) 217 218define <16 x float> @trunc_v16f32(<16 x float> %x) strictfp { 219; CHECK-LABEL: trunc_v16f32: 220; CHECK: # %bb.0: 221; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, mu 222; CHECK-NEXT: vmfne.vv v0, v8, v8 223; CHECK-NEXT: lui a0, 307200 224; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 225; CHECK-NEXT: fmv.w.x fa5, a0 226; CHECK-NEXT: vfabs.v v12, v8 227; CHECK-NEXT: vmflt.vf v0, v12, fa5 228; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma 229; CHECK-NEXT: vfcvt.rtz.x.f.v v12, v8, v0.t 230; CHECK-NEXT: vfcvt.f.x.v v12, v12, v0.t 231; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, mu 232; CHECK-NEXT: vfsgnj.vv v8, v12, v8, v0.t 233; CHECK-NEXT: ret 234 %a = call <16 x float> @llvm.experimental.constrained.trunc.v16f32(<16 x float> %x, metadata !"fpexcept.strict") 235 ret <16 x float> %a 236} 237declare <16 x float> @llvm.experimental.constrained.trunc.v16f32(<16 x float>, metadata) 238 239define <1 x double> @trunc_v1f64(<1 x double> %x) strictfp { 240; CHECK-LABEL: trunc_v1f64: 241; CHECK: # %bb.0: 242; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, mu 243; CHECK-NEXT: vmfne.vv v0, v8, v8 244; CHECK-NEXT: lui a0, %hi(.LCPI11_0) 245; CHECK-NEXT: fld fa5, %lo(.LCPI11_0)(a0) 246; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 247; CHECK-NEXT: vfabs.v v9, v8 248; CHECK-NEXT: vmflt.vf v0, v9, fa5 249; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma 250; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t 251; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t 252; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 253; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t 254; CHECK-NEXT: ret 255 %a = call <1 x double> @llvm.experimental.constrained.trunc.v1f64(<1 x double> %x, metadata !"fpexcept.strict") 256 ret <1 x double> %a 257} 258declare <1 x double> @llvm.experimental.constrained.trunc.v1f64(<1 x double>, metadata) 259 260define <2 x double> @trunc_v2f64(<2 x double> %x) strictfp { 261; CHECK-LABEL: trunc_v2f64: 262; CHECK: # %bb.0: 263; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, mu 264; CHECK-NEXT: vmfne.vv v0, v8, v8 265; CHECK-NEXT: lui a0, %hi(.LCPI12_0) 266; CHECK-NEXT: fld fa5, %lo(.LCPI12_0)(a0) 267; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 268; CHECK-NEXT: vfabs.v v9, v8 269; CHECK-NEXT: vmflt.vf v0, v9, fa5 270; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma 271; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8, v0.t 272; CHECK-NEXT: vfcvt.f.x.v v9, v9, v0.t 273; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, mu 274; CHECK-NEXT: vfsgnj.vv v8, v9, v8, v0.t 275; CHECK-NEXT: ret 276 %a = call <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double> %x, metadata !"fpexcept.strict") 277 ret <2 x double> %a 278} 279declare <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double>, metadata) 280 281define <4 x double> @trunc_v4f64(<4 x double> %x) strictfp { 282; CHECK-LABEL: trunc_v4f64: 283; CHECK: # %bb.0: 284; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, mu 285; CHECK-NEXT: vmfne.vv v0, v8, v8 286; CHECK-NEXT: lui a0, %hi(.LCPI13_0) 287; CHECK-NEXT: fld fa5, %lo(.LCPI13_0)(a0) 288; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 289; CHECK-NEXT: vfabs.v v10, v8 290; CHECK-NEXT: vmflt.vf v0, v10, fa5 291; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 292; CHECK-NEXT: vfcvt.rtz.x.f.v v10, v8, v0.t 293; CHECK-NEXT: vfcvt.f.x.v v10, v10, v0.t 294; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, mu 295; CHECK-NEXT: vfsgnj.vv v8, v10, v8, v0.t 296; CHECK-NEXT: ret 297 %a = call <4 x double> @llvm.experimental.constrained.trunc.v4f64(<4 x double> %x, metadata !"fpexcept.strict") 298 ret <4 x double> %a 299} 300declare <4 x double> @llvm.experimental.constrained.trunc.v4f64(<4 x double>, metadata) 301 302define <8 x double> @trunc_v8f64(<8 x double> %x) strictfp { 303; CHECK-LABEL: trunc_v8f64: 304; CHECK: # %bb.0: 305; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, mu 306; CHECK-NEXT: vmfne.vv v0, v8, v8 307; CHECK-NEXT: lui a0, %hi(.LCPI14_0) 308; CHECK-NEXT: fld fa5, %lo(.LCPI14_0)(a0) 309; CHECK-NEXT: vfadd.vv v8, v8, v8, v0.t 310; CHECK-NEXT: vfabs.v v12, v8 311; CHECK-NEXT: vmflt.vf v0, v12, fa5 312; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma 313; CHECK-NEXT: vfcvt.rtz.x.f.v v12, v8, v0.t 314; CHECK-NEXT: vfcvt.f.x.v v12, v12, v0.t 315; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, mu 316; CHECK-NEXT: vfsgnj.vv v8, v12, v8, v0.t 317; CHECK-NEXT: ret 318 %a = call <8 x double> @llvm.experimental.constrained.trunc.v8f64(<8 x double> %x, metadata !"fpexcept.strict") 319 ret <8 x double> %a 320} 321declare <8 x double> @llvm.experimental.constrained.trunc.v8f64(<8 x double>, metadata) 322