linux/arch/x86/include/asm/byteorder.h
<<
>>
Prefs
   1#ifndef _ASM_X86_BYTEORDER_H
   2#define _ASM_X86_BYTEORDER_H
   3
   4#include <asm/types.h>
   5#include <linux/compiler.h>
   6
   7#ifdef __GNUC__
   8
   9#ifdef __i386__
  10
  11static inline __attribute_const__ __u32 ___arch__swab32(__u32 x)
  12{
  13#ifdef CONFIG_X86_BSWAP
  14        asm("bswap %0" : "=r" (x) : "0" (x));
  15#else
  16        asm("xchgb %b0,%h0\n\t" /* swap lower bytes     */
  17            "rorl $16,%0\n\t"   /* swap words           */
  18            "xchgb %b0,%h0"     /* swap higher bytes    */
  19            : "=q" (x)
  20            : "0" (x));
  21#endif
  22        return x;
  23}
  24
  25static inline __attribute_const__ __u64 ___arch__swab64(__u64 val)
  26{
  27        union {
  28                struct {
  29                        __u32 a;
  30                        __u32 b;
  31                } s;
  32                __u64 u;
  33        } v;
  34        v.u = val;
  35#ifdef CONFIG_X86_BSWAP
  36        asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
  37            : "=r" (v.s.a), "=r" (v.s.b)
  38            : "0" (v.s.a), "1" (v.s.b));
  39#else
  40        v.s.a = ___arch__swab32(v.s.a);
  41        v.s.b = ___arch__swab32(v.s.b);
  42        asm("xchgl %0,%1"
  43            : "=r" (v.s.a), "=r" (v.s.b)
  44            : "0" (v.s.a), "1" (v.s.b));
  45#endif
  46        return v.u;
  47}
  48
  49#else /* __i386__ */
  50
  51static inline __attribute_const__ __u64 ___arch__swab64(__u64 x)
  52{
  53        asm("bswapq %0"
  54            : "=r" (x)
  55            : "0" (x));
  56        return x;
  57}
  58
  59static inline __attribute_const__ __u32 ___arch__swab32(__u32 x)
  60{
  61        asm("bswapl %0"
  62            : "=r" (x)
  63            : "0" (x));
  64        return x;
  65}
  66
  67#endif
  68
  69/* Do not define swab16.  Gcc is smart enough to recognize "C" version and
  70   convert it into rotation or exhange.  */
  71
  72#define __arch__swab64(x) ___arch__swab64(x)
  73#define __arch__swab32(x) ___arch__swab32(x)
  74
  75#define __BYTEORDER_HAS_U64__
  76
  77#endif /* __GNUC__ */
  78
  79#include <linux/byteorder/little_endian.h>
  80
  81#endif /* _ASM_X86_BYTEORDER_H */
  82
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.