Overview
Comment: | OFSystemInfo: Add methods to check CPU features |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
a7ebc72ac76a62f196385ae86d450e7f |
User & Date: | js on 2015-02-23 00:19:40 |
Other Links: | manifest | tags |
Context
2015-03-22
| ||
10:10 | OFFile: Add methods for [ac]time, rename for mtime check-in: d6ab9e2c62 user: js tags: trunk | |
2015-02-23
| ||
00:19 | OFSystemInfo: Add methods to check CPU features check-in: a7ebc72ac7 user: js tags: trunk | |
2015-02-20
| ||
18:52 | Remove useless descriptions in some exceptions check-in: e8bb29e8e8 user: js tags: trunk | |
Changes
Modified src/OFFile.m from [43dd30c121] to [804562284b].
︙ | ︙ | |||
1027 1028 1029 1030 1031 1032 1033 | return _atEndOfStream; } - (size_t)lowlevelReadIntoBuffer: (void*)buffer length: (size_t)length { ssize_t ret; | < | 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 | return _atEndOfStream; } - (size_t)lowlevelReadIntoBuffer: (void*)buffer length: (size_t)length { ssize_t ret; if (_fd == -1 || _atEndOfStream) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length]; #ifndef _WIN32 if ((ret = read(_fd, buffer, length)) < 0) |
︙ | ︙ |
Modified src/OFSystemInfo.h from [91e2113668] to [83510ab411].
︙ | ︙ | |||
70 71 72 73 74 75 76 77 | * `NSLibraryDirectory` directory.@n * On Windows, it uses the `APPDATA` environment variable.@n * On Haiku, it uses the `B_USER_SETTINGS_DIRECTORY` directory. * * @return The path where user configuration for the application can be stored */ + (OFString*)userConfigPath; @end | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 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 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | * `NSLibraryDirectory` directory.@n * On Windows, it uses the `APPDATA` environment variable.@n * On Haiku, it uses the `B_USER_SETTINGS_DIRECTORY` directory. * * @return The path where user configuration for the application can be stored */ + (OFString*)userConfigPath; /*! * @brief Returns the vendor of the CPU. * * If the vendor could not be determined, nil is returned instead. * * @return The vendor of the CPU */ + (OFString*)CPUVendor; /*! * @brief Returns whether the CPU supports MMX. * * @return Whether the CPU supports MMX */ + (bool)supportsMMX; /*! * @brief Returns whether the CPU supports SSE. * * @return Whether the CPU supports SSE */ + (bool)supportsSSE; /*! * @brief Returns whether the CPU supports SSE2. * * @return Whether the CPU supports SSE2 */ + (bool)supportsSSE2; /*! * @brief Returns whether the CPU supports SSE3. * * @return Whether the CPU supports SSE3 */ + (bool)supportsSSE3; /*! * @brief Returns whether the CPU supports SSSE3. * * @return Whether the CPU supports SSSE3 */ + (bool)supportsSSSE3; /*! * @brief Returns whether the CPU supports SSE4.1. * * @return Whether the CPU supports SSE4.1 */ + (bool)supportsSSE41; /*! * @brief Returns whether the CPU supports SSE4.2. * * @return Whether the CPU supports SSE4.2 */ + (bool)supportsSSE42; /*! * @brief Returns whether the CPU supports AVX. * * @return Whether the CPU supports AVX */ + (bool)supportsAVX; /*! * @brief Returns whether the CPU supports AVX2. * * @return Whether the CPU supports AVX2 */ + (bool)supportsAVX2; @end |
Modified src/OFSystemInfo.m from [d1253c8608] to [6148f51021].
︙ | ︙ | |||
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #endif #ifdef __HAIKU__ # include <FindDirectory.h> #endif #ifdef __QNX__ # include <sys/syspage.h> #endif static size_t pageSize; static size_t numberOfCPUs; @implementation OFSystemInfo + (void)initialize { if (self != [OFSystemInfo class]) return; | > > > > > > > > > > > > > > > > > > > > > > | 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 72 73 74 75 76 77 78 79 80 | #endif #ifdef __HAIKU__ # include <FindDirectory.h> #endif #ifdef __QNX__ # include <sys/syspage.h> #endif struct cpuid_regs { uint32_t eax, ebx, ecx, edx; }; static size_t pageSize; static size_t numberOfCPUs; static OF_INLINE struct cpuid_regs OF_CONST_FUNC cpuid(uint32_t eax, uint32_t ecx) { struct cpuid_regs regs; #if defined(OF_X86_64_ASM) || defined(OF_X86_ASM) __asm__( "cpuid" : "=a"(regs.eax), "=b"(regs.ebx), "=c"(regs.ecx), "=d"(regs.edx) : "a"(eax), "c"(ecx) ); #else regs.eax = regs.ebx = regs.ecx = regs.edx = 0; #endif return regs; } @implementation OFSystemInfo + (void)initialize { if (self != [OFSystemInfo class]) return; |
︙ | ︙ | |||
252 253 254 255 256 257 258 259 | var = [var stringByAppendingPathComponent: @".config"]; [var retain]; objc_autoreleasePoolPop(pool); return [var autorelease]; #endif } @end | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | var = [var stringByAppendingPathComponent: @".config"]; [var retain]; objc_autoreleasePoolPop(pool); return [var autorelease]; #endif } + (OFString*)CPUVendor { struct cpuid_regs regs = cpuid(0, 0); char buffer[12]; if (regs.eax == 0) return nil; memcpy(buffer, ®s.ebx, 4); memcpy(buffer + 4, ®s.edx, 4); memcpy(buffer + 8, ®s.ecx, 4); return [OFString stringWithCString: buffer encoding: OF_STRING_ENCODING_ASCII length: 12]; } + (bool)supportsMMX { return (cpuid(1, 0).edx & (1 << 23)); } + (bool)supportsSSE { return (cpuid(1, 0).edx & (1 << 25)); } + (bool)supportsSSE2 { return (cpuid(1, 0).edx & (1 << 26)); } + (bool)supportsSSE3 { return (cpuid(1, 0).ecx & (1 << 0)); } + (bool)supportsSSSE3 { return (cpuid(1, 0).ecx & (1 << 9)); } + (bool)supportsSSE41 { return (cpuid(1, 0).ecx & (1 << 19)); } + (bool)supportsSSE42 { return (cpuid(1, 0).ecx & (1 << 20)); } + (bool)supportsAVX { return (cpuid(1, 0).ecx & (1 << 28)); } + (bool)supportsAVX2 { return cpuid(0, 0).eax >= 7 && (cpuid(7, 0).ebx & (1 << 5)); } @end |