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 --check-prefixes=CHECK,RV32,RV32-V 3; RUN: llc -mtriple=riscv32 -mattr=+zve64x -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,ZVE64X 4; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64-V 5; RUN: llc -mtriple=riscv64 -mattr=+zve64x -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,ZVE64X 6 7define <vscale x 1 x i8> @vrem_vv_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb) { 8; CHECK-LABEL: vrem_vv_nxv1i8: 9; CHECK: # %bb.0: 10; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 11; CHECK-NEXT: vrem.vv v8, v8, v9 12; CHECK-NEXT: ret 13 %vc = srem <vscale x 1 x i8> %va, %vb 14 ret <vscale x 1 x i8> %vc 15} 16 17define <vscale x 1 x i8> @vrem_vx_nxv1i8(<vscale x 1 x i8> %va, i8 signext %b) { 18; CHECK-LABEL: vrem_vx_nxv1i8: 19; CHECK: # %bb.0: 20; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 21; CHECK-NEXT: vrem.vx v8, v8, a0 22; CHECK-NEXT: ret 23 %head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0 24 %splat = shufflevector <vscale x 1 x i8> %head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 25 %vc = srem <vscale x 1 x i8> %va, %splat 26 ret <vscale x 1 x i8> %vc 27} 28 29define <vscale x 1 x i8> @vrem_vi_nxv1i8_0(<vscale x 1 x i8> %va) { 30; CHECK-LABEL: vrem_vi_nxv1i8_0: 31; CHECK: # %bb.0: 32; CHECK-NEXT: li a0, 109 33; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 34; CHECK-NEXT: vmulh.vx v9, v8, a0 35; CHECK-NEXT: vsub.vv v9, v9, v8 36; CHECK-NEXT: vsra.vi v9, v9, 2 37; CHECK-NEXT: vsrl.vi v10, v9, 7 38; CHECK-NEXT: vadd.vv v9, v9, v10 39; CHECK-NEXT: li a0, -7 40; CHECK-NEXT: vnmsac.vx v8, a0, v9 41; CHECK-NEXT: ret 42 %vc = srem <vscale x 1 x i8> %va, splat (i8 -7) 43 ret <vscale x 1 x i8> %vc 44} 45 46define <vscale x 1 x i8> @vrem_vv_nxv1i8_sext_twice(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb) { 47; CHECK-LABEL: vrem_vv_nxv1i8_sext_twice: 48; CHECK: # %bb.0: 49; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 50; CHECK-NEXT: vrem.vv v8, v8, v9 51; CHECK-NEXT: ret 52 %sext_va = sext <vscale x 1 x i8> %va to <vscale x 1 x i16> 53 %sext_vb = sext <vscale x 1 x i8> %vb to <vscale x 1 x i16> 54 %vc_ext = srem <vscale x 1 x i16> %sext_va, %sext_vb 55 %vc = trunc <vscale x 1 x i16> %vc_ext to <vscale x 1 x i8> 56 ret <vscale x 1 x i8> %vc 57} 58 59define <vscale x 2 x i8> @vrem_vv_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb) { 60; CHECK-LABEL: vrem_vv_nxv2i8: 61; CHECK: # %bb.0: 62; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 63; CHECK-NEXT: vrem.vv v8, v8, v9 64; CHECK-NEXT: ret 65 %vc = srem <vscale x 2 x i8> %va, %vb 66 ret <vscale x 2 x i8> %vc 67} 68 69define <vscale x 2 x i8> @vrem_vx_nxv2i8(<vscale x 2 x i8> %va, i8 signext %b) { 70; CHECK-LABEL: vrem_vx_nxv2i8: 71; CHECK: # %bb.0: 72; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 73; CHECK-NEXT: vrem.vx v8, v8, a0 74; CHECK-NEXT: ret 75 %head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0 76 %splat = shufflevector <vscale x 2 x i8> %head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer 77 %vc = srem <vscale x 2 x i8> %va, %splat 78 ret <vscale x 2 x i8> %vc 79} 80 81define <vscale x 2 x i8> @vrem_vi_nxv2i8_0(<vscale x 2 x i8> %va) { 82; CHECK-LABEL: vrem_vi_nxv2i8_0: 83; CHECK: # %bb.0: 84; CHECK-NEXT: li a0, 109 85; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 86; CHECK-NEXT: vmulh.vx v9, v8, a0 87; CHECK-NEXT: vsub.vv v9, v9, v8 88; CHECK-NEXT: vsra.vi v9, v9, 2 89; CHECK-NEXT: vsrl.vi v10, v9, 7 90; CHECK-NEXT: vadd.vv v9, v9, v10 91; CHECK-NEXT: li a0, -7 92; CHECK-NEXT: vnmsac.vx v8, a0, v9 93; CHECK-NEXT: ret 94 %vc = srem <vscale x 2 x i8> %va, splat (i8 -7) 95 ret <vscale x 2 x i8> %vc 96} 97 98define <vscale x 2 x i8> @vrem_vv_nxv2i8_sext_twice(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb) { 99; CHECK-LABEL: vrem_vv_nxv2i8_sext_twice: 100; CHECK: # %bb.0: 101; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 102; CHECK-NEXT: vrem.vv v8, v8, v9 103; CHECK-NEXT: ret 104 %sext_va = sext <vscale x 2 x i8> %va to <vscale x 2 x i16> 105 %sext_vb = sext <vscale x 2 x i8> %vb to <vscale x 2 x i16> 106 %vc_ext = srem <vscale x 2 x i16> %sext_va, %sext_vb 107 %vc = trunc <vscale x 2 x i16> %vc_ext to <vscale x 2 x i8> 108 ret <vscale x 2 x i8> %vc 109} 110 111define <vscale x 4 x i8> @vrem_vv_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb) { 112; CHECK-LABEL: vrem_vv_nxv4i8: 113; CHECK: # %bb.0: 114; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 115; CHECK-NEXT: vrem.vv v8, v8, v9 116; CHECK-NEXT: ret 117 %vc = srem <vscale x 4 x i8> %va, %vb 118 ret <vscale x 4 x i8> %vc 119} 120 121define <vscale x 4 x i8> @vrem_vx_nxv4i8(<vscale x 4 x i8> %va, i8 signext %b) { 122; CHECK-LABEL: vrem_vx_nxv4i8: 123; CHECK: # %bb.0: 124; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 125; CHECK-NEXT: vrem.vx v8, v8, a0 126; CHECK-NEXT: ret 127 %head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0 128 %splat = shufflevector <vscale x 4 x i8> %head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer 129 %vc = srem <vscale x 4 x i8> %va, %splat 130 ret <vscale x 4 x i8> %vc 131} 132 133define <vscale x 4 x i8> @vrem_vi_nxv4i8_0(<vscale x 4 x i8> %va) { 134; CHECK-LABEL: vrem_vi_nxv4i8_0: 135; CHECK: # %bb.0: 136; CHECK-NEXT: li a0, 109 137; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 138; CHECK-NEXT: vmulh.vx v9, v8, a0 139; CHECK-NEXT: vsub.vv v9, v9, v8 140; CHECK-NEXT: vsra.vi v9, v9, 2 141; CHECK-NEXT: vsrl.vi v10, v9, 7 142; CHECK-NEXT: vadd.vv v9, v9, v10 143; CHECK-NEXT: li a0, -7 144; CHECK-NEXT: vnmsac.vx v8, a0, v9 145; CHECK-NEXT: ret 146 %vc = srem <vscale x 4 x i8> %va, splat (i8 -7) 147 ret <vscale x 4 x i8> %vc 148} 149 150define <vscale x 4 x i8> @vrem_vv_nxv4i8_sext_twice(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb) { 151; CHECK-LABEL: vrem_vv_nxv4i8_sext_twice: 152; CHECK: # %bb.0: 153; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 154; CHECK-NEXT: vrem.vv v8, v8, v9 155; CHECK-NEXT: ret 156 %sext_va = sext <vscale x 4 x i8> %va to <vscale x 4 x i16> 157 %sext_vb = sext <vscale x 4 x i8> %vb to <vscale x 4 x i16> 158 %vc_ext = srem <vscale x 4 x i16> %sext_va, %sext_vb 159 %vc = trunc <vscale x 4 x i16> %vc_ext to <vscale x 4 x i8> 160 ret <vscale x 4 x i8> %vc 161} 162 163define <vscale x 8 x i8> @vrem_vv_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb) { 164; CHECK-LABEL: vrem_vv_nxv8i8: 165; CHECK: # %bb.0: 166; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 167; CHECK-NEXT: vrem.vv v8, v8, v9 168; CHECK-NEXT: ret 169 %vc = srem <vscale x 8 x i8> %va, %vb 170 ret <vscale x 8 x i8> %vc 171} 172 173define <vscale x 8 x i8> @vrem_vx_nxv8i8(<vscale x 8 x i8> %va, i8 signext %b) { 174; CHECK-LABEL: vrem_vx_nxv8i8: 175; CHECK: # %bb.0: 176; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 177; CHECK-NEXT: vrem.vx v8, v8, a0 178; CHECK-NEXT: ret 179 %head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0 180 %splat = shufflevector <vscale x 8 x i8> %head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 181 %vc = srem <vscale x 8 x i8> %va, %splat 182 ret <vscale x 8 x i8> %vc 183} 184 185define <vscale x 8 x i8> @vrem_vi_nxv8i8_0(<vscale x 8 x i8> %va) { 186; CHECK-LABEL: vrem_vi_nxv8i8_0: 187; CHECK: # %bb.0: 188; CHECK-NEXT: li a0, 109 189; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 190; CHECK-NEXT: vmulh.vx v9, v8, a0 191; CHECK-NEXT: vsub.vv v9, v9, v8 192; CHECK-NEXT: vsra.vi v9, v9, 2 193; CHECK-NEXT: vsrl.vi v10, v9, 7 194; CHECK-NEXT: vadd.vv v9, v9, v10 195; CHECK-NEXT: li a0, -7 196; CHECK-NEXT: vnmsac.vx v8, a0, v9 197; CHECK-NEXT: ret 198 %vc = srem <vscale x 8 x i8> %va, splat (i8 -7) 199 ret <vscale x 8 x i8> %vc 200} 201 202define <vscale x 8 x i8> @vrem_vv_nxv8i8_sext_twice(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb) { 203; CHECK-LABEL: vrem_vv_nxv8i8_sext_twice: 204; CHECK: # %bb.0: 205; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 206; CHECK-NEXT: vrem.vv v8, v8, v9 207; CHECK-NEXT: ret 208 %sext_va = sext <vscale x 8 x i8> %va to <vscale x 8 x i16> 209 %sext_vb = sext <vscale x 8 x i8> %vb to <vscale x 8 x i16> 210 %vc_ext = srem <vscale x 8 x i16> %sext_va, %sext_vb 211 %vc = trunc <vscale x 8 x i16> %vc_ext to <vscale x 8 x i8> 212 ret <vscale x 8 x i8> %vc 213} 214 215define <vscale x 16 x i8> @vrem_vv_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb) { 216; CHECK-LABEL: vrem_vv_nxv16i8: 217; CHECK: # %bb.0: 218; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 219; CHECK-NEXT: vrem.vv v8, v8, v10 220; CHECK-NEXT: ret 221 %vc = srem <vscale x 16 x i8> %va, %vb 222 ret <vscale x 16 x i8> %vc 223} 224 225define <vscale x 16 x i8> @vrem_vx_nxv16i8(<vscale x 16 x i8> %va, i8 signext %b) { 226; CHECK-LABEL: vrem_vx_nxv16i8: 227; CHECK: # %bb.0: 228; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma 229; CHECK-NEXT: vrem.vx v8, v8, a0 230; CHECK-NEXT: ret 231 %head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0 232 %splat = shufflevector <vscale x 16 x i8> %head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer 233 %vc = srem <vscale x 16 x i8> %va, %splat 234 ret <vscale x 16 x i8> %vc 235} 236 237define <vscale x 16 x i8> @vrem_vi_nxv16i8_0(<vscale x 16 x i8> %va) { 238; CHECK-LABEL: vrem_vi_nxv16i8_0: 239; CHECK: # %bb.0: 240; CHECK-NEXT: li a0, 109 241; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma 242; CHECK-NEXT: vmulh.vx v10, v8, a0 243; CHECK-NEXT: vsub.vv v10, v10, v8 244; CHECK-NEXT: vsra.vi v10, v10, 2 245; CHECK-NEXT: vsrl.vi v12, v10, 7 246; CHECK-NEXT: vadd.vv v10, v10, v12 247; CHECK-NEXT: li a0, -7 248; CHECK-NEXT: vnmsac.vx v8, a0, v10 249; CHECK-NEXT: ret 250 %vc = srem <vscale x 16 x i8> %va, splat (i8 -7) 251 ret <vscale x 16 x i8> %vc 252} 253 254define <vscale x 16 x i8> @vrem_vv_nxv16i8_sext_twice(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb) { 255; CHECK-LABEL: vrem_vv_nxv16i8_sext_twice: 256; CHECK: # %bb.0: 257; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 258; CHECK-NEXT: vrem.vv v8, v8, v10 259; CHECK-NEXT: ret 260 %sext_va = sext <vscale x 16 x i8> %va to <vscale x 16 x i16> 261 %sext_vb = sext <vscale x 16 x i8> %vb to <vscale x 16 x i16> 262 %vc_ext = srem <vscale x 16 x i16> %sext_va, %sext_vb 263 %vc = trunc <vscale x 16 x i16> %vc_ext to <vscale x 16 x i8> 264 ret <vscale x 16 x i8> %vc 265} 266 267define <vscale x 32 x i8> @vrem_vv_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb) { 268; CHECK-LABEL: vrem_vv_nxv32i8: 269; CHECK: # %bb.0: 270; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 271; CHECK-NEXT: vrem.vv v8, v8, v12 272; CHECK-NEXT: ret 273 %vc = srem <vscale x 32 x i8> %va, %vb 274 ret <vscale x 32 x i8> %vc 275} 276 277define <vscale x 32 x i8> @vrem_vx_nxv32i8(<vscale x 32 x i8> %va, i8 signext %b) { 278; CHECK-LABEL: vrem_vx_nxv32i8: 279; CHECK: # %bb.0: 280; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma 281; CHECK-NEXT: vrem.vx v8, v8, a0 282; CHECK-NEXT: ret 283 %head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0 284 %splat = shufflevector <vscale x 32 x i8> %head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer 285 %vc = srem <vscale x 32 x i8> %va, %splat 286 ret <vscale x 32 x i8> %vc 287} 288 289define <vscale x 32 x i8> @vrem_vi_nxv32i8_0(<vscale x 32 x i8> %va) { 290; CHECK-LABEL: vrem_vi_nxv32i8_0: 291; CHECK: # %bb.0: 292; CHECK-NEXT: li a0, 109 293; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma 294; CHECK-NEXT: vmulh.vx v12, v8, a0 295; CHECK-NEXT: vsub.vv v12, v12, v8 296; CHECK-NEXT: vsra.vi v12, v12, 2 297; CHECK-NEXT: vsrl.vi v16, v12, 7 298; CHECK-NEXT: vadd.vv v12, v12, v16 299; CHECK-NEXT: li a0, -7 300; CHECK-NEXT: vnmsac.vx v8, a0, v12 301; CHECK-NEXT: ret 302 %vc = srem <vscale x 32 x i8> %va, splat (i8 -7) 303 ret <vscale x 32 x i8> %vc 304} 305 306define <vscale x 32 x i8> @vrem_vv_nxv32i8_sext_twice(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb) { 307; CHECK-LABEL: vrem_vv_nxv32i8_sext_twice: 308; CHECK: # %bb.0: 309; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 310; CHECK-NEXT: vrem.vv v8, v8, v12 311; CHECK-NEXT: ret 312 %sext_va = sext <vscale x 32 x i8> %va to <vscale x 32 x i16> 313 %sext_vb = sext <vscale x 32 x i8> %vb to <vscale x 32 x i16> 314 %vc_ext = srem <vscale x 32 x i16> %sext_va, %sext_vb 315 %vc = trunc <vscale x 32 x i16> %vc_ext to <vscale x 32 x i8> 316 ret <vscale x 32 x i8> %vc 317} 318 319define <vscale x 64 x i8> @vrem_vv_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb) { 320; CHECK-LABEL: vrem_vv_nxv64i8: 321; CHECK: # %bb.0: 322; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 323; CHECK-NEXT: vrem.vv v8, v8, v16 324; CHECK-NEXT: ret 325 %vc = srem <vscale x 64 x i8> %va, %vb 326 ret <vscale x 64 x i8> %vc 327} 328 329define <vscale x 64 x i8> @vrem_vx_nxv64i8(<vscale x 64 x i8> %va, i8 signext %b) { 330; CHECK-LABEL: vrem_vx_nxv64i8: 331; CHECK: # %bb.0: 332; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma 333; CHECK-NEXT: vrem.vx v8, v8, a0 334; CHECK-NEXT: ret 335 %head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0 336 %splat = shufflevector <vscale x 64 x i8> %head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer 337 %vc = srem <vscale x 64 x i8> %va, %splat 338 ret <vscale x 64 x i8> %vc 339} 340 341define <vscale x 64 x i8> @vrem_vi_nxv64i8_0(<vscale x 64 x i8> %va) { 342; CHECK-LABEL: vrem_vi_nxv64i8_0: 343; CHECK: # %bb.0: 344; CHECK-NEXT: li a0, 109 345; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma 346; CHECK-NEXT: vmulh.vx v16, v8, a0 347; CHECK-NEXT: vsub.vv v16, v16, v8 348; CHECK-NEXT: vsra.vi v16, v16, 2 349; CHECK-NEXT: vsrl.vi v24, v16, 7 350; CHECK-NEXT: vadd.vv v16, v16, v24 351; CHECK-NEXT: li a0, -7 352; CHECK-NEXT: vnmsac.vx v8, a0, v16 353; CHECK-NEXT: ret 354 %vc = srem <vscale x 64 x i8> %va, splat (i8 -7) 355 ret <vscale x 64 x i8> %vc 356} 357 358define <vscale x 1 x i16> @vrem_vv_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb) { 359; CHECK-LABEL: vrem_vv_nxv1i16: 360; CHECK: # %bb.0: 361; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 362; CHECK-NEXT: vrem.vv v8, v8, v9 363; CHECK-NEXT: ret 364 %vc = srem <vscale x 1 x i16> %va, %vb 365 ret <vscale x 1 x i16> %vc 366} 367 368define <vscale x 1 x i16> @vrem_vx_nxv1i16(<vscale x 1 x i16> %va, i16 signext %b) { 369; CHECK-LABEL: vrem_vx_nxv1i16: 370; CHECK: # %bb.0: 371; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 372; CHECK-NEXT: vrem.vx v8, v8, a0 373; CHECK-NEXT: ret 374 %head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0 375 %splat = shufflevector <vscale x 1 x i16> %head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer 376 %vc = srem <vscale x 1 x i16> %va, %splat 377 ret <vscale x 1 x i16> %vc 378} 379 380define <vscale x 1 x i16> @vrem_vi_nxv1i16_0(<vscale x 1 x i16> %va) { 381; CHECK-LABEL: vrem_vi_nxv1i16_0: 382; CHECK: # %bb.0: 383; CHECK-NEXT: lui a0, 1048571 384; CHECK-NEXT: addi a0, a0, 1755 385; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 386; CHECK-NEXT: vmulh.vx v9, v8, a0 387; CHECK-NEXT: vsra.vi v9, v9, 1 388; CHECK-NEXT: vsrl.vi v10, v9, 15 389; CHECK-NEXT: vadd.vv v9, v9, v10 390; CHECK-NEXT: li a0, -7 391; CHECK-NEXT: vnmsac.vx v8, a0, v9 392; CHECK-NEXT: ret 393 %vc = srem <vscale x 1 x i16> %va, splat (i16 -7) 394 ret <vscale x 1 x i16> %vc 395} 396 397define <vscale x 1 x i16> @vrem_vv_nxv1i16_sext_twice(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb) { 398; CHECK-LABEL: vrem_vv_nxv1i16_sext_twice: 399; CHECK: # %bb.0: 400; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 401; CHECK-NEXT: vrem.vv v8, v8, v9 402; CHECK-NEXT: ret 403 %sext_va = sext <vscale x 1 x i16> %va to <vscale x 1 x i32> 404 %sext_vb = sext <vscale x 1 x i16> %vb to <vscale x 1 x i32> 405 %vc_ext = srem <vscale x 1 x i32> %sext_va, %sext_vb 406 %vc = trunc <vscale x 1 x i32> %vc_ext to <vscale x 1 x i16> 407 ret <vscale x 1 x i16> %vc 408} 409 410define <vscale x 2 x i16> @vrem_vv_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb) { 411; CHECK-LABEL: vrem_vv_nxv2i16: 412; CHECK: # %bb.0: 413; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 414; CHECK-NEXT: vrem.vv v8, v8, v9 415; CHECK-NEXT: ret 416 %vc = srem <vscale x 2 x i16> %va, %vb 417 ret <vscale x 2 x i16> %vc 418} 419 420define <vscale x 2 x i16> @vrem_vx_nxv2i16(<vscale x 2 x i16> %va, i16 signext %b) { 421; CHECK-LABEL: vrem_vx_nxv2i16: 422; CHECK: # %bb.0: 423; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 424; CHECK-NEXT: vrem.vx v8, v8, a0 425; CHECK-NEXT: ret 426 %head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0 427 %splat = shufflevector <vscale x 2 x i16> %head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer 428 %vc = srem <vscale x 2 x i16> %va, %splat 429 ret <vscale x 2 x i16> %vc 430} 431 432define <vscale x 2 x i16> @vrem_vi_nxv2i16_0(<vscale x 2 x i16> %va) { 433; CHECK-LABEL: vrem_vi_nxv2i16_0: 434; CHECK: # %bb.0: 435; CHECK-NEXT: lui a0, 1048571 436; CHECK-NEXT: addi a0, a0, 1755 437; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 438; CHECK-NEXT: vmulh.vx v9, v8, a0 439; CHECK-NEXT: vsra.vi v9, v9, 1 440; CHECK-NEXT: vsrl.vi v10, v9, 15 441; CHECK-NEXT: vadd.vv v9, v9, v10 442; CHECK-NEXT: li a0, -7 443; CHECK-NEXT: vnmsac.vx v8, a0, v9 444; CHECK-NEXT: ret 445 %vc = srem <vscale x 2 x i16> %va, splat (i16 -7) 446 ret <vscale x 2 x i16> %vc 447} 448 449define <vscale x 2 x i16> @vrem_vv_nxv2i16_sext_twice(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb) { 450; CHECK-LABEL: vrem_vv_nxv2i16_sext_twice: 451; CHECK: # %bb.0: 452; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 453; CHECK-NEXT: vrem.vv v8, v8, v9 454; CHECK-NEXT: ret 455 %sext_va = sext <vscale x 2 x i16> %va to <vscale x 2 x i32> 456 %sext_vb = sext <vscale x 2 x i16> %vb to <vscale x 2 x i32> 457 %vc_ext = srem <vscale x 2 x i32> %sext_va, %sext_vb 458 %vc = trunc <vscale x 2 x i32> %vc_ext to <vscale x 2 x i16> 459 ret <vscale x 2 x i16> %vc 460} 461 462define <vscale x 4 x i16> @vrem_vv_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb) { 463; CHECK-LABEL: vrem_vv_nxv4i16: 464; CHECK: # %bb.0: 465; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 466; CHECK-NEXT: vrem.vv v8, v8, v9 467; CHECK-NEXT: ret 468 %vc = srem <vscale x 4 x i16> %va, %vb 469 ret <vscale x 4 x i16> %vc 470} 471 472define <vscale x 4 x i16> @vrem_vx_nxv4i16(<vscale x 4 x i16> %va, i16 signext %b) { 473; CHECK-LABEL: vrem_vx_nxv4i16: 474; CHECK: # %bb.0: 475; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma 476; CHECK-NEXT: vrem.vx v8, v8, a0 477; CHECK-NEXT: ret 478 %head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0 479 %splat = shufflevector <vscale x 4 x i16> %head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer 480 %vc = srem <vscale x 4 x i16> %va, %splat 481 ret <vscale x 4 x i16> %vc 482} 483 484define <vscale x 4 x i16> @vrem_vi_nxv4i16_0(<vscale x 4 x i16> %va) { 485; CHECK-LABEL: vrem_vi_nxv4i16_0: 486; CHECK: # %bb.0: 487; CHECK-NEXT: lui a0, 1048571 488; CHECK-NEXT: addi a0, a0, 1755 489; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma 490; CHECK-NEXT: vmulh.vx v9, v8, a0 491; CHECK-NEXT: vsra.vi v9, v9, 1 492; CHECK-NEXT: vsrl.vi v10, v9, 15 493; CHECK-NEXT: vadd.vv v9, v9, v10 494; CHECK-NEXT: li a0, -7 495; CHECK-NEXT: vnmsac.vx v8, a0, v9 496; CHECK-NEXT: ret 497 %vc = srem <vscale x 4 x i16> %va, splat (i16 -7) 498 ret <vscale x 4 x i16> %vc 499} 500 501define <vscale x 4 x i16> @vrem_vv_nxv4i16_sext_twice(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb) { 502; CHECK-LABEL: vrem_vv_nxv4i16_sext_twice: 503; CHECK: # %bb.0: 504; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 505; CHECK-NEXT: vrem.vv v8, v8, v9 506; CHECK-NEXT: ret 507 %sext_va = sext <vscale x 4 x i16> %va to <vscale x 4 x i32> 508 %sext_vb = sext <vscale x 4 x i16> %vb to <vscale x 4 x i32> 509 %vc_ext = srem <vscale x 4 x i32> %sext_va, %sext_vb 510 %vc = trunc <vscale x 4 x i32> %vc_ext to <vscale x 4 x i16> 511 ret <vscale x 4 x i16> %vc 512} 513 514define <vscale x 8 x i16> @vrem_vv_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb) { 515; CHECK-LABEL: vrem_vv_nxv8i16: 516; CHECK: # %bb.0: 517; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 518; CHECK-NEXT: vrem.vv v8, v8, v10 519; CHECK-NEXT: ret 520 %vc = srem <vscale x 8 x i16> %va, %vb 521 ret <vscale x 8 x i16> %vc 522} 523 524define <vscale x 8 x i16> @vrem_vx_nxv8i16(<vscale x 8 x i16> %va, i16 signext %b) { 525; CHECK-LABEL: vrem_vx_nxv8i16: 526; CHECK: # %bb.0: 527; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 528; CHECK-NEXT: vrem.vx v8, v8, a0 529; CHECK-NEXT: ret 530 %head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0 531 %splat = shufflevector <vscale x 8 x i16> %head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 532 %vc = srem <vscale x 8 x i16> %va, %splat 533 ret <vscale x 8 x i16> %vc 534} 535 536define <vscale x 8 x i16> @vrem_vi_nxv8i16_0(<vscale x 8 x i16> %va) { 537; CHECK-LABEL: vrem_vi_nxv8i16_0: 538; CHECK: # %bb.0: 539; CHECK-NEXT: lui a0, 1048571 540; CHECK-NEXT: addi a0, a0, 1755 541; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 542; CHECK-NEXT: vmulh.vx v10, v8, a0 543; CHECK-NEXT: vsra.vi v10, v10, 1 544; CHECK-NEXT: vsrl.vi v12, v10, 15 545; CHECK-NEXT: vadd.vv v10, v10, v12 546; CHECK-NEXT: li a0, -7 547; CHECK-NEXT: vnmsac.vx v8, a0, v10 548; CHECK-NEXT: ret 549 %vc = srem <vscale x 8 x i16> %va, splat (i16 -7) 550 ret <vscale x 8 x i16> %vc 551} 552 553define <vscale x 8 x i16> @vrem_vv_nxv8i16_sext_twice(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb) { 554; CHECK-LABEL: vrem_vv_nxv8i16_sext_twice: 555; CHECK: # %bb.0: 556; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 557; CHECK-NEXT: vrem.vv v8, v8, v10 558; CHECK-NEXT: ret 559 %sext_va = sext <vscale x 8 x i16> %va to <vscale x 8 x i32> 560 %sext_vb = sext <vscale x 8 x i16> %vb to <vscale x 8 x i32> 561 %vc_ext = srem <vscale x 8 x i32> %sext_va, %sext_vb 562 %vc = trunc <vscale x 8 x i32> %vc_ext to <vscale x 8 x i16> 563 ret <vscale x 8 x i16> %vc 564} 565 566define <vscale x 16 x i16> @vrem_vv_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb) { 567; CHECK-LABEL: vrem_vv_nxv16i16: 568; CHECK: # %bb.0: 569; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 570; CHECK-NEXT: vrem.vv v8, v8, v12 571; CHECK-NEXT: ret 572 %vc = srem <vscale x 16 x i16> %va, %vb 573 ret <vscale x 16 x i16> %vc 574} 575 576define <vscale x 16 x i16> @vrem_vx_nxv16i16(<vscale x 16 x i16> %va, i16 signext %b) { 577; CHECK-LABEL: vrem_vx_nxv16i16: 578; CHECK: # %bb.0: 579; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 580; CHECK-NEXT: vrem.vx v8, v8, a0 581; CHECK-NEXT: ret 582 %head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0 583 %splat = shufflevector <vscale x 16 x i16> %head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer 584 %vc = srem <vscale x 16 x i16> %va, %splat 585 ret <vscale x 16 x i16> %vc 586} 587 588define <vscale x 16 x i16> @vrem_vi_nxv16i16_0(<vscale x 16 x i16> %va) { 589; CHECK-LABEL: vrem_vi_nxv16i16_0: 590; CHECK: # %bb.0: 591; CHECK-NEXT: lui a0, 1048571 592; CHECK-NEXT: addi a0, a0, 1755 593; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 594; CHECK-NEXT: vmulh.vx v12, v8, a0 595; CHECK-NEXT: vsra.vi v12, v12, 1 596; CHECK-NEXT: vsrl.vi v16, v12, 15 597; CHECK-NEXT: vadd.vv v12, v12, v16 598; CHECK-NEXT: li a0, -7 599; CHECK-NEXT: vnmsac.vx v8, a0, v12 600; CHECK-NEXT: ret 601 %vc = srem <vscale x 16 x i16> %va, splat (i16 -7) 602 ret <vscale x 16 x i16> %vc 603} 604 605define <vscale x 16 x i16> @vrem_vv_nxv16i16_sext_twice(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb) { 606; CHECK-LABEL: vrem_vv_nxv16i16_sext_twice: 607; CHECK: # %bb.0: 608; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 609; CHECK-NEXT: vrem.vv v8, v8, v12 610; CHECK-NEXT: ret 611 %sext_va = sext <vscale x 16 x i16> %va to <vscale x 16 x i32> 612 %sext_vb = sext <vscale x 16 x i16> %vb to <vscale x 16 x i32> 613 %vc_ext = srem <vscale x 16 x i32> %sext_va, %sext_vb 614 %vc = trunc <vscale x 16 x i32> %vc_ext to <vscale x 16 x i16> 615 ret <vscale x 16 x i16> %vc 616} 617 618define <vscale x 32 x i16> @vrem_vv_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb) { 619; CHECK-LABEL: vrem_vv_nxv32i16: 620; CHECK: # %bb.0: 621; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma 622; CHECK-NEXT: vrem.vv v8, v8, v16 623; CHECK-NEXT: ret 624 %vc = srem <vscale x 32 x i16> %va, %vb 625 ret <vscale x 32 x i16> %vc 626} 627 628define <vscale x 32 x i16> @vrem_vx_nxv32i16(<vscale x 32 x i16> %va, i16 signext %b) { 629; CHECK-LABEL: vrem_vx_nxv32i16: 630; CHECK: # %bb.0: 631; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma 632; CHECK-NEXT: vrem.vx v8, v8, a0 633; CHECK-NEXT: ret 634 %head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0 635 %splat = shufflevector <vscale x 32 x i16> %head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer 636 %vc = srem <vscale x 32 x i16> %va, %splat 637 ret <vscale x 32 x i16> %vc 638} 639 640define <vscale x 32 x i16> @vrem_vi_nxv32i16_0(<vscale x 32 x i16> %va) { 641; CHECK-LABEL: vrem_vi_nxv32i16_0: 642; CHECK: # %bb.0: 643; CHECK-NEXT: lui a0, 1048571 644; CHECK-NEXT: addi a0, a0, 1755 645; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma 646; CHECK-NEXT: vmulh.vx v16, v8, a0 647; CHECK-NEXT: vsra.vi v16, v16, 1 648; CHECK-NEXT: vsrl.vi v24, v16, 15 649; CHECK-NEXT: vadd.vv v16, v16, v24 650; CHECK-NEXT: li a0, -7 651; CHECK-NEXT: vnmsac.vx v8, a0, v16 652; CHECK-NEXT: ret 653 %vc = srem <vscale x 32 x i16> %va, splat (i16 -7) 654 ret <vscale x 32 x i16> %vc 655} 656 657define <vscale x 1 x i32> @vrem_vv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb) { 658; CHECK-LABEL: vrem_vv_nxv1i32: 659; CHECK: # %bb.0: 660; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 661; CHECK-NEXT: vrem.vv v8, v8, v9 662; CHECK-NEXT: ret 663 %vc = srem <vscale x 1 x i32> %va, %vb 664 ret <vscale x 1 x i32> %vc 665} 666 667define <vscale x 1 x i32> @vrem_vx_nxv1i32(<vscale x 1 x i32> %va, i32 signext %b) { 668; CHECK-LABEL: vrem_vx_nxv1i32: 669; CHECK: # %bb.0: 670; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 671; CHECK-NEXT: vrem.vx v8, v8, a0 672; CHECK-NEXT: ret 673 %head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0 674 %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer 675 %vc = srem <vscale x 1 x i32> %va, %splat 676 ret <vscale x 1 x i32> %vc 677} 678 679define <vscale x 1 x i32> @vrem_vi_nxv1i32_0(<vscale x 1 x i32> %va) { 680; RV32-LABEL: vrem_vi_nxv1i32_0: 681; RV32: # %bb.0: 682; RV32-NEXT: lui a0, 449390 683; RV32-NEXT: addi a0, a0, -1171 684; RV32-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 685; RV32-NEXT: vmulh.vx v9, v8, a0 686; RV32-NEXT: vsub.vv v9, v9, v8 687; RV32-NEXT: vsrl.vi v10, v9, 31 688; RV32-NEXT: vsra.vi v9, v9, 2 689; RV32-NEXT: vadd.vv v9, v9, v10 690; RV32-NEXT: li a0, -7 691; RV32-NEXT: vnmsac.vx v8, a0, v9 692; RV32-NEXT: ret 693; 694; RV64-LABEL: vrem_vi_nxv1i32_0: 695; RV64: # %bb.0: 696; RV64-NEXT: lui a0, 449390 697; RV64-NEXT: addi a0, a0, -1171 698; RV64-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 699; RV64-NEXT: vmulh.vx v9, v8, a0 700; RV64-NEXT: vsub.vv v9, v9, v8 701; RV64-NEXT: vsra.vi v9, v9, 2 702; RV64-NEXT: vsrl.vi v10, v9, 31 703; RV64-NEXT: vadd.vv v9, v9, v10 704; RV64-NEXT: li a0, -7 705; RV64-NEXT: vnmsac.vx v8, a0, v9 706; RV64-NEXT: ret 707 %vc = srem <vscale x 1 x i32> %va, splat (i32 -7) 708 ret <vscale x 1 x i32> %vc 709} 710 711define <vscale x 2 x i32> @vrem_vv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb) { 712; CHECK-LABEL: vrem_vv_nxv2i32: 713; CHECK: # %bb.0: 714; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 715; CHECK-NEXT: vrem.vv v8, v8, v9 716; CHECK-NEXT: ret 717 %vc = srem <vscale x 2 x i32> %va, %vb 718 ret <vscale x 2 x i32> %vc 719} 720 721define <vscale x 2 x i32> @vrem_vx_nxv2i32(<vscale x 2 x i32> %va, i32 signext %b) { 722; CHECK-LABEL: vrem_vx_nxv2i32: 723; CHECK: # %bb.0: 724; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma 725; CHECK-NEXT: vrem.vx v8, v8, a0 726; CHECK-NEXT: ret 727 %head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0 728 %splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer 729 %vc = srem <vscale x 2 x i32> %va, %splat 730 ret <vscale x 2 x i32> %vc 731} 732 733define <vscale x 2 x i32> @vrem_vi_nxv2i32_0(<vscale x 2 x i32> %va) { 734; RV32-LABEL: vrem_vi_nxv2i32_0: 735; RV32: # %bb.0: 736; RV32-NEXT: lui a0, 449390 737; RV32-NEXT: addi a0, a0, -1171 738; RV32-NEXT: vsetvli a1, zero, e32, m1, ta, ma 739; RV32-NEXT: vmulh.vx v9, v8, a0 740; RV32-NEXT: vsub.vv v9, v9, v8 741; RV32-NEXT: vsrl.vi v10, v9, 31 742; RV32-NEXT: vsra.vi v9, v9, 2 743; RV32-NEXT: vadd.vv v9, v9, v10 744; RV32-NEXT: li a0, -7 745; RV32-NEXT: vnmsac.vx v8, a0, v9 746; RV32-NEXT: ret 747; 748; RV64-LABEL: vrem_vi_nxv2i32_0: 749; RV64: # %bb.0: 750; RV64-NEXT: lui a0, 449390 751; RV64-NEXT: addi a0, a0, -1171 752; RV64-NEXT: vsetvli a1, zero, e32, m1, ta, ma 753; RV64-NEXT: vmulh.vx v9, v8, a0 754; RV64-NEXT: vsub.vv v9, v9, v8 755; RV64-NEXT: vsra.vi v9, v9, 2 756; RV64-NEXT: vsrl.vi v10, v9, 31 757; RV64-NEXT: vadd.vv v9, v9, v10 758; RV64-NEXT: li a0, -7 759; RV64-NEXT: vnmsac.vx v8, a0, v9 760; RV64-NEXT: ret 761 %vc = srem <vscale x 2 x i32> %va, splat (i32 -7) 762 ret <vscale x 2 x i32> %vc 763} 764 765define <vscale x 4 x i32> @vrem_vv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb) { 766; CHECK-LABEL: vrem_vv_nxv4i32: 767; CHECK: # %bb.0: 768; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 769; CHECK-NEXT: vrem.vv v8, v8, v10 770; CHECK-NEXT: ret 771 %vc = srem <vscale x 4 x i32> %va, %vb 772 ret <vscale x 4 x i32> %vc 773} 774 775define <vscale x 4 x i32> @vrem_vx_nxv4i32(<vscale x 4 x i32> %va, i32 signext %b) { 776; CHECK-LABEL: vrem_vx_nxv4i32: 777; CHECK: # %bb.0: 778; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma 779; CHECK-NEXT: vrem.vx v8, v8, a0 780; CHECK-NEXT: ret 781 %head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0 782 %splat = shufflevector <vscale x 4 x i32> %head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 783 %vc = srem <vscale x 4 x i32> %va, %splat 784 ret <vscale x 4 x i32> %vc 785} 786 787define <vscale x 4 x i32> @vrem_vi_nxv4i32_0(<vscale x 4 x i32> %va) { 788; RV32-LABEL: vrem_vi_nxv4i32_0: 789; RV32: # %bb.0: 790; RV32-NEXT: lui a0, 449390 791; RV32-NEXT: addi a0, a0, -1171 792; RV32-NEXT: vsetvli a1, zero, e32, m2, ta, ma 793; RV32-NEXT: vmulh.vx v10, v8, a0 794; RV32-NEXT: vsub.vv v10, v10, v8 795; RV32-NEXT: vsrl.vi v12, v10, 31 796; RV32-NEXT: vsra.vi v10, v10, 2 797; RV32-NEXT: vadd.vv v10, v10, v12 798; RV32-NEXT: li a0, -7 799; RV32-NEXT: vnmsac.vx v8, a0, v10 800; RV32-NEXT: ret 801; 802; RV64-LABEL: vrem_vi_nxv4i32_0: 803; RV64: # %bb.0: 804; RV64-NEXT: lui a0, 449390 805; RV64-NEXT: addi a0, a0, -1171 806; RV64-NEXT: vsetvli a1, zero, e32, m2, ta, ma 807; RV64-NEXT: vmulh.vx v10, v8, a0 808; RV64-NEXT: vsub.vv v10, v10, v8 809; RV64-NEXT: vsra.vi v10, v10, 2 810; RV64-NEXT: vsrl.vi v12, v10, 31 811; RV64-NEXT: vadd.vv v10, v10, v12 812; RV64-NEXT: li a0, -7 813; RV64-NEXT: vnmsac.vx v8, a0, v10 814; RV64-NEXT: ret 815 %vc = srem <vscale x 4 x i32> %va, splat (i32 -7) 816 ret <vscale x 4 x i32> %vc 817} 818 819define <vscale x 8 x i32> @vrem_vv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb) { 820; CHECK-LABEL: vrem_vv_nxv8i32: 821; CHECK: # %bb.0: 822; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 823; CHECK-NEXT: vrem.vv v8, v8, v12 824; CHECK-NEXT: ret 825 %vc = srem <vscale x 8 x i32> %va, %vb 826 ret <vscale x 8 x i32> %vc 827} 828 829define <vscale x 8 x i32> @vrem_vx_nxv8i32(<vscale x 8 x i32> %va, i32 signext %b) { 830; CHECK-LABEL: vrem_vx_nxv8i32: 831; CHECK: # %bb.0: 832; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma 833; CHECK-NEXT: vrem.vx v8, v8, a0 834; CHECK-NEXT: ret 835 %head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0 836 %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 837 %vc = srem <vscale x 8 x i32> %va, %splat 838 ret <vscale x 8 x i32> %vc 839} 840 841define <vscale x 8 x i32> @vrem_vi_nxv8i32_0(<vscale x 8 x i32> %va) { 842; RV32-LABEL: vrem_vi_nxv8i32_0: 843; RV32: # %bb.0: 844; RV32-NEXT: lui a0, 449390 845; RV32-NEXT: addi a0, a0, -1171 846; RV32-NEXT: vsetvli a1, zero, e32, m4, ta, ma 847; RV32-NEXT: vmulh.vx v12, v8, a0 848; RV32-NEXT: vsub.vv v12, v12, v8 849; RV32-NEXT: vsrl.vi v16, v12, 31 850; RV32-NEXT: vsra.vi v12, v12, 2 851; RV32-NEXT: vadd.vv v12, v12, v16 852; RV32-NEXT: li a0, -7 853; RV32-NEXT: vnmsac.vx v8, a0, v12 854; RV32-NEXT: ret 855; 856; RV64-LABEL: vrem_vi_nxv8i32_0: 857; RV64: # %bb.0: 858; RV64-NEXT: lui a0, 449390 859; RV64-NEXT: addi a0, a0, -1171 860; RV64-NEXT: vsetvli a1, zero, e32, m4, ta, ma 861; RV64-NEXT: vmulh.vx v12, v8, a0 862; RV64-NEXT: vsub.vv v12, v12, v8 863; RV64-NEXT: vsra.vi v12, v12, 2 864; RV64-NEXT: vsrl.vi v16, v12, 31 865; RV64-NEXT: vadd.vv v12, v12, v16 866; RV64-NEXT: li a0, -7 867; RV64-NEXT: vnmsac.vx v8, a0, v12 868; RV64-NEXT: ret 869 %vc = srem <vscale x 8 x i32> %va, splat (i32 -7) 870 ret <vscale x 8 x i32> %vc 871} 872 873define <vscale x 16 x i32> @vrem_vv_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb) { 874; CHECK-LABEL: vrem_vv_nxv16i32: 875; CHECK: # %bb.0: 876; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 877; CHECK-NEXT: vrem.vv v8, v8, v16 878; CHECK-NEXT: ret 879 %vc = srem <vscale x 16 x i32> %va, %vb 880 ret <vscale x 16 x i32> %vc 881} 882 883define <vscale x 16 x i32> @vrem_vx_nxv16i32(<vscale x 16 x i32> %va, i32 signext %b) { 884; CHECK-LABEL: vrem_vx_nxv16i32: 885; CHECK: # %bb.0: 886; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma 887; CHECK-NEXT: vrem.vx v8, v8, a0 888; CHECK-NEXT: ret 889 %head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0 890 %splat = shufflevector <vscale x 16 x i32> %head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer 891 %vc = srem <vscale x 16 x i32> %va, %splat 892 ret <vscale x 16 x i32> %vc 893} 894 895define <vscale x 16 x i32> @vrem_vi_nxv16i32_0(<vscale x 16 x i32> %va) { 896; RV32-LABEL: vrem_vi_nxv16i32_0: 897; RV32: # %bb.0: 898; RV32-NEXT: lui a0, 449390 899; RV32-NEXT: addi a0, a0, -1171 900; RV32-NEXT: vsetvli a1, zero, e32, m8, ta, ma 901; RV32-NEXT: vmulh.vx v16, v8, a0 902; RV32-NEXT: vsub.vv v16, v16, v8 903; RV32-NEXT: vsrl.vi v24, v16, 31 904; RV32-NEXT: vsra.vi v16, v16, 2 905; RV32-NEXT: vadd.vv v16, v16, v24 906; RV32-NEXT: li a0, -7 907; RV32-NEXT: vnmsac.vx v8, a0, v16 908; RV32-NEXT: ret 909; 910; RV64-LABEL: vrem_vi_nxv16i32_0: 911; RV64: # %bb.0: 912; RV64-NEXT: lui a0, 449390 913; RV64-NEXT: addi a0, a0, -1171 914; RV64-NEXT: vsetvli a1, zero, e32, m8, ta, ma 915; RV64-NEXT: vmulh.vx v16, v8, a0 916; RV64-NEXT: vsub.vv v16, v16, v8 917; RV64-NEXT: vsra.vi v16, v16, 2 918; RV64-NEXT: vsrl.vi v24, v16, 31 919; RV64-NEXT: vadd.vv v16, v16, v24 920; RV64-NEXT: li a0, -7 921; RV64-NEXT: vnmsac.vx v8, a0, v16 922; RV64-NEXT: ret 923 %vc = srem <vscale x 16 x i32> %va, splat (i32 -7) 924 ret <vscale x 16 x i32> %vc 925} 926 927define <vscale x 1 x i64> @vrem_vv_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb) { 928; CHECK-LABEL: vrem_vv_nxv1i64: 929; CHECK: # %bb.0: 930; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 931; CHECK-NEXT: vrem.vv v8, v8, v9 932; CHECK-NEXT: ret 933 %vc = srem <vscale x 1 x i64> %va, %vb 934 ret <vscale x 1 x i64> %vc 935} 936 937define <vscale x 1 x i64> @vrem_vx_nxv1i64(<vscale x 1 x i64> %va, i64 %b) { 938; RV32-LABEL: vrem_vx_nxv1i64: 939; RV32: # %bb.0: 940; RV32-NEXT: addi sp, sp, -16 941; RV32-NEXT: .cfi_def_cfa_offset 16 942; RV32-NEXT: sw a0, 8(sp) 943; RV32-NEXT: sw a1, 12(sp) 944; RV32-NEXT: addi a0, sp, 8 945; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma 946; RV32-NEXT: vlse64.v v9, (a0), zero 947; RV32-NEXT: vrem.vv v8, v8, v9 948; RV32-NEXT: addi sp, sp, 16 949; RV32-NEXT: .cfi_def_cfa_offset 0 950; RV32-NEXT: ret 951; 952; RV64-LABEL: vrem_vx_nxv1i64: 953; RV64: # %bb.0: 954; RV64-NEXT: vsetvli a1, zero, e64, m1, ta, ma 955; RV64-NEXT: vrem.vx v8, v8, a0 956; RV64-NEXT: ret 957 %head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0 958 %splat = shufflevector <vscale x 1 x i64> %head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer 959 %vc = srem <vscale x 1 x i64> %va, %splat 960 ret <vscale x 1 x i64> %vc 961} 962 963define <vscale x 1 x i64> @vrem_vi_nxv1i64_0(<vscale x 1 x i64> %va) { 964; RV32-V-LABEL: vrem_vi_nxv1i64_0: 965; RV32-V: # %bb.0: 966; RV32-V-NEXT: addi sp, sp, -16 967; RV32-V-NEXT: .cfi_def_cfa_offset 16 968; RV32-V-NEXT: lui a0, 748983 969; RV32-V-NEXT: lui a1, 898779 970; RV32-V-NEXT: addi a0, a0, -586 971; RV32-V-NEXT: addi a1, a1, 1755 972; RV32-V-NEXT: sw a1, 8(sp) 973; RV32-V-NEXT: sw a0, 12(sp) 974; RV32-V-NEXT: addi a0, sp, 8 975; RV32-V-NEXT: vsetvli a1, zero, e64, m1, ta, ma 976; RV32-V-NEXT: vlse64.v v9, (a0), zero 977; RV32-V-NEXT: li a0, 63 978; RV32-V-NEXT: vmulh.vv v9, v8, v9 979; RV32-V-NEXT: vsrl.vx v10, v9, a0 980; RV32-V-NEXT: vsra.vi v9, v9, 1 981; RV32-V-NEXT: vadd.vv v9, v9, v10 982; RV32-V-NEXT: li a0, -7 983; RV32-V-NEXT: vnmsac.vx v8, a0, v9 984; RV32-V-NEXT: addi sp, sp, 16 985; RV32-V-NEXT: .cfi_def_cfa_offset 0 986; RV32-V-NEXT: ret 987; 988; ZVE64X-LABEL: vrem_vi_nxv1i64_0: 989; ZVE64X: # %bb.0: 990; ZVE64X-NEXT: li a0, -7 991; ZVE64X-NEXT: vsetvli a1, zero, e64, m1, ta, ma 992; ZVE64X-NEXT: vrem.vx v8, v8, a0 993; ZVE64X-NEXT: ret 994; 995; RV64-V-LABEL: vrem_vi_nxv1i64_0: 996; RV64-V: # %bb.0: 997; RV64-V-NEXT: lui a0, %hi(.LCPI67_0) 998; RV64-V-NEXT: ld a0, %lo(.LCPI67_0)(a0) 999; RV64-V-NEXT: vsetvli a1, zero, e64, m1, ta, ma 1000; RV64-V-NEXT: vmulh.vx v9, v8, a0 1001; RV64-V-NEXT: li a0, 63 1002; RV64-V-NEXT: vsrl.vx v10, v9, a0 1003; RV64-V-NEXT: vsra.vi v9, v9, 1 1004; RV64-V-NEXT: vadd.vv v9, v9, v10 1005; RV64-V-NEXT: li a0, -7 1006; RV64-V-NEXT: vnmsac.vx v8, a0, v9 1007; RV64-V-NEXT: ret 1008 %vc = srem <vscale x 1 x i64> %va, splat (i64 -7) 1009 ret <vscale x 1 x i64> %vc 1010} 1011 1012define <vscale x 2 x i64> @vrem_vv_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb) { 1013; CHECK-LABEL: vrem_vv_nxv2i64: 1014; CHECK: # %bb.0: 1015; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 1016; CHECK-NEXT: vrem.vv v8, v8, v10 1017; CHECK-NEXT: ret 1018 %vc = srem <vscale x 2 x i64> %va, %vb 1019 ret <vscale x 2 x i64> %vc 1020} 1021 1022define <vscale x 2 x i64> @vrem_vx_nxv2i64(<vscale x 2 x i64> %va, i64 %b) { 1023; RV32-LABEL: vrem_vx_nxv2i64: 1024; RV32: # %bb.0: 1025; RV32-NEXT: addi sp, sp, -16 1026; RV32-NEXT: .cfi_def_cfa_offset 16 1027; RV32-NEXT: sw a0, 8(sp) 1028; RV32-NEXT: sw a1, 12(sp) 1029; RV32-NEXT: addi a0, sp, 8 1030; RV32-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1031; RV32-NEXT: vlse64.v v10, (a0), zero 1032; RV32-NEXT: vrem.vv v8, v8, v10 1033; RV32-NEXT: addi sp, sp, 16 1034; RV32-NEXT: .cfi_def_cfa_offset 0 1035; RV32-NEXT: ret 1036; 1037; RV64-LABEL: vrem_vx_nxv2i64: 1038; RV64: # %bb.0: 1039; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1040; RV64-NEXT: vrem.vx v8, v8, a0 1041; RV64-NEXT: ret 1042 %head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0 1043 %splat = shufflevector <vscale x 2 x i64> %head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 1044 %vc = srem <vscale x 2 x i64> %va, %splat 1045 ret <vscale x 2 x i64> %vc 1046} 1047 1048define <vscale x 2 x i64> @vrem_vi_nxv2i64_0(<vscale x 2 x i64> %va) { 1049; RV32-V-LABEL: vrem_vi_nxv2i64_0: 1050; RV32-V: # %bb.0: 1051; RV32-V-NEXT: addi sp, sp, -16 1052; RV32-V-NEXT: .cfi_def_cfa_offset 16 1053; RV32-V-NEXT: lui a0, 748983 1054; RV32-V-NEXT: lui a1, 898779 1055; RV32-V-NEXT: addi a0, a0, -586 1056; RV32-V-NEXT: addi a1, a1, 1755 1057; RV32-V-NEXT: sw a1, 8(sp) 1058; RV32-V-NEXT: sw a0, 12(sp) 1059; RV32-V-NEXT: addi a0, sp, 8 1060; RV32-V-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1061; RV32-V-NEXT: vlse64.v v10, (a0), zero 1062; RV32-V-NEXT: li a0, 63 1063; RV32-V-NEXT: vmulh.vv v10, v8, v10 1064; RV32-V-NEXT: vsrl.vx v12, v10, a0 1065; RV32-V-NEXT: vsra.vi v10, v10, 1 1066; RV32-V-NEXT: vadd.vv v10, v10, v12 1067; RV32-V-NEXT: li a0, -7 1068; RV32-V-NEXT: vnmsac.vx v8, a0, v10 1069; RV32-V-NEXT: addi sp, sp, 16 1070; RV32-V-NEXT: .cfi_def_cfa_offset 0 1071; RV32-V-NEXT: ret 1072; 1073; ZVE64X-LABEL: vrem_vi_nxv2i64_0: 1074; ZVE64X: # %bb.0: 1075; ZVE64X-NEXT: li a0, -7 1076; ZVE64X-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1077; ZVE64X-NEXT: vrem.vx v8, v8, a0 1078; ZVE64X-NEXT: ret 1079; 1080; RV64-V-LABEL: vrem_vi_nxv2i64_0: 1081; RV64-V: # %bb.0: 1082; RV64-V-NEXT: lui a0, %hi(.LCPI70_0) 1083; RV64-V-NEXT: ld a0, %lo(.LCPI70_0)(a0) 1084; RV64-V-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1085; RV64-V-NEXT: vmulh.vx v10, v8, a0 1086; RV64-V-NEXT: li a0, 63 1087; RV64-V-NEXT: vsrl.vx v12, v10, a0 1088; RV64-V-NEXT: vsra.vi v10, v10, 1 1089; RV64-V-NEXT: vadd.vv v10, v10, v12 1090; RV64-V-NEXT: li a0, -7 1091; RV64-V-NEXT: vnmsac.vx v8, a0, v10 1092; RV64-V-NEXT: ret 1093 %vc = srem <vscale x 2 x i64> %va, splat (i64 -7) 1094 ret <vscale x 2 x i64> %vc 1095} 1096 1097define <vscale x 4 x i64> @vrem_vv_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb) { 1098; CHECK-LABEL: vrem_vv_nxv4i64: 1099; CHECK: # %bb.0: 1100; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 1101; CHECK-NEXT: vrem.vv v8, v8, v12 1102; CHECK-NEXT: ret 1103 %vc = srem <vscale x 4 x i64> %va, %vb 1104 ret <vscale x 4 x i64> %vc 1105} 1106 1107define <vscale x 4 x i64> @vrem_vx_nxv4i64(<vscale x 4 x i64> %va, i64 %b) { 1108; RV32-LABEL: vrem_vx_nxv4i64: 1109; RV32: # %bb.0: 1110; RV32-NEXT: addi sp, sp, -16 1111; RV32-NEXT: .cfi_def_cfa_offset 16 1112; RV32-NEXT: sw a0, 8(sp) 1113; RV32-NEXT: sw a1, 12(sp) 1114; RV32-NEXT: addi a0, sp, 8 1115; RV32-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1116; RV32-NEXT: vlse64.v v12, (a0), zero 1117; RV32-NEXT: vrem.vv v8, v8, v12 1118; RV32-NEXT: addi sp, sp, 16 1119; RV32-NEXT: .cfi_def_cfa_offset 0 1120; RV32-NEXT: ret 1121; 1122; RV64-LABEL: vrem_vx_nxv4i64: 1123; RV64: # %bb.0: 1124; RV64-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1125; RV64-NEXT: vrem.vx v8, v8, a0 1126; RV64-NEXT: ret 1127 %head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0 1128 %splat = shufflevector <vscale x 4 x i64> %head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer 1129 %vc = srem <vscale x 4 x i64> %va, %splat 1130 ret <vscale x 4 x i64> %vc 1131} 1132 1133define <vscale x 4 x i64> @vrem_vi_nxv4i64_0(<vscale x 4 x i64> %va) { 1134; RV32-V-LABEL: vrem_vi_nxv4i64_0: 1135; RV32-V: # %bb.0: 1136; RV32-V-NEXT: addi sp, sp, -16 1137; RV32-V-NEXT: .cfi_def_cfa_offset 16 1138; RV32-V-NEXT: lui a0, 748983 1139; RV32-V-NEXT: lui a1, 898779 1140; RV32-V-NEXT: addi a0, a0, -586 1141; RV32-V-NEXT: addi a1, a1, 1755 1142; RV32-V-NEXT: sw a1, 8(sp) 1143; RV32-V-NEXT: sw a0, 12(sp) 1144; RV32-V-NEXT: addi a0, sp, 8 1145; RV32-V-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1146; RV32-V-NEXT: vlse64.v v12, (a0), zero 1147; RV32-V-NEXT: li a0, 63 1148; RV32-V-NEXT: vmulh.vv v12, v8, v12 1149; RV32-V-NEXT: vsrl.vx v16, v12, a0 1150; RV32-V-NEXT: vsra.vi v12, v12, 1 1151; RV32-V-NEXT: vadd.vv v12, v12, v16 1152; RV32-V-NEXT: li a0, -7 1153; RV32-V-NEXT: vnmsac.vx v8, a0, v12 1154; RV32-V-NEXT: addi sp, sp, 16 1155; RV32-V-NEXT: .cfi_def_cfa_offset 0 1156; RV32-V-NEXT: ret 1157; 1158; ZVE64X-LABEL: vrem_vi_nxv4i64_0: 1159; ZVE64X: # %bb.0: 1160; ZVE64X-NEXT: li a0, -7 1161; ZVE64X-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1162; ZVE64X-NEXT: vrem.vx v8, v8, a0 1163; ZVE64X-NEXT: ret 1164; 1165; RV64-V-LABEL: vrem_vi_nxv4i64_0: 1166; RV64-V: # %bb.0: 1167; RV64-V-NEXT: lui a0, %hi(.LCPI73_0) 1168; RV64-V-NEXT: ld a0, %lo(.LCPI73_0)(a0) 1169; RV64-V-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1170; RV64-V-NEXT: vmulh.vx v12, v8, a0 1171; RV64-V-NEXT: li a0, 63 1172; RV64-V-NEXT: vsrl.vx v16, v12, a0 1173; RV64-V-NEXT: vsra.vi v12, v12, 1 1174; RV64-V-NEXT: vadd.vv v12, v12, v16 1175; RV64-V-NEXT: li a0, -7 1176; RV64-V-NEXT: vnmsac.vx v8, a0, v12 1177; RV64-V-NEXT: ret 1178 %vc = srem <vscale x 4 x i64> %va, splat (i64 -7) 1179 ret <vscale x 4 x i64> %vc 1180} 1181 1182define <vscale x 8 x i64> @vrem_vv_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb) { 1183; CHECK-LABEL: vrem_vv_nxv8i64: 1184; CHECK: # %bb.0: 1185; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 1186; CHECK-NEXT: vrem.vv v8, v8, v16 1187; CHECK-NEXT: ret 1188 %vc = srem <vscale x 8 x i64> %va, %vb 1189 ret <vscale x 8 x i64> %vc 1190} 1191 1192define <vscale x 8 x i64> @vrem_vx_nxv8i64(<vscale x 8 x i64> %va, i64 %b) { 1193; RV32-LABEL: vrem_vx_nxv8i64: 1194; RV32: # %bb.0: 1195; RV32-NEXT: addi sp, sp, -16 1196; RV32-NEXT: .cfi_def_cfa_offset 16 1197; RV32-NEXT: sw a0, 8(sp) 1198; RV32-NEXT: sw a1, 12(sp) 1199; RV32-NEXT: addi a0, sp, 8 1200; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1201; RV32-NEXT: vlse64.v v16, (a0), zero 1202; RV32-NEXT: vrem.vv v8, v8, v16 1203; RV32-NEXT: addi sp, sp, 16 1204; RV32-NEXT: .cfi_def_cfa_offset 0 1205; RV32-NEXT: ret 1206; 1207; RV64-LABEL: vrem_vx_nxv8i64: 1208; RV64: # %bb.0: 1209; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1210; RV64-NEXT: vrem.vx v8, v8, a0 1211; RV64-NEXT: ret 1212 %head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0 1213 %splat = shufflevector <vscale x 8 x i64> %head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 1214 %vc = srem <vscale x 8 x i64> %va, %splat 1215 ret <vscale x 8 x i64> %vc 1216} 1217 1218define <vscale x 8 x i64> @vrem_vi_nxv8i64_0(<vscale x 8 x i64> %va) { 1219; RV32-V-LABEL: vrem_vi_nxv8i64_0: 1220; RV32-V: # %bb.0: 1221; RV32-V-NEXT: addi sp, sp, -16 1222; RV32-V-NEXT: .cfi_def_cfa_offset 16 1223; RV32-V-NEXT: lui a0, 748983 1224; RV32-V-NEXT: lui a1, 898779 1225; RV32-V-NEXT: addi a0, a0, -586 1226; RV32-V-NEXT: addi a1, a1, 1755 1227; RV32-V-NEXT: sw a1, 8(sp) 1228; RV32-V-NEXT: sw a0, 12(sp) 1229; RV32-V-NEXT: addi a0, sp, 8 1230; RV32-V-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1231; RV32-V-NEXT: vlse64.v v16, (a0), zero 1232; RV32-V-NEXT: li a0, 63 1233; RV32-V-NEXT: vmulh.vv v16, v8, v16 1234; RV32-V-NEXT: vsrl.vx v24, v16, a0 1235; RV32-V-NEXT: vsra.vi v16, v16, 1 1236; RV32-V-NEXT: vadd.vv v16, v16, v24 1237; RV32-V-NEXT: li a0, -7 1238; RV32-V-NEXT: vnmsac.vx v8, a0, v16 1239; RV32-V-NEXT: addi sp, sp, 16 1240; RV32-V-NEXT: .cfi_def_cfa_offset 0 1241; RV32-V-NEXT: ret 1242; 1243; ZVE64X-LABEL: vrem_vi_nxv8i64_0: 1244; ZVE64X: # %bb.0: 1245; ZVE64X-NEXT: li a0, -7 1246; ZVE64X-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1247; ZVE64X-NEXT: vrem.vx v8, v8, a0 1248; ZVE64X-NEXT: ret 1249; 1250; RV64-V-LABEL: vrem_vi_nxv8i64_0: 1251; RV64-V: # %bb.0: 1252; RV64-V-NEXT: lui a0, %hi(.LCPI76_0) 1253; RV64-V-NEXT: ld a0, %lo(.LCPI76_0)(a0) 1254; RV64-V-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1255; RV64-V-NEXT: vmulh.vx v16, v8, a0 1256; RV64-V-NEXT: li a0, 63 1257; RV64-V-NEXT: vsrl.vx v24, v16, a0 1258; RV64-V-NEXT: vsra.vi v16, v16, 1 1259; RV64-V-NEXT: vadd.vv v16, v16, v24 1260; RV64-V-NEXT: li a0, -7 1261; RV64-V-NEXT: vnmsac.vx v8, a0, v16 1262; RV64-V-NEXT: ret 1263 %vc = srem <vscale x 8 x i64> %va, splat (i64 -7) 1264 ret <vscale x 8 x i64> %vc 1265} 1266