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 }