[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: sh3-dsp instruction "movs.l Ds,@-As" assembles wrong
From: |
gerg |
Subject: |
Re: sh3-dsp instruction "movs.l Ds,@-As" assembles wrong |
Date: |
Tue, 09 Oct 2001 22:38:07 +1000 |
Hi Nick,
Thanks for the patch, much appreciated.
Regards
Greg
Nick Clifton wrote:
>
> Hi Greg,
>
> > I have found a problem with gas assembling wrong the
> > sh3 (dsp) instruction "movs.l Ds,@-As".
> >
> > For example:
> >
> > movs.l a1, @-r2
> >
> > assembles to:
> >
> > 164e: 5c f6 movs.l a1,@-r6
> >
> > (as dumped by objdump).
> >
> > But the 0xf65c is the wrong opcode. It should be 0xf653.
>
> Indeed it should.
>
> > (Objdump even gets the dis-assemble wrong too :-)
>
> This is a separate bug, but yes, this is also wrong.
>
> > But I can see from the CVS at http://sources.redhat.com/binutils/
> > that the file opcodes/sh-opc.h still has the opcodes wrong.
> > I think some of the other "movs" opcodes are wrong here too.
>
> They are. Here is a patch to fix this problem. I will be checking it
> into the sources shortly. I am also going to add a test tot he GAS
> testsuite to check these instructions and to make sure that they are
> assembled and disassembled correctly in the future. This is the
> second part of the patch below.
>
> Cheers
> Nick
>
> opcodes
> 2001-10-09 Nick Clifton <address@hidden>
>
> * sh-opc.h: Fix encoding of least significant nibble of the
> DSP single data transfer instructions.
>
> * sh-dis.c (print_insn_shx): Fix decoding of As opcode in DSP
> instructions.
>
> gas
> 2001-10-09 Nick Clifton <address@hidden>
>
> * sh/basic.exp: Add dsp dump test.
> * sh/dsp/d: New file: Expected output of disassembly of dsp.s
> * sh/dsp.s: New file: Test assembly source of DSP single data
> transfer instructions.
>
> Index: opcodes/sh-opc.h
> ===================================================================
> RCS file: /cvs/src/src/opcodes/sh-opc.h,v
> retrieving revision 1.11
> diff -p -r1.11 sh-opc.h
> *** sh-opc.h 2001/06/09 22:42:30 1.11
> --- sh-opc.h 2001/10/09 12:14:50
> *************** sh_opcode_info sh_table[] = {
> *** 620,652 ****
>
> /* 111101nnmmmm0000 movs.w @-<REG_N>,<DSP_REG_M> */
> {"movs.w",{A_DEC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_0}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0001 movs.w @<REG_N>,<DSP_REG_M> */
> {"movs.w",{A_IND_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_1}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0010 movs.w @<REG_N>+,<DSP_REG_M> */
> {"movs.w",{A_INC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_2}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0011 movs.w @<REG_N>+r8,<DSP_REG_M> */
> {"movs.w",{A_PMOD_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_3}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0100 movs.w <DSP_REG_M>,@-<REG_N> */
> {"movs.w",{DSP_REG_M,A_DEC_N},{HEX_F,SDT_REG_N,REG_M,HEX_4}, arch_sh_dsp_up},
>
> /* 111101nnmmmm0101 movs.w <DSP_REG_M>,@<REG_N> */
> {"movs.w",{DSP_REG_M,A_IND_N},{HEX_F,SDT_REG_N,REG_M,HEX_5}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0110 movs.w <DSP_REG_M>,@<REG_N>+ */
> {"movs.w",{DSP_REG_M,A_INC_N},{HEX_F,SDT_REG_N,REG_M,HEX_6}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0111 movs.w <DSP_REG_M>,@<REG_N>+r8 */
> {"movs.w",{DSP_REG_M,A_PMOD_N},{HEX_F,SDT_REG_N,REG_M,HEX_7}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1000 movs.l @-<REG_N>,<DSP_REG_M> */
> {"movs.l",{A_DEC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_8}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1001 movs.l @<REG_N>,<DSP_REG_M> */
> {"movs.l",{A_IND_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_9}, arch_sh_dsp_up},
>
> /* 111101nnmmmm1010 movs.l @<REG_N>+,<DSP_REG_M> */
> {"movs.l",{A_INC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_A}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1011 movs.l @<REG_N>+r8,<DSP_REG_M> */
> {"movs.l",{A_PMOD_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_B}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1100 movs.l <DSP_REG_M>,@-<REG_N> */
> {"movs.l",{DSP_REG_M,A_DEC_N},{HEX_F,SDT_REG_N,REG_M,HEX_C}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1101 movs.l <DSP_REG_M>,@<REG_N> */
> {"movs.l",{DSP_REG_M,A_IND_N},{HEX_F,SDT_REG_N,REG_M,HEX_D}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1110 movs.l <DSP_REG_M>,@<REG_N>+ */
> {"movs.l",{DSP_REG_M,A_INC_N},{HEX_F,SDT_REG_N,REG_M,HEX_E}, arch_sh_dsp_up},
>
> /* 111101nnmmmm1111 movs.l <DSP_REG_M>,@<REG_N>+r8 */
> {"movs.l",{DSP_REG_M,A_PMOD_N},{HEX_F,SDT_REG_N,REG_M,HEX_F}, arch_sh_dsp_up},
>
> --- 620,652 ----
>
> /* 111101nnmmmm0000 movs.w @-<REG_N>,<DSP_REG_M> */
> {"movs.w",{A_DEC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_0}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0001 movs.w @<REG_N>,<DSP_REG_M> */
> {"movs.w",{A_IND_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_4}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0010 movs.w @<REG_N>+,<DSP_REG_M> */
> {"movs.w",{A_INC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_8}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0011 movs.w @<REG_N>+r8,<DSP_REG_M> */
> {"movs.w",{A_PMOD_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_C}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0100 movs.w <DSP_REG_M>,@-<REG_N> */
> {"movs.w",{DSP_REG_M,A_DEC_N},{HEX_F,SDT_REG_N,REG_M,HEX_1}, arch_sh_dsp_up},
>
> /* 111101nnmmmm0101 movs.w <DSP_REG_M>,@<REG_N> */
> {"movs.w",{DSP_REG_M,A_IND_N},{HEX_F,SDT_REG_N,REG_M,HEX_5}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0110 movs.w <DSP_REG_M>,@<REG_N>+ */
> {"movs.w",{DSP_REG_M,A_INC_N},{HEX_F,SDT_REG_N,REG_M,HEX_9}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm0111 movs.w <DSP_REG_M>,@<REG_N>+r8 */
> {"movs.w",{DSP_REG_M,A_PMOD_N},{HEX_F,SDT_REG_N,REG_M,HEX_D}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1000 movs.l @-<REG_N>,<DSP_REG_M> */
> {"movs.l",{A_DEC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_2}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1001 movs.l @<REG_N>,<DSP_REG_M> */
> {"movs.l",{A_IND_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_6}, arch_sh_dsp_up},
>
> /* 111101nnmmmm1010 movs.l @<REG_N>+,<DSP_REG_M> */
> {"movs.l",{A_INC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_A}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1011 movs.l @<REG_N>+r8,<DSP_REG_M> */
> {"movs.l",{A_PMOD_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_E}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1100 movs.l <DSP_REG_M>,@-<REG_N> */
> {"movs.l",{DSP_REG_M,A_DEC_N},{HEX_F,SDT_REG_N,REG_M,HEX_3}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1101 movs.l <DSP_REG_M>,@<REG_N> */
> {"movs.l",{DSP_REG_M,A_IND_N},{HEX_F,SDT_REG_N,REG_M,HEX_7}, arch_sh_dsp_up},
>
> ! /* 111101nnmmmm1110 movs.l <DSP_REG_M>,@<REG_N>+ */
> {"movs.l",{DSP_REG_M,A_INC_N},{HEX_F,SDT_REG_N,REG_M,HEX_B}, arch_sh_dsp_up},
>
> /* 111101nnmmmm1111 movs.l <DSP_REG_M>,@<REG_N>+r8 */
> {"movs.l",{DSP_REG_M,A_PMOD_N},{HEX_F,SDT_REG_N,REG_M,HEX_F}, arch_sh_dsp_up},
>
> Index: opcodes/sh-dis.c
> ===================================================================
> RCS file: /cvs/src/src/opcodes/sh-dis.c,v
> retrieving revision 1.8
> diff -p -r1.8 sh-dis.c
> *** sh-dis.c 2001/08/26 11:47:38 1.8
> --- sh-dis.c 2001/10/09 12:14:51
> *************** print_insn_shx (memaddr, info)
> *** 465,471 ****
> if ((rn & 0xc) != 4)
> goto fail;
> rn = rn & 0x3;
> ! rn |= (rn & 2) << 1;
> break;
> case PPI:
> case REPEAT:
> --- 465,471 ----
> if ((rn & 0xc) != 4)
> goto fail;
> rn = rn & 0x3;
> ! rn |= (!(rn & 2)) << 2;
> break;
> case PPI:
> case REPEAT:
>
> Index: gas/testsuite/gas/sh/basic.exp
> ===================================================================
> RCS file: /cvs/src/src/gas/testsuite/gas/sh/basic.exp,v
> retrieving revision 1.1.1.1
> diff -p -r1.1.1.1 basic.exp
> *** basic.exp 1999/05/03 07:28:52 1.1.1.1
> --- basic.exp 2001/10/09 12:20:35
> *************** proc do_fp {} {
> *** 83,86 ****
> --- 83,88 ----
> if [istarget sh*-*-*] then {
> # Test the basic instruction parser.
> do_fp
> + # Test DSP instructions
> + run_dump_test "dsp"
> }
>
> Index: gas/testsuite/gas/sh/dsp.d
> ===================================================================
> RCS file: dsp.d
> diff -N dsp.d
> *** /dev/null Tue May 5 13:32:27 1998
> --- dsp.d Tue Oct 9 05:20:35 2001
> ***************
> *** 0 ****
> --- 1,24 ----
> + #objdump: -dr --prefix-addresses --show-raw-insn
> + #name: SH DSP basic instructions
> + #as: -dsp
> + # Test the SH DSP instructions:
> +
> + .*: +file format .*sh.*
> +
> + Disassembly of section .text:
> + 0+000 <[^>]*> f6 80 [ ]*movs.w @-r2,x0
> + 0+002 <[^>]*> f7 94 [ ]*movs.w @r3,x1
> + 0+004 <[^>]*> f4 a8 [ ]*movs.w @r4\+,y0
> + 0+006 <[^>]*> f5 b8 [ ]*movs.w @r5\+,y1
> + 0+008 <[^>]*> f5 c1 [ ]*movs.w m0,@-r5
> + 0+00a <[^>]*> f4 e5 [ ]*movs.w m1,@r4
> + 0+00c <[^>]*> f7 79 [ ]*movs.w a0,@r3\+
> + 0+00e <[^>]*> f6 59 [ ]*movs.w a1,@r2\+
> + 0+010 <[^>]*> f6 f2 [ ]*movs.l @-r2,a0g
> + 0+012 <[^>]*> f7 d6 [ ]*movs.l @r3,a1g
> + 0+014 <[^>]*> f4 8a [ ]*movs.l @r4\+,x0
> + 0+016 <[^>]*> f5 9a [ ]*movs.l @r5\+,x1
> + 0+018 <[^>]*> f5 a3 [ ]*movs.l y0,@-r5
> + 0+01a <[^>]*> f4 b7 [ ]*movs.l y1,@r4
> + 0+01c <[^>]*> f7 cb [ ]*movs.l m0,@r3\+
> + 0+01e <[^>]*> f6 eb [ ]*movs.l m1,@r2\+
>
> Index: gas/testsuite/gas/sh/dsp.s
> ===================================================================
> RCS file: dsp.s
> diff -N dsp.s
> *** /dev/null Tue May 5 13:32:27 1998
> --- dsp.s Tue Oct 9 05:20:35 2001
> ***************
> *** 0 ****
> --- 1,24 ----
> + # Test file for ARM/GAS -- basic instructions
> +
> + .text
> + .align
> + .globl dsp_tests
> + dsp_tests:
> + movs.w @-r2, x0
> + movs.w @r3, x1
> + movs.w @r4+, y0
> + movs.w @r5+r8, y1
> + movs.w m0, @-r5
> + movs.w m1, @r4
> + movs.w a0, @r3+
> + movs.w a1, @r2+r8
> +
> + movs.l @-r2, a0g
> + movs.l @r3, a1g
> + movs.l @r4+, x0
> + movs.l @r5+r8, x1
> + movs.l y0, @-r5
> + movs.l y1, @r4
> + movs.l m0, @r3+
> + movs.l m1, @r2+r8
> +
> \ No newline at end of file
--
------------------------------------------------------------------------
Greg Ungerer -- Chief Software Wizard EMAIL: address@hidden
Lineo (Integrated Products Group) PHONE: +61 7 3279 1822
825 Stanley St, FAX: +61 7 3279 1820
Woolloogabba, QLD, 4102, Australia WEB: www.lineo.com