mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
Instead of trying to move ARGUMENT instructions back up to the top after they've been scheduled or sunk down, use a fake physical register to create a liveness constraint that prevents ARGUMENT instructions from moving down in the first place. This is still not entirely ideal, however it is more robust than letting them move and moving them back. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254084 91177308-0d34-0410-b5e6-96231b3b80d8
49 lines
1.9 KiB
TableGen
49 lines
1.9 KiB
TableGen
//===- WebAssemblyInstrCall.td-WebAssembly Call codegen support -*- tablegen -*-
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// \brief WebAssembly Call operand code-gen constructs.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
let Defs = [ARGUMENTS] in {
|
|
|
|
// The call sequence start/end LLVM-isms isn't useful to WebAssembly since it's
|
|
// a virtual ISA.
|
|
let isCodeGenOnly = 1 in {
|
|
def : I<(outs), (ins i64imm:$amt),
|
|
[(WebAssemblycallseq_start timm:$amt)]>;
|
|
def : I<(outs), (ins i64imm:$amt1, i64imm:$amt2),
|
|
[(WebAssemblycallseq_end timm:$amt1, timm:$amt2)]>;
|
|
} // isCodeGenOnly = 1
|
|
|
|
multiclass CALL<WebAssemblyRegClass vt> {
|
|
def CALL_#vt : I<(outs vt:$dst), (ins global:$callee, variable_ops),
|
|
[(set vt:$dst, (WebAssemblycall1 (WebAssemblywrapper tglobaladdr:$callee)))],
|
|
"call \t$dst, $callee">;
|
|
def CALL_INDIRECT_#vt : I<(outs vt:$dst), (ins I32:$callee, variable_ops),
|
|
[(set vt:$dst, (WebAssemblycall1 I32:$callee))],
|
|
"call_indirect\t$dst, $callee">;
|
|
}
|
|
let Uses = [SP32, SP64], isCall = 1 in {
|
|
defm : CALL<I32>;
|
|
defm : CALL<I64>;
|
|
defm : CALL<F32>;
|
|
defm : CALL<F64>;
|
|
|
|
def CALL_VOID : I<(outs), (ins global:$callee, variable_ops),
|
|
[(WebAssemblycall0 (WebAssemblywrapper tglobaladdr:$callee))],
|
|
"call \t$callee">;
|
|
def CALL_INDIRECT_VOID : I<(outs), (ins I32:$callee, variable_ops),
|
|
[(WebAssemblycall0 I32:$callee)],
|
|
"call_indirect\t$callee">;
|
|
} // Uses = [SP32,SP64], isCall = 1
|
|
|
|
} // Defs = [ARGUMENTS]
|