Release notes for the IAR C/C++ Compiler for Renesas M16C/R8C version 3.71.1

Important information

New features

Known Problems

Program Corrections

User guide corrections

Miscellaneous

Release history

3.70.1, October 2014

Program corrections

3.60.1, June 2010

3.50.3, December 2012

Program corrections

New features

3.50.2, May 2012

Program corrections

3.50.1, November 2010

New features

Program corrections

3.40.5, October 2009

Program corrections

3.40.3, August 2009

3.40.2, August 2009

3.40, July 2009

New features

Program corrections

3.30D, January 2009

3.30A, June 2008

3.21F, December 2007 (Update)

  • EW19658
    When accessing single bits in __data13 variables, poorly optimized code and in certain cases also erronous code was generated.
  • EW19597
    When calling a function with a small struct or union as parameter with uneven size as well as subsequent other parameters on the stack, the stack would errounously be aligned for those other parameters. This only happened with option --align_data=2.
  • 3.21D, June 2007 (Update)

    3.21C, May 2007 (Update)

  • EW18876
    On high optimization the result from the intrinsic function __RMPA_W could be optimized away.
  • EW18874
    Bit variable assignments could be erronous at high optimization levels.
    Example:
    bit_variable = other_bit_variable;
  • EW18862
    Compiler list files including any instruction using the dsp8[FB] addressing mode with negative offset, were not show correctly. Instead of -0x05 it showed -0x105. The resulting code was accurate but required a few more bytes than necessary.
  • 3.21B, February 2007 (Update)

    3.21A, December 2006

    3.20D, October 2006 (Update)

    3.20C, June 2006 (update)

  • EW18056
    Copying structs in the Data20 or Far data memory model could in some cases destroy the pointer to the source making subsequent accesses to that pointer erroneous.
  • EW18084
    When using absolute located volatile variables, the volatile keyword could in some instances be ignored.
  • EW18099
    When testing on a volatile variable, most notably bitfields, the test was in some cases erroneously removed on the optimization level high.
  • EW18125
    Any use of the instruction MUL(U).B <any src>, A0 (obviously used in char variable multiplication) by the compiler, erroneously removed earlier instructions that used A1 as destination. This only occured on optimization level high.
    Example, given a sequence like:
    MOV.W #1, A1
    MUL.B #4,A0

    the compiler would remove the MOV instruction
  • 3.20B, April 2006 (update)

  • EW17995
    When using an array placed in far memory, indexing could go wrong. Additional requirements for this error to occur was that the array had to be static or global and that the indexing expression had to contain a negated, unsigned variable.
  • EW17015
    The compiler failed to calculate a correct array index if the index expression included a constant expression. This error was solved only partly in version 3.20A.
  • 3.20A, March 2006

  • EW17731
    Having a signed operand while using size optimization, shift failed in that a shift logical (SHL) instruction was generated instead of a shift arithmetic (SHA).
  • EW17664
    Due to an optimization error, if code between a jump and it's destination was removed by the linker, you would end up with a JMP.S to the next instruction which resulted in a range error.
  • EW17657
    For a multiplication expression where two 16-bit expressions casted to 32-bit where multiplied, this multiplication could destroy one of the expressions prior to the multiplication.
  • EW17615
    When the optimizer tried to apply the algorithm for Constant folding, an internal error was in rare cases generated.
  • EW17349
    When a __far array was used, the index calculation went wrong if the index expression contained a negative constant.
  • EW17315
    When using the Word align function entries option, byte gaps between functions were padded with 0x00, which for the M16C is the BRK instruction. Now, NOP is used instead.
  • EW17022
    On the highest optimization level, an internal error could in rare cases be generated for C++ code and memory model Far or Huge.
  • EW17015
    The compiler failed to calculate a correct array index if the index expression included a constant expression.
  • EW16928
    At optimization level -z9 and -s9, bit-move instructions could incorrectly be removed when the __bitvar keyword was used.
  • EW16786
    For addition and subtraction on absolutely located __far pointers, the compiler calculated a wrong resulting address.
  • EW16677
    Any shift on a 32-bit value with a variable shiftcount, where the variable is located in a register, would destroy the shiftcount variable.
  • EW16619
    On a high optimization level any generated MUL or MULU instruction could destroy the high register of the destination without restoring it afterwards.
  • EW16530
    A call to the intrinsic function memcpy generated a Coloring failed error whenever the source argument was a far pointer resulting from an array index or structure offset calculation.
  • EW14944
    For statements that consisted of only a volatile variable, the volatile keyword was not acknowledged and the access was optimized away.
  • 3.10B, May 2005 (patch)

  • EW16786
    For addition and subtraction on absolute located __far pointers, the compiler calculated wrong resulting address.
  • EW16677
    Any shift on a 32-bit value with a variable shiftcount, where the variable is located in a register, would destroy the shiftcount variable.
  • EW16619, EW16837
    On high optimzation any generated MUL or MULU instruction could destroy the high register of the destination without restoring it afterwards.
  • EW16391
    An error occurred when a local variable was used as shift distance in a shift expression and thereafter used further in the program. Example:
    void main (void)
    {
    char a=1, b=1;
    a >> b;
    b++; //b is now corrupt
    }
  • 3.10A, December 2004

  • EW15090
    The register preserving correction made earlier for the library function ?GENERIC_MOVE_LONG was not complete. This has now been corrected.
  • EW14744, EW14745
    The %i and %X formatting specifiers did not work in the HUGE memory model.
  • EW14798
    The intrinsic function __no_operation() was not working.
  • EW14810
    When accessing a volatile variable which was located at addresses above 64Kbytes and the result was not needed, the compiler sometimes generated code that gave a range error during link time.
  • EW15777
    The code motion optimization sometimes triggered an unhandled exception when compiling with -s9 or -z9.
  • EW14925
    The DLIB HEAP did not work correctly outside the first 64Kbytes of the memory.
  • EW15474
    At highest optimization level, the compiler optimized away the actual shift instruction for an expression like:
    signed int i = ( 0x1<< 9 ) ;
  • 2.12F, November 2004 (Patch)

  • EW15900
    Left shifts with constant could for some constants lead to erronous code being generated when optimizing for speed.
  • 2.12E, July 2004 (Patch)

  • EW15633
    For functions that have a pointer as return value (returning struct/union or double), the compiler was likely to optimize away the code that sets this return pointer up.
  • 2.12B, April 2004 (Patch)

  • EW15246, EW15274
    Floating point compare could generate wrong results due to incorrect optimization. This happened frequently when comparing with constants.
  • EW15090
    In some cases the compiler assumed that the content of registers R3:R1 was preserved when calling the library function ?GENERIC_MOVE_LONG even though the value was destroyed.
  • EW14957
    __set_interrupt_level() used with a variable argument could result in an incorrect interrupt level being set.
  • EW14828
    A __regbank_interrupt function went corrupt if it contained a function call just before returning.
  • EW14781
    Code like:
    __set_interrupt_level(currentInterruptLevel);
    Where currentInterruptLevel is an unsigned char that has been set previously by a call to __get_interrupt_level(), gave an internal error.
  • EW14755
    Whenever a JSR instruction is immediately followed by an RTS instruction, the two instructions are replaced by a single JMP instruction by the optimizer. This happens when a function call is the last statement in a byte aligned (-u1) function. This is called tail calling. If the calling function and the called function had a short (less than 8 bytes) function between them and the intermediate function was never called, the linker would emit a range error. This was because the intermediate function allowed the tail calling JMP instruction to be a JMP.S instruction but because the intermediate function disappears at link time, since it is never called, the destination of the JMP.S instruction became the following instruction and that is not allowed for JMP.S.
  • EW14734
    JSR.W instruction was used for all calls to funtions residing in the same source code file. This is not correct when the called function is placed in another segment.
  • EW14730
    The symbols:
    __CONSTANT_DATA_NEAR__
    __CONSTANT_DATA_FAR__
    __CONSTANT_DATA_HUGE__

    were not predefined as they should have been.
  • EW14684, EW14938, EW14869
    When byte alignment was used and a function ended with a call to another function, an internal error sometimes appeared.
  • 2.12A, November 2003

    2.11A, July 2003

    2.10A, February 2003

    1.36A, April 2002

    1.35E, December 2001 (Not officially released)

    1.35D, October 2001 (Not officially released)

    1.35C, July 2001 (Not officially released)

    1.35B, July 2001 (Not officially released)

    1.35A, January 2001

    1.34A, January 2001

    1.33A, October 2000

    1.32B, *unofficial*

    1.32A,

    1.31D, January 2000

    1.31C, October 1999

    1.31B, September 1999

    1.31A, September 1999 [Not Released]

    1.30B, May 1999

    1.30A, March 1999

    1.20C, November 1998

    1.20B, August 1998

    1.20A, August 1998

    1.11B, March 1998

    1.11A, February 1998

    1.10C, November 1997

    1.10B, October 1997 (internal release)

    1.10A, September 1997

    1.01B, November 1996