当前仓库属于关闭状态,部分功能使用受限,详情请查阅 仓库状态说明
57 Star 30 Fork 160

OpenHarmony-SIG/arkcompiler_runtime_core
关闭

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
bytecode_instruction-inl.h 3.11 KB
一键复制 编辑 原始数据 按行查看 历史
nazarovkonstantin_e0ba 提交于 2022-12-27 22:15 +08:00 . fix style
/**
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LIBPANDAFILE_BYTECODE_INSTRUCTION_INL_H_
#define LIBPANDAFILE_BYTECODE_INSTRUCTION_INL_H_
#include "bytecode_instruction.h"
#include "macros.h"
namespace panda {
template <const BytecodeInstMode MODE>
template <class R, class S>
inline auto BytecodeInst<MODE>::ReadHelper(size_t byteoffset, size_t bytecount, size_t offset, size_t width) const
{
constexpr size_t BYTE_WIDTH = 8;
size_t right_shift = offset % BYTE_WIDTH;
S v = 0;
for (size_t i = 0; i < bytecount; i++) {
S mask = static_cast<S>(ReadByte(byteoffset + i)) << (i * BYTE_WIDTH);
v |= mask;
}
v >>= right_shift;
size_t left_shift = sizeof(R) * BYTE_WIDTH - width;
// Do sign extension using arithmetic shift. It's implementation defined
// so we check such behavior using static assert
// NOLINTNEXTLINE(hicpp-signed-bitwise)
static_assert((-1 >> 1) == -1);
// NOLINTNEXTLINE(hicpp-signed-bitwise)
return static_cast<R>(v << left_shift) >> left_shift;
}
template <const BytecodeInstMode MODE>
template <size_t OFFSET, size_t WIDTH, bool IS_SIGNED /* = false */>
inline auto BytecodeInst<MODE>::Read() const
{
constexpr size_t BYTE_WIDTH = 8;
constexpr size_t BYTE_OFFSET = OFFSET / BYTE_WIDTH;
constexpr size_t BYTE_OFFSET_END = (OFFSET + WIDTH + BYTE_WIDTH - 1) / BYTE_WIDTH;
constexpr size_t BYTE_COUNT = BYTE_OFFSET_END - BYTE_OFFSET;
using StorageType = helpers::TypeHelperT<BYTE_COUNT * BYTE_WIDTH, false>;
using ReturnType = helpers::TypeHelperT<WIDTH, IS_SIGNED>;
return ReadHelper<ReturnType, StorageType>(BYTE_OFFSET, BYTE_COUNT, OFFSET, WIDTH);
}
template <const BytecodeInstMode MODE>
template <bool IS_SIGNED /* = false */>
inline auto BytecodeInst<MODE>::Read64(size_t offset, size_t width) const
{
constexpr size_t BIT64 = 64;
constexpr size_t BYTE_WIDTH = 8;
ASSERT((offset % BYTE_WIDTH) + width <= BIT64);
size_t byteoffset = offset / BYTE_WIDTH;
size_t byteoffset_end = (offset + width + BYTE_WIDTH - 1) / BYTE_WIDTH;
size_t bytecount = byteoffset_end - byteoffset;
using StorageType = helpers::TypeHelperT<BIT64, false>;
using ReturnType = helpers::TypeHelperT<BIT64, IS_SIGNED>;
return ReadHelper<ReturnType, StorageType>(byteoffset, bytecount, offset, width);
}
template <const BytecodeInstMode MODE>
template <typename EnumT>
inline size_t BytecodeInst<MODE>::GetSize() const
{
return Size(GetFormat<EnumT>());
}
#include <bytecode_instruction-inl_gen.h>
} // namespace panda
#endif // LIBPANDAFILE_BYTECODE_INSTRUCTION_INL_H_
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/openharmony-sig/arkcompiler_runtime_core.git
git@gitee.com:openharmony-sig/arkcompiler_runtime_core.git
openharmony-sig
arkcompiler_runtime_core
arkcompiler_runtime_core
master

搜索帮助