[gnu.gcc.bug] gcc 1.31 generates more invalid asm syntax on sparc

schmidt%blanche.ics.uci.edu@ORION.CF.UCI.EDU ("Douglas C. Schmidt") (11/24/88)

Bug Report for GCC:
-------------------
Problem : gcc 1.31 generates invalid asm syntax on sun 4 for the following
	       program.

1.) Version : gcc 1.31
-----------

2.) Input Program :
-----------------
char *_new(); char _delete(); char *_vec_new(); char _vec_delete();
struct _iobuf {

int __iobuf__cnt ;
unsigned char *__iobuf__ptr ;
unsigned char *__iobuf__base ;
int __iobuf__bufsiz ;
short __iobuf__flag ;
char __iobuf__file ;
};
extern struct _iobuf _iob [];

extern int _flsbuf ();
extern int _filbuf ();

extern struct _iobuf *fopen ();
extern struct _iobuf *fdopen ();
extern struct _iobuf *freopen ();
extern long ftell ();
extern char *fgets ();

extern char *gets ();
extern int puts ();
extern int fputs ();
extern int printf ();
extern int fprintf ();
extern int sprintf ();
extern int scanf ();
extern int fscanf ();
extern int sscanf ();
extern int fread ();
extern int fwrite ();
extern int fclose ();
extern int fflush ();
extern int fseek ();
extern char rewind ();
extern int getw ();
extern int fgetc ();
extern struct _iobuf *popen ();
extern int pclose ();
extern int putw ();
extern int fputc ();
extern char setbuf ();
extern int ungetc ();

extern char exit ();
extern int abort ();

extern int atoi ();
extern double atof ();
extern long atol ();

extern struct _iobuf *tmpfile ();
extern char *ctermid ();
extern char *cuserid ();
extern char *tempnam ();
extern char *tmpnam ();

extern char perror ();

extern int errno ;
extern char *sys_errlist [];
extern int sys_nerr ;
extern unsigned char *_bufendtab [];

/* enum state_value */

/* enum open_mode */

struct streambuf {	/* sizeof streambuf == 26 */

char *_streambuf_base ;
char *_streambuf_pptr ;
char *_streambuf_gptr ;
char *_streambuf_eptr ;
char _streambuf_alloc ;
struct _iobuf *_streambuf_fp ;

int (**_streambuf__vptr )();
};
int _streambuf_overflow ();
int _streambuf_underflow ();
static int (*streambuf__vtbl[])() = {
(int(*)()) _streambuf_overflow , 
(int(*)()) _streambuf_underflow , 0};

int _streambuf_doallocate ();

	/* overload _ctor: */


extern int close ();

struct filebuf {	/* sizeof filebuf == 32 */

char *_streambuf_base ;
char *_streambuf_pptr ;
char *_streambuf_gptr ;
char *_streambuf_eptr ;
char _streambuf_alloc ;
struct _iobuf *_streambuf_fp ;

int (**_streambuf__vptr )();

int _filebuf_fd ;
char _filebuf_opened ;
};
int _filebuf_overflow ();
int _filebuf_underflow ();
static int (*filebuf__vtbl[])() = {
(int(*)()) _filebuf_overflow , 
(int(*)()) _filebuf_underflow , 0};

struct filebuf *_filebuf_open ();

	/* overload _ctor: */




struct circbuf {	/* sizeof circbuf == 26 */

char *_streambuf_base ;
char *_streambuf_pptr ;
char *_streambuf_gptr ;
char *_streambuf_eptr ;
char _streambuf_alloc ;
struct _iobuf *_streambuf_fp ;

int (**_streambuf__vptr )();
};
int _circbuf_overflow ();
int _circbuf_underflow ();
static int (*circbuf__vtbl[])() = {
(int(*)()) _circbuf_overflow , 
(int(*)()) _circbuf_underflow , 0};

struct whitespace {	/* sizeof whitespace == 2 */
char _dummy; };

extern char *oct ();
extern char *dec ();
extern char *hex ();

extern char *chr ();
extern char *str ();
extern char *form ();

struct ostream {	/* sizeof ostream == 6 */

struct streambuf *_ostream_bp ;
short _ostream_state ;
};

	/* overload _lshift: */
struct ostream *_ostream__lshiftFPC__ ();


struct ostream *_ostream__lshiftFUL__ ();
struct ostream *_ostream__lshiftFL__ ();
struct ostream *_ostream__lshiftFD__ ();
struct ostream *_ostream__lshiftFRCstreambuf___ ();
struct ostream *_ostream__lshiftFRCwhitespace___ ();
struct ostream *_ostream__lshiftFRCcommon___ ();

