puzzling code in pcpu stuff

From: Julian Elischer <julian_at_elischer.org>
Date: Sun, 02 Aug 2009 02:53:24 -0700
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?
Received on Sun Aug 02 2009 - 07:53:19 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:53 UTC