ObjFW  Diff

Differences From Artifact [df1cd50578]:

To Artifact [77d1af34d2]:


42
43
44
45
46
47
48



49
50
51
52
53
54
55
56
57




58
59
60
61
62
63
64
#endif
#ifdef __HAIKU__
# include <FindDirectory.h>
#endif
#ifdef __QNX__
# include <sys/syspage.h>
#endif




#if defined(OF_X86_64_ASM) || defined(OF_X86_ASM)
struct x86_regs {
	uint32_t eax, ebx, ecx, edx;
};
#endif

static size_t pageSize;
static size_t numberOfCPUs;





#if defined(OF_X86_64_ASM)
static OF_INLINE struct x86_regs OF_CONST_FUNC
x86_cpuid(uint32_t eax, uint32_t ecx)
{
	struct x86_regs regs;








>
>
>









>
>
>
>







42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#endif
#ifdef __HAIKU__
# include <FindDirectory.h>
#endif
#ifdef __QNX__
# include <sys/syspage.h>
#endif
#ifdef OF_PPC_ASM
# include <setjmp.h>
#endif

#if defined(OF_X86_64_ASM) || defined(OF_X86_ASM)
struct x86_regs {
	uint32_t eax, ebx, ecx, edx;
};
#endif

static size_t pageSize;
static size_t numberOfCPUs;
#ifdef OF_PPC_ASM
static sig_atomic_t altiVecSupported;
static sigjmp_buf altiVecJumpBuffer;
#endif

#if defined(OF_X86_64_ASM)
static OF_INLINE struct x86_regs OF_CONST_FUNC
x86_cpuid(uint32_t eax, uint32_t ecx)
{
	struct x86_regs regs;

90
91
92
93
94
95
96
97









98














99
100
101
102
103
104
105
	    : "=a"(regs.eax), "=r"(regs.ebx), "=c"(regs.ecx), "=d"(regs.edx)
	    : "a"(eax), "c"(ecx)
	);

	return regs;
}
#endif










@implementation OFSystemInfo














+ (void)initialize
{
	if (self != [OFSystemInfo class])
		return;

#if defined(_WIN32)
	SYSTEM_INFO si;








>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>







97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
	    : "=a"(regs.eax), "=r"(regs.ebx), "=c"(regs.ecx), "=d"(regs.edx)
	    : "a"(eax), "c"(ecx)
	);

	return regs;
}
#endif

#ifdef OF_PPC_ASM
static void
altiVecSIGILLHandler(int signal)
{
	altiVecSupported = 0;
	siglongjmp(altiVecJumpBuffer, 1);
}
#endif

@implementation OFSystemInfo
#ifdef OF_PPC_ASM
+ (void)load
{
	altiVecSupported = 1;
	if (sigsetjmp(altiVecJumpBuffer, 1) == 0) {
		signal(SIGILL, altiVecSIGILLHandler);
		__asm__ __volatile__ (
		    "vor	v0, v0, v0"
		);
	}
	signal(SIGILL, SIG_DFL);
}
#endif

+ (void)initialize
{
	if (self != [OFSystemInfo class])
		return;

#if defined(_WIN32)
	SYSTEM_INFO si;
367
368
369
370
371
372
373







374
}

+ (bool)supportsAVX2
{
	return x86_cpuid(0, 0).eax >= 7 && (x86_cpuid(7, 0).ebx & (1 << 5));
}
#endif







@end







>
>
>
>
>
>
>

397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
}

+ (bool)supportsAVX2
{
	return x86_cpuid(0, 0).eax >= 7 && (x86_cpuid(7, 0).ebx & (1 << 5));
}
#endif

#ifdef OF_PPC_ASM
+ (bool)supportsAltiVec
{
	return altiVecSupported;
}
#endif
@end