737
|
1 /*
|
|
2 * Copyright (c) 2009 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_MIPS_INTREADWRITE_H
|
|
22 #define AVUTIL_MIPS_INTREADWRITE_H
|
|
23
|
|
24 #include <stdint.h>
|
|
25 #include "config.h"
|
|
26
|
|
27 #define AV_RN32 AV_RN32
|
812
|
28 static av_always_inline uint32_t AV_RN32(const void *p)
|
737
|
29 {
|
|
30 uint32_t v;
|
|
31 __asm__ ("lwl %0, %1 \n\t"
|
|
32 "lwr %0, %2 \n\t"
|
|
33 : "=&r"(v)
|
|
34 : "m"(*(const uint32_t *)((const uint8_t *)p+3*!HAVE_BIGENDIAN)),
|
|
35 "m"(*(const uint32_t *)((const uint8_t *)p+3*HAVE_BIGENDIAN)));
|
|
36 return v;
|
|
37 }
|
|
38
|
|
39 #define AV_WN32 AV_WN32
|
812
|
40 static av_always_inline void AV_WN32(void *p, uint32_t v)
|
737
|
41 {
|
|
42 __asm__ ("swl %2, %0 \n\t"
|
|
43 "swr %2, %1 \n\t"
|
|
44 : "=m"(*(uint32_t *)((uint8_t *)p+3*!HAVE_BIGENDIAN)),
|
|
45 "=m"(*(uint32_t *)((uint8_t *)p+3*HAVE_BIGENDIAN))
|
|
46 : "r"(v));
|
|
47 }
|
|
48
|
|
49 #if ARCH_MIPS64
|
|
50
|
|
51 #define AV_RN64 AV_RN64
|
812
|
52 static av_always_inline uint64_t AV_RN64(const void *p)
|
737
|
53 {
|
|
54 uint64_t v;
|
769
|
55 __asm__ ("ldl %0, %1 \n\t"
|
|
56 "ldr %0, %2 \n\t"
|
737
|
57 : "=&r"(v)
|
769
|
58 : "m"(*(const uint64_t *)((const uint8_t *)p+7*!HAVE_BIGENDIAN)),
|
|
59 "m"(*(const uint64_t *)((const uint8_t *)p+7*HAVE_BIGENDIAN)));
|
737
|
60 return v;
|
|
61 }
|
|
62
|
|
63 #define AV_WN64 AV_WN64
|
812
|
64 static av_always_inline void AV_WN64(void *p, uint64_t v)
|
737
|
65 {
|
769
|
66 __asm__ ("sdl %2, %0 \n\t"
|
|
67 "sdr %2, %1 \n\t"
|
737
|
68 : "=m"(*(uint64_t *)((uint8_t *)p+7*!HAVE_BIGENDIAN)),
|
|
69 "=m"(*(uint64_t *)((uint8_t *)p+7*HAVE_BIGENDIAN))
|
|
70 : "r"(v));
|
|
71 }
|
|
72
|
|
73 #else
|
|
74
|
|
75 #define AV_RN64 AV_RN64
|
812
|
76 static av_always_inline uint64_t AV_RN64(const void *p)
|
737
|
77 {
|
|
78 union { uint64_t v; uint32_t hl[2]; } v;
|
|
79 v.hl[0] = AV_RN32(p);
|
|
80 v.hl[1] = AV_RN32((const uint8_t *)p + 4);
|
|
81 return v.v;
|
|
82 }
|
|
83
|
|
84 #define AV_WN64 AV_WN64
|
812
|
85 static av_always_inline void AV_WN64(void *p, uint64_t v)
|
737
|
86 {
|
|
87 union { uint64_t v; uint32_t hl[2]; } vv = { v };
|
|
88 AV_WN32(p, vv.hl[0]);
|
|
89 AV_WN32((uint8_t *)p + 4, vv.hl[1]);
|
|
90 }
|
|
91
|
|
92 #endif /* ARCH_MIPS64 */
|
|
93
|
|
94 #endif /* AVUTIL_MIPS_INTREADWRITE_H */
|