xref: /csrg-svn/usr.bin/pascal/src/sconv.c (revision 62215)
148116Sbostic /*-
2*62215Sbostic  * Copyright (c) 1980, 1993
3*62215Sbostic  *	The Regents of the University of California.  All rights reserved.
448116Sbostic  *
548116Sbostic  * %sccs.include.redist.c%
622190Sdist  */
710358Smckusick 
814742Sthien #ifndef lint
9*62215Sbostic static char sccsid[] = "@(#)sconv.c	8.1 (Berkeley) 06/06/93";
1048116Sbostic #endif /* not lint */
1110358Smckusick 
1210358Smckusick     /*
1310358Smckusick      *	functions to help pi put out
1410358Smckusick      *	polish postfix binary portable c compiler intermediate code
1510358Smckusick      *	thereby becoming the portable pascal compiler
1610358Smckusick      */
1710358Smckusick 
1810358Smckusick #include	"whoami.h"
1910358Smckusick #ifdef PC
2010358Smckusick #include	"0.h"
2118469Sralph #include	<pcc.h>
2210358Smckusick 
2310358Smckusick     /*
2410358Smckusick      *	this routine enforces ``the usual arithmetic conversions''
2510358Smckusick      *	all integral operands are converted to ints.
2610358Smckusick      *	if either operand is a double, both are made to be double.
2710358Smckusick      *	this routine takes struct nl *'s for the types,
2810358Smckusick      *	and returns both the struct nl * and the p2type for the result.
2910358Smckusick      */
3010358Smckusick tuac(thistype, thattype, resulttypep, resultp2typep)
3110358Smckusick     struct nl	*thistype;
3210358Smckusick     struct nl	*thattype;
3310358Smckusick     struct nl	**resulttypep;
3410358Smckusick     int		*resultp2typep;
3510358Smckusick {
3610358Smckusick     int		thisp2type = p2type(thistype);
3710358Smckusick     int		thatp2type = p2type(thattype);
3810358Smckusick 
3910358Smckusick     *resulttypep = thistype;
4010358Smckusick     *resultp2typep = thisp2type;
4110358Smckusick 	/*
4210358Smckusick 	 *	should only be passed scalars
4310358Smckusick 	 */
4410358Smckusick     if (isnta(thistype,"sbcid") || isnta(thattype,"sbcid")) {
4510358Smckusick 	return;
4610358Smckusick     }
4718469Sralph     if (thisp2type == PCCT_CHAR || thisp2type == PCCT_SHORT) {
4818469Sralph 	*resultp2typep = PCCT_INT;
4910358Smckusick 	*resulttypep = nl + T4INT;
5010358Smckusick     }
5118469Sralph     if (*resultp2typep == PCCT_INT && thatp2type == PCCT_DOUBLE) {
5218469Sralph 	*resultp2typep = PCCT_DOUBLE;
5310358Smckusick 	*resulttypep = nl + TDOUBLE;
5410358Smckusick     }
5510358Smckusick     sconv(thisp2type, *resultp2typep);
5610358Smckusick }
5710358Smckusick 
5810358Smckusick     /*
5910358Smckusick      *	this routine will emit sconv operators when it thinks they are needed.
6010358Smckusick      *	this is code generator specific, rather than machine-specific.
6110358Smckusick      *	this routine takes p2types for arguments, not struct nl *'s.
6210358Smckusick      */
6330034Smckusick #if defined(vax) || defined(tahoe)
6410358Smckusick     /*
6510358Smckusick      *	the vax code genrator is very good, this routine is extremely boring.
6610358Smckusick      */
sconv(fromp2type,top2type)6710358Smckusick sconv(fromp2type, top2type)
6810358Smckusick     int	fromp2type;
6910358Smckusick     int	top2type;
7010358Smckusick {
7110358Smckusick 
7210358Smckusick     switch (top2type) {
7318469Sralph 	case PCCT_CHAR:
7418469Sralph 	case PCCT_SHORT:
7518469Sralph 	case PCCT_INT:
7610358Smckusick 	    switch (fromp2type) {
7718469Sralph 		case PCCT_CHAR:
7818469Sralph 		case PCCT_SHORT:
7918469Sralph 		case PCCT_INT:
8018469Sralph 		case PCCT_DOUBLE:
8110358Smckusick 			return;	/* pass1 knows how to do these */
8210358Smckusick 		default:
8310358Smckusick 			return;
8410358Smckusick 	    }
8518469Sralph 	case PCCT_DOUBLE:
8610358Smckusick 	    switch (fromp2type) {
8718469Sralph 		case PCCT_CHAR:
8818469Sralph 		case PCCT_SHORT:
8918469Sralph 		case PCCT_INT:
9018469Sralph 			putop(PCC_SCONV, PCCT_DOUBLE);
9110358Smckusick 			return;
9218469Sralph 		case PCCT_DOUBLE:
9310358Smckusick 			return;
9410358Smckusick 		default:
9510358Smckusick 			return;
9610358Smckusick 	    }
9710358Smckusick 	default:
9810358Smckusick 		return;
9910358Smckusick     }
10010358Smckusick }
10130034Smckusick #endif vax || tahoe
10210358Smckusick #ifdef mc68000
10310358Smckusick     /*
10410358Smckusick      *	i don't know how much to trust the mc68000 compiler,
10510358Smckusick      *	so this routine is full.
10610358Smckusick      */
sconv(fromp2type,top2type)10710358Smckusick sconv(fromp2type, top2type)
10810358Smckusick     int	fromp2type;
10910358Smckusick     int	top2type;
11010358Smckusick {
11110358Smckusick 
11210358Smckusick     switch (top2type) {
11318469Sralph 	case PCCT_CHAR:
11410358Smckusick 	    switch (fromp2type) {
11518469Sralph 		case PCCT_CHAR:
11610358Smckusick 			return;
11718469Sralph 		case PCCT_SHORT:
11818469Sralph 		case PCCT_INT:
11918469Sralph 		case PCCT_DOUBLE:
12018469Sralph 			putop(PCC_SCONV, PCCT_CHAR);
12110358Smckusick 			return;
12210358Smckusick 		default:
12310358Smckusick 			return;
12410358Smckusick 	    }
12518469Sralph 	case PCCT_SHORT:
12610358Smckusick 	    switch (fromp2type) {
12718469Sralph 		case PCCT_SHORT:
12810358Smckusick 			return;
12918469Sralph 		case PCCT_CHAR:
13018469Sralph 		case PCCT_INT:
13118469Sralph 		case PCCT_DOUBLE:
13218469Sralph 			putop(PCC_SCONV, PCCT_SHORT);
13310358Smckusick 			return;
13410358Smckusick 		default:
13510358Smckusick 			return;
13610358Smckusick 	    }
13718469Sralph 	case PCCT_INT:
13810358Smckusick 	    switch (fromp2type) {
13918469Sralph 		case PCCT_INT:
14010358Smckusick 			return;
14118469Sralph 		case PCCT_CHAR:
14218469Sralph 		case PCCT_SHORT:
14318469Sralph 		case PCCT_DOUBLE:
14418469Sralph 			putop(PCC_SCONV, PCCT_INT);
14510358Smckusick 			return;
14610358Smckusick 		default:
14710358Smckusick 			return;
14810358Smckusick 	    }
14918469Sralph 	case PCCT_DOUBLE:
15010358Smckusick 	    switch (fromp2type) {
15118469Sralph 		case PCCT_DOUBLE:
15210358Smckusick 			return;
15318469Sralph 		case PCCT_CHAR:
15418469Sralph 		case PCCT_SHORT:
15518469Sralph 		case PCCT_INT:
15618469Sralph 			putop(PCC_SCONV, PCCT_DOUBLE);
15710358Smckusick 			return;
15810358Smckusick 		default:
15910358Smckusick 			return;
16010358Smckusick 	    }
16110358Smckusick 	default:
16210358Smckusick 		return;
16310358Smckusick     }
16410358Smckusick }
16510358Smckusick #endif mc68000
16610358Smckusick #endif PC
167