[x64] Microoptimise comparisons against tagged values
Avoid loading objects with 64-bit movq when they are only being used to compare against another object with a 32-bit cmp_tagged under pointer compression. Change-Id: Ib8ccd093fb49caea3bf1b923b83825626ba0bffc Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3760447 Reviewed-by: Igor Sheludko <ishell@chromium.org> Commit-Queue: Leszek Swirski <leszeks@chromium.org> Auto-Submit: Leszek Swirski <leszeks@chromium.org> Cr-Commit-Position: refs/heads/main@{#81689}
This commit is contained in:
parent
db9e3428c6
commit
30dad483aa
@ -3,6 +3,7 @@
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#if V8_TARGET_ARCH_X64
|
||||
|
||||
#include "src/base/bits.h"
|
||||
@ -185,12 +186,13 @@ void TurboAssembler::CompareRoot(Register with, RootIndex index) {
|
||||
void TurboAssembler::CompareRoot(Operand with, RootIndex index) {
|
||||
DCHECK(root_array_available_);
|
||||
DCHECK(!with.AddressUsesRegister(kScratchRegister));
|
||||
LoadRoot(kScratchRegister, index);
|
||||
if (base::IsInRange(index, RootIndex::kFirstStrongOrReadOnlyRoot,
|
||||
RootIndex::kLastStrongOrReadOnlyRoot)) {
|
||||
mov_tagged(kScratchRegister, RootAsOperand(index));
|
||||
cmp_tagged(with, kScratchRegister);
|
||||
} else {
|
||||
// Some smi roots contain system pointer size values like stack limits.
|
||||
movq(kScratchRegister, RootAsOperand(index));
|
||||
cmpq(with, kScratchRegister);
|
||||
}
|
||||
}
|
||||
@ -1371,6 +1373,8 @@ void TurboAssembler::SmiCompare(Register dst, Smi src) {
|
||||
void TurboAssembler::Cmp(Register dst, Smi src) {
|
||||
if (src.value() == 0) {
|
||||
test_tagged(dst, dst);
|
||||
} else if (COMPRESS_POINTERS_BOOL) {
|
||||
cmp_tagged(dst, Immediate(src));
|
||||
} else {
|
||||
DCHECK_NE(dst, kScratchRegister);
|
||||
Register constant_reg = GetSmiConstant(src);
|
||||
@ -1653,7 +1657,9 @@ void MacroAssembler::Cmp(Register dst, Handle<Object> source) {
|
||||
if (source->IsSmi()) {
|
||||
Cmp(dst, Smi::cast(*source));
|
||||
} else {
|
||||
Move(kScratchRegister, Handle<HeapObject>::cast(source));
|
||||
Move(kScratchRegister, Handle<HeapObject>::cast(source),
|
||||
COMPRESS_POINTERS_BOOL ? RelocInfo::COMPRESSED_EMBEDDED_OBJECT
|
||||
: RelocInfo::FULL_EMBEDDED_OBJECT);
|
||||
cmp_tagged(dst, kScratchRegister);
|
||||
}
|
||||
}
|
||||
@ -1662,7 +1668,9 @@ void MacroAssembler::Cmp(Operand dst, Handle<Object> source) {
|
||||
if (source->IsSmi()) {
|
||||
Cmp(dst, Smi::cast(*source));
|
||||
} else {
|
||||
Move(kScratchRegister, Handle<HeapObject>::cast(source));
|
||||
Move(kScratchRegister, Handle<HeapObject>::cast(source),
|
||||
COMPRESS_POINTERS_BOOL ? RelocInfo::COMPRESSED_EMBEDDED_OBJECT
|
||||
: RelocInfo::FULL_EMBEDDED_OBJECT);
|
||||
cmp_tagged(dst, kScratchRegister);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user