IRBuilderAsmJs.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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 AsmJsRegSlots
  8. {
  9. enum ConstSlots
  10. {
  11. ReturnReg = 0,
  12. ModuleMemReg,
  13. ArrayReg,
  14. WasmMemoryReg,
  15. BufferReg,
  16. LengthReg,
  17. SharedContents,
  18. RefCountedBuffer,
  19. RegCount
  20. };
  21. };
  22. struct JitLoopBodyData
  23. {
  24. private:
  25. BVFixed* m_ldSlots = nullptr;
  26. StackSym* m_loopBodyRetIPSym = nullptr;
  27. BVFixed* m_yieldRegs = nullptr;
  28. uint32 m_loopCurRegs[WAsmJs::LIMIT];
  29. public:
  30. JitLoopBodyData(BVFixed* ldSlots, BVFixed* stSlots, StackSym* loopBodyRetIPSym)
  31. {
  32. Assert(ldSlots && stSlots && loopBodyRetIPSym);
  33. m_ldSlots = ldSlots;
  34. m_loopBodyRetIPSym = loopBodyRetIPSym;
  35. }
  36. // Use m_yieldRegs initialization to determine if m_loopCurRegs is initialized
  37. bool IsLoopCurRegsInitialized() const { return !!m_yieldRegs; }
  38. template<typename T> void InitLoopCurRegs(__in_ecount(WAsmJs::LIMIT) T* curRegs, BVFixed* yieldRegs)
  39. {
  40. Assert(yieldRegs && curRegs);
  41. m_yieldRegs = yieldRegs;
  42. for (WAsmJs::Types type = WAsmJs::Types(0); type != WAsmJs::LIMIT; type = WAsmJs::Types(type + 1))
  43. {
  44. m_loopCurRegs[type] = curRegs[type];
  45. }
  46. }
  47. bool IsRegOutsideOfLoop(uint32 typeReg, WAsmJs::Types type) const
  48. {
  49. Assert(IsLoopCurRegsInitialized());
  50. return typeReg < m_loopCurRegs[type];
  51. }
  52. bool IsYieldReg(Js::RegSlot reg) const
  53. {
  54. if (!m_yieldRegs)
  55. {
  56. return false;
  57. }
  58. AssertOrFailFast(reg < m_yieldRegs->Length());
  59. return m_yieldRegs->Test(reg);
  60. }
  61. void SetRegIsYield(Js::RegSlot reg)
  62. {
  63. Assert(m_yieldRegs);
  64. AssertOrFailFast(reg < m_yieldRegs->Length());
  65. m_yieldRegs->Set(reg);
  66. }
  67. BVFixed* GetLdSlots() const { return m_ldSlots; }
  68. StackSym* GetLoopBodyRetIPSym() const { return m_loopBodyRetIPSym; }
  69. #if DBG
  70. BVFixed* m_usedAsTemp;
  71. #endif
  72. };
  73. class IRBuilderAsmJs
  74. {
  75. friend struct IRBuilderAsmJsSwitchAdapter;
  76. public:
  77. IRBuilderAsmJs(Func * func)
  78. : m_func(func)
  79. , m_switchAdapter(this)
  80. , m_switchBuilder(&m_switchAdapter)
  81. {
  82. if (!m_func->GetJITFunctionBody()->IsWasmFunction())
  83. {
  84. m_statementReader = Anew(func->m_alloc, Js::StatementReader<Js::FunctionBody::ArenaStatementMapList>);
  85. }
  86. func->m_workItem->InitializeReader(&m_jnReader, m_statementReader, func->m_alloc);
  87. m_asmFuncInfo = m_func->GetJITFunctionBody()->GetAsmJsInfo();
  88. #if 0
  89. // templatized JIT loop body
  90. if (func->IsLoopBody())
  91. {
  92. Js::LoopEntryPointInfo* loopEntryPointInfo = (Js::LoopEntryPointInfo*)(func->m_workItem->GetEntryPoint());
  93. if (loopEntryPointInfo->GetIsTJMode())
  94. {
  95. m_IsTJLoopBody = true;
  96. func->isTJLoopBody = true;
  97. }
  98. }
  99. #endif
  100. }
  101. void Build();
  102. private:
  103. struct MemAccessTypeInfo
  104. {
  105. WAsmJs::Types valueRegType;
  106. IRType type;
  107. ValueType arrayType;
  108. };
  109. void LoadNativeCodeData();
  110. void AddInstr(IR::Instr * instr, uint32 offset);
  111. bool IsLoopBody()const;
  112. uint GetLoopBodyExitInstrOffset() const;
  113. IR::SymOpnd * BuildAsmJsLoopBodySlotOpnd(Js::RegSlot regSlot, IRType opndType);
  114. void EnsureLoopBodyAsmJsLoadSlot(Js::RegSlot regSlot, IRType type);
  115. void EnsureLoopBodyAsmJsStoreSlot(Js::RegSlot regSlot, IRType type);
  116. bool IsLoopBodyOuterOffset(uint offset) const;
  117. bool IsLoopBodyReturnIPInstr(IR::Instr * instr) const;
  118. IR::Opnd * InsertLoopBodyReturnIPInstr(uint targetOffset, uint offset);
  119. IR::RegOpnd * BuildDstOpnd(Js::RegSlot dstRegSlot, IRType type);
  120. IR::RegOpnd * BuildSrcOpnd(Js::RegSlot srcRegSlot, IRType type);
  121. IR::RegOpnd * BuildIntConstOpnd(Js::RegSlot regSlot);
  122. SymID BuildSrcStackSymID(Js::RegSlot regSlot, IRType type = IRType::TyVar);
  123. IR::SymOpnd * BuildFieldOpnd(Js::RegSlot reg, Js::PropertyId propertyId, PropertyKind propertyKind, IRType type, bool scale = true);
  124. PropertySym * BuildFieldSym(Js::RegSlot reg, Js::PropertyId propertyId, PropertyKind propertyKind);
  125. uint AddStatementBoundary(uint statementIndex, uint offset);
  126. BranchReloc * AddBranchInstr(IR::BranchInstr *instr, uint32 offset, uint32 targetOffset);
  127. BranchReloc * CreateRelocRecord(IR::BranchInstr * branchInstr, uint32 offset, uint32 targetOffset);
  128. void BuildHeapBufferReload(uint32 offset, bool isFirstLoad = false);
  129. template<typename T, typename ConstOpnd, typename F>
  130. void CreateLoadConstInstrForType(byte* table, Js::RegSlot& regAllocated, uint32 constCount, uint32 offset, IRType irType, ValueType valueType, Js::OpCode opcode, F extraProcess);
  131. void BuildConstantLoads();
  132. void BuildImplicitArgIns();
  133. void InsertLabels();
  134. IR::LabelInstr * CreateLabel(IR::BranchInstr * branchInstr, uint& offset);
  135. uint32 GetTypedRegFromRegSlot(Js::RegSlot reg, WAsmJs::Types type);
  136. Js::RegSlot GetRegSlotFromTypedReg(Js::RegSlot srcReg, WAsmJs::Types type);
  137. Js::RegSlot GetRegSlotFromPtrReg(Js::RegSlot srcReg)
  138. {
  139. #if TARGET_32
  140. return GetRegSlotFromIntReg(srcReg);
  141. #elif TARGET_64
  142. return GetRegSlotFromInt64Reg(srcReg);
  143. #endif
  144. }
  145. Js::RegSlot GetRegSlotFromIntReg(Js::RegSlot srcIntReg) {return GetRegSlotFromTypedReg(srcIntReg, WAsmJs::INT32);}
  146. Js::RegSlot GetRegSlotFromInt64Reg(Js::RegSlot srcIntReg) {return GetRegSlotFromTypedReg(srcIntReg, WAsmJs::INT64);}
  147. Js::RegSlot GetRegSlotFromFloatReg(Js::RegSlot srcFloatReg) {return GetRegSlotFromTypedReg(srcFloatReg, WAsmJs::FLOAT32);}
  148. Js::RegSlot GetRegSlotFromDoubleReg(Js::RegSlot srcDoubleReg) {return GetRegSlotFromTypedReg(srcDoubleReg, WAsmJs::FLOAT64);}
  149. Js::RegSlot GetRegSlotFromSimd128Reg(Js::RegSlot srcSimd128Reg) {return GetRegSlotFromTypedReg(srcSimd128Reg, WAsmJs::SIMD);}
  150. Js::RegSlot GetRegSlotFromVarReg(Js::RegSlot srcVarReg);
  151. Js::OpCode GetSimdOpcode(Js::OpCodeAsmJs asmjsOpcode);
  152. void GetSimdTypesFromAsmType(Js::AsmJsType::Which asmType, IRType *pIRType, ValueType *pValueType = nullptr);
  153. IR::Instr * AddExtendedArg(IR::RegOpnd *src1, IR::RegOpnd *src2, uint32 offset);
  154. bool RegIsSimd128ReturnVar(Js::RegSlot reg);
  155. SymID GetMappedTemp(Js::RegSlot reg);
  156. void SetMappedTemp(Js::RegSlot reg, SymID tempId);
  157. bool GetTempUsed(Js::RegSlot reg);
  158. void SetTempUsed(Js::RegSlot reg, bool used);
  159. bool RegIsTemp(Js::RegSlot reg);
  160. bool RegIsConstant(Js::RegSlot reg);
  161. bool RegIsVar(Js::RegSlot reg);
  162. bool RegIsTypedVar(Js::RegSlot reg, WAsmJs::Types type);
  163. bool RegIsTypedConst(Js::RegSlot reg, WAsmJs::Types type);
  164. bool RegIsTypedTmp(Js::RegSlot reg, WAsmJs::Types type);
  165. bool RegIs(Js::RegSlot reg, WAsmJs::Types type);
  166. bool RegIsJitLoopYield(Js::RegSlot reg);
  167. void CheckJitLoopReturn(Js::RegSlot reg, IRType type);
  168. void BuildArgOut(IR::Opnd* srcOpnd, uint32 dstRegSlot, uint32 offset, IRType type, ValueType valueType = ValueType::Uninitialized);
  169. void BuildFromVar(uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, IRType irType, ValueType valueType);
  170. #define LAYOUT_TYPE(layout) \
  171. void Build##layout(Js::OpCodeAsmJs newOpcode, uint32 offset);
  172. #define LAYOUT_TYPE_WMS(layout) \
  173. template <typename SizePolicy> void Build##layout(Js::OpCodeAsmJs newOpcode, uint32 offset);
  174. #define EXCLUDE_FRONTEND_LAYOUT
  175. #include "ByteCode/LayoutTypesAsmJs.h"
  176. void BuildSimd_1Ints(Js::OpCodeAsmJs newOpcode, uint32 offset, IRType dstSimdType, Js::RegSlot* srcRegSlots, Js::RegSlot dstRegSlot, uint LANES);
  177. void BuildSimd_1Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, IRType simdType);
  178. void BuildSimd_2Int2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, Js::RegSlot src3RegSlot, IRType simdType, IRType valType = TyInt32);
  179. void BuildSimd_2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, IRType simdType);
  180. void BuildSimd_2Int1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, IRType simdType);
  181. void BuildSimd_3(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, IRType simdType);
  182. void BuildSimd_3(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot, IRType dstSimdType, IRType srcSimdType);
  183. void BuildSimdConversion(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot srcRegSlot, IRType dstSimdType, IRType srcSimdType);
  184. ValueType GetSimdValueTypeFromIRType(IRType type);
  185. void BuildElementSlot(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 slotIndex, Js::RegSlot value, Js::RegSlot instance);
  186. void BuildAsmUnsigned1(Js::OpCodeAsmJs newOpcode, uint offset);
  187. void BuildWasmLoopStart(Js::OpCodeAsmJs newOpcode, uint offset);
  188. void BuildWasmMemAccess(Js::OpCodeAsmJs newOpcode, uint32 offset, uint32 slotIndex, Js::RegSlot value, uint32 constOffset, Js::ArrayBufferView::ViewType viewType);
  189. void BuildAsmTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offset, uint32 slotIndex, Js::RegSlot value, Js::ArrayBufferView::ViewType viewType);
  190. void BuildAsmSimdTypedArr(Js::OpCodeAsmJs newOpcode, uint32 offset, uint32 slotIndex, Js::RegSlot value, Js::ArrayBufferView::ViewType viewType, uint8 DataWidth, uint32 simdOffset);
  191. void BuildAsmCall(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::ArgSlot argCount, Js::RegSlot ret, Js::RegSlot function, int8 returnType, Js::ProfileId profileId);
  192. void BuildAsmReg1(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstReg);
  193. void BuildBrInt1(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 relativeOffset, Js::RegSlot src);
  194. void BuildBrInt2(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 relativeOffset, Js::RegSlot src1, Js::RegSlot src2);
  195. void BuildBrInt1Const1(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 relativeOffset, Js::RegSlot src1, int32 src2);
  196. void BuildBrCmp(Js::OpCodeAsmJs newOpcode, uint32 offset, int32 relativeOffset, IR::RegOpnd* src1Opnd, IR::Opnd* src2Opnd);
  197. void GenerateLoopBodySlotAccesses(uint offset);
  198. static void InitializeMemAccessTypeInfo(Js::ArrayBufferView::ViewType viewType, _Out_ MemAccessTypeInfo * typeInfo);
  199. Js::PropertyId CalculatePropertyOffset(Js::RegSlot regSlot, IRType type);
  200. IR::RegOpnd* BuildTrapIfZero(IR::RegOpnd* srcOpnd, uint32 offset);
  201. IR::RegOpnd* BuildTrapIfMinIntOverNegOne(IR::RegOpnd* src1Opnd, IR::RegOpnd* src2Opnd, uint32 offset);
  202. IR::Instr* CreateSignExtendInstr(IR::Opnd* dst, IR::Opnd* src, IRType fromType);
  203. JitArenaAllocator * m_tempAlloc;
  204. JitArenaAllocator * m_funcAlloc;
  205. Func * m_func;
  206. IR::Instr * m_lastInstr;
  207. IR::Instr ** m_offsetToInstruction;
  208. Js::ByteCodeReader m_jnReader;
  209. Js::StatementReader<Js::FunctionBody::ArenaStatementMapList>* m_statementReader = nullptr;
  210. SListCounted<IR::Instr *> *m_argStack;
  211. SList<IR::Instr *> * m_tempList;
  212. SList<int32> * m_argOffsetStack;
  213. SList<BranchReloc *> * m_branchRelocList;
  214. // 1 for const, 1 for var, 1 for temps for each type and 1 for last
  215. static const uint32 m_firstsTypeCount = WAsmJs::LIMIT * 3 + 1;
  216. Js::RegSlot m_firstsType[m_firstsTypeCount];
  217. Js::RegSlot m_firstVarConst;
  218. Js::RegSlot m_tempCount;
  219. Js::OpCode * m_simdOpcodesMap;
  220. Js::RegSlot GetFirstConst(WAsmJs::Types type) { return m_firstsType[type]; }
  221. Js::RegSlot GetFirstVar(WAsmJs::Types type) { return m_firstsType[type + WAsmJs::LIMIT]; }
  222. Js::RegSlot GetFirstTmp(WAsmJs::Types type) { return m_firstsType[type + WAsmJs::LIMIT * 2]; }
  223. Js::RegSlot GetLastConst(WAsmJs::Types type) { return m_firstsType[type + 1]; }
  224. Js::RegSlot GetLastVar(WAsmJs::Types type) { return m_firstsType[type + WAsmJs::LIMIT + 1]; }
  225. Js::RegSlot GetLastTmp(WAsmJs::Types type) { return m_firstsType[type + WAsmJs::LIMIT * 2 + 1]; }
  226. JitLoopBodyData& GetJitLoopBodyData() { Assert(IsLoopBody()); return *m_jitLoopBodyData; }
  227. const JitLoopBodyData& GetJitLoopBodyData() const { Assert(IsLoopBody()); return *m_jitLoopBodyData; }
  228. SymID * m_tempMap;
  229. BVFixed * m_fbvTempUsed;
  230. uint32 m_functionStartOffset;
  231. const AsmJsJITInfo * m_asmFuncInfo;
  232. JitLoopBodyData* m_jitLoopBodyData = nullptr;
  233. IRBuilderAsmJsSwitchAdapter m_switchAdapter;
  234. SwitchIRBuilder m_switchBuilder;
  235. uint32 m_offsetToInstructionCount;
  236. #define BUILD_LAYOUT_DEF(layout, ...) void Build##layout (Js::OpCodeAsmJs, uint32, __VA_ARGS__);
  237. #define Reg_Type Js::RegSlot
  238. #define Int_Type Js::RegSlot
  239. #define Long_Type Js::RegSlot
  240. #define Float_Type Js::RegSlot
  241. #define Double_Type Js::RegSlot
  242. #define IntConst_Type int
  243. #define LongConst_Type int64
  244. #define FloatConst_Type float
  245. #define DoubleConst_Type double
  246. #define Float32x4_Type Js::RegSlot
  247. #define Bool32x4_Type Js::RegSlot
  248. #define Int32x4_Type Js::RegSlot
  249. #define Float64x2_Type Js::RegSlot
  250. #define Int64x2_Type Js::RegSlot
  251. #define Int16x8_Type Js::RegSlot
  252. #define Bool16x8_Type Js::RegSlot
  253. #define Int8x16_Type Js::RegSlot
  254. #define Bool8x16_Type Js::RegSlot
  255. #define Uint32x4_Type Js::RegSlot
  256. #define Uint16x8_Type Js::RegSlot
  257. #define Uint8x16_Type Js::RegSlot
  258. #define LAYOUT_TYPE_WMS_REG2(layout, t0, t1) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type)
  259. #define LAYOUT_TYPE_WMS_REG3(layout, t0, t1, t2) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type)
  260. #define LAYOUT_TYPE_WMS_REG4(layout, t0, t1, t2, t3) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type)
  261. #define LAYOUT_TYPE_WMS_REG5(layout, t0, t1, t2, t3, t4) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type, t4##_Type)
  262. #define LAYOUT_TYPE_WMS_REG6(layout, t0, t1, t2, t3, t4, t5) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type, t4##_Type, t5##_Type)
  263. #define LAYOUT_TYPE_WMS_REG7(layout, t0, t1, t2, t3, t4, t5, t6) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type, t4##_Type, t5##_Type, t6##_Type)
  264. #define LAYOUT_TYPE_WMS_REG9(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type, t4##_Type, t5##_Type, t6##_Type, t7##_Type, t8##_Type)
  265. #define LAYOUT_TYPE_WMS_REG10(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type, t4##_Type, t5##_Type, t6##_Type, t7##_Type, t8##_Type, t9##_Type)
  266. #define LAYOUT_TYPE_WMS_REG11(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type, t4##_Type, t5##_Type, t6##_Type, t7##_Type, t8##_Type, t9##_Type, t10##_Type)
  267. #define LAYOUT_TYPE_WMS_REG17(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type, t4##_Type, t5##_Type, t6##_Type, t7##_Type, t8##_Type, t9##_Type, t10##_Type, t11##_Type, t12##_Type, t13##_Type, t14##_Type, t15##_Type, t16##_Type)
  268. #define LAYOUT_TYPE_WMS_REG18(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type, t4##_Type, t5##_Type, t6##_Type, t7##_Type, t8##_Type, t9##_Type, t10##_Type, t11##_Type, t12##_Type, t13##_Type, t14##_Type, t15##_Type, t16##_Type, t17##_Type)
  269. #define LAYOUT_TYPE_WMS_REG19(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18) BUILD_LAYOUT_DEF(layout, t0##_Type, t1##_Type, t2##_Type, t3##_Type, t4##_Type, t5##_Type, t6##_Type, t7##_Type, t8##_Type, t9##_Type, t10##_Type, t11##_Type, t12##_Type, t13##_Type, t14##_Type, t15##_Type, t16##_Type, t17##_Type, t18##_Type)
  270. #define EXCLUDE_FRONTEND_LAYOUT
  271. #include "LayoutTypesAsmJs.h"
  272. #undef BUILD_LAYOUT_DEF
  273. #undef RegType
  274. #undef IntType
  275. #undef LongType
  276. #undef FloatType
  277. #undef DoubleType
  278. #undef IntConstType
  279. #undef LongConstType
  280. #undef FloatConstType
  281. #undef DoubleConstType
  282. #undef Float32x4Type
  283. #undef Bool32x4Type
  284. #undef Int32x4Type
  285. #undef Float64x2Type
  286. #undef Int16x8Type
  287. #undef Bool16x8Type
  288. #undef Int8x16Type
  289. #undef Bool8x16Type
  290. #undef Uint32x4Type
  291. #undef Uint16x8Type
  292. #undef Uint8x16Type
  293. };
  294. #endif