On 2006-07-03, Roberto Padovani <[email protected]> wrote:
> but in this case, reading the C source code, I honestly can't
> understand for sure what it meant....
What it "meant" is irrelevent. There are rules that state
quite specifically how C source code is to be translated into
machine operations. For one of the cases under discussion the
compiler broke those rules.
> if I were to translate manually that code into asm, I would
> have asked a clarification to the programmer: did you want to
> sample twice the port and then add these two samples ? (say
> for making an average) or did you want two sample the port
> once and double that reading ?
What the programmer wants is irrelevent. The compiler is
required to do what the programmer _wrote_.
> IMHO the answer wasn't clear, even if I considered all the
> volatile qualifiers;
You're right, the answer isn't clear. But, the question you're
asking isn't material. The compiler is required to generate
code from what the programmer wrote by following a specified
set of rules. What the programmer wanted or meant just doesn't
matter.
> so I wouldn't try to add another complicated rule to gcc,
Nobody's attempting to "add another compilcated rule to gcc.
The problem is that gcc isn't following an existing rule. And
it _appears_ to be a bug specific to the MSP430 port.
> but I would rather write a better C code...an unambiguous one
The C code is unambiguous according the rules of the C
language. Compilers have to generate correct code for valid
input -- regardless of how "good" or "bad" that input is.
> that the "simple" rules of any compiler can understand.
When writing a compiler, you're not supposed to change the
rules of C. The input code was not ambiguous: it specified
that the variable P6IN was to be read exactly twice.
> for sampling twice: x = P6IN; x += P6IN;
> for doubling the sampling: x = P6IN * 2;
>
> the compiler won't mistake.
If the compiler is free to break the rules, how do I know that
either of your two examples will generate correct code?
> By the way, I think it's also better to change your initial
> example:
>
> unsigned two;
> void foo(void)
> {
> two = P6IN + P6IN;
> }
>
> into:
>
> unsigned two;
>
> void foo(void)
> unsigned int tmp;
> {
> tmp = P6IN + P6IN; // <----- tmp = 2 * P6IN; // <----- tmp =
> P6IN; tmp+= P6IN;
> two = tmp;
> }
>
> or even better a function. it's more efficient (and easier to compile)
> if you make the calculations through local variables.
I've no clue what you're talking about. That doesn't even look
like valid C code to me.
--
Grant Edwards grante Yow! Is the EIGHTIES
at when they had ART DECO
visi.com and GERALD McBOING-BOING
lunch boxes??