annotate softfloat.h @ 864:ec7c0dcf0836 libavutil

checkheaders: skip per-arch headers not meant for direct inclusion Some of the per-arch headers are only meant to be used through the parent header of the same name. Testing these standalone does not make sense.
author mru
date Mon, 08 Mar 2010 20:17:47 +0000
parents 8c48a1b999a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
106
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
1 /*
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
2 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
3 *
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 106
diff changeset
4 * This file is part of FFmpeg.
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 106
diff changeset
5 *
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 106
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
106
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
8 * License as published by the Free Software Foundation; either
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 106
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
106
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
10 *
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 106
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
106
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
14 * Lesser General Public License for more details.
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
15 *
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 106
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
106
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
87a8edfd1434 Exchange informal LGPL notice by official license header.
diego
parents: 91
diff changeset
19 */
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
20
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 527
diff changeset
21 #ifndef AVUTIL_SOFTFLOAT_H
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 527
diff changeset
22 #define AVUTIL_SOFTFLOAT_H
344
580fffa86f08 add multiple inclusion guards to headers
mru
parents: 343
diff changeset
23
343
f21d1907d47c include all prerequisites in header files
mru
parents: 116
diff changeset
24 #include <stdint.h>
485
b4ff998c79e3 add missing #include "common.h" to libavutil headers
mru
parents: 481
diff changeset
25 #include "common.h"
343
f21d1907d47c include all prerequisites in header files
mru
parents: 116
diff changeset
26
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
27 #define MIN_EXP -126
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
28 #define MAX_EXP 126
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
29 #define ONE_BITS 29
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
30
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
31 typedef struct SoftFloat{
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
32 int32_t exp;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
33 int32_t mant;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
34 }SoftFloat;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
35
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 478
diff changeset
36 static av_const SoftFloat av_normalize_sf(SoftFloat a){
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
37 if(a.mant){
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
38 #if 1
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
39 while((a.mant + 0x20000000U)<0x40000000U){
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
40 a.mant += a.mant;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
41 a.exp -= 1;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
42 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
43 #else
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
44 int s=ONE_BITS + 1 - av_log2(a.mant ^ (a.mant<<1));
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
45 a.exp -= s;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
46 a.mant <<= s;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
47 #endif
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
48 if(a.exp < MIN_EXP){
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
49 a.exp = MIN_EXP;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
50 a.mant= 0;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
51 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
52 }else{
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
53 a.exp= MIN_EXP;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
54 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
55 return a;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
56 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
57
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 478
diff changeset
58 static inline av_const SoftFloat av_normalize1_sf(SoftFloat a){
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
59 #if 1
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
60 if(a.mant + 0x40000000 < 0){
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
61 a.exp++;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
62 a.mant>>=1;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
63 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
64 return a;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
65 #elif 1
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
66 int t= a.mant + 0x40000000 < 0;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
67 return (SoftFloat){a.exp+t, a.mant>>t};
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
68 #else
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
69 int t= (a.mant + 0x40000000U)>>31;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
70 return (SoftFloat){a.exp+t, a.mant>>t};
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
71 #endif
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
72 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
73
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
74 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
75 * @return Will not be more denormalized than a+b. So if either input is
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
76 * normalized, then the output will not be worse then the other input.
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
77 * If both are normalized, then the output will be normalized.
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
78 */
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 478
diff changeset
79 static inline av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b){
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
80 a.exp += b.exp;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
81 a.mant = (a.mant * (int64_t)b.mant) >> ONE_BITS;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
82 return av_normalize1_sf(a);
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
83 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
84
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
85 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
86 * b has to be normalized and not zero.
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
87 * @return Will not be more denormalized than a.
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
88 */
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 478
diff changeset
89 static av_const SoftFloat av_div_sf(SoftFloat a, SoftFloat b){
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
90 a.exp -= b.exp+1;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
91 a.mant = ((int64_t)a.mant<<(ONE_BITS+1)) / b.mant;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
92 return av_normalize1_sf(a);
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
93 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
94
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 478
diff changeset
95 static inline av_const int av_cmp_sf(SoftFloat a, SoftFloat b){
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
96 int t= a.exp - b.exp;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
97 if(t<0) return (a.mant >> (-t)) - b.mant ;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
98 else return a.mant - (b.mant >> t);
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
99 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
100
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 478
diff changeset
101 static inline av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b){
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
102 int t= a.exp - b.exp;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
103 if(t<0) return av_normalize1_sf((SoftFloat){b.exp, b.mant + (a.mant >> (-t))});
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
104 else return av_normalize1_sf((SoftFloat){a.exp, a.mant + (b.mant >> t )});
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
105 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
106
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 478
diff changeset
107 static inline av_const SoftFloat av_sub_sf(SoftFloat a, SoftFloat b){
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
108 return av_add_sf(a, (SoftFloat){b.exp, -b.mant});
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
109 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
110
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
111 //FIXME sqrt, log, exp, pow, sin, cos
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
112
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 478
diff changeset
113 static inline av_const SoftFloat av_int2sf(int v, int frac_bits){
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
114 return av_normalize_sf((SoftFloat){ONE_BITS-frac_bits, v});
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
115 }
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
116
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
117 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
118 * Rounding is to -inf.
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
119 */
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 478
diff changeset
120 static inline av_const int av_sf2int(SoftFloat v, int frac_bits){
91
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
121 v.exp += frac_bits - ONE_BITS;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
122 if(v.exp >= 0) return v.mant << v.exp ;
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
123 else return v.mant >>(-v.exp);
04f62b676170 floating point "emulation" code
michael
parents:
diff changeset
124 }
344
580fffa86f08 add multiple inclusion guards to headers
mru
parents: 343
diff changeset
125
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 527
diff changeset
126 #endif /* AVUTIL_SOFTFLOAT_H */