From 1f3db5587569dd63cea3de29793f7bdd9024558e Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 29 May 2009 17:00:35 +0000 Subject: [PATCH] * config/i386/i386.c (ix86_decompose_address): Avoid useless 0 displacement. Add 0 displacement if base is %[er]bp or %r13. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147982 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 3 +++ gcc/config/i386/i386.c | 20 +++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 680e810ba17..08faa6a6897 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2009-05-29 Jakub Jelinek + * config/i386/i386.c (ix86_decompose_address): Avoid useless + 0 displacement. Add 0 displacement if base is %[er]bp or %r13. + * config/i386/i386.md (prefix_data16, prefix_rep): Set to 0 for TYPE_SSE{MULADD,4ARG,IADD1,CVT1} by default. (prefix_rex): For UNIT_MMX don't imply the prefix by default diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 26bb3006269..8a98334b01b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -8900,6 +8900,10 @@ ix86_decompose_address (rtx addr, struct ix86_address *out) base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base; index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index; + /* Avoid useless 0 displacement. */ + if (disp == const0_rtx && (base || index)) + disp = NULL_RTX; + /* Allow arg pointer and stack pointer as index if there is not scaling. */ if (base_reg && index_reg && scale == 1 && (index_reg == arg_pointer_rtx @@ -8911,10 +8915,16 @@ ix86_decompose_address (rtx addr, struct ix86_address *out) tmp = base_reg, base_reg = index_reg, index_reg = tmp; } - /* Special case: %ebp cannot be encoded as a base without a displacement. */ - if ((base_reg == hard_frame_pointer_rtx - || base_reg == frame_pointer_rtx - || base_reg == arg_pointer_rtx) && !disp) + /* Special case: %ebp cannot be encoded as a base without a displacement. + Similarly %r13. */ + if (!disp + && base_reg + && (base_reg == hard_frame_pointer_rtx + || base_reg == frame_pointer_rtx + || base_reg == arg_pointer_rtx + || (REG_P (base_reg) + && (REGNO (base_reg) == HARD_FRAME_POINTER_REGNUM + || REGNO (base_reg) == R13_REG)))) disp = const0_rtx; /* Special case: on K6, [%esi] makes the instruction vector decoded. @@ -8928,7 +8938,7 @@ ix86_decompose_address (rtx addr, struct ix86_address *out) disp = const0_rtx; /* Special case: encode reg+reg instead of reg*2. */ - if (!base && index && scale && scale == 2) + if (!base && index && scale == 2) base = index, base_reg = index_reg, scale = 1; /* Special case: scaling cannot be encoded without base or displacement. */ -- 2.11.0