1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=riscv32 -mattr=+v,+zvfh -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK,RV32 3; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfh -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK,RV64 4; RUN: llc -mtriple=riscv32 -mattr=+v,+zvfh,+zvkb -verify-machineinstrs < %s | FileCheck %s -check-prefixes=ZVKB-V 5; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfh,+zvkb -verify-machineinstrs < %s | FileCheck %s -check-prefixes=ZVKB-V 6; RUN: llc -mtriple=riscv32 -mattr=+zve32x,+zvfh,+zvkb,+zvl64b -verify-machineinstrs < %s | FileCheck %s -check-prefixes=ZVKB-ZVE32X 7; RUN: llc -mtriple=riscv64 -mattr=+zve32x,+zvfh,+zvkb,+zvl64b -verify-machineinstrs < %s | FileCheck %s -check-prefixes=ZVKB-ZVE32X 8 9define <8 x i1> @shuffle_v8i1_as_i8_1(<8 x i1> %v) { 10; CHECK-LABEL: shuffle_v8i1_as_i8_1: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 13; CHECK-NEXT: vsrl.vi v8, v0, 1 14; CHECK-NEXT: vsll.vi v9, v0, 7 15; CHECK-NEXT: vor.vv v0, v9, v8 16; CHECK-NEXT: ret 17; 18; ZVKB-V-LABEL: shuffle_v8i1_as_i8_1: 19; ZVKB-V: # %bb.0: 20; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 21; ZVKB-V-NEXT: vror.vi v0, v0, 1 22; ZVKB-V-NEXT: ret 23; 24; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_1: 25; ZVKB-ZVE32X: # %bb.0: 26; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma 27; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 1 28; ZVKB-ZVE32X-NEXT: ret 29 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0> 30 ret <8 x i1> %shuffle 31} 32 33define <8 x i1> @shuffle_v8i1_as_i8_2(<8 x i1> %v) { 34; CHECK-LABEL: shuffle_v8i1_as_i8_2: 35; CHECK: # %bb.0: 36; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 37; CHECK-NEXT: vsrl.vi v8, v0, 2 38; CHECK-NEXT: vsll.vi v9, v0, 6 39; CHECK-NEXT: vor.vv v0, v9, v8 40; CHECK-NEXT: ret 41; 42; ZVKB-V-LABEL: shuffle_v8i1_as_i8_2: 43; ZVKB-V: # %bb.0: 44; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 45; ZVKB-V-NEXT: vror.vi v0, v0, 2 46; ZVKB-V-NEXT: ret 47; 48; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_2: 49; ZVKB-ZVE32X: # %bb.0: 50; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma 51; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 2 52; ZVKB-ZVE32X-NEXT: ret 53 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1> 54 ret <8 x i1> %shuffle 55} 56 57define <8 x i1> @shuffle_v8i1_as_i8_3(<8 x i1> %v) { 58; CHECK-LABEL: shuffle_v8i1_as_i8_3: 59; CHECK: # %bb.0: 60; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 61; CHECK-NEXT: vsrl.vi v8, v0, 3 62; CHECK-NEXT: vsll.vi v9, v0, 5 63; CHECK-NEXT: vor.vv v0, v9, v8 64; CHECK-NEXT: ret 65; 66; ZVKB-V-LABEL: shuffle_v8i1_as_i8_3: 67; ZVKB-V: # %bb.0: 68; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 69; ZVKB-V-NEXT: vror.vi v0, v0, 3 70; ZVKB-V-NEXT: ret 71; 72; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_3: 73; ZVKB-ZVE32X: # %bb.0: 74; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma 75; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 3 76; ZVKB-ZVE32X-NEXT: ret 77 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2> 78 ret <8 x i1> %shuffle 79} 80 81define <8 x i1> @shuffle_v8i1_as_i8_4(<8 x i1> %v) { 82; CHECK-LABEL: shuffle_v8i1_as_i8_4: 83; CHECK: # %bb.0: 84; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 85; CHECK-NEXT: vsrl.vi v8, v0, 4 86; CHECK-NEXT: vsll.vi v9, v0, 4 87; CHECK-NEXT: vor.vv v0, v9, v8 88; CHECK-NEXT: ret 89; 90; ZVKB-V-LABEL: shuffle_v8i1_as_i8_4: 91; ZVKB-V: # %bb.0: 92; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 93; ZVKB-V-NEXT: vror.vi v0, v0, 4 94; ZVKB-V-NEXT: ret 95; 96; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_4: 97; ZVKB-ZVE32X: # %bb.0: 98; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma 99; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 4 100; ZVKB-ZVE32X-NEXT: ret 101 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 102 ret <8 x i1> %shuffle 103} 104 105define <8 x i1> @shuffle_v8i1_as_i8_5(<8 x i1> %v) { 106; CHECK-LABEL: shuffle_v8i1_as_i8_5: 107; CHECK: # %bb.0: 108; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 109; CHECK-NEXT: vsrl.vi v8, v0, 5 110; CHECK-NEXT: vsll.vi v9, v0, 3 111; CHECK-NEXT: vor.vv v0, v9, v8 112; CHECK-NEXT: ret 113; 114; ZVKB-V-LABEL: shuffle_v8i1_as_i8_5: 115; ZVKB-V: # %bb.0: 116; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 117; ZVKB-V-NEXT: vror.vi v0, v0, 5 118; ZVKB-V-NEXT: ret 119; 120; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_5: 121; ZVKB-ZVE32X: # %bb.0: 122; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma 123; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 5 124; ZVKB-ZVE32X-NEXT: ret 125 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4> 126 ret <8 x i1> %shuffle 127} 128 129define <8 x i1> @shuffle_v8i1_as_i8_6(<8 x i1> %v) { 130; CHECK-LABEL: shuffle_v8i1_as_i8_6: 131; CHECK: # %bb.0: 132; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 133; CHECK-NEXT: vsrl.vi v8, v0, 6 134; CHECK-NEXT: vsll.vi v9, v0, 2 135; CHECK-NEXT: vor.vv v0, v9, v8 136; CHECK-NEXT: ret 137; 138; ZVKB-V-LABEL: shuffle_v8i1_as_i8_6: 139; ZVKB-V: # %bb.0: 140; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 141; ZVKB-V-NEXT: vror.vi v0, v0, 6 142; ZVKB-V-NEXT: ret 143; 144; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_6: 145; ZVKB-ZVE32X: # %bb.0: 146; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma 147; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 6 148; ZVKB-ZVE32X-NEXT: ret 149 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5> 150 ret <8 x i1> %shuffle 151} 152 153define <8 x i1> @shuffle_v8i1_as_i8_7(<8 x i1> %v) { 154; CHECK-LABEL: shuffle_v8i1_as_i8_7: 155; CHECK: # %bb.0: 156; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 157; CHECK-NEXT: vsrl.vi v8, v0, 7 158; CHECK-NEXT: vadd.vv v9, v0, v0 159; CHECK-NEXT: vor.vv v0, v9, v8 160; CHECK-NEXT: ret 161; 162; ZVKB-V-LABEL: shuffle_v8i1_as_i8_7: 163; ZVKB-V: # %bb.0: 164; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 165; ZVKB-V-NEXT: vror.vi v0, v0, 7 166; ZVKB-V-NEXT: ret 167; 168; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_7: 169; ZVKB-ZVE32X: # %bb.0: 170; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma 171; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 7 172; ZVKB-ZVE32X-NEXT: ret 173 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6> 174 ret <8 x i1> %shuffle 175} 176 177define <8 x i8> @shuffle_v8i8_as_i16(<8 x i8> %v) { 178; CHECK-LABEL: shuffle_v8i8_as_i16: 179; CHECK: # %bb.0: 180; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 181; CHECK-NEXT: vsrl.vi v9, v8, 8 182; CHECK-NEXT: vsll.vi v8, v8, 8 183; CHECK-NEXT: vor.vv v8, v8, v9 184; CHECK-NEXT: ret 185; 186; ZVKB-V-LABEL: shuffle_v8i8_as_i16: 187; ZVKB-V: # %bb.0: 188; ZVKB-V-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 189; ZVKB-V-NEXT: vrev8.v v8, v8 190; ZVKB-V-NEXT: ret 191; 192; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i16: 193; ZVKB-ZVE32X: # %bb.0: 194; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e16, m1, ta, ma 195; ZVKB-ZVE32X-NEXT: vrev8.v v8, v8 196; ZVKB-ZVE32X-NEXT: ret 197 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6> 198 ret <8 x i8> %shuffle 199} 200 201define <8 x i8> @shuffle_v8i8_as_i32_8(<8 x i8> %v) { 202; CHECK-LABEL: shuffle_v8i8_as_i32_8: 203; CHECK: # %bb.0: 204; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 205; CHECK-NEXT: vsrl.vi v9, v8, 8 206; CHECK-NEXT: vsll.vi v8, v8, 24 207; CHECK-NEXT: vor.vv v8, v8, v9 208; CHECK-NEXT: ret 209; 210; ZVKB-V-LABEL: shuffle_v8i8_as_i32_8: 211; ZVKB-V: # %bb.0: 212; ZVKB-V-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 213; ZVKB-V-NEXT: vror.vi v8, v8, 8 214; ZVKB-V-NEXT: ret 215; 216; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i32_8: 217; ZVKB-ZVE32X: # %bb.0: 218; ZVKB-ZVE32X-NEXT: vsetivli zero, 2, e32, m1, ta, ma 219; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 8 220; ZVKB-ZVE32X-NEXT: ret 221 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 5, i32 6, i32 7, i32 4> 222 ret <8 x i8> %shuffle 223} 224 225define <8 x i8> @shuffle_v8i8_as_i32_16(<8 x i8> %v) { 226; CHECK-LABEL: shuffle_v8i8_as_i32_16: 227; CHECK: # %bb.0: 228; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 229; CHECK-NEXT: vsrl.vi v9, v8, 16 230; CHECK-NEXT: vsll.vi v8, v8, 16 231; CHECK-NEXT: vor.vv v8, v8, v9 232; CHECK-NEXT: ret 233; 234; ZVKB-V-LABEL: shuffle_v8i8_as_i32_16: 235; ZVKB-V: # %bb.0: 236; ZVKB-V-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 237; ZVKB-V-NEXT: vror.vi v8, v8, 16 238; ZVKB-V-NEXT: ret 239; 240; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i32_16: 241; ZVKB-ZVE32X: # %bb.0: 242; ZVKB-ZVE32X-NEXT: vsetivli zero, 2, e32, m1, ta, ma 243; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 16 244; ZVKB-ZVE32X-NEXT: ret 245 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5> 246 ret <8 x i8> %shuffle 247} 248 249define <8 x i8> @shuffle_v8i8_as_i32_24(<8 x i8> %v) { 250; CHECK-LABEL: shuffle_v8i8_as_i32_24: 251; CHECK: # %bb.0: 252; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 253; CHECK-NEXT: vsrl.vi v9, v8, 24 254; CHECK-NEXT: vsll.vi v8, v8, 8 255; CHECK-NEXT: vor.vv v8, v8, v9 256; CHECK-NEXT: ret 257; 258; ZVKB-V-LABEL: shuffle_v8i8_as_i32_24: 259; ZVKB-V: # %bb.0: 260; ZVKB-V-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 261; ZVKB-V-NEXT: vror.vi v8, v8, 24 262; ZVKB-V-NEXT: ret 263; 264; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i32_24: 265; ZVKB-ZVE32X: # %bb.0: 266; ZVKB-ZVE32X-NEXT: vsetivli zero, 2, e32, m1, ta, ma 267; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 24 268; ZVKB-ZVE32X-NEXT: ret 269 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 3, i32 0, i32 1, i32 2, i32 7, i32 4, i32 5, i32 6> 270 ret <8 x i8> %shuffle 271} 272 273define <8 x i8> @shuffle_v8i8_as_i64_8(<8 x i8> %v) { 274; CHECK-LABEL: shuffle_v8i8_as_i64_8: 275; CHECK: # %bb.0: 276; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 277; CHECK-NEXT: vslidedown.vi v9, v8, 1 278; CHECK-NEXT: vslideup.vi v9, v8, 7 279; CHECK-NEXT: vmv1r.v v8, v9 280; CHECK-NEXT: ret 281; 282; ZVKB-V-LABEL: shuffle_v8i8_as_i64_8: 283; ZVKB-V: # %bb.0: 284; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma 285; ZVKB-V-NEXT: vror.vi v8, v8, 8 286; ZVKB-V-NEXT: ret 287; 288; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_8: 289; ZVKB-ZVE32X: # %bb.0: 290; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma 291; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 1 292; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 7 293; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9 294; ZVKB-ZVE32X-NEXT: ret 295 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0> 296 ret <8 x i8> %shuffle 297} 298 299define <8 x i8> @shuffle_v8i8_as_i64_16(<8 x i8> %v) { 300; CHECK-LABEL: shuffle_v8i8_as_i64_16: 301; CHECK: # %bb.0: 302; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 303; CHECK-NEXT: vslidedown.vi v9, v8, 2 304; CHECK-NEXT: vslideup.vi v9, v8, 6 305; CHECK-NEXT: vmv1r.v v8, v9 306; CHECK-NEXT: ret 307; 308; ZVKB-V-LABEL: shuffle_v8i8_as_i64_16: 309; ZVKB-V: # %bb.0: 310; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma 311; ZVKB-V-NEXT: vror.vi v8, v8, 16 312; ZVKB-V-NEXT: ret 313; 314; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_16: 315; ZVKB-ZVE32X: # %bb.0: 316; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma 317; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 2 318; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 6 319; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9 320; ZVKB-ZVE32X-NEXT: ret 321 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1> 322 ret <8 x i8> %shuffle 323} 324 325define <8 x i8> @shuffle_v8i8_as_i64_24(<8 x i8> %v) { 326; CHECK-LABEL: shuffle_v8i8_as_i64_24: 327; CHECK: # %bb.0: 328; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 329; CHECK-NEXT: vslidedown.vi v9, v8, 3 330; CHECK-NEXT: vslideup.vi v9, v8, 5 331; CHECK-NEXT: vmv1r.v v8, v9 332; CHECK-NEXT: ret 333; 334; ZVKB-V-LABEL: shuffle_v8i8_as_i64_24: 335; ZVKB-V: # %bb.0: 336; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma 337; ZVKB-V-NEXT: vror.vi v8, v8, 24 338; ZVKB-V-NEXT: ret 339; 340; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_24: 341; ZVKB-ZVE32X: # %bb.0: 342; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma 343; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 3 344; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 5 345; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9 346; ZVKB-ZVE32X-NEXT: ret 347 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2> 348 ret <8 x i8> %shuffle 349} 350 351define <8 x i8> @shuffle_v8i8_as_i64_32(<8 x i8> %v) { 352; CHECK-LABEL: shuffle_v8i8_as_i64_32: 353; CHECK: # %bb.0: 354; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 355; CHECK-NEXT: vslidedown.vi v9, v8, 4 356; CHECK-NEXT: vslideup.vi v9, v8, 4 357; CHECK-NEXT: vmv1r.v v8, v9 358; CHECK-NEXT: ret 359; 360; ZVKB-V-LABEL: shuffle_v8i8_as_i64_32: 361; ZVKB-V: # %bb.0: 362; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma 363; ZVKB-V-NEXT: vror.vi v8, v8, 32 364; ZVKB-V-NEXT: ret 365; 366; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_32: 367; ZVKB-ZVE32X: # %bb.0: 368; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma 369; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 4 370; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 4 371; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9 372; ZVKB-ZVE32X-NEXT: ret 373 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3> 374 ret <8 x i8> %shuffle 375} 376 377define <8 x i8> @shuffle_v8i8_as_i64_40(<8 x i8> %v) { 378; CHECK-LABEL: shuffle_v8i8_as_i64_40: 379; CHECK: # %bb.0: 380; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 381; CHECK-NEXT: vslidedown.vi v9, v8, 5 382; CHECK-NEXT: vslideup.vi v9, v8, 3 383; CHECK-NEXT: vmv1r.v v8, v9 384; CHECK-NEXT: ret 385; 386; ZVKB-V-LABEL: shuffle_v8i8_as_i64_40: 387; ZVKB-V: # %bb.0: 388; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma 389; ZVKB-V-NEXT: vror.vi v8, v8, 40 390; ZVKB-V-NEXT: ret 391; 392; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_40: 393; ZVKB-ZVE32X: # %bb.0: 394; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma 395; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 5 396; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 3 397; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9 398; ZVKB-ZVE32X-NEXT: ret 399 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4> 400 ret <8 x i8> %shuffle 401} 402 403define <8 x i8> @shuffle_v8i8_as_i64_48(<8 x i8> %v) { 404; CHECK-LABEL: shuffle_v8i8_as_i64_48: 405; CHECK: # %bb.0: 406; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 407; CHECK-NEXT: vslidedown.vi v9, v8, 6 408; CHECK-NEXT: vslideup.vi v9, v8, 2 409; CHECK-NEXT: vmv1r.v v8, v9 410; CHECK-NEXT: ret 411; 412; ZVKB-V-LABEL: shuffle_v8i8_as_i64_48: 413; ZVKB-V: # %bb.0: 414; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma 415; ZVKB-V-NEXT: vror.vi v8, v8, 48 416; ZVKB-V-NEXT: ret 417; 418; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_48: 419; ZVKB-ZVE32X: # %bb.0: 420; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma 421; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 6 422; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 2 423; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9 424; ZVKB-ZVE32X-NEXT: ret 425 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5> 426 ret <8 x i8> %shuffle 427} 428 429define <8 x i8> @shuffle_v8i8_as_i64_56(<8 x i8> %v) { 430; CHECK-LABEL: shuffle_v8i8_as_i64_56: 431; CHECK: # %bb.0: 432; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 433; CHECK-NEXT: vslidedown.vi v9, v8, 7 434; CHECK-NEXT: vslideup.vi v9, v8, 1 435; CHECK-NEXT: vmv1r.v v8, v9 436; CHECK-NEXT: ret 437; 438; ZVKB-V-LABEL: shuffle_v8i8_as_i64_56: 439; ZVKB-V: # %bb.0: 440; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma 441; ZVKB-V-NEXT: vror.vi v8, v8, 56 442; ZVKB-V-NEXT: ret 443; 444; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_56: 445; ZVKB-ZVE32X: # %bb.0: 446; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma 447; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 7 448; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 1 449; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9 450; ZVKB-ZVE32X-NEXT: ret 451 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6> 452 ret <8 x i8> %shuffle 453} 454 455define <8 x i16> @shuffle_v8i16_as_i32(<8 x i16> %v) { 456; CHECK-LABEL: shuffle_v8i16_as_i32: 457; CHECK: # %bb.0: 458; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 459; CHECK-NEXT: vsrl.vi v9, v8, 16 460; CHECK-NEXT: vsll.vi v8, v8, 16 461; CHECK-NEXT: vor.vv v8, v8, v9 462; CHECK-NEXT: ret 463; 464; ZVKB-V-LABEL: shuffle_v8i16_as_i32: 465; ZVKB-V: # %bb.0: 466; ZVKB-V-NEXT: vsetivli zero, 4, e32, m1, ta, ma 467; ZVKB-V-NEXT: vror.vi v8, v8, 16 468; ZVKB-V-NEXT: ret 469; 470; ZVKB-ZVE32X-LABEL: shuffle_v8i16_as_i32: 471; ZVKB-ZVE32X: # %bb.0: 472; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e32, m2, ta, ma 473; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 16 474; ZVKB-ZVE32X-NEXT: ret 475 %shuffle = shufflevector <8 x i16> %v, <8 x i16> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6> 476 ret <8 x i16> %shuffle 477} 478 479define <8 x i16> @shuffle_v8i16_as_i64_16(<8 x i16> %v) { 480; RV32-LABEL: shuffle_v8i16_as_i64_16: 481; RV32: # %bb.0: 482; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 483; RV32-NEXT: vmv.v.i v9, 0 484; RV32-NEXT: li a0, 48 485; RV32-NEXT: li a1, 63 486; RV32-NEXT: vwsubu.vx v10, v9, a0 487; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma 488; RV32-NEXT: vmv.v.x v9, a0 489; RV32-NEXT: vand.vx v10, v10, a1 490; RV32-NEXT: vand.vx v9, v9, a1 491; RV32-NEXT: vsrl.vv v10, v8, v10 492; RV32-NEXT: vsll.vv v8, v8, v9 493; RV32-NEXT: vor.vv v8, v8, v10 494; RV32-NEXT: ret 495; 496; RV64-LABEL: shuffle_v8i16_as_i64_16: 497; RV64: # %bb.0: 498; RV64-NEXT: li a0, 48 499; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 500; RV64-NEXT: vsll.vx v9, v8, a0 501; RV64-NEXT: vsrl.vi v8, v8, 16 502; RV64-NEXT: vor.vv v8, v9, v8 503; RV64-NEXT: ret 504; 505; ZVKB-V-LABEL: shuffle_v8i16_as_i64_16: 506; ZVKB-V: # %bb.0: 507; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma 508; ZVKB-V-NEXT: vror.vi v8, v8, 16 509; ZVKB-V-NEXT: ret 510; 511; ZVKB-ZVE32X-LABEL: shuffle_v8i16_as_i64_16: 512; ZVKB-ZVE32X: # %bb.0: 513; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI19_0) 514; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI19_0) 515; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma 516; ZVKB-ZVE32X-NEXT: vle8.v v10, (a0) 517; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10 518; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12 519; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10 520; ZVKB-ZVE32X-NEXT: ret 521 %shuffle = shufflevector <8 x i16> %v, <8 x i16> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 5, i32 6, i32 7, i32 4> 522 ret <8 x i16> %shuffle 523} 524 525define <8 x i16> @shuffle_v8i16_as_i64_32(<8 x i16> %v) { 526; RV32-LABEL: shuffle_v8i16_as_i64_32: 527; RV32: # %bb.0: 528; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 529; RV32-NEXT: vmv.v.i v9, 0 530; RV32-NEXT: li a0, 32 531; RV32-NEXT: li a1, 63 532; RV32-NEXT: vwsubu.vx v10, v9, a0 533; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma 534; RV32-NEXT: vmv.v.x v9, a0 535; RV32-NEXT: vand.vx v10, v10, a1 536; RV32-NEXT: vand.vx v9, v9, a1 537; RV32-NEXT: vsrl.vv v10, v8, v10 538; RV32-NEXT: vsll.vv v8, v8, v9 539; RV32-NEXT: vor.vv v8, v8, v10 540; RV32-NEXT: ret 541; 542; RV64-LABEL: shuffle_v8i16_as_i64_32: 543; RV64: # %bb.0: 544; RV64-NEXT: li a0, 32 545; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 546; RV64-NEXT: vsrl.vx v9, v8, a0 547; RV64-NEXT: vsll.vx v8, v8, a0 548; RV64-NEXT: vor.vv v8, v8, v9 549; RV64-NEXT: ret 550; 551; ZVKB-V-LABEL: shuffle_v8i16_as_i64_32: 552; ZVKB-V: # %bb.0: 553; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma 554; ZVKB-V-NEXT: vror.vi v8, v8, 32 555; ZVKB-V-NEXT: ret 556; 557; ZVKB-ZVE32X-LABEL: shuffle_v8i16_as_i64_32: 558; ZVKB-ZVE32X: # %bb.0: 559; ZVKB-ZVE32X-NEXT: lui a0, 8240 560; ZVKB-ZVE32X-NEXT: addi a0, a0, 1 561; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e32, m1, ta, ma 562; ZVKB-ZVE32X-NEXT: vmv.s.x v10, a0 563; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e16, m1, ta, ma 564; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10 565; ZVKB-ZVE32X-NEXT: vsetvli zero, zero, e32, m2, ta, ma 566; ZVKB-ZVE32X-NEXT: vrgatherei16.vv v10, v8, v12 567; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10 568; ZVKB-ZVE32X-NEXT: ret 569 %shuffle = shufflevector <8 x i16> %v, <8 x i16> poison, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5> 570 ret <8 x i16> %shuffle 571} 572 573define <8 x i16> @shuffle_v8i16_as_i64_48(<8 x i16> %v) { 574; RV32-LABEL: shuffle_v8i16_as_i64_48: 575; RV32: # %bb.0: 576; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 577; RV32-NEXT: vmv.v.i v9, 0 578; RV32-NEXT: li a0, 16 579; RV32-NEXT: li a1, 63 580; RV32-NEXT: vwsubu.vx v10, v9, a0 581; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma 582; RV32-NEXT: vmv.v.x v9, a0 583; RV32-NEXT: vand.vx v10, v10, a1 584; RV32-NEXT: vand.vx v9, v9, a1 585; RV32-NEXT: vsrl.vv v10, v8, v10 586; RV32-NEXT: vsll.vv v8, v8, v9 587; RV32-NEXT: vor.vv v8, v8, v10 588; RV32-NEXT: ret 589; 590; RV64-LABEL: shuffle_v8i16_as_i64_48: 591; RV64: # %bb.0: 592; RV64-NEXT: li a0, 48 593; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 594; RV64-NEXT: vsrl.vx v9, v8, a0 595; RV64-NEXT: vsll.vi v8, v8, 16 596; RV64-NEXT: vor.vv v8, v8, v9 597; RV64-NEXT: ret 598; 599; ZVKB-V-LABEL: shuffle_v8i16_as_i64_48: 600; ZVKB-V: # %bb.0: 601; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma 602; ZVKB-V-NEXT: vror.vi v8, v8, 48 603; ZVKB-V-NEXT: ret 604; 605; ZVKB-ZVE32X-LABEL: shuffle_v8i16_as_i64_48: 606; ZVKB-ZVE32X: # %bb.0: 607; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI21_0) 608; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI21_0) 609; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma 610; ZVKB-ZVE32X-NEXT: vle8.v v10, (a0) 611; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10 612; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12 613; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10 614; ZVKB-ZVE32X-NEXT: ret 615 %shuffle = shufflevector <8 x i16> %v, <8 x i16> poison, <8 x i32> <i32 3, i32 0, i32 1, i32 2, i32 7, i32 4, i32 5, i32 6> 616 ret <8 x i16> %shuffle 617} 618 619define <8 x i32> @shuffle_v8i32_as_i64(<8 x i32> %v) { 620; RV32-LABEL: shuffle_v8i32_as_i64: 621; RV32: # %bb.0: 622; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma 623; RV32-NEXT: vmv.v.i v10, 0 624; RV32-NEXT: li a0, 32 625; RV32-NEXT: li a1, 63 626; RV32-NEXT: vwsubu.vx v12, v10, a0 627; RV32-NEXT: vsetvli zero, zero, e64, m2, ta, ma 628; RV32-NEXT: vmv.v.x v10, a0 629; RV32-NEXT: vand.vx v12, v12, a1 630; RV32-NEXT: vand.vx v10, v10, a1 631; RV32-NEXT: vsrl.vv v12, v8, v12 632; RV32-NEXT: vsll.vv v8, v8, v10 633; RV32-NEXT: vor.vv v8, v8, v12 634; RV32-NEXT: ret 635; 636; RV64-LABEL: shuffle_v8i32_as_i64: 637; RV64: # %bb.0: 638; RV64-NEXT: li a0, 32 639; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma 640; RV64-NEXT: vsrl.vx v10, v8, a0 641; RV64-NEXT: vsll.vx v8, v8, a0 642; RV64-NEXT: vor.vv v8, v8, v10 643; RV64-NEXT: ret 644; 645; ZVKB-V-LABEL: shuffle_v8i32_as_i64: 646; ZVKB-V: # %bb.0: 647; ZVKB-V-NEXT: vsetivli zero, 4, e64, m2, ta, ma 648; ZVKB-V-NEXT: vror.vi v8, v8, 32 649; ZVKB-V-NEXT: ret 650; 651; ZVKB-ZVE32X-LABEL: shuffle_v8i32_as_i64: 652; ZVKB-ZVE32X: # %bb.0: 653; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI22_0) 654; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI22_0) 655; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma 656; ZVKB-ZVE32X-NEXT: vle8.v v12, (a0) 657; ZVKB-ZVE32X-NEXT: vsext.vf2 v16, v12 658; ZVKB-ZVE32X-NEXT: vsetvli zero, zero, e32, m4, ta, ma 659; ZVKB-ZVE32X-NEXT: vrgatherei16.vv v12, v8, v16 660; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v12 661; ZVKB-ZVE32X-NEXT: ret 662 %shuffle = shufflevector <8 x i32> %v, <8 x i32> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6> 663 ret <8 x i32> %shuffle 664} 665 666define <8 x half> @shuffle_v8f16_as_i32(<8 x half> %v) { 667; CHECK-LABEL: shuffle_v8f16_as_i32: 668; CHECK: # %bb.0: 669; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 670; CHECK-NEXT: vsrl.vi v9, v8, 16 671; CHECK-NEXT: vsll.vi v8, v8, 16 672; CHECK-NEXT: vor.vv v8, v8, v9 673; CHECK-NEXT: ret 674; 675; ZVKB-V-LABEL: shuffle_v8f16_as_i32: 676; ZVKB-V: # %bb.0: 677; ZVKB-V-NEXT: vsetivli zero, 4, e32, m1, ta, ma 678; ZVKB-V-NEXT: vror.vi v8, v8, 16 679; ZVKB-V-NEXT: ret 680; 681; ZVKB-ZVE32X-LABEL: shuffle_v8f16_as_i32: 682; ZVKB-ZVE32X: # %bb.0: 683; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e32, m2, ta, ma 684; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 16 685; ZVKB-ZVE32X-NEXT: ret 686 %shuffle = shufflevector <8 x half> %v, <8 x half> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6> 687 ret <8 x half> %shuffle 688} 689 690define <8 x half> @shuffle_v8f16_as_i64_16(<8 x half> %v) { 691; RV32-LABEL: shuffle_v8f16_as_i64_16: 692; RV32: # %bb.0: 693; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 694; RV32-NEXT: vmv.v.i v9, 0 695; RV32-NEXT: li a0, 48 696; RV32-NEXT: li a1, 63 697; RV32-NEXT: vwsubu.vx v10, v9, a0 698; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma 699; RV32-NEXT: vmv.v.x v9, a0 700; RV32-NEXT: vand.vx v10, v10, a1 701; RV32-NEXT: vand.vx v9, v9, a1 702; RV32-NEXT: vsrl.vv v10, v8, v10 703; RV32-NEXT: vsll.vv v8, v8, v9 704; RV32-NEXT: vor.vv v8, v8, v10 705; RV32-NEXT: ret 706; 707; RV64-LABEL: shuffle_v8f16_as_i64_16: 708; RV64: # %bb.0: 709; RV64-NEXT: li a0, 48 710; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 711; RV64-NEXT: vsll.vx v9, v8, a0 712; RV64-NEXT: vsrl.vi v8, v8, 16 713; RV64-NEXT: vor.vv v8, v9, v8 714; RV64-NEXT: ret 715; 716; ZVKB-V-LABEL: shuffle_v8f16_as_i64_16: 717; ZVKB-V: # %bb.0: 718; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma 719; ZVKB-V-NEXT: vror.vi v8, v8, 16 720; ZVKB-V-NEXT: ret 721; 722; ZVKB-ZVE32X-LABEL: shuffle_v8f16_as_i64_16: 723; ZVKB-ZVE32X: # %bb.0: 724; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI24_0) 725; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI24_0) 726; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma 727; ZVKB-ZVE32X-NEXT: vle8.v v10, (a0) 728; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10 729; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12 730; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10 731; ZVKB-ZVE32X-NEXT: ret 732 %shuffle = shufflevector <8 x half> %v, <8 x half> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 5, i32 6, i32 7, i32 4> 733 ret <8 x half> %shuffle 734} 735 736define <8 x half> @shuffle_v8f16_as_i64_32(<8 x half> %v) { 737; RV32-LABEL: shuffle_v8f16_as_i64_32: 738; RV32: # %bb.0: 739; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 740; RV32-NEXT: vmv.v.i v9, 0 741; RV32-NEXT: li a0, 32 742; RV32-NEXT: li a1, 63 743; RV32-NEXT: vwsubu.vx v10, v9, a0 744; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma 745; RV32-NEXT: vmv.v.x v9, a0 746; RV32-NEXT: vand.vx v10, v10, a1 747; RV32-NEXT: vand.vx v9, v9, a1 748; RV32-NEXT: vsrl.vv v10, v8, v10 749; RV32-NEXT: vsll.vv v8, v8, v9 750; RV32-NEXT: vor.vv v8, v8, v10 751; RV32-NEXT: ret 752; 753; RV64-LABEL: shuffle_v8f16_as_i64_32: 754; RV64: # %bb.0: 755; RV64-NEXT: li a0, 32 756; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 757; RV64-NEXT: vsrl.vx v9, v8, a0 758; RV64-NEXT: vsll.vx v8, v8, a0 759; RV64-NEXT: vor.vv v8, v8, v9 760; RV64-NEXT: ret 761; 762; ZVKB-V-LABEL: shuffle_v8f16_as_i64_32: 763; ZVKB-V: # %bb.0: 764; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma 765; ZVKB-V-NEXT: vror.vi v8, v8, 32 766; ZVKB-V-NEXT: ret 767; 768; ZVKB-ZVE32X-LABEL: shuffle_v8f16_as_i64_32: 769; ZVKB-ZVE32X: # %bb.0: 770; ZVKB-ZVE32X-NEXT: lui a0, 8240 771; ZVKB-ZVE32X-NEXT: addi a0, a0, 1 772; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e32, m1, ta, ma 773; ZVKB-ZVE32X-NEXT: vmv.s.x v10, a0 774; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e16, m1, ta, ma 775; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10 776; ZVKB-ZVE32X-NEXT: vsetvli zero, zero, e32, m2, ta, ma 777; ZVKB-ZVE32X-NEXT: vrgatherei16.vv v10, v8, v12 778; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10 779; ZVKB-ZVE32X-NEXT: ret 780 %shuffle = shufflevector <8 x half> %v, <8 x half> poison, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5> 781 ret <8 x half> %shuffle 782} 783 784define <8 x half> @shuffle_v8f16_as_i64_48(<8 x half> %v) { 785; RV32-LABEL: shuffle_v8f16_as_i64_48: 786; RV32: # %bb.0: 787; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 788; RV32-NEXT: vmv.v.i v9, 0 789; RV32-NEXT: li a0, 16 790; RV32-NEXT: li a1, 63 791; RV32-NEXT: vwsubu.vx v10, v9, a0 792; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma 793; RV32-NEXT: vmv.v.x v9, a0 794; RV32-NEXT: vand.vx v10, v10, a1 795; RV32-NEXT: vand.vx v9, v9, a1 796; RV32-NEXT: vsrl.vv v10, v8, v10 797; RV32-NEXT: vsll.vv v8, v8, v9 798; RV32-NEXT: vor.vv v8, v8, v10 799; RV32-NEXT: ret 800; 801; RV64-LABEL: shuffle_v8f16_as_i64_48: 802; RV64: # %bb.0: 803; RV64-NEXT: li a0, 48 804; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 805; RV64-NEXT: vsrl.vx v9, v8, a0 806; RV64-NEXT: vsll.vi v8, v8, 16 807; RV64-NEXT: vor.vv v8, v8, v9 808; RV64-NEXT: ret 809; 810; ZVKB-V-LABEL: shuffle_v8f16_as_i64_48: 811; ZVKB-V: # %bb.0: 812; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma 813; ZVKB-V-NEXT: vror.vi v8, v8, 48 814; ZVKB-V-NEXT: ret 815; 816; ZVKB-ZVE32X-LABEL: shuffle_v8f16_as_i64_48: 817; ZVKB-ZVE32X: # %bb.0: 818; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI26_0) 819; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI26_0) 820; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma 821; ZVKB-ZVE32X-NEXT: vle8.v v10, (a0) 822; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10 823; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12 824; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10 825; ZVKB-ZVE32X-NEXT: ret 826 %shuffle = shufflevector <8 x half> %v, <8 x half> poison, <8 x i32> <i32 3, i32 0, i32 1, i32 2, i32 7, i32 4, i32 5, i32 6> 827 ret <8 x half> %shuffle 828} 829 830define <8 x float> @shuffle_v8f32_as_i64(<8 x float> %v) { 831; RV32-LABEL: shuffle_v8f32_as_i64: 832; RV32: # %bb.0: 833; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma 834; RV32-NEXT: vmv.v.i v10, 0 835; RV32-NEXT: li a0, 32 836; RV32-NEXT: li a1, 63 837; RV32-NEXT: vwsubu.vx v12, v10, a0 838; RV32-NEXT: vsetvli zero, zero, e64, m2, ta, ma 839; RV32-NEXT: vmv.v.x v10, a0 840; RV32-NEXT: vand.vx v12, v12, a1 841; RV32-NEXT: vand.vx v10, v10, a1 842; RV32-NEXT: vsrl.vv v12, v8, v12 843; RV32-NEXT: vsll.vv v8, v8, v10 844; RV32-NEXT: vor.vv v8, v8, v12 845; RV32-NEXT: ret 846; 847; RV64-LABEL: shuffle_v8f32_as_i64: 848; RV64: # %bb.0: 849; RV64-NEXT: li a0, 32 850; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma 851; RV64-NEXT: vsrl.vx v10, v8, a0 852; RV64-NEXT: vsll.vx v8, v8, a0 853; RV64-NEXT: vor.vv v8, v8, v10 854; RV64-NEXT: ret 855; 856; ZVKB-V-LABEL: shuffle_v8f32_as_i64: 857; ZVKB-V: # %bb.0: 858; ZVKB-V-NEXT: vsetivli zero, 4, e64, m2, ta, ma 859; ZVKB-V-NEXT: vror.vi v8, v8, 32 860; ZVKB-V-NEXT: ret 861; 862; ZVKB-ZVE32X-LABEL: shuffle_v8f32_as_i64: 863; ZVKB-ZVE32X: # %bb.0: 864; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI27_0) 865; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI27_0) 866; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma 867; ZVKB-ZVE32X-NEXT: vle8.v v12, (a0) 868; ZVKB-ZVE32X-NEXT: vsext.vf2 v16, v12 869; ZVKB-ZVE32X-NEXT: vsetvli zero, zero, e32, m4, ta, ma 870; ZVKB-ZVE32X-NEXT: vrgatherei16.vv v12, v8, v16 871; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v12 872; ZVKB-ZVE32X-NEXT: ret 873 %shuffle = shufflevector <8 x float> %v, <8 x float> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6> 874 ret <8 x float> %shuffle 875} 876 877define <8 x float> @shuffle_v8f32_as_i64_exact(<8 x float> %v) vscale_range(2,2) { 878; RV32-LABEL: shuffle_v8f32_as_i64_exact: 879; RV32: # %bb.0: 880; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma 881; RV32-NEXT: vmv.v.i v10, 0 882; RV32-NEXT: li a0, 32 883; RV32-NEXT: li a1, 63 884; RV32-NEXT: vwsubu.vx v12, v10, a0 885; RV32-NEXT: vsetvli zero, zero, e64, m2, ta, ma 886; RV32-NEXT: vmv.v.x v10, a0 887; RV32-NEXT: vand.vx v12, v12, a1 888; RV32-NEXT: vand.vx v10, v10, a1 889; RV32-NEXT: vsrl.vv v12, v8, v12 890; RV32-NEXT: vsll.vv v8, v8, v10 891; RV32-NEXT: vor.vv v8, v8, v12 892; RV32-NEXT: ret 893; 894; RV64-LABEL: shuffle_v8f32_as_i64_exact: 895; RV64: # %bb.0: 896; RV64-NEXT: li a0, 32 897; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma 898; RV64-NEXT: vsrl.vx v10, v8, a0 899; RV64-NEXT: vsll.vx v8, v8, a0 900; RV64-NEXT: vor.vv v8, v8, v10 901; RV64-NEXT: ret 902; 903; ZVKB-V-LABEL: shuffle_v8f32_as_i64_exact: 904; ZVKB-V: # %bb.0: 905; ZVKB-V-NEXT: vsetivli zero, 4, e64, m2, ta, ma 906; ZVKB-V-NEXT: vror.vi v8, v8, 32 907; ZVKB-V-NEXT: ret 908; 909; ZVKB-ZVE32X-LABEL: shuffle_v8f32_as_i64_exact: 910; ZVKB-ZVE32X: # %bb.0: 911; ZVKB-ZVE32X-NEXT: lui a0, 8240 912; ZVKB-ZVE32X-NEXT: addi a0, a0, 1 913; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e32, m1, ta, ma 914; ZVKB-ZVE32X-NEXT: vmv.s.x v10, a0 915; ZVKB-ZVE32X-NEXT: vsext.vf4 v12, v10 916; ZVKB-ZVE32X-NEXT: vrgather.vv v11, v9, v12 917; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12 918; ZVKB-ZVE32X-NEXT: vmv2r.v v8, v10 919; ZVKB-ZVE32X-NEXT: ret 920 %shuffle = shufflevector <8 x float> %v, <8 x float> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6> 921 ret <8 x float> %shuffle 922} 923