Path: blob/main/contrib/llvm-project/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h
35294 views
//==- WebAssemblyMCTargetDesc.h - WebAssembly Target Descriptions -*- C++ -*-=//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7///8/// \file9/// This file provides WebAssembly-specific target descriptions.10///11//===----------------------------------------------------------------------===//1213#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H14#define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H1516#include "llvm/BinaryFormat/Wasm.h"17#include "llvm/MC/MCContext.h"18#include "llvm/MC/MCInstrDesc.h"19#include "llvm/Support/CommandLine.h"20#include "llvm/Support/DataTypes.h"21#include <memory>2223namespace llvm {2425class MCAsmBackend;26class MCCodeEmitter;27class MCInstrInfo;28class MCObjectTargetWriter;29class Triple;3031MCCodeEmitter *createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII,32MCContext &Ctx);3334MCAsmBackend *createWebAssemblyAsmBackend(const Triple &TT);3536std::unique_ptr<MCObjectTargetWriter>37createWebAssemblyWasmObjectWriter(bool Is64Bit, bool IsEmscripten);3839namespace WebAssembly {4041// Exception handling / setjmp-longjmp handling command-line options42extern cl::opt<bool> WasmEnableEmEH; // asm.js-style EH43extern cl::opt<bool> WasmEnableEmSjLj; // asm.js-style SjLJ44extern cl::opt<bool> WasmEnableEH; // EH using Wasm EH instructions45extern cl::opt<bool> WasmEnableSjLj; // SjLj using Wasm EH instructions46extern cl::opt<bool> WasmEnableExnref; // EH using new Wasm EH (exnref)4748enum OperandType {49/// Basic block label in a branch construct.50OPERAND_BASIC_BLOCK = MCOI::OPERAND_FIRST_TARGET,51/// Local index.52OPERAND_LOCAL,53/// Global index.54OPERAND_GLOBAL,55/// 32-bit integer immediates.56OPERAND_I32IMM,57/// 64-bit integer immediates.58OPERAND_I64IMM,59/// 32-bit floating-point immediates.60OPERAND_F32IMM,61/// 64-bit floating-point immediates.62OPERAND_F64IMM,63/// 8-bit vector lane immediate64OPERAND_VEC_I8IMM,65/// 16-bit vector lane immediate66OPERAND_VEC_I16IMM,67/// 32-bit vector lane immediate68OPERAND_VEC_I32IMM,69/// 64-bit vector lane immediate70OPERAND_VEC_I64IMM,71/// 32-bit unsigned function indices.72OPERAND_FUNCTION32,73/// 32-bit unsigned memory offsets.74OPERAND_OFFSET32,75/// 64-bit unsigned memory offsets.76OPERAND_OFFSET64,77/// p2align immediate for load and store address alignment.78OPERAND_P2ALIGN,79/// signature immediate for block/loop.80OPERAND_SIGNATURE,81/// type signature immediate for call_indirect.82OPERAND_TYPEINDEX,83/// Tag index.84OPERAND_TAG,85/// A list of branch targets for br_list.86OPERAND_BRLIST,87/// 32-bit unsigned table number.88OPERAND_TABLE,89};90} // end namespace WebAssembly9192namespace WebAssemblyII {9394/// Target Operand Flag enum.95enum TOF {96MO_NO_FLAG = 0,9798// On a symbol operand this indicates that the immediate is a wasm global99// index. The value of the wasm global will be set to the symbol address at100// runtime. This adds a level of indirection similar to the GOT on native101// platforms.102MO_GOT,103104// Same as MO_GOT but the address stored in the global is a TLS address.105MO_GOT_TLS,106107// On a symbol operand this indicates that the immediate is the symbol108// address relative the __memory_base wasm global.109// Only applicable to data symbols.110MO_MEMORY_BASE_REL,111112// On a symbol operand this indicates that the immediate is the symbol113// address relative the __tls_base wasm global.114// Only applicable to data symbols.115MO_TLS_BASE_REL,116117// On a symbol operand this indicates that the immediate is the symbol118// address relative the __table_base wasm global.119// Only applicable to function symbols.120MO_TABLE_BASE_REL,121};122123} // end namespace WebAssemblyII124125} // end namespace llvm126127// 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"132133// Defines symbolic names for the WebAssembly instructions.134//135#define GET_INSTRINFO_ENUM136#define GET_INSTRINFO_MC_HELPER_DECLS137#include "WebAssemblyGenInstrInfo.inc"138139namespace llvm {140namespace WebAssembly {141142/// Instruction opcodes emitted via means other than CodeGen.143static const unsigned Nop = 0x01;144static const unsigned End = 0x0b;145146/// Return the default p2align value for a load or store with the given opcode.147inline unsigned GetDefaultP2AlignAny(unsigned Opc) {148switch (Opc) {149#define WASM_LOAD_STORE(NAME) \150case WebAssembly::NAME##_A32: \151case WebAssembly::NAME##_A64: \152case WebAssembly::NAME##_A32_S: \153case WebAssembly::NAME##_A64_S:154WASM_LOAD_STORE(LOAD8_S_I32)155WASM_LOAD_STORE(LOAD8_U_I32)156WASM_LOAD_STORE(LOAD8_S_I64)157WASM_LOAD_STORE(LOAD8_U_I64)158WASM_LOAD_STORE(ATOMIC_LOAD8_U_I32)159WASM_LOAD_STORE(ATOMIC_LOAD8_U_I64)160WASM_LOAD_STORE(STORE8_I32)161WASM_LOAD_STORE(STORE8_I64)162WASM_LOAD_STORE(ATOMIC_STORE8_I32)163WASM_LOAD_STORE(ATOMIC_STORE8_I64)164WASM_LOAD_STORE(ATOMIC_RMW8_U_ADD_I32)165WASM_LOAD_STORE(ATOMIC_RMW8_U_ADD_I64)166WASM_LOAD_STORE(ATOMIC_RMW8_U_SUB_I32)167WASM_LOAD_STORE(ATOMIC_RMW8_U_SUB_I64)168WASM_LOAD_STORE(ATOMIC_RMW8_U_AND_I32)169WASM_LOAD_STORE(ATOMIC_RMW8_U_AND_I64)170WASM_LOAD_STORE(ATOMIC_RMW8_U_OR_I32)171WASM_LOAD_STORE(ATOMIC_RMW8_U_OR_I64)172WASM_LOAD_STORE(ATOMIC_RMW8_U_XOR_I32)173WASM_LOAD_STORE(ATOMIC_RMW8_U_XOR_I64)174WASM_LOAD_STORE(ATOMIC_RMW8_U_XCHG_I32)175WASM_LOAD_STORE(ATOMIC_RMW8_U_XCHG_I64)176WASM_LOAD_STORE(ATOMIC_RMW8_U_CMPXCHG_I32)177WASM_LOAD_STORE(ATOMIC_RMW8_U_CMPXCHG_I64)178WASM_LOAD_STORE(LOAD8_SPLAT)179WASM_LOAD_STORE(LOAD_LANE_I8x16)180WASM_LOAD_STORE(STORE_LANE_I8x16)181return 0;182WASM_LOAD_STORE(LOAD16_S_I32)183WASM_LOAD_STORE(LOAD16_U_I32)184WASM_LOAD_STORE(LOAD16_S_I64)185WASM_LOAD_STORE(LOAD16_U_I64)186WASM_LOAD_STORE(ATOMIC_LOAD16_U_I32)187WASM_LOAD_STORE(ATOMIC_LOAD16_U_I64)188WASM_LOAD_STORE(STORE16_I32)189WASM_LOAD_STORE(STORE16_I64)190WASM_LOAD_STORE(ATOMIC_STORE16_I32)191WASM_LOAD_STORE(ATOMIC_STORE16_I64)192WASM_LOAD_STORE(ATOMIC_RMW16_U_ADD_I32)193WASM_LOAD_STORE(ATOMIC_RMW16_U_ADD_I64)194WASM_LOAD_STORE(ATOMIC_RMW16_U_SUB_I32)195WASM_LOAD_STORE(ATOMIC_RMW16_U_SUB_I64)196WASM_LOAD_STORE(ATOMIC_RMW16_U_AND_I32)197WASM_LOAD_STORE(ATOMIC_RMW16_U_AND_I64)198WASM_LOAD_STORE(ATOMIC_RMW16_U_OR_I32)199WASM_LOAD_STORE(ATOMIC_RMW16_U_OR_I64)200WASM_LOAD_STORE(ATOMIC_RMW16_U_XOR_I32)201WASM_LOAD_STORE(ATOMIC_RMW16_U_XOR_I64)202WASM_LOAD_STORE(ATOMIC_RMW16_U_XCHG_I32)203WASM_LOAD_STORE(ATOMIC_RMW16_U_XCHG_I64)204WASM_LOAD_STORE(ATOMIC_RMW16_U_CMPXCHG_I32)205WASM_LOAD_STORE(ATOMIC_RMW16_U_CMPXCHG_I64)206WASM_LOAD_STORE(LOAD16_SPLAT)207WASM_LOAD_STORE(LOAD_LANE_I16x8)208WASM_LOAD_STORE(STORE_LANE_I16x8)209WASM_LOAD_STORE(LOAD_F16_F32)210WASM_LOAD_STORE(STORE_F16_F32)211return 1;212WASM_LOAD_STORE(LOAD_I32)213WASM_LOAD_STORE(LOAD_F32)214WASM_LOAD_STORE(STORE_I32)215WASM_LOAD_STORE(STORE_F32)216WASM_LOAD_STORE(LOAD32_S_I64)217WASM_LOAD_STORE(LOAD32_U_I64)218WASM_LOAD_STORE(STORE32_I64)219WASM_LOAD_STORE(ATOMIC_LOAD_I32)220WASM_LOAD_STORE(ATOMIC_LOAD32_U_I64)221WASM_LOAD_STORE(ATOMIC_STORE_I32)222WASM_LOAD_STORE(ATOMIC_STORE32_I64)223WASM_LOAD_STORE(ATOMIC_RMW_ADD_I32)224WASM_LOAD_STORE(ATOMIC_RMW32_U_ADD_I64)225WASM_LOAD_STORE(ATOMIC_RMW_SUB_I32)226WASM_LOAD_STORE(ATOMIC_RMW32_U_SUB_I64)227WASM_LOAD_STORE(ATOMIC_RMW_AND_I32)228WASM_LOAD_STORE(ATOMIC_RMW32_U_AND_I64)229WASM_LOAD_STORE(ATOMIC_RMW_OR_I32)230WASM_LOAD_STORE(ATOMIC_RMW32_U_OR_I64)231WASM_LOAD_STORE(ATOMIC_RMW_XOR_I32)232WASM_LOAD_STORE(ATOMIC_RMW32_U_XOR_I64)233WASM_LOAD_STORE(ATOMIC_RMW_XCHG_I32)234WASM_LOAD_STORE(ATOMIC_RMW32_U_XCHG_I64)235WASM_LOAD_STORE(ATOMIC_RMW_CMPXCHG_I32)236WASM_LOAD_STORE(ATOMIC_RMW32_U_CMPXCHG_I64)237WASM_LOAD_STORE(MEMORY_ATOMIC_NOTIFY)238WASM_LOAD_STORE(MEMORY_ATOMIC_WAIT32)239WASM_LOAD_STORE(LOAD32_SPLAT)240WASM_LOAD_STORE(LOAD_ZERO_I32x4)241WASM_LOAD_STORE(LOAD_LANE_I32x4)242WASM_LOAD_STORE(STORE_LANE_I32x4)243return 2;244WASM_LOAD_STORE(LOAD_I64)245WASM_LOAD_STORE(LOAD_F64)246WASM_LOAD_STORE(STORE_I64)247WASM_LOAD_STORE(STORE_F64)248WASM_LOAD_STORE(ATOMIC_LOAD_I64)249WASM_LOAD_STORE(ATOMIC_STORE_I64)250WASM_LOAD_STORE(ATOMIC_RMW_ADD_I64)251WASM_LOAD_STORE(ATOMIC_RMW_SUB_I64)252WASM_LOAD_STORE(ATOMIC_RMW_AND_I64)253WASM_LOAD_STORE(ATOMIC_RMW_OR_I64)254WASM_LOAD_STORE(ATOMIC_RMW_XOR_I64)255WASM_LOAD_STORE(ATOMIC_RMW_XCHG_I64)256WASM_LOAD_STORE(ATOMIC_RMW_CMPXCHG_I64)257WASM_LOAD_STORE(MEMORY_ATOMIC_WAIT64)258WASM_LOAD_STORE(LOAD64_SPLAT)259WASM_LOAD_STORE(LOAD_EXTEND_S_I16x8)260WASM_LOAD_STORE(LOAD_EXTEND_U_I16x8)261WASM_LOAD_STORE(LOAD_EXTEND_S_I32x4)262WASM_LOAD_STORE(LOAD_EXTEND_U_I32x4)263WASM_LOAD_STORE(LOAD_EXTEND_S_I64x2)264WASM_LOAD_STORE(LOAD_EXTEND_U_I64x2)265WASM_LOAD_STORE(LOAD_ZERO_I64x2)266WASM_LOAD_STORE(LOAD_LANE_I64x2)267WASM_LOAD_STORE(STORE_LANE_I64x2)268return 3;269WASM_LOAD_STORE(LOAD_V128)270WASM_LOAD_STORE(STORE_V128)271return 4;272default:273return -1;274}275#undef WASM_LOAD_STORE276}277278inline unsigned GetDefaultP2Align(unsigned Opc) {279auto Align = GetDefaultP2AlignAny(Opc);280if (Align == -1U) {281llvm_unreachable("Only loads and stores have p2align values");282}283return Align;284}285286inline bool isConst(unsigned Opc) {287switch (Opc) {288case WebAssembly::CONST_I32:289case WebAssembly::CONST_I32_S:290case WebAssembly::CONST_I64:291case WebAssembly::CONST_I64_S:292case WebAssembly::CONST_F32:293case WebAssembly::CONST_F32_S:294case WebAssembly::CONST_F64:295case WebAssembly::CONST_F64_S:296case WebAssembly::CONST_V128_I8x16:297case WebAssembly::CONST_V128_I8x16_S:298case WebAssembly::CONST_V128_I16x8:299case WebAssembly::CONST_V128_I16x8_S:300case WebAssembly::CONST_V128_I32x4:301case WebAssembly::CONST_V128_I32x4_S:302case WebAssembly::CONST_V128_I64x2:303case WebAssembly::CONST_V128_I64x2_S:304case WebAssembly::CONST_V128_F32x4:305case WebAssembly::CONST_V128_F32x4_S:306case WebAssembly::CONST_V128_F64x2:307case WebAssembly::CONST_V128_F64x2_S:308return true;309default:310return false;311}312}313314inline bool isScalarConst(unsigned Opc) {315switch (Opc) {316case WebAssembly::CONST_I32:317case WebAssembly::CONST_I32_S:318case WebAssembly::CONST_I64:319case WebAssembly::CONST_I64_S:320case WebAssembly::CONST_F32:321case WebAssembly::CONST_F32_S:322case WebAssembly::CONST_F64:323case WebAssembly::CONST_F64_S:324return true;325default:326return false;327}328}329330inline bool isArgument(unsigned Opc) {331switch (Opc) {332case WebAssembly::ARGUMENT_i32:333case WebAssembly::ARGUMENT_i32_S:334case WebAssembly::ARGUMENT_i64:335case WebAssembly::ARGUMENT_i64_S:336case WebAssembly::ARGUMENT_f32:337case WebAssembly::ARGUMENT_f32_S:338case WebAssembly::ARGUMENT_f64:339case WebAssembly::ARGUMENT_f64_S:340case WebAssembly::ARGUMENT_v16i8:341case WebAssembly::ARGUMENT_v16i8_S:342case WebAssembly::ARGUMENT_v8i16:343case WebAssembly::ARGUMENT_v8i16_S:344case WebAssembly::ARGUMENT_v4i32:345case WebAssembly::ARGUMENT_v4i32_S:346case WebAssembly::ARGUMENT_v2i64:347case WebAssembly::ARGUMENT_v2i64_S:348case WebAssembly::ARGUMENT_v8f16:349case WebAssembly::ARGUMENT_v8f16_S:350case WebAssembly::ARGUMENT_v4f32:351case WebAssembly::ARGUMENT_v4f32_S:352case WebAssembly::ARGUMENT_v2f64:353case WebAssembly::ARGUMENT_v2f64_S:354case WebAssembly::ARGUMENT_funcref:355case WebAssembly::ARGUMENT_funcref_S:356case WebAssembly::ARGUMENT_externref:357case WebAssembly::ARGUMENT_externref_S:358case WebAssembly::ARGUMENT_exnref:359case WebAssembly::ARGUMENT_exnref_S:360return true;361default:362return false;363}364}365366inline bool isCopy(unsigned Opc) {367switch (Opc) {368case WebAssembly::COPY_I32:369case WebAssembly::COPY_I32_S:370case WebAssembly::COPY_I64:371case WebAssembly::COPY_I64_S:372case WebAssembly::COPY_F32:373case WebAssembly::COPY_F32_S:374case WebAssembly::COPY_F64:375case WebAssembly::COPY_F64_S:376case WebAssembly::COPY_V128:377case WebAssembly::COPY_V128_S:378case WebAssembly::COPY_FUNCREF:379case WebAssembly::COPY_FUNCREF_S:380case WebAssembly::COPY_EXTERNREF:381case WebAssembly::COPY_EXTERNREF_S:382case WebAssembly::COPY_EXNREF:383case WebAssembly::COPY_EXNREF_S:384return true;385default:386return false;387}388}389390inline bool isTee(unsigned Opc) {391switch (Opc) {392case WebAssembly::TEE_I32:393case WebAssembly::TEE_I32_S:394case WebAssembly::TEE_I64:395case WebAssembly::TEE_I64_S:396case WebAssembly::TEE_F32:397case WebAssembly::TEE_F32_S:398case WebAssembly::TEE_F64:399case WebAssembly::TEE_F64_S:400case WebAssembly::TEE_V128:401case WebAssembly::TEE_V128_S:402case WebAssembly::TEE_FUNCREF:403case WebAssembly::TEE_FUNCREF_S:404case WebAssembly::TEE_EXTERNREF:405case WebAssembly::TEE_EXTERNREF_S:406case WebAssembly::TEE_EXNREF:407case WebAssembly::TEE_EXNREF_S:408return true;409default:410return false;411}412}413414inline bool isCallDirect(unsigned Opc) {415switch (Opc) {416case WebAssembly::CALL:417case WebAssembly::CALL_S:418case WebAssembly::RET_CALL:419case WebAssembly::RET_CALL_S:420return true;421default:422return false;423}424}425426inline bool isCallIndirect(unsigned Opc) {427switch (Opc) {428case WebAssembly::CALL_INDIRECT:429case WebAssembly::CALL_INDIRECT_S:430case WebAssembly::RET_CALL_INDIRECT:431case WebAssembly::RET_CALL_INDIRECT_S:432return true;433default:434return false;435}436}437438inline bool isBrTable(unsigned Opc) {439switch (Opc) {440case WebAssembly::BR_TABLE_I32:441case WebAssembly::BR_TABLE_I32_S:442case WebAssembly::BR_TABLE_I64:443case WebAssembly::BR_TABLE_I64_S:444return true;445default:446return false;447}448}449450inline bool isMarker(unsigned Opc) {451switch (Opc) {452case WebAssembly::BLOCK:453case WebAssembly::BLOCK_S:454case WebAssembly::END_BLOCK:455case WebAssembly::END_BLOCK_S:456case WebAssembly::LOOP:457case WebAssembly::LOOP_S:458case WebAssembly::END_LOOP:459case WebAssembly::END_LOOP_S:460case WebAssembly::TRY:461case WebAssembly::TRY_S:462case WebAssembly::END_TRY:463case WebAssembly::END_TRY_S:464return true;465default:466return false;467}468}469470inline bool isCatch(unsigned Opc) {471switch (Opc) {472case WebAssembly::CATCH:473case WebAssembly::CATCH_S:474case WebAssembly::CATCH_ALL:475case WebAssembly::CATCH_ALL_S:476return true;477default:478return false;479}480}481482inline bool isLocalGet(unsigned Opc) {483switch (Opc) {484case WebAssembly::LOCAL_GET_I32:485case WebAssembly::LOCAL_GET_I32_S:486case WebAssembly::LOCAL_GET_I64:487case WebAssembly::LOCAL_GET_I64_S:488case WebAssembly::LOCAL_GET_F32:489case WebAssembly::LOCAL_GET_F32_S:490case WebAssembly::LOCAL_GET_F64:491case WebAssembly::LOCAL_GET_F64_S:492case WebAssembly::LOCAL_GET_V128:493case WebAssembly::LOCAL_GET_V128_S:494case WebAssembly::LOCAL_GET_FUNCREF:495case WebAssembly::LOCAL_GET_FUNCREF_S:496case WebAssembly::LOCAL_GET_EXTERNREF:497case WebAssembly::LOCAL_GET_EXTERNREF_S:498case WebAssembly::LOCAL_GET_EXNREF:499case WebAssembly::LOCAL_GET_EXNREF_S:500return true;501default:502return false;503}504}505506inline bool isLocalSet(unsigned Opc) {507switch (Opc) {508case WebAssembly::LOCAL_SET_I32:509case WebAssembly::LOCAL_SET_I32_S:510case WebAssembly::LOCAL_SET_I64:511case WebAssembly::LOCAL_SET_I64_S:512case WebAssembly::LOCAL_SET_F32:513case WebAssembly::LOCAL_SET_F32_S:514case WebAssembly::LOCAL_SET_F64:515case WebAssembly::LOCAL_SET_F64_S:516case WebAssembly::LOCAL_SET_V128:517case WebAssembly::LOCAL_SET_V128_S:518case WebAssembly::LOCAL_SET_FUNCREF:519case WebAssembly::LOCAL_SET_FUNCREF_S:520case WebAssembly::LOCAL_SET_EXTERNREF:521case WebAssembly::LOCAL_SET_EXTERNREF_S:522case WebAssembly::LOCAL_SET_EXNREF:523case WebAssembly::LOCAL_SET_EXNREF_S:524return true;525default:526return false;527}528}529530inline bool isLocalTee(unsigned Opc) {531switch (Opc) {532case WebAssembly::LOCAL_TEE_I32:533case WebAssembly::LOCAL_TEE_I32_S:534case WebAssembly::LOCAL_TEE_I64:535case WebAssembly::LOCAL_TEE_I64_S:536case WebAssembly::LOCAL_TEE_F32:537case WebAssembly::LOCAL_TEE_F32_S:538case WebAssembly::LOCAL_TEE_F64:539case WebAssembly::LOCAL_TEE_F64_S:540case WebAssembly::LOCAL_TEE_V128:541case WebAssembly::LOCAL_TEE_V128_S:542case WebAssembly::LOCAL_TEE_FUNCREF:543case WebAssembly::LOCAL_TEE_FUNCREF_S:544case WebAssembly::LOCAL_TEE_EXTERNREF:545case WebAssembly::LOCAL_TEE_EXTERNREF_S:546case WebAssembly::LOCAL_TEE_EXNREF:547case WebAssembly::LOCAL_TEE_EXNREF_S:548return true;549default:550return false;551}552}553554static const unsigned UnusedReg = -1u;555556// For a given stackified WAReg, return the id number to print with push/pop.557unsigned inline getWARegStackId(unsigned Reg) {558assert(Reg & INT32_MIN);559return Reg & INT32_MAX;560}561562} // end namespace WebAssembly563} // end namespace llvm564565#define GET_SUBTARGETINFO_ENUM566#include "WebAssemblyGenSubtargetInfo.inc"567568#endif569570571