root / target-mips / op_helper_mem.c @ c570fd16
History | View | Annotate | Download (6.3 kB)
1 | 9f25f11f | bellard | #ifdef TARGET_WORDS_BIGENDIAN
|
---|---|---|---|
2 | 9f25f11f | bellard | #define GET_LMASK(v) ((v) & 3) |
3 | 9f25f11f | bellard | #else
|
4 | 9f25f11f | bellard | #define GET_LMASK(v) (((v) & 3) ^ 3) |
5 | 9f25f11f | bellard | #endif
|
6 | 9f25f11f | bellard | |
7 | 4ad40f36 | bellard | void glue(do_lwl, MEMSUFFIX) (uint32_t tmp)
|
8 | 6af0bf9c | bellard | { |
9 | 6af0bf9c | bellard | #if defined (DEBUG_OP)
|
10 | 6af0bf9c | bellard | target_ulong sav = T0; |
11 | 6af0bf9c | bellard | #endif
|
12 | 6af0bf9c | bellard | |
13 | 9f25f11f | bellard | switch (GET_LMASK(T0)) {
|
14 | 6af0bf9c | bellard | case 0: |
15 | 6af0bf9c | bellard | T0 = tmp; |
16 | 6af0bf9c | bellard | break;
|
17 | 6af0bf9c | bellard | case 1: |
18 | 6af0bf9c | bellard | T0 = (tmp << 8) | (T1 & 0x000000FF); |
19 | 6af0bf9c | bellard | break;
|
20 | 6af0bf9c | bellard | case 2: |
21 | 6af0bf9c | bellard | T0 = (tmp << 16) | (T1 & 0x0000FFFF); |
22 | 6af0bf9c | bellard | break;
|
23 | 6af0bf9c | bellard | case 3: |
24 | 6af0bf9c | bellard | T0 = (tmp << 24) | (T1 & 0x00FFFFFF); |
25 | 6af0bf9c | bellard | break;
|
26 | 6af0bf9c | bellard | } |
27 | 6af0bf9c | bellard | #if defined (DEBUG_OP)
|
28 | 6af0bf9c | bellard | if (logfile) {
|
29 | 6af0bf9c | bellard | fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
|
30 | 6af0bf9c | bellard | __func__, sav, tmp, T1, T0); |
31 | 6af0bf9c | bellard | } |
32 | 6af0bf9c | bellard | #endif
|
33 | 6af0bf9c | bellard | RETURN(); |
34 | 6af0bf9c | bellard | } |
35 | 6af0bf9c | bellard | |
36 | 4ad40f36 | bellard | void glue(do_lwr, MEMSUFFIX) (uint32_t tmp)
|
37 | 6af0bf9c | bellard | { |
38 | 6af0bf9c | bellard | #if defined (DEBUG_OP)
|
39 | 6af0bf9c | bellard | target_ulong sav = T0; |
40 | 6af0bf9c | bellard | #endif
|
41 | 6af0bf9c | bellard | |
42 | 9f25f11f | bellard | switch (GET_LMASK(T0)) {
|
43 | 6af0bf9c | bellard | case 0: |
44 | 6af0bf9c | bellard | T0 = (tmp >> 24) | (T1 & 0xFFFFFF00); |
45 | 6af0bf9c | bellard | break;
|
46 | 6af0bf9c | bellard | case 1: |
47 | 6af0bf9c | bellard | T0 = (tmp >> 16) | (T1 & 0xFFFF0000); |
48 | 6af0bf9c | bellard | break;
|
49 | 6af0bf9c | bellard | case 2: |
50 | 6af0bf9c | bellard | T0 = (tmp >> 8) | (T1 & 0xFF000000); |
51 | 6af0bf9c | bellard | break;
|
52 | 6af0bf9c | bellard | case 3: |
53 | 6af0bf9c | bellard | T0 = tmp; |
54 | 6af0bf9c | bellard | break;
|
55 | 6af0bf9c | bellard | } |
56 | 6af0bf9c | bellard | #if defined (DEBUG_OP)
|
57 | 6af0bf9c | bellard | if (logfile) {
|
58 | 6af0bf9c | bellard | fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
|
59 | 6af0bf9c | bellard | __func__, sav, tmp, T1, T0); |
60 | 6af0bf9c | bellard | } |
61 | 6af0bf9c | bellard | #endif
|
62 | 6af0bf9c | bellard | RETURN(); |
63 | 6af0bf9c | bellard | } |
64 | 6af0bf9c | bellard | |
65 | 4ad40f36 | bellard | uint32_t glue(do_swl, MEMSUFFIX) (uint32_t tmp) |
66 | 6af0bf9c | bellard | { |
67 | 6af0bf9c | bellard | #if defined (DEBUG_OP)
|
68 | c570fd16 | ths | target_ulong sav = tmp; |
69 | 6af0bf9c | bellard | #endif
|
70 | 6af0bf9c | bellard | |
71 | 9f25f11f | bellard | switch (GET_LMASK(T0)) {
|
72 | 6af0bf9c | bellard | case 0: |
73 | 6af0bf9c | bellard | tmp = T1; |
74 | 6af0bf9c | bellard | break;
|
75 | 6af0bf9c | bellard | case 1: |
76 | 6af0bf9c | bellard | tmp = (tmp & 0xFF000000) | (T1 >> 8); |
77 | 6af0bf9c | bellard | break;
|
78 | 6af0bf9c | bellard | case 2: |
79 | 6af0bf9c | bellard | tmp = (tmp & 0xFFFF0000) | (T1 >> 16); |
80 | 6af0bf9c | bellard | break;
|
81 | 6af0bf9c | bellard | case 3: |
82 | 6af0bf9c | bellard | tmp = (tmp & 0xFFFFFF00) | (T1 >> 24); |
83 | 6af0bf9c | bellard | break;
|
84 | 6af0bf9c | bellard | } |
85 | 6af0bf9c | bellard | #if defined (DEBUG_OP)
|
86 | 6af0bf9c | bellard | if (logfile) {
|
87 | 6af0bf9c | bellard | fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
|
88 | 6af0bf9c | bellard | __func__, T0, sav, T1, tmp); |
89 | 6af0bf9c | bellard | } |
90 | 6af0bf9c | bellard | #endif
|
91 | 6af0bf9c | bellard | RETURN(); |
92 | 4ad40f36 | bellard | return tmp;
|
93 | 6af0bf9c | bellard | } |
94 | 6af0bf9c | bellard | |
95 | 4ad40f36 | bellard | uint32_t glue(do_swr, MEMSUFFIX) (uint32_t tmp) |
96 | 6af0bf9c | bellard | { |
97 | 6af0bf9c | bellard | #if defined (DEBUG_OP)
|
98 | c570fd16 | ths | target_ulong sav = tmp; |
99 | 6af0bf9c | bellard | #endif
|
100 | 6af0bf9c | bellard | |
101 | 9f25f11f | bellard | switch (GET_LMASK(T0)) {
|
102 | 6af0bf9c | bellard | case 0: |
103 | 6af0bf9c | bellard | tmp = (tmp & 0x00FFFFFF) | (T1 << 24); |
104 | 6af0bf9c | bellard | break;
|
105 | 6af0bf9c | bellard | case 1: |
106 | 6af0bf9c | bellard | tmp = (tmp & 0x0000FFFF) | (T1 << 16); |
107 | 6af0bf9c | bellard | break;
|
108 | 6af0bf9c | bellard | case 2: |
109 | 6af0bf9c | bellard | tmp = (tmp & 0x000000FF) | (T1 << 8); |
110 | 6af0bf9c | bellard | break;
|
111 | 6af0bf9c | bellard | case 3: |
112 | 6af0bf9c | bellard | tmp = T1; |
113 | 6af0bf9c | bellard | break;
|
114 | 6af0bf9c | bellard | } |
115 | 6af0bf9c | bellard | #if defined (DEBUG_OP)
|
116 | 6af0bf9c | bellard | if (logfile) {
|
117 | 6af0bf9c | bellard | fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
|
118 | 6af0bf9c | bellard | __func__, T0, sav, T1, tmp); |
119 | 6af0bf9c | bellard | } |
120 | 6af0bf9c | bellard | #endif
|
121 | 6af0bf9c | bellard | RETURN(); |
122 | 4ad40f36 | bellard | return tmp;
|
123 | 6af0bf9c | bellard | } |
124 | c570fd16 | ths | |
125 | c570fd16 | ths | #ifdef MIPS_HAS_MIPS64
|
126 | c570fd16 | ths | |
127 | c570fd16 | ths | # ifdef TARGET_WORDS_BIGENDIAN
|
128 | c570fd16 | ths | #define GET_LMASK64(v) ((v) & 4) |
129 | c570fd16 | ths | #else
|
130 | c570fd16 | ths | #define GET_LMASK64(v) (((v) & 4) ^ 4) |
131 | c570fd16 | ths | #endif
|
132 | c570fd16 | ths | |
133 | c570fd16 | ths | void glue(do_ldl, MEMSUFFIX) (uint64_t tmp)
|
134 | c570fd16 | ths | { |
135 | c570fd16 | ths | #if defined (DEBUG_OP)
|
136 | c570fd16 | ths | target_ulong sav = T0; |
137 | c570fd16 | ths | #endif
|
138 | c570fd16 | ths | |
139 | c570fd16 | ths | switch (GET_LMASK64(T0)) {
|
140 | c570fd16 | ths | case 0: |
141 | c570fd16 | ths | T0 = tmp; |
142 | c570fd16 | ths | break;
|
143 | c570fd16 | ths | case 1: |
144 | c570fd16 | ths | T0 = (tmp << 8) | (T1 & 0x00000000000000FFULL); |
145 | c570fd16 | ths | break;
|
146 | c570fd16 | ths | case 2: |
147 | c570fd16 | ths | T0 = (tmp << 16) | (T1 & 0x000000000000FFFFULL); |
148 | c570fd16 | ths | break;
|
149 | c570fd16 | ths | case 3: |
150 | c570fd16 | ths | T0 = (tmp << 24) | (T1 & 0x0000000000FFFFFFULL); |
151 | c570fd16 | ths | break;
|
152 | c570fd16 | ths | case 4: |
153 | c570fd16 | ths | T0 = (tmp << 32) | (T1 & 0x00000000FFFFFFFFULL); |
154 | c570fd16 | ths | break;
|
155 | c570fd16 | ths | case 5: |
156 | c570fd16 | ths | T0 = (tmp << 40) | (T1 & 0x000000FFFFFFFFFFULL); |
157 | c570fd16 | ths | break;
|
158 | c570fd16 | ths | case 6: |
159 | c570fd16 | ths | T0 = (tmp << 48) | (T1 & 0x0000FFFFFFFFFFFFULL); |
160 | c570fd16 | ths | break;
|
161 | c570fd16 | ths | case 7: |
162 | c570fd16 | ths | T0 = (tmp << 56) | (T1 & 0x00FFFFFFFFFFFFFFULL); |
163 | c570fd16 | ths | break;
|
164 | c570fd16 | ths | } |
165 | c570fd16 | ths | #if defined (DEBUG_OP)
|
166 | c570fd16 | ths | if (logfile) {
|
167 | c570fd16 | ths | fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
|
168 | c570fd16 | ths | __func__, sav, tmp, T1, T0); |
169 | c570fd16 | ths | } |
170 | c570fd16 | ths | #endif
|
171 | c570fd16 | ths | RETURN(); |
172 | c570fd16 | ths | } |
173 | c570fd16 | ths | |
174 | c570fd16 | ths | void glue(do_ldr, MEMSUFFIX) (uint64_t tmp)
|
175 | c570fd16 | ths | { |
176 | c570fd16 | ths | #if defined (DEBUG_OP)
|
177 | c570fd16 | ths | target_ulong sav = T0; |
178 | c570fd16 | ths | #endif
|
179 | c570fd16 | ths | |
180 | c570fd16 | ths | switch (GET_LMASK64(T0)) {
|
181 | c570fd16 | ths | case 0: |
182 | c570fd16 | ths | T0 = (tmp >> 56) | (T1 & 0xFFFFFFFFFFFFFF00ULL); |
183 | c570fd16 | ths | break;
|
184 | c570fd16 | ths | case 1: |
185 | c570fd16 | ths | T0 = (tmp >> 48) | (T1 & 0xFFFFFFFFFFFF0000ULL); |
186 | c570fd16 | ths | break;
|
187 | c570fd16 | ths | case 2: |
188 | c570fd16 | ths | T0 = (tmp >> 40) | (T1 & 0xFFFFFFFFFF000000ULL); |
189 | c570fd16 | ths | break;
|
190 | c570fd16 | ths | case 3: |
191 | c570fd16 | ths | T0 = (tmp >> 32) | (T1 & 0xFFFFFFFF00000000ULL); |
192 | c570fd16 | ths | break;
|
193 | c570fd16 | ths | case 4: |
194 | c570fd16 | ths | T0 = (tmp >> 24) | (T1 & 0xFFFFFF0000000000ULL); |
195 | c570fd16 | ths | break;
|
196 | c570fd16 | ths | case 5: |
197 | c570fd16 | ths | T0 = (tmp >> 16) | (T1 & 0xFFFF000000000000ULL); |
198 | c570fd16 | ths | break;
|
199 | c570fd16 | ths | case 6: |
200 | c570fd16 | ths | T0 = (tmp >> 8) | (T1 & 0xFF00000000000000ULL); |
201 | c570fd16 | ths | break;
|
202 | c570fd16 | ths | case 7: |
203 | c570fd16 | ths | T0 = tmp; |
204 | c570fd16 | ths | break;
|
205 | c570fd16 | ths | } |
206 | c570fd16 | ths | #if defined (DEBUG_OP)
|
207 | c570fd16 | ths | if (logfile) {
|
208 | c570fd16 | ths | fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
|
209 | c570fd16 | ths | __func__, sav, tmp, T1, T0); |
210 | c570fd16 | ths | } |
211 | c570fd16 | ths | #endif
|
212 | c570fd16 | ths | RETURN(); |
213 | c570fd16 | ths | } |
214 | c570fd16 | ths | |
215 | c570fd16 | ths | uint64_t glue(do_sdl, MEMSUFFIX) (uint64_t tmp) |
216 | c570fd16 | ths | { |
217 | c570fd16 | ths | #if defined (DEBUG_OP)
|
218 | c570fd16 | ths | target_ulong sav = tmp; |
219 | c570fd16 | ths | #endif
|
220 | c570fd16 | ths | |
221 | c570fd16 | ths | switch (GET_LMASK64(T0)) {
|
222 | c570fd16 | ths | case 0: |
223 | c570fd16 | ths | tmp = T1; |
224 | c570fd16 | ths | break;
|
225 | c570fd16 | ths | case 1: |
226 | c570fd16 | ths | tmp = (tmp & 0xFF00000000000000ULL) | (T1 >> 8); |
227 | c570fd16 | ths | break;
|
228 | c570fd16 | ths | case 2: |
229 | c570fd16 | ths | tmp = (tmp & 0xFFFF000000000000ULL) | (T1 >> 16); |
230 | c570fd16 | ths | break;
|
231 | c570fd16 | ths | case 3: |
232 | c570fd16 | ths | tmp = (tmp & 0xFFFFFF0000000000ULL) | (T1 >> 24); |
233 | c570fd16 | ths | break;
|
234 | c570fd16 | ths | case 4: |
235 | c570fd16 | ths | tmp = (tmp & 0xFFFFFFFF00000000ULL) | (T1 >> 32); |
236 | c570fd16 | ths | break;
|
237 | c570fd16 | ths | case 5: |
238 | c570fd16 | ths | tmp = (tmp & 0xFFFFFFFFFF000000ULL) | (T1 >> 40); |
239 | c570fd16 | ths | break;
|
240 | c570fd16 | ths | case 6: |
241 | c570fd16 | ths | tmp = (tmp & 0xFFFFFFFFFFFF0000ULL) | (T1 >> 48); |
242 | c570fd16 | ths | break;
|
243 | c570fd16 | ths | case 7: |
244 | c570fd16 | ths | tmp = (tmp & 0xFFFFFFFFFFFFFF00ULL) | (T1 >> 56); |
245 | c570fd16 | ths | break;
|
246 | c570fd16 | ths | } |
247 | c570fd16 | ths | #if defined (DEBUG_OP)
|
248 | c570fd16 | ths | if (logfile) {
|
249 | c570fd16 | ths | fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
|
250 | c570fd16 | ths | __func__, T0, sav, T1, tmp); |
251 | c570fd16 | ths | } |
252 | c570fd16 | ths | #endif
|
253 | c570fd16 | ths | RETURN(); |
254 | c570fd16 | ths | return tmp;
|
255 | c570fd16 | ths | } |
256 | c570fd16 | ths | |
257 | c570fd16 | ths | uint64_t glue(do_sdr, MEMSUFFIX) (uint64_t tmp) |
258 | c570fd16 | ths | { |
259 | c570fd16 | ths | #if defined (DEBUG_OP)
|
260 | c570fd16 | ths | target_ulong sav = tmp; |
261 | c570fd16 | ths | #endif
|
262 | c570fd16 | ths | |
263 | c570fd16 | ths | switch (GET_LMASK64(T0)) {
|
264 | c570fd16 | ths | case 0: |
265 | c570fd16 | ths | tmp = (tmp & 0x00FFFFFFFFFFFFFFULL) | (T1 << 56); |
266 | c570fd16 | ths | break;
|
267 | c570fd16 | ths | case 1: |
268 | c570fd16 | ths | tmp = (tmp & 0x0000FFFFFFFFFFFFULL) | (T1 << 48); |
269 | c570fd16 | ths | break;
|
270 | c570fd16 | ths | case 2: |
271 | c570fd16 | ths | tmp = (tmp & 0x000000FFFFFFFFFFULL) | (T1 << 40); |
272 | c570fd16 | ths | break;
|
273 | c570fd16 | ths | case 3: |
274 | c570fd16 | ths | tmp = (tmp & 0x00000000FFFFFFFFULL) | (T1 << 32); |
275 | c570fd16 | ths | break;
|
276 | c570fd16 | ths | case 4: |
277 | c570fd16 | ths | tmp = (tmp & 0x0000000000FFFFFFULL) | (T1 << 24); |
278 | c570fd16 | ths | break;
|
279 | c570fd16 | ths | case 5: |
280 | c570fd16 | ths | tmp = (tmp & 0x000000000000FFFFULL) | (T1 << 16); |
281 | c570fd16 | ths | break;
|
282 | c570fd16 | ths | case 6: |
283 | c570fd16 | ths | tmp = (tmp & 0x00000000000000FFULL) | (T1 << 8); |
284 | c570fd16 | ths | break;
|
285 | c570fd16 | ths | case 7: |
286 | c570fd16 | ths | tmp = T1; |
287 | c570fd16 | ths | break;
|
288 | c570fd16 | ths | } |
289 | c570fd16 | ths | #if defined (DEBUG_OP)
|
290 | c570fd16 | ths | if (logfile) {
|
291 | c570fd16 | ths | fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
|
292 | c570fd16 | ths | __func__, T0, sav, T1, tmp); |
293 | c570fd16 | ths | } |
294 | c570fd16 | ths | #endif
|
295 | c570fd16 | ths | RETURN(); |
296 | c570fd16 | ths | return tmp;
|
297 | c570fd16 | ths | } |
298 | c570fd16 | ths | |
299 | c570fd16 | ths | #endif /* MIPS_HAS_MIPS64 */ |