Also, is there a function for simplifying a zero_extract?
What combine is doing is to expand compound operations such as zero_extract, simplifying them, and try to make new compound operations. Therefore you should first try to understand what's causing combine to miss the simplification.
However, if you add these simplifications to simplify-rtx.c, it will be picked up by combine. For example, you can add simplification of (zero_extract:M (subreg:N (something:M))) in simplify_ternary_operation, and of (subreg:M (zero_extract:N (something:M))) in simplify_subreg.
Paolo