mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-02 07:17:36 +00:00
[mips] Honour -mno-odd-spreg for vector insert/extract when MSA is enabled.
Summary: -mno-odd-spreg prohibits the use of odd-numbered single-precision floating point registers. However, vector insert/extract was still using them when manipulating the subregisters of an MSA register. Fixed this by ensuring that insertion/extraction is only performed on even-numbered vector registers when -mno-odd-spreg is given. Reviewers: vmedic, sstankovic Reviewed By: sstankovic Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D7672 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230235 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2878,10 +2878,21 @@ emitCOPY_FW(MachineInstr *MI, MachineBasicBlock *BB) const{
|
||||
unsigned Ws = MI->getOperand(1).getReg();
|
||||
unsigned Lane = MI->getOperand(2).getImm();
|
||||
|
||||
if (Lane == 0)
|
||||
BuildMI(*BB, MI, DL, TII->get(Mips::COPY), Fd).addReg(Ws, 0, Mips::sub_lo);
|
||||
else {
|
||||
unsigned Wt = RegInfo.createVirtualRegister(&Mips::MSA128WRegClass);
|
||||
if (Lane == 0) {
|
||||
unsigned Wt = Ws;
|
||||
if (!Subtarget.useOddSPReg()) {
|
||||
// We must copy to an even-numbered MSA register so that the
|
||||
// single-precision sub-register is also guaranteed to be even-numbered.
|
||||
Wt = RegInfo.createVirtualRegister(&Mips::MSA128WEvensRegClass);
|
||||
|
||||
BuildMI(*BB, MI, DL, TII->get(Mips::COPY), Wt).addReg(Ws);
|
||||
}
|
||||
|
||||
BuildMI(*BB, MI, DL, TII->get(Mips::COPY), Fd).addReg(Wt, 0, Mips::sub_lo);
|
||||
} else {
|
||||
unsigned Wt = RegInfo.createVirtualRegister(
|
||||
Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass :
|
||||
&Mips::MSA128WEvensRegClass);
|
||||
|
||||
BuildMI(*BB, MI, DL, TII->get(Mips::SPLATI_W), Wt).addReg(Ws).addImm(Lane);
|
||||
BuildMI(*BB, MI, DL, TII->get(Mips::COPY), Fd).addReg(Wt, 0, Mips::sub_lo);
|
||||
@@ -2941,7 +2952,9 @@ MipsSETargetLowering::emitINSERT_FW(MachineInstr *MI,
|
||||
unsigned Wd_in = MI->getOperand(1).getReg();
|
||||
unsigned Lane = MI->getOperand(2).getImm();
|
||||
unsigned Fs = MI->getOperand(3).getReg();
|
||||
unsigned Wt = RegInfo.createVirtualRegister(&Mips::MSA128WRegClass);
|
||||
unsigned Wt = RegInfo.createVirtualRegister(
|
||||
Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass :
|
||||
&Mips::MSA128WEvensRegClass);
|
||||
|
||||
BuildMI(*BB, MI, DL, TII->get(Mips::SUBREG_TO_REG), Wt)
|
||||
.addImm(0)
|
||||
|
||||
Reference in New Issue
Block a user