1 USING: accessors alien alien.c-types alien.syntax arrays assocs
2 biassocs classes.struct combinators cpu.x86.64
3 cpu.x86.assembler cpu.x86.assembler.operands cpu.x86.features
4 kernel literals math math.bitwise math.floats.env
5 math.floats.env.private system ;
6 IN: math.floats.env.x86
15 HOOK: get-sse-env cpu ( sse-env -- )
16 HOOK: set-sse-env cpu ( sse-env -- )
18 HOOK: get-x87-env cpu ( x87-env -- )
19 HOOK: set-x87-env cpu ( x87-env -- )
23 void { void* } "cdecl" [
29 void { void* } "cdecl" [
35 void { void* } "cdecl" [
42 void { void* } "cdecl" [
50 void { void* } "cdecl" [
51 param-reg-0 [] STMXCSR
55 void { void* } "cdecl" [
56 param-reg-0 [] LDMXCSR
60 void { void* } "cdecl" [
62 param-reg-0 2 [+] FNSTCW
66 void { void* } "cdecl" [
68 param-reg-0 2 [+] FLDCW
71 : <sse-env> ( -- sse-env )
72 sse-env (struct) [ get-sse-env ] keep ;
74 M: sse-env (set-fp-env-register)
77 : <x87-env> ( -- x87-env )
78 x87-env (struct) [ get-x87-env ] keep ;
80 M: x87-env (set-fp-env-register)
83 M: x86 (fp-env-registers)
84 sse2? [ <sse-env> <x87-env> 2array ] [ <x87-env> 1array ] if ;
86 CONSTANT: sse-exception-flag-bits HEX: 3f
87 CONSTANT: sse-exception-flag>bit
89 { +fp-invalid-operation+ HEX: 01 }
90 { +fp-overflow+ HEX: 08 }
91 { +fp-underflow+ HEX: 10 }
92 { +fp-zero-divide+ HEX: 04 }
93 { +fp-inexact+ HEX: 20 }
96 CONSTANT: sse-fp-traps-bits HEX: 1f80
97 CONSTANT: sse-fp-traps>bit
99 { +fp-invalid-operation+ HEX: 0080 }
100 { +fp-overflow+ HEX: 0400 }
101 { +fp-underflow+ HEX: 0800 }
102 { +fp-zero-divide+ HEX: 0200 }
103 { +fp-inexact+ HEX: 1000 }
106 CONSTANT: sse-rounding-mode-bits HEX: 6000
107 CONSTANT: sse-rounding-mode>bit
109 { +round-nearest+ HEX: 0000 }
110 { +round-down+ HEX: 2000 }
111 { +round-up+ HEX: 4000 }
112 { +round-zero+ HEX: 6000 }
115 CONSTANT: sse-denormal-mode-bits HEX: 8040
117 M: sse-env (get-exception-flags) ( register -- exceptions )
118 mxcsr>> sse-exception-flag>bit mask> ; inline
119 M: sse-env (set-exception-flags) ( register exceptions -- register' )
120 [ sse-exception-flag>bit >mask sse-exception-flag-bits remask ] curry change-mxcsr ; inline
122 M: sse-env (get-fp-traps) ( register -- exceptions )
123 mxcsr>> bitnot sse-fp-traps>bit mask> ; inline
124 M: sse-env (set-fp-traps) ( register exceptions -- register' )
125 [ sse-fp-traps>bit >mask bitnot sse-fp-traps-bits remask ] curry change-mxcsr ; inline
127 M: sse-env (get-rounding-mode) ( register -- mode )
128 mxcsr>> sse-rounding-mode-bits mask sse-rounding-mode>bit value-at ; inline
129 M: sse-env (set-rounding-mode) ( register mode -- register' )
130 [ sse-rounding-mode>bit at sse-rounding-mode-bits remask ] curry change-mxcsr ; inline
132 M: sse-env (get-denormal-mode) ( register -- mode )
133 mxcsr>> sse-denormal-mode-bits mask zero? +denormal-keep+ +denormal-flush+ ? ; inline
134 M: sse-env (set-denormal-mode) ( register mode -- register' )
137 { +denormal-keep+ [ sse-denormal-mode-bits unmask ] }
138 { +denormal-flush+ [ sse-denormal-mode-bits bitor ] }
140 ] curry change-mxcsr ; inline
142 CONSTANT: x87-exception-bits HEX: 3f
143 CONSTANT: x87-exception>bit
145 { +fp-invalid-operation+ HEX: 01 }
146 { +fp-overflow+ HEX: 08 }
147 { +fp-underflow+ HEX: 10 }
148 { +fp-zero-divide+ HEX: 04 }
149 { +fp-inexact+ HEX: 20 }
152 CONSTANT: x87-rounding-mode-bits HEX: 0c00
153 CONSTANT: x87-rounding-mode>bit
155 { +round-nearest+ HEX: 0000 }
156 { +round-down+ HEX: 0400 }
157 { +round-up+ HEX: 0800 }
158 { +round-zero+ HEX: 0c00 }
161 M: x87-env (get-exception-flags) ( register -- exceptions )
162 status>> x87-exception>bit mask> ; inline
163 M: x87-env (set-exception-flags) ( register exceptions -- register' )
166 M: x87-env (get-fp-traps) ( register -- exceptions )
167 control>> bitnot x87-exception>bit mask> ; inline
168 M: x87-env (set-fp-traps) ( register exceptions -- register' )
169 [ x87-exception>bit >mask bitnot x87-exception-bits remask ] curry change-control ; inline
171 M: x87-env (get-rounding-mode) ( register -- mode )
172 control>> x87-rounding-mode-bits mask x87-rounding-mode>bit value-at ; inline
173 M: x87-env (set-rounding-mode) ( register mode -- register' )
174 [ x87-rounding-mode>bit at x87-rounding-mode-bits remask ] curry change-control ; inline
176 M: x87-env (get-denormal-mode) ( register -- mode )
177 drop +denormal-keep+ ; inline
178 M: x87-env (set-denormal-mode) ( register mode -- register' )