diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2024-08-12 08:43:21 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2024-08-12 10:42:02 -0700 |
commit | 87582defe75340e0003d4700568322379e9bc9f6 (patch) | |
tree | 075b5b18912666f9c0955884de736544a6f5c7cb /gas | |
parent | 65d41fb015af0048347a25d0665bb1263eb982b0 (diff) | |
download | gdb-87582defe75340e0003d4700568322379e9bc9f6.zip gdb-87582defe75340e0003d4700568322379e9bc9f6.tar.gz gdb-87582defe75340e0003d4700568322379e9bc9f6.tar.bz2 |
Revert "gas: have scrubber retain more whitespace"
This reverts commit 6ae8a30d44f016cafb46a75843b5109316eb1996.
This fixes PR gas/32073.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/NEWS | 7 | ||||
-rw-r--r-- | gas/app.c | 171 | ||||
-rw-r--r-- | gas/config/tc-aarch64.c | 19 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 2 | ||||
-rw-r--r-- | gas/config/tc-crx.c | 6 | ||||
-rw-r--r-- | gas/config/tc-csky.c | 23 | ||||
-rw-r--r-- | gas/config/tc-pru.c | 10 | ||||
-rw-r--r-- | gas/config/tc-sparc.c | 48 | ||||
-rw-r--r-- | gas/config/tc-v850.c | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/all/macro.l | 10 | ||||
-rw-r--r-- | gas/testsuite/gas/all/macro.s | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/x86-64-apx-nf.s | 40 |
12 files changed, 171 insertions, 173 deletions
@@ -2,13 +2,6 @@ * Add support for RISC-V CORE-V extension (XCvBitmanip) with version 1.0. -* The scrubber (pre-processor) now leaves in place more whitespace, to permit - various constructs not fitting the basic "insn opnd1,opnd2[,...]" scheme to - work. This, however, means that macro invocations like "m 1 + 2", i.e. not - using double quotes or parentheses around the (apparently) sole argument, - will now be treated as passing three arguments. Such lack of quotation / - parenthesization was never reliable to use. - Changes in 2.43: * Add support for LoongArch .option for fine-grained control of assembly @@ -467,18 +467,16 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, /*State 0: beginning of normal line 1: After first whitespace on line (flush more white) - 2: After first non-white (opcode or maybe label when they're followed - by colons) on line (keep 1white) - 3: after subsequent white on line (typically into operands) - (flush more white) + 2: After first non-white (opcode) on line (keep 1white) + 3: after second white on line (into operands) (flush white) 4: after putting out a .linefile, put out digits 5: parsing a string, then go to old-state 6: putting out \ escape in a "d string. 7: no longer used 8: no longer used - 9: After seeing non-white in state 3 (keep 1white) - 10: no longer used - 11: After seeing a non-white character in state 0 (eg a label definition) + 9: After seeing symbol char in state 3 (keep 1white after symchar) + 10: After seeing whitespace in state 9 (keep white before symchar) + 11: After seeing a symbol character in state 0 (eg a label definition) -1: output string in out_string and go to the state in old_state 12: no longer used #ifdef DOUBLEBAR_PARALLEL @@ -941,11 +939,7 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, && (state < 1 || strchr (tc_comment_chars, ch))) || IS_NEWLINE (ch) || IS_LINE_SEPARATOR (ch) - || IS_PARALLEL_SEPARATOR (ch) - /* See comma related comment near the bottom of the function. - Reasoning equally applies to whitespace preceding a comma in - most cases. */ - || (ch == ',' && state > 2 && state != 11)) + || IS_PARALLEL_SEPARATOR (ch)) { if (scrub_m68k_mri) { @@ -988,7 +982,6 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, character at the beginning of a line. */ goto recycle; case 2: - case 9: state = 3; if (to + 1 < toend) { @@ -1012,6 +1005,20 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, break; } goto recycle; /* Sp in operands */ + case 9: + case 10: +#ifndef TC_KEEP_OPERAND_SPACES + if (scrub_m68k_mri) +#endif + { + /* In MRI mode, we keep these spaces. */ + state = 3; + UNGET (ch); + PUT (' '); + break; + } + state = 10; /* Sp after symbol char */ + goto recycle; case 11: if (LABELS_WITHOUT_COLONS || flag_m68k_mri) state = 1; @@ -1082,17 +1089,27 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, { if (ch2 != EOF) UNGET (ch2); - if (state == 1) - state = 2; - else if (state == 3) - state = 9; + if (state == 9 || state == 10) + state = 3; PUT (ch); } break; case LEX_IS_STRINGQUOTE: quotechar = ch; - if (state == 3) + if (state == 10) + { + /* Preserve the whitespace in foo "bar". */ + UNGET (ch); + state = 3; + PUT (' '); + + /* PUT didn't jump out. We could just break, but we + know what will happen, so optimize a bit. */ + ch = GET (); + old_state = 9; + } + else if (state == 3) old_state = 9; else if (state == 0) old_state = 11; /* Now seeing label definition. */ @@ -1113,6 +1130,14 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, UNGET (c); } #endif + if (state == 10) + { + /* Preserve the whitespace in foo 'b'. */ + UNGET (ch); + state = 3; + PUT (' '); + break; + } ch = GET (); if (ch == EOF) { @@ -1147,7 +1172,10 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, PUT (out_buf[0]); break; } - old_state = state; + if (state == 9) + old_state = 3; + else + old_state = state; state = -1; out_string = out_buf; PUT (*out_string++); @@ -1157,10 +1185,10 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, #ifdef KEEP_WHITE_AROUND_COLON state = 9; #else - if (state == 2 || state == 11) + if (state == 9 || state == 10) + state = 3; + else if (state != 3) state = 1; - else - state = 9; #endif PUT (ch); break; @@ -1285,6 +1313,20 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, break; } +#ifdef TC_D10V + /* All insns end in a char for which LEX_IS_SYMBOL_COMPONENT is true. + Trap is the only short insn that has a first operand that is + neither register nor label. + We must prevent exef0f ||trap #1 to degenerate to exef0f ||trap#1 . + We can't make '#' LEX_IS_SYMBOL_COMPONENT because it is + already LEX_IS_LINE_COMMENT_START. However, it is the + only character in line_comment_chars for d10v, hence we + can recognize it as such. */ + /* An alternative approach would be to reset the state to 1 when + we see '||', '<'- or '->', but that seems to be overkill. */ + if (state == 10) + PUT (' '); +#endif /* We have a line comment character which is not at the start of a line. If this is also a normal comment character, fall through. Otherwise treat it as a default @@ -1348,6 +1390,17 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, /* Fall through. */ case LEX_IS_SYMBOL_COMPONENT: + if (state == 10) + { + /* This is a symbol character following another symbol + character, with whitespace in between. We skipped + the whitespace earlier, so output it now. */ + UNGET (ch); + state = 3; + PUT (' '); + break; + } + #ifdef TC_Z80 /* "af'" is a symbol containing '\''. */ if (state == 3 && (ch == 'a' || ch == 'A')) @@ -1373,16 +1426,7 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, } } #endif - - /* Fall through. */ - default: - de_fault: - /* Some relatively `normal' character. */ - if (state == 0) - state = 11; /* Now seeing label definition. */ - else if (state == 1) - state = 2; /* Ditto. */ - else if (state == 3) + if (state == 3) state = 9; /* This is a common case. Quickly copy CH and all the @@ -1392,10 +1436,6 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, #if defined TC_ARM && defined OBJ_ELF && symver_state == NULL #endif -#ifdef TC_Z80 - /* See comma related comment below. */ - && ch != ',' -#endif ) { char *s; @@ -1410,12 +1450,6 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, if (type != 0 && type != LEX_IS_SYMBOL_COMPONENT) break; -#ifdef TC_Z80 - /* Need to split at commas, to be able to enter state 16 - when needed. */ - if (ch2 == ',') - break; -#endif } if (s > from) @@ -1440,15 +1474,52 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, } } - /* As a special case, to limit the delta to previous behavior, e.g. - also affecting listings, go straight to state 3 when seeing a - comma. Commas are special: While they can be used to separate - macro parameters or arguments, they cannot (on their own, i.e. - without quoting) be arguments (or parameter default values). - Hence successive whitespace is not meaningful there. */ - if (ch == ',' && state == 9) - state = 3; + /* Fall through. */ + default: + de_fault: + /* Some relatively `normal' character. */ + if (state == 0) + { + state = 11; /* Now seeing label definition. */ + } + else if (state == 1) + { + state = 2; /* Ditto. */ + } + else if (state == 9) + { + if (!IS_SYMBOL_COMPONENT (ch)) + state = 3; + } + else if (state == 10) + { + if (ch == '\\') + { + /* Special handling for backslash: a backslash may + be the beginning of a formal parameter (of a + macro) following another symbol character, with + whitespace in between. If that is the case, we + output a space before the parameter. Strictly + speaking, correct handling depends upon what the + macro parameter expands into; if the parameter + expands into something which does not start with + an operand character, then we don't want to keep + the space. We don't have enough information to + make the right choice, so here we are making the + choice which is more likely to be correct. */ + if (to + 1 >= toend) + { + /* If we're near the end of the buffer, save the + character for the next time round. Otherwise + we'll lose our state. */ + UNGET (ch); + goto tofull; + } + *to++ = ' '; + } + state = 3; + } PUT (ch); break; } diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index c6ac66b..e94a0cf 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -643,7 +643,6 @@ const char FLT_CHARS[] = "rRsSfFdDxXeEpPhHb"; static inline bool skip_past_char (char **str, char c) { - skip_whitespace (*str); if (**str == c) { (*str)++; @@ -894,7 +893,6 @@ parse_reg (char **ccp) start++; #endif - skip_whitespace (start); p = start; if (!ISALPHA (*p) || !is_name_beginner (*p)) return NULL; @@ -1204,17 +1202,13 @@ parse_typed_reg (char **ccp, aarch64_reg_type type, struct vector_type_el *typeinfo, unsigned int flags) { char *str = *ccp; - bool is_alpha; - const reg_entry *reg; + bool is_alpha = ISALPHA (*str); + const reg_entry *reg = parse_reg (&str); struct vector_type_el atype; struct vector_type_el parsetype; bool is_typed_vecreg = false; unsigned int err_flags = (flags & PTR_IN_REGLIST) ? SEF_IN_REGLIST : 0; - skip_whitespace (str); - is_alpha = ISALPHA (*str); - reg = parse_reg (&str); - atype.defined = 0; atype.type = NT_invtype; atype.width = -1; @@ -1435,7 +1429,10 @@ parse_vector_reg_list (char **ccp, aarch64_reg_type type, do { if (in_range) - val_range = val; + { + str++; /* skip over '-' */ + val_range = val; + } const reg_entry *reg; if (has_qualifier) @@ -1497,8 +1494,7 @@ parse_vector_reg_list (char **ccp, aarch64_reg_type type, in_range = 0; ptr_flags |= PTR_GOOD_MATCH; } - while (skip_past_comma (&str) - || (in_range = 1, skip_past_char (&str, '-'))); + while (skip_past_comma (&str) || (in_range = 1, *str == '-')); skip_whitespace (str); if (*str != '}') @@ -8293,7 +8289,6 @@ parse_operands (char *str, const aarch64_opcode *opcode) } /* Check if we have parsed all the operands. */ - skip_whitespace (str); if (*str != '\0' && ! error_p ()) { /* Set I to the index of the last present operand; this is diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 14d7295..540ab48 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -1148,8 +1148,6 @@ my_get_expression (expressionS * ep, char ** str, int prefix_mode) prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode : GE_OPT_PREFIX; - skip_whitespace (*str); - switch (prefix_mode) { case GE_NO_PREFIX: break; diff --git a/gas/config/tc-crx.c b/gas/config/tc-crx.c index 4673c94..3a47354 100644 --- a/gas/config/tc-crx.c +++ b/gas/config/tc-crx.c @@ -1723,12 +1723,8 @@ preprocess_reglist (char *param, int *allocated) while (*paramP != '}') { - memset (®_name, '\0', sizeof (reg_name)); - - while (ISSPACE (*paramP)) - paramP++; - regP = paramP; + memset (®_name, '\0', sizeof (reg_name)); while (ISALNUM (*paramP)) paramP++; diff --git a/gas/config/tc-csky.c b/gas/config/tc-csky.c index 0eb1805..0dc8bfd 100644 --- a/gas/config/tc-csky.c +++ b/gas/config/tc-csky.c @@ -2409,18 +2409,10 @@ parse_rt (char *s, /* Indicate nothing there. */ ep->X_op = O_absent; - /* Skip whitespace. */ - while (ISSPACE (*s)) - ++s; - if (*s == '[') { s = parse_exp (s + 1, &e); - /* Skip whitespace. */ - while (ISSPACE (*s)) - ++s; - if (*s == ']') s++; else @@ -2943,11 +2935,6 @@ is_reg_lshift_illegal (char **oper, int is_float) } *oper += len; - - /* Skip whitespace. */ - while (ISSPACE (**oper)) - ++*oper; - if ((*oper)[0] != '<' || (*oper)[1] != '<') { SET_ERROR_STRING (ERROR_UNDEFINE, @@ -3474,9 +3461,6 @@ get_operand_value (struct csky_opcode_info *op, return false; } - while (ISSPACE (**oper)) - ++*oper; - if (!get_operand_value (op, oper, &soprnd->subs[0])) { *s = rc; @@ -3497,7 +3481,7 @@ get_operand_value (struct csky_opcode_info *op, } *s = rc; - *oper = s + 1; + *oper += 1; return true; } @@ -4293,16 +4277,11 @@ get_operand_value (struct csky_opcode_info *op, case OPRND_TYPE_VREG_WITH_INDEX: if (parse_type_freg (oper, 0)) { - /* Skip whitespace. */ - while (ISSPACE (**oper)) - ++*oper; if (**oper == '[') { (*oper)++; if (is_imm_within_range (oper, 0, 0xf)) { - while (ISSPACE (**oper)) - ++*oper; if (**oper == ']') { unsigned int idx = --csky_insn.idx; diff --git a/gas/config/tc-pru.c b/gas/config/tc-pru.c index 6789686..99a3c1e 100644 --- a/gas/config/tc-pru.c +++ b/gas/config/tc-pru.c @@ -1399,6 +1399,7 @@ pru_parse_args (pru_insn_infoS *insn ATTRIBUTE_UNUSED, char *argstr, const char *parsestr, char **parsed_args) { char *p; + char *end = NULL; int i; p = argstr; i = 0; @@ -1425,7 +1426,14 @@ pru_parse_args (pru_insn_infoS *insn ATTRIBUTE_UNUSED, char *argstr, else { /* Check that the argument string has no trailing arguments. */ - if (strpbrk (p, ",") != NULL) + /* If we've got a %pmem relocation, we've zapped the parens with + spaces. */ + if (strprefix (p, "%pmem") || strprefix (p, "%label")) + end = strpbrk (p, ","); + else + end = strpbrk (p, " ,"); + + if (end != NULL) as_bad (_("too many arguments")); } diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c index d78aa0e..e37189e 100644 --- a/gas/config/tc-sparc.c +++ b/gas/config/tc-sparc.c @@ -1778,9 +1778,6 @@ sparc_ip (char *str, const struct sparc_opcode **pinsn) operands match. */ for (args = insn->args;; ++args) { - if (*s == ' ' && *args != ' ') - ++s; - switch (*args) { case 'K': @@ -2721,6 +2718,11 @@ sparc_ip (char *str, const struct sparc_opcode **pinsn) 'symbols' in the input string. Try not to create U symbols for registers, etc. */ + /* This stuff checks to see if the expression ends in + +%reg. If it does, it removes the register from + the expression, and re-sets 's' to point to the + right place. */ + if (op_arg) { int npar = 0; @@ -2750,8 +2752,6 @@ sparc_ip (char *str, const struct sparc_opcode **pinsn) return special_case; } s = s1 + 1; - if (*s == ' ') - s++; if (*s == ',' || *s == ']' || !*s) continue; if (*s != '+' && *s != '-') @@ -2765,45 +2765,17 @@ sparc_ip (char *str, const struct sparc_opcode **pinsn) memset (&the_insn.exp, 0, sizeof (the_insn.exp)); } - /* This stuff checks to see if the expression ends in - +%reg. If it does, it removes the register from - the expression, and re-sets 's' to point to the - right place. */ - for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++) ; - if (s1 != s && s1[-1] == ' ') - --s1; if (s1 != s && ISDIGIT (s1[-1])) { if (s1[-2] == '%' && s1[-3] == '+') - { - if (s1[-3] == '+') - s1 -= 3; - else if (s1[-3] == ' ' && s1[-4] == '+') - s1 -= 4; - else - s1 = NULL; - } - else if (strchr ("golir0123456789", s1[-2]) && s1[-3] == '%') - { - if (s1[-4] == '+') - s1 -= 4; - else if (s1[-4] == ' ' && s1[-5] == '+') - s1 -= 5; - else - s1 = NULL; - } - else if (s1[-3] == 'r' && s1[-4] == '%') - { - if (s1[-5] == '+') - s1 -= 5; - else if (s1[-5] == ' ' && s1[-6] == '+') - s1 -= 6; - else - s1 = NULL; - } + s1 -= 3; + else if (strchr ("golir0123456789", s1[-2]) && s1[-3] == '%' && s1[-4] == '+') + s1 -= 4; + else if (s1[-3] == 'r' && s1[-4] == '%' && s1[-5] == '+') + s1 -= 5; else s1 = NULL; if (s1) diff --git a/gas/config/tc-v850.c b/gas/config/tc-v850.c index 63b69a7..cb518a7 100644 --- a/gas/config/tc-v850.c +++ b/gas/config/tc-v850.c @@ -1456,8 +1456,6 @@ parse_register_list (unsigned long *insn, } } - skip_white_space (); - if (*input_line_pointer == '}') { input_line_pointer++; @@ -1477,8 +1475,6 @@ parse_register_list (unsigned long *insn, /* Skip the dash. */ ++input_line_pointer; - skip_white_space (); - /* Get the second register in the range. */ if (! register_name (&exp2)) { diff --git a/gas/testsuite/gas/all/macro.l b/gas/testsuite/gas/all/macro.l index c62d34d..75fe338 100644 --- a/gas/testsuite/gas/all/macro.l +++ b/gas/testsuite/gas/all/macro.l @@ -22,14 +22,4 @@ [ ]*[1-9][0-9]*[ ]+.... 0+70*[ ]+> .byte 7 [ ]*[1-9][0-9]*[ ]+.... 0+80*[ ]+> .byte 8 [ ]*[1-9][0-9]*[ ]+m[ ]+""[ ]+""[ ]+"" -[ ]*[1-9][0-9]*[ ]+ -[ ]*[1-9][0-9]*[ ]+m[ ]+1[ ]+\+2 -[ ]*[1-9][0-9]*[ ]+.... 0+10*[ ]+> .byte 1 -[ ]*[1-9][0-9]*[ ]+.... 0+20*[ ]+> .byte \+2 -[ ]*[1-9][0-9]*[ ]+m[ ]+\(3\)[ ]+\+4 -[ ]*[1-9][0-9]*[ ]+.... 0+30*[ ]+> .byte \(3\) -[ ]*[1-9][0-9]*[ ]+.... 0+40*[ ]+> .byte \+4 -[ ]*[1-9][0-9]*[ ]+m[ ]+\(5\)[ ]+\(6\) -[ ]*[1-9][0-9]*[ ]+.... 0+50*[ ]+> .byte \(5\) -[ ]*[1-9][0-9]*[ ]+.... 0+60*[ ]+> .byte \(6\) #pass diff --git a/gas/testsuite/gas/all/macro.s b/gas/testsuite/gas/all/macro.s index 109bcc5..9e70f30 100644 --- a/gas/testsuite/gas/all/macro.s +++ b/gas/testsuite/gas/all/macro.s @@ -9,8 +9,8 @@ m "7" "8" m "" "" "" + .if 0 m 1 +2 m (3) +4 m (5) (6) - - .byte -1 + .endif diff --git a/gas/testsuite/gas/i386/x86-64-apx-nf.s b/gas/testsuite/gas/i386/x86-64-apx-nf.s index 99ae1c7..fbd4cad 100644 --- a/gas/testsuite/gas/i386/x86-64-apx-nf.s +++ b/gas/testsuite/gas/i386/x86-64-apx-nf.s @@ -1390,13 +1390,13 @@ optimize: {nf} \op $128, %ecx, %edx {nf} \op $128, %r9 {nf} \op $128, %r9, %r31 - {nf} \op\(b) $128, (%rax) + {nf} \op\()b $128, (%rax) {nf} \op $128, (%rax), %bl - {nf} \op\(w) $128, (%rax) + {nf} \op\()w $128, (%rax) {nf} \op $128, (%rax), %dx - {nf} \op\(l) $128, (%rax) + {nf} \op\()l $128, (%rax) {nf} \op $128, (%rax), %ecx - {nf} \op\(q) $128, (%rax) + {nf} \op\()q $128, (%rax) {nf} \op $128, (%rax), %r9 {nf} \op $1, %bl @@ -1407,13 +1407,13 @@ optimize: {nf} \op $1, %ecx, %edx {nf} \op $1, %r9 {nf} \op $1, %r9, %r31 - {nf} \op\(b) $1, (%rax) + {nf} \op\()b $1, (%rax) {nf} \op $1, (%rax), %bl - {nf} \op\(w) $1, (%rax) + {nf} \op\()w $1, (%rax) {nf} \op $1, (%rax), %dx - {nf} \op\(l) $1, (%rax) + {nf} \op\()l $1, (%rax) {nf} \op $1, (%rax), %ecx - {nf} \op\(q) $1, (%rax) + {nf} \op\()q $1, (%rax) {nf} \op $1, (%rax), %r9 {nf} \op $0xff, %bl @@ -1424,13 +1424,13 @@ optimize: {nf} \op $-1, %ecx, %edx {nf} \op $-1, %r9 {nf} \op $-1, %r9, %r31 - {nf} \op\(b) $0xff, (%rax) + {nf} \op\()b $0xff, (%rax) {nf} \op $-1, (%rax), %bl - {nf} \op\(w) $0xffff, (%rax) + {nf} \op\()w $0xffff, (%rax) {nf} \op $-1, (%rax), %dx - {nf} \op\(l) $0xffffffff, (%rax) + {nf} \op\()l $0xffffffff, (%rax) {nf} \op $-1, (%rax), %ecx - {nf} \op\(q) $-1, (%rax) + {nf} \op\()q $-1, (%rax) {nf} \op $-1, (%rax), %r9 .endr @@ -1444,13 +1444,13 @@ optimize: {nf} ro\dir $63, %rdx {nf} ro\dir $63, %rdx, %rax - {nf} ro\dir\(b) $7, (%rdx) + {nf} ro\dir\()b $7, (%rdx) {nf} ro\dir $7, (%rdx), %al - {nf} ro\dir\(w) $15, (%rdx) + {nf} ro\dir\()w $15, (%rdx) {nf} ro\dir $15, (%rdx), %ax - {nf} ro\dir\(l) $31, (%rdx) + {nf} ro\dir\()l $31, (%rdx) {nf} ro\dir $31, (%rdx), %eax - {nf} ro\dir\(q) $63, (%rdx) + {nf} ro\dir\()q $63, (%rdx) {nf} ro\dir $63, (%rdx), %rax .endr @@ -1476,10 +1476,10 @@ optimize: # Note: 2-6 want leaving alone with -Os. .irp n, 1, 2, 6, 7 # Note: 16-bit 3-operand src!=dst non-ZU form needs leaving alone. - {nf} imul $1<<\n, %\r\(dx), %\r\(cx) - {nf} imul $1<<\n, (%rdx), %\r\(cx) - {nf} imul $1<<\n, %\r\(cx), %\r\(cx) - {nf} imul $1<<\n, %\r\(cx) + {nf} imul $1<<\n, %\r\()dx, %\r\()cx + {nf} imul $1<<\n, (%rdx), %\r\()cx + {nf} imul $1<<\n, %\r\()cx, %\r\()cx + {nf} imul $1<<\n, %\r\()cx .ifeqs "\r","" {nf} imulzu $1<<\n, %dx, %cx |