1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+experimental-v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+experimental-v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s 6 7define <vscale x 1 x half> @trunc_nxv1f16(<vscale x 1 x half> %x) { 8; CHECK-LABEL: trunc_nxv1f16: 9; CHECK: # %bb.0: 10; CHECK-NEXT: lui a0, %hi(.LCPI0_0) 11; CHECK-NEXT: flh ft0, %lo(.LCPI0_0)(a0) 12; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 13; CHECK-NEXT: vfsgnjx.vv v9, v8, v8 14; CHECK-NEXT: vmflt.vf v0, v9, ft0 15; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8 16; CHECK-NEXT: vfcvt.f.x.v v9, v9 17; CHECK-NEXT: vfsgnj.vv v9, v9, v8 18; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 19; CHECK-NEXT: ret 20 %a = call <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half> %x) 21 ret <vscale x 1 x half> %a 22} 23declare <vscale x 1 x half> @llvm.trunc.nxv1f16(<vscale x 1 x half>) 24 25define <vscale x 2 x half> @trunc_nxv2f16(<vscale x 2 x half> %x) { 26; CHECK-LABEL: trunc_nxv2f16: 27; CHECK: # %bb.0: 28; CHECK-NEXT: lui a0, %hi(.LCPI1_0) 29; CHECK-NEXT: flh ft0, %lo(.LCPI1_0)(a0) 30; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 31; CHECK-NEXT: vfsgnjx.vv v9, v8, v8 32; CHECK-NEXT: vmflt.vf v0, v9, ft0 33; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8 34; CHECK-NEXT: vfcvt.f.x.v v9, v9 35; CHECK-NEXT: vfsgnj.vv v9, v9, v8 36; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 37; CHECK-NEXT: ret 38 %a = call <vscale x 2 x half> @llvm.trunc.nxv2f16(<vscale x 2 x half> %x) 39 ret <vscale x 2 x half> %a 40} 41declare <vscale x 2 x half> @llvm.trunc.nxv2f16(<vscale x 2 x half>) 42 43define <vscale x 4 x half> @trunc_nxv4f16(<vscale x 4 x half> %x) { 44; CHECK-LABEL: trunc_nxv4f16: 45; CHECK: # %bb.0: 46; CHECK-NEXT: lui a0, %hi(.LCPI2_0) 47; CHECK-NEXT: flh ft0, %lo(.LCPI2_0)(a0) 48; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, mu 49; CHECK-NEXT: vfsgnjx.vv v9, v8, v8 50; CHECK-NEXT: vmflt.vf v0, v9, ft0 51; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8 52; CHECK-NEXT: vfcvt.f.x.v v9, v9 53; CHECK-NEXT: vfsgnj.vv v9, v9, v8 54; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 55; CHECK-NEXT: ret 56 %a = call <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half> %x) 57 ret <vscale x 4 x half> %a 58} 59declare <vscale x 4 x half> @llvm.trunc.nxv4f16(<vscale x 4 x half>) 60 61define <vscale x 8 x half> @trunc_nxv8f16(<vscale x 8 x half> %x) { 62; CHECK-LABEL: trunc_nxv8f16: 63; CHECK: # %bb.0: 64; CHECK-NEXT: lui a0, %hi(.LCPI3_0) 65; CHECK-NEXT: flh ft0, %lo(.LCPI3_0)(a0) 66; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, mu 67; CHECK-NEXT: vfsgnjx.vv v10, v8, v8 68; CHECK-NEXT: vmflt.vf v0, v10, ft0 69; CHECK-NEXT: vfcvt.rtz.x.f.v v10, v8 70; CHECK-NEXT: vfcvt.f.x.v v10, v10 71; CHECK-NEXT: vfsgnj.vv v10, v10, v8 72; CHECK-NEXT: vmerge.vvm v8, v8, v10, v0 73; CHECK-NEXT: ret 74 %a = call <vscale x 8 x half> @llvm.trunc.nxv8f16(<vscale x 8 x half> %x) 75 ret <vscale x 8 x half> %a 76} 77declare <vscale x 8 x half> @llvm.trunc.nxv8f16(<vscale x 8 x half>) 78 79define <vscale x 16 x half> @trunc_nxv16f16(<vscale x 16 x half> %x) { 80; CHECK-LABEL: trunc_nxv16f16: 81; CHECK: # %bb.0: 82; CHECK-NEXT: lui a0, %hi(.LCPI4_0) 83; CHECK-NEXT: flh ft0, %lo(.LCPI4_0)(a0) 84; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, mu 85; CHECK-NEXT: vfsgnjx.vv v12, v8, v8 86; CHECK-NEXT: vmflt.vf v0, v12, ft0 87; CHECK-NEXT: vfcvt.rtz.x.f.v v12, v8 88; CHECK-NEXT: vfcvt.f.x.v v12, v12 89; CHECK-NEXT: vfsgnj.vv v12, v12, v8 90; CHECK-NEXT: vmerge.vvm v8, v8, v12, v0 91; CHECK-NEXT: ret 92 %a = call <vscale x 16 x half> @llvm.trunc.nxv16f16(<vscale x 16 x half> %x) 93 ret <vscale x 16 x half> %a 94} 95declare <vscale x 16 x half> @llvm.trunc.nxv16f16(<vscale x 16 x half>) 96 97define <vscale x 32 x half> @trunc_nxv32f16(<vscale x 32 x half> %x) { 98; CHECK-LABEL: trunc_nxv32f16: 99; CHECK: # %bb.0: 100; CHECK-NEXT: lui a0, %hi(.LCPI5_0) 101; CHECK-NEXT: flh ft0, %lo(.LCPI5_0)(a0) 102; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, mu 103; CHECK-NEXT: vfsgnjx.vv v16, v8, v8 104; CHECK-NEXT: vmflt.vf v0, v16, ft0 105; CHECK-NEXT: vfcvt.rtz.x.f.v v16, v8 106; CHECK-NEXT: vfcvt.f.x.v v16, v16 107; CHECK-NEXT: vfsgnj.vv v16, v16, v8 108; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0 109; CHECK-NEXT: ret 110 %a = call <vscale x 32 x half> @llvm.trunc.nxv32f16(<vscale x 32 x half> %x) 111 ret <vscale x 32 x half> %a 112} 113declare <vscale x 32 x half> @llvm.trunc.nxv32f16(<vscale x 32 x half>) 114 115define <vscale x 1 x float> @trunc_nxv1f32(<vscale x 1 x float> %x) { 116; CHECK-LABEL: trunc_nxv1f32: 117; CHECK: # %bb.0: 118; CHECK-NEXT: lui a0, %hi(.LCPI6_0) 119; CHECK-NEXT: flw ft0, %lo(.LCPI6_0)(a0) 120; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 121; CHECK-NEXT: vfsgnjx.vv v9, v8, v8 122; CHECK-NEXT: vmflt.vf v0, v9, ft0 123; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8 124; CHECK-NEXT: vfcvt.f.x.v v9, v9 125; CHECK-NEXT: vfsgnj.vv v9, v9, v8 126; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 127; CHECK-NEXT: ret 128 %a = call <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float> %x) 129 ret <vscale x 1 x float> %a 130} 131declare <vscale x 1 x float> @llvm.trunc.nxv1f32(<vscale x 1 x float>) 132 133define <vscale x 2 x float> @trunc_nxv2f32(<vscale x 2 x float> %x) { 134; CHECK-LABEL: trunc_nxv2f32: 135; CHECK: # %bb.0: 136; CHECK-NEXT: lui a0, %hi(.LCPI7_0) 137; CHECK-NEXT: flw ft0, %lo(.LCPI7_0)(a0) 138; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu 139; CHECK-NEXT: vfsgnjx.vv v9, v8, v8 140; CHECK-NEXT: vmflt.vf v0, v9, ft0 141; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8 142; CHECK-NEXT: vfcvt.f.x.v v9, v9 143; CHECK-NEXT: vfsgnj.vv v9, v9, v8 144; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 145; CHECK-NEXT: ret 146 %a = call <vscale x 2 x float> @llvm.trunc.nxv2f32(<vscale x 2 x float> %x) 147 ret <vscale x 2 x float> %a 148} 149declare <vscale x 2 x float> @llvm.trunc.nxv2f32(<vscale x 2 x float>) 150 151define <vscale x 4 x float> @trunc_nxv4f32(<vscale x 4 x float> %x) { 152; CHECK-LABEL: trunc_nxv4f32: 153; CHECK: # %bb.0: 154; CHECK-NEXT: lui a0, %hi(.LCPI8_0) 155; CHECK-NEXT: flw ft0, %lo(.LCPI8_0)(a0) 156; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, mu 157; CHECK-NEXT: vfsgnjx.vv v10, v8, v8 158; CHECK-NEXT: vmflt.vf v0, v10, ft0 159; CHECK-NEXT: vfcvt.rtz.x.f.v v10, v8 160; CHECK-NEXT: vfcvt.f.x.v v10, v10 161; CHECK-NEXT: vfsgnj.vv v10, v10, v8 162; CHECK-NEXT: vmerge.vvm v8, v8, v10, v0 163; CHECK-NEXT: ret 164 %a = call <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float> %x) 165 ret <vscale x 4 x float> %a 166} 167declare <vscale x 4 x float> @llvm.trunc.nxv4f32(<vscale x 4 x float>) 168 169define <vscale x 8 x float> @trunc_nxv8f32(<vscale x 8 x float> %x) { 170; CHECK-LABEL: trunc_nxv8f32: 171; CHECK: # %bb.0: 172; CHECK-NEXT: lui a0, %hi(.LCPI9_0) 173; CHECK-NEXT: flw ft0, %lo(.LCPI9_0)(a0) 174; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 175; CHECK-NEXT: vfsgnjx.vv v12, v8, v8 176; CHECK-NEXT: vmflt.vf v0, v12, ft0 177; CHECK-NEXT: vfcvt.rtz.x.f.v v12, v8 178; CHECK-NEXT: vfcvt.f.x.v v12, v12 179; CHECK-NEXT: vfsgnj.vv v12, v12, v8 180; CHECK-NEXT: vmerge.vvm v8, v8, v12, v0 181; CHECK-NEXT: ret 182 %a = call <vscale x 8 x float> @llvm.trunc.nxv8f32(<vscale x 8 x float> %x) 183 ret <vscale x 8 x float> %a 184} 185declare <vscale x 8 x float> @llvm.trunc.nxv8f32(<vscale x 8 x float>) 186 187define <vscale x 16 x float> @trunc_nxv16f32(<vscale x 16 x float> %x) { 188; CHECK-LABEL: trunc_nxv16f32: 189; CHECK: # %bb.0: 190; CHECK-NEXT: lui a0, %hi(.LCPI10_0) 191; CHECK-NEXT: flw ft0, %lo(.LCPI10_0)(a0) 192; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu 193; CHECK-NEXT: vfsgnjx.vv v16, v8, v8 194; CHECK-NEXT: vmflt.vf v0, v16, ft0 195; CHECK-NEXT: vfcvt.rtz.x.f.v v16, v8 196; CHECK-NEXT: vfcvt.f.x.v v16, v16 197; CHECK-NEXT: vfsgnj.vv v16, v16, v8 198; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0 199; CHECK-NEXT: ret 200 %a = call <vscale x 16 x float> @llvm.trunc.nxv16f32(<vscale x 16 x float> %x) 201 ret <vscale x 16 x float> %a 202} 203declare <vscale x 16 x float> @llvm.trunc.nxv16f32(<vscale x 16 x float>) 204 205define <vscale x 1 x double> @trunc_nxv1f64(<vscale x 1 x double> %x) { 206; CHECK-LABEL: trunc_nxv1f64: 207; CHECK: # %bb.0: 208; CHECK-NEXT: lui a0, %hi(.LCPI11_0) 209; CHECK-NEXT: fld ft0, %lo(.LCPI11_0)(a0) 210; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, mu 211; CHECK-NEXT: vfsgnjx.vv v9, v8, v8 212; CHECK-NEXT: vmflt.vf v0, v9, ft0 213; CHECK-NEXT: vfcvt.rtz.x.f.v v9, v8 214; CHECK-NEXT: vfcvt.f.x.v v9, v9 215; CHECK-NEXT: vfsgnj.vv v9, v9, v8 216; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 217; CHECK-NEXT: ret 218 %a = call <vscale x 1 x double> @llvm.trunc.nxv1f64(<vscale x 1 x double> %x) 219 ret <vscale x 1 x double> %a 220} 221declare <vscale x 1 x double> @llvm.trunc.nxv1f64(<vscale x 1 x double>) 222 223define <vscale x 2 x double> @trunc_nxv2f64(<vscale x 2 x double> %x) { 224; CHECK-LABEL: trunc_nxv2f64: 225; CHECK: # %bb.0: 226; CHECK-NEXT: lui a0, %hi(.LCPI12_0) 227; CHECK-NEXT: fld ft0, %lo(.LCPI12_0)(a0) 228; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, mu 229; CHECK-NEXT: vfsgnjx.vv v10, v8, v8 230; CHECK-NEXT: vmflt.vf v0, v10, ft0 231; CHECK-NEXT: vfcvt.rtz.x.f.v v10, v8 232; CHECK-NEXT: vfcvt.f.x.v v10, v10 233; CHECK-NEXT: vfsgnj.vv v10, v10, v8 234; CHECK-NEXT: vmerge.vvm v8, v8, v10, v0 235; CHECK-NEXT: ret 236 %a = call <vscale x 2 x double> @llvm.trunc.nxv2f64(<vscale x 2 x double> %x) 237 ret <vscale x 2 x double> %a 238} 239declare <vscale x 2 x double> @llvm.trunc.nxv2f64(<vscale x 2 x double>) 240 241define <vscale x 4 x double> @trunc_nxv4f64(<vscale x 4 x double> %x) { 242; CHECK-LABEL: trunc_nxv4f64: 243; CHECK: # %bb.0: 244; CHECK-NEXT: lui a0, %hi(.LCPI13_0) 245; CHECK-NEXT: fld ft0, %lo(.LCPI13_0)(a0) 246; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, mu 247; CHECK-NEXT: vfsgnjx.vv v12, v8, v8 248; CHECK-NEXT: vmflt.vf v0, v12, ft0 249; CHECK-NEXT: vfcvt.rtz.x.f.v v12, v8 250; CHECK-NEXT: vfcvt.f.x.v v12, v12 251; CHECK-NEXT: vfsgnj.vv v12, v12, v8 252; CHECK-NEXT: vmerge.vvm v8, v8, v12, v0 253; CHECK-NEXT: ret 254 %a = call <vscale x 4 x double> @llvm.trunc.nxv4f64(<vscale x 4 x double> %x) 255 ret <vscale x 4 x double> %a 256} 257declare <vscale x 4 x double> @llvm.trunc.nxv4f64(<vscale x 4 x double>) 258 259define <vscale x 8 x double> @trunc_nxv8f64(<vscale x 8 x double> %x) { 260; CHECK-LABEL: trunc_nxv8f64: 261; CHECK: # %bb.0: 262; CHECK-NEXT: lui a0, %hi(.LCPI14_0) 263; CHECK-NEXT: fld ft0, %lo(.LCPI14_0)(a0) 264; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, mu 265; CHECK-NEXT: vfsgnjx.vv v16, v8, v8 266; CHECK-NEXT: vmflt.vf v0, v16, ft0 267; CHECK-NEXT: vfcvt.rtz.x.f.v v16, v8 268; CHECK-NEXT: vfcvt.f.x.v v16, v16 269; CHECK-NEXT: vfsgnj.vv v16, v16, v8 270; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0 271; CHECK-NEXT: ret 272 %a = call <vscale x 8 x double> @llvm.trunc.nxv8f64(<vscale x 8 x double> %x) 273 ret <vscale x 8 x double> %a 274} 275declare <vscale x 8 x double> @llvm.trunc.nxv8f64(<vscale x 8 x double>) 276