Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
---|---|
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), |
19 | "+r" (m), |
20 | "+r" (val) /* inhibit r15 overloading */ |
21 | : |
22 | : "memory", "r0", "r1"); |
23 | |
24 | return retval; |
25 | } |
26 | |
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 | |
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), |
63 | "+r" (m), |
64 | "+r" (val) /* inhibit r15 overloading */ |
65 | : |
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 */ |
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 |
Warning: This file is not a C or C++ file. It does not have highlighting.