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