Statistics
| Branch: | Revision:

root / target-mips / op_mem.c @ 9042c0e2

History | View | Annotate | Download (4.6 kB)

1 6af0bf9c bellard
/*
2 6af0bf9c bellard
 *  MIPS emulation memory micro-operations for qemu.
3 6af0bf9c bellard
 * 
4 6af0bf9c bellard
 *  Copyright (c) 2004-2005 Jocelyn Mayer
5 6af0bf9c bellard
 *
6 6af0bf9c bellard
 * This library is free software; you can redistribute it and/or
7 6af0bf9c bellard
 * modify it under the terms of the GNU Lesser General Public
8 6af0bf9c bellard
 * License as published by the Free Software Foundation; either
9 6af0bf9c bellard
 * version 2 of the License, or (at your option) any later version.
10 6af0bf9c bellard
 *
11 6af0bf9c bellard
 * This library is distributed in the hope that it will be useful,
12 6af0bf9c bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 6af0bf9c bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 6af0bf9c bellard
 * Lesser General Public License for more details.
15 6af0bf9c bellard
 *
16 6af0bf9c bellard
 * You should have received a copy of the GNU Lesser General Public
17 6af0bf9c bellard
 * License along with this library; if not, write to the Free Software
18 6af0bf9c bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 6af0bf9c bellard
 */
20 6af0bf9c bellard
21 6af0bf9c bellard
/* Standard loads and stores */
22 6af0bf9c bellard
void glue(op_lb, MEMSUFFIX) (void)
23 6af0bf9c bellard
{
24 6af0bf9c bellard
    T0 = glue(ldsb, MEMSUFFIX)(T0);
25 6af0bf9c bellard
    RETURN();
26 6af0bf9c bellard
}
27 6af0bf9c bellard
28 6af0bf9c bellard
void glue(op_lbu, MEMSUFFIX) (void)
29 6af0bf9c bellard
{
30 6af0bf9c bellard
    T0 = glue(ldub, MEMSUFFIX)(T0);
31 6af0bf9c bellard
    RETURN();
32 6af0bf9c bellard
}
33 6af0bf9c bellard
34 6af0bf9c bellard
void glue(op_sb, MEMSUFFIX) (void)
35 6af0bf9c bellard
{
36 6af0bf9c bellard
    glue(stb, MEMSUFFIX)(T0, T1);
37 6af0bf9c bellard
    RETURN();
38 6af0bf9c bellard
}
39 6af0bf9c bellard
40 6af0bf9c bellard
void glue(op_lh, MEMSUFFIX) (void)
41 6af0bf9c bellard
{
42 6af0bf9c bellard
    T0 = glue(ldsw, MEMSUFFIX)(T0);
43 6af0bf9c bellard
    RETURN();
44 6af0bf9c bellard
}
45 6af0bf9c bellard
46 6af0bf9c bellard
void glue(op_lhu, MEMSUFFIX) (void)
47 6af0bf9c bellard
{
48 6af0bf9c bellard
    T0 = glue(lduw, MEMSUFFIX)(T0);
49 6af0bf9c bellard
    RETURN();
50 6af0bf9c bellard
}
51 6af0bf9c bellard
52 6af0bf9c bellard
void glue(op_sh, MEMSUFFIX) (void)
53 6af0bf9c bellard
{
54 6af0bf9c bellard
    glue(stw, MEMSUFFIX)(T0, T1);
55 6af0bf9c bellard
    RETURN();
56 6af0bf9c bellard
}
57 6af0bf9c bellard
58 6af0bf9c bellard
void glue(op_lw, MEMSUFFIX) (void)
59 6af0bf9c bellard
{
60 6af0bf9c bellard
    T0 = glue(ldl, MEMSUFFIX)(T0);
61 6af0bf9c bellard
    RETURN();
62 6af0bf9c bellard
}
63 6af0bf9c bellard
64 d796321b bellard
void glue(op_lwu, MEMSUFFIX) (void)
65 d796321b bellard
{
66 d796321b bellard
    T0 = glue(ldl, MEMSUFFIX)(T0);
67 d796321b bellard
    RETURN();
68 d796321b bellard
}
69 d796321b bellard
70 6af0bf9c bellard
void glue(op_sw, MEMSUFFIX) (void)
71 6af0bf9c bellard
{
72 6af0bf9c bellard
    glue(stl, MEMSUFFIX)(T0, T1);
73 6af0bf9c bellard
    RETURN();
74 6af0bf9c bellard
}
75 6af0bf9c bellard
76 4ad40f36 bellard
/* "half" load and stores.  We must do the memory access inline,
77 4ad40f36 bellard
   or fault handling won't work.  */
