Subversion Repositories Kolibri OS

Rev

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