M: x86.32 struct-return-on-stack? os linux? not ;
-M: x86.32 (cpuid) ( n regs -- )
- void { uint void* } cdecl [
+M: x86.32 (cpuid) ( eax ecx regs -- )
+ void { uint uint void* } cdecl [
! Save ds-reg, rs-reg
EDI PUSH
EAX ESP 4 [+] MOV
+ ECX ESP 8 [+] MOV
CPUID
- EDI ESP 8 [+] MOV
+ EDI ESP 12 [+] MOV
EDI [] EAX MOV
EDI 4 [+] EBX MOV
EDI 8 [+] ECX MOV
M: x86.64 struct-return-on-stack? f ;
-M: x86.64 (cpuid) ( n regs -- )
- void { uint void* } cdecl [
+M: x86.64 (cpuid) ( rax rcx regs -- )
+ void { uint uint void* } cdecl [
RAX param-reg-0 MOV
- RSI param-reg-1 MOV
+ RCX param-reg-1 MOV
+ RSI param-reg-2 MOV
CPUID
RSI [] EAX MOV
RSI 4 [+] EBX MOV
: sse4.1? ( -- ? ) sse-version 41 >= ;
: sse4.2? ( -- ? ) sse-version 42 >= ;
-HOOK: (cpuid) cpu ( n regs -- )
+HOOK: (cpuid) cpu ( rax rcx regs -- )
-: cpuid ( n -- 4array )
+
+: cpuid-extended ( rax rcx -- 4array )
4 <uint-array> [ (cpuid) ] keep >array ;
+: cpuid ( rax -- 4array ) 0 cpuid-extended ;
+
: cpu-stepping ( -- n ) 1 cpuid first 4 bits ;
: cpu-model ( -- n ) 1 cpuid first -4 shift 4 bits ;
: cpu-family ( -- n ) 1 cpuid first -8 shift 4 bits ;