346 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v,+zvfh \3; RUN: -verify-machineinstrs -target-abi=ilp32d | FileCheck %s4; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v,+zvfh \5; RUN: -verify-machineinstrs -target-abi=lp64d | FileCheck %s6 7define <vscale x 1 x i32> @intrinsic_vfwcvt_x.f.v_nxv1i32_nxv1f16(<vscale x 1 x half> %0, iXLen %1) nounwind {8; CHECK-LABEL: intrinsic_vfwcvt_x.f.v_nxv1i32_nxv1f16:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: fsrmi a1, 011; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma12; CHECK-NEXT: vfwcvt.x.f.v v9, v813; CHECK-NEXT: fsrm a114; CHECK-NEXT: vmv1r.v v8, v915; CHECK-NEXT: ret16entry:17 %a = call <vscale x 1 x i32> @llvm.riscv.vfwcvt.x.f.v.nxv1i32.nxv1f16(18 <vscale x 1 x i32> poison,19 <vscale x 1 x half> %0,20 iXLen 0, iXLen %1)21 22 ret <vscale x 1 x i32> %a23}24 25define <vscale x 1 x i32> @intrinsic_vfwcvt_mask_x.f.v_nxv1i32_nxv1f16(<vscale x 1 x i32> %0, <vscale x 1 x half> %1, <vscale x 1 x i1> %2, iXLen %3) nounwind {26; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_nxv1i32_nxv1f16:27; CHECK: # %bb.0: # %entry28; CHECK-NEXT: fsrmi a1, 029; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, mu30; CHECK-NEXT: vfwcvt.x.f.v v8, v9, v0.t31; CHECK-NEXT: fsrm a132; CHECK-NEXT: ret33entry:34 %a = call <vscale x 1 x i32> @llvm.riscv.vfwcvt.x.f.v.mask.nxv1i32.nxv1f16(35 <vscale x 1 x i32> %0,36 <vscale x 1 x half> %1,37 <vscale x 1 x i1> %2,38 iXLen 0, iXLen %3, iXLen 1)39 40 ret <vscale x 1 x i32> %a41}42 43define <vscale x 2 x i32> @intrinsic_vfwcvt_x.f.v_nxv2i32_nxv2f16(<vscale x 2 x half> %0, iXLen %1) nounwind {44; CHECK-LABEL: intrinsic_vfwcvt_x.f.v_nxv2i32_nxv2f16:45; CHECK: # %bb.0: # %entry46; CHECK-NEXT: fsrmi a1, 047; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma48; CHECK-NEXT: vfwcvt.x.f.v v9, v849; CHECK-NEXT: fsrm a150; CHECK-NEXT: vmv1r.v v8, v951; CHECK-NEXT: ret52entry:53 %a = call <vscale x 2 x i32> @llvm.riscv.vfwcvt.x.f.v.nxv2i32.nxv2f16(54 <vscale x 2 x i32> poison,55 <vscale x 2 x half> %0,56 iXLen 0, iXLen %1)57 58 ret <vscale x 2 x i32> %a59}60 61define <vscale x 2 x i32> @intrinsic_vfwcvt_mask_x.f.v_nxv2i32_nxv2f16(<vscale x 2 x i32> %0, <vscale x 2 x half> %1, <vscale x 2 x i1> %2, iXLen %3) nounwind {62; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_nxv2i32_nxv2f16:63; CHECK: # %bb.0: # %entry64; CHECK-NEXT: fsrmi a1, 065; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, mu66; CHECK-NEXT: vfwcvt.x.f.v v8, v9, v0.t67; CHECK-NEXT: fsrm a168; CHECK-NEXT: ret69entry:70 %a = call <vscale x 2 x i32> @llvm.riscv.vfwcvt.x.f.v.mask.nxv2i32.nxv2f16(71 <vscale x 2 x i32> %0,72 <vscale x 2 x half> %1,73 <vscale x 2 x i1> %2,74 iXLen 0, iXLen %3, iXLen 1)75 76 ret <vscale x 2 x i32> %a77}78 79define <vscale x 4 x i32> @intrinsic_vfwcvt_x.f.v_nxv4i32_nxv4f16(<vscale x 4 x half> %0, iXLen %1) nounwind {80; CHECK-LABEL: intrinsic_vfwcvt_x.f.v_nxv4i32_nxv4f16:81; CHECK: # %bb.0: # %entry82; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma83; CHECK-NEXT: vmv1r.v v10, v884; CHECK-NEXT: fsrmi a0, 085; CHECK-NEXT: vfwcvt.x.f.v v8, v1086; CHECK-NEXT: fsrm a087; CHECK-NEXT: ret88entry:89 %a = call <vscale x 4 x i32> @llvm.riscv.vfwcvt.x.f.v.nxv4i32.nxv4f16(90 <vscale x 4 x i32> poison,91 <vscale x 4 x half> %0,92 iXLen 0, iXLen %1)93 94 ret <vscale x 4 x i32> %a95}96 97define <vscale x 4 x i32> @intrinsic_vfwcvt_mask_x.f.v_nxv4i32_nxv4f16(<vscale x 4 x i32> %0, <vscale x 4 x half> %1, <vscale x 4 x i1> %2, iXLen %3) nounwind {98; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_nxv4i32_nxv4f16:99; CHECK: # %bb.0: # %entry100; CHECK-NEXT: fsrmi a1, 0101; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, mu102; CHECK-NEXT: vfwcvt.x.f.v v8, v10, v0.t103; CHECK-NEXT: fsrm a1104; CHECK-NEXT: ret105entry:106 %a = call <vscale x 4 x i32> @llvm.riscv.vfwcvt.x.f.v.mask.nxv4i32.nxv4f16(107 <vscale x 4 x i32> %0,108 <vscale x 4 x half> %1,109 <vscale x 4 x i1> %2,110 iXLen 0, iXLen %3, iXLen 1)111 112 ret <vscale x 4 x i32> %a113}114 115define <vscale x 8 x i32> @intrinsic_vfwcvt_x.f.v_nxv8i32_nxv8f16(<vscale x 8 x half> %0, iXLen %1) nounwind {116; CHECK-LABEL: intrinsic_vfwcvt_x.f.v_nxv8i32_nxv8f16:117; CHECK: # %bb.0: # %entry118; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma119; CHECK-NEXT: vmv2r.v v12, v8120; CHECK-NEXT: fsrmi a0, 0121; CHECK-NEXT: vfwcvt.x.f.v v8, v12122; CHECK-NEXT: fsrm a0123; CHECK-NEXT: ret124entry:125 %a = call <vscale x 8 x i32> @llvm.riscv.vfwcvt.x.f.v.nxv8i32.nxv8f16(126 <vscale x 8 x i32> poison,127 <vscale x 8 x half> %0,128 iXLen 0, iXLen %1)129 130 ret <vscale x 8 x i32> %a131}132 133define <vscale x 8 x i32> @intrinsic_vfwcvt_mask_x.f.v_nxv8i32_nxv8f16(<vscale x 8 x i32> %0, <vscale x 8 x half> %1, <vscale x 8 x i1> %2, iXLen %3) nounwind {134; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_nxv8i32_nxv8f16:135; CHECK: # %bb.0: # %entry136; CHECK-NEXT: fsrmi a1, 0137; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, mu138; CHECK-NEXT: vfwcvt.x.f.v v8, v12, v0.t139; CHECK-NEXT: fsrm a1140; CHECK-NEXT: ret141entry:142 %a = call <vscale x 8 x i32> @llvm.riscv.vfwcvt.x.f.v.mask.nxv8i32.nxv8f16(143 <vscale x 8 x i32> %0,144 <vscale x 8 x half> %1,145 <vscale x 8 x i1> %2,146 iXLen 0, iXLen %3, iXLen 1)147 148 ret <vscale x 8 x i32> %a149}150 151define <vscale x 16 x i32> @intrinsic_vfwcvt_x.f.v_nxv16i32_nxv16f16(<vscale x 16 x half> %0, iXLen %1) nounwind {152; CHECK-LABEL: intrinsic_vfwcvt_x.f.v_nxv16i32_nxv16f16:153; CHECK: # %bb.0: # %entry154; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma155; CHECK-NEXT: vmv4r.v v16, v8156; CHECK-NEXT: fsrmi a0, 0157; CHECK-NEXT: vfwcvt.x.f.v v8, v16158; CHECK-NEXT: fsrm a0159; CHECK-NEXT: ret160entry:161 %a = call <vscale x 16 x i32> @llvm.riscv.vfwcvt.x.f.v.nxv16i32.nxv16f16(162 <vscale x 16 x i32> poison,163 <vscale x 16 x half> %0,164 iXLen 0, iXLen %1)165 166 ret <vscale x 16 x i32> %a167}168 169define <vscale x 16 x i32> @intrinsic_vfwcvt_mask_x.f.v_nxv16i32_nxv16f16(<vscale x 16 x i32> %0, <vscale x 16 x half> %1, <vscale x 16 x i1> %2, iXLen %3) nounwind {170; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_nxv16i32_nxv16f16:171; CHECK: # %bb.0: # %entry172; CHECK-NEXT: fsrmi a1, 0173; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, mu174; CHECK-NEXT: vfwcvt.x.f.v v8, v16, v0.t175; CHECK-NEXT: fsrm a1176; CHECK-NEXT: ret177entry:178 %a = call <vscale x 16 x i32> @llvm.riscv.vfwcvt.x.f.v.mask.nxv16i32.nxv16f16(179 <vscale x 16 x i32> %0,180 <vscale x 16 x half> %1,181 <vscale x 16 x i1> %2,182 iXLen 0, iXLen %3, iXLen 1)183 184 ret <vscale x 16 x i32> %a185}186 187define <vscale x 1 x i64> @intrinsic_vfwcvt_x.f.v_nxv1i64_nxv1f32(<vscale x 1 x float> %0, iXLen %1) nounwind {188; CHECK-LABEL: intrinsic_vfwcvt_x.f.v_nxv1i64_nxv1f32:189; CHECK: # %bb.0: # %entry190; CHECK-NEXT: fsrmi a1, 0191; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma192; CHECK-NEXT: vfwcvt.x.f.v v9, v8193; CHECK-NEXT: fsrm a1194; CHECK-NEXT: vmv1r.v v8, v9195; CHECK-NEXT: ret196entry:197 %a = call <vscale x 1 x i64> @llvm.riscv.vfwcvt.x.f.v.nxv1i64.nxv1f32(198 <vscale x 1 x i64> poison,199 <vscale x 1 x float> %0,200 iXLen 0, iXLen %1)201 202 ret <vscale x 1 x i64> %a203}204 205define <vscale x 1 x i64> @intrinsic_vfwcvt_mask_x.f.v_nxv1i64_nxv1f32(<vscale x 1 x i64> %0, <vscale x 1 x float> %1, <vscale x 1 x i1> %2, iXLen %3) nounwind {206; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_nxv1i64_nxv1f32:207; CHECK: # %bb.0: # %entry208; CHECK-NEXT: fsrmi a1, 0209; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, mu210; CHECK-NEXT: vfwcvt.x.f.v v8, v9, v0.t211; CHECK-NEXT: fsrm a1212; CHECK-NEXT: ret213entry:214 %a = call <vscale x 1 x i64> @llvm.riscv.vfwcvt.x.f.v.mask.nxv1i64.nxv1f32(215 <vscale x 1 x i64> %0,216 <vscale x 1 x float> %1,217 <vscale x 1 x i1> %2,218 iXLen 0, iXLen %3, iXLen 1)219 220 ret <vscale x 1 x i64> %a221}222 223define <vscale x 2 x i64> @intrinsic_vfwcvt_x.f.v_nxv2i64_nxv2f32(<vscale x 2 x float> %0, iXLen %1) nounwind {224; CHECK-LABEL: intrinsic_vfwcvt_x.f.v_nxv2i64_nxv2f32:225; CHECK: # %bb.0: # %entry226; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma227; CHECK-NEXT: vmv1r.v v10, v8228; CHECK-NEXT: fsrmi a0, 0229; CHECK-NEXT: vfwcvt.x.f.v v8, v10230; CHECK-NEXT: fsrm a0231; CHECK-NEXT: ret232entry:233 %a = call <vscale x 2 x i64> @llvm.riscv.vfwcvt.x.f.v.nxv2i64.nxv2f32(234 <vscale x 2 x i64> poison,235 <vscale x 2 x float> %0,236 iXLen 0, iXLen %1)237 238 ret <vscale x 2 x i64> %a239}240 241define <vscale x 2 x i64> @intrinsic_vfwcvt_mask_x.f.v_nxv2i64_nxv2f32(<vscale x 2 x i64> %0, <vscale x 2 x float> %1, <vscale x 2 x i1> %2, iXLen %3) nounwind {242; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_nxv2i64_nxv2f32:243; CHECK: # %bb.0: # %entry244; CHECK-NEXT: fsrmi a1, 0245; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, mu246; CHECK-NEXT: vfwcvt.x.f.v v8, v10, v0.t247; CHECK-NEXT: fsrm a1248; CHECK-NEXT: ret249entry:250 %a = call <vscale x 2 x i64> @llvm.riscv.vfwcvt.x.f.v.mask.nxv2i64.nxv2f32(251 <vscale x 2 x i64> %0,252 <vscale x 2 x float> %1,253 <vscale x 2 x i1> %2,254 iXLen 0, iXLen %3, iXLen 1)255 256 ret <vscale x 2 x i64> %a257}258 259define <vscale x 4 x i64> @intrinsic_vfwcvt_x.f.v_nxv4i64_nxv4f32(<vscale x 4 x float> %0, iXLen %1) nounwind {260; CHECK-LABEL: intrinsic_vfwcvt_x.f.v_nxv4i64_nxv4f32:261; CHECK: # %bb.0: # %entry262; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma263; CHECK-NEXT: vmv2r.v v12, v8264; CHECK-NEXT: fsrmi a0, 0265; CHECK-NEXT: vfwcvt.x.f.v v8, v12266; CHECK-NEXT: fsrm a0267; CHECK-NEXT: ret268entry:269 %a = call <vscale x 4 x i64> @llvm.riscv.vfwcvt.x.f.v.nxv4i64.nxv4f32(270 <vscale x 4 x i64> poison,271 <vscale x 4 x float> %0,272 iXLen 0, iXLen %1)273 274 ret <vscale x 4 x i64> %a275}276 277define <vscale x 4 x i64> @intrinsic_vfwcvt_mask_x.f.v_nxv4i64_nxv4f32(<vscale x 4 x i64> %0, <vscale x 4 x float> %1, <vscale x 4 x i1> %2, iXLen %3) nounwind {278; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_nxv4i64_nxv4f32:279; CHECK: # %bb.0: # %entry280; CHECK-NEXT: fsrmi a1, 0281; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, mu282; CHECK-NEXT: vfwcvt.x.f.v v8, v12, v0.t283; CHECK-NEXT: fsrm a1284; CHECK-NEXT: ret285entry:286 %a = call <vscale x 4 x i64> @llvm.riscv.vfwcvt.x.f.v.mask.nxv4i64.nxv4f32(287 <vscale x 4 x i64> %0,288 <vscale x 4 x float> %1,289 <vscale x 4 x i1> %2,290 iXLen 0, iXLen %3, iXLen 1)291 292 ret <vscale x 4 x i64> %a293}294 295define <vscale x 8 x i64> @intrinsic_vfwcvt_x.f.v_nxv8i64_nxv8f32(<vscale x 8 x float> %0, iXLen %1) nounwind {296; CHECK-LABEL: intrinsic_vfwcvt_x.f.v_nxv8i64_nxv8f32:297; CHECK: # %bb.0: # %entry298; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma299; CHECK-NEXT: vmv4r.v v16, v8300; CHECK-NEXT: fsrmi a0, 0301; CHECK-NEXT: vfwcvt.x.f.v v8, v16302; CHECK-NEXT: fsrm a0303; CHECK-NEXT: ret304entry:305 %a = call <vscale x 8 x i64> @llvm.riscv.vfwcvt.x.f.v.nxv8i64.nxv8f32(306 <vscale x 8 x i64> poison,307 <vscale x 8 x float> %0,308 iXLen 0, iXLen %1)309 310 ret <vscale x 8 x i64> %a311}312 313define <vscale x 8 x i64> @intrinsic_vfwcvt_mask_x.f.v_nxv8i64_nxv8f32(<vscale x 8 x i64> %0, <vscale x 8 x float> %1, <vscale x 8 x i1> %2, iXLen %3) nounwind {314; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_nxv8i64_nxv8f32:315; CHECK: # %bb.0: # %entry316; CHECK-NEXT: fsrmi a1, 0317; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, mu318; CHECK-NEXT: vfwcvt.x.f.v v8, v16, v0.t319; CHECK-NEXT: fsrm a1320; CHECK-NEXT: ret321entry:322 %a = call <vscale x 8 x i64> @llvm.riscv.vfwcvt.x.f.v.mask.nxv8i64.nxv8f32(323 <vscale x 8 x i64> %0,324 <vscale x 8 x float> %1,325 <vscale x 8 x i1> %2,326 iXLen 0, iXLen %3, iXLen 1)327 328 ret <vscale x 8 x i64> %a329}330 331define <vscale x 8 x i64> @intrinsic_vfwcvt_mask_x.f.v_rtz_nxv8i64_nxv8f32(<vscale x 8 x i64> %0, <vscale x 8 x float> %1, <vscale x 8 x i1> %2, iXLen %3) nounwind {332; CHECK-LABEL: intrinsic_vfwcvt_mask_x.f.v_rtz_nxv8i64_nxv8f32:333; CHECK: # %bb.0: # %entry334; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, mu335; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v16, v0.t336; CHECK-NEXT: ret337entry:338 %a = call <vscale x 8 x i64> @llvm.riscv.vfwcvt.x.f.v.mask.nxv8i64.nxv8f32(339 <vscale x 8 x i64> %0,340 <vscale x 8 x float> %1,341 <vscale x 8 x i1> %2,342 iXLen 1, iXLen %3, iXLen 1)343 344 ret <vscale x 8 x i64> %a345}346