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// Stmt & Notmmpl 17 // storage access opcodes 18 OPCODE(dassign, DassignNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEHASSSADEF), 8) 19 OPCODE(piassign, PiassignNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEHASSSADEF), 8) 20 OPCODE(maydassign, DassignNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEHASSSADEF), 8) 21 OPCODE(iassign, IassignNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEHASSSADEF), 12) 22 // hierarchical control flow opcodes 23 OPCODE(block, BlockNode, (OPCODEISSTMT | OPCODENOTMMPL), 0) 24 OPCODE(doloop, DoloopNode, (OPCODEISSTMT | OPCODENOTMMPL), 0) 25 OPCODE(dowhile, WhileStmtNode, (OPCODEISSTMT | OPCODENOTMMPL), 0) 26 OPCODE(if, IfStmtNode, (OPCODEISSTMT | OPCODENOTMMPL), 0) 27 OPCODE(while, WhileStmtNode, (OPCODEISSTMT | OPCODENOTMMPL), 0) 28 OPCODE(switch, SwitchNode, (OPCODEISSTMT | OPCODENOTMMPL), 8) 29 OPCODE(multiway, MultiwayNode, (OPCODEISSTMT | OPCODENOTMMPL), 8) 30 OPCODE(foreachelem, ForeachelemNode, (OPCODEISSTMT | OPCODENOTMMPL), 0) 31 // other opcodes 32 OPCODE(comment, CommentNode, (OPCODEISSTMT | OPCODENOTMMPL), 0) 33 OPCODE(eval, UnaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL), 8) 34 OPCODE(free, UnaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL), 8) 35 OPCODE(calcassertge, BinaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTLOWERBOUNDARY), 8) 36 OPCODE(calcassertlt, BinaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTUPPERBOUNDARY), 8) 37 OPCODE(assertge, AssertBoundaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTLOWERBOUNDARY), 8) 38 OPCODE(assertlt, AssertBoundaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTUPPERBOUNDARY), 8) 39 OPCODE(callassertle, CallAssertBoundaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTUPPERBOUNDARY), 8) 40 OPCODE(returnassertle, AssertBoundaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTUPPERBOUNDARY), 8) 41 OPCODE(assignassertle, AssertBoundaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTUPPERBOUNDARY), 8) 42 OPCODE(abort, UnaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL), 8) 43 OPCODE(assertnonnull, UnaryStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTNONNULL), 8) 44 OPCODE(assignassertnonnull, AssignAssertNonnullStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTNONNULL), 8) 45 OPCODE(callassertnonnull, CallAssertNonnullStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTNONNULL), 8) 46 OPCODE(returnassertnonnull, ReturnAssertNonnullStmtNode, (OPCODEISSTMT | OPCODENOTMMPL | OPCODEASSERTNONNULL), 8) 47// Expr & Notmmpl 48 // storage access opcodes 49 OPCODE(dread, AddrofNode, (OPCODENOTMMPL | OPCODEHASSSAUSE), 12) 50 OPCODE(iread, IreadNode, (OPCODENOTMMPL | OPCODEHASSSAUSE), 12) 51 // leaf opcodes 52 OPCODE(addrof, AddrofNode, OPCODENOTMMPL, 12) 53 OPCODE(iaddrof, IreadNode, OPCODENOTMMPL, 12) 54 OPCODE(sizeoftype, SizeoftypeNode, OPCODENOTMMPL, 8) 55 OPCODE(fieldsdist, FieldsDistNode, OPCODENOTMMPL, 8) 56 // N-ary expression opcodes 57 OPCODE(array, ArrayNode, (OPCODEISVARSIZE | OPCODENOTMMPL | OPCODEMAYTHROWEXCEPTION), 8) 58// Stmt 59 // storage access opcodes 60 OPCODE(iassignoff, IassignoffNode, OPCODEISSTMT, 8) 61 OPCODE(iassignfpoff, IassignFPoffNode, OPCODEISSTMT, 8) 62 OPCODE(regassign, RegassignNode, (OPCODEISSTMT | OPCODEHASSSADEF), 8) 63 // flat control flow opcodes 64 OPCODE(goto, GotoNode, OPCODEISSTMT, 8) 65 OPCODE(brfalse, CondGotoNode, OPCODEISSTMT, 8) 66 OPCODE(brtrue, CondGotoNode, OPCODEISSTMT, 8) 67 OPCODE(return, NaryStmtNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE), 0) 68 OPCODE(rangegoto, RangeGotoNode, OPCODEISSTMT, 8) 69 // call opcodes 70 OPCODE(call, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 71 OPCODE(virtualcall, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 72 OPCODE(superclasscall, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 73 OPCODE(interfacecall, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 74 OPCODE(customcall, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 75 OPCODE(polymorphiccall, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 12) 76 OPCODE(icall, IcallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 77 OPCODE(interfaceicall, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 78 OPCODE(virtualicall, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 79 OPCODE(intrinsiccall, IntrinsiccallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 80 OPCODE(intrinsiccallwithtype, IntrinsiccallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 12) 81 OPCODE(xintrinsiccall, IntrinsiccallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 82 OPCODE(callassigned, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 83 OPCODE(virtualcallassigned, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 84 OPCODE(superclasscallassigned, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 85 OPCODE(interfacecallassigned, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 86 OPCODE(customcallassigned, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 87 OPCODE(polymorphiccallassigned, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 88 OPCODE(icallassigned, IcallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 89 OPCODE(interfaceicallassigned, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 90 OPCODE(virtualicallassigned, CallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 91 OPCODE(intrinsiccallassigned, IntrinsiccallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 92 OPCODE(intrinsiccallwithtypeassigned, IntrinsiccallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 93 OPCODE(xintrinsiccallassigned, IntrinsiccallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 94 // call with generic instantiation opcodes 95 OPCODE(callinstant, CallinstantNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 0) 96 OPCODE(callinstantassigned, CallinstantNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 97 OPCODE(virtualcallinstant, CallinstantNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 0) 98 OPCODE(virtualcallinstantassigned, CallinstantNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 99 OPCODE(superclasscallinstant, CallinstantNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 0) 100 OPCODE(superclasscallinstantassigned, CallinstantNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 101 OPCODE(interfacecallinstant, CallinstantNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 0) 102 OPCODE(interfacecallinstantassigned, CallinstantNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 0) 103 // exception handling 104 OPCODE(jstry, JsTryNode, OPCODEISSTMT, 8) 105 OPCODE(try, TryNode, (OPCODEISSTMT | OPCODENOTMMPL), 8) 106 OPCODE(cpptry, TryNode, (OPCODEISSTMT | OPCODENOTMMPL), 8) 107 108 OPCODE(throw, UnaryStmtNode, (OPCODEISSTMT | OPCODEHASSSAUSE), 0) 109 110 OPCODE(jscatch, StmtNode, OPCODEISSTMT, 4) 111 OPCODE(catch, CatchNode, OPCODEISSTMT, 8) 112 OPCODE(cppcatch, CppCatchNode, OPCODEISSTMT, 8) 113 114 OPCODE(finally, StmtNode, OPCODEISSTMT, 6) 115 OPCODE(cleanuptry, StmtNode, OPCODEISSTMT, 6) 116 OPCODE(endtry, StmtNode, OPCODEISSTMT, 6) 117 OPCODE(safe, StmtNode, OPCODEISSTMT, 6) 118 OPCODE(endsafe, StmtNode, OPCODEISSTMT, 6) 119 OPCODE(unsafe, StmtNode, OPCODEISSTMT, 6) 120 OPCODE(endunsafe, StmtNode, OPCODEISSTMT, 6) 121 OPCODE(gosub, GotoNode, (OPCODEISSTMT | OPCODEHASSSAUSE), 8) 122 OPCODE(retsub, StmtNode, (OPCODEISSTMT | OPCODEHASSSAUSE), 6) 123 // synchronizaion 124 OPCODE(syncenter, NaryStmtNode, (OPCODEISSTMT | OPCODEHASSSADEF | OPCODEHASSSAUSE), 0) 125 OPCODE(syncexit, NaryStmtNode, (OPCODEISSTMT | OPCODEHASSSADEF | OPCODEHASSSAUSE), 0) 126 OPCODE(decref, UnaryStmtNode, (OPCODEISSTMT | OPCODEHASSSAUSE | OPCODENOTMMPL), 0) 127 OPCODE(incref, UnaryStmtNode, (OPCODEISSTMT | OPCODEHASSSAUSE | OPCODENOTMMPL), 0) 128 OPCODE(decrefreset, UnaryStmtNode, (OPCODEISSTMT | OPCODEHASSSAUSE | OPCODENOTMMPL), 0) 129 // barriers 130 OPCODE(membaracquire, StmtNode, OPCODEISSTMT, 6) 131 OPCODE(membarrelease, StmtNode, OPCODEISSTMT, 6) 132 OPCODE(membarstoreload, StmtNode, OPCODEISSTMT, 6) 133 OPCODE(membarstorestore, StmtNode, OPCODEISSTMT, 6) 134 // other opcodes 135 OPCODE(label, LabelNode, OPCODEISSTMT, 8) 136// Expr 137 // storage access opcodes 138 OPCODE(ireadoff, IreadoffNode, 0, 8) 139 OPCODE(ireadfpoff, IreadFPoffNode, 0, 8) 140 OPCODE(regread, RegreadNode, OPCODEHASSSAUSE, 8) 141 // leaf opcodes 142 OPCODE(addroffunc, AddroffuncNode, 0, 8) 143 OPCODE(addroflabel, AddroflabelNode, 0, 8) 144 OPCODE(constval, ConstvalNode, 0, 8) 145 OPCODE(conststr, ConststrNode, OPCODENOTMMPL, 8) 146 OPCODE(conststr16, Conststr16Node, OPCODENOTMMPL, 8) 147 // type conversion expression opcodes 148 OPCODE(ceil, TypeCvtNode, OPCODEISTYPECVT, 8) 149 OPCODE(cvt, TypeCvtNode, OPCODEISTYPECVT, 8) 150 OPCODE(floor, TypeCvtNode, OPCODEISTYPECVT, 8) 151 OPCODE(retype, RetypeNode, OPCODEISTYPECVT, 8) 152 OPCODE(round, TypeCvtNode, OPCODEISTYPECVT, 8) 153 OPCODE(trunc, TypeCvtNode, OPCODEISTYPECVT, 8) 154 // unary expression opcodes 155 OPCODE(abs, UnaryNode, 0, 0) 156 OPCODE(bnot, UnaryNode, 0, 0) 157 OPCODE(lnot, UnaryNode, 0, 0) 158 OPCODE(neg, UnaryNode, 0, 0) 159 OPCODE(recip, UnaryNode, 0, 0) 160 OPCODE(sqrt, UnaryNode, 0, 0) 161 OPCODE(sext, ExtractbitsNode, 0, 8) 162 OPCODE(zext, ExtractbitsNode, 0, 8) 163 164#ifdef alloca 165#undef alloca 166 OPCODE(alloca, UnaryNode, OPCODENOTPURE, 0) 167#define alloca __builtin_alloca 168#else 169 OPCODE(alloca, UnaryNode, OPCODENOTPURE, 0) 170#endif 171 172 OPCODE(malloc, UnaryNode, OPCODENOTPURE, 0) 173 OPCODE(gcmalloc, GCMallocNode, OPCODENOTPURE, 8) 174 OPCODE(gcpermalloc, GCMallocNode, OPCODENOTPURE, 8) 175 OPCODE(stackmalloc, GCMallocNode, OPCODENOTPURE, 8) 176 OPCODE(gcmallocjarray, JarrayMallocNode, OPCODENOTPURE, 12) 177 OPCODE(gcpermallocjarray, JarrayMallocNode, OPCODENOTPURE, 12) 178 OPCODE(stackmallocjarray, JarrayMallocNode, OPCODENOTPURE, 12) 179 OPCODE(resolveinterfacefunc, ResolveFuncNode, 0, 8) 180 OPCODE(resolvevirtualfunc, ResolveFuncNode, 0, 8) 181 // binary expression opcodes 182 OPCODE(add, BinaryNode, 0, 0) 183 OPCODE(sub, BinaryNode, 0, 0) 184 OPCODE(mul, BinaryNode, 0, 0) 185 OPCODE(div, BinaryNode, OPCODEMAYTHROWEXCEPTION, 0) 186 OPCODE(rem, BinaryNode, OPCODEMAYTHROWEXCEPTION, 0) 187 OPCODE(ashr, BinaryNode, 0, 0) 188 OPCODE(lshr, BinaryNode, 0, 0) 189 OPCODE(shl, BinaryNode, 0, 0) 190 OPCODE(ror, BinaryNode, 0, 0) 191 OPCODE(max, BinaryNode, 0, 0) 192 OPCODE(min, BinaryNode, 0, 0) 193 OPCODE(band, BinaryNode, 0, 0) 194 OPCODE(bior, BinaryNode, 0, 0) 195 OPCODE(bxor, BinaryNode, 0, 0) 196 OPCODE(CG_array_elem_add, BinaryNode, 0, 0) 197 OPCODE(eq, CompareNode, OPCODEISCOMPARE, 8) 198 OPCODE(ge, CompareNode, OPCODEISCOMPARE, 8) 199 OPCODE(gt, CompareNode, OPCODEISCOMPARE, 8) 200 OPCODE(le, CompareNode, OPCODEISCOMPARE, 8) 201 OPCODE(lt, CompareNode, OPCODEISCOMPARE, 8) 202 OPCODE(ne, CompareNode, OPCODEISCOMPARE, 8) 203 OPCODE(cmp, CompareNode, OPCODEISCOMPARE, 8) 204 OPCODE(cmpl, CompareNode, OPCODEISCOMPARE, 8) 205 OPCODE(cmpg, CompareNode, OPCODEISCOMPARE, 8) 206 OPCODE(land, BinaryNode, 0, 0) 207 OPCODE(lior, BinaryNode, 0, 0) 208 OPCODE(cand, BinaryNode, OPCODENOTMMPL, 0) 209 OPCODE(cior, BinaryNode, OPCODENOTMMPL, 0) 210 // ternary expression opcodes 211 OPCODE(select, TernaryNode, 0, 0) 212 // N-ary expression opcodes 213 OPCODE(intrinsicop, IntrinsicopNode, OPCODEISVARSIZE, 8) 214 OPCODE(intrinsicopwithtype, IntrinsicopNode, OPCODEISVARSIZE, 12) 215 // Other expression opcodes 216 OPCODE(extractbits, ExtractbitsNode, 0, 8) 217 OPCODE(depositbits, DepositbitsNode, 0, 8) 218 // storage access 219 OPCODE(iassignpcoff, IassignPCoffNode, OPCODEISSTMT, 0) 220 OPCODE(ireadpcoff, IreadPCoffNode, 0, 0) 221 // barrier 222 OPCODE(checkpoint, StmtNode, OPCODEISSTMT, 0) 223 // leaf node 224 OPCODE(addroffpc, AddroffPCNode, 0, 0) 225 OPCODE(igoto, UnaryStmtNode, OPCODEISSTMT, 0) 226 OPCODE(asm, AsmNode, OPCODEISSTMT | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALLASSIGNED, 0) 227 OPCODE(dreadoff, dreadoffNode, OPCODEHASSSAUSE, 12) 228 OPCODE(addrofoff, addrofoffNode, 0, 12) 229 OPCODE(dassignoff, DassignoffNode, (OPCODEISSTMT | OPCODEHASSSADEF), 8) 230 OPCODE(iassignspoff, IassignFPoffNode, OPCODEISSTMT, 8) 231 OPCODE(blkassignoff, BlkassignoffNode, OPCODEISSTMT, 8) 232 OPCODE(icallproto, IcallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL), 8) 233 OPCODE(icallprotoassigned, IcallNode, (OPCODEISSTMT | OPCODEISVARSIZE | OPCODEHASSSAUSE | OPCODEHASSSADEF | OPCODEISCALL | OPCODEISCALLASSIGNED), 8) 234