lkml.org 
[lkml]   [2003]   [Aug]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [2.4] gcc3 warns about type-punned pointers ?
On Sat, Aug 30, 2003 at 02:33:08PM +0200, Mikulas Patocka wrote:
> > > A collateral question: why is the reason for this function ?
> > > long long assignments are not atomic in gcc ?
> >
> > Another question: why do we do _double_ store here?
> >
> > static inline void __set_64bit (unsigned long long * ptr,
> > unsigned int low, unsigned int high)
> > {
> > __asm__ __volatile__ (
> > "\n1:\t"
> > "movl (%0), %%eax\n\t"
> > "movl 4(%0), %%edx\n\t"
> > "lock cmpxchg8b (%0)\n\t"
> > "jnz 1b"
> > : /* no outputs */
> > : "D"(ptr),
> > "b"(low),
> > "c"(high)
> > : "ax","dx","memory");
> > }
> >
> > This will execute expensive locked load-compare-store operation twice
> > almost always (unless previous value was already equal
> > to the value we are about to store)
>
> It doesn't double store. cmpxchg8b does:
> compare memory with edx:eax
> if equal, copy copy ecx:ebx into memory, set zf = 1
> else copy memory into edx:eax, set zf = 0
>
> > AFAIK we can safely drop that loop (jnz instruction)
>
> No. The only possible optimization would be to move 1: label directly at
> cmpxgch8b. But it won't bring much, because loop is executed only if value
> was changed after read and before cmpxchg.

Indeed.

>
> There is another worse problem --- jump instructions are predicted as
> taken when they point backwards, so it gets mispredicted. jnz should
> really point to some other section, that is linked after .text, where
> unconditional jump backwards would be.

On Pentium IV, you can prefix the jump instruction to alter the default
prediction (the encoding reuses one of the segment overides prefixes).

Regards,
Gabriel
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:48    [W:0.075 / U:0.664 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site