diff options
| author | Simon Atanasyan <simon@atanasyan.com> | 2019-10-11 21:51:23 +0000 |
|---|---|---|
| committer | Simon Atanasyan <simon@atanasyan.com> | 2019-10-11 21:51:23 +0000 |
| commit | 5ebe3511b35d41b9364be62a28966e279fc568b0 (patch) | |
| tree | 1ec74c30e0abaf4f92ce788a320f81cf50a2e7df /llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | |
| parent | b95d4c3a99794f57b3ac7accd86f5c061f6c69f9 (diff) | |
| download | bcm5719-llvm-5ebe3511b35d41b9364be62a28966e279fc568b0.tar.gz bcm5719-llvm-5ebe3511b35d41b9364be62a28966e279fc568b0.zip | |
[mips] Use less instruction to load zero into FPR by li.s / li.d pseudos
If `li.s` or `li.d` loads zero into a FPR, it's not necessary to load
zero into `at` GPR register and then move its value into a floating
point register. We can use as a source register the `zero / $0` one.
Differential Revision: https://reviews.llvm.org/D68777
llvm-svn: 374597
Diffstat (limited to 'llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp')
| -rw-r--r-- | llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 51bcf798182..56d5e083493 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -3345,13 +3345,16 @@ bool MipsAsmParser::expandLoadSingleImmToFPR(MCInst &Inst, SMLoc IDLoc, uint32_t ImmOp32 = covertDoubleImmToSingleImm(ImmOp64); - unsigned TmpReg = getATReg(IDLoc); - if (!TmpReg) - return true; + unsigned TmpReg = Mips::ZERO; + if (ImmOp32 != 0) { + TmpReg = getATReg(IDLoc); + if (!TmpReg) + return true; + } if (Lo_32(ImmOp64) == 0) { - if (loadImmediate(ImmOp32, TmpReg, Mips::NoRegister, true, true, IDLoc, Out, - STI)) + if (TmpReg != Mips::ZERO && loadImmediate(ImmOp32, TmpReg, Mips::NoRegister, + true, false, IDLoc, Out, STI)) return true; TOut.emitRR(Mips::MTC1, FirstReg, TmpReg, IDLoc, STI); return false; @@ -3469,24 +3472,26 @@ bool MipsAsmParser::expandLoadDoubleImmToFPR(MCInst &Inst, bool Is64FPU, uint32_t LoImmOp64 = Lo_32(ImmOp64); uint32_t HiImmOp64 = Hi_32(ImmOp64); - unsigned TmpReg = getATReg(IDLoc); - if (!TmpReg) - return true; + unsigned TmpReg = Mips::ZERO; + if (ImmOp64 != 0) { + TmpReg = getATReg(IDLoc); + if (!TmpReg) + return true; + } if ((LoImmOp64 == 0) && !((HiImmOp64 & 0xffff0000) && (HiImmOp64 & 0x0000ffff))) { - // FIXME: In the case where the constant is zero, we can load the - // register directly from the zero register. - if (isABI_N32() || isABI_N64()) { - if (loadImmediate(ImmOp64, TmpReg, Mips::NoRegister, false, false, IDLoc, + if (TmpReg != Mips::ZERO && + loadImmediate(ImmOp64, TmpReg, Mips::NoRegister, false, false, IDLoc, Out, STI)) return true; TOut.emitRR(Mips::DMTC1, FirstReg, TmpReg, IDLoc, STI); return false; } - if (loadImmediate(HiImmOp64, TmpReg, Mips::NoRegister, true, false, IDLoc, + if (TmpReg != Mips::ZERO && + loadImmediate(HiImmOp64, TmpReg, Mips::NoRegister, true, false, IDLoc, Out, STI)) return true; |

