Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1300169
  • 博文数量: 548
  • 博客积分: 7597
  • 博客等级: 少将
  • 技术积分: 4224
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 13:21
个人简介

嵌入式软件工程师&&太极拳

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: 嵌入式

2012-02-25 14:44:08

  1. #ifndef _I386_BYTEORDER_H
  2. #define _I386_BYTEORDER_H

  3. #include <asm/types.h>
  4. //#include <linux/compiler.h>

  5. #ifdef __GNUC__

  6. /* For avoiding bswap on i386 */
  7. #ifdef __KERNEL__
  8. #include <linux/config.h>
  9. #endif

  10. static __inline__ __u32 ___arch__swab32(__u32 x)
  11. {
  12. #ifdef CONFIG_X86_BSWAP
  13.         __asm__("bswap %0" : "=r" (x) : "0" (x));
  14. #else
  15.         __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */
  16.                 "rorl $16,%0\n\t" /* swap words */
  17.                 "xchgb %b0,%h0" /* swap higher bytes */
  18.                 :"=q" (x)
  19.                 : "0" (x));
  20. #endif
  21.         return x;
  22. }

  23. static __inline__ __u64 ___arch__swab64(__u64 val)
  24. {
  25.         union {
  26.                 struct { __u32 a,b; } s;
  27.                 __u64 u;
  28.         } v;
  29.         v.u = val;
  30. #ifdef CONFIG_X86_BSWAP
  31.         asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
  32.             : "=r" (v.s.a), "=r" (v.s.b)
  33.             : "0" (v.s.a), "1" (v.s.b));
  34. #else
  35.    v.s.a = ___arch__swab32(v.s.a);
  36.         v.s.b = ___arch__swab32(v.s.b);
  37.         asm("xchgl %0,%1" : "=r" (v.s.a), "=r" (v.s.b) : "0" (v.s.a), "1" (v.s.b));
  38. #endif
  39.         return v.u;
  40. }

  41. /* Do not define swab16. Gcc is smart enough to recognize "C" version and
  42.    convert it into rotation or exhange. */

  43. #define __arch__swab64(x) ___arch__swab64(x)
  44. #define __arch__swab32(x) ___arch__swab32(x)

  45. #define __BYTEORDER_HAS_U64__

  46. #endif /* __GNUC__ */

  47. #include <linux/byteorder/little_endian.h>

  48. #endif /* _I386_BYTEORDER_H */
阅读(1580) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~