Commit | Line | Data |
---|---|---|
93009ed7 KM |
1 | /* Copyright (c) 1983 Regents of the University of California */ |
2 | ||
e804469b | 3 | static 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 | */ | |
23 | tuac(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 | */ | |
60 | sconv(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 | */ | |
100 | sconv(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 |