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