/* List of chars besides those in app.c:symbol_chars that can start an
operand. Used to prevent the scrubber eating vital white-space. */
-const char extra_symbol_chars[] = "*%-([{}"
+const char extra_symbol_chars[] = "*%-(["
#ifdef LEX_AT
"@"
#endif
/* All non-digit non-letter characters that may occur in an operand and
which aren't already in extra_symbol_chars[]. */
-static const char operand_special_chars[] = "$+,)._~/<>|&^!=:@]";
+static const char operand_special_chars[] = "$+,)._~/<>|&^!=:@]{}";
/* md_assemble() always leaves the strings it's passed unaltered. To
effect this we maintain a stack of saved characters that we've smashed
{
++mnem_p;
++l;
+ if (is_space_char (*l))
+ ++l;
}
else if (mode == parse_pseudo_prefix)
break;
l++;
}
/* Pseudo-prefixes end with a closing figure brace. */
+ if (*mnemonic == '{' && is_space_char (*l))
+ ++l;
if (*mnemonic == '{' && *l == '}')
{
*mnem_p++ = *l++;
if (*op_string == '{')
{
op_string++;
+ if (is_space_char (*op_string))
+ op_string++;
/* Check broadcasts. */
if (startswith (op_string, "1to"))
else
goto unknown_vec_op;
+ if (is_space_char (*op_string))
+ op_string++;
if (*op_string != '}')
{
as_bad (_("missing `}' in `%s'"), saved);
}
op_string++;
- /* Strip whitespace since the addition of pseudo prefixes
- changed how the scrubber treats '{'. */
if (is_space_char (*op_string))
++op_string;
if (*pstr != '{')
return 0;
- pstr = RC_SAE_specifier (pstr + 1);
+ pstr++;
+ if (is_space_char (*pstr))
+ pstr++;
+
+ pstr = RC_SAE_specifier (pstr);
if (pstr == NULL)
return 0;
+ if (is_space_char (*pstr))
+ pstr++;
+
if (*pstr++ != '}')
{
as_bad (_("Missing '}': '%s'"), imm_start);
--- /dev/null
+#objdump: -dw
+#name: i386 curly braces with blanks
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <curly>:
+[ ]*[a-f0-9]+: 62 f1 74 58 58 10 vaddps \(%eax\)\{1to16\},%zmm1,%zmm2
+[ ]*[a-f0-9]+: 62 f1 74 58 58 10 vaddps \(%eax\)\{1to16\},%zmm1,%zmm2
+[ ]*[a-f0-9]+: 62 f1 74 58 58 10 vaddps \(%eax\)\{1to16\},%zmm1,%zmm2
+[ ]*[a-f0-9]+: 62 f1 74 58 58 10 vaddps \(%eax\)\{1to16\},%zmm1,%zmm2
+[ ]*[a-f0-9]+: 62 f1 74 18 58 d0 vaddps \{rn-sae\},%zmm0,%zmm1,%zmm2
+[ ]*[a-f0-9]+: 62 f1 74 18 58 d0 vaddps \{rn-sae\},%zmm0,%zmm1,%zmm2
+[ ]*[a-f0-9]+: 62 f1 74 18 58 d0 vaddps \{rn-sae\},%zmm0,%zmm1,%zmm2
+[ ]*[a-f0-9]+: 62 f1 74 cb 58 d0 vaddps %zmm0,%zmm1,%zmm2\{%k3\}\{z\}
+[ ]*[a-f0-9]+: 62 f1 74 cb 58 d0 vaddps %zmm0,%zmm1,%zmm2\{%k3\}\{z\}
+[ ]*[a-f0-9]+: 62 f1 74 cb 58 d0 vaddps %zmm0,%zmm1,%zmm2\{%k3\}\{z\}
+[ ]*[a-f0-9]+: 62 f1 74 cb 58 d0 vaddps %zmm0,%zmm1,%zmm2\{%k3\}\{z\}
+[ ]*[a-f0-9]+: 62 f1 74 cb 58 d0 vaddps %zmm0,%zmm1,%zmm2\{%k3\}\{z\}
+[ ]*[a-f0-9]+: 62 f1 74 cb 58 d0 vaddps %zmm0,%zmm1,%zmm2\{%k3\}\{z\}
+[ ]*[a-f0-9]+: 62 f1 74 08 58 d0 \{evex\} vaddps %xmm0,%xmm1,%xmm2
+[ ]*[a-f0-9]+: 62 f1 74 08 58 d0 \{evex\} vaddps %xmm0,%xmm1,%xmm2
+[ ]*[a-f0-9]+: 62 f1 74 08 58 d0 \{evex\} vaddps %xmm0,%xmm1,%xmm2
+[ ]*[a-f0-9]+: 62 f1 74 18 58 c2 vaddps \{rn-sae\},%zmm2,%zmm1,%zmm0
+[ ]*[a-f0-9]+: 62 f1 74 18 58 c2 vaddps \{rn-sae\},%zmm2,%zmm1,%zmm0
+[ ]*[a-f0-9]+: 62 f1 74 18 58 c2 vaddps \{rn-sae\},%zmm2,%zmm1,%zmm0
+#pass
--- /dev/null
+ .text
+curly:
+ vaddps (%eax) {1to16}, %zmm1, %zmm2
+ vaddps (%eax){ 1to16}, %zmm1, %zmm2
+ vaddps (%eax){1to16 }, %zmm1, %zmm2
+ vaddps (%eax){1to16} , %zmm1, %zmm2
+
+ vaddps { rn-sae}, %zmm0, %zmm1, %zmm2
+ vaddps {rn-sae }, %zmm0, %zmm1, %zmm2
+ vaddps {rn-sae} , %zmm0, %zmm1, %zmm2
+
+ vaddps %zmm0, %zmm1, %zmm2 {%k3}{z}
+ vaddps %zmm0, %zmm1, %zmm2{ %k3}{z}
+ vaddps %zmm0, %zmm1, %zmm2{%k3 }{z}
+ vaddps %zmm0, %zmm1, %zmm2{%k3} {z}
+ vaddps %zmm0, %zmm1, %zmm2{%k3}{ z}
+ vaddps %zmm0, %zmm1, %zmm2{%k3}{z }
+
+ { evex} vaddps %xmm0, %xmm1, %xmm2
+ {evex } vaddps %xmm0, %xmm1, %xmm2
+ {evex}vaddps %xmm0, %xmm1, %xmm2
+
+ .intel_syntax noprefix
+ vaddps zmm0, zmm1, zmm2 {rn-sae}
+ vaddps zmm0, zmm1, zmm2{ rn-sae}
+ vaddps zmm0, zmm1, zmm2{rn-sae }
run_dump_test "equ"
run_list_test "equ-2" "-al"
run_list_test "equ-bad"
+ run_dump_test "curly"
run_dump_test "divide"
run_dump_test "quoted"
run_dump_test "quoted2"