1e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/* Copyright (C) 2013 Xiph.Org Foundation and contributors */ 2e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/* 3e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org Redistribution and use in source and binary forms, with or without 4e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org modification, are permitted provided that the following conditions 5e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org are met: 6e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 7e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org - Redistributions of source code must retain the above copyright 8e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org notice, this list of conditions and the following disclaimer. 9e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 10e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org - Redistributions in binary form must reproduce the above copyright 11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org notice, this list of conditions and the following disclaimer in the 12e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org documentation and/or other materials provided with the distribution. 13e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 14e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 17e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 18e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 22e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 23e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org*/ 26e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 27e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifndef FIXED_ARMv4_H 28e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define FIXED_ARMv4_H 29e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 30e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ 31e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#undef MULT16_32_Q16 323c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE opus_val32 MULT16_32_Q16_armv4(opus_val16 a, opus_val32 b) 33e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org{ 34e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org unsigned rd_lo; 35e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int rd_hi; 36e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org __asm__( 37e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org "#MULT16_32_Q16\n\t" 38e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org "smull %0, %1, %2, %3\n\t" 39e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org : "=&r"(rd_lo), "=&r"(rd_hi) 40e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org : "%r"(b),"r"(a<<16) 41e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org ); 42e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org return rd_hi; 43e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org} 44e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define MULT16_32_Q16(a, b) (MULT16_32_Q16_armv4(a, b)) 45e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 46e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 47e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ 48e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#undef MULT16_32_Q15 493c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE opus_val32 MULT16_32_Q15_armv4(opus_val16 a, opus_val32 b) 50e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org{ 51e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org unsigned rd_lo; 52e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int rd_hi; 53e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org __asm__( 54e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org "#MULT16_32_Q15\n\t" 55e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org "smull %0, %1, %2, %3\n\t" 56e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org : "=&r"(rd_lo), "=&r"(rd_hi) 57e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org : "%r"(b), "r"(a<<16) 58e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org ); 59e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org /*We intentionally don't OR in the high bit of rd_lo for speed.*/ 60e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org return rd_hi<<1; 61e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org} 62e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv4(a, b)) 63e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 64e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 65e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. 66e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org b must fit in 31 bits. 67e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org Result fits in 32 bits. */ 68e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#undef MAC16_32_Q15 69e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define MAC16_32_Q15(c, a, b) ADD32(c, MULT16_32_Q15(a, b)) 70e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 71e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 72e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ 73e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#undef MULT32_32_Q31 74e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define MULT32_32_Q31(a,b) (opus_val32)((((opus_int64)(a)) * ((opus_int64)(b)))>>31) 75e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 76e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 77