OpCodeUtilAsmJs.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #include "RuntimeByteCodePch.h"
  6. #ifndef TEMP_DISABLE_ASMJS
  7. namespace Js
  8. {
  9. #if DBG_DUMP || ENABLE_DEBUG_CONFIG_OPTIONS
  10. wchar_t const * const OpCodeUtilAsmJs::OpCodeAsmJsNames[] =
  11. {
  12. #define DEF_OP(x, y, ...) L"" STRINGIZEW(x) L"",
  13. #include "OpCodeListAsmJs.h"
  14. #undef DEF_OP
  15. };
  16. wchar_t const * const OpCodeUtilAsmJs::ExtendedOpCodeAsmJsNames[] =
  17. {
  18. #define DEF_OP(x, y, ...) L"" STRINGIZEW(x) L"",
  19. #include "ExtendedOpCodeListAsmJs.h"
  20. #undef DEF_OP
  21. };
  22. wchar_t const * OpCodeUtilAsmJs::GetOpCodeName(OpCodeAsmJs op)
  23. {
  24. if (op <= Js::OpCodeAsmJs::MaxByteSizedOpcodes)
  25. {
  26. Assert(op < _countof(OpCodeAsmJsNames));
  27. __analysis_assume(op < _countof(OpCodeAsmJsNames));
  28. return OpCodeAsmJsNames[(int)op];
  29. }
  30. else if (op < Js::OpCodeAsmJs::ByteCodeLast)
  31. {
  32. uint opIndex = op - (Js::OpCodeAsmJs::MaxByteSizedOpcodes + 1);
  33. Assert(opIndex < _countof(ExtendedOpCodeAsmJsNames));
  34. __analysis_assume(opIndex < _countof(ExtendedOpCodeAsmJsNames));
  35. return ExtendedOpCodeAsmJsNames[opIndex];
  36. }
  37. return L"<NotAvail>";
  38. }
  39. #else
  40. wchar const * OpCodeUtilAsmJs::GetOpCodeName(OpCodeAsmJs op)
  41. {
  42. return L"<NotAvail>";
  43. }
  44. #endif
  45. OpLayoutTypeAsmJs const OpCodeUtilAsmJs::OpCodeAsmJsLayouts[] =
  46. {
  47. #define DEF_OP(x, y, ...) OpLayoutTypeAsmJs::y,
  48. #include "OpCodeListAsmJs.h"
  49. };
  50. OpLayoutTypeAsmJs const OpCodeUtilAsmJs::ExtendedOpCodeAsmJsLayouts[] =
  51. {
  52. #define DEF_OP(x, y, ...) OpLayoutTypeAsmJs::y,
  53. #include "ExtendedOpCodeListAsmJs.h"
  54. };
  55. OpLayoutTypeAsmJs OpCodeUtilAsmJs::GetOpCodeLayout(OpCodeAsmJs op)
  56. {
  57. if ((uint)op <= (uint)Js::OpCodeAsmJs::MaxByteSizedOpcodes)
  58. {
  59. Assert(op < _countof(OpCodeAsmJsLayouts));
  60. __analysis_assume(op < _countof(OpCodeAsmJsLayouts));
  61. return OpCodeAsmJsLayouts[(uint)op];
  62. }
  63. uint opIndex = op - (Js::OpCodeAsmJs::MaxByteSizedOpcodes + 1);
  64. Assert(opIndex < _countof(ExtendedOpCodeAsmJsLayouts));
  65. __analysis_assume(opIndex < _countof(ExtendedOpCodeAsmJsLayouts));
  66. return ExtendedOpCodeAsmJsLayouts[opIndex];
  67. }
  68. bool OpCodeUtilAsmJs::IsValidByteCodeOpcode(OpCodeAsmJs op)
  69. {
  70. CompileAssert((int)Js::OpCodeAsmJs::MaxByteSizedOpcodes + 1 + _countof(OpCodeUtilAsmJs::ExtendedOpCodeAsmJsLayouts) == (int)Js::OpCodeAsmJs::ByteCodeLast);
  71. return op < _countof(OpCodeAsmJsLayouts)
  72. || (op > Js::OpCodeAsmJs::MaxByteSizedOpcodes && op < Js::OpCodeAsmJs::ByteCodeLast);
  73. }
  74. bool OpCodeUtilAsmJs::IsValidOpcode(OpCodeAsmJs op)
  75. {
  76. return IsValidByteCodeOpcode(op)
  77. || (op > Js::OpCodeAsmJs::ByteCodeLast && op < Js::OpCodeAsmJs::Count);
  78. }
  79. };
  80. #endif