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}