puzzling code in pcpu stuff
Julian Elischer
julian at elischer.org
Sun Aug 2 09:53:19 UTC 2009
I simplified the output of the preprocessor for a PCPU_SET(xx, newval)
(to look at it).
I came down to: (after formatting) for i386..
{
__typeof(((struct pcpu *)0)->pc_xx) __val;
struct __s
{
u_char __b[(((sizeof(__val)) < (4)) ?
(sizeof(__val)) : (4))];
} __s;
__val = (newval); /* aligned */
if (sizeof(__val) == 1
|| sizeof(__val) == 2
|| sizeof(__val) == 4) {
__s = *(struct __s *)(void *)&__val;
__asm volatile("mov %1,%%fs:%0" : "=m"
(*(struct __s *)(__builtin_offsetof(
struct pcpu, pc_xx))) : "r" (__s));
} else {
*__extension__ (
{
__typeof(__val) *__p;
__asm volatile("movl %%fs:%1,%0;
addl %2,%0" : "=r" (__p) : "m"
(*(struct pcpu *)(__builtin_offsetof(struct pcpu, pc_prvspace))),
"i"
(__builtin_offsetof(struct pcpu, pc_xx)));
__p;
}) = __val;
}
}
having had my brain explode on this several times,
I can't figure out exactly what teh clause after the else is doing.
anyone better at reading __asm better than me care to explain it in
simple words?
More information about the freebsd-current
mailing list