AsmJsByteCodeWriter.h 8.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft Corporation and contributors. 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. #ifdef ASMJS_PLAT
  7. namespace Js
  8. {
  9. struct AsmJsByteCodeWriter : public ByteCodeWriter
  10. {
  11. private:
  12. using ByteCodeWriter::MarkLabel;
  13. public:
  14. void InitData ( ArenaAllocator* alloc, int32 initCodeBufferSize );
  15. void EmptyAsm ( OpCodeAsmJs op );
  16. void Conv ( OpCodeAsmJs op, RegSlot R0, RegSlot R1 );
  17. void AsmInt1Const1 ( OpCodeAsmJs op, RegSlot R0, int C1 );
  18. void AsmReg1IntConst1( OpCodeAsmJs op, RegSlot R0, int C1 );
  19. void AsmLong1Const1 ( OpCodeAsmJs op, RegSlot R0, int64 C1 );
  20. void AsmFloat1Const1 ( OpCodeAsmJs op, RegSlot R0, float C1 );
  21. void AsmDouble1Const1( OpCodeAsmJs op, RegSlot R0, double C1 );
  22. void AsmReg1 ( OpCodeAsmJs op, RegSlot R0 );
  23. void AsmReg2 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1 );
  24. void AsmReg3 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2 );
  25. void AsmReg4 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3 );
  26. void AsmReg5 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4 );
  27. void AsmReg6 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5 );
  28. void AsmReg7 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6 );
  29. void AsmReg9 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8);
  30. void AsmReg10 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, RegSlot R9);
  31. void AsmReg11 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, RegSlot R9, RegSlot R10);
  32. void AsmReg17 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8,
  33. RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16);
  34. void AsmReg18 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8,
  35. RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16, RegSlot R17);
  36. void AsmReg19 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8,
  37. RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16, RegSlot R17, RegSlot R18);
  38. void AsmBr ( ByteCodeLabel labelID, OpCodeAsmJs op = OpCodeAsmJs::AsmBr );
  39. void AsmBrReg1 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1 );
  40. void AsmBrReg2 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, RegSlot R2 );
  41. void AsmBrReg1Const1 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, int C1 );
  42. void AsmStartCall ( OpCodeAsmJs op, ArgSlot ArgCount, bool isPatching = false);
  43. void AsmCall ( OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType );
  44. void AsmSlot ( OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId );
  45. void AsmTypedArr ( OpCodeAsmJs op, RegSlot value, uint32 slotIndex, ArrayBufferView::ViewType viewType );
  46. void AsmSimdTypedArr ( OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType );
  47. void MarkAsmJsLabel ( ByteCodeLabel labelID );
  48. void AsmJsUnsigned1 ( OpCodeAsmJs op, uint C1 );
  49. uint EnterLoop ( ByteCodeLabel loopEntrance );
  50. void ExitLoop ( uint loopId );
  51. private:
  52. template <typename SizePolicy> bool TryWriteAsmReg1 ( OpCodeAsmJs op, RegSlot R0 );
  53. template <typename SizePolicy> bool TryWriteAsmReg2 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1 );
  54. template <typename SizePolicy> bool TryWriteAsmReg3 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2 );
  55. template <typename SizePolicy> bool TryWriteAsmReg4 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3 );
  56. template <typename SizePolicy> bool TryWriteAsmReg5 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4 );
  57. template <typename SizePolicy> bool TryWriteAsmReg6 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5 );
  58. template <typename SizePolicy> bool TryWriteAsmReg7 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6 );
  59. template <typename SizePolicy> bool TryWriteAsmReg9 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8);
  60. template <typename SizePolicy> bool TryWriteAsmReg10 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8, RegSlot R9);
  61. template <typename SizePolicy> bool TryWriteAsmReg11 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8,
  62. RegSlot R9, RegSlot R10);
  63. template <typename SizePolicy> bool TryWriteAsmReg17 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8,
  64. RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16);
  65. template <typename SizePolicy> bool TryWriteAsmReg18 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8,
  66. RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16, RegSlot R17);
  67. template <typename SizePolicy> bool TryWriteAsmReg19 (OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6, RegSlot R7, RegSlot R8,
  68. RegSlot R9, RegSlot R10, RegSlot R11, RegSlot R12, RegSlot R13, RegSlot R14, RegSlot R15, RegSlot R16, RegSlot R17, RegSlot R18);
  69. template <typename SizePolicy> bool TryWriteInt1Const1 ( OpCodeAsmJs op, RegSlot R0, int C1 );
  70. template <typename SizePolicy> bool TryWriteReg1IntConst1 ( OpCodeAsmJs op, RegSlot R0, int C1 );
  71. template <typename SizePolicy> bool TryWriteLong1Const1 ( OpCodeAsmJs op, RegSlot R0, int64 C1 );
  72. template <typename SizePolicy> bool TryWriteFloat1Const1 ( OpCodeAsmJs op, RegSlot R0, float C1 );
  73. template <typename SizePolicy> bool TryWriteDouble1Const1 ( OpCodeAsmJs op, RegSlot R0, double C1 );
  74. template <typename SizePolicy> bool TryWriteAsmBrReg1 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1 );
  75. template <typename SizePolicy> bool TryWriteAsmBrReg2 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, RegSlot R2 );
  76. template <typename SizePolicy> bool TryWriteAsmBrReg1Const1 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, int C1 );
  77. template <typename SizePolicy> bool TryWriteAsmCall ( OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType );
  78. template <typename SizePolicy> bool TryWriteAsmSlot ( OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId );
  79. template <typename SizePolicy> bool TryWriteAsmTypedArr ( OpCodeAsmJs op, RegSlot value, uint32 slotIndex, ArrayBufferView::ViewType viewType );
  80. template <typename SizePolicy> bool TryWriteAsmSimdTypedArr ( OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType );
  81. template <typename SizePolicy> bool TryWriteAsmJsUnsigned1 ( OpCodeAsmJs op, uint C1 );
  82. void AddJumpOffset( Js::OpCodeAsmJs op, ByteCodeLabel labelId, uint fieldByteOffset );
  83. };
  84. }
  85. #endif