1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+v,+m -verify-machineinstrs < %s | FileCheck %s 3; RUN: llc -mtriple=riscv64 -mattr=+v,+m -verify-machineinstrs < %s | FileCheck %s 4 5declare <vscale x 1 x i8> @llvm.vp.fshr.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i8>, <vscale x 1 x i8>, <vscale x 1 x i1>, i32) 6define <vscale x 1 x i8> @fshr_v1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 7; CHECK-LABEL: fshr_v1i8: 8; CHECK: # %bb.0: 9; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 10; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 11; CHECK-NEXT: vnot.v v11, v10, v0.t 12; CHECK-NEXT: vand.vi v11, v11, 7, v0.t 13; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 14; CHECK-NEXT: vand.vi v10, v10, 7, v0.t 15; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 16; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 17; CHECK-NEXT: ret 18 %res = call <vscale x 1 x i8> @llvm.vp.fshr.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, i32 %evl) 19 ret <vscale x 1 x i8> %res 20} 21 22declare <vscale x 1 x i8> @llvm.vp.fshl.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i8>, <vscale x 1 x i8>, <vscale x 1 x i1>, i32) 23define <vscale x 1 x i8> @fshl_v1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 24; CHECK-LABEL: fshl_v1i8: 25; CHECK: # %bb.0: 26; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 27; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 28; CHECK-NEXT: vnot.v v11, v10, v0.t 29; CHECK-NEXT: vand.vi v11, v11, 7, v0.t 30; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 31; CHECK-NEXT: vand.vi v10, v10, 7, v0.t 32; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 33; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 34; CHECK-NEXT: ret 35 %res = call <vscale x 1 x i8> @llvm.vp.fshl.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, i32 %evl) 36 ret <vscale x 1 x i8> %res 37} 38 39declare <vscale x 2 x i8> @llvm.vp.fshr.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>, <vscale x 2 x i8>, <vscale x 2 x i1>, i32) 40define <vscale x 2 x i8> @fshr_v2i8(<vscale x 2 x i8> %a, <vscale x 2 x i8> %b, <vscale x 2 x i8> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 41; CHECK-LABEL: fshr_v2i8: 42; CHECK: # %bb.0: 43; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 44; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 45; CHECK-NEXT: vnot.v v11, v10, v0.t 46; CHECK-NEXT: vand.vi v11, v11, 7, v0.t 47; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 48; CHECK-NEXT: vand.vi v10, v10, 7, v0.t 49; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 50; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 51; CHECK-NEXT: ret 52 %res = call <vscale x 2 x i8> @llvm.vp.fshr.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i8> %b, <vscale x 2 x i8> %c, <vscale x 2 x i1> %m, i32 %evl) 53 ret <vscale x 2 x i8> %res 54} 55 56declare <vscale x 2 x i8> @llvm.vp.fshl.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>, <vscale x 2 x i8>, <vscale x 2 x i1>, i32) 57define <vscale x 2 x i8> @fshl_v2i8(<vscale x 2 x i8> %a, <vscale x 2 x i8> %b, <vscale x 2 x i8> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 58; CHECK-LABEL: fshl_v2i8: 59; CHECK: # %bb.0: 60; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 61; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 62; CHECK-NEXT: vnot.v v11, v10, v0.t 63; CHECK-NEXT: vand.vi v11, v11, 7, v0.t 64; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 65; CHECK-NEXT: vand.vi v10, v10, 7, v0.t 66; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 67; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 68; CHECK-NEXT: ret 69 %res = call <vscale x 2 x i8> @llvm.vp.fshl.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i8> %b, <vscale x 2 x i8> %c, <vscale x 2 x i1> %m, i32 %evl) 70 ret <vscale x 2 x i8> %res 71} 72 73declare <vscale x 4 x i8> @llvm.vp.fshr.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>, <vscale x 4 x i8>, <vscale x 4 x i1>, i32) 74define <vscale x 4 x i8> @fshr_v4i8(<vscale x 4 x i8> %a, <vscale x 4 x i8> %b, <vscale x 4 x i8> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 75; CHECK-LABEL: fshr_v4i8: 76; CHECK: # %bb.0: 77; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 78; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 79; CHECK-NEXT: vnot.v v11, v10, v0.t 80; CHECK-NEXT: vand.vi v11, v11, 7, v0.t 81; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 82; CHECK-NEXT: vand.vi v10, v10, 7, v0.t 83; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 84; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 85; CHECK-NEXT: ret 86 %res = call <vscale x 4 x i8> @llvm.vp.fshr.nxv4i8(<vscale x 4 x i8> %a, <vscale x 4 x i8> %b, <vscale x 4 x i8> %c, <vscale x 4 x i1> %m, i32 %evl) 87 ret <vscale x 4 x i8> %res 88} 89 90declare <vscale x 4 x i8> @llvm.vp.fshl.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>, <vscale x 4 x i8>, <vscale x 4 x i1>, i32) 91define <vscale x 4 x i8> @fshl_v4i8(<vscale x 4 x i8> %a, <vscale x 4 x i8> %b, <vscale x 4 x i8> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 92; CHECK-LABEL: fshl_v4i8: 93; CHECK: # %bb.0: 94; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 95; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 96; CHECK-NEXT: vnot.v v11, v10, v0.t 97; CHECK-NEXT: vand.vi v11, v11, 7, v0.t 98; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 99; CHECK-NEXT: vand.vi v10, v10, 7, v0.t 100; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 101; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 102; CHECK-NEXT: ret 103 %res = call <vscale x 4 x i8> @llvm.vp.fshl.nxv4i8(<vscale x 4 x i8> %a, <vscale x 4 x i8> %b, <vscale x 4 x i8> %c, <vscale x 4 x i1> %m, i32 %evl) 104 ret <vscale x 4 x i8> %res 105} 106 107declare <vscale x 8 x i8> @llvm.vp.fshr.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i1>, i32) 108define <vscale x 8 x i8> @fshr_v8i8(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b, <vscale x 8 x i8> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 109; CHECK-LABEL: fshr_v8i8: 110; CHECK: # %bb.0: 111; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 112; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 113; CHECK-NEXT: vnot.v v11, v10, v0.t 114; CHECK-NEXT: vand.vi v11, v11, 7, v0.t 115; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 116; CHECK-NEXT: vand.vi v10, v10, 7, v0.t 117; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 118; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 119; CHECK-NEXT: ret 120 %res = call <vscale x 8 x i8> @llvm.vp.fshr.nxv8i8(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b, <vscale x 8 x i8> %c, <vscale x 8 x i1> %m, i32 %evl) 121 ret <vscale x 8 x i8> %res 122} 123 124declare <vscale x 8 x i8> @llvm.vp.fshl.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i1>, i32) 125define <vscale x 8 x i8> @fshl_v8i8(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b, <vscale x 8 x i8> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 126; CHECK-LABEL: fshl_v8i8: 127; CHECK: # %bb.0: 128; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 129; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 130; CHECK-NEXT: vnot.v v11, v10, v0.t 131; CHECK-NEXT: vand.vi v11, v11, 7, v0.t 132; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 133; CHECK-NEXT: vand.vi v10, v10, 7, v0.t 134; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 135; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 136; CHECK-NEXT: ret 137 %res = call <vscale x 8 x i8> @llvm.vp.fshl.nxv8i8(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b, <vscale x 8 x i8> %c, <vscale x 8 x i1> %m, i32 %evl) 138 ret <vscale x 8 x i8> %res 139} 140 141declare <vscale x 16 x i8> @llvm.vp.fshr.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i1>, i32) 142define <vscale x 16 x i8> @fshr_v16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b, <vscale x 16 x i8> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 143; CHECK-LABEL: fshr_v16i8: 144; CHECK: # %bb.0: 145; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma 146; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 147; CHECK-NEXT: vnot.v v14, v12, v0.t 148; CHECK-NEXT: vand.vi v14, v14, 7, v0.t 149; CHECK-NEXT: vsll.vv v8, v8, v14, v0.t 150; CHECK-NEXT: vand.vi v12, v12, 7, v0.t 151; CHECK-NEXT: vsrl.vv v10, v10, v12, v0.t 152; CHECK-NEXT: vor.vv v8, v8, v10, v0.t 153; CHECK-NEXT: ret 154 %res = call <vscale x 16 x i8> @llvm.vp.fshr.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b, <vscale x 16 x i8> %c, <vscale x 16 x i1> %m, i32 %evl) 155 ret <vscale x 16 x i8> %res 156} 157 158declare <vscale x 16 x i8> @llvm.vp.fshl.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i1>, i32) 159define <vscale x 16 x i8> @fshl_v16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b, <vscale x 16 x i8> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 160; CHECK-LABEL: fshl_v16i8: 161; CHECK: # %bb.0: 162; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma 163; CHECK-NEXT: vsrl.vi v10, v10, 1, v0.t 164; CHECK-NEXT: vnot.v v14, v12, v0.t 165; CHECK-NEXT: vand.vi v14, v14, 7, v0.t 166; CHECK-NEXT: vsrl.vv v10, v10, v14, v0.t 167; CHECK-NEXT: vand.vi v12, v12, 7, v0.t 168; CHECK-NEXT: vsll.vv v8, v8, v12, v0.t 169; CHECK-NEXT: vor.vv v8, v8, v10, v0.t 170; CHECK-NEXT: ret 171 %res = call <vscale x 16 x i8> @llvm.vp.fshl.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b, <vscale x 16 x i8> %c, <vscale x 16 x i1> %m, i32 %evl) 172 ret <vscale x 16 x i8> %res 173} 174 175declare <vscale x 32 x i8> @llvm.vp.fshr.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>, <vscale x 32 x i8>, <vscale x 32 x i1>, i32) 176define <vscale x 32 x i8> @fshr_v32i8(<vscale x 32 x i8> %a, <vscale x 32 x i8> %b, <vscale x 32 x i8> %c, <vscale x 32 x i1> %m, i32 zeroext %evl) { 177; CHECK-LABEL: fshr_v32i8: 178; CHECK: # %bb.0: 179; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma 180; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 181; CHECK-NEXT: vnot.v v20, v16, v0.t 182; CHECK-NEXT: vand.vi v20, v20, 7, v0.t 183; CHECK-NEXT: vsll.vv v8, v8, v20, v0.t 184; CHECK-NEXT: vand.vi v16, v16, 7, v0.t 185; CHECK-NEXT: vsrl.vv v12, v12, v16, v0.t 186; CHECK-NEXT: vor.vv v8, v8, v12, v0.t 187; CHECK-NEXT: ret 188 %res = call <vscale x 32 x i8> @llvm.vp.fshr.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i8> %b, <vscale x 32 x i8> %c, <vscale x 32 x i1> %m, i32 %evl) 189 ret <vscale x 32 x i8> %res 190} 191 192declare <vscale x 32 x i8> @llvm.vp.fshl.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>, <vscale x 32 x i8>, <vscale x 32 x i1>, i32) 193define <vscale x 32 x i8> @fshl_v32i8(<vscale x 32 x i8> %a, <vscale x 32 x i8> %b, <vscale x 32 x i8> %c, <vscale x 32 x i1> %m, i32 zeroext %evl) { 194; CHECK-LABEL: fshl_v32i8: 195; CHECK: # %bb.0: 196; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma 197; CHECK-NEXT: vsrl.vi v12, v12, 1, v0.t 198; CHECK-NEXT: vnot.v v20, v16, v0.t 199; CHECK-NEXT: vand.vi v20, v20, 7, v0.t 200; CHECK-NEXT: vsrl.vv v12, v12, v20, v0.t 201; CHECK-NEXT: vand.vi v16, v16, 7, v0.t 202; CHECK-NEXT: vsll.vv v8, v8, v16, v0.t 203; CHECK-NEXT: vor.vv v8, v8, v12, v0.t 204; CHECK-NEXT: ret 205 %res = call <vscale x 32 x i8> @llvm.vp.fshl.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i8> %b, <vscale x 32 x i8> %c, <vscale x 32 x i1> %m, i32 %evl) 206 ret <vscale x 32 x i8> %res 207} 208 209declare <vscale x 64 x i8> @llvm.vp.fshr.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>, <vscale x 64 x i8>, <vscale x 64 x i1>, i32) 210define <vscale x 64 x i8> @fshr_v64i8(<vscale x 64 x i8> %a, <vscale x 64 x i8> %b, <vscale x 64 x i8> %c, <vscale x 64 x i1> %m, i32 zeroext %evl) { 211; CHECK-LABEL: fshr_v64i8: 212; CHECK: # %bb.0: 213; CHECK-NEXT: addi sp, sp, -16 214; CHECK-NEXT: .cfi_def_cfa_offset 16 215; CHECK-NEXT: csrr a2, vlenb 216; CHECK-NEXT: slli a2, a2, 3 217; CHECK-NEXT: sub sp, sp, a2 218; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 219; CHECK-NEXT: addi a2, sp, 16 220; CHECK-NEXT: vs8r.v v16, (a2) # Unknown-size Folded Spill 221; CHECK-NEXT: vl8r.v v24, (a0) 222; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 223; CHECK-NEXT: vsll.vi v16, v8, 1, v0.t 224; CHECK-NEXT: vnot.v v8, v24, v0.t 225; CHECK-NEXT: vand.vi v8, v8, 7, v0.t 226; CHECK-NEXT: vsll.vv v8, v16, v8, v0.t 227; CHECK-NEXT: vand.vi v16, v24, 7, v0.t 228; CHECK-NEXT: addi a0, sp, 16 229; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 230; CHECK-NEXT: vsrl.vv v16, v24, v16, v0.t 231; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 232; CHECK-NEXT: csrr a0, vlenb 233; CHECK-NEXT: slli a0, a0, 3 234; CHECK-NEXT: add sp, sp, a0 235; CHECK-NEXT: .cfi_def_cfa sp, 16 236; CHECK-NEXT: addi sp, sp, 16 237; CHECK-NEXT: .cfi_def_cfa_offset 0 238; CHECK-NEXT: ret 239 %res = call <vscale x 64 x i8> @llvm.vp.fshr.nxv64i8(<vscale x 64 x i8> %a, <vscale x 64 x i8> %b, <vscale x 64 x i8> %c, <vscale x 64 x i1> %m, i32 %evl) 240 ret <vscale x 64 x i8> %res 241} 242 243declare <vscale x 64 x i8> @llvm.vp.fshl.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>, <vscale x 64 x i8>, <vscale x 64 x i1>, i32) 244define <vscale x 64 x i8> @fshl_v64i8(<vscale x 64 x i8> %a, <vscale x 64 x i8> %b, <vscale x 64 x i8> %c, <vscale x 64 x i1> %m, i32 zeroext %evl) { 245; CHECK-LABEL: fshl_v64i8: 246; CHECK: # %bb.0: 247; CHECK-NEXT: addi sp, sp, -16 248; CHECK-NEXT: .cfi_def_cfa_offset 16 249; CHECK-NEXT: csrr a2, vlenb 250; CHECK-NEXT: slli a2, a2, 3 251; CHECK-NEXT: sub sp, sp, a2 252; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 253; CHECK-NEXT: addi a2, sp, 16 254; CHECK-NEXT: vs8r.v v8, (a2) # Unknown-size Folded Spill 255; CHECK-NEXT: vl8r.v v24, (a0) 256; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 257; CHECK-NEXT: vsrl.vi v16, v16, 1, v0.t 258; CHECK-NEXT: vnot.v v8, v24, v0.t 259; CHECK-NEXT: vand.vi v8, v8, 7, v0.t 260; CHECK-NEXT: vsrl.vv v8, v16, v8, v0.t 261; CHECK-NEXT: vand.vi v16, v24, 7, v0.t 262; CHECK-NEXT: addi a0, sp, 16 263; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 264; CHECK-NEXT: vsll.vv v16, v24, v16, v0.t 265; CHECK-NEXT: vor.vv v8, v16, v8, v0.t 266; CHECK-NEXT: csrr a0, vlenb 267; CHECK-NEXT: slli a0, a0, 3 268; CHECK-NEXT: add sp, sp, a0 269; CHECK-NEXT: .cfi_def_cfa sp, 16 270; CHECK-NEXT: addi sp, sp, 16 271; CHECK-NEXT: .cfi_def_cfa_offset 0 272; CHECK-NEXT: ret 273 %res = call <vscale x 64 x i8> @llvm.vp.fshl.nxv64i8(<vscale x 64 x i8> %a, <vscale x 64 x i8> %b, <vscale x 64 x i8> %c, <vscale x 64 x i1> %m, i32 %evl) 274 ret <vscale x 64 x i8> %res 275} 276 277declare <vscale x 1 x i16> @llvm.vp.fshr.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>, <vscale x 1 x i16>, <vscale x 1 x i1>, i32) 278define <vscale x 1 x i16> @fshr_v1i16(<vscale x 1 x i16> %a, <vscale x 1 x i16> %b, <vscale x 1 x i16> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 279; CHECK-LABEL: fshr_v1i16: 280; CHECK: # %bb.0: 281; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 282; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 283; CHECK-NEXT: vnot.v v11, v10, v0.t 284; CHECK-NEXT: vand.vi v11, v11, 15, v0.t 285; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 286; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 287; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 288; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 289; CHECK-NEXT: ret 290 %res = call <vscale x 1 x i16> @llvm.vp.fshr.nxv1i16(<vscale x 1 x i16> %a, <vscale x 1 x i16> %b, <vscale x 1 x i16> %c, <vscale x 1 x i1> %m, i32 %evl) 291 ret <vscale x 1 x i16> %res 292} 293 294declare <vscale x 1 x i16> @llvm.vp.fshl.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>, <vscale x 1 x i16>, <vscale x 1 x i1>, i32) 295define <vscale x 1 x i16> @fshl_v1i16(<vscale x 1 x i16> %a, <vscale x 1 x i16> %b, <vscale x 1 x i16> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 296; CHECK-LABEL: fshl_v1i16: 297; CHECK: # %bb.0: 298; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 299; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 300; CHECK-NEXT: vnot.v v11, v10, v0.t 301; CHECK-NEXT: vand.vi v11, v11, 15, v0.t 302; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 303; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 304; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 305; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 306; CHECK-NEXT: ret 307 %res = call <vscale x 1 x i16> @llvm.vp.fshl.nxv1i16(<vscale x 1 x i16> %a, <vscale x 1 x i16> %b, <vscale x 1 x i16> %c, <vscale x 1 x i1> %m, i32 %evl) 308 ret <vscale x 1 x i16> %res 309} 310 311declare <vscale x 2 x i16> @llvm.vp.fshr.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>, <vscale x 2 x i16>, <vscale x 2 x i1>, i32) 312define <vscale x 2 x i16> @fshr_v2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %b, <vscale x 2 x i16> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 313; CHECK-LABEL: fshr_v2i16: 314; CHECK: # %bb.0: 315; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 316; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 317; CHECK-NEXT: vnot.v v11, v10, v0.t 318; CHECK-NEXT: vand.vi v11, v11, 15, v0.t 319; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 320; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 321; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 322; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 323; CHECK-NEXT: ret 324 %res = call <vscale x 2 x i16> @llvm.vp.fshr.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %b, <vscale x 2 x i16> %c, <vscale x 2 x i1> %m, i32 %evl) 325 ret <vscale x 2 x i16> %res 326} 327 328declare <vscale x 2 x i16> @llvm.vp.fshl.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>, <vscale x 2 x i16>, <vscale x 2 x i1>, i32) 329define <vscale x 2 x i16> @fshl_v2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %b, <vscale x 2 x i16> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 330; CHECK-LABEL: fshl_v2i16: 331; CHECK: # %bb.0: 332; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 333; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 334; CHECK-NEXT: vnot.v v11, v10, v0.t 335; CHECK-NEXT: vand.vi v11, v11, 15, v0.t 336; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 337; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 338; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 339; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 340; CHECK-NEXT: ret 341 %res = call <vscale x 2 x i16> @llvm.vp.fshl.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %b, <vscale x 2 x i16> %c, <vscale x 2 x i1> %m, i32 %evl) 342 ret <vscale x 2 x i16> %res 343} 344 345declare <vscale x 4 x i16> @llvm.vp.fshr.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>, <vscale x 4 x i16>, <vscale x 4 x i1>, i32) 346define <vscale x 4 x i16> @fshr_v4i16(<vscale x 4 x i16> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 347; CHECK-LABEL: fshr_v4i16: 348; CHECK: # %bb.0: 349; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 350; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 351; CHECK-NEXT: vnot.v v11, v10, v0.t 352; CHECK-NEXT: vand.vi v11, v11, 15, v0.t 353; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 354; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 355; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 356; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 357; CHECK-NEXT: ret 358 %res = call <vscale x 4 x i16> @llvm.vp.fshr.nxv4i16(<vscale x 4 x i16> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, <vscale x 4 x i1> %m, i32 %evl) 359 ret <vscale x 4 x i16> %res 360} 361 362declare <vscale x 4 x i16> @llvm.vp.fshl.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>, <vscale x 4 x i16>, <vscale x 4 x i1>, i32) 363define <vscale x 4 x i16> @fshl_v4i16(<vscale x 4 x i16> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 364; CHECK-LABEL: fshl_v4i16: 365; CHECK: # %bb.0: 366; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 367; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 368; CHECK-NEXT: vnot.v v11, v10, v0.t 369; CHECK-NEXT: vand.vi v11, v11, 15, v0.t 370; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 371; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 372; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 373; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 374; CHECK-NEXT: ret 375 %res = call <vscale x 4 x i16> @llvm.vp.fshl.nxv4i16(<vscale x 4 x i16> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, <vscale x 4 x i1> %m, i32 %evl) 376 ret <vscale x 4 x i16> %res 377} 378 379declare <vscale x 8 x i16> @llvm.vp.fshr.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i1>, i32) 380define <vscale x 8 x i16> @fshr_v8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b, <vscale x 8 x i16> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 381; CHECK-LABEL: fshr_v8i16: 382; CHECK: # %bb.0: 383; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 384; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 385; CHECK-NEXT: vnot.v v14, v12, v0.t 386; CHECK-NEXT: vand.vi v14, v14, 15, v0.t 387; CHECK-NEXT: vsll.vv v8, v8, v14, v0.t 388; CHECK-NEXT: vand.vi v12, v12, 15, v0.t 389; CHECK-NEXT: vsrl.vv v10, v10, v12, v0.t 390; CHECK-NEXT: vor.vv v8, v8, v10, v0.t 391; CHECK-NEXT: ret 392 %res = call <vscale x 8 x i16> @llvm.vp.fshr.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b, <vscale x 8 x i16> %c, <vscale x 8 x i1> %m, i32 %evl) 393 ret <vscale x 8 x i16> %res 394} 395 396declare <vscale x 8 x i16> @llvm.vp.fshl.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i1>, i32) 397define <vscale x 8 x i16> @fshl_v8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b, <vscale x 8 x i16> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 398; CHECK-LABEL: fshl_v8i16: 399; CHECK: # %bb.0: 400; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 401; CHECK-NEXT: vsrl.vi v10, v10, 1, v0.t 402; CHECK-NEXT: vnot.v v14, v12, v0.t 403; CHECK-NEXT: vand.vi v14, v14, 15, v0.t 404; CHECK-NEXT: vsrl.vv v10, v10, v14, v0.t 405; CHECK-NEXT: vand.vi v12, v12, 15, v0.t 406; CHECK-NEXT: vsll.vv v8, v8, v12, v0.t 407; CHECK-NEXT: vor.vv v8, v8, v10, v0.t 408; CHECK-NEXT: ret 409 %res = call <vscale x 8 x i16> @llvm.vp.fshl.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b, <vscale x 8 x i16> %c, <vscale x 8 x i1> %m, i32 %evl) 410 ret <vscale x 8 x i16> %res 411} 412 413declare <vscale x 16 x i16> @llvm.vp.fshr.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>, <vscale x 16 x i16>, <vscale x 16 x i1>, i32) 414define <vscale x 16 x i16> @fshr_v16i16(<vscale x 16 x i16> %a, <vscale x 16 x i16> %b, <vscale x 16 x i16> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 415; CHECK-LABEL: fshr_v16i16: 416; CHECK: # %bb.0: 417; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 418; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 419; CHECK-NEXT: vnot.v v20, v16, v0.t 420; CHECK-NEXT: vand.vi v20, v20, 15, v0.t 421; CHECK-NEXT: vsll.vv v8, v8, v20, v0.t 422; CHECK-NEXT: vand.vi v16, v16, 15, v0.t 423; CHECK-NEXT: vsrl.vv v12, v12, v16, v0.t 424; CHECK-NEXT: vor.vv v8, v8, v12, v0.t 425; CHECK-NEXT: ret 426 %res = call <vscale x 16 x i16> @llvm.vp.fshr.nxv16i16(<vscale x 16 x i16> %a, <vscale x 16 x i16> %b, <vscale x 16 x i16> %c, <vscale x 16 x i1> %m, i32 %evl) 427 ret <vscale x 16 x i16> %res 428} 429 430declare <vscale x 16 x i16> @llvm.vp.fshl.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>, <vscale x 16 x i16>, <vscale x 16 x i1>, i32) 431define <vscale x 16 x i16> @fshl_v16i16(<vscale x 16 x i16> %a, <vscale x 16 x i16> %b, <vscale x 16 x i16> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 432; CHECK-LABEL: fshl_v16i16: 433; CHECK: # %bb.0: 434; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 435; CHECK-NEXT: vsrl.vi v12, v12, 1, v0.t 436; CHECK-NEXT: vnot.v v20, v16, v0.t 437; CHECK-NEXT: vand.vi v20, v20, 15, v0.t 438; CHECK-NEXT: vsrl.vv v12, v12, v20, v0.t 439; CHECK-NEXT: vand.vi v16, v16, 15, v0.t 440; CHECK-NEXT: vsll.vv v8, v8, v16, v0.t 441; CHECK-NEXT: vor.vv v8, v8, v12, v0.t 442; CHECK-NEXT: ret 443 %res = call <vscale x 16 x i16> @llvm.vp.fshl.nxv16i16(<vscale x 16 x i16> %a, <vscale x 16 x i16> %b, <vscale x 16 x i16> %c, <vscale x 16 x i1> %m, i32 %evl) 444 ret <vscale x 16 x i16> %res 445} 446 447declare <vscale x 32 x i16> @llvm.vp.fshr.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>, <vscale x 32 x i16>, <vscale x 32 x i1>, i32) 448define <vscale x 32 x i16> @fshr_v32i16(<vscale x 32 x i16> %a, <vscale x 32 x i16> %b, <vscale x 32 x i16> %c, <vscale x 32 x i1> %m, i32 zeroext %evl) { 449; CHECK-LABEL: fshr_v32i16: 450; CHECK: # %bb.0: 451; CHECK-NEXT: addi sp, sp, -16 452; CHECK-NEXT: .cfi_def_cfa_offset 16 453; CHECK-NEXT: csrr a2, vlenb 454; CHECK-NEXT: slli a2, a2, 3 455; CHECK-NEXT: sub sp, sp, a2 456; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 457; CHECK-NEXT: addi a2, sp, 16 458; CHECK-NEXT: vs8r.v v16, (a2) # Unknown-size Folded Spill 459; CHECK-NEXT: vl8re16.v v24, (a0) 460; CHECK-NEXT: vsetvli zero, a1, e16, m8, ta, ma 461; CHECK-NEXT: vsll.vi v16, v8, 1, v0.t 462; CHECK-NEXT: vnot.v v8, v24, v0.t 463; CHECK-NEXT: vand.vi v8, v8, 15, v0.t 464; CHECK-NEXT: vsll.vv v8, v16, v8, v0.t 465; CHECK-NEXT: vand.vi v16, v24, 15, v0.t 466; CHECK-NEXT: addi a0, sp, 16 467; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 468; CHECK-NEXT: vsrl.vv v16, v24, v16, v0.t 469; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 470; CHECK-NEXT: csrr a0, vlenb 471; CHECK-NEXT: slli a0, a0, 3 472; CHECK-NEXT: add sp, sp, a0 473; CHECK-NEXT: .cfi_def_cfa sp, 16 474; CHECK-NEXT: addi sp, sp, 16 475; CHECK-NEXT: .cfi_def_cfa_offset 0 476; CHECK-NEXT: ret 477 %res = call <vscale x 32 x i16> @llvm.vp.fshr.nxv32i16(<vscale x 32 x i16> %a, <vscale x 32 x i16> %b, <vscale x 32 x i16> %c, <vscale x 32 x i1> %m, i32 %evl) 478 ret <vscale x 32 x i16> %res 479} 480 481declare <vscale x 32 x i16> @llvm.vp.fshl.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>, <vscale x 32 x i16>, <vscale x 32 x i1>, i32) 482define <vscale x 32 x i16> @fshl_v32i16(<vscale x 32 x i16> %a, <vscale x 32 x i16> %b, <vscale x 32 x i16> %c, <vscale x 32 x i1> %m, i32 zeroext %evl) { 483; CHECK-LABEL: fshl_v32i16: 484; CHECK: # %bb.0: 485; CHECK-NEXT: addi sp, sp, -16 486; CHECK-NEXT: .cfi_def_cfa_offset 16 487; CHECK-NEXT: csrr a2, vlenb 488; CHECK-NEXT: slli a2, a2, 3 489; CHECK-NEXT: sub sp, sp, a2 490; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 491; CHECK-NEXT: addi a2, sp, 16 492; CHECK-NEXT: vs8r.v v8, (a2) # Unknown-size Folded Spill 493; CHECK-NEXT: vl8re16.v v24, (a0) 494; CHECK-NEXT: vsetvli zero, a1, e16, m8, ta, ma 495; CHECK-NEXT: vsrl.vi v16, v16, 1, v0.t 496; CHECK-NEXT: vnot.v v8, v24, v0.t 497; CHECK-NEXT: vand.vi v8, v8, 15, v0.t 498; CHECK-NEXT: vsrl.vv v8, v16, v8, v0.t 499; CHECK-NEXT: vand.vi v16, v24, 15, v0.t 500; CHECK-NEXT: addi a0, sp, 16 501; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 502; CHECK-NEXT: vsll.vv v16, v24, v16, v0.t 503; CHECK-NEXT: vor.vv v8, v16, v8, v0.t 504; CHECK-NEXT: csrr a0, vlenb 505; CHECK-NEXT: slli a0, a0, 3 506; CHECK-NEXT: add sp, sp, a0 507; CHECK-NEXT: .cfi_def_cfa sp, 16 508; CHECK-NEXT: addi sp, sp, 16 509; CHECK-NEXT: .cfi_def_cfa_offset 0 510; CHECK-NEXT: ret 511 %res = call <vscale x 32 x i16> @llvm.vp.fshl.nxv32i16(<vscale x 32 x i16> %a, <vscale x 32 x i16> %b, <vscale x 32 x i16> %c, <vscale x 32 x i1> %m, i32 %evl) 512 ret <vscale x 32 x i16> %res 513} 514 515declare <vscale x 1 x i32> @llvm.vp.fshr.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>, <vscale x 1 x i32>, <vscale x 1 x i1>, i32) 516define <vscale x 1 x i32> @fshr_v1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %b, <vscale x 1 x i32> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 517; CHECK-LABEL: fshr_v1i32: 518; CHECK: # %bb.0: 519; CHECK-NEXT: li a1, 31 520; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 521; CHECK-NEXT: vand.vx v11, v10, a1, v0.t 522; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 523; CHECK-NEXT: vnot.v v10, v10, v0.t 524; CHECK-NEXT: vand.vx v10, v10, a1, v0.t 525; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 526; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 527; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 528; CHECK-NEXT: ret 529 %res = call <vscale x 1 x i32> @llvm.vp.fshr.nxv1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %b, <vscale x 1 x i32> %c, <vscale x 1 x i1> %m, i32 %evl) 530 ret <vscale x 1 x i32> %res 531} 532 533declare <vscale x 1 x i32> @llvm.vp.fshl.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>, <vscale x 1 x i32>, <vscale x 1 x i1>, i32) 534define <vscale x 1 x i32> @fshl_v1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %b, <vscale x 1 x i32> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 535; CHECK-LABEL: fshl_v1i32: 536; CHECK: # %bb.0: 537; CHECK-NEXT: li a1, 31 538; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 539; CHECK-NEXT: vand.vx v11, v10, a1, v0.t 540; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 541; CHECK-NEXT: vnot.v v10, v10, v0.t 542; CHECK-NEXT: vand.vx v10, v10, a1, v0.t 543; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 544; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 545; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 546; CHECK-NEXT: ret 547 %res = call <vscale x 1 x i32> @llvm.vp.fshl.nxv1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %b, <vscale x 1 x i32> %c, <vscale x 1 x i1> %m, i32 %evl) 548 ret <vscale x 1 x i32> %res 549} 550 551declare <vscale x 2 x i32> @llvm.vp.fshr.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i1>, i32) 552define <vscale x 2 x i32> @fshr_v2i32(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b, <vscale x 2 x i32> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 553; CHECK-LABEL: fshr_v2i32: 554; CHECK: # %bb.0: 555; CHECK-NEXT: li a1, 31 556; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 557; CHECK-NEXT: vand.vx v11, v10, a1, v0.t 558; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 559; CHECK-NEXT: vnot.v v10, v10, v0.t 560; CHECK-NEXT: vand.vx v10, v10, a1, v0.t 561; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 562; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 563; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 564; CHECK-NEXT: ret 565 %res = call <vscale x 2 x i32> @llvm.vp.fshr.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b, <vscale x 2 x i32> %c, <vscale x 2 x i1> %m, i32 %evl) 566 ret <vscale x 2 x i32> %res 567} 568 569declare <vscale x 2 x i32> @llvm.vp.fshl.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i1>, i32) 570define <vscale x 2 x i32> @fshl_v2i32(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b, <vscale x 2 x i32> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 571; CHECK-LABEL: fshl_v2i32: 572; CHECK: # %bb.0: 573; CHECK-NEXT: li a1, 31 574; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 575; CHECK-NEXT: vand.vx v11, v10, a1, v0.t 576; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 577; CHECK-NEXT: vnot.v v10, v10, v0.t 578; CHECK-NEXT: vand.vx v10, v10, a1, v0.t 579; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 580; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 581; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 582; CHECK-NEXT: ret 583 %res = call <vscale x 2 x i32> @llvm.vp.fshl.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b, <vscale x 2 x i32> %c, <vscale x 2 x i1> %m, i32 %evl) 584 ret <vscale x 2 x i32> %res 585} 586 587declare <vscale x 4 x i32> @llvm.vp.fshr.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i1>, i32) 588define <vscale x 4 x i32> @fshr_v4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 589; CHECK-LABEL: fshr_v4i32: 590; CHECK: # %bb.0: 591; CHECK-NEXT: li a1, 31 592; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 593; CHECK-NEXT: vand.vx v14, v12, a1, v0.t 594; CHECK-NEXT: vsrl.vv v10, v10, v14, v0.t 595; CHECK-NEXT: vnot.v v12, v12, v0.t 596; CHECK-NEXT: vand.vx v12, v12, a1, v0.t 597; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 598; CHECK-NEXT: vsll.vv v8, v8, v12, v0.t 599; CHECK-NEXT: vor.vv v8, v8, v10, v0.t 600; CHECK-NEXT: ret 601 %res = call <vscale x 4 x i32> @llvm.vp.fshr.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c, <vscale x 4 x i1> %m, i32 %evl) 602 ret <vscale x 4 x i32> %res 603} 604 605declare <vscale x 4 x i32> @llvm.vp.fshl.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i1>, i32) 606define <vscale x 4 x i32> @fshl_v4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 607; CHECK-LABEL: fshl_v4i32: 608; CHECK: # %bb.0: 609; CHECK-NEXT: li a1, 31 610; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 611; CHECK-NEXT: vand.vx v14, v12, a1, v0.t 612; CHECK-NEXT: vsll.vv v8, v8, v14, v0.t 613; CHECK-NEXT: vnot.v v12, v12, v0.t 614; CHECK-NEXT: vand.vx v12, v12, a1, v0.t 615; CHECK-NEXT: vsrl.vi v10, v10, 1, v0.t 616; CHECK-NEXT: vsrl.vv v10, v10, v12, v0.t 617; CHECK-NEXT: vor.vv v8, v8, v10, v0.t 618; CHECK-NEXT: ret 619 %res = call <vscale x 4 x i32> @llvm.vp.fshl.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c, <vscale x 4 x i1> %m, i32 %evl) 620 ret <vscale x 4 x i32> %res 621} 622 623declare <vscale x 8 x i32> @llvm.vp.fshr.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>, <vscale x 8 x i32>, <vscale x 8 x i1>, i32) 624define <vscale x 8 x i32> @fshr_v8i32(<vscale x 8 x i32> %a, <vscale x 8 x i32> %b, <vscale x 8 x i32> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 625; CHECK-LABEL: fshr_v8i32: 626; CHECK: # %bb.0: 627; CHECK-NEXT: li a1, 31 628; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 629; CHECK-NEXT: vand.vx v20, v16, a1, v0.t 630; CHECK-NEXT: vsrl.vv v12, v12, v20, v0.t 631; CHECK-NEXT: vnot.v v16, v16, v0.t 632; CHECK-NEXT: vand.vx v16, v16, a1, v0.t 633; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 634; CHECK-NEXT: vsll.vv v8, v8, v16, v0.t 635; CHECK-NEXT: vor.vv v8, v8, v12, v0.t 636; CHECK-NEXT: ret 637 %res = call <vscale x 8 x i32> @llvm.vp.fshr.nxv8i32(<vscale x 8 x i32> %a, <vscale x 8 x i32> %b, <vscale x 8 x i32> %c, <vscale x 8 x i1> %m, i32 %evl) 638 ret <vscale x 8 x i32> %res 639} 640 641declare <vscale x 8 x i32> @llvm.vp.fshl.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>, <vscale x 8 x i32>, <vscale x 8 x i1>, i32) 642define <vscale x 8 x i32> @fshl_v8i32(<vscale x 8 x i32> %a, <vscale x 8 x i32> %b, <vscale x 8 x i32> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 643; CHECK-LABEL: fshl_v8i32: 644; CHECK: # %bb.0: 645; CHECK-NEXT: li a1, 31 646; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 647; CHECK-NEXT: vand.vx v20, v16, a1, v0.t 648; CHECK-NEXT: vsll.vv v8, v8, v20, v0.t 649; CHECK-NEXT: vnot.v v16, v16, v0.t 650; CHECK-NEXT: vand.vx v16, v16, a1, v0.t 651; CHECK-NEXT: vsrl.vi v12, v12, 1, v0.t 652; CHECK-NEXT: vsrl.vv v12, v12, v16, v0.t 653; CHECK-NEXT: vor.vv v8, v8, v12, v0.t 654; CHECK-NEXT: ret 655 %res = call <vscale x 8 x i32> @llvm.vp.fshl.nxv8i32(<vscale x 8 x i32> %a, <vscale x 8 x i32> %b, <vscale x 8 x i32> %c, <vscale x 8 x i1> %m, i32 %evl) 656 ret <vscale x 8 x i32> %res 657} 658 659declare <vscale x 16 x i32> @llvm.vp.fshr.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>, <vscale x 16 x i32>, <vscale x 16 x i1>, i32) 660define <vscale x 16 x i32> @fshr_v16i32(<vscale x 16 x i32> %a, <vscale x 16 x i32> %b, <vscale x 16 x i32> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 661; CHECK-LABEL: fshr_v16i32: 662; CHECK: # %bb.0: 663; CHECK-NEXT: addi sp, sp, -16 664; CHECK-NEXT: .cfi_def_cfa_offset 16 665; CHECK-NEXT: csrr a2, vlenb 666; CHECK-NEXT: slli a2, a2, 3 667; CHECK-NEXT: sub sp, sp, a2 668; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 669; CHECK-NEXT: addi a2, sp, 16 670; CHECK-NEXT: vs8r.v v8, (a2) # Unknown-size Folded Spill 671; CHECK-NEXT: vl8re32.v v24, (a0) 672; CHECK-NEXT: li a0, 31 673; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma 674; CHECK-NEXT: vand.vx v8, v24, a0, v0.t 675; CHECK-NEXT: vsrl.vv v16, v16, v8, v0.t 676; CHECK-NEXT: vnot.v v8, v24, v0.t 677; CHECK-NEXT: vand.vx v8, v8, a0, v0.t 678; CHECK-NEXT: addi a0, sp, 16 679; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 680; CHECK-NEXT: vsll.vi v24, v24, 1, v0.t 681; CHECK-NEXT: vsll.vv v8, v24, v8, v0.t 682; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 683; CHECK-NEXT: csrr a0, vlenb 684; CHECK-NEXT: slli a0, a0, 3 685; CHECK-NEXT: add sp, sp, a0 686; CHECK-NEXT: .cfi_def_cfa sp, 16 687; CHECK-NEXT: addi sp, sp, 16 688; CHECK-NEXT: .cfi_def_cfa_offset 0 689; CHECK-NEXT: ret 690 %res = call <vscale x 16 x i32> @llvm.vp.fshr.nxv16i32(<vscale x 16 x i32> %a, <vscale x 16 x i32> %b, <vscale x 16 x i32> %c, <vscale x 16 x i1> %m, i32 %evl) 691 ret <vscale x 16 x i32> %res 692} 693 694declare <vscale x 16 x i32> @llvm.vp.fshl.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>, <vscale x 16 x i32>, <vscale x 16 x i1>, i32) 695define <vscale x 16 x i32> @fshl_v16i32(<vscale x 16 x i32> %a, <vscale x 16 x i32> %b, <vscale x 16 x i32> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 696; CHECK-LABEL: fshl_v16i32: 697; CHECK: # %bb.0: 698; CHECK-NEXT: addi sp, sp, -16 699; CHECK-NEXT: .cfi_def_cfa_offset 16 700; CHECK-NEXT: csrr a2, vlenb 701; CHECK-NEXT: slli a2, a2, 3 702; CHECK-NEXT: sub sp, sp, a2 703; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 704; CHECK-NEXT: addi a2, sp, 16 705; CHECK-NEXT: vs8r.v v16, (a2) # Unknown-size Folded Spill 706; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma 707; CHECK-NEXT: vmv8r.v v16, v8 708; CHECK-NEXT: vl8re32.v v24, (a0) 709; CHECK-NEXT: li a0, 31 710; CHECK-NEXT: vand.vx v8, v24, a0, v0.t 711; CHECK-NEXT: vsll.vv v8, v16, v8, v0.t 712; CHECK-NEXT: vnot.v v16, v24, v0.t 713; CHECK-NEXT: vand.vx v16, v16, a0, v0.t 714; CHECK-NEXT: addi a0, sp, 16 715; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 716; CHECK-NEXT: vsrl.vi v24, v24, 1, v0.t 717; CHECK-NEXT: vsrl.vv v16, v24, v16, v0.t 718; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 719; CHECK-NEXT: csrr a0, vlenb 720; CHECK-NEXT: slli a0, a0, 3 721; CHECK-NEXT: add sp, sp, a0 722; CHECK-NEXT: .cfi_def_cfa sp, 16 723; CHECK-NEXT: addi sp, sp, 16 724; CHECK-NEXT: .cfi_def_cfa_offset 0 725; CHECK-NEXT: ret 726 %res = call <vscale x 16 x i32> @llvm.vp.fshl.nxv16i32(<vscale x 16 x i32> %a, <vscale x 16 x i32> %b, <vscale x 16 x i32> %c, <vscale x 16 x i1> %m, i32 %evl) 727 ret <vscale x 16 x i32> %res 728} 729 730declare <vscale x 1 x i64> @llvm.vp.fshr.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>, <vscale x 1 x i64>, <vscale x 1 x i1>, i32) 731define <vscale x 1 x i64> @fshr_v1i64(<vscale x 1 x i64> %a, <vscale x 1 x i64> %b, <vscale x 1 x i64> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 732; CHECK-LABEL: fshr_v1i64: 733; CHECK: # %bb.0: 734; CHECK-NEXT: li a1, 63 735; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 736; CHECK-NEXT: vand.vx v11, v10, a1, v0.t 737; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 738; CHECK-NEXT: vnot.v v10, v10, v0.t 739; CHECK-NEXT: vand.vx v10, v10, a1, v0.t 740; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 741; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 742; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 743; CHECK-NEXT: ret 744 %res = call <vscale x 1 x i64> @llvm.vp.fshr.nxv1i64(<vscale x 1 x i64> %a, <vscale x 1 x i64> %b, <vscale x 1 x i64> %c, <vscale x 1 x i1> %m, i32 %evl) 745 ret <vscale x 1 x i64> %res 746} 747 748declare <vscale x 1 x i64> @llvm.vp.fshl.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>, <vscale x 1 x i64>, <vscale x 1 x i1>, i32) 749define <vscale x 1 x i64> @fshl_v1i64(<vscale x 1 x i64> %a, <vscale x 1 x i64> %b, <vscale x 1 x i64> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 750; CHECK-LABEL: fshl_v1i64: 751; CHECK: # %bb.0: 752; CHECK-NEXT: li a1, 63 753; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 754; CHECK-NEXT: vand.vx v11, v10, a1, v0.t 755; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 756; CHECK-NEXT: vnot.v v10, v10, v0.t 757; CHECK-NEXT: vand.vx v10, v10, a1, v0.t 758; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 759; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 760; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 761; CHECK-NEXT: ret 762 %res = call <vscale x 1 x i64> @llvm.vp.fshl.nxv1i64(<vscale x 1 x i64> %a, <vscale x 1 x i64> %b, <vscale x 1 x i64> %c, <vscale x 1 x i1> %m, i32 %evl) 763 ret <vscale x 1 x i64> %res 764} 765 766declare <vscale x 2 x i64> @llvm.vp.fshr.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i1>, i32) 767define <vscale x 2 x i64> @fshr_v2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b, <vscale x 2 x i64> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 768; CHECK-LABEL: fshr_v2i64: 769; CHECK: # %bb.0: 770; CHECK-NEXT: li a1, 63 771; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 772; CHECK-NEXT: vand.vx v14, v12, a1, v0.t 773; CHECK-NEXT: vsrl.vv v10, v10, v14, v0.t 774; CHECK-NEXT: vnot.v v12, v12, v0.t 775; CHECK-NEXT: vand.vx v12, v12, a1, v0.t 776; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 777; CHECK-NEXT: vsll.vv v8, v8, v12, v0.t 778; CHECK-NEXT: vor.vv v8, v8, v10, v0.t 779; CHECK-NEXT: ret 780 %res = call <vscale x 2 x i64> @llvm.vp.fshr.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b, <vscale x 2 x i64> %c, <vscale x 2 x i1> %m, i32 %evl) 781 ret <vscale x 2 x i64> %res 782} 783 784declare <vscale x 2 x i64> @llvm.vp.fshl.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i1>, i32) 785define <vscale x 2 x i64> @fshl_v2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b, <vscale x 2 x i64> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 786; CHECK-LABEL: fshl_v2i64: 787; CHECK: # %bb.0: 788; CHECK-NEXT: li a1, 63 789; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 790; CHECK-NEXT: vand.vx v14, v12, a1, v0.t 791; CHECK-NEXT: vsll.vv v8, v8, v14, v0.t 792; CHECK-NEXT: vnot.v v12, v12, v0.t 793; CHECK-NEXT: vand.vx v12, v12, a1, v0.t 794; CHECK-NEXT: vsrl.vi v10, v10, 1, v0.t 795; CHECK-NEXT: vsrl.vv v10, v10, v12, v0.t 796; CHECK-NEXT: vor.vv v8, v8, v10, v0.t 797; CHECK-NEXT: ret 798 %res = call <vscale x 2 x i64> @llvm.vp.fshl.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b, <vscale x 2 x i64> %c, <vscale x 2 x i1> %m, i32 %evl) 799 ret <vscale x 2 x i64> %res 800} 801 802declare <vscale x 4 x i64> @llvm.vp.fshr.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>, <vscale x 4 x i64>, <vscale x 4 x i1>, i32) 803define <vscale x 4 x i64> @fshr_v4i64(<vscale x 4 x i64> %a, <vscale x 4 x i64> %b, <vscale x 4 x i64> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 804; CHECK-LABEL: fshr_v4i64: 805; CHECK: # %bb.0: 806; CHECK-NEXT: li a1, 63 807; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 808; CHECK-NEXT: vand.vx v20, v16, a1, v0.t 809; CHECK-NEXT: vsrl.vv v12, v12, v20, v0.t 810; CHECK-NEXT: vnot.v v16, v16, v0.t 811; CHECK-NEXT: vand.vx v16, v16, a1, v0.t 812; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 813; CHECK-NEXT: vsll.vv v8, v8, v16, v0.t 814; CHECK-NEXT: vor.vv v8, v8, v12, v0.t 815; CHECK-NEXT: ret 816 %res = call <vscale x 4 x i64> @llvm.vp.fshr.nxv4i64(<vscale x 4 x i64> %a, <vscale x 4 x i64> %b, <vscale x 4 x i64> %c, <vscale x 4 x i1> %m, i32 %evl) 817 ret <vscale x 4 x i64> %res 818} 819 820declare <vscale x 4 x i64> @llvm.vp.fshl.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>, <vscale x 4 x i64>, <vscale x 4 x i1>, i32) 821define <vscale x 4 x i64> @fshl_v4i64(<vscale x 4 x i64> %a, <vscale x 4 x i64> %b, <vscale x 4 x i64> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 822; CHECK-LABEL: fshl_v4i64: 823; CHECK: # %bb.0: 824; CHECK-NEXT: li a1, 63 825; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 826; CHECK-NEXT: vand.vx v20, v16, a1, v0.t 827; CHECK-NEXT: vsll.vv v8, v8, v20, v0.t 828; CHECK-NEXT: vnot.v v16, v16, v0.t 829; CHECK-NEXT: vand.vx v16, v16, a1, v0.t 830; CHECK-NEXT: vsrl.vi v12, v12, 1, v0.t 831; CHECK-NEXT: vsrl.vv v12, v12, v16, v0.t 832; CHECK-NEXT: vor.vv v8, v8, v12, v0.t 833; CHECK-NEXT: ret 834 %res = call <vscale x 4 x i64> @llvm.vp.fshl.nxv4i64(<vscale x 4 x i64> %a, <vscale x 4 x i64> %b, <vscale x 4 x i64> %c, <vscale x 4 x i1> %m, i32 %evl) 835 ret <vscale x 4 x i64> %res 836} 837 838declare <vscale x 7 x i64> @llvm.vp.fshr.nxv7i64(<vscale x 7 x i64>, <vscale x 7 x i64>, <vscale x 7 x i64>, <vscale x 7 x i1>, i32) 839define <vscale x 7 x i64> @fshr_v7i64(<vscale x 7 x i64> %a, <vscale x 7 x i64> %b, <vscale x 7 x i64> %c, <vscale x 7 x i1> %m, i32 zeroext %evl) { 840; CHECK-LABEL: fshr_v7i64: 841; CHECK: # %bb.0: 842; CHECK-NEXT: addi sp, sp, -16 843; CHECK-NEXT: .cfi_def_cfa_offset 16 844; CHECK-NEXT: csrr a2, vlenb 845; CHECK-NEXT: slli a2, a2, 3 846; CHECK-NEXT: sub sp, sp, a2 847; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 848; CHECK-NEXT: addi a2, sp, 16 849; CHECK-NEXT: vs8r.v v8, (a2) # Unknown-size Folded Spill 850; CHECK-NEXT: vl8re64.v v24, (a0) 851; CHECK-NEXT: li a0, 63 852; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma 853; CHECK-NEXT: vand.vx v8, v24, a0, v0.t 854; CHECK-NEXT: vsrl.vv v16, v16, v8, v0.t 855; CHECK-NEXT: vnot.v v8, v24, v0.t 856; CHECK-NEXT: vand.vx v8, v8, a0, v0.t 857; CHECK-NEXT: addi a0, sp, 16 858; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 859; CHECK-NEXT: vsll.vi v24, v24, 1, v0.t 860; CHECK-NEXT: vsll.vv v8, v24, v8, v0.t 861; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 862; CHECK-NEXT: csrr a0, vlenb 863; CHECK-NEXT: slli a0, a0, 3 864; CHECK-NEXT: add sp, sp, a0 865; CHECK-NEXT: .cfi_def_cfa sp, 16 866; CHECK-NEXT: addi sp, sp, 16 867; CHECK-NEXT: .cfi_def_cfa_offset 0 868; CHECK-NEXT: ret 869 %res = call <vscale x 7 x i64> @llvm.vp.fshr.nxv7i64(<vscale x 7 x i64> %a, <vscale x 7 x i64> %b, <vscale x 7 x i64> %c, <vscale x 7 x i1> %m, i32 %evl) 870 ret <vscale x 7 x i64> %res 871} 872 873declare <vscale x 7 x i64> @llvm.vp.fshl.nxv7i64(<vscale x 7 x i64>, <vscale x 7 x i64>, <vscale x 7 x i64>, <vscale x 7 x i1>, i32) 874define <vscale x 7 x i64> @fshl_v7i64(<vscale x 7 x i64> %a, <vscale x 7 x i64> %b, <vscale x 7 x i64> %c, <vscale x 7 x i1> %m, i32 zeroext %evl) { 875; CHECK-LABEL: fshl_v7i64: 876; CHECK: # %bb.0: 877; CHECK-NEXT: addi sp, sp, -16 878; CHECK-NEXT: .cfi_def_cfa_offset 16 879; CHECK-NEXT: csrr a2, vlenb 880; CHECK-NEXT: slli a2, a2, 3 881; CHECK-NEXT: sub sp, sp, a2 882; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 883; CHECK-NEXT: addi a2, sp, 16 884; CHECK-NEXT: vs8r.v v16, (a2) # Unknown-size Folded Spill 885; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma 886; CHECK-NEXT: vmv8r.v v16, v8 887; CHECK-NEXT: vl8re64.v v24, (a0) 888; CHECK-NEXT: li a0, 63 889; CHECK-NEXT: vand.vx v8, v24, a0, v0.t 890; CHECK-NEXT: vsll.vv v8, v16, v8, v0.t 891; CHECK-NEXT: vnot.v v16, v24, v0.t 892; CHECK-NEXT: vand.vx v16, v16, a0, v0.t 893; CHECK-NEXT: addi a0, sp, 16 894; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 895; CHECK-NEXT: vsrl.vi v24, v24, 1, v0.t 896; CHECK-NEXT: vsrl.vv v16, v24, v16, v0.t 897; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 898; CHECK-NEXT: csrr a0, vlenb 899; CHECK-NEXT: slli a0, a0, 3 900; CHECK-NEXT: add sp, sp, a0 901; CHECK-NEXT: .cfi_def_cfa sp, 16 902; CHECK-NEXT: addi sp, sp, 16 903; CHECK-NEXT: .cfi_def_cfa_offset 0 904; CHECK-NEXT: ret 905 %res = call <vscale x 7 x i64> @llvm.vp.fshl.nxv7i64(<vscale x 7 x i64> %a, <vscale x 7 x i64> %b, <vscale x 7 x i64> %c, <vscale x 7 x i1> %m, i32 %evl) 906 ret <vscale x 7 x i64> %res 907} 908 909declare <vscale x 8 x i64> @llvm.vp.fshr.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>, <vscale x 8 x i64>, <vscale x 8 x i1>, i32) 910define <vscale x 8 x i64> @fshr_v8i64(<vscale x 8 x i64> %a, <vscale x 8 x i64> %b, <vscale x 8 x i64> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 911; CHECK-LABEL: fshr_v8i64: 912; CHECK: # %bb.0: 913; CHECK-NEXT: addi sp, sp, -16 914; CHECK-NEXT: .cfi_def_cfa_offset 16 915; CHECK-NEXT: csrr a2, vlenb 916; CHECK-NEXT: slli a2, a2, 3 917; CHECK-NEXT: sub sp, sp, a2 918; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 919; CHECK-NEXT: addi a2, sp, 16 920; CHECK-NEXT: vs8r.v v8, (a2) # Unknown-size Folded Spill 921; CHECK-NEXT: vl8re64.v v24, (a0) 922; CHECK-NEXT: li a0, 63 923; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma 924; CHECK-NEXT: vand.vx v8, v24, a0, v0.t 925; CHECK-NEXT: vsrl.vv v16, v16, v8, v0.t 926; CHECK-NEXT: vnot.v v8, v24, v0.t 927; CHECK-NEXT: vand.vx v8, v8, a0, v0.t 928; CHECK-NEXT: addi a0, sp, 16 929; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 930; CHECK-NEXT: vsll.vi v24, v24, 1, v0.t 931; CHECK-NEXT: vsll.vv v8, v24, v8, v0.t 932; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 933; CHECK-NEXT: csrr a0, vlenb 934; CHECK-NEXT: slli a0, a0, 3 935; CHECK-NEXT: add sp, sp, a0 936; CHECK-NEXT: .cfi_def_cfa sp, 16 937; CHECK-NEXT: addi sp, sp, 16 938; CHECK-NEXT: .cfi_def_cfa_offset 0 939; CHECK-NEXT: ret 940 %res = call <vscale x 8 x i64> @llvm.vp.fshr.nxv8i64(<vscale x 8 x i64> %a, <vscale x 8 x i64> %b, <vscale x 8 x i64> %c, <vscale x 8 x i1> %m, i32 %evl) 941 ret <vscale x 8 x i64> %res 942} 943 944declare <vscale x 8 x i64> @llvm.vp.fshl.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>, <vscale x 8 x i64>, <vscale x 8 x i1>, i32) 945define <vscale x 8 x i64> @fshl_v8i64(<vscale x 8 x i64> %a, <vscale x 8 x i64> %b, <vscale x 8 x i64> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 946; CHECK-LABEL: fshl_v8i64: 947; CHECK: # %bb.0: 948; CHECK-NEXT: addi sp, sp, -16 949; CHECK-NEXT: .cfi_def_cfa_offset 16 950; CHECK-NEXT: csrr a2, vlenb 951; CHECK-NEXT: slli a2, a2, 3 952; CHECK-NEXT: sub sp, sp, a2 953; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 954; CHECK-NEXT: addi a2, sp, 16 955; CHECK-NEXT: vs8r.v v16, (a2) # Unknown-size Folded Spill 956; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma 957; CHECK-NEXT: vmv8r.v v16, v8 958; CHECK-NEXT: vl8re64.v v24, (a0) 959; CHECK-NEXT: li a0, 63 960; CHECK-NEXT: vand.vx v8, v24, a0, v0.t 961; CHECK-NEXT: vsll.vv v8, v16, v8, v0.t 962; CHECK-NEXT: vnot.v v16, v24, v0.t 963; CHECK-NEXT: vand.vx v16, v16, a0, v0.t 964; CHECK-NEXT: addi a0, sp, 16 965; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 966; CHECK-NEXT: vsrl.vi v24, v24, 1, v0.t 967; CHECK-NEXT: vsrl.vv v16, v24, v16, v0.t 968; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 969; CHECK-NEXT: csrr a0, vlenb 970; CHECK-NEXT: slli a0, a0, 3 971; CHECK-NEXT: add sp, sp, a0 972; CHECK-NEXT: .cfi_def_cfa sp, 16 973; CHECK-NEXT: addi sp, sp, 16 974; CHECK-NEXT: .cfi_def_cfa_offset 0 975; CHECK-NEXT: ret 976 %res = call <vscale x 8 x i64> @llvm.vp.fshl.nxv8i64(<vscale x 8 x i64> %a, <vscale x 8 x i64> %b, <vscale x 8 x i64> %c, <vscale x 8 x i1> %m, i32 %evl) 977 ret <vscale x 8 x i64> %res 978} 979 980declare <vscale x 16 x i64> @llvm.vp.fshr.nxv16i64(<vscale x 16 x i64>, <vscale x 16 x i64>, <vscale x 16 x i64>, <vscale x 16 x i1>, i32) 981define <vscale x 16 x i64> @fshr_v16i64(<vscale x 16 x i64> %a, <vscale x 16 x i64> %b, <vscale x 16 x i64> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 982; CHECK-LABEL: fshr_v16i64: 983; CHECK: # %bb.0: 984; CHECK-NEXT: addi sp, sp, -16 985; CHECK-NEXT: .cfi_def_cfa_offset 16 986; CHECK-NEXT: csrr a1, vlenb 987; CHECK-NEXT: li a3, 48 988; CHECK-NEXT: mul a1, a1, a3 989; CHECK-NEXT: sub sp, sp, a1 990; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x30, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 48 * vlenb 991; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 992; CHECK-NEXT: vmv1r.v v24, v0 993; CHECK-NEXT: csrr a1, vlenb 994; CHECK-NEXT: li a3, 24 995; CHECK-NEXT: mul a1, a1, a3 996; CHECK-NEXT: add a1, sp, a1 997; CHECK-NEXT: addi a1, a1, 16 998; CHECK-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill 999; CHECK-NEXT: csrr a1, vlenb 1000; CHECK-NEXT: slli a1, a1, 5 1001; CHECK-NEXT: add a1, sp, a1 1002; CHECK-NEXT: addi a1, a1, 16 1003; CHECK-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill 1004; CHECK-NEXT: csrr a1, vlenb 1005; CHECK-NEXT: slli a3, a1, 3 1006; CHECK-NEXT: sub a5, a4, a1 1007; CHECK-NEXT: add a6, a2, a3 1008; CHECK-NEXT: vl8re64.v v8, (a6) 1009; CHECK-NEXT: csrr a6, vlenb 1010; CHECK-NEXT: li a7, 40 1011; CHECK-NEXT: mul a6, a6, a7 1012; CHECK-NEXT: add a6, sp, a6 1013; CHECK-NEXT: addi a6, a6, 16 1014; CHECK-NEXT: vs8r.v v8, (a6) # Unknown-size Folded Spill 1015; CHECK-NEXT: sltu a6, a4, a5 1016; CHECK-NEXT: addi a6, a6, -1 1017; CHECK-NEXT: and a5, a6, a5 1018; CHECK-NEXT: srli a6, a1, 3 1019; CHECK-NEXT: add a3, a0, a3 1020; CHECK-NEXT: vl8re64.v v16, (a3) 1021; CHECK-NEXT: csrr a3, vlenb 1022; CHECK-NEXT: slli a3, a3, 4 1023; CHECK-NEXT: add a3, sp, a3 1024; CHECK-NEXT: addi a3, a3, 16 1025; CHECK-NEXT: vs8r.v v16, (a3) # Unknown-size Folded Spill 1026; CHECK-NEXT: vslidedown.vx v0, v0, a6 1027; CHECK-NEXT: li a3, 63 1028; CHECK-NEXT: csrr a6, vlenb 1029; CHECK-NEXT: li a7, 40 1030; CHECK-NEXT: mul a6, a6, a7 1031; CHECK-NEXT: add a6, sp, a6 1032; CHECK-NEXT: addi a6, a6, 16 1033; CHECK-NEXT: vl8r.v v8, (a6) # Unknown-size Folded Reload 1034; CHECK-NEXT: vsetvli zero, a5, e64, m8, ta, ma 1035; CHECK-NEXT: vand.vx v8, v8, a3, v0.t 1036; CHECK-NEXT: csrr a5, vlenb 1037; CHECK-NEXT: slli a5, a5, 3 1038; CHECK-NEXT: add a5, sp, a5 1039; CHECK-NEXT: addi a5, a5, 16 1040; CHECK-NEXT: vs8r.v v8, (a5) # Unknown-size Folded Spill 1041; CHECK-NEXT: csrr a5, vlenb 1042; CHECK-NEXT: slli a5, a5, 4 1043; CHECK-NEXT: add a5, sp, a5 1044; CHECK-NEXT: addi a5, a5, 16 1045; CHECK-NEXT: vl8r.v v16, (a5) # Unknown-size Folded Reload 1046; CHECK-NEXT: csrr a5, vlenb 1047; CHECK-NEXT: slli a5, a5, 3 1048; CHECK-NEXT: add a5, sp, a5 1049; CHECK-NEXT: addi a5, a5, 16 1050; CHECK-NEXT: vl8r.v v8, (a5) # Unknown-size Folded Reload 1051; CHECK-NEXT: vsrl.vv v16, v16, v8, v0.t 1052; CHECK-NEXT: csrr a5, vlenb 1053; CHECK-NEXT: slli a5, a5, 3 1054; CHECK-NEXT: add a5, sp, a5 1055; CHECK-NEXT: addi a5, a5, 16 1056; CHECK-NEXT: vs8r.v v16, (a5) # Unknown-size Folded Spill 1057; CHECK-NEXT: csrr a5, vlenb 1058; CHECK-NEXT: li a6, 40 1059; CHECK-NEXT: mul a5, a5, a6 1060; CHECK-NEXT: add a5, sp, a5 1061; CHECK-NEXT: addi a5, a5, 16 1062; CHECK-NEXT: vl8r.v v8, (a5) # Unknown-size Folded Reload 1063; CHECK-NEXT: vnot.v v8, v8, v0.t 1064; CHECK-NEXT: vand.vx v8, v8, a3, v0.t 1065; CHECK-NEXT: addi a5, sp, 16 1066; CHECK-NEXT: vs8r.v v8, (a5) # Unknown-size Folded Spill 1067; CHECK-NEXT: vl8re64.v v8, (a0) 1068; CHECK-NEXT: csrr a0, vlenb 1069; CHECK-NEXT: slli a0, a0, 4 1070; CHECK-NEXT: add a0, sp, a0 1071; CHECK-NEXT: addi a0, a0, 16 1072; CHECK-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 1073; CHECK-NEXT: vl8re64.v v8, (a2) 1074; CHECK-NEXT: csrr a0, vlenb 1075; CHECK-NEXT: li a2, 40 1076; CHECK-NEXT: mul a0, a0, a2 1077; CHECK-NEXT: add a0, sp, a0 1078; CHECK-NEXT: addi a0, a0, 16 1079; CHECK-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 1080; CHECK-NEXT: csrr a0, vlenb 1081; CHECK-NEXT: li a2, 24 1082; CHECK-NEXT: mul a0, a0, a2 1083; CHECK-NEXT: add a0, sp, a0 1084; CHECK-NEXT: addi a0, a0, 16 1085; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1086; CHECK-NEXT: vsll.vi v16, v8, 1, v0.t 1087; CHECK-NEXT: addi a0, sp, 16 1088; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1089; CHECK-NEXT: vsll.vv v16, v16, v8, v0.t 1090; CHECK-NEXT: csrr a0, vlenb 1091; CHECK-NEXT: slli a0, a0, 3 1092; CHECK-NEXT: add a0, sp, a0 1093; CHECK-NEXT: addi a0, a0, 16 1094; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1095; CHECK-NEXT: vor.vv v8, v16, v8, v0.t 1096; CHECK-NEXT: csrr a0, vlenb 1097; CHECK-NEXT: li a2, 24 1098; CHECK-NEXT: mul a0, a0, a2 1099; CHECK-NEXT: add a0, sp, a0 1100; CHECK-NEXT: addi a0, a0, 16 1101; CHECK-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 1102; CHECK-NEXT: bltu a4, a1, .LBB46_2 1103; CHECK-NEXT: # %bb.1: 1104; CHECK-NEXT: mv a4, a1 1105; CHECK-NEXT: .LBB46_2: 1106; CHECK-NEXT: vmv1r.v v0, v24 1107; CHECK-NEXT: csrr a0, vlenb 1108; CHECK-NEXT: li a1, 40 1109; CHECK-NEXT: mul a0, a0, a1 1110; CHECK-NEXT: add a0, sp, a0 1111; CHECK-NEXT: addi a0, a0, 16 1112; CHECK-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload 1113; CHECK-NEXT: vsetvli zero, a4, e64, m8, ta, ma 1114; CHECK-NEXT: vand.vx v8, v16, a3, v0.t 1115; CHECK-NEXT: csrr a0, vlenb 1116; CHECK-NEXT: slli a0, a0, 4 1117; CHECK-NEXT: add a0, sp, a0 1118; CHECK-NEXT: addi a0, a0, 16 1119; CHECK-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload 1120; CHECK-NEXT: vsrl.vv v8, v16, v8, v0.t 1121; CHECK-NEXT: csrr a0, vlenb 1122; CHECK-NEXT: slli a0, a0, 4 1123; CHECK-NEXT: add a0, sp, a0 1124; CHECK-NEXT: addi a0, a0, 16 1125; CHECK-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 1126; CHECK-NEXT: csrr a0, vlenb 1127; CHECK-NEXT: li a1, 40 1128; CHECK-NEXT: mul a0, a0, a1 1129; CHECK-NEXT: add a0, sp, a0 1130; CHECK-NEXT: addi a0, a0, 16 1131; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1132; CHECK-NEXT: vnot.v v16, v8, v0.t 1133; CHECK-NEXT: vand.vx v16, v16, a3, v0.t 1134; CHECK-NEXT: csrr a0, vlenb 1135; CHECK-NEXT: slli a0, a0, 5 1136; CHECK-NEXT: add a0, sp, a0 1137; CHECK-NEXT: addi a0, a0, 16 1138; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1139; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 1140; CHECK-NEXT: vsll.vv v8, v8, v16, v0.t 1141; CHECK-NEXT: csrr a0, vlenb 1142; CHECK-NEXT: slli a0, a0, 4 1143; CHECK-NEXT: add a0, sp, a0 1144; CHECK-NEXT: addi a0, a0, 16 1145; CHECK-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload 1146; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 1147; CHECK-NEXT: csrr a0, vlenb 1148; CHECK-NEXT: li a1, 24 1149; CHECK-NEXT: mul a0, a0, a1 1150; CHECK-NEXT: add a0, sp, a0 1151; CHECK-NEXT: addi a0, a0, 16 1152; CHECK-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload 1153; CHECK-NEXT: csrr a0, vlenb 1154; CHECK-NEXT: li a1, 48 1155; CHECK-NEXT: mul a0, a0, a1 1156; CHECK-NEXT: add sp, sp, a0 1157; CHECK-NEXT: .cfi_def_cfa sp, 16 1158; CHECK-NEXT: addi sp, sp, 16 1159; CHECK-NEXT: .cfi_def_cfa_offset 0 1160; CHECK-NEXT: ret 1161 %res = call <vscale x 16 x i64> @llvm.vp.fshr.nxv16i64(<vscale x 16 x i64> %a, <vscale x 16 x i64> %b, <vscale x 16 x i64> %c, <vscale x 16 x i1> %m, i32 %evl) 1162 ret <vscale x 16 x i64> %res 1163} 1164 1165declare <vscale x 16 x i64> @llvm.vp.fshl.nxv16i64(<vscale x 16 x i64>, <vscale x 16 x i64>, <vscale x 16 x i64>, <vscale x 16 x i1>, i32) 1166define <vscale x 16 x i64> @fshl_v16i64(<vscale x 16 x i64> %a, <vscale x 16 x i64> %b, <vscale x 16 x i64> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 1167; CHECK-LABEL: fshl_v16i64: 1168; CHECK: # %bb.0: 1169; CHECK-NEXT: addi sp, sp, -16 1170; CHECK-NEXT: .cfi_def_cfa_offset 16 1171; CHECK-NEXT: csrr a1, vlenb 1172; CHECK-NEXT: li a3, 40 1173; CHECK-NEXT: mul a1, a1, a3 1174; CHECK-NEXT: sub sp, sp, a1 1175; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x28, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 40 * vlenb 1176; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 1177; CHECK-NEXT: vmv1r.v v24, v0 1178; CHECK-NEXT: csrr a1, vlenb 1179; CHECK-NEXT: slli a1, a1, 5 1180; CHECK-NEXT: add a1, sp, a1 1181; CHECK-NEXT: addi a1, a1, 16 1182; CHECK-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill 1183; CHECK-NEXT: csrr a1, vlenb 1184; CHECK-NEXT: li a3, 24 1185; CHECK-NEXT: mul a1, a1, a3 1186; CHECK-NEXT: add a1, sp, a1 1187; CHECK-NEXT: addi a1, a1, 16 1188; CHECK-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill 1189; CHECK-NEXT: csrr a3, vlenb 1190; CHECK-NEXT: slli a5, a3, 3 1191; CHECK-NEXT: srli a1, a3, 3 1192; CHECK-NEXT: sub a6, a4, a3 1193; CHECK-NEXT: vslidedown.vx v0, v0, a1 1194; CHECK-NEXT: add a1, a2, a5 1195; CHECK-NEXT: vl8re64.v v8, (a1) 1196; CHECK-NEXT: addi a1, sp, 16 1197; CHECK-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill 1198; CHECK-NEXT: sltu a1, a4, a6 1199; CHECK-NEXT: addi a1, a1, -1 1200; CHECK-NEXT: and a6, a1, a6 1201; CHECK-NEXT: li a1, 63 1202; CHECK-NEXT: vsetvli zero, a6, e64, m8, ta, ma 1203; CHECK-NEXT: vand.vx v8, v8, a1, v0.t 1204; CHECK-NEXT: csrr a6, vlenb 1205; CHECK-NEXT: slli a6, a6, 4 1206; CHECK-NEXT: add a6, sp, a6 1207; CHECK-NEXT: addi a6, a6, 16 1208; CHECK-NEXT: vs8r.v v8, (a6) # Unknown-size Folded Spill 1209; CHECK-NEXT: csrr a6, vlenb 1210; CHECK-NEXT: slli a6, a6, 5 1211; CHECK-NEXT: add a6, sp, a6 1212; CHECK-NEXT: addi a6, a6, 16 1213; CHECK-NEXT: vl8r.v v16, (a6) # Unknown-size Folded Reload 1214; CHECK-NEXT: csrr a6, vlenb 1215; CHECK-NEXT: slli a6, a6, 4 1216; CHECK-NEXT: add a6, sp, a6 1217; CHECK-NEXT: addi a6, a6, 16 1218; CHECK-NEXT: vl8r.v v8, (a6) # Unknown-size Folded Reload 1219; CHECK-NEXT: vsll.vv v16, v16, v8, v0.t 1220; CHECK-NEXT: csrr a6, vlenb 1221; CHECK-NEXT: slli a6, a6, 3 1222; CHECK-NEXT: add a6, sp, a6 1223; CHECK-NEXT: addi a6, a6, 16 1224; CHECK-NEXT: vs8r.v v16, (a6) # Unknown-size Folded Spill 1225; CHECK-NEXT: add a5, a0, a5 1226; CHECK-NEXT: addi a6, sp, 16 1227; CHECK-NEXT: vl8r.v v8, (a6) # Unknown-size Folded Reload 1228; CHECK-NEXT: vnot.v v8, v8, v0.t 1229; CHECK-NEXT: vl8re64.v v16, (a5) 1230; CHECK-NEXT: vand.vx v8, v8, a1, v0.t 1231; CHECK-NEXT: addi a5, sp, 16 1232; CHECK-NEXT: vs8r.v v8, (a5) # Unknown-size Folded Spill 1233; CHECK-NEXT: vl8re64.v v8, (a0) 1234; CHECK-NEXT: csrr a0, vlenb 1235; CHECK-NEXT: slli a0, a0, 4 1236; CHECK-NEXT: add a0, sp, a0 1237; CHECK-NEXT: addi a0, a0, 16 1238; CHECK-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 1239; CHECK-NEXT: vl8re64.v v8, (a2) 1240; CHECK-NEXT: csrr a0, vlenb 1241; CHECK-NEXT: slli a0, a0, 5 1242; CHECK-NEXT: add a0, sp, a0 1243; CHECK-NEXT: addi a0, a0, 16 1244; CHECK-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 1245; CHECK-NEXT: vsrl.vi v16, v16, 1, v0.t 1246; CHECK-NEXT: addi a0, sp, 16 1247; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1248; CHECK-NEXT: vsrl.vv v16, v16, v8, v0.t 1249; CHECK-NEXT: csrr a0, vlenb 1250; CHECK-NEXT: slli a0, a0, 3 1251; CHECK-NEXT: add a0, sp, a0 1252; CHECK-NEXT: addi a0, a0, 16 1253; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1254; CHECK-NEXT: vor.vv v8, v8, v16, v0.t 1255; CHECK-NEXT: csrr a0, vlenb 1256; CHECK-NEXT: slli a0, a0, 3 1257; CHECK-NEXT: add a0, sp, a0 1258; CHECK-NEXT: addi a0, a0, 16 1259; CHECK-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 1260; CHECK-NEXT: bltu a4, a3, .LBB47_2 1261; CHECK-NEXT: # %bb.1: 1262; CHECK-NEXT: mv a4, a3 1263; CHECK-NEXT: .LBB47_2: 1264; CHECK-NEXT: vmv1r.v v0, v24 1265; CHECK-NEXT: csrr a0, vlenb 1266; CHECK-NEXT: slli a0, a0, 5 1267; CHECK-NEXT: add a0, sp, a0 1268; CHECK-NEXT: addi a0, a0, 16 1269; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1270; CHECK-NEXT: vsetvli zero, a4, e64, m8, ta, ma 1271; CHECK-NEXT: vand.vx v8, v8, a1, v0.t 1272; CHECK-NEXT: addi a0, sp, 16 1273; CHECK-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 1274; CHECK-NEXT: csrr a0, vlenb 1275; CHECK-NEXT: li a2, 24 1276; CHECK-NEXT: mul a0, a0, a2 1277; CHECK-NEXT: add a0, sp, a0 1278; CHECK-NEXT: addi a0, a0, 16 1279; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1280; CHECK-NEXT: addi a0, sp, 16 1281; CHECK-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload 1282; CHECK-NEXT: vsll.vv v8, v8, v16, v0.t 1283; CHECK-NEXT: csrr a0, vlenb 1284; CHECK-NEXT: li a2, 24 1285; CHECK-NEXT: mul a0, a0, a2 1286; CHECK-NEXT: add a0, sp, a0 1287; CHECK-NEXT: addi a0, a0, 16 1288; CHECK-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 1289; CHECK-NEXT: csrr a0, vlenb 1290; CHECK-NEXT: slli a0, a0, 5 1291; CHECK-NEXT: add a0, sp, a0 1292; CHECK-NEXT: addi a0, a0, 16 1293; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1294; CHECK-NEXT: vnot.v v8, v8, v0.t 1295; CHECK-NEXT: vand.vx v16, v8, a1, v0.t 1296; CHECK-NEXT: csrr a0, vlenb 1297; CHECK-NEXT: slli a0, a0, 4 1298; CHECK-NEXT: add a0, sp, a0 1299; CHECK-NEXT: addi a0, a0, 16 1300; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 1301; CHECK-NEXT: vsrl.vi v8, v8, 1, v0.t 1302; CHECK-NEXT: vsrl.vv v8, v8, v16, v0.t 1303; CHECK-NEXT: csrr a0, vlenb 1304; CHECK-NEXT: li a1, 24 1305; CHECK-NEXT: mul a0, a0, a1 1306; CHECK-NEXT: add a0, sp, a0 1307; CHECK-NEXT: addi a0, a0, 16 1308; CHECK-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload 1309; CHECK-NEXT: vor.vv v8, v16, v8, v0.t 1310; CHECK-NEXT: csrr a0, vlenb 1311; CHECK-NEXT: slli a0, a0, 3 1312; CHECK-NEXT: add a0, sp, a0 1313; CHECK-NEXT: addi a0, a0, 16 1314; CHECK-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload 1315; CHECK-NEXT: csrr a0, vlenb 1316; CHECK-NEXT: li a1, 40 1317; CHECK-NEXT: mul a0, a0, a1 1318; CHECK-NEXT: add sp, sp, a0 1319; CHECK-NEXT: .cfi_def_cfa sp, 16 1320; CHECK-NEXT: addi sp, sp, 16 1321; CHECK-NEXT: .cfi_def_cfa_offset 0 1322; CHECK-NEXT: ret 1323 %res = call <vscale x 16 x i64> @llvm.vp.fshl.nxv16i64(<vscale x 16 x i64> %a, <vscale x 16 x i64> %b, <vscale x 16 x i64> %c, <vscale x 16 x i1> %m, i32 %evl) 1324 ret <vscale x 16 x i64> %res 1325} 1326 1327; Test promotion. 1328declare <vscale x 1 x i9> @llvm.vp.fshr.nxv1i9(<vscale x 1 x i9>, <vscale x 1 x i9>, <vscale x 1 x i9>, <vscale x 1 x i1>, i32) 1329define <vscale x 1 x i9> @fshr_v1i9(<vscale x 1 x i9> %a, <vscale x 1 x i9> %b, <vscale x 1 x i9> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1330; CHECK-LABEL: fshr_v1i9: 1331; CHECK: # %bb.0: 1332; CHECK-NEXT: li a1, 511 1333; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 1334; CHECK-NEXT: vand.vx v10, v10, a1, v0.t 1335; CHECK-NEXT: li a0, 9 1336; CHECK-NEXT: vremu.vx v10, v10, a0, v0.t 1337; CHECK-NEXT: vadd.vi v10, v10, 7, v0.t 1338; CHECK-NEXT: vand.vi v11, v10, 15, v0.t 1339; CHECK-NEXT: vsll.vi v9, v9, 7, v0.t 1340; CHECK-NEXT: vsrl.vv v9, v9, v11, v0.t 1341; CHECK-NEXT: vnot.v v10, v10, v0.t 1342; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 1343; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 1344; CHECK-NEXT: vsll.vv v8, v8, v10, v0.t 1345; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 1346; CHECK-NEXT: ret 1347 %res = call <vscale x 1 x i9> @llvm.vp.fshr.nxv1i9(<vscale x 1 x i9> %a, <vscale x 1 x i9> %b, <vscale x 1 x i9> %c, <vscale x 1 x i1> %m, i32 %evl) 1348 ret <vscale x 1 x i9> %res 1349} 1350 1351declare <vscale x 1 x i9> @llvm.vp.fshl.nxv1i9(<vscale x 1 x i9>, <vscale x 1 x i9>, <vscale x 1 x i9>, <vscale x 1 x i1>, i32) 1352define <vscale x 1 x i9> @fshl_v1i9(<vscale x 1 x i9> %a, <vscale x 1 x i9> %b, <vscale x 1 x i9> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1353; CHECK-LABEL: fshl_v1i9: 1354; CHECK: # %bb.0: 1355; CHECK-NEXT: li a1, 511 1356; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 1357; CHECK-NEXT: vand.vx v10, v10, a1, v0.t 1358; CHECK-NEXT: li a0, 9 1359; CHECK-NEXT: vremu.vx v10, v10, a0, v0.t 1360; CHECK-NEXT: vand.vi v11, v10, 15, v0.t 1361; CHECK-NEXT: vsll.vv v8, v8, v11, v0.t 1362; CHECK-NEXT: vnot.v v10, v10, v0.t 1363; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 1364; CHECK-NEXT: vsll.vi v9, v9, 7, v0.t 1365; CHECK-NEXT: vsrl.vi v9, v9, 1, v0.t 1366; CHECK-NEXT: vsrl.vv v9, v9, v10, v0.t 1367; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 1368; CHECK-NEXT: ret 1369 %res = call <vscale x 1 x i9> @llvm.vp.fshl.nxv1i9(<vscale x 1 x i9> %a, <vscale x 1 x i9> %b, <vscale x 1 x i9> %c, <vscale x 1 x i1> %m, i32 %evl) 1370 ret <vscale x 1 x i9> %res 1371} 1372 1373declare <vscale x 1 x i4> @llvm.vp.trunc.nxv1i4.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i1>, i32) 1374declare <vscale x 1 x i8> @llvm.vp.zext.nxv1i8.nxv1i4(<vscale x 1 x i4>, <vscale x 1 x i1>, i32) 1375declare <vscale x 1 x i4> @llvm.vp.fshr.nxv1i4(<vscale x 1 x i4>, <vscale x 1 x i4>, <vscale x 1 x i4>, <vscale x 1 x i1>, i32) 1376define <vscale x 1 x i8> @fshr_v1i4(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1377; CHECK-LABEL: fshr_v1i4: 1378; CHECK: # %bb.0: 1379; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 1380; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 1381; CHECK-NEXT: li a0, 4 1382; CHECK-NEXT: vand.vi v9, v9, 15, v0.t 1383; CHECK-NEXT: vsll.vi v8, v8, 4, v0.t 1384; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 1385; CHECK-NEXT: vremu.vx v9, v10, a0, v0.t 1386; CHECK-NEXT: vsrl.vv v8, v8, v9, v0.t 1387; CHECK-NEXT: vand.vi v8, v8, 15, v0.t 1388; CHECK-NEXT: ret 1389 %trunca = call <vscale x 1 x i4> @llvm.vp.trunc.nxv1i4.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i1> %m, i32 zeroext %evl) 1390 %truncb = call <vscale x 1 x i4> @llvm.vp.trunc.nxv1i4.nxv1i8(<vscale x 1 x i8> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) 1391 %truncc = call <vscale x 1 x i4> @llvm.vp.trunc.nxv1i4.nxv1i8(<vscale x 1 x i8> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) 1392 %fshr = call <vscale x 1 x i4> @llvm.vp.fshr.nxv1i4(<vscale x 1 x i4> %trunca, <vscale x 1 x i4> %truncb, <vscale x 1 x i4> %truncc, <vscale x 1 x i1> %m, i32 %evl) 1393 %res = call <vscale x 1 x i8> @llvm.vp.zext.nxv1i8.nxv1i4(<vscale x 1 x i4> %fshr, <vscale x 1 x i1> %m, i32 zeroext %evl) 1394 ret <vscale x 1 x i8> %res 1395} 1396 1397declare <vscale x 1 x i4> @llvm.vp.fshl.nxv1i4(<vscale x 1 x i4>, <vscale x 1 x i4>, <vscale x 1 x i4>, <vscale x 1 x i1>, i32) 1398define <vscale x 1 x i8> @fshl_v1i4(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1399; CHECK-LABEL: fshl_v1i4: 1400; CHECK: # %bb.0: 1401; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 1402; CHECK-NEXT: vand.vi v10, v10, 15, v0.t 1403; CHECK-NEXT: li a0, 4 1404; CHECK-NEXT: vand.vi v9, v9, 15, v0.t 1405; CHECK-NEXT: vsll.vi v8, v8, 4, v0.t 1406; CHECK-NEXT: vor.vv v8, v8, v9, v0.t 1407; CHECK-NEXT: vremu.vx v9, v10, a0, v0.t 1408; CHECK-NEXT: vsll.vv v8, v8, v9, v0.t 1409; CHECK-NEXT: vsrl.vi v8, v8, 4, v0.t 1410; CHECK-NEXT: vand.vi v8, v8, 15, v0.t 1411; CHECK-NEXT: ret 1412 %trunca = call <vscale x 1 x i4> @llvm.vp.trunc.nxv1i4.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i1> %m, i32 zeroext %evl) 1413 %truncb = call <vscale x 1 x i4> @llvm.vp.trunc.nxv1i4.nxv1i8(<vscale x 1 x i8> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) 1414 %truncc = call <vscale x 1 x i4> @llvm.vp.trunc.nxv1i4.nxv1i8(<vscale x 1 x i8> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) 1415 %fshl = call <vscale x 1 x i4> @llvm.vp.fshl.nxv1i4(<vscale x 1 x i4> %trunca, <vscale x 1 x i4> %truncb, <vscale x 1 x i4> %truncc, <vscale x 1 x i1> %m, i32 %evl) 1416 %res = call <vscale x 1 x i8> @llvm.vp.zext.nxv1i8.nxv1i4(<vscale x 1 x i4> %fshl, <vscale x 1 x i1> %m, i32 zeroext %evl) 1417 ret <vscale x 1 x i8> %res 1418} 1419