Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/libtheora/x86/x86int.h
9898 views
1
/********************************************************************
2
* *
3
* THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. *
4
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
7
* *
8
* THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 *
9
* by the Xiph.Org Foundation and contributors *
10
* https://www.xiph.org/ *
11
* *
12
********************************************************************
13
14
function:
15
16
********************************************************************/
17
18
#if !defined(_x86_x86int_H)
19
# define _x86_x86int_H (1)
20
# include "../internal.h"
21
22
# if defined(OC_X86_ASM)
23
# define oc_state_accel_init oc_state_accel_init_x86
24
# if defined(OC_X86_64_ASM)
25
/*x86-64 guarantees SIMD support up through at least SSE2.
26
If the best routine we have available only needs SSE2 (which at the moment
27
covers all of them), then we can avoid runtime detection and the indirect
28
call.*/
29
# define oc_frag_copy(_state,_dst,_src,_ystride) \
30
oc_frag_copy_mmx(_dst,_src,_ystride)
31
# define oc_frag_copy_list(_state,_dst_frame,_src_frame,_ystride, \
32
_fragis,_nfragis,_frag_buf_offs) \
33
oc_frag_copy_list_mmx(_dst_frame,_src_frame,_ystride, \
34
_fragis,_nfragis,_frag_buf_offs)
35
# define oc_frag_recon_intra(_state,_dst,_ystride,_residue) \
36
oc_frag_recon_intra_mmx(_dst,_ystride,_residue)
37
# define oc_frag_recon_inter(_state,_dst,_src,_ystride,_residue) \
38
oc_frag_recon_inter_mmx(_dst,_src,_ystride,_residue)
39
# define oc_frag_recon_inter2(_state,_dst,_src1,_src2,_ystride,_residue) \
40
oc_frag_recon_inter2_mmx(_dst,_src1,_src2,_ystride,_residue)
41
# define oc_idct8x8(_state,_y,_x,_last_zzi) \
42
oc_idct8x8_sse2(_y,_x,_last_zzi)
43
# define oc_state_frag_recon oc_state_frag_recon_mmx
44
# define oc_loop_filter_init(_state,_bv,_flimit) \
45
oc_loop_filter_init_mmxext(_bv,_flimit)
46
# define oc_state_loop_filter_frag_rows oc_state_loop_filter_frag_rows_mmxext
47
# define oc_restore_fpu(_state) \
48
oc_restore_fpu_mmx()
49
# else
50
# define OC_STATE_USE_VTABLE (1)
51
# endif
52
# endif
53
54
# include "../state.h"
55
# include "x86cpu.h"
56
57
/*Converts the expression in the argument to a string.*/
58
#define OC_M2STR(_s) #_s
59
60
/*Memory operands do not always include an offset.
61
To avoid warnings, we force an offset with %H (which adds 8).*/
62
# if __GNUC_PREREQ(4,0)
63
# define OC_MEM_OFFS(_offs,_name) \
64
OC_M2STR(_offs-8+%H[_name])
65
# endif
66
/*If your gcc version doesn't support %H, then you get to suffer the warnings.
67
Note that Apple's gas breaks on things like _offs+(%esp): it throws away the
68
whole offset, instead of substituting in 0 for the missing operand to +.*/
69
# if !defined(OC_MEM_OFFS)
70
# define OC_MEM_OFFS(_offs,_name) \
71
OC_M2STR(_offs+%[_name])
72
# endif
73
74
/*Declare an array operand with an exact size.
75
This tells gcc we're going to clobber this memory region, without having to
76
clobber all of "memory" and lets us access local buffers directly using the
77
stack pointer, without allocating a separate register to point to them.*/
78
#define OC_ARRAY_OPERAND(_type,_ptr,_size) \
79
(*({ \
80
struct{_type array_value__[(_size)];} *array_addr__=(void *)(_ptr); \
81
array_addr__; \
82
}))
83
84
/*Declare an array operand with an exact size.
85
This tells gcc we're going to clobber this memory region, without having to
86
clobber all of "memory" and lets us access local buffers directly using the
87
stack pointer, without allocating a separate register to point to them.*/
88
#define OC_CONST_ARRAY_OPERAND(_type,_ptr,_size) \
89
(*({ \
90
const struct{_type array_value__[(_size)];} *array_addr__= \
91
(const void *)(_ptr); \
92
array_addr__; \
93
}))
94
95
extern const unsigned short __attribute__((aligned(16))) OC_IDCT_CONSTS[64];
96
97
void oc_state_accel_init_x86(oc_theora_state *_state);
98
99
void oc_frag_copy_mmx(unsigned char *_dst,
100
const unsigned char *_src,int _ystride);
101
void oc_frag_copy_list_mmx(unsigned char *_dst_frame,
102
const unsigned char *_src_frame,int _ystride,
103
const ptrdiff_t *_fragis,ptrdiff_t _nfragis,const ptrdiff_t *_frag_buf_offs);
104
void oc_frag_recon_intra_mmx(unsigned char *_dst,int _ystride,
105
const ogg_int16_t *_residue);
106
void oc_frag_recon_inter_mmx(unsigned char *_dst,
107
const unsigned char *_src,int _ystride,const ogg_int16_t *_residue);
108
void oc_frag_recon_inter2_mmx(unsigned char *_dst,const unsigned char *_src1,
109
const unsigned char *_src2,int _ystride,const ogg_int16_t *_residue);
110
void oc_idct8x8_mmx(ogg_int16_t _y[64],ogg_int16_t _x[64],int _last_zzi);
111
void oc_idct8x8_sse2(ogg_int16_t _y[64],ogg_int16_t _x[64],int _last_zzi);
112
void oc_state_frag_recon_mmx(const oc_theora_state *_state,ptrdiff_t _fragi,
113
int _pli,ogg_int16_t _dct_coeffs[128],int _last_zzi,ogg_uint16_t _dc_quant);
114
void oc_loop_filter_init_mmx(signed char _bv[256],int _flimit);
115
void oc_loop_filter_init_mmxext(signed char _bv[256],int _flimit);
116
void oc_state_loop_filter_frag_rows_mmx(const oc_theora_state *_state,
117
signed char _bv[256],int _refi,int _pli,int _fragy0,int _fragy_end);
118
void oc_state_loop_filter_frag_rows_mmxext(const oc_theora_state *_state,
119
signed char _bv[256],int _refi,int _pli,int _fragy0,int _fragy_end);
120
void oc_restore_fpu_mmx(void);
121
122
#endif
123
124