Why would the following line in C:
XRAM00 |= 0x01;
compile into this:
mov dptr, #XRAM00 movx a, @dptr mov r7, a mov a, r7 orl a, #1 mov r7, a mov dptr, #XRAM00 mov a, r7 movx @dptr, a
I would have expected this:
mov dptr, #XRAM00 movx a, @dptr orl a, #1 movx @dptr, a
done to make the optimizer shine :)
Imagine you're a compiler. You see the statement
So you think to yourself, "Fine. Let's break that down."
load XRAM00 Or with 0x01 Store XRAM00
1. Load XRAM00. Hm, need a register for the temporary. R7 is free. So load XRAM00 into R7. XRAM00 is in xdata. That means I have to use the DPTR and go through the accumulator. Grumble, grumble, stupid 8051 architecture, grumble.
mov dtpr, #XRAM00 movx a, @dptr mov r7, a
Well, there's that step done.
2. Or with 0x01. Hm, where'd I leave that temporary. That's right, R7. I can't OR directly in a register, so I'll have to use the accumulator and put it back when I'm done. Grumble, grumble, stupid 8051 architecture, grumble.
mov a, r7 orl a, #1 mov r7, a
3. It was an |=, so I've got to save the temp back to allocated storage. That's in xdata. That means I have to use the DTPR and go through the accumulator. Grumble, grumble, stupid 8051 architecture, grumble.
mov dptr, #XRAM00 mov a, r7 movx @dptr, a
Finally, all done.
In short, it's exactly how most code geneators for most compilers work. Compilers have optimizers not because they have brilliant insight into the problem and can magically make the code smaller. (That's your job.) Compilers have optimizers because basic code generation is generally very focussed, even short-sighted. And it turns out it's a lot easier to generate code that's correct, if inefficient, and then optimize away inefficiency than it is to try to write a code generator that is smarter in the first place. It's a form of modularity; the code generator is responsible for semantics, the optimizer for getting rid of the silliness that occurs when you don't pay global attention to that sort of thing.
Thanks, Drew. Although I don't LIKE your answer (grumble, grumble), it makes perfect sense. Now, can I convince the optimizer to clean up this mess???
So perhaps we should just call the compiler "Marvin"...?
Thanks for the description, Drew: I'd have guessed it'd be something like that, but you've done the full expose.
Great!
(Thinks: need to bookmark this thread for next time the question comes up...)
Now, can I convince the optimizer to clean up this mess??? I believe so, but goodby debugging.
I wish Keil would make an optimize selection (number) that would remove the crap (no jmp@ for 'switch' and no infernal r7,a a,r7) without 'merging execution strings'. Of course, a very much better way would be to do that directly in the compiler.
I STILL can not imagine why that has to be done by the optimizer, the compiler would be perfectly capable of doing so.
SO, I repeat my suspicion: many things that could be done in the compiler are done in the optimizer, just to make the optimizer more impressive.
Erik
And it turns out it's a lot easier to generate code that's correct, if inefficient, and then optimize away inefficiency than it is to try to write a code generator that is smarter in the first place. It's a form of modularity; the code generator is responsible for semantics, the optimizer for getting rid of the silliness that occurs when you don't pay global attention to that sort of thing
as to my post above and this
that "it's a lot easier ..." does not, in any way, hinder that what I described could be done by the compiler, maybe do compile - do optimize, instead of "compile to optimal", but that would not make any difference to the user.
Then, of course an optimizer would be needed to optimize after linking (e.g. combine identical execution strings in different modules for those that do not care about debugging).
OK, now my newbie status becomes blatantly apparent: I had the optimization level set to 9 for the PROJECT, but set to 0 for the individual C files. Oops...
This explains why my disassembled file looked less-than-optimized.
I wish Keil would make an optimize selection (number) that would remove the crap (no jmp@ for 'switch' and no infernal r7,a a,r7) without 'merging execution strings'.
What is an 'execution string'?
Maybe "instruction sequence"?
Don't you ever get tired? Get a life!
A hangman's noose, perhaps?
What is an 'execution string'? just one more of the smoked sardines refusal to understand things that are not written in HIS vernacular. I do not know if the phrase 'execution string' is in his beloved C standard, but if sosmeone say 'car' I have no problem thinking 'automobile'.
Maybe "instruction sequence"? yes, that would be another way to say it
A hangman's noose, perhaps? :) :) :)
just one more of the smoked sardines refusal to understand things that are not written in HIS vernacular.
Quite the opposite, actually. I'm trying my best to understand the things you write in your vernacular.
I do not know if the phrase 'execution string' is in his beloved C standard, but if sosmeone say 'car' I have no problem thinking 'automobile'.
No, the 'C' standard says nothing about 'execution strings'. However, this isn't a 'C' issue so I'm unclear why you bring the 'C' standard into the discussion.
It is most commendable that you can translate between english and american, fortunately I am fairly proficient in that area as well. However, I do not speak 'Erik' very fluently so I asked for a translation which will allow me to understand the problem you have with optimisation of switch/case constructs.
There are many advantages of using standard terminology in an engineering environment not least of which is the fact that others will actually understand what you are talking about. You are forever critical of others for using abbreviations that you don't understand, perhaps you could make the effort not to do the same.
Ok, but how about telling us the correct way to say it?
I asked for some clarification of the problem. That seems a pretty reasonable thing to do in a discussion forum.
I asked for a translation which will allow me to understand the problem you have with optimisation of switch/case constructs. do you actually want to help? that is a new one. my 'problem' I just hate inefficiencies, with the "switch/case constructs" is that you can not get it without the debugger killer (I can not tell you what that is till you answer the question below since I am dead tired of your nitpicking.
'execution string' "instruction sequence"? .... Ok, but how about telling us the correct way to say it? if none of the above is 'correct' enough for you, then, instead of bitching, post what is 'correct' enough for you. I have no idea whatsoever what problem (besides a personal one) you have with either of the two expressions above.
if none of the above is 'correct' enough for you, then, instead of bitching, post what is 'correct' enough for you.
I can't post what is correct because I don't know what you are trying to say. That is why I keep asking you to rephrase it in commonly accepted terminology.
This is what you said:
It would appear that your expression 'merging execution strings' is a reference to some method of optimisation. What is it in commonly accepted terminology?
I have no idea whatsoever what problem (besides a personal one) you have with either of the two expressions above.
My problem is that I do not understand what 'merging execution strings' is supposed to mean. That is why I keep asking you to rephrase it in commonly accepted terminology.