Mercurial > libavcodec.hg
annotate ppc/mathops.h @ 10311:943b63f364ca libavcodec
Make sure all the bits are written to output in fax data decoder.
This fixes decoding TIFF images with fax compression and width being not
multiple of eight (and issue 1429).
author | kostya |
---|---|
date | Tue, 29 Sep 2009 05:55:14 +0000 |
parents | 25136467a218 |
children |
rev | line source |
---|---|
3733 | 1 /* |
2 * simple math operations | |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8590
diff
changeset
|
3 * Copyright (c) 2001, 2002 Fabrice Bellard |
3733 | 4 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al |
5 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3733
diff
changeset
|
6 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3733
diff
changeset
|
7 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3733
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
3733 | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3733
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
3733 | 12 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3733
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
3733 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3733
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
3733 | 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 */ | |
22 | |
7760 | 23 #ifndef AVCODEC_PPC_MATHOPS_H |
24 #define AVCODEC_PPC_MATHOPS_H | |
5163 | 25 |
10077 | 26 #include <stdint.h> |
10080 | 27 #include "config.h" |
10077 | 28 #include "libavutil/common.h" |
8662
31bdc2da2e80
Add required headers to fix warnings during 'make checkheaders'.
diego
parents:
8655
diff
changeset
|
29 |
8655
14ccee231565
Add a check for ppc4xx instructions; rename preprocessor directive accordingly.
diego
parents:
8629
diff
changeset
|
30 #if HAVE_PPC4XX |
3733 | 31 /* signed 16x16 -> 32 multiply add accumulate */ |
7333
a8a79f5385f6
cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents:
6501
diff
changeset
|
32 #define MAC16(rt, ra, rb) \ |
8031 | 33 __asm__ ("maclhw %0, %2, %3" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb)); |
3733 | 34 |
35 /* signed 16x16 -> 32 multiply */ | |
7333
a8a79f5385f6
cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents:
6501
diff
changeset
|
36 #define MUL16(ra, rb) \ |
a8a79f5385f6
cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents:
6501
diff
changeset
|
37 ({ int __rt; \ |
8031 | 38 __asm__ ("mullhw %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb)); \ |
7333
a8a79f5385f6
cosmetics: Reformat PPC code in libavcodec according to style guidelines.
diego
parents:
6501
diff
changeset
|
39 __rt; }) |
3733 | 40 #endif |
5163 | 41 |
9596 | 42 #define MULH MULH |
43 static inline av_const int MULH(int a, int b){ | |
44 int r; | |
45 __asm__ ("mulhw %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); | |
46 return r; | |
47 } | |
48 | |
9713 | 49 #if !ARCH_PPC64 |
9625 | 50 static inline av_const int64_t MAC64(int64_t d, int a, int b) |
51 { | |
52 union { uint64_t x; unsigned hl[2]; } x = { d }; | |
53 int h, l; | |
54 __asm__ ("mullw %3, %4, %5 \n\t" | |
55 "mulhw %2, %4, %5 \n\t" | |
56 "addc %1, %1, %3 \n\t" | |
57 "adde %0, %0, %2 \n\t" | |
58 : "+r"(x.hl[0]), "+r"(x.hl[1]), "=&r"(h), "=&r"(l) | |
59 : "r"(a), "r"(b)); | |
60 return x.x; | |
61 } | |
62 #define MAC64(d, a, b) ((d) = MAC64(d, a, b)) | |
63 | |
64 static inline av_const int64_t MLS64(int64_t d, int a, int b) | |
65 { | |
66 union { uint64_t x; unsigned hl[2]; } x = { d }; | |
67 int h, l; | |
68 __asm__ ("mullw %3, %4, %5 \n\t" | |
69 "mulhw %2, %4, %5 \n\t" | |
70 "subfc %1, %3, %1 \n\t" | |
71 "subfe %0, %2, %0 \n\t" | |
72 : "+r"(x.hl[0]), "+r"(x.hl[1]), "=&r"(h), "=&r"(l) | |
73 : "r"(a), "r"(b)); | |
74 return x.x; | |
75 } | |
76 #define MLS64(d, a, b) ((d) = MLS64(d, a, b)) | |
77 #endif | |
78 | |
7760 | 79 #endif /* AVCODEC_PPC_MATHOPS_H */ |