This source file includes following definitions.
- opal_arch_isbigendian
- opal_arch_ldisintel
- opal_arch_setmask
- opal_arch_init
- opal_arch_checkmask
- opal_arch_set_fortran_logical_size
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 #include "opal_config.h"
  20 
  21 #include "opal/constants.h"
  22 #include "opal/util/arch.h"
  23 
  24 uint32_t opal_local_arch = 0xFFFFFFFF;
  25 
  26 static inline int32_t opal_arch_isbigendian ( void )
  27 {
  28     const uint32_t value = 0x12345678;
  29     const char *ptr = (char*)&value;
  30     int x = 0;
  31 
  32     
  33     if( ptr[x] == 0x12)  return 1; 
  34     if( ptr[x] == 0x78 ) return 0; 
  35     assert( 0 );  
  36     return -1;
  37 }
  38 
  39 
  40 
  41 
  42 
  43 
  44 
  45 
  46 
  47 
  48 
  49 
  50 static inline int32_t opal_arch_ldisintel( void )
  51 {
  52     long double ld = 2.0;
  53     int i, j;
  54     uint32_t* pui = (uint32_t*)(void*)&ld;
  55 
  56     j = LDBL_MANT_DIG / 32;
  57     i = (LDBL_MANT_DIG % 32) - 1;
  58     if( opal_arch_isbigendian() ) { 
  59         j = (sizeof(long double) / sizeof(unsigned int)) - j;
  60         if( i < 0 ) {
  61             i = 31;
  62             j = j+1;
  63         }
  64     } else {
  65         if( i < 0 ) {
  66             i = 31;
  67             j = j-1;
  68         }
  69     }
  70     return (pui[j] & (1 << i) ? 1 : 0);
  71 }
  72 
  73 static inline void opal_arch_setmask ( uint32_t *var, uint32_t mask)
  74 {
  75     *var |= mask;
  76 }
  77 
  78 int opal_arch_init(void)
  79 {
  80     opal_local_arch = (OPAL_ARCH_HEADERMASK | OPAL_ARCH_UNUSEDMASK);
  81 
  82     
  83     if( 8 == sizeof(long) )
  84         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LONGIS64 );
  85 
  86     
  87     if (1 == sizeof(bool) ) {
  88         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_BOOLIS8);
  89     } else if (2 == sizeof(bool)) {
  90         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_BOOLIS16);
  91     } else if (4 == sizeof(bool)) {
  92         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_BOOLIS32);
  93     }
  94 
  95     
  96 
  97 
  98     
  99     if( 12 == sizeof(long double) )
 100         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LONGDOUBLEIS96 );
 101     else if( 16 == sizeof(long double) )
 102         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LONGDOUBLEIS128 );
 103 
 104     
 105     if( opal_arch_isbigendian() )
 106         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_ISBIGENDIAN );
 107 
 108     
 109     if ( LDBL_MAX_EXP == 16384 )
 110         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LDEXPSIZEIS15 );
 111 
 112     
 113     if ( LDBL_MANT_DIG == 64 )
 114         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LDMANTDIGIS64 );
 115     else if ( LDBL_MANT_DIG == 105 )
 116         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LDMANTDIGIS105 );
 117     else if ( LDBL_MANT_DIG == 106 )
 118         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LDMANTDIGIS106 );
 119     else if ( LDBL_MANT_DIG == 107 )
 120         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LDMANTDIGIS107 );
 121     else if ( LDBL_MANT_DIG == 113 )
 122         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LDMANTDIGIS113 );
 123 
 124     
 125     if( opal_arch_ldisintel() )
 126         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LDISINTEL );
 127 
 128     return OPAL_SUCCESS;
 129 }
 130 
 131 int32_t opal_arch_checkmask ( uint32_t *var, uint32_t mask )
 132 {
 133     unsigned int tmpvar = *var;
 134 
 135     
 136 
 137     if( !((*var) & OPAL_ARCH_HEADERMASK) ) {
 138         if( (*var) & OPAL_ARCH_HEADERMASK2 ) {
 139             char* pcDest, *pcSrc;
 140             
 141 
 142 
 143 
 144 
 145 
 146             pcDest = (char *) &tmpvar;
 147             pcSrc  = (char *) var + 3;
 148             *pcDest++ = *pcSrc--;
 149             *pcDest++ = *pcSrc--;
 150             *pcDest++ = *pcSrc--;
 151             *pcDest++ = *pcSrc--;
 152 
 153             if( (tmpvar & OPAL_ARCH_HEADERMASK) && (!(tmpvar & OPAL_ARCH_HEADERMASK2)) ) {
 154                 *var = tmpvar;
 155             } else
 156                 return -1;
 157         } else
 158             return -1;
 159     }
 160 
 161     
 162     return ( ((*var) & mask) == mask );
 163 }
 164 
 165 int
 166 opal_arch_set_fortran_logical_size(uint32_t size)
 167 {
 168     if (1 == size) {
 169         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LOGICALIS8);
 170     } else if (2 == size) {
 171         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LOGICALIS16);
 172     } else if (4 == size) {
 173         opal_arch_setmask( &opal_local_arch, OPAL_ARCH_LOGICALIS32);
 174     }
 175 
 176     return OPAL_SUCCESS;
 177 }