iir: vminnm/vmaxnm

This commit is contained in:
Robert Jördens 2020-11-26 14:19:09 +01:00
parent cc64f47004
commit 468929690d
5 changed files with 35 additions and 1 deletions

View File

@ -62,7 +62,7 @@ branch = "dma"
[features] [features]
semihosting = ["panic-semihosting", "cortex-m-log/semihosting"] semihosting = ["panic-semihosting", "cortex-m-log/semihosting"]
bkpt = [ ] bkpt = [ ]
nightly = ["cortex-m/inline-asm"] nightly = ["cortex-m/inline-asm", "dsp/nightly"]
[profile.dev] [profile.dev]
codegen-units = 1 codegen-units = 1

View File

@ -6,3 +6,6 @@ edition = "2018"
[dependencies] [dependencies]
serde = { version = "1.0", features = ["derive"], default-features = false } serde = { version = "1.0", features = ["derive"], default-features = false }
[features]
nightly = []

View File

@ -24,6 +24,7 @@ fn copysign(x: f32, y: f32) -> f32 {
} }
} }
#[cfg(not(feature = "nightly"))]
fn max(x: f32, y: f32) -> f32 { fn max(x: f32, y: f32) -> f32 {
if x > y { if x > y {
x x
@ -32,6 +33,7 @@ fn max(x: f32, y: f32) -> f32 {
} }
} }
#[cfg(not(feature = "nightly"))]
fn min(x: f32, y: f32) -> f32 { fn min(x: f32, y: f32) -> f32 {
if x < y { if x < y {
x x
@ -40,6 +42,31 @@ fn min(x: f32, y: f32) -> f32 {
} }
} }
#[cfg(feature = "nightly")]
fn max(x: f32, y: f32) -> f32 {
let o: f32;
unsafe {
asm!("vmaxnm.f32 {}, {}, {}",
lateout(sreg) o, in(sreg) x, in(sreg) y,
options(pure, nomem, nostack, preserves_flags)
);
}
o
}
#[cfg(feature = "nightly")]
fn min(x: f32, y: f32) -> f32 {
let o: f32;
unsafe {
asm!("vminnm.f32 {}, {}, {}",
lateout(sreg) o, in(sreg) x, in(sreg) y,
options(pure, nomem, nostack, preserves_flags)
);
}
o
}
// Multiply-accumulate vectors `x` and `a`. // Multiply-accumulate vectors `x` and `a`.
// //
// A.k.a. dot product. // A.k.a. dot product.

View File

@ -1,3 +1,4 @@
#![no_std] #![no_std]
#![cfg_attr(feature = "nightly", feature(asm))]
pub mod iir; pub mod iir;

View File

@ -13,6 +13,9 @@
fn panic(_info: &core::panic::PanicInfo) -> ! { fn panic(_info: &core::panic::PanicInfo) -> ! {
let gpiod = unsafe { &*hal::stm32::GPIOD::ptr() }; let gpiod = unsafe { &*hal::stm32::GPIOD::ptr() };
gpiod.odr.modify(|_, w| w.odr6().high().odr12().high()); // FP_LED_1, FP_LED_3 gpiod.odr.modify(|_, w| w.odr6().high().odr12().high()); // FP_LED_1, FP_LED_3
#[cfg(feature = "nightly")]
core::intrinsics::abort();
#[cfg(not(feature = "nightly"))]
unsafe { unsafe {
core::intrinsics::abort(); core::intrinsics::abort();
} }