X87: [turbofan] Turn Math.clz32 into an inlinable builtin.

port 3aa206b865 (r27329)

original commit message:

BUG=

Review URL: https://codereview.chromium.org/1022523005

Cr-Commit-Position: refs/heads/master@{#27429}
This commit is contained in:
chunyang.dai 2015-03-24 23:41:10 -07:00 committed by Commit bot
parent 052020e514
commit b638550338
3 changed files with 15 additions and 7 deletions

View File

@ -4265,14 +4265,8 @@ void LCodeGen::DoMathLog(LMathLog* instr) {
void LCodeGen::DoMathClz32(LMathClz32* instr) {
Register input = ToRegister(instr->value());
Register result = ToRegister(instr->result());
Label not_zero_input;
__ bsr(result, input);
__ j(not_zero, &not_zero_input);
__ Move(result, Immediate(63)); // 63^31 == 32
__ bind(&not_zero_input);
__ xor_(result, Immediate(31)); // for x in [0..31], 31^x == 31-x.
__ Lzcnt(result, input);
}

View File

@ -2355,6 +2355,17 @@ void MacroAssembler::Move(const Operand& dst, const Immediate& x) {
}
void MacroAssembler::Lzcnt(Register dst, const Operand& src) {
// TODO(intel): Add support for LZCNT (with ABM/BMI1).
Label not_zero_src;
bsr(dst, src);
j(not_zero, &not_zero_src, Label::kNear);
Move(dst, Immediate(63)); // 63^31 == 32
bind(&not_zero_src);
xor_(dst, Immediate(31)); // for x in [0..31], 31^x == 31-x.
}
void MacroAssembler::SetCounter(StatsCounter* counter, int value) {
if (FLAG_native_code_counters && counter->Enabled()) {
mov(Operand::StaticVariable(ExternalReference(counter)), Immediate(value));

View File

@ -776,6 +776,9 @@ class MacroAssembler: public Assembler {
void Push(Register src) { push(src); }
void Pop(Register dst) { pop(dst); }
void Lzcnt(Register dst, Register src) { Lzcnt(dst, Operand(src)); }
void Lzcnt(Register dst, const Operand& src);
// Emit call to the code we are currently generating.
void CallSelf() {
Handle<Code> self(reinterpret_cast<Code**>(CodeObject().location()));