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