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#define AV_RL16 AV_RL16 30static av_always_inline uint16_t AV_RL16(const void *p) 31{ 32 uint16_t v; 33 __asm__ ("lhbrx %0, %y1" : "=r"(v) : "Z"(*(const uint16_t*)p)); 34 return v; 35} 36 37#define AV_WL16 AV_WL16 38static av_always_inline void AV_WL16(void *p, uint16_t v) 39{ 40 __asm__ ("sthbrx %1, %y0" : "=Z"(*(uint16_t*)p) : "r"(v)); 41} 42 43#define AV_RL32 AV_RL32 44static av_always_inline uint32_t AV_RL32(const void *p) 45{ 46 uint32_t v; 47 __asm__ ("lwbrx %0, %y1" : "=r"(v) : "Z"(*(const uint32_t*)p)); 48 return v; 49} 50 51#define AV_WL32 AV_WL32 52static av_always_inline void AV_WL32(void *p, uint32_t v) 53{ 54 __asm__ ("stwbrx %1, %y0" : "=Z"(*(uint32_t*)p) : "r"(v)); 55} 56 57#if HAVE_LDBRX 58 59#define AV_RL64 AV_RL64 60static av_always_inline uint64_t AV_RL64(const void *p) 61{ 62 uint64_t v; 63 __asm__ ("ldbrx %0, %y1" : "=r"(v) : "Z"(*(const uint64_t*)p)); 64 return v; 65} 66 67#define AV_WL64 AV_WL64 68static av_always_inline void AV_WL64(void *p, uint64_t v) 69{ 70 __asm__ ("stdbrx %1, %y0" : "=Z"(*(uint64_t*)p) : "r"(v)); 71} 72 73#else 74 75#define AV_RL64 AV_RL64 76static av_always_inline uint64_t AV_RL64(const void *p) 77{ 78 union { uint64_t v; uint32_t hl[2]; } v; 79 __asm__ ("lwbrx %0, %y2 \n\t" 80 "lwbrx %1, %y3 \n\t" 81 : "=&r"(v.hl[1]), "=r"(v.hl[0]) 82 : "Z"(*(const uint32_t*)p), "Z"(*((const uint32_t*)p+1))); 83 return v.v; 84} 85 86#define AV_WL64 AV_WL64 87static av_always_inline void AV_WL64(void *p, uint64_t v) 88{ 89 union { uint64_t v; uint32_t hl[2]; } vv = { v }; 90 __asm__ ("stwbrx %2, %y0 \n\t" 91 "stwbrx %3, %y1 \n\t" 92 : "=Z"(*(uint32_t*)p), "=Z"(*((uint32_t*)p+1)) 93 : "r"(vv.hl[1]), "r"(vv.hl[0])); 94} 95 96#endif /* HAVE_LDBRX */ 97 98#endif /* HAVE_XFORM_ASM */ 99 100/* 101 * GCC fails miserably on the packed struct version which is used by 102 * default, so we override it here. 103 */ 104 105#define AV_RB64(p) (*(const uint64_t *)(p)) 106#define AV_WB64(p, v) (*(uint64_t *)(p) = (v)) 107 108#endif /* AVUTIL_PPC_INTREADWRITE_H */ 109