diff options
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td index 5f53e4a00d4..a349da6b971 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td @@ -25,6 +25,29 @@ * switch: switch statement with fallthrough */ +let isBranch = 1, isTerminator = 1, hasCtrlDep = 1 in { +def BRIF : I<(outs), (ins bb_op:$dst, Int32:$a), + [(brcond Int32:$a, bb:$dst)]>; +let isBarrier = 1 in { +def BR : I<(outs), (ins bb_op:$dst), + [(br bb:$dst)]>; +} // isBarrier = 1 +} // isBranch = 1, isTerminator = 1, hasCtrlDep = 1 + +// TODO: SelectionDAG's lowering insists on using a pointer as the index for +// jump tables, so in practice we don't ever use SWITCH_I64 in wasm32 mode +// currently. +let isTerminator = 1, hasCtrlDep = 1, isBarrier = 1 in { +def SWITCH_I32 : I<(outs), (ins Int32:$index, variable_ops), + [(WebAssemblyswitch Int32:$index)]>; +def SWITCH_I64 : I<(outs), (ins Int64:$index, variable_ops), + [(WebAssemblyswitch Int64:$index)]>; +} // isTerminator = 1, hasCtrlDep = 1, isBarrier = 1 + +// Placemarkers to indicate the start of a block or loop scope. +def BLOCK : I<(outs), (ins bb_op:$dst), []>; +def LOOP : I<(outs), (ins bb_op:$dst), []>; + multiclass RETURN<WebAssemblyRegClass vt> { def RETURN_#vt : I<(outs), (ins vt:$val), [(WebAssemblyreturn vt:$val)]>; } |