summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/config/tc-i386.c31
-rw-r--r--gas/testsuite/gas/i386/sib-intel.d4
-rw-r--r--gas/testsuite/gas/i386/sib.d4
-rw-r--r--gas/testsuite/gas/i386/sib.s8
4 files changed, 35 insertions, 12 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 3435cb5699d..6d04e8361a9 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -11589,25 +11589,32 @@ i386_att_operand (char *operand_string)
if (*base_string == ')')
{
char *temp_string;
- unsigned int parens_not_balanced = 1;
+ unsigned int parens_not_balanced = 0;
+ bool in_quotes = false;
/* We've already checked that the number of left & right ()'s are
- equal, so this loop will not be infinite. */
- do
- {
- base_string--;
- if (*base_string == ')')
- parens_not_balanced++;
- if (*base_string == '(')
- parens_not_balanced--;
+ equal, and that there's a matching set of double quotes. */
+ end_op = base_string;
+ for (temp_string = op_string; temp_string < end_op; temp_string++)
+ {
+ if (*temp_string == '\\' && temp_string[1] == '"')
+ ++temp_string;
+ else if (*temp_string == '"')
+ in_quotes = !in_quotes;
+ else if (!in_quotes)
+ {
+ if (*temp_string == '(' && !parens_not_balanced++)
+ base_string = temp_string;
+ if (*temp_string == ')')
+ --parens_not_balanced;
+ }
}
- while (parens_not_balanced && *base_string != '"');
temp_string = base_string;
/* Skip past '(' and whitespace. */
- if (*base_string == '(')
- ++base_string;
+ gas_assert (*base_string == '(');
+ ++base_string;
if (is_space_char (*base_string))
++base_string;
diff --git a/gas/testsuite/gas/i386/sib-intel.d b/gas/testsuite/gas/i386/sib-intel.d
index ccd2ea9643e..0688a5f3baa 100644
--- a/gas/testsuite/gas/i386/sib-intel.d
+++ b/gas/testsuite/gas/i386/sib-intel.d
@@ -34,6 +34,10 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 8b 04 40 mov eax,DWORD PTR \[eax\+eax\*2\]
[ ]*[a-f0-9]+: 8b 04 80 mov eax,DWORD PTR \[eax\+eax\*4\]
[ ]*[a-f0-9]+: 8b 04 c0 mov eax,DWORD PTR \[eax\+eax\*8\]
+[ ]*[a-f0-9]+: 8b 14 08 mov edx,DWORD PTR \[eax\+ecx\*1\]
+[ ]*[a-f0-9]+: 8b 14 48 mov edx,DWORD PTR \[eax\+ecx\*2\]
+[ ]*[a-f0-9]+: 8b 14 88 mov edx,DWORD PTR \[eax\+ecx\*4\]
+[ ]*[a-f0-9]+: 8b 14 c8 mov edx,DWORD PTR \[eax\+ecx\*8\]
[ ]*[a-f0-9]+: 8b 04 25 e2 ff ff ff mov eax,DWORD PTR \[eiz\*1-0x1e\]
[ ]*[a-f0-9]+: 8b 04 65 e2 ff ff ff mov eax,DWORD PTR \[eiz\*2-0x1e\]
[ ]*[a-f0-9]+: 8b 04 a5 e2 ff ff ff mov eax,DWORD PTR \[eiz\*4-0x1e\]
diff --git a/gas/testsuite/gas/i386/sib.d b/gas/testsuite/gas/i386/sib.d
index 151935c62ec..f578d3db276 100644
--- a/gas/testsuite/gas/i386/sib.d
+++ b/gas/testsuite/gas/i386/sib.d
@@ -33,6 +33,10 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 8b 04 40 mov \(%eax,%eax,2\),%eax
[ ]*[a-f0-9]+: 8b 04 80 mov \(%eax,%eax,4\),%eax
[ ]*[a-f0-9]+: 8b 04 c0 mov \(%eax,%eax,8\),%eax
+[ ]*[a-f0-9]+: 8b 14 08 mov \(%eax,%ecx,1\),%edx
+[ ]*[a-f0-9]+: 8b 14 48 mov \(%eax,%ecx,2\),%edx
+[ ]*[a-f0-9]+: 8b 14 88 mov \(%eax,%ecx,4\),%edx
+[ ]*[a-f0-9]+: 8b 14 c8 mov \(%eax,%ecx,8\),%edx
[ ]*[a-f0-9]+: 8b 04 25 e2 ff ff ff mov -0x1e\(,%eiz,1\),%eax
[ ]*[a-f0-9]+: 8b 04 65 e2 ff ff ff mov -0x1e\(,%eiz,2\),%eax
[ ]*[a-f0-9]+: 8b 04 a5 e2 ff ff ff mov -0x1e\(,%eiz,4\),%eax
diff --git a/gas/testsuite/gas/i386/sib.s b/gas/testsuite/gas/i386/sib.s
index c0e007f3108..16afb00b91d 100644
--- a/gas/testsuite/gas/i386/sib.s
+++ b/gas/testsuite/gas/i386/sib.s
@@ -30,6 +30,14 @@ foo:
mov (%eax, %eax, (1 << 1)), %eax
mov (%eax, %eax, (1 << 2)), %eax
mov (%eax, %eax, (1 << 3)), %eax
+ .equ "scale(1)", 1
+ mov (%eax, %ecx, "scale(1)"), %edx
+ .equiv "scale[2]", 2
+ mov (%eax, %ecx, "scale[2]"), %edx
+ .eqv "scale{4}", 4
+ mov (%eax, %ecx, "scale{4}"), %edx
+ .set "scale<8>", 8
+ mov (%eax, %ecx, "scale<8>"), %edx
.intel_syntax noprefix
mov eax,DWORD PTR [eiz*1-30]
mov eax,DWORD PTR [eiz*2-30]