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