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: Nick Clifton
Subject: Re: sh3-dsp instruction "movs.l Ds,@-As" assembles wrong
Date: 09 Oct 2001 13:20:49 +0100
User-agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7

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




reply via email to

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