Hi Alex,
Thanks... Fixed...
...Only one character at the end, but such a massive result :)
~d
On Wednesday 02 October 2002 06:17, Alexey Zaparovanny wrote:
> Hello Dmitry,
>
> I'm getting some mixed results.
> Looks like that case has been fixed if I use "less" sign instead of "less
> or equal". It generates correct code:
>
> ; if(pThread->m_dwWakeupTime < dwCurrentTime) {
> mov &0x0246,r15 ;src addr 0x0246, Cycles: 2
> mov @r15+, r13 ;Cycles: 2
> mov @r15+, r14 ;Cycles: 2
> sub #4, r15 ;subst r2 with As==10, Cycles: 1
> sub &0x0238,r13 ;src addr 0x0238, Cycles: 2
> subc &0x023a,r14 ;src addr 0x023a, Cycles: 2
> jc $-88 ;abs dst addr 0xa1a2, Cycles: 2
>
> However I change it to "less or equal" I'm getting the following:
> ; if(pThread->m_dwWakeupTime <= dwCurrentTime) {
> mov &0x0246,r15 ;src addr 0x0246, Cycles: 2
> mov &0x0238,r13 ;src addr 0x0238, Cycles: 2
> mov &0x023a,r14 ;src addr 0x023a, Cycles: 2
> sub @r15, r13 ;Cycles: 2
> sub 2(r15), r14 ;Cycles: 3
> jnc $-88 ;abs dst addr 0xa1a2, Cycles: 2
>
> That does not look right to me. Two "sub" instructions in which only the
> last one affects the flags....
>
> Best regards,
> Alexey
>
> > Message: 1
> > From: "Alexey Zaparovanny" <[email protected]>
> > To: <[email protected]>
> > Date: Thu, 26 Sep 2002 20:35:13 -0400
> > Subject: [Mspgcc-users] Re: Looks like compiler bug
> > Reply-To: [email protected]
> >
> > Thanks for fixing it Dmitry!
> >
> > Why is that case so special that you called it "exotic case" ?:)
> >
> > Best regards!
> >
> > > From: "Alexey Zaparovanny" <[email protected]>
> > > To: <[email protected]>
> > > Date: Thu, 26 Sep 2002 01:20:07 -0400
> > > Subject: [Mspgcc-users] Looks like compiler bug
> > > Reply-To: [email protected]
> > >
> > > Hello,
> > >
> > > Looks like compiler generated buggy code when it handles "unsigned long
> >
> > int"
> >
> > > types:
> > >
> > > Following simplified c code produces incorrect comparison code on line
> > > marked with "**--->"
> > >
> > > while(1) {
> > > if(cThreadIndex == cLastThreadIndex) {
> > > cThreadIndex = 0;
> > > } else {
> > > cThreadIndex++;
> > > }
> > > if((threads[cThreadIndex].m_cThreadFlags & THREAD_FLAG_SLEEPING) ==
> > > 0)
>
> {
>
> > > break;
> > > **---> } else if(threads[cThreadIndex].m_dwWakeupTime <=
> > > dwCurrentTime)
>
> {
>
> > > break;
> > > }
> > > }
> > > ------
> > > Here is the assembly output: (this "restore r15 at the third line from
>
> the
>
> > > bottom upsets the flag register")
> > >
> > > .L6:
> > > cmp.b &cLastThreadIndex, &cThreadIndex
> > > jne .L9
> > > mov.b #llo(0), &cThreadIndex
> > > jmp .L10
> > > .L9:
> > > add.b #llo(1), &cThreadIndex
> > > .L10:
> > > mov.b &cThreadIndex, r14
> > > mov r14, r15
> > > rla r15
> > > rla r15
> > > add r14, r15
> > > rla r15
> > > add #threads+8, r15
> > > mov.b @r15, r15
> > > and.b #llo(1), r15
> > > tst.b r15
> > > jne .L11
> > > jmp .L7
> > > .L11:
> > > mov.b &cThreadIndex, r14
> > > mov r14, r15
> > > rla r15
> > > rla r15
> > > add r14, r15
> > > rla r15
> > > add #threads, r15
> > > mov &dwCurrentTime, r13
> > > mov &dwCurrentTime+2, r14
> > > sub @r15+, r13
> > > subc @r15+, r14
> > > sub #4, r15 ; restore r15
> > > jlo .L6
> > > .L7:
> > >
> > >
> > >
> > > -- __--__--
> > >
> > > Message: 2
> > > From: Dmitry <[email protected]>
> > > Organization: EIS
> > > To: [email protected]
> > > Subject: Re: [Mspgcc-users] Looks like compiler bug
> > > Date: Thu, 26 Sep 2002 11:16:51 +0400
> > > Reply-To: [email protected]
> > >
> > > Thanks for reporting this.
> > > Fixed.
> > > Please update sources and recompile gcc.
> > >
> > > Actually, very exotic case :)
> > >
> > > And yesterday, I commited a binutils update. New section ".noinit"
>
> added.=
>
> > > =2E.
> > > Vars in this section will not be inited during system start-up.
> > >
> > >
> > > ~d
> >
> > --__--__--
> >
> > Message: 2
> > From: Dmitry <[email protected]>
> > Organization: EIS
> > To: [email protected]
> > Subject: Re: [Mspgcc-users] Re: Looks like compiler bug
> > Date: Fri, 27 Sep 2002 10:30:31 +0400
> > Reply-To: [email protected]
> >
> > "exotic case" here can be reffered to gcc internal code generation.
> >
> > Almost all arithmetic insns use 'indexed with postincrement' for an
> > array= =20
> > element if possible with later index restore if necessary. For example:
> > =09mov @r15+, r10
> > =09mov @r15+, r11
> > If r15 being used and not set afterwards, gcc issues.
> > =09sub #4, r15
> >
> > This is better than
> > =09mov @r15, r10
> > =09mov 2(r15), r11
> > cause we win one cycle and 2 bytes in first case.
> >
> > In the code below the first pattern being used in cmpSI just before jump
> > = insn.
> > the r15 sould be dead or set after jump insn, but gcc does set such a
> > fla= g to=20
> > the register cause of end of function. So, sub #4, r15 being issued
>
> just=20
>
> > before jump insn, which clobbers SR.
> >
> > ~d
--
/********************************************************************
("`-''-/").___..--''"`-._ (\ Dimmy the Wild UA1ACZ
`6_ 6 ) `-. ( ).`-.__.`) Enterprise Information Sys
(_Y_.)' ._ ) `._ `. ``-..-' Nevsky prospekt, 20 / 44
_..`--'_..-_/ /--'_.' ,' Saint Petersburg, Russia
(il),-'' (li),' ((!.-' +7 (812) 3468202, 5585314
********************************************************************/