FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavutil
ppc
intreadwrite.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#ifndef AVUTIL_PPC_INTREADWRITE_H
22
#define AVUTIL_PPC_INTREADWRITE_H
23
24
#include <stdint.h>
25
#include "config.h"
26
27
#if HAVE_XFORM_ASM
28
29
#if HAVE_BIGENDIAN
30
#define AV_RL16 AV_RX16
31
#define AV_WL16 AV_WX16
32
#define AV_RL32 AV_RX32
33
#define AV_WL32 AV_WX32
34
#else
35
#define AV_RB16 AV_RX16
36
#define AV_WB16 AV_WX16
37
#define AV_RB32 AV_RX32
38
#define AV_WB32 AV_WX32
39
#endif
40
41
static
av_always_inline
uint16_t AV_RX16(
const
void
*p)
42
{
43
uint16_t
v
;
44
__asm__ (
"lhbrx %0, %y1"
:
"=r"
(v) :
"Z"
(*(
const
uint16_t*)p));
45
return
v
;
46
}
47
48
static
av_always_inline
void
AV_WX16(
void
*p, uint16_t v)
49
{
50
__asm__ (
"sthbrx %1, %y0"
:
"=Z"
(*(uint16_t*)p) :
"r"
(v));
51
}
52
53
static
av_always_inline
uint32_t AV_RX32(
const
void
*p)
54
{
55
uint32_t
v
;
56
__asm__ (
"lwbrx %0, %y1"
:
"=r"
(v) :
"Z"
(*(
const
uint32_t*)p));
57
return
v
;
58
}
59
60
static
av_always_inline
void
AV_WX32(
void
*p, uint32_t v)
61
{
62
__asm__ (
"stwbrx %1, %y0"
:
"=Z"
(*(uint32_t*)p) :
"r"
(v));
63
}
64
65
#if HAVE_LDBRX
66
67
#if HAVE_BIGENDIAN
68
#define AV_RL64 AV_RX64
69
#define AV_WL64 AV_WX64
70
#else
71
#define AV_RB64 AV_RX64
72
#define AV_WB64 AV_WX64
73
#endif
74
75
static
av_always_inline
uint64_t AV_RX64(
const
void
*p)
76
{
77
uint64_t
v
;
78
__asm__ (
"ldbrx %0, %y1"
:
"=r"
(v) :
"Z"
(*(
const
uint64_t*)p));
79
return
v
;
80
}
81
82
static
av_always_inline
void
AV_WX64(
void
*p, uint64_t v)
83
{
84
__asm__ (
"stdbrx %1, %y0"
:
"=Z"
(*(uint64_t*)p) :
"r"
(v));
85
}
86
87
#else
88
89
#define AV_RL64 AV_RL64
90
static
av_always_inline
uint64_t
AV_RL64
(
const
void
*p)
91
{
92
union
{ uint64_t
v
; uint32_t hl[2]; }
v
;
93
__asm__ (
"lwbrx %0, %y2 \n\t"
94
"lwbrx %1, %y3 \n\t"
95
:
"=&r"
(v.hl[1]),
"=r"
(v.hl[0])
96
:
"Z"
(*(
const
uint32_t*)p),
"Z"
(*((
const
uint32_t*)p+1)));
97
return
v.v;
98
}
99
100
#define AV_WL64 AV_WL64
101
static
av_always_inline
void
AV_WL64
(
void
*p, uint64_t v)
102
{
103
union
{ uint64_t
v
; uint32_t hl[2]; } vv = { v };
104
__asm__ (
"stwbrx %2, %y0 \n\t"
105
"stwbrx %3, %y1 \n\t"
106
:
"=Z"
(*(uint32_t*)p),
"=Z"
(*((uint32_t*)p+1))
107
:
"r"
(vv.hl[1]),
"r"
(vv.hl[0]));
108
}
109
110
#endif
/* HAVE_LDBRX */
111
112
#endif
/* HAVE_XFORM_ASM */
113
114
/*
115
* GCC fails miserably on the packed struct version which is used by
116
* default, so we override it here.
117
*/
118
119
#if HAVE_BIGENDIAN
120
#define AV_RB64(p) (*(const uint64_t *)(p))
121
#define AV_WB64(p, v) (*(uint64_t *)(p) = (v))
122
#endif
123
124
#endif
/* AVUTIL_PPC_INTREADWRITE_H */
Generated on Sun Jul 20 2014 23:06:07 for FFmpeg by
1.8.2