-------------------------------------------------------------------------------
*  RELEASE 5.10 BUGLIST                                                       *
*  Update - 12/03/89                                                          *
*                                                                             *
*  This file contains a list of bugs in the release 5.10 of the 320C1x/2x     *
*  code generation tools.                                                     *
*                                                                             *
*  All bugs will be fixed in the next production release unless otherwise     *
*  indicated.  There will sometimes be references to internal versions in     *
*  this list.  For that reason you must always refer to the release status    *
*  information (published every two weeks) to verify the availability of a    *
*  specific revision.                                                         *
*                                                                             *
-------------------------------------------------------------------------------


ALL TOOLS
-----------------------------------------------------------------------------

PRE-PROCESSOR
-----------------------------------------------------------------------------
PARSER
-----------------------------------------------------------------------------


CODE GENERATOR
-----------------------------------------------------------------------------
1)  dsp2761 fixed 5.20
    When a function parameter is a register pointer and that pointer is
    passed to another function the stack is corrupted.
             void rtn1(p)
             register int* p;
             {  rtn0(p, 1);  }

2) dsp2801 fixed 5.20
   When a pointer is set equal to expression (&xxx + k) where k is a
   constant value, the compiler messes up.  Bug not in V5.05.
   Example:   int a[5],*b; main (){  b = a[4];  }

3) dsp2811 fixed 5.20
   Code generator ignores logical not (!) in the following code:
   main()
   {    int res = 8;
        int sor = 0;
   if ( (!res) == 0 ) sor = 1;
   }

4) dsp2812 fixed 5.20
   The following illegal typedef causes compiler to crash.
        typedef a b;
        b b1 = {0};

5) dsp2819 fixed 5.20
   Compiler does not handle nested array arguements correctly.
   for example:     array[ 100 - array[100] + 1 ]

6) dsp2829 fixed 5.20
   Codegen hangs or generates bad code compiling  += and -+ operators
   - in certain cases.

7) dsp2833 fixed 5.20    PC-specific
   Codegen does not handle arrays with more than 1024 elements.

8) dsp2832 fixed 5.20
   For unsigned intergers a,b and c, the following 'if' statement
   corrupts ARP when a = 0 and b != c.
                         if (!a && (b == c))
   A corrupted ARP will cause errors at run time in statements following
   the if block.

9) dsp2838 fixed 5.20
   Codgen messes up this 'if' statement for  intergers A & B:
                if ( A/2 > B ) A = B;

10) dsp2859 fixed 5.20
    codgen adds 128 twice to "tabel[]" in this code:
                extern int table[];
                bug() { int n,i;
                        n = *(table + 128 -i);  }

11) dsp2872 fixed 5.20
    The following type of code fails in accessing elements of arrays
    of type float:
                      int    i,j;    float  x[2][3];
                      for ( i=0;  i<2;  i++ )  {
                          for ( j=0;  j<3;  j++ ) {
                               x[i][j] = i - j + 2;  }}

12) dsp2881 fixed 5.20
    The compiler generates wrong address in accessing bit-field members
    of structures.  Problem does not occur if bit-field members are the
    first members of the structure to be defined in structure definition.

13) dsp2883 fixed 5.20
    func(&v[i]) for int v[] does not pass func() correct address.  It begins
    at the base of the frame pointer instead of the base of the array.

14) dsp2909 fixed 5.20
    Problem initializing a pointer to a member of a global structure.
    Only occurs when pointer is also a global.  For example:
                struct { int A; int B;} thing;
                int    *b = &thing.B;

15) dsp2925  will fix
    Normal C character escape sequences, e.g. '\"', are not recognized within an
    asm("") statement.

FLOATING POINT LIBRARY
-----------------------------------------------------------------------------


RUNTIME SUPPORT
-----------------------------------------------------------------------------

1) dsp2800 fixed 5.20
   The function frexp(double, *int) does not operate correctly.  The value
   it returns is not in IEEE float format.

2) DSP2813 fixed 5.20
   I$$DIV does not return sign-extended results in the accumulator as
   expected.

3) DSP2834 fixed 5.20
   The overflow handler in F$$FTOI increments the stack pointer (AR1) once
   too many times.  Therefore, stack is corrupted when F$$FTOI is called with
   too large an arguement.

4) dsp2836 fixed 5.20
   The run time support library does not include the standard function
   atof().

5) dsp2848 fixed 5.20
   Transcedental fuctions log(), log10(), and pow() don't work. Also, exp()
   has loss of accuracy.


ASSEMBLER
-----------------------------------------------------------------------------

1) dsp 2757 fixed 5.20
   Using subk, addk, lark with a forward reference to a data memory address
          subk  x       will cause the assembler to substitute a long
      x:  nop           immediate instruction (splk, adlk, lrlk) even if
                        the value of x is smaller than 8 bits.

2) dsp 2759 fixed 5.20
   Using a relocatable address in an expression calculation using multiply
   and divide is not causing an error message.
      x:  nop
          ldpk  x/80H    ; Assembler should flag as an error

3) c30 2760 fixed 5.20
   Global variables defined in a .asect section are being relocated at
   link time.

4) dsp2874 fixed 5.20
   assembler does not take semicolons as character constants.
   For example:      LALK  '-',4    ;this is OK
                     LALK  ';',4    ;this is problem

5) dsp2889 fixed 5.20
   this code causes a PASS1/PASS2 conflict error:
                SFSM  ; can be rfsm,sfsm,rtxm,stxm
        A       RET   ; use of above instructions will always cause problems

   These instructions do not take operands so a .int directive can be used
   as a work around.  i.e.  opcode for sfsm = 0CE37h
                            .int    0CE37h  ; SFSM
                                    RET

6) DSP2937  FIXED 5.20
   The wrong opcodes are generated for CNFP,RC and RHM statements.

7) DSP2906  will fix
   Macro bombs when using "$IF parameter.SA&$REF"  statement because assembler
   ignores $REF member of statement.

8) 2941   V 5.20   will fix V 5.30
   .space N directive does not allocated memory correctly for N >= (4000h * 16).


LINKER
-----------------------------------------------------------------------------

1)  RR2878     FIXED 5.20
    Specification of an empty GROUP in the link command file sometimes
    causes linker to crash.

2) DSP 2897 will fix 5.20
   When .def SYMBOL is in two files for same symbol, linker should flag
   a duplicate symbol definition error.

ARCHIVER
-----------------------------------------------------------------------------
ROM UTILITY
-----------------------------------------------------------------------------
SOURCE CONVERSION UTILITY
-----------------------------------------------------------------------------


DOCUMENTATION
-----------------------------------------------------------------------------

1) 1988 (March) TMS320C25 C Compiler Reference Guide        (SPRU024)
   Page 6-33  Run Time Support Functions - frexp
   The example given is incorrect.  Should be: fraction = 0.785375, exp = 2.
   Also, use of term 'value' is confusing.  Suggest that wording be changed
   to: 'The function returns a fraction in the range [1/2,1], so that
   value = fraction * 2^exp.'

2) dsp2828
   December 1987 TMS320Cx/TMS320C2x Assembly Language Tools User's Guide
   (SPRU018)
   Sections 7.4 & 7.5  -  Examples given claim to illustrate the passing of
   .string values to $MACROs.  But value qualifier suffix must be used for
   this function.  That is:
                            :PARAM.v:
   must be used where '.v' is the value qualifier.

