Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

byteswap.h 905B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #ifndef ETHERBOOT_BITS_BYTESWAP_H
  2. #define ETHERBOOT_BITS_BYTESWAP_H
  3. FILE_LICENCE ( GPL2_OR_LATER );
  4. static inline __attribute__ ((always_inline, const)) uint16_t
  5. __bswap_variable_16(uint16_t x)
  6. {
  7. __asm__("xchgb %b0,%h0\n\t"
  8. : "=q" (x)
  9. : "0" (x));
  10. return x;
  11. }
  12. static inline __attribute__ ((always_inline, const)) uint32_t
  13. __bswap_variable_32(uint32_t x)
  14. {
  15. __asm__("xchgb %b0,%h0\n\t"
  16. "rorl $16,%0\n\t"
  17. "xchgb %b0,%h0"
  18. : "=q" (x)
  19. : "0" (x));
  20. return x;
  21. }
  22. static inline __attribute__ ((always_inline, const)) uint64_t
  23. __bswap_variable_64(uint64_t x)
  24. {
  25. union {
  26. uint64_t qword;
  27. uint32_t dword[2];
  28. } u;
  29. u.qword = x;
  30. u.dword[0] = __bswap_variable_32(u.dword[0]);
  31. u.dword[1] = __bswap_variable_32(u.dword[1]);
  32. __asm__("xchgl %0,%1"
  33. : "=r" ( u.dword[0] ), "=r" ( u.dword[1] )
  34. : "0" ( u.dword[0] ), "1" ( u.dword[1] ) );
  35. return u.qword;
  36. }
  37. #endif /* ETHERBOOT_BITS_BYTESWAP_H */