Generalize the existing eq/ne case using extractParts. The original code only handled narrowings for types of width 2n->n. This generalization allows for any type that can be broken down by extractParts.
General overview is:
- Loop over each narrow-sized part and do exactly what the 2-register case did.
- Loop over the leftover-sized parts and do the same thing
- Zext the leftover-sized XOR results to the desired narrow size
- OR that all together and then do the comparison against 0 (just like the old code)
This shows up a lot when building clang for AArch64 using GlobalISel, so it's worth fixing. For the sake of simplicity, this doesn't handle the non-eq/ne case yet.
Also remove the code in this case that notifies the observer; we're just going to delete MI anyway so talking to the observer shouldn't be necessary.
This line split is really ugly, assign Xor to a variable to put on a different line?