1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+f,+d,+zvfh,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV32 3; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+f,+d,+zvfh,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV64 4; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+f,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV32 5; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+f,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV64 6 7target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 8 9define <2 x i8> @vslide1down_2xi8(<2 x i8> %v, i8 %b) { 10; CHECK-LABEL: vslide1down_2xi8: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 13; CHECK-NEXT: vslide1down.vx v8, v8, a0 14; CHECK-NEXT: ret 15 %vb = insertelement <2 x i8> poison, i8 %b, i64 0 16 %v1 = shufflevector <2 x i8> %v, <2 x i8> %vb, <2 x i32> <i32 1, i32 2> 17 ret <2 x i8> %v1 18} 19 20define <4 x i8> @vslide1down_4xi8(<4 x i8> %v, i8 %b) { 21; CHECK-LABEL: vslide1down_4xi8: 22; CHECK: # %bb.0: 23; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 24; CHECK-NEXT: vslide1down.vx v8, v8, a0 25; CHECK-NEXT: ret 26 %vb = insertelement <4 x i8> poison, i8 %b, i64 0 27 %v1 = shufflevector <4 x i8> %v, <4 x i8> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 28 ret <4 x i8> %v1 29} 30 31define <4 x i8> @vslide1down_4xi8_swapped(<4 x i8> %v, i8 %b) { 32; CHECK-LABEL: vslide1down_4xi8_swapped: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 35; CHECK-NEXT: vslide1down.vx v8, v8, a0 36; CHECK-NEXT: ret 37 %vb = insertelement <4 x i8> poison, i8 %b, i64 0 38 %v1 = shufflevector <4 x i8> %vb, <4 x i8> %v, <4 x i32> <i32 5, i32 6, i32 7, i32 0> 39 ret <4 x i8> %v1 40} 41 42define <2 x i16> @vslide1down_2xi16(<2 x i16> %v, i16 %b) { 43; CHECK-LABEL: vslide1down_2xi16: 44; CHECK: # %bb.0: 45; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 46; CHECK-NEXT: vslide1down.vx v8, v8, a0 47; CHECK-NEXT: ret 48 %vb = insertelement <2 x i16> poison, i16 %b, i64 0 49 %v1 = shufflevector <2 x i16> %v, <2 x i16> %vb, <2 x i32> <i32 1, i32 2> 50 ret <2 x i16> %v1 51} 52 53define <4 x i16> @vslide1down_4xi16(<4 x i16> %v, i16 %b) { 54; CHECK-LABEL: vslide1down_4xi16: 55; CHECK: # %bb.0: 56; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 57; CHECK-NEXT: vslide1down.vx v8, v8, a0 58; CHECK-NEXT: ret 59 %vb = insertelement <4 x i16> poison, i16 %b, i64 0 60 %v1 = shufflevector <4 x i16> %v, <4 x i16> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 61 ret <4 x i16> %v1 62} 63 64define <2 x i32> @vslide1down_2xi32(<2 x i32> %v, i32 %b) { 65; CHECK-LABEL: vslide1down_2xi32: 66; CHECK: # %bb.0: 67; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 68; CHECK-NEXT: vslide1down.vx v8, v8, a0 69; CHECK-NEXT: ret 70 %vb = insertelement <2 x i32> poison, i32 %b, i64 0 71 %v1 = shufflevector <2 x i32> %v, <2 x i32> %vb, <2 x i32> <i32 1, i32 2> 72 ret <2 x i32> %v1 73} 74 75define <4 x i32> @vslide1down_4xi32(<4 x i32> %v, i32 %b) { 76; CHECK-LABEL: vslide1down_4xi32: 77; CHECK: # %bb.0: 78; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 79; CHECK-NEXT: vslide1down.vx v8, v8, a0 80; CHECK-NEXT: ret 81 %vb = insertelement <4 x i32> poison, i32 %b, i64 0 82 %v1 = shufflevector <4 x i32> %v, <4 x i32> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 83 ret <4 x i32> %v1 84} 85 86define <2 x i64> @vslide1down_2xi64(<2 x i64> %v, i64 %b) { 87; RV32-LABEL: vslide1down_2xi64: 88; RV32: # %bb.0: 89; RV32-NEXT: addi sp, sp, -16 90; RV32-NEXT: .cfi_def_cfa_offset 16 91; RV32-NEXT: sw a0, 8(sp) 92; RV32-NEXT: sw a1, 12(sp) 93; RV32-NEXT: addi a0, sp, 8 94; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma 95; RV32-NEXT: vlse64.v v9, (a0), zero 96; RV32-NEXT: vslidedown.vi v8, v8, 1 97; RV32-NEXT: vslideup.vi v8, v9, 1 98; RV32-NEXT: addi sp, sp, 16 99; RV32-NEXT: .cfi_def_cfa_offset 0 100; RV32-NEXT: ret 101; 102; RV64-LABEL: vslide1down_2xi64: 103; RV64: # %bb.0: 104; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 105; RV64-NEXT: vslide1down.vx v8, v8, a0 106; RV64-NEXT: ret 107 %vb = insertelement <2 x i64> poison, i64 %b, i64 0 108 %v1 = shufflevector <2 x i64> %v, <2 x i64> %vb, <2 x i32> <i32 1, i32 2> 109 ret <2 x i64> %v1 110} 111 112define <4 x i64> @vslide1down_4xi64(<4 x i64> %v, i64 %b) { 113; RV32-LABEL: vslide1down_4xi64: 114; RV32: # %bb.0: 115; RV32-NEXT: addi sp, sp, -16 116; RV32-NEXT: .cfi_def_cfa_offset 16 117; RV32-NEXT: sw a0, 8(sp) 118; RV32-NEXT: sw a1, 12(sp) 119; RV32-NEXT: addi a0, sp, 8 120; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma 121; RV32-NEXT: vlse64.v v10, (a0), zero 122; RV32-NEXT: vslidedown.vi v8, v8, 1 123; RV32-NEXT: vslideup.vi v8, v10, 3 124; RV32-NEXT: addi sp, sp, 16 125; RV32-NEXT: .cfi_def_cfa_offset 0 126; RV32-NEXT: ret 127; 128; RV64-LABEL: vslide1down_4xi64: 129; RV64: # %bb.0: 130; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma 131; RV64-NEXT: vslide1down.vx v8, v8, a0 132; RV64-NEXT: ret 133 %vb = insertelement <4 x i64> poison, i64 %b, i64 0 134 %v1 = shufflevector <4 x i64> %v, <4 x i64> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 135 ret <4 x i64> %v1 136} 137 138define <2 x bfloat> @vslide1down_2xbf16(<2 x bfloat> %v, bfloat %b) { 139; CHECK-LABEL: vslide1down_2xbf16: 140; CHECK: # %bb.0: 141; CHECK-NEXT: fmv.x.h a0, fa0 142; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 143; CHECK-NEXT: vslide1down.vx v8, v8, a0 144; CHECK-NEXT: ret 145 %vb = insertelement <2 x bfloat> poison, bfloat %b, i64 0 146 %v1 = shufflevector <2 x bfloat> %v, <2 x bfloat> %vb, <2 x i32> <i32 1, i32 2> 147 ret <2 x bfloat> %v1 148} 149 150define <4 x bfloat> @vslide1down_4xbf16(<4 x bfloat> %v, bfloat %b) { 151; CHECK-LABEL: vslide1down_4xbf16: 152; CHECK: # %bb.0: 153; CHECK-NEXT: fmv.x.h a0, fa0 154; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 155; CHECK-NEXT: vslide1down.vx v8, v8, a0 156; CHECK-NEXT: ret 157 %vb = insertelement <4 x bfloat> poison, bfloat %b, i64 0 158 %v1 = shufflevector <4 x bfloat> %v, <4 x bfloat> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 159 ret <4 x bfloat> %v1 160} 161 162define <2 x half> @vslide1down_2xf16(<2 x half> %v, half %b) { 163; ZVFH-LABEL: vslide1down_2xf16: 164; ZVFH: # %bb.0: 165; ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 166; ZVFH-NEXT: vfslide1down.vf v8, v8, fa0 167; ZVFH-NEXT: ret 168; 169; ZVFHMIN-LABEL: vslide1down_2xf16: 170; ZVFHMIN: # %bb.0: 171; ZVFHMIN-NEXT: fmv.x.h a0, fa0 172; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 173; ZVFHMIN-NEXT: vslide1down.vx v8, v8, a0 174; ZVFHMIN-NEXT: ret 175 %vb = insertelement <2 x half> poison, half %b, i64 0 176 %v1 = shufflevector <2 x half> %v, <2 x half> %vb, <2 x i32> <i32 1, i32 2> 177 ret <2 x half> %v1 178} 179 180define <4 x half> @vslide1down_4xf16(<4 x half> %v, half %b) { 181; ZVFH-LABEL: vslide1down_4xf16: 182; ZVFH: # %bb.0: 183; ZVFH-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 184; ZVFH-NEXT: vfslide1down.vf v8, v8, fa0 185; ZVFH-NEXT: ret 186; 187; ZVFHMIN-LABEL: vslide1down_4xf16: 188; ZVFHMIN: # %bb.0: 189; ZVFHMIN-NEXT: fmv.x.h a0, fa0 190; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 191; ZVFHMIN-NEXT: vslide1down.vx v8, v8, a0 192; ZVFHMIN-NEXT: ret 193 %vb = insertelement <4 x half> poison, half %b, i64 0 194 %v1 = shufflevector <4 x half> %v, <4 x half> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 195 ret <4 x half> %v1 196} 197 198define <2 x float> @vslide1down_2xf32(<2 x float> %v, float %b) { 199; CHECK-LABEL: vslide1down_2xf32: 200; CHECK: # %bb.0: 201; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 202; CHECK-NEXT: vfslide1down.vf v8, v8, fa0 203; CHECK-NEXT: ret 204 %vb = insertelement <2 x float> poison, float %b, i64 0 205 %v1 = shufflevector <2 x float> %v, <2 x float> %vb, <2 x i32> <i32 1, i32 2> 206 ret <2 x float> %v1 207} 208 209define <4 x float> @vslide1down_4xf32(<4 x float> %v, float %b) { 210; CHECK-LABEL: vslide1down_4xf32: 211; CHECK: # %bb.0: 212; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 213; CHECK-NEXT: vfslide1down.vf v8, v8, fa0 214; CHECK-NEXT: ret 215 %vb = insertelement <4 x float> poison, float %b, i64 0 216 %v1 = shufflevector <4 x float> %v, <4 x float> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 217 ret <4 x float> %v1 218} 219 220define <2 x double> @vslide1down_2xf64(<2 x double> %v, double %b) { 221; CHECK-LABEL: vslide1down_2xf64: 222; CHECK: # %bb.0: 223; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 224; CHECK-NEXT: vfslide1down.vf v8, v8, fa0 225; CHECK-NEXT: ret 226 %vb = insertelement <2 x double> poison, double %b, i64 0 227 %v1 = shufflevector <2 x double> %v, <2 x double> %vb, <2 x i32> <i32 1, i32 2> 228 ret <2 x double> %v1 229} 230 231define <4 x double> @vslide1down_4xf64(<4 x double> %v, double %b) { 232; CHECK-LABEL: vslide1down_4xf64: 233; CHECK: # %bb.0: 234; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 235; CHECK-NEXT: vfslide1down.vf v8, v8, fa0 236; CHECK-NEXT: ret 237 %vb = insertelement <4 x double> poison, double %b, i64 0 238 %v1 = shufflevector <4 x double> %v, <4 x double> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 239 ret <4 x double> %v1 240} 241 242define <4 x i8> @vslide1down_4xi8_with_splat(<4 x i8> %v, i8 %b) { 243; CHECK-LABEL: vslide1down_4xi8_with_splat: 244; CHECK: # %bb.0: 245; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 246; CHECK-NEXT: vslide1down.vx v8, v8, a0 247; CHECK-NEXT: ret 248 %vb = insertelement <4 x i8> poison, i8 %b, i64 0 249 %v1 = shufflevector <4 x i8> %vb, <4 x i8> poison, <4 x i32> zeroinitializer 250 %v2 = shufflevector <4 x i8> %v1, <4 x i8> %v, <4 x i32> <i32 5, i32 6, i32 7, i32 1> 251 ret <4 x i8> %v2 252} 253 254define <2 x double> @vslide1down_v2f64_inverted(<2 x double> %v, double %b) { 255; CHECK-LABEL: vslide1down_v2f64_inverted: 256; CHECK: # %bb.0: 257; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 258; CHECK-NEXT: vrgather.vi v9, v8, 0 259; CHECK-NEXT: vfmv.s.f v8, fa0 260; CHECK-NEXT: vslideup.vi v9, v8, 1 261; CHECK-NEXT: vmv.v.v v8, v9 262; CHECK-NEXT: ret 263 %v1 = shufflevector <2 x double> %v, <2 x double> poison, <2 x i32> <i32 0, i32 0> 264 %v2 = insertelement <2 x double> %v1, double %b, i64 1 265 ret <2 x double> %v2 266} 267 268define <4 x i8> @vslide1down_4xi8_inverted(<4 x i8> %v, i8 %b) { 269; CHECK-LABEL: vslide1down_4xi8_inverted: 270; CHECK: # %bb.0: 271; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 272; CHECK-NEXT: vslideup.vi v9, v8, 1 273; CHECK-NEXT: vmv.s.x v8, a0 274; CHECK-NEXT: vsetivli zero, 2, e8, mf4, tu, ma 275; CHECK-NEXT: vslideup.vi v9, v8, 1 276; CHECK-NEXT: vmv1r.v v8, v9 277; CHECK-NEXT: ret 278 %v1 = shufflevector <4 x i8> %v, <4 x i8> poison, <4 x i32> <i32 undef, i32 0, i32 1, i32 2> 279 %v2 = insertelement <4 x i8> %v1, i8 %b, i64 1 280 ret <4 x i8> %v2 281} 282