From 86eb22976f590b37ea16170b2d10b2425fc39661 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 7 May 2010 02:04:02 +0000 Subject: [PATCH] Use VLD2q32 / VST2q32 to reload / spill QQ (pair of Q) registers when stack slot is sufficiently aligned. Use VLDMD / VSTMD otherwise. llvm-svn: 103235 --- llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp | 44 +++++++++++++++++++++--- llvm/lib/Target/ARM/ARMInstrNEON.td | 10 ------ 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp index eff2008e6139..a37e4c67d552 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -788,14 +788,31 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, .addImm(ARM_AM::getAM5Opc(ARM_AM::ia, 4))) .addMemOperand(MMO); MIB = AddDReg(MIB, SrcReg, ARM::DSUBREG_0, getKillRegState(isKill), TRI); - AddDReg(MIB, SrcReg, ARM::DSUBREG_1, 0, TRI); - + AddDReg(MIB, SrcReg, ARM::DSUBREG_1, 0, TRI); } } else { assert((RC == ARM::QQPRRegisterClass || RC == ARM::QQPR_VFP2RegisterClass || RC == ARM::QQPR_8RegisterClass) && "Unknown regclass!"); - llvm_unreachable("Not yet implemented!"); + if (Align >= 16 && getRegisterInfo().canRealignStack(MF)) { + MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::VST2q32)) + .addFrameIndex(FI).addImm(128); + MIB = AddDReg(MIB, SrcReg, ARM::DSUBREG_0, getKillRegState(isKill), TRI); + MIB = AddDReg(MIB, SrcReg, ARM::DSUBREG_1, 0, TRI); + MIB = AddDReg(MIB, SrcReg, ARM::DSUBREG_2, 0, TRI); + MIB = AddDReg(MIB, SrcReg, ARM::DSUBREG_3, 0, TRI); + AddDefaultPred(MIB.addMemOperand(MMO)); + } else { + MachineInstrBuilder MIB = + AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VSTMD)) + .addFrameIndex(FI) + .addImm(ARM_AM::getAM5Opc(ARM_AM::ia, 4))) + .addMemOperand(MMO); + MIB = AddDReg(MIB, SrcReg, ARM::DSUBREG_0, getKillRegState(isKill), TRI); + MIB = AddDReg(MIB, SrcReg, ARM::DSUBREG_1, 0, TRI); + MIB = AddDReg(MIB, SrcReg, ARM::DSUBREG_2, 0, TRI); + AddDReg(MIB, SrcReg, ARM::DSUBREG_3, 0, TRI); + } } } @@ -847,13 +864,30 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, .addImm(ARM_AM::getAM5Opc(ARM_AM::ia, 4))) .addMemOperand(MMO); MIB = AddDReg(MIB, DestReg, ARM::DSUBREG_0, RegState::Define, TRI); - AddDReg(MIB, DestReg, ARM::DSUBREG_1, RegState::Define, TRI); + AddDReg(MIB, DestReg, ARM::DSUBREG_1, RegState::Define, TRI); } } else { assert((RC == ARM::QQPRRegisterClass || RC == ARM::QQPR_VFP2RegisterClass || RC == ARM::QQPR_8RegisterClass) && "Unknown regclass!"); - llvm_unreachable("Not yet implemented!"); + if (Align >= 16 && getRegisterInfo().canRealignStack(MF)) { + MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::VLD2q32)); + MIB = AddDReg(MIB, DestReg, ARM::DSUBREG_0, RegState::Define, TRI); + MIB = AddDReg(MIB, DestReg, ARM::DSUBREG_1, RegState::Define, TRI); + MIB = AddDReg(MIB, DestReg, ARM::DSUBREG_2, RegState::Define, TRI); + MIB = AddDReg(MIB, DestReg, ARM::DSUBREG_3, RegState::Define, TRI); + AddDefaultPred(MIB.addFrameIndex(FI).addImm(128).addMemOperand(MMO)); + } else { + MachineInstrBuilder MIB = + AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLDMD)) + .addFrameIndex(FI) + .addImm(ARM_AM::getAM5Opc(ARM_AM::ia, 4))) + .addMemOperand(MMO); + MIB = AddDReg(MIB, DestReg, ARM::DSUBREG_0, RegState::Define, TRI); + MIB = AddDReg(MIB, DestReg, ARM::DSUBREG_1, RegState::Define, TRI); + MIB = AddDReg(MIB, DestReg, ARM::DSUBREG_2, RegState::Define, TRI); + AddDReg(MIB, DestReg, ARM::DSUBREG_3, RegState::Define, TRI); + } } } diff --git a/llvm/lib/Target/ARM/ARMInstrNEON.td b/llvm/lib/Target/ARM/ARMInstrNEON.td index af401ffdef46..df3c53a4df15 100644 --- a/llvm/lib/Target/ARM/ARMInstrNEON.td +++ b/llvm/lib/Target/ARM/ARMInstrNEON.td @@ -123,11 +123,6 @@ def VLDMQ : AXDI5<(outs QPR:$dst), (ins addrmode5:$addr, pred:$p), IndexModeNone, IIC_fpLoadm, "vldm${addr:submode}${p}\t${addr:base}, ${dst:dregpair}", "", []>; -def VLDMQ_UPD - : AXDI5<(outs QPR:$dst, GPR:$wb), (ins addrmode5:$addr, pred:$p), - IndexModeUpd, IIC_fpLoadm, - "vldm${addr:submode}${p}\t${addr:base}!, ${dst:dregpair}", - "$addr.base = $wb", []>; } // mayLoad = 1 let mayStore = 1 in { @@ -138,11 +133,6 @@ def VSTMQ : AXDI5<(outs), (ins QPR:$src, addrmode5:$addr, pred:$p), IndexModeNone, IIC_fpStorem, "vstm${addr:submode}${p}\t${addr:base}, ${src:dregpair}", "", []>; -def VSTMQ_UPD - : AXDI5<(outs GPR:$wb), (ins QPR:$src, addrmode5:$addr, pred:$p), - IndexModeUpd, IIC_fpStorem, - "vstm${addr:submode}${p}\t${addr:base}!, ${src:dregpair}", - "$addr.base = $wb", []>; } // mayStore = 1 let mayLoad = 1, hasExtraDefRegAllocReq = 1 in { -- GitLab