Statistics
| Branch: | Revision:

root / target-arm / op_mem.h @ 8984bd2e

History | View | Annotate | Download (1.8 kB)

1
/* ARM memory operations.  */
2

    
3
/* Load-locked, store exclusive.  */
4
#define EXCLUSIVE_OP(suffix, ldsuffix) \
5
void OPPROTO glue(op_ld##suffix##ex,MEMSUFFIX)(void) \
6
{ \
7
    cpu_lock(); \
8
    helper_mark_exclusive(env, T1); \
9
    T0 = glue(ld##ldsuffix,MEMSUFFIX)(T1); \
10
    cpu_unlock(); \
11
    FORCE_RET(); \
12
} \
13
 \
14
void OPPROTO glue(op_st##suffix##ex,MEMSUFFIX)(void) \
15
{ \
16
    int failed; \
17
    cpu_lock(); \
18
    failed = helper_test_exclusive(env, T1); \
19
    /* ??? Is it safe to hold the cpu lock over a store?  */ \
20
    if (!failed) { \
21
        glue(st##suffix,MEMSUFFIX)(T1, T0); \
22
    } \
23
    T0 = failed; \
24
    cpu_unlock(); \
25
    FORCE_RET(); \
26
}
27

    
28
EXCLUSIVE_OP(b, ub)
29
EXCLUSIVE_OP(w, uw)
30
EXCLUSIVE_OP(l, l)
31

    
32
#undef EXCLUSIVE_OP
33

    
34
/* Load exclusive T0:T1 from address T1.  */
35
void OPPROTO glue(op_ldqex,MEMSUFFIX)(void)
36
{
37
    cpu_lock();
38
    helper_mark_exclusive(env, T1);
39
    T0 = glue(ldl,MEMSUFFIX)(T1);
40
    T1 = glue(ldl,MEMSUFFIX)((T1 + 4));
41
    cpu_unlock();
42
    FORCE_RET();
43
}
44

    
45
/* Store exclusive T0:T2 to address T1.  */
46
void OPPROTO glue(op_stqex,MEMSUFFIX)(void)
47
{
48
    int failed;
49
    cpu_lock();
50
    failed = helper_test_exclusive(env, T1);
51
    /* ??? Is it safe to hold the cpu lock over a store?  */
52
    if (!failed) {
53
        glue(stl,MEMSUFFIX)(T1, T0);
54
        glue(stl,MEMSUFFIX)((T1 + 4), T2);
55
    }
56
    T0 = failed;
57
    cpu_unlock();
58
    FORCE_RET();
59
}
60

    
61
/* iwMMXt load/store.  Address is in T1 */
62
#define MMX_MEM_OP(name, ldname) \
63
void OPPROTO glue(op_iwmmxt_ld##name,MEMSUFFIX)(void) \
64
{ \
65
    M0 = glue(ld##ldname,MEMSUFFIX)(T1); \
66
    FORCE_RET(); \
67
} \
68
void OPPROTO glue(op_iwmmxt_st##name,MEMSUFFIX)(void) \
69
{ \
70
    glue(st##name,MEMSUFFIX)(T1, M0); \
71
    FORCE_RET(); \
72
}
73

    
74
MMX_MEM_OP(b, ub)
75
MMX_MEM_OP(w, uw)
76
MMX_MEM_OP(l, l)
77
MMX_MEM_OP(q, q)
78

    
79
#undef MMX_MEM_OP
80

    
81
#undef MEMSUFFIX