cpu.x86.features: Implement cpuid with help from joe. Add unit test.
parent
8b49518349
commit
0d337e04ea
|
@ -1,7 +1,9 @@
|
|||
USING: cpu.x86.features tools.test kernel sequences math math.order system ;
|
||||
USING: cpu.x86.features tools.test kernel sequences math math.order
|
||||
strings system io.binary ;
|
||||
IN: cpu.x86.features.tests
|
||||
|
||||
cpu x86? [
|
||||
[ t ] [ sse-version 0 42 between? ] unit-test
|
||||
[ t ] [ [ 10000 [ ] times ] count-instructions integer? ] unit-test
|
||||
] when
|
||||
[ t ] [ sse-version 0 42 between? ] unit-test
|
||||
[ t ] [ [ 10000 [ ] times ] count-instructions integer? ] unit-test
|
||||
|
||||
{ "GenuineIntel" }
|
||||
[ 0 cpuid [ 4 >le ] map { 1 3 2 } swap nths concat >string ] unit-test
|
||||
|
|
|
@ -4,7 +4,8 @@ USING: accessors assocs sequences alien alien.c-types
|
|||
combinators compiler compiler.codegen.labels compiler.units
|
||||
cpu.architecture cpu.x86.assembler cpu.x86.assembler.operands
|
||||
init io kernel locals math math.order math.parser memoize
|
||||
namespaces system ;
|
||||
namespaces system arrays specialized-arrays ;
|
||||
SPECIALIZED-ARRAY: uint
|
||||
IN: cpu.x86.features
|
||||
|
||||
<PRIVATE
|
||||
|
@ -84,6 +85,35 @@ MEMO: sse-version ( -- n )
|
|||
: sse4.1? ( -- ? ) sse-version 41 >= ;
|
||||
: sse4.2? ( -- ? ) sse-version 42 >= ;
|
||||
|
||||
HOOK: (cpuid) cpu ( n regs -- )
|
||||
|
||||
M: x86.32 (cpuid) ( n regs -- )
|
||||
void { uint void* } cdecl [
|
||||
! Save ds-reg, rs-reg
|
||||
EDI PUSH
|
||||
EAX ESP 4 [+] MOV
|
||||
CPUID
|
||||
EDI ESP 8 [+] MOV
|
||||
EDI [] EAX MOV
|
||||
EDI 4 [+] EBX MOV
|
||||
EDI 8 [+] ECX MOV
|
||||
EDI 12 [+] EDX MOV
|
||||
EDI POP
|
||||
] alien-assembly ;
|
||||
|
||||
M: x86.64 (cpuid) ( n regs -- )
|
||||
void { uint void* } cdecl [
|
||||
RAX RDI MOV
|
||||
CPUID
|
||||
RSI [] EAX MOV
|
||||
RSI 4 [+] EBX MOV
|
||||
RSI 8 [+] ECX MOV
|
||||
RSI 12 [+] EDX MOV
|
||||
] alien-assembly ;
|
||||
|
||||
: cpuid ( n -- 4array )
|
||||
4 <uint-array> [ (cpuid) ] keep >array ;
|
||||
|
||||
: popcnt? ( -- ? )
|
||||
bool { } cdecl [
|
||||
return-reg 1 MOV
|
||||
|
|
Loading…
Reference in New Issue