From 0477af35bf6a93d1b215128bc2f7bdd8a90866d9 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 13 Jul 2004 17:31:15 +0000 Subject: [PATCH] Add support for & | << >> ~ arithmetic operators in Intel mode --- gas/ChangeLog | 15 ++++++++++++ gas/NEWS | 2 ++ gas/config/tc-i386.c | 42 ++++++++++++++++++++++++++-------- gas/testsuite/ChangeLog | 6 +++++ gas/testsuite/gas/i386/intel.d | 7 ++++++ gas/testsuite/gas/i386/intel.s | 10 ++++++++ 6 files changed, 73 insertions(+), 9 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 777979b196..271e8c911a 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2004-07-13 Thomas Nystrom + + * config/tc-i386.c (T_SHIFTOP): New constant. + (intel_e05_1): Handle '&', '|' and T_SHIFTOP. + (intel_el1): Handle '~'. + (intel_get_token): Handle '<>', '&', '|' and '~'. + +2004-07-13 Nick Clifton + + (md_assemble): Remove spurious newline from end of as_bad error + message. + (intel_e05_1): Likewise. + (intel_e11): Likewise. + (intel_match_token): Likewise. + 2004-07-11 Andreas Schwab * config/tc-m68k.c: Convert to C90. Remove redundant diff --git a/gas/NEWS b/gas/NEWS index 19cbc6067e..87ed8c067b 100644 --- a/gas/NEWS +++ b/gas/NEWS @@ -12,6 +12,8 @@ * Support for ColdFire EMAC instructions added and Motorola syntax for MAC/EMAC instrucitons. +Changes in 2.15: + * The MIPS -membedded-pic option (Embedded-PIC code generation) is deprecated and will be removed in a future release. diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index cc95843662..2dd834e492 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -1476,7 +1476,7 @@ md_assemble (line) { /* In case it is "hi" register, give up. */ if (i.op[x].regs->reg_num > 3) - as_bad (_("can't encode register '%%%s' in an instruction requiring REX prefix.\n"), + as_bad (_("can't encode register '%%%s' in an instruction requiring REX prefix."), i.op[x].regs->reg_name); /* Otherwise it is equivalent to the extended register. @@ -5350,7 +5350,7 @@ tc_gen_reloc (section, fixp) Initial production is 'expr'. - addOp + | - + addOp + | - | & | \| | << | >> alpha [a-zA-Z] @@ -5387,6 +5387,7 @@ tc_gen_reloc (section, fixp) | id | $ | register + | ~ => expr SHORT e05 | e05 @@ -5455,6 +5456,7 @@ tc_gen_reloc (section, fixp) | $ | register | id + | ~ | constant */ /* Parsing structure for the intel syntax parser. Used to implement the @@ -5496,6 +5498,7 @@ static struct intel_token cur_token, prev_token; #define T_OFFSET 9 #define T_PTR 10 #define T_ID 11 +#define T_SHIFTOP 12 /* Prototypes for intel parser functions. */ static int intel_match_token PARAMS ((int code)); @@ -5615,7 +5618,9 @@ static int intel_e05_1 () { /* e05' addOp e06 e05' */ - if (cur_token.code == '+' || cur_token.code == '-') + if (cur_token.code == '+' || cur_token.code == '-' + || cur_token.code == '&' || cur_token.code == '|' + || cur_token.code == T_SHIFTOP) { strcat (intel_parser.disp, cur_token.str); intel_match_token (cur_token.code); @@ -5717,7 +5722,7 @@ intel_e09_1 () else { - as_bad (_("Unknown operand modifier `%s'\n"), prev_token.str); + as_bad (_("Unknown operand modifier `%s'"), prev_token.str); return 0; } @@ -5801,6 +5806,7 @@ intel_e10_1 () | . | register | id + | ~ | constant */ static int intel_e11 () @@ -5820,6 +5826,15 @@ intel_e11 () return 0; } + /* e11 ~ expr */ + else if (cur_token.code == '~') + { + strcat (intel_parser.disp, "~"); + intel_match_token ('~'); + + return (intel_e11 ()); + } + /* e11 [ expr ] */ else if (cur_token.code == '[') { @@ -5965,7 +5980,7 @@ intel_e11 () { if (i.base_reg && i.index_reg) { - as_bad (_("Too many register references in memory operand.\n")); + as_bad (_("Too many register references in memory operand.")); return 0; } @@ -6034,7 +6049,7 @@ intel_e11 () intel_match_token (cur_token.code); if (cur_token.code != T_CONST) { - as_bad (_("Syntax error. Expecting a constant. Got `%s'.\n"), + as_bad (_("Syntax error. Expecting a constant. Got `%s'."), cur_token.str); return 0; } @@ -6121,7 +6136,7 @@ intel_match_token (code) } else { - as_bad (_("Unexpected token `%s'\n"), cur_token.str); + as_bad (_("Unexpected token `%s'"), cur_token.str); return 0; } } @@ -6182,7 +6197,16 @@ intel_get_token () new_token.code = T_ID; } - else if (strchr ("+-/*:[]()", *intel_parser.op_string)) + else if (strchr ("<>", *intel_parser.op_string) + && *intel_parser.op_string == *(intel_parser.op_string + 1)) + { + new_token.code = T_SHIFTOP; + new_token.str[0] = *intel_parser.op_string; + new_token.str[1] = *intel_parser.op_string; + new_token.str[2] = '\0'; + } + + else if (strchr ("+-/*&|:[]()~", *intel_parser.op_string)) { new_token.code = *intel_parser.op_string; new_token.str[0] = *intel_parser.op_string; @@ -6265,7 +6289,7 @@ intel_get_token () } else - as_bad (_("Unrecognized token `%s'\n"), intel_parser.op_string); + as_bad (_("Unrecognized token `%s'"), intel_parser.op_string); intel_parser.op_string += strlen (new_token.str); cur_token = new_token; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 880a52ac69..5e61334b36 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2004-07-13 Nick Clifton + + * gas/i386/intel.s: Add test of newly expand arithmetic support + for Intel mode assembler. + * gas/i386/intel.d: Add expected disassmbly. + 2004-07-13 Nick Clifton * gas/vtable: Delete directory. These tests are no longer needed diff --git a/gas/testsuite/gas/i386/intel.d b/gas/testsuite/gas/i386/intel.d index 7365dbaf1a..66fd1d733b 100644 --- a/gas/testsuite/gas/i386/intel.d +++ b/gas/testsuite/gas/i386/intel.d @@ -620,4 +620,11 @@ Disassembly of section .text: a6a: ff 20 [ ]*jmp \*\(%eax\) a6c: ff 25 d2 09 00 00 [ ]*jmp \*0x9d2 a72: e9 5b ff ff ff [ ]*jmp 9d2 + a77: b8 12 00 00 00 [ ]*mov \$0x12,%eax + a7c: 25 ff ff fb ff [ ]*and \$0xfffbffff,%eax + a81: 25 ff ff fb ff [ ]*and \$0xfffbffff,%eax + a86: b0 11 [ ]*mov \$0x11,%al + a88: b0 11 [ ]*mov \$0x11,%al + a8a: b3 47 [ ]*mov \$0x47,%bl + a8c: b3 47 [ ]*mov \$0x47,%bl [ ]*... diff --git a/gas/testsuite/gas/i386/intel.s b/gas/testsuite/gas/i386/intel.s index 2a4afb27cb..b713369266 100644 --- a/gas/testsuite/gas/i386/intel.s +++ b/gas/testsuite/gas/i386/intel.s @@ -615,4 +615,14 @@ rot5: jmp [eax] jmp [bar] jmp bar + + # Check arithmetic operators + mov %eax,(( 17 ) + 1) + and %eax,~(1 << ( 18 )) + and %eax,0xFFFBFFFF + mov %al, (( 0x4711 ) & 0xff) + mov %al, 0x11 + mov %bl, ((( 0x4711 ) >> 8) & 0xff) + mov %bl, 0x47 + .p2align 4,0 -- 2.34.1