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::CONST_I32:
285 case WebAssembly::CONST_I32_S:
286 case WebAssembly::CONST_I64:
287 case WebAssembly::CONST_I64_S:
288 case WebAssembly::CONST_F32:
289 case WebAssembly::CONST_F32_S:
290 case WebAssembly::CONST_F64:
291 case WebAssembly::CONST_F64_S:
292 case WebAssembly::CONST_V128_I8x16:
293 case WebAssembly::CONST_V128_I8x16_S:
294 case WebAssembly::CONST_V128_I16x8:
295 case WebAssembly::CONST_V128_I16x8_S:
296 case WebAssembly::CONST_V128_I32x4:
297 case WebAssembly::CONST_V128_I32x4_S:
298 case WebAssembly::CONST_V128_I64x2:
299 case WebAssembly::CONST_V128_I64x2_S:
300 case WebAssembly::CONST_V128_F32x4:
301 case WebAssembly::CONST_V128_F32x4_S:
302 case WebAssembly::CONST_V128_F64x2:
303 case WebAssembly::CONST_V128_F64x2_S:
312 case WebAssembly::CONST_I32:
313 case WebAssembly::CONST_I32_S:
314 case WebAssembly::CONST_I64:
315 case WebAssembly::CONST_I64_S:
316 case WebAssembly::CONST_F32:
317 case WebAssembly::CONST_F32_S:
318 case WebAssembly::CONST_F64:
319 case WebAssembly::CONST_F64_S:
328 case WebAssembly::ARGUMENT_i32:
329 case WebAssembly::ARGUMENT_i32_S:
330 case WebAssembly::ARGUMENT_i64:
331 case WebAssembly::ARGUMENT_i64_S:
332 case WebAssembly::ARGUMENT_f32:
333 case WebAssembly::ARGUMENT_f32_S:
334 case WebAssembly::ARGUMENT_f64:
335 case WebAssembly::ARGUMENT_f64_S:
336 case WebAssembly::ARGUMENT_v16i8:
337 case WebAssembly::ARGUMENT_v16i8_S:
338 case WebAssembly::ARGUMENT_v8i16:
339 case WebAssembly::ARGUMENT_v8i16_S:
340 case WebAssembly::ARGUMENT_v4i32:
341 case WebAssembly::ARGUMENT_v4i32_S:
342 case WebAssembly::ARGUMENT_v2i64:
343 case WebAssembly::ARGUMENT_v2i64_S:
344 case WebAssembly::ARGUMENT_v4f32:
345 case WebAssembly::ARGUMENT_v4f32_S:
346 case WebAssembly::ARGUMENT_v2f64:
347 case WebAssembly::ARGUMENT_v2f64_S:
348 case WebAssembly::ARGUMENT_funcref:
349 case WebAssembly::ARGUMENT_funcref_S:
350 case WebAssembly::ARGUMENT_externref:
351 case WebAssembly::ARGUMENT_externref_S:
360 case WebAssembly::COPY_I32:
361 case WebAssembly::COPY_I32_S:
362 case WebAssembly::COPY_I64:
363 case WebAssembly::COPY_I64_S:
364 case WebAssembly::COPY_F32:
365 case WebAssembly::COPY_F32_S:
366 case WebAssembly::COPY_F64:
367 case WebAssembly::COPY_F64_S:
368 case WebAssembly::COPY_V128:
369 case WebAssembly::COPY_V128_S:
370 case WebAssembly::COPY_FUNCREF:
371 case WebAssembly::COPY_FUNCREF_S:
372 case WebAssembly::COPY_EXTERNREF:
373 case WebAssembly::COPY_EXTERNREF_S:
382 case WebAssembly::TEE_I32:
383 case WebAssembly::TEE_I32_S:
384 case WebAssembly::TEE_I64:
385 case WebAssembly::TEE_I64_S:
386 case WebAssembly::TEE_F32:
387 case WebAssembly::TEE_F32_S:
388 case WebAssembly::TEE_F64:
389 case WebAssembly::TEE_F64_S:
390 case WebAssembly::TEE_V128:
391 case WebAssembly::TEE_V128_S:
392 case WebAssembly::TEE_FUNCREF:
393 case WebAssembly::TEE_FUNCREF_S:
394 case WebAssembly::TEE_EXTERNREF:
395 case WebAssembly::TEE_EXTERNREF_S:
404 case WebAssembly::CALL:
405 case WebAssembly::CALL_S:
406 case WebAssembly::RET_CALL:
407 case WebAssembly::RET_CALL_S:
416 case WebAssembly::CALL_INDIRECT:
417 case WebAssembly::CALL_INDIRECT_S:
418 case WebAssembly::RET_CALL_INDIRECT:
419 case WebAssembly::RET_CALL_INDIRECT_S:
427 switch (
MI.getOpcode()) {
428 case WebAssembly::BR_TABLE_I32:
429 case WebAssembly::BR_TABLE_I32_S:
430 case WebAssembly::BR_TABLE_I64:
431 case WebAssembly::BR_TABLE_I64_S:
440 case WebAssembly::BLOCK:
441 case WebAssembly::BLOCK_S:
442 case WebAssembly::END_BLOCK:
443 case WebAssembly::END_BLOCK_S:
444 case WebAssembly::LOOP:
445 case WebAssembly::LOOP_S:
446 case WebAssembly::END_LOOP:
447 case WebAssembly::END_LOOP_S:
448 case WebAssembly::TRY:
449 case WebAssembly::TRY_S:
450 case WebAssembly::END_TRY:
451 case WebAssembly::END_TRY_S:
460 case WebAssembly::CATCH:
461 case WebAssembly::CATCH_S:
462 case WebAssembly::CATCH_ALL:
463 case WebAssembly::CATCH_ALL_S:
472 case WebAssembly::LOCAL_GET_I32:
473 case WebAssembly::LOCAL_GET_I32_S:
474 case WebAssembly::LOCAL_GET_I64:
475 case WebAssembly::LOCAL_GET_I64_S:
476 case WebAssembly::LOCAL_GET_F32:
477 case WebAssembly::LOCAL_GET_F32_S:
478 case WebAssembly::LOCAL_GET_F64:
479 case WebAssembly::LOCAL_GET_F64_S:
480 case WebAssembly::LOCAL_GET_V128:
481 case WebAssembly::LOCAL_GET_V128_S:
482 case WebAssembly::LOCAL_GET_FUNCREF:
483 case WebAssembly::LOCAL_GET_FUNCREF_S:
484 case WebAssembly::LOCAL_GET_EXTERNREF:
485 case WebAssembly::LOCAL_GET_EXTERNREF_S:
494 case WebAssembly::LOCAL_SET_I32:
495 case WebAssembly::LOCAL_SET_I32_S:
496 case WebAssembly::LOCAL_SET_I64:
497 case WebAssembly::LOCAL_SET_I64_S:
498 case WebAssembly::LOCAL_SET_F32:
499 case WebAssembly::LOCAL_SET_F32_S:
500 case WebAssembly::LOCAL_SET_F64:
501 case WebAssembly::LOCAL_SET_F64_S:
502 case WebAssembly::LOCAL_SET_V128:
503 case WebAssembly::LOCAL_SET_V128_S:
504 case WebAssembly::LOCAL_SET_FUNCREF:
505 case WebAssembly::LOCAL_SET_FUNCREF_S:
506 case WebAssembly::LOCAL_SET_EXTERNREF:
507 case WebAssembly::LOCAL_SET_EXTERNREF_S:
516 case WebAssembly::LOCAL_TEE_I32:
517 case WebAssembly::LOCAL_TEE_I32_S:
518 case WebAssembly::LOCAL_TEE_I64:
519 case WebAssembly::LOCAL_TEE_I64_S:
520 case WebAssembly::LOCAL_TEE_F32:
521 case WebAssembly::LOCAL_TEE_F32_S:
522 case WebAssembly::LOCAL_TEE_F64:
523 case WebAssembly::LOCAL_TEE_F64_S:
524 case WebAssembly::LOCAL_TEE_V128:
525 case WebAssembly::LOCAL_TEE_V128_S:
526 case WebAssembly::LOCAL_TEE_FUNCREF:
527 case WebAssembly::LOCAL_TEE_FUNCREF_S:
528 case WebAssembly::LOCAL_TEE_EXTERNREF:
529 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
bool isConst(unsigned Opc)
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 isScalarConst(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.