Revision a69abbe0

b/tcg/ppc64/tcg-target.c
773 773
void tcg_target_qemu_prologue (TCGContext *s)
774 774
{
775 775
    int i, frame_size;
776
    uint64_t addr;
776 777

  
777 778
    frame_size = 0
778 779
        + 8                     /* back chain */
......
786 787
        ;
787 788
    frame_size = (frame_size + 15) & ~15;
788 789

  
790
    /* First emit adhoc function descriptor */
791
    addr = (uint64_t) s->code_ptr + 24;
792
    tcg_out32 (s, addr >> 32); tcg_out32 (s, addr); /* entry point */
793
    s->code_ptr += 16;          /* skip TOC and environment pointer */
794

  
795
    /* Prologue */
789 796
    tcg_out32 (s, MFSPR | RT (0) | LR);
790 797
    tcg_out32 (s, STDU | RS (1) | RA (1) | (-frame_size & 0xffff));
791 798
    for (i = 0; i < ARRAY_SIZE (tcg_target_callee_save_regs); ++i)
......
796 803
                       )
797 804
            );
798 805
    tcg_out32 (s, STD | RS (0) | RA (1) | (frame_size + 20));
799
    tcg_out32 (s, STD | RS (2) | RA (1) | (frame_size + 40));
800 806

  
801 807
    tcg_out32 (s, MTSPR | RS (3) | CTR);
802 808
    tcg_out32 (s, BCCTR | BO_ALWAYS);
809

  
810
    /* Epilogue */
803 811
    tb_ret_addr = s->code_ptr;
804 812

  
805 813
    for (i = 0; i < ARRAY_SIZE (tcg_target_callee_save_regs); ++i)
......
810 818
                       )
811 819
            );
812 820
    tcg_out32 (s, LD | RT (0) | RA (1) | (frame_size + 20));
813
    tcg_out32 (s, LD | RT (2) | RA (1) | (frame_size + 40));
814 821
    tcg_out32 (s, MTSPR | RS (0) | LR);
815 822
    tcg_out32 (s, ADDI | RT (1) | RA (1) | frame_size);
816 823
    tcg_out32 (s, BCLR | BO_ALWAYS);
b/tcg/tcg.h
413 413
uint64_t tcg_helper_remu_i64(uint64_t arg1, uint64_t arg2);
414 414

  
415 415
extern uint8_t code_gen_prologue[];
416
#ifdef __powerpc__
417
#ifdef __powerpc64__
418
#define tcg_qemu_tb_exec(tb_ptr)                                        \
419
    ({ unsigned long p;                                                 \
420
       asm volatile (                                                   \
421
         "mtctr %1\n\t"                                                 \
422
         "mr 3,%2\n\t"                                                  \
423
         "bctrl\n\t"                                                    \
424
         "mr %0,3\n\t"                                                  \
425
         : "=r" (p)                                                     \
426
         : "r" (code_gen_prologue), "r" (tb_ptr)                        \
427
         : "3", "4", "5", "6", "7", "8", "9", "10", "11", "12");        \
428
    p;                                                                  \
429
    })
430
#else
416
#if defined(__powerpc__) && !defined(__powerpc64__)
431 417
#define tcg_qemu_tb_exec(tb_ptr) \
432 418
    ((long REGPARM __attribute__ ((longcall)) (*)(void *))code_gen_prologue)(tb_ptr)
433
#endif
434 419
#else
435 420
#define tcg_qemu_tb_exec(tb_ptr) ((long REGPARM (*)(void *))code_gen_prologue)(tb_ptr)
436 421
#endif

Also available in: Unified diff