1/*
2 * Copyright (c) 2023 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
16#ifndef ECMASCRIPT_COMPILER_MCR_LOWERING_H
17#define ECMASCRIPT_COMPILER_MCR_LOWERING_H
18
19#include "ecmascript/compiler/circuit.h"
20#include "ecmascript/compiler/circuit_builder-inl.h"
21#include "ecmascript/compiler/combined_pass_visitor.h"
22#include "ecmascript/compiler/compilation_env.h"
23#include "ecmascript/compiler/gate_accessor.h"
24
25namespace panda::ecmascript::kungfu {
26class MCRLowering : public PassVisitor {
27public:
28    MCRLowering(CompilationEnv* env, Circuit *circuit, RPOVisitor *visitor, CompilationConfig *cmpCfg, Chunk *chunk)
29        : PassVisitor(circuit, chunk, visitor), env_(env), circuit_(circuit), acc_(circuit),
30          builder_(circuit, cmpCfg), glue_(acc_.GetGlueFromArgList())
31    {
32    }
33    ~MCRLowering() = default;
34
35    GateRef VisitGate(GateRef gate) override;
36    StateDepend LowerConvert(StateDepend stateDepend, GateRef gate);
37private:
38
39    void DeleteStateSplit(GateRef gate);
40    void LowerArrayGuardianCheck(GateRef gate);
41    void LowerHeapObjectCheck(GateRef gate);
42    void LowerTaggedIsHeapObject(GateRef gate);
43    void LowerIsMarkerCellValid(GateRef gate);
44    void LowerIsSpecificObjectType(GateRef gate);
45    void LowerHClassStableArrayCheck(GateRef gate);
46    void LowerGetConstPool(GateRef gate);
47    void LowerGetUnsharedConstpool(GateRef gate);
48    void LowerLoadConstOffset(GateRef gate);
49    void LowerLoadHClassFromConstpool(GateRef gate);
50    void LowerStoreConstOffset(GateRef gate);
51    void LowerConvertHoleAsUndefined(GateRef gate);
52    void LowerCheckAndConvert(GateRef gate);
53    void LowerCheckUInt32AndConvert(GateRef gate, GateRef frameState);
54    void LowerCheckTaggedIntAndConvert(GateRef gate, GateRef frameState);
55    void LowerCheckTaggedDoubleAndConvert(GateRef gate, GateRef frameState, Label *exit);
56    void LowerCheckTaggedNumberAndConvert(GateRef gate, GateRef frameState, Label *exit);
57    void LowerCheckTaggedBoolAndConvert(GateRef gate, GateRef frameState);
58    void LowerCheckSpecialHoleAndConvert(GateRef gate, GateRef frameState);
59    void LowerCheckSupportAndConvert(GateRef gate, GateRef frameState);
60    void LowerGetGlobalEnv(GateRef gate);
61    void LowerGetGlobalEnvObj(GateRef gate);
62    void LowerGetGlobalEnvObjHClass(GateRef gate);
63    void LowerGetGlobalConstantValue(GateRef gate);
64    void LowerInt32CheckRightIsZero(GateRef gate);
65    void LowerRemainderIsNegativeZero(GateRef gate);
66    void LowerFloat64CheckRightIsZero(GateRef gate);
67    void LowerValueCheckNegOverflow(GateRef gate);
68    void LowerOverflowCheck(GateRef gate);
69    void LowerInt32UnsignedUpperBoundCheck(GateRef gate);
70    void LowerInt32DivWithCheck(GateRef gate);
71    void LowerLexVarIsHoleCheck(GateRef gate);
72    void LowerIsUndefinedOrHoleCheck(GateRef gate);
73    void LowerIsNotUndefinedOrHoleCheck(GateRef gate);
74    void LowerIsEcmaObjectCheck(GateRef gate);
75    void LowerIsDataViewCheck(GateRef gate);
76    void LowerStoreMemory(GateRef gate);
77    void LowerCheckNullAndConvert(GateRef gate, GateRef frameState);
78    void LowerUndefinedAndConvert(GateRef gate, GateRef frameState);
79    void LowerMigrateFromRawValueToHeapValues(GateRef gate);
80    void LowerMigrateFromHeapValueToRawValue(GateRef gate);
81    void LowerMigrateFromHoleIntToHoleNumber(GateRef gate);
82    void LowerMigrateFromHoleNumberToHoleInt(GateRef gate);
83    void LowerHeapObjectIsEcmaObject(GateRef gate);
84    void LowerIsCallableCheck(GateRef gate);
85    void LowerCheckFloat64AndConvert(GateRef gate, GateRef frameState, Label *exit);
86
87    GateRef ConvertSpecialHoleIntToTagged(GateRef gate, Label* exit);
88    GateRef ConvertSpecialHoleDoubleToTagged(GateRef gate, Label* exit);
89    GateRef ConvertBoolToTaggedBoolean(GateRef gate);
90    GateRef ConvertInt32ToFloat64(GateRef gate);
91    GateRef ConvertUInt32ToFloat64(GateRef gate);
92    GateRef ConvertInt32ToTaggedInt(GateRef gate);
93    GateRef ConvertUInt32ToTaggedNumber(GateRef gate, Label *exit);
94    GateRef ConvertFloat64ToBool(GateRef gate);
95    GateRef ConvertFloat64ToInt32(GateRef gate, Label *exit);
96    GateRef ConvertFloat64ToTaggedDouble(GateRef gate);
97    GateRef ConvertTaggedIntToInt32(GateRef gate);
98    GateRef ConvertTaggedIntToFloat64(GateRef gate);
99    GateRef ConvertTaggedDoubleToInt32(GateRef gate, Label *exit);
100    GateRef ConvertTaggedDoubleToFloat64(GateRef gate);
101    GateRef ConvertTaggedNumberToBool(GateRef gate, Label *exit);
102    GateRef ConvertTaggedNumberToInt32(GateRef gate, Label *exit);
103    GateRef ConvertTaggedNumberToFloat64(GateRef gate, Label *exit);
104    GateRef ConvertTaggedBooleanToBool(GateRef gate);
105    void HeapAllocateInSOld(GateRef gate);
106    void InitializeWithSpeicalValue(Label *exit, GateRef object, GateRef glue, GateRef value,
107                                    GateRef start, GateRef end);
108    CompilationEnv *env_;
109    Circuit *circuit_;
110    GateAccessor acc_;
111    CircuitBuilder builder_;
112    GateRef glue_ {Circuit::NullGate()};
113};
114}  // panda::ecmascript::kungfu
115#endif  // ECMASCRIPT_COMPILER_MCR_LOWERING_H
116