puzzling code in pcpu stuff
Julian Elischer
julian at elischer.org
Sun Aug 2 10:25:59 UTC 2009
Julian Elischer wrote:
> 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;
> }
> }
p.s. I looked at the original source but I couldn't really work it out
there either.
>
> having had my brain explode on this several times,
> I can't figure out exactly what teh clause after the else is doing.
well I know wht it appears to be doing fromt eh source but I can;t
work out how.. __asm foo to explain it is missing..
>
> anyone better at reading __asm better than me care to explain it in
> simple words?
(maybe it's just too late at night for me here)
>
> _______________________________________________
> freebsd-current at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe at freebsd.org"
More information about the freebsd-current
mailing list