public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/40129]  New: M16C invalid shift count used by pack_d -> ashldi3
@ 2009-05-13  9:47 eightdot at hotmail dot com
  2009-05-14  2:53 ` [Bug target/40129] " dj at redhat dot com
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: eightdot at hotmail dot com @ 2009-05-13  9:47 UTC (permalink / raw)
  To: gcc-bugs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2145 bytes --]

some disasm listings to show what is going wrong..
i cant find the guilty source files:-(
000fa8b2 <___pack_d>:
<snip>
fadb7:   75 42           push.w:g r2    //pushing 64 bit exponent [63:48]
fadb9:   75 42           push.w:g r2    //pushing 64 bit exponent [47:32]
fadbb:   75 42           push.w:g r2    //pushing 64 bit exponent [31:16]
fadbd:   75 40           push.w:g r0    //pushing 64 bit exponent [15:0]
fadbf:   75 c2 34 00     mov.w:g #52,r2 //shift count to get exponent in
[62:52]
fadc3:   fd 83 6f 0f     jsr.a f6f83 <___ashldi3>
___ashldi3 detects that it needs to shift more then 32 bits and prepares to
shift by -(32-52) = 20 bits (and after that 'shift' by 32 by moving registers
around)

000f6f83 <___ashldi3>:
<snip>
f7055:   73 b2 07        mov.w:g 7[fb],r2     //src bit[15:0]
f7058:   73 b0 05        mov.w:g 5[fb],r0     //src bit[31:16]
f705b:   72 b2 e2        mov.b:g -30[fb],r1l  //shift count (20)
f705e:   72 23           mov.b:g r1l,r1h      //shift count (20)
f7060:   eb 21           sha.l r1h,r2r0       //the shift

The M16C/60, M16C/20, M16C/Tine Series Software Manual says:
"If src is a register and you selected (.W) or (.L) for
 the size specifier (.size), the number of shifts 
 is –16 to +16. Although you can set 0, no bits are shifted and
 no flags are changed. If you set a value less than –16 or 
 greater than +16, the result of shift is indeterminate."

the actual result on my hardware is a shift by 4 (20 & 0xf).

i think ___ashldi3 (and friends!)
should (also) check if the shift is >16 
and only do the shift % 16 with the shift instruction and do the rest of the
shift by moving registers.


-- 
           Summary: M16C invalid shift count used by pack_d -> ashldi3
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: eightdot at hotmail dot com
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: m32c-unknown-elf


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40129


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/40129] M16C invalid shift count used by pack_d -> ashldi3
  2009-05-13  9:47 [Bug c/40129] New: M16C invalid shift count used by pack_d -> ashldi3 eightdot at hotmail dot com
@ 2009-05-14  2:53 ` dj at redhat dot com
  2009-05-18  7:14 ` eightdot at hotmail dot com
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: dj at redhat dot com @ 2009-05-14  2:53 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #1 from dj at redhat dot com  2009-05-14 02:52 -------
Do you have a test case that shows an actual problem?  Because the m32c port
has special code that tests for shift counts outside -16..16 and pre-shifts the
value to make the shift count fit (see gcc/config/m32c/m32c.c
m32c_prepare_shift()).


-- 

dj at redhat dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dj at redhat dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40129


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/40129] M16C invalid shift count used by pack_d -> ashldi3
  2009-05-13  9:47 [Bug c/40129] New: M16C invalid shift count used by pack_d -> ashldi3 eightdot at hotmail dot com
  2009-05-14  2:53 ` [Bug target/40129] " dj at redhat dot com
@ 2009-05-18  7:14 ` eightdot at hotmail dot com
  2009-05-18  7:15 ` eightdot at hotmail dot com
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: eightdot at hotmail dot com @ 2009-05-18  7:14 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #2 from eightdot at hotmail dot com  2009-05-18 07:13 -------
mm it apreas to be fixed somewhere between 4.1.1 and 4.4.2 
(revision 109661 and 109987 seams to be good candidates afaik in viewcvs but i
cant find which release this is corresponding to..)

input main.c:


