I have been trying to find information on the new 84xxx family of DSCs, specifically to find out what parts are what bit-width. Obviously, I've looked at the 84x reference manual, the product brief and fact sheet, and compared these to similar material on the 8345, which is the part my company currently uses.
The Freescale page says "100 MHz/100 MIPS 32-bit DSP core", for the 56F84789. This is opposed to the 8345, which says in documentation "Efficient 16-bit 56800E family controller engine with dual Harvard architecture".
I would expect some differentiation then. But, as far as I can see, the only difference to the core is that the 84x has 6 new single cycle MAC instructions and allows 32x32 with a 64 bit result. The other difference is that as far as I can tell from CodeWarror10.4, the core registers are 24bit. Why not 32bit? It's a 32bit core, right? But surely the compiler wouldn't try and use a 24bit register to store a UWord32, would it?
So, I made a test project, attached, and tried to find out what was happening.
The results if you don't want to run the project then:
Optimisation level 0: Everything fine. Declared 32bit variables with no attributes work with 32x32 multiply and division. Declared 32bit variables with static attributes multiply and divide ok.
Optimisation level 1: Variables declared like <UWord32 myUW32Variable;> and set in code are put through the core registers. These are 24bit. The 32x32 multiplies fail on large values. Variables declared in the form <static myUW32StaticVariable;> however, work ok. These are both declared and used within main().
Am I missing some fundamental aspects of operation here? Why does the compiler try and put 32bit values through the 24bit core registers when code is optimised? Surely it should know this will cause corruption?
Original Attachment has been moved to: Test_Maths.zip