• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License"
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16static void VisitEtsLdObjByName(BytecodeGen *enc, compiler::IntrinsicInst *inst)
17{
18    auto v0 = inst->GetSrcReg(0);
19    auto bcId0 = enc->irInterface_->GetFieldIdByOffset(static_cast<uint32_t>(inst->GetImms()[0]));
20    switch (inst->GetIntrinsicId()) {
21        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_LD_OBJ_BY_NAME_I32:
22        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_LD_OBJ_BY_NAME_F32:
23            enc->result_.emplace_back(pandasm::Create_ETS_LDOBJ_NAME(v0, bcId0));
24            DoSta(inst->GetDstReg(), enc->result_);
25            break;
26        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_LD_OBJ_BY_NAME_I64:
27        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_LD_OBJ_BY_NAME_F64:
28            enc->result_.emplace_back(pandasm::Create_ETS_LDOBJ_NAME_64(v0, bcId0));
29            DoSta64(inst->GetDstReg(), enc->result_);
30            break;
31        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_LD_OBJ_BY_NAME_OBJ:
32            enc->result_.emplace_back(pandasm::Create_ETS_LDOBJ_NAME_OBJ(v0, bcId0));
33            DoStaObj(inst->GetDstReg(), enc->result_);
34            break;
35        default:
36            UNREACHABLE();
37    }
38}
39
40static void VisitEtsStObjByName(BytecodeGen *enc, compiler::IntrinsicInst *inst)
41{
42    auto v0 = inst->GetSrcReg(0);
43    auto bcId0 = enc->irInterface_->GetFieldIdByOffset(static_cast<uint32_t>(inst->GetImms()[0]));
44    switch (inst->GetIntrinsicId()) {
45        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_ST_OBJ_BY_NAME_I32:
46        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_ST_OBJ_BY_NAME_I16:
47        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_ST_OBJ_BY_NAME_I8:
48        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_ST_OBJ_BY_NAME_F32:
49            DoLda(inst->GetSrcReg(1U), enc->result_);
50            enc->result_.emplace_back(pandasm::Create_ETS_STOBJ_NAME(v0, bcId0));
51            break;
52        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_ST_OBJ_BY_NAME_I64:
53        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_ST_OBJ_BY_NAME_F64:
54            DoLda64(inst->GetSrcReg(1U), enc->result_);
55            enc->result_.emplace_back(pandasm::Create_ETS_STOBJ_NAME_64(v0, bcId0));
56            break;
57        case compiler::RuntimeInterface::IntrinsicId::INTRINSIC_COMPILER_ETS_ST_OBJ_BY_NAME_OBJ:
58            DoLdaObj(inst->GetSrcReg(1U), enc->result_);
59            enc->result_.emplace_back(pandasm::Create_ETS_STOBJ_NAME_OBJ(v0, bcId0));
60            break;
61        default:
62            UNREACHABLE();
63    }
64}
65
66static void VisitLoadUniqueObject(GraphVisitor *visitor, Inst *inst)
67{
68    auto *enc = static_cast<BytecodeGen *>(visitor);
69    if (inst->GetDstReg() == compiler::GetAccReg()) {
70        enc->result_.emplace_back(pandasm::Create_ETS_LDNULLVALUE());
71    } else {
72        enc->result_.emplace_back(pandasm::Create_ETS_MOVNULLVALUE(inst->GetDstReg()));
73    }
74}
75
76template <bool IS_STRICT>
77static void VisitEtsEquals(GraphVisitor *visitor, Inst *inst)
78{
79    auto *enc = static_cast<BytecodeGen *>(visitor);
80    auto v0 = inst->GetSrcReg(0);
81    auto v1 = inst->GetSrcReg(1);
82    if constexpr (IS_STRICT) {
83        enc->result_.emplace_back(pandasm::Create_ETS_STRICTEQUALS(v0, v1));
84    } else {
85        enc->result_.emplace_back(pandasm::Create_ETS_EQUALS(v0, v1));
86    }
87    DoSta(inst->GetDstReg(), enc->result_);
88}
89
90static void VisitEtsTypeof(GraphVisitor *visitor, Inst *inst)
91{
92    auto *enc = static_cast<BytecodeGen *>(visitor);
93    auto v0 = inst->GetSrcReg(0);
94    enc->result_.emplace_back(pandasm::Create_ETS_TYPEOF(v0));
95    DoStaObj(inst->GetDstReg(), enc->result_);
96}
97
98static void VisitEtsIstrue(GraphVisitor *visitor, Inst *inst)
99{
100    auto *enc = static_cast<BytecodeGen *>(visitor);
101    auto v = inst->GetSrcReg(0);
102    enc->result_.emplace_back(pandasm::Create_ETS_ISTRUE(v));
103    DoSta(inst->GetDstReg(), enc->result_);
104}