Statistics
| Branch: | Revision:

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