1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
ix!();
use crate::{
NLSFSaturator,
R,C,
};
impl FilterProcessQuad for crate::NonlinearStatesFilter {
#[inline] fn process_quad(
&self,
qfu: &mut QuadFilterUnitState,
mut input: __m128) -> __m128
{
let stages: i32 = qfu.comb_write_position[0] & 3;
let sat = NLSFSaturator::try_from(((qfu.comb_write_position[0] >> 2) & 3) as usize).unwrap();
for stage in 0..=stages {
macro_rules! z1 { () => { qfu.reg[(R::Z1 as usize) + ((stage * 2) as usize)] } }
macro_rules! z2 { () => { qfu.reg[(R::Z2 as usize) + ((stage * 2) as usize)] } }
macro_rules! z1mutref { () => { &mut qfu.reg[(R::Z1 as usize) + ((stage * 2) as usize)] } }
macro_rules! z2mutref { () => { &mut qfu.reg[(R::Z2 as usize) + ((stage * 2) as usize)] } }
let a1 = &qfu.coeff[C::A1];
let a2 = &qfu.coeff[C::A2];
let b0 = &qfu.coeff[C::B0];
let b1 = &qfu.coeff[C::B1];
let b2 = &qfu.coeff[C::B2];
input = unsafe {
let out: __m128 = _mm_add_ps(
z1![],
_mm_mul_ps(*b0, input)
);
qfu.reg[(R::Z1 as usize) + ((stage * 2) as usize)] = _mm_add_ps(
z2![],
_mm_sub_ps(
_mm_mul_ps(*b1, input),
_mm_mul_ps(*a1, out)
)
);
qfu.reg[(R::Z2 as usize) + ((stage * 2) as usize)] = _mm_sub_ps(
_mm_mul_ps(*b2, input),
_mm_mul_ps(*a2, out)
);
match sat {
NLSFSaturator::Tanh => {
*z1mutref![] = fasttanh_sse_clamped(z1![]);
*z2mutref![] = fasttanh_sse_clamped(z2![]);
},
NLSFSaturator::SoftClip => {
*z1mutref![] = softclip_ps(z1![]);
*z2mutref![] = softclip_ps(z2![]);
},
}
out
}
}
for i in 0..C::count() {
qfu.coeff[i] = unsafe { _mm_add_ps(qfu.coeff[i], qfu.dcoeff[i]) };
}
input
}
}