|
|
1.1 root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.