FFmpeg
Loading...
Searching...
No Matches
emms.h
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#ifndef AVUTIL_EMMS_H
20#define AVUTIL_EMMS_H
21
22#include <stdint.h>
23#include <stdlib.h>
24
25#include "config.h"
27#include "libavutil/log.h"
28
29#if ARCH_X86
30
31#if HAVE_MMX_INLINE
32#ifndef __MMX__
33#include "libavutil/cpu.h"
34#endif
35
36# define emms_c emms_c
37/**
38 * Empty mmx state.
39 * this must be called between any dsp function and float/double code.
40 * for example sin(); dsp->idct_put(); emms_c(); cos()
41 * Note, *alloc() and *free() also use float code in some libc implementations
42 * thus this also applies to them or any function using them.
43 */
44static av_always_inline void emms_c(void)
45{
46/* Some inlined functions may also use mmx instructions regardless of
47 * runtime cpuflags. With that in mind, we unconditionally empty the
48 * mmx state if the target cpu chosen at configure time supports it.
49 */
50#if !defined(__MMX__)
52#endif
53 __asm__ volatile ("emms" ::: "memory");
54}
55
56static inline void ff_assert0_fpu(const char *file, int line_number)
57{
58 uint16_t state[14];
59 __asm__ volatile (
60 "fstenv %0 \n\t"
61 : "+m" (state)
62 :
63 : "memory"
64 );
65 if ((state[4] & 3) != 3) {
66 emms_c();
68 "Invalid floating point state assertion "
69 "triggered at line %u in file %s\n",
70 line_number, file);
71 abort();
72 }
73}
74
75#define ff_assert0_fpu() ff_assert0_fpu(__FILE__, __LINE__)
76
77#elif HAVE_MMX && HAVE_MM_EMPTY
78# include <mmintrin.h>
79# define emms_c _mm_empty
80#elif HAVE_MMX_EXTERNAL
81void ff_emms_asm(void);
82# define emms_c ff_emms_asm
83#endif /* HAVE_MMX_INLINE */
84
85#endif /* ARCH_X86 */
86
87#ifndef emms_c
88# define emms_c() do {} while(0)
89#endif
90
91#ifndef ff_assert0_fpu
92#define ff_assert0_fpu() ((void)0)
93#endif
94
95#if defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 1
96#define ff_assert1_fpu() ff_assert0_fpu()
97#else
98#define ff_assert1_fpu() ((void)0)
99#endif
100
101#endif /* AVUTIL_EMMS_H */
__asm__(".macro parse_r var r\n\t" "\\var = -1\n\t" _IFC_REG(0) _IFC_REG(1) _IFC_REG(2) _IFC_REG(3) _IFC_REG(4) _IFC_REG(5) _IFC_REG(6) _IFC_REG(7) _IFC_REG(8) _IFC_REG(9) _IFC_REG(10) _IFC_REG(11) _IFC_REG(12) _IFC_REG(13) _IFC_REG(14) _IFC_REG(15) _IFC_REG(16) _IFC_REG(17) _IFC_REG(18) _IFC_REG(19) _IFC_REG(20) _IFC_REG(21) _IFC_REG(22) _IFC_REG(23) _IFC_REG(24) _IFC_REG(25) _IFC_REG(26) _IFC_REG(27) _IFC_REG(28) _IFC_REG(29) _IFC_REG(30) _IFC_REG(31) ".iflt \\var\n\t" ".error \"Unable to parse register name \\r\"\n\t" ".endif\n\t" ".endm")
#define NULL
Definition coverity.c:32
#define ff_assert0_fpu()
Definition emms.h:92
#define emms_c()
Definition emms.h:88
static struct @346255127015250356166251341105367306144006377143 state
#define AV_LOG_PANIC
Something went really wrong and we will crash now.
Definition log.h:197
Macro definitions for various function/variable attributes.
#define av_always_inline
Definition attributes.h:72
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition cpu.c:109
#define AV_CPU_FLAG_MMX
standard MMX
Definition cpu.h:32
#define av_log(a,...)