https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107563
--- Comment #12 from Levy Hsu <admin at levyhsu dot com> --- switch (d->vmode) { case E_V8QImode: if (!TARGET_MMX_WITH_SSE) return false; mode = V4HImode; gen_shr = gen_ashrv4hi3(should be gen_lshrv4hi3); gen_shl = gen_ashlv4hi3; gen_or = gen_iorv4hi3; break; case E_V16QImode: mode = V8HImode; gen_shr = gen_vlshrv8hi3; gen_shl = gen_vashlv8hi3; gen_or = gen_iorv8hi3; break; default: return false; } Obviously, under V8QImode it should be gen_lshrv4hi3 instead of gen_ashrv4hi3. I mistakenly used gen_ashrv4hi3 due to the similar naming conventions and failed to find out. gen_lshrv4hi3 is the correct logical shift needed. Will send a patch soon