* include/opcode/tic6x.h: add tic6x_coding_dreg_(msb|lsb) field coding type in
authorNick Clifton <nickc@redhat.com>
Wed, 20 Mar 2013 16:36:34 +0000 (16:36 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 20 Mar 2013 16:36:34 +0000 (16:36 +0000)
order to encode separately the msb and lsb of a register pair ; this will be
needed to encode the opcodes the same
way as Ti assembler does.

* gas/config/tc-tic6x.c: handle tic6x_coding_dreg_(msb|lsb)  field coding types
and use it to encode register pair numbers when required.

* opcodes/tic6x-dis.c: decodes opcodes that have individual msb and lsb halves
in src1 & src2 fields ; discard the src1 (lsb) value and only use src2 (msb),
discarding bit 0, to follow what Ti SDK does in that case as any value in the
src1 field yields the same output with SDK disassembler.

* include/opcode/tic6x-opcode-table.h: modify absdp, dpint, dpsp, dptrunc,
rcpdp and rsqrdp opcodes to use the new field coding types.

* gas/testsuite/gas/tic6x/insns-c674x.d, gas/testsuite/gas/tic6x/insns-c674x.s
: add test case for the newly generated opcode but keep the old ones as they
seem legit as per Ti disassembler output.

gas/ChangeLog
gas/config/tc-tic6x.c
gas/testsuite/ChangeLog
gas/testsuite/gas/tic6x/insns-c674x.d
gas/testsuite/gas/tic6x/insns-c674x.s
include/opcode/ChangeLog
include/opcode/tic6x-opcode-table.h
include/opcode/tic6x.h
opcodes/ChangeLog
opcodes/tic6x-dis.c

index cc6d28363c08778194dab5094937d346cf81476a..bbc5774005bf5a2a3acf3825c38556476efd755e 100644 (file)
@@ -1,3 +1,10 @@
+2013-03-20  Alexis Deruelle  <alexis.deruelle@gmail.com>
+
+       PR gas/15095
+       * config/tc-tic6x.c (tic6x_try_encode): Handle
+       tic6x_coding_dreg_(msb|lsb) field coding types and use it to
+       encode register pair numbers when required.
+
 2013-03-15  Will Newton  <will.newton@linaro.org>
 
        * config/tc-arm.c (do_neon_ldr_str): Fix error check for PC register
index 65517a6ed0b21c32fb8627c6046b99e56fc25969..7e11d0bb77b0d82a8cc185591bdcda39f418cb58 100644 (file)
@@ -1,6 +1,5 @@
 /* TI C6X assembler.
-   Copyright 2010, 2011, 2012
-   Free Software Foundation, Inc.
+   Copyright 2010-2013 Free Software Foundation, Inc.
    Contributed by Joseph Myers <joseph@codesourcery.com>
                  Bernd Schmidt  <bernds@codesourcery.com>
 
@@ -2717,6 +2716,30 @@ tic6x_try_encode (tic6x_opcode_id id, tic6x_operand *operands,
          *fix_adda = FALSE;
          break;
 
+       case tic6x_coding_regpair_lsb:
+         switch (operands[opno].form)
+           {
+           case TIC6X_OP_REGPAIR:
+             value = operands[opno].value.reg.num;
+             break;
+
+           default:
+             abort ();
+           }
+         break;
+
+       case tic6x_coding_regpair_msb:
+         switch (operands[opno].form)
+           {
+           case TIC6X_OP_REGPAIR:
+             value = operands[opno].value.reg.num + 1;
+             break;
+
+           default:
+             abort ();
+           }
+         break;
+
        case tic6x_coding_reg:
          switch (operands[opno].form)
            {
index 37c9e87c4c62b41f19aa32648ccffe53c1dec4fa..e1c04819642a44ed6b8354c683f541e9531de75a 100644 (file)
@@ -1,3 +1,10 @@
+2013-03-20  Alexis Deruelle  <alexis.deruelle@gmail.com>
+
+       PR gas/15095
+       * gas/tic6x/insns-c674x.s: Add test cases for the newly generated
+       opcode.
+       * gas/tic6x/insns-c674x.d: Update expected disassembly.
+
 2013-03-15  Will Newton  <will.newton@linaro.org>
 
        * gas/arm/any-idiv.d: Expand *-*eabi test to cover *-*eabi*.
index 236086cb8e7e6300db6a08e5d1edeb07c89402c2..9f8e162ef15f44e6f9f0d65bf403f76704a79531 100644 (file)
@@ -17,7 +17,9 @@ Disassembly of section \.text:
 [0-9a-f]+[048c] <[^>]*> 070c835a[ \t]+abs2 \.L2 b3,b14
 [0-9a-f]+[048c] <[^>]*> 0cf0935a[ \t]+abs2 \.L2X a28,b25
 [0-9a-f]+[048c] <[^>]*> 0c180b20[ \t]+absdp \.S1 a7:a6,a25:a24
-[0-9a-f]+[048c] <[^>]*> c2080b22[ \t]+\[a0\] absdp \.S2 b3:b2,b5:b4
+[0-9a-f]+[048c] <[^>]*> 0c1ccb20[ \t]+absdp \.S1 a7:a6,a25:a24
+[0-9a-f]+[048c] <[^>]*> c20c4b22[ \t]+\[a0\] absdp \.S2 b3:b2,b5:b4
+[0-9a-f]+[048c] <[^>]*> 0c1feb20[ \t]+absdp \.S1 a7:a6,a25:a24
 [0-9a-f]+[048c] <[^>]*> 04240f20[ \t]+abssp \.S1 a9,a8
 [0-9a-f]+[048c] <[^>]*> 08481f20[ \t]+abssp \.S1X b18,a16
 [0-9a-f]+[048c] <[^>]*> 23800f22[ \t]+\[b0\] abssp \.S2 b0,b7
@@ -442,11 +444,17 @@ Disassembly of section \.text:
 [0-9a-f]+[048c] <[^>]*> 1325867a[ \t]+dpackx2 \.L2 b12,b9,b7:b6
 [0-9a-f]+[048c] <[^>]*> 1e00767a[ \t]+dpackx2 \.L2X b3,a0,b29:b28
 [0-9a-f]+[048c] <[^>]*> 01900118[ \t]+dpint \.L1 a5:a4,a3
-[0-9a-f]+[048c] <[^>]*> d190011a[ \t]+\[!a0\] dpint \.L2 b5:b4,b3
+[0-9a-f]+[048c] <[^>]*> 01948118[ \t]+dpint \.L1 a5:a4,a3
+[0-9a-f]+[048c] <[^>]*> d194811a[ \t]+\[!a0\] dpint \.L2 b5:b4,b3
+[0-9a-f]+[048c] <[^>]*> 0197e118[ \t]+dpint \.L1 a5:a4,a3
 [0-9a-f]+[048c] <[^>]*> 01900138[ \t]+dpsp \.L1 a5:a4,a3
-[0-9a-f]+[048c] <[^>]*> 3190013a[ \t]+\[!b0\] dpsp \.L2 b5:b4,b3
-[0-9a-f]+[048c] <[^>]*> 81900038[ \t]+\[a1\] dptrunc \.L1 a5:a4,a3
+[0-9a-f]+[048c] <[^>]*> 01948138[ \t]+dpsp \.L1 a5:a4,a3
+[0-9a-f]+[048c] <[^>]*> 3194813a[ \t]+\[!b0\] dpsp \.L2 b5:b4,b3
+[0-9a-f]+[048c] <[^>]*> 0197e138[ \t]+dpsp \.L1 a5:a4,a3
 [0-9a-f]+[048c] <[^>]*> 0190003a[ \t]+dptrunc \.L2 b5:b4,b3
+[0-9a-f]+[048c] <[^>]*> 81948038[ \t]+\[a1\] dptrunc \.L1 a5:a4,a3
+[0-9a-f]+[048c] <[^>]*> 0194803a[ \t]+dptrunc \.L2 b5:b4,b3
+[0-9a-f]+[048c] <[^>]*> 0197e03a[ \t]+dptrunc \.L2 b5:b4,b3
 [0-9a-f]+[048c] <[^>]*> 05141f48[ \t]+ext \.S1 a5,0,31,a10
 [0-9a-f]+[048c] <[^>]*> 42abe04a[ \t]+\[b1\] ext \.S2 b10,31,0,b5
 [0-9a-f]+[048c] <[^>]*> 9a9dcbe0[ \t]+\[!a1\] ext \.S1 a7,a14,a21
@@ -1033,7 +1041,9 @@ Disassembly of section \.text:
 [0-9a-f]+[048c] <[^>]*> 0b8aad1a[ \t]+packl4 \.L2 b21,b2,b23
 [0-9a-f]+[048c] <[^>]*> 64c33d1a[ \t]+\[b2\] packl4 \.L2X b25,a16,b9
 [0-9a-f]+[048c] <[^>]*> 03100b60[ \t]+rcpdp \.S1 a5:a4,a7:a6
-[0-9a-f]+[048c] <[^>]*> b5200b62[ \t]+\[!a2\] rcpdp \.S2 b9:b8,b11:b10
+[0-9a-f]+[048c] <[^>]*> 03148b60[ \t]+rcpdp \.S1 a5:a4,a7:a6
+[0-9a-f]+[048c] <[^>]*> b5250b62[ \t]+\[!a2\] rcpdp \.S2 b9:b8,b11:b10
+[0-9a-f]+[048c] <[^>]*> 0317eb60[ \t]+rcpdp \.S1 a5:a4,a7:a6
 [0-9a-f]+[048c] <[^>]*> 00800f60[ \t]+rcpsp \.S1 a0,a1
 [0-9a-f]+[048c] <[^>]*> 71881f60[ \t]+\[!b2\] rcpsp \.S1X b2,a3
 [0-9a-f]+[048c] <[^>]*> c2900f62[ \t]+\[a0\] rcpsp \.S2 b4,b5
@@ -1052,7 +1062,9 @@ Disassembly of section \.text:
 [0-9a-f]+[048c] <[^>]*> 14a0eef2[ \t]+rpack2 \.S2 b7,b8,b9
 [0-9a-f]+[048c] <[^>]*> 162d5ef2[ \t]+rpack2 \.S2X b10,a11,b12
 [0-9a-f]+[048c] <[^>]*> 03100ba0[ \t]+rsqrdp \.S1 a5:a4,a7:a6
-[0-9a-f]+[048c] <[^>]*> 45200ba2[ \t]+\[b1\] rsqrdp \.S2 b9:b8,b11:b10
+[0-9a-f]+[048c] <[^>]*> 03148ba0[ \t]+rsqrdp \.S1 a5:a4,a7:a6
+[0-9a-f]+[048c] <[^>]*> 45250ba2[ \t]+\[b1\] rsqrdp \.S2 b9:b8,b11:b10
+[0-9a-f]+[048c] <[^>]*> 0317eba0[ \t]+rsqrdp \.S1 a5:a4,a7:a6
 [0-9a-f]+[048c] <[^>]*> 00800fa0[ \t]+rsqrsp \.S1 a0,a1
 [0-9a-f]+[048c] <[^>]*> 91881fa0[ \t]+\[!a1\] rsqrsp \.S1X b2,a3
 [0-9a-f]+[048c] <[^>]*> 52900fa2[ \t]+\[!b1\] rsqrsp \.S2 b4,b5
index 1d02e7ea2f173b2499d5e6afaa1b509798856687..33ec5dabfc3270afbc7d92627a0f155413ff7334 100644 (file)
@@ -13,8 +13,10 @@ f:
        [a2] abs2 .L1X b23,a5
        abs2 .L2 b3,b14
        abs2 .L2X a28,b25
+       .word 0x0c180b20
        absdp .S1 a7:a6,a25:a24
        [a0] absdp .S2 b3:b2,b5:b4
+       .word 0x0c1feb20
        abssp .S1 a9,a8
        abssp .S1X b18,a16
        [b0] abssp .S2 b0,b7
@@ -438,12 +440,18 @@ f:
        dpackx2 .L1X a21,b18,a15:a14
        dpackx2 .L2 b12,b9,b7:b6
        dpackx2 .L2X b3,a0,b29:b28
+       .word 0x01900118
        dpint .L1 a5:a4,a3
        [!a0] dpint .L2 b5:b4,b3
+       .word 0x0197e118
+       .word 0x01900138
        dpsp .L1 a5:a4,a3
        [!b0] dpsp .L2 b5:b4,b3
+       .word 0x0197e138
+       .word 0x0190003a
        [a1] dptrunc .L1 a5:a4,a3
        dptrunc .L2 b5:b4,b3
+       .word 0x0197e03a
        ext .S1 a5,0,31,a10
        [b1] ext .S2 b10,31,0,b5
        [!a1] ext .S1 a7,a14,a21
@@ -1029,8 +1037,10 @@ f:
        packl4 .L1X a5,b8,a13
        packl4 .L2 b21,b2,b23
        [b2] packl4 .L2X b25,a16,b9
+       .word 0x03100b60
        rcpdp .S1 a5:a4,a7:a6
        [!a2] rcpdp .S2 b9:b8,b11:b10
+       .word 0x0317eb60
        rcpsp .S1 a0,a1
        [!b2] rcpsp .S1X b2,a3
        [a0] rcpsp .S2 b4,b5
@@ -1048,8 +1058,10 @@ f:
        rpack2 .S1X a4,b5,a6
        rpack2 .S2 b7,b8,b9
        rpack2 .S2X b10,a11,b12
+       .word 0x03100ba0
        rsqrdp .S1 a5:a4,a7:a6
        [b1] rsqrdp .S2 b9:b8,b11:b10
+       .word 0x0317eba0
        rsqrsp .S1 a0,a1
        [!a1] rsqrsp .S1X b2,a3
        [!b1] rsqrsp .S2 b4,b5
index a46900ac1373c0f50bc2012cb9059fcc8f56d3e7..69d0859e12bbca0f50336621f845512081e0090c 100644 (file)
@@ -1,3 +1,13 @@
+2013-03-20  Alexis Deruelle  <alexis.deruelle@gmail.com>
+
+       PR gas/15095
+       * tic6x.h (enum tic6x_coding_method): Add
+       tic6x_coding_dreg_(msb|lsb) field coding type in order to encode
+       separately the msb and lsb of a register pair.  This is needed to
+       encode the opcodes in the same way as TI assembler does.
+       * tic6x-opcode-table.h: Modify absdp, dpint, dpsp, dptrunc, rcpdp
+       and rsqrdp opcodes to use the new field coding types.
+
 2013-03-11  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * arm.h (CRC_EXT_ARMV8): New constant.
index 45e26fb8725359bd8ea0fb6eabd365e304680121..abebd3c1720ce94b3798c8b57c40b94f9ab60d81 100644 (file)
@@ -1,6 +1,5 @@
 /* TI C6X opcode table.
-   Copyright 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright 2010-2013 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -129,9 +128,10 @@ INSN(abs2, l, unary, 1cycle, C64X, 0,
          ENC(dst, reg, 1)))
 
 INSN(absdp, s, 1_or_2_src, 2cycle_dp, C67X, TIC6X_FLAG_NO_CROSS,
-     FIX3(FIX(op, 0x2c), FIX(x, 0), FIX(src1, 0)),
+     FIX2(FIX(op, 0x2c), FIX(x, 0)),
      OP2(ORREGD1, OWREGD12),
-     ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1)))
+     ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0),
+         ENC(dst, reg, 1)))
 
 INSN(abssp, s, unary, 1cycle, C67X, 0,
      FIX1(FIX(op, 0)),
@@ -916,19 +916,22 @@ INSN(dpackx2, l, 1_or_2_src_noncond, 1cycle, C64XP, 0,
          ENC(src2, reg, 1), ENC(dst, reg, 2)))
 
 INSN(dpint, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_NO_CROSS,
-     FIX3(FIX(op, 0x8), FIX(x, 0), FIX(src1, 0)),
+     FIX2(FIX(op, 0x8), FIX(x, 0)),
      OP2(ORREGD1, OWREG4),
-     ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1)))
+     ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0),
+         ENC(dst, reg, 1)))
 
 INSN(dpsp, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_NO_CROSS,
-     FIX3(FIX(op, 0x9), FIX(x, 0), FIX(src1, 0)),
+     FIX2(FIX(op, 0x9), FIX(x, 0)),
      OP2(ORREGD1, OWREG4),
-     ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1)))
+     ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0),
+         ENC(dst, reg, 1)))
 
 INSN(dptrunc, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_NO_CROSS,
-     FIX3(FIX(op, 0x1), FIX(x, 0), FIX(src1, 0)),
+     FIX2(FIX(op, 0x1), FIX(x, 0)),
      OP2(ORREGD1, OWREG4),
-     ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1)))
+     ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0),
+         ENC(dst, reg, 1)))
 
 INSN(ext, s, field, 1cycle, C62X, TIC6X_FLAG_NO_CROSS,
      FIX1(FIX(op, 0x1)),
@@ -1617,9 +1620,10 @@ INSN(packl4, l, 1_or_2_src, 1cycle, C64X, 0,
          ENC(src2, reg, 1), ENC(dst, reg, 2)))
 
 INSN(rcpdp, s, 1_or_2_src, 2cycle_dp, C67X, TIC6X_FLAG_NO_CROSS,
-     FIX3(FIX(op, 0x2d), FIX(x, 0), FIX(src1, 0)),
+     FIX2(FIX(op, 0x2d), FIX(x, 0)),
      OP2(ORREGD1, OWREGD12),
-     ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1)))
+     ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0),
+         ENC(dst, reg, 1)))
 
 INSN(rcpsp, s, 1_or_2_src, 1cycle, C67X, 0,
      FIX2(FIX(op, 0x3d), FIX(src1, 0)),
@@ -1677,9 +1681,10 @@ INSN(rpack2, s, ext_1_or_2_src_noncond, 1cycle, C64XP, 0,
          ENC(src2, reg, 1), ENC(dst, reg, 2)))
 
 INSN(rsqrdp, s, 1_or_2_src, 2cycle_dp, C67X, TIC6X_FLAG_NO_CROSS,
-     FIX3(FIX(op, 0x2e), FIX(x, 0), FIX(src1, 0)),
+     FIX2(FIX(op, 0x2e), FIX(x, 0)),
      OP2(ORREGD1, OWREGD12),
-     ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1)))
+     ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0),
+         ENC(dst, reg, 1)))
 
 INSN(rsqrsp, s, 1_or_2_src, 1cycle, C67X, 0,
      FIX2(FIX(op, 0x3e), FIX(src1, 0)),
index 2a7a2463d5453e8ef62f65c0c5be30ea30f1c437..168f66023379c8fc4b8f773eb556dcc62aadb60a 100644 (file)
@@ -1,6 +1,5 @@
 /* TI C6X opcode information.
-   Copyright 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright 2010-2013 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -380,6 +379,12 @@ typedef enum
        the field.  When applied to a memory reference, encode the base
        register.  */
     tic6x_coding_reg,
+    /* Encode the register-pair's lsb (even register) for instructions
+       that use src1 as port for loading lsb of double-precision
+       operand value (absdp, dpint, dpsp, dptrunc, rcpdp, rsqrdp).  */
+    tic6x_coding_regpair_lsb,
+    /* Encode the register-pair's msb (odd register), see above.  */ 
+    tic6x_coding_regpair_msb,
     /* Store 0 for register B14, 1 for register B15.  When applied to
        a memory reference, encode the base register.  */
     tic6x_coding_areg,
index 66556f1c913c4ef5934d6e78011418ed43f819e1..a678a709b0cf044346dcd73a693a9729dd370512 100644 (file)
@@ -1,6 +1,15 @@
+2013-03-20  Alexis Deruelle  <alexis.deruelle@gmail.com>
+
+       PR gas/15095
+       * tic6x-dis.c (print_insn_tic6x): Decode opcodes that have
+       individual msb and lsb halves in src1 & src2 fields.  Discard the
+       src1 (lsb) value and only use src2 (msb), discarding bit 0, to
+       follow what Ti SDK does in that case as any value in the src1
+       field yields the same output with SDK disassembler.
+
 2013-03-12  Michael Eager <eager@eagercon.com>
 
-       * opcodes/mips-dis.c (print_insn_args): Modify def of reg. 
+       * opcodes/mips-dis.c (print_insn_args): Modify def of reg.
 
 2013-03-11  Sebastian Huber <sebastian.huber@embedded-brains.de>
 
index 05626df2275ff4d8d590c72daf5711542d53bc27..73ac2e041e8c4c0be241b2601e34faa52fe7e646 100644 (file)
@@ -1,6 +1,5 @@
 /* TI C6X disassembler.
-   Copyright 2010
-   Free Software Foundation, Inc.
+   Copyright 2010-2013 Free Software Foundation, Inc.
    Contributed by Joseph Myers <joseph@codesourcery.com>
                  Bernd Schmidt  <bernds@codesourcery.com>
 
@@ -632,6 +631,15 @@ print_insn_tic6x (bfd_vma addr, struct disassemble_info *info)
                  operands_addresses[op_num] = fp_addr + signed_fld_val;
                  break;
 
+               case tic6x_coding_regpair_msb:
+                 if (opc->operand_info[op_num].form != tic6x_operand_regpair)
+                   abort ();
+                 operands_text[op_num] = TRUE;
+                 snprintf (operands[op_num], 24, "%c%u:%c%u",
+                           (func_unit_side == 2 ? 'b' : 'a'), (fld_val | 0x1),
+                           (func_unit_side == 2 ? 'b' : 'a'), (fld_val | 0x1) - 1);
+                 break;
+
                case tic6x_coding_reg_shift:
                  fld_val <<= 1;
                  /* Fall through.  */