From 43d207addaf4111dd6a4e0e702e8797587ce61ba Mon Sep 17 00:00:00 2001 From: Jiahan Xie <88367305+jiahanxie353@users.noreply.github.com> Date: Mon, 24 Jun 2024 13:48:59 -0400 Subject: [PATCH] [RISCV][GISEL] IRTranslator for Scalable Vector Store (#86699) Support IR translation for scalable vector store --- llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 2 +- .../GlobalISel/irtranslator/vec-store.ll | 950 ++++++++++++++++++ 2 files changed, 951 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-store.ll diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index a02fd5bd1b65..7c7f16782123 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -21785,7 +21785,7 @@ bool RISCVTargetLowering::fallBackToDAGISel(const Instruction &Inst) const { Op == Instruction::And || Op == Instruction::Or || Op == Instruction::Xor || Op == Instruction::InsertElement || Op == Instruction::ShuffleVector || Op == Instruction::Load || - Op == Instruction::Freeze) + Op == Instruction::Freeze || Op == Instruction::Store) return false; if (Inst.getType()->isScalableTy()) diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-store.ll b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-store.ll new file mode 100644 index 000000000000..5a9cfd4d55cf --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-store.ll @@ -0,0 +1,950 @@ +; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +; RUN: llc -mtriple=riscv32 -mattr=+v -global-isel -stop-after=irtranslator -verify-machineinstrs < %s | FileCheck -check-prefixes=RV32 %s +; RUN: llc -mtriple=riscv64 -mattr=+v -global-isel -stop-after=irtranslator -verify-machineinstrs < %s | FileCheck -check-prefixes=RV64 %s + +define void @vstore_nx1i8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx1i8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx1i8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx2i8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx4i8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx4i8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx4i8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx8i8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx8i8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx8i8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx16i8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx16i8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx16i8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx32i8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx32i8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m4 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx32i8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m4 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx64i8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx64i8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m8 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx64i8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m8 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx1i16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx1i16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx1i16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx2i16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx4i16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx4i16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx4i16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx8i16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx8i16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx8i16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx16i16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx16i16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m4 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx16i16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m4 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx32i16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx32i16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m8 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx32i16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m8 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx1i32(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx1i32 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx1i32 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx2i32(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i32 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i32 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx4i32(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx4i32 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx4i32 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx8i32(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx8i32 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m4 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx8i32 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m4 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx16i32(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx16i32 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m8 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx16i32 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m8 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx1i64(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx1i64 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx1i64 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx2i64(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i64 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i64 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx4i64(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx4i64 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m4 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx4i64 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m4 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx8i64(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx8i64 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m8 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx8i64 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m8 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx16i8_align1(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx16i8_align1 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 1) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx16i8_align1 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 1) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 1 + ret void +} + +define void @vstore_nx16i8_align2(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx16i8_align2 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 2) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx16i8_align2 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 2) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 2 + ret void +} + +define void @vstore_nx16i8_align16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx16i8_align16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx16i8_align16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 16 + ret void +} + +define void @vstore_nx16i8_align64(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx16i8_align64 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 64) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx16i8_align64 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 64) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 64 + ret void +} + +define void @vstore_nx4i16_align1(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx4i16_align1 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 1) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx4i16_align1 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 1) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 1 + ret void +} + +define void @vstore_nx4i16_align2(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx4i16_align2 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 2) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx4i16_align2 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 2) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 2 + ret void +} + +define void @vstore_nx4i16_align4(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx4i16_align4 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 4) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx4i16_align4 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 4) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 4 + ret void +} + +define void @vstore_nx4i16_align8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx4i16_align8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx4i16_align8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 8 + ret void +} + +define void @vstore_nx4i16_align16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx4i16_align16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 16) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx4i16_align16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 16) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 16 + ret void +} + +define void @vstore_nx2i32_align2(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i32_align2 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 2) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i32_align2 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 2) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 2 + ret void +} + +define void @vstore_nx2i32_align4(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i32_align4 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 4) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i32_align4 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 4) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 4 + ret void +} + +define void @vstore_nx2i32_align8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i32_align8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i32_align8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 8 + ret void +} + +define void @vstore_nx2i32_align16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i32_align16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 16) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i32_align16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 16) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 16 + ret void +} + +define void @vstore_nx2i32_align256(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i32_align256 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 256) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i32_align256 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 256) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 256 + ret void +} + +define void @vstore_nx2i64_align4(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i64_align4 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 4) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i64_align4 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 4) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 4 + ret void +} + +define void @vstore_nx2i64_align8(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i64_align8 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 8) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i64_align8 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 8) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 8 + ret void +} + +define void @vstore_nx2i64_align16(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i64_align16 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i64_align16 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 16 + ret void +} + +define void @vstore_nx2i64_align32(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2i64_align32 + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m2 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 32) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2i64_align32 + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa, align 32) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa, align 32 + ret void +} + +define void @vstore_nx1ptr(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx1ptr + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx1ptr + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $v8, $x10 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx2ptr(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx2ptr + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $v8, $x10 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx2ptr + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m2 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m2 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} + +define void @vstore_nx8ptr(ptr %pa, %b) { + ; RV32-LABEL: name: vstore_nx8ptr + ; RV32: bb.1 (%ir-block.0): + ; RV32-NEXT: liveins: $x10, $v8m4 + ; RV32-NEXT: {{ $}} + ; RV32-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV32-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m4 + ; RV32-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV32-NEXT: PseudoRET + ; + ; RV64-LABEL: name: vstore_nx8ptr + ; RV64: bb.1 (%ir-block.0): + ; RV64-NEXT: liveins: $x10, $v8m8 + ; RV64-NEXT: {{ $}} + ; RV64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 + ; RV64-NEXT: [[COPY1:%[0-9]+]]:_() = COPY $v8m8 + ; RV64-NEXT: G_STORE [[COPY1]](), [[COPY]](p0) :: (store () into %ir.pa) + ; RV64-NEXT: PseudoRET + store %b, ptr %pa + ret void +} +