xref: /aosp_15_r20/external/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //==- WebAssemblyMCTargetDesc.h - WebAssembly Target Descriptions -*- C++ -*-=//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker ///
10*9880d681SAndroid Build Coastguard Worker /// \file
11*9880d681SAndroid Build Coastguard Worker /// \brief This file provides WebAssembly-specific target descriptions.
12*9880d681SAndroid Build Coastguard Worker ///
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
16*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrDesc.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataTypes.h"
20*9880d681SAndroid Build Coastguard Worker 
21*9880d681SAndroid Build Coastguard Worker namespace llvm {
22*9880d681SAndroid Build Coastguard Worker 
23*9880d681SAndroid Build Coastguard Worker class MCAsmBackend;
24*9880d681SAndroid Build Coastguard Worker class MCCodeEmitter;
25*9880d681SAndroid Build Coastguard Worker class MCContext;
26*9880d681SAndroid Build Coastguard Worker class MCInstrInfo;
27*9880d681SAndroid Build Coastguard Worker class MCObjectWriter;
28*9880d681SAndroid Build Coastguard Worker class MCSubtargetInfo;
29*9880d681SAndroid Build Coastguard Worker class Target;
30*9880d681SAndroid Build Coastguard Worker class Triple;
31*9880d681SAndroid Build Coastguard Worker class raw_pwrite_stream;
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker extern Target TheWebAssemblyTarget32;
34*9880d681SAndroid Build Coastguard Worker extern Target TheWebAssemblyTarget64;
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker MCCodeEmitter *createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII);
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker MCAsmBackend *createWebAssemblyAsmBackend(const Triple &TT);
39*9880d681SAndroid Build Coastguard Worker 
40*9880d681SAndroid Build Coastguard Worker MCObjectWriter *createWebAssemblyELFObjectWriter(raw_pwrite_stream &OS,
41*9880d681SAndroid Build Coastguard Worker                                                  bool Is64Bit, uint8_t OSABI);
42*9880d681SAndroid Build Coastguard Worker 
43*9880d681SAndroid Build Coastguard Worker namespace WebAssembly {
44*9880d681SAndroid Build Coastguard Worker enum OperandType {
45*9880d681SAndroid Build Coastguard Worker   /// Basic block label in a branch construct.
46*9880d681SAndroid Build Coastguard Worker   OPERAND_BASIC_BLOCK = MCOI::OPERAND_FIRST_TARGET,
47*9880d681SAndroid Build Coastguard Worker   /// 32-bit floating-point immediates.
48*9880d681SAndroid Build Coastguard Worker   OPERAND_FP32IMM,
49*9880d681SAndroid Build Coastguard Worker   /// 64-bit floating-point immediates.
50*9880d681SAndroid Build Coastguard Worker   OPERAND_FP64IMM,
51*9880d681SAndroid Build Coastguard Worker   /// p2align immediate for load and store address alignment.
52*9880d681SAndroid Build Coastguard Worker   OPERAND_P2ALIGN
53*9880d681SAndroid Build Coastguard Worker };
54*9880d681SAndroid Build Coastguard Worker 
55*9880d681SAndroid Build Coastguard Worker /// WebAssembly-specific directive identifiers.
56*9880d681SAndroid Build Coastguard Worker enum Directive {
57*9880d681SAndroid Build Coastguard Worker   // FIXME: This is not the real binary encoding.
58*9880d681SAndroid Build Coastguard Worker   DotParam = UINT64_MAX - 0,   ///< .param
59*9880d681SAndroid Build Coastguard Worker   DotResult = UINT64_MAX - 1,  ///< .result
60*9880d681SAndroid Build Coastguard Worker   DotLocal = UINT64_MAX - 2,   ///< .local
61*9880d681SAndroid Build Coastguard Worker   DotEndFunc = UINT64_MAX - 3, ///< .endfunc
62*9880d681SAndroid Build Coastguard Worker };
63*9880d681SAndroid Build Coastguard Worker 
64*9880d681SAndroid Build Coastguard Worker } // end namespace WebAssembly
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker namespace WebAssemblyII {
67*9880d681SAndroid Build Coastguard Worker enum {
68*9880d681SAndroid Build Coastguard Worker   // For variadic instructions, this flag indicates whether an operand
69*9880d681SAndroid Build Coastguard Worker   // in the variable_ops range is an immediate value.
70*9880d681SAndroid Build Coastguard Worker   VariableOpIsImmediate = (1 << 0),
71*9880d681SAndroid Build Coastguard Worker   // For immediate values in the variable_ops range, this flag indicates
72*9880d681SAndroid Build Coastguard Worker   // whether the value represents a control-flow label.
73*9880d681SAndroid Build Coastguard Worker   VariableOpImmediateIsLabel = (1 << 1),
74*9880d681SAndroid Build Coastguard Worker };
75*9880d681SAndroid Build Coastguard Worker } // end namespace WebAssemblyII
76*9880d681SAndroid Build Coastguard Worker 
77*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
78*9880d681SAndroid Build Coastguard Worker 
79*9880d681SAndroid Build Coastguard Worker // Defines symbolic names for WebAssembly registers. This defines a mapping from
80*9880d681SAndroid Build Coastguard Worker // register name to register number.
81*9880d681SAndroid Build Coastguard Worker //
82*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_ENUM
83*9880d681SAndroid Build Coastguard Worker #include "WebAssemblyGenRegisterInfo.inc"
84*9880d681SAndroid Build Coastguard Worker 
85*9880d681SAndroid Build Coastguard Worker // Defines symbolic names for the WebAssembly instructions.
86*9880d681SAndroid Build Coastguard Worker //
87*9880d681SAndroid Build Coastguard Worker #define GET_INSTRINFO_ENUM
88*9880d681SAndroid Build Coastguard Worker #include "WebAssemblyGenInstrInfo.inc"
89*9880d681SAndroid Build Coastguard Worker 
90*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_ENUM
91*9880d681SAndroid Build Coastguard Worker #include "WebAssemblyGenSubtargetInfo.inc"
92*9880d681SAndroid Build Coastguard Worker 
93*9880d681SAndroid Build Coastguard Worker namespace llvm {
94*9880d681SAndroid Build Coastguard Worker namespace WebAssembly {
95*9880d681SAndroid Build Coastguard Worker 
96*9880d681SAndroid Build Coastguard Worker /// Return the default p2align value for a load or store with the given opcode.
GetDefaultP2Align(unsigned Opcode)97*9880d681SAndroid Build Coastguard Worker inline unsigned GetDefaultP2Align(unsigned Opcode) {
98*9880d681SAndroid Build Coastguard Worker   switch (Opcode) {
99*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD8_S_I32:
100*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD8_U_I32:
101*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD8_S_I64:
102*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD8_U_I64:
103*9880d681SAndroid Build Coastguard Worker   case WebAssembly::STORE8_I32:
104*9880d681SAndroid Build Coastguard Worker   case WebAssembly::STORE8_I64:
105*9880d681SAndroid Build Coastguard Worker     return 0;
106*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD16_S_I32:
107*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD16_U_I32:
108*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD16_S_I64:
109*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD16_U_I64:
110*9880d681SAndroid Build Coastguard Worker   case WebAssembly::STORE16_I32:
111*9880d681SAndroid Build Coastguard Worker   case WebAssembly::STORE16_I64:
112*9880d681SAndroid Build Coastguard Worker     return 1;
113*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD_I32:
114*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD_F32:
115*9880d681SAndroid Build Coastguard Worker   case WebAssembly::STORE_I32:
116*9880d681SAndroid Build Coastguard Worker   case WebAssembly::STORE_F32:
117*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD32_S_I64:
118*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD32_U_I64:
119*9880d681SAndroid Build Coastguard Worker   case WebAssembly::STORE32_I64:
120*9880d681SAndroid Build Coastguard Worker     return 2;
121*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD_I64:
122*9880d681SAndroid Build Coastguard Worker   case WebAssembly::LOAD_F64:
123*9880d681SAndroid Build Coastguard Worker   case WebAssembly::STORE_I64:
124*9880d681SAndroid Build Coastguard Worker   case WebAssembly::STORE_F64:
125*9880d681SAndroid Build Coastguard Worker     return 3;
126*9880d681SAndroid Build Coastguard Worker   default: llvm_unreachable("Only loads and stores have p2align values");
127*9880d681SAndroid Build Coastguard Worker   }
128*9880d681SAndroid Build Coastguard Worker }
129*9880d681SAndroid Build Coastguard Worker 
130*9880d681SAndroid Build Coastguard Worker /// The operand number of the load or store address in load/store instructions.
131*9880d681SAndroid Build Coastguard Worker static const unsigned MemOpAddressOperandNo = 2;
132*9880d681SAndroid Build Coastguard Worker /// The operand number of the stored value in a store instruction.
133*9880d681SAndroid Build Coastguard Worker static const unsigned StoreValueOperandNo = 4;
134*9880d681SAndroid Build Coastguard Worker 
135*9880d681SAndroid Build Coastguard Worker } // end namespace WebAssembly
136*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
137*9880d681SAndroid Build Coastguard Worker 
138*9880d681SAndroid Build Coastguard Worker #endif
139