|
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 |
*/
|