1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV32 3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV64 4; RUN: llc -mtriple=riscv32 -mattr=+v,+zvkb -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-ZVKB 5; RUN: llc -mtriple=riscv64 -mattr=+v,+zvkb -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-ZVKB 6 7declare <vscale x 1 x i8> @llvm.fshr.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i8>, <vscale x 1 x i8>) 8declare <vscale x 1 x i8> @llvm.fshl.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i8>, <vscale x 1 x i8>) 9 10define <vscale x 1 x i8> @vror_vv_nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b) { 11; CHECK-LABEL: vror_vv_nxv1i8: 12; CHECK: # %bb.0: 13; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 14; CHECK-NEXT: vand.vi v10, v9, 7 15; CHECK-NEXT: vrsub.vi v9, v9, 0 16; CHECK-NEXT: vsrl.vv v10, v8, v10 17; CHECK-NEXT: vand.vi v9, v9, 7 18; CHECK-NEXT: vsll.vv v8, v8, v9 19; CHECK-NEXT: vor.vv v8, v10, v8 20; CHECK-NEXT: ret 21; 22; CHECK-ZVKB-LABEL: vror_vv_nxv1i8: 23; CHECK-ZVKB: # %bb.0: 24; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 25; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 26; CHECK-ZVKB-NEXT: ret 27 %x = call <vscale x 1 x i8> @llvm.fshr.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %a, <vscale x 1 x i8> %b) 28 ret <vscale x 1 x i8> %x 29} 30 31define <vscale x 1 x i8> @vror_vx_nxv1i8(<vscale x 1 x i8> %a, i8 %b) { 32; CHECK-LABEL: vror_vx_nxv1i8: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 35; CHECK-NEXT: vmv.v.x v9, a0 36; CHECK-NEXT: vand.vi v10, v9, 7 37; CHECK-NEXT: vrsub.vi v9, v9, 0 38; CHECK-NEXT: vsrl.vv v10, v8, v10 39; CHECK-NEXT: vand.vi v9, v9, 7 40; CHECK-NEXT: vsll.vv v8, v8, v9 41; CHECK-NEXT: vor.vv v8, v10, v8 42; CHECK-NEXT: ret 43; 44; CHECK-ZVKB-LABEL: vror_vx_nxv1i8: 45; CHECK-ZVKB: # %bb.0: 46; CHECK-ZVKB-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 47; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 48; CHECK-ZVKB-NEXT: ret 49 %b.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0 50 %b.splat = shufflevector <vscale x 1 x i8> %b.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 51 %x = call <vscale x 1 x i8> @llvm.fshr.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %a, <vscale x 1 x i8> %b.splat) 52 ret <vscale x 1 x i8> %x 53} 54 55define <vscale x 1 x i8> @vror_vi_nxv1i8(<vscale x 1 x i8> %a) { 56; CHECK-LABEL: vror_vi_nxv1i8: 57; CHECK: # %bb.0: 58; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 59; CHECK-NEXT: vsll.vi v9, v8, 7 60; CHECK-NEXT: vsrl.vi v8, v8, 1 61; CHECK-NEXT: vor.vv v8, v8, v9 62; CHECK-NEXT: ret 63; 64; CHECK-ZVKB-LABEL: vror_vi_nxv1i8: 65; CHECK-ZVKB: # %bb.0: 66; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 67; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 68; CHECK-ZVKB-NEXT: ret 69 %x = call <vscale x 1 x i8> @llvm.fshr.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %a, <vscale x 1 x i8> splat (i8 1)) 70 ret <vscale x 1 x i8> %x 71} 72 73define <vscale x 1 x i8> @vror_vi_rotl_nxv1i8(<vscale x 1 x i8> %a) { 74; CHECK-LABEL: vror_vi_rotl_nxv1i8: 75; CHECK: # %bb.0: 76; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 77; CHECK-NEXT: vsrl.vi v9, v8, 7 78; CHECK-NEXT: vadd.vv v8, v8, v8 79; CHECK-NEXT: vor.vv v8, v8, v9 80; CHECK-NEXT: ret 81; 82; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv1i8: 83; CHECK-ZVKB: # %bb.0: 84; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 85; CHECK-ZVKB-NEXT: vror.vi v8, v8, 7 86; CHECK-ZVKB-NEXT: ret 87 %x = call <vscale x 1 x i8> @llvm.fshl.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %a, <vscale x 1 x i8> splat (i8 1)) 88 ret <vscale x 1 x i8> %x 89} 90 91declare <vscale x 2 x i8> @llvm.fshr.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>, <vscale x 2 x i8>) 92declare <vscale x 2 x i8> @llvm.fshl.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>, <vscale x 2 x i8>) 93 94define <vscale x 2 x i8> @vror_vv_nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i8> %b) { 95; CHECK-LABEL: vror_vv_nxv2i8: 96; CHECK: # %bb.0: 97; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 98; CHECK-NEXT: vand.vi v10, v9, 7 99; CHECK-NEXT: vrsub.vi v9, v9, 0 100; CHECK-NEXT: vsrl.vv v10, v8, v10 101; CHECK-NEXT: vand.vi v9, v9, 7 102; CHECK-NEXT: vsll.vv v8, v8, v9 103; CHECK-NEXT: vor.vv v8, v10, v8 104; CHECK-NEXT: ret 105; 106; CHECK-ZVKB-LABEL: vror_vv_nxv2i8: 107; CHECK-ZVKB: # %bb.0: 108; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 109; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 110; CHECK-ZVKB-NEXT: ret 111 %x = call <vscale x 2 x i8> @llvm.fshr.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i8> %a, <vscale x 2 x i8> %b) 112 ret <vscale x 2 x i8> %x 113} 114 115define <vscale x 2 x i8> @vror_vx_nxv2i8(<vscale x 2 x i8> %a, i8 %b) { 116; CHECK-LABEL: vror_vx_nxv2i8: 117; CHECK: # %bb.0: 118; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 119; CHECK-NEXT: vmv.v.x v9, a0 120; CHECK-NEXT: vand.vi v10, v9, 7 121; CHECK-NEXT: vrsub.vi v9, v9, 0 122; CHECK-NEXT: vsrl.vv v10, v8, v10 123; CHECK-NEXT: vand.vi v9, v9, 7 124; CHECK-NEXT: vsll.vv v8, v8, v9 125; CHECK-NEXT: vor.vv v8, v10, v8 126; CHECK-NEXT: ret 127; 128; CHECK-ZVKB-LABEL: vror_vx_nxv2i8: 129; CHECK-ZVKB: # %bb.0: 130; CHECK-ZVKB-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 131; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 132; CHECK-ZVKB-NEXT: ret 133 %b.head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0 134 %b.splat = shufflevector <vscale x 2 x i8> %b.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer 135 %x = call <vscale x 2 x i8> @llvm.fshr.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i8> %a, <vscale x 2 x i8> %b.splat) 136 ret <vscale x 2 x i8> %x 137} 138 139define <vscale x 2 x i8> @vror_vi_nxv2i8(<vscale x 2 x i8> %a) { 140; CHECK-LABEL: vror_vi_nxv2i8: 141; CHECK: # %bb.0: 142; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 143; CHECK-NEXT: vsll.vi v9, v8, 7 144; CHECK-NEXT: vsrl.vi v8, v8, 1 145; CHECK-NEXT: vor.vv v8, v8, v9 146; CHECK-NEXT: ret 147; 148; CHECK-ZVKB-LABEL: vror_vi_nxv2i8: 149; CHECK-ZVKB: # %bb.0: 150; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 151; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 152; CHECK-ZVKB-NEXT: ret 153 %x = call <vscale x 2 x i8> @llvm.fshr.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i8> %a, <vscale x 2 x i8> splat (i8 1)) 154 ret <vscale x 2 x i8> %x 155} 156 157define <vscale x 2 x i8> @vror_vi_rotl_nxv2i8(<vscale x 2 x i8> %a) { 158; CHECK-LABEL: vror_vi_rotl_nxv2i8: 159; CHECK: # %bb.0: 160; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 161; CHECK-NEXT: vsrl.vi v9, v8, 7 162; CHECK-NEXT: vadd.vv v8, v8, v8 163; CHECK-NEXT: vor.vv v8, v8, v9 164; CHECK-NEXT: ret 165; 166; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv2i8: 167; CHECK-ZVKB: # %bb.0: 168; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 169; CHECK-ZVKB-NEXT: vror.vi v8, v8, 7 170; CHECK-ZVKB-NEXT: ret 171 %x = call <vscale x 2 x i8> @llvm.fshl.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i8> %a, <vscale x 2 x i8> splat (i8 1)) 172 ret <vscale x 2 x i8> %x 173} 174 175declare <vscale x 4 x i8> @llvm.fshr.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>, <vscale x 4 x i8>) 176declare <vscale x 4 x i8> @llvm.fshl.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>, <vscale x 4 x i8>) 177 178define <vscale x 4 x i8> @vror_vv_nxv4i8(<vscale x 4 x i8> %a, <vscale x 4 x i8> %b) { 179; CHECK-LABEL: vror_vv_nxv4i8: 180; CHECK: # %bb.0: 181; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 182; CHECK-NEXT: vand.vi v10, v9, 7 183; CHECK-NEXT: vrsub.vi v9, v9, 0 184; CHECK-NEXT: vsrl.vv v10, v8, v10 185; CHECK-NEXT: vand.vi v9, v9, 7 186; CHECK-NEXT: vsll.vv v8, v8, v9 187; CHECK-NEXT: vor.vv v8, v10, v8 188; CHECK-NEXT: ret 189; 190; CHECK-ZVKB-LABEL: vror_vv_nxv4i8: 191; CHECK-ZVKB: # %bb.0: 192; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 193; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 194; CHECK-ZVKB-NEXT: ret 195 %x = call <vscale x 4 x i8> @llvm.fshr.nxv4i8(<vscale x 4 x i8> %a, <vscale x 4 x i8> %a, <vscale x 4 x i8> %b) 196 ret <vscale x 4 x i8> %x 197} 198 199define <vscale x 4 x i8> @vror_vx_nxv4i8(<vscale x 4 x i8> %a, i8 %b) { 200; CHECK-LABEL: vror_vx_nxv4i8: 201; CHECK: # %bb.0: 202; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 203; CHECK-NEXT: vmv.v.x v9, a0 204; CHECK-NEXT: vand.vi v10, v9, 7 205; CHECK-NEXT: vrsub.vi v9, v9, 0 206; CHECK-NEXT: vsrl.vv v10, v8, v10 207; CHECK-NEXT: vand.vi v9, v9, 7 208; CHECK-NEXT: vsll.vv v8, v8, v9 209; CHECK-NEXT: vor.vv v8, v10, v8 210; CHECK-NEXT: ret 211; 212; CHECK-ZVKB-LABEL: vror_vx_nxv4i8: 213; CHECK-ZVKB: # %bb.0: 214; CHECK-ZVKB-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 215; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 216; CHECK-ZVKB-NEXT: ret 217 %b.head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0 218 %b.splat = shufflevector <vscale x 4 x i8> %b.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer 219 %x = call <vscale x 4 x i8> @llvm.fshr.nxv4i8(<vscale x 4 x i8> %a, <vscale x 4 x i8> %a, <vscale x 4 x i8> %b.splat) 220 ret <vscale x 4 x i8> %x 221} 222 223define <vscale x 4 x i8> @vror_vi_nxv4i8(<vscale x 4 x i8> %a) { 224; CHECK-LABEL: vror_vi_nxv4i8: 225; CHECK: # %bb.0: 226; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 227; CHECK-NEXT: vsll.vi v9, v8, 7 228; CHECK-NEXT: vsrl.vi v8, v8, 1 229; CHECK-NEXT: vor.vv v8, v8, v9 230; CHECK-NEXT: ret 231; 232; CHECK-ZVKB-LABEL: vror_vi_nxv4i8: 233; CHECK-ZVKB: # %bb.0: 234; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 235; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 236; CHECK-ZVKB-NEXT: ret 237 %x = call <vscale x 4 x i8> @llvm.fshr.nxv4i8(<vscale x 4 x i8> %a, <vscale x 4 x i8> %a, <vscale x 4 x i8> splat (i8 1)) 238 ret <vscale x 4 x i8> %x 239} 240 241define <vscale x 4 x i8> @vror_vi_rotl_nxv4i8(<vscale x 4 x i8> %a) { 242; CHECK-LABEL: vror_vi_rotl_nxv4i8: 243; CHECK: # %bb.0: 244; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 245; CHECK-NEXT: vsrl.vi v9, v8, 7 246; CHECK-NEXT: vadd.vv v8, v8, v8 247; CHECK-NEXT: vor.vv v8, v8, v9 248; CHECK-NEXT: ret 249; 250; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv4i8: 251; CHECK-ZVKB: # %bb.0: 252; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 253; CHECK-ZVKB-NEXT: vror.vi v8, v8, 7 254; CHECK-ZVKB-NEXT: ret 255 %x = call <vscale x 4 x i8> @llvm.fshl.nxv4i8(<vscale x 4 x i8> %a, <vscale x 4 x i8> %a, <vscale x 4 x i8> splat (i8 1)) 256 ret <vscale x 4 x i8> %x 257} 258 259declare <vscale x 8 x i8> @llvm.fshr.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>) 260declare <vscale x 8 x i8> @llvm.fshl.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>) 261 262define <vscale x 8 x i8> @vror_vv_nxv8i8(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) { 263; CHECK-LABEL: vror_vv_nxv8i8: 264; CHECK: # %bb.0: 265; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 266; CHECK-NEXT: vand.vi v10, v9, 7 267; CHECK-NEXT: vrsub.vi v9, v9, 0 268; CHECK-NEXT: vsrl.vv v10, v8, v10 269; CHECK-NEXT: vand.vi v9, v9, 7 270; CHECK-NEXT: vsll.vv v8, v8, v9 271; CHECK-NEXT: vor.vv v8, v10, v8 272; CHECK-NEXT: ret 273; 274; CHECK-ZVKB-LABEL: vror_vv_nxv8i8: 275; CHECK-ZVKB: # %bb.0: 276; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m1, ta, ma 277; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 278; CHECK-ZVKB-NEXT: ret 279 %x = call <vscale x 8 x i8> @llvm.fshr.nxv8i8(<vscale x 8 x i8> %a, <vscale x 8 x i8> %a, <vscale x 8 x i8> %b) 280 ret <vscale x 8 x i8> %x 281} 282 283define <vscale x 8 x i8> @vror_vx_nxv8i8(<vscale x 8 x i8> %a, i8 %b) { 284; CHECK-LABEL: vror_vx_nxv8i8: 285; CHECK: # %bb.0: 286; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 287; CHECK-NEXT: vmv.v.x v9, a0 288; CHECK-NEXT: vand.vi v10, v9, 7 289; CHECK-NEXT: vrsub.vi v9, v9, 0 290; CHECK-NEXT: vsrl.vv v10, v8, v10 291; CHECK-NEXT: vand.vi v9, v9, 7 292; CHECK-NEXT: vsll.vv v8, v8, v9 293; CHECK-NEXT: vor.vv v8, v10, v8 294; CHECK-NEXT: ret 295; 296; CHECK-ZVKB-LABEL: vror_vx_nxv8i8: 297; CHECK-ZVKB: # %bb.0: 298; CHECK-ZVKB-NEXT: vsetvli a1, zero, e8, m1, ta, ma 299; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 300; CHECK-ZVKB-NEXT: ret 301 %b.head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0 302 %b.splat = shufflevector <vscale x 8 x i8> %b.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 303 %x = call <vscale x 8 x i8> @llvm.fshr.nxv8i8(<vscale x 8 x i8> %a, <vscale x 8 x i8> %a, <vscale x 8 x i8> %b.splat) 304 ret <vscale x 8 x i8> %x 305} 306 307define <vscale x 8 x i8> @vror_vi_nxv8i8(<vscale x 8 x i8> %a) { 308; CHECK-LABEL: vror_vi_nxv8i8: 309; CHECK: # %bb.0: 310; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 311; CHECK-NEXT: vsll.vi v9, v8, 7 312; CHECK-NEXT: vsrl.vi v8, v8, 1 313; CHECK-NEXT: vor.vv v8, v8, v9 314; CHECK-NEXT: ret 315; 316; CHECK-ZVKB-LABEL: vror_vi_nxv8i8: 317; CHECK-ZVKB: # %bb.0: 318; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m1, ta, ma 319; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 320; CHECK-ZVKB-NEXT: ret 321 %x = call <vscale x 8 x i8> @llvm.fshr.nxv8i8(<vscale x 8 x i8> %a, <vscale x 8 x i8> %a, <vscale x 8 x i8> splat (i8 1)) 322 ret <vscale x 8 x i8> %x 323} 324 325define <vscale x 8 x i8> @vror_vi_rotl_nxv8i8(<vscale x 8 x i8> %a) { 326; CHECK-LABEL: vror_vi_rotl_nxv8i8: 327; CHECK: # %bb.0: 328; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 329; CHECK-NEXT: vsrl.vi v9, v8, 7 330; CHECK-NEXT: vadd.vv v8, v8, v8 331; CHECK-NEXT: vor.vv v8, v8, v9 332; CHECK-NEXT: ret 333; 334; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv8i8: 335; CHECK-ZVKB: # %bb.0: 336; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m1, ta, ma 337; CHECK-ZVKB-NEXT: vror.vi v8, v8, 7 338; CHECK-ZVKB-NEXT: ret 339 %x = call <vscale x 8 x i8> @llvm.fshl.nxv8i8(<vscale x 8 x i8> %a, <vscale x 8 x i8> %a, <vscale x 8 x i8> splat (i8 1)) 340 ret <vscale x 8 x i8> %x 341} 342 343declare <vscale x 16 x i8> @llvm.fshr.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>) 344declare <vscale x 16 x i8> @llvm.fshl.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>) 345 346define <vscale x 16 x i8> @vror_vv_nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 347; CHECK-LABEL: vror_vv_nxv16i8: 348; CHECK: # %bb.0: 349; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 350; CHECK-NEXT: vand.vi v12, v10, 7 351; CHECK-NEXT: vrsub.vi v10, v10, 0 352; CHECK-NEXT: vsrl.vv v12, v8, v12 353; CHECK-NEXT: vand.vi v10, v10, 7 354; CHECK-NEXT: vsll.vv v8, v8, v10 355; CHECK-NEXT: vor.vv v8, v12, v8 356; CHECK-NEXT: ret 357; 358; CHECK-ZVKB-LABEL: vror_vv_nxv16i8: 359; CHECK-ZVKB: # %bb.0: 360; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m2, ta, ma 361; CHECK-ZVKB-NEXT: vror.vv v8, v8, v10 362; CHECK-ZVKB-NEXT: ret 363 %x = call <vscale x 16 x i8> @llvm.fshr.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 364 ret <vscale x 16 x i8> %x 365} 366 367define <vscale x 16 x i8> @vror_vx_nxv16i8(<vscale x 16 x i8> %a, i8 %b) { 368; CHECK-LABEL: vror_vx_nxv16i8: 369; CHECK: # %bb.0: 370; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma 371; CHECK-NEXT: vmv.v.x v10, a0 372; CHECK-NEXT: vand.vi v12, v10, 7 373; CHECK-NEXT: vrsub.vi v10, v10, 0 374; CHECK-NEXT: vsrl.vv v12, v8, v12 375; CHECK-NEXT: vand.vi v10, v10, 7 376; CHECK-NEXT: vsll.vv v8, v8, v10 377; CHECK-NEXT: vor.vv v8, v12, v8 378; CHECK-NEXT: ret 379; 380; CHECK-ZVKB-LABEL: vror_vx_nxv16i8: 381; CHECK-ZVKB: # %bb.0: 382; CHECK-ZVKB-NEXT: vsetvli a1, zero, e8, m2, ta, ma 383; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 384; CHECK-ZVKB-NEXT: ret 385 %b.head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0 386 %b.splat = shufflevector <vscale x 16 x i8> %b.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer 387 %x = call <vscale x 16 x i8> @llvm.fshr.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b.splat) 388 ret <vscale x 16 x i8> %x 389} 390 391define <vscale x 16 x i8> @vror_vi_nxv16i8(<vscale x 16 x i8> %a) { 392; CHECK-LABEL: vror_vi_nxv16i8: 393; CHECK: # %bb.0: 394; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 395; CHECK-NEXT: vsll.vi v10, v8, 7 396; CHECK-NEXT: vsrl.vi v8, v8, 1 397; CHECK-NEXT: vor.vv v8, v8, v10 398; CHECK-NEXT: ret 399; 400; CHECK-ZVKB-LABEL: vror_vi_nxv16i8: 401; CHECK-ZVKB: # %bb.0: 402; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m2, ta, ma 403; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 404; CHECK-ZVKB-NEXT: ret 405 %x = call <vscale x 16 x i8> @llvm.fshr.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %a, <vscale x 16 x i8> splat (i8 1)) 406 ret <vscale x 16 x i8> %x 407} 408 409define <vscale x 16 x i8> @vror_vi_rotl_nxv16i8(<vscale x 16 x i8> %a) { 410; CHECK-LABEL: vror_vi_rotl_nxv16i8: 411; CHECK: # %bb.0: 412; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 413; CHECK-NEXT: vsrl.vi v10, v8, 7 414; CHECK-NEXT: vadd.vv v8, v8, v8 415; CHECK-NEXT: vor.vv v8, v8, v10 416; CHECK-NEXT: ret 417; 418; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv16i8: 419; CHECK-ZVKB: # %bb.0: 420; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m2, ta, ma 421; CHECK-ZVKB-NEXT: vror.vi v8, v8, 7 422; CHECK-ZVKB-NEXT: ret 423 %x = call <vscale x 16 x i8> @llvm.fshl.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %a, <vscale x 16 x i8> splat (i8 1)) 424 ret <vscale x 16 x i8> %x 425} 426 427declare <vscale x 32 x i8> @llvm.fshr.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>, <vscale x 32 x i8>) 428declare <vscale x 32 x i8> @llvm.fshl.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>, <vscale x 32 x i8>) 429 430define <vscale x 32 x i8> @vror_vv_nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i8> %b) { 431; CHECK-LABEL: vror_vv_nxv32i8: 432; CHECK: # %bb.0: 433; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 434; CHECK-NEXT: vand.vi v16, v12, 7 435; CHECK-NEXT: vrsub.vi v12, v12, 0 436; CHECK-NEXT: vsrl.vv v16, v8, v16 437; CHECK-NEXT: vand.vi v12, v12, 7 438; CHECK-NEXT: vsll.vv v8, v8, v12 439; CHECK-NEXT: vor.vv v8, v16, v8 440; CHECK-NEXT: ret 441; 442; CHECK-ZVKB-LABEL: vror_vv_nxv32i8: 443; CHECK-ZVKB: # %bb.0: 444; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m4, ta, ma 445; CHECK-ZVKB-NEXT: vror.vv v8, v8, v12 446; CHECK-ZVKB-NEXT: ret 447 %x = call <vscale x 32 x i8> @llvm.fshr.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i8> %a, <vscale x 32 x i8> %b) 448 ret <vscale x 32 x i8> %x 449} 450 451define <vscale x 32 x i8> @vror_vx_nxv32i8(<vscale x 32 x i8> %a, i8 %b) { 452; CHECK-LABEL: vror_vx_nxv32i8: 453; CHECK: # %bb.0: 454; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma 455; CHECK-NEXT: vmv.v.x v12, a0 456; CHECK-NEXT: vand.vi v16, v12, 7 457; CHECK-NEXT: vrsub.vi v12, v12, 0 458; CHECK-NEXT: vsrl.vv v16, v8, v16 459; CHECK-NEXT: vand.vi v12, v12, 7 460; CHECK-NEXT: vsll.vv v8, v8, v12 461; CHECK-NEXT: vor.vv v8, v16, v8 462; CHECK-NEXT: ret 463; 464; CHECK-ZVKB-LABEL: vror_vx_nxv32i8: 465; CHECK-ZVKB: # %bb.0: 466; CHECK-ZVKB-NEXT: vsetvli a1, zero, e8, m4, ta, ma 467; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 468; CHECK-ZVKB-NEXT: ret 469 %b.head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0 470 %b.splat = shufflevector <vscale x 32 x i8> %b.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer 471 %x = call <vscale x 32 x i8> @llvm.fshr.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i8> %a, <vscale x 32 x i8> %b.splat) 472 ret <vscale x 32 x i8> %x 473} 474 475define <vscale x 32 x i8> @vror_vi_nxv32i8(<vscale x 32 x i8> %a) { 476; CHECK-LABEL: vror_vi_nxv32i8: 477; CHECK: # %bb.0: 478; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 479; CHECK-NEXT: vsll.vi v12, v8, 7 480; CHECK-NEXT: vsrl.vi v8, v8, 1 481; CHECK-NEXT: vor.vv v8, v8, v12 482; CHECK-NEXT: ret 483; 484; CHECK-ZVKB-LABEL: vror_vi_nxv32i8: 485; CHECK-ZVKB: # %bb.0: 486; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m4, ta, ma 487; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 488; CHECK-ZVKB-NEXT: ret 489 %x = call <vscale x 32 x i8> @llvm.fshr.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i8> %a, <vscale x 32 x i8> splat (i8 1)) 490 ret <vscale x 32 x i8> %x 491} 492 493define <vscale x 32 x i8> @vror_vi_rotl_nxv32i8(<vscale x 32 x i8> %a) { 494; CHECK-LABEL: vror_vi_rotl_nxv32i8: 495; CHECK: # %bb.0: 496; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 497; CHECK-NEXT: vsrl.vi v12, v8, 7 498; CHECK-NEXT: vadd.vv v8, v8, v8 499; CHECK-NEXT: vor.vv v8, v8, v12 500; CHECK-NEXT: ret 501; 502; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv32i8: 503; CHECK-ZVKB: # %bb.0: 504; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m4, ta, ma 505; CHECK-ZVKB-NEXT: vror.vi v8, v8, 7 506; CHECK-ZVKB-NEXT: ret 507 %x = call <vscale x 32 x i8> @llvm.fshl.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i8> %a, <vscale x 32 x i8> splat (i8 1)) 508 ret <vscale x 32 x i8> %x 509} 510 511declare <vscale x 64 x i8> @llvm.fshr.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>, <vscale x 64 x i8>) 512declare <vscale x 64 x i8> @llvm.fshl.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>, <vscale x 64 x i8>) 513 514define <vscale x 64 x i8> @vror_vv_nxv64i8(<vscale x 64 x i8> %a, <vscale x 64 x i8> %b) { 515; CHECK-LABEL: vror_vv_nxv64i8: 516; CHECK: # %bb.0: 517; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 518; CHECK-NEXT: vand.vi v24, v16, 7 519; CHECK-NEXT: vrsub.vi v16, v16, 0 520; CHECK-NEXT: vsrl.vv v24, v8, v24 521; CHECK-NEXT: vand.vi v16, v16, 7 522; CHECK-NEXT: vsll.vv v8, v8, v16 523; CHECK-NEXT: vor.vv v8, v24, v8 524; CHECK-NEXT: ret 525; 526; CHECK-ZVKB-LABEL: vror_vv_nxv64i8: 527; CHECK-ZVKB: # %bb.0: 528; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m8, ta, ma 529; CHECK-ZVKB-NEXT: vror.vv v8, v8, v16 530; CHECK-ZVKB-NEXT: ret 531 %x = call <vscale x 64 x i8> @llvm.fshr.nxv64i8(<vscale x 64 x i8> %a, <vscale x 64 x i8> %a, <vscale x 64 x i8> %b) 532 ret <vscale x 64 x i8> %x 533} 534 535define <vscale x 64 x i8> @vror_vx_nxv64i8(<vscale x 64 x i8> %a, i8 %b) { 536; CHECK-LABEL: vror_vx_nxv64i8: 537; CHECK: # %bb.0: 538; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma 539; CHECK-NEXT: vmv.v.x v16, a0 540; CHECK-NEXT: vand.vi v24, v16, 7 541; CHECK-NEXT: vrsub.vi v16, v16, 0 542; CHECK-NEXT: vsrl.vv v24, v8, v24 543; CHECK-NEXT: vand.vi v16, v16, 7 544; CHECK-NEXT: vsll.vv v8, v8, v16 545; CHECK-NEXT: vor.vv v8, v24, v8 546; CHECK-NEXT: ret 547; 548; CHECK-ZVKB-LABEL: vror_vx_nxv64i8: 549; CHECK-ZVKB: # %bb.0: 550; CHECK-ZVKB-NEXT: vsetvli a1, zero, e8, m8, ta, ma 551; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 552; CHECK-ZVKB-NEXT: ret 553 %b.head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0 554 %b.splat = shufflevector <vscale x 64 x i8> %b.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer 555 %x = call <vscale x 64 x i8> @llvm.fshr.nxv64i8(<vscale x 64 x i8> %a, <vscale x 64 x i8> %a, <vscale x 64 x i8> %b.splat) 556 ret <vscale x 64 x i8> %x 557} 558 559define <vscale x 64 x i8> @vror_vi_nxv64i8(<vscale x 64 x i8> %a) { 560; CHECK-LABEL: vror_vi_nxv64i8: 561; CHECK: # %bb.0: 562; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 563; CHECK-NEXT: vsll.vi v16, v8, 7 564; CHECK-NEXT: vsrl.vi v8, v8, 1 565; CHECK-NEXT: vor.vv v8, v8, v16 566; CHECK-NEXT: ret 567; 568; CHECK-ZVKB-LABEL: vror_vi_nxv64i8: 569; CHECK-ZVKB: # %bb.0: 570; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m8, ta, ma 571; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 572; CHECK-ZVKB-NEXT: ret 573 %x = call <vscale x 64 x i8> @llvm.fshr.nxv64i8(<vscale x 64 x i8> %a, <vscale x 64 x i8> %a, <vscale x 64 x i8> splat (i8 1)) 574 ret <vscale x 64 x i8> %x 575} 576 577define <vscale x 64 x i8> @vror_vi_rotl_nxv64i8(<vscale x 64 x i8> %a) { 578; CHECK-LABEL: vror_vi_rotl_nxv64i8: 579; CHECK: # %bb.0: 580; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 581; CHECK-NEXT: vsrl.vi v16, v8, 7 582; CHECK-NEXT: vadd.vv v8, v8, v8 583; CHECK-NEXT: vor.vv v8, v8, v16 584; CHECK-NEXT: ret 585; 586; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv64i8: 587; CHECK-ZVKB: # %bb.0: 588; CHECK-ZVKB-NEXT: vsetvli a0, zero, e8, m8, ta, ma 589; CHECK-ZVKB-NEXT: vror.vi v8, v8, 7 590; CHECK-ZVKB-NEXT: ret 591 %x = call <vscale x 64 x i8> @llvm.fshl.nxv64i8(<vscale x 64 x i8> %a, <vscale x 64 x i8> %a, <vscale x 64 x i8> splat (i8 1)) 592 ret <vscale x 64 x i8> %x 593} 594 595declare <vscale x 1 x i16> @llvm.fshr.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>, <vscale x 1 x i16>) 596declare <vscale x 1 x i16> @llvm.fshl.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>, <vscale x 1 x i16>) 597 598define <vscale x 1 x i16> @vror_vv_nxv1i16(<vscale x 1 x i16> %a, <vscale x 1 x i16> %b) { 599; CHECK-LABEL: vror_vv_nxv1i16: 600; CHECK: # %bb.0: 601; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 602; CHECK-NEXT: vand.vi v10, v9, 15 603; CHECK-NEXT: vrsub.vi v9, v9, 0 604; CHECK-NEXT: vsrl.vv v10, v8, v10 605; CHECK-NEXT: vand.vi v9, v9, 15 606; CHECK-NEXT: vsll.vv v8, v8, v9 607; CHECK-NEXT: vor.vv v8, v10, v8 608; CHECK-NEXT: ret 609; 610; CHECK-ZVKB-LABEL: vror_vv_nxv1i16: 611; CHECK-ZVKB: # %bb.0: 612; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 613; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 614; CHECK-ZVKB-NEXT: ret 615 %x = call <vscale x 1 x i16> @llvm.fshr.nxv1i16(<vscale x 1 x i16> %a, <vscale x 1 x i16> %a, <vscale x 1 x i16> %b) 616 ret <vscale x 1 x i16> %x 617} 618 619define <vscale x 1 x i16> @vror_vx_nxv1i16(<vscale x 1 x i16> %a, i16 %b) { 620; CHECK-LABEL: vror_vx_nxv1i16: 621; CHECK: # %bb.0: 622; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 623; CHECK-NEXT: vmv.v.x v9, a0 624; CHECK-NEXT: vand.vi v10, v9, 15 625; CHECK-NEXT: vrsub.vi v9, v9, 0 626; CHECK-NEXT: vsrl.vv v10, v8, v10 627; CHECK-NEXT: vand.vi v9, v9, 15 628; CHECK-NEXT: vsll.vv v8, v8, v9 629; CHECK-NEXT: vor.vv v8, v10, v8 630; CHECK-NEXT: ret 631; 632; CHECK-ZVKB-LABEL: vror_vx_nxv1i16: 633; CHECK-ZVKB: # %bb.0: 634; CHECK-ZVKB-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 635; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 636; CHECK-ZVKB-NEXT: ret 637 %b.head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0 638 %b.splat = shufflevector <vscale x 1 x i16> %b.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer 639 %x = call <vscale x 1 x i16> @llvm.fshr.nxv1i16(<vscale x 1 x i16> %a, <vscale x 1 x i16> %a, <vscale x 1 x i16> %b.splat) 640 ret <vscale x 1 x i16> %x 641} 642 643define <vscale x 1 x i16> @vror_vi_nxv1i16(<vscale x 1 x i16> %a) { 644; CHECK-LABEL: vror_vi_nxv1i16: 645; CHECK: # %bb.0: 646; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 647; CHECK-NEXT: vsll.vi v9, v8, 15 648; CHECK-NEXT: vsrl.vi v8, v8, 1 649; CHECK-NEXT: vor.vv v8, v8, v9 650; CHECK-NEXT: ret 651; 652; CHECK-ZVKB-LABEL: vror_vi_nxv1i16: 653; CHECK-ZVKB: # %bb.0: 654; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 655; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 656; CHECK-ZVKB-NEXT: ret 657 %x = call <vscale x 1 x i16> @llvm.fshr.nxv1i16(<vscale x 1 x i16> %a, <vscale x 1 x i16> %a, <vscale x 1 x i16> splat (i16 1)) 658 ret <vscale x 1 x i16> %x 659} 660 661define <vscale x 1 x i16> @vror_vi_rotl_nxv1i16(<vscale x 1 x i16> %a) { 662; CHECK-LABEL: vror_vi_rotl_nxv1i16: 663; CHECK: # %bb.0: 664; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 665; CHECK-NEXT: vsrl.vi v9, v8, 15 666; CHECK-NEXT: vadd.vv v8, v8, v8 667; CHECK-NEXT: vor.vv v8, v8, v9 668; CHECK-NEXT: ret 669; 670; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv1i16: 671; CHECK-ZVKB: # %bb.0: 672; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 673; CHECK-ZVKB-NEXT: vror.vi v8, v8, 15 674; CHECK-ZVKB-NEXT: ret 675 %x = call <vscale x 1 x i16> @llvm.fshl.nxv1i16(<vscale x 1 x i16> %a, <vscale x 1 x i16> %a, <vscale x 1 x i16> splat (i16 1)) 676 ret <vscale x 1 x i16> %x 677} 678 679declare <vscale x 2 x i16> @llvm.fshr.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>, <vscale x 2 x i16>) 680declare <vscale x 2 x i16> @llvm.fshl.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>, <vscale x 2 x i16>) 681 682define <vscale x 2 x i16> @vror_vv_nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %b) { 683; CHECK-LABEL: vror_vv_nxv2i16: 684; CHECK: # %bb.0: 685; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 686; CHECK-NEXT: vand.vi v10, v9, 15 687; CHECK-NEXT: vrsub.vi v9, v9, 0 688; CHECK-NEXT: vsrl.vv v10, v8, v10 689; CHECK-NEXT: vand.vi v9, v9, 15 690; CHECK-NEXT: vsll.vv v8, v8, v9 691; CHECK-NEXT: vor.vv v8, v10, v8 692; CHECK-NEXT: ret 693; 694; CHECK-ZVKB-LABEL: vror_vv_nxv2i16: 695; CHECK-ZVKB: # %bb.0: 696; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 697; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 698; CHECK-ZVKB-NEXT: ret 699 %x = call <vscale x 2 x i16> @llvm.fshr.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %a, <vscale x 2 x i16> %b) 700 ret <vscale x 2 x i16> %x 701} 702 703define <vscale x 2 x i16> @vror_vx_nxv2i16(<vscale x 2 x i16> %a, i16 %b) { 704; CHECK-LABEL: vror_vx_nxv2i16: 705; CHECK: # %bb.0: 706; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 707; CHECK-NEXT: vmv.v.x v9, a0 708; CHECK-NEXT: vand.vi v10, v9, 15 709; CHECK-NEXT: vrsub.vi v9, v9, 0 710; CHECK-NEXT: vsrl.vv v10, v8, v10 711; CHECK-NEXT: vand.vi v9, v9, 15 712; CHECK-NEXT: vsll.vv v8, v8, v9 713; CHECK-NEXT: vor.vv v8, v10, v8 714; CHECK-NEXT: ret 715; 716; CHECK-ZVKB-LABEL: vror_vx_nxv2i16: 717; CHECK-ZVKB: # %bb.0: 718; CHECK-ZVKB-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 719; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 720; CHECK-ZVKB-NEXT: ret 721 %b.head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0 722 %b.splat = shufflevector <vscale x 2 x i16> %b.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer 723 %x = call <vscale x 2 x i16> @llvm.fshr.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %a, <vscale x 2 x i16> %b.splat) 724 ret <vscale x 2 x i16> %x 725} 726 727define <vscale x 2 x i16> @vror_vi_nxv2i16(<vscale x 2 x i16> %a) { 728; CHECK-LABEL: vror_vi_nxv2i16: 729; CHECK: # %bb.0: 730; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 731; CHECK-NEXT: vsll.vi v9, v8, 15 732; CHECK-NEXT: vsrl.vi v8, v8, 1 733; CHECK-NEXT: vor.vv v8, v8, v9 734; CHECK-NEXT: ret 735; 736; CHECK-ZVKB-LABEL: vror_vi_nxv2i16: 737; CHECK-ZVKB: # %bb.0: 738; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 739; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 740; CHECK-ZVKB-NEXT: ret 741 %x = call <vscale x 2 x i16> @llvm.fshr.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %a, <vscale x 2 x i16> splat (i16 1)) 742 ret <vscale x 2 x i16> %x 743} 744 745define <vscale x 2 x i16> @vror_vi_rotl_nxv2i16(<vscale x 2 x i16> %a) { 746; CHECK-LABEL: vror_vi_rotl_nxv2i16: 747; CHECK: # %bb.0: 748; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 749; CHECK-NEXT: vsrl.vi v9, v8, 15 750; CHECK-NEXT: vadd.vv v8, v8, v8 751; CHECK-NEXT: vor.vv v8, v8, v9 752; CHECK-NEXT: ret 753; 754; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv2i16: 755; CHECK-ZVKB: # %bb.0: 756; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 757; CHECK-ZVKB-NEXT: vror.vi v8, v8, 15 758; CHECK-ZVKB-NEXT: ret 759 %x = call <vscale x 2 x i16> @llvm.fshl.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %a, <vscale x 2 x i16> splat (i16 1)) 760 ret <vscale x 2 x i16> %x 761} 762 763declare <vscale x 4 x i16> @llvm.fshr.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>, <vscale x 4 x i16>) 764declare <vscale x 4 x i16> @llvm.fshl.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>, <vscale x 4 x i16>) 765 766define <vscale x 4 x i16> @vror_vv_nxv4i16(<vscale x 4 x i16> %a, <vscale x 4 x i16> %b) { 767; CHECK-LABEL: vror_vv_nxv4i16: 768; CHECK: # %bb.0: 769; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 770; CHECK-NEXT: vand.vi v10, v9, 15 771; CHECK-NEXT: vrsub.vi v9, v9, 0 772; CHECK-NEXT: vsrl.vv v10, v8, v10 773; CHECK-NEXT: vand.vi v9, v9, 15 774; CHECK-NEXT: vsll.vv v8, v8, v9 775; CHECK-NEXT: vor.vv v8, v10, v8 776; CHECK-NEXT: ret 777; 778; CHECK-ZVKB-LABEL: vror_vv_nxv4i16: 779; CHECK-ZVKB: # %bb.0: 780; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m1, ta, ma 781; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 782; CHECK-ZVKB-NEXT: ret 783 %x = call <vscale x 4 x i16> @llvm.fshr.nxv4i16(<vscale x 4 x i16> %a, <vscale x 4 x i16> %a, <vscale x 4 x i16> %b) 784 ret <vscale x 4 x i16> %x 785} 786 787define <vscale x 4 x i16> @vror_vx_nxv4i16(<vscale x 4 x i16> %a, i16 %b) { 788; CHECK-LABEL: vror_vx_nxv4i16: 789; CHECK: # %bb.0: 790; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma 791; CHECK-NEXT: vmv.v.x v9, a0 792; CHECK-NEXT: vand.vi v10, v9, 15 793; CHECK-NEXT: vrsub.vi v9, v9, 0 794; CHECK-NEXT: vsrl.vv v10, v8, v10 795; CHECK-NEXT: vand.vi v9, v9, 15 796; CHECK-NEXT: vsll.vv v8, v8, v9 797; CHECK-NEXT: vor.vv v8, v10, v8 798; CHECK-NEXT: ret 799; 800; CHECK-ZVKB-LABEL: vror_vx_nxv4i16: 801; CHECK-ZVKB: # %bb.0: 802; CHECK-ZVKB-NEXT: vsetvli a1, zero, e16, m1, ta, ma 803; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 804; CHECK-ZVKB-NEXT: ret 805 %b.head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0 806 %b.splat = shufflevector <vscale x 4 x i16> %b.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer 807 %x = call <vscale x 4 x i16> @llvm.fshr.nxv4i16(<vscale x 4 x i16> %a, <vscale x 4 x i16> %a, <vscale x 4 x i16> %b.splat) 808 ret <vscale x 4 x i16> %x 809} 810 811define <vscale x 4 x i16> @vror_vi_nxv4i16(<vscale x 4 x i16> %a) { 812; CHECK-LABEL: vror_vi_nxv4i16: 813; CHECK: # %bb.0: 814; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 815; CHECK-NEXT: vsll.vi v9, v8, 15 816; CHECK-NEXT: vsrl.vi v8, v8, 1 817; CHECK-NEXT: vor.vv v8, v8, v9 818; CHECK-NEXT: ret 819; 820; CHECK-ZVKB-LABEL: vror_vi_nxv4i16: 821; CHECK-ZVKB: # %bb.0: 822; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m1, ta, ma 823; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 824; CHECK-ZVKB-NEXT: ret 825 %x = call <vscale x 4 x i16> @llvm.fshr.nxv4i16(<vscale x 4 x i16> %a, <vscale x 4 x i16> %a, <vscale x 4 x i16> splat (i16 1)) 826 ret <vscale x 4 x i16> %x 827} 828 829define <vscale x 4 x i16> @vror_vi_rotl_nxv4i16(<vscale x 4 x i16> %a) { 830; CHECK-LABEL: vror_vi_rotl_nxv4i16: 831; CHECK: # %bb.0: 832; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 833; CHECK-NEXT: vsrl.vi v9, v8, 15 834; CHECK-NEXT: vadd.vv v8, v8, v8 835; CHECK-NEXT: vor.vv v8, v8, v9 836; CHECK-NEXT: ret 837; 838; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv4i16: 839; CHECK-ZVKB: # %bb.0: 840; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m1, ta, ma 841; CHECK-ZVKB-NEXT: vror.vi v8, v8, 15 842; CHECK-ZVKB-NEXT: ret 843 %x = call <vscale x 4 x i16> @llvm.fshl.nxv4i16(<vscale x 4 x i16> %a, <vscale x 4 x i16> %a, <vscale x 4 x i16> splat (i16 1)) 844 ret <vscale x 4 x i16> %x 845} 846 847declare <vscale x 8 x i16> @llvm.fshr.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>) 848declare <vscale x 8 x i16> @llvm.fshl.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>) 849 850define <vscale x 8 x i16> @vror_vv_nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 851; CHECK-LABEL: vror_vv_nxv8i16: 852; CHECK: # %bb.0: 853; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 854; CHECK-NEXT: vand.vi v12, v10, 15 855; CHECK-NEXT: vrsub.vi v10, v10, 0 856; CHECK-NEXT: vsrl.vv v12, v8, v12 857; CHECK-NEXT: vand.vi v10, v10, 15 858; CHECK-NEXT: vsll.vv v8, v8, v10 859; CHECK-NEXT: vor.vv v8, v12, v8 860; CHECK-NEXT: ret 861; 862; CHECK-ZVKB-LABEL: vror_vv_nxv8i16: 863; CHECK-ZVKB: # %bb.0: 864; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m2, ta, ma 865; CHECK-ZVKB-NEXT: vror.vv v8, v8, v10 866; CHECK-ZVKB-NEXT: ret 867 %x = call <vscale x 8 x i16> @llvm.fshr.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 868 ret <vscale x 8 x i16> %x 869} 870 871define <vscale x 8 x i16> @vror_vx_nxv8i16(<vscale x 8 x i16> %a, i16 %b) { 872; CHECK-LABEL: vror_vx_nxv8i16: 873; CHECK: # %bb.0: 874; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 875; CHECK-NEXT: vmv.v.x v10, a0 876; CHECK-NEXT: vand.vi v12, v10, 15 877; CHECK-NEXT: vrsub.vi v10, v10, 0 878; CHECK-NEXT: vsrl.vv v12, v8, v12 879; CHECK-NEXT: vand.vi v10, v10, 15 880; CHECK-NEXT: vsll.vv v8, v8, v10 881; CHECK-NEXT: vor.vv v8, v12, v8 882; CHECK-NEXT: ret 883; 884; CHECK-ZVKB-LABEL: vror_vx_nxv8i16: 885; CHECK-ZVKB: # %bb.0: 886; CHECK-ZVKB-NEXT: vsetvli a1, zero, e16, m2, ta, ma 887; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 888; CHECK-ZVKB-NEXT: ret 889 %b.head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0 890 %b.splat = shufflevector <vscale x 8 x i16> %b.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 891 %x = call <vscale x 8 x i16> @llvm.fshr.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b.splat) 892 ret <vscale x 8 x i16> %x 893} 894 895define <vscale x 8 x i16> @vror_vi_nxv8i16(<vscale x 8 x i16> %a) { 896; CHECK-LABEL: vror_vi_nxv8i16: 897; CHECK: # %bb.0: 898; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 899; CHECK-NEXT: vsll.vi v10, v8, 15 900; CHECK-NEXT: vsrl.vi v8, v8, 1 901; CHECK-NEXT: vor.vv v8, v8, v10 902; CHECK-NEXT: ret 903; 904; CHECK-ZVKB-LABEL: vror_vi_nxv8i16: 905; CHECK-ZVKB: # %bb.0: 906; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m2, ta, ma 907; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 908; CHECK-ZVKB-NEXT: ret 909 %x = call <vscale x 8 x i16> @llvm.fshr.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %a, <vscale x 8 x i16> splat (i16 1)) 910 ret <vscale x 8 x i16> %x 911} 912 913define <vscale x 8 x i16> @vror_vi_rotl_nxv8i16(<vscale x 8 x i16> %a) { 914; CHECK-LABEL: vror_vi_rotl_nxv8i16: 915; CHECK: # %bb.0: 916; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 917; CHECK-NEXT: vsrl.vi v10, v8, 15 918; CHECK-NEXT: vadd.vv v8, v8, v8 919; CHECK-NEXT: vor.vv v8, v8, v10 920; CHECK-NEXT: ret 921; 922; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv8i16: 923; CHECK-ZVKB: # %bb.0: 924; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m2, ta, ma 925; CHECK-ZVKB-NEXT: vror.vi v8, v8, 15 926; CHECK-ZVKB-NEXT: ret 927 %x = call <vscale x 8 x i16> @llvm.fshl.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %a, <vscale x 8 x i16> splat (i16 1)) 928 ret <vscale x 8 x i16> %x 929} 930 931declare <vscale x 16 x i16> @llvm.fshr.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>, <vscale x 16 x i16>) 932declare <vscale x 16 x i16> @llvm.fshl.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>, <vscale x 16 x i16>) 933 934define <vscale x 16 x i16> @vror_vv_nxv16i16(<vscale x 16 x i16> %a, <vscale x 16 x i16> %b) { 935; CHECK-LABEL: vror_vv_nxv16i16: 936; CHECK: # %bb.0: 937; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 938; CHECK-NEXT: vand.vi v16, v12, 15 939; CHECK-NEXT: vrsub.vi v12, v12, 0 940; CHECK-NEXT: vsrl.vv v16, v8, v16 941; CHECK-NEXT: vand.vi v12, v12, 15 942; CHECK-NEXT: vsll.vv v8, v8, v12 943; CHECK-NEXT: vor.vv v8, v16, v8 944; CHECK-NEXT: ret 945; 946; CHECK-ZVKB-LABEL: vror_vv_nxv16i16: 947; CHECK-ZVKB: # %bb.0: 948; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m4, ta, ma 949; CHECK-ZVKB-NEXT: vror.vv v8, v8, v12 950; CHECK-ZVKB-NEXT: ret 951 %x = call <vscale x 16 x i16> @llvm.fshr.nxv16i16(<vscale x 16 x i16> %a, <vscale x 16 x i16> %a, <vscale x 16 x i16> %b) 952 ret <vscale x 16 x i16> %x 953} 954 955define <vscale x 16 x i16> @vror_vx_nxv16i16(<vscale x 16 x i16> %a, i16 %b) { 956; CHECK-LABEL: vror_vx_nxv16i16: 957; CHECK: # %bb.0: 958; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 959; CHECK-NEXT: vmv.v.x v12, a0 960; CHECK-NEXT: vand.vi v16, v12, 15 961; CHECK-NEXT: vrsub.vi v12, v12, 0 962; CHECK-NEXT: vsrl.vv v16, v8, v16 963; CHECK-NEXT: vand.vi v12, v12, 15 964; CHECK-NEXT: vsll.vv v8, v8, v12 965; CHECK-NEXT: vor.vv v8, v16, v8 966; CHECK-NEXT: ret 967; 968; CHECK-ZVKB-LABEL: vror_vx_nxv16i16: 969; CHECK-ZVKB: # %bb.0: 970; CHECK-ZVKB-NEXT: vsetvli a1, zero, e16, m4, ta, ma 971; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 972; CHECK-ZVKB-NEXT: ret 973 %b.head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0 974 %b.splat = shufflevector <vscale x 16 x i16> %b.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer 975 %x = call <vscale x 16 x i16> @llvm.fshr.nxv16i16(<vscale x 16 x i16> %a, <vscale x 16 x i16> %a, <vscale x 16 x i16> %b.splat) 976 ret <vscale x 16 x i16> %x 977} 978 979define <vscale x 16 x i16> @vror_vi_nxv16i16(<vscale x 16 x i16> %a) { 980; CHECK-LABEL: vror_vi_nxv16i16: 981; CHECK: # %bb.0: 982; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 983; CHECK-NEXT: vsll.vi v12, v8, 15 984; CHECK-NEXT: vsrl.vi v8, v8, 1 985; CHECK-NEXT: vor.vv v8, v8, v12 986; CHECK-NEXT: ret 987; 988; CHECK-ZVKB-LABEL: vror_vi_nxv16i16: 989; CHECK-ZVKB: # %bb.0: 990; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m4, ta, ma 991; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 992; CHECK-ZVKB-NEXT: ret 993 %x = call <vscale x 16 x i16> @llvm.fshr.nxv16i16(<vscale x 16 x i16> %a, <vscale x 16 x i16> %a, <vscale x 16 x i16> splat (i16 1)) 994 ret <vscale x 16 x i16> %x 995} 996 997define <vscale x 16 x i16> @vror_vi_rotl_nxv16i16(<vscale x 16 x i16> %a) { 998; CHECK-LABEL: vror_vi_rotl_nxv16i16: 999; CHECK: # %bb.0: 1000; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1001; CHECK-NEXT: vsrl.vi v12, v8, 15 1002; CHECK-NEXT: vadd.vv v8, v8, v8 1003; CHECK-NEXT: vor.vv v8, v8, v12 1004; CHECK-NEXT: ret 1005; 1006; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv16i16: 1007; CHECK-ZVKB: # %bb.0: 1008; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1009; CHECK-ZVKB-NEXT: vror.vi v8, v8, 15 1010; CHECK-ZVKB-NEXT: ret 1011 %x = call <vscale x 16 x i16> @llvm.fshl.nxv16i16(<vscale x 16 x i16> %a, <vscale x 16 x i16> %a, <vscale x 16 x i16> splat (i16 1)) 1012 ret <vscale x 16 x i16> %x 1013} 1014 1015declare <vscale x 32 x i16> @llvm.fshr.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>, <vscale x 32 x i16>) 1016declare <vscale x 32 x i16> @llvm.fshl.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>, <vscale x 32 x i16>) 1017 1018define <vscale x 32 x i16> @vror_vv_nxv32i16(<vscale x 32 x i16> %a, <vscale x 32 x i16> %b) { 1019; CHECK-LABEL: vror_vv_nxv32i16: 1020; CHECK: # %bb.0: 1021; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma 1022; CHECK-NEXT: vand.vi v24, v16, 15 1023; CHECK-NEXT: vrsub.vi v16, v16, 0 1024; CHECK-NEXT: vsrl.vv v24, v8, v24 1025; CHECK-NEXT: vand.vi v16, v16, 15 1026; CHECK-NEXT: vsll.vv v8, v8, v16 1027; CHECK-NEXT: vor.vv v8, v24, v8 1028; CHECK-NEXT: ret 1029; 1030; CHECK-ZVKB-LABEL: vror_vv_nxv32i16: 1031; CHECK-ZVKB: # %bb.0: 1032; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m8, ta, ma 1033; CHECK-ZVKB-NEXT: vror.vv v8, v8, v16 1034; CHECK-ZVKB-NEXT: ret 1035 %x = call <vscale x 32 x i16> @llvm.fshr.nxv32i16(<vscale x 32 x i16> %a, <vscale x 32 x i16> %a, <vscale x 32 x i16> %b) 1036 ret <vscale x 32 x i16> %x 1037} 1038 1039define <vscale x 32 x i16> @vror_vx_nxv32i16(<vscale x 32 x i16> %a, i16 %b) { 1040; CHECK-LABEL: vror_vx_nxv32i16: 1041; CHECK: # %bb.0: 1042; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma 1043; CHECK-NEXT: vmv.v.x v16, a0 1044; CHECK-NEXT: vand.vi v24, v16, 15 1045; CHECK-NEXT: vrsub.vi v16, v16, 0 1046; CHECK-NEXT: vsrl.vv v24, v8, v24 1047; CHECK-NEXT: vand.vi v16, v16, 15 1048; CHECK-NEXT: vsll.vv v8, v8, v16 1049; CHECK-NEXT: vor.vv v8, v24, v8 1050; CHECK-NEXT: ret 1051; 1052; CHECK-ZVKB-LABEL: vror_vx_nxv32i16: 1053; CHECK-ZVKB: # %bb.0: 1054; CHECK-ZVKB-NEXT: vsetvli a1, zero, e16, m8, ta, ma 1055; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1056; CHECK-ZVKB-NEXT: ret 1057 %b.head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0 1058 %b.splat = shufflevector <vscale x 32 x i16> %b.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer 1059 %x = call <vscale x 32 x i16> @llvm.fshr.nxv32i16(<vscale x 32 x i16> %a, <vscale x 32 x i16> %a, <vscale x 32 x i16> %b.splat) 1060 ret <vscale x 32 x i16> %x 1061} 1062 1063define <vscale x 32 x i16> @vror_vi_nxv32i16(<vscale x 32 x i16> %a) { 1064; CHECK-LABEL: vror_vi_nxv32i16: 1065; CHECK: # %bb.0: 1066; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma 1067; CHECK-NEXT: vsll.vi v16, v8, 15 1068; CHECK-NEXT: vsrl.vi v8, v8, 1 1069; CHECK-NEXT: vor.vv v8, v8, v16 1070; CHECK-NEXT: ret 1071; 1072; CHECK-ZVKB-LABEL: vror_vi_nxv32i16: 1073; CHECK-ZVKB: # %bb.0: 1074; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m8, ta, ma 1075; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1076; CHECK-ZVKB-NEXT: ret 1077 %x = call <vscale x 32 x i16> @llvm.fshr.nxv32i16(<vscale x 32 x i16> %a, <vscale x 32 x i16> %a, <vscale x 32 x i16> splat (i16 1)) 1078 ret <vscale x 32 x i16> %x 1079} 1080 1081define <vscale x 32 x i16> @vror_vi_rotl_nxv32i16(<vscale x 32 x i16> %a) { 1082; CHECK-LABEL: vror_vi_rotl_nxv32i16: 1083; CHECK: # %bb.0: 1084; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma 1085; CHECK-NEXT: vsrl.vi v16, v8, 15 1086; CHECK-NEXT: vadd.vv v8, v8, v8 1087; CHECK-NEXT: vor.vv v8, v8, v16 1088; CHECK-NEXT: ret 1089; 1090; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv32i16: 1091; CHECK-ZVKB: # %bb.0: 1092; CHECK-ZVKB-NEXT: vsetvli a0, zero, e16, m8, ta, ma 1093; CHECK-ZVKB-NEXT: vror.vi v8, v8, 15 1094; CHECK-ZVKB-NEXT: ret 1095 %x = call <vscale x 32 x i16> @llvm.fshl.nxv32i16(<vscale x 32 x i16> %a, <vscale x 32 x i16> %a, <vscale x 32 x i16> splat (i16 1)) 1096 ret <vscale x 32 x i16> %x 1097} 1098 1099declare <vscale x 1 x i32> @llvm.fshr.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>, <vscale x 1 x i32>) 1100declare <vscale x 1 x i32> @llvm.fshl.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>, <vscale x 1 x i32>) 1101 1102define <vscale x 1 x i32> @vror_vv_nxv1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %b) { 1103; CHECK-LABEL: vror_vv_nxv1i32: 1104; CHECK: # %bb.0: 1105; CHECK-NEXT: li a0, 31 1106; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 1107; CHECK-NEXT: vrsub.vi v10, v9, 0 1108; CHECK-NEXT: vand.vx v9, v9, a0 1109; CHECK-NEXT: vand.vx v10, v10, a0 1110; CHECK-NEXT: vsrl.vv v9, v8, v9 1111; CHECK-NEXT: vsll.vv v8, v8, v10 1112; CHECK-NEXT: vor.vv v8, v9, v8 1113; CHECK-NEXT: ret 1114; 1115; CHECK-ZVKB-LABEL: vror_vv_nxv1i32: 1116; CHECK-ZVKB: # %bb.0: 1117; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1118; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 1119; CHECK-ZVKB-NEXT: ret 1120 %x = call <vscale x 1 x i32> @llvm.fshr.nxv1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %a, <vscale x 1 x i32> %b) 1121 ret <vscale x 1 x i32> %x 1122} 1123 1124define <vscale x 1 x i32> @vror_vx_nxv1i32(<vscale x 1 x i32> %a, i32 %b) { 1125; CHECK-RV32-LABEL: vror_vx_nxv1i32: 1126; CHECK-RV32: # %bb.0: 1127; CHECK-RV32-NEXT: andi a1, a0, 31 1128; CHECK-RV32-NEXT: neg a0, a0 1129; CHECK-RV32-NEXT: vsetvli a2, zero, e32, mf2, ta, ma 1130; CHECK-RV32-NEXT: vsrl.vx v9, v8, a1 1131; CHECK-RV32-NEXT: andi a0, a0, 31 1132; CHECK-RV32-NEXT: vsll.vx v8, v8, a0 1133; CHECK-RV32-NEXT: vor.vv v8, v9, v8 1134; CHECK-RV32-NEXT: ret 1135; 1136; CHECK-RV64-LABEL: vror_vx_nxv1i32: 1137; CHECK-RV64: # %bb.0: 1138; CHECK-RV64-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 1139; CHECK-RV64-NEXT: vmv.v.x v9, a0 1140; CHECK-RV64-NEXT: li a0, 31 1141; CHECK-RV64-NEXT: vand.vx v10, v9, a0 1142; CHECK-RV64-NEXT: vrsub.vi v9, v9, 0 1143; CHECK-RV64-NEXT: vsrl.vv v10, v8, v10 1144; CHECK-RV64-NEXT: vand.vx v9, v9, a0 1145; CHECK-RV64-NEXT: vsll.vv v8, v8, v9 1146; CHECK-RV64-NEXT: vor.vv v8, v10, v8 1147; CHECK-RV64-NEXT: ret 1148; 1149; CHECK-ZVKB-LABEL: vror_vx_nxv1i32: 1150; CHECK-ZVKB: # %bb.0: 1151; CHECK-ZVKB-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 1152; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1153; CHECK-ZVKB-NEXT: ret 1154 %b.head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0 1155 %b.splat = shufflevector <vscale x 1 x i32> %b.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer 1156 %x = call <vscale x 1 x i32> @llvm.fshr.nxv1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %a, <vscale x 1 x i32> %b.splat) 1157 ret <vscale x 1 x i32> %x 1158} 1159 1160define <vscale x 1 x i32> @vror_vi_nxv1i32(<vscale x 1 x i32> %a) { 1161; CHECK-LABEL: vror_vi_nxv1i32: 1162; CHECK: # %bb.0: 1163; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1164; CHECK-NEXT: vsll.vi v9, v8, 31 1165; CHECK-NEXT: vsrl.vi v8, v8, 1 1166; CHECK-NEXT: vor.vv v8, v8, v9 1167; CHECK-NEXT: ret 1168; 1169; CHECK-ZVKB-LABEL: vror_vi_nxv1i32: 1170; CHECK-ZVKB: # %bb.0: 1171; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1172; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1173; CHECK-ZVKB-NEXT: ret 1174 %x = call <vscale x 1 x i32> @llvm.fshr.nxv1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %a, <vscale x 1 x i32> splat (i32 1)) 1175 ret <vscale x 1 x i32> %x 1176} 1177 1178define <vscale x 1 x i32> @vror_vi_rotl_nxv1i32(<vscale x 1 x i32> %a) { 1179; CHECK-LABEL: vror_vi_rotl_nxv1i32: 1180; CHECK: # %bb.0: 1181; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1182; CHECK-NEXT: vsrl.vi v9, v8, 31 1183; CHECK-NEXT: vadd.vv v8, v8, v8 1184; CHECK-NEXT: vor.vv v8, v8, v9 1185; CHECK-NEXT: ret 1186; 1187; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv1i32: 1188; CHECK-ZVKB: # %bb.0: 1189; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1190; CHECK-ZVKB-NEXT: vror.vi v8, v8, 31 1191; CHECK-ZVKB-NEXT: ret 1192 %x = call <vscale x 1 x i32> @llvm.fshl.nxv1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %a, <vscale x 1 x i32> splat (i32 1)) 1193 ret <vscale x 1 x i32> %x 1194} 1195 1196declare <vscale x 2 x i32> @llvm.fshr.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32>) 1197declare <vscale x 2 x i32> @llvm.fshl.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32>) 1198 1199define <vscale x 2 x i32> @vror_vv_nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b) { 1200; CHECK-LABEL: vror_vv_nxv2i32: 1201; CHECK: # %bb.0: 1202; CHECK-NEXT: li a0, 31 1203; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma 1204; CHECK-NEXT: vrsub.vi v10, v9, 0 1205; CHECK-NEXT: vand.vx v9, v9, a0 1206; CHECK-NEXT: vand.vx v10, v10, a0 1207; CHECK-NEXT: vsrl.vv v9, v8, v9 1208; CHECK-NEXT: vsll.vv v8, v8, v10 1209; CHECK-NEXT: vor.vv v8, v9, v8 1210; CHECK-NEXT: ret 1211; 1212; CHECK-ZVKB-LABEL: vror_vv_nxv2i32: 1213; CHECK-ZVKB: # %bb.0: 1214; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1215; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 1216; CHECK-ZVKB-NEXT: ret 1217 %x = call <vscale x 2 x i32> @llvm.fshr.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i32> %a, <vscale x 2 x i32> %b) 1218 ret <vscale x 2 x i32> %x 1219} 1220 1221define <vscale x 2 x i32> @vror_vx_nxv2i32(<vscale x 2 x i32> %a, i32 %b) { 1222; CHECK-RV32-LABEL: vror_vx_nxv2i32: 1223; CHECK-RV32: # %bb.0: 1224; CHECK-RV32-NEXT: andi a1, a0, 31 1225; CHECK-RV32-NEXT: neg a0, a0 1226; CHECK-RV32-NEXT: vsetvli a2, zero, e32, m1, ta, ma 1227; CHECK-RV32-NEXT: vsrl.vx v9, v8, a1 1228; CHECK-RV32-NEXT: andi a0, a0, 31 1229; CHECK-RV32-NEXT: vsll.vx v8, v8, a0 1230; CHECK-RV32-NEXT: vor.vv v8, v9, v8 1231; CHECK-RV32-NEXT: ret 1232; 1233; CHECK-RV64-LABEL: vror_vx_nxv2i32: 1234; CHECK-RV64: # %bb.0: 1235; CHECK-RV64-NEXT: vsetvli a1, zero, e32, m1, ta, ma 1236; CHECK-RV64-NEXT: vmv.v.x v9, a0 1237; CHECK-RV64-NEXT: li a0, 31 1238; CHECK-RV64-NEXT: vand.vx v10, v9, a0 1239; CHECK-RV64-NEXT: vrsub.vi v9, v9, 0 1240; CHECK-RV64-NEXT: vsrl.vv v10, v8, v10 1241; CHECK-RV64-NEXT: vand.vx v9, v9, a0 1242; CHECK-RV64-NEXT: vsll.vv v8, v8, v9 1243; CHECK-RV64-NEXT: vor.vv v8, v10, v8 1244; CHECK-RV64-NEXT: ret 1245; 1246; CHECK-ZVKB-LABEL: vror_vx_nxv2i32: 1247; CHECK-ZVKB: # %bb.0: 1248; CHECK-ZVKB-NEXT: vsetvli a1, zero, e32, m1, ta, ma 1249; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1250; CHECK-ZVKB-NEXT: ret 1251 %b.head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0 1252 %b.splat = shufflevector <vscale x 2 x i32> %b.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer 1253 %x = call <vscale x 2 x i32> @llvm.fshr.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i32> %a, <vscale x 2 x i32> %b.splat) 1254 ret <vscale x 2 x i32> %x 1255} 1256 1257define <vscale x 2 x i32> @vror_vi_nxv2i32(<vscale x 2 x i32> %a) { 1258; CHECK-LABEL: vror_vi_nxv2i32: 1259; CHECK: # %bb.0: 1260; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1261; CHECK-NEXT: vsll.vi v9, v8, 31 1262; CHECK-NEXT: vsrl.vi v8, v8, 1 1263; CHECK-NEXT: vor.vv v8, v8, v9 1264; CHECK-NEXT: ret 1265; 1266; CHECK-ZVKB-LABEL: vror_vi_nxv2i32: 1267; CHECK-ZVKB: # %bb.0: 1268; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1269; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1270; CHECK-ZVKB-NEXT: ret 1271 %x = call <vscale x 2 x i32> @llvm.fshr.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i32> %a, <vscale x 2 x i32> splat (i32 1)) 1272 ret <vscale x 2 x i32> %x 1273} 1274 1275define <vscale x 2 x i32> @vror_vi_rotl_nxv2i32(<vscale x 2 x i32> %a) { 1276; CHECK-LABEL: vror_vi_rotl_nxv2i32: 1277; CHECK: # %bb.0: 1278; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1279; CHECK-NEXT: vsrl.vi v9, v8, 31 1280; CHECK-NEXT: vadd.vv v8, v8, v8 1281; CHECK-NEXT: vor.vv v8, v8, v9 1282; CHECK-NEXT: ret 1283; 1284; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv2i32: 1285; CHECK-ZVKB: # %bb.0: 1286; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1287; CHECK-ZVKB-NEXT: vror.vi v8, v8, 31 1288; CHECK-ZVKB-NEXT: ret 1289 %x = call <vscale x 2 x i32> @llvm.fshl.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i32> %a, <vscale x 2 x i32> splat (i32 1)) 1290 ret <vscale x 2 x i32> %x 1291} 1292 1293declare <vscale x 4 x i32> @llvm.fshr.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>) 1294declare <vscale x 4 x i32> @llvm.fshl.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>) 1295 1296define <vscale x 4 x i32> @vror_vv_nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 1297; CHECK-LABEL: vror_vv_nxv4i32: 1298; CHECK: # %bb.0: 1299; CHECK-NEXT: li a0, 31 1300; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1301; CHECK-NEXT: vrsub.vi v12, v10, 0 1302; CHECK-NEXT: vand.vx v10, v10, a0 1303; CHECK-NEXT: vand.vx v12, v12, a0 1304; CHECK-NEXT: vsrl.vv v10, v8, v10 1305; CHECK-NEXT: vsll.vv v8, v8, v12 1306; CHECK-NEXT: vor.vv v8, v10, v8 1307; CHECK-NEXT: ret 1308; 1309; CHECK-ZVKB-LABEL: vror_vv_nxv4i32: 1310; CHECK-ZVKB: # %bb.0: 1311; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1312; CHECK-ZVKB-NEXT: vror.vv v8, v8, v10 1313; CHECK-ZVKB-NEXT: ret 1314 %x = call <vscale x 4 x i32> @llvm.fshr.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 1315 ret <vscale x 4 x i32> %x 1316} 1317 1318define <vscale x 4 x i32> @vror_vx_nxv4i32(<vscale x 4 x i32> %a, i32 %b) { 1319; CHECK-RV32-LABEL: vror_vx_nxv4i32: 1320; CHECK-RV32: # %bb.0: 1321; CHECK-RV32-NEXT: andi a1, a0, 31 1322; CHECK-RV32-NEXT: neg a0, a0 1323; CHECK-RV32-NEXT: vsetvli a2, zero, e32, m2, ta, ma 1324; CHECK-RV32-NEXT: vsrl.vx v10, v8, a1 1325; CHECK-RV32-NEXT: andi a0, a0, 31 1326; CHECK-RV32-NEXT: vsll.vx v8, v8, a0 1327; CHECK-RV32-NEXT: vor.vv v8, v10, v8 1328; CHECK-RV32-NEXT: ret 1329; 1330; CHECK-RV64-LABEL: vror_vx_nxv4i32: 1331; CHECK-RV64: # %bb.0: 1332; CHECK-RV64-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1333; CHECK-RV64-NEXT: vmv.v.x v10, a0 1334; CHECK-RV64-NEXT: li a0, 31 1335; CHECK-RV64-NEXT: vand.vx v12, v10, a0 1336; CHECK-RV64-NEXT: vrsub.vi v10, v10, 0 1337; CHECK-RV64-NEXT: vsrl.vv v12, v8, v12 1338; CHECK-RV64-NEXT: vand.vx v10, v10, a0 1339; CHECK-RV64-NEXT: vsll.vv v8, v8, v10 1340; CHECK-RV64-NEXT: vor.vv v8, v12, v8 1341; CHECK-RV64-NEXT: ret 1342; 1343; CHECK-ZVKB-LABEL: vror_vx_nxv4i32: 1344; CHECK-ZVKB: # %bb.0: 1345; CHECK-ZVKB-NEXT: vsetvli a1, zero, e32, m2, ta, ma 1346; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1347; CHECK-ZVKB-NEXT: ret 1348 %b.head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0 1349 %b.splat = shufflevector <vscale x 4 x i32> %b.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 1350 %x = call <vscale x 4 x i32> @llvm.fshr.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b.splat) 1351 ret <vscale x 4 x i32> %x 1352} 1353 1354define <vscale x 4 x i32> @vror_vi_nxv4i32(<vscale x 4 x i32> %a) { 1355; CHECK-LABEL: vror_vi_nxv4i32: 1356; CHECK: # %bb.0: 1357; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1358; CHECK-NEXT: vsll.vi v10, v8, 31 1359; CHECK-NEXT: vsrl.vi v8, v8, 1 1360; CHECK-NEXT: vor.vv v8, v8, v10 1361; CHECK-NEXT: ret 1362; 1363; CHECK-ZVKB-LABEL: vror_vi_nxv4i32: 1364; CHECK-ZVKB: # %bb.0: 1365; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1366; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1367; CHECK-ZVKB-NEXT: ret 1368 %x = call <vscale x 4 x i32> @llvm.fshr.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> splat (i32 1)) 1369 ret <vscale x 4 x i32> %x 1370} 1371 1372define <vscale x 4 x i32> @vror_vi_rotl_nxv4i32(<vscale x 4 x i32> %a) { 1373; CHECK-LABEL: vror_vi_rotl_nxv4i32: 1374; CHECK: # %bb.0: 1375; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1376; CHECK-NEXT: vsrl.vi v10, v8, 31 1377; CHECK-NEXT: vadd.vv v8, v8, v8 1378; CHECK-NEXT: vor.vv v8, v8, v10 1379; CHECK-NEXT: ret 1380; 1381; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv4i32: 1382; CHECK-ZVKB: # %bb.0: 1383; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1384; CHECK-ZVKB-NEXT: vror.vi v8, v8, 31 1385; CHECK-ZVKB-NEXT: ret 1386 %x = call <vscale x 4 x i32> @llvm.fshl.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> splat (i32 1)) 1387 ret <vscale x 4 x i32> %x 1388} 1389 1390declare <vscale x 8 x i32> @llvm.fshr.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>, <vscale x 8 x i32>) 1391declare <vscale x 8 x i32> @llvm.fshl.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>, <vscale x 8 x i32>) 1392 1393define <vscale x 8 x i32> @vror_vv_nxv8i32(<vscale x 8 x i32> %a, <vscale x 8 x i32> %b) { 1394; CHECK-LABEL: vror_vv_nxv8i32: 1395; CHECK: # %bb.0: 1396; CHECK-NEXT: li a0, 31 1397; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma 1398; CHECK-NEXT: vrsub.vi v16, v12, 0 1399; CHECK-NEXT: vand.vx v12, v12, a0 1400; CHECK-NEXT: vand.vx v16, v16, a0 1401; CHECK-NEXT: vsrl.vv v12, v8, v12 1402; CHECK-NEXT: vsll.vv v8, v8, v16 1403; CHECK-NEXT: vor.vv v8, v12, v8 1404; CHECK-NEXT: ret 1405; 1406; CHECK-ZVKB-LABEL: vror_vv_nxv8i32: 1407; CHECK-ZVKB: # %bb.0: 1408; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1409; CHECK-ZVKB-NEXT: vror.vv v8, v8, v12 1410; CHECK-ZVKB-NEXT: ret 1411 %x = call <vscale x 8 x i32> @llvm.fshr.nxv8i32(<vscale x 8 x i32> %a, <vscale x 8 x i32> %a, <vscale x 8 x i32> %b) 1412 ret <vscale x 8 x i32> %x 1413} 1414 1415define <vscale x 8 x i32> @vror_vx_nxv8i32(<vscale x 8 x i32> %a, i32 %b) { 1416; CHECK-RV32-LABEL: vror_vx_nxv8i32: 1417; CHECK-RV32: # %bb.0: 1418; CHECK-RV32-NEXT: andi a1, a0, 31 1419; CHECK-RV32-NEXT: neg a0, a0 1420; CHECK-RV32-NEXT: vsetvli a2, zero, e32, m4, ta, ma 1421; CHECK-RV32-NEXT: vsrl.vx v12, v8, a1 1422; CHECK-RV32-NEXT: andi a0, a0, 31 1423; CHECK-RV32-NEXT: vsll.vx v8, v8, a0 1424; CHECK-RV32-NEXT: vor.vv v8, v12, v8 1425; CHECK-RV32-NEXT: ret 1426; 1427; CHECK-RV64-LABEL: vror_vx_nxv8i32: 1428; CHECK-RV64: # %bb.0: 1429; CHECK-RV64-NEXT: vsetvli a1, zero, e32, m4, ta, ma 1430; CHECK-RV64-NEXT: vmv.v.x v12, a0 1431; CHECK-RV64-NEXT: li a0, 31 1432; CHECK-RV64-NEXT: vand.vx v16, v12, a0 1433; CHECK-RV64-NEXT: vrsub.vi v12, v12, 0 1434; CHECK-RV64-NEXT: vsrl.vv v16, v8, v16 1435; CHECK-RV64-NEXT: vand.vx v12, v12, a0 1436; CHECK-RV64-NEXT: vsll.vv v8, v8, v12 1437; CHECK-RV64-NEXT: vor.vv v8, v16, v8 1438; CHECK-RV64-NEXT: ret 1439; 1440; CHECK-ZVKB-LABEL: vror_vx_nxv8i32: 1441; CHECK-ZVKB: # %bb.0: 1442; CHECK-ZVKB-NEXT: vsetvli a1, zero, e32, m4, ta, ma 1443; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1444; CHECK-ZVKB-NEXT: ret 1445 %b.head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0 1446 %b.splat = shufflevector <vscale x 8 x i32> %b.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 1447 %x = call <vscale x 8 x i32> @llvm.fshr.nxv8i32(<vscale x 8 x i32> %a, <vscale x 8 x i32> %a, <vscale x 8 x i32> %b.splat) 1448 ret <vscale x 8 x i32> %x 1449} 1450 1451define <vscale x 8 x i32> @vror_vi_nxv8i32(<vscale x 8 x i32> %a) { 1452; CHECK-LABEL: vror_vi_nxv8i32: 1453; CHECK: # %bb.0: 1454; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1455; CHECK-NEXT: vsll.vi v12, v8, 31 1456; CHECK-NEXT: vsrl.vi v8, v8, 1 1457; CHECK-NEXT: vor.vv v8, v8, v12 1458; CHECK-NEXT: ret 1459; 1460; CHECK-ZVKB-LABEL: vror_vi_nxv8i32: 1461; CHECK-ZVKB: # %bb.0: 1462; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1463; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1464; CHECK-ZVKB-NEXT: ret 1465 %x = call <vscale x 8 x i32> @llvm.fshr.nxv8i32(<vscale x 8 x i32> %a, <vscale x 8 x i32> %a, <vscale x 8 x i32> splat (i32 1)) 1466 ret <vscale x 8 x i32> %x 1467} 1468 1469define <vscale x 8 x i32> @vror_vi_rotl_nxv8i32(<vscale x 8 x i32> %a) { 1470; CHECK-LABEL: vror_vi_rotl_nxv8i32: 1471; CHECK: # %bb.0: 1472; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1473; CHECK-NEXT: vsrl.vi v12, v8, 31 1474; CHECK-NEXT: vadd.vv v8, v8, v8 1475; CHECK-NEXT: vor.vv v8, v8, v12 1476; CHECK-NEXT: ret 1477; 1478; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv8i32: 1479; CHECK-ZVKB: # %bb.0: 1480; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1481; CHECK-ZVKB-NEXT: vror.vi v8, v8, 31 1482; CHECK-ZVKB-NEXT: ret 1483 %x = call <vscale x 8 x i32> @llvm.fshl.nxv8i32(<vscale x 8 x i32> %a, <vscale x 8 x i32> %a, <vscale x 8 x i32> splat (i32 1)) 1484 ret <vscale x 8 x i32> %x 1485} 1486 1487declare <vscale x 16 x i32> @llvm.fshr.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>, <vscale x 16 x i32>) 1488declare <vscale x 16 x i32> @llvm.fshl.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>, <vscale x 16 x i32>) 1489 1490define <vscale x 16 x i32> @vror_vv_nxv16i32(<vscale x 16 x i32> %a, <vscale x 16 x i32> %b) { 1491; CHECK-LABEL: vror_vv_nxv16i32: 1492; CHECK: # %bb.0: 1493; CHECK-NEXT: li a0, 31 1494; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma 1495; CHECK-NEXT: vrsub.vi v24, v16, 0 1496; CHECK-NEXT: vand.vx v16, v16, a0 1497; CHECK-NEXT: vand.vx v24, v24, a0 1498; CHECK-NEXT: vsrl.vv v16, v8, v16 1499; CHECK-NEXT: vsll.vv v8, v8, v24 1500; CHECK-NEXT: vor.vv v8, v16, v8 1501; CHECK-NEXT: ret 1502; 1503; CHECK-ZVKB-LABEL: vror_vv_nxv16i32: 1504; CHECK-ZVKB: # %bb.0: 1505; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m8, ta, ma 1506; CHECK-ZVKB-NEXT: vror.vv v8, v8, v16 1507; CHECK-ZVKB-NEXT: ret 1508 %x = call <vscale x 16 x i32> @llvm.fshr.nxv16i32(<vscale x 16 x i32> %a, <vscale x 16 x i32> %a, <vscale x 16 x i32> %b) 1509 ret <vscale x 16 x i32> %x 1510} 1511 1512define <vscale x 16 x i32> @vror_vx_nxv16i32(<vscale x 16 x i32> %a, i32 %b) { 1513; CHECK-RV32-LABEL: vror_vx_nxv16i32: 1514; CHECK-RV32: # %bb.0: 1515; CHECK-RV32-NEXT: andi a1, a0, 31 1516; CHECK-RV32-NEXT: neg a0, a0 1517; CHECK-RV32-NEXT: vsetvli a2, zero, e32, m8, ta, ma 1518; CHECK-RV32-NEXT: vsrl.vx v16, v8, a1 1519; CHECK-RV32-NEXT: andi a0, a0, 31 1520; CHECK-RV32-NEXT: vsll.vx v8, v8, a0 1521; CHECK-RV32-NEXT: vor.vv v8, v16, v8 1522; CHECK-RV32-NEXT: ret 1523; 1524; CHECK-RV64-LABEL: vror_vx_nxv16i32: 1525; CHECK-RV64: # %bb.0: 1526; CHECK-RV64-NEXT: vsetvli a1, zero, e32, m8, ta, ma 1527; CHECK-RV64-NEXT: vmv.v.x v16, a0 1528; CHECK-RV64-NEXT: li a0, 31 1529; CHECK-RV64-NEXT: vand.vx v24, v16, a0 1530; CHECK-RV64-NEXT: vrsub.vi v16, v16, 0 1531; CHECK-RV64-NEXT: vsrl.vv v24, v8, v24 1532; CHECK-RV64-NEXT: vand.vx v16, v16, a0 1533; CHECK-RV64-NEXT: vsll.vv v8, v8, v16 1534; CHECK-RV64-NEXT: vor.vv v8, v24, v8 1535; CHECK-RV64-NEXT: ret 1536; 1537; CHECK-ZVKB-LABEL: vror_vx_nxv16i32: 1538; CHECK-ZVKB: # %bb.0: 1539; CHECK-ZVKB-NEXT: vsetvli a1, zero, e32, m8, ta, ma 1540; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1541; CHECK-ZVKB-NEXT: ret 1542 %b.head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0 1543 %b.splat = shufflevector <vscale x 16 x i32> %b.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer 1544 %x = call <vscale x 16 x i32> @llvm.fshr.nxv16i32(<vscale x 16 x i32> %a, <vscale x 16 x i32> %a, <vscale x 16 x i32> %b.splat) 1545 ret <vscale x 16 x i32> %x 1546} 1547 1548define <vscale x 16 x i32> @vror_vi_nxv16i32(<vscale x 16 x i32> %a) { 1549; CHECK-LABEL: vror_vi_nxv16i32: 1550; CHECK: # %bb.0: 1551; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 1552; CHECK-NEXT: vsll.vi v16, v8, 31 1553; CHECK-NEXT: vsrl.vi v8, v8, 1 1554; CHECK-NEXT: vor.vv v8, v8, v16 1555; CHECK-NEXT: ret 1556; 1557; CHECK-ZVKB-LABEL: vror_vi_nxv16i32: 1558; CHECK-ZVKB: # %bb.0: 1559; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m8, ta, ma 1560; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1561; CHECK-ZVKB-NEXT: ret 1562 %x = call <vscale x 16 x i32> @llvm.fshr.nxv16i32(<vscale x 16 x i32> %a, <vscale x 16 x i32> %a, <vscale x 16 x i32> splat (i32 1)) 1563 ret <vscale x 16 x i32> %x 1564} 1565 1566define <vscale x 16 x i32> @vror_vi_rotl_nxv16i32(<vscale x 16 x i32> %a) { 1567; CHECK-LABEL: vror_vi_rotl_nxv16i32: 1568; CHECK: # %bb.0: 1569; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 1570; CHECK-NEXT: vsrl.vi v16, v8, 31 1571; CHECK-NEXT: vadd.vv v8, v8, v8 1572; CHECK-NEXT: vor.vv v8, v8, v16 1573; CHECK-NEXT: ret 1574; 1575; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv16i32: 1576; CHECK-ZVKB: # %bb.0: 1577; CHECK-ZVKB-NEXT: vsetvli a0, zero, e32, m8, ta, ma 1578; CHECK-ZVKB-NEXT: vror.vi v8, v8, 31 1579; CHECK-ZVKB-NEXT: ret 1580 %x = call <vscale x 16 x i32> @llvm.fshl.nxv16i32(<vscale x 16 x i32> %a, <vscale x 16 x i32> %a, <vscale x 16 x i32> splat (i32 1)) 1581 ret <vscale x 16 x i32> %x 1582} 1583 1584declare <vscale x 1 x i64> @llvm.fshr.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>, <vscale x 1 x i64>) 1585declare <vscale x 1 x i64> @llvm.fshl.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>, <vscale x 1 x i64>) 1586 1587define <vscale x 1 x i64> @vror_vv_nxv1i64(<vscale x 1 x i64> %a, <vscale x 1 x i64> %b) { 1588; CHECK-LABEL: vror_vv_nxv1i64: 1589; CHECK: # %bb.0: 1590; CHECK-NEXT: li a0, 63 1591; CHECK-NEXT: vsetvli a1, zero, e64, m1, ta, ma 1592; CHECK-NEXT: vrsub.vi v10, v9, 0 1593; CHECK-NEXT: vand.vx v9, v9, a0 1594; CHECK-NEXT: vand.vx v10, v10, a0 1595; CHECK-NEXT: vsrl.vv v9, v8, v9 1596; CHECK-NEXT: vsll.vv v8, v8, v10 1597; CHECK-NEXT: vor.vv v8, v9, v8 1598; CHECK-NEXT: ret 1599; 1600; CHECK-ZVKB-LABEL: vror_vv_nxv1i64: 1601; CHECK-ZVKB: # %bb.0: 1602; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m1, ta, ma 1603; CHECK-ZVKB-NEXT: vror.vv v8, v8, v9 1604; CHECK-ZVKB-NEXT: ret 1605 %x = call <vscale x 1 x i64> @llvm.fshr.nxv1i64(<vscale x 1 x i64> %a, <vscale x 1 x i64> %a, <vscale x 1 x i64> %b) 1606 ret <vscale x 1 x i64> %x 1607} 1608 1609define <vscale x 1 x i64> @vror_vx_nxv1i64(<vscale x 1 x i64> %a, i64 %b) { 1610; CHECK-RV32-LABEL: vror_vx_nxv1i64: 1611; CHECK-RV32: # %bb.0: 1612; CHECK-RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma 1613; CHECK-RV32-NEXT: vmv.v.x v9, a0 1614; CHECK-RV32-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 1615; CHECK-RV32-NEXT: vmv.v.i v10, 0 1616; CHECK-RV32-NEXT: vwsub.vx v11, v10, a0 1617; CHECK-RV32-NEXT: li a0, 63 1618; CHECK-RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma 1619; CHECK-RV32-NEXT: vand.vx v9, v9, a0 1620; CHECK-RV32-NEXT: vand.vx v10, v11, a0 1621; CHECK-RV32-NEXT: vsll.vv v10, v8, v10 1622; CHECK-RV32-NEXT: vsrl.vv v8, v8, v9 1623; CHECK-RV32-NEXT: vor.vv v8, v8, v10 1624; CHECK-RV32-NEXT: ret 1625; 1626; CHECK-RV64-LABEL: vror_vx_nxv1i64: 1627; CHECK-RV64: # %bb.0: 1628; CHECK-RV64-NEXT: andi a1, a0, 63 1629; CHECK-RV64-NEXT: negw a0, a0 1630; CHECK-RV64-NEXT: vsetvli a2, zero, e64, m1, ta, ma 1631; CHECK-RV64-NEXT: vsrl.vx v9, v8, a1 1632; CHECK-RV64-NEXT: andi a0, a0, 63 1633; CHECK-RV64-NEXT: vsll.vx v8, v8, a0 1634; CHECK-RV64-NEXT: vor.vv v8, v9, v8 1635; CHECK-RV64-NEXT: ret 1636; 1637; CHECK-ZVKB-LABEL: vror_vx_nxv1i64: 1638; CHECK-ZVKB: # %bb.0: 1639; CHECK-ZVKB-NEXT: vsetvli a1, zero, e64, m1, ta, ma 1640; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1641; CHECK-ZVKB-NEXT: ret 1642 %b.head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0 1643 %b.splat = shufflevector <vscale x 1 x i64> %b.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer 1644 %x = call <vscale x 1 x i64> @llvm.fshr.nxv1i64(<vscale x 1 x i64> %a, <vscale x 1 x i64> %a, <vscale x 1 x i64> %b.splat) 1645 ret <vscale x 1 x i64> %x 1646} 1647 1648define <vscale x 1 x i64> @vror_vi_nxv1i64(<vscale x 1 x i64> %a) { 1649; CHECK-LABEL: vror_vi_nxv1i64: 1650; CHECK: # %bb.0: 1651; CHECK-NEXT: li a0, 63 1652; CHECK-NEXT: vsetvli a1, zero, e64, m1, ta, ma 1653; CHECK-NEXT: vsll.vx v9, v8, a0 1654; CHECK-NEXT: vsrl.vi v8, v8, 1 1655; CHECK-NEXT: vor.vv v8, v8, v9 1656; CHECK-NEXT: ret 1657; 1658; CHECK-ZVKB-LABEL: vror_vi_nxv1i64: 1659; CHECK-ZVKB: # %bb.0: 1660; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m1, ta, ma 1661; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1662; CHECK-ZVKB-NEXT: ret 1663 %x = call <vscale x 1 x i64> @llvm.fshr.nxv1i64(<vscale x 1 x i64> %a, <vscale x 1 x i64> %a, <vscale x 1 x i64> splat (i64 1)) 1664 ret <vscale x 1 x i64> %x 1665} 1666 1667define <vscale x 1 x i64> @vror_vi_rotl_nxv1i64(<vscale x 1 x i64> %a) { 1668; CHECK-LABEL: vror_vi_rotl_nxv1i64: 1669; CHECK: # %bb.0: 1670; CHECK-NEXT: li a0, 63 1671; CHECK-NEXT: vsetvli a1, zero, e64, m1, ta, ma 1672; CHECK-NEXT: vsrl.vx v9, v8, a0 1673; CHECK-NEXT: vadd.vv v8, v8, v8 1674; CHECK-NEXT: vor.vv v8, v8, v9 1675; CHECK-NEXT: ret 1676; 1677; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv1i64: 1678; CHECK-ZVKB: # %bb.0: 1679; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m1, ta, ma 1680; CHECK-ZVKB-NEXT: vror.vi v8, v8, 63 1681; CHECK-ZVKB-NEXT: ret 1682 %x = call <vscale x 1 x i64> @llvm.fshl.nxv1i64(<vscale x 1 x i64> %a, <vscale x 1 x i64> %a, <vscale x 1 x i64> splat (i64 1)) 1683 ret <vscale x 1 x i64> %x 1684} 1685 1686declare <vscale x 2 x i64> @llvm.fshr.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>) 1687declare <vscale x 2 x i64> @llvm.fshl.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>) 1688 1689define <vscale x 2 x i64> @vror_vv_nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 1690; CHECK-LABEL: vror_vv_nxv2i64: 1691; CHECK: # %bb.0: 1692; CHECK-NEXT: li a0, 63 1693; CHECK-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1694; CHECK-NEXT: vrsub.vi v12, v10, 0 1695; CHECK-NEXT: vand.vx v10, v10, a0 1696; CHECK-NEXT: vand.vx v12, v12, a0 1697; CHECK-NEXT: vsrl.vv v10, v8, v10 1698; CHECK-NEXT: vsll.vv v8, v8, v12 1699; CHECK-NEXT: vor.vv v8, v10, v8 1700; CHECK-NEXT: ret 1701; 1702; CHECK-ZVKB-LABEL: vror_vv_nxv2i64: 1703; CHECK-ZVKB: # %bb.0: 1704; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m2, ta, ma 1705; CHECK-ZVKB-NEXT: vror.vv v8, v8, v10 1706; CHECK-ZVKB-NEXT: ret 1707 %x = call <vscale x 2 x i64> @llvm.fshr.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 1708 ret <vscale x 2 x i64> %x 1709} 1710 1711define <vscale x 2 x i64> @vror_vx_nxv2i64(<vscale x 2 x i64> %a, i64 %b) { 1712; CHECK-RV32-LABEL: vror_vx_nxv2i64: 1713; CHECK-RV32: # %bb.0: 1714; CHECK-RV32-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1715; CHECK-RV32-NEXT: vmv.v.x v10, a0 1716; CHECK-RV32-NEXT: vsetvli zero, zero, e32, m1, ta, ma 1717; CHECK-RV32-NEXT: vmv.v.i v12, 0 1718; CHECK-RV32-NEXT: vwsub.vx v14, v12, a0 1719; CHECK-RV32-NEXT: li a0, 63 1720; CHECK-RV32-NEXT: vsetvli zero, zero, e64, m2, ta, ma 1721; CHECK-RV32-NEXT: vand.vx v10, v10, a0 1722; CHECK-RV32-NEXT: vand.vx v12, v14, a0 1723; CHECK-RV32-NEXT: vsll.vv v12, v8, v12 1724; CHECK-RV32-NEXT: vsrl.vv v8, v8, v10 1725; CHECK-RV32-NEXT: vor.vv v8, v8, v12 1726; CHECK-RV32-NEXT: ret 1727; 1728; CHECK-RV64-LABEL: vror_vx_nxv2i64: 1729; CHECK-RV64: # %bb.0: 1730; CHECK-RV64-NEXT: andi a1, a0, 63 1731; CHECK-RV64-NEXT: negw a0, a0 1732; CHECK-RV64-NEXT: vsetvli a2, zero, e64, m2, ta, ma 1733; CHECK-RV64-NEXT: vsrl.vx v10, v8, a1 1734; CHECK-RV64-NEXT: andi a0, a0, 63 1735; CHECK-RV64-NEXT: vsll.vx v8, v8, a0 1736; CHECK-RV64-NEXT: vor.vv v8, v10, v8 1737; CHECK-RV64-NEXT: ret 1738; 1739; CHECK-ZVKB-LABEL: vror_vx_nxv2i64: 1740; CHECK-ZVKB: # %bb.0: 1741; CHECK-ZVKB-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1742; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1743; CHECK-ZVKB-NEXT: ret 1744 %b.head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0 1745 %b.splat = shufflevector <vscale x 2 x i64> %b.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 1746 %x = call <vscale x 2 x i64> @llvm.fshr.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b.splat) 1747 ret <vscale x 2 x i64> %x 1748} 1749 1750define <vscale x 2 x i64> @vror_vi_nxv2i64(<vscale x 2 x i64> %a) { 1751; CHECK-LABEL: vror_vi_nxv2i64: 1752; CHECK: # %bb.0: 1753; CHECK-NEXT: li a0, 63 1754; CHECK-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1755; CHECK-NEXT: vsll.vx v10, v8, a0 1756; CHECK-NEXT: vsrl.vi v8, v8, 1 1757; CHECK-NEXT: vor.vv v8, v8, v10 1758; CHECK-NEXT: ret 1759; 1760; CHECK-ZVKB-LABEL: vror_vi_nxv2i64: 1761; CHECK-ZVKB: # %bb.0: 1762; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m2, ta, ma 1763; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1764; CHECK-ZVKB-NEXT: ret 1765 %x = call <vscale x 2 x i64> @llvm.fshr.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %a, <vscale x 2 x i64> splat (i64 1)) 1766 ret <vscale x 2 x i64> %x 1767} 1768 1769define <vscale x 2 x i64> @vror_vi_rotl_nxv2i64(<vscale x 2 x i64> %a) { 1770; CHECK-LABEL: vror_vi_rotl_nxv2i64: 1771; CHECK: # %bb.0: 1772; CHECK-NEXT: li a0, 63 1773; CHECK-NEXT: vsetvli a1, zero, e64, m2, ta, ma 1774; CHECK-NEXT: vsrl.vx v10, v8, a0 1775; CHECK-NEXT: vadd.vv v8, v8, v8 1776; CHECK-NEXT: vor.vv v8, v8, v10 1777; CHECK-NEXT: ret 1778; 1779; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv2i64: 1780; CHECK-ZVKB: # %bb.0: 1781; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m2, ta, ma 1782; CHECK-ZVKB-NEXT: vror.vi v8, v8, 63 1783; CHECK-ZVKB-NEXT: ret 1784 %x = call <vscale x 2 x i64> @llvm.fshl.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %a, <vscale x 2 x i64> splat (i64 1)) 1785 ret <vscale x 2 x i64> %x 1786} 1787 1788declare <vscale x 4 x i64> @llvm.fshr.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>, <vscale x 4 x i64>) 1789declare <vscale x 4 x i64> @llvm.fshl.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>, <vscale x 4 x i64>) 1790 1791define <vscale x 4 x i64> @vror_vv_nxv4i64(<vscale x 4 x i64> %a, <vscale x 4 x i64> %b) { 1792; CHECK-LABEL: vror_vv_nxv4i64: 1793; CHECK: # %bb.0: 1794; CHECK-NEXT: li a0, 63 1795; CHECK-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1796; CHECK-NEXT: vrsub.vi v16, v12, 0 1797; CHECK-NEXT: vand.vx v12, v12, a0 1798; CHECK-NEXT: vand.vx v16, v16, a0 1799; CHECK-NEXT: vsrl.vv v12, v8, v12 1800; CHECK-NEXT: vsll.vv v8, v8, v16 1801; CHECK-NEXT: vor.vv v8, v12, v8 1802; CHECK-NEXT: ret 1803; 1804; CHECK-ZVKB-LABEL: vror_vv_nxv4i64: 1805; CHECK-ZVKB: # %bb.0: 1806; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m4, ta, ma 1807; CHECK-ZVKB-NEXT: vror.vv v8, v8, v12 1808; CHECK-ZVKB-NEXT: ret 1809 %x = call <vscale x 4 x i64> @llvm.fshr.nxv4i64(<vscale x 4 x i64> %a, <vscale x 4 x i64> %a, <vscale x 4 x i64> %b) 1810 ret <vscale x 4 x i64> %x 1811} 1812 1813define <vscale x 4 x i64> @vror_vx_nxv4i64(<vscale x 4 x i64> %a, i64 %b) { 1814; CHECK-RV32-LABEL: vror_vx_nxv4i64: 1815; CHECK-RV32: # %bb.0: 1816; CHECK-RV32-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1817; CHECK-RV32-NEXT: vmv.v.x v12, a0 1818; CHECK-RV32-NEXT: vsetvli zero, zero, e32, m2, ta, ma 1819; CHECK-RV32-NEXT: vmv.v.i v16, 0 1820; CHECK-RV32-NEXT: vwsub.vx v20, v16, a0 1821; CHECK-RV32-NEXT: li a0, 63 1822; CHECK-RV32-NEXT: vsetvli zero, zero, e64, m4, ta, ma 1823; CHECK-RV32-NEXT: vand.vx v12, v12, a0 1824; CHECK-RV32-NEXT: vand.vx v16, v20, a0 1825; CHECK-RV32-NEXT: vsll.vv v16, v8, v16 1826; CHECK-RV32-NEXT: vsrl.vv v8, v8, v12 1827; CHECK-RV32-NEXT: vor.vv v8, v8, v16 1828; CHECK-RV32-NEXT: ret 1829; 1830; CHECK-RV64-LABEL: vror_vx_nxv4i64: 1831; CHECK-RV64: # %bb.0: 1832; CHECK-RV64-NEXT: andi a1, a0, 63 1833; CHECK-RV64-NEXT: negw a0, a0 1834; CHECK-RV64-NEXT: vsetvli a2, zero, e64, m4, ta, ma 1835; CHECK-RV64-NEXT: vsrl.vx v12, v8, a1 1836; CHECK-RV64-NEXT: andi a0, a0, 63 1837; CHECK-RV64-NEXT: vsll.vx v8, v8, a0 1838; CHECK-RV64-NEXT: vor.vv v8, v12, v8 1839; CHECK-RV64-NEXT: ret 1840; 1841; CHECK-ZVKB-LABEL: vror_vx_nxv4i64: 1842; CHECK-ZVKB: # %bb.0: 1843; CHECK-ZVKB-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1844; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1845; CHECK-ZVKB-NEXT: ret 1846 %b.head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0 1847 %b.splat = shufflevector <vscale x 4 x i64> %b.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer 1848 %x = call <vscale x 4 x i64> @llvm.fshr.nxv4i64(<vscale x 4 x i64> %a, <vscale x 4 x i64> %a, <vscale x 4 x i64> %b.splat) 1849 ret <vscale x 4 x i64> %x 1850} 1851 1852define <vscale x 4 x i64> @vror_vi_nxv4i64(<vscale x 4 x i64> %a) { 1853; CHECK-LABEL: vror_vi_nxv4i64: 1854; CHECK: # %bb.0: 1855; CHECK-NEXT: li a0, 63 1856; CHECK-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1857; CHECK-NEXT: vsll.vx v12, v8, a0 1858; CHECK-NEXT: vsrl.vi v8, v8, 1 1859; CHECK-NEXT: vor.vv v8, v8, v12 1860; CHECK-NEXT: ret 1861; 1862; CHECK-ZVKB-LABEL: vror_vi_nxv4i64: 1863; CHECK-ZVKB: # %bb.0: 1864; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m4, ta, ma 1865; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1866; CHECK-ZVKB-NEXT: ret 1867 %x = call <vscale x 4 x i64> @llvm.fshr.nxv4i64(<vscale x 4 x i64> %a, <vscale x 4 x i64> %a, <vscale x 4 x i64> splat (i64 1)) 1868 ret <vscale x 4 x i64> %x 1869} 1870 1871define <vscale x 4 x i64> @vror_vi_rotl_nxv4i64(<vscale x 4 x i64> %a) { 1872; CHECK-LABEL: vror_vi_rotl_nxv4i64: 1873; CHECK: # %bb.0: 1874; CHECK-NEXT: li a0, 63 1875; CHECK-NEXT: vsetvli a1, zero, e64, m4, ta, ma 1876; CHECK-NEXT: vsrl.vx v12, v8, a0 1877; CHECK-NEXT: vadd.vv v8, v8, v8 1878; CHECK-NEXT: vor.vv v8, v8, v12 1879; CHECK-NEXT: ret 1880; 1881; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv4i64: 1882; CHECK-ZVKB: # %bb.0: 1883; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m4, ta, ma 1884; CHECK-ZVKB-NEXT: vror.vi v8, v8, 63 1885; CHECK-ZVKB-NEXT: ret 1886 %x = call <vscale x 4 x i64> @llvm.fshl.nxv4i64(<vscale x 4 x i64> %a, <vscale x 4 x i64> %a, <vscale x 4 x i64> splat (i64 1)) 1887 ret <vscale x 4 x i64> %x 1888} 1889 1890declare <vscale x 8 x i64> @llvm.fshr.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>, <vscale x 8 x i64>) 1891declare <vscale x 8 x i64> @llvm.fshl.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>, <vscale x 8 x i64>) 1892 1893define <vscale x 8 x i64> @vror_vv_nxv8i64(<vscale x 8 x i64> %a, <vscale x 8 x i64> %b) { 1894; CHECK-LABEL: vror_vv_nxv8i64: 1895; CHECK: # %bb.0: 1896; CHECK-NEXT: li a0, 63 1897; CHECK-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1898; CHECK-NEXT: vrsub.vi v24, v16, 0 1899; CHECK-NEXT: vand.vx v16, v16, a0 1900; CHECK-NEXT: vand.vx v24, v24, a0 1901; CHECK-NEXT: vsrl.vv v16, v8, v16 1902; CHECK-NEXT: vsll.vv v8, v8, v24 1903; CHECK-NEXT: vor.vv v8, v16, v8 1904; CHECK-NEXT: ret 1905; 1906; CHECK-ZVKB-LABEL: vror_vv_nxv8i64: 1907; CHECK-ZVKB: # %bb.0: 1908; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m8, ta, ma 1909; CHECK-ZVKB-NEXT: vror.vv v8, v8, v16 1910; CHECK-ZVKB-NEXT: ret 1911 %x = call <vscale x 8 x i64> @llvm.fshr.nxv8i64(<vscale x 8 x i64> %a, <vscale x 8 x i64> %a, <vscale x 8 x i64> %b) 1912 ret <vscale x 8 x i64> %x 1913} 1914 1915define <vscale x 8 x i64> @vror_vx_nxv8i64(<vscale x 8 x i64> %a, i64 %b) { 1916; CHECK-RV32-LABEL: vror_vx_nxv8i64: 1917; CHECK-RV32: # %bb.0: 1918; CHECK-RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1919; CHECK-RV32-NEXT: vmv.v.x v16, a0 1920; CHECK-RV32-NEXT: vsetvli zero, zero, e32, m4, ta, ma 1921; CHECK-RV32-NEXT: vmv.v.i v24, 0 1922; CHECK-RV32-NEXT: vwsub.vx v0, v24, a0 1923; CHECK-RV32-NEXT: li a0, 63 1924; CHECK-RV32-NEXT: vsetvli zero, zero, e64, m8, ta, ma 1925; CHECK-RV32-NEXT: vand.vx v16, v16, a0 1926; CHECK-RV32-NEXT: vand.vx v24, v0, a0 1927; CHECK-RV32-NEXT: vsll.vv v24, v8, v24 1928; CHECK-RV32-NEXT: vsrl.vv v8, v8, v16 1929; CHECK-RV32-NEXT: vor.vv v8, v8, v24 1930; CHECK-RV32-NEXT: ret 1931; 1932; CHECK-RV64-LABEL: vror_vx_nxv8i64: 1933; CHECK-RV64: # %bb.0: 1934; CHECK-RV64-NEXT: andi a1, a0, 63 1935; CHECK-RV64-NEXT: negw a0, a0 1936; CHECK-RV64-NEXT: vsetvli a2, zero, e64, m8, ta, ma 1937; CHECK-RV64-NEXT: vsrl.vx v16, v8, a1 1938; CHECK-RV64-NEXT: andi a0, a0, 63 1939; CHECK-RV64-NEXT: vsll.vx v8, v8, a0 1940; CHECK-RV64-NEXT: vor.vv v8, v16, v8 1941; CHECK-RV64-NEXT: ret 1942; 1943; CHECK-ZVKB-LABEL: vror_vx_nxv8i64: 1944; CHECK-ZVKB: # %bb.0: 1945; CHECK-ZVKB-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1946; CHECK-ZVKB-NEXT: vror.vx v8, v8, a0 1947; CHECK-ZVKB-NEXT: ret 1948 %b.head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0 1949 %b.splat = shufflevector <vscale x 8 x i64> %b.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 1950 %x = call <vscale x 8 x i64> @llvm.fshr.nxv8i64(<vscale x 8 x i64> %a, <vscale x 8 x i64> %a, <vscale x 8 x i64> %b.splat) 1951 ret <vscale x 8 x i64> %x 1952} 1953 1954define <vscale x 8 x i64> @vror_vi_nxv8i64(<vscale x 8 x i64> %a) { 1955; CHECK-LABEL: vror_vi_nxv8i64: 1956; CHECK: # %bb.0: 1957; CHECK-NEXT: li a0, 63 1958; CHECK-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1959; CHECK-NEXT: vsll.vx v16, v8, a0 1960; CHECK-NEXT: vsrl.vi v8, v8, 1 1961; CHECK-NEXT: vor.vv v8, v8, v16 1962; CHECK-NEXT: ret 1963; 1964; CHECK-ZVKB-LABEL: vror_vi_nxv8i64: 1965; CHECK-ZVKB: # %bb.0: 1966; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m8, ta, ma 1967; CHECK-ZVKB-NEXT: vror.vi v8, v8, 1 1968; CHECK-ZVKB-NEXT: ret 1969 %x = call <vscale x 8 x i64> @llvm.fshr.nxv8i64(<vscale x 8 x i64> %a, <vscale x 8 x i64> %a, <vscale x 8 x i64> splat (i64 1)) 1970 ret <vscale x 8 x i64> %x 1971} 1972 1973define <vscale x 8 x i64> @vror_vi_rotl_nxv8i64(<vscale x 8 x i64> %a) { 1974; CHECK-LABEL: vror_vi_rotl_nxv8i64: 1975; CHECK: # %bb.0: 1976; CHECK-NEXT: li a0, 63 1977; CHECK-NEXT: vsetvli a1, zero, e64, m8, ta, ma 1978; CHECK-NEXT: vsrl.vx v16, v8, a0 1979; CHECK-NEXT: vadd.vv v8, v8, v8 1980; CHECK-NEXT: vor.vv v8, v8, v16 1981; CHECK-NEXT: ret 1982; 1983; CHECK-ZVKB-LABEL: vror_vi_rotl_nxv8i64: 1984; CHECK-ZVKB: # %bb.0: 1985; CHECK-ZVKB-NEXT: vsetvli a0, zero, e64, m8, ta, ma 1986; CHECK-ZVKB-NEXT: vror.vi v8, v8, 63 1987; CHECK-ZVKB-NEXT: ret 1988 %x = call <vscale x 8 x i64> @llvm.fshl.nxv8i64(<vscale x 8 x i64> %a, <vscale x 8 x i64> %a, <vscale x 8 x i64> splat (i64 1)) 1989 ret <vscale x 8 x i64> %x 1990} 1991