//===- WebAssemblyInstrCall.td-WebAssembly Call codegen support -*- tablegen -*-
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// WebAssembly Call operand code-gen constructs.
///
//===----------------------------------------------------------------------===//

// TODO: addr64: These currently assume the callee address is 32-bit.
// FIXME: add $type to first call_indirect asmstr (and maybe $flags)

// Call sequence markers. These have an immediate which represents the amount of
// stack space to allocate or free, which is used for varargs lowering.
let Uses = [SP32, SP64], Defs = [SP32, SP64], isCodeGenOnly = 1 in {
defm ADJCALLSTACKDOWN : NRI<(outs), (ins i32imm:$amt, i32imm:$amt2),
                            [(WebAssemblycallseq_start timm:$amt, timm:$amt2)]>;
defm ADJCALLSTACKUP : NRI<(outs), (ins i32imm:$amt, i32imm:$amt2),
                          [(WebAssemblycallseq_end timm:$amt, timm:$amt2)]>;
} // Uses = [SP32, SP64], Defs = [SP32, SP64], isCodeGenOnly = 1


let Uses = [SP32, SP64], isCall = 1 in {

// CALL should take both variadic arguments and produce variadic results, but
// this is not possible to model directly. Instead, we select calls to a
// CALL_PARAMS taking variadic arguments linked with a CALL_RESULTS that handles
// producing the call's variadic results. We recombine the two in a custom
// inserter hook after DAG ISel, so passes over MachineInstrs will only ever
// observe CALL nodes with all of the expected variadic uses and defs.
let isPseudo = 1 in
defm CALL_PARAMS :
  I<(outs), (ins function32_op:$callee, variable_ops),
    (outs), (ins function32_op:$callee), [],
    "call_params\t$callee", "call_params\t$callee", -1>;

let variadicOpsAreDefs = 1, usesCustomInserter = 1, isPseudo = 1 in
defm CALL_RESULTS :
  I<(outs), (ins variable_ops), (outs), (ins), [],
     "call_results", "call_results", -1>;

let variadicOpsAreDefs = 1, usesCustomInserter = 1, isPseudo = 1 in
defm RET_CALL_RESULTS :
  I<(outs), (ins variable_ops), (outs), (ins), [],
     "return_call_results", "return_call_results", -1>;

let variadicOpsAreDefs = 1 in
defm CALL :
  I<(outs), (ins function32_op:$callee, variable_ops),
    (outs), (ins function32_op:$callee), [],
    "call", "call\t$callee", 0x10>;

let variadicOpsAreDefs = 1 in
defm CALL_INDIRECT :
 I<(outs), (ins TypeIndex:$type, i32imm:$flags, variable_ops),
   (outs), (ins TypeIndex:$type, i32imm:$flags), [],
   "call_indirect", "call_indirect\t$type", 0x11>;

let isReturn = 1, isTerminator = 1, hasCtrlDep = 1, isBarrier = 1 in
defm RET_CALL :
  I<(outs), (ins function32_op:$callee, variable_ops),
    (outs), (ins function32_op:$callee), [],
    "return_call    \t$callee", "return_call\t$callee", 0x12>,
  Requires<[HasTailCall]>;

let isReturn = 1 in
defm RET_CALL_INDIRECT :
  I<(outs), (ins TypeIndex:$type, i32imm:$flags, variable_ops),
    (outs), (ins TypeIndex:$type, i32imm:$flags), [],
    "return_call_indirect\t", "return_call_indirect\t$type",
    0x13>,
  Requires<[HasTailCall]>;

} // Uses = [SP32,SP64], isCall = 1
