Annotation of tme/ic/sparc/sparc-fpu-auto.sh, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.