root / target-arm / op_mem.h @ 4373f3ce
History | View | Annotate | Download (2.2 kB)
1 | b5ff1b31 | bellard | /* ARM memory operations. */
|
---|---|---|---|
2 | b5ff1b31 | bellard | |
3 | b5ff1b31 | bellard | /* Swap T0 with memory at address T1. */
|
4 | b5ff1b31 | bellard | /* ??? Is this exception safe? */
|
5 | b5ff1b31 | bellard | #define MEM_SWP_OP(name, lname) \
|
6 | b5ff1b31 | bellard | void OPPROTO glue(op_swp##name,MEMSUFFIX)(void) \ |
7 | b5ff1b31 | bellard | { \ |
8 | b5ff1b31 | bellard | uint32_t tmp; \ |
9 | b5ff1b31 | bellard | cpu_lock(); \ |
10 | b5ff1b31 | bellard | tmp = glue(ld##lname,MEMSUFFIX)(T1); \ |
11 | b5ff1b31 | bellard | glue(st##name,MEMSUFFIX)(T1, T0); \ |
12 | b5ff1b31 | bellard | T0 = tmp; \ |
13 | b5ff1b31 | bellard | cpu_unlock(); \ |
14 | b5ff1b31 | bellard | FORCE_RET(); \ |
15 | b5ff1b31 | bellard | } |
16 | b5ff1b31 | bellard | |
17 | b5ff1b31 | bellard | MEM_SWP_OP(b, ub) |
18 | b5ff1b31 | bellard | MEM_SWP_OP(l, l) |
19 | b5ff1b31 | bellard | |
20 | b5ff1b31 | bellard | #undef MEM_SWP_OP
|
21 | b5ff1b31 | bellard | |
22 | 9ee6e8bb | pbrook | /* Load-locked, store exclusive. */
|
23 | 9ee6e8bb | pbrook | #define EXCLUSIVE_OP(suffix, ldsuffix) \
|
24 | 9ee6e8bb | pbrook | void OPPROTO glue(op_ld##suffix##ex,MEMSUFFIX)(void) \ |
25 | 9ee6e8bb | pbrook | { \ |
26 | 9ee6e8bb | pbrook | cpu_lock(); \ |
27 | 9ee6e8bb | pbrook | helper_mark_exclusive(env, T1); \ |
28 | 9ee6e8bb | pbrook | T0 = glue(ld##ldsuffix,MEMSUFFIX)(T1); \ |
29 | 9ee6e8bb | pbrook | cpu_unlock(); \ |
30 | 9ee6e8bb | pbrook | FORCE_RET(); \ |
31 | 9ee6e8bb | pbrook | } \ |
32 | 9ee6e8bb | pbrook | \ |
33 | 9ee6e8bb | pbrook | void OPPROTO glue(op_st##suffix##ex,MEMSUFFIX)(void) \ |
34 | 9ee6e8bb | pbrook | { \ |
35 | 9ee6e8bb | pbrook | int failed; \
|
36 | 9ee6e8bb | pbrook | cpu_lock(); \ |
37 | 9ee6e8bb | pbrook | failed = helper_test_exclusive(env, T1); \ |
38 | 9ee6e8bb | pbrook | /* ??? Is it safe to hold the cpu lock over a store? */ \
|
39 | 9ee6e8bb | pbrook | if (!failed) { \
|
40 | 9ee6e8bb | pbrook | glue(st##suffix,MEMSUFFIX)(T1, T0); \ |
41 | 9ee6e8bb | pbrook | } \ |
42 | 9ee6e8bb | pbrook | T0 = failed; \ |
43 | 9ee6e8bb | pbrook | cpu_unlock(); \ |
44 | 9ee6e8bb | pbrook | FORCE_RET(); \ |
45 | 9ee6e8bb | pbrook | } |
46 | 9ee6e8bb | pbrook | |
47 | 9ee6e8bb | pbrook | EXCLUSIVE_OP(b, ub) |
48 | 9ee6e8bb | pbrook | EXCLUSIVE_OP(w, uw) |
49 | 9ee6e8bb | pbrook | EXCLUSIVE_OP(l, l) |
50 | 9ee6e8bb | pbrook | |
51 | 9ee6e8bb | pbrook | #undef EXCLUSIVE_OP
|
52 | 9ee6e8bb | pbrook | |
53 | 9ee6e8bb | pbrook | /* Load exclusive T0:T1 from address T1. */
|
54 | 9ee6e8bb | pbrook | void OPPROTO glue(op_ldqex,MEMSUFFIX)(void) |
55 | 9ee6e8bb | pbrook | { |
56 | 9ee6e8bb | pbrook | cpu_lock(); |
57 | 9ee6e8bb | pbrook | helper_mark_exclusive(env, T1); |
58 | 9ee6e8bb | pbrook | T0 = glue(ldl,MEMSUFFIX)(T1); |
59 | 9ee6e8bb | pbrook | T1 = glue(ldl,MEMSUFFIX)((T1 + 4));
|
60 | 9ee6e8bb | pbrook | cpu_unlock(); |
61 | 9ee6e8bb | pbrook | FORCE_RET(); |
62 | 9ee6e8bb | pbrook | } |
63 | 9ee6e8bb | pbrook | |
64 | 9ee6e8bb | pbrook | /* Store exclusive T0:T2 to address T1. */
|
65 | 9ee6e8bb | pbrook | void OPPROTO glue(op_stqex,MEMSUFFIX)(void) |
66 | 9ee6e8bb | pbrook | { |
67 | 9ee6e8bb | pbrook | int failed;
|
68 | 9ee6e8bb | pbrook | cpu_lock(); |
69 | 9ee6e8bb | pbrook | failed = helper_test_exclusive(env, T1); |
70 | 9ee6e8bb | pbrook | /* ??? Is it safe to hold the cpu lock over a store? */
|
71 | 9ee6e8bb | pbrook | if (!failed) {
|
72 | 9ee6e8bb | pbrook | glue(stl,MEMSUFFIX)(T1, T0); |
73 | 9ee6e8bb | pbrook | glue(stl,MEMSUFFIX)((T1 + 4), T2);
|
74 | 9ee6e8bb | pbrook | } |
75 | 9ee6e8bb | pbrook | T0 = failed; |
76 | 9ee6e8bb | pbrook | cpu_unlock(); |
77 | 9ee6e8bb | pbrook | FORCE_RET(); |
78 | 9ee6e8bb | pbrook | } |
79 | 9ee6e8bb | pbrook | |
80 | 18c9b560 | balrog | /* iwMMXt load/store. Address is in T1 */
|
81 | 18c9b560 | balrog | #define MMX_MEM_OP(name, ldname) \
|
82 | 18c9b560 | balrog | void OPPROTO glue(op_iwmmxt_ld##name,MEMSUFFIX)(void) \ |
83 | 18c9b560 | balrog | { \ |
84 | 18c9b560 | balrog | M0 = glue(ld##ldname,MEMSUFFIX)(T1); \ |
85 | 18c9b560 | balrog | FORCE_RET(); \ |
86 | 18c9b560 | balrog | } \ |
87 | 18c9b560 | balrog | void OPPROTO glue(op_iwmmxt_st##name,MEMSUFFIX)(void) \ |
88 | 18c9b560 | balrog | { \ |
89 | 18c9b560 | balrog | glue(st##name,MEMSUFFIX)(T1, M0); \ |
90 | 18c9b560 | balrog | FORCE_RET(); \ |
91 | 18c9b560 | balrog | } |
92 | 18c9b560 | balrog | |
93 | 18c9b560 | balrog | MMX_MEM_OP(b, ub) |
94 | 18c9b560 | balrog | MMX_MEM_OP(w, uw) |
95 | 18c9b560 | balrog | MMX_MEM_OP(l, l) |
96 | 18c9b560 | balrog | MMX_MEM_OP(q, q) |
97 | 18c9b560 | balrog | |
98 | 18c9b560 | balrog | #undef MMX_MEM_OP
|
99 | 18c9b560 | balrog | |
100 | b5ff1b31 | bellard | #undef MEMSUFFIX |