On Sun, 6 Dec 2009, Andreas Faerber wrote: > Darwin/ppc64 does not use function descriptors, > adapt prologue and tcg_out_call accordingly. > GPR2 is available for general use, so let's use it. > > http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/LowLevelABI/110-64-bit_PowerPC_Function_Calling_Conventions/64bitPowerPC.html > > Signed-off-by: Andreas Faerber <andreas.faer...@web.de> > Cc: malc <av1...@comtv.ru> > --- > tcg/ppc64/tcg-target.c | 30 ++++++++++++++++++++++++++++++ > 1 files changed, 30 insertions(+), 0 deletions(-) > > diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c > index a612e10..bf9b7d9 100644 > --- a/tcg/ppc64/tcg-target.c > +++ b/tcg/ppc64/tcg-target.c > @@ -104,6 +104,9 @@ static const int tcg_target_reg_alloc_order[] = { > TCG_REG_R29, > TCG_REG_R30, > TCG_REG_R31, > +#ifdef __APPLE__ > + TCG_REG_R2, > +#endif > TCG_REG_R3, > TCG_REG_R4, > TCG_REG_R5, > @@ -112,7 +115,9 @@ static const int tcg_target_reg_alloc_order[] = { > TCG_REG_R8, > TCG_REG_R9, > TCG_REG_R10, > +#ifndef __APPLE__ > TCG_REG_R11, > +#endif > TCG_REG_R12, > TCG_REG_R24, > TCG_REG_R25, > @@ -136,6 +141,10 @@ static const int tcg_target_call_oarg_regs[2] = { > }; > > static const int tcg_target_callee_save_regs[] = { > +#ifdef __APPLE__ > + TCG_REG_R11, > + TCG_REG_R13, > +#endif
No need to add R13, it's reserved anyhow. > TCG_REG_R14, > TCG_REG_R15, > TCG_REG_R16, > @@ -477,8 +486,21 @@ static void tcg_out_movi (TCGContext *s, TCGType type, > } > } > > +#ifdef __APPLE__ > +static void tcg_out_b (TCGContext *s, int mask, tcg_target_long target); > +#endif > + > static void tcg_out_call (TCGContext *s, tcg_target_long arg, int const_arg) > { > +#ifdef __APPLE__ > + if (const_arg) { > + tcg_out_b (s, LK, arg); > + } > + else { > + tcg_out32 (s, MTSPR | RS (arg) | LR); > + tcg_out32 (s, BCLR | BO_ALWAYS | LK); > + } > +#else > int reg; > > if (const_arg) { > @@ -492,6 +514,7 @@ static void tcg_out_call (TCGContext *s, tcg_target_long > arg, int const_arg) > tcg_out32 (s, LD | RT (11) | RA (reg) | 16); > tcg_out32 (s, LD | RT (2) | RA (reg) | 8); > tcg_out32 (s, BCCTR | BO_ALWAYS | LK); > +#endif > } > > static void tcg_out_ldst (TCGContext *s, int ret, int addr, > @@ -859,10 +882,12 @@ void tcg_target_qemu_prologue (TCGContext *s) > ; > frame_size = (frame_size + 15) & ~15; > > +#ifndef __APPLE__ > /* First emit adhoc function descriptor */ > addr = (uint64_t) s->code_ptr + 24; > tcg_out32 (s, addr >> 32); tcg_out32 (s, addr); /* entry point */ > s->code_ptr += 16; /* skip TOC and environment pointer */ > +#endif > > /* Prologue */ > tcg_out32 (s, MFSPR | RT (0) | LR); The frame format is different to that of PPC-elf64abi, shouldn't really make a difference here, then again i don't have access to PPC64 Mac OSX, so can't really verify that. > @@ -1516,6 +1541,9 @@ void tcg_target_init (TCGContext *s) > tcg_regset_set32 (tcg_target_available_regs[TCG_TYPE_I64], 0, > 0xffffffff); > tcg_regset_set32 (tcg_target_call_clobber_regs, 0, > (1 << TCG_REG_R0) | > +#ifdef __APPLE__ > + (1 << TCG_REG_R2) | > +#endif > (1 << TCG_REG_R3) | > (1 << TCG_REG_R4) | > (1 << TCG_REG_R5) | > @@ -1531,7 +1559,9 @@ void tcg_target_init (TCGContext *s) > tcg_regset_clear (s->reserved_regs); > tcg_regset_set_reg (s->reserved_regs, TCG_REG_R0); > tcg_regset_set_reg (s->reserved_regs, TCG_REG_R1); > +#ifndef __APPLE__ > tcg_regset_set_reg (s->reserved_regs, TCG_REG_R2); > +#endif > tcg_regset_set_reg (s->reserved_regs, TCG_REG_R13); > > #ifdef CONFIG_USE_GUEST_BASE > Otherwise looks good.. Should i commit it with R13 fixed? -- mailto:av1...@comtv.ru