opcodes/gas: blackfin: support OUTC debug insn
authorMike Frysinger <vapier@gentoo.org>
Wed, 22 Sep 2010 20:59:00 +0000 (20:59 +0000)
committerMike Frysinger <vapier@gentoo.org>
Wed, 22 Sep 2010 20:59:00 +0000 (20:59 +0000)
The disassembler has partial (but incomplete/broken) support already for
the pseudo debug insn OUTC, so let's fix it up and finish it.  And now
that the disassembler can handle it, make sure our assembler can output
it too.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
gas/ChangeLog
gas/config/bfin-aux.h
gas/config/bfin-parse.y
gas/config/tc-bfin.c
include/opcode/ChangeLog
include/opcode/bfin.h
opcodes/ChangeLog
opcodes/bfin-dis.c

index 551525b01cdaadfdb41b672235eee976177dc5a1..039c338bdc5ebbadd1d951addee39483a28e1f89 100644 (file)
@@ -1,3 +1,9 @@
+2010-09-22  Mike Frysinger  <vapier@gentoo.org>
+
+       * config/bfin-aux.h (bfin_gen_pseudochr): New prototype.
+       * config/tc-bfin.c (bfin_gen_pseudochr): New function.
+       * config/bfin-parse.y: Call bfin_gen_pseudochr for OUTC tokens.
+
 2010-09-22  Mike Frysinger  <vapier@gentoo.org>
 
        * config/bfin-lex.l (abort): Accept case-insensitive abort insn.
index 638df31f183b86932c9e4691c70d90525c824e17..465a6afc68d6f1567b5b6bf1fce313c27617ca52 100755 (executable)
@@ -63,5 +63,6 @@ INSTR_T bfin_gen_calla (Expr_Node *, int);
 INSTR_T bfin_gen_linkage (int, int);
 INSTR_T bfin_gen_pseudodbg (int, int, int);
 INSTR_T bfin_gen_pseudodbg_assert (int, REG_T, int);
+INSTR_T bfin_gen_pseudochr (int);
 bfd_boolean bfin_resource_conflict (INSTR_T, INSTR_T, INSTR_T);
 INSTR_T bfin_gen_multi_instr (INSTR_T, INSTR_T, INSTR_T);
index 747442cd8578f8101c9e9d4be0910875f9c94cde..f8bb744e4d71705f1484a00220b6524d4f486e79 100644 (file)
@@ -212,6 +212,7 @@ extern int yylex (void);
 #define uimm5(x) EXPR_VALUE (x)
 #define imm6(x) EXPR_VALUE (x)
 #define imm7(x) EXPR_VALUE (x)
+#define uimm8(x) EXPR_VALUE (x)
 #define imm16(x) EXPR_VALUE (x)
 #define uimm16s4(x) ((EXPR_VALUE (x)) >> 2)
 #define uimm16(x) EXPR_VALUE (x)
@@ -3618,6 +3619,21 @@ asm_1:
          $$ = bfin_gen_pseudodbg_assert (2, &$3, uimm16 ($5));
        }
 
+       | OUTC expr
+       {
+         if (!IS_UIMM ($2, 8))
+           return yyerror ("Constant out of range");
+         notethat ("psedodbg_assert: OUTC uimm8\n");
+         $$ = bfin_gen_pseudochr (uimm8 ($2));
+       }
+
+       | OUTC REG
+       {
+         if (!IS_DREG ($2))
+           return yyerror ("Dregs expected");
+         notethat ("psedodbg_assert: OUTC dreg\n");
+         $$ = bfin_gen_pseudodbg (2, $2.regno & CODE_MASK, 0);
+       }
 
 ;
 
index 5746904d1668a4cdedac0d5071cc699b3f235240..ccd14cbb9084e0870403eaf8d55a2bab7fcaf54b 100644 (file)
@@ -1820,6 +1820,16 @@ bfin_gen_pseudodbg_assert (int dbgop, REG_T regtest, int expected)
   return GEN_OPCODE32 ();
 }
 
+INSTR_T
+bfin_gen_pseudochr (int ch)
+{
+  INIT (PseudoChr);
+
+  ASSIGN (ch);
+
+  return GEN_OPCODE16 ();
+}
+
 /* Multiple instruction generation.  */
 
 INSTR_T
