cortex_m/register/
fpscr.rs1#[derive(Clone, Copy, Debug)]
5pub struct Fpscr {
6    bits: u32,
7}
8
9impl Fpscr {
10    #[inline]
12    pub fn from_bits(bits: u32) -> Self {
13        Self { bits }
14    }
15
16    #[inline]
18    pub fn bits(self) -> u32 {
19        self.bits
20    }
21
22    #[inline]
24    pub fn n(self) -> bool {
25        self.bits & (1 << 31) != 0
26    }
27
28    #[inline]
30    pub fn set_n(&mut self, n: bool) {
31        let mask = 1 << 31;
32        match n {
33            true => self.bits |= mask,
34            false => self.bits &= !mask,
35        }
36    }
37
38    #[inline]
40    pub fn z(self) -> bool {
41        self.bits & (1 << 30) != 0
42    }
43
44    #[inline]
46    pub fn set_z(&mut self, z: bool) {
47        let mask = 1 << 30;
48        match z {
49            true => self.bits |= mask,
50            false => self.bits &= !mask,
51        }
52    }
53
54    #[inline]
56    pub fn c(self) -> bool {
57        self.bits & (1 << 29) != 0
58    }
59
60    #[inline]
62    pub fn set_c(&mut self, c: bool) {
63        let mask = 1 << 29;
64        match c {
65            true => self.bits |= mask,
66            false => self.bits &= !mask,
67        }
68    }
69
70    #[inline]
72    pub fn v(self) -> bool {
73        self.bits & (1 << 28) != 0
74    }
75
76    #[inline]
78    pub fn set_v(&mut self, v: bool) {
79        let mask = 1 << 28;
80        match v {
81            true => self.bits |= mask,
82            false => self.bits &= !mask,
83        }
84    }
85
86    #[inline]
88    pub fn ahp(self) -> bool {
89        self.bits & (1 << 26) != 0
90    }
91
92    #[inline]
94    pub fn set_ahp(&mut self, ahp: bool) {
95        let mask = 1 << 26;
96        match ahp {
97            true => self.bits |= mask,
98            false => self.bits &= !mask,
99        }
100    }
101
102    #[inline]
104    pub fn dn(self) -> bool {
105        self.bits & (1 << 25) != 0
106    }
107
108    #[inline]
110    pub fn set_dn(&mut self, dn: bool) {
111        let mask = 1 << 25;
112        match dn {
113            true => self.bits |= mask,
114            false => self.bits &= !mask,
115        }
116    }
117
118    #[inline]
120    pub fn fz(self) -> bool {
121        self.bits & (1 << 24) != 0
122    }
123
124    #[inline]
126    pub fn set_fz(&mut self, fz: bool) {
127        let mask = 1 << 24;
128        match fz {
129            true => self.bits |= mask,
130            false => self.bits &= !mask,
131        }
132    }
133
134    #[inline]
136    pub fn rmode(self) -> RMode {
137        match (self.bits & (3 << 22)) >> 22 {
138            0 => RMode::Nearest,
139            1 => RMode::PlusInfinity,
140            2 => RMode::MinusInfinity,
141            _ => RMode::Zero,
142        }
143    }
144
145    #[inline]
147    pub fn set_rmode(&mut self, rmode: RMode) {
148        let mask = 3 << 22;
149        match rmode {
150            RMode::Nearest => self.bits &= !mask,
151            RMode::PlusInfinity => self.bits = (self.bits & !mask) | (1 << 22),
152            RMode::MinusInfinity => self.bits = (self.bits & !mask) | (2 << 22),
153            RMode::Zero => self.bits |= mask,
154        }
155    }
156
157    #[inline]
159    pub fn idc(self) -> bool {
160        self.bits & (1 << 7) != 0
161    }
162
163    #[inline]
165    pub fn set_idc(&mut self, idc: bool) {
166        let mask = 1 << 7;
167        match idc {
168            true => self.bits |= mask,
169            false => self.bits &= !mask,
170        }
171    }
172
173    #[inline]
175    pub fn ixc(self) -> bool {
176        self.bits & (1 << 4) != 0
177    }
178
179    #[inline]
181    pub fn set_ixc(&mut self, ixc: bool) {
182        let mask = 1 << 4;
183        match ixc {
184            true => self.bits |= mask,
185            false => self.bits &= !mask,
186        }
187    }
188
189    #[inline]
191    pub fn ufc(self) -> bool {
192        self.bits & (1 << 3) != 0
193    }
194
195    #[inline]
197    pub fn set_ufc(&mut self, ufc: bool) {
198        let mask = 1 << 3;
199        match ufc {
200            true => self.bits |= mask,
201            false => self.bits &= !mask,
202        }
203    }
204
205    #[inline]
207    pub fn ofc(self) -> bool {
208        self.bits & (1 << 2) != 0
209    }
210
211    #[inline]
213    pub fn set_ofc(&mut self, ofc: bool) {
214        let mask = 1 << 2;
215        match ofc {
216            true => self.bits |= mask,
217            false => self.bits &= !mask,
218        }
219    }
220
221    #[inline]
223    pub fn dzc(self) -> bool {
224        self.bits & (1 << 1) != 0
225    }
226
227    #[inline]
229    pub fn set_dzc(&mut self, dzc: bool) {
230        let mask = 1 << 1;
231        match dzc {
232            true => self.bits |= mask,
233            false => self.bits &= !mask,
234        }
235    }
236
237    #[inline]
239    pub fn ioc(self) -> bool {
240        self.bits & (1 << 0) != 0
241    }
242
243    #[inline]
245    pub fn set_ioc(&mut self, ioc: bool) {
246        let mask = 1 << 0;
247        match ioc {
248            true => self.bits |= mask,
249            false => self.bits &= !mask,
250        }
251    }
252}
253
254#[derive(Clone, Copy, Debug, Eq, PartialEq)]
256pub enum RMode {
257    Nearest,
259    PlusInfinity,
261    MinusInfinity,
263    Zero,
265}
266
267impl RMode {
268    #[inline]
270    pub fn is_nearest(self) -> bool {
271        self == RMode::Nearest
272    }
273
274    #[inline]
276    pub fn is_plus_infinity(self) -> bool {
277        self == RMode::PlusInfinity
278    }
279
280    #[inline]
282    pub fn is_minus_infinity(self) -> bool {
283        self == RMode::MinusInfinity
284    }
285
286    #[inline]
288    pub fn is_zero(self) -> bool {
289        self == RMode::Zero
290    }
291}
292
293#[inline]
295pub fn read() -> Fpscr {
296    let r: u32 = call_asm!(__fpscr_r() -> u32);
297    Fpscr::from_bits(r)
298}
299
300#[inline]
302pub unsafe fn write(fpscr: Fpscr) {
303    let fpscr = fpscr.bits();
304    call_asm!(__fpscr_w(fpscr: u32));
305}