diff options
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, 173 insertions, 171 deletions
@@ -2,6 +2,13 @@ * 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,16 +467,18 @@ 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) on line (keep 1white) - 3: after second white on line (into operands) (flush 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) 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 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) + 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) -1: output string in out_string and go to the state in old_state 12: no longer used #ifdef DOUBLEBAR_PARALLEL @@ -939,7 +941,11 @@ 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)) + || 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)) { if (scrub_m68k_mri) { @@ -982,6 +988,7 @@ 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) { @@ -1005,20 +1012,6 @@ 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; @@ -1089,27 +1082,17 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, { if (ch2 != EOF) UNGET (ch2); - if (state == 9 || state == 10) - state = 3; + if (state == 1) + state = 2; + else if (state == 3) + state = 9; PUT (ch); } break; case LEX_IS_STRINGQUOTE: quotechar = ch; - 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) + if (state == 3) old_state = 9; else if (state == 0) old_state = 11; /* Now seeing label definition. */ @@ -1130,14 +1113,6 @@ 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) { @@ -1172,10 +1147,7 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, PUT (out_buf[0]); break; } - if (state == 9) - old_state = 3; - else - old_state = state; + old_state = state; state = -1; out_string = out_buf; PUT (*out_string++); @@ -1185,10 +1157,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 == 9 || state == 10) - state = 3; - else if (state != 3) + if (state == 2 || state == 11) state = 1; + else + state = 9; #endif PUT (ch); break; @@ -1313,20 +1285,6 @@ 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 @@ -1390,17 +1348,6 @@ 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')) @@ -1426,7 +1373,16 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, } } #endif - if (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 == 3) state = 9; /* This is a common case. Quickly copy CH and all the @@ -1436,6 +1392,10 @@ 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; @@ -1450,6 +1410,12 @@ 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) @@ -1474,52 +1440,15 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen, } } - /* 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++ = ' '; - } + /* 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; - state = 3; - } PUT (ch); break; } diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index e94a0cf..c6ac66b 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -643,6 +643,7 @@ const char FLT_CHARS[] = "rRsSfFdDxXeEpPhHb"; static inline bool skip_past_char (char **str, char c) { + skip_whitespace (*str); if (**str == c) { (*str)++; @@ -893,6 +894,7 @@ parse_reg (char **ccp) start++; #endif + skip_whitespace (start); p = start; if (!ISALPHA (*p) || !is_name_beginner (*p)) return NULL; @@ -1202,13 +1204,17 @@ parse_typed_reg (char **ccp, aarch64_reg_type type, struct vector_type_el *typeinfo, unsigned int flags) { char *str = *ccp; - bool is_alpha = ISALPHA (*str); - const reg_entry *reg = parse_reg (&str); + bool is_alpha; + const reg_entry *reg; 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; @@ -1429,10 +1435,7 @@ parse_vector_reg_list (char **ccp, aarch64_reg_type type, do { if (in_range) - { - str++; /* skip over '-' */ - val_range = val; - } + val_range = val; const reg_entry *reg; if (has_qualifier) @@ -1494,7 +1497,8 @@ 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, *str == '-')); + while (skip_past_comma (&str) + || (in_range = 1, skip_past_char (&str, '-'))); skip_whitespace (str); if (*str != '}') @@ -8289,6 +8293,7 @@ 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 540ab48..14d7295 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -1148,6 +1148,8 @@ 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 3a47354..4673c94 100644 --- a/gas/config/tc-crx.c +++ b/gas/config/tc-crx.c @@ -1723,9 +1723,13 @@ preprocess_reglist (char *param, int *allocated) while (*paramP != '}') { - regP = paramP; memset (®_name, '\0', sizeof (reg_name)); + while (ISSPACE (*paramP)) + paramP++; + + regP = paramP; + while (ISALNUM (*paramP)) paramP++; diff --git a/gas/config/tc-csky.c b/gas/config/tc-csky.c index 0dc8bfd..0eb1805 100644 --- a/gas/config/tc-csky.c +++ b/gas/config/tc-csky.c @@ -2409,10 +2409,18 @@ 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 @@ -2935,6 +2943,11 @@ 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, @@ -3461,6 +3474,9 @@ 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; @@ -3481,7 +3497,7 @@ get_operand_value (struct csky_opcode_info *op, } *s = rc; - *oper += 1; + *oper = s + 1; return true; } @@ -4277,11 +4293,16 @@ 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 99a3c1e..6789686 100644 --- a/gas/config/tc-pru.c +++ b/gas/config/tc-pru.c @@ -1399,7 +1399,6 @@ 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; @@ -1426,14 +1425,7 @@ pru_parse_args (pru_insn_infoS *insn ATTRIBUTE_UNUSED, char *argstr, else { /* Check that the argument string has no trailing arguments. */ - /* 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) + if (strpbrk (p, ",") != NULL) as_bad (_("too many arguments")); } diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c index e37189e..d78aa0e 100644 --- a/gas/config/tc-sparc.c +++ b/gas/config/tc-sparc.c @@ -1778,6 +1778,9 @@ sparc_ip (char *str, const struct sparc_opcode **pinsn) operands match. */ for (args = insn->args;; ++args) { + if (*s == ' ' && *args != ' ') + ++s; + switch (*args) { case 'K': @@ -2718,11 +2721,6 @@ 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; @@ -2752,6 +2750,8 @@ 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,17 +2765,45 @@ 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] == '+') - 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; + { + 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; + } else s1 = NULL; if (s1) diff --git a/gas/config/tc-v850.c b/gas/config/tc-v850.c index cb518a7..63b69a7 100644 --- a/gas/config/tc-v850.c +++ b/gas/config/tc-v850.c @@ -1456,6 +1456,8 @@ parse_register_list (unsigned long *insn, } } + skip_white_space (); + if (*input_line_pointer == '}') { input_line_pointer++; @@ -1475,6 +1477,8 @@ 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 75fe338..c62d34d 100644 --- a/gas/testsuite/gas/all/macro.l +++ b/gas/testsuite/gas/all/macro.l @@ -22,4 +22,14 @@ [ ]*[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 9e70f30..109bcc5 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) - .endif + + .byte -1 diff --git a/gas/testsuite/gas/i386/x86-64-apx-nf.s b/gas/testsuite/gas/i386/x86-64-apx-nf.s index fbd4cad..99ae1c7 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 |