🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.gcc.bug
Article #1851

Problems with gcc and '-mfpa' option

#1851
From: valdis
Date: Tue, 25 Oct 1988 01:02
858 lines
13841 bytes
Scenario:  Sun 3/260 running SunOS 4.0 and gcc 1.30
gcc was built with tm-sun3.h, m68k.md, and config-sun4.h.

Symptom:  Specifying -mfpa causes an error msg.  Compiling without
this produces a clean compile.

I used gcc-cpp on the original C file to produce zztop.c

Attached is a 'script' of the two compiles, and a 'cat' of the source file.
(I know - the C code is ugly, but (a) I didn't write it and (b) I don't think
that -mfpa should cause this sort of error).
(I edited the typescript file, but only to remove trailing ctl-M chars).

				Valdis Kletnieks
				Sr. Systems Programmer
				Clarkson University
---- start included file
Script started on Mon Oct 24 20:44:51 1988
[alchemy:~/src/ray/tracer,1] gcc -O -v -mfpa -DFAST_MATH_PRIMS  -sun3 -c  zztop.c
gcc version 1.30
 /usr/local/lib/gcc-cpp -v -DFAST_MATH_PRIMS -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ -D__HAVE_FPA__ -D__HAVE_68881__ -Dmc68020 zztop.c /tmp/cca14615.cpp
GNU CPP version 1.30
 /usr/local/lib/gcc-cc1 /tmp/cca14615.cpp -quiet -dumpbase zztop.c -mfpa -O -version -o /tmp/cca14615.s