78 c570fd16 ths
/* XXX: This is broken, CP0_BADVADDR has the wrong (aligned) value. */
79 6af0bf9c bellard
void glue(op_lwl, MEMSUFFIX) (void)
80 6af0bf9c bellard
{
81 4ad40f36 bellard
    uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
82 4ad40f36 bellard
    CALL_FROM_TB1(glue(do_lwl, MEMSUFFIX), tmp);
83 6af0bf9c bellard
    RETURN();
84 6af0bf9c bellard
}
85 6af0bf9c bellard
86 6af0bf9c bellard
void glue(op_lwr, MEMSUFFIX) (void)
87 6af0bf9c bellard
{
88 4ad40f36 bellard
    uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
89 4ad40f36 bellard
    CALL_FROM_TB1(glue(do_lwr, MEMSUFFIX), tmp);
90 6af0bf9c bellard
    RETURN();
91 6af0bf9c bellard
}
92 6af0bf9c bellard
93 6af0bf9c bellard
void glue(op_swl, MEMSUFFIX) (void)
94 6af0bf9c bellard
{
95 4ad40f36 bellard
    uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
96 4ad40f36 bellard
    tmp = CALL_FROM_TB1(glue(do_swl, MEMSUFFIX), tmp);
97 4ad40f36 bellard
    glue(stl, MEMSUFFIX)(T0 & ~3, tmp);
98 6af0bf9c bellard
    RETURN();
99 6af0bf9c bellard
}
100 6af0bf9c bellard
101 6af0bf9c bellard
void glue(op_swr, MEMSUFFIX) (void)
102 6af0bf9c bellard
{
103 4ad40f36 bellard
    uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
104 4ad40f36 bellard
    tmp = CALL_FROM_TB1(glue(do_swr, MEMSUFFIX), tmp);
105 4ad40f36 bellard
    glue(stl, MEMSUFFIX)(T0 & ~3, tmp);
106 6af0bf9c bellard
    RETURN();
107 6af0bf9c bellard
}
108 6af0bf9c bellard
109 6af0bf9c bellard
void glue(op_ll, MEMSUFFIX) (void)
110 6af0bf9c bellard
{
111 6af0bf9c bellard
    T1 = T0;
112 6af0bf9c bellard
    T0 = glue(ldl, MEMSUFFIX)(T0);
113 6af0bf9c bellard
    env->CP0_LLAddr = T1;
114 6af0bf9c bellard
    RETURN();
115 6af0bf9c bellard
}
116 6af0bf9c bellard
117 6af0bf9c bellard
void glue(op_sc, MEMSUFFIX) (void)
118 6af0bf9c bellard
{
119 6af0bf9c bellard
    CALL_FROM_TB0(dump_sc);
120 6af0bf9c bellard
    if (T0 == env->CP0_LLAddr) {
121 6af0bf9c bellard
        glue(stl, MEMSUFFIX)(T0, T1);
122 6af0bf9c bellard
        T0 = 1;
123 6af0bf9c bellard
    } else {
124 6af0bf9c bellard
        T0 = 0;
125 6af0bf9c bellard
    }
126 6af0bf9c bellard
    RETURN();
127 6af0bf9c bellard
}
128 6ea83fed bellard
129 c570fd16 ths
#ifdef MIPS_HAS_MIPS64
130 c570fd16 ths
void glue(op_ld, MEMSUFFIX) (void)
131 c570fd16 ths
{
132 c570fd16 ths
    T0 = glue(ldq, MEMSUFFIX)(T0);
133 c570fd16 ths
    RETURN();
134 c570fd16 ths
}
135 c570fd16 ths
136 c570fd16 ths
void glue(op_sd, MEMSUFFIX) (void)
137 c570fd16 ths
{
138 c570fd16 ths
    glue(stq, MEMSUFFIX)(T0, T1);
139 c570fd16 ths
    RETURN();
140 c570fd16 ths
}
141 c570fd16 ths
142 c570fd16 ths
/* "half" load and stores.  We must do the memory access inline,
143 c570fd16 ths
   or fault handling won't work.  */
