[fpc-devel] AMD & Intel CPUCount (was: Feature announcement: Extension of TThread's interface)

Mattias Gaertner nc-gaertnma at netcologne.de
Fri Dec 28 00:42:02 CET 2012


On Thu, 27 Dec 2012 23:06:41 +0100
Ewald <ewald at yellowcouch.org> wrote:

> Right, since the /proc/cpuinfo (a) is not available on many platforms
> and (b) has no standard output format, I decided to fix the half done
> CPUID approach. Here it goes (note: don't shoot me if my assembly is a
> bit weird, I've only learned part of it by experimenting):
>     [see below]
> 
> For time being there are only two CPU kinds supported (GenuineIntel and
> AuthenticAMD), in other cases it returns the # of logical CPU's. Feel
> free to extend the code with other CPU ID's ;-)
> 
> Oh, and the important part: The function has been tested on a Core 2 Duo
> and an Intel i7, and works correctly. If someone would be so kind to
> test it on some other CPU's that would be great! [I'm not 100% of the
> hexadecimal of `AuthenticAMD` you see]

It gives 4 correctly for an AMD Phenom(tm) II X4 965 Processor.

Mattias

 
> program cpucount;
> 
> {$mode objfpc}
> {$asmmode att}
> 
> Function GetCores: LongWord;
> Begin
>     Asm
>         //Vendor ID
>         MOV $0, %eax
>         MOV $0, %ecx
>         CPUID
>        
>         // ?= GenuineIntel
>         CMP $0x756e6547, %ebx
>         JNE .LnotGenuineIntel
>         CMP $0x49656e69, %edx
>         JNE .LnotGenuineIntel
>         CMP $0x6c65746e, %ecx
>         JNE .LnotGenuineIntel
>        
>         MOV $4, %eax
>         MOV $0, %ecx
>         CPUID
>        
>         SHR $26, %eax
>         AND $0x3F, %eax
>         ADD $1, %eax
>         MOV %eax, __RESULT
>         JMP .LReturn
>        
>         .LnotGenuineIntel:
>        
>         // ?= AuthenticAMD
>         CMP $0x68747541, %ebx
>         JNE .LnotAuthenticAMD
>         CMP $0x69746e65, %edx
>         JNE .LnotAuthenticAMD
>         CMP $0x444d4163, %ecx
>         JNE .LnotAuthenticAMD
>        
>         MOV $0x80000008, %eax
>         MOV $0, %ecx
>         CPUID
>        
>         AND $0xFF, %ecx
>         ADD $1, %ecx
>         MOV %ecx, __RESULT
>         JMP .LReturn
>        
>         .LnotAuthenticAMD:
>        
>         //Return #logical CPU's
>         MOV $1, %eax
>         MOV $0, %ecx
>         CPUID
>        
>         SHR $16, %ebx
>         AND $0xFF, %ebx
>         MOV %ebx, __RESULT
>        
>         .LReturn:
>     End ['eax', 'ebx', 'ecx', 'edx'];
> End;
> 
> Begin
>     Writeln('#CPU cores: ', GetCores);
> End.
> 
> 
> 



More information about the fpc-devel mailing list