struct ostream *_ostream_put ();

	/* overload _ctor: */



struct istream {	/* sizeof istream == 12 */

struct streambuf *_istream_bp ;
struct ostream *_istream_tied_to ;
char _istream_skipws ;
short _istream_state ;
};

	/* overload _rshift: */
struct istream *_istream__rshiftFPC__ ();
struct istream *_istream__rshiftFRC__ ();
struct istream *_istream__rshiftFRS__ ();
struct istream *_istream__rshiftFRI__ ();
struct istream *_istream__rshiftFRL__ ();
struct istream *_istream__rshiftFRF__ ();
struct istream *_istream__rshiftFRD__ ();
struct istream *_istream__rshiftFRCstreambuf___ ();
struct istream *_istream__rshiftFRCwhitespace___ ();
struct istream *_istream__rshiftFRCcommon___ ();

	/* overload get: */
struct istream *_istream_getFPC_I_I__ ();
struct istream *_istream_getFRCstreambuf__I__ ();

struct istream *_istream_putback ();

	/* overload _ctor: */



extern char eatwhite ();

extern struct istream cin ;
extern struct ostream cout ;
extern struct ostream cerr ;

extern struct whitespace WS ;

extern int errno ;

extern int errno ;

extern int signgam ;

extern int abs ();
extern double atof ();

extern double frexp ();
extern double ldexp ();

extern double modf ();
extern double j0 ();

extern double j1 ();

extern double jn ();
extern double y0 ();

extern double y1 ();

extern double yn ();
extern double erf ();

extern double erfc ();
extern double exp ();

extern double log ();

extern double log10 ();
extern double pow ();

extern double sqrt ();
extern double floor ();

extern double ceil ();

extern double fmod ();

extern double fabs ();
extern double gamma ();
extern double hypot ();

extern int matherr ();
extern double sinh ();

extern double cosh ();

extern double tanh ();
extern double sin ();

extern double cos ();

extern double tan ();
extern double asin ();

extern double acos ();

extern double atan ();

extern double atan2 ();

struct exception {	/* sizeof exception == 32 */

int _exception_type ;
char *_exception_name ;
double _exception_arg1 ;
double _exception_arg2 ;
double _exception_retval ;
};


struct complex {	/* sizeof complex == 16 */

double _complex_re ;

double _complex_im ;
};

char _complex__asplus ();
char _complex__asminus ();
char _complex__asmul ();
char _complex__asdiv ();

extern int _neFCcomplex__Ccomplex___ ();

extern int _eqFCcomplex__Ccomplex___ ();

extern struct complex _divFCcomplex__Ccomplex___ ();

extern struct complex _mulFCcomplex__Ccomplex___ ();

extern struct complex _minusFCcomplex__Ccomplex___ ();

extern struct complex _minusFCcomplex___ ();

extern struct complex _plusFCcomplex__Ccomplex___ ();

extern struct complex sqrtFCcomplex___ ();

extern struct complex sinhFCcomplex___ ();

extern struct complex sinFCcomplex___ ();

extern struct complex polar ();

extern struct complex powFCcomplex__Ccomplex___ ();

extern struct complex powFCcomplex__D__ ();

extern struct complex powFCcomplex__I__ ();

extern struct complex powFD_Ccomplex___ ();

extern struct complex logFCcomplex___ ();

extern struct complex expFCcomplex___ ();

extern struct complex coshFCcomplex___ ();

extern struct complex cosFCcomplex___ ();

extern struct complex conj ();

extern double arg ();

extern double norm ();

extern double absFCcomplex___ ();

extern double imag ();

extern double real ();

struct ostream *_lshiftFRCostream__Ccomplex___ ();
struct istream *_rshiftFRCistream__RCcomplex___ ();

extern int errno ;











static struct complex complex_zero ;

struct c_exception {	/* sizeof c_exception == 56 */

int _c_exception_type ;
char *_c_exception_name ;
struct complex _c_exception_arg1 ;
struct complex _c_exception_arg2 ;
struct complex _c_exception_retval ;
};

extern struct complex logFCcomplex___ ();

extern struct complex coshFCcomplex___ ();

extern struct complex sinhFCcomplex___ ();

extern struct complex expFCcomplex___ ();

extern int complex_error ();

extern struct complex cosFCcomplex___ (_au0_z )struct complex _au0_z ;

