Revision 7487953d target-ppc/op.c
b/target-ppc/op.c | ||
---|---|---|
476 | 476 |
RETURN(); |
477 | 477 |
} |
478 | 478 |
|
479 |
/* XXX: factorise POWER rotates... */ |
|
480 |
void OPPROTO op_POWER_rlmi (void) |
|
481 |
{ |
|
482 |
T0 = rotl32(T0, T2) & PARAM1; |
|
483 |
T0 |= T1 & (uint32_t)PARAM2; |
|
484 |
RETURN(); |
|
485 |
} |
|
486 |
|
|
487 |
void OPPROTO op_POWER_rrib (void) |
|
488 |
{ |
|
489 |
T2 &= 0x1FUL; |
|
490 |
T0 = rotl32(T0 & INT32_MIN, T2); |
|
491 |
T0 |= T1 & ~rotl32(INT32_MIN, T2); |
|
492 |
RETURN(); |
|
493 |
} |
|
494 |
|
|
495 |
void OPPROTO op_POWER_sle (void) |
|
496 |
{ |
|
497 |
T1 &= 0x1FUL; |
|
498 |
env->spr[SPR_MQ] = rotl32(T0, T1); |
|
499 |
T0 = T0 << T1; |
|
500 |
RETURN(); |
|
501 |
} |
|
502 |
|
|
503 |
void OPPROTO op_POWER_sleq (void) |
|
504 |
{ |
|
505 |
uint32_t tmp = env->spr[SPR_MQ]; |
|
506 |
|
|
507 |
T1 &= 0x1FUL; |
|
508 |
env->spr[SPR_MQ] = rotl32(T0, T1); |
|
509 |
T0 = T0 << T1; |
|
510 |
T0 |= tmp >> (32 - T1); |
|
511 |
RETURN(); |
|
512 |
} |
|
513 |
|
|
514 |
void OPPROTO op_POWER_sllq (void) |
|
515 |
{ |
|
516 |
uint32_t msk = UINT32_MAX; |
|
517 |
|
|
518 |
msk = msk << (T1 & 0x1FUL); |
|
519 |
if (T1 & 0x20UL) |
|
520 |
msk = ~msk; |
|
521 |
T1 &= 0x1FUL; |
|
522 |
T0 = (T0 << T1) & msk; |
|
523 |
T0 |= env->spr[SPR_MQ] & ~msk; |
|
524 |
RETURN(); |
|
525 |
} |
|
526 |
|
|
527 |
void OPPROTO op_POWER_slq (void) |
|
528 |
{ |
|
529 |
uint32_t msk = UINT32_MAX, tmp; |
|
530 |
|
|
531 |
msk = msk << (T1 & 0x1FUL); |
|
532 |
if (T1 & 0x20UL) |
|
533 |
msk = ~msk; |
|
534 |
T1 &= 0x1FUL; |
|
535 |
tmp = rotl32(T0, T1); |
|
536 |
T0 = tmp & msk; |
|
537 |
env->spr[SPR_MQ] = tmp; |
|
538 |
RETURN(); |
|
539 |
} |
|
540 |
|
|
541 |
void OPPROTO op_POWER_sraq (void) |
|
542 |
{ |
|
543 |
env->spr[SPR_MQ] = rotl32(T0, 32 - (T1 & 0x1FUL)); |
|
544 |
if (T1 & 0x20UL) |
|
545 |
T0 = UINT32_MAX; |
|
546 |
else |
|
547 |
T0 = (int32_t)T0 >> T1; |
|
548 |
RETURN(); |
|
549 |
} |
|
550 |
|
|
551 |
void OPPROTO op_POWER_sre (void) |
|
552 |
{ |
|
553 |
T1 &= 0x1FUL; |
|
554 |
env->spr[SPR_MQ] = rotl32(T0, 32 - T1); |
|
555 |
T0 = (int32_t)T0 >> T1; |
|
556 |
RETURN(); |
|
557 |
} |
|
558 |
|
|
559 |
void OPPROTO op_POWER_srea (void) |
|
560 |
{ |
|
561 |
T1 &= 0x1FUL; |
|
562 |
env->spr[SPR_MQ] = T0 >> T1; |
|
563 |
T0 = (int32_t)T0 >> T1; |
|
564 |
RETURN(); |
|
565 |
} |
|
566 |
|
|
567 |
void OPPROTO op_POWER_sreq (void) |
|
568 |
{ |
|
569 |
uint32_t tmp; |
|
570 |
int32_t msk; |
|
571 |
|
|
572 |
T1 &= 0x1FUL; |
|
573 |
msk = INT32_MIN >> T1; |
|
574 |
tmp = env->spr[SPR_MQ]; |
|
575 |
env->spr[SPR_MQ] = rotl32(T0, 32 - T1); |
|
576 |
T0 = T0 >> T1; |
|
577 |
T0 |= tmp & msk; |
|
578 |
RETURN(); |
|
579 |
} |
|
580 |
|
|
581 |
void OPPROTO op_POWER_srlq (void) |
|
582 |
{ |
|
583 |
uint32_t tmp; |
|
584 |
int32_t msk; |
|
585 |
|
|
586 |
msk = INT32_MIN >> (T1 & 0x1FUL); |
|
587 |
if (T1 & 0x20UL) |
|
588 |
msk = ~msk; |
|
589 |
T1 &= 0x1FUL; |
|
590 |
tmp = env->spr[SPR_MQ]; |
|
591 |
env->spr[SPR_MQ] = rotl32(T0, 32 - T1); |
|
592 |
T0 = T0 >> T1; |
|
593 |
T0 &= msk; |
|
594 |
T0 |= tmp & ~msk; |
|
595 |
RETURN(); |
|
596 |
} |
|
597 |
|
|
598 |
void OPPROTO op_POWER_srq (void) |
|
599 |
{ |
|
600 |
T1 &= 0x1FUL; |
|
601 |
env->spr[SPR_MQ] = rotl32(T0, 32 - T1); |
|
602 |
T0 = T0 >> T1; |
|
603 |
RETURN(); |
|
604 |
} |
|
605 |
|
|
606 | 479 |
/* POWER instructions not implemented in PowerPC 601 */ |
607 | 480 |
#if !defined(CONFIG_USER_ONLY) |
608 | 481 |
void OPPROTO op_POWER_mfsri (void) |
Also available in: Unified diff