GNU C version 1.30 (68k, MIT syntax) compiled by GNU C version 1.30.
sphere.c: In function SphereIntersect:
sphere.c:70: inconsistent operand constraints in an `asm' in this function
[alchemy:~/src/ray/tracer,2] gcc -O -v  -DFAST_MATH_PRIMS  -sun3 -c  zztop.c
gcc version 1.30
 /usr/local/lib/gcc-cpp -v -DFAST_MATH_PRIMS -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ -D__HAVE_68881__ -Dmc68020 zztop.c /tmp/cca14618.cpp
GNU CPP version 1.30
 /usr/local/lib/gcc-cc1 /tmp/cca14618.cpp -quiet -dumpbase zztop.c -O -version -o /tmp/cca14618.s
GNU C version 1.30 (68k, MIT syntax) compiled by GNU C version 1.30.
 as -mc68020 /tmp/cca14618.s -o zztop.o
[alchemy:~/src/ray/tracer,3] cat zztop.c
# 1 "sphere.c"
# 1 "/usr/include/stdio.h"
 




extern	struct	_iobuf {
	int	_cnt;
	unsigned char *_ptr;
	unsigned char *_base;
	int	_bufsiz;
	short	_flag;
	char	_file;		 
} _iob[];







































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



extern char	*ctermid();
extern char	*cuserid();
extern char	*tempnam();
extern char	*tmpnam();






# 1 "sphere.c"

# 1 "/usr/include/math.h"
 

 



 







# 1 "/usr/include/floatingpoint.h"
 

 



 













# 1 "/usr/include/sys/ieeefp.h"
 

 



 








 

# 26 "/usr/include/sys/ieeefp.h"

# 35 "/usr/include/sys/ieeefp.h"


enum fp_direction_type 		 
	{
	fp_nearest	= 0,
	fp_tozero	= 1,
	fp_negative	= 2,
	fp_positive	= 3
	} ;


# 54 "/usr/include/sys/ieeefp.h"

enum fp_precision_type		 
	{
	fp_extended	= 0,
	fp_single	= 1,
	fp_double	= 2,
	fp_precision_3	= 3
	} ;


# 74 "/usr/include/sys/ieeefp.h"

enum fp_exception_type		 
	{
	fp_inexact	= 0,
	fp_division	= 1,
	fp_underflow	= 2,
	fp_overflow	= 3,
	fp_invalid	= 4
	} ;


enum fp_class_type		 
	{
	fp_zero		= 0,
	fp_subnormal	= 1,
	fp_normal	= 2,
	fp_infinity   	= 3,
	fp_quiet	= 4,
	fp_signaling	= 5
	} ;
# 21 "/usr/include/floatingpoint.h"


 

typedef float single ;			
typedef unsigned extended[3] ;



typedef unsigned fp_exception_field_type ; 
				 




typedef int sigfpe_code_type ;   

typedef void (* sigfpe_handler_type)() ; 
				 





 

extern enum fp_direction_type fp_direction ;
				 


	

extern enum fp_precision_type fp_precision ;
				 


	

extern sigfpe_handler_type ieee_handlers [5	] ;
				 









extern fp_exception_field_type fp_accrued_exceptions ;	
				 








extern sigfpe_handler_type sigfpe( ) ;

 


				 

typedef char decimal_string[512	] ;	
				 

typedef struct
	{
	enum fp_class_type fpclass ;
	int	sign ;
	int	exponent ;
	decimal_string ds ;	 


	int	more ;		 


	int 	ndigits ;	 


	}
	decimal_record ;

enum decimal_form
	{
	fixed_form,		 


	floating_form		 

	} ;

typedef struct
	{
	enum fp_direction_type rd ;	
				 
	enum decimal_form df ;	 

	int ndigits ;		 
	}
	decimal_mode ;

enum decimal_string_form
	{			 
	invalid_form,		 
	whitespace_form,	 
	fixed_int_form,		 
	fixed_intdot_form,	 
	fixed_dotfrac_form,	 
	fixed_intdotfrac_form,	 
	floating_int_form,	 	
	floating_intdot_form,	 
	floating_dotfrac_form,	 
	floating_intdotfrac_form, 
	inf_form,		 
	infinity_form,		 
	nan_form,		 
	nanstring_form		 
	} ;

extern void single_to_decimal ( ) ; 
extern void double_to_decimal ( ) ;
extern void extended_to_decimal ( ) ;

extern void decimal_to_single ( ) ;
extern void decimal_to_double ( ) ;
extern void decimal_to_extended ( ) ;

extern char *econvert( ) ;
extern char *fconvert( ) ;
extern char *gconvert( ) ;
extern char *seconvert( ) ;
extern char *sfconvert( ) ;
extern char *sgconvert( ) ;

extern void string_to_decimal( ) ; 
extern void   file_to_decimal( ) ; 
extern void   func_to_decimal( ) ; 

 

extern double atof();

 

extern int errno;

extern double strtod ();
# 16 "/usr/include/math.h"


 

extern int    finite();
extern double fabs(), floor(), ceil(), rint();
extern double hypot();
extern double copysign();
extern double sqrt();
extern double modf(), frexp();
extern double asinh(), acosh(), atanh();
extern double erf(), erfc();
extern double exp(), expm1(), log(), log10(), log1p(), pow();
extern double lgamma();
extern double j0(), j1(), jn(), y0(), y1(), yn();
extern double sin(), cos(), tan(), asin(), acos(), atan(), atan2();
extern double sinh(), cosh(), tanh();
extern double cbrt();

 
 
enum fp_pi_type { 		 

	fp_pi_infinite	= 0,	 
	fp_pi_66	= 1,	 
	fp_pi_53	= 2	 
	} ;

extern enum fp_pi_type fp_pi ;   


 

extern enum fp_class_type fp_class() ;
extern int ilogb(), irint(), signbit() ;
extern int isinf(), isnan(), isnormal(), issubnormal(), iszero() ;
extern double nextafter(), remainder() ;
extern double logb(), significand(), scalb(), scalbn();
extern double min_subnormal(), max_subnormal();
extern double min_normal(), max_normal();
extern double infinity(), quiet_nan(), signaling_nan();

 

extern double log2(), exp10(), exp2(), aint(), anint() ;
extern int nint() ;
extern void   sincos();

 

extern int ieee_flags ();
extern int ieee_handler ();

 












 







 







 







 




extern int    ir_finite_();
extern int  r_fabs_(), r_floor_(), r_ceil_(), r_rint_();
extern int  r_hypot_();
extern int  r_copysign_();
extern int  r_sqrt_();
extern int  r_asinh_(), r_acosh_(), r_atanh_();
extern int  r_erf_(), r_erfc_();
extern int  r_exp_(), r_expm1_(), r_log_(), r_log10_(), r_log1p_();
extern int  r_pow_();
extern int  r_lgamma_();
extern int  r_j0_(), r_j1_(), r_jn_(), r_y0_(), r_y1_(), r_yn_();
extern int  r_sin_(), r_cos_(), r_tan_(), r_asin_(), r_acos_();
extern int  r_atan_(), r_atan2_();
extern int  r_sinh_(), r_cosh_(), r_tanh_();
extern int  r_cbrt_();
extern int ir_ilogb_(), ir_irint_(), ir_signbit_() ;
extern int ir_isinf_(), ir_isnan_(), 
	   ir_issubnormal_(), ir_isnormal_(), ir_iszero_() ;
extern enum fp_class_type ir_fp_class_();
extern int  r_nextafter_(), r_remainder_() ;
extern int  r_log2_(), r_exp10_(), r_exp2_(), r_aint_(), r_anint_() ;
extern int ir_nint_() ;
extern int  r_fmod_();
extern int  r_logb_(), r_significand_(), r_scalb_(), r_scalbn_();
extern int  r_min_subnormal_(), r_max_subnormal_();
extern int  r_min_normal_(), r_max_normal_();
extern int  r_infinity_(), r_quiet_nan_(), r_signaling_nan_();
extern void r_sincos_();

 













struct exception {
        int type;
        char *name;
        double arg1;
        double arg2;
        double retval;
};

extern int signgam;

extern double fmod();
extern int matherr();

 

























 




extern double cabs();	 


extern double drem();	 

extern double gamma();	 



extern double ldexp();	 



# 2 "sphere.c"

# 1 "defs.h"
 








typedef double Flt ;
typedef Flt Vec[3] ;
typedef Vec Point ;
typedef Vec Color ;
typedef Flt Matrix[4][4] ;
























typedef struct Ray {
	Point P ;
	Point D ;
} Ray ;






 

typedef struct t_surface {
	Color	surf_color ;
	Flt	surf_kd ;
	Flt	surf_ks ;
	Flt	surf_shine ;
	Flt 	surf_kt ;
	Flt	surf_ior ;
} Surface ;

typedef struct t_light {
	Vec	light_pos ;
	Flt	light_brightness ;
} Light ;

typedef struct t_viewpoint {
	Vec	view_from ;
	Vec	view_at ;
	Vec	view_up ;
	Flt	view_angle ;
	Flt	view_dist ;
} Viewpoint ;

typedef struct t_object {
	unsigned short 	o_type ;
	Flt	o_dmin[	(3) ] ;
	Flt	o_dmax[	(3) ] ;
	struct t_objectprocs {
		int 	(*print) () ;
		int 	(*intersect) () ;
		int 	(*normal) () ;
	} * o_procs ;
	struct t_surface 	* o_surf ;
	void	* o_data ;
} Object ;

typedef struct t_compositedata {
	unsigned short 	c_size ;
	Object *	c_object[(10) ] ;
} CompositeData ;

typedef struct t_objectprocs ObjectProcs ;

typedef struct t_isect {
	Flt 		isect_t ;
	int 		isect_enter ;
	Object 		* isect_prim ;
	Surface 	* isect_surf ;
} Isect ;

typedef struct t_pixel {
	unsigned char r, g, b, q ;
} Pixel ;































# 3 "sphere.c"

# 1 "extern.h"



extern  int 		yylinecount ;
extern	Viewpoint 	Eye ;
extern	int 		Xresolution ;
extern	int 		Yresolution ;
extern	Light		Lights[] ;
extern	int		nLights ;
extern	Vec		BackgroundColor ;
extern	Surface		* CurrentSurface ;
extern	Object		* Prims[] ;
extern	int		nPrims ;
extern 	Flt		rayeps ;
extern	char *		Progname ;
extern 	int		maxQueueSize ;
extern 	int		totalQueues ;
extern	int		totalQueueResets ;
extern 	int		tickflag ;
extern  int		nChecked ;
extern 	int		nEnqueued ;

extern 	Flt		minweight ;
extern 	int		maxlevel ;
extern 	int		nRays ;
extern	int		nShadows ;
extern	int		nReflected ;
extern 	int		nRefracted ;

char *		malloc() ;
char *		calloc() ;
char *		rindex() ;

extern	Object *	MakeCone() ;
extern	Object *	MakeSphere() ;
extern	Object *	MakePatch() ;
extern	Object *	MakePoly() ;

extern 	Flt		VecNormalize() ;
extern	Vec		Slab[] ;
extern	ObjectProcs	NullProcs ;
extern 	Object *	Root ;
# 4 "sphere.c"


typedef struct t_spheredata {
	Vec 		sph_center ;
	Flt 		sph_radius ;
	Flt 		sph_radius2 ;
} SphereData ;

int SpherePrint ();
int SphereIntersect ();
int SphereNormal ();

ObjectProcs SphereProcs = {
	SpherePrint,
	SphereIntersect,
	SphereNormal,
} ;

int 
SpherePrint(obj)
 Object *obj ;
{
	SphereData * sp ;

	sp = (SphereData *) obj -> o_data ;

	printf("s %g %g %g %g\n", sp -> sph_center[0], 
				   sp -> sph_center[1],
				   sp -> sph_center[2],
				   sp -> sph_radius) ;
}

SphereIntersect(obj, ray, hit)
 Object * obj ;
 Ray * ray ;
 Isect * hit ;
{

	Flt b, disc, t;
	Point V ;
	SphereData * sp ;

	sp = (SphereData *) obj -> o_data ;

	 ( V)[0]=((sp->sph_center))[0]-( ray -> P)[0];	( V)[1]=((sp->sph_center))[1]-( ray -> P)[1];	( V)[2]=((sp->sph_center))[2]-( ray -> P)[2] ;

	b = ((V)[0]*( ray -> D)[0]+(V)[1]*( ray -> D)[1]+(V)[2]*( ray -> D)[2]) ;

	disc = b * b - ((V)[0]*( V)[0]+(V)[1]*( V)[1]+(V)[2]*( V)[2])  + (sp -> sph_radius2) ;

	if (disc < 0.0)
		return(0);

	disc = ({ double __value, __arg = (disc) ;	asm("fsqrtx %1,%0": "=f" (__value): "f" (__arg)) ;	__value ;}) ;

	t = (b - disc < rayeps) ? b + disc : b - disc ;

	if (t < rayeps) {
		return(0);
	}

	hit -> isect_t = t ;
	hit -> isect_enter = ((V)[0]*( V)[0]+(V)[1]*( V)[1]+(V)[2]*( V)[2])  > sp -> sph_radius2 + rayeps ? 1 : 0 ;
	hit -> isect_prim = obj ;
	hit -> isect_surf = obj -> o_surf ;
	return (1);
}

int
SphereNormal(obj, hit, P, N)
 Object * obj ;
 Isect * hit ;
 Point P, N ;
{
	SphereData * sp ;
	sp = (SphereData *) obj -> o_data ;

	 ( N)[0]=(P)[0]-( sp -> sph_center)[0];	( N)[1]=(P)[1]-( sp -> sph_center)[1];	( N)[2]=(P)[2]-( sp -> sph_center)[2] ;
	(void) VecNormalize(N);
}

Object *
MakeSphere(pos, radius)
 Vec pos ;
 Flt radius ;
{
	Object * tmp ;
	int i ;
	SphereData *sp ;

	tmp = (Object *) malloc (sizeof(Object)) ;
	tmp -> o_type = (1)  ;
	tmp -> o_procs = & SphereProcs ;
	tmp -> o_surf = CurrentSurface ;
	sp = (SphereData *) malloc (sizeof(SphereData)) ;
	 ( sp -> sph_center)[0]=(pos)[0];( sp -> sph_center)[1]=(pos)[1];( sp -> sph_center)[2]=(pos)[2];  ;
	sp -> sph_radius = radius ;
	sp -> sph_radius2 = radius * radius ;
	tmp -> o_data = (void *) sp ;

	 



	
	for (i = 0 ; i < 	(3) ; i ++) {
		tmp -> o_dmin[i] = ((sp -> sph_center)[0]*( Slab[i])[0]+(sp -> sph_center)[1]*( Slab[i])[1]+(sp -> sph_center)[2]*( Slab[i])[2])  
			- sp -> sph_radius ;
		tmp -> o_dmax[i] = ((sp -> sph_center)[0]*( Slab[i])[0]+(sp -> sph_center)[1]*( Slab[i])[1]+(sp -> sph_center)[2]*( Slab[i])[2])  
			+ sp -> sph_radius ;
	}
	return tmp ;
}
[alchemy:~/src/ray/tracer,4] exit
[alchemy:~/src/ray/tracer,5] 
script done on Mon Oct 24 20:45:45 1988
---- end included file
Technical Details
Message-ID: <8810250102.AA14633@alchemy.mcs.clarkson.edu>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!water!watmath!uunet!tut.cis.ohio-state.edu!SUN.MCS.CLARKSON.EDU!valdis

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!water!watmath!uunet!tut.cis.ohio-state.edu!SUN.MCS.CLARKSON.EDU!valdis
From: valdis@SUN.MCS.CLARKSON.EDU
Newsgroups: gnu.gcc.bug
Subject: Problems with gcc and '-mfpa' option
Message-ID: <8810250102.AA14633@alchemy.mcs.clarkson.edu>
Date: 25 Oct 88 01:02:45 GMT
Sender: daemon@tut.cis.ohio-state.edu
Distribution: gnu
Organization: GNUs Not Usenet
Lines: 858