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.
The order of these is different compared to what you had in ISelLowering. Likewise below for throw. I assume that's intentional, but why is it different?