diff options
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/tc-metag.c | 36 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/metag/metacore21-invalid.l | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/metag/metacore21-invalid.s | 3 |
5 files changed, 51 insertions, 5 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index b4a211f..e14f75c 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 d5e603a..f42d2f1 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 85dd2c1..2846785 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 3352457..4c27c53 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 be23532..8dd4c04 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 |