144 c570fd16 ths
void glue(op_ldl, MEMSUFFIX) (void)
145 c570fd16 ths
{
146 c570fd16 ths
    target_long tmp = glue(ldq, MEMSUFFIX)(T0 & ~7);
147 c570fd16 ths
    CALL_FROM_TB1(glue(do_ldl, MEMSUFFIX), tmp);
148 c570fd16 ths
    RETURN();
149 c570fd16 ths
}
150 c570fd16 ths
151 c570fd16 ths
void glue(op_ldr, MEMSUFFIX) (void)
152 c570fd16 ths
{
153 c570fd16 ths
    target_long tmp = glue(ldq, MEMSUFFIX)(T0 & ~7);
154 c570fd16 ths
    CALL_FROM_TB1(glue(do_ldr, MEMSUFFIX), tmp);
155 c570fd16 ths
    RETURN();
156 c570fd16 ths
}
157 c570fd16 ths
158 c570fd16 ths
void glue(op_sdl, MEMSUFFIX) (void)
159 c570fd16 ths
{
160 c570fd16 ths
    target_long tmp = glue(ldq, MEMSUFFIX)(T0 & ~7);
161 c570fd16 ths
    tmp = CALL_FROM_TB1(glue(do_sdl, MEMSUFFIX), tmp);
162 c570fd16 ths
    glue(stq, MEMSUFFIX)(T0 & ~7, tmp);
163 c570fd16 ths
    RETURN();
164 c570fd16 ths
}
165 c570fd16 ths
166 c570fd16 ths
void glue(op_sdr, MEMSUFFIX) (void)
167 c570fd16 ths
{
168 c570fd16 ths
    target_long tmp = glue(ldq, MEMSUFFIX)(T0 & ~7);
169 c570fd16 ths
    tmp = CALL_FROM_TB1(glue(do_sdr, MEMSUFFIX), tmp);
170 c570fd16 ths
    glue(stq, MEMSUFFIX)(T0 & ~7, tmp);
171 c570fd16 ths
    RETURN();
172 c570fd16 ths
}
173 c570fd16 ths
174 c570fd16 ths
void glue(op_lld, MEMSUFFIX) (void)
175 c570fd16 ths
{
176 c570fd16 ths
    T1 = T0;
177 c570fd16 ths
    T0 = glue(ldq, MEMSUFFIX)(T0);
178 c570fd16 ths
    env->CP0_LLAddr = T1;
179 c570fd16 ths
    RETURN();
180 c570fd16 ths
}
181 c570fd16 ths
182 c570fd16 ths
void glue(op_scd, MEMSUFFIX) (void)
183 c570fd16 ths
{
184 c570fd16 ths
    CALL_FROM_TB0(dump_sc);
185 c570fd16 ths
    if (T0 == env->CP0_LLAddr) {
186 c570fd16 ths
        glue(stq, MEMSUFFIX)(T0, T1);
187 c570fd16 ths
        T0 = 1;
188 c570fd16 ths
    } else {
189 c570fd16 ths
        T0 = 0;
190 c570fd16 ths
    }
191 c570fd16 ths
    RETURN();
192 c570fd16 ths
}
193 c570fd16 ths
#endif /* MIPS_HAS_MIPS64 */
194 c570fd16 ths
195 6ea83fed bellard
#ifdef MIPS_USES_FPU
196 6ea83fed bellard
void glue(op_lwc1, MEMSUFFIX) (void)
197 6ea83fed bellard
{
198 6ea83fed bellard
    WT0 = glue(ldl, MEMSUFFIX)(T0);
199 6ea83fed bellard
    RETURN();
200 6ea83fed bellard
}
201 6ea83fed bellard
void glue(op_swc1, MEMSUFFIX) (void)
202 6ea83fed bellard
{
203 6ea83fed bellard
    glue(stl, MEMSUFFIX)(T0, WT0);
204 6ea83fed bellard
    RETURN();
205 6ea83fed bellard
}
206 6ea83fed bellard
void glue(op_ldc1, MEMSUFFIX) (void)
207 6ea83fed bellard
{
208 6ea83fed bellard
    DT0 = glue(ldq, MEMSUFFIX)(T0);
209 6ea83fed bellard
    RETURN();
210 6ea83fed bellard
}
211 6ea83fed bellard
void glue(op_sdc1, MEMSUFFIX) (void)
212 6ea83fed bellard
{
213 6ea83fed bellard
    glue(stq, MEMSUFFIX)(T0, DT0);
214 6ea83fed bellard
    RETURN();
215 6ea83fed bellard
}
216 6ea83fed bellard
#endif