1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied.
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License.
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * -------------------------------------------------------------------
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Pathname: ./cpp/include/pv_mp3dec_fxd_op_arm_gcc.h
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 08/20/2007
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INCLUDE DESCRIPTION
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber This file select the associated fixed point functions with the OS/ARCH.
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#ifndef PV_MP3DEC_FXD_OP_ARM_GCC_H
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define PV_MP3DEC_FXD_OP_ARM_GCC_H
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#ifdef __cplusplus
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberextern "C"
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_audio_type_defs.h"
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#if (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define Qfmt_31(a)   (int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define Qfmt15(x)   (Int16)(x*((int32)1<<15) + (x>=0?0.5F:-0.5F))
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    static inline int32 fxp_mul32_Q30(const int32 a, const int32 b)
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_hi;
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_lo;
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = (int32)a;
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rb = (int32)b;
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "mov   %1, %1, lsr #30\n\t"
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "add   %0, %1, %0, asl #2"
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             : "=&r*i"(result64_hi),
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "=&r*i"(result64_lo)
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             : "r"(ra),
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rb));
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    static inline int32 fxp_mac32_Q30(const int32 a, const int32 b, int32 L_add)
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_hi;
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_lo;
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = (int32)a;
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rb = (int32)b;
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rc = (int32)L_add;
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "add %4, %4, %0, asl #2\n\t"
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "add %0, %4, %1, lsr #30"
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             : "=&r*i"(result64_hi),
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "=&r*i"(result64_lo)
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             : "r"(ra),
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rb),
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rc));
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    static inline int32 fxp_mul32_Q32(const int32 a, const int32 b)
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_hi;
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_lo;
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = (int32)a;
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rb = (int32)b;
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile(
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            "smull %1, %0, %2, %3"
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    : "=&r*i"(result64_hi),
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            "=&r*i"(result64_lo)
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    : "r"(ra),
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    "r"(rb));
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    static inline int32 fxp_mul32_Q29(const int32 a, const int32 b)
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_hi;
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_lo;
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = (int32)a;
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rb = (int32)b;
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "mov   %1, %1, lsr #29\n\t"
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "add   %0, %1, %0, asl #3"
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             : "=&r*i"(result64_hi),
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "=&r*i"(result64_lo)
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             : "r"(ra),
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rb));
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    static inline int32 fxp_mul32_Q28(const int32 a, const int32 b)
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_hi;
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_lo;
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = (int32)a;
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rb = (int32)b;
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "mov   %1, %1, lsr #28\n\t"
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "add   %0, %1, %0, asl #4"
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             : "=&r*i"(result64_hi),
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "=&r*i"(result64_lo)
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             : "r"(ra),
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rb));
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    static inline int32 fxp_mul32_Q27(const int32 a, const int32 b)
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_hi;
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_lo;
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = (int32)a;
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rb = (int32)b;
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "mov   %1, %1, lsr #27\n\t"
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "add   %0, %1, %0, asl #5"
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             : "=&r*i"(result64_hi),
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "=&r*i"(result64_lo)
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             : "r"(ra),
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rb));
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    static inline int32 fxp_mul32_Q26(const int32 a, const int32 b)
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_hi;
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_lo;
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = (int32)a;
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rb = (int32)b;
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "mov   %1, %1, lsr #26\n\t"
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "add   %0, %1, %0, asl #6"
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             : "=&r*i"(result64_hi),
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "=&r*i"(result64_lo)
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             : "r"(ra),
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rb));
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    static inline int32 fxp_mac32_Q32(int32 L_add, const int32 a, const int32 b)
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_hi;
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_lo;
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = (int32)a;
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rb = (int32)b;
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rc = (int32)L_add;
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "add %0, %0, %4"
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             : "=&r*i"(result64_hi),
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "=&r*i"(result64_lo)
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             : "r"(ra),
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rb),
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rc));
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    static inline int32 fxp_msb32_Q32(int32 L_sub, const int32 a, const int32 b)
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_hi;
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 result64_lo;
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = (int32)a;
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rb = (int32)b;
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 rc = (int32)L_sub;
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "sub %0, %4, %0"
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             : "=&r*i"(result64_hi),
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                     "=&r*i"(result64_lo)
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             : "r"(ra),
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rb),
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             "r"(rc));
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline int32 pv_abs(int32 x)
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 z;
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 y;
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        register int32 ra = x;
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        asm volatile(
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            "sub  %0, %2, %2, lsr #31\n\t"
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            "eor  %1, %0, %0, asr #31"
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    : "=&r*i"(z),
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            "=&r*i"(y)
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    : "r"(ra));
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (y);
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#ifdef __cplusplus
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif   /*  PV_MP3DEC_FXD_OP_ARM_GCC_H  */
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
253