ffmpeg / libavcodec / armv4l / mathops.h @ be449fca
History  View  Annotate  Download (2.59 KB)
1 
/*


2 
* simple math operations

3 
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al

4 
*

5 
* This file is part of FFmpeg.

6 
*

7 
* FFmpeg is free software; you can redistribute it and/or

8 
* modify it under the terms of the GNU Lesser General Public

9 
* License as published by the Free Software Foundation; either

10 
* version 2.1 of the License, or (at your option) any later version.

11 
*

12 
* FFmpeg is distributed in the hope that it will be useful,

13 
* but WITHOUT ANY WARRANTY; without even the implied warranty of

14 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU

15 
* Lesser General Public License for more details.

16 
*

17 
* You should have received a copy of the GNU Lesser General Public

18 
* License along with FFmpeg; if not, write to the Free Software

19 
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA

20 
*/

21  
22 
#ifndef AVCODEC_ARMV4L_MATHOPS_H

23 
#define AVCODEC_ARMV4L_MATHOPS_H

24  
25 
#ifdef FRAC_BITS

26 
# define MULL(a, b) \

27 
({ int lo, hi;\

28 
__asm__("smull %0, %1, %2, %3 \n\t"\

29 
"mov %0, %0, lsr %4\n\t"\

30 
"add %1, %0, %1, lsl %5\n\t"\

31 
: "=&r"(lo), "=&r"(hi)\ 
32 
: "r"(b), "r"(a), "i"(FRAC_BITS), "i"(32FRAC_BITS));\ 
33 
hi; }) 
34 
#endif

35  
36 
#ifdef HAVE_ARMV6

37 
static inline av_const int MULH(int a, int b) 
38 
{ 
39 
int r;

40 
__asm__ ("smmul %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); 
41 
return r;

42 
} 
43 
#define MULH MULH

44 
#else

45 
#define MULH(a, b) \

46 
({ int lo, hi;\

47 
__asm__ ("smull %0, %1, %2, %3" : "=&r"(lo), "=&r"(hi) : "r"(b), "r"(a));\ 
48 
hi; }) 
49 
#endif

50  
51 
static inline av_const int64_t MUL64(int a, int b) 
52 
{ 
53 
union { uint64_t x; unsigned hl[2]; } x; 
54 
__asm__ ("smull %0, %1, %2, %3"

55 
: "=r"(x.hl[0]), "=r"(x.hl[1]) : "r"(a), "r"(b)); 
56 
return x.x;

57 
} 
58 
#define MUL64 MUL64

59  
60 
static inline av_const int64_t MAC64(int64_t d, int a, int b) 
61 
{ 
62 
union { uint64_t x; unsigned hl[2]; } x = { d }; 
63 
__asm__ ("smlal %0, %1, %2, %3"

64 
: "+r"(x.hl[0]), "+r"(x.hl[1]) : "r"(a), "r"(b)); 
65 
return x.x;

66 
} 
67 
#define MAC64(d, a, b) ((d) = MAC64(d, a, b))

68 
#define MLS64(d, a, b) MAC64(d, (a), b)

69  
70 
#if defined(HAVE_ARMV5TE)

71  
72 
/* signed 16x16 > 32 multiply add accumulate */

73 
# define MAC16(rt, ra, rb) \

74 
__asm__ ("smlabb %0, %2, %3, %0" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb)); 
75 
/* signed 16x16 > 32 multiply */

76 
# define MUL16(ra, rb) \

77 
({ int __rt; \

78 
__asm__ ("smulbb %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb)); \ 
79 
__rt; }) 
80  
81 
#endif

82  
83 
#endif /* AVCODEC_ARMV4L_MATHOPS_H */ 