WebAssemblyMCTargetDesc.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. //==- WebAssemblyMCTargetDesc.h - WebAssembly Target Descriptions -*- C++ -*-=//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. ///
  9. /// \file
  10. /// This file provides WebAssembly-specific target descriptions.
  11. ///
  12. //===----------------------------------------------------------------------===//
  13. #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
  14. #define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
  15. #include "../WebAssemblySubtarget.h"
  16. #include "llvm/BinaryFormat/Wasm.h"
  17. #include "llvm/MC/MCInstrDesc.h"
  18. #include "llvm/Support/DataTypes.h"
  19. #include <memory>
  20. namespace llvm {
  21. class MCAsmBackend;
  22. class MCCodeEmitter;
  23. class MCInstrInfo;
  24. class MCObjectTargetWriter;
  25. class Triple;
  26. MCCodeEmitter *createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII);
  27. MCAsmBackend *createWebAssemblyAsmBackend(const Triple &TT);
  28. std::unique_ptr<MCObjectTargetWriter>
  29. createWebAssemblyWasmObjectWriter(bool Is64Bit, bool IsEmscripten);
  30. namespace WebAssembly {
  31. enum OperandType {
  32. /// Basic block label in a branch construct.
  33. OPERAND_BASIC_BLOCK = MCOI::OPERAND_FIRST_TARGET,
  34. /// Local index.
  35. OPERAND_LOCAL,
  36. /// Global index.
  37. OPERAND_GLOBAL,
  38. /// 32-bit integer immediates.
  39. OPERAND_I32IMM,
  40. /// 64-bit integer immediates.
  41. OPERAND_I64IMM,
  42. /// 32-bit floating-point immediates.
  43. OPERAND_F32IMM,
  44. /// 64-bit floating-point immediates.
  45. OPERAND_F64IMM,
  46. /// 8-bit vector lane immediate
  47. OPERAND_VEC_I8IMM,
  48. /// 16-bit vector lane immediate
  49. OPERAND_VEC_I16IMM,
  50. /// 32-bit vector lane immediate
  51. OPERAND_VEC_I32IMM,
  52. /// 64-bit vector lane immediate
  53. OPERAND_VEC_I64IMM,
  54. /// 32-bit unsigned function indices.
  55. OPERAND_FUNCTION32,
  56. /// 32-bit unsigned memory offsets.
  57. OPERAND_OFFSET32,
  58. /// 64-bit unsigned memory offsets.
  59. OPERAND_OFFSET64,
  60. /// p2align immediate for load and store address alignment.
  61. OPERAND_P2ALIGN,
  62. /// signature immediate for block/loop.
  63. OPERAND_SIGNATURE,
  64. /// type signature immediate for call_indirect.
  65. OPERAND_TYPEINDEX,
  66. /// Tag index.
  67. OPERAND_TAG,
  68. /// A list of branch targets for br_list.
  69. OPERAND_BRLIST,
  70. /// 32-bit unsigned table number.
  71. OPERAND_TABLE,
  72. };
  73. } // end namespace WebAssembly
  74. namespace WebAssemblyII {
  75. /// Target Operand Flag enum.
  76. enum TOF {
  77. MO_NO_FLAG = 0,
  78. // On a symbol operand this indicates that the immediate is a wasm global
  79. // index. The value of the wasm global will be set to the symbol address at
  80. // runtime. This adds a level of indirection similar to the GOT on native
  81. // platforms.
  82. MO_GOT,
  83. // Same as MO_GOT but the address stored in the global is a TLS address.
  84. MO_GOT_TLS,
  85. // On a symbol operand this indicates that the immediate is the symbol
  86. // address relative the __memory_base wasm global.
  87. // Only applicable to data symbols.
  88. MO_MEMORY_BASE_REL,
  89. // On a symbol operand this indicates that the immediate is the symbol
  90. // address relative the __tls_base wasm global.
  91. // Only applicable to data symbols.
  92. MO_TLS_BASE_REL,
  93. // On a symbol operand this indicates that the immediate is the symbol
  94. // address relative the __table_base wasm global.
  95. // Only applicable to function symbols.
  96. MO_TABLE_BASE_REL,
  97. };
  98. } // end namespace WebAssemblyII
  99. } // end namespace llvm
  100. // Defines symbolic names for WebAssembly registers. This defines a mapping from
  101. // register name to register number.
  102. //
  103. #define GET_REGINFO_ENUM
  104. #include "WebAssemblyGenRegisterInfo.inc"
  105. // Defines symbolic names for the WebAssembly instructions.
  106. //
  107. #define GET_INSTRINFO_ENUM
  108. #define GET_INSTRINFO_MC_HELPER_DECLS
  109. #include "WebAssemblyGenInstrInfo.inc"
  110. namespace llvm {
  111. namespace WebAssembly {
  112. /// Instruction opcodes emitted via means other than CodeGen.
  113. static const unsigned Nop = 0x01;
  114. static const unsigned End = 0x0b;
  115. /// Return the default p2align value for a load or store with the given opcode.
  116. inline unsigned GetDefaultP2AlignAny(unsigned Opc) {
  117. switch (Opc) {
  118. #define WASM_LOAD_STORE(NAME) \
  119. case WebAssembly::NAME##_A32: \
  120. case WebAssembly::NAME##_A64: \
  121. case WebAssembly::NAME##_A32_S: \
  122. case WebAssembly::NAME##_A64_S:
  123. WASM_LOAD_STORE(LOAD8_S_I32)
  124. WASM_LOAD_STORE(LOAD8_U_I32)
  125. WASM_LOAD_STORE(LOAD8_S_I64)
  126. WASM_LOAD_STORE(LOAD8_U_I64)
  127. WASM_LOAD_STORE(ATOMIC_LOAD8_U_I32)
  128. WASM_LOAD_STORE(ATOMIC_LOAD8_U_I64)
  129. WASM_LOAD_STORE(STORE8_I32)
  130. WASM_LOAD_STORE(STORE8_I64)
  131. WASM_LOAD_STORE(ATOMIC_STORE8_I32)
  132. WASM_LOAD_STORE(ATOMIC_STORE8_I64)
  133. WASM_LOAD_STORE(ATOMIC_RMW8_U_ADD_I32)
  134. WASM_LOAD_STORE(ATOMIC_RMW8_U_ADD_I64)
  135. WASM_LOAD_STORE(ATOMIC_RMW8_U_SUB_I32)
  136. WASM_LOAD_STORE(ATOMIC_RMW8_U_SUB_I64)
  137. WASM_LOAD_STORE(ATOMIC_RMW8_U_AND_I32)
  138. WASM_LOAD_STORE(ATOMIC_RMW8_U_AND_I64)
  139. WASM_LOAD_STORE(ATOMIC_RMW8_U_OR_I32)
  140. WASM_LOAD_STORE(ATOMIC_RMW8_U_OR_I64)
  141. WASM_LOAD_STORE(ATOMIC_RMW8_U_XOR_I32)
  142. WASM_LOAD_STORE(ATOMIC_RMW8_U_XOR_I64)
  143. WASM_LOAD_STORE(ATOMIC_RMW8_U_XCHG_I32)
  144. WASM_LOAD_STORE(ATOMIC_RMW8_U_XCHG_I64)
  145. WASM_LOAD_STORE(ATOMIC_RMW8_U_CMPXCHG_I32)
  146. WASM_LOAD_STORE(ATOMIC_RMW8_U_CMPXCHG_I64)
  147. WASM_LOAD_STORE(LOAD8_SPLAT)
  148. WASM_LOAD_STORE(LOAD_LANE_I8x16)
  149. WASM_LOAD_STORE(STORE_LANE_I8x16)
  150. return 0;
  151. WASM_LOAD_STORE(LOAD16_S_I32)
  152. WASM_LOAD_STORE(LOAD16_U_I32)
  153. WASM_LOAD_STORE(LOAD16_S_I64)
  154. WASM_LOAD_STORE(LOAD16_U_I64)
  155. WASM_LOAD_STORE(ATOMIC_LOAD16_U_I32)
  156. WASM_LOAD_STORE(ATOMIC_LOAD16_U_I64)
  157. WASM_LOAD_STORE(STORE16_I32)
  158. WASM_LOAD_STORE(STORE16_I64)
  159. WASM_LOAD_STORE(ATOMIC_STORE16_I32)
  160. WASM_LOAD_STORE(ATOMIC_STORE16_I64)
  161. WASM_LOAD_STORE(ATOMIC_RMW16_U_ADD_I32)
  162. WASM_LOAD_STORE(ATOMIC_RMW16_U_ADD_I64)
  163. WASM_LOAD_STORE(ATOMIC_RMW16_U_SUB_I32)
  164. WASM_LOAD_STORE(ATOMIC_RMW16_U_SUB_I64)
  165. WASM_LOAD_STORE(ATOMIC_RMW16_U_AND_I32)
  166. WASM_LOAD_STORE(ATOMIC_RMW16_U_AND_I64)
  167. WASM_LOAD_STORE(ATOMIC_RMW16_U_OR_I32)
  168. WASM_LOAD_STORE(ATOMIC_RMW16_U_OR_I64)
  169. WASM_LOAD_STORE(ATOMIC_RMW16_U_XOR_I32)
  170. WASM_LOAD_STORE(ATOMIC_RMW16_U_XOR_I64)
  171. WASM_LOAD_STORE(ATOMIC_RMW16_U_XCHG_I32)
  172. WASM_LOAD_STORE(ATOMIC_RMW16_U_XCHG_I64)
  173. WASM_LOAD_STORE(ATOMIC_RMW16_U_CMPXCHG_I32)
  174. WASM_LOAD_STORE(ATOMIC_RMW16_U_CMPXCHG_I64)
  175. WASM_LOAD_STORE(LOAD16_SPLAT)
  176. WASM_LOAD_STORE(LOAD_LANE_I16x8)
  177. WASM_LOAD_STORE(STORE_LANE_I16x8)
  178. return 1;
  179. WASM_LOAD_STORE(LOAD_I32)
  180. WASM_LOAD_STORE(LOAD_F32)
  181. WASM_LOAD_STORE(STORE_I32)
  182. WASM_LOAD_STORE(STORE_F32)
  183. WASM_LOAD_STORE(LOAD32_S_I64)
  184. WASM_LOAD_STORE(LOAD32_U_I64)
  185. WASM_LOAD_STORE(STORE32_I64)
  186. WASM_LOAD_STORE(ATOMIC_LOAD_I32)
  187. WASM_LOAD_STORE(ATOMIC_LOAD32_U_I64)
  188. WASM_LOAD_STORE(ATOMIC_STORE_I32)
  189. WASM_LOAD_STORE(ATOMIC_STORE32_I64)
  190. WASM_LOAD_STORE(ATOMIC_RMW_ADD_I32)
  191. WASM_LOAD_STORE(ATOMIC_RMW32_U_ADD_I64)
  192. WASM_LOAD_STORE(ATOMIC_RMW_SUB_I32)
  193. WASM_LOAD_STORE(ATOMIC_RMW32_U_SUB_I64)
  194. WASM_LOAD_STORE(ATOMIC_RMW_AND_I32)
  195. WASM_LOAD_STORE(ATOMIC_RMW32_U_AND_I64)
  196. WASM_LOAD_STORE(ATOMIC_RMW_OR_I32)
  197. WASM_LOAD_STORE(ATOMIC_RMW32_U_OR_I64)
  198. WASM_LOAD_STORE(ATOMIC_RMW_XOR_I32)
  199. WASM_LOAD_STORE(ATOMIC_RMW32_U_XOR_I64)
  200. WASM_LOAD_STORE(ATOMIC_RMW_XCHG_I32)
  201. WASM_LOAD_STORE(ATOMIC_RMW32_U_XCHG_I64)
  202. WASM_LOAD_STORE(ATOMIC_RMW_CMPXCHG_I32)
  203. WASM_LOAD_STORE(ATOMIC_RMW32_U_CMPXCHG_I64)
  204. WASM_LOAD_STORE(MEMORY_ATOMIC_NOTIFY)
  205. WASM_LOAD_STORE(MEMORY_ATOMIC_WAIT32)
  206. WASM_LOAD_STORE(LOAD32_SPLAT)
  207. WASM_LOAD_STORE(LOAD_ZERO_I32x4)
  208. WASM_LOAD_STORE(LOAD_LANE_I32x4)
  209. WASM_LOAD_STORE(STORE_LANE_I32x4)
  210. return 2;
  211. WASM_LOAD_STORE(LOAD_I64)
  212. WASM_LOAD_STORE(LOAD_F64)
  213. WASM_LOAD_STORE(STORE_I64)
  214. WASM_LOAD_STORE(STORE_F64)
  215. WASM_LOAD_STORE(ATOMIC_LOAD_I64)
  216. WASM_LOAD_STORE(ATOMIC_STORE_I64)
  217. WASM_LOAD_STORE(ATOMIC_RMW_ADD_I64)
  218. WASM_LOAD_STORE(ATOMIC_RMW_SUB_I64)
  219. WASM_LOAD_STORE(ATOMIC_RMW_AND_I64)
  220. WASM_LOAD_STORE(ATOMIC_RMW_OR_I64)
  221. WASM_LOAD_STORE(ATOMIC_RMW_XOR_I64)
  222. WASM_LOAD_STORE(ATOMIC_RMW_XCHG_I64)
  223. WASM_LOAD_STORE(ATOMIC_RMW_CMPXCHG_I64)
  224. WASM_LOAD_STORE(MEMORY_ATOMIC_WAIT64)
  225. WASM_LOAD_STORE(LOAD64_SPLAT)
  226. WASM_LOAD_STORE(LOAD_EXTEND_S_I16x8)
  227. WASM_LOAD_STORE(LOAD_EXTEND_U_I16x8)
  228. WASM_LOAD_STORE(LOAD_EXTEND_S_I32x4)
  229. WASM_LOAD_STORE(LOAD_EXTEND_U_I32x4)
  230. WASM_LOAD_STORE(LOAD_EXTEND_S_I64x2)
  231. WASM_LOAD_STORE(LOAD_EXTEND_U_I64x2)
  232. WASM_LOAD_STORE(LOAD_ZERO_I64x2)
  233. WASM_LOAD_STORE(LOAD_LANE_I64x2)
  234. WASM_LOAD_STORE(STORE_LANE_I64x2)
  235. return 3;
  236. WASM_LOAD_STORE(LOAD_V128)
  237. WASM_LOAD_STORE(STORE_V128)
  238. return 4;
  239. default:
  240. return -1;
  241. }
  242. #undef WASM_LOAD_STORE
  243. }
  244. inline unsigned GetDefaultP2Align(unsigned Opc) {
  245. auto Align = GetDefaultP2AlignAny(Opc);
  246. if (Align == -1U) {
  247. llvm_unreachable("Only loads and stores have p2align values");
  248. }
  249. return Align;
  250. }
  251. inline bool isArgument(unsigned Opc) {
  252. switch (Opc) {
  253. case WebAssembly::ARGUMENT_i32:
  254. case WebAssembly::ARGUMENT_i32_S:
  255. case WebAssembly::ARGUMENT_i64:
  256. case WebAssembly::ARGUMENT_i64_S:
  257. case WebAssembly::ARGUMENT_f32:
  258. case WebAssembly::ARGUMENT_f32_S:
  259. case WebAssembly::ARGUMENT_f64:
  260. case WebAssembly::ARGUMENT_f64_S:
  261. case WebAssembly::ARGUMENT_v16i8:
  262. case WebAssembly::ARGUMENT_v16i8_S:
  263. case WebAssembly::ARGUMENT_v8i16:
  264. case WebAssembly::ARGUMENT_v8i16_S:
  265. case WebAssembly::ARGUMENT_v4i32:
  266. case WebAssembly::ARGUMENT_v4i32_S:
  267. case WebAssembly::ARGUMENT_v2i64:
  268. case WebAssembly::ARGUMENT_v2i64_S:
  269. case WebAssembly::ARGUMENT_v4f32:
  270. case WebAssembly::ARGUMENT_v4f32_S:
  271. case WebAssembly::ARGUMENT_v2f64:
  272. case WebAssembly::ARGUMENT_v2f64_S:
  273. case WebAssembly::ARGUMENT_funcref:
  274. case WebAssembly::ARGUMENT_funcref_S:
  275. case WebAssembly::ARGUMENT_externref:
  276. case WebAssembly::ARGUMENT_externref_S:
  277. return true;
  278. default:
  279. return false;
  280. }
  281. }
  282. inline bool isCopy(unsigned Opc) {
  283. switch (Opc) {
  284. case WebAssembly::COPY_I32:
  285. case WebAssembly::COPY_I32_S:
  286. case WebAssembly::COPY_I64:
  287. case WebAssembly::COPY_I64_S:
  288. case WebAssembly::COPY_F32:
  289. case WebAssembly::COPY_F32_S:
  290. case WebAssembly::COPY_F64:
  291. case WebAssembly::COPY_F64_S:
  292. case WebAssembly::COPY_V128:
  293. case WebAssembly::COPY_V128_S:
  294. case WebAssembly::COPY_FUNCREF:
  295. case WebAssembly::COPY_FUNCREF_S:
  296. case WebAssembly::COPY_EXTERNREF:
  297. case WebAssembly::COPY_EXTERNREF_S:
  298. return true;
  299. default:
  300. return false;
  301. }
  302. }
  303. inline bool isTee(unsigned Opc) {
  304. switch (Opc) {
  305. case WebAssembly::TEE_I32:
  306. case WebAssembly::TEE_I32_S:
  307. case WebAssembly::TEE_I64:
  308. case WebAssembly::TEE_I64_S:
  309. case WebAssembly::TEE_F32:
  310. case WebAssembly::TEE_F32_S:
  311. case WebAssembly::TEE_F64:
  312. case WebAssembly::TEE_F64_S:
  313. case WebAssembly::TEE_V128:
  314. case WebAssembly::TEE_V128_S:
  315. case WebAssembly::TEE_FUNCREF:
  316. case WebAssembly::TEE_FUNCREF_S:
  317. case WebAssembly::TEE_EXTERNREF:
  318. case WebAssembly::TEE_EXTERNREF_S:
  319. return true;
  320. default:
  321. return false;
  322. }
  323. }
  324. inline bool isCallDirect(unsigned Opc) {
  325. switch (Opc) {
  326. case WebAssembly::CALL:
  327. case WebAssembly::CALL_S:
  328. case WebAssembly::RET_CALL:
  329. case WebAssembly::RET_CALL_S:
  330. return true;
  331. default:
  332. return false;
  333. }
  334. }
  335. inline bool isCallIndirect(unsigned Opc) {
  336. switch (Opc) {
  337. case WebAssembly::CALL_INDIRECT:
  338. case WebAssembly::CALL_INDIRECT_S:
  339. case WebAssembly::RET_CALL_INDIRECT:
  340. case WebAssembly::RET_CALL_INDIRECT_S:
  341. return true;
  342. default:
  343. return false;
  344. }
  345. }
  346. inline bool isBrTable(const MachineInstr &MI) {
  347. switch (MI.getOpcode()) {
  348. case WebAssembly::BR_TABLE_I32:
  349. case WebAssembly::BR_TABLE_I32_S:
  350. case WebAssembly::BR_TABLE_I64:
  351. case WebAssembly::BR_TABLE_I64_S:
  352. return true;
  353. default:
  354. return false;
  355. }
  356. }
  357. inline bool isMarker(unsigned Opc) {
  358. switch (Opc) {
  359. case WebAssembly::BLOCK:
  360. case WebAssembly::BLOCK_S:
  361. case WebAssembly::END_BLOCK:
  362. case WebAssembly::END_BLOCK_S:
  363. case WebAssembly::LOOP:
  364. case WebAssembly::LOOP_S:
  365. case WebAssembly::END_LOOP:
  366. case WebAssembly::END_LOOP_S:
  367. case WebAssembly::TRY:
  368. case WebAssembly::TRY_S:
  369. case WebAssembly::END_TRY:
  370. case WebAssembly::END_TRY_S:
  371. return true;
  372. default:
  373. return false;
  374. }
  375. }
  376. inline bool isCatch(unsigned Opc) {
  377. switch (Opc) {
  378. case WebAssembly::CATCH:
  379. case WebAssembly::CATCH_S:
  380. case WebAssembly::CATCH_ALL:
  381. case WebAssembly::CATCH_ALL_S:
  382. return true;
  383. default:
  384. return false;
  385. }
  386. }
  387. inline bool isLocalGet(unsigned Opc) {
  388. switch (Opc) {
  389. case WebAssembly::LOCAL_GET_I32:
  390. case WebAssembly::LOCAL_GET_I32_S:
  391. case WebAssembly::LOCAL_GET_I64:
  392. case WebAssembly::LOCAL_GET_I64_S:
  393. case WebAssembly::LOCAL_GET_F32:
  394. case WebAssembly::LOCAL_GET_F32_S:
  395. case WebAssembly::LOCAL_GET_F64:
  396. case WebAssembly::LOCAL_GET_F64_S:
  397. case WebAssembly::LOCAL_GET_V128:
  398. case WebAssembly::LOCAL_GET_V128_S:
  399. case WebAssembly::LOCAL_GET_FUNCREF:
  400. case WebAssembly::LOCAL_GET_FUNCREF_S:
  401. case WebAssembly::LOCAL_GET_EXTERNREF:
  402. case WebAssembly::LOCAL_GET_EXTERNREF_S:
  403. return true;
  404. default:
  405. return false;
  406. }
  407. }
  408. inline bool isLocalSet(unsigned Opc) {
  409. switch (Opc) {
  410. case WebAssembly::LOCAL_SET_I32:
  411. case WebAssembly::LOCAL_SET_I32_S:
  412. case WebAssembly::LOCAL_SET_I64:
  413. case WebAssembly::LOCAL_SET_I64_S:
  414. case WebAssembly::LOCAL_SET_F32:
  415. case WebAssembly::LOCAL_SET_F32_S:
  416. case WebAssembly::LOCAL_SET_F64:
  417. case WebAssembly::LOCAL_SET_F64_S:
  418. case WebAssembly::LOCAL_SET_V128:
  419. case WebAssembly::LOCAL_SET_V128_S:
  420. case WebAssembly::LOCAL_SET_FUNCREF:
  421. case WebAssembly::LOCAL_SET_FUNCREF_S:
  422. case WebAssembly::LOCAL_SET_EXTERNREF:
  423. case WebAssembly::LOCAL_SET_EXTERNREF_S:
  424. return true;
  425. default:
  426. return false;
  427. }
  428. }
  429. inline bool isLocalTee(unsigned Opc) {
  430. switch (Opc) {
  431. case WebAssembly::LOCAL_TEE_I32:
  432. case WebAssembly::LOCAL_TEE_I32_S:
  433. case WebAssembly::LOCAL_TEE_I64:
  434. case WebAssembly::LOCAL_TEE_I64_S:
  435. case WebAssembly::LOCAL_TEE_F32:
  436. case WebAssembly::LOCAL_TEE_F32_S:
  437. case WebAssembly::LOCAL_TEE_F64:
  438. case WebAssembly::LOCAL_TEE_F64_S:
  439. case WebAssembly::LOCAL_TEE_V128:
  440. case WebAssembly::LOCAL_TEE_V128_S:
  441. case WebAssembly::LOCAL_TEE_FUNCREF:
  442. case WebAssembly::LOCAL_TEE_FUNCREF_S:
  443. case WebAssembly::LOCAL_TEE_EXTERNREF:
  444. case WebAssembly::LOCAL_TEE_EXTERNREF_S:
  445. return true;
  446. default:
  447. return false;
  448. }
  449. }
  450. } // end namespace WebAssembly
  451. } // end namespace llvm
  452. #endif