1/* 2 * Copyright (c) 2022-2024 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_BC_CALL_SIGNATURE_H 17#define ECMASCRIPT_COMPILER_BC_CALL_SIGNATURE_H 18 19#include "ecmascript/base/config.h" 20#include "ecmascript/compiler/call_signature.h" 21 22namespace panda::ecmascript::kungfu { 23#define IGNORE_BC_STUB(...) 24#define ASM_UNUSED_BC_STUB_LIST(T) \ 25 T(HandleOverflowDD) \ 26 T(HandleOverflowDE) \ 27 T(HandleOverflowDF) \ 28 T(HandleOverflowE0) \ 29 T(HandleOverflowE1) \ 30 T(HandleOverflowE2) \ 31 T(HandleOverflowE3) \ 32 T(HandleOverflowE4) \ 33 T(HandleOverflowE5) \ 34 T(HandleOverflowE6) \ 35 T(HandleOverflowE7) \ 36 T(HandleOverflowE8) \ 37 T(HandleOverflowE9) \ 38 T(HandleOverflowEA) \ 39 T(HandleOverflowEB) \ 40 T(HandleOverflowEC) \ 41 T(HandleOverflowED) \ 42 T(HandleOverflowEE) \ 43 T(HandleOverflowEF) \ 44 T(HandleOverflowF0) \ 45 T(HandleOverflowF1) \ 46 T(HandleOverflowF2) \ 47 T(HandleOverflowF3) \ 48 T(HandleOverflowF4) \ 49 T(HandleOverflowF5) \ 50 T(HandleOverflowF6) \ 51 T(HandleOverflowF7) \ 52 T(HandleOverflowF8) \ 53 T(HandleOverflowF9) \ 54 T(HandleOverflowFA) \ 55 56 57// V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging 58#define ASM_INTERPRETER_BC_STUB_LIST(V, T, D) \ 59 T(HandleLdundefined) \ 60 T(HandleLdnull) \ 61 T(HandleLdtrue) \ 62 T(HandleLdfalse) \ 63 T(HandleCreateemptyobject) \ 64 T(HandleCreateemptyarrayImm8) \ 65 T(HandleCreatearraywithbufferImm8Id16) \ 66 T(HandleCreateobjectwithbufferImm8Id16) \ 67 T(HandleNewobjrangeImm8Imm8V8) \ 68 T(HandleNewlexenvImm8) \ 69 T(HandleAdd2Imm8V8) \ 70 T(HandleSub2Imm8V8) \ 71 T(HandleMul2Imm8V8) \ 72 T(HandleDiv2Imm8V8) \ 73 T(HandleMod2Imm8V8) \ 74 T(HandleEqImm8V8) \ 75 T(HandleNoteqImm8V8) \ 76 T(HandleLessImm8V8) \ 77 T(HandleLesseqImm8V8) \ 78 T(HandleGreaterImm8V8) \ 79 T(HandleGreatereqImm8V8) \ 80 T(HandleShl2Imm8V8) \ 81 T(HandleShr2Imm8V8) \ 82 T(HandleAshr2Imm8V8) \ 83 T(HandleAnd2Imm8V8) \ 84 T(HandleOr2Imm8V8) \ 85 T(HandleXor2Imm8V8) \ 86 T(HandleExpImm8V8) \ 87 T(HandleTypeofImm8) \ 88 T(HandleTonumberImm8) \ 89 T(HandleTonumericImm8) \ 90 T(HandleNegImm8) \ 91 T(HandleNotImm8) \ 92 T(HandleIncImm8) \ 93 T(HandleDecImm8) \ 94 T(HandleIstrue) \ 95 T(HandleIsfalse) \ 96 T(HandleIsinImm8V8) \ 97 T(HandleInstanceofImm8V8) \ 98 T(HandleStrictnoteqImm8V8) \ 99 T(HandleStricteqImm8V8) \ 100 D(HandleCallarg0Imm8) \ 101 D(HandleCallarg1Imm8V8) \ 102 D(HandleCallargs2Imm8V8V8) \ 103 D(HandleCallargs3Imm8V8V8V8) \ 104 D(HandleCallthis0Imm8V8) \ 105 D(HandleCallthis1Imm8V8V8) \ 106 D(HandleCallthis2Imm8V8V8V8) \ 107 D(HandleCallthis3Imm8V8V8V8V8) \ 108 D(HandleCallthisrangeImm8Imm8V8) \ 109 T(HandleSupercallthisrangeImm8Imm8V8) \ 110 T(HandleDefinefuncImm8Id16Imm8) \ 111 T(HandleDefinemethodImm8Id16Imm8) \ 112 T(HandleDefineclasswithbufferImm8Id16Id16Imm16V8) \ 113 T(HandleGetnextpropnameV8) \ 114 T(HandleLdobjbyvalueImm8V8) \ 115 T(HandleStobjbyvalueImm8V8V8) \ 116 T(HandleLdsuperbyvalueImm8V8) \ 117 T(HandleLdobjbyindexImm8Imm16) \ 118 T(HandleStobjbyindexImm8V8Imm16) \ 119 T(HandleLdlexvarImm4Imm4) \ 120 T(HandleStlexvarImm4Imm4) \ 121 T(HandleLdaStrId16) \ 122 T(HandleTryldglobalbynameImm8Id16) \ 123 T(HandleTrystglobalbynameImm8Id16) \ 124 T(HandleLdglobalvarImm16Id16) \ 125 T(HandleLdobjbynameImm8Id16) \ 126 T(HandleStobjbynameImm8Id16V8) \ 127 T(HandleMovV4V4) \ 128 T(HandleMovV8V8) \ 129 T(HandleLdsuperbynameImm8Id16) \ 130 T(HandleStconsttoglobalrecordImm16Id16) \ 131 T(HandleSttoglobalrecordImm16Id16) \ 132 T(HandleLdthisbynameImm8Id16) \ 133 T(HandleStthisbynameImm8Id16) \ 134 T(HandleLdthisbyvalueImm8) \ 135 T(HandleStthisbyvalueImm8V8) \ 136 T(HandleJmpImm8) \ 137 T(HandleJmpImm16) \ 138 T(HandleJeqzImm8) \ 139 T(HandleJeqzImm16) \ 140 T(HandleJnezImm8) \ 141 T(HandleJstricteqzImm8) \ 142 T(HandleJnstricteqzImm8) \ 143 T(HandleJeqnullImm8) \ 144 T(HandleJnenullImm8) \ 145 T(HandleJstricteqnullImm8) \ 146 T(HandleJnstricteqnullImm8) \ 147 T(HandleJequndefinedImm8) \ 148 T(HandleJneundefinedImm8) \ 149 T(HandleJstrictequndefinedImm8) \ 150 T(HandleJnstrictequndefinedImm8) \ 151 T(HandleJeqV8Imm8) \ 152 T(HandleJneV8Imm8) \ 153 T(HandleJstricteqV8Imm8) \ 154 T(HandleJnstricteqV8Imm8) \ 155 T(HandleLdaV8) \ 156 T(HandleStaV8) \ 157 T(HandleLdaiImm32) \ 158 T(HandleFldaiImm64) \ 159 T(HandleReturn) \ 160 T(HandleReturnundefined) \ 161 T(HandleGetpropiterator) \ 162 T(HandleGetiteratorImm8) \ 163 T(HandleCloseiteratorImm8V8) \ 164 T(HandlePoplexenv) \ 165 T(HandleLdnan) \ 166 T(HandleLdinfinity) \ 167 T(HandleGetunmappedargs) \ 168 T(HandleLdglobal) \ 169 T(HandleLdnewtarget) \ 170 T(HandleLdthis) \ 171 T(HandleLdhole) \ 172 T(HandleCreateregexpwithliteralImm8Id16Imm8) \ 173 T(HandleCreateregexpwithliteralImm16Id16Imm8) \ 174 D(HandleCallrangeImm8Imm8V8) \ 175 T(HandleDefinefuncImm16Id16Imm8) \ 176 T(HandleDefineclasswithbufferImm16Id16Id16Imm16V8) \ 177 T(HandleGettemplateobjectImm8) \ 178 T(HandleSetobjectwithprotoImm8V8) \ 179 T(HandleStownbyvalueImm8V8V8) \ 180 T(HandleStownbyindexImm8V8Imm16) \ 181 T(HandleStownbynameImm8Id16V8) \ 182 T(HandleGetmodulenamespaceImm8) \ 183 T(HandleStmodulevarImm8) \ 184 T(HandleLdlocalmodulevarImm8) \ 185 T(HandleLdexternalmodulevarImm8) \ 186 T(HandleStglobalvarImm16Id16) \ 187 T(HandleCreateemptyarrayImm16) \ 188 T(HandleCreatearraywithbufferImm16Id16) \ 189 T(HandleCreateobjectwithbufferImm16Id16) \ 190 T(HandleNewobjrangeImm16Imm8V8) \ 191 T(HandleTypeofImm16) \ 192 T(HandleLdobjbyvalueImm16V8) \ 193 T(HandleStobjbyvalueImm16V8V8) \ 194 T(HandleLdsuperbyvalueImm16V8) \ 195 T(HandleLdobjbyindexImm16Imm16) \ 196 T(HandleStobjbyindexImm16V8Imm16) \ 197 T(HandleLdlexvarImm8Imm8) \ 198 T(HandleStlexvarImm8Imm8) \ 199 T(HandleTryldglobalbynameImm16Id16) \ 200 T(HandleTrystglobalbynameImm16Id16) \ 201 T(HandleStownbynamewithnamesetImm8Id16V8) \ 202 T(HandleMovV16V16) \ 203 T(HandleLdobjbynameImm16Id16) \ 204 T(HandleStobjbynameImm16Id16V8) \ 205 T(HandleLdsuperbynameImm16Id16) \ 206 T(HandleLdthisbynameImm16Id16) \ 207 T(HandleStthisbynameImm16Id16) \ 208 T(HandleLdthisbyvalueImm16) \ 209 T(HandleStthisbyvalueImm16V8) \ 210 T(HandleAsyncgeneratorrejectV8) \ 211 T(HandleJmpImm32) \ 212 T(HandleStownbyvaluewithnamesetImm8V8V8) \ 213 T(HandleJeqzImm32) \ 214 T(HandleJnezImm16) \ 215 T(HandleJnezImm32) \ 216 T(HandleJstricteqzImm16) \ 217 T(HandleJnstricteqzImm16) \ 218 T(HandleJeqnullImm16) \ 219 T(HandleJnenullImm16) \ 220 T(HandleJstricteqnullImm16) \ 221 T(HandleJnstricteqnullImm16) \ 222 T(HandleJequndefinedImm16) \ 223 T(HandleJneundefinedImm16) \ 224 T(HandleJstrictequndefinedImm16) \ 225 T(HandleJnstrictequndefinedImm16) \ 226 T(HandleJeqV8Imm16) \ 227 T(HandleJneV8Imm16) \ 228 T(HandleJstricteqV8Imm16) \ 229 T(HandleJnstricteqV8Imm16) \ 230 T(HandleGetiteratorImm16) \ 231 T(HandleCloseiteratorImm16V8) \ 232 T(HandleLdsymbol) \ 233 T(HandleAsyncfunctionenter) \ 234 T(HandleLdfunction) \ 235 T(HandleDebugger) \ 236 T(HandleCreategeneratorobjV8) \ 237 T(HandleCreateiterresultobjV8V8) \ 238 T(HandleCreateobjectwithexcludedkeysImm8V8V8) \ 239 T(HandleNewobjapplyImm8V8) \ 240 T(HandleNewobjapplyImm16V8) \ 241 T(HandleNewlexenvwithnameImm8Id16) \ 242 T(HandleCreateasyncgeneratorobjV8) \ 243 T(HandleAsyncgeneratorresolveV8V8V8) \ 244 T(HandleSupercallspreadImm8V8) \ 245 T(HandleApplyImm8V8V8) \ 246 T(HandleSupercallarrowrangeImm8Imm8V8) \ 247 T(HandleDefinegettersetterbyvalueV8V8V8V8) \ 248 T(HandleDynamicimport) \ 249 T(HandleDefinemethodImm16Id16Imm8) \ 250 T(HandleResumegenerator) \ 251 T(HandleGetresumemode) \ 252 T(HandleGettemplateobjectImm16) \ 253 T(HandleDelobjpropV8) \ 254 T(HandleSuspendgeneratorV8) \ 255 T(HandleAsyncfunctionawaituncaughtV8) \ 256 T(HandleCopydatapropertiesV8) \ 257 T(HandleStarrayspreadV8V8) \ 258 T(HandleSetobjectwithprotoImm16V8) \ 259 T(HandleStownbyvalueImm16V8V8) \ 260 T(HandleStsuperbyvalueImm8V8V8) \ 261 T(HandleStsuperbyvalueImm16V8V8) \ 262 T(HandleStownbyindexImm16V8Imm16) \ 263 T(HandleStownbynameImm16Id16V8) \ 264 T(HandleAsyncfunctionresolveV8) \ 265 T(HandleAsyncfunctionrejectV8) \ 266 T(HandleCopyrestargsImm8) \ 267 T(HandleStsuperbynameImm8Id16V8) \ 268 T(HandleStsuperbynameImm16Id16V8) \ 269 T(HandleStownbyvaluewithnamesetImm16V8V8) \ 270 T(HandleLdbigintId16) \ 271 T(HandleStownbynamewithnamesetImm16Id16V8) \ 272 T(HandleNop) \ 273 T(HandleSetgeneratorstateImm8) \ 274 T(HandleGetasynciteratorImm8) \ 275 T(HandleLdPrivatePropertyImm8Imm16Imm16) \ 276 T(HandleStPrivatePropertyImm8Imm16Imm16V8) \ 277 T(HandleTestInImm8Imm16Imm16) \ 278 T(HandleDefineFieldByNameImm8Id16V8) \ 279 T(HandleDefinePropertyByNameImm8Id16V8) \ 280 ASM_UNUSED_BC_STUB_LIST(T) \ 281 T(HandleCallRuntime) \ 282 T(HandleDeprecated) \ 283 T(HandleWide) \ 284 T(HandleThrow) \ 285 D(ExceptionHandler) 286 287// V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging 288#define ASM_INTERPRETER_DEPRECATED_STUB_LIST(V, T, D) \ 289 T(HandleDeprecatedLdlexenvPrefNone) \ 290 T(HandleDeprecatedPoplexenvPrefNone) \ 291 T(HandleDeprecatedGetiteratornextPrefV8V8) \ 292 T(HandleDeprecatedCreatearraywithbufferPrefImm16) \ 293 T(HandleDeprecatedCreateobjectwithbufferPrefImm16) \ 294 T(HandleDeprecatedTonumberPrefV8) \ 295 T(HandleDeprecatedTonumericPrefV8) \ 296 T(HandleDeprecatedNegPrefV8) \ 297 T(HandleDeprecatedNotPrefV8) \ 298 T(HandleDeprecatedIncPrefV8) \ 299 T(HandleDeprecatedDecPrefV8) \ 300 D(HandleDeprecatedCallarg0PrefV8) \ 301 D(HandleDeprecatedCallarg1PrefV8V8) \ 302 D(HandleDeprecatedCallargs2PrefV8V8V8) \ 303 D(HandleDeprecatedCallargs3PrefV8V8V8V8) \ 304 D(HandleDeprecatedCallrangePrefImm16V8) \ 305 D(HandleDeprecatedCallspreadPrefV8V8V8) \ 306 D(HandleDeprecatedCallthisrangePrefImm16V8) \ 307 T(HandleDeprecatedDefineclasswithbufferPrefId16Imm16Imm16V8V8) \ 308 T(HandleDeprecatedResumegeneratorPrefV8) \ 309 T(HandleDeprecatedGetresumemodePrefV8) \ 310 T(HandleDeprecatedGettemplateobjectPrefV8) \ 311 T(HandleDeprecatedDelobjpropPrefV8V8) \ 312 T(HandleDeprecatedSuspendgeneratorPrefV8V8) \ 313 T(HandleDeprecatedAsyncfunctionawaituncaughtPrefV8V8) \ 314 T(HandleDeprecatedCopydatapropertiesPrefV8V8) \ 315 T(HandleDeprecatedSetobjectwithprotoPrefV8V8) \ 316 T(HandleDeprecatedLdobjbyvaluePrefV8V8) \ 317 T(HandleDeprecatedLdsuperbyvaluePrefV8V8) \ 318 T(HandleDeprecatedLdobjbyindexPrefV8Imm32) \ 319 T(HandleDeprecatedAsyncfunctionresolvePrefV8V8V8) \ 320 T(HandleDeprecatedAsyncfunctionrejectPrefV8V8V8) \ 321 T(HandleDeprecatedStlexvarPrefImm4Imm4V8) \ 322 T(HandleDeprecatedStlexvarPrefImm8Imm8V8) \ 323 T(HandleDeprecatedStlexvarPrefImm16Imm16V8) \ 324 T(HandleDeprecatedGetmodulenamespacePrefId32) \ 325 T(HandleDeprecatedStmodulevarPrefId32) \ 326 T(HandleDeprecatedLdobjbynamePrefId32V8) \ 327 T(HandleDeprecatedLdsuperbynamePrefId32V8) \ 328 T(HandleDeprecatedLdmodulevarPrefId32Imm8) \ 329 T(HandleDeprecatedStconsttoglobalrecordPrefId32) \ 330 T(HandleDeprecatedStlettoglobalrecordPrefId32) \ 331 T(HandleDeprecatedStclasstoglobalrecordPrefId32) \ 332 T(HandleDeprecatedLdhomeobjectPrefNone) \ 333 T(HandleDeprecatedCreateobjecthavingmethodPrefImm16) \ 334 T(HandleDeprecatedDynamicimportPrefV8) \ 335 T(HandleDeprecatedAsyncgeneratorrejectPrefV8V8) 336 337// V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging 338#define ASM_INTERPRETER_WIDE_STUB_LIST(V, T, D) \ 339 T(HandleWideCreateobjectwithexcludedkeysPrefImm16V8V8) \ 340 T(HandleWideNewobjrangePrefImm16V8) \ 341 T(HandleWideNewlexenvPrefImm16) \ 342 T(HandleWideNewlexenvwithnamePrefImm16Id16) \ 343 D(HandleWideCallrangePrefImm16V8) \ 344 D(HandleWideCallthisrangePrefImm16V8) \ 345 T(HandleWideSupercallthisrangePrefImm16V8) \ 346 T(HandleWideSupercallarrowrangePrefImm16V8) \ 347 T(HandleWideLdobjbyindexPrefImm32) \ 348 T(HandleWideStobjbyindexPrefV8Imm32) \ 349 T(HandleWideStownbyindexPrefV8Imm32) \ 350 T(HandleWideCopyrestargsPrefImm16) \ 351 T(HandleWideLdlexvarPrefImm16Imm16) \ 352 T(HandleWideStlexvarPrefImm16Imm16) \ 353 T(HandleWideGetmodulenamespacePrefImm16) \ 354 T(HandleWideStmodulevarPrefImm16) \ 355 T(HandleWideLdlocalmodulevarPrefImm16) \ 356 T(HandleWideLdexternalmodulevarPrefImm16) \ 357 T(HandleWideLdpatchvarPrefImm16) \ 358 T(HandleWideStpatchvarPrefImm16) 359 360// V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging 361#define ASM_INTERPRETER_THROW_STUB_LIST(V, T, D) \ 362 T(HandleThrowPrefNone) \ 363 T(HandleThrowNotexistsPrefNone) \ 364 T(HandleThrowPatternnoncoerciblePrefNone) \ 365 T(HandleThrowDeletesuperpropertyPrefNone) \ 366 T(HandleThrowConstassignmentPrefV8) \ 367 T(HandleThrowIfnotobjectPrefV8) \ 368 T(HandleThrowUndefinedifholePrefV8V8) \ 369 T(HandleThrowIfsupernotcorrectcallPrefImm8) \ 370 T(HandleThrowIfsupernotcorrectcallPrefImm16) \ 371 T(HandleThrowUndefinedifholewithnamePrefId16) 372 373// V: Not Enabled, T: Enabled, D: Always Disable SingleStepDebugging 374#define ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(V, T, D) \ 375 T(HandleCallRuntimeNotifyConcurrentResultPrefNone) \ 376 T(HandleCallRuntimeDefineFieldByValuePrefImm8V8V8) \ 377 T(HandleCallRuntimeDefineFieldByIndexPrefImm8Imm32V8) \ 378 T(HandleCallRuntimeToPropertyKeyPrefNone) \ 379 T(HandleCallRuntimeCreatePrivatePropertyPrefImm16Id16) \ 380 T(HandleCallRuntimeDefinePrivatePropertyPrefImm8Imm16Imm16V8) \ 381 T(HandleCallRuntimeCallInitPrefImm8V8) \ 382 T(HandleCallRuntimeDefineSendableClassPrefImm16Id16Id16Imm16V8) \ 383 T(HandleCallRuntimeLdSendableClassPrefImm16) \ 384 T(HandleCallRuntimeLdsendableexternalmodulevarImm8) \ 385 T(HandleCallRuntimeWideLdsendableexternalmodulevarPrefImm16) \ 386 T(HandleCallRuntimeNewSendableEnvImm8) \ 387 T(HandleCallRuntimeNewSendableEnvImm16) \ 388 T(HandleCallRuntimeStSendableVarImm4Imm4) \ 389 T(HandleCallRuntimeStSendableVarImm8Imm8) \ 390 T(HandleCallRuntimeStSendableVarImm16Imm16) \ 391 T(HandleCallRuntimeLdSendableVarImm4Imm4) \ 392 T(HandleCallRuntimeLdSendableVarImm8Imm8) \ 393 T(HandleCallRuntimeLdSendableVarImm16Imm16) \ 394 T(HandleCallRuntimeIstruePrefImm8) \ 395 T(HandleCallRuntimeIsfalsePrefImm8) \ 396 T(HandleCallRuntimeLdLazyModuleVarPrefImm8) \ 397 T(HandleCallRuntimeWideLdLazyModuleVarPrefImm16) \ 398 T(HandleCallRuntimeLdLazySendableModuleVarPrefImm8) \ 399 T(HandleCallRuntimeWideLdLazySendableModuleVarPrefImm16) \ 400 T(HandleCallRuntimeSuperCallForwardAllArgsV8) 401 402#define ASM_INTERPRETER_BC_HELPER_STUB_LIST(V) \ 403 V(SingleStepDebugging) \ 404 V(BCDebuggerEntry) \ 405 V(BCDebuggerExceptionEntry) \ 406 V(NewObjectRangeThrowException) \ 407 V(ThrowStackOverflowException) \ 408 V(HandleDefinefuncImm8Id16Imm8ColdReload) \ 409 V(HandleDefinefuncImm16Id16Imm8ColdReload) 410 411#define APPEND_JIT_SUFFIX(name, V) \ 412 V(name##WithJitProf, name, SlotIDFormat::IMM8) 413 414#define APPEND_JIT_SUFFIX_IMM16(name, V) \ 415 V(name##WithJitProf, name, SlotIDFormat::IMM16) 416 417#define ASM_INTERPRETER_BC_JIT_PROFILER_STUB_LIST(V) \ 418 ASM_INTERPRETER_BC_FUNC_HOT_JIT_PROFILER_STUB_LIST(V) \ 419 420#define ASM_INTERPRETER_BC_FUNC_HOT_JIT_PROFILER_STUB_LIST(V) \ 421 APPEND_JIT_SUFFIX(HandleJmpImm8, V) \ 422 APPEND_JIT_SUFFIX_IMM16(HandleJmpImm16, V) \ 423 APPEND_JIT_SUFFIX(HandleJmpImm32, V) \ 424 APPEND_JIT_SUFFIX(HandleJeqzImm8, V) \ 425 APPEND_JIT_SUFFIX_IMM16(HandleJeqzImm16, V) \ 426 APPEND_JIT_SUFFIX(HandleJeqzImm32, V) \ 427 APPEND_JIT_SUFFIX(HandleJnezImm8, V) \ 428 APPEND_JIT_SUFFIX_IMM16(HandleJnezImm16, V) \ 429 APPEND_JIT_SUFFIX(HandleJnezImm32, V) \ 430 APPEND_JIT_SUFFIX(HandleReturn, V) \ 431 APPEND_JIT_SUFFIX(HandleReturnundefined, V) \ 432 APPEND_JIT_SUFFIX(HandleSuspendgeneratorV8, V) \ 433 APPEND_JIT_SUFFIX(HandleAsyncgeneratorresolveV8V8V8, V) 434 435#define APPEND_SUFFIX(name, V) \ 436 V(name##WithProf, name, SlotIDFormat::IMM8) 437 438#define APPEND_SUFFIX_IMM8_SECONDBC(name, V) \ 439 V(name##WithProf, name, SlotIDFormat::PREF_IMM8) 440 441#define APPEND_SUFFIX_IMM16(name, V) \ 442 V(name##WithProf, name, SlotIDFormat::IMM16) 443 444#define ASM_INTERPRETER_BC_PROFILER_STUB_LIST(V) \ 445 ASM_INTERPRETER_BC_TYPE_PROFILER_STUB_LIST(V) \ 446 ASM_INTERPRETER_BC_LAYOUT_PROFILER_STUB_LIST(V) \ 447 ASM_INTERPRETER_BC_FUNC_HOT_PROFILER_STUB_LIST(V) \ 448 ASM_INTERPRETER_BC_FUNC_COUNT_PROFILER_STUB_LIST(V) \ 449 450#define ASM_INTERPRETER_BC_TYPE_PROFILER_STUB_LIST(V) \ 451 APPEND_SUFFIX(HandleAdd2Imm8V8, V) \ 452 APPEND_SUFFIX(HandleSub2Imm8V8, V) \ 453 APPEND_SUFFIX(HandleMul2Imm8V8, V) \ 454 APPEND_SUFFIX(HandleDiv2Imm8V8, V) \ 455 APPEND_SUFFIX(HandleMod2Imm8V8, V) \ 456 APPEND_SUFFIX(HandleShl2Imm8V8, V) \ 457 APPEND_SUFFIX(HandleShr2Imm8V8, V) \ 458 APPEND_SUFFIX(HandleAnd2Imm8V8, V) \ 459 APPEND_SUFFIX(HandleOr2Imm8V8, V) \ 460 APPEND_SUFFIX(HandleXor2Imm8V8, V) \ 461 APPEND_SUFFIX(HandleAshr2Imm8V8, V) \ 462 APPEND_SUFFIX(HandleExpImm8V8, V) \ 463 APPEND_SUFFIX(HandleNegImm8, V) \ 464 APPEND_SUFFIX(HandleNotImm8, V) \ 465 APPEND_SUFFIX(HandleEqImm8V8, V) \ 466 APPEND_SUFFIX(HandleIncImm8, V) \ 467 APPEND_SUFFIX(HandleDecImm8, V) \ 468 APPEND_SUFFIX(HandleNoteqImm8V8, V) \ 469 APPEND_SUFFIX(HandleLessImm8V8, V) \ 470 APPEND_SUFFIX(HandleLesseqImm8V8, V) \ 471 APPEND_SUFFIX(HandleGreaterImm8V8, V) \ 472 APPEND_SUFFIX(HandleGreatereqImm8V8, V) \ 473 APPEND_SUFFIX(HandleStrictnoteqImm8V8, V) \ 474 APPEND_SUFFIX(HandleStricteqImm8V8, V) \ 475 APPEND_SUFFIX(HandleTonumericImm8, V) \ 476 APPEND_SUFFIX_IMM8_SECONDBC(HandleCallRuntimeIstruePrefImm8, V) \ 477 APPEND_SUFFIX_IMM8_SECONDBC(HandleCallRuntimeIsfalsePrefImm8, V) \ 478 479#define ASM_INTERPRETER_BC_FUNC_HOT_PROFILER_STUB_LIST(V) \ 480 APPEND_SUFFIX(HandleJmpImm8, V) \ 481 APPEND_SUFFIX_IMM16(HandleJmpImm16, V) \ 482 APPEND_SUFFIX(HandleJmpImm32, V) \ 483 APPEND_SUFFIX(HandleJeqzImm8, V) \ 484 APPEND_SUFFIX_IMM16(HandleJeqzImm16, V) \ 485 APPEND_SUFFIX(HandleJeqzImm32, V) \ 486 APPEND_SUFFIX(HandleJnezImm8, V) \ 487 APPEND_SUFFIX_IMM16(HandleJnezImm16, V) \ 488 APPEND_SUFFIX(HandleJnezImm32, V) \ 489 APPEND_SUFFIX(HandleReturn, V) \ 490 APPEND_SUFFIX(HandleReturnundefined, V) \ 491 APPEND_SUFFIX(HandleSuspendgeneratorV8, V) \ 492 APPEND_SUFFIX(HandleAsyncgeneratorresolveV8V8V8, V) 493 494#define ASM_INTERPRETER_BC_FUNC_COUNT_PROFILER_STUB_LIST(V) \ 495 APPEND_SUFFIX(HandleCallarg0Imm8, V) \ 496 APPEND_SUFFIX(HandleCallarg1Imm8V8, V) \ 497 APPEND_SUFFIX(HandleCallargs2Imm8V8V8, V) \ 498 APPEND_SUFFIX(HandleCallargs3Imm8V8V8V8, V) \ 499 APPEND_SUFFIX(HandleCallrangeImm8Imm8V8, V) \ 500 APPEND_SUFFIX_IMM16(HandleWideCallrangePrefImm16V8, V) \ 501 APPEND_SUFFIX(HandleCallthisrangeImm8Imm8V8, V) \ 502 APPEND_SUFFIX_IMM16(HandleWideCallthisrangePrefImm16V8, V) \ 503 APPEND_SUFFIX(HandleCallthis0Imm8V8, V) \ 504 APPEND_SUFFIX(HandleCallthis1Imm8V8V8, V) \ 505 APPEND_SUFFIX(HandleCallthis2Imm8V8V8V8, V) \ 506 APPEND_SUFFIX(HandleCallthis3Imm8V8V8V8V8, V) \ 507 APPEND_SUFFIX_IMM8_SECONDBC(HandleCallRuntimeCallInitPrefImm8V8, V) \ 508 APPEND_SUFFIX(HandleNewobjrangeImm8Imm8V8, V) \ 509 APPEND_SUFFIX_IMM16(HandleNewobjrangeImm16Imm8V8, V) \ 510 APPEND_SUFFIX_IMM16(HandleWideNewobjrangePrefImm16V8, V) \ 511 APPEND_SUFFIX(HandleInstanceofImm8V8, V) \ 512 APPEND_SUFFIX(HandleGetiteratorImm8, V) \ 513 APPEND_SUFFIX_IMM16(HandleGetiteratorImm16, V) \ 514 APPEND_SUFFIX(HandleTryldglobalbynameImm8Id16, V) \ 515 APPEND_SUFFIX_IMM16(HandleTryldglobalbynameImm16Id16, V) \ 516 APPEND_SUFFIX(HandleTrystglobalbynameImm8Id16, V) \ 517 APPEND_SUFFIX_IMM16(HandleTrystglobalbynameImm16Id16, V) \ 518 APPEND_SUFFIX_IMM16(HandleLdglobalvarImm16Id16, V) 519 520#define ASM_INTERPRETER_BC_LAYOUT_PROFILER_STUB_LIST(V) \ 521 APPEND_SUFFIX(HandleDefineclasswithbufferImm8Id16Id16Imm16V8, V) \ 522 APPEND_SUFFIX_IMM16(HandleDefineclasswithbufferImm16Id16Id16Imm16V8, V) \ 523 APPEND_SUFFIX(HandleDefinefuncImm8Id16Imm8, V) \ 524 APPEND_SUFFIX_IMM16(HandleDefinefuncImm16Id16Imm8, V) \ 525 APPEND_SUFFIX(HandleDefinegettersetterbyvalueV8V8V8V8, V) \ 526 APPEND_SUFFIX(HandleCreateobjectwithbufferImm8Id16, V) \ 527 APPEND_SUFFIX_IMM16(HandleCreateobjectwithbufferImm16Id16, V) \ 528 APPEND_SUFFIX(HandleCreatearraywithbufferImm8Id16, V) \ 529 APPEND_SUFFIX_IMM16(HandleCreatearraywithbufferImm16Id16, V) \ 530 APPEND_SUFFIX(HandleCreateemptyobject, V) \ 531 APPEND_SUFFIX(HandleCreateemptyarrayImm8, V) \ 532 APPEND_SUFFIX_IMM16(HandleCreateemptyarrayImm16, V) \ 533 APPEND_SUFFIX(HandleLdobjbynameImm8Id16, V) \ 534 APPEND_SUFFIX_IMM16(HandleLdobjbynameImm16Id16, V) \ 535 APPEND_SUFFIX_IMM16(HandleLdthisbynameImm16Id16, V) \ 536 APPEND_SUFFIX(HandleLdthisbynameImm8Id16, V) \ 537 APPEND_SUFFIX(HandleStthisbynameImm8Id16, V) \ 538 APPEND_SUFFIX_IMM16(HandleStthisbynameImm16Id16, V) \ 539 APPEND_SUFFIX(HandleStthisbyvalueImm8V8, V) \ 540 APPEND_SUFFIX_IMM16(HandleStthisbyvalueImm16V8, V) \ 541 APPEND_SUFFIX_IMM16(HandleStobjbyvalueImm16V8V8, V) \ 542 APPEND_SUFFIX(HandleStobjbynameImm8Id16V8, V) \ 543 APPEND_SUFFIX_IMM16(HandleStobjbynameImm16Id16V8, V) \ 544 APPEND_SUFFIX(HandleDefineFieldByNameImm8Id16V8, V) \ 545 APPEND_SUFFIX(HandleDefinePropertyByNameImm8Id16V8, V) \ 546 APPEND_SUFFIX(HandleLdPrivatePropertyImm8Imm16Imm16, V) \ 547 APPEND_SUFFIX(HandleStPrivatePropertyImm8Imm16Imm16V8, V) \ 548 APPEND_SUFFIX(HandleStobjbyvalueImm8V8V8, V) \ 549 APPEND_SUFFIX(HandleStobjbyindexImm8V8Imm16, V) \ 550 APPEND_SUFFIX_IMM16(HandleStobjbyindexImm16V8Imm16, V) \ 551 APPEND_SUFFIX(HandleLdobjbyvalueImm8V8, V) \ 552 APPEND_SUFFIX_IMM16(HandleLdobjbyvalueImm16V8, V) \ 553 APPEND_SUFFIX_IMM16(HandleLdthisbyvalueImm16, V) \ 554 APPEND_SUFFIX(HandleLdthisbyvalueImm8, V) \ 555 APPEND_SUFFIX(HandleLdobjbyindexImm8Imm16, V) \ 556 APPEND_SUFFIX_IMM16(HandleLdobjbyindexImm16Imm16, V) \ 557 APPEND_SUFFIX(HandleWideLdobjbyindexPrefImm32, V) \ 558 APPEND_SUFFIX(HandleWideStobjbyindexPrefV8Imm32, V) \ 559 APPEND_SUFFIX_IMM16(HandleStownbyindexImm16V8Imm16, V) \ 560 APPEND_SUFFIX(HandleStownbyindexImm8V8Imm16, V) \ 561 APPEND_SUFFIX(HandleWideStownbyindexPrefV8Imm32, V) \ 562 APPEND_SUFFIX_IMM16(HandleStownbyvaluewithnamesetImm16V8V8, V) \ 563 APPEND_SUFFIX(HandleStownbyvaluewithnamesetImm8V8V8, V) \ 564 APPEND_SUFFIX(HandleStownbyvalueImm8V8V8, V) \ 565 APPEND_SUFFIX_IMM16(HandleStownbyvalueImm16V8V8, V) \ 566 APPEND_SUFFIX_IMM16(HandleStownbynamewithnamesetImm16Id16V8, V) \ 567 APPEND_SUFFIX(HandleStownbynamewithnamesetImm8Id16V8, V) \ 568 APPEND_SUFFIX_IMM16(HandleStownbynameImm16Id16V8, V) \ 569 APPEND_SUFFIX(HandleStownbynameImm8Id16V8, V) 570 571#define INTERPRETER_DISABLE_SINGLE_STEP_DEBUGGING_BC_STUB_LIST(V) \ 572 ASM_INTERPRETER_BC_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V) \ 573 ASM_INTERPRETER_DEPRECATED_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V) \ 574 ASM_INTERPRETER_WIDE_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V) \ 575 ASM_INTERPRETER_THROW_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V) \ 576 ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(IGNORE_BC_STUB, IGNORE_BC_STUB, V) 577 578#define INTERPRETER_BC_STUB_LIST(V) \ 579 ASM_INTERPRETER_BC_STUB_LIST(IGNORE_BC_STUB, V, V) \ 580 ASM_INTERPRETER_DEPRECATED_STUB_LIST(IGNORE_BC_STUB, V, V) \ 581 ASM_INTERPRETER_WIDE_STUB_LIST(IGNORE_BC_STUB, V, V) \ 582 ASM_INTERPRETER_THROW_STUB_LIST(IGNORE_BC_STUB, V, V) \ 583 ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(IGNORE_BC_STUB, V, V) 584 585#define ASM_INTERPRETER_BC_STUB_ID_LIST(V) \ 586 ASM_INTERPRETER_BC_STUB_LIST(V, V, V) 587 588#define ASM_INTERPRETER_SECOND_BC_STUB_ID_LIST(V) \ 589 ASM_INTERPRETER_WIDE_STUB_LIST(V, V, V) \ 590 ASM_INTERPRETER_THROW_STUB_LIST(V, V, V) \ 591 ASM_INTERPRETER_DEPRECATED_STUB_LIST(V, V, V) \ 592 ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(V, V, V) 593 594class BytecodeStubCSigns { 595public: 596 // is uint8 max 597 static constexpr size_t LAST_VALID_OPCODE = 0xFF; 598 // all valid stub, include normal and helper stub 599 enum ValidID { 600#define DEF_VALID_BC_STUB_ID(name) name, 601 INTERPRETER_BC_STUB_LIST(DEF_VALID_BC_STUB_ID) 602 ASM_INTERPRETER_BC_HELPER_STUB_LIST(DEF_VALID_BC_STUB_ID) 603#undef DEF_VALID_BC_STUB_ID 604#define DEF_VALID_BC_STUB_ID(name, ...) name, 605 ASM_INTERPRETER_BC_PROFILER_STUB_LIST(DEF_VALID_BC_STUB_ID) 606#undef DEF_VALID_BC_STUB_ID 607#define DEF_VALID_BC_STUB_ID(name, ...) name, 608 ASM_INTERPRETER_BC_JIT_PROFILER_STUB_LIST(DEF_VALID_BC_STUB_ID) 609#undef DEF_VALID_BC_STUB_ID 610 NUM_OF_VALID_STUBS 611 }; 612 613#define DEF_BC_STUB_ID(name) PREF_ID_##name, 614 enum WideID { 615 ASM_INTERPRETER_WIDE_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID) 616 NUM_OF_WIDE_STUBS 617 }; 618 enum ThrowID { 619 ASM_INTERPRETER_THROW_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID) 620 NUM_OF_THROW_STUBS 621 }; 622 enum DeprecatedID { 623 ASM_INTERPRETER_DEPRECATED_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID) 624 NUM_OF_DEPRECATED_STUBS 625 }; 626 enum CallRuntimeID { 627 ASM_INTERPRETER_CALLRUNTIME_STUB_LIST(DEF_BC_STUB_ID, DEF_BC_STUB_ID, DEF_BC_STUB_ID) 628 NUM_OF_CALLRUNTIME_STUBS 629 }; 630#undef DEF_BC_STUB_ID 631 632#define DEF_BC_STUB_ID(name) ID_##name, 633 enum ID { 634 ASM_INTERPRETER_BC_STUB_ID_LIST(DEF_BC_STUB_ID) 635 NUM_OF_ALL_NORMAL_STUBS, 636 lastOpcode = LAST_VALID_OPCODE, // last Opcode is max opcode size 637 ASM_INTERPRETER_SECOND_BC_STUB_ID_LIST(DEF_BC_STUB_ID) 638 ASM_INTERPRETER_BC_HELPER_STUB_LIST(DEF_BC_STUB_ID) 639#undef DEF_BC_STUB_ID 640#define DEF_BC_STUB_ID(name, ...) ID_##name, 641 ASM_INTERPRETER_BC_PROFILER_STUB_LIST(DEF_BC_STUB_ID) 642#undef DEF_BC_STUB_ID 643#define DEF_BC_STUB_ID(name, ...) ID_##name, 644 ASM_INTERPRETER_BC_JIT_PROFILER_STUB_LIST(DEF_BC_STUB_ID) 645 NUM_OF_STUBS, 646 ID_Wide_Start = lastOpcode + 1, 647 ID_Throw_Start = ID_Wide_Start + NUM_OF_WIDE_STUBS, 648 ID_Deprecated_Start = ID_Throw_Start + NUM_OF_THROW_STUBS, 649 ID_CallRuntime_Start = ID_Deprecated_Start + NUM_OF_DEPRECATED_STUBS 650 }; 651#undef DEF_BC_STUB_ID 652 653 static void Initialize(); 654 655 static void GetCSigns(std::vector<const CallSignature*>& outCSigns); 656 657 static const CallSignature* Get(size_t index) 658 { 659 ASSERT(index < NUM_OF_VALID_STUBS); 660 return &callSigns_[index]; 661 } 662 663 static const CallSignature* BCDebuggerHandler() 664 { 665 return &bcDebuggerHandlerCSign_; 666 } 667 668 static const CallSignature* BCHandler() 669 { 670 return &bcHandlerCSign_; 671 } 672 673private: 674 static CallSignature callSigns_[NUM_OF_VALID_STUBS]; 675 static CallSignature bcHandlerCSign_; 676 static CallSignature bcDebuggerHandlerCSign_; 677}; 678 679enum class InterpreterHandlerInputs : size_t { 680 GLUE = 0, 681 SP, 682 PC, 683 CONSTPOOL, 684 PROFILE_TYPE_INFO, 685 ACC, 686 HOTNESS_COUNTER, 687 NUM_OF_INPUTS 688}; 689 690enum class CallDispatchInputs : size_t { 691 GLUE = 0, 692 SP, 693 CALL_TARGET, 694 METHOD, 695 CALL_FIELD, 696 ARG0, 697 ARG1, 698 ARG2, 699 ARG3, 700 NUM_OF_INPUTS, 701 702 ARGC = ARG0, 703 ARGV = ARG1, 704}; 705 706#define BYTECODE_STUB_END_ID BytecodeStubCSigns::ID_ExceptionHandler 707#define BCSTUB_ID(name) kungfu::BytecodeStubCSigns::ID_##name 708} // namespace panda::ecmascript::kungfu 709#endif // ECMASCRIPT_COMPILER_BC_CALL_SIGNATURE_H 710