home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / sh / include / asm / bitops-llsc.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.8 KB  |  145 lines

  1. #ifndef __ASM_SH_BITOPS_LLSC_H
  2. #define __ASM_SH_BITOPS_LLSC_H
  3.  
  4. static inline void set_bit(int nr, volatile void * addr)
  5. {
  6.     int    mask;
  7.     volatile unsigned int *a = addr;
  8.     unsigned long tmp;
  9.  
  10.     a += nr >> 5;
  11.     mask = 1 << (nr & 0x1f);
  12.  
  13.     __asm__ __volatile__ (
  14.         "1:                        \n\t"
  15.         "movli.l    @%1, %0    ! set_bit        \n\t"
  16.         "or        %3, %0                \n\t"
  17.         "movco.l    %0, @%1                \n\t"
  18.         "bf        1b                \n\t"
  19.         : "=&z" (tmp), "=r" (a)
  20.         : "1" (a), "r" (mask)
  21.         : "t", "memory"
  22.     );
  23. }
  24.  
  25. static inline void clear_bit(int nr, volatile void * addr)
  26. {
  27.     int    mask;
  28.     volatile unsigned int *a = addr;
  29.     unsigned long tmp;
  30.  
  31.     a += nr >> 5;
  32.     mask = 1 << (nr & 0x1f);
  33.  
  34.     __asm__ __volatile__ (
  35.         "1:                        \n\t"
  36.         "movli.l    @%1, %0    ! clear_bit        \n\t"
  37.         "and        %3, %0                \n\t"
  38.         "movco.l    %0, @%1                \n\t"
  39.         "bf        1b                \n\t"
  40.         : "=&z" (tmp), "=r" (a)
  41.         : "1" (a), "r" (~mask)
  42.         : "t", "memory"
  43.     );
  44. }
  45.  
  46. static inline void change_bit(int nr, volatile void * addr)
  47. {
  48.     int    mask;
  49.     volatile unsigned int *a = addr;
  50.     unsigned long tmp;
  51.  
  52.     a += nr >> 5;
  53.     mask = 1 << (nr & 0x1f);
  54.  
  55.     __asm__ __volatile__ (
  56.         "1:                        \n\t"
  57.         "movli.l    @%1, %0    ! change_bit        \n\t"
  58.         "xor        %3, %0                \n\t"
  59.         "movco.l    %0, @%1                \n\t"
  60.         "bf        1b                \n\t"
  61.         : "=&z" (tmp), "=r" (a)
  62.         : "1" (a), "r" (mask)
  63.         : "t", "memory"
  64.     );
  65. }
  66.  
  67. static inline int test_and_set_bit(int nr, volatile void * addr)
  68. {
  69.     int    mask, retval;
  70.     volatile unsigned int *a = addr;
  71.     unsigned long tmp;
  72.  
  73.     a += nr >> 5;
  74.     mask = 1 << (nr & 0x1f);
  75.  
  76.     __asm__ __volatile__ (
  77.         "1:                        \n\t"
  78.         "movli.l    @%1, %0    ! test_and_set_bit    \n\t"
  79.         "mov        %0, %2                \n\t"
  80.         "or        %4, %0                \n\t"
  81.         "movco.l    %0, @%1                \n\t"
  82.         "bf        1b                \n\t"
  83.         "and        %4, %2                \n\t"
  84.         : "=&z" (tmp), "=r" (a), "=&r" (retval)
  85.         : "1" (a), "r" (mask)
  86.         : "t", "memory"
  87.     );
  88.  
  89.     return retval != 0;
  90. }
  91.  
  92. static inline int test_and_clear_bit(int nr, volatile void * addr)
  93. {
  94.     int    mask, retval;
  95.     volatile unsigned int *a = addr;
  96.     unsigned long tmp;
  97.  
  98.     a += nr >> 5;
  99.     mask = 1 << (nr & 0x1f);
  100.  
  101.     __asm__ __volatile__ (
  102.         "1:                        \n\t"
  103.         "movli.l    @%1, %0    ! test_and_clear_bit    \n\t"
  104.         "mov        %0, %2                \n\t"
  105.         "and        %5, %0                \n\t"
  106.         "movco.l    %0, @%1                \n\t"
  107.         "bf        1b                \n\t"
  108.         "and        %4, %2                \n\t"
  109.         "synco                        \n\t"
  110.         : "=&z" (tmp), "=r" (a), "=&r" (retval)
  111.         : "1" (a), "r" (mask), "r" (~mask)
  112.         : "t", "memory"
  113.     );
  114.  
  115.     return retval != 0;
  116. }
  117.  
  118. static inline int test_and_change_bit(int nr, volatile void * addr)
  119. {
  120.     int    mask, retval;
  121.     volatile unsigned int *a = addr;
  122.     unsigned long tmp;
  123.  
  124.     a += nr >> 5;
  125.     mask = 1 << (nr & 0x1f);
  126.  
  127.     __asm__ __volatile__ (
  128.         "1:                        \n\t"
  129.         "movli.l    @%1, %0    ! test_and_change_bit    \n\t"
  130.         "mov        %0, %2                \n\t"
  131.         "xor        %4, %0                \n\t"
  132.         "movco.l    %0, @%1                \n\t"
  133.         "bf        1b                \n\t"
  134.         "and        %4, %2                \n\t"
  135.         "synco                        \n\t"
  136.         : "=&z" (tmp), "=r" (a), "=&r" (retval)
  137.         : "1" (a), "r" (mask)
  138.         : "t", "memory"
  139.     );
  140.  
  141.     return retval != 0;
  142. }
  143.  
  144. #endif /* __ASM_SH_BITOPS_LLSC_H */
  145.