Commit ed9fc67e authored by QiuJi's avatar QiuJi Committed by Commit Bot

[riscv64] Optimize load and store with offset

Refs: https://bugs.chromium.org/p/v8/issues/detail?id=11628
Change-Id: Ia651b14acd6fc3293abddbe5e49277d8dadb19ba
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2814563Reviewed-by: 's avatarBrice Dobry <brice.dobry@futurewei.com>
Commit-Queue: Brice Dobry <brice.dobry@futurewei.com>
Cr-Commit-Position: refs/heads/master@{#73912}
parent f2b4272d
......@@ -2597,9 +2597,25 @@ void Assembler::AdjustBaseAndOffset(MemOperand* src, Register scratch,
// Must not overwrite the register 'base' while loading 'offset'.
DCHECK(src->rm() != scratch);
RV_li(scratch, src->offset());
add(scratch, scratch, src->rm());
src->offset_ = 0;
constexpr int32_t kMinOffsetForSimpleAdjustment = 0x7F8;
constexpr int32_t kMaxOffsetForSimpleAdjustment =
2 * kMinOffsetForSimpleAdjustment;
if (0 <= src->offset() && src->offset() <= kMaxOffsetForSimpleAdjustment) {
addi(scratch, src->rm(), kMinOffsetForSimpleAdjustment);
src->offset_ -= kMinOffsetForSimpleAdjustment;
} else if (-kMaxOffsetForSimpleAdjustment <= src->offset() &&
src->offset() < 0) {
addi(scratch, src->rm(), -kMinOffsetForSimpleAdjustment);
src->offset_ += kMinOffsetForSimpleAdjustment;
} else if (access_type == OffsetAccessType::SINGLE_ACCESS) {
RV_li(scratch, (static_cast<int64_t>(src->offset()) + 0x800) >> 12 << 12);
add(scratch, scratch, src->rm());
src->offset_ = src->offset() << 20 >> 20;
} else {
RV_li(scratch, src->offset());
add(scratch, scratch, src->rm());
src->offset_ = 0;
}
src->rm_ = scratch;
}
......
......@@ -8,9 +8,9 @@ namespace v8 {
namespace internal {
const bool Deoptimizer::kSupportsFixedDeoptExitSizes = true;
const int Deoptimizer::kNonLazyDeoptExitSize = 5 * kInstrSize;
const int Deoptimizer::kLazyDeoptExitSize = 5 * kInstrSize;
const int Deoptimizer::kEagerWithResumeBeforeArgsSize = 6 * kInstrSize;
const int Deoptimizer::kNonLazyDeoptExitSize = 4 * kInstrSize;
const int Deoptimizer::kLazyDeoptExitSize = 4 * kInstrSize;
const int Deoptimizer::kEagerWithResumeBeforeArgsSize = 5 * kInstrSize;
const int Deoptimizer::kEagerWithResumeDeoptExitSize =
kEagerWithResumeBeforeArgsSize + 4 * kInstrSize;
const int Deoptimizer::kEagerWithResumeImmedArgs1PcOffset = kInstrSize;
......
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