summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-metag.c36
-rw-r--r--gas/testsuite/ChangeLog6
-rw-r--r--gas/testsuite/gas/metag/metacore21-invalid.l6
-rw-r--r--gas/testsuite/gas/metag/metacore21-invalid.s3
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 <markos.chandras@imgtec.com>
+
+ * config/tc-metag.c: Make SWAP instruction less permissive with
+ its operands.
+
2013-01-29 DJ Delorie <dj@redhat.com>
* 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 <markos.chandras@imgtec.com>
+
+ * 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 <alexis.deruelle@gmail.com>
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
OpenPOWER on IntegriCloud