diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 2b3f8d1cdf60f..712f6154732a2 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -1156,6 +1156,8 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM, ISD::VECTOR_REVERSE, ISD::VECTOR_SPLICE, ISD::VECTOR_COMPRESS}, VT, Custom); + setOperationAction(ISD::EXPERIMENTAL_VP_SPLICE, VT, Custom); + setOperationAction(ISD::EXPERIMENTAL_VP_REVERSE, VT, Custom); MVT EltVT = VT.getVectorElementType(); if (isTypeLegal(EltVT)) setOperationAction({ISD::SPLAT_VECTOR, ISD::EXPERIMENTAL_VP_SPLAT, diff --git a/llvm/test/CodeGen/RISCV/rvv/vp-reverse-float.ll b/llvm/test/CodeGen/RISCV/rvv/vp-reverse-float.ll index 4bbd10df5254f..9fafc4ac0667e 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vp-reverse-float.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vp-reverse-float.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc -mtriple=riscv64 -mattr=+m,+f,+d,+v,+zvfh -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -mtriple=riscv64 -mattr=+m,+f,+d,+v,+zvfh,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -mtriple=riscv64 -mattr=+m,+f,+d,+v,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s define @test_vp_reverse_nxv1f16_masked( %src, %mask, i32 zeroext %evl) { ; CHECK-LABEL: test_vp_reverse_nxv1f16_masked: @@ -435,3 +436,177 @@ define @test_vp_reverse_nxv32f16( %src, %dst = call @llvm.experimental.vp.reverse.nxv32f16( %src, splat (i1 1), i32 %evl) ret %dst } + +define @test_vp_reverse_nxv1bf16_masked( %src, %mask, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv1bf16_masked: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma +; CHECK-NEXT: vid.v v9, v0.t +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vrsub.vx v10, v9, a0, v0.t +; CHECK-NEXT: vrgather.vv v9, v8, v10, v0.t +; CHECK-NEXT: vmv1r.v v8, v9 +; CHECK-NEXT: ret + %dst = call @llvm.experimental.vp.reverse.nxv1bf16( %src, %mask, i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv1bf16( %src, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv1bf16: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a1, a0, -1 +; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma +; CHECK-NEXT: vid.v v9 +; CHECK-NEXT: vrsub.vx v10, v9, a1 +; CHECK-NEXT: vrgather.vv v9, v8, v10 +; CHECK-NEXT: vmv1r.v v8, v9 +; CHECK-NEXT: ret + + %dst = call @llvm.experimental.vp.reverse.nxv1bf16( %src, splat (i1 1), i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv2bf16_masked( %src, %mask, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv2bf16_masked: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma +; CHECK-NEXT: vid.v v9, v0.t +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vrsub.vx v10, v9, a0, v0.t +; CHECK-NEXT: vrgather.vv v9, v8, v10, v0.t +; CHECK-NEXT: vmv1r.v v8, v9 +; CHECK-NEXT: ret + %dst = call @llvm.experimental.vp.reverse.nxv2bf16( %src, %mask, i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv2bf16( %src, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv2bf16: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a1, a0, -1 +; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma +; CHECK-NEXT: vid.v v9 +; CHECK-NEXT: vrsub.vx v10, v9, a1 +; CHECK-NEXT: vrgather.vv v9, v8, v10 +; CHECK-NEXT: vmv1r.v v8, v9 +; CHECK-NEXT: ret + + %dst = call @llvm.experimental.vp.reverse.nxv2bf16( %src, splat (i1 1), i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv4bf16_masked( %src, %mask, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv4bf16_masked: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma +; CHECK-NEXT: vid.v v9, v0.t +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vrsub.vx v10, v9, a0, v0.t +; CHECK-NEXT: vrgather.vv v9, v8, v10, v0.t +; CHECK-NEXT: vmv.v.v v8, v9 +; CHECK-NEXT: ret + %dst = call @llvm.experimental.vp.reverse.nxv4bf16( %src, %mask, i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv4bf16( %src, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv4bf16: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a1, a0, -1 +; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma +; CHECK-NEXT: vid.v v9 +; CHECK-NEXT: vrsub.vx v10, v9, a1 +; CHECK-NEXT: vrgather.vv v9, v8, v10 +; CHECK-NEXT: vmv.v.v v8, v9 +; CHECK-NEXT: ret + + %dst = call @llvm.experimental.vp.reverse.nxv4bf16( %src, splat (i1 1), i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv8bf16_masked( %src, %mask, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv8bf16_masked: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma +; CHECK-NEXT: vid.v v10, v0.t +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vrsub.vx v12, v10, a0, v0.t +; CHECK-NEXT: vrgather.vv v10, v8, v12, v0.t +; CHECK-NEXT: vmv.v.v v8, v10 +; CHECK-NEXT: ret + %dst = call @llvm.experimental.vp.reverse.nxv8bf16( %src, %mask, i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv8bf16( %src, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv8bf16: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a1, a0, -1 +; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma +; CHECK-NEXT: vid.v v10 +; CHECK-NEXT: vrsub.vx v12, v10, a1 +; CHECK-NEXT: vrgather.vv v10, v8, v12 +; CHECK-NEXT: vmv.v.v v8, v10 +; CHECK-NEXT: ret + + %dst = call @llvm.experimental.vp.reverse.nxv8bf16( %src, splat (i1 1), i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv16bf16_masked( %src, %mask, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv16bf16_masked: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma +; CHECK-NEXT: vid.v v12, v0.t +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vrsub.vx v16, v12, a0, v0.t +; CHECK-NEXT: vrgather.vv v12, v8, v16, v0.t +; CHECK-NEXT: vmv.v.v v8, v12 +; CHECK-NEXT: ret + %dst = call @llvm.experimental.vp.reverse.nxv16bf16( %src, %mask, i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv16bf16( %src, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv16bf16: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a1, a0, -1 +; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma +; CHECK-NEXT: vid.v v12 +; CHECK-NEXT: vrsub.vx v16, v12, a1 +; CHECK-NEXT: vrgather.vv v12, v8, v16 +; CHECK-NEXT: vmv.v.v v8, v12 +; CHECK-NEXT: ret + + %dst = call @llvm.experimental.vp.reverse.nxv16bf16( %src, splat (i1 1), i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv32bf16_masked( %src, %mask, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv32bf16_masked: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma +; CHECK-NEXT: vid.v v16, v0.t +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vrsub.vx v24, v16, a0, v0.t +; CHECK-NEXT: vrgather.vv v16, v8, v24, v0.t +; CHECK-NEXT: vmv.v.v v8, v16 +; CHECK-NEXT: ret + %dst = call @llvm.experimental.vp.reverse.nxv32bf16( %src, %mask, i32 %evl) + ret %dst +} + +define @test_vp_reverse_nxv32bf16( %src, i32 zeroext %evl) { +; CHECK-LABEL: test_vp_reverse_nxv32bf16: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a1, a0, -1 +; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma +; CHECK-NEXT: vid.v v16 +; CHECK-NEXT: vrsub.vx v24, v16, a1 +; CHECK-NEXT: vrgather.vv v16, v8, v24 +; CHECK-NEXT: vmv.v.v v8, v16 +; CHECK-NEXT: ret + + %dst = call @llvm.experimental.vp.reverse.nxv32bf16( %src, splat (i1 1), i32 %evl) + ret %dst +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vp-splice.ll b/llvm/test/CodeGen/RISCV/rvv/vp-splice.ll index 792afb48fadda..6008ea43e9158 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vp-splice.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vp-splice.ll @@ -1,5 +1,7 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc -mtriple riscv64 -mattr=+f,+d,+v,+zvfh -verify-machineinstrs \ +; RUN: llc -mtriple riscv64 -mattr=+f,+d,+v,+zvfh,+zvfbfmin -verify-machineinstrs \ +; RUN: < %s | FileCheck %s +; RUN: llc -mtriple riscv64 -mattr=+f,+d,+v,+zvfhmin,+zvfbfmin -verify-machineinstrs \ ; RUN: < %s | FileCheck %s define @test_vp_splice_nxv2i64( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { @@ -464,3 +466,42 @@ define @test_vp_splice_nxv2f16_masked( %v %v = call @llvm.experimental.vp.splice.nxv2f16( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) ret %v } + +define @test_vp_splice_nxv2bf16( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +; CHECK-LABEL: test_vp_splice_nxv2bf16: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma +; CHECK-NEXT: vslidedown.vi v8, v8, 5 +; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma +; CHECK-NEXT: vslideup.vx v8, v9, a0 +; CHECK-NEXT: ret + %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + ret %v +} + +define @test_vp_splice_nxv2bf16_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +; CHECK-LABEL: test_vp_splice_nxv2bf16_negative_offset: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: vsetivli zero, 5, e16, mf2, ta, ma +; CHECK-NEXT: vslidedown.vx v8, v8, a0 +; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma +; CHECK-NEXT: vslideup.vi v8, v9, 5 +; CHECK-NEXT: ret + %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + ret %v +} + +define @test_vp_splice_nxv2bf16_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +; CHECK-LABEL: test_vp_splice_nxv2bf16_masked: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma +; CHECK-NEXT: vslidedown.vi v8, v8, 5, v0.t +; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, mu +; CHECK-NEXT: vslideup.vx v8, v9, a0, v0.t +; CHECK-NEXT: ret + %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + ret %v +}