softfloat_sys/
lib.rs

1// SPDX-License-Identifier: BSD-3-Clause
2// See Notices.txt for copyright information
3#![cfg_attr(not(test), no_std)]
4#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
5
6extern crate c99;
7
8use c99::{int_fast32_t, int_fast64_t, uint_fast32_t, uint_fast64_t, uint_fast8_t};
9
10extern "C" {
11    pub fn softfloat_detectTininess_read_helper() -> uint_fast8_t;
12    pub fn softfloat_detectTininess_write_helper(v: uint_fast8_t);
13    pub fn softfloat_roundingMode_read_helper() -> uint_fast8_t;
14    pub fn softfloat_roundingMode_write_helper(v: uint_fast8_t);
15    pub fn softfloat_exceptionFlags_read_helper() -> uint_fast8_t;
16    pub fn softfloat_exceptionFlags_write_helper(v: uint_fast8_t);
17    pub fn extF80_roundingPrecision_read_helper() -> uint_fast8_t;
18    pub fn extF80_roundingPrecision_write_helper(v: uint_fast8_t);
19}
20
21#[derive(Copy, Clone, Debug)]
22#[repr(C)]
23pub struct bfloat16_t {
24    pub v: u16,
25}
26
27#[derive(Copy, Clone, Debug)]
28#[repr(C)]
29pub struct float16_t {
30    pub v: u16,
31}
32
33#[derive(Copy, Clone, Debug)]
34#[repr(C)]
35pub struct float32_t {
36    pub v: u32,
37}
38
39#[derive(Copy, Clone, Debug)]
40#[repr(C)]
41pub struct float64_t {
42    pub v: u64,
43}
44
45#[derive(Copy, Clone, Debug)]
46#[repr(C)]
47pub struct float128_t {
48    pub v: [u64; 2],
49}
50
51#[cfg(target_endian = "little")]
52#[derive(Copy, Clone, Debug)]
53#[repr(C)]
54pub struct extFloat80M {
55    pub signif: u64,
56    pub signExp: u16,
57}
58
59#[cfg(target_endian = "big")]
60#[derive(Copy, Clone, Debug)]
61#[repr(C)]
62pub struct extFloat80M {
63    pub signExp: u16,
64    pub signif: u64,
65}
66
67pub type extFloat80_t = extFloat80M;
68
69pub const softfloat_tininess_beforeRounding: u8 = 0;
70pub const softfloat_tininess_afterRounding: u8 = 1;
71
72pub const softfloat_round_near_even: u8 = 0;
73pub const softfloat_round_minMag: u8 = 1;
74pub const softfloat_round_min: u8 = 2;
75pub const softfloat_round_max: u8 = 3;
76pub const softfloat_round_near_maxMag: u8 = 4;
77pub const softfloat_round_odd: u8 = 6;
78
79pub const softfloat_flag_inexact: u8 = 1;
80pub const softfloat_flag_underflow: u8 = 2;
81pub const softfloat_flag_overflow: u8 = 4;
82pub const softfloat_flag_infinite: u8 = 8;
83pub const softfloat_flag_invalid: u8 = 16;
84
85extern "C" {
86    pub fn softfloat_raiseFlags(_: uint_fast8_t);
87
88    pub fn ui32_to_f16(_: u32) -> float16_t;
89    pub fn ui32_to_f32(_: u32) -> float32_t;
90    pub fn ui32_to_f64(_: u32) -> float64_t;
91    pub fn ui32_to_extF80(_: u32) -> extFloat80_t;
92    pub fn ui32_to_f128(_: u32) -> float128_t;
93    pub fn ui32_to_extF80M(_: u32, _: *mut extFloat80_t);
94    pub fn ui32_to_f128M(_: u32, _: *mut float128_t);
95    pub fn ui64_to_f16(_: u64) -> float16_t;
96    pub fn ui64_to_f32(_: u64) -> float32_t;
97    pub fn ui64_to_f64(_: u64) -> float64_t;
98    pub fn ui64_to_extF80(_: u64) -> extFloat80_t;
99    pub fn ui64_to_f128(_: u64) -> float128_t;
100
101    pub fn ui64_to_extF80M(_: u64, _: *mut extFloat80_t);
102    pub fn ui64_to_f128M(_: u64, _: *mut float128_t);
103    pub fn i32_to_f16(_: i32) -> float16_t;
104    pub fn i32_to_f32(_: i32) -> float32_t;
105    pub fn i32_to_f64(_: i32) -> float64_t;
106    pub fn i32_to_extF80(_: i32) -> extFloat80_t;
107    pub fn i32_to_f128(_: i32) -> float128_t;
108
109    pub fn i32_to_extF80M(_: i32, _: *mut extFloat80_t);
110    pub fn i32_to_f128M(_: i32, _: *mut float128_t);
111    pub fn i64_to_f16(_: i64) -> float16_t;
112    pub fn i64_to_f32(_: i64) -> float32_t;
113    pub fn i64_to_f64(_: i64) -> float64_t;
114    pub fn i64_to_extF80(_: i64) -> extFloat80_t;
115    pub fn i64_to_f128(_: i64) -> float128_t;
116
117    pub fn i64_to_extF80M(_: i64, _: *mut extFloat80_t);
118    pub fn i64_to_f128M(_: i64, _: *mut float128_t);
119
120    pub fn bf16_to_f32(_: bfloat16_t) -> float32_t;
121    pub fn bf16_isSignalingNaN(_: bfloat16_t) -> bool;
122
123    pub fn f16_to_ui32(_: float16_t, _: uint_fast8_t, _: bool) -> uint_fast32_t;
124    pub fn f16_to_ui64(_: float16_t, _: uint_fast8_t, _: bool) -> uint_fast64_t;
125    pub fn f16_to_i32(_: float16_t, _: uint_fast8_t, _: bool) -> int_fast32_t;
126    pub fn f16_to_i64(_: float16_t, _: uint_fast8_t, _: bool) -> int_fast64_t;
127    pub fn f16_to_ui32_r_minMag(_: float16_t, _: bool) -> uint_fast32_t;
128    pub fn f16_to_ui64_r_minMag(_: float16_t, _: bool) -> uint_fast64_t;
129    pub fn f16_to_i32_r_minMag(_: float16_t, _: bool) -> int_fast32_t;
130    pub fn f16_to_i64_r_minMag(_: float16_t, _: bool) -> int_fast64_t;
131    pub fn f16_to_f32(_: float16_t) -> float32_t;
132    pub fn f16_to_f64(_: float16_t) -> float64_t;
133    pub fn f16_to_extF80(_: float16_t) -> extFloat80_t;
134    pub fn f16_to_f128(_: float16_t) -> float128_t;
135
136    pub fn f16_to_extF80M(_: float16_t, _: *mut extFloat80_t);
137    pub fn f16_to_f128M(_: float16_t, _: *mut float128_t);
138    pub fn f16_roundToInt(_: float16_t, _: uint_fast8_t, _: bool) -> float16_t;
139    pub fn f16_add(_: float16_t, _: float16_t) -> float16_t;
140    pub fn f16_sub(_: float16_t, _: float16_t) -> float16_t;
141    pub fn f16_mul(_: float16_t, _: float16_t) -> float16_t;
142    pub fn f16_mulAdd(_: float16_t, _: float16_t, _: float16_t) -> float16_t;
143    pub fn f16_div(_: float16_t, _: float16_t) -> float16_t;
144    pub fn f16_rem(_: float16_t, _: float16_t) -> float16_t;
145    pub fn f16_sqrt(_: float16_t) -> float16_t;
146    pub fn f16_eq(_: float16_t, _: float16_t) -> bool;
147    pub fn f16_le(_: float16_t, _: float16_t) -> bool;
148    pub fn f16_lt(_: float16_t, _: float16_t) -> bool;
149    pub fn f16_eq_signaling(_: float16_t, _: float16_t) -> bool;
150    pub fn f16_le_quiet(_: float16_t, _: float16_t) -> bool;
151    pub fn f16_lt_quiet(_: float16_t, _: float16_t) -> bool;
152    pub fn f16_isSignalingNaN(_: float16_t) -> bool;
153
154    pub fn f32_to_ui32(_: float32_t, _: uint_fast8_t, _: bool) -> uint_fast32_t;
155    pub fn f32_to_ui64(_: float32_t, _: uint_fast8_t, _: bool) -> uint_fast64_t;
156    pub fn f32_to_i32(_: float32_t, _: uint_fast8_t, _: bool) -> int_fast32_t;
157    pub fn f32_to_i64(_: float32_t, _: uint_fast8_t, _: bool) -> int_fast64_t;
158    pub fn f32_to_ui32_r_minMag(_: float32_t, _: bool) -> uint_fast32_t;
159    pub fn f32_to_ui64_r_minMag(_: float32_t, _: bool) -> uint_fast64_t;
160    pub fn f32_to_i32_r_minMag(_: float32_t, _: bool) -> int_fast32_t;
161    pub fn f32_to_i64_r_minMag(_: float32_t, _: bool) -> int_fast64_t;
162    pub fn f32_to_bf16(_: float32_t) -> bfloat16_t;
163    pub fn f32_to_f16(_: float32_t) -> float16_t;
164    pub fn f32_to_f64(_: float32_t) -> float64_t;
165    pub fn f32_to_extF80(_: float32_t) -> extFloat80_t;
166    pub fn f32_to_f128(_: float32_t) -> float128_t;
167
168    pub fn f32_to_extF80M(_: float32_t, _: *mut extFloat80_t);
169    pub fn f32_to_f128M(_: float32_t, _: *mut float128_t);
170    pub fn f32_roundToInt(_: float32_t, _: uint_fast8_t, _: bool) -> float32_t;
171    pub fn f32_add(_: float32_t, _: float32_t) -> float32_t;
172    pub fn f32_sub(_: float32_t, _: float32_t) -> float32_t;
173    pub fn f32_mul(_: float32_t, _: float32_t) -> float32_t;
174    pub fn f32_mulAdd(_: float32_t, _: float32_t, _: float32_t) -> float32_t;
175    pub fn f32_div(_: float32_t, _: float32_t) -> float32_t;
176    pub fn f32_rem(_: float32_t, _: float32_t) -> float32_t;
177    pub fn f32_sqrt(_: float32_t) -> float32_t;
178    pub fn f32_eq(_: float32_t, _: float32_t) -> bool;
179    pub fn f32_le(_: float32_t, _: float32_t) -> bool;
180    pub fn f32_lt(_: float32_t, _: float32_t) -> bool;
181    pub fn f32_eq_signaling(_: float32_t, _: float32_t) -> bool;
182    pub fn f32_le_quiet(_: float32_t, _: float32_t) -> bool;
183    pub fn f32_lt_quiet(_: float32_t, _: float32_t) -> bool;
184    pub fn f32_isSignalingNaN(_: float32_t) -> bool;
185
186    pub fn f64_to_ui32(_: float64_t, _: uint_fast8_t, _: bool) -> uint_fast32_t;
187    pub fn f64_to_ui64(_: float64_t, _: uint_fast8_t, _: bool) -> uint_fast64_t;
188    pub fn f64_to_i32(_: float64_t, _: uint_fast8_t, _: bool) -> int_fast32_t;
189    pub fn f64_to_i64(_: float64_t, _: uint_fast8_t, _: bool) -> int_fast64_t;
190    pub fn f64_to_ui32_r_minMag(_: float64_t, _: bool) -> uint_fast32_t;
191    pub fn f64_to_ui64_r_minMag(_: float64_t, _: bool) -> uint_fast64_t;
192    pub fn f64_to_i32_r_minMag(_: float64_t, _: bool) -> int_fast32_t;
193    pub fn f64_to_i64_r_minMag(_: float64_t, _: bool) -> int_fast64_t;
194    pub fn f64_to_f16(_: float64_t) -> float16_t;
195    pub fn f64_to_f32(_: float64_t) -> float32_t;
196    pub fn f64_to_extF80(_: float64_t) -> extFloat80_t;
197    pub fn f64_to_f128(_: float64_t) -> float128_t;
198
199    pub fn f64_to_extF80M(_: float64_t, _: *mut extFloat80_t);
200    pub fn f64_to_f128M(_: float64_t, _: *mut float128_t);
201    pub fn f64_roundToInt(_: float64_t, _: uint_fast8_t, _: bool) -> float64_t;
202    pub fn f64_add(_: float64_t, _: float64_t) -> float64_t;
203    pub fn f64_sub(_: float64_t, _: float64_t) -> float64_t;
204    pub fn f64_mul(_: float64_t, _: float64_t) -> float64_t;
205    pub fn f64_mulAdd(_: float64_t, _: float64_t, _: float64_t) -> float64_t;
206    pub fn f64_div(_: float64_t, _: float64_t) -> float64_t;
207    pub fn f64_rem(_: float64_t, _: float64_t) -> float64_t;
208    pub fn f64_sqrt(_: float64_t) -> float64_t;
209    pub fn f64_eq(_: float64_t, _: float64_t) -> bool;
210    pub fn f64_le(_: float64_t, _: float64_t) -> bool;
211    pub fn f64_lt(_: float64_t, _: float64_t) -> bool;
212    pub fn f64_eq_signaling(_: float64_t, _: float64_t) -> bool;
213    pub fn f64_le_quiet(_: float64_t, _: float64_t) -> bool;
214    pub fn f64_lt_quiet(_: float64_t, _: float64_t) -> bool;
215    pub fn f64_isSignalingNaN(_: float64_t) -> bool;
216
217    pub fn extF80_to_ui32(_: extFloat80_t, _: uint_fast8_t, _: bool) -> uint_fast32_t;
218    pub fn extF80_to_ui64(_: extFloat80_t, _: uint_fast8_t, _: bool) -> uint_fast64_t;
219    pub fn extF80_to_i32(_: extFloat80_t, _: uint_fast8_t, _: bool) -> int_fast32_t;
220    pub fn extF80_to_i64(_: extFloat80_t, _: uint_fast8_t, _: bool) -> int_fast64_t;
221    pub fn extF80_to_ui32_r_minMag(_: extFloat80_t, _: bool) -> uint_fast32_t;
222    pub fn extF80_to_ui64_r_minMag(_: extFloat80_t, _: bool) -> uint_fast64_t;
223    pub fn extF80_to_i32_r_minMag(_: extFloat80_t, _: bool) -> int_fast32_t;
224    pub fn extF80_to_i64_r_minMag(_: extFloat80_t, _: bool) -> int_fast64_t;
225    pub fn extF80_to_f16(_: extFloat80_t) -> float16_t;
226    pub fn extF80_to_f32(_: extFloat80_t) -> float32_t;
227    pub fn extF80_to_f64(_: extFloat80_t) -> float64_t;
228    pub fn extF80_to_f128(_: extFloat80_t) -> float128_t;
229    pub fn extF80_roundToInt(_: extFloat80_t, _: uint_fast8_t, _: bool) -> extFloat80_t;
230    pub fn extF80_add(_: extFloat80_t, _: extFloat80_t) -> extFloat80_t;
231    pub fn extF80_sub(_: extFloat80_t, _: extFloat80_t) -> extFloat80_t;
232    pub fn extF80_mul(_: extFloat80_t, _: extFloat80_t) -> extFloat80_t;
233    pub fn extF80_div(_: extFloat80_t, _: extFloat80_t) -> extFloat80_t;
234    pub fn extF80_rem(_: extFloat80_t, _: extFloat80_t) -> extFloat80_t;
235    pub fn extF80_sqrt(_: extFloat80_t) -> extFloat80_t;
236    pub fn extF80_eq(_: extFloat80_t, _: extFloat80_t) -> bool;
237    pub fn extF80_le(_: extFloat80_t, _: extFloat80_t) -> bool;
238    pub fn extF80_lt(_: extFloat80_t, _: extFloat80_t) -> bool;
239    pub fn extF80_eq_signaling(_: extFloat80_t, _: extFloat80_t) -> bool;
240    pub fn extF80_le_quiet(_: extFloat80_t, _: extFloat80_t) -> bool;
241    pub fn extF80_lt_quiet(_: extFloat80_t, _: extFloat80_t) -> bool;
242    pub fn extF80_isSignalingNaN(_: extFloat80_t) -> bool;
243
244    pub fn extF80M_to_ui32(_: *const extFloat80_t, _: uint_fast8_t, _: bool) -> uint_fast32_t;
245    pub fn extF80M_to_ui64(_: *const extFloat80_t, _: uint_fast8_t, _: bool) -> uint_fast64_t;
246    pub fn extF80M_to_i32(_: *const extFloat80_t, _: uint_fast8_t, _: bool) -> int_fast32_t;
247    pub fn extF80M_to_i64(_: *const extFloat80_t, _: uint_fast8_t, _: bool) -> int_fast64_t;
248    pub fn extF80M_to_ui32_r_minMag(_: *const extFloat80_t, _: bool) -> uint_fast32_t;
249    pub fn extF80M_to_ui64_r_minMag(_: *const extFloat80_t, _: bool) -> uint_fast64_t;
250    pub fn extF80M_to_i32_r_minMag(_: *const extFloat80_t, _: bool) -> int_fast32_t;
251    pub fn extF80M_to_i64_r_minMag(_: *const extFloat80_t, _: bool) -> int_fast64_t;
252    pub fn extF80M_to_f16(_: *const extFloat80_t) -> float16_t;
253    pub fn extF80M_to_f32(_: *const extFloat80_t) -> float32_t;
254    pub fn extF80M_to_f64(_: *const extFloat80_t) -> float64_t;
255    pub fn extF80M_to_f128M(_: *const extFloat80_t, _: *mut float128_t);
256    pub fn extF80M_roundToInt(
257        _: *const extFloat80_t,
258        _: uint_fast8_t,
259        _: bool,
260        _: *mut extFloat80_t,
261    );
262    pub fn extF80M_add(_: *const extFloat80_t, _: *const extFloat80_t, _: *mut extFloat80_t);
263    pub fn extF80M_sub(_: *const extFloat80_t, _: *const extFloat80_t, _: *mut extFloat80_t);
264    pub fn extF80M_mul(_: *const extFloat80_t, _: *const extFloat80_t, _: *mut extFloat80_t);
265    pub fn extF80M_div(_: *const extFloat80_t, _: *const extFloat80_t, _: *mut extFloat80_t);
266    pub fn extF80M_rem(_: *const extFloat80_t, _: *const extFloat80_t, _: *mut extFloat80_t);
267    pub fn extF80M_sqrt(_: *const extFloat80_t, _: *mut extFloat80_t);
268    pub fn extF80M_eq(_: *const extFloat80_t, _: *const extFloat80_t) -> bool;
269    pub fn extF80M_le(_: *const extFloat80_t, _: *const extFloat80_t) -> bool;
270    pub fn extF80M_lt(_: *const extFloat80_t, _: *const extFloat80_t) -> bool;
271    pub fn extF80M_eq_signaling(_: *const extFloat80_t, _: *const extFloat80_t) -> bool;
272    pub fn extF80M_le_quiet(_: *const extFloat80_t, _: *const extFloat80_t) -> bool;
273    pub fn extF80M_lt_quiet(_: *const extFloat80_t, _: *const extFloat80_t) -> bool;
274    pub fn extF80M_isSignalingNaN(_: *const extFloat80_t) -> bool;
275
276    pub fn f128_to_ui32(_: float128_t, _: uint_fast8_t, _: bool) -> uint_fast32_t;
277    pub fn f128_to_ui64(_: float128_t, _: uint_fast8_t, _: bool) -> uint_fast64_t;
278    pub fn f128_to_i32(_: float128_t, _: uint_fast8_t, _: bool) -> int_fast32_t;
279    pub fn f128_to_i64(_: float128_t, _: uint_fast8_t, _: bool) -> int_fast64_t;
280    pub fn f128_to_ui32_r_minMag(_: float128_t, _: bool) -> uint_fast32_t;
281    pub fn f128_to_ui64_r_minMag(_: float128_t, _: bool) -> uint_fast64_t;
282    pub fn f128_to_i32_r_minMag(_: float128_t, _: bool) -> int_fast32_t;
283    pub fn f128_to_i64_r_minMag(_: float128_t, _: bool) -> int_fast64_t;
284    pub fn f128_to_f16(_: float128_t) -> float16_t;
285    pub fn f128_to_f32(_: float128_t) -> float32_t;
286    pub fn f128_to_f64(_: float128_t) -> float64_t;
287    pub fn f128_to_extF80(_: float128_t) -> extFloat80_t;
288    pub fn f128_roundToInt(_: float128_t, _: uint_fast8_t, _: bool) -> float128_t;
289    pub fn f128_add(_: float128_t, _: float128_t) -> float128_t;
290    pub fn f128_sub(_: float128_t, _: float128_t) -> float128_t;
291    pub fn f128_mul(_: float128_t, _: float128_t) -> float128_t;
292    pub fn f128_mulAdd(_: float128_t, _: float128_t, _: float128_t) -> float128_t;
293    pub fn f128_div(_: float128_t, _: float128_t) -> float128_t;
294    pub fn f128_rem(_: float128_t, _: float128_t) -> float128_t;
295    pub fn f128_sqrt(_: float128_t) -> float128_t;
296    pub fn f128_eq(_: float128_t, _: float128_t) -> bool;
297    pub fn f128_le(_: float128_t, _: float128_t) -> bool;
298    pub fn f128_lt(_: float128_t, _: float128_t) -> bool;
299    pub fn f128_eq_signaling(_: float128_t, _: float128_t) -> bool;
300    pub fn f128_le_quiet(_: float128_t, _: float128_t) -> bool;
301    pub fn f128_lt_quiet(_: float128_t, _: float128_t) -> bool;
302    pub fn f128_isSignalingNaN(_: float128_t) -> bool;
303
304    pub fn f128M_to_ui32(_: *const float128_t, _: uint_fast8_t, _: bool) -> uint_fast32_t;
305    pub fn f128M_to_ui64(_: *const float128_t, _: uint_fast8_t, _: bool) -> uint_fast64_t;
306    pub fn f128M_to_i32(_: *const float128_t, _: uint_fast8_t, _: bool) -> int_fast32_t;
307    pub fn f128M_to_i64(_: *const float128_t, _: uint_fast8_t, _: bool) -> int_fast64_t;
308    pub fn f128M_to_ui32_r_minMag(_: *const float128_t, _: bool) -> uint_fast32_t;
309    pub fn f128M_to_ui64_r_minMag(_: *const float128_t, _: bool) -> uint_fast64_t;
310    pub fn f128M_to_i32_r_minMag(_: *const float128_t, _: bool) -> int_fast32_t;
311    pub fn f128M_to_i64_r_minMag(_: *const float128_t, _: bool) -> int_fast64_t;
312    pub fn f128M_to_f16(_: *const float128_t) -> float16_t;
313    pub fn f128M_to_f32(_: *const float128_t) -> float32_t;
314    pub fn f128M_to_f64(_: *const float128_t) -> float64_t;
315    pub fn f128M_to_extF80M(_: *const float128_t, _: *mut extFloat80_t);
316    pub fn f128M_roundToInt(_: *const float128_t, _: uint_fast8_t, _: bool, _: *mut float128_t);
317    pub fn f128M_add(_: *const float128_t, _: *const float128_t, _: *mut float128_t);
318    pub fn f128M_sub(_: *const float128_t, _: *const float128_t, _: *mut float128_t);
319    pub fn f128M_mul(_: *const float128_t, _: *const float128_t, _: *mut float128_t);
320    pub fn f128M_mulAdd(
321        _: *const float128_t,
322        _: *const float128_t,
323        _: *const float128_t,
324        _: *mut float128_t,
325    );
326    pub fn f128M_div(_: *const float128_t, _: *const float128_t, _: *mut float128_t);
327    pub fn f128M_rem(_: *const float128_t, _: *const float128_t, _: *mut float128_t);
328    pub fn f128M_sqrt(_: *const float128_t, _: *mut float128_t);
329    pub fn f128M_eq(_: *const float128_t, _: *const float128_t) -> bool;
330    pub fn f128M_le(_: *const float128_t, _: *const float128_t) -> bool;
331    pub fn f128M_lt(_: *const float128_t, _: *const float128_t) -> bool;
332    pub fn f128M_eq_signaling(_: *const float128_t, _: *const float128_t) -> bool;
333    pub fn f128M_le_quiet(_: *const float128_t, _: *const float128_t) -> bool;
334    pub fn f128M_lt_quiet(_: *const float128_t, _: *const float128_t) -> bool;
335    pub fn f128M_isSignalingNaN(_: *const float128_t) -> bool;
336}
337
338#[cfg(test)]
339mod tests {
340    use super::*;
341
342    #[test]
343    fn test_linking() {
344        macro_rules! link_functions {
345            ($($name:ident,)*) => {
346                $(println!(concat!(stringify!($name), ": {:#X}"), $name as usize);)*
347            };
348        }
349        link_functions!(
350            softfloat_detectTininess_read_helper,
351            softfloat_detectTininess_write_helper,
352            softfloat_roundingMode_read_helper,
353            softfloat_roundingMode_write_helper,
354            softfloat_exceptionFlags_read_helper,
355            softfloat_exceptionFlags_write_helper,
356            extF80_roundingPrecision_read_helper,
357            extF80_roundingPrecision_write_helper,
358            softfloat_raiseFlags,
359            ui32_to_f16,
360            ui32_to_f32,
361            ui32_to_f64,
362            ui32_to_extF80,
363            ui32_to_f128,
364            ui32_to_extF80M,
365            ui32_to_f128M,
366            ui64_to_f16,
367            ui64_to_f32,
368            ui64_to_f64,
369            ui64_to_extF80,
370            ui64_to_f128,
371            ui64_to_extF80M,
372            ui64_to_f128M,
373            i32_to_f16,
374            i32_to_f32,
375            i32_to_f64,
376            i32_to_extF80,
377            i32_to_f128,
378            i32_to_extF80M,
379            i32_to_f128M,
380            i64_to_f16,
381            i64_to_f32,
382            i64_to_f64,
383            i64_to_extF80,
384            i64_to_f128,
385            i64_to_extF80M,
386            i64_to_f128M,
387            bf16_to_f32,
388            bf16_isSignalingNaN,
389            f16_to_ui32,
390            f16_to_ui64,
391            f16_to_i32,
392            f16_to_i64,
393            f16_to_ui32_r_minMag,
394            f16_to_ui64_r_minMag,
395            f16_to_i32_r_minMag,
396            f16_to_i64_r_minMag,
397            f16_to_f32,
398            f16_to_f64,
399            f16_to_extF80,
400            f16_to_f128,
401            f16_to_extF80M,
402            f16_to_f128M,
403            f16_roundToInt,
404            f16_add,
405            f16_sub,
406            f16_mul,
407            f16_mulAdd,
408            f16_div,
409            f16_rem,
410            f16_sqrt,
411            f16_eq,
412            f16_le,
413            f16_lt,
414            f16_eq_signaling,
415            f16_le_quiet,
416            f16_lt_quiet,
417            f16_isSignalingNaN,
418            f32_to_ui32,
419            f32_to_ui64,
420            f32_to_i32,
421            f32_to_i64,
422            f32_to_ui32_r_minMag,
423            f32_to_ui64_r_minMag,
424            f32_to_i32_r_minMag,
425            f32_to_i64_r_minMag,
426            f32_to_bf16,
427            f32_to_f16,
428            f32_to_f64,
429            f32_to_extF80,
430            f32_to_f128,
431            f32_to_extF80M,
432            f32_to_f128M,
433            f32_roundToInt,
434            f32_add,
435            f32_sub,
436            f32_mul,
437            f32_mulAdd,
438            f32_div,
439            f32_rem,
440            f32_sqrt,
441            f32_eq,
442            f32_le,
443            f32_lt,
444            f32_eq_signaling,
445            f32_le_quiet,
446            f32_lt_quiet,
447            f32_isSignalingNaN,
448            f64_to_ui32,
449            f64_to_ui64,
450            f64_to_i32,
451            f64_to_i64,
452            f64_to_ui32_r_minMag,
453            f64_to_ui64_r_minMag,
454            f64_to_i32_r_minMag,
455            f64_to_i64_r_minMag,
456            f64_to_f16,
457            f64_to_f32,
458            f64_to_extF80,
459            f64_to_f128,
460            f64_to_extF80M,
461            f64_to_f128M,
462            f64_roundToInt,
463            f64_add,
464            f64_sub,
465            f64_mul,
466            f64_mulAdd,
467            f64_div,
468            f64_rem,
469            f64_sqrt,
470            f64_eq,
471            f64_le,
472            f64_lt,
473            f64_eq_signaling,
474            f64_le_quiet,
475            f64_lt_quiet,
476            f64_isSignalingNaN,
477            extF80_to_ui32,
478            extF80_to_ui64,
479            extF80_to_i32,
480            extF80_to_i64,
481            extF80_to_ui32_r_minMag,
482            extF80_to_ui64_r_minMag,
483            extF80_to_i32_r_minMag,
484            extF80_to_i64_r_minMag,
485            extF80_to_f16,
486            extF80_to_f32,
487            extF80_to_f64,
488            extF80_to_f128,
489            extF80_roundToInt,
490            extF80_add,
491            extF80_sub,
492            extF80_mul,
493            extF80_div,
494            extF80_rem,
495            extF80_sqrt,
496            extF80_eq,
497            extF80_le,
498            extF80_lt,
499            extF80_eq_signaling,
500            extF80_le_quiet,
501            extF80_lt_quiet,
502            extF80_isSignalingNaN,
503            extF80M_to_ui32,
504            extF80M_to_ui64,
505            extF80M_to_i32,
506            extF80M_to_i64,
507            extF80M_to_ui32_r_minMag,
508            extF80M_to_ui64_r_minMag,
509            extF80M_to_i32_r_minMag,
510            extF80M_to_i64_r_minMag,
511            extF80M_to_f16,
512            extF80M_to_f32,
513            extF80M_to_f64,
514            extF80M_to_f128M,
515            extF80M_roundToInt,
516            extF80M_add,
517            extF80M_sub,
518            extF80M_mul,
519            extF80M_div,
520            extF80M_rem,
521            extF80M_sqrt,
522            extF80M_eq,
523            extF80M_le,
524            extF80M_lt,
525            extF80M_eq_signaling,
526            extF80M_le_quiet,
527            extF80M_lt_quiet,
528            extF80M_isSignalingNaN,
529            f128_to_ui32,
530            f128_to_ui64,
531            f128_to_i32,
532            f128_to_i64,
533            f128_to_ui32_r_minMag,
534            f128_to_ui64_r_minMag,
535            f128_to_i32_r_minMag,
536            f128_to_i64_r_minMag,
537            f128_to_f16,
538            f128_to_f32,
539            f128_to_f64,
540            f128_to_extF80,
541            f128_roundToInt,
542            f128_add,
543            f128_sub,
544            f128_mul,
545            f128_mulAdd,
546            f128_div,
547            f128_rem,
548            f128_sqrt,
549            f128_eq,
550            f128_le,
551            f128_lt,
552            f128_eq_signaling,
553            f128_le_quiet,
554            f128_lt_quiet,
555            f128_isSignalingNaN,
556            f128M_to_ui32,
557            f128M_to_ui64,
558            f128M_to_i32,
559            f128M_to_i64,
560            f128M_to_ui32_r_minMag,
561            f128M_to_ui64_r_minMag,
562            f128M_to_i32_r_minMag,
563            f128M_to_i64_r_minMag,
564            f128M_to_f16,
565            f128M_to_f32,
566            f128M_to_f64,
567            f128M_to_extF80M,
568            f128M_roundToInt,
569            f128M_add,
570            f128M_sub,
571            f128M_mul,
572            f128M_mulAdd,
573            f128M_div,
574            f128M_rem,
575            f128M_sqrt,
576            f128M_eq,
577            f128M_le,
578            f128M_lt,
579            f128M_eq_signaling,
580            f128M_le_quiet,
581            f128M_lt_quiet,
582            f128M_isSignalingNaN,
583        );
584    }
585}