`catch` instruction can have any number of result values depending on its tag, but so far we have only needed a single i32 return value for C++ exception so the instruction was specified that way. But using the instruction for SjLj handling requires multiple return values. This makes `catch` instruction's results variadic and moves selection of `throw` and `catch` instruction from ISelLowering to ISelDAGToDAG. Moving `catch` to ISelDAGToDAG is necessary because I am not aware of a good way to do instruction selection for variadic output instructions in TableGen. This also moves `throw` because 1. `throw` and `catch` share the same utility function and 2. there is really no reason we should do that in ISelLowering in the first place. What we do is mostly the same in both places, and moving them to ISelDAGToDAG allows us to remove unnecessary mid-level nodes for `throw` and `catch` in WebAssemblyISD.def and WebAssemblyInstrInfo.td. This also adds handling for new `catch` instruction to AsmTypeCheck. Reviewed By: dschuff, tlively Differential Revision: https://reviews.llvm.org/D107423
52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
//- WebAssemblyISD.def - WebAssembly ISD ---------------------------*- C++ -*-//
|
|
//
|
|
// 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
|
|
/// This file describes the various WebAssembly ISD node types.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// NOTE: NO INCLUDE GUARD DESIRED!
|
|
|
|
HANDLE_NODETYPE(CALL)
|
|
HANDLE_NODETYPE(RET_CALL)
|
|
HANDLE_NODETYPE(RETURN)
|
|
HANDLE_NODETYPE(ARGUMENT)
|
|
HANDLE_NODETYPE(LOCAL_GET)
|
|
HANDLE_NODETYPE(LOCAL_SET)
|
|
// A wrapper node for TargetExternalSymbol, TargetGlobalAddress, and MCSymbol
|
|
HANDLE_NODETYPE(Wrapper)
|
|
// A special wapper used in PIC code for __memory_base/__table_base relative
|
|
// access.
|
|
HANDLE_NODETYPE(WrapperPIC)
|
|
HANDLE_NODETYPE(BR_IF)
|
|
HANDLE_NODETYPE(BR_TABLE)
|
|
HANDLE_NODETYPE(SHUFFLE)
|
|
HANDLE_NODETYPE(SWIZZLE)
|
|
HANDLE_NODETYPE(VEC_SHL)
|
|
HANDLE_NODETYPE(VEC_SHR_S)
|
|
HANDLE_NODETYPE(VEC_SHR_U)
|
|
HANDLE_NODETYPE(EXTEND_LOW_S)
|
|
HANDLE_NODETYPE(EXTEND_LOW_U)
|
|
HANDLE_NODETYPE(EXTEND_HIGH_S)
|
|
HANDLE_NODETYPE(EXTEND_HIGH_U)
|
|
HANDLE_NODETYPE(CONVERT_LOW_S)
|
|
HANDLE_NODETYPE(CONVERT_LOW_U)
|
|
HANDLE_NODETYPE(PROMOTE_LOW)
|
|
HANDLE_NODETYPE(TRUNC_SAT_ZERO_S)
|
|
HANDLE_NODETYPE(TRUNC_SAT_ZERO_U)
|
|
HANDLE_NODETYPE(DEMOTE_ZERO)
|
|
HANDLE_NODETYPE(MEMORY_COPY)
|
|
HANDLE_NODETYPE(MEMORY_FILL)
|
|
|
|
// Memory intrinsics
|
|
HANDLE_MEM_NODETYPE(LOAD_SPLAT)
|
|
HANDLE_MEM_NODETYPE(GLOBAL_GET)
|
|
HANDLE_MEM_NODETYPE(GLOBAL_SET)
|
|
HANDLE_MEM_NODETYPE(TABLE_SET)
|