brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.6 KiB · 5dc0e3a Raw
623 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// This file provides WebAssembly-specific target descriptions.11///12//===----------------------------------------------------------------------===//13 14#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H15#define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H16 17#include "llvm/BinaryFormat/Wasm.h"18#include "llvm/MC/MCContext.h"19#include "llvm/MC/MCInstrDesc.h"20#include "llvm/Support/CommandLine.h"21#include "llvm/Support/DataTypes.h"22#include <memory>23 24namespace llvm {25 26class MCAsmBackend;27class MCCodeEmitter;28class MCInstrInfo;29class MCObjectTargetWriter;30class Triple;31 32MCCodeEmitter *createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII,33                                              MCContext &Ctx);34 35MCAsmBackend *createWebAssemblyAsmBackend(const Triple &TT);36 37std::unique_ptr<MCObjectTargetWriter>38createWebAssemblyWasmObjectWriter(bool Is64Bit, bool IsEmscripten);39 40namespace WebAssembly {41 42enum OperandType {43  /// Basic block label in a branch construct.44  OPERAND_BASIC_BLOCK = MCOI::OPERAND_FIRST_TARGET,45  /// Local index.46  OPERAND_LOCAL,47  /// Global index.48  OPERAND_GLOBAL,49  /// 32-bit integer immediates.50  OPERAND_I32IMM,51  /// 64-bit integer immediates.52  OPERAND_I64IMM,53  /// 32-bit floating-point immediates.54  OPERAND_F32IMM,55  /// 64-bit floating-point immediates.56  OPERAND_F64IMM,57  /// 8-bit vector lane immediate58  OPERAND_VEC_I8IMM,59  /// 16-bit vector lane immediate60  OPERAND_VEC_I16IMM,61  /// 32-bit vector lane immediate62  OPERAND_VEC_I32IMM,63  /// 64-bit vector lane immediate64  OPERAND_VEC_I64IMM,65  /// 32-bit unsigned function indices.66  OPERAND_FUNCTION32,67  /// 32-bit unsigned memory offsets.68  OPERAND_OFFSET32,69  /// 64-bit unsigned memory offsets.70  OPERAND_OFFSET64,71  /// p2align immediate for load and store address alignment.72  OPERAND_P2ALIGN,73  /// signature immediate for block/loop.74  OPERAND_SIGNATURE,75  /// type signature immediate for call_indirect.76  OPERAND_TYPEINDEX,77  /// Tag index.78  OPERAND_TAG,79  /// A list of branch targets for br_list.80  OPERAND_BRLIST,81  /// 32-bit unsigned table number.82  OPERAND_TABLE,83  /// A list of catch clauses for try_table.84  OPERAND_CATCH_LIST,85};86} // end namespace WebAssembly87 88namespace WebAssemblyII {89 90/// Target Operand Flag enum.91enum TOF {92  MO_NO_FLAG = 0,93 94  // On a symbol operand this indicates that the immediate is a wasm global95  // index.  The value of the wasm global will be set to the symbol address at96  // runtime.  This adds a level of indirection similar to the GOT on native97  // platforms.98  MO_GOT,99 100  // Same as MO_GOT but the address stored in the global is a TLS address.101  MO_GOT_TLS,102 103  // On a symbol operand this indicates that the immediate is the symbol104  // address relative the __memory_base wasm global.105  // Only applicable to data symbols.106  MO_MEMORY_BASE_REL,107 108  // On a symbol operand this indicates that the immediate is the symbol109  // address relative the __tls_base wasm global.110  // Only applicable to data symbols.111  MO_TLS_BASE_REL,112 113  // On a symbol operand this indicates that the immediate is the symbol114  // address relative the __table_base wasm global.115  // Only applicable to function symbols.116  MO_TABLE_BASE_REL,117 118  // On a block signature operand this indicates that this is a destination119  // block of a (catch_ref) clause in try_table.120  MO_CATCH_BLOCK_SIG,121};122 123} // end namespace WebAssemblyII124 125} // end namespace llvm126 127// Defines symbolic names for WebAssembly registers. This defines a mapping from128// register name to register number.129//130#define GET_REGINFO_ENUM131#include "WebAssemblyGenRegisterInfo.inc"132 133// Defines symbolic names for the WebAssembly instructions.134//135#define GET_INSTRINFO_ENUM136#define GET_INSTRINFO_MC_HELPER_DECLS137#include "WebAssemblyGenInstrInfo.inc"138 139namespace llvm {140namespace WebAssembly {141 142/// Instruction opcodes emitted via means other than CodeGen.143static const unsigned Nop = 0x01;144static const unsigned End = 0x0b;145 146/// Return the default p2align value for a load or store with the given opcode.147inline unsigned GetDefaultP2AlignAny(unsigned Opc) {148  switch (Opc) {149#define WASM_LOAD_STORE(NAME) \150  case WebAssembly::NAME##_A32: \151  case WebAssembly::NAME##_A64: \152  case WebAssembly::NAME##_A32_S: \153  case WebAssembly::NAME##_A64_S:154  WASM_LOAD_STORE(LOAD8_S_I32)155  WASM_LOAD_STORE(LOAD8_U_I32)156  WASM_LOAD_STORE(LOAD8_S_I64)157  WASM_LOAD_STORE(LOAD8_U_I64)158  WASM_LOAD_STORE(ATOMIC_LOAD8_U_I32)159  WASM_LOAD_STORE(ATOMIC_LOAD8_U_I64)160  WASM_LOAD_STORE(STORE8_I32)161  WASM_LOAD_STORE(STORE8_I64)162  WASM_LOAD_STORE(ATOMIC_STORE8_I32)163  WASM_LOAD_STORE(ATOMIC_STORE8_I64)164  WASM_LOAD_STORE(ATOMIC_RMW8_U_ADD_I32)165  WASM_LOAD_STORE(ATOMIC_RMW8_U_ADD_I64)166  WASM_LOAD_STORE(ATOMIC_RMW8_U_SUB_I32)167  WASM_LOAD_STORE(ATOMIC_RMW8_U_SUB_I64)168  WASM_LOAD_STORE(ATOMIC_RMW8_U_AND_I32)169  WASM_LOAD_STORE(ATOMIC_RMW8_U_AND_I64)170  WASM_LOAD_STORE(ATOMIC_RMW8_U_OR_I32)171  WASM_LOAD_STORE(ATOMIC_RMW8_U_OR_I64)172  WASM_LOAD_STORE(ATOMIC_RMW8_U_XOR_I32)173  WASM_LOAD_STORE(ATOMIC_RMW8_U_XOR_I64)174  WASM_LOAD_STORE(ATOMIC_RMW8_U_XCHG_I32)175  WASM_LOAD_STORE(ATOMIC_RMW8_U_XCHG_I64)176  WASM_LOAD_STORE(ATOMIC_RMW8_U_CMPXCHG_I32)177  WASM_LOAD_STORE(ATOMIC_RMW8_U_CMPXCHG_I64)178  WASM_LOAD_STORE(LOAD8_SPLAT)179  WASM_LOAD_STORE(LOAD_LANE_8)180  WASM_LOAD_STORE(STORE_LANE_I8x16)181  return 0;182  WASM_LOAD_STORE(LOAD16_S_I32)183  WASM_LOAD_STORE(LOAD16_U_I32)184  WASM_LOAD_STORE(LOAD16_S_I64)185  WASM_LOAD_STORE(LOAD16_U_I64)186  WASM_LOAD_STORE(ATOMIC_LOAD16_U_I32)187  WASM_LOAD_STORE(ATOMIC_LOAD16_U_I64)188  WASM_LOAD_STORE(STORE16_I32)189  WASM_LOAD_STORE(STORE16_I64)190  WASM_LOAD_STORE(ATOMIC_STORE16_I32)191  WASM_LOAD_STORE(ATOMIC_STORE16_I64)192  WASM_LOAD_STORE(ATOMIC_RMW16_U_ADD_I32)193  WASM_LOAD_STORE(ATOMIC_RMW16_U_ADD_I64)194  WASM_LOAD_STORE(ATOMIC_RMW16_U_SUB_I32)195  WASM_LOAD_STORE(ATOMIC_RMW16_U_SUB_I64)196  WASM_LOAD_STORE(ATOMIC_RMW16_U_AND_I32)197  WASM_LOAD_STORE(ATOMIC_RMW16_U_AND_I64)198  WASM_LOAD_STORE(ATOMIC_RMW16_U_OR_I32)199  WASM_LOAD_STORE(ATOMIC_RMW16_U_OR_I64)200  WASM_LOAD_STORE(ATOMIC_RMW16_U_XOR_I32)201  WASM_LOAD_STORE(ATOMIC_RMW16_U_XOR_I64)202  WASM_LOAD_STORE(ATOMIC_RMW16_U_XCHG_I32)203  WASM_LOAD_STORE(ATOMIC_RMW16_U_XCHG_I64)204  WASM_LOAD_STORE(ATOMIC_RMW16_U_CMPXCHG_I32)205  WASM_LOAD_STORE(ATOMIC_RMW16_U_CMPXCHG_I64)206  WASM_LOAD_STORE(LOAD16_SPLAT)207  WASM_LOAD_STORE(LOAD_LANE_16)208  WASM_LOAD_STORE(STORE_LANE_I16x8)209  WASM_LOAD_STORE(LOAD_F16_F32)210  WASM_LOAD_STORE(STORE_F16_F32)211  return 1;212  WASM_LOAD_STORE(LOAD_I32)213  WASM_LOAD_STORE(LOAD_F32)214  WASM_LOAD_STORE(STORE_I32)215  WASM_LOAD_STORE(STORE_F32)216  WASM_LOAD_STORE(LOAD32_S_I64)217  WASM_LOAD_STORE(LOAD32_U_I64)218  WASM_LOAD_STORE(STORE32_I64)219  WASM_LOAD_STORE(ATOMIC_LOAD_I32)220  WASM_LOAD_STORE(ATOMIC_LOAD32_U_I64)221  WASM_LOAD_STORE(ATOMIC_STORE_I32)222  WASM_LOAD_STORE(ATOMIC_STORE32_I64)223  WASM_LOAD_STORE(ATOMIC_RMW_ADD_I32)224  WASM_LOAD_STORE(ATOMIC_RMW32_U_ADD_I64)225  WASM_LOAD_STORE(ATOMIC_RMW_SUB_I32)226  WASM_LOAD_STORE(ATOMIC_RMW32_U_SUB_I64)227  WASM_LOAD_STORE(ATOMIC_RMW_AND_I32)228  WASM_LOAD_STORE(ATOMIC_RMW32_U_AND_I64)229  WASM_LOAD_STORE(ATOMIC_RMW_OR_I32)230  WASM_LOAD_STORE(ATOMIC_RMW32_U_OR_I64)231  WASM_LOAD_STORE(ATOMIC_RMW_XOR_I32)232  WASM_LOAD_STORE(ATOMIC_RMW32_U_XOR_I64)233  WASM_LOAD_STORE(ATOMIC_RMW_XCHG_I32)234  WASM_LOAD_STORE(ATOMIC_RMW32_U_XCHG_I64)235  WASM_LOAD_STORE(ATOMIC_RMW_CMPXCHG_I32)236  WASM_LOAD_STORE(ATOMIC_RMW32_U_CMPXCHG_I64)237  WASM_LOAD_STORE(MEMORY_ATOMIC_NOTIFY)238  WASM_LOAD_STORE(MEMORY_ATOMIC_WAIT32)239  WASM_LOAD_STORE(LOAD32_SPLAT)240  WASM_LOAD_STORE(LOAD_ZERO_32)241  WASM_LOAD_STORE(LOAD_LANE_32)242  WASM_LOAD_STORE(STORE_LANE_I32x4)243  return 2;244  WASM_LOAD_STORE(LOAD_I64)245  WASM_LOAD_STORE(LOAD_F64)246  WASM_LOAD_STORE(STORE_I64)247  WASM_LOAD_STORE(STORE_F64)248  WASM_LOAD_STORE(ATOMIC_LOAD_I64)249  WASM_LOAD_STORE(ATOMIC_STORE_I64)250  WASM_LOAD_STORE(ATOMIC_RMW_ADD_I64)251  WASM_LOAD_STORE(ATOMIC_RMW_SUB_I64)252  WASM_LOAD_STORE(ATOMIC_RMW_AND_I64)253  WASM_LOAD_STORE(ATOMIC_RMW_OR_I64)254  WASM_LOAD_STORE(ATOMIC_RMW_XOR_I64)255  WASM_LOAD_STORE(ATOMIC_RMW_XCHG_I64)256  WASM_LOAD_STORE(ATOMIC_RMW_CMPXCHG_I64)257  WASM_LOAD_STORE(MEMORY_ATOMIC_WAIT64)258  WASM_LOAD_STORE(LOAD64_SPLAT)259  WASM_LOAD_STORE(LOAD_EXTEND_S_I16x8)260  WASM_LOAD_STORE(LOAD_EXTEND_U_I16x8)261  WASM_LOAD_STORE(LOAD_EXTEND_S_I32x4)262  WASM_LOAD_STORE(LOAD_EXTEND_U_I32x4)263  WASM_LOAD_STORE(LOAD_EXTEND_S_I64x2)264  WASM_LOAD_STORE(LOAD_EXTEND_U_I64x2)265  WASM_LOAD_STORE(LOAD_ZERO_64)266  WASM_LOAD_STORE(LOAD_LANE_64)267  WASM_LOAD_STORE(STORE_LANE_I64x2)268  return 3;269  WASM_LOAD_STORE(LOAD_V128)270  WASM_LOAD_STORE(STORE_V128)271    return 4;272  default:273    return -1;274  }275#undef WASM_LOAD_STORE276}277 278inline unsigned GetDefaultP2Align(unsigned Opc) {279  auto Align = GetDefaultP2AlignAny(Opc);280  if (Align == -1U) {281    llvm_unreachable("Only loads and stores have p2align values");282  }283  return Align;284}285 286inline bool isConst(unsigned Opc) {287  switch (Opc) {288  case WebAssembly::CONST_I32:289  case WebAssembly::CONST_I32_S:290  case WebAssembly::CONST_I64:291  case WebAssembly::CONST_I64_S:292  case WebAssembly::CONST_F32:293  case WebAssembly::CONST_F32_S:294  case WebAssembly::CONST_F64:295  case WebAssembly::CONST_F64_S:296  case WebAssembly::CONST_V128_I8x16:297  case WebAssembly::CONST_V128_I8x16_S:298  case WebAssembly::CONST_V128_I16x8:299  case WebAssembly::CONST_V128_I16x8_S:300  case WebAssembly::CONST_V128_I32x4:301  case WebAssembly::CONST_V128_I32x4_S:302  case WebAssembly::CONST_V128_I64x2:303  case WebAssembly::CONST_V128_I64x2_S:304  case WebAssembly::CONST_V128_F32x4:305  case WebAssembly::CONST_V128_F32x4_S:306  case WebAssembly::CONST_V128_F64x2:307  case WebAssembly::CONST_V128_F64x2_S:308    return true;309  default:310    return false;311  }312}313 314inline bool isScalarConst(unsigned Opc) {315  switch (Opc) {316  case WebAssembly::CONST_I32:317  case WebAssembly::CONST_I32_S:318  case WebAssembly::CONST_I64:319  case WebAssembly::CONST_I64_S:320  case WebAssembly::CONST_F32:321  case WebAssembly::CONST_F32_S:322  case WebAssembly::CONST_F64:323  case WebAssembly::CONST_F64_S:324    return true;325  default:326    return false;327  }328}329 330inline bool isArgument(unsigned Opc) {331  switch (Opc) {332  case WebAssembly::ARGUMENT_i32:333  case WebAssembly::ARGUMENT_i32_S:334  case WebAssembly::ARGUMENT_i64:335  case WebAssembly::ARGUMENT_i64_S:336  case WebAssembly::ARGUMENT_f32:337  case WebAssembly::ARGUMENT_f32_S:338  case WebAssembly::ARGUMENT_f64:339  case WebAssembly::ARGUMENT_f64_S:340  case WebAssembly::ARGUMENT_v16i8:341  case WebAssembly::ARGUMENT_v16i8_S:342  case WebAssembly::ARGUMENT_v8i16:343  case WebAssembly::ARGUMENT_v8i16_S:344  case WebAssembly::ARGUMENT_v4i32:345  case WebAssembly::ARGUMENT_v4i32_S:346  case WebAssembly::ARGUMENT_v2i64:347  case WebAssembly::ARGUMENT_v2i64_S:348  case WebAssembly::ARGUMENT_v8f16:349  case WebAssembly::ARGUMENT_v8f16_S:350  case WebAssembly::ARGUMENT_v4f32:351  case WebAssembly::ARGUMENT_v4f32_S:352  case WebAssembly::ARGUMENT_v2f64:353  case WebAssembly::ARGUMENT_v2f64_S:354  case WebAssembly::ARGUMENT_funcref:355  case WebAssembly::ARGUMENT_funcref_S:356  case WebAssembly::ARGUMENT_externref:357  case WebAssembly::ARGUMENT_externref_S:358  case WebAssembly::ARGUMENT_exnref:359  case WebAssembly::ARGUMENT_exnref_S:360    return true;361  default:362    return false;363  }364}365 366inline bool isCopy(unsigned Opc) {367  switch (Opc) {368  case WebAssembly::COPY_I32:369  case WebAssembly::COPY_I32_S:370  case WebAssembly::COPY_I64:371  case WebAssembly::COPY_I64_S:372  case WebAssembly::COPY_F32:373  case WebAssembly::COPY_F32_S:374  case WebAssembly::COPY_F64:375  case WebAssembly::COPY_F64_S:376  case WebAssembly::COPY_V128:377  case WebAssembly::COPY_V128_S:378  case WebAssembly::COPY_FUNCREF:379  case WebAssembly::COPY_FUNCREF_S:380  case WebAssembly::COPY_EXTERNREF:381  case WebAssembly::COPY_EXTERNREF_S:382  case WebAssembly::COPY_EXNREF:383  case WebAssembly::COPY_EXNREF_S:384    return true;385  default:386    return false;387  }388}389 390inline bool isTee(unsigned Opc) {391  switch (Opc) {392  case WebAssembly::TEE_I32:393  case WebAssembly::TEE_I32_S:394  case WebAssembly::TEE_I64:395  case WebAssembly::TEE_I64_S:396  case WebAssembly::TEE_F32:397  case WebAssembly::TEE_F32_S:398  case WebAssembly::TEE_F64:399  case WebAssembly::TEE_F64_S:400  case WebAssembly::TEE_V128:401  case WebAssembly::TEE_V128_S:402  case WebAssembly::TEE_FUNCREF:403  case WebAssembly::TEE_FUNCREF_S:404  case WebAssembly::TEE_EXTERNREF:405  case WebAssembly::TEE_EXTERNREF_S:406  case WebAssembly::TEE_EXNREF:407  case WebAssembly::TEE_EXNREF_S:408    return true;409  default:410    return false;411  }412}413 414inline bool isCallDirect(unsigned Opc) {415  switch (Opc) {416  case WebAssembly::CALL:417  case WebAssembly::CALL_S:418  case WebAssembly::RET_CALL:419  case WebAssembly::RET_CALL_S:420    return true;421  default:422    return false;423  }424}425 426inline bool isCallIndirect(unsigned Opc) {427  switch (Opc) {428  case WebAssembly::CALL_INDIRECT:429  case WebAssembly::CALL_INDIRECT_S:430  case WebAssembly::RET_CALL_INDIRECT:431  case WebAssembly::RET_CALL_INDIRECT_S:432    return true;433  default:434    return false;435  }436}437 438inline bool isBrTable(unsigned Opc) {439  switch (Opc) {440  case WebAssembly::BR_TABLE_I32:441  case WebAssembly::BR_TABLE_I32_S:442  case WebAssembly::BR_TABLE_I64:443  case WebAssembly::BR_TABLE_I64_S:444    return true;445  default:446    return false;447  }448}449 450inline bool isMarker(unsigned Opc) {451  switch (Opc) {452  case WebAssembly::BLOCK:453  case WebAssembly::BLOCK_S:454  case WebAssembly::END_BLOCK:455  case WebAssembly::END_BLOCK_S:456  case WebAssembly::LOOP:457  case WebAssembly::LOOP_S:458  case WebAssembly::END_LOOP:459  case WebAssembly::END_LOOP_S:460  case WebAssembly::TRY:461  case WebAssembly::TRY_S:462  case WebAssembly::END_TRY:463  case WebAssembly::END_TRY_S:464  case WebAssembly::TRY_TABLE:465  case WebAssembly::TRY_TABLE_S:466  case WebAssembly::END_TRY_TABLE:467  case WebAssembly::END_TRY_TABLE_S:468    return true;469  default:470    return false;471  }472}473 474inline bool isEndMarker(unsigned Opc) {475  switch (Opc) {476  case WebAssembly::END_BLOCK:477  case WebAssembly::END_BLOCK_S:478  case WebAssembly::END_LOOP:479  case WebAssembly::END_LOOP_S:480  case WebAssembly::END_TRY:481  case WebAssembly::END_TRY_S:482  case WebAssembly::END_TRY_TABLE:483  case WebAssembly::END_TRY_TABLE_S:484    return true;485  default:486    return false;487  }488}489 490inline bool isTry(unsigned Opc) {491  switch (Opc) {492  case WebAssembly::TRY:493  case WebAssembly::TRY_S:494  case WebAssembly::TRY_TABLE:495  case WebAssembly::TRY_TABLE_S:496    return true;497  default:498    return false;499  }500}501 502inline bool isCatch(unsigned Opc) {503  switch (Opc) {504  case WebAssembly::CATCH_LEGACY:505  case WebAssembly::CATCH_LEGACY_S:506  case WebAssembly::CATCH_ALL_LEGACY:507  case WebAssembly::CATCH_ALL_LEGACY_S:508  case WebAssembly::CATCH:509  case WebAssembly::CATCH_S:510  case WebAssembly::CATCH_REF:511  case WebAssembly::CATCH_REF_S:512  case WebAssembly::CATCH_ALL:513  case WebAssembly::CATCH_ALL_S:514  case WebAssembly::CATCH_ALL_REF:515  case WebAssembly::CATCH_ALL_REF_S:516    return true;517  default:518    return false;519  }520}521 522inline bool isCatchAll(unsigned Opc) {523  switch (Opc) {524  case WebAssembly::CATCH_ALL_LEGACY:525  case WebAssembly::CATCH_ALL_LEGACY_S:526  case WebAssembly::CATCH_ALL:527  case WebAssembly::CATCH_ALL_S:528  case WebAssembly::CATCH_ALL_REF:529  case WebAssembly::CATCH_ALL_REF_S:530    return true;531  default:532    return false;533  }534}535 536inline bool isLocalGet(unsigned Opc) {537  switch (Opc) {538  case WebAssembly::LOCAL_GET_I32:539  case WebAssembly::LOCAL_GET_I32_S:540  case WebAssembly::LOCAL_GET_I64:541  case WebAssembly::LOCAL_GET_I64_S:542  case WebAssembly::LOCAL_GET_F32:543  case WebAssembly::LOCAL_GET_F32_S:544  case WebAssembly::LOCAL_GET_F64:545  case WebAssembly::LOCAL_GET_F64_S:546  case WebAssembly::LOCAL_GET_V128:547  case WebAssembly::LOCAL_GET_V128_S:548  case WebAssembly::LOCAL_GET_FUNCREF:549  case WebAssembly::LOCAL_GET_FUNCREF_S:550  case WebAssembly::LOCAL_GET_EXTERNREF:551  case WebAssembly::LOCAL_GET_EXTERNREF_S:552  case WebAssembly::LOCAL_GET_EXNREF:553  case WebAssembly::LOCAL_GET_EXNREF_S:554    return true;555  default:556    return false;557  }558}559 560inline bool isLocalSet(unsigned Opc) {561  switch (Opc) {562  case WebAssembly::LOCAL_SET_I32:563  case WebAssembly::LOCAL_SET_I32_S:564  case WebAssembly::LOCAL_SET_I64:565  case WebAssembly::LOCAL_SET_I64_S:566  case WebAssembly::LOCAL_SET_F32:567  case WebAssembly::LOCAL_SET_F32_S:568  case WebAssembly::LOCAL_SET_F64:569  case WebAssembly::LOCAL_SET_F64_S:570  case WebAssembly::LOCAL_SET_V128:571  case WebAssembly::LOCAL_SET_V128_S:572  case WebAssembly::LOCAL_SET_FUNCREF:573  case WebAssembly::LOCAL_SET_FUNCREF_S:574  case WebAssembly::LOCAL_SET_EXTERNREF:575  case WebAssembly::LOCAL_SET_EXTERNREF_S:576  case WebAssembly::LOCAL_SET_EXNREF:577  case WebAssembly::LOCAL_SET_EXNREF_S:578    return true;579  default:580    return false;581  }582}583 584inline bool isLocalTee(unsigned Opc) {585  switch (Opc) {586  case WebAssembly::LOCAL_TEE_I32:587  case WebAssembly::LOCAL_TEE_I32_S:588  case WebAssembly::LOCAL_TEE_I64:589  case WebAssembly::LOCAL_TEE_I64_S:590  case WebAssembly::LOCAL_TEE_F32:591  case WebAssembly::LOCAL_TEE_F32_S:592  case WebAssembly::LOCAL_TEE_F64:593  case WebAssembly::LOCAL_TEE_F64_S:594  case WebAssembly::LOCAL_TEE_V128:595  case WebAssembly::LOCAL_TEE_V128_S:596  case WebAssembly::LOCAL_TEE_FUNCREF:597  case WebAssembly::LOCAL_TEE_FUNCREF_S:598  case WebAssembly::LOCAL_TEE_EXTERNREF:599  case WebAssembly::LOCAL_TEE_EXTERNREF_S:600  case WebAssembly::LOCAL_TEE_EXNREF:601  case WebAssembly::LOCAL_TEE_EXNREF_S:602    return true;603  default:604    return false;605  }606}607 608static const unsigned UnusedReg = -1u;609 610// For a given stackified WAReg, return the id number to print with push/pop.611unsigned inline getWARegStackId(MCRegister Reg) {612  assert(Reg.id() & INT32_MIN);613  return Reg.id() & INT32_MAX;614}615 616} // end namespace WebAssembly617} // end namespace llvm618 619#define GET_SUBTARGETINFO_ENUM620#include "WebAssemblyGenSubtargetInfo.inc"621 622#endif623