1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+v < %s | FileCheck %s 3; RUN: llc -mtriple=riscv64 -mattr=+v < %s | FileCheck %s 4 5declare <vscale x 2 x i16> @llvm.vp.sext.nxv2i16.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i1>, i32) 6 7define <vscale x 2 x i16> @vsext_nxv2i8_nxv2i16(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 8; CHECK-LABEL: vsext_nxv2i8_nxv2i16: 9; CHECK: # %bb.0: 10; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 11; CHECK-NEXT: vsext.vf2 v9, v8, v0.t 12; CHECK-NEXT: vmv1r.v v8, v9 13; CHECK-NEXT: ret 14 %v = call <vscale x 2 x i16> @llvm.vp.sext.nxv2i16.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 %vl) 15 ret <vscale x 2 x i16> %v 16} 17 18define <vscale x 2 x i16> @vsext_nxv2i8_nxv2i16_unmasked(<vscale x 2 x i8> %a, i32 zeroext %vl) { 19; CHECK-LABEL: vsext_nxv2i8_nxv2i16_unmasked: 20; CHECK: # %bb.0: 21; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 22; CHECK-NEXT: vsext.vf2 v9, v8 23; CHECK-NEXT: vmv1r.v v8, v9 24; CHECK-NEXT: ret 25 %v = call <vscale x 2 x i16> @llvm.vp.sext.nxv2i16.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 26 ret <vscale x 2 x i16> %v 27} 28 29declare <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i1>, i32) 30 31define <vscale x 2 x i32> @vsext_nxv2i8_nxv2i32(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 32; CHECK-LABEL: vsext_nxv2i8_nxv2i32: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 35; CHECK-NEXT: vsext.vf4 v9, v8, v0.t 36; CHECK-NEXT: vmv.v.v v8, v9 37; CHECK-NEXT: ret 38 %v = call <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 %vl) 39 ret <vscale x 2 x i32> %v 40} 41 42define <vscale x 2 x i32> @vsext_nxv2i8_nxv2i32_unmasked(<vscale x 2 x i8> %a, i32 zeroext %vl) { 43; CHECK-LABEL: vsext_nxv2i8_nxv2i32_unmasked: 44; CHECK: # %bb.0: 45; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 46; CHECK-NEXT: vsext.vf4 v9, v8 47; CHECK-NEXT: vmv.v.v v8, v9 48; CHECK-NEXT: ret 49 %v = call <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 50 ret <vscale x 2 x i32> %v 51} 52 53declare <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i1>, i32) 54 55define <vscale x 2 x i64> @vsext_nxv2i8_nxv2i64(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 56; CHECK-LABEL: vsext_nxv2i8_nxv2i64: 57; CHECK: # %bb.0: 58; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 59; CHECK-NEXT: vsext.vf8 v10, v8, v0.t 60; CHECK-NEXT: vmv.v.v v8, v10 61; CHECK-NEXT: ret 62 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 %vl) 63 ret <vscale x 2 x i64> %v 64} 65 66define <vscale x 2 x i64> @vsext_nxv2i8_nxv2i64_unmasked(<vscale x 2 x i8> %a, i32 zeroext %vl) { 67; CHECK-LABEL: vsext_nxv2i8_nxv2i64_unmasked: 68; CHECK: # %bb.0: 69; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 70; CHECK-NEXT: vsext.vf8 v10, v8 71; CHECK-NEXT: vmv.v.v v8, v10 72; CHECK-NEXT: ret 73 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 74 ret <vscale x 2 x i64> %v 75} 76 77declare <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i1>, i32) 78 79define <vscale x 2 x i32> @vsext_nxv2i16_nxv2i32(<vscale x 2 x i16> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 80; CHECK-LABEL: vsext_nxv2i16_nxv2i32: 81; CHECK: # %bb.0: 82; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 83; CHECK-NEXT: vsext.vf2 v9, v8, v0.t 84; CHECK-NEXT: vmv.v.v v8, v9 85; CHECK-NEXT: ret 86 %v = call <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i1> %m, i32 %vl) 87 ret <vscale x 2 x i32> %v 88} 89 90define <vscale x 2 x i32> @vsext_nxv2i16_nxv2i32_unmasked(<vscale x 2 x i16> %a, i32 zeroext %vl) { 91; CHECK-LABEL: vsext_nxv2i16_nxv2i32_unmasked: 92; CHECK: # %bb.0: 93; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 94; CHECK-NEXT: vsext.vf2 v9, v8 95; CHECK-NEXT: vmv.v.v v8, v9 96; CHECK-NEXT: ret 97 %v = call <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 98 ret <vscale x 2 x i32> %v 99} 100 101declare <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i1>, i32) 102 103define <vscale x 2 x i64> @vsext_nxv2i16_nxv2i64(<vscale x 2 x i16> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 104; CHECK-LABEL: vsext_nxv2i16_nxv2i64: 105; CHECK: # %bb.0: 106; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 107; CHECK-NEXT: vsext.vf4 v10, v8, v0.t 108; CHECK-NEXT: vmv.v.v v8, v10 109; CHECK-NEXT: ret 110 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i1> %m, i32 %vl) 111 ret <vscale x 2 x i64> %v 112} 113 114define <vscale x 2 x i64> @vsext_nxv2i16_nxv2i64_unmasked(<vscale x 2 x i16> %a, i32 zeroext %vl) { 115; CHECK-LABEL: vsext_nxv2i16_nxv2i64_unmasked: 116; CHECK: # %bb.0: 117; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 118; CHECK-NEXT: vsext.vf4 v10, v8 119; CHECK-NEXT: vmv.v.v v8, v10 120; CHECK-NEXT: ret 121 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 122 ret <vscale x 2 x i64> %v 123} 124 125declare <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i1>, i32) 126 127define <vscale x 2 x i64> @vsext_nxv2i32_nxv2i64(<vscale x 2 x i32> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 128; CHECK-LABEL: vsext_nxv2i32_nxv2i64: 129; CHECK: # %bb.0: 130; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 131; CHECK-NEXT: vsext.vf2 v10, v8, v0.t 132; CHECK-NEXT: vmv.v.v v8, v10 133; CHECK-NEXT: ret 134 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i1> %m, i32 %vl) 135 ret <vscale x 2 x i64> %v 136} 137 138define <vscale x 2 x i64> @vsext_nxv2i32_nxv2i64_unmasked(<vscale x 2 x i32> %a, i32 zeroext %vl) { 139; CHECK-LABEL: vsext_nxv2i32_nxv2i64_unmasked: 140; CHECK: # %bb.0: 141; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 142; CHECK-NEXT: vsext.vf2 v10, v8 143; CHECK-NEXT: vmv.v.v v8, v10 144; CHECK-NEXT: ret 145 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 146 ret <vscale x 2 x i64> %v 147} 148 149declare <vscale x 32 x i32> @llvm.vp.sext.nxv32i32.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i1>, i32) 150 151define <vscale x 32 x i32> @vsext_nxv32i8_nxv32i32(<vscale x 32 x i8> %a, <vscale x 32 x i1> %m, i32 zeroext %vl) { 152; CHECK-LABEL: vsext_nxv32i8_nxv32i32: 153; CHECK: # %bb.0: 154; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 155; CHECK-NEXT: vmv1r.v v12, v0 156; CHECK-NEXT: csrr a1, vlenb 157; CHECK-NEXT: srli a2, a1, 2 158; CHECK-NEXT: slli a1, a1, 1 159; CHECK-NEXT: vslidedown.vx v0, v0, a2 160; CHECK-NEXT: sub a2, a0, a1 161; CHECK-NEXT: sltu a3, a0, a2 162; CHECK-NEXT: addi a3, a3, -1 163; CHECK-NEXT: and a2, a3, a2 164; CHECK-NEXT: vsetvli zero, a2, e32, m8, ta, ma 165; CHECK-NEXT: vsext.vf4 v16, v10, v0.t 166; CHECK-NEXT: bltu a0, a1, .LBB12_2 167; CHECK-NEXT: # %bb.1: 168; CHECK-NEXT: mv a0, a1 169; CHECK-NEXT: .LBB12_2: 170; CHECK-NEXT: vmv1r.v v0, v12 171; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 172; CHECK-NEXT: vsext.vf4 v24, v8, v0.t 173; CHECK-NEXT: vmv.v.v v8, v24 174; CHECK-NEXT: ret 175 %v = call <vscale x 32 x i32> @llvm.vp.sext.nxv32i32.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i1> %m, i32 %vl) 176 ret <vscale x 32 x i32> %v 177} 178 179define <vscale x 32 x i32> @vsext_nxv32i8_nxv32i32_unmasked(<vscale x 32 x i8> %a, i32 zeroext %vl) { 180; CHECK-LABEL: vsext_nxv32i8_nxv32i32_unmasked: 181; CHECK: # %bb.0: 182; CHECK-NEXT: csrr a1, vlenb 183; CHECK-NEXT: slli a1, a1, 1 184; CHECK-NEXT: sub a2, a0, a1 185; CHECK-NEXT: sltu a3, a0, a2 186; CHECK-NEXT: addi a3, a3, -1 187; CHECK-NEXT: and a2, a3, a2 188; CHECK-NEXT: vsetvli zero, a2, e32, m8, ta, ma 189; CHECK-NEXT: vsext.vf4 v16, v10 190; CHECK-NEXT: bltu a0, a1, .LBB13_2 191; CHECK-NEXT: # %bb.1: 192; CHECK-NEXT: mv a0, a1 193; CHECK-NEXT: .LBB13_2: 194; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 195; CHECK-NEXT: vsext.vf4 v24, v8 196; CHECK-NEXT: vmv.v.v v8, v24 197; CHECK-NEXT: ret 198 %v = call <vscale x 32 x i32> @llvm.vp.sext.nxv32i32.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i1> splat (i1 true), i32 %vl) 199 ret <vscale x 32 x i32> %v 200} 201