1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+experimental-zfh,+experimental-v \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 4; RUN: llc -mtriple=riscv64 -mattr=+d,+experimental-zfh,+experimental-v \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 6 7declare <vscale x 1 x i8> @llvm.vp.gather.nxv1i8.nxv1p0i8(<vscale x 1 x i8*>, <vscale x 1 x i1>, i32) 8 9define <vscale x 1 x i8> @vpgather_nxv1i8(<vscale x 1 x i8*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) { 10; RV32-LABEL: vpgather_nxv1i8: 11; RV32: # %bb.0: 12; RV32-NEXT: vsetvli zero, a0, e8, mf8, ta, mu 13; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 14; RV32-NEXT: vmv1r.v v8, v9 15; RV32-NEXT: ret 16; 17; RV64-LABEL: vpgather_nxv1i8: 18; RV64: # %bb.0: 19; RV64-NEXT: vsetvli zero, a0, e8, mf8, ta, mu 20; RV64-NEXT: vluxei64.v v9, (zero), v8, v0.t 21; RV64-NEXT: vmv1r.v v8, v9 22; RV64-NEXT: ret 23 %v = call <vscale x 1 x i8> @llvm.vp.gather.nxv1i8.nxv1p0i8(<vscale x 1 x i8*> %ptrs, <vscale x 1 x i1> %m, i32 %evl) 24 ret <vscale x 1 x i8> %v 25} 26 27declare <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*>, <vscale x 2 x i1>, i32) 28 29define <vscale x 2 x i8> @vpgather_nxv2i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 30; RV32-LABEL: vpgather_nxv2i8: 31; RV32: # %bb.0: 32; RV32-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 33; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 34; RV32-NEXT: vmv1r.v v8, v9 35; RV32-NEXT: ret 36; 37; RV64-LABEL: vpgather_nxv2i8: 38; RV64: # %bb.0: 39; RV64-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 40; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 41; RV64-NEXT: vmv1r.v v8, v10 42; RV64-NEXT: ret 43 %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 44 ret <vscale x 2 x i8> %v 45} 46 47define <vscale x 2 x i16> @vpgather_nxv2i8_sextload_nxv2i16(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 48; RV32-LABEL: vpgather_nxv2i8_sextload_nxv2i16: 49; RV32: # %bb.0: 50; RV32-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 51; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 52; RV32-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 53; RV32-NEXT: vsext.vf2 v8, v9 54; RV32-NEXT: ret 55; 56; RV64-LABEL: vpgather_nxv2i8_sextload_nxv2i16: 57; RV64: # %bb.0: 58; RV64-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 59; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 60; RV64-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 61; RV64-NEXT: vsext.vf2 v8, v10 62; RV64-NEXT: ret 63 %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 64 %ev = sext <vscale x 2 x i8> %v to <vscale x 2 x i16> 65 ret <vscale x 2 x i16> %ev 66} 67 68define <vscale x 2 x i16> @vpgather_nxv2i8_zextload_nxv2i16(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 69; RV32-LABEL: vpgather_nxv2i8_zextload_nxv2i16: 70; RV32: # %bb.0: 71; RV32-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 72; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 73; RV32-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 74; RV32-NEXT: vzext.vf2 v8, v9 75; RV32-NEXT: ret 76; 77; RV64-LABEL: vpgather_nxv2i8_zextload_nxv2i16: 78; RV64: # %bb.0: 79; RV64-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 80; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 81; RV64-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 82; RV64-NEXT: vzext.vf2 v8, v10 83; RV64-NEXT: ret 84 %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 85 %ev = zext <vscale x 2 x i8> %v to <vscale x 2 x i16> 86 ret <vscale x 2 x i16> %ev 87} 88 89define <vscale x 2 x i32> @vpgather_nxv2i8_sextload_nxv2i32(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 90; RV32-LABEL: vpgather_nxv2i8_sextload_nxv2i32: 91; RV32: # %bb.0: 92; RV32-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 93; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 94; RV32-NEXT: vsetvli a0, zero, e32, m1, ta, mu 95; RV32-NEXT: vsext.vf4 v8, v9 96; RV32-NEXT: ret 97; 98; RV64-LABEL: vpgather_nxv2i8_sextload_nxv2i32: 99; RV64: # %bb.0: 100; RV64-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 101; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 102; RV64-NEXT: vsetvli a0, zero, e32, m1, ta, mu 103; RV64-NEXT: vsext.vf4 v8, v10 104; RV64-NEXT: ret 105 %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 106 %ev = sext <vscale x 2 x i8> %v to <vscale x 2 x i32> 107 ret <vscale x 2 x i32> %ev 108} 109 110define <vscale x 2 x i32> @vpgather_nxv2i8_zextload_nxv2i32(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 111; RV32-LABEL: vpgather_nxv2i8_zextload_nxv2i32: 112; RV32: # %bb.0: 113; RV32-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 114; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 115; RV32-NEXT: vsetvli a0, zero, e32, m1, ta, mu 116; RV32-NEXT: vzext.vf4 v8, v9 117; RV32-NEXT: ret 118; 119; RV64-LABEL: vpgather_nxv2i8_zextload_nxv2i32: 120; RV64: # %bb.0: 121; RV64-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 122; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 123; RV64-NEXT: vsetvli a0, zero, e32, m1, ta, mu 124; RV64-NEXT: vzext.vf4 v8, v10 125; RV64-NEXT: ret 126 %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 127 %ev = zext <vscale x 2 x i8> %v to <vscale x 2 x i32> 128 ret <vscale x 2 x i32> %ev 129} 130 131define <vscale x 2 x i64> @vpgather_nxv2i8_sextload_nxv2i64(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 132; RV32-LABEL: vpgather_nxv2i8_sextload_nxv2i64: 133; RV32: # %bb.0: 134; RV32-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 135; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 136; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 137; RV32-NEXT: vsext.vf8 v8, v10 138; RV32-NEXT: ret 139; 140; RV64-LABEL: vpgather_nxv2i8_sextload_nxv2i64: 141; RV64: # %bb.0: 142; RV64-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 143; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 144; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 145; RV64-NEXT: vsext.vf8 v8, v10 146; RV64-NEXT: ret 147 %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 148 %ev = sext <vscale x 2 x i8> %v to <vscale x 2 x i64> 149 ret <vscale x 2 x i64> %ev 150} 151 152define <vscale x 2 x i64> @vpgather_nxv2i8_zextload_nxv2i64(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 153; RV32-LABEL: vpgather_nxv2i8_zextload_nxv2i64: 154; RV32: # %bb.0: 155; RV32-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 156; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 157; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 158; RV32-NEXT: vzext.vf8 v8, v10 159; RV32-NEXT: ret 160; 161; RV64-LABEL: vpgather_nxv2i8_zextload_nxv2i64: 162; RV64: # %bb.0: 163; RV64-NEXT: vsetvli zero, a0, e8, mf4, ta, mu 164; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 165; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 166; RV64-NEXT: vzext.vf8 v8, v10 167; RV64-NEXT: ret 168 %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 169 %ev = zext <vscale x 2 x i8> %v to <vscale x 2 x i64> 170 ret <vscale x 2 x i64> %ev 171} 172 173declare <vscale x 4 x i8> @llvm.vp.gather.nxv4i8.nxv4p0i8(<vscale x 4 x i8*>, <vscale x 4 x i1>, i32) 174 175define <vscale x 4 x i8> @vpgather_nxv4i8(<vscale x 4 x i8*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) { 176; RV32-LABEL: vpgather_nxv4i8: 177; RV32: # %bb.0: 178; RV32-NEXT: vsetvli zero, a0, e8, mf2, ta, mu 179; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 180; RV32-NEXT: vmv1r.v v8, v10 181; RV32-NEXT: ret 182; 183; RV64-LABEL: vpgather_nxv4i8: 184; RV64: # %bb.0: 185; RV64-NEXT: vsetvli zero, a0, e8, mf2, ta, mu 186; RV64-NEXT: vluxei64.v v12, (zero), v8, v0.t 187; RV64-NEXT: vmv1r.v v8, v12 188; RV64-NEXT: ret 189 %v = call <vscale x 4 x i8> @llvm.vp.gather.nxv4i8.nxv4p0i8(<vscale x 4 x i8*> %ptrs, <vscale x 4 x i1> %m, i32 %evl) 190 ret <vscale x 4 x i8> %v 191} 192 193define <vscale x 4 x i8> @vpgather_truemask_nxv4i8(<vscale x 4 x i8*> %ptrs, i32 zeroext %evl) { 194; RV32-LABEL: vpgather_truemask_nxv4i8: 195; RV32: # %bb.0: 196; RV32-NEXT: vsetvli zero, a0, e8, mf2, ta, mu 197; RV32-NEXT: vluxei32.v v10, (zero), v8 198; RV32-NEXT: vmv1r.v v8, v10 199; RV32-NEXT: ret 200; 201; RV64-LABEL: vpgather_truemask_nxv4i8: 202; RV64: # %bb.0: 203; RV64-NEXT: vsetvli zero, a0, e8, mf2, ta, mu 204; RV64-NEXT: vluxei64.v v12, (zero), v8 205; RV64-NEXT: vmv1r.v v8, v12 206; RV64-NEXT: ret 207 %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0 208 %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer 209 %v = call <vscale x 4 x i8> @llvm.vp.gather.nxv4i8.nxv4p0i8(<vscale x 4 x i8*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl) 210 ret <vscale x 4 x i8> %v 211} 212 213declare <vscale x 8 x i8> @llvm.vp.gather.nxv8i8.nxv8p0i8(<vscale x 8 x i8*>, <vscale x 8 x i1>, i32) 214 215define <vscale x 8 x i8> @vpgather_nxv8i8(<vscale x 8 x i8*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 216; RV32-LABEL: vpgather_nxv8i8: 217; RV32: # %bb.0: 218; RV32-NEXT: vsetvli zero, a0, e8, m1, ta, mu 219; RV32-NEXT: vluxei32.v v12, (zero), v8, v0.t 220; RV32-NEXT: vmv1r.v v8, v12 221; RV32-NEXT: ret 222; 223; RV64-LABEL: vpgather_nxv8i8: 224; RV64: # %bb.0: 225; RV64-NEXT: vsetvli zero, a0, e8, m1, ta, mu 226; RV64-NEXT: vluxei64.v v16, (zero), v8, v0.t 227; RV64-NEXT: vmv1r.v v8, v16 228; RV64-NEXT: ret 229 %v = call <vscale x 8 x i8> @llvm.vp.gather.nxv8i8.nxv8p0i8(<vscale x 8 x i8*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 230 ret <vscale x 8 x i8> %v 231} 232 233define <vscale x 8 x i8> @vpgather_baseidx_nxv8i8(i8* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 234; RV32-LABEL: vpgather_baseidx_nxv8i8: 235; RV32: # %bb.0: 236; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 237; RV32-NEXT: vsext.vf4 v12, v8 238; RV32-NEXT: vsetvli zero, a1, e8, m1, ta, mu 239; RV32-NEXT: vluxei32.v v8, (a0), v12, v0.t 240; RV32-NEXT: ret 241; 242; RV64-LABEL: vpgather_baseidx_nxv8i8: 243; RV64: # %bb.0: 244; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 245; RV64-NEXT: vsext.vf8 v16, v8 246; RV64-NEXT: vsetvli zero, a1, e8, m1, ta, mu 247; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 248; RV64-NEXT: ret 249 %ptrs = getelementptr inbounds i8, i8* %base, <vscale x 8 x i8> %idxs 250 %v = call <vscale x 8 x i8> @llvm.vp.gather.nxv8i8.nxv8p0i8(<vscale x 8 x i8*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 251 ret <vscale x 8 x i8> %v 252} 253 254declare <vscale x 1 x i16> @llvm.vp.gather.nxv1i16.nxv1p0i16(<vscale x 1 x i16*>, <vscale x 1 x i1>, i32) 255 256define <vscale x 1 x i16> @vpgather_nxv1i16(<vscale x 1 x i16*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) { 257; RV32-LABEL: vpgather_nxv1i16: 258; RV32: # %bb.0: 259; RV32-NEXT: vsetvli zero, a0, e16, mf4, ta, mu 260; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 261; RV32-NEXT: vmv1r.v v8, v9 262; RV32-NEXT: ret 263; 264; RV64-LABEL: vpgather_nxv1i16: 265; RV64: # %bb.0: 266; RV64-NEXT: vsetvli zero, a0, e16, mf4, ta, mu 267; RV64-NEXT: vluxei64.v v9, (zero), v8, v0.t 268; RV64-NEXT: vmv1r.v v8, v9 269; RV64-NEXT: ret 270 %v = call <vscale x 1 x i16> @llvm.vp.gather.nxv1i16.nxv1p0i16(<vscale x 1 x i16*> %ptrs, <vscale x 1 x i1> %m, i32 %evl) 271 ret <vscale x 1 x i16> %v 272} 273 274declare <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*>, <vscale x 2 x i1>, i32) 275 276define <vscale x 2 x i16> @vpgather_nxv2i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 277; RV32-LABEL: vpgather_nxv2i16: 278; RV32: # %bb.0: 279; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 280; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 281; RV32-NEXT: vmv1r.v v8, v9 282; RV32-NEXT: ret 283; 284; RV64-LABEL: vpgather_nxv2i16: 285; RV64: # %bb.0: 286; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 287; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 288; RV64-NEXT: vmv1r.v v8, v10 289; RV64-NEXT: ret 290 %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 291 ret <vscale x 2 x i16> %v 292} 293 294define <vscale x 2 x i32> @vpgather_nxv2i16_sextload_nxv2i32(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 295; RV32-LABEL: vpgather_nxv2i16_sextload_nxv2i32: 296; RV32: # %bb.0: 297; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 298; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 299; RV32-NEXT: vsetvli a0, zero, e32, m1, ta, mu 300; RV32-NEXT: vsext.vf2 v8, v9 301; RV32-NEXT: ret 302; 303; RV64-LABEL: vpgather_nxv2i16_sextload_nxv2i32: 304; RV64: # %bb.0: 305; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 306; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 307; RV64-NEXT: vsetvli a0, zero, e32, m1, ta, mu 308; RV64-NEXT: vsext.vf2 v8, v10 309; RV64-NEXT: ret 310 %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 311 %ev = sext <vscale x 2 x i16> %v to <vscale x 2 x i32> 312 ret <vscale x 2 x i32> %ev 313} 314 315define <vscale x 2 x i32> @vpgather_nxv2i16_zextload_nxv2i32(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 316; RV32-LABEL: vpgather_nxv2i16_zextload_nxv2i32: 317; RV32: # %bb.0: 318; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 319; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 320; RV32-NEXT: vsetvli a0, zero, e32, m1, ta, mu 321; RV32-NEXT: vzext.vf2 v8, v9 322; RV32-NEXT: ret 323; 324; RV64-LABEL: vpgather_nxv2i16_zextload_nxv2i32: 325; RV64: # %bb.0: 326; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 327; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 328; RV64-NEXT: vsetvli a0, zero, e32, m1, ta, mu 329; RV64-NEXT: vzext.vf2 v8, v10 330; RV64-NEXT: ret 331 %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 332 %ev = zext <vscale x 2 x i16> %v to <vscale x 2 x i32> 333 ret <vscale x 2 x i32> %ev 334} 335 336define <vscale x 2 x i64> @vpgather_nxv2i16_sextload_nxv2i64(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 337; RV32-LABEL: vpgather_nxv2i16_sextload_nxv2i64: 338; RV32: # %bb.0: 339; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 340; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 341; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 342; RV32-NEXT: vsext.vf4 v8, v10 343; RV32-NEXT: ret 344; 345; RV64-LABEL: vpgather_nxv2i16_sextload_nxv2i64: 346; RV64: # %bb.0: 347; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 348; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 349; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 350; RV64-NEXT: vsext.vf4 v8, v10 351; RV64-NEXT: ret 352 %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 353 %ev = sext <vscale x 2 x i16> %v to <vscale x 2 x i64> 354 ret <vscale x 2 x i64> %ev 355} 356 357define <vscale x 2 x i64> @vpgather_nxv2i16_zextload_nxv2i64(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 358; RV32-LABEL: vpgather_nxv2i16_zextload_nxv2i64: 359; RV32: # %bb.0: 360; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 361; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 362; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 363; RV32-NEXT: vzext.vf4 v8, v10 364; RV32-NEXT: ret 365; 366; RV64-LABEL: vpgather_nxv2i16_zextload_nxv2i64: 367; RV64: # %bb.0: 368; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 369; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 370; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 371; RV64-NEXT: vzext.vf4 v8, v10 372; RV64-NEXT: ret 373 %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 374 %ev = zext <vscale x 2 x i16> %v to <vscale x 2 x i64> 375 ret <vscale x 2 x i64> %ev 376} 377 378declare <vscale x 4 x i16> @llvm.vp.gather.nxv4i16.nxv4p0i16(<vscale x 4 x i16*>, <vscale x 4 x i1>, i32) 379 380define <vscale x 4 x i16> @vpgather_nxv4i16(<vscale x 4 x i16*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) { 381; RV32-LABEL: vpgather_nxv4i16: 382; RV32: # %bb.0: 383; RV32-NEXT: vsetvli zero, a0, e16, m1, ta, mu 384; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 385; RV32-NEXT: vmv1r.v v8, v10 386; RV32-NEXT: ret 387; 388; RV64-LABEL: vpgather_nxv4i16: 389; RV64: # %bb.0: 390; RV64-NEXT: vsetvli zero, a0, e16, m1, ta, mu 391; RV64-NEXT: vluxei64.v v12, (zero), v8, v0.t 392; RV64-NEXT: vmv1r.v v8, v12 393; RV64-NEXT: ret 394 %v = call <vscale x 4 x i16> @llvm.vp.gather.nxv4i16.nxv4p0i16(<vscale x 4 x i16*> %ptrs, <vscale x 4 x i1> %m, i32 %evl) 395 ret <vscale x 4 x i16> %v 396} 397 398define <vscale x 4 x i16> @vpgather_truemask_nxv4i16(<vscale x 4 x i16*> %ptrs, i32 zeroext %evl) { 399; RV32-LABEL: vpgather_truemask_nxv4i16: 400; RV32: # %bb.0: 401; RV32-NEXT: vsetvli zero, a0, e16, m1, ta, mu 402; RV32-NEXT: vluxei32.v v10, (zero), v8 403; RV32-NEXT: vmv1r.v v8, v10 404; RV32-NEXT: ret 405; 406; RV64-LABEL: vpgather_truemask_nxv4i16: 407; RV64: # %bb.0: 408; RV64-NEXT: vsetvli zero, a0, e16, m1, ta, mu 409; RV64-NEXT: vluxei64.v v12, (zero), v8 410; RV64-NEXT: vmv1r.v v8, v12 411; RV64-NEXT: ret 412 %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0 413 %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer 414 %v = call <vscale x 4 x i16> @llvm.vp.gather.nxv4i16.nxv4p0i16(<vscale x 4 x i16*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl) 415 ret <vscale x 4 x i16> %v 416} 417 418declare <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*>, <vscale x 8 x i1>, i32) 419 420define <vscale x 8 x i16> @vpgather_nxv8i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 421; RV32-LABEL: vpgather_nxv8i16: 422; RV32: # %bb.0: 423; RV32-NEXT: vsetvli zero, a0, e16, m2, ta, mu 424; RV32-NEXT: vluxei32.v v12, (zero), v8, v0.t 425; RV32-NEXT: vmv2r.v v8, v12 426; RV32-NEXT: ret 427; 428; RV64-LABEL: vpgather_nxv8i16: 429; RV64: # %bb.0: 430; RV64-NEXT: vsetvli zero, a0, e16, m2, ta, mu 431; RV64-NEXT: vluxei64.v v16, (zero), v8, v0.t 432; RV64-NEXT: vmv2r.v v8, v16 433; RV64-NEXT: ret 434 %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 435 ret <vscale x 8 x i16> %v 436} 437 438define <vscale x 8 x i16> @vpgather_baseidx_nxv8i8_nxv8i16(i16* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 439; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8i16: 440; RV32: # %bb.0: 441; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 442; RV32-NEXT: vsext.vf4 v12, v8 443; RV32-NEXT: vadd.vv v12, v12, v12 444; RV32-NEXT: vsetvli zero, a1, e16, m2, ta, mu 445; RV32-NEXT: vluxei32.v v8, (a0), v12, v0.t 446; RV32-NEXT: ret 447; 448; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8i16: 449; RV64: # %bb.0: 450; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 451; RV64-NEXT: vsext.vf8 v16, v8 452; RV64-NEXT: vadd.vv v16, v16, v16 453; RV64-NEXT: vsetvli zero, a1, e16, m2, ta, mu 454; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 455; RV64-NEXT: ret 456 %ptrs = getelementptr inbounds i16, i16* %base, <vscale x 8 x i8> %idxs 457 %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 458 ret <vscale x 8 x i16> %v 459} 460 461define <vscale x 8 x i16> @vpgather_baseidx_sext_nxv8i8_nxv8i16(i16* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 462; RV32-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i16: 463; RV32: # %bb.0: 464; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 465; RV32-NEXT: vsext.vf4 v12, v8 466; RV32-NEXT: vadd.vv v12, v12, v12 467; RV32-NEXT: vsetvli zero, a1, e16, m2, ta, mu 468; RV32-NEXT: vluxei32.v v8, (a0), v12, v0.t 469; RV32-NEXT: ret 470; 471; RV64-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i16: 472; RV64: # %bb.0: 473; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 474; RV64-NEXT: vsext.vf8 v16, v8 475; RV64-NEXT: vadd.vv v16, v16, v16 476; RV64-NEXT: vsetvli zero, a1, e16, m2, ta, mu 477; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 478; RV64-NEXT: ret 479 %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16> 480 %ptrs = getelementptr inbounds i16, i16* %base, <vscale x 8 x i16> %eidxs 481 %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 482 ret <vscale x 8 x i16> %v 483} 484 485define <vscale x 8 x i16> @vpgather_baseidx_zext_nxv8i8_nxv8i16(i16* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 486; RV32-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i16: 487; RV32: # %bb.0: 488; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 489; RV32-NEXT: vzext.vf4 v12, v8 490; RV32-NEXT: vadd.vv v12, v12, v12 491; RV32-NEXT: vsetvli zero, a1, e16, m2, ta, mu 492; RV32-NEXT: vluxei32.v v8, (a0), v12, v0.t 493; RV32-NEXT: ret 494; 495; RV64-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i16: 496; RV64: # %bb.0: 497; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 498; RV64-NEXT: vzext.vf8 v16, v8 499; RV64-NEXT: vadd.vv v16, v16, v16 500; RV64-NEXT: vsetvli zero, a1, e16, m2, ta, mu 501; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 502; RV64-NEXT: ret 503 %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16> 504 %ptrs = getelementptr inbounds i16, i16* %base, <vscale x 8 x i16> %eidxs 505 %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 506 ret <vscale x 8 x i16> %v 507} 508 509define <vscale x 8 x i16> @vpgather_baseidx_nxv8i16(i16* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 510; RV32-LABEL: vpgather_baseidx_nxv8i16: 511; RV32: # %bb.0: 512; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 513; RV32-NEXT: vsext.vf2 v12, v8 514; RV32-NEXT: vadd.vv v12, v12, v12 515; RV32-NEXT: vsetvli zero, a1, e16, m2, ta, mu 516; RV32-NEXT: vluxei32.v v8, (a0), v12, v0.t 517; RV32-NEXT: ret 518; 519; RV64-LABEL: vpgather_baseidx_nxv8i16: 520; RV64: # %bb.0: 521; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 522; RV64-NEXT: vsext.vf4 v16, v8 523; RV64-NEXT: vadd.vv v16, v16, v16 524; RV64-NEXT: vsetvli zero, a1, e16, m2, ta, mu 525; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 526; RV64-NEXT: ret 527 %ptrs = getelementptr inbounds i16, i16* %base, <vscale x 8 x i16> %idxs 528 %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 529 ret <vscale x 8 x i16> %v 530} 531 532declare <vscale x 1 x i32> @llvm.vp.gather.nxv1i32.nxv1p0i32(<vscale x 1 x i32*>, <vscale x 1 x i1>, i32) 533 534define <vscale x 1 x i32> @vpgather_nxv1i32(<vscale x 1 x i32*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) { 535; RV32-LABEL: vpgather_nxv1i32: 536; RV32: # %bb.0: 537; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, mu 538; RV32-NEXT: vluxei32.v v8, (zero), v8, v0.t 539; RV32-NEXT: ret 540; 541; RV64-LABEL: vpgather_nxv1i32: 542; RV64: # %bb.0: 543; RV64-NEXT: vsetvli zero, a0, e32, mf2, ta, mu 544; RV64-NEXT: vluxei64.v v9, (zero), v8, v0.t 545; RV64-NEXT: vmv1r.v v8, v9 546; RV64-NEXT: ret 547 %v = call <vscale x 1 x i32> @llvm.vp.gather.nxv1i32.nxv1p0i32(<vscale x 1 x i32*> %ptrs, <vscale x 1 x i1> %m, i32 %evl) 548 ret <vscale x 1 x i32> %v 549} 550 551declare <vscale x 2 x i32> @llvm.vp.gather.nxv2i32.nxv2p0i32(<vscale x 2 x i32*>, <vscale x 2 x i1>, i32) 552 553define <vscale x 2 x i32> @vpgather_nxv2i32(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 554; RV32-LABEL: vpgather_nxv2i32: 555; RV32: # %bb.0: 556; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, mu 557; RV32-NEXT: vluxei32.v v8, (zero), v8, v0.t 558; RV32-NEXT: ret 559; 560; RV64-LABEL: vpgather_nxv2i32: 561; RV64: # %bb.0: 562; RV64-NEXT: vsetvli zero, a0, e32, m1, ta, mu 563; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 564; RV64-NEXT: vmv1r.v v8, v10 565; RV64-NEXT: ret 566 %v = call <vscale x 2 x i32> @llvm.vp.gather.nxv2i32.nxv2p0i32(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 567 ret <vscale x 2 x i32> %v 568} 569 570define <vscale x 2 x i64> @vpgather_nxv2i32_sextload_nxv2i64(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 571; RV32-LABEL: vpgather_nxv2i32_sextload_nxv2i64: 572; RV32: # %bb.0: 573; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, mu 574; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 575; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 576; RV32-NEXT: vsext.vf2 v8, v10 577; RV32-NEXT: ret 578; 579; RV64-LABEL: vpgather_nxv2i32_sextload_nxv2i64: 580; RV64: # %bb.0: 581; RV64-NEXT: vsetvli zero, a0, e32, m1, ta, mu 582; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 583; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 584; RV64-NEXT: vsext.vf2 v8, v10 585; RV64-NEXT: ret 586 %v = call <vscale x 2 x i32> @llvm.vp.gather.nxv2i32.nxv2p0i32(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 587 %ev = sext <vscale x 2 x i32> %v to <vscale x 2 x i64> 588 ret <vscale x 2 x i64> %ev 589} 590 591define <vscale x 2 x i64> @vpgather_nxv2i32_zextload_nxv2i64(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 592; RV32-LABEL: vpgather_nxv2i32_zextload_nxv2i64: 593; RV32: # %bb.0: 594; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, mu 595; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 596; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 597; RV32-NEXT: vzext.vf2 v8, v10 598; RV32-NEXT: ret 599; 600; RV64-LABEL: vpgather_nxv2i32_zextload_nxv2i64: 601; RV64: # %bb.0: 602; RV64-NEXT: vsetvli zero, a0, e32, m1, ta, mu 603; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 604; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 605; RV64-NEXT: vzext.vf2 v8, v10 606; RV64-NEXT: ret 607 %v = call <vscale x 2 x i32> @llvm.vp.gather.nxv2i32.nxv2p0i32(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 608 %ev = zext <vscale x 2 x i32> %v to <vscale x 2 x i64> 609 ret <vscale x 2 x i64> %ev 610} 611 612declare <vscale x 4 x i32> @llvm.vp.gather.nxv4i32.nxv4p0i32(<vscale x 4 x i32*>, <vscale x 4 x i1>, i32) 613 614define <vscale x 4 x i32> @vpgather_nxv4i32(<vscale x 4 x i32*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) { 615; RV32-LABEL: vpgather_nxv4i32: 616; RV32: # %bb.0: 617; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, mu 618; RV32-NEXT: vluxei32.v v8, (zero), v8, v0.t 619; RV32-NEXT: ret 620; 621; RV64-LABEL: vpgather_nxv4i32: 622; RV64: # %bb.0: 623; RV64-NEXT: vsetvli zero, a0, e32, m2, ta, mu 624; RV64-NEXT: vluxei64.v v12, (zero), v8, v0.t 625; RV64-NEXT: vmv2r.v v8, v12 626; RV64-NEXT: ret 627 %v = call <vscale x 4 x i32> @llvm.vp.gather.nxv4i32.nxv4p0i32(<vscale x 4 x i32*> %ptrs, <vscale x 4 x i1> %m, i32 %evl) 628 ret <vscale x 4 x i32> %v 629} 630 631define <vscale x 4 x i32> @vpgather_truemask_nxv4i32(<vscale x 4 x i32*> %ptrs, i32 zeroext %evl) { 632; RV32-LABEL: vpgather_truemask_nxv4i32: 633; RV32: # %bb.0: 634; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, mu 635; RV32-NEXT: vluxei32.v v8, (zero), v8 636; RV32-NEXT: ret 637; 638; RV64-LABEL: vpgather_truemask_nxv4i32: 639; RV64: # %bb.0: 640; RV64-NEXT: vsetvli zero, a0, e32, m2, ta, mu 641; RV64-NEXT: vluxei64.v v12, (zero), v8 642; RV64-NEXT: vmv2r.v v8, v12 643; RV64-NEXT: ret 644 %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0 645 %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer 646 %v = call <vscale x 4 x i32> @llvm.vp.gather.nxv4i32.nxv4p0i32(<vscale x 4 x i32*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl) 647 ret <vscale x 4 x i32> %v 648} 649 650declare <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*>, <vscale x 8 x i1>, i32) 651 652define <vscale x 8 x i32> @vpgather_nxv8i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 653; RV32-LABEL: vpgather_nxv8i32: 654; RV32: # %bb.0: 655; RV32-NEXT: vsetvli zero, a0, e32, m4, ta, mu 656; RV32-NEXT: vluxei32.v v8, (zero), v8, v0.t 657; RV32-NEXT: ret 658; 659; RV64-LABEL: vpgather_nxv8i32: 660; RV64: # %bb.0: 661; RV64-NEXT: vsetvli zero, a0, e32, m4, ta, mu 662; RV64-NEXT: vluxei64.v v16, (zero), v8, v0.t 663; RV64-NEXT: vmv4r.v v8, v16 664; RV64-NEXT: ret 665 %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 666 ret <vscale x 8 x i32> %v 667} 668 669define <vscale x 8 x i32> @vpgather_baseidx_nxv8i8_nxv8i32(i32* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 670; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8i32: 671; RV32: # %bb.0: 672; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 673; RV32-NEXT: vsext.vf4 v12, v8 674; RV32-NEXT: vsll.vi v8, v12, 2 675; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 676; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 677; RV32-NEXT: ret 678; 679; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8i32: 680; RV64: # %bb.0: 681; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 682; RV64-NEXT: vsext.vf8 v16, v8 683; RV64-NEXT: vsll.vi v16, v16, 2 684; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 685; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 686; RV64-NEXT: ret 687 %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i8> %idxs 688 %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 689 ret <vscale x 8 x i32> %v 690} 691 692define <vscale x 8 x i32> @vpgather_baseidx_sext_nxv8i8_nxv8i32(i32* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 693; RV32-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i32: 694; RV32: # %bb.0: 695; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 696; RV32-NEXT: vsext.vf4 v12, v8 697; RV32-NEXT: vsll.vi v8, v12, 2 698; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 699; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 700; RV32-NEXT: ret 701; 702; RV64-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i32: 703; RV64: # %bb.0: 704; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 705; RV64-NEXT: vsext.vf8 v16, v8 706; RV64-NEXT: vsll.vi v16, v16, 2 707; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 708; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 709; RV64-NEXT: ret 710 %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32> 711 %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %eidxs 712 %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 713 ret <vscale x 8 x i32> %v 714} 715 716define <vscale x 8 x i32> @vpgather_baseidx_zext_nxv8i8_nxv8i32(i32* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 717; RV32-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i32: 718; RV32: # %bb.0: 719; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 720; RV32-NEXT: vzext.vf4 v12, v8 721; RV32-NEXT: vsll.vi v8, v12, 2 722; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 723; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 724; RV32-NEXT: ret 725; 726; RV64-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i32: 727; RV64: # %bb.0: 728; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 729; RV64-NEXT: vzext.vf8 v16, v8 730; RV64-NEXT: vsll.vi v16, v16, 2 731; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 732; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 733; RV64-NEXT: ret 734 %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32> 735 %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %eidxs 736 %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 737 ret <vscale x 8 x i32> %v 738} 739 740define <vscale x 8 x i32> @vpgather_baseidx_nxv8i16_nxv8i32(i32* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 741; RV32-LABEL: vpgather_baseidx_nxv8i16_nxv8i32: 742; RV32: # %bb.0: 743; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 744; RV32-NEXT: vsext.vf2 v12, v8 745; RV32-NEXT: vsll.vi v8, v12, 2 746; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 747; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 748; RV32-NEXT: ret 749; 750; RV64-LABEL: vpgather_baseidx_nxv8i16_nxv8i32: 751; RV64: # %bb.0: 752; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 753; RV64-NEXT: vsext.vf4 v16, v8 754; RV64-NEXT: vsll.vi v16, v16, 2 755; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 756; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 757; RV64-NEXT: ret 758 %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i16> %idxs 759 %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 760 ret <vscale x 8 x i32> %v 761} 762 763define <vscale x 8 x i32> @vpgather_baseidx_sext_nxv8i16_nxv8i32(i32* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 764; RV32-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8i32: 765; RV32: # %bb.0: 766; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 767; RV32-NEXT: vsext.vf2 v12, v8 768; RV32-NEXT: vsll.vi v8, v12, 2 769; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 770; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 771; RV32-NEXT: ret 772; 773; RV64-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8i32: 774; RV64: # %bb.0: 775; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 776; RV64-NEXT: vsext.vf4 v16, v8 777; RV64-NEXT: vsll.vi v16, v16, 2 778; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 779; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 780; RV64-NEXT: ret 781 %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32> 782 %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %eidxs 783 %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 784 ret <vscale x 8 x i32> %v 785} 786 787define <vscale x 8 x i32> @vpgather_baseidx_zext_nxv8i16_nxv8i32(i32* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 788; RV32-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8i32: 789; RV32: # %bb.0: 790; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 791; RV32-NEXT: vzext.vf2 v12, v8 792; RV32-NEXT: vsll.vi v8, v12, 2 793; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 794; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 795; RV32-NEXT: ret 796; 797; RV64-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8i32: 798; RV64: # %bb.0: 799; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 800; RV64-NEXT: vzext.vf4 v16, v8 801; RV64-NEXT: vsll.vi v16, v16, 2 802; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 803; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 804; RV64-NEXT: ret 805 %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32> 806 %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %eidxs 807 %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 808 ret <vscale x 8 x i32> %v 809} 810 811define <vscale x 8 x i32> @vpgather_baseidx_nxv8i32(i32* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 812; RV32-LABEL: vpgather_baseidx_nxv8i32: 813; RV32: # %bb.0: 814; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 815; RV32-NEXT: vsll.vi v8, v8, 2 816; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 817; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 818; RV32-NEXT: ret 819; 820; RV64-LABEL: vpgather_baseidx_nxv8i32: 821; RV64: # %bb.0: 822; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 823; RV64-NEXT: vsext.vf2 v16, v8 824; RV64-NEXT: vsll.vi v16, v16, 2 825; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 826; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 827; RV64-NEXT: ret 828 %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %idxs 829 %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 830 ret <vscale x 8 x i32> %v 831} 832 833declare <vscale x 1 x i64> @llvm.vp.gather.nxv1i64.nxv1p0i64(<vscale x 1 x i64*>, <vscale x 1 x i1>, i32) 834 835define <vscale x 1 x i64> @vpgather_nxv1i64(<vscale x 1 x i64*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) { 836; RV32-LABEL: vpgather_nxv1i64: 837; RV32: # %bb.0: 838; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, mu 839; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 840; RV32-NEXT: vmv1r.v v8, v9 841; RV32-NEXT: ret 842; 843; RV64-LABEL: vpgather_nxv1i64: 844; RV64: # %bb.0: 845; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, mu 846; RV64-NEXT: vluxei64.v v8, (zero), v8, v0.t 847; RV64-NEXT: ret 848 %v = call <vscale x 1 x i64> @llvm.vp.gather.nxv1i64.nxv1p0i64(<vscale x 1 x i64*> %ptrs, <vscale x 1 x i1> %m, i32 %evl) 849 ret <vscale x 1 x i64> %v 850} 851 852declare <vscale x 2 x i64> @llvm.vp.gather.nxv2i64.nxv2p0i64(<vscale x 2 x i64*>, <vscale x 2 x i1>, i32) 853 854define <vscale x 2 x i64> @vpgather_nxv2i64(<vscale x 2 x i64*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 855; RV32-LABEL: vpgather_nxv2i64: 856; RV32: # %bb.0: 857; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, mu 858; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 859; RV32-NEXT: vmv2r.v v8, v10 860; RV32-NEXT: ret 861; 862; RV64-LABEL: vpgather_nxv2i64: 863; RV64: # %bb.0: 864; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, mu 865; RV64-NEXT: vluxei64.v v8, (zero), v8, v0.t 866; RV64-NEXT: ret 867 %v = call <vscale x 2 x i64> @llvm.vp.gather.nxv2i64.nxv2p0i64(<vscale x 2 x i64*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 868 ret <vscale x 2 x i64> %v 869} 870 871declare <vscale x 4 x i64> @llvm.vp.gather.nxv4i64.nxv4p0i64(<vscale x 4 x i64*>, <vscale x 4 x i1>, i32) 872 873define <vscale x 4 x i64> @vpgather_nxv4i64(<vscale x 4 x i64*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) { 874; RV32-LABEL: vpgather_nxv4i64: 875; RV32: # %bb.0: 876; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, mu 877; RV32-NEXT: vluxei32.v v12, (zero), v8, v0.t 878; RV32-NEXT: vmv4r.v v8, v12 879; RV32-NEXT: ret 880; 881; RV64-LABEL: vpgather_nxv4i64: 882; RV64: # %bb.0: 883; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, mu 884; RV64-NEXT: vluxei64.v v8, (zero), v8, v0.t 885; RV64-NEXT: ret 886 %v = call <vscale x 4 x i64> @llvm.vp.gather.nxv4i64.nxv4p0i64(<vscale x 4 x i64*> %ptrs, <vscale x 4 x i1> %m, i32 %evl) 887 ret <vscale x 4 x i64> %v 888} 889 890define <vscale x 4 x i64> @vpgather_truemask_nxv4i64(<vscale x 4 x i64*> %ptrs, i32 zeroext %evl) { 891; RV32-LABEL: vpgather_truemask_nxv4i64: 892; RV32: # %bb.0: 893; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, mu 894; RV32-NEXT: vluxei32.v v12, (zero), v8 895; RV32-NEXT: vmv4r.v v8, v12 896; RV32-NEXT: ret 897; 898; RV64-LABEL: vpgather_truemask_nxv4i64: 899; RV64: # %bb.0: 900; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, mu 901; RV64-NEXT: vluxei64.v v8, (zero), v8 902; RV64-NEXT: ret 903 %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0 904 %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer 905 %v = call <vscale x 4 x i64> @llvm.vp.gather.nxv4i64.nxv4p0i64(<vscale x 4 x i64*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl) 906 ret <vscale x 4 x i64> %v 907} 908 909declare <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*>, <vscale x 8 x i1>, i32) 910 911define <vscale x 8 x i64> @vpgather_nxv8i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 912; RV32-LABEL: vpgather_nxv8i64: 913; RV32: # %bb.0: 914; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, mu 915; RV32-NEXT: vluxei32.v v16, (zero), v8, v0.t 916; RV32-NEXT: vmv8r.v v8, v16 917; RV32-NEXT: ret 918; 919; RV64-LABEL: vpgather_nxv8i64: 920; RV64: # %bb.0: 921; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, mu 922; RV64-NEXT: vluxei64.v v8, (zero), v8, v0.t 923; RV64-NEXT: ret 924 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 925 ret <vscale x 8 x i64> %v 926} 927 928define <vscale x 8 x i64> @vpgather_baseidx_nxv8i8_nxv8i64(i64* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 929; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8i64: 930; RV32: # %bb.0: 931; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 932; RV32-NEXT: vsext.vf4 v12, v8 933; RV32-NEXT: vsll.vi v16, v12, 3 934; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, mu 935; RV32-NEXT: vluxei32.v v8, (a0), v16, v0.t 936; RV32-NEXT: ret 937; 938; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8i64: 939; RV64: # %bb.0: 940; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 941; RV64-NEXT: vsext.vf8 v16, v8 942; RV64-NEXT: vsll.vi v8, v16, 3 943; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, mu 944; RV64-NEXT: vluxei64.v v8, (a0), v8, v0.t 945; RV64-NEXT: ret 946 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i8> %idxs 947 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 948 ret <vscale x 8 x i64> %v 949} 950 951define <vscale x 8 x i64> @vpgather_baseidx_sext_nxv8i8_nxv8i64(i64* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 952; CHECK-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i64: 953; CHECK: # %bb.0: 954; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 955; CHECK-NEXT: vsext.vf8 v16, v8 956; CHECK-NEXT: vsll.vi v8, v16, 3 957; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 958; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 959; CHECK-NEXT: ret 960 %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64> 961 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs 962 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 963 ret <vscale x 8 x i64> %v 964} 965 966define <vscale x 8 x i64> @vpgather_baseidx_zext_nxv8i8_nxv8i64(i64* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 967; CHECK-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i64: 968; CHECK: # %bb.0: 969; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 970; CHECK-NEXT: vzext.vf8 v16, v8 971; CHECK-NEXT: vsll.vi v8, v16, 3 972; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 973; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 974; CHECK-NEXT: ret 975 %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64> 976 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs 977 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 978 ret <vscale x 8 x i64> %v 979} 980 981define <vscale x 8 x i64> @vpgather_baseidx_nxv8i16_nxv8i64(i64* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 982; RV32-LABEL: vpgather_baseidx_nxv8i16_nxv8i64: 983; RV32: # %bb.0: 984; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 985; RV32-NEXT: vsext.vf2 v12, v8 986; RV32-NEXT: vsll.vi v16, v12, 3 987; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, mu 988; RV32-NEXT: vluxei32.v v8, (a0), v16, v0.t 989; RV32-NEXT: ret 990; 991; RV64-LABEL: vpgather_baseidx_nxv8i16_nxv8i64: 992; RV64: # %bb.0: 993; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 994; RV64-NEXT: vsext.vf4 v16, v8 995; RV64-NEXT: vsll.vi v8, v16, 3 996; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, mu 997; RV64-NEXT: vluxei64.v v8, (a0), v8, v0.t 998; RV64-NEXT: ret 999 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i16> %idxs 1000 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1001 ret <vscale x 8 x i64> %v 1002} 1003 1004define <vscale x 8 x i64> @vpgather_baseidx_sext_nxv8i16_nxv8i64(i64* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1005; CHECK-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8i64: 1006; CHECK: # %bb.0: 1007; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1008; CHECK-NEXT: vsext.vf4 v16, v8 1009; CHECK-NEXT: vsll.vi v8, v16, 3 1010; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1011; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1012; CHECK-NEXT: ret 1013 %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64> 1014 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs 1015 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1016 ret <vscale x 8 x i64> %v 1017} 1018 1019define <vscale x 8 x i64> @vpgather_baseidx_zext_nxv8i16_nxv8i64(i64* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1020; CHECK-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8i64: 1021; CHECK: # %bb.0: 1022; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1023; CHECK-NEXT: vzext.vf4 v16, v8 1024; CHECK-NEXT: vsll.vi v8, v16, 3 1025; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1026; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1027; CHECK-NEXT: ret 1028 %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64> 1029 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs 1030 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1031 ret <vscale x 8 x i64> %v 1032} 1033 1034define <vscale x 8 x i64> @vpgather_baseidx_nxv8i32_nxv8i64(i64* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1035; RV32-LABEL: vpgather_baseidx_nxv8i32_nxv8i64: 1036; RV32: # %bb.0: 1037; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1038; RV32-NEXT: vsll.vi v16, v8, 3 1039; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1040; RV32-NEXT: vluxei32.v v8, (a0), v16, v0.t 1041; RV32-NEXT: ret 1042; 1043; RV64-LABEL: vpgather_baseidx_nxv8i32_nxv8i64: 1044; RV64: # %bb.0: 1045; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1046; RV64-NEXT: vsext.vf2 v16, v8 1047; RV64-NEXT: vsll.vi v8, v16, 3 1048; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1049; RV64-NEXT: vluxei64.v v8, (a0), v8, v0.t 1050; RV64-NEXT: ret 1051 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i32> %idxs 1052 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1053 ret <vscale x 8 x i64> %v 1054} 1055 1056define <vscale x 8 x i64> @vpgather_baseidx_sext_nxv8i32_nxv8i64(i64* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1057; CHECK-LABEL: vpgather_baseidx_sext_nxv8i32_nxv8i64: 1058; CHECK: # %bb.0: 1059; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1060; CHECK-NEXT: vsext.vf2 v16, v8 1061; CHECK-NEXT: vsll.vi v8, v16, 3 1062; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1063; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1064; CHECK-NEXT: ret 1065 %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64> 1066 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs 1067 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1068 ret <vscale x 8 x i64> %v 1069} 1070 1071define <vscale x 8 x i64> @vpgather_baseidx_zext_nxv8i32_nxv8i64(i64* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1072; CHECK-LABEL: vpgather_baseidx_zext_nxv8i32_nxv8i64: 1073; CHECK: # %bb.0: 1074; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1075; CHECK-NEXT: vzext.vf2 v16, v8 1076; CHECK-NEXT: vsll.vi v8, v16, 3 1077; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1078; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1079; CHECK-NEXT: ret 1080 %eidxs = zext <vscale x 8 x i32> %idxs to <vscale x 8 x i64> 1081 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs 1082 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1083 ret <vscale x 8 x i64> %v 1084} 1085 1086define <vscale x 8 x i64> @vpgather_baseidx_nxv8i64(i64* %base, <vscale x 8 x i64> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1087; CHECK-LABEL: vpgather_baseidx_nxv8i64: 1088; CHECK: # %bb.0: 1089; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1090; CHECK-NEXT: vsll.vi v8, v8, 3 1091; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1092; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1093; CHECK-NEXT: ret 1094 %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %idxs 1095 %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1096 ret <vscale x 8 x i64> %v 1097} 1098 1099declare <vscale x 1 x half> @llvm.vp.gather.nxv1f16.nxv1p0f16(<vscale x 1 x half*>, <vscale x 1 x i1>, i32) 1100 1101define <vscale x 1 x half> @vpgather_nxv1f16(<vscale x 1 x half*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1102; RV32-LABEL: vpgather_nxv1f16: 1103; RV32: # %bb.0: 1104; RV32-NEXT: vsetvli zero, a0, e16, mf4, ta, mu 1105; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 1106; RV32-NEXT: vmv1r.v v8, v9 1107; RV32-NEXT: ret 1108; 1109; RV64-LABEL: vpgather_nxv1f16: 1110; RV64: # %bb.0: 1111; RV64-NEXT: vsetvli zero, a0, e16, mf4, ta, mu 1112; RV64-NEXT: vluxei64.v v9, (zero), v8, v0.t 1113; RV64-NEXT: vmv1r.v v8, v9 1114; RV64-NEXT: ret 1115 %v = call <vscale x 1 x half> @llvm.vp.gather.nxv1f16.nxv1p0f16(<vscale x 1 x half*> %ptrs, <vscale x 1 x i1> %m, i32 %evl) 1116 ret <vscale x 1 x half> %v 1117} 1118 1119declare <vscale x 2 x half> @llvm.vp.gather.nxv2f16.nxv2p0f16(<vscale x 2 x half*>, <vscale x 2 x i1>, i32) 1120 1121define <vscale x 2 x half> @vpgather_nxv2f16(<vscale x 2 x half*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1122; RV32-LABEL: vpgather_nxv2f16: 1123; RV32: # %bb.0: 1124; RV32-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 1125; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 1126; RV32-NEXT: vmv1r.v v8, v9 1127; RV32-NEXT: ret 1128; 1129; RV64-LABEL: vpgather_nxv2f16: 1130; RV64: # %bb.0: 1131; RV64-NEXT: vsetvli zero, a0, e16, mf2, ta, mu 1132; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 1133; RV64-NEXT: vmv1r.v v8, v10 1134; RV64-NEXT: ret 1135 %v = call <vscale x 2 x half> @llvm.vp.gather.nxv2f16.nxv2p0f16(<vscale x 2 x half*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 1136 ret <vscale x 2 x half> %v 1137} 1138 1139declare <vscale x 4 x half> @llvm.vp.gather.nxv4f16.nxv4p0f16(<vscale x 4 x half*>, <vscale x 4 x i1>, i32) 1140 1141define <vscale x 4 x half> @vpgather_nxv4f16(<vscale x 4 x half*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1142; RV32-LABEL: vpgather_nxv4f16: 1143; RV32: # %bb.0: 1144; RV32-NEXT: vsetvli zero, a0, e16, m1, ta, mu 1145; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 1146; RV32-NEXT: vmv1r.v v8, v10 1147; RV32-NEXT: ret 1148; 1149; RV64-LABEL: vpgather_nxv4f16: 1150; RV64: # %bb.0: 1151; RV64-NEXT: vsetvli zero, a0, e16, m1, ta, mu 1152; RV64-NEXT: vluxei64.v v12, (zero), v8, v0.t 1153; RV64-NEXT: vmv1r.v v8, v12 1154; RV64-NEXT: ret 1155 %v = call <vscale x 4 x half> @llvm.vp.gather.nxv4f16.nxv4p0f16(<vscale x 4 x half*> %ptrs, <vscale x 4 x i1> %m, i32 %evl) 1156 ret <vscale x 4 x half> %v 1157} 1158 1159define <vscale x 4 x half> @vpgather_truemask_nxv4f16(<vscale x 4 x half*> %ptrs, i32 zeroext %evl) { 1160; RV32-LABEL: vpgather_truemask_nxv4f16: 1161; RV32: # %bb.0: 1162; RV32-NEXT: vsetvli zero, a0, e16, m1, ta, mu 1163; RV32-NEXT: vluxei32.v v10, (zero), v8 1164; RV32-NEXT: vmv1r.v v8, v10 1165; RV32-NEXT: ret 1166; 1167; RV64-LABEL: vpgather_truemask_nxv4f16: 1168; RV64: # %bb.0: 1169; RV64-NEXT: vsetvli zero, a0, e16, m1, ta, mu 1170; RV64-NEXT: vluxei64.v v12, (zero), v8 1171; RV64-NEXT: vmv1r.v v8, v12 1172; RV64-NEXT: ret 1173 %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0 1174 %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer 1175 %v = call <vscale x 4 x half> @llvm.vp.gather.nxv4f16.nxv4p0f16(<vscale x 4 x half*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl) 1176 ret <vscale x 4 x half> %v 1177} 1178 1179declare <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*>, <vscale x 8 x i1>, i32) 1180 1181define <vscale x 8 x half> @vpgather_nxv8f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1182; RV32-LABEL: vpgather_nxv8f16: 1183; RV32: # %bb.0: 1184; RV32-NEXT: vsetvli zero, a0, e16, m2, ta, mu 1185; RV32-NEXT: vluxei32.v v12, (zero), v8, v0.t 1186; RV32-NEXT: vmv2r.v v8, v12 1187; RV32-NEXT: ret 1188; 1189; RV64-LABEL: vpgather_nxv8f16: 1190; RV64: # %bb.0: 1191; RV64-NEXT: vsetvli zero, a0, e16, m2, ta, mu 1192; RV64-NEXT: vluxei64.v v16, (zero), v8, v0.t 1193; RV64-NEXT: vmv2r.v v8, v16 1194; RV64-NEXT: ret 1195 %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1196 ret <vscale x 8 x half> %v 1197} 1198 1199define <vscale x 8 x half> @vpgather_baseidx_nxv8i8_nxv8f16(half* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1200; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8f16: 1201; RV32: # %bb.0: 1202; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1203; RV32-NEXT: vsext.vf4 v12, v8 1204; RV32-NEXT: vadd.vv v12, v12, v12 1205; RV32-NEXT: vsetvli zero, a1, e16, m2, ta, mu 1206; RV32-NEXT: vluxei32.v v8, (a0), v12, v0.t 1207; RV32-NEXT: ret 1208; 1209; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8f16: 1210; RV64: # %bb.0: 1211; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1212; RV64-NEXT: vsext.vf8 v16, v8 1213; RV64-NEXT: vadd.vv v16, v16, v16 1214; RV64-NEXT: vsetvli zero, a1, e16, m2, ta, mu 1215; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1216; RV64-NEXT: ret 1217 %ptrs = getelementptr inbounds half, half* %base, <vscale x 8 x i8> %idxs 1218 %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1219 ret <vscale x 8 x half> %v 1220} 1221 1222define <vscale x 8 x half> @vpgather_baseidx_sext_nxv8i8_nxv8f16(half* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1223; RV32-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f16: 1224; RV32: # %bb.0: 1225; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1226; RV32-NEXT: vsext.vf4 v12, v8 1227; RV32-NEXT: vadd.vv v12, v12, v12 1228; RV32-NEXT: vsetvli zero, a1, e16, m2, ta, mu 1229; RV32-NEXT: vluxei32.v v8, (a0), v12, v0.t 1230; RV32-NEXT: ret 1231; 1232; RV64-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f16: 1233; RV64: # %bb.0: 1234; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1235; RV64-NEXT: vsext.vf8 v16, v8 1236; RV64-NEXT: vadd.vv v16, v16, v16 1237; RV64-NEXT: vsetvli zero, a1, e16, m2, ta, mu 1238; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1239; RV64-NEXT: ret 1240 %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16> 1241 %ptrs = getelementptr inbounds half, half* %base, <vscale x 8 x i16> %eidxs 1242 %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1243 ret <vscale x 8 x half> %v 1244} 1245 1246define <vscale x 8 x half> @vpgather_baseidx_zext_nxv8i8_nxv8f16(half* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1247; RV32-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f16: 1248; RV32: # %bb.0: 1249; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1250; RV32-NEXT: vzext.vf4 v12, v8 1251; RV32-NEXT: vadd.vv v12, v12, v12 1252; RV32-NEXT: vsetvli zero, a1, e16, m2, ta, mu 1253; RV32-NEXT: vluxei32.v v8, (a0), v12, v0.t 1254; RV32-NEXT: ret 1255; 1256; RV64-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f16: 1257; RV64: # %bb.0: 1258; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1259; RV64-NEXT: vzext.vf8 v16, v8 1260; RV64-NEXT: vadd.vv v16, v16, v16 1261; RV64-NEXT: vsetvli zero, a1, e16, m2, ta, mu 1262; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1263; RV64-NEXT: ret 1264 %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16> 1265 %ptrs = getelementptr inbounds half, half* %base, <vscale x 8 x i16> %eidxs 1266 %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1267 ret <vscale x 8 x half> %v 1268} 1269 1270define <vscale x 8 x half> @vpgather_baseidx_nxv8f16(half* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1271; RV32-LABEL: vpgather_baseidx_nxv8f16: 1272; RV32: # %bb.0: 1273; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1274; RV32-NEXT: vsext.vf2 v12, v8 1275; RV32-NEXT: vadd.vv v12, v12, v12 1276; RV32-NEXT: vsetvli zero, a1, e16, m2, ta, mu 1277; RV32-NEXT: vluxei32.v v8, (a0), v12, v0.t 1278; RV32-NEXT: ret 1279; 1280; RV64-LABEL: vpgather_baseidx_nxv8f16: 1281; RV64: # %bb.0: 1282; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1283; RV64-NEXT: vsext.vf4 v16, v8 1284; RV64-NEXT: vadd.vv v16, v16, v16 1285; RV64-NEXT: vsetvli zero, a1, e16, m2, ta, mu 1286; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1287; RV64-NEXT: ret 1288 %ptrs = getelementptr inbounds half, half* %base, <vscale x 8 x i16> %idxs 1289 %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1290 ret <vscale x 8 x half> %v 1291} 1292 1293declare <vscale x 1 x float> @llvm.vp.gather.nxv1f32.nxv1p0f32(<vscale x 1 x float*>, <vscale x 1 x i1>, i32) 1294 1295define <vscale x 1 x float> @vpgather_nxv1f32(<vscale x 1 x float*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1296; RV32-LABEL: vpgather_nxv1f32: 1297; RV32: # %bb.0: 1298; RV32-NEXT: vsetvli zero, a0, e32, mf2, ta, mu 1299; RV32-NEXT: vluxei32.v v8, (zero), v8, v0.t 1300; RV32-NEXT: ret 1301; 1302; RV64-LABEL: vpgather_nxv1f32: 1303; RV64: # %bb.0: 1304; RV64-NEXT: vsetvli zero, a0, e32, mf2, ta, mu 1305; RV64-NEXT: vluxei64.v v9, (zero), v8, v0.t 1306; RV64-NEXT: vmv1r.v v8, v9 1307; RV64-NEXT: ret 1308 %v = call <vscale x 1 x float> @llvm.vp.gather.nxv1f32.nxv1p0f32(<vscale x 1 x float*> %ptrs, <vscale x 1 x i1> %m, i32 %evl) 1309 ret <vscale x 1 x float> %v 1310} 1311 1312declare <vscale x 2 x float> @llvm.vp.gather.nxv2f32.nxv2p0f32(<vscale x 2 x float*>, <vscale x 2 x i1>, i32) 1313 1314define <vscale x 2 x float> @vpgather_nxv2f32(<vscale x 2 x float*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1315; RV32-LABEL: vpgather_nxv2f32: 1316; RV32: # %bb.0: 1317; RV32-NEXT: vsetvli zero, a0, e32, m1, ta, mu 1318; RV32-NEXT: vluxei32.v v8, (zero), v8, v0.t 1319; RV32-NEXT: ret 1320; 1321; RV64-LABEL: vpgather_nxv2f32: 1322; RV64: # %bb.0: 1323; RV64-NEXT: vsetvli zero, a0, e32, m1, ta, mu 1324; RV64-NEXT: vluxei64.v v10, (zero), v8, v0.t 1325; RV64-NEXT: vmv1r.v v8, v10 1326; RV64-NEXT: ret 1327 %v = call <vscale x 2 x float> @llvm.vp.gather.nxv2f32.nxv2p0f32(<vscale x 2 x float*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 1328 ret <vscale x 2 x float> %v 1329} 1330 1331declare <vscale x 4 x float> @llvm.vp.gather.nxv4f32.nxv4p0f32(<vscale x 4 x float*>, <vscale x 4 x i1>, i32) 1332 1333define <vscale x 4 x float> @vpgather_nxv4f32(<vscale x 4 x float*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1334; RV32-LABEL: vpgather_nxv4f32: 1335; RV32: # %bb.0: 1336; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, mu 1337; RV32-NEXT: vluxei32.v v8, (zero), v8, v0.t 1338; RV32-NEXT: ret 1339; 1340; RV64-LABEL: vpgather_nxv4f32: 1341; RV64: # %bb.0: 1342; RV64-NEXT: vsetvli zero, a0, e32, m2, ta, mu 1343; RV64-NEXT: vluxei64.v v12, (zero), v8, v0.t 1344; RV64-NEXT: vmv2r.v v8, v12 1345; RV64-NEXT: ret 1346 %v = call <vscale x 4 x float> @llvm.vp.gather.nxv4f32.nxv4p0f32(<vscale x 4 x float*> %ptrs, <vscale x 4 x i1> %m, i32 %evl) 1347 ret <vscale x 4 x float> %v 1348} 1349 1350define <vscale x 4 x float> @vpgather_truemask_nxv4f32(<vscale x 4 x float*> %ptrs, i32 zeroext %evl) { 1351; RV32-LABEL: vpgather_truemask_nxv4f32: 1352; RV32: # %bb.0: 1353; RV32-NEXT: vsetvli zero, a0, e32, m2, ta, mu 1354; RV32-NEXT: vluxei32.v v8, (zero), v8 1355; RV32-NEXT: ret 1356; 1357; RV64-LABEL: vpgather_truemask_nxv4f32: 1358; RV64: # %bb.0: 1359; RV64-NEXT: vsetvli zero, a0, e32, m2, ta, mu 1360; RV64-NEXT: vluxei64.v v12, (zero), v8 1361; RV64-NEXT: vmv2r.v v8, v12 1362; RV64-NEXT: ret 1363 %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0 1364 %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer 1365 %v = call <vscale x 4 x float> @llvm.vp.gather.nxv4f32.nxv4p0f32(<vscale x 4 x float*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl) 1366 ret <vscale x 4 x float> %v 1367} 1368 1369declare <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*>, <vscale x 8 x i1>, i32) 1370 1371define <vscale x 8 x float> @vpgather_nxv8f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1372; RV32-LABEL: vpgather_nxv8f32: 1373; RV32: # %bb.0: 1374; RV32-NEXT: vsetvli zero, a0, e32, m4, ta, mu 1375; RV32-NEXT: vluxei32.v v8, (zero), v8, v0.t 1376; RV32-NEXT: ret 1377; 1378; RV64-LABEL: vpgather_nxv8f32: 1379; RV64: # %bb.0: 1380; RV64-NEXT: vsetvli zero, a0, e32, m4, ta, mu 1381; RV64-NEXT: vluxei64.v v16, (zero), v8, v0.t 1382; RV64-NEXT: vmv4r.v v8, v16 1383; RV64-NEXT: ret 1384 %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1385 ret <vscale x 8 x float> %v 1386} 1387 1388define <vscale x 8 x float> @vpgather_baseidx_nxv8i8_nxv8f32(float* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1389; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8f32: 1390; RV32: # %bb.0: 1391; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1392; RV32-NEXT: vsext.vf4 v12, v8 1393; RV32-NEXT: vsll.vi v8, v12, 2 1394; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1395; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 1396; RV32-NEXT: ret 1397; 1398; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8f32: 1399; RV64: # %bb.0: 1400; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1401; RV64-NEXT: vsext.vf8 v16, v8 1402; RV64-NEXT: vsll.vi v16, v16, 2 1403; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1404; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1405; RV64-NEXT: ret 1406 %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i8> %idxs 1407 %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1408 ret <vscale x 8 x float> %v 1409} 1410 1411define <vscale x 8 x float> @vpgather_baseidx_sext_nxv8i8_nxv8f32(float* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1412; RV32-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f32: 1413; RV32: # %bb.0: 1414; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1415; RV32-NEXT: vsext.vf4 v12, v8 1416; RV32-NEXT: vsll.vi v8, v12, 2 1417; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1418; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 1419; RV32-NEXT: ret 1420; 1421; RV64-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f32: 1422; RV64: # %bb.0: 1423; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1424; RV64-NEXT: vsext.vf8 v16, v8 1425; RV64-NEXT: vsll.vi v16, v16, 2 1426; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1427; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1428; RV64-NEXT: ret 1429 %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32> 1430 %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %eidxs 1431 %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1432 ret <vscale x 8 x float> %v 1433} 1434 1435define <vscale x 8 x float> @vpgather_baseidx_zext_nxv8i8_nxv8f32(float* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1436; RV32-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f32: 1437; RV32: # %bb.0: 1438; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1439; RV32-NEXT: vzext.vf4 v12, v8 1440; RV32-NEXT: vsll.vi v8, v12, 2 1441; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1442; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 1443; RV32-NEXT: ret 1444; 1445; RV64-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f32: 1446; RV64: # %bb.0: 1447; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1448; RV64-NEXT: vzext.vf8 v16, v8 1449; RV64-NEXT: vsll.vi v16, v16, 2 1450; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1451; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1452; RV64-NEXT: ret 1453 %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32> 1454 %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %eidxs 1455 %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1456 ret <vscale x 8 x float> %v 1457} 1458 1459define <vscale x 8 x float> @vpgather_baseidx_nxv8i16_nxv8f32(float* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1460; RV32-LABEL: vpgather_baseidx_nxv8i16_nxv8f32: 1461; RV32: # %bb.0: 1462; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1463; RV32-NEXT: vsext.vf2 v12, v8 1464; RV32-NEXT: vsll.vi v8, v12, 2 1465; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1466; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 1467; RV32-NEXT: ret 1468; 1469; RV64-LABEL: vpgather_baseidx_nxv8i16_nxv8f32: 1470; RV64: # %bb.0: 1471; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1472; RV64-NEXT: vsext.vf4 v16, v8 1473; RV64-NEXT: vsll.vi v16, v16, 2 1474; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1475; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1476; RV64-NEXT: ret 1477 %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i16> %idxs 1478 %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1479 ret <vscale x 8 x float> %v 1480} 1481 1482define <vscale x 8 x float> @vpgather_baseidx_sext_nxv8i16_nxv8f32(float* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1483; RV32-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8f32: 1484; RV32: # %bb.0: 1485; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1486; RV32-NEXT: vsext.vf2 v12, v8 1487; RV32-NEXT: vsll.vi v8, v12, 2 1488; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1489; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 1490; RV32-NEXT: ret 1491; 1492; RV64-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8f32: 1493; RV64: # %bb.0: 1494; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1495; RV64-NEXT: vsext.vf4 v16, v8 1496; RV64-NEXT: vsll.vi v16, v16, 2 1497; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1498; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1499; RV64-NEXT: ret 1500 %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32> 1501 %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %eidxs 1502 %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1503 ret <vscale x 8 x float> %v 1504} 1505 1506define <vscale x 8 x float> @vpgather_baseidx_zext_nxv8i16_nxv8f32(float* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1507; RV32-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8f32: 1508; RV32: # %bb.0: 1509; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1510; RV32-NEXT: vzext.vf2 v12, v8 1511; RV32-NEXT: vsll.vi v8, v12, 2 1512; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1513; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 1514; RV32-NEXT: ret 1515; 1516; RV64-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8f32: 1517; RV64: # %bb.0: 1518; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1519; RV64-NEXT: vzext.vf4 v16, v8 1520; RV64-NEXT: vsll.vi v16, v16, 2 1521; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1522; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1523; RV64-NEXT: ret 1524 %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32> 1525 %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %eidxs 1526 %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1527 ret <vscale x 8 x float> %v 1528} 1529 1530define <vscale x 8 x float> @vpgather_baseidx_nxv8f32(float* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1531; RV32-LABEL: vpgather_baseidx_nxv8f32: 1532; RV32: # %bb.0: 1533; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1534; RV32-NEXT: vsll.vi v8, v8, 2 1535; RV32-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1536; RV32-NEXT: vluxei32.v v8, (a0), v8, v0.t 1537; RV32-NEXT: ret 1538; 1539; RV64-LABEL: vpgather_baseidx_nxv8f32: 1540; RV64: # %bb.0: 1541; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1542; RV64-NEXT: vsext.vf2 v16, v8 1543; RV64-NEXT: vsll.vi v16, v16, 2 1544; RV64-NEXT: vsetvli zero, a1, e32, m4, ta, mu 1545; RV64-NEXT: vluxei64.v v8, (a0), v16, v0.t 1546; RV64-NEXT: ret 1547 %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %idxs 1548 %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1549 ret <vscale x 8 x float> %v 1550} 1551 1552declare <vscale x 1 x double> @llvm.vp.gather.nxv1f64.nxv1p0f64(<vscale x 1 x double*>, <vscale x 1 x i1>, i32) 1553 1554define <vscale x 1 x double> @vpgather_nxv1f64(<vscale x 1 x double*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1555; RV32-LABEL: vpgather_nxv1f64: 1556; RV32: # %bb.0: 1557; RV32-NEXT: vsetvli zero, a0, e64, m1, ta, mu 1558; RV32-NEXT: vluxei32.v v9, (zero), v8, v0.t 1559; RV32-NEXT: vmv1r.v v8, v9 1560; RV32-NEXT: ret 1561; 1562; RV64-LABEL: vpgather_nxv1f64: 1563; RV64: # %bb.0: 1564; RV64-NEXT: vsetvli zero, a0, e64, m1, ta, mu 1565; RV64-NEXT: vluxei64.v v8, (zero), v8, v0.t 1566; RV64-NEXT: ret 1567 %v = call <vscale x 1 x double> @llvm.vp.gather.nxv1f64.nxv1p0f64(<vscale x 1 x double*> %ptrs, <vscale x 1 x i1> %m, i32 %evl) 1568 ret <vscale x 1 x double> %v 1569} 1570 1571declare <vscale x 2 x double> @llvm.vp.gather.nxv2f64.nxv2p0f64(<vscale x 2 x double*>, <vscale x 2 x i1>, i32) 1572 1573define <vscale x 2 x double> @vpgather_nxv2f64(<vscale x 2 x double*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1574; RV32-LABEL: vpgather_nxv2f64: 1575; RV32: # %bb.0: 1576; RV32-NEXT: vsetvli zero, a0, e64, m2, ta, mu 1577; RV32-NEXT: vluxei32.v v10, (zero), v8, v0.t 1578; RV32-NEXT: vmv2r.v v8, v10 1579; RV32-NEXT: ret 1580; 1581; RV64-LABEL: vpgather_nxv2f64: 1582; RV64: # %bb.0: 1583; RV64-NEXT: vsetvli zero, a0, e64, m2, ta, mu 1584; RV64-NEXT: vluxei64.v v8, (zero), v8, v0.t 1585; RV64-NEXT: ret 1586 %v = call <vscale x 2 x double> @llvm.vp.gather.nxv2f64.nxv2p0f64(<vscale x 2 x double*> %ptrs, <vscale x 2 x i1> %m, i32 %evl) 1587 ret <vscale x 2 x double> %v 1588} 1589 1590declare <vscale x 4 x double> @llvm.vp.gather.nxv4f64.nxv4p0f64(<vscale x 4 x double*>, <vscale x 4 x i1>, i32) 1591 1592define <vscale x 4 x double> @vpgather_nxv4f64(<vscale x 4 x double*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1593; RV32-LABEL: vpgather_nxv4f64: 1594; RV32: # %bb.0: 1595; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, mu 1596; RV32-NEXT: vluxei32.v v12, (zero), v8, v0.t 1597; RV32-NEXT: vmv4r.v v8, v12 1598; RV32-NEXT: ret 1599; 1600; RV64-LABEL: vpgather_nxv4f64: 1601; RV64: # %bb.0: 1602; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, mu 1603; RV64-NEXT: vluxei64.v v8, (zero), v8, v0.t 1604; RV64-NEXT: ret 1605 %v = call <vscale x 4 x double> @llvm.vp.gather.nxv4f64.nxv4p0f64(<vscale x 4 x double*> %ptrs, <vscale x 4 x i1> %m, i32 %evl) 1606 ret <vscale x 4 x double> %v 1607} 1608 1609define <vscale x 4 x double> @vpgather_truemask_nxv4f64(<vscale x 4 x double*> %ptrs, i32 zeroext %evl) { 1610; RV32-LABEL: vpgather_truemask_nxv4f64: 1611; RV32: # %bb.0: 1612; RV32-NEXT: vsetvli zero, a0, e64, m4, ta, mu 1613; RV32-NEXT: vluxei32.v v12, (zero), v8 1614; RV32-NEXT: vmv4r.v v8, v12 1615; RV32-NEXT: ret 1616; 1617; RV64-LABEL: vpgather_truemask_nxv4f64: 1618; RV64: # %bb.0: 1619; RV64-NEXT: vsetvli zero, a0, e64, m4, ta, mu 1620; RV64-NEXT: vluxei64.v v8, (zero), v8 1621; RV64-NEXT: ret 1622 %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0 1623 %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer 1624 %v = call <vscale x 4 x double> @llvm.vp.gather.nxv4f64.nxv4p0f64(<vscale x 4 x double*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl) 1625 ret <vscale x 4 x double> %v 1626} 1627 1628declare <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*>, <vscale x 8 x i1>, i32) 1629 1630define <vscale x 8 x double> @vpgather_nxv8f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1631; RV32-LABEL: vpgather_nxv8f64: 1632; RV32: # %bb.0: 1633; RV32-NEXT: vsetvli zero, a0, e64, m8, ta, mu 1634; RV32-NEXT: vluxei32.v v16, (zero), v8, v0.t 1635; RV32-NEXT: vmv8r.v v8, v16 1636; RV32-NEXT: ret 1637; 1638; RV64-LABEL: vpgather_nxv8f64: 1639; RV64: # %bb.0: 1640; RV64-NEXT: vsetvli zero, a0, e64, m8, ta, mu 1641; RV64-NEXT: vluxei64.v v8, (zero), v8, v0.t 1642; RV64-NEXT: ret 1643 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1644 ret <vscale x 8 x double> %v 1645} 1646 1647define <vscale x 8 x double> @vpgather_baseidx_nxv8i8_nxv8f64(double* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1648; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8f64: 1649; RV32: # %bb.0: 1650; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1651; RV32-NEXT: vsext.vf4 v12, v8 1652; RV32-NEXT: vsll.vi v16, v12, 3 1653; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1654; RV32-NEXT: vluxei32.v v8, (a0), v16, v0.t 1655; RV32-NEXT: ret 1656; 1657; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8f64: 1658; RV64: # %bb.0: 1659; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1660; RV64-NEXT: vsext.vf8 v16, v8 1661; RV64-NEXT: vsll.vi v8, v16, 3 1662; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1663; RV64-NEXT: vluxei64.v v8, (a0), v8, v0.t 1664; RV64-NEXT: ret 1665 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i8> %idxs 1666 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1667 ret <vscale x 8 x double> %v 1668} 1669 1670define <vscale x 8 x double> @vpgather_baseidx_sext_nxv8i8_nxv8f64(double* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1671; CHECK-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f64: 1672; CHECK: # %bb.0: 1673; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1674; CHECK-NEXT: vsext.vf8 v16, v8 1675; CHECK-NEXT: vsll.vi v8, v16, 3 1676; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1677; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1678; CHECK-NEXT: ret 1679 %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64> 1680 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs 1681 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1682 ret <vscale x 8 x double> %v 1683} 1684 1685define <vscale x 8 x double> @vpgather_baseidx_zext_nxv8i8_nxv8f64(double* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1686; CHECK-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f64: 1687; CHECK: # %bb.0: 1688; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1689; CHECK-NEXT: vzext.vf8 v16, v8 1690; CHECK-NEXT: vsll.vi v8, v16, 3 1691; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1692; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1693; CHECK-NEXT: ret 1694 %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64> 1695 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs 1696 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1697 ret <vscale x 8 x double> %v 1698} 1699 1700define <vscale x 8 x double> @vpgather_baseidx_nxv8i16_nxv8f64(double* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1701; RV32-LABEL: vpgather_baseidx_nxv8i16_nxv8f64: 1702; RV32: # %bb.0: 1703; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1704; RV32-NEXT: vsext.vf2 v12, v8 1705; RV32-NEXT: vsll.vi v16, v12, 3 1706; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1707; RV32-NEXT: vluxei32.v v8, (a0), v16, v0.t 1708; RV32-NEXT: ret 1709; 1710; RV64-LABEL: vpgather_baseidx_nxv8i16_nxv8f64: 1711; RV64: # %bb.0: 1712; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1713; RV64-NEXT: vsext.vf4 v16, v8 1714; RV64-NEXT: vsll.vi v8, v16, 3 1715; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1716; RV64-NEXT: vluxei64.v v8, (a0), v8, v0.t 1717; RV64-NEXT: ret 1718 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i16> %idxs 1719 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1720 ret <vscale x 8 x double> %v 1721} 1722 1723define <vscale x 8 x double> @vpgather_baseidx_sext_nxv8i16_nxv8f64(double* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1724; CHECK-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8f64: 1725; CHECK: # %bb.0: 1726; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1727; CHECK-NEXT: vsext.vf4 v16, v8 1728; CHECK-NEXT: vsll.vi v8, v16, 3 1729; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1730; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1731; CHECK-NEXT: ret 1732 %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64> 1733 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs 1734 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1735 ret <vscale x 8 x double> %v 1736} 1737 1738define <vscale x 8 x double> @vpgather_baseidx_zext_nxv8i16_nxv8f64(double* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1739; CHECK-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8f64: 1740; CHECK: # %bb.0: 1741; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1742; CHECK-NEXT: vzext.vf4 v16, v8 1743; CHECK-NEXT: vsll.vi v8, v16, 3 1744; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1745; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1746; CHECK-NEXT: ret 1747 %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64> 1748 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs 1749 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1750 ret <vscale x 8 x double> %v 1751} 1752 1753define <vscale x 8 x double> @vpgather_baseidx_nxv8i32_nxv8f64(double* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1754; RV32-LABEL: vpgather_baseidx_nxv8i32_nxv8f64: 1755; RV32: # %bb.0: 1756; RV32-NEXT: vsetvli a2, zero, e32, m4, ta, mu 1757; RV32-NEXT: vsll.vi v16, v8, 3 1758; RV32-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1759; RV32-NEXT: vluxei32.v v8, (a0), v16, v0.t 1760; RV32-NEXT: ret 1761; 1762; RV64-LABEL: vpgather_baseidx_nxv8i32_nxv8f64: 1763; RV64: # %bb.0: 1764; RV64-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1765; RV64-NEXT: vsext.vf2 v16, v8 1766; RV64-NEXT: vsll.vi v8, v16, 3 1767; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1768; RV64-NEXT: vluxei64.v v8, (a0), v8, v0.t 1769; RV64-NEXT: ret 1770 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i32> %idxs 1771 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1772 ret <vscale x 8 x double> %v 1773} 1774 1775define <vscale x 8 x double> @vpgather_baseidx_sext_nxv8i32_nxv8f64(double* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1776; CHECK-LABEL: vpgather_baseidx_sext_nxv8i32_nxv8f64: 1777; CHECK: # %bb.0: 1778; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1779; CHECK-NEXT: vsext.vf2 v16, v8 1780; CHECK-NEXT: vsll.vi v8, v16, 3 1781; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1782; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1783; CHECK-NEXT: ret 1784 %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64> 1785 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs 1786 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1787 ret <vscale x 8 x double> %v 1788} 1789 1790define <vscale x 8 x double> @vpgather_baseidx_zext_nxv8i32_nxv8f64(double* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1791; CHECK-LABEL: vpgather_baseidx_zext_nxv8i32_nxv8f64: 1792; CHECK: # %bb.0: 1793; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1794; CHECK-NEXT: vzext.vf2 v16, v8 1795; CHECK-NEXT: vsll.vi v8, v16, 3 1796; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1797; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1798; CHECK-NEXT: ret 1799 %eidxs = zext <vscale x 8 x i32> %idxs to <vscale x 8 x i64> 1800 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs 1801 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1802 ret <vscale x 8 x double> %v 1803} 1804 1805define <vscale x 8 x double> @vpgather_baseidx_nxv8f64(double* %base, <vscale x 8 x i64> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1806; CHECK-LABEL: vpgather_baseidx_nxv8f64: 1807; CHECK: # %bb.0: 1808; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu 1809; CHECK-NEXT: vsll.vi v8, v8, 3 1810; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, mu 1811; CHECK-NEXT: vluxei64.v v8, (a0), v8, v0.t 1812; CHECK-NEXT: ret 1813 %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %idxs 1814 %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl) 1815 ret <vscale x 8 x double> %v 1816} 1817