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 --check-prefixes=CHECK,CHECK32 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK64 6 7; Float 8 9declare <vscale x 2 x i32> @llvm.fptoui.sat.nxv2f32.nxv2i32(<vscale x 2 x float>) 10declare <vscale x 4 x i32> @llvm.fptoui.sat.nxv4f32.nxv4i32(<vscale x 4 x float>) 11declare <vscale x 8 x i32> @llvm.fptoui.sat.nxv8f32.nxv8i32(<vscale x 8 x float>) 12declare <vscale x 4 x i16> @llvm.fptoui.sat.nxv4f32.nxv4i16(<vscale x 4 x float>) 13declare <vscale x 8 x i16> @llvm.fptoui.sat.nxv8f32.nxv8i16(<vscale x 8 x float>) 14declare <vscale x 2 x i64> @llvm.fptoui.sat.nxv2f32.nxv2i64(<vscale x 2 x float>) 15declare <vscale x 4 x i64> @llvm.fptoui.sat.nxv4f32.nxv4i64(<vscale x 4 x float>) 16 17define <vscale x 2 x i32> @test_signed_v2f32_v2i32(<vscale x 2 x float> %f) { 18; CHECK-LABEL: test_signed_v2f32_v2i32: 19; CHECK: # %bb.0: 20; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 21; CHECK-NEXT: vmfne.vv v0, v8, v8 22; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8 23; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 24; CHECK-NEXT: ret 25 %x = call <vscale x 2 x i32> @llvm.fptoui.sat.nxv2f32.nxv2i32(<vscale x 2 x float> %f) 26 ret <vscale x 2 x i32> %x 27} 28 29define <vscale x 4 x i32> @test_signed_v4f32_v4i32(<vscale x 4 x float> %f) { 30; CHECK-LABEL: test_signed_v4f32_v4i32: 31; CHECK: # %bb.0: 32; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 33; CHECK-NEXT: vmfne.vv v0, v8, v8 34; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8 35; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 36; CHECK-NEXT: ret 37 %x = call <vscale x 4 x i32> @llvm.fptoui.sat.nxv4f32.nxv4i32(<vscale x 4 x float> %f) 38 ret <vscale x 4 x i32> %x 39} 40 41define <vscale x 8 x i32> @test_signed_v8f32_v8i32(<vscale x 8 x float> %f) { 42; CHECK-LABEL: test_signed_v8f32_v8i32: 43; CHECK: # %bb.0: 44; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 45; CHECK-NEXT: vmfne.vv v0, v8, v8 46; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8 47; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 48; CHECK-NEXT: ret 49 %x = call <vscale x 8 x i32> @llvm.fptoui.sat.nxv8f32.nxv8i32(<vscale x 8 x float> %f) 50 ret <vscale x 8 x i32> %x 51} 52 53define <vscale x 4 x i16> @test_signed_v4f32_v4i16(<vscale x 4 x float> %f) { 54; CHECK-LABEL: test_signed_v4f32_v4i16: 55; CHECK: # %bb.0: 56; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 57; CHECK-NEXT: vmfne.vv v0, v8, v8 58; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 59; CHECK-NEXT: vfncvt.rtz.xu.f.w v10, v8 60; CHECK-NEXT: vmerge.vim v8, v10, 0, v0 61; CHECK-NEXT: ret 62 %x = call <vscale x 4 x i16> @llvm.fptoui.sat.nxv4f32.nxv4i16(<vscale x 4 x float> %f) 63 ret <vscale x 4 x i16> %x 64} 65 66define <vscale x 8 x i16> @test_signed_v8f32_v8i16(<vscale x 8 x float> %f) { 67; CHECK-LABEL: test_signed_v8f32_v8i16: 68; CHECK: # %bb.0: 69; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 70; CHECK-NEXT: vmfne.vv v0, v8, v8 71; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 72; CHECK-NEXT: vfncvt.rtz.xu.f.w v12, v8 73; CHECK-NEXT: vmerge.vim v8, v12, 0, v0 74; CHECK-NEXT: ret 75 %x = call <vscale x 8 x i16> @llvm.fptoui.sat.nxv8f32.nxv8i16(<vscale x 8 x float> %f) 76 ret <vscale x 8 x i16> %x 77} 78 79define <vscale x 2 x i64> @test_signed_v2f32_v2i64(<vscale x 2 x float> %f) { 80; CHECK-LABEL: test_signed_v2f32_v2i64: 81; CHECK: # %bb.0: 82; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 83; CHECK-NEXT: vmfne.vv v0, v8, v8 84; CHECK-NEXT: vfwcvt.rtz.xu.f.v v10, v8 85; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 86; CHECK-NEXT: vmerge.vim v8, v10, 0, v0 87; CHECK-NEXT: ret 88 %x = call <vscale x 2 x i64> @llvm.fptoui.sat.nxv2f32.nxv2i64(<vscale x 2 x float> %f) 89 ret <vscale x 2 x i64> %x 90} 91 92define <vscale x 4 x i64> @test_signed_v4f32_v4i64(<vscale x 4 x float> %f) { 93; CHECK-LABEL: test_signed_v4f32_v4i64: 94; CHECK: # %bb.0: 95; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 96; CHECK-NEXT: vmfne.vv v0, v8, v8 97; CHECK-NEXT: vfwcvt.rtz.xu.f.v v12, v8 98; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma 99; CHECK-NEXT: vmerge.vim v8, v12, 0, v0 100; CHECK-NEXT: ret 101 %x = call <vscale x 4 x i64> @llvm.fptoui.sat.nxv4f32.nxv4i64(<vscale x 4 x float> %f) 102 ret <vscale x 4 x i64> %x 103} 104 105; Double 106 107declare <vscale x 2 x i32> @llvm.fptoui.sat.nxv2f64.nxv2i32(<vscale x 2 x double>) 108declare <vscale x 4 x i32> @llvm.fptoui.sat.nxv4f64.nxv4i32(<vscale x 4 x double>) 109declare <vscale x 8 x i32> @llvm.fptoui.sat.nxv8f64.nxv8i32(<vscale x 8 x double>) 110declare <vscale x 4 x i16> @llvm.fptoui.sat.nxv4f64.nxv4i16(<vscale x 4 x double>) 111declare <vscale x 8 x i16> @llvm.fptoui.sat.nxv8f64.nxv8i16(<vscale x 8 x double>) 112declare <vscale x 2 x i64> @llvm.fptoui.sat.nxv2f64.nxv2i64(<vscale x 2 x double>) 113declare <vscale x 4 x i64> @llvm.fptoui.sat.nxv4f64.nxv4i64(<vscale x 4 x double>) 114 115define <vscale x 2 x i32> @test_signed_v2f64_v2i32(<vscale x 2 x double> %f) { 116; CHECK-LABEL: test_signed_v2f64_v2i32: 117; CHECK: # %bb.0: 118; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 119; CHECK-NEXT: vmfne.vv v0, v8, v8 120; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 121; CHECK-NEXT: vfncvt.rtz.xu.f.w v10, v8 122; CHECK-NEXT: vmerge.vim v8, v10, 0, v0 123; CHECK-NEXT: ret 124 %x = call <vscale x 2 x i32> @llvm.fptoui.sat.nxv2f64.nxv2i32(<vscale x 2 x double> %f) 125 ret <vscale x 2 x i32> %x 126} 127 128define <vscale x 4 x i32> @test_signed_v4f64_v4i32(<vscale x 4 x double> %f) { 129; CHECK-LABEL: test_signed_v4f64_v4i32: 130; CHECK: # %bb.0: 131; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 132; CHECK-NEXT: vmfne.vv v0, v8, v8 133; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 134; CHECK-NEXT: vfncvt.rtz.xu.f.w v12, v8 135; CHECK-NEXT: vmerge.vim v8, v12, 0, v0 136; CHECK-NEXT: ret 137 %x = call <vscale x 4 x i32> @llvm.fptoui.sat.nxv4f64.nxv4i32(<vscale x 4 x double> %f) 138 ret <vscale x 4 x i32> %x 139} 140 141define <vscale x 8 x i32> @test_signed_v8f64_v8i32(<vscale x 8 x double> %f) { 142; CHECK-LABEL: test_signed_v8f64_v8i32: 143; CHECK: # %bb.0: 144; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 145; CHECK-NEXT: vmfne.vv v0, v8, v8 146; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma 147; CHECK-NEXT: vfncvt.rtz.xu.f.w v16, v8 148; CHECK-NEXT: vmerge.vim v8, v16, 0, v0 149; CHECK-NEXT: ret 150 %x = call <vscale x 8 x i32> @llvm.fptoui.sat.nxv8f64.nxv8i32(<vscale x 8 x double> %f) 151 ret <vscale x 8 x i32> %x 152} 153 154define <vscale x 4 x i16> @test_signed_v4f64_v4i16(<vscale x 4 x double> %f) { 155; CHECK-LABEL: test_signed_v4f64_v4i16: 156; CHECK: # %bb.0: 157; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 158; CHECK-NEXT: vmfne.vv v0, v8, v8 159; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 160; CHECK-NEXT: vfncvt.rtz.xu.f.w v12, v8 161; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 162; CHECK-NEXT: vnclipu.wi v8, v12, 0 163; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 164; CHECK-NEXT: ret 165 %x = call <vscale x 4 x i16> @llvm.fptoui.sat.nxv4f64.nxv4i16(<vscale x 4 x double> %f) 166 ret <vscale x 4 x i16> %x 167} 168 169define <vscale x 8 x i16> @test_signed_v8f64_v8i16(<vscale x 8 x double> %f) { 170; CHECK-LABEL: test_signed_v8f64_v8i16: 171; CHECK: # %bb.0: 172; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 173; CHECK-NEXT: vmfne.vv v0, v8, v8 174; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma 175; CHECK-NEXT: vfncvt.rtz.xu.f.w v16, v8 176; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 177; CHECK-NEXT: vnclipu.wi v8, v16, 0 178; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 179; CHECK-NEXT: ret 180 %x = call <vscale x 8 x i16> @llvm.fptoui.sat.nxv8f64.nxv8i16(<vscale x 8 x double> %f) 181 ret <vscale x 8 x i16> %x 182} 183 184define <vscale x 2 x i64> @test_signed_v2f64_v2i64(<vscale x 2 x double> %f) { 185; CHECK-LABEL: test_signed_v2f64_v2i64: 186; CHECK: # %bb.0: 187; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 188; CHECK-NEXT: vmfne.vv v0, v8, v8 189; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8 190; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 191; CHECK-NEXT: ret 192 %x = call <vscale x 2 x i64> @llvm.fptoui.sat.nxv2f64.nxv2i64(<vscale x 2 x double> %f) 193 ret <vscale x 2 x i64> %x 194} 195 196define <vscale x 4 x i64> @test_signed_v4f64_v4i64(<vscale x 4 x double> %f) { 197; CHECK-LABEL: test_signed_v4f64_v4i64: 198; CHECK: # %bb.0: 199; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 200; CHECK-NEXT: vmfne.vv v0, v8, v8 201; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8 202; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 203; CHECK-NEXT: ret 204 %x = call <vscale x 4 x i64> @llvm.fptoui.sat.nxv4f64.nxv4i64(<vscale x 4 x double> %f) 205 ret <vscale x 4 x i64> %x 206} 207 208 209; half 210 211declare <vscale x 2 x i32> @llvm.fptoui.sat.nxv2f16.nxv2i32(<vscale x 2 x half>) 212declare <vscale x 4 x i32> @llvm.fptoui.sat.nxv4f16.nxv4i32(<vscale x 4 x half>) 213declare <vscale x 8 x i32> @llvm.fptoui.sat.nxv8f16.nxv8i32(<vscale x 8 x half>) 214declare <vscale x 4 x i16> @llvm.fptoui.sat.nxv4f16.nxv4i16(<vscale x 4 x half>) 215declare <vscale x 8 x i16> @llvm.fptoui.sat.nxv8f16.nxv8i16(<vscale x 8 x half>) 216declare <vscale x 2 x i64> @llvm.fptoui.sat.nxv2f16.nxv2i64(<vscale x 2 x half>) 217declare <vscale x 4 x i64> @llvm.fptoui.sat.nxv4f16.nxv4i64(<vscale x 4 x half>) 218 219define <vscale x 2 x i32> @test_signed_v2f16_v2i32(<vscale x 2 x half> %f) { 220; CHECK-LABEL: test_signed_v2f16_v2i32: 221; CHECK: # %bb.0: 222; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 223; CHECK-NEXT: vmfne.vv v0, v8, v8 224; CHECK-NEXT: vfwcvt.rtz.xu.f.v v9, v8 225; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 226; CHECK-NEXT: vmerge.vim v8, v9, 0, v0 227; CHECK-NEXT: ret 228 %x = call <vscale x 2 x i32> @llvm.fptoui.sat.nxv2f16.nxv2i32(<vscale x 2 x half> %f) 229 ret <vscale x 2 x i32> %x 230} 231 232define <vscale x 4 x i32> @test_signed_v4f16_v4i32(<vscale x 4 x half> %f) { 233; CHECK-LABEL: test_signed_v4f16_v4i32: 234; CHECK: # %bb.0: 235; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 236; CHECK-NEXT: vmfne.vv v0, v8, v8 237; CHECK-NEXT: vfwcvt.rtz.xu.f.v v10, v8 238; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 239; CHECK-NEXT: vmerge.vim v8, v10, 0, v0 240; CHECK-NEXT: ret 241 %x = call <vscale x 4 x i32> @llvm.fptoui.sat.nxv4f16.nxv4i32(<vscale x 4 x half> %f) 242 ret <vscale x 4 x i32> %x 243} 244 245define <vscale x 8 x i32> @test_signed_v8f16_v8i32(<vscale x 8 x half> %f) { 246; CHECK-LABEL: test_signed_v8f16_v8i32: 247; CHECK: # %bb.0: 248; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 249; CHECK-NEXT: vmfne.vv v0, v8, v8 250; CHECK-NEXT: vfwcvt.rtz.xu.f.v v12, v8 251; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma 252; CHECK-NEXT: vmerge.vim v8, v12, 0, v0 253; CHECK-NEXT: ret 254 %x = call <vscale x 8 x i32> @llvm.fptoui.sat.nxv8f16.nxv8i32(<vscale x 8 x half> %f) 255 ret <vscale x 8 x i32> %x 256} 257 258define <vscale x 4 x i16> @test_signed_v4f16_v4i16(<vscale x 4 x half> %f) { 259; CHECK-LABEL: test_signed_v4f16_v4i16: 260; CHECK: # %bb.0: 261; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 262; CHECK-NEXT: vmfne.vv v0, v8, v8 263; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8 264; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 265; CHECK-NEXT: ret 266 %x = call <vscale x 4 x i16> @llvm.fptoui.sat.nxv4f16.nxv4i16(<vscale x 4 x half> %f) 267 ret <vscale x 4 x i16> %x 268} 269 270define <vscale x 8 x i16> @test_signed_v8f16_v8i16(<vscale x 8 x half> %f) { 271; CHECK-LABEL: test_signed_v8f16_v8i16: 272; CHECK: # %bb.0: 273; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 274; CHECK-NEXT: vmfne.vv v0, v8, v8 275; CHECK-NEXT: vfcvt.rtz.xu.f.v v8, v8 276; CHECK-NEXT: vmerge.vim v8, v8, 0, v0 277; CHECK-NEXT: ret 278 %x = call <vscale x 8 x i16> @llvm.fptoui.sat.nxv8f16.nxv8i16(<vscale x 8 x half> %f) 279 ret <vscale x 8 x i16> %x 280} 281 282define <vscale x 2 x i64> @test_signed_v2f16_v2i64(<vscale x 2 x half> %f) { 283; CHECK-LABEL: test_signed_v2f16_v2i64: 284; CHECK: # %bb.0: 285; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 286; CHECK-NEXT: vmfne.vv v0, v8, v8 287; CHECK-NEXT: vfwcvt.f.f.v v9, v8 288; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 289; CHECK-NEXT: vfwcvt.rtz.xu.f.v v10, v9 290; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 291; CHECK-NEXT: vmerge.vim v8, v10, 0, v0 292; CHECK-NEXT: ret 293 %x = call <vscale x 2 x i64> @llvm.fptoui.sat.nxv2f16.nxv2i64(<vscale x 2 x half> %f) 294 ret <vscale x 2 x i64> %x 295} 296 297define <vscale x 4 x i64> @test_signed_v4f16_v4i64(<vscale x 4 x half> %f) { 298; CHECK-LABEL: test_signed_v4f16_v4i64: 299; CHECK: # %bb.0: 300; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 301; CHECK-NEXT: vmfne.vv v0, v8, v8 302; CHECK-NEXT: vfwcvt.f.f.v v10, v8 303; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 304; CHECK-NEXT: vfwcvt.rtz.xu.f.v v12, v10 305; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma 306; CHECK-NEXT: vmerge.vim v8, v12, 0, v0 307; CHECK-NEXT: ret 308 %x = call <vscale x 4 x i64> @llvm.fptoui.sat.nxv4f16.nxv4i64(<vscale x 4 x half> %f) 309 ret <vscale x 4 x i64> %x 310} 311;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 312; CHECK32: {{.*}} 313; CHECK64: {{.*}} 314