It's also has a race condition. Please see https://lore.kernel.org/qemu-devel/20221206041715.314209-18-richard.hender...@linaro.org/
r~ On Thu, 15 Dec 2022, 13:33 Michael Tokarev, <m...@tls.msk.ru> wrote: > 04.10.2022 22:52, Richard Henderson wrote: > > From: Leandro Lupori <leandro.lup...@eldorado.org.br> > > > > PowerPC64 processors handle direct branches better than indirect > > ones, resulting in less stalled cycles and branch misses. > > > > However, PPC's tb_target_set_jmp_target() was only using direct > > branches for 16-bit jumps, while PowerPC64's unconditional branch > > instructions are able to handle displacements of up to 26 bits. > > To take advantage of this, now jumps whose displacements fit in > > between 17 and 26 bits are also converted to direct branches. > > > > Reviewed-by: Richard Henderson <richard.hender...@linaro.org> > > Signed-off-by: Leandro Lupori <leandro.lup...@eldorado.org.br> > > [rth: Expanded some commentary.] > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > > --- > > tcg/ppc/tcg-target.c.inc | 119 +++++++++++++++++++++++++++++---------- > > 1 file changed, 88 insertions(+), 31 deletions(-) > > > > diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc > > index 1cbd047ab3..e3dba47697 100644 > > --- a/tcg/ppc/tcg-target.c.inc > > +++ b/tcg/ppc/tcg-target.c.inc > ... > > > + /* > > + * There's no convenient way to get the compiler to allocate a pair > > + * of registers at an even index, so copy into r6/r7 and clobber. > > + */ > > + asm("mr %%r6, %1\n\t" > > + "mr %%r7, %2\n\t" > > + "stq %%r6, %0" > > + : "=Q"(*(__int128 *)rw) : "r"(p[0]), "r"(p[1]) : "r6", "r7"); > > This is the only place in qemu where __int128 is used (other places name > it __int128_t), and is used *unconditionally*. Is it right? > > In particular, this breaks compilation on powerpc: > > cc -m32 -Ilibqemu-aarch64-softmmu.fa.p... -c ../../tcg/tcg.c > In file included from ../../tcg/tcg.c:432: > /<<PKGBUILDDIR>>/tcg/ppc/tcg-target.c.inc: In function ‘ppc64_replace4’: > /<<PKGBUILDDIR>>/tcg/ppc/tcg-target.c.inc:1885:18: error: expected > expression before ‘__int128’ > 1885 | : "=Q"(*(__int128 *)rw) : "r"(p[0]), "r"(p[1]) : "r6", > "r7"); > | ^~~~~~~~ > /<<PKGBUILDDIR>>/tcg/ppc/tcg-target.c.inc:1885:29: error: expected ‘)’ > before ‘rw’ > 1885 | : "=Q"(*(__int128 *)rw) : "r"(p[0]), "r"(p[1]) : "r6", > "r7"); > | ~ ^~ > > Thanks, > > /mjt >