diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-i386.c | 31 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/sib-intel.d | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/sib.d | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/sib.s | 8 |
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] |