On Saturday 30 April 2005 12:10, David Woodhouse wrote:
> GCC 4 occasionally generates functions with the 'blr' somewhere in the
> middle and a branch at the end.
>
> --- qemu-0.7.0/dyngen.c.orig  2005-04-30 11:59:05.000000000 +0100
> +++ qemu-0.7.0/dyngen.c       2005-04-30 12:00:11.000000000 +0100
> @@ -1396,11 +1395,13 @@ void gen_code(const char *name, host_ulo
>  #elif defined(HOST_PPC)
>      {
>          uint8_t *p;
> +        uint32_t insn;
>          p = (void *)(p_end - 4);
>          if (p == p_start)
>              error("empty code for %s", name);
> -        if (get32((uint32_t *)p) != 0x4e800020)
> -            error("blr expected at the end of %s", name);
> +        insn = get32((uint32_t *)p);
> +        if (insn != 0x4e800020 && (insn & 0xfc000002) != 0x48000000)
> +            error("blr or b expected at the end of %s", name);
>          copy_size = p - p_start;
>      }
>  #elif defined(HOST_S390)

This is not correct.
If the blr is not at the end of the function, things will break.
dyngen assumes the last instruction is the only return instruction in the 
function. This allows it to remove the blr insn and concatenate multiple 
functions together.

This basically only ever worked because gcc could be coerced into generating 
relatively simple code. GCC4 contains much more aggressive high level 
optimizers, so this is no longer possible.

Paul


_______________________________________________
Qemu-devel mailing list
Qemu-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/qemu-devel

Reply via email to