|
|
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.