Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
1efe4ce3 SM |
2 | #ifndef __ASM_SH_CMPXCHG_GRB_H |
3 | #define __ASM_SH_CMPXCHG_GRB_H | |
4 | ||
5 | static 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), | |
5bdbd4fa SK |
19 | "+r" (m), |
20 | "+r" (val) /* inhibit r15 overloading */ | |
21 | : | |
1efe4ce3 SM |
22 | : "memory", "r0", "r1"); |
23 | ||
24 | return retval; | |
25 | } | |
26 | ||
3226aad8 MT |
27 | static 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 | ||
1efe4ce3 SM |
49 | static 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), | |
5bdbd4fa SK |
63 | "+r" (m), |
64 | "+r" (val) /* inhibit r15 overloading */ | |
65 | : | |
1efe4ce3 SM |
66 | : "memory" , "r0", "r1"); |
67 | ||
68 | return retval; | |
69 | } | |
70 | ||
71 | static 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 */ | |
5bdbd4fa SK |
82 | " mov.l @%3, %0 \n\t" /* load old value */ |
83 | " cmp/eq %0, %1 \n\t" | |
1efe4ce3 | 84 | " bf 1f \n\t" /* if not equal */ |
5bdbd4fa | 85 | " mov.l %2, @%3 \n\t" /* store new value */ |
1efe4ce3 | 86 | "1: mov r1, r15 \n\t" /* LOGOUT */ |
5bdbd4fa SK |
87 | : "=&r" (retval), |
88 | "+r" (old), "+r" (new) /* old or new can be r15 */ | |
89 | : "r" (m) | |
1efe4ce3 SM |
90 | : "memory" , "r0", "r1", "t"); |
91 | ||
92 | return retval; | |
93 | } | |
94 | ||
95 | #endif /* __ASM_SH_CMPXCHG_GRB_H */ |