File tree Expand file tree Collapse file tree 5 files changed +60
-1
lines changed Expand file tree Collapse file tree 5 files changed +60
-1
lines changed Original file line number Diff line number Diff line change 28
28
#undef DEFINE_BUILTIN_GLOBALS
29
29
#include "threading.h"
30
30
#include "julia_assert.h"
31
+ #include "processor.h"
31
32
32
33
#ifdef __cplusplus
33
34
extern "C" {
@@ -618,6 +619,13 @@ static void jl_set_io_wait(int v)
618
619
619
620
extern jl_mutex_t jl_modules_mutex ;
620
621
622
+ static void restore_fp_env (void )
623
+ {
624
+ if (jl_set_zero_subnormals (0 ) || jl_set_default_nans (0 )) {
625
+ jl_error ("Failed to configure floating point environment" );
626
+ }
627
+ }
628
+
621
629
void _julia_init (JL_IMAGE_SEARCH rel )
622
630
{
623
631
jl_init_timing ();
@@ -634,6 +642,7 @@ void _julia_init(JL_IMAGE_SEARCH rel)
634
642
// best to call this first, since it also initializes libuv
635
643
jl_init_uv ();
636
644
init_stdio ();
645
+ restore_fp_env ();
637
646
restore_signals ();
638
647
639
648
jl_page_size = jl_getpagesize ();
Original file line number Diff line number Diff line change @@ -166,6 +166,10 @@ JL_DLLEXPORT jl_value_t *jl_get_cpu_name(void);
166
166
// For debugging only
167
167
JL_DLLEXPORT void jl_dump_host_cpu (void );
168
168
169
+ JL_DLLEXPORT int32_t jl_set_zero_subnormals (int8_t isZero);
170
+ JL_DLLEXPORT int32_t jl_get_zero_subnormals (void );
171
+ JL_DLLEXPORT int32_t jl_set_default_nans (int8_t isDefault);
172
+ JL_DLLEXPORT int32_t jl_get_default_nans (void );
169
173
#ifdef __cplusplus
170
174
}
171
175
Original file line number Diff line number Diff line change @@ -1808,8 +1808,10 @@ extern "C" int jl_test_cpu_feature(jl_cpu_feature_t feature)
1808
1808
}
1809
1809
1810
1810
#ifdef _CPU_AARCH64_
1811
- // FZ, bit [24]
1811
+ // FPCR FZ, bit [24]
1812
1812
static constexpr uint32_t fpcr_fz_mask = 1 << 24 ;
1813
+ // FPCR DN, bit [25]
1814
+ static constexpr uint32_t fpcr_dn_mask = 1 << 25 ;
1813
1815
1814
1816
static inline uint32_t get_fpcr_aarch64 (void )
1815
1817
{
@@ -1835,6 +1837,19 @@ extern "C" JL_DLLEXPORT int32_t jl_set_zero_subnormals(int8_t isZero)
1835
1837
set_fpcr_aarch64 (fpcr);
1836
1838
return 0 ;
1837
1839
}
1840
+
1841
+ extern " C" JL_DLLEXPORT int32_t jl_get_default_nans (void )
1842
+ {
1843
+ return (get_fpcr_aarch64 () & fpcr_dn_mask) != 0 ;
1844
+ }
1845
+
1846
+ extern " C" JL_DLLEXPORT int32_t jl_set_default_nans (int8_t isDefault)
1847
+ {
1848
+ uint32_t fpcr = get_fpcr_aarch64 ();
1849
+ fpcr = isDefault ? (fpcr | fpcr_dn_mask) : (fpcr & ~fpcr_dn_mask);
1850
+ set_fpcr_aarch64 (fpcr);
1851
+ return 0 ;
1852
+ }
1838
1853
#else
1839
1854
extern " C" JL_DLLEXPORT int32_t jl_get_zero_subnormals (void )
1840
1855
{
@@ -1845,4 +1860,14 @@ extern "C" JL_DLLEXPORT int32_t jl_set_zero_subnormals(int8_t isZero)
1845
1860
{
1846
1861
return isZero;
1847
1862
}
1863
+
1864
+ extern " C" JL_DLLEXPORT int32_t jl_get_default_nans (void )
1865
+ {
1866
+ return 0 ;
1867
+ }
1868
+
1869
+ extern " C" JL_DLLEXPORT int32_t jl_set_default_nans (int8_t isDefault)
1870
+ {
1871
+ return isDefault;
1872
+ }
1848
1873
#endif
Original file line number Diff line number Diff line change @@ -160,3 +160,13 @@ extern "C" JL_DLLEXPORT int32_t jl_set_zero_subnormals(int8_t isZero)
160
160
{
161
161
return isZero;
162
162
}
163
+
164
+ extern " C" JL_DLLEXPORT int32_t jl_get_default_nans (void )
165
+ {
166
+ return 0 ;
167
+ }
168
+
169
+ extern " C" JL_DLLEXPORT int32_t jl_set_default_nans (int8_t isDefault)
170
+ {
171
+ return isDefault;
172
+ }
Original file line number Diff line number Diff line change @@ -1102,3 +1102,14 @@ extern "C" JL_DLLEXPORT int32_t jl_set_zero_subnormals(int8_t isZero)
1102
1102
return isZero;
1103
1103
}
1104
1104
}
1105
+
1106
+ // X86 does not support default NaNs
1107
+ extern " C" JL_DLLEXPORT int32_t jl_get_default_nans (void )
1108
+ {
1109
+ return 0 ;
1110
+ }
1111
+
1112
+ extern " C" JL_DLLEXPORT int32_t jl_set_default_nans (int8_t isDefault)
1113
+ {
1114
+ return isDefault;
1115
+ }
You can’t perform that action at this time.
0 commit comments