1b1994897Sopenharmony_ci/** 2b1994897Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3b1994897Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4b1994897Sopenharmony_ci * you may not use this file except in compliance with the License. 5b1994897Sopenharmony_ci * You may obtain a copy of the License at 6b1994897Sopenharmony_ci * 7b1994897Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8b1994897Sopenharmony_ci * 9b1994897Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10b1994897Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11b1994897Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12b1994897Sopenharmony_ci * See the License for the specific language governing permissions and 13b1994897Sopenharmony_ci * limitations under the License. 14b1994897Sopenharmony_ci */ 15b1994897Sopenharmony_ci 16b1994897Sopenharmony_ci#ifndef BYTECODE_OPTIMIZER_BYTECODE_ENCODER_H 17b1994897Sopenharmony_ci#define BYTECODE_OPTIMIZER_BYTECODE_ENCODER_H 18b1994897Sopenharmony_ci 19b1994897Sopenharmony_ci#include <stdint.h> 20b1994897Sopenharmony_ci 21b1994897Sopenharmony_ci#include "compiler/optimizer/code_generator/encode.h" 22b1994897Sopenharmony_ci 23b1994897Sopenharmony_cinamespace panda::bytecodeopt { 24b1994897Sopenharmony_ciclass BytecodeEncoder final : public compiler::Encoder { 25b1994897Sopenharmony_cipublic: 26b1994897Sopenharmony_ci explicit BytecodeEncoder(ArenaAllocator *allocator) : Encoder(allocator, Arch::NONE) {} 27b1994897Sopenharmony_ci 28b1994897Sopenharmony_ci void Finalize() override {}; 29b1994897Sopenharmony_ci 30b1994897Sopenharmony_ci static bool CanEncodeImmHelper(int64_t imm, uint32_t size, int64_t min, int64_t max) 31b1994897Sopenharmony_ci { 32b1994897Sopenharmony_ci constexpr uint8_t HALF_SIZE = 32; 33b1994897Sopenharmony_ci if (size != HALF_SIZE) { 34b1994897Sopenharmony_ci return false; 35b1994897Sopenharmony_ci } 36b1994897Sopenharmony_ci 37b1994897Sopenharmony_ci return imm >= min && imm <= max; 38b1994897Sopenharmony_ci } 39b1994897Sopenharmony_ci 40b1994897Sopenharmony_ci bool CanEncodeImmAddSubCmp(int64_t imm, uint32_t size, [[maybe_unused]] bool signed_compare) override 41b1994897Sopenharmony_ci { 42b1994897Sopenharmony_ci return CanEncodeImmHelper(imm, size, INT8_MIN, INT8_MAX); 43b1994897Sopenharmony_ci } 44b1994897Sopenharmony_ci 45b1994897Sopenharmony_ci bool CanEncodeImmMulDivMod(uint64_t imm, uint32_t size) override 46b1994897Sopenharmony_ci { 47b1994897Sopenharmony_ci return CanEncodeImmAddSubCmp(imm, size, false); 48b1994897Sopenharmony_ci } 49b1994897Sopenharmony_ci 50b1994897Sopenharmony_ci bool CanEncodeImmLogical(uint64_t imm, uint32_t size) override 51b1994897Sopenharmony_ci { 52b1994897Sopenharmony_ci return CanEncodeImmHelper(imm, size, INT32_MIN, INT32_MAX); 53b1994897Sopenharmony_ci } 54b1994897Sopenharmony_ci 55b1994897Sopenharmony_ci bool CanEncodeShift(uint32_t size) override 56b1994897Sopenharmony_ci { 57b1994897Sopenharmony_ci constexpr uint32_t UNSUPPORTED_SHIFT_SIZE = 64; 58b1994897Sopenharmony_ci return size != UNSUPPORTED_SHIFT_SIZE; 59b1994897Sopenharmony_ci } 60b1994897Sopenharmony_ci size_t GetLabelAddress(compiler::LabelHolder::LabelId) override 61b1994897Sopenharmony_ci { 62b1994897Sopenharmony_ci return 0; 63b1994897Sopenharmony_ci } 64b1994897Sopenharmony_ci bool LabelHasLinks(compiler::LabelHolder::LabelId) override 65b1994897Sopenharmony_ci { 66b1994897Sopenharmony_ci return false; 67b1994897Sopenharmony_ci } 68b1994897Sopenharmony_ci}; // BytecodeEncoder 69b1994897Sopenharmony_ci} // namespace panda::bytecodeopt 70b1994897Sopenharmony_ci 71b1994897Sopenharmony_ci#endif // BYTECODE_OPTIMIZER_BYTECODE_ENCODER_H 72