root / target-alpha / op_mem.h @ 5fafdf24
History | View | Annotate | Download (4.2 kB)
1 | 4c9649a9 | j_mayer | /*
|
---|---|---|---|
2 | 4c9649a9 | j_mayer | * Alpha emulation cpu micro-operations for memory accesses for qemu.
|
3 | 5fafdf24 | ths | *
|
4 | 4c9649a9 | j_mayer | * Copyright (c) 2007 Jocelyn Mayer
|
5 | 4c9649a9 | j_mayer | *
|
6 | 4c9649a9 | j_mayer | * This library is free software; you can redistribute it and/or
|
7 | 4c9649a9 | j_mayer | * modify it under the terms of the GNU Lesser General Public
|
8 | 4c9649a9 | j_mayer | * License as published by the Free Software Foundation; either
|
9 | 4c9649a9 | j_mayer | * version 2 of the License, or (at your option) any later version.
|
10 | 4c9649a9 | j_mayer | *
|
11 | 4c9649a9 | j_mayer | * This library is distributed in the hope that it will be useful,
|
12 | 4c9649a9 | j_mayer | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 4c9649a9 | j_mayer | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 4c9649a9 | j_mayer | * Lesser General Public License for more details.
|
15 | 4c9649a9 | j_mayer | *
|
16 | 4c9649a9 | j_mayer | * You should have received a copy of the GNU Lesser General Public
|
17 | 4c9649a9 | j_mayer | * License along with this library; if not, write to the Free Software
|
18 | 4c9649a9 | j_mayer | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19 | 4c9649a9 | j_mayer | */
|
20 | 4c9649a9 | j_mayer | |
21 | 4c9649a9 | j_mayer | #define DEBUG_MEM_ACCESSES
|
22 | 4c9649a9 | j_mayer | #if defined (DEBUG_MEM_ACCESSES)
|
23 | 4c9649a9 | j_mayer | void helper_print_mem_EA (target_ulong EA);
|
24 | 4c9649a9 | j_mayer | #define print_mem_EA(EA) do { helper_print_mem_EA(EA); } while (0) |
25 | 4c9649a9 | j_mayer | #else
|
26 | 4c9649a9 | j_mayer | #define print_mem_EA(EA) do { } while (0) |
27 | 4c9649a9 | j_mayer | #endif
|
28 | 4c9649a9 | j_mayer | |
29 | 4c9649a9 | j_mayer | static inline uint32_t glue(ldl_l, MEMSUFFIX) (target_ulong EA) |
30 | 4c9649a9 | j_mayer | { |
31 | 4c9649a9 | j_mayer | env->lock = EA; |
32 | 4c9649a9 | j_mayer | |
33 | 4c9649a9 | j_mayer | return glue(ldl, MEMSUFFIX)(EA);
|
34 | 4c9649a9 | j_mayer | } |
35 | 4c9649a9 | j_mayer | |
36 | 4c9649a9 | j_mayer | static inline uint32_t glue(ldq_l, MEMSUFFIX) (target_ulong EA) |
37 | 4c9649a9 | j_mayer | { |
38 | 4c9649a9 | j_mayer | env->lock = EA; |
39 | 4c9649a9 | j_mayer | |
40 | 4c9649a9 | j_mayer | return glue(ldq, MEMSUFFIX)(EA);
|
41 | 4c9649a9 | j_mayer | } |
42 | 4c9649a9 | j_mayer | |
43 | 4c9649a9 | j_mayer | static inline void glue(stl_c, MEMSUFFIX) (target_ulong EA, uint32_t data) |
44 | 4c9649a9 | j_mayer | { |
45 | 4c9649a9 | j_mayer | if (EA == env->lock) {
|
46 | 4c9649a9 | j_mayer | glue(stl, MEMSUFFIX)(EA, data); |
47 | 4c9649a9 | j_mayer | T0 = 0;
|
48 | 4c9649a9 | j_mayer | } else {
|
49 | 4c9649a9 | j_mayer | T0 = 1;
|
50 | 4c9649a9 | j_mayer | } |
51 | 4c9649a9 | j_mayer | env->lock = -1;
|
52 | 4c9649a9 | j_mayer | } |
53 | 4c9649a9 | j_mayer | |
54 | 4c9649a9 | j_mayer | static inline void glue(stq_c, MEMSUFFIX) (target_ulong EA, uint64_t data) |
55 | 4c9649a9 | j_mayer | { |
56 | 4c9649a9 | j_mayer | if (EA == env->lock) {
|
57 | 4c9649a9 | j_mayer | glue(stq, MEMSUFFIX)(EA, data); |
58 | 4c9649a9 | j_mayer | T0 = 0;
|
59 | 4c9649a9 | j_mayer | } else {
|
60 | 4c9649a9 | j_mayer | T0 = 1;
|
61 | 4c9649a9 | j_mayer | } |
62 | 4c9649a9 | j_mayer | env->lock = -1;
|
63 | 4c9649a9 | j_mayer | } |
64 | 4c9649a9 | j_mayer | |
65 | 4c9649a9 | j_mayer | #define ALPHA_LD_OP(name, op) \
|
66 | 4c9649a9 | j_mayer | void OPPROTO glue(glue(op_ld, name), MEMSUFFIX) (void) \ |
67 | 4c9649a9 | j_mayer | { \ |
68 | 4c9649a9 | j_mayer | print_mem_EA(T0); \ |
69 | 4c9649a9 | j_mayer | T1 = glue(op, MEMSUFFIX)(T0); \ |
70 | 4c9649a9 | j_mayer | RETURN(); \ |
71 | 4c9649a9 | j_mayer | } |
72 | 4c9649a9 | j_mayer | |
73 | 4c9649a9 | j_mayer | #define ALPHA_ST_OP(name, op) \
|
74 | 4c9649a9 | j_mayer | void OPPROTO glue(glue(op_st, name), MEMSUFFIX) (void) \ |
75 | 4c9649a9 | j_mayer | { \ |
76 | 4c9649a9 | j_mayer | print_mem_EA(T0); \ |
77 | 4c9649a9 | j_mayer | glue(op, MEMSUFFIX)(T0, T1); \ |
78 | 4c9649a9 | j_mayer | RETURN(); \ |
79 | 4c9649a9 | j_mayer | } |
80 | 4c9649a9 | j_mayer | |
81 | 4c9649a9 | j_mayer | ALPHA_LD_OP(bu, ldub); |
82 | 4c9649a9 | j_mayer | ALPHA_ST_OP(b, stb); |
83 | 4c9649a9 | j_mayer | ALPHA_LD_OP(wu, lduw); |
84 | 4c9649a9 | j_mayer | ALPHA_ST_OP(w, stw); |
85 | 4c9649a9 | j_mayer | ALPHA_LD_OP(l, ldl); |
86 | 4c9649a9 | j_mayer | ALPHA_ST_OP(l, stl); |
87 | 4c9649a9 | j_mayer | ALPHA_LD_OP(q, ldq); |
88 | 4c9649a9 | j_mayer | ALPHA_ST_OP(q, stq); |
89 | 4c9649a9 | j_mayer | |
90 | 4c9649a9 | j_mayer | ALPHA_LD_OP(q_u, ldq); |
91 | 4c9649a9 | j_mayer | ALPHA_ST_OP(q_u, stq); |
92 | 4c9649a9 | j_mayer | |
93 | 4c9649a9 | j_mayer | ALPHA_LD_OP(l_l, ldl_l); |
94 | 4c9649a9 | j_mayer | ALPHA_LD_OP(q_l, ldq_l); |
95 | 4c9649a9 | j_mayer | ALPHA_ST_OP(l_c, stl_c); |
96 | 4c9649a9 | j_mayer | ALPHA_ST_OP(q_c, stq_c); |
97 | 4c9649a9 | j_mayer | |
98 | 4c9649a9 | j_mayer | #define ALPHA_LDF_OP(name, op) \
|
99 | 4c9649a9 | j_mayer | void OPPROTO glue(glue(op_ld, name), MEMSUFFIX) (void) \ |
100 | 4c9649a9 | j_mayer | { \ |
101 | 4c9649a9 | j_mayer | print_mem_EA(T0); \ |
102 | 4c9649a9 | j_mayer | FT1 = glue(op, MEMSUFFIX)(T0); \ |
103 | 4c9649a9 | j_mayer | RETURN(); \ |
104 | 4c9649a9 | j_mayer | } |
105 | 4c9649a9 | j_mayer | |
106 | 4c9649a9 | j_mayer | #define ALPHA_STF_OP(name, op) \
|
107 | 4c9649a9 | j_mayer | void OPPROTO glue(glue(op_st, name), MEMSUFFIX) (void) \ |
108 | 4c9649a9 | j_mayer | { \ |
109 | 4c9649a9 | j_mayer | print_mem_EA(T0); \ |
110 | 4c9649a9 | j_mayer | glue(op, MEMSUFFIX)(T0, FT1); \ |
111 | 4c9649a9 | j_mayer | RETURN(); \ |
112 | 4c9649a9 | j_mayer | } |
113 | 4c9649a9 | j_mayer | |
114 | 4c9649a9 | j_mayer | ALPHA_LDF_OP(t, ldfq); |
115 | 4c9649a9 | j_mayer | ALPHA_STF_OP(t, stfq); |
116 | 4c9649a9 | j_mayer | ALPHA_LDF_OP(s, ldfl); |
117 | 4c9649a9 | j_mayer | ALPHA_STF_OP(s, stfl); |
118 | 4c9649a9 | j_mayer | |
119 | 4c9649a9 | j_mayer | /* VAX floating point */
|
120 | 4c9649a9 | j_mayer | ALPHA_LDF_OP(f, helper_ldff); |
121 | 4c9649a9 | j_mayer | ALPHA_STF_OP(f, helper_stff); |
122 | 4c9649a9 | j_mayer | ALPHA_LDF_OP(g, helper_ldfg); |
123 | 4c9649a9 | j_mayer | ALPHA_STF_OP(g, helper_stfg); |
124 | 4c9649a9 | j_mayer | |
125 | 4c9649a9 | j_mayer | #undef MEMSUFFIX |