1250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/* ------------------------------------------------------------------
2250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
4250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * you may not use this file except in compliance with the License.
6250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * You may obtain a copy of the License at
7250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
8250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
10250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Unless required by applicable law or agreed to in writing, software
11250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * express or implied.
14250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * See the License for the specific language governing permissions
15250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * and limitations under the License.
16250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * -------------------------------------------------------------------
17250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */
18250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*
19250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
20250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   PacketVideo Corp.
21250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   MP3 Decoder Library
22250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
23250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   Pathname: ./cpp/include/pv_mp3dec_fxd_op_arm_gcc.h
24250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
25250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     Date: 08/20/2007
26250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
27250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
28250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REVISION HISTORY
29250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
30250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Description:
31250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
32250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber INCLUDE DESCRIPTION
33250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
34250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber This file select the associated fixed point functions with the OS/ARCH.
35250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
36250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
37250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
38250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber*/
39250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
40250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#ifndef PV_MP3DEC_FXD_OP_ARM_GCC_H
41250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#define PV_MP3DEC_FXD_OP_ARM_GCC_H
42250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
43250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
44250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#ifdef __cplusplus
45250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberextern "C"
46250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
47250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#endif
48250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
49250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_audio_type_defs.h"
50250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
51250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
52250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#if (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
53250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
54250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#define Qfmt_31(a)   (int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
55250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
56250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#define Qfmt15(x)   (Int16)(x*((int32)1<<15) + (x>=0?0.5F:-0.5F))
57250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
58250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    static inline int32 fxp_mul32_Q30(const int32 a, const int32 b)
59250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
60250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_hi;
61250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_lo;
62250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = (int32)a;
63250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rb = (int32)b;
64250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
65250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "mov   %1, %1, lsr #30\n\t"
66250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "add   %0, %1, %0, asl #2"
67250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             : "=&r*i"(result64_hi),
68250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "=&r*i"(result64_lo)
69250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             : "r"(ra),
70250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rb));
71250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (result64_hi);
72250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
73250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
74250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
75250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    static inline int32 fxp_mac32_Q30(const int32 a, const int32 b, int32 L_add)
76250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
77250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_hi;
78250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_lo;
79250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = (int32)a;
80250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rb = (int32)b;
81250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rc = (int32)L_add;
82250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
83250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
84250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "add %4, %4, %0, asl #2\n\t"
85250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "add %0, %4, %1, lsr #30"
86250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             : "=&r*i"(result64_hi),
87250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "=&r*i"(result64_lo)
88250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             : "r"(ra),
89250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rb),
90250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rc));
91250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
92250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (result64_hi);
93250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
94250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
95250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
96250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
97250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    static inline int32 fxp_mul32_Q32(const int32 a, const int32 b)
98250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
99250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_hi;
100250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_lo;
101250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = (int32)a;
102250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rb = (int32)b;
103250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile(
104250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            "smull %1, %0, %2, %3"
105250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    : "=&r*i"(result64_hi),
106250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            "=&r*i"(result64_lo)
107250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    : "r"(ra),
108250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    "r"(rb));
109250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
110250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (result64_hi);
111250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
112250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
113250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
114250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    static inline int32 fxp_mul32_Q29(const int32 a, const int32 b)
115250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
116250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_hi;
117250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_lo;
118250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = (int32)a;
119250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rb = (int32)b;
120250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
121250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "mov   %1, %1, lsr #29\n\t"
122250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "add   %0, %1, %0, asl #3"
123250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             : "=&r*i"(result64_hi),
124250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "=&r*i"(result64_lo)
125250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             : "r"(ra),
126250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rb));
127250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (result64_hi);
128250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
129250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
130250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
131250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    static inline int32 fxp_mul32_Q28(const int32 a, const int32 b)
132250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
133250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
134250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_hi;
135250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_lo;
136250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = (int32)a;
137250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rb = (int32)b;
138250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
139250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "mov   %1, %1, lsr #28\n\t"
140250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "add   %0, %1, %0, asl #4"
141250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             : "=&r*i"(result64_hi),
142250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "=&r*i"(result64_lo)
143250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             : "r"(ra),
144250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rb));
145250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (result64_hi);
146250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
147250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
148250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
149250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
150250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    static inline int32 fxp_mul32_Q27(const int32 a, const int32 b)
151250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
152250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_hi;
153250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_lo;
154250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = (int32)a;
155250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rb = (int32)b;
156250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
157250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "mov   %1, %1, lsr #27\n\t"
158250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "add   %0, %1, %0, asl #5"
159250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             : "=&r*i"(result64_hi),
160250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "=&r*i"(result64_lo)
161250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             : "r"(ra),
162250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rb));
163250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (result64_hi);
164250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
165250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
166250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
167250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
168250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    static inline int32 fxp_mul32_Q26(const int32 a, const int32 b)
169250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
170250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_hi;
171250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_lo;
172250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = (int32)a;
173250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rb = (int32)b;
174250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
175250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "mov   %1, %1, lsr #26\n\t"
176250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "add   %0, %1, %0, asl #6"
177250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             : "=&r*i"(result64_hi),
178250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "=&r*i"(result64_lo)
179250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             : "r"(ra),
180250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rb));
181250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (result64_hi);
182250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
183250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
184250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
185250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
186250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
187250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    static inline int32 fxp_mac32_Q32(int32 L_add, const int32 a, const int32 b)
188250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
189250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
190250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_hi;
191250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_lo;
192250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = (int32)a;
193250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rb = (int32)b;
194250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rc = (int32)L_add;
195250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
196250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
197250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "add %0, %0, %4"
198250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             : "=&r*i"(result64_hi),
199250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "=&r*i"(result64_lo)
200250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             : "r"(ra),
201250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rb),
202250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rc));
203250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
204250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (result64_hi);
205250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
206250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
207250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    static inline int32 fxp_msb32_Q32(int32 L_sub, const int32 a, const int32 b)
208250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
209250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_hi;
210250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 result64_lo;
211250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = (int32)a;
212250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rb = (int32)b;
213250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 rc = (int32)L_sub;
214250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
215250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile("smull %1, %0, %2, %3\n\t"
216250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "sub %0, %4, %0"
217250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             : "=&r*i"(result64_hi),
218250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     "=&r*i"(result64_lo)
219250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             : "r"(ra),
220250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rb),
221250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             "r"(rc));
222250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
223250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
224250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (result64_hi);
225250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
226250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
227250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
228250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    __inline int32 pv_abs(int32 x)
229250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
230250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 z;
231250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 y;
232250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        register int32 ra = x;
233250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        asm volatile(
234250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            "sub  %0, %2, %2, lsr #31\n\t"
235250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            "eor  %1, %0, %0, asr #31"
236250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    : "=&r*i"(z),
237250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            "=&r*i"(y)
238250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    : "r"(ra));
239250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
240250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return (y);
241250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
242250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
243250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
244250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#endif
245250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
246250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#ifdef __cplusplus
247250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
248250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#endif
249250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
250250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
251250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#endif   /*  PV_MP3DEC_FXD_OP_ARM_GCC_H  */
252250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
253