brintos

brintos / llvm-project-archived public Read only

0
0
Text · 80.7 KiB · 5eb6553 Raw
1974 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zvfh,+zvfbfmin,+v \3; RUN:     -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \4; RUN:     --check-prefixes=CHECK,RV325; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zvfh,+zvfbfmin,+v \6; RUN:     -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \7; RUN:     --check-prefixes=CHECK,RV648; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zvfhmin,+zvfbfmin,+v \9; RUN:     -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \10; RUN:     --check-prefixes=CHECK,RV3211; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zvfhmin,+zvfbfmin,+v \12; RUN:     -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \13; RUN:     --check-prefixes=CHECK,RV6414 15define void @mscatter_nxv1i8(<vscale x 1 x i8> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m) {16; RV32-LABEL: mscatter_nxv1i8:17; RV32:       # %bb.0:18; RV32-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma19; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t20; RV32-NEXT:    ret21;22; RV64-LABEL: mscatter_nxv1i8:23; RV64:       # %bb.0:24; RV64-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma25; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t26; RV64-NEXT:    ret27  call void @llvm.masked.scatter.nxv1i8.nxv1p0(<vscale x 1 x i8> %val, <vscale x 1 x ptr> %ptrs, i32 1, <vscale x 1 x i1> %m)28  ret void29}30 31define void @mscatter_nxv2i8(<vscale x 2 x i8> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {32; RV32-LABEL: mscatter_nxv2i8:33; RV32:       # %bb.0:34; RV32-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma35; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t36; RV32-NEXT:    ret37;38; RV64-LABEL: mscatter_nxv2i8:39; RV64:       # %bb.0:40; RV64-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma41; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t42; RV64-NEXT:    ret43  call void @llvm.masked.scatter.nxv2i8.nxv2p0(<vscale x 2 x i8> %val, <vscale x 2 x ptr> %ptrs, i32 1, <vscale x 2 x i1> %m)44  ret void45}46 47define void @mscatter_nxv2i16_truncstore_nxv2i8(<vscale x 2 x i16> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {48; RV32-LABEL: mscatter_nxv2i16_truncstore_nxv2i8:49; RV32:       # %bb.0:50; RV32-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma51; RV32-NEXT:    vnsrl.wi v8, v8, 052; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t53; RV32-NEXT:    ret54;55; RV64-LABEL: mscatter_nxv2i16_truncstore_nxv2i8:56; RV64:       # %bb.0:57; RV64-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma58; RV64-NEXT:    vnsrl.wi v8, v8, 059; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t60; RV64-NEXT:    ret61  %tval = trunc <vscale x 2 x i16> %val to <vscale x 2 x i8>62  call void @llvm.masked.scatter.nxv2i8.nxv2p0(<vscale x 2 x i8> %tval, <vscale x 2 x ptr> %ptrs, i32 1, <vscale x 2 x i1> %m)63  ret void64}65 66define void @mscatter_nxv2i32_truncstore_nxv2i8(<vscale x 2 x i32> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {67; RV32-LABEL: mscatter_nxv2i32_truncstore_nxv2i8:68; RV32:       # %bb.0:69; RV32-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma70; RV32-NEXT:    vnsrl.wi v8, v8, 071; RV32-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma72; RV32-NEXT:    vnsrl.wi v8, v8, 073; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t74; RV32-NEXT:    ret75;76; RV64-LABEL: mscatter_nxv2i32_truncstore_nxv2i8:77; RV64:       # %bb.0:78; RV64-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma79; RV64-NEXT:    vnsrl.wi v8, v8, 080; RV64-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma81; RV64-NEXT:    vnsrl.wi v8, v8, 082; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t83; RV64-NEXT:    ret84  %tval = trunc <vscale x 2 x i32> %val to <vscale x 2 x i8>85  call void @llvm.masked.scatter.nxv2i8.nxv2p0(<vscale x 2 x i8> %tval, <vscale x 2 x ptr> %ptrs, i32 1, <vscale x 2 x i1> %m)86  ret void87}88 89define void @mscatter_nxv2i64_truncstore_nxv2i8(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {90; RV32-LABEL: mscatter_nxv2i64_truncstore_nxv2i8:91; RV32:       # %bb.0:92; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, ma93; RV32-NEXT:    vnsrl.wi v11, v8, 094; RV32-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma95; RV32-NEXT:    vnsrl.wi v8, v11, 096; RV32-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma97; RV32-NEXT:    vnsrl.wi v8, v8, 098; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t99; RV32-NEXT:    ret100;101; RV64-LABEL: mscatter_nxv2i64_truncstore_nxv2i8:102; RV64:       # %bb.0:103; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, ma104; RV64-NEXT:    vnsrl.wi v12, v8, 0105; RV64-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma106; RV64-NEXT:    vnsrl.wi v8, v12, 0107; RV64-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma108; RV64-NEXT:    vnsrl.wi v8, v8, 0109; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t110; RV64-NEXT:    ret111  %tval = trunc <vscale x 2 x i64> %val to <vscale x 2 x i8>112  call void @llvm.masked.scatter.nxv2i8.nxv2p0(<vscale x 2 x i8> %tval, <vscale x 2 x ptr> %ptrs, i32 1, <vscale x 2 x i1> %m)113  ret void114}115 116define void @mscatter_nxv4i8(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m) {117; RV32-LABEL: mscatter_nxv4i8:118; RV32:       # %bb.0:119; RV32-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma120; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t121; RV32-NEXT:    ret122;123; RV64-LABEL: mscatter_nxv4i8:124; RV64:       # %bb.0:125; RV64-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma126; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t127; RV64-NEXT:    ret128  call void @llvm.masked.scatter.nxv4i8.nxv4p0(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs, i32 1, <vscale x 4 x i1> %m)129  ret void130}131 132define void @mscatter_truemask_nxv4i8(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs) {133; RV32-LABEL: mscatter_truemask_nxv4i8:134; RV32:       # %bb.0:135; RV32-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma136; RV32-NEXT:    vsoxei32.v v8, (zero), v10137; RV32-NEXT:    ret138;139; RV64-LABEL: mscatter_truemask_nxv4i8:140; RV64:       # %bb.0:141; RV64-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma142; RV64-NEXT:    vsoxei64.v v8, (zero), v12143; RV64-NEXT:    ret144  call void @llvm.masked.scatter.nxv4i8.nxv4p0(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs, i32 1, <vscale x 4 x i1> splat (i1 1))145  ret void146}147 148define void @mscatter_falsemask_nxv4i8(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs) {149; CHECK-LABEL: mscatter_falsemask_nxv4i8:150; CHECK:       # %bb.0:151; CHECK-NEXT:    ret152  call void @llvm.masked.scatter.nxv4i8.nxv4p0(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs, i32 1, <vscale x 4 x i1> zeroinitializer)153  ret void154}155 156define void @mscatter_nxv8i8(<vscale x 8 x i8> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m) {157; RV32-LABEL: mscatter_nxv8i8:158; RV32:       # %bb.0:159; RV32-NEXT:    vsetvli a0, zero, e8, m1, ta, ma160; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t161; RV32-NEXT:    ret162;163; RV64-LABEL: mscatter_nxv8i8:164; RV64:       # %bb.0:165; RV64-NEXT:    vsetvli a0, zero, e8, m1, ta, ma166; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t167; RV64-NEXT:    ret168  call void @llvm.masked.scatter.nxv8i8.nxv8p0(<vscale x 8 x i8> %val, <vscale x 8 x ptr> %ptrs, i32 1, <vscale x 8 x i1> %m)169  ret void170}171 172define void @mscatter_baseidx_nxv8i8(<vscale x 8 x i8> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {173; RV32-LABEL: mscatter_baseidx_nxv8i8:174; RV32:       # %bb.0:175; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma176; RV32-NEXT:    vsext.vf4 v12, v9177; RV32-NEXT:    vsetvli zero, zero, e8, m1, ta, ma178; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t179; RV32-NEXT:    ret180;181; RV64-LABEL: mscatter_baseidx_nxv8i8:182; RV64:       # %bb.0:183; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma184; RV64-NEXT:    vsext.vf8 v16, v9185; RV64-NEXT:    vsetvli zero, zero, e8, m1, ta, ma186; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t187; RV64-NEXT:    ret188  %ptrs = getelementptr inbounds i8, ptr %base, <vscale x 8 x i8> %idxs189  call void @llvm.masked.scatter.nxv8i8.nxv8p0(<vscale x 8 x i8> %val, <vscale x 8 x ptr> %ptrs, i32 1, <vscale x 8 x i1> %m)190  ret void191}192 193define void @mscatter_nxv1i16(<vscale x 1 x i16> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m) {194; RV32-LABEL: mscatter_nxv1i16:195; RV32:       # %bb.0:196; RV32-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma197; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t198; RV32-NEXT:    ret199;200; RV64-LABEL: mscatter_nxv1i16:201; RV64:       # %bb.0:202; RV64-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma203; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t204; RV64-NEXT:    ret205  call void @llvm.masked.scatter.nxv1i16.nxv1p0(<vscale x 1 x i16> %val, <vscale x 1 x ptr> %ptrs, i32 2, <vscale x 1 x i1> %m)206  ret void207}208 209define void @mscatter_nxv2i16(<vscale x 2 x i16> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {210; RV32-LABEL: mscatter_nxv2i16:211; RV32:       # %bb.0:212; RV32-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma213; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t214; RV32-NEXT:    ret215;216; RV64-LABEL: mscatter_nxv2i16:217; RV64:       # %bb.0:218; RV64-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma219; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t220; RV64-NEXT:    ret221  call void @llvm.masked.scatter.nxv2i16.nxv2p0(<vscale x 2 x i16> %val, <vscale x 2 x ptr> %ptrs, i32 2, <vscale x 2 x i1> %m)222  ret void223}224 225define void @mscatter_nxv2i32_truncstore_nxv2i16(<vscale x 2 x i32> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {226; RV32-LABEL: mscatter_nxv2i32_truncstore_nxv2i16:227; RV32:       # %bb.0:228; RV32-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma229; RV32-NEXT:    vnsrl.wi v8, v8, 0230; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t231; RV32-NEXT:    ret232;233; RV64-LABEL: mscatter_nxv2i32_truncstore_nxv2i16:234; RV64:       # %bb.0:235; RV64-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma236; RV64-NEXT:    vnsrl.wi v8, v8, 0237; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t238; RV64-NEXT:    ret239  %tval = trunc <vscale x 2 x i32> %val to <vscale x 2 x i16>240  call void @llvm.masked.scatter.nxv2i16.nxv2p0(<vscale x 2 x i16> %tval, <vscale x 2 x ptr> %ptrs, i32 2, <vscale x 2 x i1> %m)241  ret void242}243 244define void @mscatter_nxv2i64_truncstore_nxv2i16(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {245; RV32-LABEL: mscatter_nxv2i64_truncstore_nxv2i16:246; RV32:       # %bb.0:247; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, ma248; RV32-NEXT:    vnsrl.wi v11, v8, 0249; RV32-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma250; RV32-NEXT:    vnsrl.wi v8, v11, 0251; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t252; RV32-NEXT:    ret253;254; RV64-LABEL: mscatter_nxv2i64_truncstore_nxv2i16:255; RV64:       # %bb.0:256; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, ma257; RV64-NEXT:    vnsrl.wi v12, v8, 0258; RV64-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma259; RV64-NEXT:    vnsrl.wi v8, v12, 0260; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t261; RV64-NEXT:    ret262  %tval = trunc <vscale x 2 x i64> %val to <vscale x 2 x i16>263  call void @llvm.masked.scatter.nxv2i16.nxv2p0(<vscale x 2 x i16> %tval, <vscale x 2 x ptr> %ptrs, i32 2, <vscale x 2 x i1> %m)264  ret void265}266 267define void @mscatter_nxv4i16(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m) {268; RV32-LABEL: mscatter_nxv4i16:269; RV32:       # %bb.0:270; RV32-NEXT:    vsetvli a0, zero, e16, m1, ta, ma271; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t272; RV32-NEXT:    ret273;274; RV64-LABEL: mscatter_nxv4i16:275; RV64:       # %bb.0:276; RV64-NEXT:    vsetvli a0, zero, e16, m1, ta, ma277; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t278; RV64-NEXT:    ret279  call void @llvm.masked.scatter.nxv4i16.nxv4p0(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, i32 2, <vscale x 4 x i1> %m)280  ret void281}282 283define void @mscatter_truemask_nxv4i16(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs) {284; RV32-LABEL: mscatter_truemask_nxv4i16:285; RV32:       # %bb.0:286; RV32-NEXT:    vsetvli a0, zero, e16, m1, ta, ma287; RV32-NEXT:    vsoxei32.v v8, (zero), v10288; RV32-NEXT:    ret289;290; RV64-LABEL: mscatter_truemask_nxv4i16:291; RV64:       # %bb.0:292; RV64-NEXT:    vsetvli a0, zero, e16, m1, ta, ma293; RV64-NEXT:    vsoxei64.v v8, (zero), v12294; RV64-NEXT:    ret295  call void @llvm.masked.scatter.nxv4i16.nxv4p0(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, i32 2, <vscale x 4 x i1> splat (i1 1))296  ret void297}298 299define void @mscatter_falsemask_nxv4i16(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs) {300; CHECK-LABEL: mscatter_falsemask_nxv4i16:301; CHECK:       # %bb.0:302; CHECK-NEXT:    ret303  call void @llvm.masked.scatter.nxv4i16.nxv4p0(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, i32 2, <vscale x 4 x i1> zeroinitializer)304  ret void305}306 307define void @mscatter_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m) {308; RV32-LABEL: mscatter_nxv8i16:309; RV32:       # %bb.0:310; RV32-NEXT:    vsetvli a0, zero, e16, m2, ta, ma311; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t312; RV32-NEXT:    ret313;314; RV64-LABEL: mscatter_nxv8i16:315; RV64:       # %bb.0:316; RV64-NEXT:    vsetvli a0, zero, e16, m2, ta, ma317; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t318; RV64-NEXT:    ret319  call void @llvm.masked.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)320  ret void321}322 323define void @mscatter_baseidx_nxv8i8_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {324; RV32-LABEL: mscatter_baseidx_nxv8i8_nxv8i16:325; RV32:       # %bb.0:326; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma327; RV32-NEXT:    vsext.vf4 v12, v10328; RV32-NEXT:    vadd.vv v12, v12, v12329; RV32-NEXT:    vsetvli zero, zero, e16, m2, ta, ma330; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t331; RV32-NEXT:    ret332;333; RV64-LABEL: mscatter_baseidx_nxv8i8_nxv8i16:334; RV64:       # %bb.0:335; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma336; RV64-NEXT:    vsext.vf8 v16, v10337; RV64-NEXT:    vadd.vv v16, v16, v16338; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma339; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t340; RV64-NEXT:    ret341  %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i8> %idxs342  call void @llvm.masked.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)343  ret void344}345 346define void @mscatter_baseidx_sext_nxv8i8_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {347; RV32-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8i16:348; RV32:       # %bb.0:349; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma350; RV32-NEXT:    vsext.vf4 v12, v10351; RV32-NEXT:    vadd.vv v12, v12, v12352; RV32-NEXT:    vsetvli zero, zero, e16, m2, ta, ma353; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t354; RV32-NEXT:    ret355;356; RV64-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8i16:357; RV64:       # %bb.0:358; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma359; RV64-NEXT:    vsext.vf8 v16, v10360; RV64-NEXT:    vadd.vv v16, v16, v16361; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma362; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t363; RV64-NEXT:    ret364  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>365  %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i16> %eidxs366  call void @llvm.masked.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)367  ret void368}369 370define void @mscatter_baseidx_zext_nxv8i8_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {371; CHECK-LABEL: mscatter_baseidx_zext_nxv8i8_nxv8i16:372; CHECK:       # %bb.0:373; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma374; CHECK-NEXT:    vwaddu.vv v12, v10, v10375; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma376; CHECK-NEXT:    vsoxei16.v v8, (a0), v12, v0.t377; CHECK-NEXT:    ret378  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>379  %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i16> %eidxs380  call void @llvm.masked.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)381  ret void382}383 384define void @mscatter_baseidx_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {385; RV32-LABEL: mscatter_baseidx_nxv8i16:386; RV32:       # %bb.0:387; RV32-NEXT:    vsetvli a1, zero, e16, m2, ta, ma388; RV32-NEXT:    vwadd.vv v12, v10, v10389; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t390; RV32-NEXT:    ret391;392; RV64-LABEL: mscatter_baseidx_nxv8i16:393; RV64:       # %bb.0:394; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma395; RV64-NEXT:    vsext.vf4 v16, v10396; RV64-NEXT:    vadd.vv v16, v16, v16397; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma398; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t399; RV64-NEXT:    ret400  %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i16> %idxs401  call void @llvm.masked.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)402  ret void403}404 405define void @mscatter_nxv1i32(<vscale x 1 x i32> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m) {406; RV32-LABEL: mscatter_nxv1i32:407; RV32:       # %bb.0:408; RV32-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma409; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t410; RV32-NEXT:    ret411;412; RV64-LABEL: mscatter_nxv1i32:413; RV64:       # %bb.0:414; RV64-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma415; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t416; RV64-NEXT:    ret417  call void @llvm.masked.scatter.nxv1i32.nxv1p0(<vscale x 1 x i32> %val, <vscale x 1 x ptr> %ptrs, i32 4, <vscale x 1 x i1> %m)418  ret void419}420 421define void @mscatter_nxv2i32(<vscale x 2 x i32> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {422; RV32-LABEL: mscatter_nxv2i32:423; RV32:       # %bb.0:424; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, ma425; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t426; RV32-NEXT:    ret427;428; RV64-LABEL: mscatter_nxv2i32:429; RV64:       # %bb.0:430; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, ma431; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t432; RV64-NEXT:    ret433  call void @llvm.masked.scatter.nxv2i32.nxv2p0(<vscale x 2 x i32> %val, <vscale x 2 x ptr> %ptrs, i32 4, <vscale x 2 x i1> %m)434  ret void435}436 437define void @mscatter_nxv2i64_truncstore_nxv2i32(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {438; RV32-LABEL: mscatter_nxv2i64_truncstore_nxv2i32:439; RV32:       # %bb.0:440; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, ma441; RV32-NEXT:    vnsrl.wi v11, v8, 0442; RV32-NEXT:    vsoxei32.v v11, (zero), v10, v0.t443; RV32-NEXT:    ret444;445; RV64-LABEL: mscatter_nxv2i64_truncstore_nxv2i32:446; RV64:       # %bb.0:447; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, ma448; RV64-NEXT:    vnsrl.wi v12, v8, 0449; RV64-NEXT:    vsoxei64.v v12, (zero), v10, v0.t450; RV64-NEXT:    ret451  %tval = trunc <vscale x 2 x i64> %val to <vscale x 2 x i32>452  call void @llvm.masked.scatter.nxv2i32.nxv2p0(<vscale x 2 x i32> %tval, <vscale x 2 x ptr> %ptrs, i32 4, <vscale x 2 x i1> %m)453  ret void454}455 456define void @mscatter_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m) {457; RV32-LABEL: mscatter_nxv4i32:458; RV32:       # %bb.0:459; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, ma460; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t461; RV32-NEXT:    ret462;463; RV64-LABEL: mscatter_nxv4i32:464; RV64:       # %bb.0:465; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, ma466; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t467; RV64-NEXT:    ret468  call void @llvm.masked.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, i32 4, <vscale x 4 x i1> %m)469  ret void470}471 472define void @mscatter_truemask_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs) {473; RV32-LABEL: mscatter_truemask_nxv4i32:474; RV32:       # %bb.0:475; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, ma476; RV32-NEXT:    vsoxei32.v v8, (zero), v10477; RV32-NEXT:    ret478;479; RV64-LABEL: mscatter_truemask_nxv4i32:480; RV64:       # %bb.0:481; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, ma482; RV64-NEXT:    vsoxei64.v v8, (zero), v12483; RV64-NEXT:    ret484  call void @llvm.masked.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, i32 4, <vscale x 4 x i1> splat (i1 1))485  ret void486}487 488define void @mscatter_falsemask_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs) {489; CHECK-LABEL: mscatter_falsemask_nxv4i32:490; CHECK:       # %bb.0:491; CHECK-NEXT:    ret492  call void @llvm.masked.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, i32 4, <vscale x 4 x i1> zeroinitializer)493  ret void494}495 496define void @mscatter_nxv8i32(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m) {497; RV32-LABEL: mscatter_nxv8i32:498; RV32:       # %bb.0:499; RV32-NEXT:    vsetvli a0, zero, e32, m4, ta, ma500; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t501; RV32-NEXT:    ret502;503; RV64-LABEL: mscatter_nxv8i32:504; RV64:       # %bb.0:505; RV64-NEXT:    vsetvli a0, zero, e32, m4, ta, ma506; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t507; RV64-NEXT:    ret508  call void @llvm.masked.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)509  ret void510}511 512define void @mscatter_baseidx_nxv8i8_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {513; RV32-LABEL: mscatter_baseidx_nxv8i8_nxv8i32:514; RV32:       # %bb.0:515; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma516; RV32-NEXT:    vsext.vf4 v16, v12517; RV32-NEXT:    vsll.vi v12, v16, 2518; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t519; RV32-NEXT:    ret520;521; RV64-LABEL: mscatter_baseidx_nxv8i8_nxv8i32:522; RV64:       # %bb.0:523; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma524; RV64-NEXT:    vsext.vf8 v16, v12525; RV64-NEXT:    vsll.vi v16, v16, 2526; RV64-NEXT:    vsetvli zero, zero, e32, m4, ta, ma527; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t528; RV64-NEXT:    ret529  %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i8> %idxs530  call void @llvm.masked.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)531  ret void532}533 534define void @mscatter_baseidx_sext_nxv8i8_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {535; RV32-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8i32:536; RV32:       # %bb.0:537; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma538; RV32-NEXT:    vsext.vf4 v16, v12539; RV32-NEXT:    vsll.vi v12, v16, 2540; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t541; RV32-NEXT:    ret542;543; RV64-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8i32:544; RV64:       # %bb.0:545; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma546; RV64-NEXT:    vsext.vf8 v16, v12547; RV64-NEXT:    vsll.vi v16, v16, 2548; RV64-NEXT:    vsetvli zero, zero, e32, m4, ta, ma549; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t550; RV64-NEXT:    ret551  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>552  %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs553  call void @llvm.masked.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)554  ret void555}556 557define void @mscatter_baseidx_zext_nxv8i8_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {558; CHECK-LABEL: mscatter_baseidx_zext_nxv8i8_nxv8i32:559; CHECK:       # %bb.0:560; CHECK-NEXT:    li a1, 4561; CHECK-NEXT:    vsetvli a2, zero, e8, m1, ta, ma562; CHECK-NEXT:    vwmulu.vx v14, v12, a1563; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma564; CHECK-NEXT:    vsoxei16.v v8, (a0), v14, v0.t565; CHECK-NEXT:    ret566  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>567  %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs568  call void @llvm.masked.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)569  ret void570}571 572define void @mscatter_baseidx_nxv8i16_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {573; RV32-LABEL: mscatter_baseidx_nxv8i16_nxv8i32:574; RV32:       # %bb.0:575; RV32-NEXT:    li a1, 4576; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma577; RV32-NEXT:    vwmulsu.vx v16, v12, a1578; RV32-NEXT:    vsetvli zero, zero, e32, m4, ta, ma579; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t580; RV32-NEXT:    ret581;582; RV64-LABEL: mscatter_baseidx_nxv8i16_nxv8i32:583; RV64:       # %bb.0:584; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma585; RV64-NEXT:    vsext.vf4 v16, v12586; RV64-NEXT:    vsll.vi v16, v16, 2587; RV64-NEXT:    vsetvli zero, zero, e32, m4, ta, ma588; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t589; RV64-NEXT:    ret590  %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i16> %idxs591  call void @llvm.masked.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)592  ret void593}594 595define void @mscatter_baseidx_sext_nxv8i16_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {596; RV32-LABEL: mscatter_baseidx_sext_nxv8i16_nxv8i32:597; RV32:       # %bb.0:598; RV32-NEXT:    li a1, 4599; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma600; RV32-NEXT:    vwmulsu.vx v16, v12, a1601; RV32-NEXT:    vsetvli zero, zero, e32, m4, ta, ma602; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t603; RV32-NEXT:    ret604;605; RV64-LABEL: mscatter_baseidx_sext_nxv8i16_nxv8i32:606; RV64:       # %bb.0:607; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma608; RV64-NEXT:    vsext.vf4 v16, v12609; RV64-NEXT:    vsll.vi v16, v16, 2610; RV64-NEXT:    vsetvli zero, zero, e32, m4, ta, ma611; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t612; RV64-NEXT:    ret613  %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>614  %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs615  call void @llvm.masked.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)616  ret void617}618 619define void @mscatter_baseidx_zext_nxv8i16_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {620; CHECK-LABEL: mscatter_baseidx_zext_nxv8i16_nxv8i32:621; CHECK:       # %bb.0:622; CHECK-NEXT:    li a1, 4623; CHECK-NEXT:    vsetvli a2, zero, e16, m2, ta, ma624; CHECK-NEXT:    vwmulu.vx v16, v12, a1625; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma626; CHECK-NEXT:    vsoxei32.v v8, (a0), v16, v0.t627; CHECK-NEXT:    ret628  %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>629  %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs630  call void @llvm.masked.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)631  ret void632}633 634define void @mscatter_baseidx_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m) {635; RV32-LABEL: mscatter_baseidx_nxv8i32:636; RV32:       # %bb.0:637; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma638; RV32-NEXT:    vsll.vi v12, v12, 2639; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t640; RV32-NEXT:    ret641;642; RV64-LABEL: mscatter_baseidx_nxv8i32:643; RV64:       # %bb.0:644; RV64-NEXT:    li a1, 4645; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma646; RV64-NEXT:    vwmulsu.vx v16, v12, a1647; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t648; RV64-NEXT:    ret649  %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %idxs650  call void @llvm.masked.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)651  ret void652}653 654define void @mscatter_nxv1i64(<vscale x 1 x i64> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m) {655; RV32-LABEL: mscatter_nxv1i64:656; RV32:       # %bb.0:657; RV32-NEXT:    vsetvli a0, zero, e64, m1, ta, ma658; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t659; RV32-NEXT:    ret660;661; RV64-LABEL: mscatter_nxv1i64:662; RV64:       # %bb.0:663; RV64-NEXT:    vsetvli a0, zero, e64, m1, ta, ma664; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t665; RV64-NEXT:    ret666  call void @llvm.masked.scatter.nxv1i64.nxv1p0(<vscale x 1 x i64> %val, <vscale x 1 x ptr> %ptrs, i32 8, <vscale x 1 x i1> %m)667  ret void668}669 670define void @mscatter_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {671; RV32-LABEL: mscatter_nxv2i64:672; RV32:       # %bb.0:673; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, ma674; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t675; RV32-NEXT:    ret676;677; RV64-LABEL: mscatter_nxv2i64:678; RV64:       # %bb.0:679; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, ma680; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t681; RV64-NEXT:    ret682  call void @llvm.masked.scatter.nxv2i64.nxv2p0(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, i32 8, <vscale x 2 x i1> %m)683  ret void684}685 686define void @mscatter_nxv4i64(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m) {687; RV32-LABEL: mscatter_nxv4i64:688; RV32:       # %bb.0:689; RV32-NEXT:    vsetvli a0, zero, e64, m4, ta, ma690; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t691; RV32-NEXT:    ret692;693; RV64-LABEL: mscatter_nxv4i64:694; RV64:       # %bb.0:695; RV64-NEXT:    vsetvli a0, zero, e64, m4, ta, ma696; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t697; RV64-NEXT:    ret698  call void @llvm.masked.scatter.nxv4i64.nxv4p0(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, i32 8, <vscale x 4 x i1> %m)699  ret void700}701 702define void @mscatter_truemask_nxv4i64(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs) {703; RV32-LABEL: mscatter_truemask_nxv4i64:704; RV32:       # %bb.0:705; RV32-NEXT:    vsetvli a0, zero, e64, m4, ta, ma706; RV32-NEXT:    vsoxei32.v v8, (zero), v12707; RV32-NEXT:    ret708;709; RV64-LABEL: mscatter_truemask_nxv4i64:710; RV64:       # %bb.0:711; RV64-NEXT:    vsetvli a0, zero, e64, m4, ta, ma712; RV64-NEXT:    vsoxei64.v v8, (zero), v12713; RV64-NEXT:    ret714  call void @llvm.masked.scatter.nxv4i64.nxv4p0(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, i32 8, <vscale x 4 x i1> splat (i1 1))715  ret void716}717 718define void @mscatter_falsemask_nxv4i64(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs) {719; CHECK-LABEL: mscatter_falsemask_nxv4i64:720; CHECK:       # %bb.0:721; CHECK-NEXT:    ret722  call void @llvm.masked.scatter.nxv4i64.nxv4p0(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, i32 8, <vscale x 4 x i1> zeroinitializer)723  ret void724}725 726define void @mscatter_nxv8i64(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m) {727; RV32-LABEL: mscatter_nxv8i64:728; RV32:       # %bb.0:729; RV32-NEXT:    vsetvli a0, zero, e64, m8, ta, ma730; RV32-NEXT:    vsoxei32.v v8, (zero), v16, v0.t731; RV32-NEXT:    ret732;733; RV64-LABEL: mscatter_nxv8i64:734; RV64:       # %bb.0:735; RV64-NEXT:    vsetvli a0, zero, e64, m8, ta, ma736; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t737; RV64-NEXT:    ret738  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)739  ret void740}741 742define void @mscatter_baseidx_nxv8i8_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {743; RV32-LABEL: mscatter_baseidx_nxv8i8_nxv8i64:744; RV32:       # %bb.0:745; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma746; RV32-NEXT:    vsext.vf4 v20, v16747; RV32-NEXT:    vsll.vi v16, v20, 3748; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma749; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t750; RV32-NEXT:    ret751;752; RV64-LABEL: mscatter_baseidx_nxv8i8_nxv8i64:753; RV64:       # %bb.0:754; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma755; RV64-NEXT:    vsext.vf8 v24, v16756; RV64-NEXT:    vsll.vi v16, v24, 3757; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t758; RV64-NEXT:    ret759  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i8> %idxs760  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)761  ret void762}763 764define void @mscatter_baseidx_sext_nxv8i8_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {765; RV32-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8i64:766; RV32:       # %bb.0:767; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma768; RV32-NEXT:    vsext.vf4 v20, v16769; RV32-NEXT:    vsll.vi v16, v20, 3770; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma771; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t772; RV32-NEXT:    ret773;774; RV64-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8i64:775; RV64:       # %bb.0:776; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma777; RV64-NEXT:    vsext.vf8 v24, v16778; RV64-NEXT:    vsll.vi v16, v24, 3779; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t780; RV64-NEXT:    ret781  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>782  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs783  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)784  ret void785}786 787define void @mscatter_baseidx_zext_nxv8i8_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {788; CHECK-LABEL: mscatter_baseidx_zext_nxv8i8_nxv8i64:789; CHECK:       # %bb.0:790; CHECK-NEXT:    li a1, 8791; CHECK-NEXT:    vsetvli a2, zero, e8, m1, ta, ma792; CHECK-NEXT:    vwmulu.vx v18, v16, a1793; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, ma794; CHECK-NEXT:    vsoxei16.v v8, (a0), v18, v0.t795; CHECK-NEXT:    ret796  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>797  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs798  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)799  ret void800}801 802define void @mscatter_baseidx_nxv8i16_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {803; RV32-LABEL: mscatter_baseidx_nxv8i16_nxv8i64:804; RV32:       # %bb.0:805; RV32-NEXT:    li a1, 8806; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma807; RV32-NEXT:    vwmulsu.vx v20, v16, a1808; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma809; RV32-NEXT:    vsoxei32.v v8, (a0), v20, v0.t810; RV32-NEXT:    ret811;812; RV64-LABEL: mscatter_baseidx_nxv8i16_nxv8i64:813; RV64:       # %bb.0:814; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma815; RV64-NEXT:    vsext.vf4 v24, v16816; RV64-NEXT:    vsll.vi v16, v24, 3817; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t818; RV64-NEXT:    ret819  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i16> %idxs820  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)821  ret void822}823 824define void @mscatter_baseidx_sext_nxv8i16_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {825; RV32-LABEL: mscatter_baseidx_sext_nxv8i16_nxv8i64:826; RV32:       # %bb.0:827; RV32-NEXT:    li a1, 8828; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma829; RV32-NEXT:    vwmulsu.vx v20, v16, a1830; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma831; RV32-NEXT:    vsoxei32.v v8, (a0), v20, v0.t832; RV32-NEXT:    ret833;834; RV64-LABEL: mscatter_baseidx_sext_nxv8i16_nxv8i64:835; RV64:       # %bb.0:836; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma837; RV64-NEXT:    vsext.vf4 v24, v16838; RV64-NEXT:    vsll.vi v16, v24, 3839; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t840; RV64-NEXT:    ret841  %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>842  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs843  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)844  ret void845}846 847define void @mscatter_baseidx_zext_nxv8i16_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {848; CHECK-LABEL: mscatter_baseidx_zext_nxv8i16_nxv8i64:849; CHECK:       # %bb.0:850; CHECK-NEXT:    li a1, 8851; CHECK-NEXT:    vsetvli a2, zero, e16, m2, ta, ma852; CHECK-NEXT:    vwmulu.vx v20, v16, a1853; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, ma854; CHECK-NEXT:    vsoxei32.v v8, (a0), v20, v0.t855; CHECK-NEXT:    ret856  %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>857  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs858  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)859  ret void860}861 862define void @mscatter_baseidx_nxv8i32_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m) {863; RV32-LABEL: mscatter_baseidx_nxv8i32_nxv8i64:864; RV32:       # %bb.0:865; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma866; RV32-NEXT:    vsll.vi v16, v16, 3867; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma868; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t869; RV32-NEXT:    ret870;871; RV64-LABEL: mscatter_baseidx_nxv8i32_nxv8i64:872; RV64:       # %bb.0:873; RV64-NEXT:    li a1, 8874; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma875; RV64-NEXT:    vwmulsu.vx v24, v16, a1876; RV64-NEXT:    vsetvli zero, zero, e64, m8, ta, ma877; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t878; RV64-NEXT:    ret879  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i32> %idxs880  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)881  ret void882}883 884define void @mscatter_baseidx_sext_nxv8i32_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m) {885; RV32-LABEL: mscatter_baseidx_sext_nxv8i32_nxv8i64:886; RV32:       # %bb.0:887; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma888; RV32-NEXT:    vsll.vi v16, v16, 3889; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma890; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t891; RV32-NEXT:    ret892;893; RV64-LABEL: mscatter_baseidx_sext_nxv8i32_nxv8i64:894; RV64:       # %bb.0:895; RV64-NEXT:    li a1, 8896; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma897; RV64-NEXT:    vwmulsu.vx v24, v16, a1898; RV64-NEXT:    vsetvli zero, zero, e64, m8, ta, ma899; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t900; RV64-NEXT:    ret901  %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>902  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs903  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)904  ret void905}906 907define void @mscatter_baseidx_zext_nxv8i32_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m) {908; RV32-LABEL: mscatter_baseidx_zext_nxv8i32_nxv8i64:909; RV32:       # %bb.0:910; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma911; RV32-NEXT:    vsll.vi v16, v16, 3912; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma913; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t914; RV32-NEXT:    ret915;916; RV64-LABEL: mscatter_baseidx_zext_nxv8i32_nxv8i64:917; RV64:       # %bb.0:918; RV64-NEXT:    li a1, 8919; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma920; RV64-NEXT:    vwmulu.vx v24, v16, a1921; RV64-NEXT:    vsetvli zero, zero, e64, m8, ta, ma922; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t923; RV64-NEXT:    ret924  %eidxs = zext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>925  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs926  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)927  ret void928}929 930define void @mscatter_baseidx_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i64> %idxs, <vscale x 8 x i1> %m) {931; RV32-LABEL: mscatter_baseidx_nxv8i64:932; RV32:       # %bb.0:933; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma934; RV32-NEXT:    vnsrl.wi v24, v16, 0935; RV32-NEXT:    vsll.vi v16, v24, 3936; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma937; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t938; RV32-NEXT:    ret939;940; RV64-LABEL: mscatter_baseidx_nxv8i64:941; RV64:       # %bb.0:942; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma943; RV64-NEXT:    vsll.vi v16, v16, 3944; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t945; RV64-NEXT:    ret946  %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %idxs947  call void @llvm.masked.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)948  ret void949}950 951define void @mscatter_nxv1bf16(<vscale x 1 x bfloat> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m) {952; RV32-LABEL: mscatter_nxv1bf16:953; RV32:       # %bb.0:954; RV32-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma955; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t956; RV32-NEXT:    ret957;958; RV64-LABEL: mscatter_nxv1bf16:959; RV64:       # %bb.0:960; RV64-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma961; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t962; RV64-NEXT:    ret963  call void @llvm.masked.scatter.nxv1bf16.nxv1p0(<vscale x 1 x bfloat> %val, <vscale x 1 x ptr> %ptrs, i32 2, <vscale x 1 x i1> %m)964  ret void965}966 967define void @mscatter_nxv2bf16(<vscale x 2 x bfloat> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {968; RV32-LABEL: mscatter_nxv2bf16:969; RV32:       # %bb.0:970; RV32-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma971; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t972; RV32-NEXT:    ret973;974; RV64-LABEL: mscatter_nxv2bf16:975; RV64:       # %bb.0:976; RV64-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma977; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t978; RV64-NEXT:    ret979  call void @llvm.masked.scatter.nxv2bf16.nxv2p0(<vscale x 2 x bfloat> %val, <vscale x 2 x ptr> %ptrs, i32 2, <vscale x 2 x i1> %m)980  ret void981}982 983define void @mscatter_nxv4bf16(<vscale x 4 x bfloat> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m) {984; RV32-LABEL: mscatter_nxv4bf16:985; RV32:       # %bb.0:986; RV32-NEXT:    vsetvli a0, zero, e16, m1, ta, ma987; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t988; RV32-NEXT:    ret989;990; RV64-LABEL: mscatter_nxv4bf16:991; RV64:       # %bb.0:992; RV64-NEXT:    vsetvli a0, zero, e16, m1, ta, ma993; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t994; RV64-NEXT:    ret995  call void @llvm.masked.scatter.nxv4bf16.nxv4p0(<vscale x 4 x bfloat> %val, <vscale x 4 x ptr> %ptrs, i32 2, <vscale x 4 x i1> %m)996  ret void997}998 999define void @mscatter_truemask_nxv4bf16(<vscale x 4 x bfloat> %val, <vscale x 4 x ptr> %ptrs) {1000; RV32-LABEL: mscatter_truemask_nxv4bf16:1001; RV32:       # %bb.0:1002; RV32-NEXT:    vsetvli a0, zero, e16, m1, ta, ma1003; RV32-NEXT:    vsoxei32.v v8, (zero), v101004; RV32-NEXT:    ret1005;1006; RV64-LABEL: mscatter_truemask_nxv4bf16:1007; RV64:       # %bb.0:1008; RV64-NEXT:    vsetvli a0, zero, e16, m1, ta, ma1009; RV64-NEXT:    vsoxei64.v v8, (zero), v121010; RV64-NEXT:    ret1011  call void @llvm.masked.scatter.nxv4bf16.nxv4p0(<vscale x 4 x bfloat> %val, <vscale x 4 x ptr> %ptrs, i32 2, <vscale x 4 x i1> splat (i1 1))1012  ret void1013}1014 1015define void @mscatter_falsemask_nxv4bf16(<vscale x 4 x bfloat> %val, <vscale x 4 x ptr> %ptrs) {1016; CHECK-LABEL: mscatter_falsemask_nxv4bf16:1017; CHECK:       # %bb.0:1018; CHECK-NEXT:    ret1019  call void @llvm.masked.scatter.nxv4bf16.nxv4p0(<vscale x 4 x bfloat> %val, <vscale x 4 x ptr> %ptrs, i32 2, <vscale x 4 x i1> zeroinitializer)1020  ret void1021}1022 1023define void @mscatter_nxv8bf16(<vscale x 8 x bfloat> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m) {1024; RV32-LABEL: mscatter_nxv8bf16:1025; RV32:       # %bb.0:1026; RV32-NEXT:    vsetvli a0, zero, e16, m2, ta, ma1027; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t1028; RV32-NEXT:    ret1029;1030; RV64-LABEL: mscatter_nxv8bf16:1031; RV64:       # %bb.0:1032; RV64-NEXT:    vsetvli a0, zero, e16, m2, ta, ma1033; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t1034; RV64-NEXT:    ret1035  call void @llvm.masked.scatter.nxv8bf16.nxv8p0(<vscale x 8 x bfloat> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1036  ret void1037}1038 1039define void @mscatter_baseidx_nxv8i8_nxv8bf16(<vscale x 8 x bfloat> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1040; RV32-LABEL: mscatter_baseidx_nxv8i8_nxv8bf16:1041; RV32:       # %bb.0:1042; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1043; RV32-NEXT:    vsext.vf4 v12, v101044; RV32-NEXT:    vadd.vv v12, v12, v121045; RV32-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1046; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t1047; RV32-NEXT:    ret1048;1049; RV64-LABEL: mscatter_baseidx_nxv8i8_nxv8bf16:1050; RV64:       # %bb.0:1051; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1052; RV64-NEXT:    vsext.vf8 v16, v101053; RV64-NEXT:    vadd.vv v16, v16, v161054; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1055; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1056; RV64-NEXT:    ret1057  %ptrs = getelementptr inbounds bfloat, ptr %base, <vscale x 8 x i8> %idxs1058  call void @llvm.masked.scatter.nxv8bf16.nxv8p0(<vscale x 8 x bfloat> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1059  ret void1060}1061 1062define void @mscatter_baseidx_sext_nxv8i8_nxv8bf16(<vscale x 8 x bfloat> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1063; RV32-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8bf16:1064; RV32:       # %bb.0:1065; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1066; RV32-NEXT:    vsext.vf4 v12, v101067; RV32-NEXT:    vadd.vv v12, v12, v121068; RV32-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1069; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t1070; RV32-NEXT:    ret1071;1072; RV64-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8bf16:1073; RV64:       # %bb.0:1074; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1075; RV64-NEXT:    vsext.vf8 v16, v101076; RV64-NEXT:    vadd.vv v16, v16, v161077; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1078; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1079; RV64-NEXT:    ret1080  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>1081  %ptrs = getelementptr inbounds bfloat, ptr %base, <vscale x 8 x i16> %eidxs1082  call void @llvm.masked.scatter.nxv8bf16.nxv8p0(<vscale x 8 x bfloat> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1083  ret void1084}1085 1086define void @mscatter_baseidx_zext_nxv8i8_nxv8bf16(<vscale x 8 x bfloat> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1087; CHECK-LABEL: mscatter_baseidx_zext_nxv8i8_nxv8bf16:1088; CHECK:       # %bb.0:1089; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma1090; CHECK-NEXT:    vwaddu.vv v12, v10, v101091; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1092; CHECK-NEXT:    vsoxei16.v v8, (a0), v12, v0.t1093; CHECK-NEXT:    ret1094  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>1095  %ptrs = getelementptr inbounds bfloat, ptr %base, <vscale x 8 x i16> %eidxs1096  call void @llvm.masked.scatter.nxv8bf16.nxv8p0(<vscale x 8 x bfloat> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1097  ret void1098}1099 1100define void @mscatter_baseidx_nxv8bf16(<vscale x 8 x bfloat> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {1101; RV32-LABEL: mscatter_baseidx_nxv8bf16:1102; RV32:       # %bb.0:1103; RV32-NEXT:    vsetvli a1, zero, e16, m2, ta, ma1104; RV32-NEXT:    vwadd.vv v12, v10, v101105; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t1106; RV32-NEXT:    ret1107;1108; RV64-LABEL: mscatter_baseidx_nxv8bf16:1109; RV64:       # %bb.0:1110; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1111; RV64-NEXT:    vsext.vf4 v16, v101112; RV64-NEXT:    vadd.vv v16, v16, v161113; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1114; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1115; RV64-NEXT:    ret1116  %ptrs = getelementptr inbounds bfloat, ptr %base, <vscale x 8 x i16> %idxs1117  call void @llvm.masked.scatter.nxv8bf16.nxv8p0(<vscale x 8 x bfloat> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1118  ret void1119}1120 1121define void @mscatter_nxv1f16(<vscale x 1 x half> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m) {1122; RV32-LABEL: mscatter_nxv1f16:1123; RV32:       # %bb.0:1124; RV32-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma1125; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t1126; RV32-NEXT:    ret1127;1128; RV64-LABEL: mscatter_nxv1f16:1129; RV64:       # %bb.0:1130; RV64-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma1131; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t1132; RV64-NEXT:    ret1133  call void @llvm.masked.scatter.nxv1f16.nxv1p0(<vscale x 1 x half> %val, <vscale x 1 x ptr> %ptrs, i32 2, <vscale x 1 x i1> %m)1134  ret void1135}1136 1137define void @mscatter_nxv2f16(<vscale x 2 x half> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {1138; RV32-LABEL: mscatter_nxv2f16:1139; RV32:       # %bb.0:1140; RV32-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma1141; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t1142; RV32-NEXT:    ret1143;1144; RV64-LABEL: mscatter_nxv2f16:1145; RV64:       # %bb.0:1146; RV64-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma1147; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t1148; RV64-NEXT:    ret1149  call void @llvm.masked.scatter.nxv2f16.nxv2p0(<vscale x 2 x half> %val, <vscale x 2 x ptr> %ptrs, i32 2, <vscale x 2 x i1> %m)1150  ret void1151}1152 1153define void @mscatter_nxv4f16(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m) {1154; RV32-LABEL: mscatter_nxv4f16:1155; RV32:       # %bb.0:1156; RV32-NEXT:    vsetvli a0, zero, e16, m1, ta, ma1157; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t1158; RV32-NEXT:    ret1159;1160; RV64-LABEL: mscatter_nxv4f16:1161; RV64:       # %bb.0:1162; RV64-NEXT:    vsetvli a0, zero, e16, m1, ta, ma1163; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t1164; RV64-NEXT:    ret1165  call void @llvm.masked.scatter.nxv4f16.nxv4p0(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, i32 2, <vscale x 4 x i1> %m)1166  ret void1167}1168 1169define void @mscatter_truemask_nxv4f16(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs) {1170; RV32-LABEL: mscatter_truemask_nxv4f16:1171; RV32:       # %bb.0:1172; RV32-NEXT:    vsetvli a0, zero, e16, m1, ta, ma1173; RV32-NEXT:    vsoxei32.v v8, (zero), v101174; RV32-NEXT:    ret1175;1176; RV64-LABEL: mscatter_truemask_nxv4f16:1177; RV64:       # %bb.0:1178; RV64-NEXT:    vsetvli a0, zero, e16, m1, ta, ma1179; RV64-NEXT:    vsoxei64.v v8, (zero), v121180; RV64-NEXT:    ret1181  call void @llvm.masked.scatter.nxv4f16.nxv4p0(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, i32 2, <vscale x 4 x i1> splat (i1 1))1182  ret void1183}1184 1185define void @mscatter_falsemask_nxv4f16(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs) {1186; CHECK-LABEL: mscatter_falsemask_nxv4f16:1187; CHECK:       # %bb.0:1188; CHECK-NEXT:    ret1189  call void @llvm.masked.scatter.nxv4f16.nxv4p0(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, i32 2, <vscale x 4 x i1> zeroinitializer)1190  ret void1191}1192 1193define void @mscatter_nxv8f16(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m) {1194; RV32-LABEL: mscatter_nxv8f16:1195; RV32:       # %bb.0:1196; RV32-NEXT:    vsetvli a0, zero, e16, m2, ta, ma1197; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t1198; RV32-NEXT:    ret1199;1200; RV64-LABEL: mscatter_nxv8f16:1201; RV64:       # %bb.0:1202; RV64-NEXT:    vsetvli a0, zero, e16, m2, ta, ma1203; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t1204; RV64-NEXT:    ret1205  call void @llvm.masked.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1206  ret void1207}1208 1209define void @mscatter_baseidx_nxv8i8_nxv8f16(<vscale x 8 x half> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1210; RV32-LABEL: mscatter_baseidx_nxv8i8_nxv8f16:1211; RV32:       # %bb.0:1212; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1213; RV32-NEXT:    vsext.vf4 v12, v101214; RV32-NEXT:    vadd.vv v12, v12, v121215; RV32-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1216; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t1217; RV32-NEXT:    ret1218;1219; RV64-LABEL: mscatter_baseidx_nxv8i8_nxv8f16:1220; RV64:       # %bb.0:1221; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1222; RV64-NEXT:    vsext.vf8 v16, v101223; RV64-NEXT:    vadd.vv v16, v16, v161224; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1225; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1226; RV64-NEXT:    ret1227  %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i8> %idxs1228  call void @llvm.masked.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1229  ret void1230}1231 1232define void @mscatter_baseidx_sext_nxv8i8_nxv8f16(<vscale x 8 x half> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1233; RV32-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8f16:1234; RV32:       # %bb.0:1235; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1236; RV32-NEXT:    vsext.vf4 v12, v101237; RV32-NEXT:    vadd.vv v12, v12, v121238; RV32-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1239; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t1240; RV32-NEXT:    ret1241;1242; RV64-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8f16:1243; RV64:       # %bb.0:1244; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1245; RV64-NEXT:    vsext.vf8 v16, v101246; RV64-NEXT:    vadd.vv v16, v16, v161247; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1248; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1249; RV64-NEXT:    ret1250  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>1251  %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i16> %eidxs1252  call void @llvm.masked.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1253  ret void1254}1255 1256define void @mscatter_baseidx_zext_nxv8i8_nxv8f16(<vscale x 8 x half> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1257; CHECK-LABEL: mscatter_baseidx_zext_nxv8i8_nxv8f16:1258; CHECK:       # %bb.0:1259; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma1260; CHECK-NEXT:    vwaddu.vv v12, v10, v101261; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1262; CHECK-NEXT:    vsoxei16.v v8, (a0), v12, v0.t1263; CHECK-NEXT:    ret1264  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>1265  %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i16> %eidxs1266  call void @llvm.masked.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1267  ret void1268}1269 1270define void @mscatter_baseidx_nxv8f16(<vscale x 8 x half> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {1271; RV32-LABEL: mscatter_baseidx_nxv8f16:1272; RV32:       # %bb.0:1273; RV32-NEXT:    vsetvli a1, zero, e16, m2, ta, ma1274; RV32-NEXT:    vwadd.vv v12, v10, v101275; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t1276; RV32-NEXT:    ret1277;1278; RV64-LABEL: mscatter_baseidx_nxv8f16:1279; RV64:       # %bb.0:1280; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1281; RV64-NEXT:    vsext.vf4 v16, v101282; RV64-NEXT:    vadd.vv v16, v16, v161283; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma1284; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1285; RV64-NEXT:    ret1286  %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i16> %idxs1287  call void @llvm.masked.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, i32 2, <vscale x 8 x i1> %m)1288  ret void1289}1290 1291define void @mscatter_nxv1f32(<vscale x 1 x float> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m) {1292; RV32-LABEL: mscatter_nxv1f32:1293; RV32:       # %bb.0:1294; RV32-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma1295; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t1296; RV32-NEXT:    ret1297;1298; RV64-LABEL: mscatter_nxv1f32:1299; RV64:       # %bb.0:1300; RV64-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma1301; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t1302; RV64-NEXT:    ret1303  call void @llvm.masked.scatter.nxv1f32.nxv1p0(<vscale x 1 x float> %val, <vscale x 1 x ptr> %ptrs, i32 4, <vscale x 1 x i1> %m)1304  ret void1305}1306 1307define void @mscatter_nxv2f32(<vscale x 2 x float> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {1308; RV32-LABEL: mscatter_nxv2f32:1309; RV32:       # %bb.0:1310; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, ma1311; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t1312; RV32-NEXT:    ret1313;1314; RV64-LABEL: mscatter_nxv2f32:1315; RV64:       # %bb.0:1316; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, ma1317; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t1318; RV64-NEXT:    ret1319  call void @llvm.masked.scatter.nxv2f32.nxv2p0(<vscale x 2 x float> %val, <vscale x 2 x ptr> %ptrs, i32 4, <vscale x 2 x i1> %m)1320  ret void1321}1322 1323define void @mscatter_nxv4f32(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m) {1324; RV32-LABEL: mscatter_nxv4f32:1325; RV32:       # %bb.0:1326; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, ma1327; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t1328; RV32-NEXT:    ret1329;1330; RV64-LABEL: mscatter_nxv4f32:1331; RV64:       # %bb.0:1332; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, ma1333; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t1334; RV64-NEXT:    ret1335  call void @llvm.masked.scatter.nxv4f32.nxv4p0(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, i32 4, <vscale x 4 x i1> %m)1336  ret void1337}1338 1339define void @mscatter_truemask_nxv4f32(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs) {1340; RV32-LABEL: mscatter_truemask_nxv4f32:1341; RV32:       # %bb.0:1342; RV32-NEXT:    vsetvli a0, zero, e32, m2, ta, ma1343; RV32-NEXT:    vsoxei32.v v8, (zero), v101344; RV32-NEXT:    ret1345;1346; RV64-LABEL: mscatter_truemask_nxv4f32:1347; RV64:       # %bb.0:1348; RV64-NEXT:    vsetvli a0, zero, e32, m2, ta, ma1349; RV64-NEXT:    vsoxei64.v v8, (zero), v121350; RV64-NEXT:    ret1351  call void @llvm.masked.scatter.nxv4f32.nxv4p0(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, i32 4, <vscale x 4 x i1> splat (i1 1))1352  ret void1353}1354 1355define void @mscatter_falsemask_nxv4f32(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs) {1356; CHECK-LABEL: mscatter_falsemask_nxv4f32:1357; CHECK:       # %bb.0:1358; CHECK-NEXT:    ret1359  call void @llvm.masked.scatter.nxv4f32.nxv4p0(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, i32 4, <vscale x 4 x i1> zeroinitializer)1360  ret void1361}1362 1363define void @mscatter_nxv8f32(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m) {1364; RV32-LABEL: mscatter_nxv8f32:1365; RV32:       # %bb.0:1366; RV32-NEXT:    vsetvli a0, zero, e32, m4, ta, ma1367; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t1368; RV32-NEXT:    ret1369;1370; RV64-LABEL: mscatter_nxv8f32:1371; RV64:       # %bb.0:1372; RV64-NEXT:    vsetvli a0, zero, e32, m4, ta, ma1373; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t1374; RV64-NEXT:    ret1375  call void @llvm.masked.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)1376  ret void1377}1378 1379define void @mscatter_baseidx_nxv8i8_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1380; RV32-LABEL: mscatter_baseidx_nxv8i8_nxv8f32:1381; RV32:       # %bb.0:1382; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1383; RV32-NEXT:    vsext.vf4 v16, v121384; RV32-NEXT:    vsll.vi v12, v16, 21385; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t1386; RV32-NEXT:    ret1387;1388; RV64-LABEL: mscatter_baseidx_nxv8i8_nxv8f32:1389; RV64:       # %bb.0:1390; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1391; RV64-NEXT:    vsext.vf8 v16, v121392; RV64-NEXT:    vsll.vi v16, v16, 21393; RV64-NEXT:    vsetvli zero, zero, e32, m4, ta, ma1394; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1395; RV64-NEXT:    ret1396  %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i8> %idxs1397  call void @llvm.masked.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)1398  ret void1399}1400 1401define void @mscatter_baseidx_sext_nxv8i8_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1402; RV32-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8f32:1403; RV32:       # %bb.0:1404; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1405; RV32-NEXT:    vsext.vf4 v16, v121406; RV32-NEXT:    vsll.vi v12, v16, 21407; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t1408; RV32-NEXT:    ret1409;1410; RV64-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8f32:1411; RV64:       # %bb.0:1412; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1413; RV64-NEXT:    vsext.vf8 v16, v121414; RV64-NEXT:    vsll.vi v16, v16, 21415; RV64-NEXT:    vsetvli zero, zero, e32, m4, ta, ma1416; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1417; RV64-NEXT:    ret1418  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>1419  %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs1420  call void @llvm.masked.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)1421  ret void1422}1423 1424define void @mscatter_baseidx_zext_nxv8i8_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1425; CHECK-LABEL: mscatter_baseidx_zext_nxv8i8_nxv8f32:1426; CHECK:       # %bb.0:1427; CHECK-NEXT:    li a1, 41428; CHECK-NEXT:    vsetvli a2, zero, e8, m1, ta, ma1429; CHECK-NEXT:    vwmulu.vx v14, v12, a11430; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma1431; CHECK-NEXT:    vsoxei16.v v8, (a0), v14, v0.t1432; CHECK-NEXT:    ret1433  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>1434  %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs1435  call void @llvm.masked.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)1436  ret void1437}1438 1439define void @mscatter_baseidx_nxv8i16_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {1440; RV32-LABEL: mscatter_baseidx_nxv8i16_nxv8f32:1441; RV32:       # %bb.0:1442; RV32-NEXT:    li a1, 41443; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma1444; RV32-NEXT:    vwmulsu.vx v16, v12, a11445; RV32-NEXT:    vsetvli zero, zero, e32, m4, ta, ma1446; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t1447; RV32-NEXT:    ret1448;1449; RV64-LABEL: mscatter_baseidx_nxv8i16_nxv8f32:1450; RV64:       # %bb.0:1451; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1452; RV64-NEXT:    vsext.vf4 v16, v121453; RV64-NEXT:    vsll.vi v16, v16, 21454; RV64-NEXT:    vsetvli zero, zero, e32, m4, ta, ma1455; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1456; RV64-NEXT:    ret1457  %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i16> %idxs1458  call void @llvm.masked.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)1459  ret void1460}1461 1462define void @mscatter_baseidx_sext_nxv8i16_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {1463; RV32-LABEL: mscatter_baseidx_sext_nxv8i16_nxv8f32:1464; RV32:       # %bb.0:1465; RV32-NEXT:    li a1, 41466; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma1467; RV32-NEXT:    vwmulsu.vx v16, v12, a11468; RV32-NEXT:    vsetvli zero, zero, e32, m4, ta, ma1469; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t1470; RV32-NEXT:    ret1471;1472; RV64-LABEL: mscatter_baseidx_sext_nxv8i16_nxv8f32:1473; RV64:       # %bb.0:1474; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1475; RV64-NEXT:    vsext.vf4 v16, v121476; RV64-NEXT:    vsll.vi v16, v16, 21477; RV64-NEXT:    vsetvli zero, zero, e32, m4, ta, ma1478; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1479; RV64-NEXT:    ret1480  %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>1481  %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs1482  call void @llvm.masked.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)1483  ret void1484}1485 1486define void @mscatter_baseidx_zext_nxv8i16_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {1487; CHECK-LABEL: mscatter_baseidx_zext_nxv8i16_nxv8f32:1488; CHECK:       # %bb.0:1489; CHECK-NEXT:    li a1, 41490; CHECK-NEXT:    vsetvli a2, zero, e16, m2, ta, ma1491; CHECK-NEXT:    vwmulu.vx v16, v12, a11492; CHECK-NEXT:    vsetvli zero, zero, e32, m4, ta, ma1493; CHECK-NEXT:    vsoxei32.v v8, (a0), v16, v0.t1494; CHECK-NEXT:    ret1495  %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>1496  %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs1497  call void @llvm.masked.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)1498  ret void1499}1500 1501define void @mscatter_baseidx_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m) {1502; RV32-LABEL: mscatter_baseidx_nxv8f32:1503; RV32:       # %bb.0:1504; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1505; RV32-NEXT:    vsll.vi v12, v12, 21506; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t1507; RV32-NEXT:    ret1508;1509; RV64-LABEL: mscatter_baseidx_nxv8f32:1510; RV64:       # %bb.0:1511; RV64-NEXT:    li a1, 41512; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma1513; RV64-NEXT:    vwmulsu.vx v16, v12, a11514; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1515; RV64-NEXT:    ret1516  %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %idxs1517  call void @llvm.masked.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, i32 4, <vscale x 8 x i1> %m)1518  ret void1519}1520 1521define void @mscatter_nxv1f64(<vscale x 1 x double> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m) {1522; RV32-LABEL: mscatter_nxv1f64:1523; RV32:       # %bb.0:1524; RV32-NEXT:    vsetvli a0, zero, e64, m1, ta, ma1525; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t1526; RV32-NEXT:    ret1527;1528; RV64-LABEL: mscatter_nxv1f64:1529; RV64:       # %bb.0:1530; RV64-NEXT:    vsetvli a0, zero, e64, m1, ta, ma1531; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t1532; RV64-NEXT:    ret1533  call void @llvm.masked.scatter.nxv1f64.nxv1p0(<vscale x 1 x double> %val, <vscale x 1 x ptr> %ptrs, i32 8, <vscale x 1 x i1> %m)1534  ret void1535}1536 1537define void @mscatter_nxv2f64(<vscale x 2 x double> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m) {1538; RV32-LABEL: mscatter_nxv2f64:1539; RV32:       # %bb.0:1540; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, ma1541; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t1542; RV32-NEXT:    ret1543;1544; RV64-LABEL: mscatter_nxv2f64:1545; RV64:       # %bb.0:1546; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, ma1547; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t1548; RV64-NEXT:    ret1549  call void @llvm.masked.scatter.nxv2f64.nxv2p0(<vscale x 2 x double> %val, <vscale x 2 x ptr> %ptrs, i32 8, <vscale x 2 x i1> %m)1550  ret void1551}1552 1553define void @mscatter_nxv4f64(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m) {1554; RV32-LABEL: mscatter_nxv4f64:1555; RV32:       # %bb.0:1556; RV32-NEXT:    vsetvli a0, zero, e64, m4, ta, ma1557; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t1558; RV32-NEXT:    ret1559;1560; RV64-LABEL: mscatter_nxv4f64:1561; RV64:       # %bb.0:1562; RV64-NEXT:    vsetvli a0, zero, e64, m4, ta, ma1563; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t1564; RV64-NEXT:    ret1565  call void @llvm.masked.scatter.nxv4f64.nxv4p0(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, i32 8, <vscale x 4 x i1> %m)1566  ret void1567}1568 1569define void @mscatter_truemask_nxv4f64(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs) {1570; RV32-LABEL: mscatter_truemask_nxv4f64:1571; RV32:       # %bb.0:1572; RV32-NEXT:    vsetvli a0, zero, e64, m4, ta, ma1573; RV32-NEXT:    vsoxei32.v v8, (zero), v121574; RV32-NEXT:    ret1575;1576; RV64-LABEL: mscatter_truemask_nxv4f64:1577; RV64:       # %bb.0:1578; RV64-NEXT:    vsetvli a0, zero, e64, m4, ta, ma1579; RV64-NEXT:    vsoxei64.v v8, (zero), v121580; RV64-NEXT:    ret1581  call void @llvm.masked.scatter.nxv4f64.nxv4p0(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, i32 8, <vscale x 4 x i1> splat (i1 1))1582  ret void1583}1584 1585define void @mscatter_falsemask_nxv4f64(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs) {1586; CHECK-LABEL: mscatter_falsemask_nxv4f64:1587; CHECK:       # %bb.0:1588; CHECK-NEXT:    ret1589  call void @llvm.masked.scatter.nxv4f64.nxv4p0(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, i32 8, <vscale x 4 x i1> zeroinitializer)1590  ret void1591}1592 1593define void @mscatter_nxv8f64(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m) {1594; RV32-LABEL: mscatter_nxv8f64:1595; RV32:       # %bb.0:1596; RV32-NEXT:    vsetvli a0, zero, e64, m8, ta, ma1597; RV32-NEXT:    vsoxei32.v v8, (zero), v16, v0.t1598; RV32-NEXT:    ret1599;1600; RV64-LABEL: mscatter_nxv8f64:1601; RV64:       # %bb.0:1602; RV64-NEXT:    vsetvli a0, zero, e64, m8, ta, ma1603; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t1604; RV64-NEXT:    ret1605  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1606  ret void1607}1608 1609define void @mscatter_baseidx_nxv8i8_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1610; RV32-LABEL: mscatter_baseidx_nxv8i8_nxv8f64:1611; RV32:       # %bb.0:1612; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1613; RV32-NEXT:    vsext.vf4 v20, v161614; RV32-NEXT:    vsll.vi v16, v20, 31615; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1616; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t1617; RV32-NEXT:    ret1618;1619; RV64-LABEL: mscatter_baseidx_nxv8i8_nxv8f64:1620; RV64:       # %bb.0:1621; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1622; RV64-NEXT:    vsext.vf8 v24, v161623; RV64-NEXT:    vsll.vi v16, v24, 31624; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1625; RV64-NEXT:    ret1626  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i8> %idxs1627  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1628  ret void1629}1630 1631define void @mscatter_baseidx_sext_nxv8i8_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1632; RV32-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8f64:1633; RV32:       # %bb.0:1634; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1635; RV32-NEXT:    vsext.vf4 v20, v161636; RV32-NEXT:    vsll.vi v16, v20, 31637; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1638; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t1639; RV32-NEXT:    ret1640;1641; RV64-LABEL: mscatter_baseidx_sext_nxv8i8_nxv8f64:1642; RV64:       # %bb.0:1643; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1644; RV64-NEXT:    vsext.vf8 v24, v161645; RV64-NEXT:    vsll.vi v16, v24, 31646; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1647; RV64-NEXT:    ret1648  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>1649  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs1650  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1651  ret void1652}1653 1654define void @mscatter_baseidx_zext_nxv8i8_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m) {1655; CHECK-LABEL: mscatter_baseidx_zext_nxv8i8_nxv8f64:1656; CHECK:       # %bb.0:1657; CHECK-NEXT:    li a1, 81658; CHECK-NEXT:    vsetvli a2, zero, e8, m1, ta, ma1659; CHECK-NEXT:    vwmulu.vx v18, v16, a11660; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1661; CHECK-NEXT:    vsoxei16.v v8, (a0), v18, v0.t1662; CHECK-NEXT:    ret1663  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>1664  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs1665  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1666  ret void1667}1668 1669define void @mscatter_baseidx_nxv8i16_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {1670; RV32-LABEL: mscatter_baseidx_nxv8i16_nxv8f64:1671; RV32:       # %bb.0:1672; RV32-NEXT:    li a1, 81673; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma1674; RV32-NEXT:    vwmulsu.vx v20, v16, a11675; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1676; RV32-NEXT:    vsoxei32.v v8, (a0), v20, v0.t1677; RV32-NEXT:    ret1678;1679; RV64-LABEL: mscatter_baseidx_nxv8i16_nxv8f64:1680; RV64:       # %bb.0:1681; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1682; RV64-NEXT:    vsext.vf4 v24, v161683; RV64-NEXT:    vsll.vi v16, v24, 31684; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1685; RV64-NEXT:    ret1686  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i16> %idxs1687  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1688  ret void1689}1690 1691define void @mscatter_baseidx_sext_nxv8i16_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {1692; RV32-LABEL: mscatter_baseidx_sext_nxv8i16_nxv8f64:1693; RV32:       # %bb.0:1694; RV32-NEXT:    li a1, 81695; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma1696; RV32-NEXT:    vwmulsu.vx v20, v16, a11697; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1698; RV32-NEXT:    vsoxei32.v v8, (a0), v20, v0.t1699; RV32-NEXT:    ret1700;1701; RV64-LABEL: mscatter_baseidx_sext_nxv8i16_nxv8f64:1702; RV64:       # %bb.0:1703; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1704; RV64-NEXT:    vsext.vf4 v24, v161705; RV64-NEXT:    vsll.vi v16, v24, 31706; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1707; RV64-NEXT:    ret1708  %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>1709  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs1710  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1711  ret void1712}1713 1714define void @mscatter_baseidx_zext_nxv8i16_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m) {1715; CHECK-LABEL: mscatter_baseidx_zext_nxv8i16_nxv8f64:1716; CHECK:       # %bb.0:1717; CHECK-NEXT:    li a1, 81718; CHECK-NEXT:    vsetvli a2, zero, e16, m2, ta, ma1719; CHECK-NEXT:    vwmulu.vx v20, v16, a11720; CHECK-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1721; CHECK-NEXT:    vsoxei32.v v8, (a0), v20, v0.t1722; CHECK-NEXT:    ret1723  %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>1724  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs1725  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1726  ret void1727}1728 1729define void @mscatter_baseidx_nxv8i32_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m) {1730; RV32-LABEL: mscatter_baseidx_nxv8i32_nxv8f64:1731; RV32:       # %bb.0:1732; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1733; RV32-NEXT:    vsll.vi v16, v16, 31734; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1735; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t1736; RV32-NEXT:    ret1737;1738; RV64-LABEL: mscatter_baseidx_nxv8i32_nxv8f64:1739; RV64:       # %bb.0:1740; RV64-NEXT:    li a1, 81741; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma1742; RV64-NEXT:    vwmulsu.vx v24, v16, a11743; RV64-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1744; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t1745; RV64-NEXT:    ret1746  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i32> %idxs1747  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1748  ret void1749}1750 1751define void @mscatter_baseidx_sext_nxv8i32_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m) {1752; RV32-LABEL: mscatter_baseidx_sext_nxv8i32_nxv8f64:1753; RV32:       # %bb.0:1754; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1755; RV32-NEXT:    vsll.vi v16, v16, 31756; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1757; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t1758; RV32-NEXT:    ret1759;1760; RV64-LABEL: mscatter_baseidx_sext_nxv8i32_nxv8f64:1761; RV64:       # %bb.0:1762; RV64-NEXT:    li a1, 81763; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma1764; RV64-NEXT:    vwmulsu.vx v24, v16, a11765; RV64-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1766; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t1767; RV64-NEXT:    ret1768  %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>1769  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs1770  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1771  ret void1772}1773 1774define void @mscatter_baseidx_zext_nxv8i32_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m) {1775; RV32-LABEL: mscatter_baseidx_zext_nxv8i32_nxv8f64:1776; RV32:       # %bb.0:1777; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1778; RV32-NEXT:    vsll.vi v16, v16, 31779; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1780; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t1781; RV32-NEXT:    ret1782;1783; RV64-LABEL: mscatter_baseidx_zext_nxv8i32_nxv8f64:1784; RV64:       # %bb.0:1785; RV64-NEXT:    li a1, 81786; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma1787; RV64-NEXT:    vwmulu.vx v24, v16, a11788; RV64-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1789; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t1790; RV64-NEXT:    ret1791  %eidxs = zext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>1792  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs1793  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1794  ret void1795}1796 1797define void @mscatter_baseidx_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i64> %idxs, <vscale x 8 x i1> %m) {1798; RV32-LABEL: mscatter_baseidx_nxv8f64:1799; RV32:       # %bb.0:1800; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, ma1801; RV32-NEXT:    vnsrl.wi v24, v16, 01802; RV32-NEXT:    vsll.vi v16, v24, 31803; RV32-NEXT:    vsetvli zero, zero, e64, m8, ta, ma1804; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t1805; RV32-NEXT:    ret1806;1807; RV64-LABEL: mscatter_baseidx_nxv8f64:1808; RV64:       # %bb.0:1809; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1810; RV64-NEXT:    vsll.vi v16, v16, 31811; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t1812; RV64-NEXT:    ret1813  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %idxs1814  call void @llvm.masked.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, i32 8, <vscale x 8 x i1> %m)1815  ret void1816}1817 1818define void @mscatter_nxv16f64(<vscale x 8 x double> %val0, <vscale x 8 x double> %val1, <vscale x 8 x ptr> %ptrs0, <vscale x 8 x ptr> %ptrs1, <vscale x 16 x i1> %m) {1819; RV32-LABEL: mscatter_nxv16f64:1820; RV32:       # %bb.0:1821; RV32-NEXT:    vl4re32.v v24, (a0)1822; RV32-NEXT:    vl4re32.v v28, (a1)1823; RV32-NEXT:    csrr a0, vlenb1824; RV32-NEXT:    srli a0, a0, 31825; RV32-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1826; RV32-NEXT:    vsoxei32.v v8, (zero), v24, v0.t1827; RV32-NEXT:    vsetvli a1, zero, e8, mf4, ta, ma1828; RV32-NEXT:    vslidedown.vx v0, v0, a01829; RV32-NEXT:    vsetvli a0, zero, e64, m8, ta, ma1830; RV32-NEXT:    vsoxei32.v v16, (zero), v28, v0.t1831; RV32-NEXT:    ret1832;1833; RV64-LABEL: mscatter_nxv16f64:1834; RV64:       # %bb.0:1835; RV64-NEXT:    addi sp, sp, -161836; RV64-NEXT:    .cfi_def_cfa_offset 161837; RV64-NEXT:    csrr a2, vlenb1838; RV64-NEXT:    slli a2, a2, 41839; RV64-NEXT:    sub sp, sp, a21840; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb1841; RV64-NEXT:    addi a2, sp, 161842; RV64-NEXT:    vs8r.v v8, (a2) # vscale x 64-byte Folded Spill1843; RV64-NEXT:    vl8re64.v v8, (a0)1844; RV64-NEXT:    vl8re64.v v24, (a1)1845; RV64-NEXT:    csrr a0, vlenb1846; RV64-NEXT:    slli a0, a0, 31847; RV64-NEXT:    add a0, sp, a01848; RV64-NEXT:    addi a0, a0, 161849; RV64-NEXT:    vs8r.v v24, (a0) # vscale x 64-byte Folded Spill1850; RV64-NEXT:    addi a0, sp, 161851; RV64-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload1852; RV64-NEXT:    vsetvli a0, zero, e64, m8, ta, ma1853; RV64-NEXT:    vsoxei64.v v24, (zero), v8, v0.t1854; RV64-NEXT:    csrr a0, vlenb1855; RV64-NEXT:    srli a0, a0, 31856; RV64-NEXT:    vsetvli a1, zero, e8, mf4, ta, ma1857; RV64-NEXT:    vslidedown.vx v0, v0, a01858; RV64-NEXT:    csrr a0, vlenb1859; RV64-NEXT:    slli a0, a0, 31860; RV64-NEXT:    add a0, sp, a01861; RV64-NEXT:    addi a0, a0, 161862; RV64-NEXT:    vl8r.v v8, (a0) # vscale x 64-byte Folded Reload1863; RV64-NEXT:    vsetvli a0, zero, e64, m8, ta, ma1864; RV64-NEXT:    vsoxei64.v v16, (zero), v8, v0.t1865; RV64-NEXT:    csrr a0, vlenb1866; RV64-NEXT:    slli a0, a0, 41867; RV64-NEXT:    add sp, sp, a01868; RV64-NEXT:    .cfi_def_cfa sp, 161869; RV64-NEXT:    addi sp, sp, 161870; RV64-NEXT:    .cfi_def_cfa_offset 01871; RV64-NEXT:    ret1872  %p0 = call <vscale x 16 x ptr> @llvm.vector.insert.nxv8p0.nxv16p0(<vscale x 16 x ptr> poison, <vscale x 8 x ptr> %ptrs0, i64 0)1873  %p1 = call <vscale x 16 x ptr> @llvm.vector.insert.nxv8p0.nxv16p0(<vscale x 16 x ptr> %p0, <vscale x 8 x ptr> %ptrs1, i64 8)1874  %v0 = call <vscale x 16 x double> @llvm.vector.insert.nxv8f64.nxv16f64(<vscale x 16 x double> poison, <vscale x 8 x double> %val0, i64 0)1875  %v1 = call <vscale x 16 x double> @llvm.vector.insert.nxv8f64.nxv16f64(<vscale x 16 x double> %v0, <vscale x 8 x double> %val1, i64 8)1876  call void @llvm.masked.scatter.nxv16f64.nxv16p0(<vscale x 16 x double> %v1, <vscale x 16 x ptr> %p1, i32 8, <vscale x 16 x i1> %m)1877  ret void1878}1879 1880define void @mscatter_baseidx_nxv16i8_nxv16f64(<vscale x 8 x double> %val0, <vscale x 8 x double> %val1, ptr %base, <vscale x 16 x i8> %idxs, <vscale x 16 x i1> %m) {1881; RV32-LABEL: mscatter_baseidx_nxv16i8_nxv16f64:1882; RV32:       # %bb.0:1883; RV32-NEXT:    vl2r.v v6, (a1)1884; RV32-NEXT:    csrr a1, vlenb1885; RV32-NEXT:    srli a1, a1, 31886; RV32-NEXT:    vsetvli a2, zero, e32, m8, ta, ma1887; RV32-NEXT:    vsext.vf4 v24, v61888; RV32-NEXT:    vsll.vi v24, v24, 31889; RV32-NEXT:    vsetvli a2, zero, e64, m8, ta, ma1890; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t1891; RV32-NEXT:    vsetvli a2, zero, e8, mf4, ta, ma1892; RV32-NEXT:    vslidedown.vx v0, v0, a11893; RV32-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1894; RV32-NEXT:    vsoxei32.v v16, (a0), v28, v0.t1895; RV32-NEXT:    ret1896;1897; RV64-LABEL: mscatter_baseidx_nxv16i8_nxv16f64:1898; RV64:       # %bb.0:1899; RV64-NEXT:    vl2r.v v6, (a1)1900; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1901; RV64-NEXT:    vsext.vf8 v24, v61902; RV64-NEXT:    vsll.vi v24, v24, 31903; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t1904; RV64-NEXT:    csrr a1, vlenb1905; RV64-NEXT:    srli a1, a1, 31906; RV64-NEXT:    vsext.vf8 v8, v71907; RV64-NEXT:    vsetvli a2, zero, e8, mf4, ta, ma1908; RV64-NEXT:    vslidedown.vx v0, v0, a11909; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1910; RV64-NEXT:    vsll.vi v8, v8, 31911; RV64-NEXT:    vsoxei64.v v16, (a0), v8, v0.t1912; RV64-NEXT:    ret1913  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 16 x i8> %idxs1914  %v0 = call <vscale x 16 x double> @llvm.vector.insert.nxv8f64.nxv16f64(<vscale x 16 x double> poison, <vscale x 8 x double> %val0, i64 0)1915  %v1 = call <vscale x 16 x double> @llvm.vector.insert.nxv8f64.nxv16f64(<vscale x 16 x double> %v0, <vscale x 8 x double> %val1, i64 8)1916  call void @llvm.masked.scatter.nxv16f64.nxv16p0(<vscale x 16 x double> %v1, <vscale x 16 x ptr> %ptrs, i32 8, <vscale x 16 x i1> %m)1917  ret void1918}1919 1920define void @mscatter_baseidx_nxv16i16_nxv16f64(<vscale x 8 x double> %val0, <vscale x 8 x double> %val1, ptr %base, <vscale x 16 x i16> %idxs, <vscale x 16 x i1> %m) {1921; RV32-LABEL: mscatter_baseidx_nxv16i16_nxv16f64:1922; RV32:       # %bb.0:1923; RV32-NEXT:    vl4re16.v v4, (a1)1924; RV32-NEXT:    li a1, 81925; RV32-NEXT:    vsetvli a2, zero, e16, m4, ta, ma1926; RV32-NEXT:    vwmulsu.vx v24, v4, a11927; RV32-NEXT:    csrr a1, vlenb1928; RV32-NEXT:    srli a1, a1, 31929; RV32-NEXT:    vsetvli a2, zero, e64, m8, ta, ma1930; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t1931; RV32-NEXT:    vsetvli a2, zero, e8, mf4, ta, ma1932; RV32-NEXT:    vslidedown.vx v0, v0, a11933; RV32-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1934; RV32-NEXT:    vsoxei32.v v16, (a0), v28, v0.t1935; RV32-NEXT:    ret1936;1937; RV64-LABEL: mscatter_baseidx_nxv16i16_nxv16f64:1938; RV64:       # %bb.0:1939; RV64-NEXT:    vl4re16.v v4, (a1)1940; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1941; RV64-NEXT:    vsext.vf4 v24, v41942; RV64-NEXT:    vsll.vi v24, v24, 31943; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t1944; RV64-NEXT:    csrr a1, vlenb1945; RV64-NEXT:    srli a1, a1, 31946; RV64-NEXT:    vsext.vf4 v8, v61947; RV64-NEXT:    vsetvli a2, zero, e8, mf4, ta, ma1948; RV64-NEXT:    vslidedown.vx v0, v0, a11949; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma1950; RV64-NEXT:    vsll.vi v8, v8, 31951; RV64-NEXT:    vsoxei64.v v16, (a0), v8, v0.t1952; RV64-NEXT:    ret1953  %ptrs = getelementptr inbounds double, ptr %base, <vscale x 16 x i16> %idxs1954  %v0 = call <vscale x 16 x double> @llvm.vector.insert.nxv8f64.nxv16f64(<vscale x 16 x double> poison, <vscale x 8 x double> %val0, i64 0)1955  %v1 = call <vscale x 16 x double> @llvm.vector.insert.nxv8f64.nxv16f64(<vscale x 16 x double> %v0, <vscale x 8 x double> %val1, i64 8)1956  call void @llvm.masked.scatter.nxv16f64.nxv16p0(<vscale x 16 x double> %v1, <vscale x 16 x ptr> %ptrs, i32 8, <vscale x 16 x i1> %m)1957  ret void1958}1959 1960define void @mscatter_baseidx_zext_nxv1i1_nxv1i8(<vscale x 1 x i8> %val, ptr %base, <vscale x 1 x i1> %idxs, <vscale x 1 x i1> %m) {1961; CHECK-LABEL: mscatter_baseidx_zext_nxv1i1_nxv1i8:1962; CHECK:       # %bb.0:1963; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, ma1964; CHECK-NEXT:    vmv.v.i v10, 01965; CHECK-NEXT:    vmerge.vim v10, v10, 1, v01966; CHECK-NEXT:    vmv1r.v v0, v91967; CHECK-NEXT:    vsoxei8.v v8, (a0), v10, v0.t1968; CHECK-NEXT:    ret1969  %eidxs = zext <vscale x 1 x i1> %idxs to <vscale x 1 x i8>1970  %ptrs = getelementptr inbounds i8, ptr %base, <vscale x 1 x i8> %eidxs1971  call void @llvm.masked.scatter.nxv1i8.nxv1p0(<vscale x 1 x i8> %val, <vscale x 1 x ptr> %ptrs, i32 1, <vscale x 1 x i1> %m)1972  ret void1973}1974