bug-gnu-utils
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]