Revision 1f5063fb target-sparc/op.c

b/target-sparc/op.c
568 568
#endif
569 569

  
570 570
#ifdef TARGET_SPARC64
571
// This function uses non-native bit order
572
#define GET_FIELD(X, FROM, TO)                                  \
573
    ((X) >> (63 - (TO)) & ((1ULL << ((TO) - (FROM) + 1)) - 1))
574

  
575
// This function uses the order in the manuals, i.e. bit 0 is 2^0
576
#define GET_FIELD_SP(X, FROM, TO)               \
577
    GET_FIELD(X, 63 - (TO), 63 - (FROM))
578

  
579
void OPPROTO op_array8()
580
{
581
    T0 = (GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) |
582
        (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) |
583
        (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) |
584
        (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) |
585
        (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) |
586
        (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12);
587
}
588

  
589
void OPPROTO op_array16()
590
{
591
    T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) |
592
          (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) |
593
          (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) |
594
          (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) |
595
          (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) |
596
          (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 1;
597
}
598

  
599
void OPPROTO op_array32()
600
{
601
    T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) |
602
          (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) |
603
          (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) |
604
          (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) |
605
          (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) |
606
          (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 2;
607
}
608

  
609
void OPPROTO op_alignaddr()
610
{
611
    uint64_t tmp;
612

  
613
    tmp = T0 + T1;
614
    env->gsr &= ~7ULL;
615
    env->gsr |= tmp & 7ULL;
616
    T0 = tmp & ~7ULL;
617
}
618

  
619 571
void OPPROTO op_faligndata()
620 572
{
621 573
    uint64_t tmp;

Also available in: Unified diff