1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v,+f,+d \ 3; RUN: -target-abi=ilp32d -verify-machineinstrs | FileCheck %s --check-prefix=RV32 4; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv64 -mattr=+v,+f,+d \ 5; RUN: -target-abi=lp64d -verify-machineinstrs | FileCheck %s --check-prefix=RV64-i32 6; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v,+f,+d \ 7; RUN: -target-abi=lp64d -verify-machineinstrs | FileCheck %s --check-prefix=RV64-i64 8 9define <1 x iXLen> @lrint_v1f32(<1 x float> %x, <1 x i1> %m, i32 zeroext %evl) { 10; RV32-LABEL: lrint_v1f32: 11; RV32: # %bb.0: 12; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 13; RV32-NEXT: vfcvt.x.f.v v8, v8, v0.t 14; RV32-NEXT: ret 15; 16; RV64-i32-LABEL: lrint_v1f32: 17; RV64-i32: # %bb.0: 18; RV64-i32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 19; RV64-i32-NEXT: vfcvt.x.f.v v8, v8, v0.t 20; RV64-i32-NEXT: ret 21; 22; RV64-i64-LABEL: lrint_v1f32: 23; RV64-i64: # %bb.0: 24; RV64-i64-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 25; RV64-i64-NEXT: vfwcvt.x.f.v v9, v8, v0.t 26; RV64-i64-NEXT: vmv1r.v v8, v9 27; RV64-i64-NEXT: ret 28 %a = call <1 x iXLen> @llvm.vp.lrint.v1iXLen.v1f32(<1 x float> %x, <1 x i1> %m, i32 %evl) 29 ret <1 x iXLen> %a 30} 31declare <1 x iXLen> @llvm.vp.lrint.v1iXLen.v1f32(<1 x float>, <1 x i1>, i32) 32 33define <2 x iXLen> @lrint_v2f32(<2 x float> %x, <2 x i1> %m, i32 zeroext %evl) { 34; RV32-LABEL: lrint_v2f32: 35; RV32: # %bb.0: 36; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 37; RV32-NEXT: vfcvt.x.f.v v8, v8, v0.t 38; RV32-NEXT: ret 39; 40; RV64-i32-LABEL: lrint_v2f32: 41; RV64-i32: # %bb.0: 42; RV64-i32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 43; RV64-i32-NEXT: vfcvt.x.f.v v8, v8, v0.t 44; RV64-i32-NEXT: ret 45; 46; RV64-i64-LABEL: lrint_v2f32: 47; RV64-i64: # %bb.0: 48; RV64-i64-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 49; RV64-i64-NEXT: vfwcvt.x.f.v v9, v8, v0.t 50; RV64-i64-NEXT: vmv1r.v v8, v9 51; RV64-i64-NEXT: ret 52 %a = call <2 x iXLen> @llvm.vp.lrint.v2iXLen.v2f32(<2 x float> %x, <2 x i1> %m, i32 %evl) 53 ret <2 x iXLen> %a 54} 55declare <2 x iXLen> @llvm.vp.lrint.v2iXLen.v2f32(<2 x float>, <2 x i1>, i32) 56 57define <3 x iXLen> @lrint_v3f32(<3 x float> %x, <3 x i1> %m, i32 zeroext %evl) { 58; RV32-LABEL: lrint_v3f32: 59; RV32: # %bb.0: 60; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, ma 61; RV32-NEXT: vfcvt.x.f.v v8, v8, v0.t 62; RV32-NEXT: ret 63; 64; RV64-i32-LABEL: lrint_v3f32: 65; RV64-i32: # %bb.0: 66; RV64-i32-NEXT: vsetvli zero, a0, e32, m1, ta, ma 67; RV64-i32-NEXT: vfcvt.x.f.v v8, v8, v0.t 68; RV64-i32-NEXT: ret 69; 70; RV64-i64-LABEL: lrint_v3f32: 71; RV64-i64: # %bb.0: 72; RV64-i64-NEXT: vsetvli zero, a0, e32, m1, ta, ma 73; RV64-i64-NEXT: vfwcvt.x.f.v v10, v8, v0.t 74; RV64-i64-NEXT: vmv2r.v v8, v10 75; RV64-i64-NEXT: ret 76 %a = call <3 x iXLen> @llvm.vp.lrint.v3iXLen.v3f32(<3 x float> %x, <3 x i1> %m, i32 %evl) 77 ret <3 x iXLen> %a 78} 79declare <3 x iXLen> @llvm.vp.lrint.v3iXLen.v3f32(<3 x float>, <3 x i1>, i32) 80 81define <4 x iXLen> @lrint_v4f32(<4 x float> %x, <4 x i1> %m, i32 zeroext %evl) { 82; RV32-LABEL: lrint_v4f32: 83; RV32: # %bb.0: 84; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, ma 85; RV32-NEXT: vfcvt.x.f.v v8, v8, v0.t 86; RV32-NEXT: ret 87; 88; RV64-i32-LABEL: lrint_v4f32: 89; RV64-i32: # %bb.0: 90; RV64-i32-NEXT: vsetvli zero, a0, e32, m1, ta, ma 91; RV64-i32-NEXT: vfcvt.x.f.v v8, v8, v0.t 92; RV64-i32-NEXT: ret 93; 94; RV64-i64-LABEL: lrint_v4f32: 95; RV64-i64: # %bb.0: 96; RV64-i64-NEXT: vsetvli zero, a0, e32, m1, ta, ma 97; RV64-i64-NEXT: vfwcvt.x.f.v v10, v8, v0.t 98; RV64-i64-NEXT: vmv2r.v v8, v10 99; RV64-i64-NEXT: ret 100 %a = call <4 x iXLen> @llvm.vp.lrint.v4iXLen.v4f32(<4 x float> %x, <4 x i1> %m, i32 %evl) 101 ret <4 x iXLen> %a 102} 103declare <4 x iXLen> @llvm.vp.lrint.v4iXLen.v4f32(<4 x float>, <4 x i1>, i32) 104 105define <8 x iXLen> @lrint_v8f32(<8 x float> %x, <8 x i1> %m, i32 zeroext %evl) { 106; RV32-LABEL: lrint_v8f32: 107; RV32: # %bb.0: 108; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, ma 109; RV32-NEXT: vfcvt.x.f.v v8, v8, v0.t 110; RV32-NEXT: ret 111; 112; RV64-i32-LABEL: lrint_v8f32: 113; RV64-i32: # %bb.0: 114; RV64-i32-NEXT: vsetvli zero, a0, e32, m2, ta, ma 115; RV64-i32-NEXT: vfcvt.x.f.v v8, v8, v0.t 116; RV64-i32-NEXT: ret 117; 118; RV64-i64-LABEL: lrint_v8f32: 119; RV64-i64: # %bb.0: 120; RV64-i64-NEXT: vsetvli zero, a0, e32, m2, ta, ma 121; RV64-i64-NEXT: vfwcvt.x.f.v v12, v8, v0.t 122; RV64-i64-NEXT: vmv4r.v v8, v12 123; RV64-i64-NEXT: ret 124 %a = call <8 x iXLen> @llvm.vp.lrint.v8iXLen.v8f32(<8 x float> %x, <8 x i1> %m, i32 %evl) 125 ret <8 x iXLen> %a 126} 127declare <8 x iXLen> @llvm.vp.lrint.v8iXLen.v8f32(<8 x float>, <8 x i1>, i32) 128 129define <16 x iXLen> @lrint_v16f32(<16 x float> %x, <16 x i1> %m, i32 zeroext %evl) { 130; RV32-LABEL: lrint_v16f32: 131; RV32: # %bb.0: 132; RV32-NEXT: vsetvli zero, a0, e32, m4, ta, ma 133; RV32-NEXT: vfcvt.x.f.v v8, v8, v0.t 134; RV32-NEXT: ret 135; 136; RV64-i32-LABEL: lrint_v16f32: 137; RV64-i32: # %bb.0: 138; RV64-i32-NEXT: vsetvli zero, a0, e32, m4, ta, ma 139; RV64-i32-NEXT: vfcvt.x.f.v v8, v8, v0.t 140; RV64-i32-NEXT: ret 141; 142; RV64-i64-LABEL: lrint_v16f32: 143; RV64-i64: # %bb.0: 144; RV64-i64-NEXT: vsetvli zero, a0, e32, m4, ta, ma 145; RV64-i64-NEXT: vfwcvt.x.f.v v16, v8, v0.t 146; RV64-i64-NEXT: vmv8r.v v8, v16 147; RV64-i64-NEXT: ret 148 %a = call <16 x iXLen> @llvm.vp.lrint.v16iXLen.v16f32(<16 x float> %x, <16 x i1> %m, i32 %evl) 149 ret <16 x iXLen> %a 150} 151declare <16 x iXLen> @llvm.vp.lrint.v16iXLen.v16f32(<16 x float>, <16 x i1>, i32) 152 153define <1 x iXLen> @lrint_v1f64(<1 x double> %x, <1 x i1> %m, i32 zeroext %evl) { 154; RV32-LABEL: lrint_v1f64: 155; RV32: # %bb.0: 156; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 157; RV32-NEXT: vfncvt.x.f.w v9, v8, v0.t 158; RV32-NEXT: vmv1r.v v8, v9 159; RV32-NEXT: ret 160; 161; RV64-i32-LABEL: lrint_v1f64: 162; RV64-i32: # %bb.0: 163; RV64-i32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 164; RV64-i32-NEXT: vfncvt.x.f.w v9, v8, v0.t 165; RV64-i32-NEXT: vmv1r.v v8, v9 166; RV64-i32-NEXT: ret 167; 168; RV64-i64-LABEL: lrint_v1f64: 169; RV64-i64: # %bb.0: 170; RV64-i64-NEXT: vsetvli zero, a0, e64, m1, ta, ma 171; RV64-i64-NEXT: vfcvt.x.f.v v8, v8, v0.t 172; RV64-i64-NEXT: ret 173 %a = call <1 x iXLen> @llvm.vp.lrint.v1iXLen.v1f64(<1 x double> %x, <1 x i1> %m, i32 %evl) 174 ret <1 x iXLen> %a 175} 176declare <1 x iXLen> @llvm.vp.lrint.v1iXLen.v1f64(<1 x double>, <1 x i1>, i32) 177 178define <2 x iXLen> @lrint_v2f64(<2 x double> %x, <2 x i1> %m, i32 zeroext %evl) { 179; RV32-LABEL: lrint_v2f64: 180; RV32: # %bb.0: 181; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 182; RV32-NEXT: vfncvt.x.f.w v9, v8, v0.t 183; RV32-NEXT: vmv1r.v v8, v9 184; RV32-NEXT: ret 185; 186; RV64-i32-LABEL: lrint_v2f64: 187; RV64-i32: # %bb.0: 188; RV64-i32-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 189; RV64-i32-NEXT: vfncvt.x.f.w v9, v8, v0.t 190; RV64-i32-NEXT: vmv1r.v v8, v9 191; RV64-i32-NEXT: ret 192; 193; RV64-i64-LABEL: lrint_v2f64: 194; RV64-i64: # %bb.0: 195; RV64-i64-NEXT: vsetvli zero, a0, e64, m1, ta, ma 196; RV64-i64-NEXT: vfcvt.x.f.v v8, v8, v0.t 197; RV64-i64-NEXT: ret 198 %a = call <2 x iXLen> @llvm.vp.lrint.v2iXLen.v2f64(<2 x double> %x, <2 x i1> %m, i32 %evl) 199 ret <2 x iXLen> %a 200} 201declare <2 x iXLen> @llvm.vp.lrint.v2iXLen.v2f64(<2 x double>, <2 x i1>, i32) 202 203define <4 x iXLen> @lrint_v4f64(<4 x double> %x, <4 x i1> %m, i32 zeroext %evl) { 204; RV32-LABEL: lrint_v4f64: 205; RV32: # %bb.0: 206; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, ma 207; RV32-NEXT: vfncvt.x.f.w v10, v8, v0.t 208; RV32-NEXT: vmv.v.v v8, v10 209; RV32-NEXT: ret 210; 211; RV64-i32-LABEL: lrint_v4f64: 212; RV64-i32: # %bb.0: 213; RV64-i32-NEXT: vsetvli zero, a0, e32, m1, ta, ma 214; RV64-i32-NEXT: vfncvt.x.f.w v10, v8, v0.t 215; RV64-i32-NEXT: vmv.v.v v8, v10 216; RV64-i32-NEXT: ret 217; 218; RV64-i64-LABEL: lrint_v4f64: 219; RV64-i64: # %bb.0: 220; RV64-i64-NEXT: vsetvli zero, a0, e64, m2, ta, ma 221; RV64-i64-NEXT: vfcvt.x.f.v v8, v8, v0.t 222; RV64-i64-NEXT: ret 223 %a = call <4 x iXLen> @llvm.vp.lrint.v4iXLen.v4f64(<4 x double> %x, <4 x i1> %m, i32 %evl) 224 ret <4 x iXLen> %a 225} 226declare <4 x iXLen> @llvm.vp.lrint.v4iXLen.v4f64(<4 x double>, <4 x i1>, i32) 227 228define <8 x iXLen> @lrint_v8f64(<8 x double> %x, <8 x i1> %m, i32 zeroext %evl) { 229; RV32-LABEL: lrint_v8f64: 230; RV32: # %bb.0: 231; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, ma 232; RV32-NEXT: vfncvt.x.f.w v12, v8, v0.t 233; RV32-NEXT: vmv.v.v v8, v12 234; RV32-NEXT: ret 235; 236; RV64-i32-LABEL: lrint_v8f64: 237; RV64-i32: # %bb.0: 238; RV64-i32-NEXT: vsetvli zero, a0, e32, m2, ta, ma 239; RV64-i32-NEXT: vfncvt.x.f.w v12, v8, v0.t 240; RV64-i32-NEXT: vmv.v.v v8, v12 241; RV64-i32-NEXT: ret 242; 243; RV64-i64-LABEL: lrint_v8f64: 244; RV64-i64: # %bb.0: 245; RV64-i64-NEXT: vsetvli zero, a0, e64, m4, ta, ma 246; RV64-i64-NEXT: vfcvt.x.f.v v8, v8, v0.t 247; RV64-i64-NEXT: ret 248 %a = call <8 x iXLen> @llvm.vp.lrint.v8iXLen.v8f64(<8 x double> %x, <8 x i1> %m, i32 %evl) 249 ret <8 x iXLen> %a 250} 251declare <8 x iXLen> @llvm.vp.lrint.v8iXLen.v8f64(<8 x double>, <8 x i1>, i32) 252