cmpxchg.h (f83d9396d1f63048c423efa00e4e244da10a35fd) cmpxchg.h (45e15c1a375ea380d55880be2f8182cb737b60ed)
1/* SPDX-License-Identifier: GPL-2.0 */
2
3#ifndef __ASM_CSKY_CMPXCHG_H
4#define __ASM_CSKY_CMPXCHG_H
5
6#ifdef CONFIG_SMP
7#include <asm/barrier.h>
8
9extern void __bad_xchg(void);
10
11#define __xchg_relaxed(new, ptr, size) \
12({ \
13 __typeof__(ptr) __ptr = (ptr); \
14 __typeof__(new) __new = (new); \
15 __typeof__(*(ptr)) __ret; \
16 unsigned long tmp; \
17 switch (size) { \
1/* SPDX-License-Identifier: GPL-2.0 */
2
3#ifndef __ASM_CSKY_CMPXCHG_H
4#define __ASM_CSKY_CMPXCHG_H
5
6#ifdef CONFIG_SMP
7#include <asm/barrier.h>
8
9extern void __bad_xchg(void);
10
11#define __xchg_relaxed(new, ptr, size) \
12({ \
13 __typeof__(ptr) __ptr = (ptr); \
14 __typeof__(new) __new = (new); \
15 __typeof__(*(ptr)) __ret; \
16 unsigned long tmp; \
17 switch (size) { \
18 case 2: { \
19 u32 ret; \
20 u32 shif = ((ulong)__ptr & 2) ? 16 : 0; \
21 u32 mask = 0xffff << shif; \
22 __ptr = (__typeof__(ptr))((ulong)__ptr & ~2); \
23 __asm__ __volatile__ ( \
24 "1: ldex.w %0, (%4)\n" \
25 " and %1, %0, %2\n" \
26 " or %1, %1, %3\n" \
27 " stex.w %1, (%4)\n" \
28 " bez %1, 1b\n" \
29 : "=&r" (ret), "=&r" (tmp) \
30 : "r" (~mask), \
31 "r" ((u32)__new << shif), \
32 "r" (__ptr) \
33 : "memory"); \
34 __ret = (__typeof__(*(ptr))) \
35 ((ret & mask) >> shif); \
36 break; \
37 } \
18 case 4: \
19 asm volatile ( \
20 "1: ldex.w %0, (%3) \n" \
21 " mov %1, %2 \n" \
22 " stex.w %1, (%3) \n" \
23 " bez %1, 1b \n" \
24 : "=&r" (__ret), "=&r" (tmp) \
25 : "r" (__new), "r"(__ptr) \

--- 111 unchanged lines hidden ---
38 case 4: \
39 asm volatile ( \
40 "1: ldex.w %0, (%3) \n" \
41 " mov %1, %2 \n" \
42 " stex.w %1, (%3) \n" \
43 " bez %1, 1b \n" \
44 : "=&r" (__ret), "=&r" (tmp) \
45 : "r" (__new), "r"(__ptr) \

--- 111 unchanged lines hidden ---