hi i want to migrate from arm compiler 5 to 6
compiler 5 uses for following local variable a register (e.g. r0) register unsigned long len;
compiler 6 does not why? which keyword should i use therefore
A compiler's use of processor registers is an entirely internal matter of the specific implementation.
Why does this matter to you?
If it really does matter, then you should probably be writing in assembler - not a high-level language.
Hi not a really good answer! it is a matter of speed (variables in stackmem or in registers).
How can i force the c compiler 6 to use a register variables? Normally with the keyword "register" but the compiler 6 ignores this.
You can't!
As stated in the language specification, the 'register' keyword is merely a hint - the compiler is in no way obliged to take any notice of it.
Again, if you really need to do this kind of micro-optimisation, then you should be writing in assembler.
Have you looked at the optimisation settings provided by the compiler ?
http://www.keil.com/support/man/docs/armclang_ref/
www.keil.com/.../armclang_mig_Chunk745110769.htm
Hi thanx for the answer My problem is, that the support for compiler 5 will end in 2020. So for new projects i have to migrate to compiler 6. But the new compiler 6 creates a lot of inefficient code and the size of my image inreases from 530kb to 890kb (compiling with -O0 with C5 and C6)
Example: d = (unsigned long*)&Image$$ARM_LIB_STACK$$ZI$$Base; len = STACKSIZE >> 2; while (len--) *d++ = 0xCCCCCCCC;
C6 makes ER_CODE:80002C0A MOV R0, #0x2001C000 ER_CODE:80002C12 STR R0, [SP,#0xC+var_8] ER_CODE:80002C14 MOV R0, #0x4000 ER_CODE:80002C1C LSRS R0, R0, #2 ER_CODE:80002C1E STR R0, [SP,#0xC+var_C] ER_CODE:80002C20 B loc_80002C22 ER_CODE:80002C22 loc_80002C22 ER_CODE:80002C22 LDR R0, [SP,#0xC+var_C] ER_CODE:80002C24 SUBS R1, R0, #1 ER_CODE:80002C26 STR R1, [SP,#0xC+var_C] ER_CODE:80002C28 CMP R0, #0 ER_CODE:80002C2A BEQ loc_80002C3C ER_CODE:80002C2C B loc_80002C2E ER_CODE:80002C2E loc_80002C2E ER_CODE:80002C2E LDR R0, [SP,#0xC+var_8] ER_CODE:80002C30 ADDS R1, R0, #4 ER_CODE:80002C32 STR R1, [SP,#0xC+var_8] ER_CODE:80002C34 MOV.W R1, #0xCCCCCCCC ER_CODE:80002C38 STR R1, [R0] ER_CODE:80002C3A B loc_80002C22 ER_CODE:80002C3C loc_80002C3C
C5 ER_CODE:80002B9E LDR d, =unk_2001C000 ER_CODE:80002BA0 LDR R2, =0x4000 ER_CODE:80002BA2 LSRS len, R2, #2 ER_CODE:80002BA4 B loc_80002BAC ER_CODE:80002BA6 loc_80002BA6 ER_CODE:80002BA6 MOV.W R2, #0xCCCCCCCC ER_CODE:80002BAA STMIA d!, {R2} ER_CODE:80002BAC loc_80002BAC ER_CODE:80002BAC SUBS R2, len, #0 ER_CODE:80002BAE SUB.W len, len, #1 ER_CODE:80002BB2 BNE loc_80002BA6 ER_CODE:80002BB4 BX LR
The thing is register variables increases speed and the image size gets smaller.
Now what can i do? *) C6 makes everything going slower *) C5 with no further support
Using C6 with optimization is not an alternative, my source is already optimized programmed and optimization makes other known problems
That is almost certainly due to problems in your source code.
"my source is already optimized"
You can't really optimise a HLL at the source level - certainly not to the point of dictating specific register usage.
If you've tried to do stuff like that at the HLL source lever, it is quite likely counter-productive
You should write the HLL source to be clear & maintainable, and let the compiler do the optimisation.
hi no more comments, you are definite wrong in that case. my code is optimized, i think you first should read some articles about programming...
the fact is C6 creates inefficient code in comparsion to C5.
Come on bro, enlighten us with some of your "optimized code". Arrogance and self awareness seldom go hand in hand !
compiling with -O0
Surely you're joking.
I advise you to look here: developer.arm.com/.../migrating-projects-from-arm-compiler-5-to-arm-compiler-6.
"My problem is, that the support for compiler 5 will end in 2020"
Do you have a reference for this?
Is that support from arm, Keil or both?