Hello!

x86_64 has particularly interesting address mode limitations when
"high" 8bit registers (%ah, %dh, %ch and %bh) are handled. Following
examples are all valid:

        movb (%rdx), %ah
        addb (%rdx), %ah

but when extended register is part of a memory address, insn requires
REX prefix and assembling following examples

        movb (%r8), %ah

breaks with

Error: can't encode register '%ah' in an instruction requiring REX prefix.

Due to this limitation, all binary operations involving high 8bit
registers are limited to non-memory operands on x86_64, also leading
to many differences between x86_32 and x86_64 insn descriptions (i.e.
addqi_ext_1).

A possible solution would be to use define_memory_constraint that
forces operand to BASE_REG_CLASS, which on x86_64 unfortunately also
includes REX registers. So, we currently have no way to limit reload
register to LEGACY_REG_CLASS that would elegantly solve this problem.

I have a patch that unifies all *_ext patterns in the i386.md file,
and the fixup would trigger only in one file in libgo library.

Is there some other way to limit memory address operands to
LEGACY_REG_CLASS for certain memory constraints?

Uros.

Reply via email to