1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s 3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s 4 5define <vscale x 1 x i1> @insertelt_nxv1i1(<vscale x 1 x i1> %x, i1 %elt) { 6; CHECK-LABEL: insertelt_nxv1i1: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 9; CHECK-NEXT: vmv.v.i v8, 0 10; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 11; CHECK-NEXT: vmv.s.x v9, a0 12; CHECK-NEXT: vsetivli zero, 3, e8, mf8, tu, ma 13; CHECK-NEXT: vslideup.vi v8, v9, 2 14; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 15; CHECK-NEXT: vand.vi v8, v8, 1 16; CHECK-NEXT: vmsne.vi v0, v8, 0 17; CHECK-NEXT: ret 18 %y = insertelement <vscale x 1 x i1> %x, i1 %elt, i64 2 19 ret <vscale x 1 x i1> %y 20} 21 22define <vscale x 1 x i1> @insertelt_idx_nxv1i1(<vscale x 1 x i1> %x, i1 %elt, i64 %idx) { 23; CHECK-LABEL: insertelt_idx_nxv1i1: 24; CHECK: # %bb.0: 25; CHECK-NEXT: vsetvli a2, zero, e8, mf8, ta, ma 26; CHECK-NEXT: vmv.v.i v8, 0 27; CHECK-NEXT: addi a2, a1, 1 28; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 29; CHECK-NEXT: vmv.s.x v9, a0 30; CHECK-NEXT: vsetvli zero, a2, e8, mf8, tu, ma 31; CHECK-NEXT: vslideup.vx v8, v9, a1 32; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 33; CHECK-NEXT: vand.vi v8, v8, 1 34; CHECK-NEXT: vmsne.vi v0, v8, 0 35; CHECK-NEXT: ret 36 %y = insertelement <vscale x 1 x i1> %x, i1 %elt, i64 %idx 37 ret <vscale x 1 x i1> %y 38} 39 40define <vscale x 2 x i1> @insertelt_nxv2i1(<vscale x 2 x i1> %x, i1 %elt) { 41; CHECK-LABEL: insertelt_nxv2i1: 42; CHECK: # %bb.0: 43; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 44; CHECK-NEXT: vmv.v.i v8, 0 45; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 46; CHECK-NEXT: vmv.s.x v9, a0 47; CHECK-NEXT: vsetivli zero, 3, e8, mf4, tu, ma 48; CHECK-NEXT: vslideup.vi v8, v9, 2 49; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 50; CHECK-NEXT: vand.vi v8, v8, 1 51; CHECK-NEXT: vmsne.vi v0, v8, 0 52; CHECK-NEXT: ret 53 %y = insertelement <vscale x 2 x i1> %x, i1 %elt, i64 2 54 ret <vscale x 2 x i1> %y 55} 56 57define <vscale x 2 x i1> @insertelt_idx_nxv2i1(<vscale x 2 x i1> %x, i1 %elt, i64 %idx) { 58; CHECK-LABEL: insertelt_idx_nxv2i1: 59; CHECK: # %bb.0: 60; CHECK-NEXT: vsetvli a2, zero, e8, mf4, ta, ma 61; CHECK-NEXT: vmv.v.i v8, 0 62; CHECK-NEXT: addi a2, a1, 1 63; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 64; CHECK-NEXT: vmv.s.x v9, a0 65; CHECK-NEXT: vsetvli zero, a2, e8, mf4, tu, ma 66; CHECK-NEXT: vslideup.vx v8, v9, a1 67; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 68; CHECK-NEXT: vand.vi v8, v8, 1 69; CHECK-NEXT: vmsne.vi v0, v8, 0 70; CHECK-NEXT: ret 71 %y = insertelement <vscale x 2 x i1> %x, i1 %elt, i64 %idx 72 ret <vscale x 2 x i1> %y 73} 74 75define <vscale x 4 x i1> @insertelt_nxv4i1(<vscale x 4 x i1> %x, i1 %elt) { 76; CHECK-LABEL: insertelt_nxv4i1: 77; CHECK: # %bb.0: 78; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 79; CHECK-NEXT: vmv.v.i v8, 0 80; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 81; CHECK-NEXT: vmv.s.x v9, a0 82; CHECK-NEXT: vsetivli zero, 3, e8, mf2, tu, ma 83; CHECK-NEXT: vslideup.vi v8, v9, 2 84; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 85; CHECK-NEXT: vand.vi v8, v8, 1 86; CHECK-NEXT: vmsne.vi v0, v8, 0 87; CHECK-NEXT: ret 88 %y = insertelement <vscale x 4 x i1> %x, i1 %elt, i64 2 89 ret <vscale x 4 x i1> %y 90} 91 92define <vscale x 4 x i1> @insertelt_idx_nxv4i1(<vscale x 4 x i1> %x, i1 %elt, i64 %idx) { 93; CHECK-LABEL: insertelt_idx_nxv4i1: 94; CHECK: # %bb.0: 95; CHECK-NEXT: vsetvli a2, zero, e8, mf2, ta, ma 96; CHECK-NEXT: vmv.v.i v8, 0 97; CHECK-NEXT: addi a2, a1, 1 98; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 99; CHECK-NEXT: vmv.s.x v9, a0 100; CHECK-NEXT: vsetvli zero, a2, e8, mf2, tu, ma 101; CHECK-NEXT: vslideup.vx v8, v9, a1 102; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 103; CHECK-NEXT: vand.vi v8, v8, 1 104; CHECK-NEXT: vmsne.vi v0, v8, 0 105; CHECK-NEXT: ret 106 %y = insertelement <vscale x 4 x i1> %x, i1 %elt, i64 %idx 107 ret <vscale x 4 x i1> %y 108} 109 110define <vscale x 8 x i1> @insertelt_nxv8i1(<vscale x 8 x i1> %x, i1 %elt) { 111; CHECK-LABEL: insertelt_nxv8i1: 112; CHECK: # %bb.0: 113; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 114; CHECK-NEXT: vmv.v.i v8, 0 115; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 116; CHECK-NEXT: vmv.s.x v9, a0 117; CHECK-NEXT: vsetivli zero, 3, e8, m1, tu, ma 118; CHECK-NEXT: vslideup.vi v8, v9, 2 119; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 120; CHECK-NEXT: vand.vi v8, v8, 1 121; CHECK-NEXT: vmsne.vi v0, v8, 0 122; CHECK-NEXT: ret 123 %y = insertelement <vscale x 8 x i1> %x, i1 %elt, i64 2 124 ret <vscale x 8 x i1> %y 125} 126 127define <vscale x 8 x i1> @insertelt_idx_nxv8i1(<vscale x 8 x i1> %x, i1 %elt, i64 %idx) { 128; CHECK-LABEL: insertelt_idx_nxv8i1: 129; CHECK: # %bb.0: 130; CHECK-NEXT: vsetvli a2, zero, e8, m1, ta, ma 131; CHECK-NEXT: vmv.v.i v8, 0 132; CHECK-NEXT: addi a2, a1, 1 133; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 134; CHECK-NEXT: vmv.s.x v9, a0 135; CHECK-NEXT: vsetvli zero, a2, e8, m1, tu, ma 136; CHECK-NEXT: vslideup.vx v8, v9, a1 137; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 138; CHECK-NEXT: vand.vi v8, v8, 1 139; CHECK-NEXT: vmsne.vi v0, v8, 0 140; CHECK-NEXT: ret 141 %y = insertelement <vscale x 8 x i1> %x, i1 %elt, i64 %idx 142 ret <vscale x 8 x i1> %y 143} 144 145define <vscale x 16 x i1> @insertelt_nxv16i1(<vscale x 16 x i1> %x, i1 %elt) { 146; CHECK-LABEL: insertelt_nxv16i1: 147; CHECK: # %bb.0: 148; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma 149; CHECK-NEXT: vmv.v.i v8, 0 150; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 151; CHECK-NEXT: vmv.s.x v10, a0 152; CHECK-NEXT: vsetivli zero, 3, e8, m1, tu, ma 153; CHECK-NEXT: vslideup.vi v8, v10, 2 154; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 155; CHECK-NEXT: vand.vi v8, v8, 1 156; CHECK-NEXT: vmsne.vi v0, v8, 0 157; CHECK-NEXT: ret 158 %y = insertelement <vscale x 16 x i1> %x, i1 %elt, i64 2 159 ret <vscale x 16 x i1> %y 160} 161 162define <vscale x 16 x i1> @insertelt_idx_nxv16i1(<vscale x 16 x i1> %x, i1 %elt, i64 %idx) { 163; CHECK-LABEL: insertelt_idx_nxv16i1: 164; CHECK: # %bb.0: 165; CHECK-NEXT: vsetvli a2, zero, e8, m2, ta, ma 166; CHECK-NEXT: vmv.v.i v8, 0 167; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 168; CHECK-NEXT: vmv.s.x v10, a0 169; CHECK-NEXT: addi a0, a1, 1 170; CHECK-NEXT: vsetvli zero, a0, e8, m2, tu, ma 171; CHECK-NEXT: vslideup.vx v8, v10, a1 172; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 173; CHECK-NEXT: vand.vi v8, v8, 1 174; CHECK-NEXT: vmsne.vi v0, v8, 0 175; CHECK-NEXT: ret 176 %y = insertelement <vscale x 16 x i1> %x, i1 %elt, i64 %idx 177 ret <vscale x 16 x i1> %y 178} 179 180define <vscale x 32 x i1> @insertelt_nxv32i1(<vscale x 32 x i1> %x, i1 %elt) { 181; CHECK-LABEL: insertelt_nxv32i1: 182; CHECK: # %bb.0: 183; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma 184; CHECK-NEXT: vmv.v.i v8, 0 185; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 186; CHECK-NEXT: vmv.s.x v12, a0 187; CHECK-NEXT: vsetivli zero, 3, e8, m1, tu, ma 188; CHECK-NEXT: vslideup.vi v8, v12, 2 189; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 190; CHECK-NEXT: vand.vi v8, v8, 1 191; CHECK-NEXT: vmsne.vi v0, v8, 0 192; CHECK-NEXT: ret 193 %y = insertelement <vscale x 32 x i1> %x, i1 %elt, i64 2 194 ret <vscale x 32 x i1> %y 195} 196 197define <vscale x 32 x i1> @insertelt_idx_nxv32i1(<vscale x 32 x i1> %x, i1 %elt, i64 %idx) { 198; CHECK-LABEL: insertelt_idx_nxv32i1: 199; CHECK: # %bb.0: 200; CHECK-NEXT: vsetvli a2, zero, e8, m4, ta, ma 201; CHECK-NEXT: vmv.v.i v8, 0 202; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 203; CHECK-NEXT: vmv.s.x v12, a0 204; CHECK-NEXT: addi a0, a1, 1 205; CHECK-NEXT: vsetvli zero, a0, e8, m4, tu, ma 206; CHECK-NEXT: vslideup.vx v8, v12, a1 207; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 208; CHECK-NEXT: vand.vi v8, v8, 1 209; CHECK-NEXT: vmsne.vi v0, v8, 0 210; CHECK-NEXT: ret 211 %y = insertelement <vscale x 32 x i1> %x, i1 %elt, i64 %idx 212 ret <vscale x 32 x i1> %y 213} 214 215define <vscale x 64 x i1> @insertelt_nxv64i1(<vscale x 64 x i1> %x, i1 %elt) { 216; CHECK-LABEL: insertelt_nxv64i1: 217; CHECK: # %bb.0: 218; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma 219; CHECK-NEXT: vmv.v.i v8, 0 220; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 221; CHECK-NEXT: vmv.s.x v16, a0 222; CHECK-NEXT: vsetivli zero, 3, e8, m1, tu, ma 223; CHECK-NEXT: vslideup.vi v8, v16, 2 224; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 225; CHECK-NEXT: vand.vi v8, v8, 1 226; CHECK-NEXT: vmsne.vi v0, v8, 0 227; CHECK-NEXT: ret 228 %y = insertelement <vscale x 64 x i1> %x, i1 %elt, i64 2 229 ret <vscale x 64 x i1> %y 230} 231 232define <vscale x 64 x i1> @insertelt_idx_nxv64i1(<vscale x 64 x i1> %x, i1 %elt, i64 %idx) { 233; CHECK-LABEL: insertelt_idx_nxv64i1: 234; CHECK: # %bb.0: 235; CHECK-NEXT: vsetvli a2, zero, e8, m8, ta, ma 236; CHECK-NEXT: vmv.v.i v8, 0 237; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 238; CHECK-NEXT: vmv.s.x v16, a0 239; CHECK-NEXT: addi a0, a1, 1 240; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, ma 241; CHECK-NEXT: vslideup.vx v8, v16, a1 242; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 243; CHECK-NEXT: vand.vi v8, v8, 1 244; CHECK-NEXT: vmsne.vi v0, v8, 0 245; CHECK-NEXT: ret 246 %y = insertelement <vscale x 64 x i1> %x, i1 %elt, i64 %idx 247 ret <vscale x 64 x i1> %y 248} 249