xref: /aosp_15_r20/external/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker// WebAssemblyInstrInfo.td-Describe the WebAssembly Instructions-*- tablegen -*-
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 WebAssembly Instruction definitions.
12*9880d681SAndroid Build Coastguard Worker///
13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
16*9880d681SAndroid Build Coastguard Worker// WebAssembly Instruction Predicate Definitions.
17*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdef HasAddr32 : Predicate<"!Subtarget->hasAddr64()">;
20*9880d681SAndroid Build Coastguard Workerdef HasAddr64 : Predicate<"Subtarget->hasAddr64()">;
21*9880d681SAndroid Build Coastguard Workerdef HasSIMD128 : Predicate<"Subtarget->hasSIMD128()">,
22*9880d681SAndroid Build Coastguard Worker                           AssemblerPredicate<"FeatureSIMD128", "simd128">;
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
25*9880d681SAndroid Build Coastguard Worker// WebAssembly-specific DAG Node Types.
26*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyCallSeqStart : SDCallSeqStart<[SDTCisVT<0, iPTR>]>;
29*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyCallSeqEnd :
30*9880d681SAndroid Build Coastguard Worker    SDCallSeqEnd<[SDTCisVT<0, iPTR>, SDTCisVT<1, iPTR>]>;
31*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyCall0    : SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>;
32*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyCall1    : SDTypeProfile<1, -1, [SDTCisPtrTy<1>]>;
33*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyBrTable  : SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>;
34*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyArgument : SDTypeProfile<1, 1, [SDTCisVT<1, i32>]>;
35*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyReturn   : SDTypeProfile<0, -1, []>;
36*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyWrapper  : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>,
37*9880d681SAndroid Build Coastguard Worker                                                   SDTCisPtrTy<0>]>;
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
40*9880d681SAndroid Build Coastguard Worker// WebAssembly-specific DAG Nodes.
41*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdef WebAssemblycallseq_start :
44*9880d681SAndroid Build Coastguard Worker    SDNode<"ISD::CALLSEQ_START", SDT_WebAssemblyCallSeqStart,
45*9880d681SAndroid Build Coastguard Worker           [SDNPHasChain, SDNPOutGlue]>;
46*9880d681SAndroid Build Coastguard Workerdef WebAssemblycallseq_end :
47*9880d681SAndroid Build Coastguard Worker    SDNode<"ISD::CALLSEQ_END", SDT_WebAssemblyCallSeqEnd,
48*9880d681SAndroid Build Coastguard Worker           [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
49*9880d681SAndroid Build Coastguard Workerdef WebAssemblycall0 : SDNode<"WebAssemblyISD::CALL0",
50*9880d681SAndroid Build Coastguard Worker                              SDT_WebAssemblyCall0,
51*9880d681SAndroid Build Coastguard Worker                              [SDNPHasChain, SDNPVariadic]>;
52*9880d681SAndroid Build Coastguard Workerdef WebAssemblycall1 : SDNode<"WebAssemblyISD::CALL1",
53*9880d681SAndroid Build Coastguard Worker                              SDT_WebAssemblyCall1,
54*9880d681SAndroid Build Coastguard Worker                              [SDNPHasChain, SDNPVariadic]>;
55*9880d681SAndroid Build Coastguard Workerdef WebAssemblybr_table : SDNode<"WebAssemblyISD::BR_TABLE",
56*9880d681SAndroid Build Coastguard Worker                                 SDT_WebAssemblyBrTable,
57*9880d681SAndroid Build Coastguard Worker                                 [SDNPHasChain, SDNPVariadic]>;
58*9880d681SAndroid Build Coastguard Workerdef WebAssemblyargument : SDNode<"WebAssemblyISD::ARGUMENT",
59*9880d681SAndroid Build Coastguard Worker                                 SDT_WebAssemblyArgument>;
60*9880d681SAndroid Build Coastguard Workerdef WebAssemblyreturn   : SDNode<"WebAssemblyISD::RETURN",
61*9880d681SAndroid Build Coastguard Worker                                 SDT_WebAssemblyReturn, [SDNPHasChain]>;
62*9880d681SAndroid Build Coastguard Workerdef WebAssemblywrapper  : SDNode<"WebAssemblyISD::Wrapper",
63*9880d681SAndroid Build Coastguard Worker                                 SDT_WebAssemblyWrapper>;
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
66*9880d681SAndroid Build Coastguard Worker// WebAssembly-specific Operands.
67*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerlet OperandNamespace = "WebAssembly" in {
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_BASIC_BLOCK" in
72*9880d681SAndroid Build Coastguard Workerdef bb_op : Operand<OtherVT>;
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_FP32IMM" in
75*9880d681SAndroid Build Coastguard Workerdef f32imm_op : Operand<f32>;
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_FP64IMM" in
78*9880d681SAndroid Build Coastguard Workerdef f64imm_op : Operand<f64>;
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_P2ALIGN" in {
81*9880d681SAndroid Build Coastguard Workerdef P2Align : Operand<i32> {
82*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printWebAssemblyP2AlignOperand";
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker} // OperandType = "OPERAND_P2ALIGN"
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker} // OperandNamespace = "WebAssembly"
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
89*9880d681SAndroid Build Coastguard Worker// WebAssembly Instruction Format Definitions.
90*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrFormats.td"
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
95*9880d681SAndroid Build Coastguard Worker// Additional instructions.
96*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workermulticlass ARGUMENT<WebAssemblyRegClass vt> {
99*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 1, Uses = [ARGUMENTS], isCodeGenOnly = 1 in
100*9880d681SAndroid Build Coastguard Worker  def ARGUMENT_#vt : I<(outs vt:$res), (ins i32imm:$argno),
101*9880d681SAndroid Build Coastguard Worker                       [(set vt:$res, (WebAssemblyargument timm:$argno))]>;
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Workerdefm : ARGUMENT<I32>;
104*9880d681SAndroid Build Coastguard Workerdefm : ARGUMENT<I64>;
105*9880d681SAndroid Build Coastguard Workerdefm : ARGUMENT<F32>;
106*9880d681SAndroid Build Coastguard Workerdefm : ARGUMENT<F64>;
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerlet Defs = [ARGUMENTS] in {
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker// get_local and set_local are not generated by instruction selection; they
111*9880d681SAndroid Build Coastguard Worker// are implied by virtual register uses and defs.
112*9880d681SAndroid Build Coastguard Workermulticlass LOCAL<WebAssemblyRegClass vt> {
113*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in {
114*9880d681SAndroid Build Coastguard Worker  // COPY_LOCAL is not an actual instruction in wasm, but since we allow
115*9880d681SAndroid Build Coastguard Worker  // get_local and set_local to be implicit, we can have a COPY_LOCAL which
116*9880d681SAndroid Build Coastguard Worker  // is actually a no-op because all the work is done in the implied
117*9880d681SAndroid Build Coastguard Worker  // get_local and set_local.
118*9880d681SAndroid Build Coastguard Worker  let isAsCheapAsAMove = 1 in
119*9880d681SAndroid Build Coastguard Worker  def COPY_LOCAL_#vt : I<(outs vt:$res), (ins vt:$src), [],
120*9880d681SAndroid Build Coastguard Worker                         "copy_local\t$res, $src">;
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker  // TEE_LOCAL is similar to COPY_LOCAL, but writes two copies of its result.
123*9880d681SAndroid Build Coastguard Worker  // Typically this would be used to stackify one result and write the other
124*9880d681SAndroid Build Coastguard Worker  // result to a local.
125*9880d681SAndroid Build Coastguard Worker  let isAsCheapAsAMove = 1 in
126*9880d681SAndroid Build Coastguard Worker  def TEE_LOCAL_#vt : I<(outs vt:$res, vt:$also), (ins vt:$src), [],
127*9880d681SAndroid Build Coastguard Worker                        "tee_local\t$res, $also, $src">;
128*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Workerdefm : LOCAL<I32>;
131*9880d681SAndroid Build Coastguard Workerdefm : LOCAL<I64>;
132*9880d681SAndroid Build Coastguard Workerdefm : LOCAL<F32>;
133*9880d681SAndroid Build Coastguard Workerdefm : LOCAL<F64>;
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerlet isMoveImm = 1, isAsCheapAsAMove = 1, isReMaterializable = 1 in {
136*9880d681SAndroid Build Coastguard Workerdef CONST_I32 : I<(outs I32:$res), (ins i32imm:$imm),
137*9880d681SAndroid Build Coastguard Worker                  [(set I32:$res, imm:$imm)],
138*9880d681SAndroid Build Coastguard Worker                  "i32.const\t$res, $imm">;
139*9880d681SAndroid Build Coastguard Workerdef CONST_I64 : I<(outs I64:$res), (ins i64imm:$imm),
140*9880d681SAndroid Build Coastguard Worker                  [(set I64:$res, imm:$imm)],
141*9880d681SAndroid Build Coastguard Worker                  "i64.const\t$res, $imm">;
142*9880d681SAndroid Build Coastguard Workerdef CONST_F32 : I<(outs F32:$res), (ins f32imm_op:$imm),
143*9880d681SAndroid Build Coastguard Worker                  [(set F32:$res, fpimm:$imm)],
144*9880d681SAndroid Build Coastguard Worker                  "f32.const\t$res, $imm">;
145*9880d681SAndroid Build Coastguard Workerdef CONST_F64 : I<(outs F64:$res), (ins f64imm_op:$imm),
146*9880d681SAndroid Build Coastguard Worker                  [(set F64:$res, fpimm:$imm)],
147*9880d681SAndroid Build Coastguard Worker                  "f64.const\t$res, $imm">;
148*9880d681SAndroid Build Coastguard Worker} // isMoveImm = 1, isAsCheapAsAMove = 1, isReMaterializable = 1
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker} // Defs = [ARGUMENTS]
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (WebAssemblywrapper tglobaladdr:$addr)),
153*9880d681SAndroid Build Coastguard Worker          (CONST_I32 tglobaladdr:$addr)>;
154*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (WebAssemblywrapper texternalsym:$addr)),
155*9880d681SAndroid Build Coastguard Worker          (CONST_I32 texternalsym:$addr)>;
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
158*9880d681SAndroid Build Coastguard Worker// Additional sets of instructions.
159*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrMemory.td"
162*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrCall.td"
163*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrControl.td"
164*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrInteger.td"
165*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrConv.td"
166*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrFloat.td"
167*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrAtomics.td"
168*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrSIMD.td"
169