1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV32 3; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV64 4 5define <1 x i1> @v1i1(i1 %x, i1 %y) { 6; CHECK-LABEL: v1i1: 7; CHECK: # %bb.0: 8; CHECK-NEXT: andi a0, a0, 1 9; CHECK-NEXT: andi a1, a1, 1 10; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 11; CHECK-NEXT: vmv.s.x v8, a0 12; CHECK-NEXT: vmv.s.x v9, a1 13; CHECK-NEXT: vmsne.vi v8, v8, 0 14; CHECK-NEXT: vmsne.vi v9, v9, 0 15; CHECK-NEXT: vmxor.mm v0, v8, v9 16; CHECK-NEXT: ret 17 %head.x = insertelement <1 x i1> poison, i1 %x, i32 0 18 %splat.x = shufflevector <1 x i1> %head.x, <1 x i1> poison, <1 x i32> zeroinitializer 19 %head.y = insertelement <1 x i1> poison, i1 %y, i32 0 20 %splat.y = shufflevector <1 x i1> %head.y, <1 x i1> poison, <1 x i32> zeroinitializer 21 %v = add <1 x i1> %splat.x, %splat.y 22 ret <1 x i1> %v 23} 24 25define <2 x i1> @v2i1(i1 %x, i1 %y) { 26; CHECK-LABEL: v2i1: 27; CHECK: # %bb.0: 28; CHECK-NEXT: andi a0, a0, 1 29; CHECK-NEXT: andi a1, a1, 1 30; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 31; CHECK-NEXT: vmv.v.x v8, a0 32; CHECK-NEXT: vmv.v.x v9, a1 33; CHECK-NEXT: vmsne.vi v8, v8, 0 34; CHECK-NEXT: vmsne.vi v9, v9, 0 35; CHECK-NEXT: vmxor.mm v0, v8, v9 36; CHECK-NEXT: vmv.v.i v8, 0 37; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 38; CHECK-NEXT: vrgather.vi v9, v8, 0 39; CHECK-NEXT: vmsne.vi v0, v9, 0 40; CHECK-NEXT: ret 41 %head.x = insertelement <2 x i1> poison, i1 %x, i32 0 42 %splat.x = shufflevector <2 x i1> %head.x, <2 x i1> poison, <2 x i32> zeroinitializer 43 %head.y = insertelement <2 x i1> poison, i1 %y, i32 0 44 %splat.y = shufflevector <2 x i1> %head.y, <2 x i1> poison, <2 x i32> zeroinitializer 45 %v = add <2 x i1> %splat.x, %splat.y 46 ret <2 x i1> %v 47} 48 49define <4 x i1> @v4i1(i1 %x, i1 %y) { 50; CHECK-LABEL: v4i1: 51; CHECK: # %bb.0: 52; CHECK-NEXT: andi a0, a0, 1 53; CHECK-NEXT: andi a1, a1, 1 54; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 55; CHECK-NEXT: vmv.v.x v8, a0 56; CHECK-NEXT: vmv.v.x v9, a1 57; CHECK-NEXT: vmsne.vi v8, v8, 0 58; CHECK-NEXT: vmsne.vi v9, v9, 0 59; CHECK-NEXT: vmxor.mm v0, v8, v9 60; CHECK-NEXT: vmv.v.i v8, 0 61; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 62; CHECK-NEXT: vrgather.vi v9, v8, 0 63; CHECK-NEXT: vmsne.vi v0, v9, 0 64; CHECK-NEXT: ret 65 %head.x = insertelement <4 x i1> poison, i1 %x, i32 0 66 %splat.x = shufflevector <4 x i1> %head.x, <4 x i1> poison, <4 x i32> zeroinitializer 67 %head.y = insertelement <4 x i1> poison, i1 %y, i32 0 68 %splat.y = shufflevector <4 x i1> %head.y, <4 x i1> poison, <4 x i32> zeroinitializer 69 %v = add <4 x i1> %splat.x, %splat.y 70 ret <4 x i1> %v 71} 72 73define <8 x i1> @v8i1(i1 %x, i1 %y) { 74; CHECK-LABEL: v8i1: 75; CHECK: # %bb.0: 76; CHECK-NEXT: andi a0, a0, 1 77; CHECK-NEXT: andi a1, a1, 1 78; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 79; CHECK-NEXT: vmv.v.x v8, a0 80; CHECK-NEXT: vmv.v.x v9, a1 81; CHECK-NEXT: vmsne.vi v8, v8, 0 82; CHECK-NEXT: vmsne.vi v9, v9, 0 83; CHECK-NEXT: vmxor.mm v0, v8, v9 84; CHECK-NEXT: vmv.v.i v8, 0 85; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 86; CHECK-NEXT: vrgather.vi v9, v8, 0 87; CHECK-NEXT: vmsne.vi v0, v9, 0 88; CHECK-NEXT: ret 89 %head.x = insertelement <8 x i1> poison, i1 %x, i32 0 90 %splat.x = shufflevector <8 x i1> %head.x, <8 x i1> poison, <8 x i32> zeroinitializer 91 %head.y = insertelement <8 x i1> poison, i1 %y, i32 0 92 %splat.y = shufflevector <8 x i1> %head.y, <8 x i1> poison, <8 x i32> zeroinitializer 93 %v = add <8 x i1> %splat.x, %splat.y 94 ret <8 x i1> %v 95} 96 97define <16 x i1> @v16i1(i1 %x, i1 %y) { 98; CHECK-LABEL: v16i1: 99; CHECK: # %bb.0: 100; CHECK-NEXT: andi a0, a0, 1 101; CHECK-NEXT: andi a1, a1, 1 102; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 103; CHECK-NEXT: vmv.v.x v8, a0 104; CHECK-NEXT: vmv.v.x v9, a1 105; CHECK-NEXT: vmsne.vi v8, v8, 0 106; CHECK-NEXT: vmsne.vi v9, v9, 0 107; CHECK-NEXT: vmxor.mm v0, v8, v9 108; CHECK-NEXT: vmv.v.i v8, 0 109; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 110; CHECK-NEXT: vrgather.vi v9, v8, 0 111; CHECK-NEXT: vmsne.vi v0, v9, 0 112; CHECK-NEXT: ret 113 %head.x = insertelement <16 x i1> poison, i1 %x, i32 0 114 %splat.x = shufflevector <16 x i1> %head.x, <16 x i1> poison, <16 x i32> zeroinitializer 115 %head.y = insertelement <16 x i1> poison, i1 %y, i32 0 116 %splat.y = shufflevector <16 x i1> %head.y, <16 x i1> poison, <16 x i32> zeroinitializer 117 %v = add <16 x i1> %splat.x, %splat.y 118 ret <16 x i1> %v 119} 120 121define <32 x i1> @v32i1(i1 %x, i1 %y) { 122; CHECK-LABEL: v32i1: 123; CHECK: # %bb.0: 124; CHECK-NEXT: andi a0, a0, 1 125; CHECK-NEXT: li a2, 32 126; CHECK-NEXT: andi a1, a1, 1 127; CHECK-NEXT: vsetvli zero, a2, e8, m2, ta, ma 128; CHECK-NEXT: vmv.v.x v8, a0 129; CHECK-NEXT: vmsne.vi v10, v8, 0 130; CHECK-NEXT: vmv.v.x v8, a1 131; CHECK-NEXT: vmsne.vi v11, v8, 0 132; CHECK-NEXT: vmxor.mm v0, v10, v11 133; CHECK-NEXT: vmv.v.i v8, 0 134; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 135; CHECK-NEXT: vrgather.vi v10, v8, 0 136; CHECK-NEXT: vmsne.vi v0, v10, 0 137; CHECK-NEXT: ret 138 %head.x = insertelement <32 x i1> poison, i1 %x, i32 0 139 %splat.x = shufflevector <32 x i1> %head.x, <32 x i1> poison, <32 x i32> zeroinitializer 140 %head.y = insertelement <32 x i1> poison, i1 %y, i32 0 141 %splat.y = shufflevector <32 x i1> %head.y, <32 x i1> poison, <32 x i32> zeroinitializer 142 %v = add <32 x i1> %splat.x, %splat.y 143 ret <32 x i1> %v 144} 145 146define <64 x i1> @v64i1(i1 %x, i1 %y) { 147; CHECK-LABEL: v64i1: 148; CHECK: # %bb.0: 149; CHECK-NEXT: andi a0, a0, 1 150; CHECK-NEXT: li a2, 64 151; CHECK-NEXT: andi a1, a1, 1 152; CHECK-NEXT: vsetvli zero, a2, e8, m4, ta, ma 153; CHECK-NEXT: vmv.v.x v8, a0 154; CHECK-NEXT: vmsne.vi v12, v8, 0 155; CHECK-NEXT: vmv.v.x v8, a1 156; CHECK-NEXT: vmsne.vi v13, v8, 0 157; CHECK-NEXT: vmxor.mm v0, v12, v13 158; CHECK-NEXT: vmv.v.i v8, 0 159; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 160; CHECK-NEXT: vrgather.vi v12, v8, 0 161; CHECK-NEXT: vmsne.vi v0, v12, 0 162; CHECK-NEXT: ret 163 %head.x = insertelement <64 x i1> poison, i1 %x, i32 0 164 %splat.x = shufflevector <64 x i1> %head.x, <64 x i1> poison, <64 x i32> zeroinitializer 165 %head.y = insertelement <64 x i1> poison, i1 %y, i32 0 166 %splat.y = shufflevector <64 x i1> %head.y, <64 x i1> poison, <64 x i32> zeroinitializer 167 %v = add <64 x i1> %splat.x, %splat.y 168 ret <64 x i1> %v 169} 170 171define <1 x i8> @v1i8(i8 %x, i8 %y) { 172; CHECK-LABEL: v1i8: 173; CHECK: # %bb.0: 174; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 175; CHECK-NEXT: vmv.s.x v8, a0 176; CHECK-NEXT: vadd.vx v8, v8, a1 177; CHECK-NEXT: ret 178 %head.x = insertelement <1 x i8> poison, i8 %x, i32 0 179 %splat.x = shufflevector <1 x i8> %head.x, <1 x i8> poison, <1 x i32> zeroinitializer 180 %head.y = insertelement <1 x i8> poison, i8 %y, i32 0 181 %splat.y = shufflevector <1 x i8> %head.y, <1 x i8> poison, <1 x i32> zeroinitializer 182 %v = add <1 x i8> %splat.x, %splat.y 183 ret <1 x i8> %v 184} 185 186define <2 x i8> @v2i8(i8 %x, i8 %y) { 187; CHECK-LABEL: v2i8: 188; CHECK: # %bb.0: 189; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 190; CHECK-NEXT: vmv.v.x v8, a0 191; CHECK-NEXT: vadd.vx v9, v8, a1 192; CHECK-NEXT: vrgather.vi v8, v9, 0 193; CHECK-NEXT: ret 194 %head.x = insertelement <2 x i8> poison, i8 %x, i32 0 195 %splat.x = shufflevector <2 x i8> %head.x, <2 x i8> poison, <2 x i32> zeroinitializer 196 %head.y = insertelement <2 x i8> poison, i8 %y, i32 0 197 %splat.y = shufflevector <2 x i8> %head.y, <2 x i8> poison, <2 x i32> zeroinitializer 198 %v = add <2 x i8> %splat.x, %splat.y 199 ret <2 x i8> %v 200} 201 202define <4 x i8> @v4i8(i8 %x, i8 %y) { 203; CHECK-LABEL: v4i8: 204; CHECK: # %bb.0: 205; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 206; CHECK-NEXT: vmv.v.x v8, a0 207; CHECK-NEXT: vadd.vx v9, v8, a1 208; CHECK-NEXT: vrgather.vi v8, v9, 0 209; CHECK-NEXT: ret 210 %head.x = insertelement <4 x i8> poison, i8 %x, i32 0 211 %splat.x = shufflevector <4 x i8> %head.x, <4 x i8> poison, <4 x i32> zeroinitializer 212 %head.y = insertelement <4 x i8> poison, i8 %y, i32 0 213 %splat.y = shufflevector <4 x i8> %head.y, <4 x i8> poison, <4 x i32> zeroinitializer 214 %v = add <4 x i8> %splat.x, %splat.y 215 ret <4 x i8> %v 216} 217 218define <8 x i8> @v8i8(i8 %x, i8 %y) { 219; CHECK-LABEL: v8i8: 220; CHECK: # %bb.0: 221; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 222; CHECK-NEXT: vmv.v.x v8, a0 223; CHECK-NEXT: vadd.vx v9, v8, a1 224; CHECK-NEXT: vrgather.vi v8, v9, 0 225; CHECK-NEXT: ret 226 %head.x = insertelement <8 x i8> poison, i8 %x, i32 0 227 %splat.x = shufflevector <8 x i8> %head.x, <8 x i8> poison, <8 x i32> zeroinitializer 228 %head.y = insertelement <8 x i8> poison, i8 %y, i32 0 229 %splat.y = shufflevector <8 x i8> %head.y, <8 x i8> poison, <8 x i32> zeroinitializer 230 %v = add <8 x i8> %splat.x, %splat.y 231 ret <8 x i8> %v 232} 233 234define <16 x i8> @v16i8(i8 %x, i8 %y) { 235; CHECK-LABEL: v16i8: 236; CHECK: # %bb.0: 237; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 238; CHECK-NEXT: vmv.v.x v8, a0 239; CHECK-NEXT: vadd.vx v9, v8, a1 240; CHECK-NEXT: vrgather.vi v8, v9, 0 241; CHECK-NEXT: ret 242 %head.x = insertelement <16 x i8> poison, i8 %x, i32 0 243 %splat.x = shufflevector <16 x i8> %head.x, <16 x i8> poison, <16 x i32> zeroinitializer 244 %head.y = insertelement <16 x i8> poison, i8 %y, i32 0 245 %splat.y = shufflevector <16 x i8> %head.y, <16 x i8> poison, <16 x i32> zeroinitializer 246 %v = add <16 x i8> %splat.x, %splat.y 247 ret <16 x i8> %v 248} 249 250define <32 x i8> @v32i8(i8 %x, i8 %y) { 251; CHECK-LABEL: v32i8: 252; CHECK: # %bb.0: 253; CHECK-NEXT: li a2, 32 254; CHECK-NEXT: vsetvli zero, a2, e8, m2, ta, ma 255; CHECK-NEXT: vmv.v.x v8, a0 256; CHECK-NEXT: vadd.vx v10, v8, a1 257; CHECK-NEXT: vrgather.vi v8, v10, 0 258; CHECK-NEXT: ret 259 %head.x = insertelement <32 x i8> poison, i8 %x, i32 0 260 %splat.x = shufflevector <32 x i8> %head.x, <32 x i8> poison, <32 x i32> zeroinitializer 261 %head.y = insertelement <32 x i8> poison, i8 %y, i32 0 262 %splat.y = shufflevector <32 x i8> %head.y, <32 x i8> poison, <32 x i32> zeroinitializer 263 %v = add <32 x i8> %splat.x, %splat.y 264 ret <32 x i8> %v 265} 266 267define <64 x i8> @v64i8(i8 %x, i8 %y) { 268; CHECK-LABEL: v64i8: 269; CHECK: # %bb.0: 270; CHECK-NEXT: li a2, 64 271; CHECK-NEXT: vsetvli zero, a2, e8, m4, ta, ma 272; CHECK-NEXT: vmv.v.x v8, a0 273; CHECK-NEXT: vadd.vx v12, v8, a1 274; CHECK-NEXT: vrgather.vi v8, v12, 0 275; CHECK-NEXT: ret 276 %head.x = insertelement <64 x i8> poison, i8 %x, i32 0 277 %splat.x = shufflevector <64 x i8> %head.x, <64 x i8> poison, <64 x i32> zeroinitializer 278 %head.y = insertelement <64 x i8> poison, i8 %y, i32 0 279 %splat.y = shufflevector <64 x i8> %head.y, <64 x i8> poison, <64 x i32> zeroinitializer 280 %v = add <64 x i8> %splat.x, %splat.y 281 ret <64 x i8> %v 282} 283 284define <1 x i16> @v1i16(i16 %x, i16 %y) { 285; CHECK-LABEL: v1i16: 286; CHECK: # %bb.0: 287; CHECK-NEXT: vsetivli zero, 1, e16, mf4, ta, ma 288; CHECK-NEXT: vmv.s.x v8, a0 289; CHECK-NEXT: vadd.vx v8, v8, a1 290; CHECK-NEXT: ret 291 %head.x = insertelement <1 x i16> poison, i16 %x, i32 0 292 %splat.x = shufflevector <1 x i16> %head.x, <1 x i16> poison, <1 x i32> zeroinitializer 293 %head.y = insertelement <1 x i16> poison, i16 %y, i32 0 294 %splat.y = shufflevector <1 x i16> %head.y, <1 x i16> poison, <1 x i32> zeroinitializer 295 %v = add <1 x i16> %splat.x, %splat.y 296 ret <1 x i16> %v 297} 298 299define <2 x i16> @v2i16(i16 %x, i16 %y) { 300; CHECK-LABEL: v2i16: 301; CHECK: # %bb.0: 302; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 303; CHECK-NEXT: vmv.v.x v8, a0 304; CHECK-NEXT: vadd.vx v9, v8, a1 305; CHECK-NEXT: vrgather.vi v8, v9, 0 306; CHECK-NEXT: ret 307 %head.x = insertelement <2 x i16> poison, i16 %x, i32 0 308 %splat.x = shufflevector <2 x i16> %head.x, <2 x i16> poison, <2 x i32> zeroinitializer 309 %head.y = insertelement <2 x i16> poison, i16 %y, i32 0 310 %splat.y = shufflevector <2 x i16> %head.y, <2 x i16> poison, <2 x i32> zeroinitializer 311 %v = add <2 x i16> %splat.x, %splat.y 312 ret <2 x i16> %v 313} 314 315define <4 x i16> @v4i16(i16 %x, i16 %y) { 316; CHECK-LABEL: v4i16: 317; CHECK: # %bb.0: 318; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 319; CHECK-NEXT: vmv.v.x v8, a0 320; CHECK-NEXT: vadd.vx v9, v8, a1 321; CHECK-NEXT: vrgather.vi v8, v9, 0 322; CHECK-NEXT: ret 323 %head.x = insertelement <4 x i16> poison, i16 %x, i32 0 324 %splat.x = shufflevector <4 x i16> %head.x, <4 x i16> poison, <4 x i32> zeroinitializer 325 %head.y = insertelement <4 x i16> poison, i16 %y, i32 0 326 %splat.y = shufflevector <4 x i16> %head.y, <4 x i16> poison, <4 x i32> zeroinitializer 327 %v = add <4 x i16> %splat.x, %splat.y 328 ret <4 x i16> %v 329} 330 331define <8 x i16> @v8i16(i16 %x, i16 %y) { 332; CHECK-LABEL: v8i16: 333; CHECK: # %bb.0: 334; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 335; CHECK-NEXT: vmv.v.x v8, a0 336; CHECK-NEXT: vadd.vx v9, v8, a1 337; CHECK-NEXT: vrgather.vi v8, v9, 0 338; CHECK-NEXT: ret 339 %head.x = insertelement <8 x i16> poison, i16 %x, i32 0 340 %splat.x = shufflevector <8 x i16> %head.x, <8 x i16> poison, <8 x i32> zeroinitializer 341 %head.y = insertelement <8 x i16> poison, i16 %y, i32 0 342 %splat.y = shufflevector <8 x i16> %head.y, <8 x i16> poison, <8 x i32> zeroinitializer 343 %v = add <8 x i16> %splat.x, %splat.y 344 ret <8 x i16> %v 345} 346 347define <16 x i16> @v16i16(i16 %x, i16 %y) { 348; CHECK-LABEL: v16i16: 349; CHECK: # %bb.0: 350; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma 351; CHECK-NEXT: vmv.v.x v8, a0 352; CHECK-NEXT: vadd.vx v10, v8, a1 353; CHECK-NEXT: vrgather.vi v8, v10, 0 354; CHECK-NEXT: ret 355 %head.x = insertelement <16 x i16> poison, i16 %x, i32 0 356 %splat.x = shufflevector <16 x i16> %head.x, <16 x i16> poison, <16 x i32> zeroinitializer 357 %head.y = insertelement <16 x i16> poison, i16 %y, i32 0 358 %splat.y = shufflevector <16 x i16> %head.y, <16 x i16> poison, <16 x i32> zeroinitializer 359 %v = add <16 x i16> %splat.x, %splat.y 360 ret <16 x i16> %v 361} 362 363define <32 x i16> @v32i16(i16 %x, i16 %y) { 364; CHECK-LABEL: v32i16: 365; CHECK: # %bb.0: 366; CHECK-NEXT: li a2, 32 367; CHECK-NEXT: vsetvli zero, a2, e16, m4, ta, ma 368; CHECK-NEXT: vmv.v.x v8, a0 369; CHECK-NEXT: vadd.vx v12, v8, a1 370; CHECK-NEXT: vrgather.vi v8, v12, 0 371; CHECK-NEXT: ret 372 %head.x = insertelement <32 x i16> poison, i16 %x, i32 0 373 %splat.x = shufflevector <32 x i16> %head.x, <32 x i16> poison, <32 x i32> zeroinitializer 374 %head.y = insertelement <32 x i16> poison, i16 %y, i32 0 375 %splat.y = shufflevector <32 x i16> %head.y, <32 x i16> poison, <32 x i32> zeroinitializer 376 %v = add <32 x i16> %splat.x, %splat.y 377 ret <32 x i16> %v 378} 379 380define <1 x i32> @v1i32(i32 %x, i32 %y) { 381; CHECK-LABEL: v1i32: 382; CHECK: # %bb.0: 383; CHECK-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 384; CHECK-NEXT: vmv.s.x v8, a0 385; CHECK-NEXT: vadd.vx v8, v8, a1 386; CHECK-NEXT: ret 387 %head.x = insertelement <1 x i32> poison, i32 %x, i32 0 388 %splat.x = shufflevector <1 x i32> %head.x, <1 x i32> poison, <1 x i32> zeroinitializer 389 %head.y = insertelement <1 x i32> poison, i32 %y, i32 0 390 %splat.y = shufflevector <1 x i32> %head.y, <1 x i32> poison, <1 x i32> zeroinitializer 391 %v = add <1 x i32> %splat.x, %splat.y 392 ret <1 x i32> %v 393} 394 395define <2 x i32> @v2i32(i32 %x, i32 %y) { 396; CHECK-LABEL: v2i32: 397; CHECK: # %bb.0: 398; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 399; CHECK-NEXT: vmv.v.x v8, a0 400; CHECK-NEXT: vadd.vx v9, v8, a1 401; CHECK-NEXT: vrgather.vi v8, v9, 0 402; CHECK-NEXT: ret 403 %head.x = insertelement <2 x i32> poison, i32 %x, i32 0 404 %splat.x = shufflevector <2 x i32> %head.x, <2 x i32> poison, <2 x i32> zeroinitializer 405 %head.y = insertelement <2 x i32> poison, i32 %y, i32 0 406 %splat.y = shufflevector <2 x i32> %head.y, <2 x i32> poison, <2 x i32> zeroinitializer 407 %v = add <2 x i32> %splat.x, %splat.y 408 ret <2 x i32> %v 409} 410 411define <4 x i32> @v4i32(i32 %x, i32 %y) { 412; CHECK-LABEL: v4i32: 413; CHECK: # %bb.0: 414; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 415; CHECK-NEXT: vmv.v.x v8, a0 416; CHECK-NEXT: vadd.vx v9, v8, a1 417; CHECK-NEXT: vrgather.vi v8, v9, 0 418; CHECK-NEXT: ret 419 %head.x = insertelement <4 x i32> poison, i32 %x, i32 0 420 %splat.x = shufflevector <4 x i32> %head.x, <4 x i32> poison, <4 x i32> zeroinitializer 421 %head.y = insertelement <4 x i32> poison, i32 %y, i32 0 422 %splat.y = shufflevector <4 x i32> %head.y, <4 x i32> poison, <4 x i32> zeroinitializer 423 %v = add <4 x i32> %splat.x, %splat.y 424 ret <4 x i32> %v 425} 426 427define <8 x i32> @v8i32(i32 %x, i32 %y) { 428; CHECK-LABEL: v8i32: 429; CHECK: # %bb.0: 430; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 431; CHECK-NEXT: vmv.v.x v8, a0 432; CHECK-NEXT: vadd.vx v10, v8, a1 433; CHECK-NEXT: vrgather.vi v8, v10, 0 434; CHECK-NEXT: ret 435 %head.x = insertelement <8 x i32> poison, i32 %x, i32 0 436 %splat.x = shufflevector <8 x i32> %head.x, <8 x i32> poison, <8 x i32> zeroinitializer 437 %head.y = insertelement <8 x i32> poison, i32 %y, i32 0 438 %splat.y = shufflevector <8 x i32> %head.y, <8 x i32> poison, <8 x i32> zeroinitializer 439 %v = add <8 x i32> %splat.x, %splat.y 440 ret <8 x i32> %v 441} 442 443define <16 x i32> @v16i32(i32 %x, i32 %y) { 444; CHECK-LABEL: v16i32: 445; CHECK: # %bb.0: 446; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma 447; CHECK-NEXT: vmv.v.x v8, a0 448; CHECK-NEXT: vadd.vx v12, v8, a1 449; CHECK-NEXT: vrgather.vi v8, v12, 0 450; CHECK-NEXT: ret 451 %head.x = insertelement <16 x i32> poison, i32 %x, i32 0 452 %splat.x = shufflevector <16 x i32> %head.x, <16 x i32> poison, <16 x i32> zeroinitializer 453 %head.y = insertelement <16 x i32> poison, i32 %y, i32 0 454 %splat.y = shufflevector <16 x i32> %head.y, <16 x i32> poison, <16 x i32> zeroinitializer 455 %v = add <16 x i32> %splat.x, %splat.y 456 ret <16 x i32> %v 457} 458 459define <1 x i64> @v1i64(i64 %x, i64 %y) { 460; RV32-LABEL: v1i64: 461; RV32: # %bb.0: 462; RV32-NEXT: addi sp, sp, -16 463; RV32-NEXT: .cfi_def_cfa_offset 16 464; RV32-NEXT: add a2, a0, a2 465; RV32-NEXT: add a1, a1, a3 466; RV32-NEXT: sltu a0, a2, a0 467; RV32-NEXT: add a0, a1, a0 468; RV32-NEXT: sw a2, 8(sp) 469; RV32-NEXT: sw a0, 12(sp) 470; RV32-NEXT: addi a0, sp, 8 471; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma 472; RV32-NEXT: vlse64.v v8, (a0), zero 473; RV32-NEXT: addi sp, sp, 16 474; RV32-NEXT: .cfi_def_cfa_offset 0 475; RV32-NEXT: ret 476; 477; RV64-LABEL: v1i64: 478; RV64: # %bb.0: 479; RV64-NEXT: vsetivli zero, 1, e64, m1, ta, ma 480; RV64-NEXT: vmv.s.x v8, a0 481; RV64-NEXT: vadd.vx v8, v8, a1 482; RV64-NEXT: ret 483 %head.x = insertelement <1 x i64> poison, i64 %x, i32 0 484 %splat.x = shufflevector <1 x i64> %head.x, <1 x i64> poison, <1 x i32> zeroinitializer 485 %head.y = insertelement <1 x i64> poison, i64 %y, i32 0 486 %splat.y = shufflevector <1 x i64> %head.y, <1 x i64> poison, <1 x i32> zeroinitializer 487 %v = add <1 x i64> %splat.x, %splat.y 488 ret <1 x i64> %v 489} 490 491define <2 x i64> @v2i64(i64 %x, i64 %y) { 492; RV32-LABEL: v2i64: 493; RV32: # %bb.0: 494; RV32-NEXT: addi sp, sp, -16 495; RV32-NEXT: .cfi_def_cfa_offset 16 496; RV32-NEXT: add a2, a0, a2 497; RV32-NEXT: add a1, a1, a3 498; RV32-NEXT: sltu a0, a2, a0 499; RV32-NEXT: add a0, a1, a0 500; RV32-NEXT: sw a2, 8(sp) 501; RV32-NEXT: sw a0, 12(sp) 502; RV32-NEXT: addi a0, sp, 8 503; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma 504; RV32-NEXT: vlse64.v v8, (a0), zero 505; RV32-NEXT: addi sp, sp, 16 506; RV32-NEXT: .cfi_def_cfa_offset 0 507; RV32-NEXT: ret 508; 509; RV64-LABEL: v2i64: 510; RV64: # %bb.0: 511; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 512; RV64-NEXT: vmv.v.x v8, a0 513; RV64-NEXT: vadd.vx v9, v8, a1 514; RV64-NEXT: vrgather.vi v8, v9, 0 515; RV64-NEXT: ret 516 %head.x = insertelement <2 x i64> poison, i64 %x, i32 0 517 %splat.x = shufflevector <2 x i64> %head.x, <2 x i64> poison, <2 x i32> zeroinitializer 518 %head.y = insertelement <2 x i64> poison, i64 %y, i32 0 519 %splat.y = shufflevector <2 x i64> %head.y, <2 x i64> poison, <2 x i32> zeroinitializer 520 %v = add <2 x i64> %splat.x, %splat.y 521 ret <2 x i64> %v 522} 523 524define <4 x i64> @v4i64(i64 %x, i64 %y) { 525; RV32-LABEL: v4i64: 526; RV32: # %bb.0: 527; RV32-NEXT: addi sp, sp, -16 528; RV32-NEXT: .cfi_def_cfa_offset 16 529; RV32-NEXT: add a2, a0, a2 530; RV32-NEXT: add a1, a1, a3 531; RV32-NEXT: sltu a0, a2, a0 532; RV32-NEXT: add a0, a1, a0 533; RV32-NEXT: sw a2, 8(sp) 534; RV32-NEXT: sw a0, 12(sp) 535; RV32-NEXT: addi a0, sp, 8 536; RV32-NEXT: vsetvli a1, zero, e64, m2, ta, ma 537; RV32-NEXT: vlse64.v v8, (a0), zero 538; RV32-NEXT: addi sp, sp, 16 539; RV32-NEXT: .cfi_def_cfa_offset 0 540; RV32-NEXT: ret 541; 542; RV64-LABEL: v4i64: 543; RV64: # %bb.0: 544; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma 545; RV64-NEXT: vmv.v.x v8, a0 546; RV64-NEXT: vadd.vx v10, v8, a1 547; RV64-NEXT: vrgather.vi v8, v10, 0 548; RV64-NEXT: ret 549 %head.x = insertelement <4 x i64> poison, i64 %x, i32 0 550 %splat.x = shufflevector <4 x i64> %head.x, <4 x i64> poison, <4 x i32> zeroinitializer 551 %head.y = insertelement <4 x i64> poison, i64 %y, i32 0 552 %splat.y = shufflevector <4 x i64> %head.y, <4 x i64> poison, <4 x i32> zeroinitializer 553 %v = add <4 x i64> %splat.x, %splat.y 554 ret <4 x i64> %v 555} 556 557define <8 x i64> @v8i64(i64 %x, i64 %y) { 558; RV32-LABEL: v8i64: 559; RV32: # %bb.0: 560; RV32-NEXT: addi sp, sp, -16 561; RV32-NEXT: .cfi_def_cfa_offset 16 562; RV32-NEXT: add a2, a0, a2 563; RV32-NEXT: add a1, a1, a3 564; RV32-NEXT: sltu a0, a2, a0 565; RV32-NEXT: add a0, a1, a0 566; RV32-NEXT: sw a2, 8(sp) 567; RV32-NEXT: sw a0, 12(sp) 568; RV32-NEXT: addi a0, sp, 8 569; RV32-NEXT: vsetvli a1, zero, e64, m4, ta, ma 570; RV32-NEXT: vlse64.v v8, (a0), zero 571; RV32-NEXT: addi sp, sp, 16 572; RV32-NEXT: .cfi_def_cfa_offset 0 573; RV32-NEXT: ret 574; 575; RV64-LABEL: v8i64: 576; RV64: # %bb.0: 577; RV64-NEXT: vsetivli zero, 8, e64, m4, ta, ma 578; RV64-NEXT: vmv.v.x v8, a0 579; RV64-NEXT: vadd.vx v12, v8, a1 580; RV64-NEXT: vrgather.vi v8, v12, 0 581; RV64-NEXT: ret 582 %head.x = insertelement <8 x i64> poison, i64 %x, i32 0 583 %splat.x = shufflevector <8 x i64> %head.x, <8 x i64> poison, <8 x i32> zeroinitializer 584 %head.y = insertelement <8 x i64> poison, i64 %y, i32 0 585 %splat.y = shufflevector <8 x i64> %head.y, <8 x i64> poison, <8 x i32> zeroinitializer 586 %v = add <8 x i64> %splat.x, %splat.y 587 ret <8 x i64> %v 588} 589 590define <4 x half> @v4f16(half %x, half %y) { 591; CHECK-LABEL: v4f16: 592; CHECK: # %bb.0: 593; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 594; CHECK-NEXT: vfmv.v.f v8, fa0 595; CHECK-NEXT: vfadd.vf v9, v8, fa1 596; CHECK-NEXT: vrgather.vi v8, v9, 0 597; CHECK-NEXT: ret 598 %head.x = insertelement <4 x half> poison, half %x, i32 0 599 %splat.x = shufflevector <4 x half> %head.x, <4 x half> poison, <4 x i32> zeroinitializer 600 %head.y = insertelement <4 x half> poison, half %y, i32 0 601 %splat.y = shufflevector <4 x half> %head.y, <4 x half> poison, <4 x i32> zeroinitializer 602 %v = fadd <4 x half> %splat.x, %splat.y 603 ret <4 x half> %v 604} 605 606define <2 x float> @v2f32(float %x, float %y) { 607; CHECK-LABEL: v2f32: 608; CHECK: # %bb.0: 609; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 610; CHECK-NEXT: vfmv.v.f v8, fa0 611; CHECK-NEXT: vfadd.vf v9, v8, fa1 612; CHECK-NEXT: vrgather.vi v8, v9, 0 613; CHECK-NEXT: ret 614 %head.x = insertelement <2 x float> poison, float %x, i32 0 615 %splat.x = shufflevector <2 x float> %head.x, <2 x float> poison, <2 x i32> zeroinitializer 616 %head.y = insertelement <2 x float> poison, float %y, i32 0 617 %splat.y = shufflevector <2 x float> %head.y, <2 x float> poison, <2 x i32> zeroinitializer 618 %v = fadd <2 x float> %splat.x, %splat.y 619 ret <2 x float> %v 620} 621 622define <1 x double> @v2f64(double %x, double %y) { 623; CHECK-LABEL: v2f64: 624; CHECK: # %bb.0: 625; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma 626; CHECK-NEXT: vfmv.s.f v8, fa0 627; CHECK-NEXT: vfadd.vf v8, v8, fa1 628; CHECK-NEXT: ret 629 %head.x = insertelement <1 x double> poison, double %x, i32 0 630 %splat.x = shufflevector <1 x double> %head.x, <1 x double> poison, <1 x i32> zeroinitializer 631 %head.y = insertelement <1 x double> poison, double %y, i32 0 632 %splat.y = shufflevector <1 x double> %head.y, <1 x double> poison, <1 x i32> zeroinitializer 633 %v = fadd <1 x double> %splat.x, %splat.y 634 ret <1 x double> %v 635} 636