1 USING: accessors alien.syntax arrays assocs biassocs
2 classes.struct combinators kernel literals math math.bitwise
3 math.floats.env math.floats.env.private system ;
4 IN: math.floats.env.ppc
13 ! defined in the vm, cpu-ppc*.S
14 FUNCTION: void get_ppc_fpu_env ( ppc-fpu-env* env ) ;
15 FUNCTION: void set_ppc_fpu_env ( ppc-fpu-env* env ) ;
17 FUNCTION: void get_ppc_vmx_env ( ppc-vmx-env* env ) ;
18 FUNCTION: void set_ppc_vmx_env ( ppc-vmx-env* env ) ;
20 : <ppc-fpu-env> ( -- ppc-fpu-env )
22 [ get_ppc_fpu_env ] keep ;
24 : <ppc-vmx-env> ( -- ppc-fpu-env )
26 [ get_ppc_vmx_env ] keep ;
28 M: ppc-fpu-env (set-fp-env-register)
31 M: ppc-vmx-env (set-fp-env-register)
34 M: ppc (fp-env-registers)
35 <ppc-fpu-env> <ppc-vmx-env> 2array ;
37 CONSTANT: ppc-exception-flag-bits HEX: fff8,0700
38 CONSTANT: ppc-exception-flag>bit
40 { +fp-invalid-operation+ HEX: 2000,0000 }
41 { +fp-overflow+ HEX: 1000,0000 }
42 { +fp-underflow+ HEX: 0800,0000 }
43 { +fp-zero-divide+ HEX: 0400,0000 }
44 { +fp-inexact+ HEX: 0200,0000 }
47 CONSTANT: ppc-fp-traps-bits HEX: f8
48 CONSTANT: ppc-fp-traps>bit
50 { +fp-invalid-operation+ HEX: 80 }
51 { +fp-overflow+ HEX: 40 }
52 { +fp-underflow+ HEX: 20 }
53 { +fp-zero-divide+ HEX: 10 }
54 { +fp-inexact+ HEX: 08 }
57 CONSTANT: ppc-rounding-mode-bits HEX: 3
58 CONSTANT: ppc-rounding-mode>bit
60 { +round-nearest+ HEX: 0 }
61 { +round-zero+ HEX: 1 }
63 { +round-down+ HEX: 3 }
66 CONSTANT: ppc-denormal-mode-bits HEX: 4
68 M: ppc-fpu-env (get-exception-flags) ( register -- exceptions )
69 fpscr>> ppc-exception-flag>bit mask> ; inline
70 M: ppc-fpu-env (set-exception-flags) ( register exceptions -- register' )
71 [ ppc-exception-flag>bit >mask ppc-exception-flag-bits remask ] curry change-fpscr ; inline
73 M: ppc-fpu-env (get-fp-traps) ( register -- exceptions )
74 fpscr>> ppc-fp-traps>bit mask> ; inline
75 M: ppc-fpu-env (set-fp-traps) ( register exceptions -- register' )
76 [ ppc-fp-traps>bit >mask ppc-fp-traps-bits remask ] curry change-fpscr ; inline
78 M: ppc-fpu-env (get-rounding-mode) ( register -- mode )
79 fpscr>> ppc-rounding-mode-bits mask ppc-rounding-mode>bit value-at ; inline
80 M: ppc-fpu-env (set-rounding-mode) ( register mode -- register' )
81 [ ppc-rounding-mode>bit at ppc-rounding-mode-bits remask ] curry change-fpscr ; inline
83 M: ppc-fpu-env (get-denormal-mode) ( register -- mode )
84 fpscr>> ppc-denormal-mode-bits mask zero? +denormal-keep+ +denormal-flush+ ? ; inline
85 M: ppc-fpu-env (set-denormal-mode) ( register mode -- register' )
88 { +denormal-keep+ [ ppc-denormal-mode-bits unmask ] }
89 { +denormal-flush+ [ ppc-denormal-mode-bits bitor ] }
91 ] curry change-fpscr ; inline
93 CONSTANT: vmx-denormal-mode-bits HEX: 10000
95 M: ppc-vmx-env (get-exception-flags) ( register -- exceptions )
97 M: ppc-vmx-env (set-exception-flags) ( register exceptions -- register' )
100 M: ppc-vmx-env (get-fp-traps) ( register -- exceptions )
102 M: ppc-vmx-env (set-fp-traps) ( register exceptions -- register' )
105 M: ppc-vmx-env (get-rounding-mode) ( register -- mode )
106 drop +round-nearest+ ;
107 M: ppc-vmx-env (set-rounding-mode) ( register mode -- register' )
110 M: ppc-vmx-env (get-denormal-mode) ( register -- mode )
111 vscr>> vmx-denormal-mode-bits mask zero? +denormal-keep+ +denormal-flush+ ? ; inline
112 M: ppc-vmx-env (set-denormal-mode) ( register mode -- register )
115 { +denormal-keep+ [ vmx-denormal-mode-bits unmask ] }
116 { +denormal-flush+ [ vmx-denormal-mode-bits bitor ] }
118 ] curry change-vscr ; inline