Bruce Evans wrote:
I think the bug was the following:
subcc %foo, %bar, %g0 /* SPARC compare */
#APP
/* inline assembler of in_addword() here, which modifies the condition codes */
#NO_APP
bpl $somewhere /* condition branch depending on condition code */

Is the non-#APP part all from C code?

Yes, this is an example what happend here: The compiler moved an assembler block between code generated from C. The C code uses the condition codes, but the assembler code destroys the contents. This happens, when "cc" is not in the clobber list, because the C compiler (correctly) assumes that the assembler code does not modify the condition codes.

Certainly if gcc wants to put asm block in the middle of generated code, then
it needs to know all the clobbers.

Exactly. It's always a good idea not to lie to your compiler. (:

% %  For reasons similar to those described above, it is not possible to
                                                 ^^^^^^^^^^^^^^^^^^^^^
% give an assembler instruction access to the condition code left by
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
% previous instructions.
  ^^^^^^^^^^^^^^^^^^^^^^

I think the excerpt does not apply here, because the problem is the other way round (inline assembler interrupting C, not C interrupting multiple inline assembler blocks), see above.

Yes, it doesn't apply to any asm code wrapped in inline functions (except
to the internals of the functions).  No one would expect an inline function
to return results in the condition codes.

This is not about returing values in condition codes or inline functions. It is about an assembler block, which simply destroys the contents of the condition codes and the compiler not expecting this (because nobody told it).

On i386, specifying cc has no effect (the compiler must always assume that
cc is clobbered), and specifying cc in asms is a style bug in FreeBSD.

I have to disagree. Where does the GCC documentation state, that "cc" has no effect on x86? It is the other way round: The compiler assumes, the condition codes are *not* modified, if it is not explicitely stated. Exactly this caused the bug (though here on SPARC), which was tried to be solved by volatile. I still am convinced that specifying "cc" in the clobber list and not using volatile is the correct solution. If it is a style bug to specify "cc", the style should be changed, otherwise you cannot use inline assembler correctly.

Well, in gcc-1.40, gcc.info says nothing about "cc", apparently because
"cc" didn't exist in gcc-1.40.  gcc-1.40 had to assume that cc was
always clobbered.  I think there are enough old i386 asm statements

GCC 1.4? Would you please bury this corpse again? It smells. (;

around (e.g., almost all in FreeBSD and many in Linux) for gcc to preserve
compatiblity by not changing its assumption (for insignificant benefits

I've seen quite a bit assembler code break when going from 3.x to 4.x, because GCC moves assembler blocks more while scheduling and takes the given in/out constraints much more seriously.

since gcc doesn't really understand cc in asms).  (Linux-2.6.10/include/

It's not about "understanding cc in asms", it's just about telling GCC that the "cc" does not survive the assembler block undamaged.

asm-i386/*.h has 177 __asm__ statements (133 with volatile) with only
11 "cc"'s.  Examples of ones without "cc"'s are everything in string.h,
where things like scasb for strcmp() normally clobber "cc".)

Newer versions of gcc.info have to say to use it in clobber lists, to
support CPUs with a shorter history than i386 and to prepare for changing
the assumptions on i386.

Three fourth of the assembler statements needing volatile seems way to high to me. I did not find the strcmp() implementation, which uses scasb. I only found strcmp.S, which is not inline assembler and does not use scas either, which would have suprised me (nor cmpsb, which would be more logical).

Regards
        Christoph
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to