Revision 2bece2c8 tcg/tcg.c

b/tcg/tcg.c
560 560
    int real_args;
561 561
    int nb_rets;
562 562
    TCGArg *nparam;
563

  
564
#if defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64
565
    for (i = 0; i < nargs; ++i) {
566
        int is_64bit = sizemask & (1 << (i+1)*2);
567
        int is_signed = sizemask & (2 << (i+1)*2);
568
        if (!is_64bit) {
569
            TCGv_i64 temp = tcg_temp_new_i64();
570
            TCGv_i64 orig = MAKE_TCGV_I64(args[i]);
571
            if (is_signed) {
572
                tcg_gen_ext32s_i64(temp, orig);
573
            } else {
574
                tcg_gen_ext32u_i64(temp, orig);
575
            }
576
            args[i] = GET_TCGV_I64(temp);
577
        }
578
    }
579
#endif /* TCG_TARGET_EXTEND_ARGS */
580

  
563 581
    *gen_opc_ptr++ = INDEX_op_call;
564 582
    nparam = gen_opparam_ptr++;
565 583
#ifdef TCG_TARGET_I386
......
588 606
    real_args = 0;
589 607
    for (i = 0; i < nargs; i++) {
590 608
#if TCG_TARGET_REG_BITS < 64
591
        if (sizemask & (2 << i)) {
609
        int is_64bit = sizemask & (1 << (i+1)*2);
610
        if (is_64bit) {
592 611
#ifdef TCG_TARGET_I386
593 612
            /* REGPARM case: if the third parameter is 64 bit, it is
594 613
               allocated on the stack */
......
622 641
            *gen_opparam_ptr++ = args[i] + 1;
623 642
#endif
624 643
            real_args += 2;
625
        } else
626
#endif
627
        {
628
            *gen_opparam_ptr++ = args[i];
629
            real_args++;
644
            continue;
630 645
        }
646
#endif /* TCG_TARGET_REG_BITS < 64 */
647

  
648
        *gen_opparam_ptr++ = args[i];
649
        real_args++;
631 650
    }
632 651
    *gen_opparam_ptr++ = GET_TCGV_PTR(func);
633 652

  
......
637 656

  
638 657
    /* total parameters, needed to go backward in the instruction stream */
639 658
    *gen_opparam_ptr++ = 1 + nb_rets + real_args + 3;
659

  
660
#if defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64
661
    for (i = 0; i < nargs; ++i) {
662
        int is_64bit = sizemask & (1 << (i+1)*2);
663
        if (!is_64bit) {
664
            TCGv_i64 temp = MAKE_TCGV_I64(args[i]);
665
            tcg_temp_free_i64(temp);
666
        }
667
    }
668
#endif /* TCG_TARGET_EXTEND_ARGS */
640 669
}
641 670

  
642 671
#if TCG_TARGET_REG_BITS == 32

Also available in: Unified diff