From 1c00d096a608da1489cc4e3c1bba9ac5b4732af8 Mon Sep 17 00:00:00 2001 From: Simon Moll Date: Mon, 16 Nov 2020 09:19:14 +0100 Subject: [PATCH] [VE] LVLGen sets VL before vector insts The VE backend represents vector instructions with an explicit 'i32' vector length operand. In the VE ISA, the vector length is always read from the VL hardware register. The LVLGen pass inserts 'lvl' instructions as necessary to set VL to the right value before each vector instruction. Reviewed By: kaz7 Differential Revision: https://reviews.llvm.org/D91416 --- llvm/lib/Target/VE/CMakeLists.txt | 1 + llvm/lib/Target/VE/LVLGen.cpp | 132 +++++++++++++++++++ llvm/lib/Target/VE/VE.h | 1 + llvm/lib/Target/VE/VETargetMachine.cpp | 6 + llvm/test/CodeGen/VE/VELIntrinsics/lvlgen.ll | 66 ++++++++++ llvm/test/CodeGen/VE/VELIntrinsics/vld.ll | 64 +++++++++ llvm/test/CodeGen/VE/VELIntrinsics/vst.ll | 96 ++++++++++++++ 7 files changed, 366 insertions(+) create mode 100644 llvm/lib/Target/VE/LVLGen.cpp create mode 100644 llvm/test/CodeGen/VE/VELIntrinsics/lvlgen.ll diff --git a/llvm/lib/Target/VE/CMakeLists.txt b/llvm/lib/Target/VE/CMakeLists.txt index dec4a6b1d8b135..9615f21f7143dd 100644 --- a/llvm/lib/Target/VE/CMakeLists.txt +++ b/llvm/lib/Target/VE/CMakeLists.txt @@ -14,6 +14,7 @@ tablegen(LLVM VEGenCallingConv.inc -gen-callingconv) add_public_tablegen_target(VECommonTableGen) add_llvm_target(VECodeGen + LVLGen.cpp VEAsmPrinter.cpp VEFrameLowering.cpp VEISelDAGToDAG.cpp diff --git a/llvm/lib/Target/VE/LVLGen.cpp b/llvm/lib/Target/VE/LVLGen.cpp new file mode 100644 index 00000000000000..08b350a581dc71 --- /dev/null +++ b/llvm/lib/Target/VE/LVLGen.cpp @@ -0,0 +1,132 @@ +//===-- LVLGen.cpp - LVL instruction generator ----------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "VE.h" +#include "VESubtarget.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/TargetInstrInfo.h" +#include "llvm/Target/TargetMachine.h" + +using namespace llvm; + +#define DEBUG_TYPE "lvl-gen" + +namespace { +struct LVLGen : public MachineFunctionPass { + const TargetInstrInfo *TII; + const TargetRegisterInfo *TRI; + + static char ID; + LVLGen() : MachineFunctionPass(ID) {} + bool runOnMachineBasicBlock(MachineBasicBlock &MBB); + bool runOnMachineFunction(MachineFunction &F) override; + + unsigned getVL(const MachineInstr &MI); + int getVLIndex(unsigned Opcode); +}; +char LVLGen::ID = 0; + +} // end of anonymous namespace + +FunctionPass *llvm::createLVLGenPass() { return new LVLGen; } + +int LVLGen::getVLIndex(unsigned Opcode) { + const MCInstrDesc &MCID = TII->get(Opcode); + + // If an instruction has VLIndex information, return it. + if (HAS_VLINDEX(MCID.TSFlags)) + return GET_VLINDEX(MCID.TSFlags); + + return -1; +} + +// returns a register holding a vector length. NoRegister is returned when +// this MI does not have a vector length. +unsigned LVLGen::getVL(const MachineInstr &MI) { + int Index = getVLIndex(MI.getOpcode()); + if (Index >= 0) + return MI.getOperand(Index).getReg(); + + return VE::NoRegister; +} + +bool LVLGen::runOnMachineBasicBlock(MachineBasicBlock &MBB) { +#define RegName(no) \ + (MBB.getParent()->getSubtarget().getRegisterInfo()->getName(no)) + + bool Changed = false; + bool HasRegForVL = false; + unsigned RegForVL; + + for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end();) { + MachineBasicBlock::iterator MI = I; + + unsigned Reg = getVL(*MI); + if (Reg != VE::NoRegister) { + LLVM_DEBUG(dbgs() << "Vector instruction found: "); + LLVM_DEBUG(MI->dump()); + LLVM_DEBUG(dbgs() << "Vector length is " << RegName(Reg) << ". "); + LLVM_DEBUG(dbgs() << "Current VL is " + << (HasRegForVL ? RegName(RegForVL) : "unknown") + << ". "); + + if (!HasRegForVL || RegForVL != Reg) { + LLVM_DEBUG(dbgs() << "Generate a LVL instruction to load " + << RegName(Reg) << ".\n"); + BuildMI(MBB, I, MI->getDebugLoc(), TII->get(VE::LVLr)).addReg(Reg); + HasRegForVL = true; + RegForVL = Reg; + Changed = true; + } else { + LLVM_DEBUG(dbgs() << "Reuse current VL.\n"); + } + } else if (HasRegForVL) { + // Old VL is overwritten, so disable HasRegForVL. + if (MI->findRegisterDefOperandIdx(RegForVL, false, false, TRI) != -1) { + LLVM_DEBUG(dbgs() << RegName(RegForVL) << " is killed: "); + LLVM_DEBUG(MI->dump()); + HasRegForVL = false; + } + } + if (HasRegForVL) { + // The latest VL is killed, so disable HasRegForVL. + if (MI->killsRegister(RegForVL, TRI)) { + LLVM_DEBUG(dbgs() << RegName(RegForVL) << " is killed: "); + LLVM_DEBUG(MI->dump()); + HasRegForVL = false; + } + } + + ++I; + } + return Changed; +} + +bool LVLGen::runOnMachineFunction(MachineFunction &F) { + LLVM_DEBUG(dbgs() << "********** Begin LVLGen **********\n"); + LLVM_DEBUG(dbgs() << "********** Function: " << F.getName() << '\n'); + LLVM_DEBUG(F.dump()); + + bool Changed = false; + + const VESubtarget &Subtarget = F.getSubtarget(); + TII = Subtarget.getInstrInfo(); + TRI = Subtarget.getRegisterInfo(); + + for (MachineFunction::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) + Changed |= runOnMachineBasicBlock(*FI); + + if (Changed) { + LLVM_DEBUG(dbgs() << "\n"); + LLVM_DEBUG(F.dump()); + } + LLVM_DEBUG(dbgs() << "********** End LVLGen **********\n"); + return Changed; +} diff --git a/llvm/lib/Target/VE/VE.h b/llvm/lib/Target/VE/VE.h index 91086916999fcc..a404f7ced70ada 100644 --- a/llvm/lib/Target/VE/VE.h +++ b/llvm/lib/Target/VE/VE.h @@ -29,6 +29,7 @@ class MachineInstr; FunctionPass *createVEISelDag(VETargetMachine &TM); FunctionPass *createVEPromoteToI1Pass(); +FunctionPass *createLVLGenPass(); void LowerVEMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, AsmPrinter &AP); diff --git a/llvm/lib/Target/VE/VETargetMachine.cpp b/llvm/lib/Target/VE/VETargetMachine.cpp index 89f1b4d872fa86..12c4f46288119b 100644 --- a/llvm/lib/Target/VE/VETargetMachine.cpp +++ b/llvm/lib/Target/VE/VETargetMachine.cpp @@ -98,6 +98,7 @@ class VEPassConfig : public TargetPassConfig { void addIRPasses() override; bool addInstSelector() override; + void addPreEmitPass() override; }; } // namespace @@ -115,3 +116,8 @@ bool VEPassConfig::addInstSelector() { addPass(createVEISelDag(getVETargetMachine())); return false; } + +void VEPassConfig::addPreEmitPass() { + // LVLGen should be called after scheduling and register allocation + addPass(createLVLGenPass()); +} diff --git a/llvm/test/CodeGen/VE/VELIntrinsics/lvlgen.ll b/llvm/test/CodeGen/VE/VELIntrinsics/lvlgen.ll new file mode 100644 index 00000000000000..23141aa93792cd --- /dev/null +++ b/llvm/test/CodeGen/VE/VELIntrinsics/lvlgen.ll @@ -0,0 +1,66 @@ +; RUN: llc < %s -mtriple=ve -mattr=+vpu | FileCheck %s + +; Test for correct placement of 'lvl' instructions + +; Function Attrs: nounwind readonly +declare <256 x double> @llvm.ve.vl.vld.vssl(i64, i8*, i32) +declare void @llvm.ve.vl.vst.vssl(<256 x double>, i64, i8*, i32) + +; Check that the backend can handle constant VL as well as parametric VL +; sources. + +; Function Attrs: nounwind +define void @switching_vl(i32 %evl, i32 %evl2, i8* %P, i8* %Q) { +; CHECK-LABEL: switching_vl: +; CHECK: .LBB{{[0-9]+}}_2: +; CHECK-NEXT: lea %s4, 256 +; CHECK-NEXT: lvl %s4 +; CHECK-NEXT: vld %v0, 8, %s2 +; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 +; CHECK-NEXT: lvl %s0 +; CHECK-NEXT: vst %v0, 16, %s3 +; CHECK-NEXT: lea %s4, 128 +; CHECK-NEXT: lvl %s4 +; CHECK-NEXT: vld %v0, 16, %s2 +; CHECK-NEXT: adds.w.sx %s1, %s1, (0)1 +; CHECK-NEXT: lvl %s1 +; CHECK-NEXT: vst %v0, 16, %s3 +; CHECK-NEXT: lvl %s4 +; CHECK-NEXT: vld %v0, 8, %s2 +; CHECK-NEXT: lvl %s0 +; CHECK-NEXT: vst %v0, 16, %s3 +; CHECK-NEXT: or %s11, 0, %s9 + %l0 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, i8* %P, i32 256) + tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l0, i64 16, i8* %Q, i32 %evl) + %l1 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 16, i8* %P, i32 128) + tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l1, i64 16, i8* %Q, i32 %evl2) + %l2 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, i8* %P, i32 128) + tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l2, i64 16, i8* %Q, i32 %evl) + ret void +} + +; Check that no redundant 'lvl' is inserted when vector length does not change +; in a basic block. + + +; Function Attrs: nounwind +define void @stable_vl(i32 %evl, i8* %P, i8* %Q) { +; CHECK-LABEL: stable_vl: +; CHECK: .LBB{{[0-9]+}}_2: +; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 +; CHECK-NEXT: lvl %s0 +; CHECK-NEXT: vld %v0, 8, %s1 +; CHECK-NEXT: vst %v0, 16, %s2 +; CHECK-NEXT: vld %v0, 16, %s1 +; CHECK-NEXT: vst %v0, 16, %s2 +; CHECK-NEXT: vld %v0, 8, %s1 +; CHECK-NEXT: vst %v0, 16, %s2 +; CHECK-NEXT: or %s11, 0, %s9 + %l0 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, i8* %P, i32 %evl) + tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l0, i64 16, i8* %Q, i32 %evl) + %l1 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 16, i8* %P, i32 %evl) + tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l1, i64 16, i8* %Q, i32 %evl) + %l2 = tail call <256 x double> @llvm.ve.vl.vld.vssl(i64 8, i8* %P, i32 %evl) + tail call void @llvm.ve.vl.vst.vssl(<256 x double> %l2, i64 16, i8* %Q, i32 %evl) + ret void +} diff --git a/llvm/test/CodeGen/VE/VELIntrinsics/vld.ll b/llvm/test/CodeGen/VE/VELIntrinsics/vld.ll index c57ec433803846..60099e37969e5e 100644 --- a/llvm/test/CodeGen/VE/VELIntrinsics/vld.ll +++ b/llvm/test/CodeGen/VE/VELIntrinsics/vld.ll @@ -10,6 +10,7 @@ define void @vld_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vld_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -28,6 +29,7 @@ define void @vld_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vld_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vld %v0, %s1, %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -48,6 +50,7 @@ define void @vld_vssl_imm(i8* %0) { ; CHECK-LABEL: vld_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -63,6 +66,7 @@ define void @vld_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vld_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, 8, %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -80,6 +84,7 @@ define void @vldnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -98,6 +103,7 @@ define void @vldnc_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldnc_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vld.nc %v0, %s1, %s2 ; CHECK-NEXT: vld.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -118,6 +124,7 @@ define void @vldnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vldnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld.nc %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -133,6 +140,7 @@ define void @vldnc_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldnc_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld.nc %v0, 8, %s1 ; CHECK-NEXT: vld.nc %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -150,6 +158,7 @@ define void @vldu_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldu_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldu %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -168,6 +177,7 @@ define void @vldu_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldu_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldu %v0, %s1, %s2 ; CHECK-NEXT: vldu %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -188,6 +198,7 @@ define void @vldu_vssl_imm(i8* %0) { ; CHECK-LABEL: vldu_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldu %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -203,6 +214,7 @@ define void @vldu_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldu_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldu %v0, 8, %s1 ; CHECK-NEXT: vldu %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -220,6 +232,7 @@ define void @vldunc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldunc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldu.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -238,6 +251,7 @@ define void @vldunc_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldunc_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldu.nc %v0, %s1, %s2 ; CHECK-NEXT: vldu.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -258,6 +272,7 @@ define void @vldunc_vssl_imm(i8* %0) { ; CHECK-LABEL: vldunc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldu.nc %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -273,6 +288,7 @@ define void @vldunc_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldunc_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldu.nc %v0, 8, %s1 ; CHECK-NEXT: vldu.nc %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -290,6 +306,7 @@ define void @vldlsx_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldlsx_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl.sx %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -308,6 +325,7 @@ define void @vldlsx_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldlsx_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldl.sx %v0, %s1, %s2 ; CHECK-NEXT: vldl.sx %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -328,6 +346,7 @@ define void @vldlsx_vssl_imm(i8* %0) { ; CHECK-LABEL: vldlsx_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldl.sx %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -343,6 +362,7 @@ define void @vldlsx_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldlsx_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl.sx %v0, 8, %s1 ; CHECK-NEXT: vldl.sx %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -360,6 +380,7 @@ define void @vldlsxnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldlsxnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl.sx.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -378,6 +399,7 @@ define void @vldlsxnc_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldlsxnc_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldl.sx.nc %v0, %s1, %s2 ; CHECK-NEXT: vldl.sx.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -398,6 +420,7 @@ define void @vldlsxnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vldlsxnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldl.sx.nc %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -413,6 +436,7 @@ define void @vldlsxnc_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldlsxnc_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl.sx.nc %v0, 8, %s1 ; CHECK-NEXT: vldl.sx.nc %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -430,6 +454,7 @@ define void @vldlzx_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldlzx_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl.zx %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -448,6 +473,7 @@ define void @vldlzx_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldlzx_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldl.zx %v0, %s1, %s2 ; CHECK-NEXT: vldl.zx %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -468,6 +494,7 @@ define void @vldlzx_vssl_imm(i8* %0) { ; CHECK-LABEL: vldlzx_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldl.zx %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -483,6 +510,7 @@ define void @vldlzx_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldlzx_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl.zx %v0, 8, %s1 ; CHECK-NEXT: vldl.zx %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -500,6 +528,7 @@ define void @vldlzxnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldlzxnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl.zx.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -518,6 +547,7 @@ define void @vldlzxnc_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldlzxnc_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldl.zx.nc %v0, %s1, %s2 ; CHECK-NEXT: vldl.zx.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -538,6 +568,7 @@ define void @vldlzxnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vldlzxnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldl.zx.nc %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -553,6 +584,7 @@ define void @vldlzxnc_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldlzxnc_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl.zx.nc %v0, 8, %s1 ; CHECK-NEXT: vldl.zx.nc %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -570,6 +602,7 @@ define void @vld2d_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vld2d_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld2d %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -588,6 +621,7 @@ define void @vld2d_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vld2d_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vld2d %v0, %s1, %s2 ; CHECK-NEXT: vld2d %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -608,6 +642,7 @@ define void @vld2d_vssl_imm(i8* %0) { ; CHECK-LABEL: vld2d_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld2d %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -623,6 +658,7 @@ define void @vld2d_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vld2d_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld2d %v0, 8, %s1 ; CHECK-NEXT: vld2d %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -640,6 +676,7 @@ define void @vld2dnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vld2dnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld2d.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -658,6 +695,7 @@ define void @vld2dnc_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vld2dnc_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vld2d.nc %v0, %s1, %s2 ; CHECK-NEXT: vld2d.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -678,6 +716,7 @@ define void @vld2dnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vld2dnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld2d.nc %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -693,6 +732,7 @@ define void @vld2dnc_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vld2dnc_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld2d.nc %v0, 8, %s1 ; CHECK-NEXT: vld2d.nc %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -710,6 +750,7 @@ define void @vldu2d_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldu2d_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldu2d %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -728,6 +769,7 @@ define void @vldu2d_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldu2d_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldu2d %v0, %s1, %s2 ; CHECK-NEXT: vldu2d %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -748,6 +790,7 @@ define void @vldu2d_vssl_imm(i8* %0) { ; CHECK-LABEL: vldu2d_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldu2d %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -763,6 +806,7 @@ define void @vldu2d_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldu2d_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldu2d %v0, 8, %s1 ; CHECK-NEXT: vldu2d %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -780,6 +824,7 @@ define void @vldu2dnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldu2dnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldu2d.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -798,6 +843,7 @@ define void @vldu2dnc_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldu2dnc_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldu2d.nc %v0, %s1, %s2 ; CHECK-NEXT: vldu2d.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -818,6 +864,7 @@ define void @vldu2dnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vldu2dnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldu2d.nc %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -833,6 +880,7 @@ define void @vldu2dnc_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldu2dnc_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldu2d.nc %v0, 8, %s1 ; CHECK-NEXT: vldu2d.nc %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -850,6 +898,7 @@ define void @vldl2dsx_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldl2dsx_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl2d.sx %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -868,6 +917,7 @@ define void @vldl2dsx_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldl2dsx_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldl2d.sx %v0, %s1, %s2 ; CHECK-NEXT: vldl2d.sx %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -888,6 +938,7 @@ define void @vldl2dsx_vssl_imm(i8* %0) { ; CHECK-LABEL: vldl2dsx_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldl2d.sx %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -903,6 +954,7 @@ define void @vldl2dsx_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldl2dsx_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl2d.sx %v0, 8, %s1 ; CHECK-NEXT: vldl2d.sx %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -920,6 +972,7 @@ define void @vldl2dsxnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldl2dsxnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl2d.sx.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -938,6 +991,7 @@ define void @vldl2dsxnc_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldl2dsxnc_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldl2d.sx.nc %v0, %s1, %s2 ; CHECK-NEXT: vldl2d.sx.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -958,6 +1012,7 @@ define void @vldl2dsxnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vldl2dsxnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldl2d.sx.nc %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -973,6 +1028,7 @@ define void @vldl2dsxnc_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldl2dsxnc_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl2d.sx.nc %v0, 8, %s1 ; CHECK-NEXT: vldl2d.sx.nc %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -990,6 +1046,7 @@ define void @vldl2dzx_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldl2dzx_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl2d.zx %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -1008,6 +1065,7 @@ define void @vldl2dzx_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldl2dzx_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldl2d.zx %v0, %s1, %s2 ; CHECK-NEXT: vldl2d.zx %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -1028,6 +1086,7 @@ define void @vldl2dzx_vssl_imm(i8* %0) { ; CHECK-LABEL: vldl2dzx_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldl2d.zx %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -1043,6 +1102,7 @@ define void @vldl2dzx_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldl2dzx_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl2d.zx %v0, 8, %s1 ; CHECK-NEXT: vldl2d.zx %v0, 8, %s0 ; CHECK-NEXT: #APP @@ -1060,6 +1120,7 @@ define void @vldl2dzxnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vldl2dzxnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl2d.zx.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, %s1, %s0 @@ -1078,6 +1139,7 @@ define void @vldl2dzxnc_vssvl(i8* %0, i64 %1, i8* %2) { ; CHECK-LABEL: vldl2dzxnc_vssvl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s3, 256 +; CHECK-NEXT: lvl %s3 ; CHECK-NEXT: vldl2d.zx.nc %v0, %s1, %s2 ; CHECK-NEXT: vldl2d.zx.nc %v0, %s1, %s0 ; CHECK-NEXT: #APP @@ -1098,6 +1160,7 @@ define void @vldl2dzxnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vldl2dzxnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vldl2d.zx.nc %v0, 8, %s0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vst %v0, 8, %s0 @@ -1113,6 +1176,7 @@ define void @vldl2dzxnc_vssvl_imm(i8* %0, i8* %1) { ; CHECK-LABEL: vldl2dzxnc_vssvl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vldl2d.zx.nc %v0, 8, %s1 ; CHECK-NEXT: vldl2d.zx.nc %v0, 8, %s0 ; CHECK-NEXT: #APP diff --git a/llvm/test/CodeGen/VE/VELIntrinsics/vst.ll b/llvm/test/CodeGen/VE/VELIntrinsics/vst.ll index ae895ac8665348..6ac2894ca7a395 100644 --- a/llvm/test/CodeGen/VE/VELIntrinsics/vst.ll +++ b/llvm/test/CodeGen/VE/VELIntrinsics/vst.ll @@ -10,6 +10,7 @@ define void @vst_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vst_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -29,6 +30,7 @@ define void @vst_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vst_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -45,6 +47,7 @@ define void @vst_vssl_imm(i8* %0) { ; CHECK-LABEL: vst_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -58,6 +61,7 @@ define void @vst_vssml_imm(i8* %0) { ; CHECK-LABEL: vst_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -71,6 +75,7 @@ define void @vstnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst.nc %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -87,6 +92,7 @@ define void @vstnc_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstnc_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst.nc %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -103,6 +109,7 @@ define void @vstnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vstnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst.nc %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -116,6 +123,7 @@ define void @vstnc_vssml_imm(i8* %0) { ; CHECK-LABEL: vstnc_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst.nc %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -129,6 +137,7 @@ define void @vstot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -145,6 +154,7 @@ define void @vstot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -161,6 +171,7 @@ define void @vstot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -174,6 +185,7 @@ define void @vstot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -187,6 +199,7 @@ define void @vstncot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstncot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst.nc.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -203,6 +216,7 @@ define void @vstncot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstncot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst.nc.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -219,6 +233,7 @@ define void @vstncot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstncot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst.nc.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -232,6 +247,7 @@ define void @vstncot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstncot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst.nc.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -245,6 +261,7 @@ define void @vstu_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstu_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -261,6 +278,7 @@ define void @vstu_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstu_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -277,6 +295,7 @@ define void @vstu_vssl_imm(i8* %0) { ; CHECK-LABEL: vstu_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -290,6 +309,7 @@ define void @vstu_vssml_imm(i8* %0) { ; CHECK-LABEL: vstu_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -303,6 +323,7 @@ define void @vstunc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstunc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu.nc %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -319,6 +340,7 @@ define void @vstunc_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstunc_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu.nc %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -335,6 +357,7 @@ define void @vstunc_vssl_imm(i8* %0) { ; CHECK-LABEL: vstunc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu.nc %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -348,6 +371,7 @@ define void @vstunc_vssml_imm(i8* %0) { ; CHECK-LABEL: vstunc_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu.nc %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -361,6 +385,7 @@ define void @vstuot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstuot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -377,6 +402,7 @@ define void @vstuot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstuot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -393,6 +419,7 @@ define void @vstuot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstuot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -406,6 +433,7 @@ define void @vstuot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstuot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -419,6 +447,7 @@ define void @vstuncot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstuncot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu.nc.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -435,6 +464,7 @@ define void @vstuncot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstuncot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu.nc.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -451,6 +481,7 @@ define void @vstuncot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstuncot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu.nc.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -464,6 +495,7 @@ define void @vstuncot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstuncot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu.nc.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -477,6 +509,7 @@ define void @vstl_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstl_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -493,6 +526,7 @@ define void @vstl_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstl_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -509,6 +543,7 @@ define void @vstl_vssl_imm(i8* %0) { ; CHECK-LABEL: vstl_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -522,6 +557,7 @@ define void @vstl_vssml_imm(i8* %0) { ; CHECK-LABEL: vstl_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -535,6 +571,7 @@ define void @vstlnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstlnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl.nc %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -551,6 +588,7 @@ define void @vstlnc_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstlnc_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl.nc %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -567,6 +605,7 @@ define void @vstlnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vstlnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl.nc %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -580,6 +619,7 @@ define void @vstlnc_vssml_imm(i8* %0) { ; CHECK-LABEL: vstlnc_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl.nc %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -593,6 +633,7 @@ define void @vstlot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstlot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -609,6 +650,7 @@ define void @vstlot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstlot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -625,6 +667,7 @@ define void @vstlot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstlot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -638,6 +681,7 @@ define void @vstlot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstlot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -651,6 +695,7 @@ define void @vstlncot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstlncot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl.nc.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -667,6 +712,7 @@ define void @vstlncot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstlncot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl.nc.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -683,6 +729,7 @@ define void @vstlncot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstlncot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl.nc.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -696,6 +743,7 @@ define void @vstlncot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstlncot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl.nc.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -709,6 +757,7 @@ define void @vst2d_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vst2d_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst2d %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -725,6 +774,7 @@ define void @vst2d_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vst2d_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst2d %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -741,6 +791,7 @@ define void @vst2d_vssl_imm(i8* %0) { ; CHECK-LABEL: vst2d_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst2d %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -754,6 +805,7 @@ define void @vst2d_vssml_imm(i8* %0) { ; CHECK-LABEL: vst2d_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst2d %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -767,6 +819,7 @@ define void @vst2dnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vst2dnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst2d.nc %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -783,6 +836,7 @@ define void @vst2dnc_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vst2dnc_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst2d.nc %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -799,6 +853,7 @@ define void @vst2dnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vst2dnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst2d.nc %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -812,6 +867,7 @@ define void @vst2dnc_vssml_imm(i8* %0) { ; CHECK-LABEL: vst2dnc_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst2d.nc %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -825,6 +881,7 @@ define void @vst2dot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vst2dot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst2d.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -841,6 +898,7 @@ define void @vst2dot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vst2dot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst2d.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -857,6 +915,7 @@ define void @vst2dot_vssl_imm(i8* %0) { ; CHECK-LABEL: vst2dot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst2d.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -870,6 +929,7 @@ define void @vst2dot_vssml_imm(i8* %0) { ; CHECK-LABEL: vst2dot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst2d.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -883,6 +943,7 @@ define void @vst2dncot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vst2dncot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst2d.nc.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -899,6 +960,7 @@ define void @vst2dncot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vst2dncot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vst2d.nc.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -915,6 +977,7 @@ define void @vst2dncot_vssl_imm(i8* %0) { ; CHECK-LABEL: vst2dncot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst2d.nc.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -928,6 +991,7 @@ define void @vst2dncot_vssml_imm(i8* %0) { ; CHECK-LABEL: vst2dncot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vst2d.nc.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -941,6 +1005,7 @@ define void @vstu2d_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstu2d_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu2d %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -957,6 +1022,7 @@ define void @vstu2d_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstu2d_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu2d %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -973,6 +1039,7 @@ define void @vstu2d_vssl_imm(i8* %0) { ; CHECK-LABEL: vstu2d_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu2d %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -986,6 +1053,7 @@ define void @vstu2d_vssml_imm(i8* %0) { ; CHECK-LABEL: vstu2d_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu2d %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -999,6 +1067,7 @@ define void @vstu2dnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstu2dnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu2d.nc %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1015,6 +1084,7 @@ define void @vstu2dnc_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstu2dnc_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu2d.nc %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1031,6 +1101,7 @@ define void @vstu2dnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vstu2dnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu2d.nc %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1044,6 +1115,7 @@ define void @vstu2dnc_vssml_imm(i8* %0) { ; CHECK-LABEL: vstu2dnc_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu2d.nc %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1057,6 +1129,7 @@ define void @vstu2dot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstu2dot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu2d.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1073,6 +1146,7 @@ define void @vstu2dot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstu2dot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu2d.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1089,6 +1163,7 @@ define void @vstu2dot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstu2dot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu2d.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1102,6 +1177,7 @@ define void @vstu2dot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstu2dot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu2d.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1115,6 +1191,7 @@ define void @vstu2dncot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstu2dncot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu2d.nc.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1131,6 +1208,7 @@ define void @vstu2dncot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstu2dncot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstu2d.nc.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1147,6 +1225,7 @@ define void @vstu2dncot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstu2dncot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu2d.nc.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1160,6 +1239,7 @@ define void @vstu2dncot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstu2dncot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstu2d.nc.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1173,6 +1253,7 @@ define void @vstl2d_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstl2d_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl2d %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1189,6 +1270,7 @@ define void @vstl2d_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstl2d_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl2d %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1205,6 +1287,7 @@ define void @vstl2d_vssl_imm(i8* %0) { ; CHECK-LABEL: vstl2d_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl2d %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1218,6 +1301,7 @@ define void @vstl2d_vssml_imm(i8* %0) { ; CHECK-LABEL: vstl2d_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl2d %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1231,6 +1315,7 @@ define void @vstl2dnc_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstl2dnc_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl2d.nc %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1247,6 +1332,7 @@ define void @vstl2dnc_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstl2dnc_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl2d.nc %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1263,6 +1349,7 @@ define void @vstl2dnc_vssl_imm(i8* %0) { ; CHECK-LABEL: vstl2dnc_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl2d.nc %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1276,6 +1363,7 @@ define void @vstl2dnc_vssml_imm(i8* %0) { ; CHECK-LABEL: vstl2dnc_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl2d.nc %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1289,6 +1377,7 @@ define void @vstl2dot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstl2dot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl2d.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1305,6 +1394,7 @@ define void @vstl2dot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstl2dot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl2d.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1321,6 +1411,7 @@ define void @vstl2dot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstl2dot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl2d.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1334,6 +1425,7 @@ define void @vstl2dot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstl2dot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl2d.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1347,6 +1439,7 @@ define void @vstl2dncot_vssl(i8* %0, i64 %1) { ; CHECK-LABEL: vstl2dncot_vssl: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl2d.nc.ot %v0, %s1, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1363,6 +1456,7 @@ define void @vstl2dncot_vssml(i8* %0, i64 %1) { ; CHECK-LABEL: vstl2dncot_vssml: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s2, 256 +; CHECK-NEXT: lvl %s2 ; CHECK-NEXT: vld %v0, %s1, %s0 ; CHECK-NEXT: vstl2d.nc.ot %v0, %s1, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1379,6 +1473,7 @@ define void @vstl2dncot_vssl_imm(i8* %0) { ; CHECK-LABEL: vstl2dncot_vssl_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl2d.nc.ot %v0, 8, %s0 ; CHECK-NEXT: or %s11, 0, %s9 @@ -1392,6 +1487,7 @@ define void @vstl2dncot_vssml_imm(i8* %0) { ; CHECK-LABEL: vstl2dncot_vssml_imm: ; CHECK: .LBB{{[0-9]+}}_2: ; CHECK-NEXT: lea %s1, 256 +; CHECK-NEXT: lvl %s1 ; CHECK-NEXT: vld %v0, 8, %s0 ; CHECK-NEXT: vstl2d.nc.ot %v0, 8, %s0, %vm0 ; CHECK-NEXT: or %s11, 0, %s9