diff --git a/basis/cpu/x86/features/features.factor b/basis/cpu/x86/features/features.factor index 7913489178..c202b7c998 100644 --- a/basis/cpu/x86/features/features.factor +++ b/basis/cpu/x86/features/features.factor @@ -22,23 +22,23 @@ IN: cpu.x86.features CPUID - ECX HEX: 100000 TEST - "sse-42" get JNE + ECX 20 BT + "sse-42" get JB - ECX HEX: 80000 TEST - "sse-41" get JNE + ECX 19 BT + "sse-41" get JB - ECX HEX: 200 TEST - "ssse-3" get JNE + ECX 9 BT + "ssse-3" get JB - ECX HEX: 1 TEST - "sse-3" get JNE + ECX 0 BT + "sse-3" get JB - EDX HEX: 4000000 TEST - "sse-2" get JNE + EDX 26 BT + "sse-2" get JB - EDX HEX: 2000000 TEST - "sse-1" get JNE + EDX 25 BT + "sse-1" get JB int-regs return-reg 0 MOV "end" get JMP @@ -69,6 +69,15 @@ IN: cpu.x86.features "end" resolve-label ] alien-assembly ; +: (popcnt?) ( -- n ) + int { } cdecl [ + int-regs return-reg 1 MOV + CPUID + ECX 23 BT + int-regs return-reg dup XOR + int-regs return-reg SETB + ] alien-assembly ; + PRIVATE> MEMO: sse-version ( -- n ) @@ -83,6 +92,8 @@ MEMO: sse-version ( -- n ) : sse4.1? ( -- ? ) sse-version 41 >= ; : sse4.2? ( -- ? ) sse-version 42 >= ; +: popcnt? ( -- ? ) (popcnt?) c-bool> ; + : sse-string ( version -- string ) { { 00 [ "no SSE" ] }