{ 
struct complex _au1_y ;

( ( ((& _au1_y )-> _complex_re = (- _au0_z . _complex_im )), 
( ((& _au1_y )-> _complex_im = _au0_z . _complex_re ),
(((& _au1_y )))) ) ) ;
return coshFCcomplex___ ( _au1_y ) ;
}
;

extern struct complex coshFCcomplex___ (_au0_z )struct complex _au0_z ;

{ 
double _au1_cosh_x ;

double _au1_sinh_x ;

double _au1_cos_y ;

double _au1_sin_y ;
struct c_exception _au1_ex ;
extern int write ();

( ( ( ( ( ( ((& (& _au1_ex )-> _c_exception_arg1 )-> _complex_re = 0.0 ), ( ((&
 (& _au1_ex )-> _c_exception_arg1 )-> _complex_im = 0.0 ), (((& (& _au1_ex )-> 
 _c_exception_arg1 )))) ) ) , ( (
 ((& (& _au1_ex )-> _c_exception_arg2 )-> _complex_re = 0.0 ), 
 ( ((& (& _au1_ex )-> _c_exception_arg2 )-> _complex_im = 0.0 ), (((&
 (& _au1_ex )-> _c_exception_arg2 )))) ) ) ) , 
 ( ( ((& (& _au1_ex )-> _c_exception_retval )-> _complex_re =
 0.0 ), ( ((& (& _au1_ex )-> _c_exception_retval )-> _complex_im = 0.0 ), 
 (((& (& _au1_ex )-> _c_exception_retval )))) ) )
 ) , ( ((& _au1_ex )-> _c_exception_name = "cosh"), 
 ( ((& _au1_ex )-> _c_exception_arg1 = _au0_z ), ( ((&
 _au1_ex )-> _c_exception_arg2 = complex_zero ), 
 ( ((& _au1_ex )-> _c_exception_type = 0 ), 
 ( ((& _au1_ex )-> _c_exception_retval = (*( (
 ((& (& _au1_ex )-> _c_exception_retval )-> _complex_re = 
 ((double )0 )), ( ((& (& _au1_ex )-> _c_exception_retval )-> _complex_im = 0.0 ),
 (((& (& _au1_ex )-> _c_exception_retval )))) ) ) )), (((& _au1_ex )))) ) ) ) ) )
 ) ;

if (((_au0_z . _complex_im < 0 )? 
(- _au0_z . _complex_im ): _au0_z . _complex_im )> 1e7 )
{ 
_au1_ex . _c_exception_type = 3 ;
if (! complex_error ( (struct c_exception *)(& _au1_ex )) )
errno = 34 ;
return _au1_ex . _c_exception_retval ;
}

_au1_cos_y = cos ( _au0_z . _complex_im ) ;
_au1_sin_y = sin ( _au0_z . _complex_im ) ;

if (_au0_z . _complex_re > 88.0 )
{ 
_au1_ex . _c_exception_type = 3 ;
_au1_ex . _c_exception_retval . _complex_im = ((_au1_sin_y >= 0 )? 99.e999 : 
(- 99.e999 ));
_au1_ex . _c_exception_retval . _complex_re = ((_au1_cos_y >= 0 )? 99.e999 :
(- 99.e999 ));
if (! complex_error ( (struct c_exception *)(& _au1_ex )) )
errno = 34 ;
return _au1_ex . _c_exception_retval ;
}
else if (_au0_z . _complex_re < (- 88.0 ))
{ 
_au1_ex . _c_exception_type = 3 ;
_au1_ex . _c_exception_retval . _complex_im = ((_au1_sin_y >= 0 )? (- 99.e999 ):
 99.e999 );
_au1_ex . _c_exception_retval . _complex_re = ((_au1_cos_y >= 0 )? 99.e999 : 
(- 99.e999 ));
if (! complex_error ( (struct c_exception *)(& _au1_ex )) )
errno = 34 ;
return _au1_ex . _c_exception_retval ;
}
else 
{ 
double _au2_pos_exp ;
double _au2_neg_exp ;

_au2_pos_exp = exp ( _au0_z . _complex_re ) ;
_au2_neg_exp = (1 / _au2_pos_exp );
_au1_cosh_x = ((_au2_pos_exp + _au2_neg_exp )/ 2 );
_au1_sinh_x = ((_au2_pos_exp - _au2_neg_exp )/ 2 );
}

{ 
struct complex _au0__V6 ;

return ( ( ( ((& _au0__V6 )-> _complex_re = (_au1_cos_y * _au1_cosh_x )), 
  ( ((& _au0__V6 )-> _complex_im = (_au1_sin_y *_au1_sinh_x )), 
  (((& _au0__V6 )))) ) ) , _au0__V6 ) ;
} }
;

