Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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
  30. static 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
  38. static 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
  44. static 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
  52. static 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
  60. static 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
  68. static 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
  76. static 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
  87. static 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.