14#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
15#define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
17#include "../WebAssemblySubtarget.h"
28class MCObjectTargetWriter;
35std::unique_ptr<MCObjectTargetWriter>
38namespace WebAssembly {
90namespace WebAssemblyII {
128#define GET_REGINFO_ENUM
129#include "WebAssemblyGenRegisterInfo.inc"
133#define GET_INSTRINFO_ENUM
134#define GET_INSTRINFO_MC_HELPER_DECLS
135#include "WebAssemblyGenInstrInfo.inc"
138namespace WebAssembly {
141static const unsigned Nop = 0x01;
142static const unsigned End = 0x0b;
147#define WASM_LOAD_STORE(NAME) \
148 case WebAssembly::NAME##_A32: \
149 case WebAssembly::NAME##_A64: \
150 case WebAssembly::NAME##_A32_S: \
151 case WebAssembly::NAME##_A64_S:
271#undef WASM_LOAD_STORE
284 case WebAssembly::ARGUMENT_i32:
285 case WebAssembly::ARGUMENT_i32_S:
286 case WebAssembly::ARGUMENT_i64:
287 case WebAssembly::ARGUMENT_i64_S:
288 case WebAssembly::ARGUMENT_f32:
289 case WebAssembly::ARGUMENT_f32_S:
290 case WebAssembly::ARGUMENT_f64:
291 case WebAssembly::ARGUMENT_f64_S:
292 case WebAssembly::ARGUMENT_v16i8:
293 case WebAssembly::ARGUMENT_v16i8_S:
294 case WebAssembly::ARGUMENT_v8i16:
295 case WebAssembly::ARGUMENT_v8i16_S:
296 case WebAssembly::ARGUMENT_v4i32:
297 case WebAssembly::ARGUMENT_v4i32_S:
298 case WebAssembly::ARGUMENT_v2i64:
299 case WebAssembly::ARGUMENT_v2i64_S:
300 case WebAssembly::ARGUMENT_v4f32:
301 case WebAssembly::ARGUMENT_v4f32_S:
302 case WebAssembly::ARGUMENT_v2f64:
303 case WebAssembly::ARGUMENT_v2f64_S:
304 case WebAssembly::ARGUMENT_funcref:
305 case WebAssembly::ARGUMENT_funcref_S:
306 case WebAssembly::ARGUMENT_externref:
307 case WebAssembly::ARGUMENT_externref_S:
316 case WebAssembly::COPY_I32:
317 case WebAssembly::COPY_I32_S:
318 case WebAssembly::COPY_I64:
319 case WebAssembly::COPY_I64_S:
320 case WebAssembly::COPY_F32:
321 case WebAssembly::COPY_F32_S:
322 case WebAssembly::COPY_F64:
323 case WebAssembly::COPY_F64_S:
324 case WebAssembly::COPY_V128:
325 case WebAssembly::COPY_V128_S:
326 case WebAssembly::COPY_FUNCREF:
327 case WebAssembly::COPY_FUNCREF_S:
328 case WebAssembly::COPY_EXTERNREF:
329 case WebAssembly::COPY_EXTERNREF_S:
338 case WebAssembly::TEE_I32:
339 case WebAssembly::TEE_I32_S:
340 case WebAssembly::TEE_I64:
341 case WebAssembly::TEE_I64_S:
342 case WebAssembly::TEE_F32:
343 case WebAssembly::TEE_F32_S:
344 case WebAssembly::TEE_F64:
345 case WebAssembly::TEE_F64_S:
346 case WebAssembly::TEE_V128:
347 case WebAssembly::TEE_V128_S:
348 case WebAssembly::TEE_FUNCREF:
349 case WebAssembly::TEE_FUNCREF_S:
350 case WebAssembly::TEE_EXTERNREF:
351 case WebAssembly::TEE_EXTERNREF_S:
360 case WebAssembly::CALL:
361 case WebAssembly::CALL_S:
362 case WebAssembly::RET_CALL:
363 case WebAssembly::RET_CALL_S:
372 case WebAssembly::CALL_INDIRECT:
373 case WebAssembly::CALL_INDIRECT_S:
374 case WebAssembly::RET_CALL_INDIRECT:
375 case WebAssembly::RET_CALL_INDIRECT_S:
383 switch (
MI.getOpcode()) {
384 case WebAssembly::BR_TABLE_I32:
385 case WebAssembly::BR_TABLE_I32_S:
386 case WebAssembly::BR_TABLE_I64:
387 case WebAssembly::BR_TABLE_I64_S:
396 case WebAssembly::BLOCK:
397 case WebAssembly::BLOCK_S:
398 case WebAssembly::END_BLOCK:
399 case WebAssembly::END_BLOCK_S:
400 case WebAssembly::LOOP:
401 case WebAssembly::LOOP_S:
402 case WebAssembly::END_LOOP:
403 case WebAssembly::END_LOOP_S:
404 case WebAssembly::TRY:
405 case WebAssembly::TRY_S:
406 case WebAssembly::END_TRY:
407 case WebAssembly::END_TRY_S:
416 case WebAssembly::CATCH:
417 case WebAssembly::CATCH_S:
418 case WebAssembly::CATCH_ALL:
419 case WebAssembly::CATCH_ALL_S:
428 case WebAssembly::LOCAL_GET_I32:
429 case WebAssembly::LOCAL_GET_I32_S:
430 case WebAssembly::LOCAL_GET_I64:
431 case WebAssembly::LOCAL_GET_I64_S:
432 case WebAssembly::LOCAL_GET_F32:
433 case WebAssembly::LOCAL_GET_F32_S:
434 case WebAssembly::LOCAL_GET_F64:
435 case WebAssembly::LOCAL_GET_F64_S:
436 case WebAssembly::LOCAL_GET_V128:
437 case WebAssembly::LOCAL_GET_V128_S:
438 case WebAssembly::LOCAL_GET_FUNCREF:
439 case WebAssembly::LOCAL_GET_FUNCREF_S:
440 case WebAssembly::LOCAL_GET_EXTERNREF:
441 case WebAssembly::LOCAL_GET_EXTERNREF_S:
450 case WebAssembly::LOCAL_SET_I32:
451 case WebAssembly::LOCAL_SET_I32_S:
452 case WebAssembly::LOCAL_SET_I64:
453 case WebAssembly::LOCAL_SET_I64_S:
454 case WebAssembly::LOCAL_SET_F32:
455 case WebAssembly::LOCAL_SET_F32_S:
456 case WebAssembly::LOCAL_SET_F64:
457 case WebAssembly::LOCAL_SET_F64_S:
458 case WebAssembly::LOCAL_SET_V128:
459 case WebAssembly::LOCAL_SET_V128_S:
460 case WebAssembly::LOCAL_SET_FUNCREF:
461 case WebAssembly::LOCAL_SET_FUNCREF_S:
462 case WebAssembly::LOCAL_SET_EXTERNREF:
463 case WebAssembly::LOCAL_SET_EXTERNREF_S:
472 case WebAssembly::LOCAL_TEE_I32:
473 case WebAssembly::LOCAL_TEE_I32_S:
474 case WebAssembly::LOCAL_TEE_I64:
475 case WebAssembly::LOCAL_TEE_I64_S:
476 case WebAssembly::LOCAL_TEE_F32:
477 case WebAssembly::LOCAL_TEE_F32_S:
478 case WebAssembly::LOCAL_TEE_F64:
479 case WebAssembly::LOCAL_TEE_F64_S:
480 case WebAssembly::LOCAL_TEE_V128:
481 case WebAssembly::LOCAL_TEE_V128_S:
482 case WebAssembly::LOCAL_TEE_FUNCREF:
483 case WebAssembly::LOCAL_TEE_FUNCREF_S:
484 case WebAssembly::LOCAL_TEE_EXTERNREF:
485 case WebAssembly::LOCAL_TEE_EXTERNREF_S:
#define WASM_LOAD_STORE(NAME)
Representation of each machine instruction.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
TOF
Target Operand Flag enum.
bool isLocalTee(unsigned Opc)
bool isBrTable(const MachineInstr &MI)
bool isArgument(unsigned Opc)
bool isCallIndirect(unsigned Opc)
unsigned GetDefaultP2Align(unsigned Opc)
bool isMarker(unsigned Opc)
bool isCatch(unsigned Opc)
static const unsigned Nop
Instruction opcodes emitted via means other than CodeGen.
cl::opt< bool > WasmEnableEH
bool isCopy(unsigned Opc)
cl::opt< bool > WasmEnableSjLj
static const unsigned End
cl::opt< bool > WasmEnableEmEH
@ OPERAND_GLOBAL
Global index.
@ OPERAND_OFFSET64
64-bit unsigned memory offsets.
@ OPERAND_I32IMM
32-bit integer immediates.
@ OPERAND_P2ALIGN
p2align immediate for load and store address alignment.
@ OPERAND_TABLE
32-bit unsigned table number.
@ OPERAND_LOCAL
Local index.
@ OPERAND_VEC_I64IMM
64-bit vector lane immediate
@ OPERAND_VEC_I16IMM
16-bit vector lane immediate
@ OPERAND_TYPEINDEX
type signature immediate for call_indirect.
@ OPERAND_FUNCTION32
32-bit unsigned function indices.
@ OPERAND_F32IMM
32-bit floating-point immediates.
@ OPERAND_BASIC_BLOCK
Basic block label in a branch construct.
@ OPERAND_VEC_I32IMM
32-bit vector lane immediate
@ OPERAND_BRLIST
A list of branch targets for br_list.
@ OPERAND_F64IMM
64-bit floating-point immediates.
@ OPERAND_VEC_I8IMM
8-bit vector lane immediate
@ OPERAND_SIGNATURE
signature immediate for block/loop.
@ OPERAND_I64IMM
64-bit integer immediates.
@ OPERAND_OFFSET32
32-bit unsigned memory offsets.
unsigned GetDefaultP2AlignAny(unsigned Opc)
Return the default p2align value for a load or store with the given opcode.
cl::opt< bool > WasmEnableEmSjLj
bool isCallDirect(unsigned Opc)
bool isLocalSet(unsigned Opc)
bool isLocalGet(unsigned Opc)
This is an optimization pass for GlobalISel generic memory operations.
MCAsmBackend * createWebAssemblyAsmBackend(const Triple &TT)
MCCodeEmitter * createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII)
std::unique_ptr< MCObjectTargetWriter > createWebAssemblyWasmObjectWriter(bool Is64Bit, bool IsEmscripten)
This struct is a compact representation of a valid (non-zero power of two) alignment.