linux/arch/sh/include/asm/cmpxchg-grb.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __ASM_SH_CMPXCHG_GRB_H
   3#define __ASM_SH_CMPXCHG_GRB_H
   4
   5static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
   6{
   7        unsigned long retval;
   8
   9        __asm__ __volatile__ (
  10                "   .align 2              \n\t"
  11                "   mova    1f,   r0      \n\t" /* r0 = end point */
  12                "   nop                   \n\t"
  13                "   mov    r15,   r1      \n\t" /* r1 = saved sp */
  14                "   mov    #-4,   r15     \n\t" /* LOGIN */
  15                "   mov.l  @%1,   %0      \n\t" /* load  old value */
  16                "   mov.l   %2,   @%1     \n\t" /* store new value */
  17                "1: mov     r1,   r15     \n\t" /* LOGOUT */
  18                : "=&r" (retval),
  19                  "+r"  (m),
  20                  "+r"  (val)           /* inhibit r15 overloading */
  21                :
  22                : "memory", "r0", "r1");
  23
  24        return retval;
  25}
  26
  27static inline unsigned long xchg_u16(volatile u16 *m, unsigned long val)
  28{
  29        unsigned long retval;
  30
  31        __asm__ __volatile__ (
  32                "   .align  2             \n\t"
  33                "   mova    1f,   r0      \n\t" /* r0 = end point */
  34                "   mov    r15,   r1      \n\t" /* r1 = saved sp */
  35                "   mov    #-6,   r15     \n\t" /* LOGIN */
  36                "   mov.w  @%1,   %0      \n\t" /* load  old value */
  37                "   extu.w  %0,   %0      \n\t" /* extend as unsigned */
  38                "   mov.w   %2,   @%1     \n\t" /* store new value */
  39                "1: mov     r1,   r15     \n\t" /* LOGOUT */
  40                : "=&r" (retval),
  41                  "+r"  (m),
  42                  "+r"  (val)           /* inhibit r15 overloading */
  43                :
  44                : "memory" , "r0", "r1");
  45
  46        return retval;
  47}
  48
  49static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
  50{
  51        unsigned long retval;
  52
  53        __asm__ __volatile__ (
  54                "   .align  2             \n\t"
  55                "   mova    1f,   r0      \n\t" /* r0 = end point */
  56                "   mov    r15,   r1      \n\t" /* r1 = saved sp */
  57                "   mov    #-6,   r15     \n\t" /* LOGIN */
  58                "   mov.b  @%1,   %0      \n\t" /* load  old value */
  59                "   extu.b  %0,   %0      \n\t" /* extend as unsigned */
  60                "   mov.b   %2,   @%1     \n\t" /* store new value */
  61                "1: mov     r1,   r15     \n\t" /* LOGOUT */
  62                : "=&r" (retval),
  63                  "+r"  (m),
  64                  "+r"  (val)           /* inhibit r15 overloading */
  65                :
  66                : "memory" , "r0", "r1");
  67
  68        return retval;
  69}
  70
  71static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
  72                                          unsigned long new)
  73{
  74        unsigned long retval;
  75
  76        __asm__ __volatile__ (
  77                "   .align  2             \n\t"
  78                "   mova    1f,   r0      \n\t" /* r0 = end point */
  79                "   nop                   \n\t"
  80                "   mov    r15,   r1      \n\t" /* r1 = saved sp */
  81                "   mov    #-8,   r15     \n\t" /* LOGIN */
  82                "   mov.l  @%3,   %0      \n\t" /* load  old value */
  83                "   cmp/eq  %0,   %1      \n\t"
  84                "   bf            1f      \n\t" /* if not equal */
  85                "   mov.l   %2,   @%3     \n\t" /* store new value */
  86                "1: mov     r1,   r15     \n\t" /* LOGOUT */
  87                : "=&r" (retval),
  88                  "+r"  (old), "+r"  (new) /* old or new can be r15 */
  89                :  "r"  (m)
  90                : "memory" , "r0", "r1", "t");
  91
  92        return retval;
  93}
  94
  95#endif /* __ASM_SH_CMPXCHG_GRB_H */
  96