Blame include/cdio/bytesex_asm.h

Packit dd8086
/*
Packit dd8086
    Copyright (C) 2008, 2012 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
                  2001, 2004, 2005 Herbert Valerio Riedel <hvr@gnu.org>
Packit dd8086
                  2001 Sven Ottemann <ac-logic@freenet.de>
Packit dd8086
Packit dd8086
    This program is free software: you can redistribute it and/or modify
Packit dd8086
    it under the terms of the GNU General Public License as published by
Packit dd8086
    the Free Software Foundation, either version 3 of the License, or
Packit dd8086
    (at your option) any later version.
Packit dd8086
Packit dd8086
    This program is distributed in the hope that it will be useful,
Packit dd8086
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
    GNU General Public License for more details.
Packit dd8086
Packit dd8086
    You should have received a copy of the GNU General Public License
Packit dd8086
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086

Packit dd8086
/** \file bytesex_asm.h 
Packit dd8086
 *  \brief  Assembly code to handle byte-swapping.
Packit dd8086
Packit dd8086
    Note: this header will is slated to get removed and libcdio will use 
Packit dd8086
    glib.h routines instead. 
Packit dd8086
*/
Packit dd8086
Packit dd8086
#ifndef CDIO_BYTESEX_ASM_H_
Packit dd8086
#define CDIO_BYTESEX_ASM_H_
Packit dd8086
#if !defined(DISABLE_ASM_OPTIMIZE)
Packit dd8086
Packit dd8086
#include <cdio/types.h>
Packit dd8086
Packit dd8086
#if !defined CDIO_INLINE
Packit dd8086
#if defined(__cplusplus) || defined(inline)
Packit dd8086
#define CDIO_INLINE inline
Packit dd8086
#elif defined(__GNUC__)
Packit dd8086
#define CDIO_INLINE __inline__
Packit dd8086
#elif defined(_MSC_VER)
Packit dd8086
#define CDIO_INLINE __inline
Packit dd8086
#else
Packit dd8086
#define CDIO_INLINE
Packit dd8086
#endif
Packit dd8086
#endif /* CDIO_INLINE */
Packit dd8086
Packit dd8086
#if defined(__powerpc__) && defined(__GNUC__)
Packit dd8086
Packit dd8086
static CDIO_INLINE
Packit dd8086
uint32_t uint32_swap_le_be_asm(const uint32_t a)
Packit dd8086
{
Packit dd8086
  uint32_t b;
Packit dd8086
Packit dd8086
  __asm__ ("lwbrx %0,0,%1"
Packit dd8086
           :"=r"(b)
Packit dd8086
           :"r"(&a), "m"(a));
Packit dd8086
Packit dd8086
  return b;
Packit dd8086
}
Packit dd8086
Packit dd8086
static CDIO_INLINE
Packit dd8086
uint16_t uint16_swap_le_be_asm(const uint16_t a)
Packit dd8086
{
Packit dd8086
  uint32_t b;
Packit dd8086
Packit dd8086
  __asm__ ("lhbrx %0,0,%1"
Packit dd8086
           :"=r"(b)
Packit dd8086
           :"r"(&a), "m"(a));
Packit dd8086
Packit dd8086
  return b;
Packit dd8086
}
Packit dd8086
Packit dd8086
#define UINT16_SWAP_LE_BE uint16_swap_le_be_asm
Packit dd8086
#define UINT32_SWAP_LE_BE uint32_swap_le_be_asm
Packit dd8086
Packit dd8086
#elif defined(__mc68000__) &&  defined(__STORMGCC__)
Packit dd8086
Packit dd8086
static CDIO_INLINE
Packit dd8086
uint32_t uint32_swap_le_be_asm(uint32_t a __asm__("d0"))
Packit dd8086
{
Packit dd8086
  /* __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val)); */
Packit dd8086
Packit dd8086
  __asm__("move.l %1,d0;rol.w #8,d0;swap d0;rol.w #8,d0;move.l d0,%0"
Packit dd8086
          :"=r"(a)
Packit dd8086
          :"r"(a));
Packit dd8086
Packit dd8086
  return(a);
Packit dd8086
}
Packit dd8086
Packit dd8086
static CDIO_INLINE
Packit dd8086
uint16_t uint16_swap_le_be_asm(uint16_t a __asm__("d0"))
Packit dd8086
{
Packit dd8086
  __asm__("move.l %1,d0;rol.w #8,d0;move.l d0,%0"
Packit dd8086
          :"=r"(a)
Packit dd8086
          :"r"(a));
Packit dd8086
  
Packit dd8086
  return(a);
Packit dd8086
}
Packit dd8086
Packit dd8086
#define UINT16_SWAP_LE_BE uint16_swap_le_be_asm
Packit dd8086
#define UINT32_SWAP_LE_BE uint32_swap_le_be_asm
Packit dd8086
Packit dd8086
#elif 0 && defined(__i386__) && defined(__GNUC__)
Packit dd8086
Packit dd8086
static CDIO_INLINE
Packit dd8086
uint32_t uint32_swap_le_be_asm(uint32_t a)
Packit dd8086
{
Packit dd8086
  __asm__("xchgb %b0,%h0\n\t"     /* swap lower bytes     */
Packit dd8086
          "rorl $16,%0\n\t"       /* swap words           */
Packit dd8086
          "xchgb %b0,%h0"         /* swap higher bytes    */
Packit dd8086
          :"=q" (a)
Packit dd8086
          : "0" (a));
Packit dd8086
Packit dd8086
  return(a);
Packit dd8086
}
Packit dd8086
Packit dd8086
static CDIO_INLINE
Packit dd8086
uint16_t uint16_swap_le_be_asm(uint16_t a)
Packit dd8086
{
Packit dd8086
  __asm__("xchgb %b0,%h0"         /* swap bytes           */ 
Packit dd8086
          : "=q" (a) 
Packit dd8086
          :  "0" (a));
Packit dd8086
  
Packit dd8086
  return(a);
Packit dd8086
}
Packit dd8086
Packit dd8086
#define UINT16_SWAP_LE_BE uint16_swap_le_be_asm
Packit dd8086
#define UINT32_SWAP_LE_BE uint32_swap_le_be_asm
Packit dd8086
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#endif /* !defined(DISABLE_ASM_OPTIMIZE) */
Packit dd8086
#endif /* CDIO_BYTESEX_ASM_H_ */
Packit dd8086
Packit dd8086

Packit dd8086
/* 
Packit dd8086
 * Local variables:
Packit dd8086
 *  c-file-style: "gnu"
Packit dd8086
 *  tab-width: 8
Packit dd8086
 *  indent-tabs-mode: nil
Packit dd8086
 * End:
Packit dd8086
 */