|
|
1.1 root 1: #! /bin/sh
2:
3: # $Id: sparc-fpu-auto.sh,v 1.4 2007/01/14 16:40:12 fredette Exp $
4:
5: # ic/sparc-fpu-auto.sh - automatically generates C code for many SPARC FPU
6: # emulation instructions:
7:
8: #
9: # Copyright (c) 2005 Matt Fredette
10: # All rights reserved.
11: #
12: # Redistribution and use in source and binary forms, with or without
13: # modification, are permitted provided that the following conditions
14: # are met:
15: # 1. Redistributions of source code must retain the above copyright
16: # notice, this list of conditions and the following disclaimer.
17: # 2. Redistributions in binary form must reproduce the above copyright
18: # notice, this list of conditions and the following disclaimer in the
19: # documentation and/or other materials provided with the distribution.
20: # 3. All advertising materials mentioning features or use of this software
21: # must display the following acknowledgement:
22: # This product includes software developed by Matt Fredette.
23: # 4. The name of the author may not be used to endorse or promote products
24: # derived from this software without specific prior written permission.
25: #
26: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27: # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
28: # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29: # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
30: # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31: # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32: # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33: # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34: # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35: # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36: # POSSIBILITY OF SUCH DAMAGE.
37: #
38:
39: header=false
40:
41: for option
42: do
43: case $option in
44: --header) header=true ;;
45: esac
46: done
47:
48: PROG=`basename $0`
49: cat <<EOF
50: /* automatically generated by $PROG, do not edit! */
51: _TME_RCSID("\$Id: sparc-fpu-auto.sh,v 1.4 2007/01/14 16:40:12 fredette Exp $");
52: EOF
53:
54: # the precision information helper script:
55: #
56: ieee754_precision_sh=`echo $0 | sed -e "s%$PROG%../ieee754/ieee754-precision.sh%"`
57:
58: # permute for the different precisions:
59: #
60: for precision in single double quad; do
61:
62: # get information about this precision:
63: #
64: eval `sh ${ieee754_precision_sh} ${precision}`
65:
66: dst_formats="(TME_FLOAT_FORMAT_IEEE754_${capprecision} | TME_FLOAT_FORMAT_IEEE754_${capprecision}_BUILTIN)"
67:
68: cat <<EOF
69:
70: /* this sets the floating-point condition codes after a
71: ${precision}-precision operation: */
72: static void inline
73: _tme_sparc_fpu_fcc_${precision}(struct tme_sparc *ic, const struct tme_float *dst, int trap_on_nan)
74: {
75: tme_uint32_t fcc;
76:
77: /* set fcc: */
78: fcc = (tme_float_is_nan(dst, ${dst_formats})
79: ? TME_SPARC_FSR_FCC_UN
80: : tme_float_is_zero(dst, ${dst_formats})
81: ? TME_SPARC_FSR_FCC_EQ
82: : tme_float_is_negative(dst, ${dst_formats})
83: ? TME_SPARC_FSR_FCC_LT
84: : TME_SPARC_FSR_FCC_GT);
85:
86: /* if this is an FCMPE and this is a NaN, we always cause an invalid exception: */
87: if (trap_on_nan && fcc == TME_SPARC_FSR_FCC_UN) {
88: _tme_sparc_fpu_exception_ieee754(&ic->tme_sparc_fpu_ieee754_ctl, TME_FLOAT_EXCEPTION_INVALID);
89: }
90:
91: /* set the floating-point condition codes: */
92: ic->tme_sparc_fpu_fsr = (ic->tme_sparc_fpu_fsr & ~TME_SPARC_FSR_FCC) | fcc;
93: }
94:
95: /* if the most significant bit of the NaN fraction is zero,
96: this is a signaling NaN: */
97: #define _TME_SPARC_FPU_IS_SNAN_${capprecision}(a) (((*(a))${chunk_member_0} & ((${chunk_mask_0} | (${chunk_mask_0} >> 1)) ^ (${chunk_mask_0} >> 1))) != 0)
98: static tme_int8_t
99: _tme_sparc_fpu_is_snan_${precision}(${integral} *value)
100: {
101: return (_TME_SPARC_FPU_IS_SNAN_${capprecision}(value));
102: }
103:
104: /* ${precision}-precision NaN propagation: */
105: static void
106: _tme_sparc_fpu_nan_from_nans_${precision}(struct tme_ieee754_ctl *ctl,
107: const ${integral} *a,
108: const ${integral} *b,
109: ${integral} *z)
110: {
111: struct tme_sparc *ic;
112: int a_is_snan;
113: int b_is_snan;
114:
115: /* recover our data structure : */
116: ic = ctl->tme_ieee754_ctl_private;
117:
118: /* see if any of the NaNs are signaling NaNs: */
119: a_is_snan = _TME_SPARC_FPU_IS_SNAN_${capprecision}(a);
120: b_is_snan = _TME_SPARC_FPU_IS_SNAN_${capprecision}(b);
121:
122: /* if either operand is a signaling NaN: */
123: if (a_is_snan || b_is_snan) {
124:
125: /* signal the signaling NaN: */
126: _tme_sparc_fpu_exception_ieee754(ctl, TME_FLOAT_EXCEPTION_INVALID);
127: }
128:
129: /* if and only if a (corresponding to f[rs1]) is a signaling NaN, do
130: we return a. at all other times we return b (corresponding to f[rs2]): */
131: if (a_is_snan) {
132: b = a;
133: }
134:
135: /* return the NaN, but make sure it's nonsignaling: */
136: *z = *b;
137: (*(z))${chunk_member_0} |= ((${chunk_mask_0} | (${chunk_mask_0} >> 1)) ^ (${chunk_mask_0} >> 1));
138: }
139:
140: EOF
141:
142: done
143:
144: if $header; then :; else
145: echo "#define _TME_SPARC_FPU_UNIMPL tme_sparc_fpu_exception(ic, TME_SPARC_FSR_FTT_unimplemented_FPop)"
146: echo "#define _TME_SPARC_FPU_UNIMPL_IF(flags) do { if ((ic->tme_sparc_fpu_flags & (flags)) != 0) { _TME_SPARC_FPU_UNIMPL; } } while (/* CONSTCOND */ 0)"
147: fi
148: quad="_TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);"
149:
150: # permute over fpop1/fpop2:
151: #
152: for fpop in fpop1 fpop2; do
153:
154: # placeholder for another permutation:
155: #
156: :
157:
158: # open the function:
159: #
160: echo ""
161: echo "void"
162: echo "tme_sparc_fpu_${fpop}(struct tme_sparc *ic)"
163: echo "{"
164: echo " tme_uint8_t rounding_mode;"
165: echo " unsigned int opf;"
166: echo " unsigned int fpreg_rd_number;"
167: echo " const struct tme_float *fpreg_rs1;"
168: echo " const struct tme_float *fpreg_rs2;"
169: if test ${fpop} = fpop1; then
170: echo " struct tme_float fpreg_rs1_buffer;"
171: echo " struct tme_float fpreg_rs2_buffer;"
172: fi
173: echo " struct tme_float fpreg_rd;"
174: echo " unsigned int fpreg_rd_format;"
175:
176: echo ""
177: echo " /* set the rounding mode: */"
178: echo " switch (ic->tme_sparc_fpu_fsr & TME_SPARC_FSR_RND) {"
179: echo " default: assert(FALSE);"
180: echo " case TME_SPARC_FSR_RND_RN: rounding_mode = TME_FLOAT_ROUND_NEAREST_EVEN; break;"
181: echo " case TME_SPARC_FSR_RND_RZ: rounding_mode = TME_FLOAT_ROUND_TO_ZERO; break;"
182: echo " case TME_SPARC_FSR_RND_RM: rounding_mode = TME_FLOAT_ROUND_DOWN; break;"
183: echo " case TME_SPARC_FSR_RND_RP: rounding_mode = TME_FLOAT_ROUND_UP; break;"
184: echo " }"
185: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = rounding_mode;"
186:
187: echo ""
188: echo " /* decode the rd and opf fields: */"
189: echo " fpreg_rd_number = TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, TME_SPARC_FORMAT3_MASK_RD);"
190: echo " opf = TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, (0x1ff << 5));"
191:
192: echo ""
193: echo " /* dispatch on the opf field: */"
194: echo " switch (opf) {"
195: echo "#define _TME_SPARC_FPU_FORMAT_RS1(format) fpreg_rs1 = tme_sparc_fpu_fpreg_read(ic, TME_SPARC_FORMAT3_MASK_RS1, (format))"
196: echo "#define _TME_SPARC_FPU_FORMAT_RS2(format) fpreg_rs2 = tme_sparc_fpu_fpreg_read(ic, TME_SPARC_FORMAT3_MASK_RS2, (format))"
197: echo "#define _TME_SPARC_FPU_FORMAT_RD(format) do { fpreg_rd_format = (format) | TME_IEEE754_FPREG_FORMAT_BUILTIN; tme_sparc_fpu_fpreg_aligned(ic, fpreg_rd_number, fpreg_rd_format); } while (/* CONSTCOND */ 0)"
198: echo ""
199:
200: # permute over the opf field:
201: #
202: opf_decimal=-1
203: while test ${opf_decimal} != 511; do
204: opf_decimal=`expr ${opf_decimal} + 1`
205:
206: # make the binary version of the opf field:
207: #
208: bits=9
209: opf=
210: opf_shifted=${opf_decimal}
211: while test ${bits} != 0; do
212: bits=`expr ${bits} - 1`
213: opf_shifted_next=`expr ${opf_shifted} / 2`
214: opf_test=`expr ${opf_shifted_next} \* 2`
215: if test ${opf_test} = ${opf_shifted}; then
216: opf="0${opf}"
217: else
218: opf="1${opf}"
219: fi
220: opf_shifted=${opf_shifted_next}
221: done
222:
223: # dispatch on the fpop/opf combination:
224: #
225: default=false
226: case "${fpop}:${opf}" in
227: fpop1:011000100)
228: echo " case ${opf_decimal}: /* ${opf} FiTOs: */"
229: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
230: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
231: echo " _TME_SPARC_FPU_BEGIN;"
232: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_int32,"
233: echo " fpreg_rs2->tme_float_value_ieee754_single, &fpreg_rd);"
234: ;;
235: fpop1:011001000)
236: echo " case ${opf_decimal}: /* ${opf} FiTOd: */"
237: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
238: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
239: echo " _TME_SPARC_FPU_BEGIN;"
240: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_int32,"
241: echo " fpreg_rs2->tme_float_value_ieee754_single, &fpreg_rd);"
242: ;;
243: fpop1:011001100)
244: echo " case ${opf_decimal}: /* ${opf} FiTOq: */"
245: echo " ${quad}"
246: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
247: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
248: echo " _TME_SPARC_FPU_BEGIN;"
249: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_int32,"
250: echo " fpreg_rs2->tme_float_value_ieee754_single, &fpreg_rd);"
251: ;;
252: fpop1:011010001)
253: echo " case ${opf_decimal}: /* ${opf} FsTOi: */"
254: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
255: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
256: echo " _TME_SPARC_FPU_BEGIN;"
257: echo " fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;"
258: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;"
259: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_to_int32,"
260: echo " fpreg_rs2, (tme_int32_t *) &fpreg_rd.tme_float_value_ieee754_single);"
261: ;;
262: fpop1:011010010)
263: echo " case ${opf_decimal}: /* ${opf} FdTOi: */"
264: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
265: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
266: echo " _TME_SPARC_FPU_BEGIN;"
267: echo " fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;"
268: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;"
269: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_to_int32,"
270: echo " fpreg_rs2, (tme_int32_t *) &fpreg_rd.tme_float_value_ieee754_single);"
271: ;;
272: fpop1:011010011)
273: echo " case ${opf_decimal}: /* ${opf} FqTOi: */"
274: echo " ${quad}"
275: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
276: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
277: echo " _TME_SPARC_FPU_BEGIN;"
278: echo " fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;"
279: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;"
280: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_to_int32,"
281: echo " fpreg_rs2, (tme_int32_t *) &fpreg_rd.tme_float_value_ieee754_single);"
282: ;;
283: fpop1:011001001)
284: echo " case ${opf_decimal}: /* ${opf} FsTOd: */"
285: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
286: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
287: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_single,"
288: echo " fpreg_rs2, &fpreg_rd);"
289: ;;
290: fpop1:011001101)
291: echo " case ${opf_decimal}: /* ${opf} FsTOq: */"
292: echo " ${quad}"
293: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
294: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
295: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_single,"
296: echo " fpreg_rs2, &fpreg_rd);"
297: ;;
298: fpop1:011000110)
299: echo " case ${opf_decimal}: /* ${opf} FdTOs: */"
300: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
301: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
302: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_double,"
303: echo " fpreg_rs2, &fpreg_rd);"
304: ;;
305: fpop1:011001110)
306: echo " case ${opf_decimal}: /* ${opf} FdTOq: */"
307: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
308: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
309: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_double,"
310: echo " fpreg_rs2, &fpreg_rd);"
311: ;;
312: fpop1:011000111)
313: echo " case ${opf_decimal}: /* ${opf} FqTOs: */"
314: echo " ${quad}"
315: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
316: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
317: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_quad,"
318: echo " fpreg_rs2, &fpreg_rd);"
319: ;;
320: fpop1:011001011)
321: echo " case ${opf_decimal}: /* ${opf} FqTOd: */"
322: echo " ${quad}"
323: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
324: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
325: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_quad,"
326: echo " fpreg_rs2, &fpreg_rd);"
327: ;;
328: fpop1:000000001)
329: echo " case ${opf_decimal}: /* ${opf} FMOVs: */"
330: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
331: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
332: echo " _TME_SPARC_FPU_BEGIN;"
333: echo " fpreg_rd = *fpreg_rs2;"
334: ;;
335: fpop1:000000101)
336: echo " case ${opf_decimal}: /* ${opf} FNEGs: */"
337: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
338: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
339: echo " _TME_SPARC_FPU_BEGIN;"
340: echo " fpreg_rd = *fpreg_rs2;"
341: echo " fpreg_rd.tme_float_value_ieee754_single ^= 0x80000000;"
342: ;;
343: fpop1:000001001)
344: echo " case ${opf_decimal}: /* ${opf} FABSs: */"
345: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
346: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
347: echo " _TME_SPARC_FPU_BEGIN;"
348: echo " fpreg_rd = *fpreg_rs2;"
349: echo " fpreg_rd.tme_float_value_ieee754_single &= ~0x80000000;"
350: ;;
351: fpop1:000101001)
352: echo " case ${opf_decimal}: /* ${opf} FSQRTs: */"
353: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FSQRT);"
354: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
355: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
356: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_sqrt,"
357: echo " fpreg_rs2, &fpreg_rd);"
358: ;;
359: fpop1:000101010)
360: echo " case ${opf_decimal}: /* ${opf} FSQRTd: */"
361: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FSQRT);"
362: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
363: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
364: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_sqrt,"
365: echo " fpreg_rs2, &fpreg_rd);"
366: ;;
367: fpop1:000101011)
368: echo " case ${opf_decimal}: /* ${opf} FSQRTq: */"
369: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FSQRT | TME_SPARC_FPU_FLAG_NO_QUAD);"
370: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
371: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
372: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_sqrt,"
373: echo " fpreg_rs2, &fpreg_rd);"
374: ;;
375: fpop1:001000001)
376: echo " case ${opf_decimal}: /* ${opf} FADDs: */"
377: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
378: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
379: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
380: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_add,"
381: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
382: ;;
383: fpop1:001000010)
384: echo " case ${opf_decimal}: /* ${opf} FADDd: */"
385: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
386: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
387: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
388: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_add,"
389: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
390: ;;
391: fpop1:001000011)
392: echo " case ${opf_decimal}: /* ${opf} FADDq: */"
393: echo " ${quad}"
394: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
395: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
396: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
397: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_add,"
398: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
399: ;;
400: fpop1:001000101)
401: echo " case ${opf_decimal}: /* ${opf} FSUBs: */"
402: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
403: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
404: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
405: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_sub,"
406: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
407: ;;
408: fpop1:001000110)
409: echo " case ${opf_decimal}: /* ${opf} FSUBd: */"
410: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
411: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
412: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
413: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_sub,"
414: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
415: ;;
416: fpop1:001000111)
417: echo " case ${opf_decimal}: /* ${opf} FSUBq: */"
418: echo " ${quad}"
419: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
420: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
421: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
422: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_sub,"
423: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
424: ;;
425: fpop1:001001001)
426: echo " case ${opf_decimal}: /* ${opf} FMULs: */"
427: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
428: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
429: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
430: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_mul,"
431: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
432: ;;
433: fpop1:001001010)
434: echo " case ${opf_decimal}: /* ${opf} FMULd: */"
435: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
436: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
437: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
438: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_mul,"
439: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
440: ;;
441: fpop1:001001011)
442: echo " case ${opf_decimal}: /* ${opf} FMULq: */"
443: echo " ${quad}"
444: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
445: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
446: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
447: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_mul,"
448: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
449: ;;
450: fpop1:001101001)
451: echo " case ${opf_decimal}: /* ${opf} FsMULd: */"
452: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FMUL_WIDER);"
453: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
454: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
455: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
456: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_single,"
457: echo " fpreg_rs1, &fpreg_rs1_buffer);"
458: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_single,"
459: echo " fpreg_rs2, &fpreg_rs2_buffer);"
460: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_mul,"
461: echo " &fpreg_rs1_buffer, &fpreg_rs2_buffer, &fpreg_rd);"
462: ;;
463: fpop1:001101110)
464: echo " case ${opf_decimal}: /* ${opf} FdMULq: */"
465: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FMUL_WIDER | TME_SPARC_FPU_FLAG_NO_QUAD);"
466: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
467: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
468: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
469: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_double,"
470: echo " fpreg_rs1, &fpreg_rs1_buffer);"
471: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_double,"
472: echo " fpreg_rs2, &fpreg_rs2_buffer);"
473: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_mul,"
474: echo " &fpreg_rs1_buffer, &fpreg_rs2_buffer, &fpreg_rd);"
475: ;;
476: fpop1:001001101)
477: echo " case ${opf_decimal}: /* ${opf} FDIVs: */"
478: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
479: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
480: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
481: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_div,"
482: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
483: ;;
484: fpop1:001001110)
485: echo " case ${opf_decimal}: /* ${opf} FDIVd: */"
486: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
487: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
488: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
489: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_div,"
490: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
491: ;;
492: fpop1:001001111)
493: echo " case ${opf_decimal}: /* ${opf} FDIVq: */"
494: echo " ${quad}"
495: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
496: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
497: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
498: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_div,"
499: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
500: ;;
501: fpop2:001010001)
502: echo " case ${opf_decimal}: /* ${opf} FCMPs: */"
503: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
504: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
505: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_sub,"
506: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
507: echo " _tme_sparc_fpu_fcc_single(ic, &fpreg_rd, FALSE);"
508: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
509: ;;
510: fpop2:001010010)
511: echo " case ${opf_decimal}: /* ${opf} FCMPd: */"
512: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
513: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
514: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_sub,"
515: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
516: echo " _tme_sparc_fpu_fcc_double(ic, &fpreg_rd, FALSE);"
517: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
518: ;;
519: fpop2:001010011)
520: echo " case ${opf_decimal}: /* ${opf} FCMPq: */"
521: echo " ${quad}"
522: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
523: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
524: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_sub,"
525: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
526: echo " _tme_sparc_fpu_fcc_quad(ic, &fpreg_rd, FALSE);"
527: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
528: ;;
529: fpop2:001010101)
530: echo " case ${opf_decimal}: /* ${opf} FCMPEs: */"
531: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
532: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
533: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_sub,"
534: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
535: echo " _tme_sparc_fpu_fcc_single(ic, &fpreg_rd, TRUE);"
536: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
537: ;;
538: fpop2:001010110)
539: echo " case ${opf_decimal}: /* ${opf} FCMPEd: */"
540: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
541: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
542: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_sub,"
543: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
544: echo " _tme_sparc_fpu_fcc_double(ic, &fpreg_rd, TRUE);"
545: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
546: ;;
547: fpop2:001010111)
548: echo " case ${opf_decimal}: /* ${opf} FCMPEq: */"
549: echo " ${quad}"
550: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
551: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
552: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_sub,"
553: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
554: echo " _tme_sparc_fpu_fcc_quad(ic, &fpreg_rd, TRUE);"
555: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
556: ;;
557: *) default=true ;;
558: esac
559: if $default; then :; else echo " break;"; echo ""; fi
560: done
561: echo " default: _TME_SPARC_FPU_UNIMPL; fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL; break;"
562: echo ""
563: echo "#undef _TME_SPARC_FPU_FORMAT_RS1"
564: echo "#undef _TME_SPARC_FPU_FORMAT_RS2"
565: echo "#undef _TME_SPARC_FPU_FORMAT_RD"
566: echo " }"
567:
568: echo ""
569: echo " /* store any destination: */"
570: echo " if (fpreg_rd_format != TME_IEEE754_FPREG_FORMAT_NULL) {"
571: echo " tme_sparc_fpu_fpreg_format(ic, fpreg_rd_number, fpreg_rd_format);"
572: echo " ic->tme_sparc_fpu_fpregs[fpreg_rd_number] = fpreg_rd;"
573: echo " }"
574:
575: echo ""
576: echo "}"
577: :
578: done
579:
580: # done:
581: #
582: exit 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.