extern char _STIcos_c_ ()
{ ( ( (((struct complex *)(& complex_zero ))-> _complex_re = ((double )0 )), 
( (((struct complex *)(&complex_zero ))-> _complex_im = ((double )0 )), 
((((struct complex *)(& complex_zero ))))) ) ) ;
}
;

/* the end */

3.) Command Used : gcc -O
----------------

4.) Files used :
--------------
		tm.h          -> tm-sparc.h
		md            -> sparc.md
      config.h      -> xm-sunos4.h
      aux-output.c  -> output-sparc.c
      
5.) Machine(s) used :
-------------------
   Sun 4 running Sun4.0

6.) Compiler diagnostics :
------------------------

gcc version 1.31
 /usr/public/lib/gcc/gcc-cpp -v -I/cd/ua/schmidt/include/ -undef -D__GNU__ -D__GNUC__ -Dsparc -Dsun -Dunix -D__OPTIMIZE__ cos-bug.1.28.c /tmp/cca16444.cpp
GNU CPP version 1.31
 /usr/public/lib/gcc/gcc-cc1 /tmp/cca16444.cpp -quiet -dumpbase cos-bug.1.28.c -finline-functions -O -version -o /tmp/cca16444.s
cos-bug.1.28.c: In function coshFCcomplex___:
cos-bug.1.28.c:440: warning: floating point number exceeds range of `double'
cos-bug.1.28.c:441: warning: floating point number exceeds range of `double'
cos-bug.1.28.c:442: warning: floating point number exceeds range of `double'
cos-bug.1.28.c:443: warning: floating point number exceeds range of `double'
cos-bug.1.28.c:451: warning: floating point number exceeds range of `double'
cos-bug.1.28.c:452: warning: floating point number exceeds range of `double'
cos-bug.1.28.c:453: warning: floating point number exceeds range of `double'
cos-bug.1.28.c:454: warning: floating point number exceeds range of `double'
GNU C version 1.31 (sparc) compiled by GNU C version 1.31.
 as /tmp/cca16444.s -o cos-bug.1.28.o
as: "/tmp/cca16444.s", line 58: error: statement syntax
as: "/tmp/cca16444.s", line 61: error: statement syntax

7). asm output
--------------

.data
	.align 4
_streambuf__vtbl:
	.word __streambuf_overflow
	.word __streambuf_underflow
	.word 0
	.align 4
_filebuf__vtbl:
	.word __filebuf_overflow
	.word __filebuf_underflow
	.word 0
	.align 4
_circbuf__vtbl:
	.word __circbuf_overflow
	.word __circbuf_underflow
	.word 0
.text
	.align 4
.global _cosFCcomplex___
	.proc 1
_cosFCcomplex___:
	!#PROLOGUE# 0
	save %sp,-128,%sp
	!#PROLOGUE# 1
	st %i0,[%fp+68]
	st %i1,[%fp+72]
	st %i2,[%fp+76]
	st %i3,[%fp+80]
	ld [%fp+64],%o0
	ld [%fp+76],%f2
	ld [%fp+80],%f3
	fnegs %f2,%f2
	std %f2,[%fp-32]
	ld [%fp+68],%o4
	ld [%fp+72],%o5
	std %o4,[%fp-24]
	st %o0,[%sp+64]
	ld [%fp-32],%o0
	ld [%fp-28],%o1
	ld [%fp-24],%o2
	call _coshFCcomplex___,0
	ld [%fp-20],%o3
	ret
	restore
	.align 8
LC0:
	.double 0r0.00000000000000000000e+00
LC1:
	.ascii "cosh\0"
	.align 8
LC2:
	.double 0r1.00000000000000000000e+07
	.align 8
LC3:
	.double 0r8.80000000000000000000e+01
	.align 8
LC4:
	.double 0rInfinity                      /* problem */
	.align 8
LC5:
	.double 0r-Infinity                     /* problem */
	.align 8
LC6:
	.double 0r-8.80000000000000000000e+01
	.align 8
LC7:
	.double 0r1.00000000000000000000e+00
	.align 8
LC8:
	.double 0r2.00000000000000000000e+00
	.align 4
.global _coshFCcomplex___
	.proc 1

/* truncated for brevity */