301 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV323; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV644 5define void @fp2si_v2f32_v2i32(ptr %x, ptr %y) {6; CHECK-LABEL: fp2si_v2f32_v2i32:7; CHECK: # %bb.0:8; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma9; CHECK-NEXT: vle32.v v8, (a0)10; CHECK-NEXT: vmfne.vv v0, v8, v811; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v812; CHECK-NEXT: vmerge.vim v8, v8, 0, v013; CHECK-NEXT: vse32.v v8, (a1)14; CHECK-NEXT: ret15 %a = load <2 x float>, ptr %x16 %d = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f32(<2 x float> %a)17 store <2 x i32> %d, ptr %y18 ret void19}20 21define void @fp2ui_v2f32_v2i32(ptr %x, ptr %y) {22; CHECK-LABEL: fp2ui_v2f32_v2i32:23; CHECK: # %bb.0:24; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma25; CHECK-NEXT: vle32.v v8, (a0)26; CHECK-NEXT: vmfne.vv v0, v8, v827; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v828; CHECK-NEXT: vmerge.vim v8, v8, 0, v029; CHECK-NEXT: vse32.v v8, (a1)30; CHECK-NEXT: ret31 %a = load <2 x float>, ptr %x32 %d = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f32(<2 x float> %a)33 store <2 x i32> %d, ptr %y34 ret void35}36 37define void @fp2si_v8f32_v8i32(ptr %x, ptr %y) {38;39; CHECK-LABEL: fp2si_v8f32_v8i32:40; CHECK: # %bb.0:41; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma42; CHECK-NEXT: vle32.v v8, (a0)43; CHECK-NEXT: vmfne.vv v0, v8, v844; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v845; CHECK-NEXT: vmerge.vim v8, v8, 0, v046; CHECK-NEXT: vse32.v v8, (a1)47; CHECK-NEXT: ret48 %a = load <8 x float>, ptr %x49 %d = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f32(<8 x float> %a)50 store <8 x i32> %d, ptr %y51 ret void52}53 54define void @fp2ui_v8f32_v8i32(ptr %x, ptr %y) {55;56; CHECK-LABEL: fp2ui_v8f32_v8i32:57; CHECK: # %bb.0:58; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma59; CHECK-NEXT: vle32.v v8, (a0)60; CHECK-NEXT: vmfne.vv v0, v8, v861; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v862; CHECK-NEXT: vmerge.vim v8, v8, 0, v063; CHECK-NEXT: vse32.v v8, (a1)64; CHECK-NEXT: ret65 %a = load <8 x float>, ptr %x66 %d = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f32(<8 x float> %a)67 store <8 x i32> %d, ptr %y68 ret void69}70 71define void @fp2si_v2f32_v2i64(ptr %x, ptr %y) {72; CHECK-LABEL: fp2si_v2f32_v2i64:73; CHECK: # %bb.0:74; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma75; CHECK-NEXT: vle32.v v8, (a0)76; CHECK-NEXT: vmfne.vv v0, v8, v877; CHECK-NEXT: vfwcvt.rtz.x.f.v v9, v878; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma79; CHECK-NEXT: vmerge.vim v8, v9, 0, v080; CHECK-NEXT: vse64.v v8, (a1)81; CHECK-NEXT: ret82 %a = load <2 x float>, ptr %x83 %d = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f32(<2 x float> %a)84 store <2 x i64> %d, ptr %y85 ret void86}87 88define void @fp2ui_v2f32_v2i64(ptr %x, ptr %y) {89; CHECK-LABEL: fp2ui_v2f32_v2i64:90; CHECK: # %bb.0:91; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma92; CHECK-NEXT: vle32.v v8, (a0)93; CHECK-NEXT: vmfne.vv v0, v8, v894; CHECK-NEXT: vfwcvt.rtz.xu.f.v v9, v895; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma96; CHECK-NEXT: vmerge.vim v8, v9, 0, v097; CHECK-NEXT: vse64.v v8, (a1)98; CHECK-NEXT: ret99 %a = load <2 x float>, ptr %x100 %d = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f32(<2 x float> %a)101 store <2 x i64> %d, ptr %y102 ret void103}104 105define void @fp2si_v8f32_v8i64(ptr %x, ptr %y) {106;107; CHECK-LABEL: fp2si_v8f32_v8i64:108; CHECK: # %bb.0:109; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma110; CHECK-NEXT: vle32.v v12, (a0)111; CHECK-NEXT: vmfne.vv v0, v12, v12112; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v12113; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma114; CHECK-NEXT: vmerge.vim v8, v8, 0, v0115; CHECK-NEXT: vse64.v v8, (a1)116; CHECK-NEXT: ret117 %a = load <8 x float>, ptr %x118 %d = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f32(<8 x float> %a)119 store <8 x i64> %d, ptr %y120 ret void121}122 123define void @fp2ui_v8f32_v8i64(ptr %x, ptr %y) {124;125; CHECK-LABEL: fp2ui_v8f32_v8i64:126; CHECK: # %bb.0:127; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma128; CHECK-NEXT: vle32.v v12, (a0)129; CHECK-NEXT: vmfne.vv v0, v12, v12130; CHECK-NEXT: vfwcvt.rtz.xu.f.v v8, v12131; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma132; CHECK-NEXT: vmerge.vim v8, v8, 0, v0133; CHECK-NEXT: vse64.v v8, (a1)134; CHECK-NEXT: ret135 %a = load <8 x float>, ptr %x136 %d = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f32(<8 x float> %a)137 store <8 x i64> %d, ptr %y138 ret void139}140 141define void @fp2si_v2f16_v2i64(ptr %x, ptr %y) {142; CHECK-LABEL: fp2si_v2f16_v2i64:143; CHECK: # %bb.0:144; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma145; CHECK-NEXT: vle16.v v8, (a0)146; CHECK-NEXT: vmfne.vv v0, v8, v8147; CHECK-NEXT: vfwcvt.f.f.v v9, v8148; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma149; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v9150; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma151; CHECK-NEXT: vmerge.vim v8, v8, 0, v0152; CHECK-NEXT: vse64.v v8, (a1)153; CHECK-NEXT: ret154 %a = load <2 x half>, ptr %x155 %d = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> %a)156 store <2 x i64> %d, ptr %y157 ret void158}159 160define void @fp2ui_v2f16_v2i64(ptr %x, ptr %y) {161; CHECK-LABEL: fp2ui_v2f16_v2i64:162; CHECK: # %bb.0:163; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma164; CHECK-NEXT: vle16.v v8, (a0)165; CHECK-NEXT: vmfne.vv v0, v8, v8166; CHECK-NEXT: vfwcvt.f.f.v v9, v8167; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma168; CHECK-NEXT: vfwcvt.rtz.xu.f.v v8, v9169; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma170; CHECK-NEXT: vmerge.vim v8, v8, 0, v0171; CHECK-NEXT: vse64.v v8, (a1)172; CHECK-NEXT: ret173 %a = load <2 x half>, ptr %x174 %d = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> %a)175 store <2 x i64> %d, ptr %y176 ret void177}178 179define void @fp2si_v2f64_v2i8(ptr %x, ptr %y) {180; CHECK-LABEL: fp2si_v2f64_v2i8:181; CHECK: # %bb.0:182; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma183; CHECK-NEXT: vle64.v v8, (a0)184; CHECK-NEXT: vmfne.vv v0, v8, v8185; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma186; CHECK-NEXT: vfncvt.rtz.x.f.w v9, v8187; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma188; CHECK-NEXT: vnclip.wi v8, v9, 0189; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, ma190; CHECK-NEXT: vnclip.wi v8, v8, 0191; CHECK-NEXT: vmerge.vim v8, v8, 0, v0192; CHECK-NEXT: vse8.v v8, (a1)193; CHECK-NEXT: ret194 %a = load <2 x double>, ptr %x195 %d = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f64(<2 x double> %a)196 store <2 x i8> %d, ptr %y197 ret void198}199 200define void @fp2ui_v2f64_v2i8(ptr %x, ptr %y) {201; CHECK-LABEL: fp2ui_v2f64_v2i8:202; CHECK: # %bb.0:203; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma204; CHECK-NEXT: vle64.v v8, (a0)205; CHECK-NEXT: vmfne.vv v0, v8, v8206; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma207; CHECK-NEXT: vfncvt.rtz.xu.f.w v9, v8208; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma209; CHECK-NEXT: vnclipu.wi v8, v9, 0210; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, ma211; CHECK-NEXT: vnclipu.wi v8, v8, 0212; CHECK-NEXT: vmerge.vim v8, v8, 0, v0213; CHECK-NEXT: vse8.v v8, (a1)214; CHECK-NEXT: ret215 %a = load <2 x double>, ptr %x216 %d = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f64(<2 x double> %a)217 store <2 x i8> %d, ptr %y218 ret void219}220 221define void @fp2si_v8f64_v8i8(ptr %x, ptr %y) {222;223; CHECK-LABEL: fp2si_v8f64_v8i8:224; CHECK: # %bb.0:225; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma226; CHECK-NEXT: vle64.v v8, (a0)227; CHECK-NEXT: vmfne.vv v0, v8, v8228; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma229; CHECK-NEXT: vfncvt.rtz.x.f.w v12, v8230; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma231; CHECK-NEXT: vnclip.wi v8, v12, 0232; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma233; CHECK-NEXT: vnclip.wi v8, v8, 0234; CHECK-NEXT: vmerge.vim v8, v8, 0, v0235; CHECK-NEXT: vse8.v v8, (a1)236; CHECK-NEXT: ret237 %a = load <8 x double>, ptr %x238 %d = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f64(<8 x double> %a)239 store <8 x i8> %d, ptr %y240 ret void241}242 243define void @fp2ui_v8f64_v8i8(ptr %x, ptr %y) {244;245; CHECK-LABEL: fp2ui_v8f64_v8i8:246; CHECK: # %bb.0:247; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma248; CHECK-NEXT: vle64.v v8, (a0)249; CHECK-NEXT: vmfne.vv v0, v8, v8250; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma251; CHECK-NEXT: vfncvt.rtz.xu.f.w v12, v8252; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma253; CHECK-NEXT: vnclipu.wi v8, v12, 0254; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma255; CHECK-NEXT: vnclipu.wi v8, v8, 0256; CHECK-NEXT: vmerge.vim v8, v8, 0, v0257; CHECK-NEXT: vse8.v v8, (a1)258; CHECK-NEXT: ret259 %a = load <8 x double>, ptr %x260 %d = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f64(<8 x double> %a)261 store <8 x i8> %d, ptr %y262 ret void263}264 265define void @fp2si_v2f64_v2i32(ptr %x, ptr %y) {266; CHECK-LABEL: fp2si_v2f64_v2i32:267; CHECK: # %bb.0:268; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma269; CHECK-NEXT: vle64.v v8, (a0)270; CHECK-NEXT: vmfne.vv v0, v8, v8271; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma272; CHECK-NEXT: vfncvt.rtz.x.f.w v9, v8273; CHECK-NEXT: vmerge.vim v8, v9, 0, v0274; CHECK-NEXT: vse32.v v8, (a1)275; CHECK-NEXT: ret276 %a = load <2 x double>, ptr %x277 %d = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f64(<2 x double> %a)278 store <2 x i32> %d, ptr %y279 ret void280}281 282define void @fp2ui_v2f64_v2i32(ptr %x, ptr %y) {283; CHECK-LABEL: fp2ui_v2f64_v2i32:284; CHECK: # %bb.0:285; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma286; CHECK-NEXT: vle64.v v8, (a0)287; CHECK-NEXT: vmfne.vv v0, v8, v8288; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma289; CHECK-NEXT: vfncvt.rtz.xu.f.w v9, v8290; CHECK-NEXT: vmerge.vim v8, v9, 0, v0291; CHECK-NEXT: vse32.v v8, (a1)292; CHECK-NEXT: ret293 %a = load <2 x double>, ptr %x294 %d = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f64(<2 x double> %a)295 store <2 x i32> %d, ptr %y296 ret void297}298;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:299; RV32: {{.*}}300; RV64: {{.*}}301