From f9b2d5449aa0df00eb0c2b2ca9da21d879245bad Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 30 Jan 2013 13:21:01 +0000 Subject: [PATCH] * config/tc-metag.c: Make SWAP instruction less permissive with its operands. * gas/metag/metacore21-invalid.s: Add invalid SWAP testcases * gas/metag/metacore21-invalid.l: Add expected output for invalid SWAP testcases --- gas/ChangeLog | 5 +++ gas/config/tc-metag.c | 36 +++++++++++++++++--- gas/testsuite/ChangeLog | 6 ++++ gas/testsuite/gas/metag/metacore21-invalid.l | 6 ++++ gas/testsuite/gas/metag/metacore21-invalid.s | 3 ++ 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index b4a211f594..e14f75c16f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2013-01-30 Markos Chandras + + * config/tc-metag.c: Make SWAP instruction less permissive with + its operands. + 2013-01-29 DJ Delorie * config/tc-rl78.c (rl78_cons_fix_new): Handle user-specified diff --git a/gas/config/tc-metag.c b/gas/config/tc-metag.c index d5e603aa0f..f42d2f187c 100644 --- a/gas/config/tc-metag.c +++ b/gas/config/tc-metag.c @@ -2026,11 +2026,37 @@ parse_swap (const char *line, metag_insn *insn, if (l == NULL) return NULL; - insn->bits = (template->meta_opcode | - (regs[1]->no << 19) | - (regs[0]->no << 14) | - (regs[1]->unit << 10) | - (regs[0]->unit << 5)); + /* PC.r | CT.r | TR.r | TT.r are treated as if they are a single unit. */ + switch (regs[0]->unit) + { + case UNIT_PC: + case UNIT_CT: + case UNIT_TR: + case UNIT_TT: + if (regs[1]->unit == UNIT_PC + || regs[1]->unit == UNIT_CT + || regs[1]->unit == UNIT_TR + || regs[1]->unit == UNIT_TT) + { + as_bad (_("PC, CT, TR and TT are treated as if they are a single unit but operands must be in different units")); + return NULL; + } + + default: + /* Registers must be in different units. */ + if (regs[0]->unit == regs[1]->unit) + { + as_bad (_("source and destination register must be in different units")); + return NULL; + } + break; + } + + insn->bits = (template->meta_opcode + | (regs[1]->no << 19) + | (regs[0]->no << 14) + | (regs[1]->unit << 10) + | (regs[0]->unit << 5)); insn->len = 4; return l; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 85dd2c1364..28467852de 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-01-30 Markos Chandras + + * gas/metag/metacore21-invalid.s: Add invalid SWAP testcases. + * gas/metag/metacore21-invalid.l: Add expected output for invalid + SWAP testcases. + 2013-01-28 Alexis Deruelle PR gas/15069 diff --git a/gas/testsuite/gas/metag/metacore21-invalid.l b/gas/testsuite/gas/metag/metacore21-invalid.l index 3352457062..4c27c53553 100644 --- a/gas/testsuite/gas/metag/metacore21-invalid.l +++ b/gas/testsuite/gas/metag/metacore21-invalid.l @@ -15,3 +15,9 @@ .*:8: Error: .* .*:8: Error: .* .*:8: Error: .* +.*:9: Error: .* +.*:9: Error: .* +.*:10: Error: .* +.*:10: Error: .* +.*:11: Error: .* +.*:11: Error: .* diff --git a/gas/testsuite/gas/metag/metacore21-invalid.s b/gas/testsuite/gas/metag/metacore21-invalid.s index be23532a5b..8dd4c046a5 100644 --- a/gas/testsuite/gas/metag/metacore21-invalid.s +++ b/gas/testsuite/gas/metag/metacore21-invalid.s @@ -6,3 +6,6 @@ _start: SETD [A0.0+A0.1],A0.2 ASL D0.0,D1.0,D0.0 GETD D0.0,[D0.0--D0.0] + SWAP PC,PCX + SWAP CT.0,PCX + SWAP D0.1,D0.2 -- 2.34.1