Commit dc99a3f2e856e6d2c2142538b756eb72de0af51a
1 parent
02cb1585
Convert condition code changing versions of add, sub, logic, and div to TCG
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4052 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
427 additions
and
453 deletions
target-sparc/cpu.h
... | ... | @@ -184,6 +184,11 @@ typedef struct CPUSPARCState { |
184 | 184 | target_ulong pc; /* program counter */ |
185 | 185 | target_ulong npc; /* next program counter */ |
186 | 186 | target_ulong y; /* multiply/divide register */ |
187 | + | |
188 | + /* emulator internal flags handling */ | |
189 | + target_ulong cc_src; | |
190 | + target_ulong cc_dst; | |
191 | + | |
187 | 192 | uint32_t psr; /* processor state register */ |
188 | 193 | target_ulong fsr; /* FPU state register */ |
189 | 194 | uint32_t cwp; /* index of current register window (extracted | ... | ... |
target-sparc/op.c
... | ... | @@ -171,389 +171,6 @@ |
171 | 171 | |
172 | 172 | #define FLAG_SET(x) ((env->psr&x)?1:0) |
173 | 173 | |
174 | -void OPPROTO op_add_T1_T0_cc(void) | |
175 | -{ | |
176 | - target_ulong src1; | |
177 | - | |
178 | - src1 = T0; | |
179 | - T0 += T1; | |
180 | - env->psr = 0; | |
181 | -#ifdef TARGET_SPARC64 | |
182 | - if (!(T0 & 0xffffffff)) | |
183 | - env->psr |= PSR_ZERO; | |
184 | - if ((int32_t) T0 < 0) | |
185 | - env->psr |= PSR_NEG; | |
186 | - if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) | |
187 | - env->psr |= PSR_CARRY; | |
188 | - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & | |
189 | - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) | |
190 | - env->psr |= PSR_OVF; | |
191 | - | |
192 | - env->xcc = 0; | |
193 | - if (!T0) | |
194 | - env->xcc |= PSR_ZERO; | |
195 | - if ((int64_t) T0 < 0) | |
196 | - env->xcc |= PSR_NEG; | |
197 | - if (T0 < src1) | |
198 | - env->xcc |= PSR_CARRY; | |
199 | - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) | |
200 | - env->xcc |= PSR_OVF; | |
201 | -#else | |
202 | - if (!T0) | |
203 | - env->psr |= PSR_ZERO; | |
204 | - if ((int32_t) T0 < 0) | |
205 | - env->psr |= PSR_NEG; | |
206 | - if (T0 < src1) | |
207 | - env->psr |= PSR_CARRY; | |
208 | - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) | |
209 | - env->psr |= PSR_OVF; | |
210 | -#endif | |
211 | - FORCE_RET(); | |
212 | -} | |
213 | - | |
214 | -void OPPROTO op_addx_T1_T0_cc(void) | |
215 | -{ | |
216 | - target_ulong src1; | |
217 | - src1 = T0; | |
218 | - if (FLAG_SET(PSR_CARRY)) | |
219 | - { | |
220 | - T0 += T1 + 1; | |
221 | - env->psr = 0; | |
222 | -#ifdef TARGET_SPARC64 | |
223 | - if ((T0 & 0xffffffff) <= (src1 & 0xffffffff)) | |
224 | - env->psr |= PSR_CARRY; | |
225 | - env->xcc = 0; | |
226 | - if (T0 <= src1) | |
227 | - env->xcc |= PSR_CARRY; | |
228 | -#else | |
229 | - if (T0 <= src1) | |
230 | - env->psr |= PSR_CARRY; | |
231 | -#endif | |
232 | - } | |
233 | - else | |
234 | - { | |
235 | - T0 += T1; | |
236 | - env->psr = 0; | |
237 | -#ifdef TARGET_SPARC64 | |
238 | - if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) | |
239 | - env->psr |= PSR_CARRY; | |
240 | - env->xcc = 0; | |
241 | - if (T0 < src1) | |
242 | - env->xcc |= PSR_CARRY; | |
243 | -#else | |
244 | - if (T0 < src1) | |
245 | - env->psr |= PSR_CARRY; | |
246 | -#endif | |
247 | - } | |
248 | -#ifdef TARGET_SPARC64 | |
249 | - if (!(T0 & 0xffffffff)) | |
250 | - env->psr |= PSR_ZERO; | |
251 | - if ((int32_t) T0 < 0) | |
252 | - env->psr |= PSR_NEG; | |
253 | - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & | |
254 | - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) | |
255 | - env->psr |= PSR_OVF; | |
256 | - | |
257 | - if (!T0) | |
258 | - env->xcc |= PSR_ZERO; | |
259 | - if ((int64_t) T0 < 0) | |
260 | - env->xcc |= PSR_NEG; | |
261 | - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) | |
262 | - env->xcc |= PSR_OVF; | |
263 | -#else | |
264 | - if (!T0) | |
265 | - env->psr |= PSR_ZERO; | |
266 | - if ((int32_t) T0 < 0) | |
267 | - env->psr |= PSR_NEG; | |
268 | - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) | |
269 | - env->psr |= PSR_OVF; | |
270 | -#endif | |
271 | - FORCE_RET(); | |
272 | -} | |
273 | - | |
274 | -void OPPROTO op_tadd_T1_T0_cc(void) | |
275 | -{ | |
276 | - target_ulong src1; | |
277 | - | |
278 | - src1 = T0; | |
279 | - T0 += T1; | |
280 | - env->psr = 0; | |
281 | -#ifdef TARGET_SPARC64 | |
282 | - if (!(T0 & 0xffffffff)) | |
283 | - env->psr |= PSR_ZERO; | |
284 | - if ((int32_t) T0 < 0) | |
285 | - env->psr |= PSR_NEG; | |
286 | - if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) | |
287 | - env->psr |= PSR_CARRY; | |
288 | - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & | |
289 | - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) | |
290 | - env->psr |= PSR_OVF; | |
291 | - if ((src1 & 0x03) || (T1 & 0x03)) | |
292 | - env->psr |= PSR_OVF; | |
293 | - | |
294 | - env->xcc = 0; | |
295 | - if (!T0) | |
296 | - env->xcc |= PSR_ZERO; | |
297 | - if ((int64_t) T0 < 0) | |
298 | - env->xcc |= PSR_NEG; | |
299 | - if (T0 < src1) | |
300 | - env->xcc |= PSR_CARRY; | |
301 | - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) | |
302 | - env->xcc |= PSR_OVF; | |
303 | -#else | |
304 | - if (!T0) | |
305 | - env->psr |= PSR_ZERO; | |
306 | - if ((int32_t) T0 < 0) | |
307 | - env->psr |= PSR_NEG; | |
308 | - if (T0 < src1) | |
309 | - env->psr |= PSR_CARRY; | |
310 | - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) | |
311 | - env->psr |= PSR_OVF; | |
312 | - if ((src1 & 0x03) || (T1 & 0x03)) | |
313 | - env->psr |= PSR_OVF; | |
314 | -#endif | |
315 | - FORCE_RET(); | |
316 | -} | |
317 | - | |
318 | -void OPPROTO op_tadd_T1_T0_ccTV(void) | |
319 | -{ | |
320 | - target_ulong src1; | |
321 | - | |
322 | - if ((T0 & 0x03) || (T1 & 0x03)) { | |
323 | - raise_exception(TT_TOVF); | |
324 | - FORCE_RET(); | |
325 | - return; | |
326 | - } | |
327 | - | |
328 | - src1 = T0; | |
329 | - T0 += T1; | |
330 | - | |
331 | -#ifdef TARGET_SPARC64 | |
332 | - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & | |
333 | - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) | |
334 | - raise_exception(TT_TOVF); | |
335 | -#else | |
336 | - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) | |
337 | - raise_exception(TT_TOVF); | |
338 | -#endif | |
339 | - | |
340 | - env->psr = 0; | |
341 | -#ifdef TARGET_SPARC64 | |
342 | - if (!(T0 & 0xffffffff)) | |
343 | - env->psr |= PSR_ZERO; | |
344 | - if ((int32_t) T0 < 0) | |
345 | - env->psr |= PSR_NEG; | |
346 | - if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) | |
347 | - env->psr |= PSR_CARRY; | |
348 | - | |
349 | - env->xcc = 0; | |
350 | - if (!T0) | |
351 | - env->xcc |= PSR_ZERO; | |
352 | - if ((int64_t) T0 < 0) | |
353 | - env->xcc |= PSR_NEG; | |
354 | - if (T0 < src1) | |
355 | - env->xcc |= PSR_CARRY; | |
356 | -#else | |
357 | - if (!T0) | |
358 | - env->psr |= PSR_ZERO; | |
359 | - if ((int32_t) T0 < 0) | |
360 | - env->psr |= PSR_NEG; | |
361 | - if (T0 < src1) | |
362 | - env->psr |= PSR_CARRY; | |
363 | -#endif | |
364 | - FORCE_RET(); | |
365 | -} | |
366 | - | |
367 | -void OPPROTO op_sub_T1_T0_cc(void) | |
368 | -{ | |
369 | - target_ulong src1; | |
370 | - | |
371 | - src1 = T0; | |
372 | - T0 -= T1; | |
373 | - env->psr = 0; | |
374 | -#ifdef TARGET_SPARC64 | |
375 | - if (!(T0 & 0xffffffff)) | |
376 | - env->psr |= PSR_ZERO; | |
377 | - if ((int32_t) T0 < 0) | |
378 | - env->psr |= PSR_NEG; | |
379 | - if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) | |
380 | - env->psr |= PSR_CARRY; | |
381 | - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & | |
382 | - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) | |
383 | - env->psr |= PSR_OVF; | |
384 | - | |
385 | - env->xcc = 0; | |
386 | - if (!T0) | |
387 | - env->xcc |= PSR_ZERO; | |
388 | - if ((int64_t) T0 < 0) | |
389 | - env->xcc |= PSR_NEG; | |
390 | - if (src1 < T1) | |
391 | - env->xcc |= PSR_CARRY; | |
392 | - if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63)) | |
393 | - env->xcc |= PSR_OVF; | |
394 | -#else | |
395 | - if (!T0) | |
396 | - env->psr |= PSR_ZERO; | |
397 | - if ((int32_t) T0 < 0) | |
398 | - env->psr |= PSR_NEG; | |
399 | - if (src1 < T1) | |
400 | - env->psr |= PSR_CARRY; | |
401 | - if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) | |
402 | - env->psr |= PSR_OVF; | |
403 | -#endif | |
404 | - FORCE_RET(); | |
405 | -} | |
406 | - | |
407 | -void OPPROTO op_subx_T1_T0_cc(void) | |
408 | -{ | |
409 | - target_ulong src1; | |
410 | - src1 = T0; | |
411 | - if (FLAG_SET(PSR_CARRY)) | |
412 | - { | |
413 | - T0 -= T1 + 1; | |
414 | - env->psr = 0; | |
415 | -#ifdef TARGET_SPARC64 | |
416 | - if ((src1 & 0xffffffff) <= (T1 & 0xffffffff)) | |
417 | - env->psr |= PSR_CARRY; | |
418 | - env->xcc = 0; | |
419 | - if (src1 <= T1) | |
420 | - env->xcc |= PSR_CARRY; | |
421 | -#else | |
422 | - if (src1 <= T1) | |
423 | - env->psr |= PSR_CARRY; | |
424 | -#endif | |
425 | - } | |
426 | - else | |
427 | - { | |
428 | - T0 -= T1; | |
429 | - env->psr = 0; | |
430 | -#ifdef TARGET_SPARC64 | |
431 | - if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) | |
432 | - env->psr |= PSR_CARRY; | |
433 | - env->xcc = 0; | |
434 | - if (src1 < T1) | |
435 | - env->xcc |= PSR_CARRY; | |
436 | -#else | |
437 | - if (src1 < T1) | |
438 | - env->psr |= PSR_CARRY; | |
439 | -#endif | |
440 | - } | |
441 | -#ifdef TARGET_SPARC64 | |
442 | - if (!(T0 & 0xffffffff)) | |
443 | - env->psr |= PSR_ZERO; | |
444 | - if ((int32_t) T0 < 0) | |
445 | - env->psr |= PSR_NEG; | |
446 | - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & | |
447 | - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) | |
448 | - env->psr |= PSR_OVF; | |
449 | - | |
450 | - if (!T0) | |
451 | - env->xcc |= PSR_ZERO; | |
452 | - if ((int64_t) T0 < 0) | |
453 | - env->xcc |= PSR_NEG; | |
454 | - if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63)) | |
455 | - env->xcc |= PSR_OVF; | |
456 | -#else | |
457 | - if (!T0) | |
458 | - env->psr |= PSR_ZERO; | |
459 | - if ((int32_t) T0 < 0) | |
460 | - env->psr |= PSR_NEG; | |
461 | - if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) | |
462 | - env->psr |= PSR_OVF; | |
463 | -#endif | |
464 | - FORCE_RET(); | |
465 | -} | |
466 | - | |
467 | -void OPPROTO op_tsub_T1_T0_cc(void) | |
468 | -{ | |
469 | - target_ulong src1; | |
470 | - | |
471 | - src1 = T0; | |
472 | - T0 -= T1; | |
473 | - env->psr = 0; | |
474 | -#ifdef TARGET_SPARC64 | |
475 | - if (!(T0 & 0xffffffff)) | |
476 | - env->psr |= PSR_ZERO; | |
477 | - if ((int32_t) T0 < 0) | |
478 | - env->psr |= PSR_NEG; | |
479 | - if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) | |
480 | - env->psr |= PSR_CARRY; | |
481 | - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & | |
482 | - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) | |
483 | - env->psr |= PSR_OVF; | |
484 | - if ((src1 & 0x03) || (T1 & 0x03)) | |
485 | - env->psr |= PSR_OVF; | |
486 | - | |
487 | - env->xcc = 0; | |
488 | - if (!T0) | |
489 | - env->xcc |= PSR_ZERO; | |
490 | - if ((int64_t) T0 < 0) | |
491 | - env->xcc |= PSR_NEG; | |
492 | - if (src1 < T1) | |
493 | - env->xcc |= PSR_CARRY; | |
494 | - if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63)) | |
495 | - env->xcc |= PSR_OVF; | |
496 | -#else | |
497 | - if (!T0) | |
498 | - env->psr |= PSR_ZERO; | |
499 | - if ((int32_t) T0 < 0) | |
500 | - env->psr |= PSR_NEG; | |
501 | - if (src1 < T1) | |
502 | - env->psr |= PSR_CARRY; | |
503 | - if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) | |
504 | - env->psr |= PSR_OVF; | |
505 | - if ((src1 & 0x03) || (T1 & 0x03)) | |
506 | - env->psr |= PSR_OVF; | |
507 | -#endif | |
508 | - FORCE_RET(); | |
509 | -} | |
510 | - | |
511 | -void OPPROTO op_tsub_T1_T0_ccTV(void) | |
512 | -{ | |
513 | - target_ulong src1; | |
514 | - | |
515 | - if ((T0 & 0x03) || (T1 & 0x03)) | |
516 | - raise_exception(TT_TOVF); | |
517 | - | |
518 | - src1 = T0; | |
519 | - T0 -= T1; | |
520 | - | |
521 | -#ifdef TARGET_SPARC64 | |
522 | - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & | |
523 | - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) | |
524 | - raise_exception(TT_TOVF); | |
525 | -#else | |
526 | - if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) | |
527 | - raise_exception(TT_TOVF); | |
528 | -#endif | |
529 | - | |
530 | - env->psr = 0; | |
531 | -#ifdef TARGET_SPARC64 | |
532 | - if (!(T0 & 0xffffffff)) | |
533 | - env->psr |= PSR_ZERO; | |
534 | - if ((int32_t) T0 < 0) | |
535 | - env->psr |= PSR_NEG; | |
536 | - if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) | |
537 | - env->psr |= PSR_CARRY; | |
538 | - | |
539 | - env->xcc = 0; | |
540 | - if (!T0) | |
541 | - env->xcc |= PSR_ZERO; | |
542 | - if ((int64_t) T0 < 0) | |
543 | - env->xcc |= PSR_NEG; | |
544 | - if (src1 < T1) | |
545 | - env->xcc |= PSR_CARRY; | |
546 | -#else | |
547 | - if (!T0) | |
548 | - env->psr |= PSR_ZERO; | |
549 | - if ((int32_t) T0 < 0) | |
550 | - env->psr |= PSR_NEG; | |
551 | - if (src1 < T1) | |
552 | - env->psr |= PSR_CARRY; | |
553 | -#endif | |
554 | - FORCE_RET(); | |
555 | -} | |
556 | - | |
557 | 174 | void OPPROTO op_umul_T1_T0(void) |
558 | 175 | { |
559 | 176 | uint64_t res; |
... | ... | @@ -652,33 +269,6 @@ void OPPROTO op_sdiv_T1_T0(void) |
652 | 269 | FORCE_RET(); |
653 | 270 | } |
654 | 271 | |
655 | -void OPPROTO op_div_cc(void) | |
656 | -{ | |
657 | - env->psr = 0; | |
658 | -#ifdef TARGET_SPARC64 | |
659 | - if (!T0) | |
660 | - env->psr |= PSR_ZERO; | |
661 | - if ((int32_t) T0 < 0) | |
662 | - env->psr |= PSR_NEG; | |
663 | - if (T1) | |
664 | - env->psr |= PSR_OVF; | |
665 | - | |
666 | - env->xcc = 0; | |
667 | - if (!T0) | |
668 | - env->xcc |= PSR_ZERO; | |
669 | - if ((int64_t) T0 < 0) | |
670 | - env->xcc |= PSR_NEG; | |
671 | -#else | |
672 | - if (!T0) | |
673 | - env->psr |= PSR_ZERO; | |
674 | - if ((int32_t) T0 < 0) | |
675 | - env->psr |= PSR_NEG; | |
676 | - if (T1) | |
677 | - env->psr |= PSR_OVF; | |
678 | -#endif | |
679 | - FORCE_RET(); | |
680 | -} | |
681 | - | |
682 | 272 | #ifdef TARGET_SPARC64 |
683 | 273 | void OPPROTO op_udivx_T1_T0(void) |
684 | 274 | { |
... | ... | @@ -702,29 +292,6 @@ void OPPROTO op_sdivx_T1_T0(void) |
702 | 292 | } |
703 | 293 | #endif |
704 | 294 | |
705 | -void OPPROTO op_logic_T0_cc(void) | |
706 | -{ | |
707 | - env->psr = 0; | |
708 | -#ifdef TARGET_SPARC64 | |
709 | - if (!(T0 & 0xffffffff)) | |
710 | - env->psr |= PSR_ZERO; | |
711 | - if ((int32_t) T0 < 0) | |
712 | - env->psr |= PSR_NEG; | |
713 | - | |
714 | - env->xcc = 0; | |
715 | - if (!T0) | |
716 | - env->xcc |= PSR_ZERO; | |
717 | - if ((int64_t) T0 < 0) | |
718 | - env->xcc |= PSR_NEG; | |
719 | -#else | |
720 | - if (!T0) | |
721 | - env->psr |= PSR_ZERO; | |
722 | - if ((int32_t) T0 < 0) | |
723 | - env->psr |= PSR_NEG; | |
724 | -#endif | |
725 | - FORCE_RET(); | |
726 | -} | |
727 | - | |
728 | 295 | /* Load and store */ |
729 | 296 | #define MEMSUFFIX _raw |
730 | 297 | #include "op_mem.h" | ... | ... |
target-sparc/translate.c
... | ... | @@ -46,7 +46,10 @@ |
46 | 46 | according to jump_pc[T2] */ |
47 | 47 | |
48 | 48 | /* global register indexes */ |
49 | -static TCGv cpu_env, cpu_T[3], cpu_regwptr; | |
49 | +static TCGv cpu_env, cpu_T[3], cpu_regwptr, cpu_cc_src, cpu_cc_dst, cpu_psr; | |
50 | +#ifdef TARGET_SPARC64 | |
51 | +static TCGv cpu_xcc; | |
52 | +#endif | |
50 | 53 | /* local register indexes (only used inside old micro ops) */ |
51 | 54 | static TCGv cpu_tmp0; |
52 | 55 | |
... | ... | @@ -356,6 +359,407 @@ static inline void gen_mov_reg_C(TCGv reg, TCGv src) |
356 | 359 | tcg_gen_andi_tl(reg, reg, 0x1); |
357 | 360 | } |
358 | 361 | |
362 | +static inline void gen_op_exception(int exception) | |
363 | +{ | |
364 | + TCGv r_except; | |
365 | + | |
366 | + r_except = tcg_temp_new(TCG_TYPE_I32); | |
367 | + tcg_gen_movi_i32(r_except, exception); | |
368 | + tcg_gen_helper_0_1(raise_exception, r_except); | |
369 | +} | |
370 | + | |
371 | +static inline void gen_cc_clear(void) | |
372 | +{ | |
373 | + tcg_gen_movi_i32(cpu_psr, 0); | |
374 | +#ifdef TARGET_SPARC64 | |
375 | + tcg_gen_movi_i32(cpu_xcc, 0); | |
376 | +#endif | |
377 | +} | |
378 | + | |
379 | +/* old op: | |
380 | + if (!T0) | |
381 | + env->psr |= PSR_ZERO; | |
382 | + if ((int32_t) T0 < 0) | |
383 | + env->psr |= PSR_NEG; | |
384 | +*/ | |
385 | +static inline void gen_cc_NZ(TCGv dst) | |
386 | +{ | |
387 | + int l1, l2; | |
388 | + TCGv r_zero; | |
389 | + | |
390 | + l1 = gen_new_label(); | |
391 | + l2 = gen_new_label(); | |
392 | + r_zero = tcg_temp_new(TCG_TYPE_TL); | |
393 | + tcg_gen_movi_tl(r_zero, 0); | |
394 | + tcg_gen_brcond_i32(TCG_COND_NE, dst, r_zero, l1); | |
395 | + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_ZERO); | |
396 | + gen_set_label(l1); | |
397 | + tcg_gen_brcond_i32(TCG_COND_GE, dst, r_zero, l2); | |
398 | + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_NEG); | |
399 | + gen_set_label(l2); | |
400 | +#ifdef TARGET_SPARC64 | |
401 | + { | |
402 | + int l3, l4; | |
403 | + | |
404 | + l3 = gen_new_label(); | |
405 | + l4 = gen_new_label(); | |
406 | + tcg_gen_brcond_tl(TCG_COND_NE, dst, r_zero, l3); | |
407 | + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_ZERO); | |
408 | + gen_set_label(l3); | |
409 | + tcg_gen_brcond_tl(TCG_COND_GE, dst, r_zero, l4); | |
410 | + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_NEG); | |
411 | + gen_set_label(l4); | |
412 | + } | |
413 | +#endif | |
414 | +} | |
415 | + | |
416 | +/* old op: | |
417 | + if (T0 < src1) | |
418 | + env->psr |= PSR_CARRY; | |
419 | +*/ | |
420 | +static inline void gen_cc_C_add(TCGv dst, TCGv src1) | |
421 | +{ | |
422 | + int l1; | |
423 | + | |
424 | + l1 = gen_new_label(); | |
425 | + tcg_gen_brcond_i32(TCG_COND_GEU, dst, src1, l1); | |
426 | + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY); | |
427 | + gen_set_label(l1); | |
428 | +#ifdef TARGET_SPARC64 | |
429 | + { | |
430 | + int l2; | |
431 | + | |
432 | + l2 = gen_new_label(); | |
433 | + tcg_gen_brcond_tl(TCG_COND_GEU, dst, src1, l2); | |
434 | + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY); | |
435 | + gen_set_label(l2); | |
436 | + } | |
437 | +#endif | |
438 | +} | |
439 | + | |
440 | +/* old op: | |
441 | + if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) | |
442 | + env->psr |= PSR_OVF; | |
443 | +*/ | |
444 | +static inline void gen_cc_V_add(TCGv dst, TCGv src1, TCGv src2) | |
445 | +{ | |
446 | + TCGv r_temp, r_temp2, r_temp3, r_zero; | |
447 | + int l1; | |
448 | + | |
449 | + l1 = gen_new_label(); | |
450 | + | |
451 | + r_temp = tcg_temp_new(TCG_TYPE_TL); | |
452 | + r_temp2 = tcg_temp_new(TCG_TYPE_TL); | |
453 | + r_temp3 = tcg_temp_new(TCG_TYPE_TL); | |
454 | + r_zero = tcg_temp_new(TCG_TYPE_TL); | |
455 | + tcg_gen_movi_tl(r_zero, 0); | |
456 | + tcg_gen_xor_tl(r_temp, src1, src2); | |
457 | + tcg_gen_xori_tl(r_temp, r_temp, -1); | |
458 | + tcg_gen_xor_tl(r_temp2, src1, dst); | |
459 | + tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
460 | + tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31)); | |
461 | + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1); | |
462 | + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); | |
463 | + gen_set_label(l1); | |
464 | +#ifdef TARGET_SPARC64 | |
465 | + { | |
466 | + int l2; | |
467 | + | |
468 | + l2 = gen_new_label(); | |
469 | + tcg_gen_movi_tl(r_zero, 0); | |
470 | + tcg_gen_xor_tl(r_temp, src1, src2); | |
471 | + tcg_gen_xori_tl(r_temp, r_temp, -1); | |
472 | + tcg_gen_xor_tl(r_temp2, src1, dst); | |
473 | + tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
474 | + tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63)); | |
475 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2); | |
476 | + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF); | |
477 | + gen_set_label(l2); | |
478 | + } | |
479 | +#endif | |
480 | +} | |
481 | + | |
482 | +static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2) | |
483 | +{ | |
484 | + TCGv r_temp, r_temp2, r_temp3, r_zero; | |
485 | + int l1; | |
486 | + | |
487 | + l1 = gen_new_label(); | |
488 | + | |
489 | + r_temp = tcg_temp_new(TCG_TYPE_TL); | |
490 | + r_temp2 = tcg_temp_new(TCG_TYPE_TL); | |
491 | + r_temp3 = tcg_temp_new(TCG_TYPE_TL); | |
492 | + r_zero = tcg_temp_new(TCG_TYPE_TL); | |
493 | + tcg_gen_movi_tl(r_zero, 0); | |
494 | + tcg_gen_xor_tl(r_temp, src1, src2); | |
495 | + tcg_gen_xori_tl(r_temp, r_temp, -1); | |
496 | + tcg_gen_xor_tl(r_temp2, src1, dst); | |
497 | + tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
498 | + tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31)); | |
499 | + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1); | |
500 | + gen_op_exception(TT_TOVF); | |
501 | + gen_set_label(l1); | |
502 | +#ifdef TARGET_SPARC64 | |
503 | + { | |
504 | + int l2; | |
505 | + | |
506 | + l2 = gen_new_label(); | |
507 | + tcg_gen_movi_tl(r_zero, 0); | |
508 | + tcg_gen_xor_tl(r_temp, src1, src2); | |
509 | + tcg_gen_xori_tl(r_temp, r_temp, -1); | |
510 | + tcg_gen_xor_tl(r_temp2, src1, dst); | |
511 | + tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
512 | + tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63)); | |
513 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2); | |
514 | + gen_op_exception(TT_TOVF); | |
515 | + gen_set_label(l2); | |
516 | + } | |
517 | +#endif | |
518 | +} | |
519 | + | |
520 | +static inline void gen_cc_V_tag(TCGv src1, TCGv src2) | |
521 | +{ | |
522 | + int l1; | |
523 | + TCGv r_zero, r_temp; | |
524 | + | |
525 | + l1 = gen_new_label(); | |
526 | + r_zero = tcg_temp_new(TCG_TYPE_TL); | |
527 | + r_temp = tcg_temp_new(TCG_TYPE_TL); | |
528 | + tcg_gen_movi_tl(r_zero, 0); | |
529 | + tcg_gen_or_tl(r_temp, src1, src2); | |
530 | + tcg_gen_andi_tl(r_temp, r_temp, 0x3); | |
531 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, r_zero, l1); | |
532 | + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); | |
533 | + gen_set_label(l1); | |
534 | +} | |
535 | + | |
536 | +static inline void gen_tag_tv(TCGv src1, TCGv src2) | |
537 | +{ | |
538 | + int l1; | |
539 | + TCGv r_zero, r_temp; | |
540 | + | |
541 | + l1 = gen_new_label(); | |
542 | + r_zero = tcg_temp_new(TCG_TYPE_TL); | |
543 | + r_temp = tcg_temp_new(TCG_TYPE_TL); | |
544 | + tcg_gen_movi_tl(r_zero, 0); | |
545 | + tcg_gen_or_tl(r_temp, src1, src2); | |
546 | + tcg_gen_andi_tl(r_temp, r_temp, 0x3); | |
547 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, r_zero, l1); | |
548 | + gen_op_exception(TT_TOVF); | |
549 | + gen_set_label(l1); | |
550 | +} | |
551 | + | |
552 | +static inline void gen_op_add_T1_T0_cc(void) | |
553 | +{ | |
554 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]); | |
555 | + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
556 | + gen_cc_clear(); | |
557 | + gen_cc_NZ(cpu_T[0]); | |
558 | + gen_cc_C_add(cpu_T[0], cpu_cc_src); | |
559 | + gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_T[1]); | |
560 | +} | |
561 | + | |
562 | +static inline void gen_op_addx_T1_T0_cc(void) | |
563 | +{ | |
564 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]); | |
565 | + gen_mov_reg_C(cpu_tmp0, cpu_psr); | |
566 | + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
567 | + gen_cc_clear(); | |
568 | + gen_cc_C_add(cpu_T[0], cpu_cc_src); | |
569 | + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
570 | + gen_cc_C_add(cpu_T[0], cpu_cc_src); | |
571 | + gen_cc_NZ(cpu_T[0]); | |
572 | + gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_T[1]); | |
573 | +} | |
574 | + | |
575 | +static inline void gen_op_tadd_T1_T0_cc(void) | |
576 | +{ | |
577 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]); | |
578 | + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
579 | + gen_cc_clear(); | |
580 | + gen_cc_NZ(cpu_T[0]); | |
581 | + gen_cc_C_add(cpu_T[0], cpu_cc_src); | |
582 | + gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_T[1]); | |
583 | + gen_cc_V_tag(cpu_cc_src, cpu_T[1]); | |
584 | +} | |
585 | + | |
586 | +static inline void gen_op_tadd_T1_T0_ccTV(void) | |
587 | +{ | |
588 | + gen_tag_tv(cpu_T[0], cpu_T[1]); | |
589 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]); | |
590 | + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
591 | + gen_add_tv(cpu_T[0], cpu_cc_src, cpu_T[1]); | |
592 | + gen_cc_clear(); | |
593 | + gen_cc_NZ(cpu_T[0]); | |
594 | + gen_cc_C_add(cpu_T[0], cpu_cc_src); | |
595 | +} | |
596 | + | |
597 | +/* old op: | |
598 | + if (src1 < T1) | |
599 | + env->psr |= PSR_CARRY; | |
600 | +*/ | |
601 | +static inline void gen_cc_C_sub(TCGv src1, TCGv src2) | |
602 | +{ | |
603 | + int l1; | |
604 | + | |
605 | + l1 = gen_new_label(); | |
606 | + tcg_gen_brcond_i32(TCG_COND_GEU, src1, src2, l1); | |
607 | + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY); | |
608 | + gen_set_label(l1); | |
609 | +#ifdef TARGET_SPARC64 | |
610 | + { | |
611 | + int l2; | |
612 | + | |
613 | + l2 = gen_new_label(); | |
614 | + tcg_gen_brcond_tl(TCG_COND_GEU, src1, src2, l2); | |
615 | + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY); | |
616 | + gen_set_label(l2); | |
617 | + } | |
618 | +#endif | |
619 | +} | |
620 | + | |
621 | +/* old op: | |
622 | + if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) | |
623 | + env->psr |= PSR_OVF; | |
624 | +*/ | |
625 | +static inline void gen_cc_V_sub(TCGv dst, TCGv src1, TCGv src2) | |
626 | +{ | |
627 | + TCGv r_temp, r_temp2, r_temp3, r_zero; | |
628 | + int l1; | |
629 | + | |
630 | + l1 = gen_new_label(); | |
631 | + | |
632 | + r_temp = tcg_temp_new(TCG_TYPE_TL); | |
633 | + r_temp2 = tcg_temp_new(TCG_TYPE_TL); | |
634 | + r_temp3 = tcg_temp_new(TCG_TYPE_TL); | |
635 | + r_zero = tcg_temp_new(TCG_TYPE_TL); | |
636 | + tcg_gen_movi_tl(r_zero, 0); | |
637 | + tcg_gen_xor_tl(r_temp, src1, src2); | |
638 | + tcg_gen_xor_tl(r_temp2, src1, dst); | |
639 | + tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
640 | + tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31)); | |
641 | + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1); | |
642 | + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); | |
643 | + gen_set_label(l1); | |
644 | +#ifdef TARGET_SPARC64 | |
645 | + { | |
646 | + int l2; | |
647 | + | |
648 | + l2 = gen_new_label(); | |
649 | + tcg_gen_movi_tl(r_zero, 0); | |
650 | + tcg_gen_xor_tl(r_temp, src1, src2); | |
651 | + tcg_gen_xor_tl(r_temp2, src1, dst); | |
652 | + tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
653 | + tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63)); | |
654 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2); | |
655 | + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF); | |
656 | + gen_set_label(l2); | |
657 | + } | |
658 | +#endif | |
659 | +} | |
660 | + | |
661 | +static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2) | |
662 | +{ | |
663 | + TCGv r_temp, r_temp2, r_temp3, r_zero; | |
664 | + int l1; | |
665 | + | |
666 | + l1 = gen_new_label(); | |
667 | + | |
668 | + r_temp = tcg_temp_new(TCG_TYPE_TL); | |
669 | + r_temp2 = tcg_temp_new(TCG_TYPE_TL); | |
670 | + r_temp3 = tcg_temp_new(TCG_TYPE_TL); | |
671 | + r_zero = tcg_temp_new(TCG_TYPE_TL); | |
672 | + tcg_gen_movi_tl(r_zero, 0); | |
673 | + tcg_gen_xor_tl(r_temp, src1, src2); | |
674 | + tcg_gen_xor_tl(r_temp2, src1, dst); | |
675 | + tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
676 | + tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31)); | |
677 | + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1); | |
678 | + gen_op_exception(TT_TOVF); | |
679 | + gen_set_label(l1); | |
680 | +#ifdef TARGET_SPARC64 | |
681 | + { | |
682 | + int l2; | |
683 | + | |
684 | + l2 = gen_new_label(); | |
685 | + tcg_gen_movi_tl(r_zero, 0); | |
686 | + tcg_gen_xor_tl(r_temp, src1, src2); | |
687 | + tcg_gen_xor_tl(r_temp2, src1, dst); | |
688 | + tcg_gen_and_tl(r_temp, r_temp, r_temp2); | |
689 | + tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63)); | |
690 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2); | |
691 | + gen_op_exception(TT_TOVF); | |
692 | + gen_set_label(l2); | |
693 | + } | |
694 | +#endif | |
695 | +} | |
696 | + | |
697 | +static inline void gen_op_sub_T1_T0_cc(void) | |
698 | +{ | |
699 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]); | |
700 | + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
701 | + gen_cc_clear(); | |
702 | + gen_cc_NZ(cpu_T[0]); | |
703 | + gen_cc_C_sub(cpu_cc_src, cpu_T[1]); | |
704 | + gen_cc_V_sub(cpu_T[0], cpu_cc_src, cpu_T[1]); | |
705 | +} | |
706 | + | |
707 | +static inline void gen_op_subx_T1_T0_cc(void) | |
708 | +{ | |
709 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]); | |
710 | + gen_mov_reg_C(cpu_tmp0, cpu_psr); | |
711 | + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
712 | + gen_cc_clear(); | |
713 | + gen_cc_C_sub(cpu_T[0], cpu_cc_src); | |
714 | + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
715 | + gen_cc_C_sub(cpu_T[0], cpu_cc_src); | |
716 | + gen_cc_NZ(cpu_T[0]); | |
717 | + gen_cc_V_sub(cpu_T[0], cpu_cc_src, cpu_T[1]); | |
718 | +} | |
719 | + | |
720 | +static inline void gen_op_tsub_T1_T0_cc(void) | |
721 | +{ | |
722 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]); | |
723 | + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
724 | + gen_cc_clear(); | |
725 | + gen_cc_NZ(cpu_T[0]); | |
726 | + gen_cc_C_sub(cpu_cc_src, cpu_T[1]); | |
727 | + gen_cc_V_sub(cpu_T[0], cpu_cc_src, cpu_T[1]); | |
728 | + gen_cc_V_tag(cpu_cc_src, cpu_T[1]); | |
729 | +} | |
730 | + | |
731 | +static inline void gen_op_tsub_T1_T0_ccTV(void) | |
732 | +{ | |
733 | + gen_tag_tv(cpu_T[0], cpu_T[1]); | |
734 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]); | |
735 | + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
736 | + gen_sub_tv(cpu_T[0], cpu_cc_src, cpu_T[1]); | |
737 | + gen_cc_clear(); | |
738 | + gen_cc_NZ(cpu_T[0]); | |
739 | + gen_cc_C_sub(cpu_cc_src, cpu_T[1]); | |
740 | +} | |
741 | + | |
742 | +static inline void gen_op_div_cc(void) | |
743 | +{ | |
744 | + int l1; | |
745 | + TCGv r_zero; | |
746 | + | |
747 | + gen_cc_clear(); | |
748 | + gen_cc_NZ(cpu_T[0]); | |
749 | + l1 = gen_new_label(); | |
750 | + r_zero = tcg_temp_new(TCG_TYPE_TL); | |
751 | + tcg_gen_movi_tl(r_zero, 0); | |
752 | + tcg_gen_brcond_i32(TCG_COND_EQ, cpu_T[1], r_zero, l1); | |
753 | + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); | |
754 | + gen_set_label(l1); | |
755 | +} | |
756 | + | |
757 | +static inline void gen_op_logic_T0_cc(void) | |
758 | +{ | |
759 | + gen_cc_clear(); | |
760 | + gen_cc_NZ(cpu_T[0]); | |
761 | +} | |
762 | + | |
359 | 763 | // 1 |
360 | 764 | static inline void gen_op_eval_ba(TCGv dst) |
361 | 765 | { |
... | ... | @@ -789,14 +1193,13 @@ static inline void gen_cond(TCGv r_dst, unsigned int cc, unsigned int cond) |
789 | 1193 | { |
790 | 1194 | TCGv r_src; |
791 | 1195 | |
792 | - r_src = tcg_temp_new(TCG_TYPE_TL); | |
793 | 1196 | #ifdef TARGET_SPARC64 |
794 | 1197 | if (cc) |
795 | - tcg_gen_ld_i32(r_src, cpu_env, offsetof(CPUSPARCState, xcc)); | |
1198 | + r_src = cpu_xcc; | |
796 | 1199 | else |
797 | - tcg_gen_ld_i32(r_src, cpu_env, offsetof(CPUSPARCState, psr)); | |
1200 | + r_src = cpu_psr; | |
798 | 1201 | #else |
799 | - tcg_gen_ld_i32(r_src, cpu_env, offsetof(CPUSPARCState, psr)); | |
1202 | + r_src = cpu_psr; | |
800 | 1203 | #endif |
801 | 1204 | switch (cond) { |
802 | 1205 | case 0x0: |
... | ... | @@ -1170,15 +1573,6 @@ static inline void gen_op_fcmpeq(int fccno) |
1170 | 1573 | |
1171 | 1574 | #endif |
1172 | 1575 | |
1173 | -static inline void gen_op_exception(int exception) | |
1174 | -{ | |
1175 | - TCGv r_except; | |
1176 | - | |
1177 | - r_except = tcg_temp_new(TCG_TYPE_I32); | |
1178 | - tcg_gen_movi_i32(r_except, exception); | |
1179 | - tcg_gen_helper_0_1(raise_exception, r_except); | |
1180 | -} | |
1181 | - | |
1182 | 1576 | static inline void gen_op_fpexception_im(int fsr_flags) |
1183 | 1577 | { |
1184 | 1578 | tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fsr)); |
... | ... | @@ -2632,9 +3026,7 @@ static void disas_sparc_insn(DisasContext * dc) |
2632 | 3026 | if (xop & 0x10) |
2633 | 3027 | gen_op_addx_T1_T0_cc(); |
2634 | 3028 | else { |
2635 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, | |
2636 | - offsetof(CPUSPARCState, psr)); | |
2637 | - gen_mov_reg_C(cpu_tmp0, cpu_tmp0); | |
3029 | + gen_mov_reg_C(cpu_tmp0, cpu_psr); | |
2638 | 3030 | tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0); |
2639 | 3031 | tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
2640 | 3032 | } |
... | ... | @@ -2658,9 +3050,7 @@ static void disas_sparc_insn(DisasContext * dc) |
2658 | 3050 | if (xop & 0x10) |
2659 | 3051 | gen_op_subx_T1_T0_cc(); |
2660 | 3052 | else { |
2661 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, | |
2662 | - offsetof(CPUSPARCState, psr)); | |
2663 | - gen_mov_reg_C(cpu_tmp0, cpu_tmp0); | |
3053 | + gen_mov_reg_C(cpu_tmp0, cpu_psr); | |
2664 | 3054 | tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0); |
2665 | 3055 | tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
2666 | 3056 | } |
... | ... | @@ -4345,11 +4735,23 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model) |
4345 | 4735 | TCG_AREG0, offsetof(CPUState, t1), "T1"); |
4346 | 4736 | cpu_T[2] = tcg_global_mem_new(TCG_TYPE_TL, |
4347 | 4737 | TCG_AREG0, offsetof(CPUState, t2), "T2"); |
4738 | + cpu_xcc = tcg_global_mem_new(TCG_TYPE_I32, | |
4739 | + TCG_AREG0, offsetof(CPUState, xcc), | |
4740 | + "xcc"); | |
4348 | 4741 | #else |
4349 | 4742 | cpu_T[0] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG1, "T0"); |
4350 | 4743 | cpu_T[1] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG2, "T1"); |
4351 | 4744 | cpu_T[2] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG3, "T2"); |
4352 | 4745 | #endif |
4746 | + cpu_cc_src = tcg_global_mem_new(TCG_TYPE_TL, | |
4747 | + TCG_AREG0, offsetof(CPUState, cc_src), | |
4748 | + "cc_src"); | |
4749 | + cpu_cc_dst = tcg_global_mem_new(TCG_TYPE_TL, | |
4750 | + TCG_AREG0, offsetof(CPUState, cc_dst), | |
4751 | + "cc_dst"); | |
4752 | + cpu_psr = tcg_global_mem_new(TCG_TYPE_I32, | |
4753 | + TCG_AREG0, offsetof(CPUState, psr), | |
4754 | + "psr"); | |
4353 | 4755 | } |
4354 | 4756 | |
4355 | 4757 | cpu_reset(env); | ... | ... |