output "/usr/libexec/gcc/m32c-unknown-elf/4.1.1/cc1 -mcpu=m16c main.c":
    enter   #13
    mov.w   r1,-10[fb]
    mov.w   #4660,-6[fb]
    mov.w   #22136,-8[fb]
    mov.w   -10[fb],r0
    mov.w   r0,-13[fb]
    mov.w   -6[fb],r2
    mov.w   -8[fb],r0
    mov.b   -13[fb],r1l
    neg.b   r1l
    mov.b   r1l,-11[fb]
    mov.b   -11[fb],r1l
    mov.b   r1l,r1h
    sha.l   r1h,r2r0
    mov.w   r2,-2[fb]
    mov.w   r0,-4[fb]
    mov.w   -4[fb],r0
    exitd



output "/usr/src/cross/m32c/build/gcc-4.4.0/gcc/cc1 -mcpu=m16c main.c"
_main:
    enter   #15-2
    mov.w   r1,-10[fb]
    mov.w   #4660,-6[fb]
    mov.w   #22136,-8[fb]
    mov.w   -10[fb],r0
    mov.w   r0,-13[fb]
    mov.w   -6[fb],r2
    mov.w   -8[fb],r0
    mov.b   -13[fb],r1l
    neg.b   r1l
    mov.b   r1l,-11[fb]
    cmp.b   #-16,-11[fb]
    jge .L2
    sha.l   #-8,r2r0
    sha.l   #-8,r2r0
    add.b   #16,-11[fb]
.L2:
    mov.b   -11[fb],r1h
    sha.l   r1h,r2r0
    mov.w   r2,-2[fb]
    mov.w   r0,-4[fb]
    mov.w   -4[fb],r0
    exitd

so it works ok for 4.4.0 


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40129


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/40129] M16C invalid shift count used by pack_d -> ashldi3
  2009-05-13  9:47 [Bug c/40129] New: M16C invalid shift count used by pack_d -> ashldi3 eightdot at hotmail dot com
  2009-05-14  2:53 ` [Bug target/40129] " dj at redhat dot com
  2009-05-18  7:14 ` eightdot at hotmail dot com
@ 2009-05-18  7:15 ` eightdot at hotmail dot com
  2009-05-18 19:16 ` dj at redhat dot com
  2009-05-19 11:23 ` eightdot at hotmail dot com
  4 siblings, 0 replies; 6+ messages in thread
From: eightdot at hotmail dot com @ 2009-05-18  7:15 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #3 from eightdot at hotmail dot com  2009-05-18 07:15 -------
input:
int  main(int argc)
{
        long a=0x12345678;
        long b;
        b=a>>argc;
        return (b);
}


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40129


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/40129] M16C invalid shift count used by pack_d -> ashldi3
  2009-05-13  9:47 [Bug c/40129] New: M16C invalid shift count used by pack_d -> ashldi3 eightdot at hotmail dot com
                   ` (2 preceding siblings ...)
  2009-05-18  7:15 ` eightdot at hotmail dot com
@ 2009-05-18 19:16 ` dj at redhat dot com
  2009-05-19 11:23 ` eightdot at hotmail dot com
  4 siblings, 0 replies; 6+ messages in thread
From: dj at redhat dot com @ 2009-05-18 19:16 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #4 from dj at redhat dot com  2009-05-18 19:16 -------
Yes, those two changes are the fix you need.  However, those fixes were over
three years ago, so I consider this bug "already fixed".  If you agree, please
close this bug.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40129


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/40129] M16C invalid shift count used by pack_d -> ashldi3
  2009-05-13  9:47 [Bug c/40129] New: M16C invalid shift count used by pack_d -> ashldi3 eightdot at hotmail dot com
                   ` (3 preceding siblings ...)
  2009-05-18 19:16 ` dj at redhat dot com
@ 2009-05-19 11:23 ` eightdot at hotmail dot com
  4 siblings, 0 replies; 6+ messages in thread
From: eightdot at hotmail dot com @ 2009-05-19 11:23 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #5 from eightdot at hotmail dot com  2009-05-19 11:23 -------
i agree but could find in which release they are first included..
but already fixed in what i now use (4.3.3)...


-- 

eightdot at hotmail dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |FIXED


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40129


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-05-19 11:23 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-05-13  9:47 [Bug c/40129] New: M16C invalid shift count used by pack_d -> ashldi3 eightdot at hotmail dot com
2009-05-14  2:53 ` [Bug target/40129] " dj at redhat dot com
2009-05-18  7:14 ` eightdot at hotmail dot com
2009-05-18  7:15 ` eightdot at hotmail dot com
2009-05-18 19:16 ` dj at redhat dot com
2009-05-19 11:23 ` eightdot at hotmail dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).