summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/shared/include/byteorder.h
blob: b2851b2ec461bc40e29a91ef711064c717398204 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                                                 
                                                        
                                         



        

                           
 



                  

               
                                                           






                                                                                      
                                                                     



                                                                                       
                                                           






                                                                                      
                                                                     



                                                                                       

                     



                  
                                
/*
 * byteorder.h
 *
 *        This file contains inline implementation of function to
 *          deal with endian conversion.
 *
 * It is a stripped down version of linux ppc file...
 *
 * Copyright (C) 1999  Eric Valette (valette@crf.canon.fr)
 *                     Canon Centre Recherche France.
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 *
 *  $Id$
 */

#ifndef _LIBCPU_BYTEORDER_H
#define _LIBCPU_BYTEORDER_H

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __GNUC__

extern __inline__ unsigned ld_le16(volatile uint16_t *addr)
{
	unsigned val;

	__asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr));
	return val;
}

extern __inline__ void st_le16(volatile uint16_t *addr, unsigned val)
{
	__asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr));
}

extern __inline__ unsigned ld_le32(volatile uint32_t *addr)
{
	unsigned val;

	__asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr));
	return val;
}

extern __inline__ void st_le32(volatile uint32_t *addr, unsigned val)
{
	__asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr));
}

#endif /* __GNUC__ */

#ifdef __cplusplus
}
#endif

#endif /* _LIBCPU_BYTEORDER_H */