Skip to content

Commit

Permalink
ARM ARM DSP/SIMD32: Sum of 8-bit absolute differences (rust-lang#537)
Browse files Browse the repository at this point in the history
- `usad8`: Sum of 8-bit absolute differences
- `usad8a`: Sum of 8-bit absolute differences and constant (usad8(a, b) + c)
  • Loading branch information
paoloteti authored and alexcrichton committed Jul 24, 2018
1 parent 05c2f61 commit 2864908
Showing 1 changed file with 49 additions and 0 deletions.
49 changes: 49 additions & 0 deletions coresimd/arm/dsp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ extern "C" {

#[link_name = "llvm.arm.smusdx"]
fn arm_smusdx(a: i32, b: i32) -> i32;

#[link_name = "llvm.arm.usad8"]
fn arm_usad8(a: i32, b: i32) -> u32;
}

/// Signed saturating addition
Expand Down Expand Up @@ -284,6 +287,7 @@ pub unsafe fn shsub16(a: int16x2_t, b: int16x2_t) -> int16x2_t {
/// res = a\[0\] * b\[0\] + a\[1\] * b\[1\]
///
/// and sets the Q flag if overflow occurs on the addition.
#[inline]
#[cfg_attr(test, assert_instr(smuad))]
pub unsafe fn smuad(a: int16x2_t, b: int16x2_t) -> i32 {
arm_smuad(::mem::transmute(a), ::mem::transmute(b))
Expand Down Expand Up @@ -328,6 +332,30 @@ pub unsafe fn smusdx(a: int16x2_t, b: int16x2_t) -> i32 {
arm_smusdx(::mem::transmute(a), ::mem::transmute(b))
}

/// Sum of 8-bit absolute differences.
///
/// Returns the 8-bit unsigned equivalent of
///
/// res = abs(a\[0\] - b\[0\]) + abs(a\[1\] - b\[1\]) +\
/// (a\[2\] - b\[2\]) + (a\[3\] - b\[3\])
#[inline]
#[cfg_attr(test, assert_instr(usad8))]
pub unsafe fn usad8(a: int8x4_t, b: int8x4_t) -> u32 {
arm_usad8(::mem::transmute(a), ::mem::transmute(b))
}

/// Sum of 8-bit absolute differences and constant.
///
/// Returns the 8-bit unsigned equivalent of
///
/// res = abs(a\[0\] - b\[0\]) + abs(a\[1\] - b\[1\]) +\
/// (a\[2\] - b\[2\]) + (a\[3\] - b\[3\]) + c
#[inline]
#[cfg_attr(test, assert_instr(usad8))]
pub unsafe fn usad8a(a: int8x4_t, b: int8x4_t, c: u32) -> u32 {
usad8(a, b) + c
}

#[cfg(test)]
mod tests {
use coresimd::arm::*;
Expand Down Expand Up @@ -548,4 +576,25 @@ mod tests {
assert_eq!(r, -6);
}
}

#[test]
fn usad8() {
unsafe {
let a = i8x4::new(1, 2, 3, 4);
let b = i8x4::new(4, 3, 2, 1);
let r = dsp::usad8(::mem::transmute(a), ::mem::transmute(b));
assert_eq!(r, 8);
}
}

#[test]
fn usad8a() {
unsafe {
let a = i8x4::new(1, 2, 3, 4);
let b = i8x4::new(4, 3, 2, 1);
let c = 10;
let r = dsp::usad8a(::mem::transmute(a), ::mem::transmute(b), c);
assert_eq!(r, 8 + c);
}
}
}

0 comments on commit 2864908

Please sign in to comment.