From: Jan Beulich Date: Fri, 21 Jun 2024 06:35:23 +0000 (+0200) Subject: x86: %riz, %rip, and %eip don't require REX X-Git-Tag: binutils-2_43~329 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8bcda53caab0308b5908dda68194ab5e3e2dd09d;p=thirdparty%2Fbinutils-gdb.git x86: %riz, %rip, and %eip don't require REX While these can't be used as register operands, they can be used for memory operand addressing. Such uses do not prevent conversion: The RegRex64 checks in check_Rex_required() for base and index registers were simply wrong. They specifically also aren't needed for byte registers, as those won't pass i386_index_check() anyway. --- diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index b8911c04436..e94b9370155 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -8683,8 +8683,8 @@ check_Rex_required (void) return true; } - if ((i.index_reg && (i.index_reg->reg_flags & (RegRex | RegRex64))) - || (i.base_reg && (i.base_reg->reg_flags & (RegRex | RegRex64)))) + if ((i.index_reg && (i.index_reg->reg_flags & RegRex)) + || (i.base_reg && (i.base_reg->reg_flags & RegRex))) return true; /* Check pseudo prefix {rex} are valid. */ diff --git a/gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.d b/gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.d index 8069799f7fb..762d78be727 100644 --- a/gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.d +++ b/gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.d @@ -127,10 +127,12 @@ Disassembly of section .text: \s*[a-f0-9]+:\s*62 74 3d 18 66 c0 adcx %eax,%r8d,%r8d \s*[a-f0-9]+:\s*62 d4 7d 18 66 c7 adcx %r15d,%eax,%eax \s*[a-f0-9]+:\s*67 66 0f 38 f6 04 0a adcx \(%edx,%ecx,1\),%eax +\s*[a-f0-9]+:\s*66 0f 38 f6 04 22 adcx \(%rdx,%riz,1\),%eax \s*[a-f0-9]+:\s*f3 0f 38 f6 c3 adox %ebx,%eax \s*[a-f0-9]+:\s*f3 0f 38 f6 c3 adox %ebx,%eax \s*[a-f0-9]+:\s*62 f4 fe 18 66 c3 adox %rbx,%rax,%rax \s*[a-f0-9]+:\s*62 74 3e 18 66 c0 adox %eax,%r8d,%r8d \s*[a-f0-9]+:\s*62 d4 7e 18 66 c7 adox %r15d,%eax,%eax \s*[a-f0-9]+:\s*67 f3 0f 38 f6 04 0a adox \(%edx,%ecx,1\),%eax +\s*[a-f0-9]+:\s*f3 0f 38 f6 05 00 00 00 00 adox (0x)?0\(%rip\),%eax[ ]+# .* sym.* #pass diff --git a/gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.s b/gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.s index c83e1195d05..bf75e64622d 100644 --- a/gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.s +++ b/gas/testsuite/gas/i386/x86-64-apx-ndd-optimize.s @@ -1,5 +1,6 @@ # Check 64bit APX NDD instructions with optimized encoding + .allow_index_reg .text _start: add %r31,%r8,%r8 @@ -120,9 +121,11 @@ adcx %rbx,%rax,%rax adcx %eax,%r8d,%r8d adcx %r15d,%eax,%eax adcx (%edx,%ecx,1),%eax,%eax +adcx (%rdx,%riz,1),%eax,%eax adox %ebx,%eax,%eax adox %eax,%ebx,%eax adox %rbx,%rax,%rax adox %eax,%r8d,%r8d adox %r15d,%eax,%eax adox (%edx,%ecx,1),%eax,%eax +adox sym(%rip),%eax,%eax