Statistics
| Branch: | Revision:

root / target-arm / op_mem.h @ 4373f3ce

History | View | Annotate | Download (2.2 kB)

1
/* ARM memory operations.  */
2

    
3
/* Swap T0 with memory at address T1.  */
4
/* ??? Is this exception safe?  */
5
#define MEM_SWP_OP(name, lname) \
6
void OPPROTO glue(op_swp##name,MEMSUFFIX)(void) \
7
{ \
8
    uint32_t tmp; \
9
    cpu_lock(); \
10
    tmp = glue(ld##lname,MEMSUFFIX)(T1); \
11
    glue(st##name,MEMSUFFIX)(T1, T0); \
12
    T0 = tmp; \
13
    cpu_unlock(); \
14
    FORCE_RET(); \
15
}
16

    
17
MEM_SWP_OP(b, ub)
18
MEM_SWP_OP(l, l)
19

    
20
#undef MEM_SWP_OP
21

    
22
/* Load-locked, store exclusive.  */
23
#define EXCLUSIVE_OP(suffix, ldsuffix) \
24
void OPPROTO glue(op_ld##suffix##ex,MEMSUFFIX)(void) \
25
{ \
26
    cpu_lock(); \
27
    helper_mark_exclusive(env, T1); \
28
    T0 = glue(ld##ldsuffix,MEMSUFFIX)(T1); \
29
    cpu_unlock(); \
30
    FORCE_RET(); \
31
} \
32
 \
33
void OPPROTO glue(op_st##suffix##ex,MEMSUFFIX)(void) \
34
{ \
35
    int failed; \
36
    cpu_lock(); \
37
    failed = helper_test_exclusive(env, T1); \
38
    /* ??? Is it safe to hold the cpu lock over a store?  */ \
39
    if (!failed) { \
40
        glue(st##suffix,MEMSUFFIX)(T1, T0); \
41
    } \
42
    T0 = failed; \
43
    cpu_unlock(); \
44
    FORCE_RET(); \
45
}
46

    
47
EXCLUSIVE_OP(b, ub)
48
EXCLUSIVE_OP(w, uw)
49
EXCLUSIVE_OP(l, l)
50

    
51
#undef EXCLUSIVE_OP
52

    
53
/* Load exclusive T0:T1 from address T1.  */
54
void OPPROTO glue(op_ldqex,MEMSUFFIX)(void)
55
{
56
    cpu_lock();
57
    helper_mark_exclusive(env, T1);
58
    T0 = glue(ldl,MEMSUFFIX)(T1);
59
    T1 = glue(ldl,MEMSUFFIX)((T1 + 4));
60
    cpu_unlock();
61
    FORCE_RET();
62
}
63

    
64
/* Store exclusive T0:T2 to address T1.  */
65
void OPPROTO glue(op_stqex,MEMSUFFIX)(void)
66
{
67
    int failed;
68
    cpu_lock();
69
    failed = helper_test_exclusive(env, T1);
70
    /* ??? Is it safe to hold the cpu lock over a store?  */
71
    if (!failed) {
72
        glue(stl,MEMSUFFIX)(T1, T0);
73
        glue(stl,MEMSUFFIX)((T1 + 4), T2);
74
    }
75
    T0 = failed;
76
    cpu_unlock();
77
    FORCE_RET();
78
}
79

    
80
/* iwMMXt load/store.  Address is in T1 */
81
#define MMX_MEM_OP(name, ldname) \
82
void OPPROTO glue(op_iwmmxt_ld##name,MEMSUFFIX)(void) \
83
{ \
84
    M0 = glue(ld##ldname,MEMSUFFIX)(T1); \
85
    FORCE_RET(); \
86
} \
87
void OPPROTO glue(op_iwmmxt_st##name,MEMSUFFIX)(void) \
88
{ \
89
    glue(st##name,MEMSUFFIX)(T1, M0); \
90
    FORCE_RET(); \
91
}
92

    
93
MMX_MEM_OP(b, ub)
94
MMX_MEM_OP(w, uw)
95
MMX_MEM_OP(l, l)
96
MMX_MEM_OP(q, q)
97

    
98
#undef MMX_MEM_OP
99

    
100
#undef MEMSUFFIX