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