From mboxrd@z Thu Jan 1 00:00:00 1970 From: Richard Henderson To: egcs@cygnus.com Subject: register variables vs asm? Date: Thu, 09 Oct 1997 14:56:00 -0000 Message-id: <19971009120812.15403@dot.cygnus.com> X-SW-Source: 1997-10/msg00367.html EGCS is not respecting the register assigned to the variable in the appended example on Alpha. Unlike the previous nonsense with longjmp, I should be able to expect this to work, yes? I'll look at the problem soon, as this also completely screws the kernel. r~ typedef struct _pthread_descr_struct * pthread_descr; struct _pthread_descr_struct { int p_cancelstate; int p_canceltype; int p_canceled; }; static inline pthread_descr thread_self (void) __attribute__ ((const)); static inline pthread_descr thread_self (void) { register pthread_descr __self __asm__("$0"); __asm__ ("call_pal %1 # %0" : "=r"(__self) : "i"(158 )); return __self; } int pthread_setcancelstate(int state, int * oldstate) { pthread_descr self = thread_self(); if (state < 0 || state > 5) return 22 ; if (oldstate != ((void *)0) ) *oldstate = self->p_cancelstate; self->p_cancelstate = state; if (self->p_canceled && self->p_cancelstate == 1 && self->p_canceltype == 2) pthread_exit(((void *) -1) ); return 0; }