I found these on my computer so cleaned them up and added extra tests/types. This adds simple patterns for signed and unsigned saturating extract narrow instructions. They combine a min/max/truncate into a single instruction, providing that the immediates on the min/max are correct for the saturation type. This is just handled in tablegen with some extra patterns.
v2i64->v2i32 is not handled here as the min/max nodes are not legal, making the lowering quite different.
From the comment, I deduce that (v8i16 (AArch64NvCast (v2i64 (AArch64movi_edit (i32 85))))) <=> v8i16 splat(255). Is there a reason this is not using AArch64dup?
If so, can we use a more generic pattern fragment to see if something is a dup of <value>? That may cover more cases and would also make the pattern more readable.