File tree 1 file changed +10
-0
lines changed 1 file changed +10
-0
lines changed Original file line number Diff line number Diff line change @@ -1403,9 +1403,19 @@ extern void __kmp_query_cpuid(kmp_cpuinfo_t *p);
1403
1403
// subleaf is only needed for cache and topology discovery and can be set to
1404
1404
// zero in most cases
1405
1405
static inline void __kmp_x86_cpuid (int leaf, int subleaf, struct kmp_cpuid *p) {
1406
+ #if KMP_ARCH_X86 && (defined(__pic__) || defined(__PIC__))
1407
+ // on i386 arch, the ebx reg. is used by pic, thus we need to preserve from
1408
+ // being trashed beforehand
1409
+ __asm__ __volatile__ (" mov %%ebx, %%edi\n "
1410
+ " cpuid\n "
1411
+ " xchg %%edi, %%ebx\n "
1412
+ : " =a" (p->eax ), " =b" (p->ebx ), " =c" (p->ecx ), " =d" (p->edx )
1413
+ : " a" (leaf), " c" (subleaf));
1414
+ #else
1406
1415
__asm__ __volatile__ (" cpuid"
1407
1416
: " =a" (p->eax ), " =b" (p->ebx ), " =c" (p->ecx ), " =d" (p->edx )
1408
1417
: " a" (leaf), " c" (subleaf));
1418
+ #endif
1409
1419
}
1410
1420
// Load p into FPU control word
1411
1421
static inline void __kmp_load_x87_fpu_control_word (const kmp_int16 *p) {
You can’t perform that action at this time.
0 commit comments