OpCodeUtilAsmJs.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. #ifdef ASMJS_PLAT
  7. namespace Js
  8. {
  9. #if DBG_DUMP || ENABLE_DEBUG_CONFIG_OPTIONS
  10. char16 const * const OpCodeUtilAsmJs::OpCodeAsmJsNames[] =
  11. {
  12. #define DEF_OP(x, y, ...) _u("") STRINGIZEW(x) _u(""),
  13. #include "OpCodeListAsmJs.h"
  14. #undef DEF_OP
  15. };
  16. char16 const * const OpCodeUtilAsmJs::ExtendedOpCodeAsmJsNames[] =
  17. {
  18. #define DEF_OP(x, y, ...) _u("") STRINGIZEW(x) _u(""),
  19. #include "ExtendedOpCodeListAsmJs.h"
  20. #undef DEF_OP
  21. };
  22. char16 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 _u("<NotAvail>");
  38. }
  39. #else
  40. wchar const * OpCodeUtilAsmJs::GetOpCodeName(OpCodeAsmJs op)
  41. {
  42. return _u("<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. // These OpCodes must have the same value for asm.js and normal javascript.
  71. // This CompileAssert will make sure to update both lists if any changes are made
  72. CompileAssert((uint)OpCodeAsmJs::EndOfBlock == (uint)OpCode::EndOfBlock);
  73. CompileAssert((uint)OpCodeAsmJs::ExtendedOpcodePrefix == (uint)OpCode::ExtendedOpcodePrefix);
  74. CompileAssert((uint)OpCodeAsmJs::MediumLayoutPrefix == (uint)OpCode::MediumLayoutPrefix);
  75. CompileAssert((uint)OpCodeAsmJs::ExtendedMediumLayoutPrefix == (uint)OpCode::ExtendedMediumLayoutPrefix);
  76. CompileAssert((uint)OpCodeAsmJs::LargeLayoutPrefix == (uint)OpCode::LargeLayoutPrefix);
  77. CompileAssert((uint)OpCodeAsmJs::ExtendedLargeLayoutPrefix == (uint)OpCode::ExtendedLargeLayoutPrefix);
  78. CompileAssert((uint)OpCodeAsmJs::Nop == (uint)OpCode::Nop);
  79. CompileAssert((uint)OpCodeAsmJs::InvalidOpCode == (uint)OpCode::InvalidOpCode);
  80. CompileAssert((int)Js::OpCodeAsmJs::MaxByteSizedOpcodes + 1 + _countof(OpCodeUtilAsmJs::ExtendedOpCodeAsmJsLayouts) == (int)Js::OpCodeAsmJs::ByteCodeLast);
  81. return op < _countof(OpCodeAsmJsLayouts)
  82. || (op > Js::OpCodeAsmJs::MaxByteSizedOpcodes && op < Js::OpCodeAsmJs::ByteCodeLast);
  83. }
  84. bool OpCodeUtilAsmJs::IsValidOpcode(OpCodeAsmJs op)
  85. {
  86. return IsValidByteCodeOpcode(op)
  87. || (op > Js::OpCodeAsmJs::ByteCodeLast && op < Js::OpCodeAsmJs::Count);
  88. }
  89. void OpCodeUtilAsmJs::ConvertOpToProfiled(OpCodeAsmJs * op)
  90. {
  91. Assert(OpCodeAttrAsmJs::HasProfiledOp(*op));
  92. *op += 1;
  93. Assert(OpCodeAttrAsmJs::IsProfiledOp(*op));
  94. }
  95. };
  96. #endif