Hi, On Fri, 18 Jan 2008, Michael Matz wrote:
> [answering to a forwarded mail, hence breaking thread, sorry] > [and keep me CCed :) ] Sorry, I never break Cc: list, but always reply-to-all. > On Fri, 18 Jan 2008, Alexander Graf wrote: > > > >On Fri, 18 Jan 2008, Johannes Schindelin wrote: > > > > > > >On Thu, 17 Jan 2008, consul wrote: > > > > > > > > >It broke mingw build with gcc-3.4.2 > > > > > > > >Now that's funny, since the last incarnation Alexander should have > > > >_exactly_ the same code as before for gcc < 4. Are you sure that > > > >you do not have applied the patch that exchanges at least one > > > >"#ifdef HOST_I386" for "#ifdef GCC_BREAKS_T_REGISTER"? > > > > > >Okay, I see it, too. Seems this is the culprit: > > > > > >-- snip -- > > >diff --git a/softmmu_header.h b/softmmu_header.h > > >index 80eefa8..7e4bc03 100644 > > >--- a/softmmu_header.h > > >+++ b/softmmu_header.h > > >@@ -209,7 +215,11 @@ static inline void glue(glue(st, SUFFIX), > > >MEMSUFFIX)(target_ulong ptr, RES_TYPE > > > : "r" (ptr), > > >/* NOTE: 'q' would be needed as constraint, but we could not use it > > > with T1 ! */ > > >+#if DATA_SIZE == 1 || DATA_SIZE == 2 > > >+ "q" (v), > > >+#else > > > "r" (v), > > >+#endif > > > "i" ((CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS), > > > "i" (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS), > > > "i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)), > > >-- snap -- > > > > > >Michael, Alexander, what is this hunk supposed to do? > > This is required to generate valid assembler code. Without that hunk, the > interesting parts of the asm look like so (for DATA_SIZE == 1): > > asm (" ... movzbl %b1, %%edx\n ... " : : "r" (blubb), "r" (bla) ); Okay, but this only concerns gcc4, apparently. Can't we guard it with yet another "defined(GCC...)"? > I.e. an instruction which requires a byte register in operand 1. Now > constraint "r" only guarantees a free integer register, including e.g. > %edi, for which no low 8bit part exists (on i386). The constraints have > to match the use in the asm template, so in this case must mention an > integer register for which low parts are constructible, %eax,%ebx,%ecx > or %edx, i.e. constraint "q". > > The comment above this constraint is true in the sense that T1 (== AREG2 > == %esi on i386) can not be used in this operand for DATA_SIZE being 1 or > 2. But if it were ever used before the patch in that place it would have > generated invalid assembler code already, and as it didn't the conclusion > must be, that T1 simply isn't used with this datasize. So the comment is > true, but harmless (especially if T1 is defined to env->t1, instead of > AREG2 to reduce register pressure). What problems do you have with this > hunk? The problem is as described: c:/qemu/target-i386/ops_mem.h: In function `op_stw_kernel_T1_A0': ../softmmu_header.h:174: error: can't find a register in class `Q_REGS' while reloading `asm' For details, please see http://article.gmane.org/gmane.comp.emulators.qemu/22743 Ciao, Dscho