From 028df9def0d74565d993746248ff1fe8ee7d1166 Mon Sep 17 00:00:00 2001 From: pichenettes Date: Tue, 22 Nov 2011 19:48:12 +0100 Subject: [PATCH] Added U24Sub and U16U8MulShift8 ops --- op.h | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/op.h b/op.h index aa569d0..aeac73f 100755 --- a/op.h +++ b/op.h @@ -97,6 +97,24 @@ static inline uint24_t U24Add(uint24_t a, uint24_t b) { return result; } +static inline uint24_t U24Sub(uint24_t a, uint24_t b) { + uint16_t a_int = a.integral; + uint16_t b_int = b.integral; + uint8_t a_frac = a.fractional; + uint8_t b_frac = b.fractional; + uint24_t result; + asm( + "sub %0, %4" "\n\t" + "sbc %A1, %A5" "\n\t" + "sbc %B1, %B5" "\n\t" + : "=r" (a_frac), "=r" (a_int) + : "0" (a_frac), "1" (a_int), "a" (b_frac), "a" (b_int) + ); + result.integral = a_int; + result.fractional = a_frac; + return result; +} + static inline uint24_t U24ShiftRight(uint24_t a) { uint16_t a_int = a.integral; uint8_t a_frac = a.fractional; @@ -458,6 +476,22 @@ static inline int16_t S16U8MulShift8(int16_t a, uint8_t b) { return result; } +static inline uint16_t U16U8MulShift8(uint16_t a, uint8_t b) { + uint16_t result; + asm( + "eor %B0, %B0" "\n\t" + "mul %A1, %A2" "\n\t" + "mov %A0, r1" "\n\t" + "mul %B1, %A2" "\n\t" + "add %A0, r0" "\n\t" + "adc %B0, r1" "\n\t" + "eor r1, r1" "\n\t" + : "=&r" (result) + : "a" (a), "a" (b) + ); + return result; +} + static inline int16_t S16S8MulShift8(int16_t a, int8_t b) { int16_t result; asm( @@ -540,6 +574,21 @@ static inline uint24_t U24Add(uint24_t a, uint24_t b) { return result; } +static inline uint24_t U24Sub(uint24_t a, uint24_t b) { + uint24_t result; + + uint32_t av = static_cast(a.integral) << 8; + av += a.fractional; + + uint32_t bv = static_cast(b.integral) << 8; + bv += b.fractional; + + uint32_t difference = av - bv; + result.integral = sum >> 8; + result.fractional = sum & 0xff; + return result; +} + static inline uint24_t U24ShiftRight(uint24_t a) { uint24_t result; uint32_t av = static_cast(a.integral) << 8; @@ -654,6 +703,10 @@ static inline int16_t S16U8MulShift8(int16_t a, uint8_t b) { return (static_cast(a) * static_cast(b)) >> 8; } +static inline int16_t U16U8MulShift8(uint16_t a, uint8_t b) { + return (static_cast(a) * static_cast(b)) >> 8; +} + static inline uint8_t InterpolateSample( const prog_uint8_t* table, uint16_t phase) {