blob: 7aa3eca5c7e16f62d15ac69878b0815a35ebd1a3 [file] [log] [blame]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include "vm/dispatch_table.h"
#include "platform/assert.h"
namespace dart {
intptr_t DispatchTable::OriginElement() {
#if defined(TARGET_ARCH_X64)
// Max negative byte offset / 8
return 16;
#elif defined(TARGET_ARCH_ARM)
// Max negative load offset / 4
return 1023;
#elif defined(TARGET_ARCH_ARM64)
// Max consecutive sub immediate value
return 4096;
#elif defined(TARGET_ARCH_RISCV32)
// Max consecutive sub immediate value
return 2048 / 4;
#elif defined(TARGET_ARCH_RISCV64)
// Max consecutive sub immediate value
return 2048 / 8;
#else
// No AOT on IA32
UNREACHABLE();
return 0;
#endif
}
intptr_t DispatchTable::LargestSmallOffset() {
#if defined(TARGET_ARCH_X64)
// Origin + Max positive byte offset / 8
return 31;
#elif defined(TARGET_ARCH_ARM)
// Origin + Max positive load offset / 4
return 2046;
#elif defined(TARGET_ARCH_ARM64)
// Origin + Max consecutive add immediate value
return 8192;
#elif defined(TARGET_ARCH_RISCV32)
// Origin + Max consecutive add immediate value
return 4096 / 4;
#elif defined(TARGET_ARCH_RISCV64)
// Origin + Max consecutive add immediate value
return 4096 / 8;
#else
// No AOT on IA32
UNREACHABLE();
return 0;
#endif
}
const uword* DispatchTable::ArrayOrigin() const {
return &array_.get()[OriginElement()];
}
} // namespace dart