|
|
1.1 root 1: #! /bin/sh
2:
1.1.1.2 ! root 3: # $Id: sparc-fpu-auto.sh,v 1.6 2009/11/08 16:27:12 fredette Exp $
1.1 root 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! */
1.1.1.2 ! root 51: _TME_RCSID("\$Id: sparc-fpu-auto.sh,v 1.6 2009/11/08 16:27:12 fredette Exp $");
1.1 root 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;
1.1.1.2 ! root 76: unsigned int cc;
1.1 root 77:
78: /* set fcc: */
79: fcc = (tme_float_is_nan(dst, ${dst_formats})
80: ? TME_SPARC_FSR_FCC_UN
81: : tme_float_is_zero(dst, ${dst_formats})
82: ? TME_SPARC_FSR_FCC_EQ
83: : tme_float_is_negative(dst, ${dst_formats})
84: ? TME_SPARC_FSR_FCC_LT
85: : TME_SPARC_FSR_FCC_GT);
86:
87: /* if this is an FCMPE and this is a NaN, we always cause an invalid exception: */
88: if (trap_on_nan && fcc == TME_SPARC_FSR_FCC_UN) {
89: _tme_sparc_fpu_exception_ieee754(&ic->tme_sparc_fpu_ieee754_ctl, TME_FLOAT_EXCEPTION_INVALID);
90: }
91:
92: /* set the floating-point condition codes: */
1.1.1.2 ! root 93: if (TME_SPARC_VERSION(ic) >= 9) {
! 94: cc = TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, (0x3 << 25));
! 95: if (cc != 0) {
! 96: fcc = TME_FIELD_MASK_EXTRACTU(fcc, TME_SPARC_FSR_FCC);
! 97: ic->tme_sparc_fpu_xfsr
! 98: = ((ic->tme_sparc_fpu_xfsr
! 99: & ~ (tme_uint32_t) (0x3 << (2 * (cc - 1))))
! 100: | (fcc << (2 * (cc - 1))));
! 101: return;
! 102: }
! 103: }
1.1 root 104: ic->tme_sparc_fpu_fsr = (ic->tme_sparc_fpu_fsr & ~TME_SPARC_FSR_FCC) | fcc;
105: }
106:
107: /* if the most significant bit of the NaN fraction is zero,
108: this is a signaling NaN: */
109: #define _TME_SPARC_FPU_IS_SNAN_${capprecision}(a) (((*(a))${chunk_member_0} & ((${chunk_mask_0} | (${chunk_mask_0} >> 1)) ^ (${chunk_mask_0} >> 1))) != 0)
110: static tme_int8_t
111: _tme_sparc_fpu_is_snan_${precision}(${integral} *value)
112: {
113: return (_TME_SPARC_FPU_IS_SNAN_${capprecision}(value));
114: }
115:
116: /* ${precision}-precision NaN propagation: */
117: static void
118: _tme_sparc_fpu_nan_from_nans_${precision}(struct tme_ieee754_ctl *ctl,
119: const ${integral} *a,
120: const ${integral} *b,
121: ${integral} *z)
122: {
123: struct tme_sparc *ic;
124: int a_is_snan;
125: int b_is_snan;
126:
127: /* recover our data structure : */
128: ic = ctl->tme_ieee754_ctl_private;
129:
130: /* see if any of the NaNs are signaling NaNs: */
131: a_is_snan = _TME_SPARC_FPU_IS_SNAN_${capprecision}(a);
132: b_is_snan = _TME_SPARC_FPU_IS_SNAN_${capprecision}(b);
133:
134: /* if either operand is a signaling NaN: */
135: if (a_is_snan || b_is_snan) {
136:
137: /* signal the signaling NaN: */
138: _tme_sparc_fpu_exception_ieee754(ctl, TME_FLOAT_EXCEPTION_INVALID);
139: }
140:
141: /* if and only if a (corresponding to f[rs1]) is a signaling NaN, do
142: we return a. at all other times we return b (corresponding to f[rs2]): */
143: if (a_is_snan) {
144: b = a;
145: }
146:
147: /* return the NaN, but make sure it's nonsignaling: */
148: *z = *b;
149: (*(z))${chunk_member_0} |= ((${chunk_mask_0} | (${chunk_mask_0} >> 1)) ^ (${chunk_mask_0} >> 1));
150: }
151:
152: EOF
153:
154: done
155:
156: if $header; then :; else
157: echo "#define _TME_SPARC_FPU_UNIMPL tme_sparc_fpu_exception(ic, TME_SPARC_FSR_FTT_unimplemented_FPop)"
158: echo "#define _TME_SPARC_FPU_UNIMPL_IF(flags) do { if ((ic->tme_sparc_fpu_flags & (flags)) != 0) { _TME_SPARC_FPU_UNIMPL; } } while (/* CONSTCOND */ 0)"
159: fi
160: quad="_TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);"
161:
162: # permute over fpop1/fpop2:
163: #
164: for fpop in fpop1 fpop2; do
165:
166: # placeholder for another permutation:
167: #
168: :
169:
170: # open the function:
171: #
172: echo ""
173: echo "void"
174: echo "tme_sparc_fpu_${fpop}(struct tme_sparc *ic)"
175: echo "{"
176: echo " tme_uint8_t rounding_mode;"
177: echo " unsigned int opf;"
1.1.1.2 ! root 178: echo " unsigned int fpreg_rd_number_encoded;"
1.1 root 179: echo " unsigned int fpreg_rd_number;"
180: echo " const struct tme_float *fpreg_rs1;"
181: echo " const struct tme_float *fpreg_rs2;"
182: if test ${fpop} = fpop1; then
183: echo " struct tme_float fpreg_rs1_buffer;"
184: echo " struct tme_float fpreg_rs2_buffer;"
1.1.1.2 ! root 185: else
! 186: echo " unsigned int cc;"
! 187: echo " tme_uint32_t conds_mask;"
! 188: echo " unsigned int cc_i;"
! 189: echo " tme_uint32_t cond;"
1.1 root 190: fi
191: echo " struct tme_float fpreg_rd;"
192: echo " unsigned int fpreg_rd_format;"
193:
194: echo ""
195: echo " /* set the rounding mode: */"
196: echo " switch (ic->tme_sparc_fpu_fsr & TME_SPARC_FSR_RND) {"
197: echo " default: assert(FALSE);"
198: echo " case TME_SPARC_FSR_RND_RN: rounding_mode = TME_FLOAT_ROUND_NEAREST_EVEN; break;"
199: echo " case TME_SPARC_FSR_RND_RZ: rounding_mode = TME_FLOAT_ROUND_TO_ZERO; break;"
200: echo " case TME_SPARC_FSR_RND_RM: rounding_mode = TME_FLOAT_ROUND_DOWN; break;"
201: echo " case TME_SPARC_FSR_RND_RP: rounding_mode = TME_FLOAT_ROUND_UP; break;"
202: echo " }"
203: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = rounding_mode;"
204:
205: echo ""
206: echo " /* decode the rd and opf fields: */"
1.1.1.2 ! root 207: echo " fpreg_rd_number_encoded = TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, TME_SPARC_FORMAT3_MASK_RD);"
1.1 root 208: echo " opf = TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, (0x1ff << 5));"
209:
210: echo ""
1.1.1.2 ! root 211: echo " /* silence uninitialized variable warnings: */"
! 212: echo " fpreg_rd_number = 0;"
! 213:
! 214: echo ""
! 215: echo "#ifdef _TME_SPARC_RECODE_VERIFY"
! 216: echo " /* clear the rd buffer: */"
! 217: echo " memset(&fpreg_rd, 0, sizeof(fpreg_rd));"
! 218: echo "#endif /* _TME_SPARC_RECODE_VERIFY */"
! 219:
! 220: fmovcc=
! 221: if test ${fpop} = fpop2; then
! 222: fmovcc=cc
! 223: echo ""
! 224: echo " /* if this is an FMOVcc: */"
! 225: echo " if (((opf - 1) & 0x3f) < 3) {"
! 226: echo ""
! 227: echo " /* if opf bit eight is set, this uses integer condition codes: */"
! 228: echo " if (opf & TME_BIT(8)) {"
! 229: echo ""
! 230: echo " /* if opf bit six is set, this is unimplemented: */"
! 231: echo " if (__tme_predict_false(opf & TME_BIT(6))) {"
! 232: echo " _TME_SPARC_FPU_UNIMPL;"
! 233: echo " }"
! 234: echo ""
! 235: echo " /* get %icc or %xcc, depending on opf bit seven: */"
! 236: echo " cc = ic->tme_sparc64_ireg_ccr;"
! 237: echo " if (opf & TME_BIT(7)) {"
! 238: echo " cc /= (TME_SPARC64_CCR_XCC / TME_SPARC64_CCR_ICC);"
! 239: echo " }"
! 240: echo " cc = TME_FIELD_MASK_EXTRACTU(cc, TME_SPARC64_CCR_ICC);"
! 241: echo ""
! 242: echo " /* get the conditions mask: */"
! 243: echo " conds_mask = _tme_sparc_conds_icc[cc];"
! 244: echo " }"
! 245: echo ""
! 246: echo " /* otherwise, this uses floating-point condition codes: */"
! 247: echo " else {"
! 248: echo ""
! 249: echo " /* get the right %fcc: */"
! 250: echo " cc_i = TME_FIELD_MASK_EXTRACTU(opf, (0x3 << 6));"
! 251: echo " if (cc_i == 0) {"
! 252: echo " cc = TME_FIELD_MASK_EXTRACTU(ic->tme_sparc_fpu_fsr, TME_SPARC_FSR_FCC);"
! 253: echo " }"
! 254: echo " else {"
! 255: echo " cc = (ic->tme_sparc_fpu_xfsr >> (2 * (cc_i - 1))) & 0x3;"
! 256: echo " }"
! 257: echo ""
! 258: echo " /* get the conditions mask: */"
! 259: echo " conds_mask = _tme_sparc_conds_fcc[cc];"
! 260: echo " }"
! 261: echo ""
! 262: echo " /* add the not-conditions to the conditions mask: */"
! 263: echo " conds_mask += ((~conds_mask) << 8);"
! 264: echo ""
! 265: echo " /* get the cond field: */"
! 266: echo " cond = TME_BIT(TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, (0xf << 14)));"
! 267: echo ""
! 268: echo " /* if the condition is not true: */"
! 269: echo " if (!(conds_mask & cond)) {"
! 270: echo ""
! 271: echo " /* return now: */"
! 272: echo " /* NB that this may expose us to guests, since we do not check"
! 273: echo " that the floating-point register numbers are valid: */"
! 274: echo " return;"
! 275: echo " }"
! 276: echo ""
! 277: echo " /* clear bits six, seven, and eight in opf: */"
! 278: echo " opf &= 0x3f;"
! 279: echo " }"
! 280: fi
! 281:
! 282: echo ""
1.1 root 283: echo " /* dispatch on the opf field: */"
284: echo " switch (opf) {"
285: echo "#define _TME_SPARC_FPU_FORMAT_RS1(format) fpreg_rs1 = tme_sparc_fpu_fpreg_read(ic, TME_SPARC_FORMAT3_MASK_RS1, (format))"
286: echo "#define _TME_SPARC_FPU_FORMAT_RS2(format) fpreg_rs2 = tme_sparc_fpu_fpreg_read(ic, TME_SPARC_FORMAT3_MASK_RS2, (format))"
1.1.1.2 ! root 287: echo "#define _TME_SPARC_FPU_FORMAT_RD(format) do { fpreg_rd_format = (format) | TME_IEEE754_FPREG_FORMAT_BUILTIN; fpreg_rd_number = tme_sparc_fpu_fpreg_decode(ic, fpreg_rd_number_encoded, fpreg_rd_format); } while (/* CONSTCOND */ 0)"
1.1 root 288: echo ""
289:
290: # permute over the opf field:
291: #
292: opf_decimal=-1
293: while test ${opf_decimal} != 511; do
294: opf_decimal=`expr ${opf_decimal} + 1`
295:
296: # make the binary version of the opf field:
297: #
298: bits=9
299: opf=
300: opf_shifted=${opf_decimal}
301: while test ${bits} != 0; do
302: bits=`expr ${bits} - 1`
303: opf_shifted_next=`expr ${opf_shifted} / 2`
304: opf_test=`expr ${opf_shifted_next} \* 2`
305: if test ${opf_test} = ${opf_shifted}; then
306: opf="0${opf}"
307: else
308: opf="1${opf}"
309: fi
310: opf_shifted=${opf_shifted_next}
311: done
312:
313: # dispatch on the fpop/opf combination:
314: #
315: default=false
316: case "${fpop}:${opf}" in
317: fpop1:011000100)
318: echo " case ${opf_decimal}: /* ${opf} FiTOs: */"
319: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
320: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
321: echo " _TME_SPARC_FPU_BEGIN;"
322: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_int32,"
323: echo " fpreg_rs2->tme_float_value_ieee754_single, &fpreg_rd);"
324: ;;
325: fpop1:011001000)
326: echo " case ${opf_decimal}: /* ${opf} FiTOd: */"
327: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
328: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
329: echo " _TME_SPARC_FPU_BEGIN;"
330: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_int32,"
331: echo " fpreg_rs2->tme_float_value_ieee754_single, &fpreg_rd);"
332: ;;
333: fpop1:011001100)
334: echo " case ${opf_decimal}: /* ${opf} FiTOq: */"
335: echo " ${quad}"
336: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
337: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
338: echo " _TME_SPARC_FPU_BEGIN;"
339: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_int32,"
340: echo " fpreg_rs2->tme_float_value_ieee754_single, &fpreg_rd);"
341: ;;
1.1.1.2 ! root 342: fpop1:010000100)
! 343: echo " case ${opf_decimal}: /* ${opf} FxTOs: */"
! 344: echo "#ifdef TME_HAVE_INT64_T"
! 345: echo " if (__tme_predict_true(TME_SPARC_VERSION(ic) >= 9)) {"
! 346: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 347: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
! 348: echo " _TME_SPARC_FPU_BEGIN;"
! 349: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_int64,"
! 350: echo " fpreg_rs2->tme_float_value_ieee754_double.tme_value64_int, &fpreg_rd);"
! 351: echo " break;"
! 352: echo " }"
! 353: echo "#endif /* TME_HAVE_INT64_T */"
! 354: echo " _TME_SPARC_FPU_UNIMPL;"
! 355: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
! 356: ;;
! 357: fpop1:010001000)
! 358: echo " case ${opf_decimal}: /* ${opf} FxTOd: */"
! 359: echo "#ifdef TME_HAVE_INT64_T"
! 360: echo " if (__tme_predict_true(TME_SPARC_VERSION(ic) >= 9)) {"
! 361: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 362: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 363: echo " _TME_SPARC_FPU_BEGIN;"
! 364: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_int64,"
! 365: echo " fpreg_rs2->tme_float_value_ieee754_double.tme_value64_int, &fpreg_rd);"
! 366: echo " break;"
! 367: echo " }"
! 368: echo "#endif /* TME_HAVE_INT64_T */"
! 369: echo " _TME_SPARC_FPU_UNIMPL;"
! 370: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
! 371: ;;
! 372: fpop1:010001100)
! 373: echo " case ${opf_decimal}: /* ${opf} FxTOq: */"
! 374: echo "#ifdef TME_HAVE_INT64_T"
! 375: echo " if (__tme_predict_true(TME_SPARC_VERSION(ic) >= 9)) {"
! 376: echo " ${quad}"
! 377: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 378: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
! 379: echo " _TME_SPARC_FPU_BEGIN;"
! 380: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_int64,"
! 381: echo " fpreg_rs2->tme_float_value_ieee754_double.tme_value64_int, &fpreg_rd);"
! 382: echo " break;"
! 383: echo " }"
! 384: echo "#endif /* TME_HAVE_INT64_T */"
! 385: echo " _TME_SPARC_FPU_UNIMPL;"
! 386: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
! 387: ;;
1.1 root 388: fpop1:011010001)
389: echo " case ${opf_decimal}: /* ${opf} FsTOi: */"
390: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
391: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
392: echo " _TME_SPARC_FPU_BEGIN;"
393: echo " fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;"
394: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;"
395: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_to_int32,"
396: echo " fpreg_rs2, (tme_int32_t *) &fpreg_rd.tme_float_value_ieee754_single);"
397: ;;
398: fpop1:011010010)
399: echo " case ${opf_decimal}: /* ${opf} FdTOi: */"
400: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
401: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
402: echo " _TME_SPARC_FPU_BEGIN;"
403: echo " fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;"
404: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;"
405: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_to_int32,"
406: echo " fpreg_rs2, (tme_int32_t *) &fpreg_rd.tme_float_value_ieee754_single);"
407: ;;
408: fpop1:011010011)
409: echo " case ${opf_decimal}: /* ${opf} FqTOi: */"
410: echo " ${quad}"
411: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
412: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
413: echo " _TME_SPARC_FPU_BEGIN;"
414: echo " fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;"
415: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;"
416: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_to_int32,"
417: echo " fpreg_rs2, (tme_int32_t *) &fpreg_rd.tme_float_value_ieee754_single);"
418: ;;
1.1.1.2 ! root 419: fpop1:010000001)
! 420: echo " case ${opf_decimal}: /* ${opf} FsTOx: */"
! 421: echo "#ifdef TME_HAVE_INT64_T"
! 422: echo " if (__tme_predict_true(TME_SPARC_VERSION(ic) >= 9)) {"
! 423: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
! 424: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 425: echo " _TME_SPARC_FPU_BEGIN;"
! 426: echo " fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE;"
! 427: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;"
! 428: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_to_int64,"
! 429: echo " fpreg_rs2, &fpreg_rd.tme_float_value_ieee754_double.tme_value64_int);"
! 430: echo " break;"
! 431: echo " }"
! 432: echo "#endif /* TME_HAVE_INT64_T */"
! 433: echo " _TME_SPARC_FPU_UNIMPL;"
! 434: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
! 435: ;;
! 436: fpop1:010000010)
! 437: echo " case ${opf_decimal}: /* ${opf} FdTOx: */"
! 438: echo "#ifdef TME_HAVE_INT64_T"
! 439: echo " if (__tme_predict_true(TME_SPARC_VERSION(ic) >= 9)) {"
! 440: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
! 441: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 442: echo " _TME_SPARC_FPU_BEGIN;"
! 443: echo " fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE;"
! 444: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;"
! 445: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_to_int64,"
! 446: echo " fpreg_rs2, &fpreg_rd.tme_float_value_ieee754_double.tme_value64_int);"
! 447: echo " break;"
! 448: echo " }"
! 449: echo "#endif /* TME_HAVE_INT64_T */"
! 450: echo " _TME_SPARC_FPU_UNIMPL;"
! 451: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
! 452: ;;
! 453: fpop1:010000011)
! 454: echo " case ${opf_decimal}: /* ${opf} FqTOx: */"
! 455: echo "#ifdef TME_HAVE_INT64_T"
! 456: echo " if (__tme_predict_true(TME_SPARC_VERSION(ic) >= 9)) {"
! 457: echo " ${quad}"
! 458: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
! 459: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 460: echo " _TME_SPARC_FPU_BEGIN;"
! 461: echo " fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_DOUBLE;"
! 462: echo " ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;"
! 463: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_to_int64,"
! 464: echo " fpreg_rs2, &fpreg_rd.tme_float_value_ieee754_double.tme_value64_int);"
! 465: echo " break;"
! 466: echo " }"
! 467: echo "#endif /* TME_HAVE_INT64_T */"
! 468: echo " _TME_SPARC_FPU_UNIMPL;"
! 469: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
! 470: ;;
1.1 root 471: fpop1:011001001)
472: echo " case ${opf_decimal}: /* ${opf} FsTOd: */"
473: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
474: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
475: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_single,"
476: echo " fpreg_rs2, &fpreg_rd);"
477: ;;
478: fpop1:011001101)
479: echo " case ${opf_decimal}: /* ${opf} FsTOq: */"
480: echo " ${quad}"
481: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
482: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
483: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_single,"
484: echo " fpreg_rs2, &fpreg_rd);"
485: ;;
486: fpop1:011000110)
487: echo " case ${opf_decimal}: /* ${opf} FdTOs: */"
488: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
489: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
490: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_double,"
491: echo " fpreg_rs2, &fpreg_rd);"
492: ;;
493: fpop1:011001110)
494: echo " case ${opf_decimal}: /* ${opf} FdTOq: */"
495: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
496: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
497: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_double,"
498: echo " fpreg_rs2, &fpreg_rd);"
499: ;;
500: fpop1:011000111)
501: echo " case ${opf_decimal}: /* ${opf} FqTOs: */"
502: echo " ${quad}"
503: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
504: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
505: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_quad,"
506: echo " fpreg_rs2, &fpreg_rd);"
507: ;;
508: fpop1:011001011)
509: echo " case ${opf_decimal}: /* ${opf} FqTOd: */"
510: echo " ${quad}"
511: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
512: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
513: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_quad,"
514: echo " fpreg_rs2, &fpreg_rd);"
515: ;;
1.1.1.2 ! root 516: fpop1:000000001 | fpop2:000000001)
! 517: echo " case ${opf_decimal}: /* ${opf} FMOVs${fmovcc}: */"
1.1 root 518: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
519: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
520: echo " _TME_SPARC_FPU_BEGIN;"
521: echo " fpreg_rd = *fpreg_rs2;"
522: ;;
1.1.1.2 ! root 523: fpop1:000000010 | fpop2:000000010)
! 524: echo " case ${opf_decimal}: /* ${opf} FMOVd${fmovcc}: */"
! 525: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
! 526: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 527: echo " _TME_SPARC_FPU_BEGIN;"
! 528: echo " fpreg_rd = *fpreg_rs2;"
! 529: ;;
1.1 root 530: fpop1:000000101)
531: echo " case ${opf_decimal}: /* ${opf} FNEGs: */"
532: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
533: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
534: echo " _TME_SPARC_FPU_BEGIN;"
535: echo " fpreg_rd = *fpreg_rs2;"
536: echo " fpreg_rd.tme_float_value_ieee754_single ^= 0x80000000;"
537: ;;
1.1.1.2 ! root 538: fpop1:000000110)
! 539: echo " case ${opf_decimal}: /* ${opf} FNEGd: */"
! 540: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 541: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 542: echo " _TME_SPARC_FPU_BEGIN;"
! 543: echo " fpreg_rd = *fpreg_rs2;"
! 544: echo " fpreg_rd.tme_float_value_ieee754_double.tme_value64_uint32_hi ^= 0x80000000;"
! 545: ;;
1.1 root 546: fpop1:000001001)
547: echo " case ${opf_decimal}: /* ${opf} FABSs: */"
548: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);"
549: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
550: echo " _TME_SPARC_FPU_BEGIN;"
551: echo " fpreg_rd = *fpreg_rs2;"
552: echo " fpreg_rd.tme_float_value_ieee754_single &= ~0x80000000;"
553: ;;
1.1.1.2 ! root 554: fpop1:000001010)
! 555: echo " case ${opf_decimal}: /* ${opf} FABSd: */"
! 556: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 557: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
! 558: echo " _TME_SPARC_FPU_BEGIN;"
! 559: echo " fpreg_rd = *fpreg_rs2;"
! 560: echo " fpreg_rd.tme_float_value_ieee754_double.tme_value64_uint32_hi &= ~0x80000000;"
! 561: ;;
1.1 root 562: fpop1:000101001)
563: echo " case ${opf_decimal}: /* ${opf} FSQRTs: */"
564: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FSQRT);"
565: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
566: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
567: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_sqrt,"
568: echo " fpreg_rs2, &fpreg_rd);"
569: ;;
570: fpop1:000101010)
571: echo " case ${opf_decimal}: /* ${opf} FSQRTd: */"
572: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FSQRT);"
573: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
574: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
575: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_sqrt,"
576: echo " fpreg_rs2, &fpreg_rd);"
577: ;;
578: fpop1:000101011)
579: echo " case ${opf_decimal}: /* ${opf} FSQRTq: */"
580: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FSQRT | TME_SPARC_FPU_FLAG_NO_QUAD);"
581: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
582: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
583: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_sqrt,"
584: echo " fpreg_rs2, &fpreg_rd);"
585: ;;
586: fpop1:001000001)
587: echo " case ${opf_decimal}: /* ${opf} FADDs: */"
588: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
589: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
590: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
591: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_add,"
592: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
593: ;;
594: fpop1:001000010)
595: echo " case ${opf_decimal}: /* ${opf} FADDd: */"
596: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
597: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
598: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
599: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_add,"
600: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
601: ;;
602: fpop1:001000011)
603: echo " case ${opf_decimal}: /* ${opf} FADDq: */"
604: echo " ${quad}"
605: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
606: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
607: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
608: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_add,"
609: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
610: ;;
611: fpop1:001000101)
612: echo " case ${opf_decimal}: /* ${opf} FSUBs: */"
613: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
614: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
615: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
616: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_sub,"
617: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
618: ;;
619: fpop1:001000110)
620: echo " case ${opf_decimal}: /* ${opf} FSUBd: */"
621: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
622: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
623: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
624: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_sub,"
625: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
626: ;;
627: fpop1:001000111)
628: echo " case ${opf_decimal}: /* ${opf} FSUBq: */"
629: echo " ${quad}"
630: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
631: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
632: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
633: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_sub,"
634: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
635: ;;
636: fpop1:001001001)
637: echo " case ${opf_decimal}: /* ${opf} FMULs: */"
638: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
639: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
640: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
641: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_mul,"
642: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
643: ;;
644: fpop1:001001010)
645: echo " case ${opf_decimal}: /* ${opf} FMULd: */"
646: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
647: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
648: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
649: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_mul,"
650: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
651: ;;
652: fpop1:001001011)
653: echo " case ${opf_decimal}: /* ${opf} FMULq: */"
654: echo " ${quad}"
655: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
656: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
657: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
658: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_mul,"
659: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
660: ;;
661: fpop1:001101001)
662: echo " case ${opf_decimal}: /* ${opf} FsMULd: */"
663: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FMUL_WIDER);"
664: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
665: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
666: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
667: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_single,"
668: echo " fpreg_rs1, &fpreg_rs1_buffer);"
669: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_single,"
670: echo " fpreg_rs2, &fpreg_rs2_buffer);"
1.1.1.2 ! root 671: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_mul,"
1.1 root 672: echo " &fpreg_rs1_buffer, &fpreg_rs2_buffer, &fpreg_rd);"
673: ;;
674: fpop1:001101110)
675: echo " case ${opf_decimal}: /* ${opf} FdMULq: */"
676: echo " _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FMUL_WIDER | TME_SPARC_FPU_FLAG_NO_QUAD);"
677: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
678: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
679: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
680: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_double,"
681: echo " fpreg_rs1, &fpreg_rs1_buffer);"
682: echo " _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_double,"
683: echo " fpreg_rs2, &fpreg_rs2_buffer);"
684: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_mul,"
685: echo " &fpreg_rs1_buffer, &fpreg_rs2_buffer, &fpreg_rd);"
686: ;;
687: fpop1:001001101)
688: echo " case ${opf_decimal}: /* ${opf} FDIVs: */"
689: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
690: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
691: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);"
692: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_div,"
693: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
694: ;;
695: fpop1:001001110)
696: echo " case ${opf_decimal}: /* ${opf} FDIVd: */"
697: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
698: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
699: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);"
700: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_div,"
701: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
702: ;;
703: fpop1:001001111)
704: echo " case ${opf_decimal}: /* ${opf} FDIVq: */"
705: echo " ${quad}"
706: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
707: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
708: echo " _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);"
709: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_div,"
710: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
711: ;;
712: fpop2:001010001)
713: echo " case ${opf_decimal}: /* ${opf} FCMPs: */"
714: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
715: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
716: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_sub,"
717: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
718: echo " _tme_sparc_fpu_fcc_single(ic, &fpreg_rd, FALSE);"
719: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
720: ;;
721: fpop2:001010010)
722: echo " case ${opf_decimal}: /* ${opf} FCMPd: */"
723: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
724: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
725: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_sub,"
726: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
727: echo " _tme_sparc_fpu_fcc_double(ic, &fpreg_rd, FALSE);"
728: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
729: ;;
730: fpop2:001010011)
731: echo " case ${opf_decimal}: /* ${opf} FCMPq: */"
732: echo " ${quad}"
733: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
734: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
735: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_sub,"
736: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
737: echo " _tme_sparc_fpu_fcc_quad(ic, &fpreg_rd, FALSE);"
738: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
739: ;;
740: fpop2:001010101)
741: echo " case ${opf_decimal}: /* ${opf} FCMPEs: */"
742: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
743: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
744: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_sub,"
745: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
746: echo " _tme_sparc_fpu_fcc_single(ic, &fpreg_rd, TRUE);"
747: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
748: ;;
749: fpop2:001010110)
750: echo " case ${opf_decimal}: /* ${opf} FCMPEd: */"
751: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
752: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
753: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_sub,"
754: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
755: echo " _tme_sparc_fpu_fcc_double(ic, &fpreg_rd, TRUE);"
756: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
757: ;;
758: fpop2:001010111)
759: echo " case ${opf_decimal}: /* ${opf} FCMPEq: */"
760: echo " ${quad}"
761: echo " _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
762: echo " _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);"
763: echo " _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_sub,"
764: echo " fpreg_rs1, fpreg_rs2, &fpreg_rd);"
765: echo " _tme_sparc_fpu_fcc_quad(ic, &fpreg_rd, TRUE);"
766: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
767: ;;
768: *) default=true ;;
769: esac
770: if $default; then :; else echo " break;"; echo ""; fi
771: done
1.1.1.2 ! root 772: echo " default:"
! 773: echo " _TME_SPARC_FPU_UNIMPL;"
! 774: echo " fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;"
! 775: echo " break;"
1.1 root 776: echo ""
777: echo "#undef _TME_SPARC_FPU_FORMAT_RS1"
778: echo "#undef _TME_SPARC_FPU_FORMAT_RS2"
779: echo "#undef _TME_SPARC_FPU_FORMAT_RD"
780: echo " }"
781:
782: echo ""
783: echo " /* store any destination: */"
784: echo " if (fpreg_rd_format != TME_IEEE754_FPREG_FORMAT_NULL) {"
785: echo " tme_sparc_fpu_fpreg_format(ic, fpreg_rd_number, fpreg_rd_format);"
786: echo " ic->tme_sparc_fpu_fpregs[fpreg_rd_number] = fpreg_rd;"
1.1.1.2 ! root 787: echo " TME_SPARC_FPU_DIRTY(ic, fpreg_rd_number);"
1.1 root 788: echo " }"
789:
790: echo ""
791: echo "}"
792: :
793: done
794:
795: # done:
796: #
797: exit 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.