From 39fca64db94928f4a11ef8504bc0b4cd3865b68b Mon Sep 17 00:00:00 2001 From: Igor Sheludko Date: Thu, 21 Mar 2019 14:23:32 +0100 Subject: [PATCH] [ptr-compr] Add a switch for branchless/branchful decompression Bug: v8:7703 Change-Id: Ic6cd8b337813ecff2a0d030aa3a57304e784378a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1511486 Reviewed-by: Toon Verwaest Commit-Queue: Igor Sheludko Cr-Commit-Position: refs/heads/master@{#60391} --- src/globals.h | 4 ++++ src/ptr-compr-inl.h | 14 ++++++++++---- src/x64/macro-assembler-x64.cc | 29 ++++++++++++++++++----------- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/globals.h b/src/globals.h index b528987bd9df..f71ff816e3d6 100644 --- a/src/globals.h +++ b/src/globals.h @@ -225,6 +225,10 @@ using AtomicTagged_t = base::AtomicWord; #endif // V8_COMPRESS_POINTERS +// Defines whether the branchless or branchful implementation of pointer +// decompression should be used. +constexpr bool kUseBranchlessPtrDecompression = true; + STATIC_ASSERT(kTaggedSize == (1 << kTaggedSizeLog2)); using AsAtomicTagged = base::AsAtomicPointerImpl; diff --git a/src/ptr-compr-inl.h b/src/ptr-compr-inl.h index f85105d2946b..a7fb59e3af44 100644 --- a/src/ptr-compr-inl.h +++ b/src/ptr-compr-inl.h @@ -42,10 +42,16 @@ V8_INLINE Address DecompressTaggedAny(Address on_heap_addr, // Current compression scheme requires |raw_value| to be sign-extended // from int32_t to intptr_t. intptr_t value = static_cast(static_cast(raw_value)); - // |root_mask| is 0 if the |value| was a smi or -1 otherwise. - Address root_mask = static_cast
(-(value & kSmiTagMask)); - Address root_or_zero = root_mask & GetRootFromOnHeapAddress(on_heap_addr); - return root_or_zero + static_cast
(value); + if (kUseBranchlessPtrDecompression) { + // |root_mask| is 0 if the |value| was a smi or -1 otherwise. + Address root_mask = static_cast
(-(value & kSmiTagMask)); + Address root_or_zero = root_mask & GetRootFromOnHeapAddress(on_heap_addr); + return root_or_zero + static_cast
(value); + } else { + return HAS_SMI_TAG(value) ? static_cast
(value) + : (GetRootFromOnHeapAddress(on_heap_addr) + + static_cast
(value)); + } } #ifdef V8_COMPRESS_POINTERS diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc index 2c199f48eb0d..1751d4845db7 100644 --- a/src/x64/macro-assembler-x64.cc +++ b/src/x64/macro-assembler-x64.cc @@ -307,17 +307,24 @@ void TurboAssembler::DecompressAnyTagged(Register destination, DCHECK(!AreAliased(destination, scratch)); RecordComment("[ DecompressAnyTagged"); movsxlq(destination, field_operand); - // Branchlessly compute |masked_root|: - // masked_root = HAS_SMI_TAG(destination) ? 0 : kRootRegister; - STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag < 32)); - Register masked_root = scratch; - movl(masked_root, destination); - andl(masked_root, Immediate(kSmiTagMask)); - negq(masked_root); - andq(masked_root, kRootRegister); - // Now this add operation will either leave the value unchanged if it is a smi - // or add the isolate root if it is a heap object. - addq(destination, masked_root); + if (kUseBranchlessPtrDecompression) { + // Branchlessly compute |masked_root|: + // masked_root = HAS_SMI_TAG(destination) ? 0 : kRootRegister; + STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag < 32)); + Register masked_root = scratch; + movl(masked_root, destination); + andl(masked_root, Immediate(kSmiTagMask)); + negq(masked_root); + andq(masked_root, kRootRegister); + // Now this add operation will either leave the value unchanged if it is + // a smi or add the isolate root if it is a heap object. + addq(destination, masked_root); + } else { + Label done; + JumpIfSmi(destination, &done); + addq(destination, kRootRegister); + bind(&done); + } RecordComment("]"); }