OpCodeUtil.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. #pragma once
  6. namespace Js
  7. {
  8. class OpCodeUtil
  9. {
  10. public:
  11. static char16 const * GetOpCodeName(OpCode op);
  12. static bool IsCallOp(OpCode op);
  13. static bool IsProfiledCallOp(OpCode op);
  14. static bool IsProfiledCallOpWithICIndex(OpCode op);
  15. static bool IsProfiledConstructorCall(OpCode op);
  16. static bool IsProfiledReturnTypeCallOp(OpCode op);
  17. // OpCode conversion functions
  18. static void ConvertOpToNonProfiled(OpCode& op);
  19. static void ConvertNonCallOpToProfiled(OpCode& op);
  20. static void ConvertNonCallOpToProfiledWithICIndex(OpCode& op);
  21. static void ConvertNonCallOpToNonProfiled(OpCode& op);
  22. static void ConvertNonCallOpToNonProfiledWithICIndex(OpCode& op);
  23. static OpCode ConvertProfiledCallOpToNonProfiled(OpCode op);
  24. static OpCode ConvertProfiledReturnTypeCallOpToNonProfiled(OpCode op);
  25. static OpCode ConvertCallOpToProfiled(OpCode op, bool withICIndex = false);
  26. static OpCode ConvertCallOpToProfiledReturnType(OpCode op);
  27. static bool IsValidByteCodeOpcode(OpCode op);
  28. static bool IsValidOpcode(OpCode op);
  29. static bool IsPrefixOpcode(OpCode op);
  30. static bool IsSmallEncodedOpcode(OpCode op)
  31. {
  32. return op <= Js::OpCode::MaxByteSizedOpcodes;
  33. }
  34. static uint EncodedSize(OpCode op, LayoutSize layoutSize)
  35. {
  36. // Simple case, only 1 byte
  37. // Small OpCode with Medium or Large layout: 1 extra byte for the prefix
  38. // Extended OpCode: Prefix + 2 bytes for the opcode
  39. return IsSmallEncodedOpcode(op) ? layoutSize == SmallLayout ? 1 : 2 : 3;
  40. }
  41. static OpLayoutType GetOpCodeLayout(OpCode op);
  42. private:
  43. #if DBG_DUMP || ENABLE_DEBUG_CONFIG_OPTIONS
  44. static char16 const * const OpCodeNames[(int)Js::OpCode::MaxByteSizedOpcodes + 1];
  45. static char16 const * const ExtendedOpCodeNames[];
  46. static char16 const * const BackendOpCodeNames[];
  47. #endif
  48. static OpLayoutType const OpCodeLayouts[];
  49. static OpLayoutType const ExtendedOpCodeLayouts[];
  50. static OpLayoutType const BackendOpCodeLayouts[];
  51. #if DBG
  52. static OpCode DebugConvertProfiledCallToNonProfiled(OpCode op);
  53. static OpCode DebugConvertProfiledReturnTypeCallToNonProfiled(OpCode op);
  54. #endif
  55. };
  56. };