1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 3; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 4 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, ma 9; CHECK-NEXT: vle32.v v8, (a0) 10; CHECK-NEXT: vmfne.vv v0, v8, v8 11; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v8 12; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 13; CHECK-NEXT: vse32.v v8, (a1) 14; CHECK-NEXT: ret 15 %a = load <2 x float>, ptr %x 16 %d = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f32(<2 x float> %a) 17 store <2 x i32> %d, ptr %y 18 ret void 19} 20declare <2 x i32> @llvm.fptosi.sat.v2i32.v2f32(<2 x float>) 21 22define void @fp2ui_v2f32_v2i32(ptr %x, ptr %y) { 23; CHECK-LABEL: fp2ui_v2f32_v2i32: 24; CHECK: # %bb.0: 25; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 26; CHECK-NEXT: vle32.v v8, (a0) 27; CHECK-NEXT: vmfne.vv v0, v8, v8 28; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8 29; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 30; CHECK-NEXT: vse32.v v8, (a1) 31; CHECK-NEXT: ret 32 %a = load <2 x float>, ptr %x 33 %d = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f32(<2 x float> %a) 34 store <2 x i32> %d, ptr %y 35 ret void 36} 37declare <2 x i32> @llvm.fptoui.sat.v2i32.v2f32(<2 x float>) 38 39define void @fp2si_v8f32_v8i32(ptr %x, ptr %y) { 40; 41; CHECK-LABEL: fp2si_v8f32_v8i32: 42; CHECK: # %bb.0: 43; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 44; CHECK-NEXT: vle32.v v8, (a0) 45; CHECK-NEXT: vmfne.vv v0, v8, v8 46; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v8 47; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 48; CHECK-NEXT: vse32.v v8, (a1) 49; CHECK-NEXT: ret 50 %a = load <8 x float>, ptr %x 51 %d = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f32(<8 x float> %a) 52 store <8 x i32> %d, ptr %y 53 ret void 54} 55declare <8 x i32> @llvm.fptosi.sat.v8i32.v8f32(<8 x float>) 56 57define void @fp2ui_v8f32_v8i32(ptr %x, ptr %y) { 58; 59; CHECK-LABEL: fp2ui_v8f32_v8i32: 60; CHECK: # %bb.0: 61; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 62; CHECK-NEXT: vle32.v v8, (a0) 63; CHECK-NEXT: vmfne.vv v0, v8, v8 64; CHECK-NEXT: vfcvt.rtz.x.f.v v8, v8 65; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 66; CHECK-NEXT: vse32.v v8, (a1) 67; CHECK-NEXT: ret 68 %a = load <8 x float>, ptr %x 69 %d = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f32(<8 x float> %a) 70 store <8 x i32> %d, ptr %y 71 ret void 72} 73declare <8 x i32> @llvm.fptoui.sat.v8i32.v8f32(<8 x float>) 74 75define void @fp2si_v2f32_v2i64(ptr %x, ptr %y) { 76; CHECK-LABEL: fp2si_v2f32_v2i64: 77; CHECK: # %bb.0: 78; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 79; CHECK-NEXT: vle32.v v8, (a0) 80; CHECK-NEXT: vmfne.vv v0, v8, v8 81; CHECK-NEXT: vfwcvt.rtz.x.f.v v9, v8 82; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma 83; CHECK-NEXT: vmerge.vim v8, v9, 0, v0 84; CHECK-NEXT: vse64.v v8, (a1) 85; CHECK-NEXT: ret 86 %a = load <2 x float>, ptr %x 87 %d = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f32(<2 x float> %a) 88 store <2 x i64> %d, ptr %y 89 ret void 90} 91declare <2 x i64> @llvm.fptosi.sat.v2i64.v2f32(<2 x float>) 92 93define void @fp2ui_v2f32_v2i64(ptr %x, ptr %y) { 94; CHECK-LABEL: fp2ui_v2f32_v2i64: 95; CHECK: # %bb.0: 96; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 97; CHECK-NEXT: vle32.v v8, (a0) 98; CHECK-NEXT: vmfne.vv v0, v8, v8 99; CHECK-NEXT: vfwcvt.rtz.xu.f.v v9, v8 100; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma 101; CHECK-NEXT: vmerge.vim v8, v9, 0, v0 102; CHECK-NEXT: vse64.v v8, (a1) 103; CHECK-NEXT: ret 104 %a = load <2 x float>, ptr %x 105 %d = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f32(<2 x float> %a) 106 store <2 x i64> %d, ptr %y 107 ret void 108} 109declare <2 x i64> @llvm.fptoui.sat.v2i64.v2f32(<2 x float>) 110 111define void @fp2si_v8f32_v8i64(ptr %x, ptr %y) { 112; 113; CHECK-LABEL: fp2si_v8f32_v8i64: 114; CHECK: # %bb.0: 115; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 116; CHECK-NEXT: vle32.v v8, (a0) 117; CHECK-NEXT: vmfne.vv v0, v8, v8 118; CHECK-NEXT: vfwcvt.rtz.x.f.v v12, v8 119; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma 120; CHECK-NEXT: vmerge.vim v8, v12, 0, v0 121; CHECK-NEXT: vse64.v v8, (a1) 122; CHECK-NEXT: ret 123 %a = load <8 x float>, ptr %x 124 %d = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f32(<8 x float> %a) 125 store <8 x i64> %d, ptr %y 126 ret void 127} 128declare <8 x i64> @llvm.fptosi.sat.v8i64.v8f32(<8 x float>) 129 130define void @fp2ui_v8f32_v8i64(ptr %x, ptr %y) { 131; 132; CHECK-LABEL: fp2ui_v8f32_v8i64: 133; CHECK: # %bb.0: 134; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 135; CHECK-NEXT: vle32.v v8, (a0) 136; CHECK-NEXT: vmfne.vv v0, v8, v8 137; CHECK-NEXT: vfwcvt.rtz.xu.f.v v12, v8 138; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma 139; CHECK-NEXT: vmerge.vim v8, v12, 0, v0 140; CHECK-NEXT: vse64.v v8, (a1) 141; CHECK-NEXT: ret 142 %a = load <8 x float>, ptr %x 143 %d = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f32(<8 x float> %a) 144 store <8 x i64> %d, ptr %y 145 ret void 146} 147declare <8 x i64> @llvm.fptoui.sat.v8i64.v8f32(<8 x float>) 148 149define void @fp2si_v2f16_v2i64(ptr %x, ptr %y) { 150; CHECK-LABEL: fp2si_v2f16_v2i64: 151; CHECK: # %bb.0: 152; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 153; CHECK-NEXT: vle16.v v8, (a0) 154; CHECK-NEXT: vmfne.vv v0, v8, v8 155; CHECK-NEXT: vfwcvt.f.f.v v9, v8 156; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 157; CHECK-NEXT: vfwcvt.rtz.x.f.v v8, v9 158; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma 159; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 160; CHECK-NEXT: vse64.v v8, (a1) 161; CHECK-NEXT: ret 162 %a = load <2 x half>, ptr %x 163 %d = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> %a) 164 store <2 x i64> %d, ptr %y 165 ret void 166} 167declare <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half>) 168 169define void @fp2ui_v2f16_v2i64(ptr %x, ptr %y) { 170; CHECK-LABEL: fp2ui_v2f16_v2i64: 171; CHECK: # %bb.0: 172; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 173; CHECK-NEXT: vle16.v v8, (a0) 174; CHECK-NEXT: vmfne.vv v0, v8, v8 175; CHECK-NEXT: vfwcvt.f.f.v v9, v8 176; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 177; CHECK-NEXT: vfwcvt.rtz.xu.f.v v8, v9 178; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma 179; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 180; CHECK-NEXT: vse64.v v8, (a1) 181; CHECK-NEXT: ret 182 %a = load <2 x half>, ptr %x 183 %d = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> %a) 184 store <2 x i64> %d, ptr %y 185 ret void 186} 187declare <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half>) 188 189define void @fp2si_v2f64_v2i8(ptr %x, ptr %y) { 190; CHECK-LABEL: fp2si_v2f64_v2i8: 191; CHECK: # %bb.0: 192; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 193; CHECK-NEXT: vle64.v v8, (a0) 194; CHECK-NEXT: vmfne.vv v0, v8, v8 195; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 196; CHECK-NEXT: vfncvt.rtz.x.f.w v9, v8 197; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 198; CHECK-NEXT: vnclip.wi v8, v9, 0 199; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, ma 200; CHECK-NEXT: vnclip.wi v8, v8, 0 201; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 202; CHECK-NEXT: vse8.v v8, (a1) 203; CHECK-NEXT: ret 204 %a = load <2 x double>, ptr %x 205 %d = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f64(<2 x double> %a) 206 store <2 x i8> %d, ptr %y 207 ret void 208} 209declare <2 x i8> @llvm.fptosi.sat.v2i8.v2f64(<2 x double>) 210 211define void @fp2ui_v2f64_v2i8(ptr %x, ptr %y) { 212; CHECK-LABEL: fp2ui_v2f64_v2i8: 213; CHECK: # %bb.0: 214; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 215; CHECK-NEXT: vle64.v v8, (a0) 216; CHECK-NEXT: vmfne.vv v0, v8, v8 217; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 218; CHECK-NEXT: vfncvt.rtz.xu.f.w v9, v8 219; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 220; CHECK-NEXT: vnclipu.wi v8, v9, 0 221; CHECK-NEXT: vsetvli zero, zero, e8, mf8, ta, ma 222; CHECK-NEXT: vnclipu.wi v8, v8, 0 223; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 224; CHECK-NEXT: vse8.v v8, (a1) 225; CHECK-NEXT: ret 226 %a = load <2 x double>, ptr %x 227 %d = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f64(<2 x double> %a) 228 store <2 x i8> %d, ptr %y 229 ret void 230} 231declare <2 x i8> @llvm.fptoui.sat.v2i8.v2f64(<2 x double>) 232 233define void @fp2si_v8f64_v8i8(ptr %x, ptr %y) { 234; 235; CHECK-LABEL: fp2si_v8f64_v8i8: 236; CHECK: # %bb.0: 237; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 238; CHECK-NEXT: vle64.v v8, (a0) 239; CHECK-NEXT: vmfne.vv v0, v8, v8 240; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 241; CHECK-NEXT: vfncvt.rtz.x.f.w v12, v8 242; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 243; CHECK-NEXT: vnclip.wi v8, v12, 0 244; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma 245; CHECK-NEXT: vnclip.wi v8, v8, 0 246; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 247; CHECK-NEXT: vse8.v v8, (a1) 248; CHECK-NEXT: ret 249 %a = load <8 x double>, ptr %x 250 %d = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f64(<8 x double> %a) 251 store <8 x i8> %d, ptr %y 252 ret void 253} 254declare <8 x i8> @llvm.fptosi.sat.v8i8.v8f64(<8 x double>) 255 256define void @fp2ui_v8f64_v8i8(ptr %x, ptr %y) { 257; 258; CHECK-LABEL: fp2ui_v8f64_v8i8: 259; CHECK: # %bb.0: 260; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 261; CHECK-NEXT: vle64.v v8, (a0) 262; CHECK-NEXT: vmfne.vv v0, v8, v8 263; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 264; CHECK-NEXT: vfncvt.rtz.xu.f.w v12, v8 265; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 266; CHECK-NEXT: vnclipu.wi v8, v12, 0 267; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma 268; CHECK-NEXT: vnclipu.wi v8, v8, 0 269; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 270; CHECK-NEXT: vse8.v v8, (a1) 271; CHECK-NEXT: ret 272 %a = load <8 x double>, ptr %x 273 %d = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f64(<8 x double> %a) 274 store <8 x i8> %d, ptr %y 275 ret void 276} 277declare <8 x i8> @llvm.fptoui.sat.v8i8.v8f64(<8 x double> %a) 278 279define void @fp2si_v2f64_v2i32(ptr %x, ptr %y) { 280; CHECK-LABEL: fp2si_v2f64_v2i32: 281; CHECK: # %bb.0: 282; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 283; CHECK-NEXT: vle64.v v8, (a0) 284; CHECK-NEXT: vmfne.vv v0, v8, v8 285; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 286; CHECK-NEXT: vfncvt.rtz.x.f.w v9, v8 287; CHECK-NEXT: vmerge.vim v8, v9, 0, v0 288; CHECK-NEXT: vse32.v v8, (a1) 289; CHECK-NEXT: ret 290 %a = load <2 x double>, ptr %x 291 %d = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f64(<2 x double> %a) 292 store <2 x i32> %d, ptr %y 293 ret void 294} 295declare <2 x i32> @llvm.fptosi.sat.v2i32.v2f64(<2 x double>) 296 297define void @fp2ui_v2f64_v2i32(ptr %x, ptr %y) { 298; CHECK-LABEL: fp2ui_v2f64_v2i32: 299; CHECK: # %bb.0: 300; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 301; CHECK-NEXT: vle64.v v8, (a0) 302; CHECK-NEXT: vmfne.vv v0, v8, v8 303; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 304; CHECK-NEXT: vfncvt.rtz.xu.f.w v9, v8 305; CHECK-NEXT: vmerge.vim v8, v9, 0, v0 306; CHECK-NEXT: vse32.v v8, (a1) 307; CHECK-NEXT: ret 308 %a = load <2 x double>, ptr %x 309 %d = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f64(<2 x double> %a) 310 store <2 x i32> %d, ptr %y 311 ret void 312} 313declare <2 x i32> @llvm.fptoui.sat.v2i32.v2f64(<2 x double>) 314;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 315; RV32: {{.*}} 316; RV64: {{.*}} 317