Bug 1290812 - Part 34: Implement the 64bit variant of Clz and Ctz on mips32. r=bbouvier

---
 js/src/jit/MacroAssembler.h                   |  4 ++--
 js/src/jit/mips32/CodeGenerator-mips32.cpp    | 18 +++++++++++++++
 js/src/jit/mips32/CodeGenerator-mips32.h      |  2 ++
 js/src/jit/mips32/MacroAssembler-mips32-inl.h | 33 +++++++++++++++++++++++++++
 4 files changed, 55 insertions(+), 2 deletions(-)
This commit is contained in:
Shi Dan 2016-10-10 17:08:32 +08:00
parent 8fb59f8f90
commit 59c2b77928
4 changed files with 55 additions and 2 deletions

View File

@ -920,8 +920,8 @@ class MacroAssembler : public MacroAssemblerSpecific
inline void clz32(Register src, Register dest, bool knownNotZero) PER_SHARED_ARCH;
inline void ctz32(Register src, Register dest, bool knownNotZero) PER_SHARED_ARCH;
inline void clz64(Register64 src, Register dest) DEFINED_ON(x86, x64, arm, mips64);
inline void ctz64(Register64 src, Register dest) DEFINED_ON(x86, x64, arm, mips64);
inline void clz64(Register64 src, Register dest) DEFINED_ON(x86, x64, arm, mips32, mips64);
inline void ctz64(Register64 src, Register dest) DEFINED_ON(x86, x64, arm, mips32, mips64);
// On x86_shared, temp may be Invalid only if the chip has the POPCNT instruction.
// On ARM, temp may never be Invalid.

View File

@ -479,6 +479,24 @@ CodeGeneratorMIPS::visitWrapInt64ToInt32(LWrapInt64ToInt32* lir)
masm.move32(ToRegister(input.high()), output);
}
void
CodeGeneratorMIPS::visitClzI64(LClzI64* lir)
{
Register64 input = ToRegister64(lir->getInt64Operand(0));
Register64 output = ToOutRegister64(lir);
masm.clz64(input, output.low);
masm.move32(Imm32(0), output.high);
}
void
CodeGeneratorMIPS::visitCtzI64(LCtzI64* lir)
{
Register64 input = ToRegister64(lir->getInt64Operand(0));
Register64 output = ToOutRegister64(lir);
masm.ctz64(input, output.low);
masm.move32(Imm32(0), output.high);
}
void
CodeGeneratorMIPS::setReturnDoubleRegs(LiveRegisterSet* regs)
{

View File

@ -44,6 +44,8 @@ class CodeGeneratorMIPS : public CodeGeneratorMIPSShared
void visitUDivOrModI64(LUDivOrModI64* lir);
void visitExtendInt32ToInt64(LExtendInt32ToInt64* lir);
void visitWrapInt64ToInt32(LWrapInt64ToInt32* lir);
void visitClzI64(LClzI64* ins);
void visitCtzI64(LCtzI64* ins);
// Out of line visitors.
void visitOutOfLineBailout(OutOfLineBailout* ool);

View File

@ -666,6 +666,39 @@ MacroAssembler::rotateRight64(Register shift, Register64 src, Register64 dest, R
// ===============================================================
// Bit counting functions
void
MacroAssembler::clz64(Register64 src, Register dest)
{
Label done, low;
ma_b(src.high, Imm32(0), &low, Equal);
as_clz(dest, src.high);
ma_b(&done);
bind(&low);
as_clz(dest, src.low);
ma_addu(dest, Imm32(32));
bind(&done);
}
void
MacroAssembler::ctz64(Register64 src, Register dest)
{
Label done, high;
ma_b(src.low, Imm32(0), &high, Equal);
ma_ctz(dest, src.low);
ma_b(&done);
bind(&high);
ma_ctz(dest, src.high);
ma_addu(dest, Imm32(32));
bind(&done);
}
void
MacroAssembler::popcnt64(Register64 src, Register64 dest, Register tmp)
{