1 //==- WebAssemblyMCTargetDesc.h - WebAssembly Target Descriptions -*- C++ -*-=//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief This file provides WebAssembly-specific target descriptions.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
16 #define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
18 #include "llvm/MC/MCInstrDesc.h"
19 #include "llvm/Support/DataTypes.h"
28 class MCSubtargetInfo;
32 class raw_pwrite_stream;
34 Target &getTheWebAssemblyTarget32();
35 Target &getTheWebAssemblyTarget64();
37 MCCodeEmitter *createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII);
39 MCAsmBackend *createWebAssemblyAsmBackend(const Triple &TT);
41 MCObjectWriter *createWebAssemblyELFObjectWriter(raw_pwrite_stream &OS,
42 bool Is64Bit, uint8_t OSABI);
44 namespace WebAssembly {
46 /// Basic block label in a branch construct.
47 OPERAND_BASIC_BLOCK = MCOI::OPERAND_FIRST_TARGET,
50 /// 32-bit integer immediates.
52 /// 64-bit integer immediates.
54 /// 32-bit floating-point immediates.
56 /// 64-bit floating-point immediates.
58 /// 32-bit unsigned function indices.
60 /// 32-bit unsigned memory offsets.
62 /// p2align immediate for load and store address alignment.
64 /// signature immediate for block/loop.
67 } // end namespace WebAssembly
69 namespace WebAssemblyII {
71 // For variadic instructions, this flag indicates whether an operand
72 // in the variable_ops range is an immediate value.
73 VariableOpIsImmediate = (1 << 0),
74 // For immediate values in the variable_ops range, this flag indicates
75 // whether the value represents a control-flow label.
76 VariableOpImmediateIsLabel = (1 << 1)
78 } // end namespace WebAssemblyII
80 } // end namespace llvm
82 // Defines symbolic names for WebAssembly registers. This defines a mapping from
83 // register name to register number.
85 #define GET_REGINFO_ENUM
86 #include "WebAssemblyGenRegisterInfo.inc"
88 // Defines symbolic names for the WebAssembly instructions.
90 #define GET_INSTRINFO_ENUM
91 #include "WebAssemblyGenInstrInfo.inc"
93 #define GET_SUBTARGETINFO_ENUM
94 #include "WebAssemblyGenSubtargetInfo.inc"
97 namespace WebAssembly {
99 /// Return the default p2align value for a load or store with the given opcode.
100 inline unsigned GetDefaultP2Align(unsigned Opcode) {
102 case WebAssembly::LOAD8_S_I32:
103 case WebAssembly::LOAD8_U_I32:
104 case WebAssembly::LOAD8_S_I64:
105 case WebAssembly::LOAD8_U_I64:
106 case WebAssembly::STORE8_I32:
107 case WebAssembly::STORE8_I64:
109 case WebAssembly::LOAD16_S_I32:
110 case WebAssembly::LOAD16_U_I32:
111 case WebAssembly::LOAD16_S_I64:
112 case WebAssembly::LOAD16_U_I64:
113 case WebAssembly::STORE16_I32:
114 case WebAssembly::STORE16_I64:
116 case WebAssembly::LOAD_I32:
117 case WebAssembly::LOAD_F32:
118 case WebAssembly::STORE_I32:
119 case WebAssembly::STORE_F32:
120 case WebAssembly::LOAD32_S_I64:
121 case WebAssembly::LOAD32_U_I64:
122 case WebAssembly::STORE32_I64:
124 case WebAssembly::LOAD_I64:
125 case WebAssembly::LOAD_F64:
126 case WebAssembly::STORE_I64:
127 case WebAssembly::STORE_F64:
130 llvm_unreachable("Only loads and stores have p2align values");
134 /// The operand number of the load or store address in load/store instructions.
135 static const unsigned LoadAddressOperandNo = 3;
136 static const unsigned StoreAddressOperandNo = 2;
138 /// The operand number of the load or store p2align in load/store instructions.
139 static const unsigned LoadP2AlignOperandNo = 1;
140 static const unsigned StoreP2AlignOperandNo = 0;
142 /// This is used to indicate block signatures.
143 enum class ExprType {
158 /// This is used to indicate local types.
173 /// Instruction opcodes emitted via means other than CodeGen.
174 static const unsigned Nop = 0x01;
175 static const unsigned End = 0x0b;
177 ValType toValType(const MVT &Ty);
179 } // end namespace WebAssembly
180 } // end namespace llvm