136 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+v,+zvfh,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,NOZFMIN,ZVFH3; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfh,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,NOZFMIN,ZVFH4; RUN: llc -mtriple=riscv32 -mattr=+v,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,NOZFMIN,ZVFHMIN5; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,NOZFMIN,ZVFHMIN6; RUN: llc -mtriple=riscv32 -mattr=+v,+zfhmin,+zfbfmin,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZFMIN7; RUN: llc -mtriple=riscv64 -mattr=+v,+zfhmin,+zfbfmin,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZFMIN8 9define <vscale x 8 x bfloat> @vsplat_nxv8bf16(bfloat %f) {10; NOZFMIN-LABEL: vsplat_nxv8bf16:11; NOZFMIN: # %bb.0:12; NOZFMIN-NEXT: fmv.x.w a0, fa013; NOZFMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma14; NOZFMIN-NEXT: vmv.v.x v8, a015; NOZFMIN-NEXT: ret16;17; ZFMIN-LABEL: vsplat_nxv8bf16:18; ZFMIN: # %bb.0:19; ZFMIN-NEXT: fmv.x.h a0, fa020; ZFMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma21; ZFMIN-NEXT: vmv.v.x v8, a022; ZFMIN-NEXT: ret23 %head = insertelement <vscale x 8 x bfloat> poison, bfloat %f, i32 024 %splat = shufflevector <vscale x 8 x bfloat> %head, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer25 ret <vscale x 8 x bfloat> %splat26}27 28define <vscale x 8 x bfloat> @vsplat_zero_nxv8bf16() {29; CHECK-LABEL: vsplat_zero_nxv8bf16:30; CHECK: # %bb.0:31; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma32; CHECK-NEXT: vmv.v.i v8, 033; CHECK-NEXT: ret34 ret <vscale x 8 x bfloat> splat (bfloat zeroinitializer)35}36 37define <vscale x 8 x half> @vsplat_nxv8f16(half %f) {38; ZVFH-LABEL: vsplat_nxv8f16:39; ZVFH: # %bb.0:40; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma41; ZVFH-NEXT: vfmv.v.f v8, fa042; ZVFH-NEXT: ret43;44; ZVFHMIN-LABEL: vsplat_nxv8f16:45; ZVFHMIN: # %bb.0:46; ZVFHMIN-NEXT: fmv.x.w a0, fa047; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma48; ZVFHMIN-NEXT: vmv.v.x v8, a049; ZVFHMIN-NEXT: ret50;51; ZFMIN-LABEL: vsplat_nxv8f16:52; ZFMIN: # %bb.0:53; ZFMIN-NEXT: fmv.x.h a0, fa054; ZFMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma55; ZFMIN-NEXT: vmv.v.x v8, a056; ZFMIN-NEXT: ret57 %head = insertelement <vscale x 8 x half> poison, half %f, i32 058 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer59 ret <vscale x 8 x half> %splat60}61 62define <vscale x 8 x half> @vsplat_zero_nxv8f16() {63; CHECK-LABEL: vsplat_zero_nxv8f16:64; CHECK: # %bb.0:65; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma66; CHECK-NEXT: vmv.v.i v8, 067; CHECK-NEXT: ret68 ret <vscale x 8 x half> splat (half zeroinitializer)69}70 71define <vscale x 8 x float> @vsplat_nxv8f32(float %f) {72; CHECK-LABEL: vsplat_nxv8f32:73; CHECK: # %bb.0:74; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma75; CHECK-NEXT: vfmv.v.f v8, fa076; CHECK-NEXT: ret77 %head = insertelement <vscale x 8 x float> poison, float %f, i32 078 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer79 ret <vscale x 8 x float> %splat80}81 82define <vscale x 8 x float> @vsplat_zero_nxv8f32() {83; CHECK-LABEL: vsplat_zero_nxv8f32:84; CHECK: # %bb.0:85; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma86; CHECK-NEXT: vmv.v.i v8, 087; CHECK-NEXT: ret88 ret <vscale x 8 x float> splat (float zeroinitializer)89}90 91define <vscale x 8 x double> @vsplat_nxv8f64(double %f) {92; CHECK-LABEL: vsplat_nxv8f64:93; CHECK: # %bb.0:94; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma95; CHECK-NEXT: vfmv.v.f v8, fa096; CHECK-NEXT: ret97 %head = insertelement <vscale x 8 x double> poison, double %f, i32 098 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer99 ret <vscale x 8 x double> %splat100}101 102define <vscale x 8 x double> @vsplat_zero_nxv8f64() {103; CHECK-LABEL: vsplat_zero_nxv8f64:104; CHECK: # %bb.0:105; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma106; CHECK-NEXT: vmv.v.i v8, 0107; CHECK-NEXT: ret108 ret <vscale x 8 x double> splat (double zeroinitializer)109}110 111define <vscale x 8 x float> @vsplat_load_nxv8f32(ptr %ptr) {112; CHECK-LABEL: vsplat_load_nxv8f32:113; CHECK: # %bb.0:114; CHECK-NEXT: flw fa5, 0(a0)115; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma116; CHECK-NEXT: vfmv.v.f v8, fa5117; CHECK-NEXT: ret118 %f = load float, ptr %ptr119 %head = insertelement <vscale x 8 x float> poison, float %f, i32 0120 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer121 ret <vscale x 8 x float> %splat122}123 124; Test that we fold this to a vlse with 0 stride.125define <vscale x 8 x float> @vsplat_load_nxv8f32_optimized(ptr %ptr) "target-features"="+optimized-zero-stride-load" {126; CHECK-LABEL: vsplat_load_nxv8f32_optimized:127; CHECK: # %bb.0:128; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma129; CHECK-NEXT: vlse32.v v8, (a0), zero130; CHECK-NEXT: ret131 %f = load float, ptr %ptr132 %head = insertelement <vscale x 8 x float> poison, float %f, i32 0133 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer134 ret <vscale x 8 x float> %splat135}136