diff options
author | Cui, Lili <lili.cui@intel.com> | 2024-05-22 09:18:38 +0800 |
---|---|---|
committer | Cui, Lili <lili.cui@intel.com> | 2024-05-22 09:18:38 +0800 |
commit | 3a8ecbdade82981cd2fb257896b01afd54752491 (patch) | |
tree | 0e083ad4a5b2ba256e417260fd280e902462f882 | |
parent | 92f59183ab085f5762650c3242a33119d161e668 (diff) | |
download | fsf-binutils-gdb-3a8ecbdade82981cd2fb257896b01afd54752491.zip fsf-binutils-gdb-3a8ecbdade82981cd2fb257896b01afd54752491.tar.gz fsf-binutils-gdb-3a8ecbdade82981cd2fb257896b01afd54752491.tar.bz2 |
x86: Split REX/REX2 old registers judgment.
Split "REX/REX2 old register checking" and "add empty rex prefix"
into two separate branches.
gas/ChangeLog:
* config/tc-i386.c (establish_rex): Split the judgments.
-rw-r--r-- | gas/config/tc-i386.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 339e849..12af7ce 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -4303,22 +4303,20 @@ static void establish_rex (void) /* Respect a user-specified REX prefix. */ i.rex |= i.prefix[REX_PREFIX] & REX_OPCODE; - /* For 8 bit registers we need an empty rex prefix. Also if the - instruction already has a prefix, we need to convert old - registers to new ones. */ - - if ((i.types[first].bitfield.class == Reg && i.types[first].bitfield.byte - && ((i.op[first].regs->reg_flags & RegRex64) != 0 || i.rex != 0 - || i.rex2 != 0)) - || (i.types[last].bitfield.class == Reg && i.types[last].bitfield.byte - && ((i.op[last].regs->reg_flags & RegRex64) != 0 || i.rex != 0 - || i.rex2 != 0))) - { - unsigned int x; - - if (!is_apx_rex2_encoding () && !is_any_vex_encoding(&i.tm)) - i.rex |= REX_OPCODE; - for (x = first; x <= last; x++) + /* For 8 bit RegRex64 registers without a prefix, we need an empty rex prefix. */ + if (((i.types[first].bitfield.class == Reg && i.types[first].bitfield.byte + && (i.op[first].regs->reg_flags & RegRex64) != 0) + || (i.types[last].bitfield.class == Reg && i.types[last].bitfield.byte + && (i.op[last].regs->reg_flags & RegRex64) != 0)) + && !i.rex && !is_apx_rex2_encoding () && !is_any_vex_encoding (&i.tm)) + i.rex |= REX_OPCODE; + + /* For REX/REX2/EVEX prefix instructions, we need to convert old registers + (AL, CL, DL and BL) to new ones (AXL, CXL, DXL and BXL) and reject AH, + CH, DH and BH. */ + if (i.rex || i.rex2) + { + for (unsigned int x = first; x <= last; x++) { /* Look for 8 bit operand that uses old registers. */ if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte |