]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/x86/features/features.factor
FFI rewrite part 5: return value boxing and callback parameter boxing now uses vregs...
[factor.git] / basis / cpu / x86 / features / features.factor
1 ! Copyright (C) 2009, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs sequences alien alien.c-types
4 combinators compiler compiler.codegen.fixup compiler.units
5 cpu.architecture cpu.x86.assembler cpu.x86.assembler.operands
6 init io kernel locals math math.order math.parser memoize
7 namespaces system ;
8 IN: cpu.x86.features
9
10 <PRIVATE
11
12 : return-reg ( -- reg ) int-regs return-regs at first ;
13
14 : (sse-version) ( -- n )
15     int { } cdecl [
16         "sse-42" define-label
17         "sse-41" define-label
18         "ssse-3" define-label
19         "sse-3" define-label
20         "sse-2" define-label
21         "sse-1" define-label
22         "end" define-label
23
24         return-reg 1 MOV
25
26         CPUID
27
28         ECX 20 BT
29         "sse-42" get JB
30
31         ECX 19 BT
32         "sse-41" get JB
33
34         ECX  9 BT
35         "ssse-3" get JB
36
37         ECX  0 BT
38         "sse-3" get JB
39
40         EDX 26 BT
41         "sse-2" get JB
42
43         EDX 25 BT
44         "sse-1" get JB
45
46         return-reg 0 MOV
47         "end" get JMP
48
49         "sse-42" resolve-label
50         return-reg 42 MOV
51         "end" get JMP
52
53         "sse-41" resolve-label
54         return-reg 41 MOV
55         "end" get JMP
56
57         "ssse-3" resolve-label
58         return-reg 33 MOV
59         "end" get JMP
60
61         "sse-3" resolve-label
62         return-reg 30 MOV
63         "end" get JMP
64
65         "sse-2" resolve-label
66         return-reg 20 MOV
67         "end" get JMP
68
69         "sse-1" resolve-label
70         return-reg 10 MOV
71
72         "end" resolve-label
73     ] alien-assembly ;
74
75 PRIVATE>
76
77 MEMO: sse-version ( -- n )
78     (sse-version) "sse-version" get string>number [ min ] when* ;
79
80 [ \ sse-version reset-memoized ] "cpu.x86.features" add-startup-hook
81
82 : sse? ( -- ? ) sse-version 10 >= ;
83 : sse2? ( -- ? ) sse-version 20 >= ;
84 : sse3? ( -- ? ) sse-version 30 >= ;
85 : ssse3? ( -- ? ) sse-version 33 >= ;
86 : sse4.1? ( -- ? ) sse-version 41 >= ;
87 : sse4.2? ( -- ? ) sse-version 42 >= ;
88
89 : popcnt? ( -- ? )
90     bool { } cdecl [
91         int-regs return-reg 1 MOV
92         CPUID
93         ECX 23 BT
94         int-regs return-reg dup XOR
95         int-regs return-reg SETB
96     ] alien-assembly ;
97
98 : sse-string ( version -- string )
99     {
100         { 00 [ "no SSE" ] }
101         { 10 [ "SSE1" ] }
102         { 20 [ "SSE2" ] }
103         { 30 [ "SSE3" ] }
104         { 33 [ "SSSE3" ] }
105         { 41 [ "SSE4.1" ] }
106         { 42 [ "SSE4.2" ] }
107     } case ;
108
109 HOOK: instruction-count cpu ( -- n )
110
111 M: x86.32 instruction-count
112     longlong { } cdecl [
113         RDTSC
114     ] alien-assembly ;
115
116 M: x86.64 instruction-count
117     longlong { } cdecl [
118         RAX 0 MOV
119         RDTSC
120         RDX 32 SHL
121         RAX RDX OR
122     ] alien-assembly ;
123
124 : count-instructions ( quot -- n )
125     instruction-count [ call instruction-count ] dip - ; inline