aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2023-07-04 17:05:47 +0200
committerJan Beulich <jbeulich@suse.com>2023-07-04 17:05:47 +0200
commitb7bd93bc51c49c58d0e9cdddf6b4cc44bc4c76dd (patch)
tree632b15140fa5c8a3af68a87cdc35368f8f8fe9b5 /gas/config
parent151da91724c50b9c501b4b89857e675bc2dd8b52 (diff)
downloadgdb-b7bd93bc51c49c58d0e9cdddf6b4cc44bc4c76dd.zip
gdb-b7bd93bc51c49c58d0e9cdddf6b4cc44bc4c76dd.tar.gz
gdb-b7bd93bc51c49c58d0e9cdddf6b4cc44bc4c76dd.tar.bz2
x86: optimize pre-AVX512 {,V}PCMPEQQ with identical sources
The {,V}PCMPEQD alternative is 1 byte shorter in many cases.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/tc-i386.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index de35ee2..eb3f128 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -4563,6 +4563,23 @@ optimize_encoding (void)
i.types[j].bitfield.disp8
= fits_in_disp8 (i.op[j].disps->X_add_number);
}
+ else if (optimize_for_space
+ && i.tm.base_opcode == 0x29
+ && i.tm.opcode_space == SPACE_0F38
+ && i.operands == i.reg_operands
+ && i.op[0].regs == i.op[1].regs
+ && (!i.tm.opcode_modifier.vex
+ || !(i.op[0].regs->reg_flags & RegRex))
+ && !is_evex_encoding (&i.tm))
+ {
+ /* Optimize: -Os:
+ pcmpeqq %xmmN, %xmmN -> pcmpeqd %xmmN, %xmmN
+ vpcmpeqq %xmmN, %xmmN, %xmmM -> vpcmpeqd %xmmN, %xmmN, %xmmM (N < 8)
+ vpcmpeqq %ymmN, %ymmN, %ymmM -> vpcmpeqd %ymmN, %ymmN, %ymmM (N < 8)
+ */
+ i.tm.opcode_space = SPACE_0F;
+ i.tm.base_opcode = 0x76;
+ }
}
/* Return non-zero for load instruction. */