Commit 45f1bf80 authored by clemensh's avatar clemensh Committed by Commit bot

[x64] Use smaller code sequence when pushing SMIs

If exactly one byte in the upper half of the pushed 8-byte value is
set, use a smaller code sequence to push this value on the stack.
Before, we did
  movq r10,<constant>
  push r10
Now, we do
  push 0x0
  movb [rsp+<offset>],<byte>

The old sequence had 12 bytes, the new one has 7.
Pushing such values is used a lot for stack frame markers, which are
small numbers (1-17) encoded as SMIs.

Review-Url: https://codereview.chromium.org/2685213004
Cr-Commit-Position: refs/heads/master@{#43146}
parent c495421c
...@@ -2465,10 +2465,19 @@ void MacroAssembler::Push(Smi* source) { ...@@ -2465,10 +2465,19 @@ void MacroAssembler::Push(Smi* source) {
intptr_t smi = reinterpret_cast<intptr_t>(source); intptr_t smi = reinterpret_cast<intptr_t>(source);
if (is_int32(smi)) { if (is_int32(smi)) {
Push(Immediate(static_cast<int32_t>(smi))); Push(Immediate(static_cast<int32_t>(smi)));
} else { return;
}
int first_byte_set = base::bits::CountTrailingZeros64(smi) / 8;
int last_byte_set = (63 - base::bits::CountLeadingZeros64(smi)) / 8;
if (first_byte_set == last_byte_set && kPointerSize == kInt64Size) {
// This sequence has only 7 bytes, compared to the 12 bytes below.
Push(Immediate(0));
movb(Operand(rsp, first_byte_set),
Immediate(static_cast<int8_t>(smi >> (8 * first_byte_set))));
return;
}
Register constant = GetSmiConstant(source); Register constant = GetSmiConstant(source);
Push(constant); Push(constant);
}
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment