diff --git a/llvm/test/CodeGen/RISCV/rvv/vector-splice.ll b/llvm/test/CodeGen/RISCV/rvv/vector-splice.ll --- a/llvm/test/CodeGen/RISCV/rvv/vector-splice.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vector-splice.ll @@ -1,8 +1,211 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple riscv32 -mattr=+m,+f,+d,+v,+zfh,+experimental-zvfh < %s | FileCheck %s ; RUN: llc -mtriple riscv64 -mattr=+m,+f,+d,+v,+zfh,+experimental-zvfh < %s | FileCheck %s ; Tests assume VLEN=128 or vscale_range_min=2. +declare @llvm.experimental.vector.splice.nxv1i1(, , i32) + +define @splice_nxv1i1_offset_negone( %a, %b) #0 { +; CHECK-LABEL: splice_nxv1i1_offset_negone: +; CHECK: # %bb.0: +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: sub sp, sp, a0 +; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, mu +; CHECK-NEXT: addi a0, sp, 16 +; CHECK-NEXT: vsm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: srli a0, a0, 3 +; CHECK-NEXT: addi a1, sp, 16 +; CHECK-NEXT: add a0, a1, a0 +; CHECK-NEXT: vsm.v v8, (a0) +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vlm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: add sp, sp, a0 +; CHECK-NEXT: addi sp, sp, 16 +; CHECK-NEXT: ret + %res = call @llvm.experimental.vector.splice.nxv1i1( %a, %b, i32 -1) + ret %res +} + +declare @llvm.experimental.vector.splice.nxv2i1(, , i32) + +define @splice_nxv2i1_offset_negone( %a, %b) #0 { +; CHECK-LABEL: splice_nxv2i1_offset_negone: +; CHECK: # %bb.0: +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: sub sp, sp, a0 +; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, mu +; CHECK-NEXT: addi a0, sp, 16 +; CHECK-NEXT: vsm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: srli a0, a0, 3 +; CHECK-NEXT: addi a1, sp, 16 +; CHECK-NEXT: add a0, a1, a0 +; CHECK-NEXT: vsm.v v8, (a0) +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vlm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: add sp, sp, a0 +; CHECK-NEXT: addi sp, sp, 16 +; CHECK-NEXT: ret + %res = call @llvm.experimental.vector.splice.nxv2i1( %a, %b, i32 -1) + ret %res +} + +declare @llvm.experimental.vector.splice.nxv4i1(, , i32) + +define @splice_nxv4i1_offset_negone( %a, %b) #0 { +; CHECK-LABEL: splice_nxv4i1_offset_negone: +; CHECK: # %bb.0: +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: sub sp, sp, a0 +; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, mu +; CHECK-NEXT: addi a0, sp, 16 +; CHECK-NEXT: vsm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: srli a0, a0, 3 +; CHECK-NEXT: addi a1, sp, 16 +; CHECK-NEXT: add a0, a1, a0 +; CHECK-NEXT: vsm.v v8, (a0) +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vlm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: add sp, sp, a0 +; CHECK-NEXT: addi sp, sp, 16 +; CHECK-NEXT: ret + %res = call @llvm.experimental.vector.splice.nxv4i1( %a, %b, i32 -1) + ret %res +} + +declare @llvm.experimental.vector.splice.nxv8i1(, , i32) + +define @splice_nxv8i1_offset_negone( %a, %b) #0 { +; CHECK-LABEL: splice_nxv8i1_offset_negone: +; CHECK: # %bb.0: +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: sub sp, sp, a0 +; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, mu +; CHECK-NEXT: addi a0, sp, 16 +; CHECK-NEXT: vsm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: srli a0, a0, 3 +; CHECK-NEXT: addi a1, sp, 16 +; CHECK-NEXT: add a0, a1, a0 +; CHECK-NEXT: vsm.v v8, (a0) +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vlm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: add sp, sp, a0 +; CHECK-NEXT: addi sp, sp, 16 +; CHECK-NEXT: ret + %res = call @llvm.experimental.vector.splice.nxv8i1( %a, %b, i32 -1) + ret %res +} + +declare @llvm.experimental.vector.splice.nxv16i1(, , i32) + +define @splice_nxv16i1_offset_negone( %a, %b) #0 { +; CHECK-LABEL: splice_nxv16i1_offset_negone: +; CHECK: # %bb.0: +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: sub sp, sp, a0 +; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, mu +; CHECK-NEXT: addi a0, sp, 16 +; CHECK-NEXT: vsm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: srli a0, a0, 2 +; CHECK-NEXT: addi a1, sp, 16 +; CHECK-NEXT: add a0, a1, a0 +; CHECK-NEXT: vsm.v v8, (a0) +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vlm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: add sp, sp, a0 +; CHECK-NEXT: addi sp, sp, 16 +; CHECK-NEXT: ret + %res = call @llvm.experimental.vector.splice.nxv16i1( %a, %b, i32 -1) + ret %res +} + +declare @llvm.experimental.vector.splice.nxv32i1(, , i32) + +define @splice_nxv32i1_offset_negone( %a, %b) #0 { +; CHECK-LABEL: splice_nxv32i1_offset_negone: +; CHECK: # %bb.0: +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: sub sp, sp, a0 +; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, mu +; CHECK-NEXT: addi a0, sp, 16 +; CHECK-NEXT: vsm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: srli a0, a0, 1 +; CHECK-NEXT: addi a1, sp, 16 +; CHECK-NEXT: add a0, a1, a0 +; CHECK-NEXT: vsm.v v8, (a0) +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vlm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: add sp, sp, a0 +; CHECK-NEXT: addi sp, sp, 16 +; CHECK-NEXT: ret + %res = call @llvm.experimental.vector.splice.nxv32i1( %a, %b, i32 -1) + ret %res +} + +declare @llvm.experimental.vector.splice.nxv64i1(, , i32) + +define @splice_nxv64i1_offset_negone( %a, %b) #0 { +; CHECK-LABEL: splice_nxv64i1_offset_negone: +; CHECK: # %bb.0: +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: sub sp, sp, a0 +; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, mu +; CHECK-NEXT: addi a0, sp, 16 +; CHECK-NEXT: vsm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: addi a1, sp, 16 +; CHECK-NEXT: add a0, a1, a0 +; CHECK-NEXT: vsm.v v8, (a0) +; CHECK-NEXT: addi a0, a0, -1 +; CHECK-NEXT: vlm.v v0, (a0) +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 1 +; CHECK-NEXT: add sp, sp, a0 +; CHECK-NEXT: addi sp, sp, 16 +; CHECK-NEXT: ret + %res = call @llvm.experimental.vector.splice.nxv64i1( %a, %b, i32 -1) + ret %res +} + declare @llvm.experimental.vector.splice.nxv1i8(, , i32) define @splice_nxv1i8_offset_zero( %a, %b) #0 {