diff options
author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-06-22 18:40:21 +0000 |
---|---|---|
committer | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-06-22 18:40:21 +0000 |
commit | 27ddb23e10628bf0fa8ac05343bc854ad7aca56f (patch) | |
tree | da8c0f39389f65b764a42962150bc6a5ea4609c3 /gcc/config/i386/i386.c | |
parent | e557fc7f73ea0b8206a8d126b43f82e7c5cc4979 (diff) | |
download | gcc-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.c | 70 |
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) |