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