index 277419459fc95c0a44e2a7fdee5c088e18b92452..e467f5a4694065849c499c485d2477691b8189e3 100644 (file)
@@ -1,3 +1,7 @@
+2010-09-22  Mike Frysinger  <vapier@gentoo.org>
+
+       * bfin.h: Declare pseudoChr structs/defines.
+
 2010-09-21  Mike Frysinger  <vapier@gentoo.org>
 
        * bfin.h: Strip trailing whitespace.
index 925bf141ae240405d01fd8933ee05d25420d8162..819ba6ee26e982aa28c1b8d2be47c3d6abd3fb5e 100755 (executable)
@@ -987,6 +987,34 @@ typedef struct
   PseudoDbg_Assert_code_bits,          PseudoDbg_Assert_code_mask      \
 };
 
+/*  pseudoChr
++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
+| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |.ch............................|
++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
+*/
+
+typedef struct
+{
+  unsigned short opcode;
+  int bits_ch;
+  int mask_ch;
+  int bits_code;
+  int mask_code;
+} PseudoChr;
+
+#define PseudoChr_opcode       0xf900
+#define PseudoChr_ch_bits      0
+#define PseudoChr_ch_mask      0xff
+#define PseudoChr_code_bits    8
+#define PseudoChr_code_mask    0xff
+
+#define init_PseudoChr                         \
+{                                              \
+  PseudoChr_opcode,                            \
+  PseudoChr_ch_bits,   PseudoChr_ch_mask,      \
+  PseudoChr_code_bits, PseudoChr_code_mask     \
+};
+
 /*  CaCTRL
 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |.a.|.op....|.reg.......|
index 98bc7960c73beb8821af94f3d7df9701d1d9da9e..fcf9b57ddab5f3f69fb26e05281c58d04d4848ef 100644 (file)
@@ -1,3 +1,9 @@
+2010-09-22  Mike Frysinger  <vapier@gentoo.org>
+
+       * bfin-dis.c (decode_pseudoDEBUG_0): Add space after OUTC.
+       (decode_pseudoOChar_0): New function.
+       (_print_insn_bfin): Remove #if 0 and call new decode_pseudoOChar_0.
+
 2010-09-22  Robin Getz  <robin.getz@analog.com>
 
        * bfin-dis.c (decode_dsp32shift_0): Decode sub opcodes 2/2 as
index 00799d254c0e7e6e0ce44e824e32415dbf9535c1..19b19259b0b24139d84ba4a952ef4af7819c6ebb 100644 (file)
@@ -4550,7 +4550,7 @@ decode_pseudoDEBUG_0 (TIword iw0, disassemble_info *outf)
 
   else if (grp == 0 && fn == 2)
     {
-      OUTS (outf, "OUTC");
+      OUTS (outf, "OUTC ");
       OUTS (outf, dregs (reg));
     }
   else if (fn == 0)
@@ -4569,6 +4569,21 @@ decode_pseudoDEBUG_0 (TIword iw0, disassemble_info *outf)
   return 2;
 }
 
+static int
+decode_pseudoOChar_0 (TIword iw0, disassemble_info *outf)
+{
+  /* psedoOChar
+     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
+     | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |.ch............................|
+     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
+  int ch = ((iw0 >> PseudoChr_ch_bits) & PseudoChr_ch_mask);
+
+  OUTS (outf, "OUTC ");
+  OUTS (outf, uimm8 (ch));
+
+  return 2;
+}
+
 static int
 decode_pseudodbg_assert_0 (TIword iw0, TIword iw1, disassemble_info *outf)
 {
@@ -4713,10 +4728,8 @@ _print_insn_bfin (bfd_vma pc, disassemble_info *outf)
     rv = decode_dsp32shiftimm_0 (iw0, iw1, outf);
   else if ((iw0 & 0xff00) == 0xf800)
     rv = decode_pseudoDEBUG_0 (iw0, outf);
-#if 0
   else if ((iw0 & 0xFF00) == 0xF900)
-    rv = decode_pseudoOChar_0 (iw0, iw1, pc, outf);
-#endif
+    rv = decode_pseudoOChar_0 (iw0, outf);
   else if ((iw0 & 0xFF00) == 0xf000 && (iw1 & 0x0000) == 0x0000)
     rv = decode_pseudodbg_assert_0 (iw0, iw1, outf);