aboutsummaryrefslogtreecommitdiff
path: root/embassy-rp/src/float/cmp.rs
diff options
context:
space:
mode:
authorpennae <[email protected]>2023-04-19 01:57:37 +0200
committerpennae <[email protected]>2023-04-19 23:04:47 +0200
commitfdd6e08ed6b5445a53c8cd0752f80f203c4860ac (patch)
tree9b997c5db2d55c911a6fd4cfdce38141e372b762 /embassy-rp/src/float/cmp.rs
parenta673b9aa294a55c441f3f61c48481484629b4347 (diff)
rp: hook up softfloat rom intrinsics
rp-hal has done this very well already, so we'll just copy their entire impl again. only div.rs needed some massaging because our sio access works a little differently, everything else worked as is.
Diffstat (limited to 'embassy-rp/src/float/cmp.rs')
-rw-r--r--embassy-rp/src/float/cmp.rs201
1 files changed, 201 insertions, 0 deletions
diff --git a/embassy-rp/src/float/cmp.rs b/embassy-rp/src/float/cmp.rs
new file mode 100644
index 000000000..e540e3918
--- /dev/null
+++ b/embassy-rp/src/float/cmp.rs
@@ -0,0 +1,201 @@
1// Credit: taken from `rp-hal` (also licensed Apache+MIT)
2// https://github.com/rp-rs/rp-hal/blob/main/rp2040-hal/src/float/cmp.rs
3
4use super::Float;
5use crate::rom_data;
6
7trait ROMCmp {
8 fn rom_cmp(self, b: Self) -> i32;
9}
10
11impl ROMCmp for f32 {
12 fn rom_cmp(self, b: Self) -> i32 {
13 rom_data::float_funcs::fcmp(self, b)
14 }
15}
16
17impl ROMCmp for f64 {
18 fn rom_cmp(self, b: Self) -> i32 {
19 rom_data::double_funcs::dcmp(self, b)
20 }
21}
22
23fn le_abi<F: Float + ROMCmp>(a: F, b: F) -> i32 {
24 if a.is_nan() || b.is_nan() {
25 1
26 } else {
27 a.rom_cmp(b)
28 }
29}
30
31fn ge_abi<F: Float + ROMCmp>(a: F, b: F) -> i32 {
32 if a.is_nan() || b.is_nan() {
33 -1
34 } else {
35 a.rom_cmp(b)
36 }
37}
38
39intrinsics! {
40 #[slower_than_default]
41 #[bootrom_v2]
42 #[alias = __eqsf2, __ltsf2, __nesf2]
43 extern "C" fn __lesf2(a: f32, b: f32) -> i32 {
44 le_abi(a, b)
45 }
46
47 #[slower_than_default]
48 #[bootrom_v2]
49 #[alias = __eqdf2, __ltdf2, __nedf2]
50 extern "C" fn __ledf2(a: f64, b: f64) -> i32 {
51 le_abi(a, b)
52 }
53
54 #[slower_than_default]
55 #[bootrom_v2]
56 #[alias = __gtsf2]
57 extern "C" fn __gesf2(a: f32, b: f32) -> i32 {
58 ge_abi(a, b)
59 }
60
61 #[slower_than_default]
62 #[bootrom_v2]
63 #[alias = __gtdf2]
64 extern "C" fn __gedf2(a: f64, b: f64) -> i32 {
65 ge_abi(a, b)
66 }
67
68
69 #[slower_than_default]
70 #[bootrom_v2]
71 extern "aapcs" fn __aeabi_fcmple(a: f32, b: f32) -> i32 {
72 (le_abi(a, b) <= 0) as i32
73 }
74
75 #[slower_than_default]
76 #[bootrom_v2]
77 extern "aapcs" fn __aeabi_fcmpge(a: f32, b: f32) -> i32 {
78 (ge_abi(a, b) >= 0) as i32
79 }
80
81 #[slower_than_default]
82 #[bootrom_v2]
83 extern "aapcs" fn __aeabi_fcmpeq(a: f32, b: f32) -> i32 {
84 (le_abi(a, b) == 0) as i32
85 }
86
87 #[slower_than_default]
88 #[bootrom_v2]
89 extern "aapcs" fn __aeabi_fcmplt(a: f32, b: f32) -> i32 {
90 (le_abi(a, b) < 0) as i32
91 }
92
93 #[slower_than_default]
94 #[bootrom_v2]
95 extern "aapcs" fn __aeabi_fcmpgt(a: f32, b: f32) -> i32 {
96 (ge_abi(a, b) > 0) as i32
97 }
98
99 #[slower_than_default]
100 #[bootrom_v2]
101 extern "aapcs" fn __aeabi_dcmple(a: f64, b: f64) -> i32 {
102 (le_abi(a, b) <= 0) as i32
103 }
104
105 #[slower_than_default]
106 #[bootrom_v2]
107 extern "aapcs" fn __aeabi_dcmpge(a: f64, b: f64) -> i32 {
108 (ge_abi(a, b) >= 0) as i32
109 }
110
111 #[slower_than_default]
112 #[bootrom_v2]
113 extern "aapcs" fn __aeabi_dcmpeq(a: f64, b: f64) -> i32 {
114 (le_abi(a, b) == 0) as i32
115 }
116
117 #[slower_than_default]
118 #[bootrom_v2]
119 extern "aapcs" fn __aeabi_dcmplt(a: f64, b: f64) -> i32 {
120 (le_abi(a, b) < 0) as i32
121 }
122
123 #[slower_than_default]
124 #[bootrom_v2]
125 extern "aapcs" fn __aeabi_dcmpgt(a: f64, b: f64) -> i32 {
126 (ge_abi(a, b) > 0) as i32
127 }
128
129
130 #[slower_than_default]
131 #[bootrom_v2]
132 extern "C" fn __gesf2vfp(a: f32, b: f32) -> i32 {
133 (ge_abi(a, b) >= 0) as i32
134 }
135
136 #[slower_than_default]
137 #[bootrom_v2]
138 extern "C" fn __gedf2vfp(a: f64, b: f64) -> i32 {
139 (ge_abi(a, b) >= 0) as i32
140 }
141
142 #[slower_than_default]
143 #[bootrom_v2]
144 extern "C" fn __gtsf2vfp(a: f32, b: f32) -> i32 {
145 (ge_abi(a, b) > 0) as i32
146 }
147
148 #[slower_than_default]
149 #[bootrom_v2]
150 extern "C" fn __gtdf2vfp(a: f64, b: f64) -> i32 {
151 (ge_abi(a, b) > 0) as i32
152 }
153
154 #[slower_than_default]
155 #[bootrom_v2]
156 extern "C" fn __ltsf2vfp(a: f32, b: f32) -> i32 {
157 (le_abi(a, b) < 0) as i32
158 }
159
160 #[slower_than_default]
161 #[bootrom_v2]
162 extern "C" fn __ltdf2vfp(a: f64, b: f64) -> i32 {
163 (le_abi(a, b) < 0) as i32
164 }
165
166 #[slower_than_default]
167 #[bootrom_v2]
168 extern "C" fn __lesf2vfp(a: f32, b: f32) -> i32 {
169 (le_abi(a, b) <= 0) as i32
170 }
171
172 #[slower_than_default]
173 #[bootrom_v2]
174 extern "C" fn __ledf2vfp(a: f64, b: f64) -> i32 {
175 (le_abi(a, b) <= 0) as i32
176 }
177
178 #[slower_than_default]
179 #[bootrom_v2]
180 extern "C" fn __nesf2vfp(a: f32, b: f32) -> i32 {
181 (le_abi(a, b) != 0) as i32
182 }
183
184 #[slower_than_default]
185 #[bootrom_v2]
186 extern "C" fn __nedf2vfp(a: f64, b: f64) -> i32 {
187 (le_abi(a, b) != 0) as i32
188 }
189
190 #[slower_than_default]
191 #[bootrom_v2]
192 extern "C" fn __eqsf2vfp(a: f32, b: f32) -> i32 {
193 (le_abi(a, b) == 0) as i32
194 }
195
196 #[slower_than_default]
197 #[bootrom_v2]
198 extern "C" fn __eqdf2vfp(a: f64, b: f64) -> i32 {
199 (le_abi(a, b) == 0) as i32
200 }
201}