summaryrefslogtreecommitdiff
path: root/gcc/config/i386/i386.c
diff options
context:
space:
mode:
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-22 18:40:21 +0000
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-22 18:40:21 +0000
commit27ddb23e10628bf0fa8ac05343bc854ad7aca56f (patch)
treeda8c0f39389f65b764a42962150bc6a5ea4609c3 /gcc/config/i386/i386.c
parente557fc7f73ea0b8206a8d126b43f82e7c5cc4979 (diff)
downloadgcc-27ddb23e10628bf0fa8ac05343bc854ad7aca56f.tar.gz
* config/i386/i386.c (ix86_expand_move): Simplify SYMBOL_REF handling.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@237716 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/i386/i386.c')
-rw-r--r--gcc/config/i386/i386.c70
1 files changed, 41 insertions, 29 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 1e872860fbc..02e678acda5 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -19393,50 +19393,62 @@ void
ix86_expand_move (machine_mode mode, rtx operands[])
{
rtx op0, op1;
+ rtx tmp, addend = NULL_RTX;
enum tls_model model;
op0 = operands[0];
op1 = operands[1];
- if (GET_CODE (op1) == SYMBOL_REF)
+ switch (GET_CODE (op1))
{
- rtx tmp;
+ case CONST:
+ tmp = XEXP (op1, 0);
+ if (GET_CODE (tmp) != PLUS
+ || GET_CODE (XEXP (tmp, 0)) != SYMBOL_REF)
+ break;
+
+ op1 = XEXP (tmp, 0);
+ addend = XEXP (tmp, 1);
+ /* FALLTHRU */
+
+ case SYMBOL_REF:
model = SYMBOL_REF_TLS_MODEL (op1);
- if (model)
- {
- op1 = legitimize_tls_address (op1, model, true);
- op1 = force_operand (op1, op0);
- if (op1 == op0)
- return;
- op1 = convert_to_mode (mode, op1, 1);
- }
- else if ((tmp = legitimize_pe_coff_symbol (op1, false)) != NULL_RTX)
- op1 = tmp;
- }
- else if (GET_CODE (op1) == CONST
- && GET_CODE (XEXP (op1, 0)) == PLUS
- && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
- {
- rtx addend = XEXP (XEXP (op1, 0), 1);
- rtx symbol = XEXP (XEXP (op1, 0), 0);
- rtx tmp;
- model = SYMBOL_REF_TLS_MODEL (symbol);
if (model)
- tmp = legitimize_tls_address (symbol, model, true);
+ op1 = legitimize_tls_address (op1, model, true);
else
- tmp = legitimize_pe_coff_symbol (symbol, true);
+ {
+ tmp = legitimize_pe_coff_symbol (op1, addend != NULL_RTX);
+ if (tmp)
+ {
+ op1 = tmp;
+ if (!addend)
+ break;
+ }
+ else
+ {
+ op1 = operands[1];
+ break;
+ }
+ }
- if (tmp)
+ if (addend)
{
- tmp = force_operand (tmp, NULL);
- tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
+ op1 = force_operand (op1, NULL_RTX);
+ op1 = expand_simple_binop (Pmode, PLUS, op1, addend,
op0, 1, OPTAB_DIRECT);
- if (tmp == op0)
- return;
- op1 = convert_to_mode (mode, tmp, 1);
}
+ else
+ op1 = force_operand (op1, op0);
+
+ if (op1 == op0)
+ return;
+
+ op1 = convert_to_mode (mode, op1, 1);
+
+ default:
+ break;
}
if ((flag_pic || MACHOPIC_INDIRECT)