Const type promotion is the bane of embedded developers... One thing to try is to use (subreg:QI in a define_expand, so that there's a one_cmplhi2 pattern that expands to two QImode insns that operate on HImode input/outputs via SUBREGs.
I don't have high hopes of gcc optimizing this properly in all cases, but it's worth trying. If it doesn't work out, consider this patch approved, though. Thanks!