Statistics
| Branch: | Revision:

root / target-arm / op_mem.h @ b0109805

History | View | Annotate | Download (2.5 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 b5ff1b31 bellard
/* Floating point load/store.  Address is in T1 */
81 b5ff1b31 bellard
#define VFP_MEM_OP(p, w) \
82 b5ff1b31 bellard
void OPPROTO glue(op_vfp_ld##p,MEMSUFFIX)(void) \
83 b5ff1b31 bellard
{ \
84 b5ff1b31 bellard
    FT0##p = glue(ldf##w,MEMSUFFIX)(T1); \
85 b5ff1b31 bellard
    FORCE_RET(); \
86 b5ff1b31 bellard
} \
87 b5ff1b31 bellard
void OPPROTO glue(op_vfp_st##p,MEMSUFFIX)(void) \
88 b5ff1b31 bellard
{ \
89 b5ff1b31 bellard
    glue(stf##w,MEMSUFFIX)(T1, FT0##p); \
90 b5ff1b31 bellard
    FORCE_RET(); \
91 b5ff1b31 bellard
}
92 b5ff1b31 bellard
93 b5ff1b31 bellard
VFP_MEM_OP(s,l)
94 b5ff1b31 bellard
VFP_MEM_OP(d,q)
95 b5ff1b31 bellard
96 b5ff1b31 bellard
#undef VFP_MEM_OP
97 b5ff1b31 bellard
98 18c9b560 balrog
/* iwMMXt load/store.  Address is in T1 */
99 18c9b560 balrog
#define MMX_MEM_OP(name, ldname) \
100 18c9b560 balrog
void OPPROTO glue(op_iwmmxt_ld##name,MEMSUFFIX)(void) \
101 18c9b560 balrog
{ \
102 18c9b560 balrog
    M0 = glue(ld##ldname,MEMSUFFIX)(T1); \
103 18c9b560 balrog
    FORCE_RET(); \
104 18c9b560 balrog
} \
105 18c9b560 balrog
void OPPROTO glue(op_iwmmxt_st##name,MEMSUFFIX)(void) \
106 18c9b560 balrog
{ \
107 18c9b560 balrog
    glue(st##name,MEMSUFFIX)(T1, M0); \
108 18c9b560 balrog
    FORCE_RET(); \
109 18c9b560 balrog
}
110 18c9b560 balrog
111 18c9b560 balrog
MMX_MEM_OP(b, ub)
112 18c9b560 balrog
MMX_MEM_OP(w, uw)
113 18c9b560 balrog
MMX_MEM_OP(l, l)
114 18c9b560 balrog
MMX_MEM_OP(q, q)
115 18c9b560 balrog
116 18c9b560 balrog
#undef MMX_MEM_OP
117 18c9b560 balrog
118 b5ff1b31 bellard
#undef MEMSUFFIX