const_soft_float/soft_f32/
cmp.rs1use crate::soft_f32::SoftF32;
2use core::cmp::Ordering;
3
4type F = SoftF32;
5
6type FInt = u32;
7type FSignedInt = i32;
8
9const UNORDERED: Option<Ordering> = None;
10const EQUAL: Option<Ordering> = Some(Ordering::Equal);
11const GREATER: Option<Ordering> = Some(Ordering::Greater);
12const LESS: Option<Ordering> = Some(Ordering::Less);
13
14pub(crate) const fn cmp(a: F, b: F) -> Option<Ordering> {
15 let one: FInt = 1;
16 let zero: FInt = 0;
17 let szero: FSignedInt = 0;
18
19 let sign_bit = F::SIGN_MASK as FInt;
20 let abs_mask = sign_bit - one;
21 let exponent_mask = F::EXPONENT_MASK;
22 let inf_rep = exponent_mask;
23
24 let a_rep = a.repr();
25 let b_rep = b.repr();
26 let a_abs = a_rep & abs_mask;
27 let b_abs = b_rep & abs_mask;
28
29 if a_abs > inf_rep || b_abs > inf_rep {
31 return UNORDERED;
32 }
33
34 if a_abs | b_abs == zero {
36 return EQUAL;
37 }
38
39 let a_srep = a.signed_repr();
40 let b_srep = b.signed_repr();
41
42 if a_srep & b_srep >= szero {
45 if a_srep < b_srep {
46 LESS
47 } else if a_srep == b_srep {
48 EQUAL
49 } else {
50 GREATER
51 }
52 } else if a_srep > b_srep {
57 LESS
58 } else if a_srep == b_srep {
59 EQUAL
60 } else {
61 GREATER
62 }
63}