http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49142
Summary: Invalid 8bit register operand Product: gcc Version: 4.6.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: inline-asm AssignedTo: unassig...@gcc.gnu.org ReportedBy: hjl.to...@gmail.com Target: x86_64 i386.md has (define_insn "*movqi_extzv_2_rex64" [(set (match_operand:QI 0 "register_operand" "=Q,?R") (subreg:QI (zero_extract:SI (match_operand 1 "ext_register_operand" "Q,Q") (const_int 8) (const_int 8)) 0))] "TARGET_64BIT" { switch (get_attr_type (insn)) { case TYPE_IMOVX: return "movz{bl|x}\t{%h1, %k0|%k0, %h1}"; default: return "mov{b}\t{%h1, %0|%0, %h1}"; } } However, since %ah can only be used with legacy 8bit register, it puts restriction on the other operand. We shouldn't generate "movb %ah, %dil".