Statistics
| Branch: | Revision:

root / target-alpha / op_mem.h @ f8ed7070

History | View | Annotate | Download (4.3 kB)

1
/*
2
 *  Alpha emulation cpu micro-operations for memory accesses for qemu.
3
 *
4
 *  Copyright (c) 2007 Jocelyn Mayer
5
 *
6
 * This library is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2 of the License, or (at your option) any later version.
10
 *
11
 * This library is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
 */
20

    
21
//#define DEBUG_MEM_ACCESSES
22
#if defined (DEBUG_MEM_ACCESSES)
23
void helper_print_mem_EA (target_ulong EA);
24
#define print_mem_EA(EA) do { helper_print_mem_EA(EA); } while (0)
25
#else
26
#define print_mem_EA(EA) do { } while (0)
27
#endif
28

    
29
static always_inline uint32_t glue(ldl_l, MEMSUFFIX) (target_ulong EA)
30
{
31
    env->lock = EA;
32

    
33
    return glue(ldl, MEMSUFFIX)(EA);
34
}
35

    
36
static always_inline uint32_t glue(ldq_l, MEMSUFFIX) (target_ulong EA)
37
{
38
    env->lock = EA;
39

    
40
    return glue(ldq, MEMSUFFIX)(EA);
41
}
42

    
43
static always_inline void glue(stl_c, MEMSUFFIX) (target_ulong EA,
44
                                                  uint32_t data)
45
{
46
    if (EA == env->lock) {
47
        glue(stl, MEMSUFFIX)(EA, data);
48
        T0 = 0;
49
    } else {
50
        T0 = 1;
51
    }
52
    env->lock = -1;
53
}
54

    
55
static always_inline void glue(stq_c, MEMSUFFIX) (target_ulong EA,
56
                                                  uint64_t data)
57
{
58
    if (EA == env->lock) {
59
        glue(stq, MEMSUFFIX)(EA, data);
60
        T0 = 0;
61
    } else {
62
        T0 = 1;
63
    }
64
    env->lock = -1;
65
}
66

    
67
#define ALPHA_LD_OP(name, op)                                                 \
68
void OPPROTO glue(glue(op_ld, name), MEMSUFFIX) (void)                        \
69
{                                                                             \
70
    print_mem_EA(T0);                                                         \
71
    T1 = glue(op, MEMSUFFIX)(T0);                                             \
72
    RETURN();                                                                 \
73
}
74

    
75
#define ALPHA_ST_OP(name, op)                                                 \
76
void OPPROTO glue(glue(op_st, name), MEMSUFFIX) (void)                        \
77
{                                                                             \
78
    print_mem_EA(T0);                                                         \
79
    glue(op, MEMSUFFIX)(T0, T1);                                              \
80
    RETURN();                                                                 \
81
}
82

    
83
ALPHA_LD_OP(bu, ldub);
84
ALPHA_ST_OP(b, stb);
85
ALPHA_LD_OP(wu, lduw);
86
ALPHA_ST_OP(w, stw);
87
ALPHA_LD_OP(l, ldl);
88
ALPHA_ST_OP(l, stl);
89
ALPHA_LD_OP(q, ldq);
90
ALPHA_ST_OP(q, stq);
91

    
92
ALPHA_LD_OP(q_u, ldq);
93
ALPHA_ST_OP(q_u, stq);
94

    
95
ALPHA_LD_OP(l_l, ldl_l);
96
ALPHA_LD_OP(q_l, ldq_l);
97
ALPHA_ST_OP(l_c, stl_c);
98
ALPHA_ST_OP(q_c, stq_c);
99

    
100
#define ALPHA_LDF_OP(name, op)                                                \
101
void OPPROTO glue(glue(op_ld, name), MEMSUFFIX) (void)                        \
102
{                                                                             \
103
    print_mem_EA(T0);                                                         \
104
    FT1 = glue(op, MEMSUFFIX)(T0);                                            \
105
    RETURN();                                                                 \
106
}
107

    
108
#define ALPHA_STF_OP(name, op)                                                \
109
void OPPROTO glue(glue(op_st, name), MEMSUFFIX) (void)                        \
110
{                                                                             \
111
    print_mem_EA(T0);                                                         \
112
    glue(op, MEMSUFFIX)(T0, FT1);                                             \
113
    RETURN();                                                                 \
114
}
115

    
116
ALPHA_LDF_OP(t, ldfq);
117
ALPHA_STF_OP(t, stfq);
118
ALPHA_LDF_OP(s, ldfl);
119
ALPHA_STF_OP(s, stfl);
120

    
121
/* VAX floating point */
122
ALPHA_LDF_OP(f, helper_ldff);
123
ALPHA_STF_OP(f, helper_stff);
124
ALPHA_LDF_OP(g, helper_ldfg);
125
ALPHA_STF_OP(g, helper_stfg);
126

    
127
#undef MEMSUFFIX