| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #pragma once
- #ifndef TEMP_DISABLE_ASMJS
- namespace Js
- {
- ///----------------------------------------------------------------------------
- ///
- /// enum OpCodeAsmJs
- ///
- /// OpCodeAsmJs defines the set of p-code instructions available for byte-code in Asm.Js.
- ///
- ///----------------------------------------------------------------------------
- enum class OpCodeAsmJs : ushort {
- #define DEF_OP(x, y, ...) x,
- #include "OpCodeListAsmJs.h"
- MaxByteSizedOpcodes = 255,
- #include "ExtendedOpCodeListAsmJs.h"
- ByteCodeLast,
- #undef DEF_OP
- Count // Number of operations
- };
- inline OpCodeAsmJs operator+(OpCodeAsmJs o1, OpCodeAsmJs o2) { return (OpCodeAsmJs)((uint)o1 + (uint)o2); }
- inline uint operator+(OpCodeAsmJs o1, uint i) { return ((uint)o1 + i); }
- inline uint operator+(uint i, OpCodeAsmJs &o2) { return (i + (uint)o2); }
- inline OpCodeAsmJs operator++(OpCodeAsmJs &o) { return o = (OpCodeAsmJs)(o + 1U); }
- inline OpCodeAsmJs operator++(OpCodeAsmJs &o, int) { OpCodeAsmJs prev_o = o; o = (OpCodeAsmJs)(o + 1U); return prev_o; }
- inline OpCodeAsmJs operator-(OpCodeAsmJs o1, OpCodeAsmJs o2) { return (OpCodeAsmJs)((uint)o1 - (uint)o2); }
- inline uint operator-(OpCodeAsmJs o1, uint i) { return ((uint)o1 - i); }
- inline uint operator-(uint i, OpCodeAsmJs &o2) { return (i - (uint)o2); }
- inline OpCodeAsmJs operator--(OpCodeAsmJs &o) { return o = (OpCodeAsmJs)(o - 1U); }
- inline OpCodeAsmJs operator--(OpCodeAsmJs &o, int) { return o = (OpCodeAsmJs)(o - 1U); }
- inline uint operator<<(OpCodeAsmJs o1, uint i) { return ((uint)o1 << i); }
- inline OpCodeAsmJs& operator+=(OpCodeAsmJs &o, uint i) { return (o = (OpCodeAsmJs)(o + i)); }
- inline OpCodeAsmJs& operator-=(OpCodeAsmJs &o, uint i) { return (o = (OpCodeAsmJs)(o - i)); }
- inline bool operator==(OpCodeAsmJs &o, uint i) { return ((uint)(o) == i); }
- inline bool operator==(uint i, OpCodeAsmJs &o) { return (i == (uint)(o)); }
- inline bool operator!=(OpCodeAsmJs &o, uint i) { return ((uint)(o) != i); }
- inline bool operator!=(uint i, OpCodeAsmJs &o) { return (i != (uint)(o)); }
- inline bool operator<(OpCodeAsmJs &o, uint i) { return ((uint)(o) < i); }
- inline bool operator<(uint i, OpCodeAsmJs &o) { return (i < (uint)(o)); }
- inline bool operator<=(OpCodeAsmJs &o, uint i) { return ((uint)(o) <= i); }
- inline bool operator<=(uint i, OpCodeAsmJs &o) { return (i <= (uint)(o)); }
- inline bool operator<=(OpCodeAsmJs o1, OpCode o2) { return ((OpCode)o1 <= (o2)); }
- inline bool operator>(OpCodeAsmJs &o, uint i) { return ((uint)(o) > i); }
- inline bool operator>(uint i, OpCodeAsmJs &o) { return (i > (uint)(o)); }
- inline bool operator>=(OpCodeAsmJs &o, uint i) { return ((uint)(o) >= i); }
- inline bool operator>=(uint i, OpCodeAsmJs &o) { return (i >= (uint)(o)); }
- inline bool IsSimd128AsmJsOpcode(OpCodeAsmJs o)
- {
- return (o > Js::OpCodeAsmJs::Simd128_Start && o < Js::OpCodeAsmJs::Simd128_End) || (o > Js::OpCodeAsmJs::Simd128_Start_Extend && o < Js::OpCodeAsmJs::Simd128_End_Extend);
- }
- inline uint Simd128AsmJsOpcodeCount()
- {
- return (uint)(Js::OpCodeAsmJs::Simd128_End - Js::OpCodeAsmJs::Simd128_Start) + 1 + (uint)(Js::OpCodeAsmJs::Simd128_End_Extend - Js::OpCodeAsmJs::Simd128_Start_Extend) + 1;
- }
- ///----------------------------------------------------------------------------
- ///
- /// enum OpLayoutTypeAsmJs
- ///
- /// OpLayoutTypeAsmJs defines a set of layouts available for OpCodes. These layouts
- /// correspond to "OpLayout" structs defined below, such as "OpLayoutReg1".
- ///
- ///----------------------------------------------------------------------------
- BEGIN_ENUM_UINT( OpLayoutTypeAsmJs )
- // This define only one enum for each layout type, but not for each layout variant
- #define LAYOUT_TYPE(x) x,
- #define LAYOUT_TYPE_WMS LAYOUT_TYPE
- #include "LayoutTypesAsmJs.h"
- Count,
- END_ENUM_UINT()
- #pragma pack(push, 1)
- /// Asm.js Layout
- template <typename SizePolicy>
- struct OpLayoutT_AsmTypedArr
- {
- // force encode 4 bytes because it can be a value
- uint32 SlotIndex;
- typename SizePolicy::RegSlotType Value;
- int8 ViewType;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmCall
- {
- typename SizePolicy::ArgSlotType ArgCount;
- typename SizePolicy::RegSlotSType Return;
- typename SizePolicy::RegSlotType Function;
- int8 ReturnType;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmReg1
- {
- typename SizePolicy::RegSlotType R0;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmReg2
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType R1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmReg3
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType R1;
- typename SizePolicy::RegSlotType R2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmReg4
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType R1;
- typename SizePolicy::RegSlotType R2;
- typename SizePolicy::RegSlotType R3;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmReg5
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType R1;
- typename SizePolicy::RegSlotType R2;
- typename SizePolicy::RegSlotType R3;
- typename SizePolicy::RegSlotType R4;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmReg6
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType R1;
- typename SizePolicy::RegSlotType R2;
- typename SizePolicy::RegSlotType R3;
- typename SizePolicy::RegSlotType R4;
- typename SizePolicy::RegSlotType R5;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmReg7
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType R1;
- typename SizePolicy::RegSlotType R2;
- typename SizePolicy::RegSlotType R3;
- typename SizePolicy::RegSlotType R4;
- typename SizePolicy::RegSlotType R5;
- typename SizePolicy::RegSlotType R6;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmReg2IntConst1
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType R1;
- typename int C2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Double1
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType D1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Float1
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType F1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Double1Int1
- {
- typename SizePolicy::RegSlotType D0;
- typename SizePolicy::RegSlotType I1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Double1Float1
- {
- typename SizePolicy::RegSlotType D0;
- typename SizePolicy::RegSlotType F1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Double1Reg1
- {
- typename SizePolicy::RegSlotType D0;
- typename SizePolicy::RegSlotType R1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float1Reg1
- {
- typename SizePolicy::RegSlotType F0;
- typename SizePolicy::RegSlotType R1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Reg1
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType R1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Reg1Double1
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType D1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Reg1Float1
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType F1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Reg1Int1
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType I1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Double2
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType D1;
- typename SizePolicy::RegSlotType D2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Float2
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType F1;
- typename SizePolicy::RegSlotType F2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int2
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType I1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Const1
- {
- typename SizePolicy::RegSlotType I0;
- typename int C1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int3
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType I1;
- typename SizePolicy::RegSlotType I2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Double2
- {
- typename SizePolicy::RegSlotType D0;
- typename SizePolicy::RegSlotType D1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float2
- {
- typename SizePolicy::RegSlotType F0;
- typename SizePolicy::RegSlotType F1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float3
- {
- typename SizePolicy::RegSlotType F0;
- typename SizePolicy::RegSlotType F1;
- typename SizePolicy::RegSlotType F2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float1Double1
- {
- typename SizePolicy::RegSlotType F0;
- typename SizePolicy::RegSlotType D1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float1Int1
- {
- typename SizePolicy::RegSlotType F0;
- typename SizePolicy::RegSlotType I1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Double3
- {
- typename SizePolicy::RegSlotType D0;
- typename SizePolicy::RegSlotType D1;
- typename SizePolicy::RegSlotType D2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmUnsigned1
- {
- typename SizePolicy::UnsignedType C1;
- };
- struct OpLayoutAsmBr
- {
- int32 RelativeJumpOffset;
- };
- template <typename SizePolicy>
- struct OpLayoutT_BrInt1
- {
- int32 RelativeJumpOffset;
- typename SizePolicy::RegSlotType I1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_BrInt2
- {
- int32 RelativeJumpOffset;
- typename SizePolicy::RegSlotType I1;
- typename SizePolicy::RegSlotType I2;
- };
- /* Float32x4 layouts */
- //--------------------
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_2
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType F4_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_3
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType F4_1;
- typename SizePolicy::RegSlotType F4_2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_4
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType F4_1;
- typename SizePolicy::RegSlotType F4_2;
- typename SizePolicy::RegSlotType F4_3;
- };
- // 4 floats -> float32x4.
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_1Float4
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType F1;
- typename SizePolicy::RegSlotType F2;
- typename SizePolicy::RegSlotType F3;
- typename SizePolicy::RegSlotType F4;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_2Int4
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType F4_1;
- typename SizePolicy::RegSlotType I2;
- typename SizePolicy::RegSlotType I3;
- typename SizePolicy::RegSlotType I4;
- typename SizePolicy::RegSlotType I5;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_3Int4
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType F4_1;
- typename SizePolicy::RegSlotType F4_2;
- typename SizePolicy::RegSlotType I3;
- typename SizePolicy::RegSlotType I4;
- typename SizePolicy::RegSlotType I5;
- typename SizePolicy::RegSlotType I6;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_1Float1
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType F1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_2Float1
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType F4_1;
- typename SizePolicy::RegSlotType F2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_1Float64x2_1
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType D2_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_1Int32x4_1
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType I4_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_1Int32x4_1Float32x4_2
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType I4_1;
- typename SizePolicy::RegSlotType F4_2;
- typename SizePolicy::RegSlotType F4_3;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Reg1Float32x4_1
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType F4_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Float32x4_1
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType F4_1;
- };
- /* Int32x4 layouts */
- //--------------------
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_2
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType I4_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_3
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType I4_1;
- typename SizePolicy::RegSlotType I4_2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_4
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType I4_1;
- typename SizePolicy::RegSlotType I4_2;
- typename SizePolicy::RegSlotType I4_3;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_1Int1
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType I1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_1Int4
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType I1;
- typename SizePolicy::RegSlotType I2;
- typename SizePolicy::RegSlotType I3;
- typename SizePolicy::RegSlotType I4;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_2Int4
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType I4_1;
- typename SizePolicy::RegSlotType I2;
- typename SizePolicy::RegSlotType I3;
- typename SizePolicy::RegSlotType I4;
- typename SizePolicy::RegSlotType I5;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_3Int4
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType I4_1;
- typename SizePolicy::RegSlotType I4_2;
- typename SizePolicy::RegSlotType I3;
- typename SizePolicy::RegSlotType I4;
- typename SizePolicy::RegSlotType I5;
- typename SizePolicy::RegSlotType I6;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_2Int1
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType I4_1;
- typename SizePolicy::RegSlotType I2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_2Int2
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType I4_1;
- typename SizePolicy::RegSlotType I2;
- typename SizePolicy::RegSlotType I3;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Int32x4_1Int1
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType I4_1;
- typename SizePolicy::RegSlotType I2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float32x4_2Int1Float1
- {
- typename SizePolicy::RegSlotType F4_0;
- typename SizePolicy::RegSlotType F4_1;
- typename SizePolicy::RegSlotType I2;
- typename SizePolicy::RegSlotType F3;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float1Float32x4_1Int1
- {
- typename SizePolicy::RegSlotType F0;
- typename SizePolicy::RegSlotType F4_1;
- typename SizePolicy::RegSlotType I2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Reg1Int32x4_1
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType I4_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_1Float64x2_1
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType D2_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int32x4_1Float32x4_1
- {
- typename SizePolicy::RegSlotType I4_0;
- typename SizePolicy::RegSlotType F4_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Int32x4_1
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType I4_1;
- };
- /* Float64x2 layouts */
- //--------------------
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_2
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType D2_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_3
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType D2_1;
- typename SizePolicy::RegSlotType D2_2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_4
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType D2_1;
- typename SizePolicy::RegSlotType D2_2;
- typename SizePolicy::RegSlotType D2_3;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_1Double2
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType D1;
- typename SizePolicy::RegSlotType D2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_1Double1
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType D1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_2Double1
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType D2_1;
- typename SizePolicy::RegSlotType D2;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_2Int2
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType D2_1;
- typename SizePolicy::RegSlotType I2;
- typename SizePolicy::RegSlotType I3;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_3Int2
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType D2_1;
- typename SizePolicy::RegSlotType D2_2;
- typename SizePolicy::RegSlotType I3;
- typename SizePolicy::RegSlotType I4;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_1Float32x4_1
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType F4_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_1Int32x4_1
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType I4_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Float64x2_1Int32x4_1Float64x2_2
- {
- typename SizePolicy::RegSlotType D2_0;
- typename SizePolicy::RegSlotType I4_1;
- typename SizePolicy::RegSlotType D2_2;
- typename SizePolicy::RegSlotType D2_3;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Reg1Float64x2_1
- {
- typename SizePolicy::RegSlotType R0;
- typename SizePolicy::RegSlotType D2_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_Int1Float64x2_1
- {
- typename SizePolicy::RegSlotType I0;
- typename SizePolicy::RegSlotType D2_1;
- };
- template <typename SizePolicy>
- struct OpLayoutT_AsmSimdTypedArr
- {
- // force encode 4 bytes because it can be a value
- uint32 SlotIndex;
- typename SizePolicy::RegSlotType Value;
- int8 ViewType;
- int8 DataWidth; // # of bytes to load/store
- };
- // Generate the multi size layout type defs
- #define LAYOUT_TYPE_WMS(layout) \
- typedef OpLayoutT_##layout<LargeLayoutSizePolicy> OpLayout##layout##_Large; \
- typedef OpLayoutT_##layout<MediumLayoutSizePolicy> OpLayout##layout##_Medium; \
- typedef OpLayoutT_##layout<SmallLayoutSizePolicy> OpLayout##layout##_Small;
- #include "LayoutTypesAsmJs.h"
- #pragma pack(pop)
- // Generate structure to automatically map layout to its info
- template <OpLayoutTypeAsmJs::_E layout> struct OpLayoutInfoAsmJs;
- #define LAYOUT_TYPE(layout) \
- CompileAssert(sizeof(OpLayout##layout) <= MaxLayoutSize); \
- template <> struct OpLayoutInfoAsmJs<OpLayoutTypeAsmJs::layout> \
- { \
- static const bool HasMultiSizeLayout = false; \
- };
- #define LAYOUT_TYPE_WMS(layout) \
- CompileAssert(sizeof(OpLayout##layout##_Large) <= MaxLayoutSize); \
- template <> struct OpLayoutInfoAsmJs<OpLayoutTypeAsmJs::layout> \
- { \
- static const bool HasMultiSizeLayout = true; \
- };
- #include "LayoutTypesAsmJs.h"
- // Generate structure to automatically map opcode to its info
- // Also generate assert to make sure the layout and opcode use the same macro with and without multiple size layout
- template <OpCodeAsmJs opcode> struct OpCodeInfoAsmJs;
- #define DEFINE_OPCODEINFO(op, layout, extended) \
- CompileAssert(!OpLayoutInfoAsmJs<OpLayoutTypeAsmJs::layout>::HasMultiSizeLayout); \
- template <> struct OpCodeInfoAsmJs<OpCodeAsmJs::op> \
- { \
- static const OpLayoutTypeAsmJs::_E Layout = OpLayoutTypeAsmJs::layout; \
- static const bool HasMultiSizeLayout = false; \
- static const bool IsExtendedOpcode = extended; \
- typedef OpLayout##layout LayoutType; \
- };
- #define DEFINE_OPCODEINFO_WMS(op, layout, extended) \
- CompileAssert(OpLayoutInfoAsmJs<OpLayoutTypeAsmJs::layout>::HasMultiSizeLayout); \
- template <> struct OpCodeInfoAsmJs<OpCodeAsmJs::op> \
- { \
- static const OpLayoutTypeAsmJs::_E Layout = OpLayoutTypeAsmJs::layout; \
- static const bool HasMultiSizeLayout = true; \
- static const bool IsExtendedOpcode = extended; \
- typedef OpLayout##layout##_Large LayoutType_Large; \
- typedef OpLayout##layout##_Medium LayoutType_Medium; \
- typedef OpLayout##layout##_Small LayoutType_Small; \
- };
- #define MACRO(op, layout, ...) DEFINE_OPCODEINFO(op, layout, false)
- #define MACRO_WMS(op, layout, ...) DEFINE_OPCODEINFO_WMS(op, layout, false)
- #define MACRO_EXTEND(op, layout, ...) DEFINE_OPCODEINFO(op, layout, true)
- #define MACRO_EXTEND_WMS(op, layout, ...) DEFINE_OPCODEINFO_WMS(op, layout, true)
- #include "OpCodesAsmJs.h"
- #undef DEFINE_OPCODEINFO
- #undef DEFINE_OPCODEINFO_WMS
- }
- #endif
|