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