Instead, pattern match extends of extract_subvectors to generate
widening operations. Since extract_subvector is not a legal node, this
is implemented via a custom combine that recognizes extract_subvector
nodes before they are legalized. The combine produces custom ISD nodes
that are later pattern matched directly, just like the intrinsic was.
Also removes the clang builtins for these operations since the
instructions can now be generated from portable code sequences.
It'd be clearer to say starting indices of these don't start with 0 or [lanecount - 1] so they can't be widened using widen_low or widen_high instructions.
Question: Can we also widen these using shifts?