BSD 4_1c_2 release
[unix-history] / usr / src / ucb / pascal / src / sconv.c
CommitLineData
93009ed7
KM
1/* Copyright (c) 1983 Regents of the University of California */
2
e804469b 3static char sccsid[] = "@(#)sconv.c 1.2 2/1/83";
93009ed7
KM
4
5 /*
6 * functions to help pi put out
7 * polish postfix binary portable c compiler intermediate code
8 * thereby becoming the portable pascal compiler
9 */
10
11#include "whoami.h"
12#ifdef PC
13#include "0.h"
14#include "pcops.h"
93009ed7
KM
15
16 /*
17 * this routine enforces ``the usual arithmetic conversions''
18 * all integral operands are converted to ints.
19 * if either operand is a double, both are made to be double.
20 * this routine takes struct nl *'s for the types,
21 * and returns both the struct nl * and the p2type for the result.
22 */
23tuac(thistype, thattype, resulttypep, resultp2typep)
24 struct nl *thistype;
25 struct nl *thattype;
26 struct nl **resulttypep;
27 int *resultp2typep;
28{
29 int thisp2type = p2type(thistype);
30 int thatp2type = p2type(thattype);
31
32 *resulttypep = thistype;
33 *resultp2typep = thisp2type;
34 /*
35 * should only be passed scalars
36 */
37 if (isnta(thistype,"sbcid") || isnta(thattype,"sbcid")) {
38 return;
39 }
3a73d1c1 40 if (thisp2type == P2CHAR || thisp2type == P2SHORT) {
93009ed7
KM
41 *resultp2typep = P2INT;
42 *resulttypep = nl + T4INT;
43 }
44 if (*resultp2typep == P2INT && thatp2type == P2DOUBLE) {
45 *resultp2typep = P2DOUBLE;
46 *resulttypep = nl + TDOUBLE;
47 }
48 sconv(thisp2type, *resultp2typep);
49}
50
51 /*
52 * this routine will emit sconv operators when it thinks they are needed.
53 * this is code generator specific, rather than machine-specific.
54 * this routine takes p2types for arguments, not struct nl *'s.
55 */
56#ifdef vax
57 /*
58 * the vax code genrator is very good, this routine is extremely boring.
59 */
60sconv(fromp2type, top2type)
61 int fromp2type;
62 int top2type;
63{
64
65 switch (top2type) {
66 case P2CHAR:
67 case P2SHORT:
68 case P2INT:
69 switch (fromp2type) {
70 case P2CHAR:
71 case P2SHORT:
72 case P2INT:
73 case P2DOUBLE:
74 return; /* pass1 knows how to do these */
75 default:
76 return;
77 }
78 case P2DOUBLE:
79 switch (fromp2type) {
80 case P2CHAR:
81 case P2SHORT:
82 case P2INT:
83 putop(P2SCONV, P2DOUBLE);
84 return;
85 case P2DOUBLE:
86 return;
87 default:
88 return;
89 }
90 default:
91 return;
92 }
93}
94#endif vax
95#ifdef mc68000
96 /*
97 * i don't know how much to trust the mc68000 compiler,
98 * so this routine is full.
99 */
100sconv(fromp2type, top2type)
101 int fromp2type;
102 int top2type;
103{
104
105 switch (top2type) {
106 case P2CHAR:
107 switch (fromp2type) {
108 case P2CHAR:
109 return;
110 case P2SHORT:
111 case P2INT:
112 case P2DOUBLE:
113 putop(P2SCONV, P2CHAR);
114 return;
115 default:
116 return;
117 }
118 case P2SHORT:
119 switch (fromp2type) {
120 case P2SHORT:
121 return;
122 case P2CHAR:
123 case P2INT:
124 case P2DOUBLE:
125 putop(P2SCONV, P2SHORT);
126 return;
127 default:
128 return;
129 }
130 case P2INT:
131 switch (fromp2type) {
132 case P2INT:
133 return;
134 case P2CHAR:
135 case P2SHORT:
136 case P2DOUBLE:
137 putop(P2SCONV, P2INT);
138 return;
139 default:
140 return;
141 }
142 case P2DOUBLE:
143 switch (fromp2type) {
144 case P2DOUBLE:
145 return;
146 case P2CHAR:
147 case P2SHORT:
148 case P2INT:
149 putop(P2SCONV, P2DOUBLE);
150 return;
151 default:
152 return;
153 }
154 default:
155 return;
156 }
157}
158#endif mc68000
159#endif PC