AsmJsByteCodeWriter.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. #ifndef TEMP_DISABLE_ASMJS
  7. namespace Js
  8. {
  9. struct AsmJsByteCodeWriter : public ByteCodeWriter
  10. {
  11. private:
  12. using ByteCodeWriter::MarkLabel;
  13. public:
  14. void InitData ( ArenaAllocator* alloc, long 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 AsmReg1 ( OpCodeAsmJs op, RegSlot R0 );
  19. void AsmReg2 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1 );
  20. void AsmReg3 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2 );
  21. void AsmReg4 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3 );
  22. void AsmReg5 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4 );
  23. void AsmReg6 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5 );
  24. void AsmReg7 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6 );
  25. void AsmReg2IntConst1( OpCodeAsmJs op, RegSlot R0, RegSlot R1, int C2);
  26. void AsmBr ( ByteCodeLabel labelID, OpCodeAsmJs op = OpCodeAsmJs::AsmBr );
  27. void AsmBrReg1 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1 );
  28. void AsmBrReg2 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, RegSlot R2 );
  29. void AsmStartCall ( OpCodeAsmJs op, ArgSlot ArgCount, bool isPatching = false);
  30. void AsmCall ( OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType );
  31. void AsmSlot ( OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId );
  32. void AsmTypedArr ( OpCodeAsmJs op, RegSlot value, uint32 slotIndex, ArrayBufferView::ViewType viewType );
  33. void AsmSimdTypedArr ( OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType );
  34. void MarkAsmJsLabel ( ByteCodeLabel labelID );
  35. void AsmJsUnsigned1 ( OpCodeAsmJs op, uint C1 );
  36. uint EnterLoop ( ByteCodeLabel loopEntrance );
  37. void ExitLoop ( uint loopId );
  38. private:
  39. template <typename SizePolicy> bool TryWriteAsmReg1 ( OpCodeAsmJs op, RegSlot R0 );
  40. template <typename SizePolicy> bool TryWriteAsmReg2 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1 );
  41. template <typename SizePolicy> bool TryWriteAsmReg3 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2 );
  42. template <typename SizePolicy> bool TryWriteAsmReg4 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3 );
  43. template <typename SizePolicy> bool TryWriteAsmReg5 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4 );
  44. template <typename SizePolicy> bool TryWriteAsmReg6 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5 );
  45. template <typename SizePolicy> bool TryWriteAsmReg7 ( OpCodeAsmJs op, RegSlot R0, RegSlot R1, RegSlot R2, RegSlot R3, RegSlot R4, RegSlot R5, RegSlot R6 );
  46. template <typename SizePolicy> bool TryWriteAsmReg2IntConst1( OpCodeAsmJs op, RegSlot R0, RegSlot R1, int C2 );
  47. template <typename SizePolicy> bool TryWriteInt1Const1 ( OpCodeAsmJs op, RegSlot R0, int C1 );
  48. template <typename SizePolicy> bool TryWriteAsmBrReg1 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1 );
  49. template <typename SizePolicy> bool TryWriteAsmBrReg2 ( OpCodeAsmJs op, ByteCodeLabel labelID, RegSlot R1, RegSlot R2 );
  50. template <typename SizePolicy> bool TryWriteAsmCall ( OpCodeAsmJs op, RegSlot returnValueRegister, RegSlot functionRegister, ArgSlot givenArgCount, AsmJsRetType retType );
  51. template <typename SizePolicy> bool TryWriteAsmSlot ( OpCodeAsmJs op, RegSlot value, RegSlot instance, int32 slotId );
  52. template <typename SizePolicy> bool TryWriteAsmTypedArr ( OpCodeAsmJs op, RegSlot value, uint32 slotIndex, ArrayBufferView::ViewType viewType );
  53. template <typename SizePolicy> bool TryWriteAsmSimdTypedArr ( OpCodeAsmJs op, RegSlot value, uint32 slotIndex, uint8 dataWidth, ArrayBufferView::ViewType viewType );
  54. template <typename SizePolicy> bool TryWriteAsmJsUnsigned1 ( OpCodeAsmJs op, uint C1 );
  55. void AddJumpOffset( Js::OpCodeAsmJs op, ByteCodeLabel labelId, uint fieldByteOffset );
  56. };
  57. }
  58. #endif