The costs are somewhat hand-wavy, but should be much closer to the truth - what we get from the target-independent code right now is ridiculously high.
The underlying problem seems to be that the target-independent code in BasicTTIImpl assumes that if the dest type is illegal, the operation will get completely scalarized. This is, of course, nonsense. What it should probably do is take the legalization cost + 2 * the actual cost of the extend after the split (by querying the concrete TTI on the result vector).
This problem isn't unique to casts, there's similar logic for, at least, arithmetic instructions and selects. Changing that right now seems like it would rock the boat too much, I want to see if I run into more cases like this in practice first.