The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

#ifdef PERL_IMPLICIT_CONTEXT
/*
 *   LOG2(a) == floor(log_2(a))
 */
#  define LOG2(a) M(((S16(S8(S4(S2(S1(a))))))>>1)+1)
#    define S1(a)  (a)|((a)>>1)
#    define S2(a)  (a)|((a)>>2)
#    define S4(a)  (a)|((a)>>4)
#    define S8(a)  (a)|((a)>>8)
#    define S16(a) (a)|((a)>>16)
#    define M(a) \
     (((a)&0xffff0000 ? 16 : 0) +\
      ((a)&0xff00ff00 ?  8 : 0) +\
      ((a)&0xf0f0f0f0 ?  4 : 0) +\
      ((a)&0xcccccccc ?  2 : 0) +\
      ((a)&0xaaaaaaaa ?  1 : 0))

#  define rvalue() ((UV)aTHX)>>LOG2(sizeof *(aTHX))

#else // !PERL_IMPLICIT_CONTEXT
#  define rvalue() 0
#endif

MODULE = Thread::IID		PACKAGE = Thread::IID		

UV
interpreter_id()
   PROTOTYPE: 
   CODE:
      RETVAL = rvalue();

   OUTPUT:
      RETVAL