Index: gcc/config/i386/i386.md |
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md |
index 8dc1bdde0c8f1285b4ac072bceec79f67f0c0fe5..08211e76377a70e2ddd318702e08fbafb856681c 100644 |
--- a/gcc/config/i386/i386.md |
+++ b/gcc/config/i386/i386.md |
@@ -2415,6 +2415,30 @@ |
return "#"; |
case TYPE_LEA: |
+ if (TARGET_NACL) |
eaeltsin
2012/05/11 12:33:31
As this check is used twice, can you please move i
|
+ { |
+ struct ix86_address parts; |
+ rtx symbol = NULL; |
+ int ok; |
+ |
+ ok = ix86_lea_decompose_address (operands[1], &parts); |
+ gcc_assert (ok); |
+ |
+ if (!parts.base && !parts.index) |
+ { |
+ symbol = parts.disp; |
+ if (GET_CODE (symbol) == CONST |
+ && GET_CODE (XEXP (symbol, 0)) == PLUS |
+ && CONST_INT_P (XEXP (XEXP (symbol, 0), 1))) |
+ symbol = XEXP (XEXP (symbol, 0), 0); |
+ } |
+ if ((parts.base && |
+ (REGNO (parts.base) == SP_REG || REGNO (parts.base) == BP_REG)) || |
+ (symbol && |
+ (GET_CODE (symbol) == SYMBOL_REF || |
+ GET_CODE (symbol) == LABEL_REF))) |
+ return "lea{l}\t{%a1, %k0|%k0, %a1}"; |
+ } |
return "lea{q}\t{%a1, %0|%0, %a1}"; |
default: |
@@ -6011,16 +6035,26 @@ |
if (TARGET_NACL) |
{ |
struct ix86_address parts; |
+ rtx symbol = NULL; |
int ok; |
ok = ix86_lea_decompose_address (operands[1], &parts); |
gcc_assert (ok); |
- if (parts.base) |
+ if (!parts.base && !parts.index) |
{ |
- if (REGNO (parts.base) == SP_REG || REGNO (parts.base) == BP_REG) |
- return "lea{l}\t{%Z1, %k0|%k0, %Z1}"; |
+ symbol = parts.disp; |
+ if (GET_CODE (symbol) == CONST |
+ && GET_CODE (XEXP (symbol, 0)) == PLUS |
+ && CONST_INT_P (XEXP (XEXP (symbol, 0), 1))) |
+ symbol = XEXP (XEXP (symbol, 0), 0); |
} |
+ if ((parts.base && |
+ (REGNO (parts.base) == SP_REG || REGNO (parts.base) == BP_REG)) || |
+ (symbol && |
+ (GET_CODE (symbol) == SYMBOL_REF || |
+ GET_CODE (symbol) == LABEL_REF))) |
+ return "lea{l}\t{%Z1, %k0|%k0, %Z1}"; |
} |
return "lea{q}\t{%Z1, %0|%0, %Z1}"; |
} |