• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "intrinsics.h"
17 #include "mir_module.h"
18 #include "mir_type.h"
19 #include "mir_builder.h"
20 
21 namespace maple {
22 MIRType *IntrinDesc::jsValueType = nullptr;
23 MIRModule *IntrinDesc::mirModule = nullptr;
24 IntrinDesc IntrinDesc::intrinTable[INTRN_LAST + 1] = {
25 #define DEF_MIR_INTRINSIC(X, NAME, INTRN_CLASS, RETURN_TYPE, ...) \
26     {(NAME), (INTRN_CLASS), {(RETURN_TYPE), ##__VA_ARGS__}},
27 #include "intrinsics.def"
28 #undef DEF_MIR_INTRINSIC
29 };
GetOrCreateJSValueType()30 MIRType *IntrinDesc::GetOrCreateJSValueType()
31 {
32     if (jsValueType != nullptr) {
33         return jsValueType;
34     }
35     MIRBuilder *jsBuilder = mirModule->GetMIRBuilder();
36     FieldVector payloadFields;
37     GStrIdx i32 = jsBuilder->GetOrCreateStringIndex("i32");
38     GStrIdx u32 = jsBuilder->GetOrCreateStringIndex("u32");
39     GStrIdx boo = jsBuilder->GetOrCreateStringIndex("boo");
40     GStrIdx ptr = jsBuilder->GetOrCreateStringIndex("ptr");
41     payloadFields.push_back(
42         FieldPair(i32, TyIdxFieldAttrPair(GlobalTables::GetTypeTable().GetInt32()->GetTypeIndex(), FieldAttrs())));
43     payloadFields.push_back(
44         FieldPair(u32, TyIdxFieldAttrPair(GlobalTables::GetTypeTable().GetUInt32()->GetTypeIndex(), FieldAttrs())));
45     payloadFields.push_back(
46         FieldPair(boo, TyIdxFieldAttrPair(GlobalTables::GetTypeTable().GetUInt32()->GetTypeIndex(), FieldAttrs())));
47     payloadFields.push_back(
48         FieldPair(ptr, TyIdxFieldAttrPair(GlobalTables::GetTypeTable().GetVoidPtr()->GetTypeIndex(), FieldAttrs())));
49     FieldVector parentFields;
50     MIRType *payloadType =
51         GlobalTables::GetTypeTable().GetOrCreateUnionType("payload_type", payloadFields, parentFields, *mirModule);
52     FieldVector sFields;
53     GStrIdx payload = jsBuilder->GetOrCreateStringIndex("payload");
54     GStrIdx tag = jsBuilder->GetOrCreateStringIndex("tag");
55     sFields.push_back(FieldPair(payload, TyIdxFieldAttrPair(payloadType->GetTypeIndex(), FieldAttrs())));
56     sFields.push_back(
57         FieldPair(tag, TyIdxFieldAttrPair(GlobalTables::GetTypeTable().GetUInt32()->GetTypeIndex(), FieldAttrs())));
58     MIRType *sType = GlobalTables::GetTypeTable().GetOrCreateStructType("s_type", sFields, parentFields, *mirModule);
59     CHECK_FATAL(sType != nullptr, "can't get struct type, check it!");
60     FieldVector jsValLayoutFields;
61     GStrIdx asBits = jsBuilder->GetOrCreateStringIndex("asBits");
62     GStrIdx s = jsBuilder->GetOrCreateStringIndex("s");
63     GStrIdx asDouble = jsBuilder->GetOrCreateStringIndex("asDouble");
64     GStrIdx asPtr = jsBuilder->GetOrCreateStringIndex("asPtr");
65     jsValLayoutFields.push_back(
66         FieldPair(asBits, TyIdxFieldAttrPair(GlobalTables::GetTypeTable().GetUInt64()->GetTypeIndex(), FieldAttrs())));
67     jsValLayoutFields.push_back(FieldPair(s, TyIdxFieldAttrPair(sType->GetTypeIndex(), FieldAttrs())));
68     jsValLayoutFields.push_back(FieldPair(
69         asDouble, TyIdxFieldAttrPair(GlobalTables::GetTypeTable().GetDouble()->GetTypeIndex(), FieldAttrs())));
70     jsValLayoutFields.push_back(
71         FieldPair(asPtr, TyIdxFieldAttrPair(GlobalTables::GetTypeTable().GetVoidPtr()->GetTypeIndex(), FieldAttrs())));
72     MIRType *jsValLayoutType = GlobalTables::GetTypeTable().GetOrCreateUnionType("jsval_layout_type", jsValLayoutFields,
73                                                                                  parentFields, *mirModule);
74     return jsValLayoutType;
75 }
76 
InitMIRModule(MIRModule * mod)77 void IntrinDesc::InitMIRModule(MIRModule *mod)
78 {
79     mirModule = mod;
80 }
81 
GetTypeFromArgTy(IntrinArgType argType) const82 MIRType *IntrinDesc::GetTypeFromArgTy(IntrinArgType argType) const
83 {
84     switch (argType) {
85         case kArgTyVoid:
86             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_void));
87         case kArgTyI8:
88             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_i8));
89         case kArgTyI16:
90             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_i16));
91         case kArgTyI32:
92             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_i32));
93         case kArgTyI64:
94             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_i64));
95         case kArgTyU8:
96             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_u8));
97         case kArgTyU16:
98             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_u16));
99         case kArgTyU32:
100             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_u32));
101         case kArgTyU64:
102             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_u64));
103         case kArgTyU1:
104             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_u1));
105         case kArgTyPtr:
106             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_ptr));
107         case kArgTyRef:
108             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_ref));
109         case kArgTyA32:
110             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_a32));
111         case kArgTyA64:
112             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_a64));
113         case kArgTyF32:
114             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_f32));
115         case kArgTyF64:
116             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_f64));
117         case kArgTyF128:
118             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_f128));
119         case kArgTyC64:
120             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_c64));
121         case kArgTyC128:
122             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_c128));
123         case kArgTyAgg:
124             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_agg));
125         case kArgTyV2I64:
126             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v2i64));
127         case kArgTyV4I32:
128             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v4i32));
129         case kArgTyV8I16:
130             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v8i16));
131         case kArgTyV16I8:
132             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v16i8));
133         case kArgTyV2U64:
134             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v2u64));
135         case kArgTyV4U32:
136             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v4u32));
137         case kArgTyV8U16:
138             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v8u16));
139         case kArgTyV16U8:
140             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v16u8));
141         case kArgTyV2F64:
142             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v2f64));
143         case kArgTyV4F32:
144             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v4f32));
145         case kArgTyV1I64:
146             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_i64));
147         case kArgTyV2I32:
148             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v2i32));
149         case kArgTyV4I16:
150             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v4i16));
151         case kArgTyV8I8:
152             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v8i8));
153         case kArgTyV1U64:
154             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_u64));
155         case kArgTyV2U32:
156             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v2u32));
157         case kArgTyV4U16:
158             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v4u16));
159         case kArgTyV8U8:
160             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v8u8));
161         case kArgTyV1F64:
162             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_f64));
163         case kArgTyV2F32:
164             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_v2f32));
165 #ifdef DYNAMICLANG
166         case kArgTySimplestr:
167             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_simplestr));
168         case kArgTySimpleobj:
169             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_simpleobj));
170         case kArgTyDynany:
171             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_dynany));
172         case kArgTyDyni32:
173             return GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast<TyIdx>(PTY_dyni32));
174 #endif
175         default:
176             return nullptr;
177     }
178 }
179 
GetArgType(uint32 index) const180 MIRType *IntrinDesc::GetArgType(uint32 index) const
181 {
182     // 0 is the arg of return type
183     CHECK_FATAL(index < kMaxArgsNum, "index out of range");
184     return GetTypeFromArgTy(argTypes[index + 1]);
185 }
186 
GetReturnType() const187 MIRType *IntrinDesc::GetReturnType() const
188 {
189     return GetTypeFromArgTy(argTypes[0]);
190 }
191 }  // namespace maple
192