1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 4 5define <vscale x 8 x i8> @vaaddu_vv_nxv8i8_floor(<vscale x 8 x i8> %x, <vscale x 8 x i8> %y) { 6; CHECK-LABEL: vaaddu_vv_nxv8i8_floor: 7; CHECK: # %bb.0: 8; CHECK-NEXT: csrwi vxrm, 2 9; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 10; CHECK-NEXT: vaaddu.vv v8, v8, v9 11; CHECK-NEXT: ret 12 %xzv = zext <vscale x 8 x i8> %x to <vscale x 8 x i16> 13 %yzv = zext <vscale x 8 x i8> %y to <vscale x 8 x i16> 14 %add = add nuw nsw <vscale x 8 x i16> %xzv, %yzv 15 %div = lshr <vscale x 8 x i16> %add, splat (i16 1) 16 %ret = trunc <vscale x 8 x i16> %div to <vscale x 8 x i8> 17 ret <vscale x 8 x i8> %ret 18} 19 20define <vscale x 8 x i8> @vaaddu_vx_nxv8i8_floor(<vscale x 8 x i8> %x, i8 %y) { 21; CHECK-LABEL: vaaddu_vx_nxv8i8_floor: 22; CHECK: # %bb.0: 23; CHECK-NEXT: csrwi vxrm, 2 24; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 25; CHECK-NEXT: vaaddu.vx v8, v8, a0 26; CHECK-NEXT: ret 27 %xzv = zext <vscale x 8 x i8> %x to <vscale x 8 x i16> 28 %yhead = insertelement <vscale x 8 x i8> poison, i8 %y, i32 0 29 %ysplat = shufflevector <vscale x 8 x i8> %yhead, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 30 %yzv = zext <vscale x 8 x i8> %ysplat to <vscale x 8 x i16> 31 %add = add nuw nsw <vscale x 8 x i16> %xzv, %yzv 32 %div = lshr <vscale x 8 x i16> %add, splat (i16 1) 33 %ret = trunc <vscale x 8 x i16> %div to <vscale x 8 x i8> 34 ret <vscale x 8 x i8> %ret 35} 36 37define <vscale x 8 x i8> @vaaddu_vv_nxv8i8_floor_sexti16(<vscale x 8 x i8> %x, <vscale x 8 x i8> %y) { 38; CHECK-LABEL: vaaddu_vv_nxv8i8_floor_sexti16: 39; CHECK: # %bb.0: 40; CHECK-NEXT: csrwi vxrm, 2 41; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 42; CHECK-NEXT: vaadd.vv v8, v8, v9 43; CHECK-NEXT: ret 44 %xzv = sext <vscale x 8 x i8> %x to <vscale x 8 x i16> 45 %yzv = sext <vscale x 8 x i8> %y to <vscale x 8 x i16> 46 %add = add nuw nsw <vscale x 8 x i16> %xzv, %yzv 47 %div = lshr <vscale x 8 x i16> %add, splat (i16 1) 48 %ret = trunc <vscale x 8 x i16> %div to <vscale x 8 x i8> 49 ret <vscale x 8 x i8> %ret 50} 51 52define <vscale x 8 x i8> @vaaddu_vv_nxv8i8_floor_zexti32(<vscale x 8 x i8> %x, <vscale x 8 x i8> %y) { 53; CHECK-LABEL: vaaddu_vv_nxv8i8_floor_zexti32: 54; CHECK: # %bb.0: 55; CHECK-NEXT: csrwi vxrm, 2 56; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 57; CHECK-NEXT: vaaddu.vv v8, v8, v9 58; CHECK-NEXT: ret 59 %xzv = zext <vscale x 8 x i8> %x to <vscale x 8 x i32> 60 %yzv = zext <vscale x 8 x i8> %y to <vscale x 8 x i32> 61 %add = add nuw nsw <vscale x 8 x i32> %xzv, %yzv 62 %div = lshr <vscale x 8 x i32> %add, splat (i32 1) 63 %ret = trunc <vscale x 8 x i32> %div to <vscale x 8 x i8> 64 ret <vscale x 8 x i8> %ret 65} 66 67define <vscale x 8 x i8> @vaaddu_vv_nxv8i8_floor_lshr2(<vscale x 8 x i8> %x, <vscale x 8 x i8> %y) { 68; CHECK-LABEL: vaaddu_vv_nxv8i8_floor_lshr2: 69; CHECK: # %bb.0: 70; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 71; CHECK-NEXT: vwaddu.vv v10, v8, v9 72; CHECK-NEXT: vnsrl.wi v8, v10, 2 73; CHECK-NEXT: ret 74 %xzv = zext <vscale x 8 x i8> %x to <vscale x 8 x i16> 75 %yzv = zext <vscale x 8 x i8> %y to <vscale x 8 x i16> 76 %add = add nuw nsw <vscale x 8 x i16> %xzv, %yzv 77 %div = lshr <vscale x 8 x i16> %add, splat (i16 2) 78 %ret = trunc <vscale x 8 x i16> %div to <vscale x 8 x i8> 79 ret <vscale x 8 x i8> %ret 80} 81 82define <vscale x 8 x i16> @vaaddu_vv_nxv8i16_floor(<vscale x 8 x i16> %x, <vscale x 8 x i16> %y) { 83; CHECK-LABEL: vaaddu_vv_nxv8i16_floor: 84; CHECK: # %bb.0: 85; CHECK-NEXT: csrwi vxrm, 2 86; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 87; CHECK-NEXT: vaaddu.vv v8, v8, v10 88; CHECK-NEXT: ret 89 %xzv = zext <vscale x 8 x i16> %x to <vscale x 8 x i32> 90 %yzv = zext <vscale x 8 x i16> %y to <vscale x 8 x i32> 91 %add = add nuw nsw <vscale x 8 x i32> %xzv, %yzv 92 %div = lshr <vscale x 8 x i32> %add, splat (i32 1) 93 %ret = trunc <vscale x 8 x i32> %div to <vscale x 8 x i16> 94 ret <vscale x 8 x i16> %ret 95} 96 97define <vscale x 8 x i16> @vaaddu_vx_nxv8i16_floor(<vscale x 8 x i16> %x, i16 %y) { 98; CHECK-LABEL: vaaddu_vx_nxv8i16_floor: 99; CHECK: # %bb.0: 100; CHECK-NEXT: csrwi vxrm, 2 101; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 102; CHECK-NEXT: vaaddu.vx v8, v8, a0 103; CHECK-NEXT: ret 104 %xzv = zext <vscale x 8 x i16> %x to <vscale x 8 x i32> 105 %yhead = insertelement <vscale x 8 x i16> poison, i16 %y, i16 0 106 %ysplat = shufflevector <vscale x 8 x i16> %yhead, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 107 %yzv = zext <vscale x 8 x i16> %ysplat to <vscale x 8 x i32> 108 %add = add nuw nsw <vscale x 8 x i32> %xzv, %yzv 109 %div = lshr <vscale x 8 x i32> %add, splat (i32 1) 110 %ret = trunc <vscale x 8 x i32> %div to <vscale x 8 x i16> 111 ret <vscale x 8 x i16> %ret 112} 113 114define <vscale x 8 x i32> @vaaddu_vv_nxv8i32_floor(<vscale x 8 x i32> %x, <vscale x 8 x i32> %y) { 115; CHECK-LABEL: vaaddu_vv_nxv8i32_floor: 116; CHECK: # %bb.0: 117; CHECK-NEXT: csrwi vxrm, 2 118; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 119; CHECK-NEXT: vaaddu.vv v8, v8, v12 120; CHECK-NEXT: ret 121 %xzv = zext <vscale x 8 x i32> %x to <vscale x 8 x i64> 122 %yzv = zext <vscale x 8 x i32> %y to <vscale x 8 x i64> 123 %add = add nuw nsw <vscale x 8 x i64> %xzv, %yzv 124 %div = lshr <vscale x 8 x i64> %add, splat (i64 1) 125 %ret = trunc <vscale x 8 x i64> %div to <vscale x 8 x i32> 126 ret <vscale x 8 x i32> %ret 127} 128 129define <vscale x 8 x i32> @vaaddu_vx_nxv8i32_floor(<vscale x 8 x i32> %x, i32 %y) { 130; CHECK-LABEL: vaaddu_vx_nxv8i32_floor: 131; CHECK: # %bb.0: 132; CHECK-NEXT: csrwi vxrm, 2 133; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma 134; CHECK-NEXT: vaaddu.vx v8, v8, a0 135; CHECK-NEXT: ret 136 %xzv = zext <vscale x 8 x i32> %x to <vscale x 8 x i64> 137 %yhead = insertelement <vscale x 8 x i32> poison, i32 %y, i32 0 138 %ysplat = shufflevector <vscale x 8 x i32> %yhead, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 139 %yzv = zext <vscale x 8 x i32> %ysplat to <vscale x 8 x i64> 140 %add = add nuw nsw <vscale x 8 x i64> %xzv, %yzv 141 %div = lshr <vscale x 8 x i64> %add, splat (i64 1) 142 %ret = trunc <vscale x 8 x i64> %div to <vscale x 8 x i32> 143 ret <vscale x 8 x i32> %ret 144} 145 146define <vscale x 8 x i64> @vaaddu_vv_nxv8i64_floor(<vscale x 8 x i64> %x, <vscale x 8 x i64> %y) { 147; CHECK-LABEL: vaaddu_vv_nxv8i64_floor: 148; CHECK: # %bb.0: 149; CHECK-NEXT: csrwi vxrm, 2 150; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 151; CHECK-NEXT: vaaddu.vv v8, v8, v16 152; CHECK-NEXT: ret 153 %xzv = zext <vscale x 8 x i64> %x to <vscale x 8 x i128> 154 %yzv = zext <vscale x 8 x i64> %y to <vscale x 8 x i128> 155 %add = add nuw nsw <vscale x 8 x i128> %xzv, %yzv 156 %div = lshr <vscale x 8 x i128> %add, splat (i128 1) 157 %ret = trunc <vscale x 8 x i128> %div to <vscale x 8 x i64> 158 ret <vscale x 8 x i64> %ret 159} 160 161define <vscale x 8 x i64> @vaaddu_vx_nxv8i64_floor(<vscale x 8 x i64> %x, i64 %y) { 162; RV32-LABEL: vaaddu_vx_nxv8i64_floor: 163; RV32: # %bb.0: 164; RV32-NEXT: addi sp, sp, -16 165; RV32-NEXT: .cfi_def_cfa_offset 16 166; RV32-NEXT: sw a0, 8(sp) 167; RV32-NEXT: sw a1, 12(sp) 168; RV32-NEXT: addi a0, sp, 8 169; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma 170; RV32-NEXT: vlse64.v v16, (a0), zero 171; RV32-NEXT: csrwi vxrm, 2 172; RV32-NEXT: vaaddu.vv v8, v8, v16 173; RV32-NEXT: addi sp, sp, 16 174; RV32-NEXT: .cfi_def_cfa_offset 0 175; RV32-NEXT: ret 176; 177; RV64-LABEL: vaaddu_vx_nxv8i64_floor: 178; RV64: # %bb.0: 179; RV64-NEXT: csrwi vxrm, 2 180; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma 181; RV64-NEXT: vaaddu.vx v8, v8, a0 182; RV64-NEXT: ret 183 %xzv = zext <vscale x 8 x i64> %x to <vscale x 8 x i128> 184 %yhead = insertelement <vscale x 8 x i64> poison, i64 %y, i64 0 185 %ysplat = shufflevector <vscale x 8 x i64> %yhead, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 186 %yzv = zext <vscale x 8 x i64> %ysplat to <vscale x 8 x i128> 187 %add = add nuw nsw <vscale x 8 x i128> %xzv, %yzv 188 %div = lshr <vscale x 8 x i128> %add, splat (i128 1) 189 %ret = trunc <vscale x 8 x i128> %div to <vscale x 8 x i64> 190 ret <vscale x 8 x i64> %ret 191} 192 193define <vscale x 8 x i8> @vaaddu_vv_nxv8i8_ceil(<vscale x 8 x i8> %x, <vscale x 8 x i8> %y) { 194; CHECK-LABEL: vaaddu_vv_nxv8i8_ceil: 195; CHECK: # %bb.0: 196; CHECK-NEXT: csrwi vxrm, 0 197; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 198; CHECK-NEXT: vaaddu.vv v8, v8, v9 199; CHECK-NEXT: ret 200 %xzv = zext <vscale x 8 x i8> %x to <vscale x 8 x i16> 201 %yzv = zext <vscale x 8 x i8> %y to <vscale x 8 x i16> 202 %add = add nuw nsw <vscale x 8 x i16> %xzv, %yzv 203 %add1 = add nuw nsw <vscale x 8 x i16> %add, splat (i16 1) 204 %div = lshr <vscale x 8 x i16> %add1, splat (i16 1) 205 %ret = trunc <vscale x 8 x i16> %div to <vscale x 8 x i8> 206 ret <vscale x 8 x i8> %ret 207} 208 209define <vscale x 8 x i8> @vaaddu_vx_nxv8i8_ceil(<vscale x 8 x i8> %x, i8 %y) { 210; CHECK-LABEL: vaaddu_vx_nxv8i8_ceil: 211; CHECK: # %bb.0: 212; CHECK-NEXT: csrwi vxrm, 0 213; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 214; CHECK-NEXT: vaaddu.vx v8, v8, a0 215; CHECK-NEXT: ret 216 %xzv = zext <vscale x 8 x i8> %x to <vscale x 8 x i16> 217 %yhead = insertelement <vscale x 8 x i8> poison, i8 %y, i32 0 218 %ysplat = shufflevector <vscale x 8 x i8> %yhead, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 219 %yzv = zext <vscale x 8 x i8> %ysplat to <vscale x 8 x i16> 220 %add = add nuw nsw <vscale x 8 x i16> %xzv, %yzv 221 %add1 = add nuw nsw <vscale x 8 x i16> %add, splat (i16 1) 222 %div = lshr <vscale x 8 x i16> %add1, splat (i16 1) 223 %ret = trunc <vscale x 8 x i16> %div to <vscale x 8 x i8> 224 ret <vscale x 8 x i8> %ret 225} 226 227define <vscale x 8 x i8> @vaaddu_vv_nxv8i8_ceil_sexti16(<vscale x 8 x i8> %x, <vscale x 8 x i8> %y) { 228; CHECK-LABEL: vaaddu_vv_nxv8i8_ceil_sexti16: 229; CHECK: # %bb.0: 230; CHECK-NEXT: csrwi vxrm, 0 231; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 232; CHECK-NEXT: vaadd.vv v8, v8, v9 233; CHECK-NEXT: ret 234 %xzv = sext <vscale x 8 x i8> %x to <vscale x 8 x i16> 235 %yzv = sext <vscale x 8 x i8> %y to <vscale x 8 x i16> 236 %add = add nuw nsw <vscale x 8 x i16> %xzv, %yzv 237 %add1 = add nuw nsw <vscale x 8 x i16> %add, splat (i16 1) 238 %div = lshr <vscale x 8 x i16> %add1, splat (i16 1) 239 %ret = trunc <vscale x 8 x i16> %div to <vscale x 8 x i8> 240 ret <vscale x 8 x i8> %ret 241} 242 243define <vscale x 8 x i8> @vaaddu_vv_nxv8i8_ceil_zexti32(<vscale x 8 x i8> %x, <vscale x 8 x i8> %y) { 244; CHECK-LABEL: vaaddu_vv_nxv8i8_ceil_zexti32: 245; CHECK: # %bb.0: 246; CHECK-NEXT: csrwi vxrm, 0 247; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 248; CHECK-NEXT: vaaddu.vv v8, v8, v9 249; CHECK-NEXT: ret 250 %xzv = zext <vscale x 8 x i8> %x to <vscale x 8 x i32> 251 %yzv = zext <vscale x 8 x i8> %y to <vscale x 8 x i32> 252 %add = add nuw nsw <vscale x 8 x i32> %xzv, %yzv 253 %add1 = add nuw nsw <vscale x 8 x i32> %add, splat (i32 1) 254 %div = lshr <vscale x 8 x i32> %add1, splat (i32 1) 255 %ret = trunc <vscale x 8 x i32> %div to <vscale x 8 x i8> 256 ret <vscale x 8 x i8> %ret 257} 258 259define <vscale x 8 x i8> @vaaddu_vv_nxv8i8_ceil_lshr2(<vscale x 8 x i8> %x, <vscale x 8 x i8> %y) { 260; CHECK-LABEL: vaaddu_vv_nxv8i8_ceil_lshr2: 261; CHECK: # %bb.0: 262; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 263; CHECK-NEXT: vwaddu.vv v10, v8, v9 264; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 265; CHECK-NEXT: vadd.vi v10, v10, 2 266; CHECK-NEXT: vsetvli zero, zero, e8, m1, ta, ma 267; CHECK-NEXT: vnsrl.wi v8, v10, 2 268; CHECK-NEXT: ret 269 %xzv = zext <vscale x 8 x i8> %x to <vscale x 8 x i16> 270 %yzv = zext <vscale x 8 x i8> %y to <vscale x 8 x i16> 271 %add = add nuw nsw <vscale x 8 x i16> %xzv, %yzv 272 %add1 = add nuw nsw <vscale x 8 x i16> %add, splat (i16 2) 273 %div = lshr <vscale x 8 x i16> %add1, splat (i16 2) 274 %ret = trunc <vscale x 8 x i16> %div to <vscale x 8 x i8> 275 ret <vscale x 8 x i8> %ret 276} 277 278define <vscale x 8 x i8> @vaaddu_vv_nxv8i8_ceil_add2(<vscale x 8 x i8> %x, <vscale x 8 x i8> %y) { 279; CHECK-LABEL: vaaddu_vv_nxv8i8_ceil_add2: 280; CHECK: # %bb.0: 281; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 282; CHECK-NEXT: vwaddu.vv v10, v8, v9 283; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 284; CHECK-NEXT: vadd.vi v10, v10, 2 285; CHECK-NEXT: vsetvli zero, zero, e8, m1, ta, ma 286; CHECK-NEXT: vnsrl.wi v8, v10, 2 287; CHECK-NEXT: ret 288 %xzv = zext <vscale x 8 x i8> %x to <vscale x 8 x i16> 289 %yzv = zext <vscale x 8 x i8> %y to <vscale x 8 x i16> 290 %add = add nuw nsw <vscale x 8 x i16> %xzv, %yzv 291 %add2 = add nuw nsw <vscale x 8 x i16> %add, splat (i16 2) 292 %div = lshr <vscale x 8 x i16> %add2, splat (i16 2) 293 %ret = trunc <vscale x 8 x i16> %div to <vscale x 8 x i8> 294 ret <vscale x 8 x i8> %ret 295} 296 297define <vscale x 8 x i16> @vaaddu_vv_nxv8i16_ceil(<vscale x 8 x i16> %x, <vscale x 8 x i16> %y) { 298; CHECK-LABEL: vaaddu_vv_nxv8i16_ceil: 299; CHECK: # %bb.0: 300; CHECK-NEXT: csrwi vxrm, 0 301; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 302; CHECK-NEXT: vaaddu.vv v8, v8, v10 303; CHECK-NEXT: ret 304 %xzv = zext <vscale x 8 x i16> %x to <vscale x 8 x i32> 305 %yzv = zext <vscale x 8 x i16> %y to <vscale x 8 x i32> 306 %add = add nuw nsw <vscale x 8 x i32> %xzv, %yzv 307 %add1 = add nuw nsw <vscale x 8 x i32> %add, splat (i32 1) 308 %div = lshr <vscale x 8 x i32> %add1, splat (i32 1) 309 %ret = trunc <vscale x 8 x i32> %div to <vscale x 8 x i16> 310 ret <vscale x 8 x i16> %ret 311} 312 313define <vscale x 8 x i16> @vaaddu_vx_nxv8i16_ceil(<vscale x 8 x i16> %x, i16 %y) { 314; CHECK-LABEL: vaaddu_vx_nxv8i16_ceil: 315; CHECK: # %bb.0: 316; CHECK-NEXT: csrwi vxrm, 0 317; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 318; CHECK-NEXT: vaaddu.vx v8, v8, a0 319; CHECK-NEXT: ret 320 %xzv = zext <vscale x 8 x i16> %x to <vscale x 8 x i32> 321 %yhead = insertelement <vscale x 8 x i16> poison, i16 %y, i16 0 322 %ysplat = shufflevector <vscale x 8 x i16> %yhead, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 323 %yzv = zext <vscale x 8 x i16> %ysplat to <vscale x 8 x i32> 324 %add = add nuw nsw <vscale x 8 x i32> %xzv, %yzv 325 %add1 = add nuw nsw <vscale x 8 x i32> %add, splat (i32 1) 326 %div = lshr <vscale x 8 x i32> %add1, splat (i32 1) 327 %ret = trunc <vscale x 8 x i32> %div to <vscale x 8 x i16> 328 ret <vscale x 8 x i16> %ret 329} 330 331define <vscale x 8 x i32> @vaaddu_vv_nxv8i32_ceil(<vscale x 8 x i32> %x, <vscale x 8 x i32> %y) { 332; CHECK-LABEL: vaaddu_vv_nxv8i32_ceil: 333; CHECK: # %bb.0: 334; CHECK-NEXT: csrwi vxrm, 0 335; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 336; CHECK-NEXT: vaaddu.vv v8, v8, v12 337; CHECK-NEXT: ret 338 %xzv = zext <vscale x 8 x i32> %x to <vscale x 8 x i64> 339 %yzv = zext <vscale x 8 x i32> %y to <vscale x 8 x i64> 340 %add = add nuw nsw <vscale x 8 x i64> %xzv, %yzv 341 %add1 = add nuw nsw <vscale x 8 x i64> %add, splat (i64 1) 342 %div = lshr <vscale x 8 x i64> %add1, splat (i64 1) 343 %ret = trunc <vscale x 8 x i64> %div to <vscale x 8 x i32> 344 ret <vscale x 8 x i32> %ret 345} 346 347define <vscale x 8 x i32> @vaaddu_vx_nxv8i32_ceil(<vscale x 8 x i32> %x, i32 %y) { 348; CHECK-LABEL: vaaddu_vx_nxv8i32_ceil: 349; CHECK: # %bb.0: 350; CHECK-NEXT: csrwi vxrm, 0 351; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma 352; CHECK-NEXT: vaaddu.vx v8, v8, a0 353; CHECK-NEXT: ret 354 %xzv = zext <vscale x 8 x i32> %x to <vscale x 8 x i64> 355 %yhead = insertelement <vscale x 8 x i32> poison, i32 %y, i32 0 356 %ysplat = shufflevector <vscale x 8 x i32> %yhead, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 357 %yzv = zext <vscale x 8 x i32> %ysplat to <vscale x 8 x i64> 358 %add = add nuw nsw <vscale x 8 x i64> %xzv, %yzv 359 %add1 = add nuw nsw <vscale x 8 x i64> %add, splat (i64 1) 360 %div = lshr <vscale x 8 x i64> %add1, splat (i64 1) 361 %ret = trunc <vscale x 8 x i64> %div to <vscale x 8 x i32> 362 ret <vscale x 8 x i32> %ret 363} 364 365define <vscale x 8 x i64> @vaaddu_vv_nxv8i64_ceil(<vscale x 8 x i64> %x, <vscale x 8 x i64> %y) { 366; CHECK-LABEL: vaaddu_vv_nxv8i64_ceil: 367; CHECK: # %bb.0: 368; CHECK-NEXT: csrwi vxrm, 0 369; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 370; CHECK-NEXT: vaaddu.vv v8, v8, v16 371; CHECK-NEXT: ret 372 %xzv = zext <vscale x 8 x i64> %x to <vscale x 8 x i128> 373 %yzv = zext <vscale x 8 x i64> %y to <vscale x 8 x i128> 374 %add = add nuw nsw <vscale x 8 x i128> %xzv, %yzv 375 %add1 = add nuw nsw <vscale x 8 x i128> %add, splat (i128 1) 376 %div = lshr <vscale x 8 x i128> %add1, splat (i128 1) 377 %ret = trunc <vscale x 8 x i128> %div to <vscale x 8 x i64> 378 ret <vscale x 8 x i64> %ret 379} 380 381define <vscale x 8 x i64> @vaaddu_vx_nxv8i64_ceil(<vscale x 8 x i64> %x, i64 %y) { 382; RV32-LABEL: vaaddu_vx_nxv8i64_ceil: 383; RV32: # %bb.0: 384; RV32-NEXT: addi sp, sp, -16 385; RV32-NEXT: .cfi_def_cfa_offset 16 386; RV32-NEXT: sw a0, 8(sp) 387; RV32-NEXT: sw a1, 12(sp) 388; RV32-NEXT: addi a0, sp, 8 389; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma 390; RV32-NEXT: vlse64.v v16, (a0), zero 391; RV32-NEXT: csrwi vxrm, 0 392; RV32-NEXT: vaaddu.vv v8, v8, v16 393; RV32-NEXT: addi sp, sp, 16 394; RV32-NEXT: .cfi_def_cfa_offset 0 395; RV32-NEXT: ret 396; 397; RV64-LABEL: vaaddu_vx_nxv8i64_ceil: 398; RV64: # %bb.0: 399; RV64-NEXT: csrwi vxrm, 0 400; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma 401; RV64-NEXT: vaaddu.vx v8, v8, a0 402; RV64-NEXT: ret 403 %xzv = zext <vscale x 8 x i64> %x to <vscale x 8 x i128> 404 %yhead = insertelement <vscale x 8 x i64> poison, i64 %y, i64 0 405 %ysplat = shufflevector <vscale x 8 x i64> %yhead, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 406 %yzv = zext <vscale x 8 x i64> %ysplat to <vscale x 8 x i128> 407 %add = add nuw nsw <vscale x 8 x i128> %xzv, %yzv 408 %add1 = add nuw nsw <vscale x 8 x i128> %add, splat (i128 1) 409 %div = lshr <vscale x 8 x i128> %add1, splat (i128 1) 410 %ret = trunc <vscale x 8 x i128> %div to <vscale x 8 x i64> 411 ret <vscale x 8 x i64> %ret 412} 413