Annotation of gcc/optabs.c, revision 1.1.1.1

1.1       root        1: /* Expand the basic unary and binary arithmetic operations, for GNU compiler.
                      2:    Copyright (C) 1987, 1988, 1992 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 2, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU CC is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU CC; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: 
                     21: #include "config.h"
                     22: #include "rtl.h"
                     23: #include "tree.h"
                     24: #include "flags.h"
                     25: #include "insn-flags.h"
                     26: #include "insn-codes.h"
                     27: #include "expr.h"
                     28: #include "insn-config.h"
                     29: #include "recog.h"
                     30: 
                     31: /* Each optab contains info on how this target machine
                     32:    can perform a particular operation
                     33:    for all sizes and kinds of operands.
                     34: 
                     35:    The operation to be performed is often specified
                     36:    by passing one of these optabs as an argument.
                     37: 
                     38:    See expr.h for documentation of these optabs.  */
                     39: 
                     40: optab add_optab;
                     41: optab sub_optab;
                     42: optab smul_optab;
                     43: optab smul_widen_optab;
                     44: optab umul_widen_optab;
                     45: optab sdiv_optab;
                     46: optab sdivmod_optab;
                     47: optab udiv_optab;
                     48: optab udivmod_optab;
                     49: optab smod_optab;
                     50: optab umod_optab;
                     51: optab flodiv_optab;
                     52: optab ftrunc_optab;
                     53: optab and_optab;
                     54: optab ior_optab;
                     55: optab xor_optab;
                     56: optab ashl_optab;
                     57: optab lshr_optab;
                     58: optab lshl_optab;
                     59: optab ashr_optab;
                     60: optab rotl_optab;
                     61: optab rotr_optab;
                     62: optab smin_optab;
                     63: optab smax_optab;
                     64: optab umin_optab;
                     65: optab umax_optab;
                     66: 
                     67: optab mov_optab;
                     68: optab movstrict_optab;
                     69: 
                     70: optab neg_optab;
                     71: optab abs_optab;
                     72: optab one_cmpl_optab;
                     73: optab ffs_optab;
                     74: 
                     75: optab cmp_optab;
                     76: optab ucmp_optab;  /* Used only for libcalls for unsigned comparisons.  */
                     77: optab tst_optab;
                     78: 
                     79: /* SYMBOL_REF rtx's for the library functions that are called
                     80:    implicitly and not via optabs.  */
                     81: 
                     82: rtx extendsfdf2_libfunc;
                     83: rtx truncdfsf2_libfunc;
                     84: rtx memcpy_libfunc;
                     85: rtx bcopy_libfunc;
                     86: rtx memcmp_libfunc;
                     87: rtx bcmp_libfunc;
                     88: rtx memset_libfunc;
                     89: rtx bzero_libfunc;
                     90: rtx eqsf2_libfunc;
                     91: rtx nesf2_libfunc;
                     92: rtx gtsf2_libfunc;
                     93: rtx gesf2_libfunc;
                     94: rtx ltsf2_libfunc;
                     95: rtx lesf2_libfunc;
                     96: rtx eqdf2_libfunc;
                     97: rtx nedf2_libfunc;
                     98: rtx gtdf2_libfunc;
                     99: rtx gedf2_libfunc;
                    100: rtx ltdf2_libfunc;
                    101: rtx ledf2_libfunc;
                    102: rtx floatdisf_libfunc;
                    103: rtx floatsisf_libfunc;
                    104: rtx floatdidf_libfunc;
                    105: rtx floatsidf_libfunc;
                    106: rtx fixsfsi_libfunc;
                    107: rtx fixsfdi_libfunc;
                    108: rtx fixdfsi_libfunc;
                    109: rtx fixdfdi_libfunc;
                    110: rtx fixunssfsi_libfunc;
                    111: rtx fixunssfdi_libfunc;
                    112: rtx fixunsdfsi_libfunc;
                    113: rtx fixunsdfdi_libfunc;
                    114: 
                    115: /* Indexed by the rtx-code for a conditional (eg. EQ, LT,...)
                    116:    gives the gen_function to make a branch to test that condition.  */
                    117: 
                    118: rtxfun bcc_gen_fctn[NUM_RTX_CODE];
                    119: 
                    120: /* Indexed by the rtx-code for a conditional (eg. EQ, LT,...)
                    121:    gives the insn code to make a store-condition insn
                    122:    to test that condition.  */
                    123: 
                    124: enum insn_code setcc_gen_code[NUM_RTX_CODE];
                    125: 
                    126: static void emit_float_lib_cmp ();
                    127: 
                    128: /* Add a REG_EQUAL note to the last insn in SEQ.  TARGET is being set to
                    129:    the result of operation CODE applied to OP0 (and OP1 if it is a binary
                    130:    operation).
                    131: 
                    132:    If the last insn does not set TARGET, don't do anything, but return 1.
                    133: 
                    134:    If a previous insn sets TARGET and TARGET is one of OP0 or OP1,
                    135:    don't add the REG_EQUAL note but return 0.  Our caller can then try
                    136:    again, ensuring that TARGET is not one of the operands.  */
                    137: 
                    138: static int
                    139: add_equal_note (seq, target, code, op0, op1)
                    140:      rtx seq;
                    141:      rtx target;
                    142:      enum rtx_code code;
                    143:      rtx op0, op1;
                    144: {
                    145:   rtx set;
                    146:   int i;
                    147:   rtx note;
                    148: 
                    149:   if ((GET_RTX_CLASS (code) != '1' && GET_RTX_CLASS (code) != '2'
                    150:        && GET_RTX_CLASS (code) != 'c' && GET_RTX_CLASS (code) != '<')
                    151:       || GET_CODE (seq) != SEQUENCE
                    152:       || (set = single_set (XVECEXP (seq, 0, XVECLEN (seq, 0) - 1))) == 0
                    153:       || GET_CODE (target) == ZERO_EXTRACT
                    154:       || (! rtx_equal_p (SET_DEST (set), target)
                    155:          /* For a STRICT_LOW_PART, the REG_NOTE applies to what is inside the
                    156:             SUBREG.  */
                    157:          && (GET_CODE (SET_DEST (set)) != STRICT_LOW_PART
                    158:              || ! rtx_equal_p (SUBREG_REG (XEXP (SET_DEST (set), 0)),
                    159:                                target))))
                    160:     return 1;
                    161: 
                    162:   /* If TARGET is in OP0 or OP1, check if anything in SEQ sets TARGET
                    163:      besides the last insn.  */
                    164:   if (reg_overlap_mentioned_p (target, op0)
                    165:       || (op1 && reg_overlap_mentioned_p (target, op1)))
                    166:     for (i = XVECLEN (seq, 0) - 2; i >= 0; i--)
                    167:       if (reg_set_p (target, XVECEXP (seq, 0, i)))
                    168:        return 0;
                    169: 
                    170:   if (GET_RTX_CLASS (code) == '1')
                    171:     note = gen_rtx (code, GET_MODE (target), op0);
                    172:   else
                    173:     note = gen_rtx (code, GET_MODE (target), op0, op1);
                    174: 
                    175:   REG_NOTES (XVECEXP (seq, 0, XVECLEN (seq, 0) - 1))
                    176:     = gen_rtx (EXPR_LIST, REG_EQUAL, note,
                    177:               REG_NOTES (XVECEXP (seq, 0, XVECLEN (seq, 0) - 1)));
                    178: 
                    179:   return 1;
                    180: }
                    181: 
                    182: /* Generate code to perform an operation specified by BINOPTAB
                    183:    on operands OP0 and OP1, with result having machine-mode MODE.
                    184: 
                    185:    UNSIGNEDP is for the case where we have to widen the operands
                    186:    to perform the operation.  It says to use zero-extension.
                    187: 
                    188:    If TARGET is nonzero, the value
                    189:    is generated there, if it is convenient to do so.
                    190:    In all cases an rtx is returned for the locus of the value;
                    191:    this may or may not be TARGET.  */
                    192: 
                    193: rtx
                    194: expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
                    195:      enum machine_mode mode;
                    196:      optab binoptab;
                    197:      rtx op0, op1;
                    198:      rtx target;
                    199:      int unsignedp;
                    200:      enum optab_methods methods;
                    201: {
                    202:   enum mode_class class;
                    203:   enum machine_mode wider_mode;
                    204:   register rtx temp;
                    205:   int commutative_op = 0;
                    206:   int shift_op = (binoptab->code ==  ASHIFT
                    207:                  || binoptab->code == ASHIFTRT
                    208:                  || binoptab->code == LSHIFT
                    209:                  || binoptab->code == LSHIFTRT
                    210:                  || binoptab->code == ROTATE
                    211:                  || binoptab->code == ROTATERT);
                    212:   rtx last;
                    213: 
                    214:   class = GET_MODE_CLASS (mode);
                    215: 
                    216:   op0 = protect_from_queue (op0, 0);
                    217:   op1 = protect_from_queue (op1, 0);
                    218:   if (target)
                    219:     target = protect_from_queue (target, 1);
                    220: 
                    221:   if (flag_force_mem)
                    222:     {
                    223:       op0 = force_not_mem (op0);
                    224:       op1 = force_not_mem (op1);
                    225:     }
                    226: 
                    227:   /* If we are inside an appropriately-short loop and one operand is an
                    228:      expensive constant, force it into a register.  */
                    229:   if (CONSTANT_P (op0) && preserve_subexpressions_p () && rtx_cost (op0) > 2)
                    230:     op0 = force_reg (mode, op0);
                    231: 
                    232:   if (CONSTANT_P (op1) && preserve_subexpressions_p () && rtx_cost (op1) > 2)
                    233:     op1 = force_reg (shift_op ? word_mode : mode, op1);
                    234: 
                    235: #if 0  /* Turned off because it seems to be a kludgy method.  */
                    236:   /* If subtracting integer from pointer, and the pointer has a special mode,
                    237:      then change it to an add.  We use the add insn of Pmode for combining
                    238:      integers with pointers, and the sub insn to subtract two pointers.  */
                    239: 
                    240:   if (binoptab == sub_optab
                    241:       && GET_MODE (op0) == Pmode && GET_MODE (op1) != Pmode)
                    242:     {
                    243:       op1 = negate_rtx (GET_MODE(op1), op1);
                    244:       binoptab = add_optab;
                    245:     }
                    246: #endif /* 0 */
                    247: 
                    248:   /* Record where to delete back to if we backtrack.  */
                    249:   last = get_last_insn ();
                    250: 
                    251:   /* If operation is commutative,
                    252:      try to make the first operand a register.
                    253:      Even better, try to make it the same as the target.
                    254:      Also try to make the last operand a constant.  */
                    255:   if (GET_RTX_CLASS (binoptab->code) == 'c'
                    256:       || binoptab == smul_widen_optab
                    257:       || binoptab == umul_widen_optab)
                    258:     {
                    259:       commutative_op = 1;
                    260: 
                    261:       if (((target == 0 || GET_CODE (target) == REG)
                    262:           ? ((GET_CODE (op1) == REG
                    263:               && GET_CODE (op0) != REG)
                    264:              || target == op1)
                    265:           : rtx_equal_p (op1, target))
                    266:          || GET_CODE (op0) == CONST_INT)
                    267:        {
                    268:          temp = op1;
                    269:          op1 = op0;
                    270:          op0 = temp;
                    271:        }
                    272:     }
                    273: 
                    274:   /* If we can do it with a three-operand insn, do so.  */
                    275: 
                    276:   if (methods != OPTAB_MUST_WIDEN
                    277:       && binoptab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
                    278:     {
                    279:       int icode = (int) binoptab->handlers[(int) mode].insn_code;
                    280:       enum machine_mode mode0 = insn_operand_mode[icode][1];
                    281:       enum machine_mode mode1 = insn_operand_mode[icode][2];
                    282:       rtx pat;
                    283:       rtx xop0 = op0, xop1 = op1;
                    284: 
                    285:       if (target)
                    286:        temp = target;
                    287:       else
                    288:        temp = gen_reg_rtx (mode);
                    289: 
                    290:       /* If it is a commutative operator and the modes would match
                    291:         if we would swap the operands, we can save the conversions. */
                    292:       if (commutative_op)
                    293:        {
                    294:          if (GET_MODE (op0) != mode0 && GET_MODE (op1) != mode1
                    295:              && GET_MODE (op0) == mode1 && GET_MODE (op1) == mode0)
                    296:            {
                    297:              register rtx tmp;
                    298: 
                    299:              tmp = op0; op0 = op1; op1 = tmp;
                    300:              tmp = xop0; xop0 = xop1; xop1 = tmp;
                    301:            }
                    302:        }
                    303: 
                    304:       /* In case the insn wants input operands in modes different from
                    305:         the result, convert the operands.  */
                    306: 
                    307:       if (GET_MODE (op0) != VOIDmode
                    308:          && GET_MODE (op0) != mode0)
                    309:        xop0 = convert_to_mode (mode0, xop0, unsignedp);
                    310: 
                    311:       if (GET_MODE (xop1) != VOIDmode
                    312:          && GET_MODE (xop1) != mode1)
                    313:        xop1 = convert_to_mode (mode1, xop1, unsignedp);
                    314: 
                    315:       /* Now, if insn's predicates don't allow our operands, put them into
                    316:         pseudo regs.  */
                    317: 
                    318:       if (! (*insn_operand_predicate[icode][1]) (xop0, mode0))
                    319:        xop0 = copy_to_mode_reg (mode0, xop0);
                    320: 
                    321:       if (! (*insn_operand_predicate[icode][2]) (xop1, mode1))
                    322:        xop1 = copy_to_mode_reg (mode1, xop1);
                    323: 
                    324:       if (! (*insn_operand_predicate[icode][0]) (temp, mode))
                    325:        temp = gen_reg_rtx (mode);
                    326: 
                    327:       pat = GEN_FCN (icode) (temp, xop0, xop1);
                    328:       if (pat)
                    329:        {
                    330:          /* If PAT is a multi-insn sequence, try to add an appropriate
                    331:             REG_EQUAL note to it.  If we can't because TEMP conflicts with an
                    332:             operand, call ourselves again, this time without a target.  */
                    333:          if (GET_CODE (pat) == SEQUENCE
                    334:              && ! add_equal_note (pat, temp, binoptab->code, xop0, xop1))
                    335:            {
                    336:              delete_insns_since (last);
                    337:              return expand_binop (mode, binoptab, op0, op1, 0, unsignedp,
                    338:                                   methods);
                    339:            }
                    340: 
                    341:          emit_insn (pat);
                    342:          return temp;
                    343:        }
                    344:       else
                    345:        delete_insns_since (last);
                    346:     }
                    347: 
                    348:   /* These can be done a word at a time.  */
                    349:   if ((binoptab == and_optab || binoptab == ior_optab || binoptab == xor_optab)
                    350:       && class == MODE_INT
                    351:       && GET_MODE_SIZE (mode) > UNITS_PER_WORD
                    352:       && binoptab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
                    353:     {
                    354:       int i;
                    355:       rtx insns;
                    356:       rtx equiv_value;
                    357: 
                    358:       /* If TARGET is the same as one of the operands, the REG_EQUAL note
                    359:         won't be accurate, so use a new target.  */
                    360:       if (target == 0 || target == op0 || target == op1)
                    361:        target = gen_reg_rtx (mode);
                    362: 
                    363:       start_sequence ();
                    364: 
                    365:       /* Do the actual arithmetic.  */
                    366:       for (i = 0; i < GET_MODE_BITSIZE (mode) / BITS_PER_WORD; i++)
                    367:        {
                    368:          rtx target_piece = operand_subword (target, i, 1, mode);
                    369:          rtx x = expand_binop (word_mode, binoptab,
                    370:                                operand_subword_force (op0, i, mode),
                    371:                                operand_subword_force (op1, i, mode),
                    372:                                target_piece, unsignedp, methods);
                    373:          if (target_piece != x)
                    374:            emit_move_insn (target_piece, x);
                    375:        }
                    376: 
                    377:       insns = get_insns ();
                    378:       end_sequence ();
                    379: 
                    380:       if (binoptab->code != UNKNOWN)
                    381:        equiv_value = gen_rtx (binoptab->code, mode, op0, op1);
                    382:       else
                    383:        equiv_value = 0;
                    384: 
                    385:       emit_no_conflict_block (insns, target, op0, op1, equiv_value);
                    386:       return target;
                    387:     }
                    388: 
                    389:   /* These can be done a word at a time by propagating carries.  */
                    390:   if ((binoptab == add_optab || binoptab == sub_optab)
                    391:       && class == MODE_INT
                    392:       && GET_MODE_SIZE (mode) >= 2 * UNITS_PER_WORD
                    393:       && binoptab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
                    394:     {
                    395:       int i;
                    396:       rtx carry_tmp = gen_reg_rtx (word_mode);
                    397:       optab otheroptab = binoptab == add_optab ? sub_optab : add_optab;
                    398:       int nwords = GET_MODE_BITSIZE (mode) / BITS_PER_WORD;
                    399:       rtx carry_in, carry_out;
                    400: 
                    401:       /* We can handle either a 1 or -1 value for the carry.  If STORE_FLAG
                    402:         value is one of those, use it.  Otherwise, use 1 since it is the
                    403:         one easiest to get.  */
                    404: #if STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1
                    405:       int normalizep = STORE_FLAG_VALUE;
                    406: #else
                    407:       int normalizep = 1;
                    408: #endif
                    409: 
                    410:       /* Prepare the operands.  */
                    411:       op0 = force_reg (mode, op0);
                    412:       op1 = force_reg (mode, op1);
                    413: 
                    414:       if (target == 0 || GET_CODE (target) != REG
                    415:          || target == op0 || target == op1)
                    416:        target = gen_reg_rtx (mode);
                    417: 
                    418:       /* Do the actual arithmetic.  */
                    419:       for (i = 0; i < nwords; i++)
                    420:        {
                    421:          int index = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i);
                    422:          rtx target_piece = operand_subword (target, index, 1, mode);
                    423:          rtx op0_piece = operand_subword_force (op0, index, mode);
                    424:          rtx op1_piece = operand_subword_force (op1, index, mode);
                    425:          rtx x;
                    426: 
                    427:          /* Main add/subtract of the input operands.  */
                    428:          x = expand_binop (word_mode, binoptab,
                    429:                            op0_piece, op1_piece,
                    430:                            target_piece, unsignedp, methods);
                    431:          if (x == 0)
                    432:            break;
                    433: 
                    434:          if (i + 1 < nwords)
                    435:            {
                    436:              /* Store carry from main add/subtract.  */
                    437:              carry_out = gen_reg_rtx (word_mode);
                    438:              carry_out = emit_store_flag (carry_out,
                    439:                                           binoptab == add_optab ? LTU : GTU,
                    440:                                           x, op0_piece,
                    441:                                           word_mode, 1, normalizep);
                    442:              if (!carry_out)
                    443:                break;
                    444:            }
                    445: 
                    446:          if (i > 0)
                    447:            {
                    448:              /* Add/subtract previous carry to main result.  */
                    449:              x = expand_binop (word_mode,
                    450:                                normalizep == 1 ? binoptab : otheroptab,
                    451:                                x, carry_in,
                    452:                                target_piece, 1, methods);
                    453:              if (target_piece != x)
                    454:                emit_move_insn (target_piece, x);
                    455: 
                    456:              if (i + 1 < nwords)
                    457:                {
                    458:                  /* THIS CODE HAS NOT BEEN TESTED.  */
                    459:                  /* Get out carry from adding/subtracting carry in.  */
                    460:                  carry_tmp = emit_store_flag (carry_tmp,
                    461:                                               binoptab == add_optab
                    462:                                                 ? LTU : GTU,
                    463:                                               x, carry_in,
                    464:                                               word_mode, 1, normalizep);
                    465:                  /* Logical-ior the two poss. carry together.  */
                    466:                  carry_out = expand_binop (word_mode, ior_optab,
                    467:                                            carry_out, carry_tmp,
                    468:                                            carry_out, 0, methods);
                    469:                  if (!carry_out)
                    470:                    break;
                    471:                }
                    472:            }
                    473: 
                    474:          carry_in = carry_out;
                    475:        }       
                    476: 
                    477:       if (i == GET_MODE_BITSIZE (mode) / BITS_PER_WORD)
                    478:        {
                    479:          rtx temp;
                    480:          
                    481:          temp = emit_move_insn (target, target);
                    482:          REG_NOTES (temp) = gen_rtx (EXPR_LIST, REG_EQUAL,
                    483:                                      gen_rtx (binoptab->code, mode, op0, op1),
                    484:                                      REG_NOTES (temp));
                    485:          return target;
                    486:        }
                    487:       else
                    488:        delete_insns_since (last);
                    489:     }
                    490: 
                    491:   /* If we want to multiply two two-word values and have normal and widening
                    492:      multiplies of single-word values, we can do this with three smaller
                    493:      multiplications.  Note that we do not make a REG_NO_CONFLICT block here
                    494:      because we are not operating on one word at a time. 
                    495: 
                    496:      The multiplication proceeds as follows:
                    497:                                 _______________________
                    498:                                [__op0_high_|__op0_low__]
                    499:                                 _______________________
                    500:         *                          [__op1_high_|__op1_low__]
                    501:         _______________________________________________
                    502:                                 _______________________
                    503:     (1)                            [__op0_low__*__op1_low__]
                    504:                     _______________________
                    505:     (2a)               [__op0_low__*__op1_high_]
                    506:                     _______________________
                    507:     (2b)               [__op0_high_*__op1_low__]
                    508:          _______________________
                    509:     (3) [__op0_high_*__op1_high_]
                    510: 
                    511: 
                    512:     This gives a 4-word result.  Since we are only interested in the
                    513:     lower 2 words, partial result (3) and the upper words of (2a) and
                    514:     (2b) don't need to be calculated.  Hence (2a) and (2b) can be
                    515:     calculated using non-widening multiplication.
                    516: 
                    517:     (1), however, needs to be calculated with an unsigned widening
                    518:     multiplication.  If this operation is not directly supported we
                    519:     try using a signed widening multiplication and adjust the result.
                    520:     This adjustment works as follows:
                    521: 
                    522:       If both operands are positive then no adjustment is needed.
                    523: 
                    524:       If the operands have different signs, for example op0_low < 0 and
                    525:       op1_low >= 0, the instruction treats the most significant bit of
                    526:       op0_low as a sign bit instead of a bit with significance
                    527:       2**(BITS_PER_WORD-1), i.e. the instruction multiplies op1_low
                    528:       with 2**BITS_PER_WORD - op0_low, and two's complements the
                    529:       result.  Conclusion: We need to add op1_low * 2**BITS_PER_WORD to
                    530:       the result.
                    531: 
                    532:       Similarly, if both operands are negative, we need to add
                    533:       (op0_low + op1_low) * 2**BITS_PER_WORD.
                    534: 
                    535:       We use a trick to adjust quickly.  We logically shift op0_low right
                    536:       (op1_low) BITS_PER_WORD-1 steps to get 0 or 1, and add this to
                    537:       op0_high (op1_high) before it is used to calculate 2b (2a).  If no
                    538:       logical shift exists, we do an arithmetic right shift and subtract
                    539:       the 0 or -1.  */
                    540: 
                    541:   if (binoptab == smul_optab
                    542:       && class == MODE_INT
                    543:       && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
                    544:       && smul_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing
                    545:       && add_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing
                    546:       && ((umul_widen_optab->handlers[(int) mode].insn_code
                    547:           != CODE_FOR_nothing)
                    548:          || (smul_widen_optab->handlers[(int) mode].insn_code
                    549:              != CODE_FOR_nothing)))
                    550:     {
                    551:       int low = (WORDS_BIG_ENDIAN ? 1 : 0);
                    552:       int high = (WORDS_BIG_ENDIAN ? 0 : 1);
                    553:       rtx op0_high = operand_subword_force (op0, high, mode);
                    554:       rtx op0_low = operand_subword_force (op0, low, mode);
                    555:       rtx op1_high = operand_subword_force (op1, high, mode);
                    556:       rtx op1_low = operand_subword_force (op1, low, mode);
                    557:       rtx product = 0;
                    558:       rtx op0_xhigh;
                    559:       rtx op1_xhigh;
                    560: 
                    561:       /* If the target is the same as one of the inputs, don't use it.  This
                    562:         prevents problems with the REG_EQUAL note.  */
                    563:       if (target == op0 || target == op1)
                    564:        target = 0;
                    565: 
                    566:       /* Multiply the two lower words to get a double-word product.
                    567:         If unsigned widening multiplication is available, use that;
                    568:         otherwise use the signed form and compensate.  */
                    569: 
                    570:       if (umul_widen_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
                    571:        {
                    572:          product = expand_binop (mode, umul_widen_optab, op0_low, op1_low,
                    573:                                  target, 1, OPTAB_DIRECT);
                    574: 
                    575:          /* If we didn't succeed, delete everything we did so far.  */
                    576:          if (product == 0)
                    577:            delete_insns_since (last);
                    578:          else
                    579:            op0_xhigh = op0_high, op1_xhigh = op1_high;
                    580:        }
                    581: 
                    582:       if (product == 0
                    583:          && smul_widen_optab->handlers[(int) mode].insn_code
                    584:               != CODE_FOR_nothing)
                    585:        {
                    586:          rtx wordm1 = gen_rtx (CONST_INT, VOIDmode, BITS_PER_WORD - 1);
                    587:          product = expand_binop (mode, smul_widen_optab, op0_low, op1_low,
                    588:                                  target, 1, OPTAB_DIRECT);
                    589:          op0_xhigh = expand_binop (word_mode, lshr_optab, op0_low, wordm1,
                    590:                                    0, 1, OPTAB_DIRECT);
                    591:          if (op0_xhigh)
                    592:            op0_xhigh = expand_binop (word_mode, add_optab, op0_high,
                    593:                                      op0_xhigh, op0_xhigh, 0, OPTAB_DIRECT);
                    594:          else
                    595:            {
                    596:              op0_xhigh = expand_binop (word_mode, ashr_optab, op0_low, wordm1,
                    597:                                        0, 0, OPTAB_DIRECT);
                    598:              if (op0_xhigh)
                    599:                op0_xhigh = expand_binop (word_mode, sub_optab, op0_high,
                    600:                                          op0_xhigh, op0_xhigh, 0,
                    601:                                          OPTAB_DIRECT);
                    602:            }
                    603: 
                    604:          op1_xhigh = expand_binop (word_mode, lshr_optab, op1_low, wordm1,
                    605:                                    0, 1, OPTAB_DIRECT);
                    606:          if (op1_xhigh)
                    607:            op1_xhigh = expand_binop (word_mode, add_optab, op1_high,
                    608:                                      op1_xhigh, op1_xhigh, 0, OPTAB_DIRECT);
                    609:          else
                    610:            {
                    611:              op1_xhigh = expand_binop (word_mode, ashr_optab, op1_low, wordm1,
                    612:                                        0, 0, OPTAB_DIRECT);
                    613:              if (op1_xhigh)
                    614:                op1_xhigh = expand_binop (word_mode, sub_optab, op1_high,
                    615:                                          op1_xhigh, op1_xhigh, 0,
                    616:                                          OPTAB_DIRECT);
                    617:            }
                    618:        }
                    619: 
                    620:       /* If we have been able to directly compute the product of the
                    621:         low-order words of the operands and perform any required adjustments
                    622:         of the operands, we proceed by trying two more multiplications
                    623:         and then computing the appropriate sum.
                    624: 
                    625:         We have checked above that the required addition is provided.
                    626:         Full-word addition will normally always succeed, especially if
                    627:         it is provided at all, so we don't worry about its failure.  The
                    628:         multiplication may well fail, however, so we do handle that.  */
                    629: 
                    630:       if (product && op0_xhigh && op1_xhigh)
                    631:        {
                    632:          rtx product_piece;
                    633:          rtx product_high = operand_subword (product, high, 1, mode);
                    634:          rtx temp = expand_binop (word_mode, binoptab, op0_low, op1_xhigh, 0,
                    635:                                   0, OPTAB_DIRECT);
                    636: 
                    637:          if (temp)
                    638:            {
                    639:              product_piece = expand_binop (word_mode, add_optab, temp,
                    640:                                            product_high, product_high,
                    641:                                            0, OPTAB_LIB_WIDEN);
                    642:              if (product_piece != product_high)
                    643:                emit_move_insn (product_high, product_piece);
                    644: 
                    645:              temp = expand_binop (word_mode, binoptab, op1_low, op0_xhigh, 0,
                    646:                                   0, OPTAB_DIRECT);
                    647: 
                    648:              product_piece = expand_binop (word_mode, add_optab, temp,
                    649:                                            product_high, product_high,
                    650:                                            0, OPTAB_LIB_WIDEN);
                    651:              if (product_piece != product_high)
                    652:                emit_move_insn (product_high, product_piece);
                    653: 
                    654:              temp = emit_move_insn (product, product);
                    655:              REG_NOTES (temp) = gen_rtx (EXPR_LIST, REG_EQUAL,
                    656:                                          gen_rtx (MULT, mode, op0, op1),
                    657:                                          REG_NOTES (temp));
                    658: 
                    659:              return product;
                    660:            }
                    661:        }
                    662: 
                    663:       /* If we get here, we couldn't do it for some reason even though we
                    664:         originally thought we could.  Delete anything we've emitted in
                    665:         trying to do it.  */
                    666: 
                    667:       delete_insns_since (last);
                    668:     }
                    669: 
                    670:   /* It can't be open-coded in this mode.
                    671:      Use a library call if one is available and caller says that's ok.  */
                    672: 
                    673:   if (binoptab->handlers[(int) mode].libfunc
                    674:       && (methods == OPTAB_LIB || methods == OPTAB_LIB_WIDEN))
                    675:     {
                    676:       rtx insns;
                    677:       rtx funexp = binoptab->handlers[(int) mode].libfunc;
                    678: 
                    679:       start_sequence ();
                    680: 
                    681:       /* Pass 1 for NO_QUEUE so we don't lose any increments
                    682:         if the libcall is cse'd or moved.  */
                    683:       emit_library_call (binoptab->handlers[(int) mode].libfunc,
                    684:                         1, mode, 2, op0, mode, op1,
                    685:                         (shift_op ? word_mode : mode));
                    686: 
                    687:       insns = get_insns ();
                    688:       end_sequence ();
                    689: 
                    690:       target = gen_reg_rtx (mode);
                    691:       emit_libcall_block (insns, target, hard_libcall_value (mode),
                    692:                          gen_rtx (binoptab->code, mode, op0, op1));
                    693: 
                    694:       return target;
                    695:     }
                    696: 
                    697:   delete_insns_since (last);
                    698: 
                    699:   /* It can't be done in this mode.  Can we do it in a wider mode?  */
                    700: 
                    701:   if (! (methods == OPTAB_WIDEN || methods == OPTAB_LIB_WIDEN
                    702:         || methods == OPTAB_MUST_WIDEN))
                    703:     return 0;                  /* Caller says, don't even try.  */
                    704: 
                    705:   /* Compute the value of METHODS to pass to recursive calls.
                    706:      Don't allow widening to be tried recursively.  */
                    707: 
                    708:   methods = (methods == OPTAB_LIB_WIDEN ? OPTAB_LIB : OPTAB_DIRECT);
                    709: 
                    710:   /* Look for a wider mode of the same class for which it appears we can do
                    711:      the operation.  */
                    712: 
                    713:   if (class == MODE_INT || class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT)
                    714:     {
                    715:       for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
                    716:           wider_mode = GET_MODE_WIDER_MODE (wider_mode))
                    717:        {
                    718:          if ((binoptab->handlers[(int) wider_mode].insn_code
                    719:               != CODE_FOR_nothing)
                    720:              || (methods == OPTAB_LIB
                    721:                  && binoptab->handlers[(int) wider_mode].libfunc))
                    722:            {
                    723:              rtx xop0 = op0, xop1 = op1;
                    724:              int no_extend = 0;
                    725: 
                    726:              /* For certain integer operations, we need not actually extend
                    727:                 the narrow operands, as long as we will truncate
                    728:                 the results to the same narrowness.  */
                    729: 
                    730:              if ((binoptab == ior_optab || binoptab == and_optab
                    731:                   || binoptab == xor_optab
                    732:                   || binoptab == add_optab || binoptab == sub_optab
                    733:                   || binoptab == smul_optab
                    734:                   || binoptab == ashl_optab || binoptab == lshl_optab)
                    735:                  && class == MODE_INT)
                    736:                no_extend = 1;
                    737: 
                    738:              /* If an operand is a constant integer, we might as well
                    739:                 convert it since that is more efficient than using a SUBREG,
                    740:                 unlike the case for other operands.  */
                    741: 
                    742:              if (no_extend && GET_MODE (xop0) != VOIDmode)
                    743:                xop0 = gen_rtx (SUBREG, wider_mode,
                    744:                                force_reg (GET_MODE (xop0), xop0), 0);
                    745:              else
                    746:                xop0 = convert_to_mode (wider_mode, xop0, unsignedp);
                    747: 
                    748:              if (no_extend && GET_MODE (xop1) != VOIDmode)
                    749:                xop1 = gen_rtx (SUBREG, wider_mode,
                    750:                                force_reg (GET_MODE (xop1), xop1), 0);
                    751:              else
                    752:                xop1 = convert_to_mode (wider_mode, xop1, unsignedp);
                    753: 
                    754:              temp = expand_binop (wider_mode, binoptab, xop0, xop1, 0,
                    755:                                   unsignedp, methods);
                    756:              if (temp)
                    757:                {
                    758:                  if (class != MODE_INT)
                    759:                    {
                    760:                      if (target == 0)
                    761:                        target = gen_reg_rtx (mode);
                    762:                      convert_move (target, temp, 0);
                    763:                      return target;
                    764:                    }
                    765:                  else
                    766:                    return gen_lowpart (mode, temp);
                    767:                }
                    768:              else
                    769:                delete_insns_since (last);
                    770:            }
                    771:        }
                    772:     }
                    773: 
                    774:   return 0;
                    775: }
                    776: 
                    777: /* Expand a binary operator which has both signed and unsigned forms.
                    778:    UOPTAB is the optab for unsigned operations, and SOPTAB is for
                    779:    signed operations.
                    780: 
                    781:    If we widen unsigned operands, we may use a signed wider operation instead
                    782:    of an unsigned wider operation, since the result would be the same.  */
                    783: 
                    784: rtx
                    785: sign_expand_binop (mode, uoptab, soptab, op0, op1, target, unsignedp, methods)
                    786:     enum machine_mode mode;
                    787:     optab uoptab, soptab;
                    788:     rtx op0, op1, target;
                    789:     int unsignedp;
                    790:     enum optab_methods methods;
                    791: {
                    792:   register rtx temp;
                    793:   optab direct_optab = unsignedp ? uoptab : soptab;
                    794:   struct optab wide_soptab;
                    795: 
                    796:   /* Do it without widening, if possible.  */
                    797:   temp = expand_binop (mode, direct_optab, op0, op1, target,
                    798:                       unsignedp, OPTAB_DIRECT);
                    799:   if (temp || methods == OPTAB_DIRECT)
                    800:     return temp;
                    801: 
                    802:   /* Try widening to a signed int.  Make a fake signed optab that
                    803:      hides any signed insn for direct use.  */
                    804:   wide_soptab = *soptab;
                    805:   wide_soptab.handlers[(int) mode].insn_code = CODE_FOR_nothing;
                    806:   wide_soptab.handlers[(int) mode].libfunc = 0;
                    807: 
                    808:   temp = expand_binop (mode, &wide_soptab, op0, op1, target,
                    809:                       unsignedp, OPTAB_WIDEN);
                    810: 
                    811:   /* For unsigned operands, try widening to an unsigned int.  */
                    812:   if (temp == 0 && unsignedp)
                    813:     temp = expand_binop (mode, uoptab, op0, op1, target,
                    814:                         unsignedp, OPTAB_WIDEN);
                    815:   if (temp || methods == OPTAB_WIDEN)
                    816:     return temp;
                    817: 
                    818:   /* Use the right width lib call if that exists.  */
                    819:   temp = expand_binop (mode, direct_optab, op0, op1, target, unsignedp, OPTAB_LIB);
                    820:   if (temp || methods == OPTAB_LIB)
                    821:     return temp;
                    822: 
                    823:   /* Must widen and use a lib call, use either signed or unsigned.  */
                    824:   temp = expand_binop (mode, &wide_soptab, op0, op1, target,
                    825:                       unsignedp, methods);
                    826:   if (temp != 0)
                    827:     return temp;
                    828:   if (unsignedp)
                    829:     return expand_binop (mode, uoptab, op0, op1, target,
                    830:                         unsignedp, methods);
                    831:   return 0;
                    832: }
                    833: 
                    834: /* Generate code to perform an operation specified by BINOPTAB
                    835:    on operands OP0 and OP1, with two results to TARG1 and TARG2.
                    836:    We assume that the order of the operands for the instruction
                    837:    is TARG0, OP0, OP1, TARG1, which would fit a pattern like
                    838:    [(set TARG0 (operate OP0 OP1)) (set TARG1 (operate ...))].
                    839: 
                    840:    Either TARG0 or TARG1 may be zero, but what that means is that
                    841:    that result is not actually wanted.  We will generate it into
                    842:    a dummy pseudo-reg and discard it.  They may not both be zero.
                    843: 
                    844:    Returns 1 if this operation can be performed; 0 if not.  */
                    845: 
                    846: int
                    847: expand_twoval_binop (binoptab, op0, op1, targ0, targ1, unsignedp)
                    848:      optab binoptab;
                    849:      rtx op0, op1;
                    850:      rtx targ0, targ1;
                    851:      int unsignedp;
                    852: {
                    853:   enum machine_mode mode = GET_MODE (targ0 ? targ0 : targ1);
                    854:   enum mode_class class;
                    855:   enum machine_mode wider_mode;
                    856:   rtx last;
                    857: 
                    858:   class = GET_MODE_CLASS (mode);
                    859: 
                    860:   op0 = protect_from_queue (op0, 0);
                    861:   op1 = protect_from_queue (op1, 0);
                    862: 
                    863:   if (flag_force_mem)
                    864:     {
                    865:       op0 = force_not_mem (op0);
                    866:       op1 = force_not_mem (op1);
                    867:     }
                    868: 
                    869:   /* If we are inside an appropriately-short loop and one operand is an
                    870:      expensive constant, force it into a register.  */
                    871:   if (CONSTANT_P (op0) && preserve_subexpressions_p () && rtx_cost (op0) > 2)
                    872:     op0 = force_reg (mode, op0);
                    873: 
                    874:   if (CONSTANT_P (op1) && preserve_subexpressions_p () && rtx_cost (op1) > 2)
                    875:     op1 = force_reg (mode, op1);
                    876: 
                    877:   if (targ0)
                    878:     targ0 = protect_from_queue (targ0, 1);
                    879:   else
                    880:     targ0 = gen_reg_rtx (mode);
                    881:   if (targ1)
                    882:     targ1 = protect_from_queue (targ1, 1);
                    883:   else
                    884:     targ1 = gen_reg_rtx (mode);
                    885: 
                    886:   /* Record where to go back to if we fail.  */
                    887:   last = get_last_insn ();
                    888: 
                    889:   if (binoptab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
                    890:     {
                    891:       int icode = (int) binoptab->handlers[(int) mode].insn_code;
                    892:       enum machine_mode mode0 = insn_operand_mode[icode][1];
                    893:       enum machine_mode mode1 = insn_operand_mode[icode][2];
                    894:       rtx pat;
                    895:       rtx xop0 = op0, xop1 = op1;
                    896: 
                    897:       /* In case this insn wants input operands in modes different from the
                    898:         result, convert the operands.  */
                    899:       if (GET_MODE (op0) != VOIDmode && GET_MODE (op0) != mode0)
                    900:        xop0 = convert_to_mode (mode0, xop0, unsignedp);
                    901: 
                    902:       if (GET_MODE (op1) != VOIDmode && GET_MODE (op1) != mode1)
                    903:        xop1 = convert_to_mode (mode1, xop1, unsignedp);
                    904: 
                    905:       /* Now, if insn doesn't accept these operands, put them into pseudos.  */
                    906:       if (! (*insn_operand_predicate[icode][1]) (xop0, mode0))
                    907:        xop0 = copy_to_mode_reg (mode0, xop0);
                    908: 
                    909:       if (! (*insn_operand_predicate[icode][2]) (xop1, mode1))
                    910:        xop1 = copy_to_mode_reg (mode1, xop1);
                    911: 
                    912:       /* We could handle this, but we should always be called with a pseudo
                    913:         for our targets and all insns should take them as outputs.  */
                    914:       if (! (*insn_operand_predicate[icode][0]) (targ0, mode)
                    915:          || ! (*insn_operand_predicate[icode][3]) (targ1, mode))
                    916:        abort ();
                    917:        
                    918:       pat = GEN_FCN (icode) (targ0, xop0, xop1, targ1);
                    919:       if (pat)
                    920:        {
                    921:          emit_insn (pat);
                    922:          return 1;
                    923:        }
                    924:       else
                    925:        delete_insns_since (last);
                    926:     }
                    927: 
                    928:   /* It can't be done in this mode.  Can we do it in a wider mode?  */
                    929: 
                    930:   if (class == MODE_INT || class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT)
                    931:     {
                    932:       for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
                    933:           wider_mode = GET_MODE_WIDER_MODE (wider_mode))
                    934:        {
                    935:          if (binoptab->handlers[(int) wider_mode].insn_code
                    936:              != CODE_FOR_nothing)
                    937:            {
                    938:              register rtx t0 = gen_reg_rtx (wider_mode);
                    939:              register rtx t1 = gen_reg_rtx (wider_mode);
                    940: 
                    941:              if (expand_twoval_binop (binoptab,
                    942:                                       convert_to_mode (wider_mode, op0,
                    943:                                                        unsignedp),
                    944:                                       convert_to_mode (wider_mode, op1,
                    945:                                                        unsignedp),
                    946:                                       t0, t1, unsignedp))
                    947:                {
                    948:                  convert_move (targ0, t0, unsignedp);
                    949:                  convert_move (targ1, t1, unsignedp);
                    950:                  return 1;
                    951:                }
                    952:              else
                    953:                delete_insns_since (last);
                    954:            }
                    955:        }
                    956:     }
                    957: 
                    958:   return 0;
                    959: }
                    960: 
                    961: /* Generate code to perform an operation specified by UNOPTAB
                    962:    on operand OP0, with result having machine-mode MODE.
                    963: 
                    964:    UNSIGNEDP is for the case where we have to widen the operands
                    965:    to perform the operation.  It says to use zero-extension.
                    966: 
                    967:    If TARGET is nonzero, the value
                    968:    is generated there, if it is convenient to do so.
                    969:    In all cases an rtx is returned for the locus of the value;
                    970:    this may or may not be TARGET.  */
                    971: 
                    972: rtx
                    973: expand_unop (mode, unoptab, op0, target, unsignedp)
                    974:      enum machine_mode mode;
                    975:      optab unoptab;
                    976:      rtx op0;
                    977:      rtx target;
                    978:      int unsignedp;
                    979: {
                    980:   enum mode_class class;
                    981:   enum machine_mode wider_mode;
                    982:   register rtx temp;
                    983:   rtx last = get_last_insn ();
                    984:   rtx pat;
                    985: 
                    986:   class = GET_MODE_CLASS (mode);
                    987: 
                    988:   op0 = protect_from_queue (op0, 0);
                    989: 
                    990:   if (flag_force_mem)
                    991:     {
                    992:       op0 = force_not_mem (op0);
                    993:     }
                    994: 
                    995:   if (target)
                    996:     target = protect_from_queue (target, 1);
                    997: 
                    998:   if (unoptab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
                    999:     {
                   1000:       int icode = (int) unoptab->handlers[(int) mode].insn_code;
                   1001:       enum machine_mode mode0 = insn_operand_mode[icode][1];
                   1002:       rtx xop0 = op0;
                   1003: 
                   1004:       if (target)
                   1005:        temp = target;
                   1006:       else
                   1007:        temp = gen_reg_rtx (mode);
                   1008: 
                   1009:       if (GET_MODE (xop0) != VOIDmode
                   1010:          && GET_MODE (xop0) != mode0)
                   1011:        xop0 = convert_to_mode (mode0, xop0, unsignedp);
                   1012: 
                   1013:       /* Now, if insn doesn't accept our operand, put it into a pseudo.  */
                   1014: 
                   1015:       if (! (*insn_operand_predicate[icode][1]) (xop0, mode0))
                   1016:        xop0 = copy_to_mode_reg (mode0, xop0);
                   1017: 
                   1018:       if (! (*insn_operand_predicate[icode][0]) (temp, mode))
                   1019:        temp = gen_reg_rtx (mode);
                   1020: 
                   1021:       pat = GEN_FCN (icode) (temp, xop0);
                   1022:       if (pat)
                   1023:        {
                   1024:          if (GET_CODE (pat) == SEQUENCE
                   1025:              && ! add_equal_note (pat, temp, unoptab->code, xop0, 0))
                   1026:            {
                   1027:              delete_insns_since (last);
                   1028:              return expand_unop (mode, unoptab, op0, 0, unsignedp);
                   1029:            }
                   1030: 
                   1031:          emit_insn (pat);
                   1032:          
                   1033:          return temp;
                   1034:        }
                   1035:       else
                   1036:        delete_insns_since (last);
                   1037:     }
                   1038: 
                   1039:   /* These can be done a word at a time.  */
                   1040:   if (unoptab == one_cmpl_optab
                   1041:       && class == MODE_INT
                   1042:       && GET_MODE_SIZE (mode) > UNITS_PER_WORD
                   1043:       && unoptab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
                   1044:     {
                   1045:       int i;
                   1046:       rtx insns;
                   1047: 
                   1048:       if (target == 0 || target == op0)
                   1049:        target = gen_reg_rtx (mode);
                   1050: 
                   1051:       start_sequence ();
                   1052: 
                   1053:       /* Do the actual arithmetic.  */
                   1054:       for (i = 0; i < GET_MODE_BITSIZE (mode) / BITS_PER_WORD; i++)
                   1055:        {
                   1056:          rtx target_piece = operand_subword (target, i, 1, mode);
                   1057:          rtx x = expand_unop (word_mode, unoptab,
                   1058:                               operand_subword_force (op0, i, mode),
                   1059:                               target_piece, unsignedp);
                   1060:          if (target_piece != x)
                   1061:            emit_move_insn (target_piece, x);
                   1062:        }
                   1063: 
                   1064:       insns = get_insns ();
                   1065:       end_sequence ();
                   1066: 
                   1067:       emit_no_conflict_block (insns, target, op0, 0,
                   1068:                              gen_rtx (unoptab->code, mode, op0));
                   1069:       return target;
                   1070:     }
                   1071: 
                   1072:   if (unoptab->handlers[(int) mode].libfunc)
                   1073:     {
                   1074:       rtx insns;
                   1075:       rtx funexp = unoptab->handlers[(int) mode].libfunc;
                   1076: 
                   1077:       start_sequence ();
                   1078: 
                   1079:       /* Pass 1 for NO_QUEUE so we don't lose any increments
                   1080:         if the libcall is cse'd or moved.  */
                   1081:       emit_library_call (unoptab->handlers[(int) mode].libfunc,
                   1082:                         1, mode, 1, op0, mode);
                   1083:       insns = get_insns ();
                   1084:       end_sequence ();
                   1085: 
                   1086:       target = gen_reg_rtx (mode);
                   1087:       emit_libcall_block (insns, target, hard_libcall_value (mode),
                   1088:                          gen_rtx (unoptab->code, mode, op0));
                   1089: 
                   1090:       return target;
                   1091:     }
                   1092: 
                   1093:   /* It can't be done in this mode.  Can we do it in a wider mode?  */
                   1094: 
                   1095:   if (class == MODE_INT || class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT)
                   1096:     {
                   1097:       for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
                   1098:           wider_mode = GET_MODE_WIDER_MODE (wider_mode))
                   1099:        {
                   1100:          if ((unoptab->handlers[(int) wider_mode].insn_code
                   1101:               != CODE_FOR_nothing)
                   1102:              || unoptab->handlers[(int) wider_mode].libfunc)
                   1103:            {
                   1104:              rtx xop0 = op0;
                   1105: 
                   1106:              /* For certain operations, we need not actually extend
                   1107:                 the narrow operand, as long as we will truncate the
                   1108:                 results to the same narrowness.  */
                   1109: 
                   1110:              if ((unoptab == neg_optab || unoptab == one_cmpl_optab)
                   1111:                  && class == MODE_INT)
                   1112:                xop0 = gen_rtx (SUBREG, wider_mode, force_reg (mode, xop0), 0);
                   1113:              else
                   1114:                xop0 = convert_to_mode (wider_mode, xop0, unsignedp);
                   1115:              
                   1116:              temp = expand_unop (wider_mode, unoptab, xop0, 0, unsignedp);
                   1117: 
                   1118:              if (temp)
                   1119:                {
                   1120:                  if (class != MODE_INT)
                   1121:                    {
                   1122:                      if (target == 0)
                   1123:                        target = gen_reg_rtx (mode);
                   1124:                      convert_move (target, temp, 0);
                   1125:                      return target;
                   1126:                    }
                   1127:                  else
                   1128:                    return gen_lowpart (mode, temp);
                   1129:                }
                   1130:              else
                   1131:                delete_insns_since (last);
                   1132:            }
                   1133:        }
                   1134:     }
                   1135: 
                   1136:   return 0;
                   1137: }
                   1138: 
                   1139: /* Generate an instruction whose insn-code is INSN_CODE,
                   1140:    with two operands: an output TARGET and an input OP0.
                   1141:    TARGET *must* be nonzero, and the output is always stored there.
                   1142:    CODE is an rtx code such that (CODE OP0) is an rtx that describes
                   1143:    the value that is stored into TARGET.  */
                   1144: 
                   1145: void
                   1146: emit_unop_insn (icode, target, op0, code)
                   1147:      int icode;
                   1148:      rtx target;
                   1149:      rtx op0;
                   1150:      enum rtx_code code;
                   1151: {
                   1152:   register rtx temp;
                   1153:   enum machine_mode mode0 = insn_operand_mode[icode][1];
                   1154:   rtx pat;
                   1155: 
                   1156:   temp = target = protect_from_queue (target, 1);
                   1157: 
                   1158:   op0 = protect_from_queue (op0, 0);
                   1159: 
                   1160:   if (flag_force_mem)
                   1161:     op0 = force_not_mem (op0);
                   1162: 
                   1163:   /* Now, if insn does not accept our operands, put them into pseudos.  */
                   1164: 
                   1165:   if (! (*insn_operand_predicate[icode][1]) (op0, mode0))
                   1166:     op0 = copy_to_mode_reg (mode0, op0);
                   1167: 
                   1168:   if (! (*insn_operand_predicate[icode][0]) (temp, GET_MODE (temp))
                   1169:       || (flag_force_mem && GET_CODE (temp) == MEM))
                   1170:     temp = gen_reg_rtx (GET_MODE (temp));
                   1171: 
                   1172:   pat = GEN_FCN (icode) (temp, op0);
                   1173: 
                   1174:   if (GET_CODE (pat) == SEQUENCE && code != UNKNOWN)
                   1175:     add_equal_note (pat, temp, code, op0, 0);
                   1176:   
                   1177:   emit_insn (pat);
                   1178: 
                   1179:   if (temp != target)
                   1180:     emit_move_insn (target, temp);
                   1181: }
                   1182: 
                   1183: /* Emit code to perform a series of operations on a multi-word quantity, one
                   1184:    word at a time.
                   1185: 
                   1186:    Such a block is preceeded by a CLOBBER of the output, consists of multiple
                   1187:    insns, each setting one word of the output, and followed by a SET copying
                   1188:    the output to itself.
                   1189: 
                   1190:    Each of the insns setting words of the output receives a REG_NO_CONFLICT
                   1191:    note indicating that it doesn't conflict with the (also multi-word)
                   1192:    inputs.  The entire block is surrounded by REG_LIBCALL and REG_RETVAL
                   1193:    notes.
                   1194: 
                   1195:    INSNS is a block of code generated to perform the operation, not including
                   1196:    the CLOBBER and final copy.  All insns that compute intermediate values
                   1197:    are first emitted, followed by the block as described above.  Only
                   1198:    INSNs are allowed in the block; no library calls or jumps may be
                   1199:    present.
                   1200: 
                   1201:    TARGET, OP0, and OP1 are the output and inputs of the operations,
                   1202:    respectively.  OP1 may be zero for a unary operation.
                   1203: 
                   1204:    EQUIV, if non-zero, is an expression to be placed into a REG_EQUAL note
                   1205:    on the last insn.
                   1206: 
                   1207:    If TARGET is not a register, INSNS is simply emitted with no special
                   1208:    processing.
                   1209: 
                   1210:    The final insn emitted is returned.  */
                   1211: 
                   1212: rtx
                   1213: emit_no_conflict_block (insns, target, op0, op1, equiv)
                   1214:      rtx insns;
                   1215:      rtx target;
                   1216:      rtx op0, op1;
                   1217:      rtx equiv;
                   1218: {
                   1219:   rtx prev, next, first, last, insn;
                   1220: 
                   1221:   if (GET_CODE (target) != REG || reload_in_progress)
                   1222:     return emit_insns (insns);
                   1223: 
                   1224:   /* First emit all insns that do not store into words of the output and remove
                   1225:      these from the list.  */
                   1226:   for (insn = insns; insn; insn = next)
                   1227:     {
                   1228:       rtx set = 0;
                   1229:       int i;
                   1230: 
                   1231:       next = NEXT_INSN (insn);
                   1232: 
                   1233:       if (GET_CODE (insn) != INSN)
                   1234:        abort ();
                   1235: 
                   1236:       if (GET_CODE (PATTERN (insn)) == SET)
                   1237:        set = PATTERN (insn);
                   1238:       else if (GET_CODE (PATTERN (insn)) == PARALLEL)
                   1239:        {
                   1240:          for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
                   1241:            if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET)
                   1242:              {
                   1243:                set = XVECEXP (PATTERN (insn), 0, i);
                   1244:                break;
                   1245:              }
                   1246:        }
                   1247: 
                   1248:       if (set == 0)
                   1249:        abort ();
                   1250: 
                   1251:       if (! reg_overlap_mentioned_p (target, SET_DEST (set)))
                   1252:        {
                   1253:          if (PREV_INSN (insn))
                   1254:            NEXT_INSN (PREV_INSN (insn)) = next;
                   1255:          else
                   1256:            insns = next;
                   1257: 
                   1258:          if (next)
                   1259:            PREV_INSN (next) = PREV_INSN (insn);
                   1260: 
                   1261:          add_insn (insn);
                   1262:        }
                   1263:     }
                   1264: 
                   1265:   prev = get_last_insn ();
                   1266: 
                   1267:   /* Now write the CLOBBER of the output, followed by the setting of each
                   1268:      of the words, followed by the final copy.  */
                   1269:   if (target != op0 && target != op1)
                   1270:     emit_insn (gen_rtx (CLOBBER, VOIDmode, target));
                   1271: 
                   1272:   for (insn = insns; insn; insn = next)
                   1273:     {
                   1274:       next = NEXT_INSN (insn);
                   1275:       add_insn (insn);
                   1276: 
                   1277:       if (op1 && GET_CODE (op1) == REG)
                   1278:        REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_NO_CONFLICT, op1,
                   1279:                                    REG_NOTES (insn));
                   1280: 
                   1281:       if (op0 && GET_CODE (op0) == REG)
                   1282:        REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_NO_CONFLICT, op0,
                   1283:                                    REG_NOTES (insn));
                   1284:     }
                   1285: 
                   1286:   last = emit_move_insn (target, target);
                   1287:   if (equiv)
                   1288:     REG_NOTES (last) = gen_rtx (EXPR_LIST, REG_EQUAL, equiv, REG_NOTES (last));
                   1289: 
                   1290:   if (prev == 0)
                   1291:     first = get_insns ();
                   1292:   else
                   1293:     first = NEXT_INSN (prev);
                   1294: 
                   1295:   /* Encapsulate the block so it gets manipulated as a unit.  */
                   1296:   REG_NOTES (first) = gen_rtx (INSN_LIST, REG_LIBCALL, last,
                   1297:                               REG_NOTES (first));
                   1298:   REG_NOTES (last) = gen_rtx (INSN_LIST, REG_RETVAL, first, REG_NOTES (last));
                   1299: 
                   1300:   return last;
                   1301: }
                   1302: 
                   1303: /* Emit code to make a call to a constant function or a library call.
                   1304: 
                   1305:    INSNS is a list containing all insns emitted in the call.
                   1306:    These insns leave the result in RESULT.  Our block is to copy RESULT
                   1307:    to TARGET, which is logically equivalent to EQUIV.
                   1308: 
                   1309:    We first emit any insns that set a pseudo on the assumption that these are
                   1310:    loading constants into registers; doing so allows them to be safely cse'ed
                   1311:    between blocks.  Then we emit all the other insns in the block, followed by
                   1312:    an insn to move RESULT to TARGET.  This last insn will have a REQ_EQUAL
                   1313:    note with an operand of EQUIV.
                   1314: 
                   1315:    Except for the first group of insns (the ones setting pseudos), the
                   1316:    block is delimited by REG_RETVAL and REG_LIBCALL notes.  */
                   1317: 
                   1318: void
                   1319: emit_libcall_block (insns, target, result, equiv)
                   1320:      rtx insns;
                   1321:      rtx target;
                   1322:      rtx result;
                   1323:      rtx equiv;
                   1324: {
                   1325:   rtx prev, next, first, last, insn;
                   1326: 
                   1327:   /* First emit all insns that set pseudos.  Remove them from the list as
                   1328:      we go.  */
                   1329: 
                   1330:   for (insn = insns; insn; insn = next)
                   1331:     {
                   1332:       rtx set = single_set (insn);
                   1333: 
                   1334:       next = NEXT_INSN (insn);
                   1335: 
                   1336:       if (set != 0 && GET_CODE (SET_DEST (set)) == REG
                   1337:          && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
                   1338:        {
                   1339:          if (PREV_INSN (insn))
                   1340:            NEXT_INSN (PREV_INSN (insn)) = next;
                   1341:          else
                   1342:            insns = next;
                   1343: 
                   1344:          if (next)
                   1345:            PREV_INSN (next) = PREV_INSN (insn);
                   1346: 
                   1347:          add_insn (insn);
                   1348:        }
                   1349:     }
                   1350: 
                   1351:   prev = get_last_insn ();
                   1352: 
                   1353:   /* Write the remaining insns followed by the final copy.  */
                   1354: 
                   1355:   for (insn = insns; insn; insn = next)
                   1356:     {
                   1357:       next = NEXT_INSN (insn);
                   1358: 
                   1359:       add_insn (insn);
                   1360:     }
                   1361: 
                   1362:   last = emit_move_insn (target, result);
                   1363:   REG_NOTES (last) = gen_rtx (EXPR_LIST, REG_EQUAL, equiv, REG_NOTES (last));
                   1364: 
                   1365:   if (prev == 0)
                   1366:     first = get_insns ();
                   1367:   else
                   1368:     first = NEXT_INSN (prev);
                   1369: 
                   1370:   /* Encapsulate the block so it gets manipulated as a unit.  */
                   1371:   REG_NOTES (first) = gen_rtx (INSN_LIST, REG_LIBCALL, last,
                   1372:                               REG_NOTES (first));
                   1373:   REG_NOTES (last) = gen_rtx (INSN_LIST, REG_RETVAL, first, REG_NOTES (last));
                   1374: }
                   1375: 
                   1376: /* Generate code to store zero in X.  */
                   1377: 
                   1378: void
                   1379: emit_clr_insn (x)
                   1380:      rtx x;
                   1381: {
                   1382:   emit_move_insn (x, const0_rtx);
                   1383: }
                   1384: 
                   1385: /* Generate code to store 1 in X
                   1386:    assuming it contains zero beforehand.  */
                   1387: 
                   1388: void
                   1389: emit_0_to_1_insn (x)
                   1390:      rtx x;
                   1391: {
                   1392:   emit_move_insn (x, const1_rtx);
                   1393: }
                   1394: 
                   1395: /* Generate code to compare X with Y
                   1396:    so that the condition codes are set.
                   1397: 
                   1398:    MODE is the mode of the inputs (in case they are const_int).
                   1399:    UNSIGNEDP nonzero says that X and Y are unsigned;
                   1400:    this matters if they need to be widened.
                   1401: 
                   1402:    If they have mode BLKmode, then SIZE specifies the size of both X and Y,
                   1403:    and ALIGN specifies the known shared alignment of X and Y.
                   1404: 
                   1405:    COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
                   1406:    It is ignored for fixed-point and block comparisons;
                   1407:    it is used only for floating-point comparisons.  */
                   1408: 
                   1409: void
                   1410: emit_cmp_insn (x, y, comparison, size, mode, unsignedp, align)
                   1411:      rtx x, y;
                   1412:      enum rtx_code comparison;
                   1413:      rtx size;
                   1414:      int unsignedp;
                   1415:      int align;
                   1416: {
                   1417:   enum mode_class class;
                   1418:   enum machine_mode wider_mode;
                   1419: 
                   1420:   class = GET_MODE_CLASS (mode);
                   1421: 
                   1422:   /* They could both be VOIDmode if both args are immediate constants,
                   1423:      but we should fold that at an earlier stage.
                   1424:      With no special code here, this will call abort,
                   1425:      reminding the programmer to implement such folding.  */
                   1426: 
                   1427:   if (mode != BLKmode && flag_force_mem)
                   1428:     {
                   1429:       x = force_not_mem (x);
                   1430:       y = force_not_mem (y);
                   1431:     }
                   1432: 
                   1433:   /* If we are inside an appropriately-short loop and one operand is an
                   1434:      expensive constant, force it into a register.  */
                   1435:   if (CONSTANT_P (x) && preserve_subexpressions_p () && rtx_cost (x) > 2)
                   1436:     x = force_reg (mode, x);
                   1437: 
                   1438:   if (CONSTANT_P (y) && preserve_subexpressions_p () && rtx_cost (y) > 2)
                   1439:     y = force_reg (mode, y);
                   1440: 
                   1441:   /* Don't let both operands fail to indicate the mode.  */
                   1442:   if (GET_MODE (x) == VOIDmode && GET_MODE (y) == VOIDmode)
                   1443:     x = force_reg (mode, x);
                   1444: 
                   1445:   /* Handle all BLKmode compares.  */
                   1446: 
                   1447:   if (mode == BLKmode)
                   1448:     {
                   1449:       emit_queue ();
                   1450:       x = protect_from_queue (x, 0);
                   1451:       y = protect_from_queue (y, 0);
                   1452: 
                   1453:       if (size == 0)
                   1454:        abort ();
                   1455: #ifdef HAVE_cmpstrqi
                   1456:       if (HAVE_cmpstrqi
                   1457:          && GET_CODE (size) == CONST_INT
                   1458:          && INTVAL (size) < (1 << GET_MODE_BITSIZE (QImode)))
                   1459:        {
                   1460:          enum machine_mode result_mode
                   1461:            = insn_operand_mode[(int) CODE_FOR_cmpstrqi][0];
                   1462:          rtx result = gen_reg_rtx (result_mode);
                   1463:          emit_insn (gen_cmpstrqi (result, x, y, size,
                   1464:                                   gen_rtx (CONST_INT, VOIDmode, align)));
                   1465:          emit_cmp_insn (result, const0_rtx, comparison, 0, result_mode, 0, 0);
                   1466:        }
                   1467:       else
                   1468: #endif
                   1469: #ifdef HAVE_cmpstrhi
                   1470:       if (HAVE_cmpstrhi
                   1471:          && GET_CODE (size) == CONST_INT
                   1472:          && INTVAL (size) < (1 << GET_MODE_BITSIZE (HImode)))
                   1473:        {
                   1474:          enum machine_mode result_mode
                   1475:            = insn_operand_mode[(int) CODE_FOR_cmpstrhi][0];
                   1476:          rtx result = gen_reg_rtx (result_mode);
                   1477:          emit_insn (gen_cmpstrhi (result, x, y, size,
                   1478:                                   gen_rtx (CONST_INT, VOIDmode, align)));
                   1479:          emit_cmp_insn (result, const0_rtx, comparison, 0, result_mode, 0, 0);
                   1480:        }
                   1481:       else
                   1482: #endif
                   1483: #ifdef HAVE_cmpstrsi
                   1484:       if (HAVE_cmpstrsi)
                   1485:        {
                   1486:          enum machine_mode result_mode
                   1487:            = insn_operand_mode[(int) CODE_FOR_cmpstrsi][0];
                   1488:          rtx result = gen_reg_rtx (result_mode);
                   1489:          emit_insn (gen_cmpstrsi (result, x, y,
                   1490:                                   convert_to_mode (SImode, size, 1),
                   1491:                                   gen_rtx (CONST_INT, VOIDmode, align)));
                   1492:          emit_cmp_insn (result, const0_rtx, comparison, 0, result_mode, 0, 0);
                   1493:        }
                   1494:       else
                   1495: #endif
                   1496:        {
                   1497: #ifdef TARGET_MEM_FUNCTIONS
                   1498:          emit_library_call (memcmp_libfunc, 0,
                   1499:                             TYPE_MODE (integer_type_node), 3,
                   1500:                             XEXP (x, 0), Pmode, XEXP (y, 0), Pmode,
                   1501:                             size, Pmode);
                   1502: #else
                   1503:          emit_library_call (bcmp_libfunc, 0,
                   1504:                             TYPE_MODE (integer_type_node), 3,
                   1505:                             XEXP (x, 0), Pmode, XEXP (y, 0), Pmode,
                   1506:                             size, Pmode);
                   1507: #endif
                   1508:          emit_cmp_insn (hard_libcall_value (TYPE_MODE (integer_type_node)),
                   1509:                         const0_rtx, comparison, 0,
                   1510:                         TYPE_MODE (integer_type_node), 0, 0);
                   1511:        }
                   1512:       return;
                   1513:     }
                   1514: 
                   1515:   /* Handle some compares against zero.  */
                   1516: 
                   1517:   if (y == CONST0_RTX (mode)
                   1518:       && tst_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
                   1519:     {
                   1520:       int icode = (int) tst_optab->handlers[(int) mode].insn_code;
                   1521: 
                   1522:       emit_queue ();
                   1523:       x = protect_from_queue (x, 0);
                   1524:       y = protect_from_queue (y, 0);
                   1525: 
                   1526:       /* Now, if insn does accept these operands, put them into pseudos.  */
                   1527:       if (! (*insn_operand_predicate[icode][0])
                   1528:          (x, insn_operand_mode[icode][0]))
                   1529:        x = copy_to_mode_reg (insn_operand_mode[icode][0], x);
                   1530: 
                   1531:       emit_insn (GEN_FCN (icode) (x));
                   1532:       return;
                   1533:     }
                   1534: 
                   1535:   /* Handle compares for which there is a directly suitable insn.  */
                   1536: 
                   1537:   if (cmp_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
                   1538:     {
                   1539:       int icode = (int) cmp_optab->handlers[(int) mode].insn_code;
                   1540: 
                   1541:       emit_queue ();
                   1542:       x = protect_from_queue (x, 0);
                   1543:       y = protect_from_queue (y, 0);
                   1544: 
                   1545:       /* Now, if insn doesn't accept these operands, put them into pseudos.  */
                   1546:       if (! (*insn_operand_predicate[icode][0])
                   1547:          (x, insn_operand_mode[icode][0]))
                   1548:        x = copy_to_mode_reg (insn_operand_mode[icode][0], x);
                   1549: 
                   1550:       if (! (*insn_operand_predicate[icode][1])
                   1551:          (y, insn_operand_mode[icode][1]))
                   1552:        y = copy_to_mode_reg (insn_operand_mode[icode][1], y);
                   1553: 
                   1554:       emit_insn (GEN_FCN (icode) (x, y));
                   1555:       return;
                   1556:     }
                   1557: 
                   1558:   /* Try widening if we can find a direct insn that way.  */
                   1559: 
                   1560:   if (class == MODE_INT || class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT)
                   1561:     {
                   1562:       for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
                   1563:           wider_mode = GET_MODE_WIDER_MODE (wider_mode))
                   1564:        {
                   1565:          if (cmp_optab->handlers[(int) wider_mode].insn_code
                   1566:              != CODE_FOR_nothing)
                   1567:            {
                   1568:              x = convert_to_mode (wider_mode, x, unsignedp);
                   1569:              y = convert_to_mode (wider_mode, y, unsignedp);
                   1570:              emit_cmp_insn (x, y, comparison, 0,
                   1571:                             wider_mode, unsignedp, align);
                   1572:              return;
                   1573:            }
                   1574:        }
                   1575:     }
                   1576: 
                   1577:   /* Handle a lib call just for the mode we are using.  */
                   1578: 
                   1579:   if (cmp_optab->handlers[(int) mode].libfunc
                   1580:       && class != MODE_FLOAT)
                   1581:     {
                   1582:       rtx libfunc = cmp_optab->handlers[(int) mode].libfunc;
                   1583:       /* If we want unsigned, and this mode has a distinct unsigned
                   1584:         comparison routine, use that.  */
                   1585:       if (unsignedp && ucmp_optab->handlers[(int) mode].libfunc)
                   1586:        libfunc = ucmp_optab->handlers[(int) mode].libfunc;
                   1587: 
                   1588:       emit_library_call (libfunc, 0,
                   1589:                         SImode, 2, x, mode, y, mode);
                   1590: 
                   1591:       /* Integer comparison returns a result that must be compared against 1,
                   1592:         so that even if we do an unsigned compare afterward,
                   1593:         there is still a value that can represent the result "less than".  */
                   1594: 
                   1595:       emit_cmp_insn (hard_libcall_value (SImode), const1_rtx,
                   1596:                     comparison, 0, SImode, unsignedp, 0);
                   1597:       return;
                   1598:     }
                   1599: 
                   1600:   if (class == MODE_FLOAT)
                   1601:     emit_float_lib_cmp (x, y, comparison);
                   1602: 
                   1603:   else
                   1604:     abort ();
                   1605: }
                   1606: 
                   1607: /* Nonzero if a compare of mode MODE can be done straightforwardly
                   1608:    (without splitting it into pieces).  */
                   1609: 
                   1610: int
                   1611: can_compare_p (mode)
                   1612:      enum machine_mode mode;
                   1613: {
                   1614:   do
                   1615:     {
                   1616:       if (cmp_optab->handlers[(int)mode].insn_code != CODE_FOR_nothing)
                   1617:        return 1;
                   1618:       mode = GET_MODE_WIDER_MODE (mode);
                   1619:     } while (mode != VOIDmode);
                   1620: 
                   1621:   return 0;
                   1622: }
                   1623: 
                   1624: /* Emit a library call comparison between floating point X and Y.
                   1625:    COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).  */
                   1626: 
                   1627: static void
                   1628: emit_float_lib_cmp (x, y, comparison)
                   1629:      rtx x, y;
                   1630:      enum rtx_code comparison;
                   1631: {
                   1632:   enum machine_mode mode = GET_MODE (x);
                   1633:   rtx libfunc;
                   1634: 
                   1635:   if (mode == SFmode)
                   1636:     switch (comparison)
                   1637:       {
                   1638:       case EQ:
                   1639:        libfunc = eqsf2_libfunc;
                   1640:        break;
                   1641: 
                   1642:       case NE:
                   1643:        libfunc = nesf2_libfunc;
                   1644:        break;
                   1645: 
                   1646:       case GT:
                   1647:        libfunc = gtsf2_libfunc;
                   1648:        break;
                   1649: 
                   1650:       case GE:
                   1651:        libfunc = gesf2_libfunc;
                   1652:        break;
                   1653: 
                   1654:       case LT:
                   1655:        libfunc = ltsf2_libfunc;
                   1656:        break;
                   1657: 
                   1658:       case LE:
                   1659:        libfunc = lesf2_libfunc;
                   1660:        break;
                   1661:       }
                   1662:   else if (mode == DFmode)
                   1663:     switch (comparison)
                   1664:       {
                   1665:       case EQ:
                   1666:        libfunc = eqdf2_libfunc;
                   1667:        break;
                   1668: 
                   1669:       case NE:
                   1670:        libfunc = nedf2_libfunc;
                   1671:        break;
                   1672: 
                   1673:       case GT:
                   1674:        libfunc = gtdf2_libfunc;
                   1675:        break;
                   1676: 
                   1677:       case GE:
                   1678:        libfunc = gedf2_libfunc;
                   1679:        break;
                   1680: 
                   1681:       case LT:
                   1682:        libfunc = ltdf2_libfunc;
                   1683:        break;
                   1684: 
                   1685:       case LE:
                   1686:        libfunc = ledf2_libfunc;
                   1687:        break;
                   1688:       }
                   1689:   else
                   1690:     {
                   1691:       enum machine_mode wider_mode;
                   1692: 
                   1693:       for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
                   1694:           wider_mode = GET_MODE_WIDER_MODE (wider_mode))
                   1695:        {
                   1696:          if ((cmp_optab->handlers[(int) wider_mode].insn_code
                   1697:               != CODE_FOR_nothing)
                   1698:              || (cmp_optab->handlers[(int) wider_mode].libfunc != 0))
                   1699:            {
                   1700:              x = convert_to_mode (wider_mode, x, 0);
                   1701:              y = convert_to_mode (wider_mode, y, 0);
                   1702:              emit_float_lib_cmp (x, y, comparison);
                   1703:              return;
                   1704:            }
                   1705:        }
                   1706:       abort ();
                   1707:     }
                   1708: 
                   1709:   emit_library_call (libfunc, 0,
                   1710:                     SImode, 2, x, mode, y, mode);
                   1711: 
                   1712:   emit_cmp_insn (hard_libcall_value (SImode), const0_rtx, comparison,
                   1713:                 0, SImode, 0, 0);
                   1714: }
                   1715: 
                   1716: /* Generate code to indirectly jump to a location given in the rtx LOC.  */
                   1717: 
                   1718: void
                   1719: emit_indirect_jump (loc)
                   1720:      rtx loc;
                   1721: {
                   1722:   if (! ((*insn_operand_predicate[(int)CODE_FOR_indirect_jump][0])
                   1723:         (loc, VOIDmode)))
                   1724:     loc = copy_to_mode_reg (insn_operand_mode[(int)CODE_FOR_indirect_jump][0],
                   1725:                            loc);
                   1726: 
                   1727:   emit_jump_insn (gen_indirect_jump (loc));
                   1728: }
                   1729: 
                   1730: /* These three functions generate an insn body and return it
                   1731:    rather than emitting the insn.
                   1732: 
                   1733:    They do not protect from queued increments,
                   1734:    because they may be used 1) in protect_from_queue itself
                   1735:    and 2) in other passes where there is no queue.  */
                   1736: 
                   1737: /* Generate and return an insn body to add Y to X.  */
                   1738: 
                   1739: rtx
                   1740: gen_add2_insn (x, y)
                   1741:      rtx x, y;
                   1742: {
                   1743:   int icode = (int) add_optab->handlers[(int) GET_MODE (x)].insn_code; 
                   1744: 
                   1745:   if (! (*insn_operand_predicate[icode][0]) (x, insn_operand_mode[icode][0])
                   1746:       || ! (*insn_operand_predicate[icode][1]) (x, insn_operand_mode[icode][1])
                   1747:       || ! (*insn_operand_predicate[icode][2]) (y, insn_operand_mode[icode][2]))
                   1748:     abort ();
                   1749: 
                   1750:   return (GEN_FCN (icode) (x, x, y));
                   1751: }
                   1752: 
                   1753: int
                   1754: have_add2_insn (mode)
                   1755:      enum machine_mode mode;
                   1756: {
                   1757:   return add_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing;
                   1758: }
                   1759: 
                   1760: /* Generate and return an insn body to subtract Y from X.  */
                   1761: 
                   1762: rtx
                   1763: gen_sub2_insn (x, y)
                   1764:      rtx x, y;
                   1765: {
                   1766:   int icode = (int) sub_optab->handlers[(int) GET_MODE (x)].insn_code; 
                   1767: 
                   1768:   if (! (*insn_operand_predicate[icode][0]) (x, insn_operand_mode[icode][0])
                   1769:       || ! (*insn_operand_predicate[icode][1]) (x, insn_operand_mode[icode][1])
                   1770:       || ! (*insn_operand_predicate[icode][2]) (y, insn_operand_mode[icode][2]))
                   1771:     abort ();
                   1772: 
                   1773:   return (GEN_FCN (icode) (x, x, y));
                   1774: }
                   1775: 
                   1776: int
                   1777: have_sub2_insn (mode)
                   1778:      enum machine_mode mode;
                   1779: {
                   1780:   return sub_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing;
                   1781: }
                   1782: 
                   1783: /* Generate the body of an instruction to copy Y into X.  */
                   1784: 
                   1785: rtx
                   1786: gen_move_insn (x, y)
                   1787:      rtx x, y;
                   1788: {
                   1789:   register enum machine_mode mode = GET_MODE (x);
                   1790:   enum insn_code insn_code;
                   1791: 
                   1792:   if (mode == VOIDmode)
                   1793:     mode = GET_MODE (y); 
                   1794: 
                   1795:   insn_code = mov_optab->handlers[(int) mode].insn_code;
                   1796: 
                   1797:   /* Handle MODE_CC modes:  If we don't have a special move insn for this mode,
                   1798:      find a mode to do it in.  If we have a movcc, use it.  Otherwise,
                   1799:      find the MODE_INT mode of the same width.  */
                   1800: 
                   1801:   if (insn_code == CODE_FOR_nothing)
                   1802:     {
                   1803:       enum machine_mode tmode = VOIDmode;
                   1804:       rtx x1 = x, y1 = y;
                   1805: 
                   1806:       if (GET_MODE_CLASS (mode) == MODE_CC && mode != CCmode
                   1807:          && mov_optab->handlers[(int) CCmode].insn_code != CODE_FOR_nothing)
                   1808:        tmode = CCmode;
                   1809:       else if (GET_MODE_CLASS (mode) == MODE_CC)
                   1810:        for (tmode = QImode; tmode != VOIDmode;
                   1811:             tmode = GET_MODE_WIDER_MODE (tmode))
                   1812:          if (GET_MODE_SIZE (tmode) == GET_MODE_SIZE (mode))
                   1813:            break;
                   1814: 
                   1815:       if (tmode == VOIDmode)
                   1816:        abort ();
                   1817: 
                   1818:       /* Get X and Y in TMODE.  We can't use gen_lowpart here because it
                   1819:         may call change_address which is not appropriate if we were
                   1820:         called when a reload was in progress.  We don't have to worry
                   1821:         about changing the address since the size in bytes is supposed to
                   1822:         be the same.  Copy the MEM to change the mode and move any
                   1823:         substitutions from the old MEM to the new one.  */
                   1824: 
                   1825:       if (reload_in_progress)
                   1826:        {
                   1827:          x = gen_lowpart_common (tmode, x1);
                   1828:          if (x == 0 && GET_CODE (x1) == MEM)
                   1829:            {
                   1830:              x = gen_rtx (MEM, tmode, XEXP (x1, 0));
                   1831:              RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (x1);
                   1832:              MEM_IN_STRUCT_P (x) = MEM_IN_STRUCT_P (x1);
                   1833:              MEM_VOLATILE_P (x) = MEM_VOLATILE_P (x1);
                   1834:              copy_replacements (x1, x);
                   1835:            }
                   1836: 
                   1837:          y = gen_lowpart_common (tmode, y1);
                   1838:          if (y == 0 && GET_CODE (y1) == MEM)
                   1839:            {
                   1840:              y = gen_rtx (MEM, tmode, XEXP (y1, 0));
                   1841:              RTX_UNCHANGING_P (y) = RTX_UNCHANGING_P (y1);
                   1842:              MEM_IN_STRUCT_P (y) = MEM_IN_STRUCT_P (y1);
                   1843:              MEM_VOLATILE_P (y) = MEM_VOLATILE_P (y1);
                   1844:              copy_replacements (y1, y);
                   1845:            }
                   1846:        }
                   1847:       else
                   1848:        {
                   1849:          x = gen_lowpart (tmode, x);
                   1850:          y = gen_lowpart (tmode, y);
                   1851:        }
                   1852:          
                   1853:       insn_code = mov_optab->handlers[(int) tmode].insn_code;
                   1854:     }
                   1855: 
                   1856:   return (GEN_FCN (insn_code) (x, y));
                   1857: }
                   1858: 
                   1859: /* Tables of patterns for extending one integer mode to another.  */
                   1860: static enum insn_code extendtab[MAX_MACHINE_MODE][MAX_MACHINE_MODE][2];
                   1861: 
                   1862: /* Return the insn code used to extend FROM_MODE to TO_MODE.
                   1863:    UNSIGNEDP specifies zero-extension instead of sign-extension.  If
                   1864:    no such operation exists, CODE_FOR_nothing will be returned.  */
                   1865: 
                   1866: enum insn_code
                   1867: can_extend_p (to_mode, from_mode, unsignedp)
                   1868:      enum machine_mode to_mode, from_mode;
                   1869:      int unsignedp;
                   1870: {
                   1871:   return extendtab[(int) to_mode][(int) from_mode][unsignedp];
                   1872: }
                   1873: 
                   1874: /* Generate the body of an insn to extend Y (with mode MFROM)
                   1875:    into X (with mode MTO).  Do zero-extension if UNSIGNEDP is nonzero.  */
                   1876: 
                   1877: rtx
                   1878: gen_extend_insn (x, y, mto, mfrom, unsignedp)
                   1879:      rtx x, y;
                   1880:      enum machine_mode mto, mfrom;
                   1881:      int unsignedp;
                   1882: {
                   1883:   return (GEN_FCN (extendtab[(int) mto][(int) mfrom][unsignedp]) (x, y));
                   1884: }
                   1885: 
                   1886: static void
                   1887: init_extends ()
                   1888: {
                   1889:   enum insn_code *p;
                   1890: 
                   1891:   for (p = extendtab[0][0];
                   1892:        p < extendtab[0][0] + sizeof extendtab / sizeof extendtab[0][0][0];
                   1893:        p++)
                   1894:     *p = CODE_FOR_nothing;
                   1895: 
                   1896: #ifdef HAVE_extendditi2
                   1897:   if (HAVE_extendditi2)
                   1898:     extendtab[(int) TImode][(int) DImode][0] = CODE_FOR_extendditi2;
                   1899: #endif
                   1900: #ifdef HAVE_extendsiti2
                   1901:   if (HAVE_extendsiti2)
                   1902:     extendtab[(int) TImode][(int) SImode][0] = CODE_FOR_extendsiti2;
                   1903: #endif
                   1904: #ifdef HAVE_extendhiti2
                   1905:   if (HAVE_extendhiti2)
                   1906:     extendtab[(int) TImode][(int) HImode][0] = CODE_FOR_extendhiti2;
                   1907: #endif
                   1908: #ifdef HAVE_extendqiti2
                   1909:   if (HAVE_extendqiti2)
                   1910:     extendtab[(int) TImode][(int) QImode][0] = CODE_FOR_extendqiti2;
                   1911: #endif
                   1912: #ifdef HAVE_extendsidi2
                   1913:   if (HAVE_extendsidi2)
                   1914:     extendtab[(int) DImode][(int) SImode][0] = CODE_FOR_extendsidi2;
                   1915: #endif
                   1916: #ifdef HAVE_extendhidi2
                   1917:   if (HAVE_extendhidi2)
                   1918:     extendtab[(int) DImode][(int) HImode][0] = CODE_FOR_extendhidi2;
                   1919: #endif
                   1920: #ifdef HAVE_extendqidi2
                   1921:   if (HAVE_extendqidi2)
                   1922:     extendtab[(int) DImode][(int) QImode][0] = CODE_FOR_extendqidi2;
                   1923: #endif
                   1924: #ifdef HAVE_extendhisi2
                   1925:   if (HAVE_extendhisi2)
                   1926:     extendtab[(int) SImode][(int) HImode][0] = CODE_FOR_extendhisi2;
                   1927: #endif
                   1928: #ifdef HAVE_extendqisi2
                   1929:   if (HAVE_extendqisi2)
                   1930:     extendtab[(int) SImode][(int) QImode][0] = CODE_FOR_extendqisi2;
                   1931: #endif
                   1932: #ifdef HAVE_extendqihi2
                   1933:   if (HAVE_extendqihi2)
                   1934:     extendtab[(int) HImode][(int) QImode][0] = CODE_FOR_extendqihi2;
                   1935: #endif
                   1936: 
                   1937: #ifdef HAVE_zero_extendditi2
                   1938:   if (HAVE_zero_extendsiti2)
                   1939:     extendtab[(int) TImode][(int) DImode][1] = CODE_FOR_zero_extendditi2;
                   1940: #endif
                   1941: #ifdef HAVE_zero_extendsiti2
                   1942:   if (HAVE_zero_extendsiti2)
                   1943:     extendtab[(int) TImode][(int) SImode][1] = CODE_FOR_zero_extendsiti2;
                   1944: #endif
                   1945: #ifdef HAVE_zero_extendhiti2
                   1946:   if (HAVE_zero_extendhiti2)
                   1947:     extendtab[(int) TImode][(int) HImode][1] = CODE_FOR_zero_extendhiti2;
                   1948: #endif
                   1949: #ifdef HAVE_zero_extendqiti2
                   1950:   if (HAVE_zero_extendqiti2)
                   1951:     extendtab[(int) TImode][(int) QImode][1] = CODE_FOR_zero_extendqiti2;
                   1952: #endif
                   1953: #ifdef HAVE_zero_extendsidi2
                   1954:   if (HAVE_zero_extendsidi2)
                   1955:     extendtab[(int) DImode][(int) SImode][1] = CODE_FOR_zero_extendsidi2;
                   1956: #endif
                   1957: #ifdef HAVE_zero_extendhidi2
                   1958:   if (HAVE_zero_extendhidi2)
                   1959:     extendtab[(int) DImode][(int) HImode][1] = CODE_FOR_zero_extendhidi2;
                   1960: #endif
                   1961: #ifdef HAVE_zero_extendqidi2
                   1962:   if (HAVE_zero_extendqidi2)
                   1963:     extendtab[(int) DImode][(int) QImode][1] = CODE_FOR_zero_extendqidi2;
                   1964: #endif
                   1965: #ifdef HAVE_zero_extendhisi2
                   1966:   if (HAVE_zero_extendhisi2)
                   1967:     extendtab[(int) SImode][(int) HImode][1] = CODE_FOR_zero_extendhisi2;
                   1968: #endif
                   1969: #ifdef HAVE_zero_extendqisi2
                   1970:   if (HAVE_zero_extendqisi2)
                   1971:     extendtab[(int) SImode][(int) QImode][1] = CODE_FOR_zero_extendqisi2;
                   1972: #endif
                   1973: #ifdef HAVE_zero_extendqihi2
                   1974:   if (HAVE_zero_extendqihi2)
                   1975:     extendtab[(int) HImode][(int) QImode][1] = CODE_FOR_zero_extendqihi2;
                   1976: #endif
                   1977: }
                   1978: 
                   1979: /* can_fix_p and can_float_p say whether the target machine
                   1980:    can directly convert a given fixed point type to
                   1981:    a given floating point type, or vice versa.
                   1982:    The returned value is the CODE_FOR_... value to use,
                   1983:    or CODE_FOR_nothing if these modes cannot be directly converted.  */
                   1984: 
                   1985: static enum insn_code fixtab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
                   1986: static enum insn_code fixtrunctab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
                   1987: static enum insn_code floattab[NUM_MACHINE_MODES][NUM_MACHINE_MODES][2];
                   1988: 
                   1989: /* *TRUNCP_PTR is set to 1 if it is necessary to output
                   1990:    an explicit FTRUNC insn before the fix insn; otherwise 0.  */
                   1991: 
                   1992: static enum insn_code
                   1993: can_fix_p (fixmode, fltmode, unsignedp, truncp_ptr)
                   1994:      enum machine_mode fltmode, fixmode;
                   1995:      int unsignedp;
                   1996:      int *truncp_ptr;
                   1997: {
                   1998:   *truncp_ptr = 0;
                   1999:   if (fixtrunctab[(int) fltmode][(int) fixmode][unsignedp] != CODE_FOR_nothing)
                   2000:     return fixtrunctab[(int) fltmode][(int) fixmode][unsignedp];
                   2001: 
                   2002:   if (ftrunc_optab->handlers[(int) fltmode].insn_code != CODE_FOR_nothing)
                   2003:     {
                   2004:       *truncp_ptr = 1;
                   2005:       return fixtab[(int) fltmode][(int) fixmode][unsignedp];
                   2006:     }
                   2007:   return CODE_FOR_nothing;
                   2008: }
                   2009: 
                   2010: static enum insn_code
                   2011: can_float_p (fltmode, fixmode, unsignedp)
                   2012:      enum machine_mode fixmode, fltmode;
                   2013:      int unsignedp;
                   2014: {
                   2015:   return floattab[(int) fltmode][(int) fixmode][unsignedp];
                   2016: }
                   2017: 
                   2018: void
                   2019: init_fixtab ()
                   2020: {
                   2021:   enum insn_code *p;
                   2022:   for (p = fixtab[0][0];
                   2023:        p < fixtab[0][0] + sizeof fixtab / sizeof (fixtab[0][0][0]); 
                   2024:        p++)
                   2025:     *p = CODE_FOR_nothing;
                   2026:   for (p = fixtrunctab[0][0];
                   2027:        p < fixtrunctab[0][0] + sizeof fixtrunctab / sizeof (fixtrunctab[0][0][0]); 
                   2028:        p++)
                   2029:     *p = CODE_FOR_nothing;
                   2030: 
                   2031: #ifdef HAVE_fixsfqi2
                   2032:   if (HAVE_fixsfqi2)
                   2033:     fixtab[(int) SFmode][(int) QImode][0] = CODE_FOR_fixsfqi2;
                   2034: #endif
                   2035: #ifdef HAVE_fixsfhi2
                   2036:   if (HAVE_fixsfhi2)
                   2037:     fixtab[(int) SFmode][(int) HImode][0] = CODE_FOR_fixsfhi2;
                   2038: #endif
                   2039: #ifdef HAVE_fixsfsi2
                   2040:   if (HAVE_fixsfsi2)
                   2041:     fixtab[(int) SFmode][(int) SImode][0] = CODE_FOR_fixsfsi2;
                   2042: #endif
                   2043: #ifdef HAVE_fixsfdi2
                   2044:   if (HAVE_fixsfdi2)
                   2045:     fixtab[(int) SFmode][(int) DImode][0] = CODE_FOR_fixsfdi2;
                   2046: #endif
                   2047: 
                   2048: #ifdef HAVE_fixdfqi2
                   2049:   if (HAVE_fixdfqi2)
                   2050:     fixtab[(int) DFmode][(int) QImode][0] = CODE_FOR_fixdfqi2;
                   2051: #endif
                   2052: #ifdef HAVE_fixdfhi2
                   2053:   if (HAVE_fixdfhi2)
                   2054:     fixtab[(int) DFmode][(int) HImode][0] = CODE_FOR_fixdfhi2;
                   2055: #endif
                   2056: #ifdef HAVE_fixdfsi2
                   2057:   if (HAVE_fixdfsi2)
                   2058:     fixtab[(int) DFmode][(int) SImode][0] = CODE_FOR_fixdfsi2;
                   2059: #endif
                   2060: #ifdef HAVE_fixdfdi2
                   2061:   if (HAVE_fixdfdi2)
                   2062:     fixtab[(int) DFmode][(int) DImode][0] = CODE_FOR_fixdfdi2;
                   2063: #endif
                   2064: #ifdef HAVE_fixdfti2
                   2065:   if (HAVE_fixdfti2)
                   2066:     fixtab[(int) DFmode][(int) TImode][0] = CODE_FOR_fixdfti2;
                   2067: #endif
                   2068: 
                   2069: #ifdef HAVE_fixtfqi2
                   2070:   if (HAVE_fixtfqi2)
                   2071:     fixtab[(int) TFmode][(int) QImode][0] = CODE_FOR_fixtfqi2;
                   2072: #endif
                   2073: #ifdef HAVE_fixtfhi2
                   2074:   if (HAVE_fixtfhi2)
                   2075:     fixtab[(int) TFmode][(int) HImode][0] = CODE_FOR_fixtfhi2;
                   2076: #endif
                   2077: #ifdef HAVE_fixtfsi2
                   2078:   if (HAVE_fixtfsi2)
                   2079:     fixtab[(int) TFmode][(int) SImode][0] = CODE_FOR_fixtfsi2;
                   2080: #endif
                   2081: #ifdef HAVE_fixtfdi2
                   2082:   if (HAVE_fixtfdi2)
                   2083:     fixtab[(int) TFmode][(int) DImode][0] = CODE_FOR_fixtfdi2;
                   2084: #endif
                   2085: #ifdef HAVE_fixtfti2
                   2086:   if (HAVE_fixtfti2)
                   2087:     fixtab[(int) TFmode][(int) TImode][0] = CODE_FOR_fixtfti2;
                   2088: #endif
                   2089: 
                   2090: #ifdef HAVE_fixunssfqi2
                   2091:   if (HAVE_fixunssfqi2)
                   2092:     fixtab[(int) SFmode][(int) QImode][1] = CODE_FOR_fixunssfqi2;
                   2093: #endif
                   2094: #ifdef HAVE_fixunssfhi2
                   2095:   if (HAVE_fixunssfhi2)
                   2096:     fixtab[(int) SFmode][(int) HImode][1] = CODE_FOR_fixunssfhi2;
                   2097: #endif
                   2098: #ifdef HAVE_fixunssfsi2
                   2099:   if (HAVE_fixunssfsi2)
                   2100:     fixtab[(int) SFmode][(int) SImode][1] = CODE_FOR_fixunssfsi2;
                   2101: #endif
                   2102: #ifdef HAVE_fixunssfdi2
                   2103:   if (HAVE_fixunssfdi2)
                   2104:     fixtab[(int) SFmode][(int) DImode][1] = CODE_FOR_fixunssfdi2;
                   2105: #endif
                   2106: 
                   2107: #ifdef HAVE_fixunsdfqi2
                   2108:   if (HAVE_fixunsdfqi2)
                   2109:     fixtab[(int) DFmode][(int) QImode][1] = CODE_FOR_fixunsdfqi2;
                   2110: #endif
                   2111: #ifdef HAVE_fixunsdfhi2
                   2112:   if (HAVE_fixunsdfhi2)
                   2113:     fixtab[(int) DFmode][(int) HImode][1] = CODE_FOR_fixunsdfhi2;
                   2114: #endif
                   2115: #ifdef HAVE_fixunsdfsi2
                   2116:   if (HAVE_fixunsdfsi2)
                   2117:     fixtab[(int) DFmode][(int) SImode][1] = CODE_FOR_fixunsdfsi2;
                   2118: #endif
                   2119: #ifdef HAVE_fixunsdfdi2
                   2120:   if (HAVE_fixunsdfdi2)
                   2121:     fixtab[(int) DFmode][(int) DImode][1] = CODE_FOR_fixunsdfdi2;
                   2122: #endif
                   2123: #ifdef HAVE_fixunsdfti2
                   2124:   if (HAVE_fixunsdfti2)
                   2125:     fixtab[(int) DFmode][(int) TImode][1] = CODE_FOR_fixunsdfti2;
                   2126: #endif
                   2127: 
                   2128: #ifdef HAVE_fixunstfqi2
                   2129:   if (HAVE_fixunstfqi2)
                   2130:     fixtab[(int) TFmode][(int) QImode][1] = CODE_FOR_fixunstfqi2;
                   2131: #endif
                   2132: #ifdef HAVE_fixunstfhi2
                   2133:   if (HAVE_fixunstfhi2)
                   2134:     fixtab[(int) TFmode][(int) HImode][1] = CODE_FOR_fixunstfhi2;
                   2135: #endif
                   2136: #ifdef HAVE_fixunstfsi2
                   2137:   if (HAVE_fixunstfsi2)
                   2138:     fixtab[(int) TFmode][(int) SImode][1] = CODE_FOR_fixunstfsi2;
                   2139: #endif
                   2140: #ifdef HAVE_fixunstfdi2
                   2141:   if (HAVE_fixunstfdi2)
                   2142:     fixtab[(int) TFmode][(int) DImode][1] = CODE_FOR_fixunstfdi2;
                   2143: #endif
                   2144: #ifdef HAVE_fixunstfti2
                   2145:   if (HAVE_fixunstfti2)
                   2146:     fixtab[(int) TFmode][(int) TImode][1] = CODE_FOR_fixunstfti2;
                   2147: #endif
                   2148: 
                   2149: #ifdef HAVE_fix_truncsfqi2
                   2150:   if (HAVE_fix_truncsfqi2)
                   2151:     fixtrunctab[(int) SFmode][(int) QImode][0] = CODE_FOR_fix_truncsfqi2;
                   2152: #endif
                   2153: #ifdef HAVE_fix_truncsfhi2
                   2154:   if (HAVE_fix_truncsfhi2)
                   2155:     fixtrunctab[(int) SFmode][(int) HImode][0] = CODE_FOR_fix_truncsfhi2;
                   2156: #endif
                   2157: #ifdef HAVE_fix_truncsfsi2
                   2158:   if (HAVE_fix_truncsfsi2)
                   2159:     fixtrunctab[(int) SFmode][(int) SImode][0] = CODE_FOR_fix_truncsfsi2;
                   2160: #endif
                   2161: #ifdef HAVE_fix_truncsfdi2
                   2162:   if (HAVE_fix_truncsfdi2)
                   2163:     fixtrunctab[(int) SFmode][(int) DImode][0] = CODE_FOR_fix_truncsfdi2;
                   2164: #endif
                   2165: 
                   2166: #ifdef HAVE_fix_truncdfqi2
                   2167:   if (HAVE_fix_truncdfsi2)
                   2168:     fixtrunctab[(int) DFmode][(int) QImode][0] = CODE_FOR_fix_truncdfqi2;
                   2169: #endif
                   2170: #ifdef HAVE_fix_truncdfhi2
                   2171:   if (HAVE_fix_truncdfhi2)
                   2172:     fixtrunctab[(int) DFmode][(int) HImode][0] = CODE_FOR_fix_truncdfhi2;
                   2173: #endif
                   2174: #ifdef HAVE_fix_truncdfsi2
                   2175:   if (HAVE_fix_truncdfsi2)
                   2176:     fixtrunctab[(int) DFmode][(int) SImode][0] = CODE_FOR_fix_truncdfsi2;
                   2177: #endif
                   2178: #ifdef HAVE_fix_truncdfdi2
                   2179:   if (HAVE_fix_truncdfdi2)
                   2180:     fixtrunctab[(int) DFmode][(int) DImode][0] = CODE_FOR_fix_truncdfdi2;
                   2181: #endif
                   2182: #ifdef HAVE_fix_truncdfti2
                   2183:   if (HAVE_fix_truncdfti2)
                   2184:     fixtrunctab[(int) DFmode][(int) TImode][0] = CODE_FOR_fix_truncdfti2;
                   2185: #endif
                   2186: 
                   2187: #ifdef HAVE_fix_trunctfqi2
                   2188:   if (HAVE_fix_trunctfqi2)
                   2189:     fixtrunctab[(int) TFmode][(int) QImode][0] = CODE_FOR_fix_trunctfqi2;
                   2190: #endif
                   2191: #ifdef HAVE_fix_trunctfhi2
                   2192:   if (HAVE_fix_trunctfhi2)
                   2193:     fixtrunctab[(int) TFmode][(int) HImode][0] = CODE_FOR_fix_trunctfhi2;
                   2194: #endif
                   2195: #ifdef HAVE_fix_trunctfsi2
                   2196:   if (HAVE_fix_trunctfsi2)
                   2197:     fixtrunctab[(int) TFmode][(int) SImode][0] = CODE_FOR_fix_trunctfsi2;
                   2198: #endif
                   2199: #ifdef HAVE_fix_trunctfdi2
                   2200:   if (HAVE_fix_trunctfdi2)
                   2201:     fixtrunctab[(int) TFmode][(int) DImode][0] = CODE_FOR_fix_trunctfdi2;
                   2202: #endif
                   2203: #ifdef HAVE_fix_trunctfti2
                   2204:   if (HAVE_fix_trunctfti2)
                   2205:     fixtrunctab[(int) TFmode][(int) TImode][0] = CODE_FOR_fix_trunctfti2;
                   2206: #endif
                   2207: 
                   2208: #ifdef HAVE_fixuns_truncsfqi2
                   2209:   if (HAVE_fixuns_truncsfqi2)
                   2210:     fixtrunctab[(int) SFmode][(int) QImode][1] = CODE_FOR_fixuns_truncsfqi2;
                   2211: #endif
                   2212: #ifdef HAVE_fixuns_truncsfhi2
                   2213:   if (HAVE_fixuns_truncsfhi2)
                   2214:     fixtrunctab[(int) SFmode][(int) HImode][1] = CODE_FOR_fixuns_truncsfhi2;
                   2215: #endif
                   2216: #ifdef HAVE_fixuns_truncsfsi2
                   2217:   if (HAVE_fixuns_truncsfsi2)
                   2218:     fixtrunctab[(int) SFmode][(int) SImode][1] = CODE_FOR_fixuns_truncsfsi2;
                   2219: #endif
                   2220: #ifdef HAVE_fixuns_truncsfdi2
                   2221:   if (HAVE_fixuns_truncsfdi2)
                   2222:     fixtrunctab[(int) SFmode][(int) DImode][1] = CODE_FOR_fixuns_truncsfdi2;
                   2223: #endif
                   2224: 
                   2225: #ifdef HAVE_fixuns_truncdfqi2
                   2226:   if (HAVE_fixuns_truncdfqi2)
                   2227:     fixtrunctab[(int) DFmode][(int) QImode][1] = CODE_FOR_fixuns_truncdfqi2;
                   2228: #endif
                   2229: #ifdef HAVE_fixuns_truncdfhi2
                   2230:   if (HAVE_fixuns_truncdfhi2)
                   2231:     fixtrunctab[(int) DFmode][(int) HImode][1] = CODE_FOR_fixuns_truncdfhi2;
                   2232: #endif
                   2233: #ifdef HAVE_fixuns_truncdfsi2
                   2234:   if (HAVE_fixuns_truncdfsi2)
                   2235:     fixtrunctab[(int) DFmode][(int) SImode][1] = CODE_FOR_fixuns_truncdfsi2;
                   2236: #endif
                   2237: #ifdef HAVE_fixuns_truncdfdi2
                   2238:   if (HAVE_fixuns_truncdfdi2)
                   2239:     fixtrunctab[(int) DFmode][(int) DImode][1] = CODE_FOR_fixuns_truncdfdi2;
                   2240: #endif
                   2241: #ifdef HAVE_fixuns_truncdfti2
                   2242:   if (HAVE_fixuns_truncdfti2)
                   2243:     fixtrunctab[(int) DFmode][(int) TImode][1] = CODE_FOR_fixuns_truncdfti2;
                   2244: #endif
                   2245: 
                   2246: #ifdef HAVE_fixuns_trunctfqi2
                   2247:   if (HAVE_fixuns_trunctfqi2)
                   2248:     fixtrunctab[(int) TFmode][(int) QImode][1] = CODE_FOR_fixuns_trunctfqi2;
                   2249: #endif
                   2250: #ifdef HAVE_fixuns_trunctfhi2
                   2251:   if (HAVE_fixuns_trunctfhi2)
                   2252:     fixtrunctab[(int) TFmode][(int) HImode][1] = CODE_FOR_fixuns_trunctfhi2;
                   2253: #endif
                   2254: #ifdef HAVE_fixuns_trunctfsi2
                   2255:   if (HAVE_fixuns_trunctfsi2)
                   2256:     fixtrunctab[(int) TFmode][(int) SImode][1] = CODE_FOR_fixuns_trunctfsi2;
                   2257: #endif
                   2258: #ifdef HAVE_fixuns_trunctfdi2
                   2259:   if (HAVE_fixuns_trunctfdi2)
                   2260:     fixtrunctab[(int) TFmode][(int) DImode][1] = CODE_FOR_fixuns_trunctfdi2;
                   2261: #endif
                   2262: #ifdef HAVE_fixuns_trunctfti2
                   2263:   if (HAVE_fixuns_trunctfti2)
                   2264:     fixtrunctab[(int) TFmode][(int) TImode][1] = CODE_FOR_fixuns_trunctfti2;
                   2265: #endif
                   2266: 
                   2267: #ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC
                   2268:   /* This flag says the same insns that convert to a signed fixnum
                   2269:      also convert validly to an unsigned one.  */
                   2270:   {
                   2271:     int i;
                   2272:     int j;
                   2273:     for (i = 0; i < NUM_MACHINE_MODES; i++)
                   2274:       for (j = 0; j < NUM_MACHINE_MODES; j++)
                   2275:        fixtrunctab[i][j][1] = fixtrunctab[i][j][0];
                   2276:   }
                   2277: #endif
                   2278: }
                   2279: 
                   2280: void
                   2281: init_floattab ()
                   2282: {
                   2283:   enum insn_code *p;
                   2284:   for (p = floattab[0][0];
                   2285:        p < floattab[0][0] + sizeof floattab / sizeof (floattab[0][0][0]); 
                   2286:        p++)
                   2287:     *p = CODE_FOR_nothing;
                   2288: 
                   2289: #ifdef HAVE_floatqisf2
                   2290:   if (HAVE_floatqisf2)
                   2291:     floattab[(int) SFmode][(int) QImode][0] = CODE_FOR_floatqisf2;
                   2292: #endif
                   2293: #ifdef HAVE_floathisf2
                   2294:   if (HAVE_floathisf2)
                   2295:     floattab[(int) SFmode][(int) HImode][0] = CODE_FOR_floathisf2;
                   2296: #endif
                   2297: #ifdef HAVE_floatsisf2
                   2298:   if (HAVE_floatsisf2)
                   2299:     floattab[(int) SFmode][(int) SImode][0] = CODE_FOR_floatsisf2;
                   2300: #endif
                   2301: #ifdef HAVE_floatdisf2
                   2302:   if (HAVE_floatdisf2)
                   2303:     floattab[(int) SFmode][(int) DImode][0] = CODE_FOR_floatdisf2;
                   2304: #endif
                   2305: #ifdef HAVE_floattisf2
                   2306:   if (HAVE_floattisf2)
                   2307:     floattab[(int) SFmode][(int) TImode][0] = CODE_FOR_floattisf2;
                   2308: #endif
                   2309: 
                   2310: #ifdef HAVE_floatqidf2
                   2311:   if (HAVE_floatqidf2)
                   2312:     floattab[(int) DFmode][(int) QImode][0] = CODE_FOR_floatqidf2;
                   2313: #endif
                   2314: #ifdef HAVE_floathidf2
                   2315:   if (HAVE_floathidf2)
                   2316:     floattab[(int) DFmode][(int) HImode][0] = CODE_FOR_floathidf2;
                   2317: #endif
                   2318: #ifdef HAVE_floatsidf2
                   2319:   if (HAVE_floatsidf2)
                   2320:     floattab[(int) DFmode][(int) SImode][0] = CODE_FOR_floatsidf2;
                   2321: #endif
                   2322: #ifdef HAVE_floatdidf2
                   2323:   if (HAVE_floatdidf2)
                   2324:     floattab[(int) DFmode][(int) DImode][0] = CODE_FOR_floatdidf2;
                   2325: #endif
                   2326: #ifdef HAVE_floattidf2
                   2327:   if (HAVE_floattidf2)
                   2328:     floattab[(int) DFmode][(int) TImode][0] = CODE_FOR_floattidf2;
                   2329: #endif
                   2330: 
                   2331: #ifdef HAVE_floatqitf2
                   2332:   if (HAVE_floatqitf2)
                   2333:     floattab[(int) TFmode][(int) QImode][0] = CODE_FOR_floatqitf2;
                   2334: #endif
                   2335: #ifdef HAVE_floathitf2
                   2336:   if (HAVE_floathitf2)
                   2337:     floattab[(int) TFmode][(int) HImode][0] = CODE_FOR_floathitf2;
                   2338: #endif
                   2339: #ifdef HAVE_floatsitf2
                   2340:   if (HAVE_floatsitf2)
                   2341:     floattab[(int) TFmode][(int) SImode][0] = CODE_FOR_floatsitf2;
                   2342: #endif
                   2343: #ifdef HAVE_floatditf2
                   2344:   if (HAVE_floatditf2)
                   2345:     floattab[(int) TFmode][(int) DImode][0] = CODE_FOR_floatditf2;
                   2346: #endif
                   2347: #ifdef HAVE_floattitf2
                   2348:   if (HAVE_floattitf2)
                   2349:     floattab[(int) TFmode][(int) TImode][0] = CODE_FOR_floattitf2;
                   2350: #endif
                   2351: 
                   2352: #ifdef HAVE_floatunsqisf2
                   2353:   if (HAVE_floatunsqisf2)
                   2354:     floattab[(int) SFmode][(int) QImode][1] = CODE_FOR_floatunsqisf2;
                   2355: #endif
                   2356: #ifdef HAVE_floatunshisf2
                   2357:   if (HAVE_floatunshisf2)
                   2358:     floattab[(int) SFmode][(int) HImode][1] = CODE_FOR_floatunshisf2;
                   2359: #endif
                   2360: #ifdef HAVE_floatunssisf2
                   2361:   if (HAVE_floatunssisf2)
                   2362:     floattab[(int) SFmode][(int) SImode][1] = CODE_FOR_floatunssisf2;
                   2363: #endif
                   2364: #ifdef HAVE_floatunsdisf2
                   2365:   if (HAVE_floatunsdisf2)
                   2366:     floattab[(int) SFmode][(int) DImode][1] = CODE_FOR_floatunsdisf2;
                   2367: #endif
                   2368: #ifdef HAVE_floatunstisf2
                   2369:   if (HAVE_floatunstisf2)
                   2370:     floattab[(int) SFmode][(int) TImode][1] = CODE_FOR_floatunstisf2;
                   2371: #endif
                   2372: 
                   2373: #ifdef HAVE_floatunsqidf2
                   2374:   if (HAVE_floatunsqidf2)
                   2375:     floattab[(int) DFmode][(int) QImode][1] = CODE_FOR_floatunsqidf2;
                   2376: #endif
                   2377: #ifdef HAVE_floatunshidf2
                   2378:   if (HAVE_floatunshidf2)
                   2379:     floattab[(int) DFmode][(int) HImode][1] = CODE_FOR_floatunshidf2;
                   2380: #endif
                   2381: #ifdef HAVE_floatunssidf2
                   2382:   if (HAVE_floatunssidf2)
                   2383:     floattab[(int) DFmode][(int) SImode][1] = CODE_FOR_floatunssidf2;
                   2384: #endif
                   2385: #ifdef HAVE_floatunsdidf2
                   2386:   if (HAVE_floatunsdidf2)
                   2387:     floattab[(int) DFmode][(int) DImode][1] = CODE_FOR_floatunsdidf2;
                   2388: #endif
                   2389: #ifdef HAVE_floatunstidf2
                   2390:   if (HAVE_floatunstidf2)
                   2391:     floattab[(int) DFmode][(int) TImode][1] = CODE_FOR_floatunstidf2;
                   2392: #endif
                   2393: 
                   2394: #ifdef HAVE_floatunsqitf2
                   2395:   if (HAVE_floatunsqitf2)
                   2396:     floattab[(int) TFmode][(int) QImode][1] = CODE_FOR_floatunsqitf2;
                   2397: #endif
                   2398: #ifdef HAVE_floatunshitf2
                   2399:   if (HAVE_floatunshitf2)
                   2400:     floattab[(int) TFmode][(int) HImode][1] = CODE_FOR_floatunshitf2;
                   2401: #endif
                   2402: #ifdef HAVE_floatunssitf2
                   2403:   if (HAVE_floatunssitf2)
                   2404:     floattab[(int) TFmode][(int) SImode][1] = CODE_FOR_floatunssitf2;
                   2405: #endif
                   2406: #ifdef HAVE_floatunsditf2
                   2407:   if (HAVE_floatunsditf2)
                   2408:     floattab[(int) TFmode][(int) DImode][1] = CODE_FOR_floatunsditf2;
                   2409: #endif
                   2410: #ifdef HAVE_floatunstitf2
                   2411:   if (HAVE_floatunstitf2)
                   2412:     floattab[(int) TFmode][(int) TImode][1] = CODE_FOR_floatunstitf2;
                   2413: #endif
                   2414: }
                   2415: 
                   2416: /* Generate code to convert FROM to floating point
                   2417:    and store in TO.  FROM must be fixed point and not VOIDmode.
                   2418:    UNSIGNEDP nonzero means regard FROM as unsigned.
                   2419:    Normally this is done by correcting the final value
                   2420:    if it is negative.  */
                   2421: 
                   2422: void
                   2423: expand_float (to, from, unsignedp)
                   2424:      rtx to, from;
                   2425:      int unsignedp;
                   2426: {
                   2427:   enum insn_code icode;
                   2428:   register rtx target = to;
                   2429:   enum machine_mode fmode, imode;
                   2430: 
                   2431:   /* Crash now, because we won't be able to decide which mode to use.  */
                   2432:   if (GET_MODE (from) == VOIDmode)
                   2433:     abort ();
                   2434: 
                   2435:   /* Look for an insn to do the conversion.  Do it in the specified
                   2436:      modes if possible; otherwise convert either input, output or both to
                   2437:      wider mode.  If the integer mode is wider than the mode of FROM,
                   2438:      we can do the conversion signed even if the input is unsigned.  */
                   2439: 
                   2440:   for (imode = GET_MODE (from); imode != VOIDmode;
                   2441:        imode = GET_MODE_WIDER_MODE (imode))
                   2442:     for (fmode = GET_MODE (to); fmode != VOIDmode;
                   2443:         fmode = GET_MODE_WIDER_MODE (fmode))
                   2444:       {
                   2445:        int doing_unsigned = unsignedp;
                   2446: 
                   2447:        icode = can_float_p (fmode, imode, unsignedp);
                   2448:        if (icode == CODE_FOR_nothing && imode != GET_MODE (from) && unsignedp)
                   2449:          icode = can_float_p (fmode, imode, 0), doing_unsigned = 0;
                   2450: 
                   2451:        if (icode != CODE_FOR_nothing)
                   2452:          {
                   2453:            to = protect_from_queue (to, 1);
                   2454: 
                   2455:            if (imode != GET_MODE (from))
                   2456:              from = convert_to_mode (imode, from, unsignedp);
                   2457:            else
                   2458:              from = protect_from_queue (from, 0);
                   2459: 
                   2460:            if (fmode != GET_MODE (to))
                   2461:              target = gen_reg_rtx (fmode);
                   2462: 
                   2463:            emit_unop_insn (icode, target, from,
                   2464:                            doing_unsigned ? UNSIGNED_FLOAT : FLOAT);
                   2465: 
                   2466:            if (target != to)
                   2467:              convert_move (to, target, 0);
                   2468:            return;
                   2469:          }
                   2470:     }
                   2471: 
                   2472: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
                   2473: 
                   2474:   /* Unsigned integer, and no way to convert directly.
                   2475:      Convert as signed, then conditionally adjust the result.  */
                   2476:   if (unsignedp)
                   2477:     {
                   2478:       rtx label = gen_label_rtx ();
                   2479:       rtx temp;
                   2480:       REAL_VALUE_TYPE offset;
                   2481: 
                   2482:       emit_queue ();
                   2483: 
                   2484:       to = protect_from_queue (to, 1);
                   2485:       from = protect_from_queue (from, 0);
                   2486: 
                   2487:       if (flag_force_mem)
                   2488:        from = force_not_mem (from);
                   2489: 
                   2490:       /* If we are about to do some arithmetic to correct for an
                   2491:         unsigned operand, do it in a pseudo-register.  */
                   2492: 
                   2493:       if (GET_CODE (to) != REG || REGNO (to) <= LAST_VIRTUAL_REGISTER)
                   2494:        target = gen_reg_rtx (GET_MODE (to));
                   2495: 
                   2496:       /* Convert as signed integer to floating.  */
                   2497:       expand_float (target, from, 0);
                   2498: 
                   2499:       /* If FROM is negative (and therefore TO is negative),
                   2500:         correct its value by 2**bitwidth.  */
                   2501: 
                   2502:       do_pending_stack_adjust ();
                   2503:       emit_cmp_insn (from, const0_rtx, GE, 0, GET_MODE (from), 0, 0);
                   2504:       emit_jump_insn (gen_bge (label));
                   2505:       /* On SCO 3.2.1, ldexp rejects values outside [0.5, 1).
                   2506:         Rather than setting up a dconst_dot_5, let's hope SCO
                   2507:         fixes the bug.  */
                   2508:       offset = REAL_VALUE_LDEXP (dconst1, GET_MODE_BITSIZE (GET_MODE (from)));
                   2509:       temp = expand_binop (GET_MODE (to), add_optab, target,
                   2510:                           immed_real_const_1 (offset, GET_MODE (to)),
                   2511:                           target, 0, OPTAB_LIB_WIDEN);
                   2512:       if (temp != target)
                   2513:        emit_move_insn (target, temp);
                   2514:       do_pending_stack_adjust ();
                   2515:       emit_label (label);
                   2516:     }
                   2517:   else
                   2518: #endif
                   2519: 
                   2520:   /* No hardware instruction available; call a library
                   2521:      to convert from SImode or DImode into SFmode or DFmode.  */
                   2522:     {
                   2523:       rtx libfcn;
                   2524:       rtx insns;
                   2525: 
                   2526:       to = protect_from_queue (to, 1);
                   2527: 
                   2528:       if (GET_MODE_SIZE (GET_MODE (from)) < GET_MODE_SIZE (SImode))
                   2529:        from = convert_to_mode (SImode, from, unsignedp);
                   2530:       else
                   2531:        from = protect_from_queue (from, 0);
                   2532: 
                   2533:       if (flag_force_mem)
                   2534:        from = force_not_mem (from);
                   2535: 
                   2536:       if (GET_MODE (to) == SFmode)
                   2537:        {
                   2538:          if (GET_MODE (from) == SImode)
                   2539:            libfcn = floatsisf_libfunc;
                   2540:          else if (GET_MODE (from) == DImode)
                   2541:            libfcn = floatdisf_libfunc;
                   2542:          else
                   2543:            abort ();
                   2544:        }
                   2545:       else if (GET_MODE (to) == DFmode)
                   2546:        {
                   2547:          if (GET_MODE (from) == SImode)
                   2548:            libfcn = floatsidf_libfunc;
                   2549:          else if (GET_MODE (from) == DImode)
                   2550:            libfcn = floatdidf_libfunc;
                   2551:          else
                   2552:            abort ();
                   2553:        }
                   2554:       else
                   2555:        abort ();
                   2556: 
                   2557:       start_sequence ();
                   2558: 
                   2559:       emit_library_call (libfcn, 0, GET_MODE (to), 1, from, GET_MODE (from));
                   2560:       insns = get_insns ();
                   2561:       end_sequence ();
                   2562: 
                   2563:       emit_libcall_block (insns, target, hard_libcall_value (GET_MODE (to)),
                   2564:                          gen_rtx (FLOAT, GET_MODE (to), from));
                   2565:     }
                   2566: 
                   2567:   /* Copy result to requested destination
                   2568:      if we have been computing in a temp location.  */
                   2569: 
                   2570:   if (target != to)
                   2571:     {
                   2572:       if (GET_MODE (target) == GET_MODE (to))
                   2573:        emit_move_insn (to, target);
                   2574:       else
                   2575:        convert_move (to, target, 0);
                   2576:     }
                   2577: }
                   2578: 
                   2579: /* expand_fix: generate code to convert FROM to fixed point
                   2580:    and store in TO.  FROM must be floating point.  */
                   2581: 
                   2582: static rtx
                   2583: ftruncify (x)
                   2584:      rtx x;
                   2585: {
                   2586:   rtx temp = gen_reg_rtx (GET_MODE (x));
                   2587:   return expand_unop (GET_MODE (x), ftrunc_optab, x, temp, 0);
                   2588: }
                   2589: 
                   2590: void
                   2591: expand_fix (to, from, unsignedp)
                   2592:      register rtx to, from;
                   2593:      int unsignedp;
                   2594: {
                   2595:   enum insn_code icode;
                   2596:   register rtx target = to;
                   2597:   enum machine_mode fmode, imode;
                   2598:   int must_trunc = 0;
                   2599:   rtx libfcn = 0;
                   2600: 
                   2601:   /* We first try to find a pair of modes, one real and one integer, at
                   2602:      least as wide as FROM and TO, respectively, in which we can open-code
                   2603:      this conversion.  If the integer mode is wider than the mode of TO,
                   2604:      we can do the conversion either signed or unsigned.  */
                   2605: 
                   2606:   for (imode = GET_MODE (to); imode != VOIDmode;
                   2607:        imode = GET_MODE_WIDER_MODE (imode))
                   2608:     for (fmode = GET_MODE (from); fmode != VOIDmode;
                   2609:         fmode = GET_MODE_WIDER_MODE (fmode))
                   2610:       {
                   2611:        int doing_unsigned = unsignedp;
                   2612: 
                   2613:        icode = can_fix_p (imode, fmode, unsignedp, &must_trunc);
                   2614:        if (icode == CODE_FOR_nothing && imode != GET_MODE (to) && unsignedp)
                   2615:          icode = can_fix_p (imode, fmode, 0, &must_trunc), doing_unsigned = 0;
                   2616: 
                   2617:        if (icode != CODE_FOR_nothing)
                   2618:          {
                   2619:            to = protect_from_queue (to, 1);
                   2620: 
                   2621:            if (fmode != GET_MODE (from))
                   2622:              from = convert_to_mode (fmode, from, 0);
                   2623:            else
                   2624:              from = protect_from_queue (from, 0);
                   2625: 
                   2626:            if (must_trunc)
                   2627:              from = ftruncify (from);
                   2628: 
                   2629:            if (imode != GET_MODE (to))
                   2630:              target = gen_reg_rtx (imode);
                   2631: 
                   2632:            emit_unop_insn (icode, target, from,
                   2633:                            doing_unsigned ? UNSIGNED_FIX : FIX);
                   2634:            if (target != to)
                   2635:              convert_move (to, target, unsignedp);
                   2636:            return;
                   2637:          }
                   2638:       }
                   2639: 
                   2640: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
                   2641:   /* For an unsigned conversion, there is one more way to do it.
                   2642:      If we have a signed conversion, we generate code that compares
                   2643:      the real value to the largest representable positive number.  If if
                   2644:      is smaller, the conversion is done normally.  Otherwise, subtract
                   2645:      one plus the highest signed number, convert, and add it back.
                   2646: 
                   2647:      We only need to check all real modes, since we know we didn't find
                   2648:      anything with a wider inetger mode.  */
                   2649: 
                   2650:   if (unsignedp && GET_MODE_BITSIZE (GET_MODE (to)) <= HOST_BITS_PER_INT)
                   2651:     for (fmode = GET_MODE (from); fmode != VOIDmode;
                   2652:         fmode = GET_MODE_WIDER_MODE (fmode))
                   2653:       /* Make sure we won't lose significant bits doing this.  */
                   2654:       if (GET_MODE_BITSIZE (fmode) > GET_MODE_BITSIZE (GET_MODE (to))
                   2655:          && CODE_FOR_nothing != can_fix_p (GET_MODE (to), fmode, 0,
                   2656:                                            &must_trunc))
                   2657:        {
                   2658:          int bitsize = GET_MODE_BITSIZE (GET_MODE (to));
                   2659:          REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (dconst1, bitsize - 1);
                   2660:          rtx limit = immed_real_const_1 (offset, fmode);
                   2661:          rtx lab1 = gen_label_rtx ();
                   2662:          rtx lab2 = gen_label_rtx ();
                   2663:          rtx insn;
                   2664: 
                   2665:          emit_queue ();
                   2666:          to = protect_from_queue (to, 1);
                   2667:          from = protect_from_queue (from, 0);
                   2668: 
                   2669:          if (flag_force_mem)
                   2670:            from = force_not_mem (from);
                   2671: 
                   2672:          if (fmode != GET_MODE (from))
                   2673:            from = convert_to_mode (fmode, from, 0);
                   2674: 
                   2675:          /* See if we need to do the subtraction.  */
                   2676:          do_pending_stack_adjust ();
                   2677:          emit_cmp_insn (from, limit, GE, 0, GET_MODE (from), 0, 0);
                   2678:          emit_jump_insn (gen_bge (lab1));
                   2679: 
                   2680:          /* If not, do the signed "fix" and branch around fixup code.  */
                   2681:          expand_fix (to, from, 0);
                   2682:          emit_jump_insn (gen_jump (lab2));
                   2683:          emit_barrier ();
                   2684: 
                   2685:          /* Otherwise, subtract 2**(N-1), convert to signed number,
                   2686:             then add 2**(N-1).  Do the addition using XOR since this
                   2687:             will often generate better code.  */
                   2688:          emit_label (lab1);
                   2689:          target = expand_binop (GET_MODE (from), sub_optab, from, limit,
                   2690:                                 0, 0, OPTAB_LIB_WIDEN);
                   2691:          expand_fix (to, target, 0);
                   2692:          target = expand_binop (GET_MODE (to), xor_optab, to,
                   2693:                                 gen_rtx (CONST_INT, VOIDmode,
                   2694:                                        1 << (bitsize - 1)),
                   2695:                                 to, 1, OPTAB_LIB_WIDEN);
                   2696: 
                   2697:          if (target != to)
                   2698:            emit_move_insn (to, target);
                   2699: 
                   2700:          emit_label (lab2);
                   2701: 
                   2702:          /* Make a place for a REG_NOTE and add it.  */
                   2703:          insn = emit_move_insn (to, to);
                   2704:          REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUAL,
                   2705:                                      gen_rtx (UNSIGNED_FIX, GET_MODE (to),
                   2706:                                               from), REG_NOTES (insn));
                   2707: 
                   2708:          return;
                   2709:        }
                   2710: #endif
                   2711: 
                   2712:   /* We can't do it with an insn, so use a library call.  But first ensure
                   2713:      that the mode of TO is at least as wide as SImode, since those are the
                   2714:      only library calls we know about.  */
                   2715: 
                   2716:   if (GET_MODE_SIZE (GET_MODE (to)) < GET_MODE_SIZE (SImode))
                   2717:     {
                   2718:       target = gen_reg_rtx (SImode);
                   2719: 
                   2720:       expand_fix (target, from, unsignedp);
                   2721:     }
                   2722:   else if (GET_MODE (from) == SFmode)
                   2723:     {
                   2724:       if (GET_MODE (to) == SImode)
                   2725:        libfcn = unsignedp ? fixunssfsi_libfunc : fixsfsi_libfunc;
                   2726:       else if (GET_MODE (to) == DImode)
                   2727:        libfcn = unsignedp ? fixunssfdi_libfunc : fixsfdi_libfunc;
                   2728:       else
                   2729:        abort ();
                   2730:     }
                   2731:   else if (GET_MODE (from) == DFmode)
                   2732:     {
                   2733:       if (GET_MODE (to) == SImode)
                   2734:        libfcn = unsignedp ? fixunsdfsi_libfunc : fixdfsi_libfunc;
                   2735:       else if (GET_MODE (to) == DImode)
                   2736:        libfcn = unsignedp ? fixunsdfdi_libfunc : fixdfdi_libfunc;
                   2737:       else
                   2738:        abort ();
                   2739:     }
                   2740:   else
                   2741:     abort ();
                   2742: 
                   2743:   if (libfcn)
                   2744:     {
                   2745:       rtx insns;
                   2746: 
                   2747:       to = protect_from_queue (to, 1);
                   2748:       from = protect_from_queue (from, 0);
                   2749: 
                   2750:       if (flag_force_mem)
                   2751:        from = force_not_mem (from);
                   2752: 
                   2753:       start_sequence ();
                   2754: 
                   2755:       emit_library_call (libfcn, 0, GET_MODE (to), 1, from, GET_MODE (from));
                   2756:       insns = get_insns ();
                   2757:       end_sequence ();
                   2758: 
                   2759:       emit_libcall_block (insns, target, hard_libcall_value (GET_MODE (to)),
                   2760:                          gen_rtx (unsignedp ? FIX : UNSIGNED_FIX,
                   2761:                                   GET_MODE (to), from));
                   2762:     }
                   2763:       
                   2764:   if (GET_MODE (to) == GET_MODE (target))
                   2765:     emit_move_insn (to, target);
                   2766:   else
                   2767:     convert_move (to, target, 0);
                   2768: }
                   2769: 
                   2770: static optab
                   2771: init_optab (code)
                   2772:      enum rtx_code code;
                   2773: {
                   2774:   int i;
                   2775:   optab op = (optab) xmalloc (sizeof (struct optab));
                   2776:   op->code = code;
                   2777:   for (i = 0; i < NUM_MACHINE_MODES; i++)
                   2778:     {
                   2779:       op->handlers[i].insn_code = CODE_FOR_nothing;
                   2780:       op->handlers[i].libfunc = 0;
                   2781:     }
                   2782:   return op;
                   2783: }
                   2784: 
                   2785: /* Call this once to initialize the contents of the optabs
                   2786:    appropriately for the current target machine.  */
                   2787: 
                   2788: void
                   2789: init_optabs ()
                   2790: {
                   2791:   int i;
                   2792: 
                   2793:   init_fixtab ();
                   2794:   init_floattab ();
                   2795:   init_extends ();
                   2796: 
                   2797:   add_optab = init_optab (PLUS);
                   2798:   sub_optab = init_optab (MINUS);
                   2799:   smul_optab = init_optab (MULT);
                   2800:   smul_widen_optab = init_optab (UNKNOWN);
                   2801:   umul_widen_optab = init_optab (UNKNOWN);
                   2802:   sdiv_optab = init_optab (DIV);
                   2803:   sdivmod_optab = init_optab (UNKNOWN);
                   2804:   udiv_optab = init_optab (UDIV);
                   2805:   udivmod_optab = init_optab (UNKNOWN);
                   2806:   smod_optab = init_optab (MOD);
                   2807:   umod_optab = init_optab (UMOD);
                   2808:   flodiv_optab = init_optab (DIV);
                   2809:   ftrunc_optab = init_optab (UNKNOWN);
                   2810:   and_optab = init_optab (AND);
                   2811:   ior_optab = init_optab (IOR);
                   2812:   xor_optab = init_optab (XOR);
                   2813:   ashl_optab = init_optab (ASHIFT);
                   2814:   ashr_optab = init_optab (ASHIFTRT);
                   2815:   lshl_optab = init_optab (LSHIFT);
                   2816:   lshr_optab = init_optab (LSHIFTRT);
                   2817:   rotl_optab = init_optab (ROTATE);
                   2818:   rotr_optab = init_optab (ROTATERT);
                   2819:   smin_optab = init_optab (SMIN);
                   2820:   smax_optab = init_optab (SMAX);
                   2821:   umin_optab = init_optab (UMIN);
                   2822:   umax_optab = init_optab (UMAX);
                   2823:   mov_optab = init_optab (UNKNOWN);
                   2824:   movstrict_optab = init_optab (UNKNOWN);
                   2825:   cmp_optab = init_optab (UNKNOWN);
                   2826:   ucmp_optab = init_optab (UNKNOWN);
                   2827:   tst_optab = init_optab (UNKNOWN);
                   2828:   neg_optab = init_optab (NEG);
                   2829:   abs_optab = init_optab (ABS);
                   2830:   one_cmpl_optab = init_optab (NOT);
                   2831:   ffs_optab = init_optab (FFS);
                   2832: 
                   2833: #ifdef HAVE_addqi3
                   2834:   if (HAVE_addqi3)
                   2835:     add_optab->handlers[(int) QImode].insn_code = CODE_FOR_addqi3;
                   2836: #endif
                   2837: #ifdef HAVE_addhi3
                   2838:   if (HAVE_addhi3)
                   2839:     add_optab->handlers[(int) HImode].insn_code = CODE_FOR_addhi3;
                   2840: #endif
                   2841: #ifdef HAVE_addpsi3
                   2842:   if (HAVE_addpsi3)
                   2843:     add_optab->handlers[(int) PSImode].insn_code = CODE_FOR_addpsi3;
                   2844: #endif
                   2845: #ifdef HAVE_addsi3
                   2846:   if (HAVE_addsi3)
                   2847:     add_optab->handlers[(int) SImode].insn_code = CODE_FOR_addsi3;
                   2848: #endif
                   2849: #ifdef HAVE_adddi3
                   2850:   if (HAVE_adddi3)
                   2851:     add_optab->handlers[(int) DImode].insn_code = CODE_FOR_adddi3;
                   2852: #endif
                   2853: #ifdef HAVE_addti3
                   2854:   if (HAVE_addti3)
                   2855:     add_optab->handlers[(int) TImode].insn_code = CODE_FOR_addti3;
                   2856: #endif
                   2857: #ifdef HAVE_addsf3
                   2858:   if (HAVE_addsf3)
                   2859:     add_optab->handlers[(int) SFmode].insn_code = CODE_FOR_addsf3;
                   2860: #endif
                   2861: #ifdef HAVE_adddf3
                   2862:   if (HAVE_adddf3)
                   2863:     add_optab->handlers[(int) DFmode].insn_code = CODE_FOR_adddf3;
                   2864: #endif
                   2865: #ifdef HAVE_addtf3
                   2866:   if (HAVE_addtf3)
                   2867:     add_optab->handlers[(int) TFmode].insn_code = CODE_FOR_addtf3;
                   2868: #endif
                   2869:   add_optab->handlers[(int) SFmode].libfunc
                   2870:     = gen_rtx (SYMBOL_REF, Pmode, "__addsf3");
                   2871:   add_optab->handlers[(int) DFmode].libfunc
                   2872:     = gen_rtx (SYMBOL_REF, Pmode, "__adddf3");
                   2873: 
                   2874: #ifdef HAVE_subqi3
                   2875:   if (HAVE_subqi3)
                   2876:     sub_optab->handlers[(int) QImode].insn_code = CODE_FOR_subqi3;
                   2877: #endif
                   2878: #ifdef HAVE_subhi3
                   2879:   if (HAVE_subhi3)
                   2880:     sub_optab->handlers[(int) HImode].insn_code = CODE_FOR_subhi3;
                   2881: #endif
                   2882: #ifdef HAVE_subpsi3
                   2883:   if (HAVE_subpsi3)
                   2884:     sub_optab->handlers[(int) PSImode].insn_code = CODE_FOR_subpsi3;
                   2885: #endif
                   2886: #ifdef HAVE_subsi3
                   2887:   if (HAVE_subsi3)
                   2888:     sub_optab->handlers[(int) SImode].insn_code = CODE_FOR_subsi3;
                   2889: #endif
                   2890: #ifdef HAVE_subdi3
                   2891:   if (HAVE_subdi3)
                   2892:     sub_optab->handlers[(int) DImode].insn_code = CODE_FOR_subdi3;
                   2893: #endif
                   2894: #ifdef HAVE_subti3
                   2895:   if (HAVE_subti3)
                   2896:     sub_optab->handlers[(int) Imode].insn_code = CODE_FOR_subti3;
                   2897: #endif
                   2898: #ifdef HAVE_subsf3
                   2899:   if (HAVE_subsf3)
                   2900:     sub_optab->handlers[(int) SFmode].insn_code = CODE_FOR_subsf3;
                   2901: #endif
                   2902: #ifdef HAVE_subdf3
                   2903:   if (HAVE_subdf3)
                   2904:     sub_optab->handlers[(int) DFmode].insn_code = CODE_FOR_subdf3;
                   2905: #endif
                   2906: #ifdef HAVE_subtf3
                   2907:   if (HAVE_subtf3)
                   2908:     sub_optab->handlers[(int) TFmode].insn_code = CODE_FOR_subtf3;
                   2909: #endif
                   2910:   sub_optab->handlers[(int) SFmode].libfunc
                   2911:     = gen_rtx (SYMBOL_REF, Pmode, "__subsf3");
                   2912:   sub_optab->handlers[(int) DFmode].libfunc
                   2913:     = gen_rtx (SYMBOL_REF, Pmode, "__subdf3");
                   2914: 
                   2915: #ifdef HAVE_mulqi3
                   2916:   if (HAVE_mulqi3)
                   2917:     smul_optab->handlers[(int) QImode].insn_code = CODE_FOR_mulqi3;
                   2918: #endif
                   2919: #ifdef HAVE_mulhi3
                   2920:   if (HAVE_mulhi3)
                   2921:     smul_optab->handlers[(int) HImode].insn_code = CODE_FOR_mulhi3;
                   2922: #endif
                   2923: #ifdef HAVE_mulpsi3
                   2924:   if (HAVE_mulpsi3)
                   2925:     smul_optab->handlers[(int) PSImode].insn_code = CODE_FOR_mulpsi3;
                   2926: #endif
                   2927: #ifdef HAVE_mulsi3
                   2928:   if (HAVE_mulsi3)
                   2929:     smul_optab->handlers[(int) SImode].insn_code = CODE_FOR_mulsi3;
                   2930: #endif
                   2931: #ifdef HAVE_muldi3
                   2932:   if (HAVE_muldi3)
                   2933:     smul_optab->handlers[(int) DImode].insn_code = CODE_FOR_muldi3;
                   2934: #endif
                   2935: #ifdef HAVE_multi3
                   2936:   if (HAVE_multi3)
                   2937:     smul_optab->handlers[(int) TImode].insn_code = CODE_FOR_multi3;
                   2938: #endif
                   2939: #ifdef HAVE_mulsf3
                   2940:   if (HAVE_mulsf3)
                   2941:     smul_optab->handlers[(int) SFmode].insn_code = CODE_FOR_mulsf3;
                   2942: #endif
                   2943: #ifdef HAVE_muldf3
                   2944:   if (HAVE_muldf3)
                   2945:     smul_optab->handlers[(int) DFmode].insn_code = CODE_FOR_muldf3;
                   2946: #endif
                   2947: #ifdef HAVE_multf3
                   2948:   if (HAVE_multf3)
                   2949:     smul_optab->handlers[(int) TFmode].insn_code = CODE_FOR_multf3;
                   2950: #endif
                   2951: 
                   2952: #ifdef MULSI3_LIBCALL
                   2953:   smul_optab->handlers[(int) SImode].libfunc
                   2954:     = gen_rtx (SYMBOL_REF, Pmode, MULSI3_LIBCALL);
                   2955: #else
                   2956:   smul_optab->handlers[(int) SImode].libfunc
                   2957:     = gen_rtx (SYMBOL_REF, Pmode, "__mulsi3");
                   2958: #endif
                   2959: #ifdef MULDI3_LIBCALL
                   2960:   smul_optab->handlers[(int) DImode].libfunc
                   2961:     = gen_rtx (SYMBOL_REF, Pmode, MULDI3_LIBCALL);
                   2962: #else
                   2963:   smul_optab->handlers[(int) DImode].libfunc
                   2964:     = gen_rtx (SYMBOL_REF, Pmode, "__muldi3");
                   2965: #endif
                   2966:   smul_optab->handlers[(int) SFmode].libfunc
                   2967:     = gen_rtx (SYMBOL_REF, Pmode, "__mulsf3");
                   2968:   smul_optab->handlers[(int) DFmode].libfunc
                   2969:     = gen_rtx (SYMBOL_REF, Pmode, "__muldf3");
                   2970: 
                   2971: #ifdef HAVE_mulqihi3
                   2972:   if (HAVE_mulqihi3)
                   2973:     smul_widen_optab->handlers[(int) HImode].insn_code = CODE_FOR_mulqihi3;
                   2974: #endif
                   2975: #ifdef HAVE_mulhisi3
                   2976:   if (HAVE_mulhisi3)
                   2977:     smul_widen_optab->handlers[(int) SImode].insn_code = CODE_FOR_mulhisi3;
                   2978: #endif
                   2979: #ifdef HAVE_mulsidi3
                   2980:   if (HAVE_mulsidi3)
                   2981:     smul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_mulsidi3;
                   2982: #endif
                   2983: #ifdef HAVE_mulditi3
                   2984:   if (HAVE_mulditi3)
                   2985:     smul_widen_optab->handlers[(int) TImode].insn_code = CODE_FOR_mulditi3;
                   2986: #endif
                   2987: 
                   2988: #ifdef HAVE_umulqihi3
                   2989:   if (HAVE_umulqihi3)
                   2990:     umul_widen_optab->handlers[(int) HImode].insn_code = CODE_FOR_umulqihi3;
                   2991: #endif
                   2992: #ifdef HAVE_umulhisi3
                   2993:   if (HAVE_umulhisi3)
                   2994:     umul_widen_optab->handlers[(int) SImode].insn_code = CODE_FOR_umulhisi3;
                   2995: #endif
                   2996: #ifdef HAVE_umulsidi3
                   2997:   if (HAVE_umulsidi3)
                   2998:     umul_widen_optab->handlers[(int) DImode].insn_code = CODE_FOR_umulsidi3;
                   2999: #endif
                   3000: #ifdef HAVE_umulditi3
                   3001:   if (HAVE_umulditi3)
                   3002:     umul_widen_optab->handlers[(int) TImode].insn_code = CODE_FOR_umulditi3;
                   3003: #endif
                   3004: 
                   3005: #ifdef HAVE_divqi3
                   3006:   if (HAVE_divqi3)
                   3007:     sdiv_optab->handlers[(int) QImode].insn_code = CODE_FOR_divqi3;
                   3008: #endif
                   3009: #ifdef HAVE_divhi3
                   3010:   if (HAVE_divhi3)
                   3011:     sdiv_optab->handlers[(int) HImode].insn_code = CODE_FOR_divhi3;
                   3012: #endif
                   3013: #ifdef HAVE_divpsi3
                   3014:   if (HAVE_divpsi3)
                   3015:     sdiv_optab->handlers[(int) PSImode].insn_code = CODE_FOR_divpsi3;
                   3016: #endif
                   3017: #ifdef HAVE_divsi3
                   3018:   if (HAVE_divsi3)
                   3019:     sdiv_optab->handlers[(int) SImode].insn_code = CODE_FOR_divsi3;
                   3020: #endif
                   3021: #ifdef HAVE_divdi3
                   3022:   if (HAVE_divdi3)
                   3023:     sdiv_optab->handlers[(int) DImode].insn_code = CODE_FOR_divdi3;
                   3024: #endif
                   3025: #ifdef HAVE_divti3
                   3026:   if (HAVE_divti3)
                   3027:     sdiv_optab->handlers[(int) TImode].insn_code = CODE_FOR_divti3;
                   3028: #endif
                   3029: 
                   3030: #ifdef DIVSI3_LIBCALL
                   3031:   sdiv_optab->handlers[(int) SImode].libfunc
                   3032:     = gen_rtx (SYMBOL_REF, Pmode, DIVSI3_LIBCALL);
                   3033: #else
                   3034:   sdiv_optab->handlers[(int) SImode].libfunc
                   3035:     = gen_rtx (SYMBOL_REF, Pmode, "__divsi3");
                   3036: #endif
                   3037: #ifdef DIVDI3_LIBCALL
                   3038:   sdiv_optab->handlers[(int) DImode].libfunc
                   3039:     = gen_rtx (SYMBOL_REF, Pmode, DIVDI3_LIBCALL);
                   3040: #else
                   3041:   sdiv_optab->handlers[(int) DImode].libfunc
                   3042:     = gen_rtx (SYMBOL_REF, Pmode, "__divdi3");
                   3043: #endif
                   3044: 
                   3045: #ifdef HAVE_udivqi3
                   3046:   if (HAVE_udivqi3)
                   3047:     udiv_optab->handlers[(int) QImode].insn_code = CODE_FOR_udivqi3;
                   3048: #endif
                   3049: #ifdef HAVE_udivhi3
                   3050:   if (HAVE_udivhi3)
                   3051:     udiv_optab->handlers[(int) HImode].insn_code = CODE_FOR_udivhi3;
                   3052: #endif
                   3053: #ifdef HAVE_udivpsi3
                   3054:   if (HAVE_udivpsi3)
                   3055:     udiv_optab->handlers[(int) PSImode].insn_code = CODE_FOR_udivpsi3;
                   3056: #endif
                   3057: #ifdef HAVE_udivsi3
                   3058:   if (HAVE_udivsi3)
                   3059:     udiv_optab->handlers[(int) SImode].insn_code = CODE_FOR_udivsi3;
                   3060: #endif
                   3061: #ifdef HAVE_udivdi3
                   3062:   if (HAVE_udivdi3)
                   3063:     udiv_optab->handlers[(int) DImode].insn_code = CODE_FOR_udivdi3;
                   3064: #endif
                   3065: #ifdef HAVE_udivti3
                   3066:   if (HAVE_udivti3)
                   3067:     udiv_optab->handlers[(int) TImode].insn_code = CODE_FOR_udivti3;
                   3068: #endif
                   3069: 
                   3070: #ifdef UDIVSI3_LIBCALL
                   3071:   udiv_optab->handlers[(int) SImode].libfunc
                   3072:     = gen_rtx (SYMBOL_REF, Pmode, UDIVSI3_LIBCALL);
                   3073: #else
                   3074:   udiv_optab->handlers[(int) SImode].libfunc
                   3075:     = gen_rtx (SYMBOL_REF, Pmode, "__udivsi3");
                   3076: #endif
                   3077: #ifdef UDIVDI3_LIBCALL
                   3078:   udiv_optab->handlers[(int) DImode].libfunc
                   3079:     = gen_rtx (SYMBOL_REF, Pmode, UDIVDI3_LIBCALL);
                   3080: #else
                   3081:   udiv_optab->handlers[(int) DImode].libfunc
                   3082:     = gen_rtx (SYMBOL_REF, Pmode, "__udivdi3");
                   3083: #endif
                   3084: 
                   3085: #ifdef HAVE_divmodqi4
                   3086:   if (HAVE_divmodqi4)
                   3087:     sdivmod_optab->handlers[(int) QImode].insn_code = CODE_FOR_divmodqi4;
                   3088: #endif
                   3089: #ifdef HAVE_divmodhi4
                   3090:   if (HAVE_divmodhi4)
                   3091:     sdivmod_optab->handlers[(int) HImode].insn_code = CODE_FOR_divmodhi4;
                   3092: #endif
                   3093: #ifdef HAVE_divmodsi4
                   3094:   if (HAVE_divmodsi4)
                   3095:     sdivmod_optab->handlers[(int) SImode].insn_code = CODE_FOR_divmodsi4;
                   3096: #endif
                   3097: #ifdef HAVE_divmoddi4
                   3098:   if (HAVE_divmoddi4)
                   3099:     sdivmod_optab->handlers[(int) DImode].insn_code = CODE_FOR_divmoddi4;
                   3100: #endif
                   3101: #ifdef HAVE_divmodti4
                   3102:   if (HAVE_divmodti4)
                   3103:     sdivmod_optab->handlers[(int) TImode].insn_code = CODE_FOR_divmodti4;
                   3104: #endif
                   3105: 
                   3106: #ifdef HAVE_udivmodqi4
                   3107:   if (HAVE_udivmodqi4)
                   3108:     udivmod_optab->handlers[(int) QImode].insn_code = CODE_FOR_udivmodqi4;
                   3109: #endif
                   3110: #ifdef HAVE_udivmodhi4
                   3111:   if (HAVE_udivmodhi4)
                   3112:     udivmod_optab->handlers[(int) HImode].insn_code = CODE_FOR_udivmodhi4;
                   3113: #endif
                   3114: #ifdef HAVE_udivmodsi4
                   3115:   if (HAVE_udivmodsi4)
                   3116:     udivmod_optab->handlers[(int) SImode].insn_code = CODE_FOR_udivmodsi4;
                   3117: #endif
                   3118: #ifdef HAVE_udivmoddi4
                   3119:   if (HAVE_udivmoddi4)
                   3120:     udivmod_optab->handlers[(int) DImode].insn_code = CODE_FOR_udivmoddi4;
                   3121: #endif
                   3122: #ifdef HAVE_udivmodti4
                   3123:   if (HAVE_udivmodti4)
                   3124:     udivmod_optab->handlers[(int) TImode].insn_code = CODE_FOR_udivmodti4;
                   3125: #endif
                   3126: 
                   3127: #ifdef HAVE_modqi3
                   3128:   if (HAVE_modqi3)
                   3129:     smod_optab->handlers[(int) QImode].insn_code = CODE_FOR_modqi3;
                   3130: #endif
                   3131: #ifdef HAVE_modhi3
                   3132:   if (HAVE_modhi3)
                   3133:     smod_optab->handlers[(int) HImode].insn_code = CODE_FOR_modhi3;
                   3134: #endif
                   3135: #ifdef HAVE_modpsi3
                   3136:   if (HAVE_modpsi3)
                   3137:     smod_optab->handlers[(int) PSImode].insn_code = CODE_FOR_modpsi3;
                   3138: #endif
                   3139: #ifdef HAVE_modsi3
                   3140:   if (HAVE_modsi3)
                   3141:     smod_optab->handlers[(int) SImode].insn_code = CODE_FOR_modsi3;
                   3142: #endif
                   3143: #ifdef HAVE_moddi3
                   3144:   if (HAVE_moddi3)
                   3145:     smod_optab->handlers[(int) DImode].insn_code = CODE_FOR_moddi3;
                   3146: #endif
                   3147: #ifdef HAVE_modti3
                   3148:   if (HAVE_modti3)
                   3149:     smod_optab->handlers[(int) TImode].insn_code = CODE_FOR_modti3;
                   3150: #endif
                   3151: 
                   3152: #ifdef MODSI3_LIBCALL
                   3153:   smod_optab->handlers[(int) SImode].libfunc
                   3154:     = gen_rtx (SYMBOL_REF, Pmode, MODSI3_LIBCALL);
                   3155: #else
                   3156:   smod_optab->handlers[(int) SImode].libfunc
                   3157:     = gen_rtx (SYMBOL_REF, Pmode, "__modsi3");
                   3158: #endif
                   3159: #ifdef MODDI3_LIBCALL
                   3160:   smod_optab->handlers[(int) DImode].libfunc
                   3161:     = gen_rtx (SYMBOL_REF, Pmode, MODDI3_LIBCALL);
                   3162: #else
                   3163:   smod_optab->handlers[(int) DImode].libfunc
                   3164:     = gen_rtx (SYMBOL_REF, Pmode, "__moddi3");
                   3165: #endif
                   3166: 
                   3167: #ifdef HAVE_umodqi3
                   3168:   if (HAVE_umodqi3)
                   3169:     umod_optab->handlers[(int) QImode].insn_code = CODE_FOR_umodqi3;
                   3170: #endif
                   3171: #ifdef HAVE_umodhi3
                   3172:   if (HAVE_umodhi3)
                   3173:     umod_optab->handlers[(int) HImode].insn_code = CODE_FOR_umodhi3;
                   3174: #endif
                   3175: #ifdef HAVE_umodpsi3
                   3176:   if (HAVE_umodpsi3)
                   3177:     umod_optab->handlers[(int) PSImode].insn_code = CODE_FOR_umodpsi3;
                   3178: #endif
                   3179: #ifdef HAVE_umodsi3
                   3180:   if (HAVE_umodsi3)
                   3181:     umod_optab->handlers[(int) SImode].insn_code = CODE_FOR_umodsi3;
                   3182: #endif
                   3183: #ifdef HAVE_umoddi3
                   3184:   if (HAVE_umoddi3)
                   3185:     umod_optab->handlers[(int) DImode].insn_code = CODE_FOR_umoddi3;
                   3186: #endif
                   3187: #ifdef HAVE_umodti3
                   3188:   if (HAVE_umodti3)
                   3189:     umod_optab->handlers[(int) TImode].insn_code = CODE_FOR_umodti3;
                   3190: #endif
                   3191: 
                   3192: #ifdef UMODSI3_LIBCALL
                   3193:   umod_optab->handlers[(int) SImode].libfunc
                   3194:     = gen_rtx (SYMBOL_REF, Pmode, UMODSI3_LIBCALL);
                   3195: #else
                   3196:   umod_optab->handlers[(int) SImode].libfunc
                   3197:     = gen_rtx (SYMBOL_REF, Pmode, "__umodsi3");
                   3198: #endif
                   3199: #ifdef UMODDI3_LIBCALL
                   3200:   umod_optab->handlers[(int) DImode].libfunc
                   3201:     = gen_rtx (SYMBOL_REF, Pmode, UMODDI3_LIBCALL);
                   3202: #else
                   3203:   umod_optab->handlers[(int) DImode].libfunc
                   3204:     = gen_rtx (SYMBOL_REF, Pmode, "__umoddi3");
                   3205: #endif
                   3206: 
                   3207: #ifdef HAVE_divsf3
                   3208:   if (HAVE_divsf3)
                   3209:     flodiv_optab->handlers[(int) SFmode].insn_code = CODE_FOR_divsf3;
                   3210: #endif
                   3211: #ifdef HAVE_divdf3
                   3212:   if (HAVE_divdf3)
                   3213:     flodiv_optab->handlers[(int) DFmode].insn_code = CODE_FOR_divdf3;
                   3214: #endif
                   3215: #ifdef HAVE_divtf3
                   3216:   if (HAVE_divtf3)
                   3217:     flodiv_optab->handlers[(int) TFmode].insn_code = CODE_FOR_divtf3;
                   3218: #endif
                   3219:   flodiv_optab->handlers[(int) SFmode].libfunc
                   3220:     = gen_rtx (SYMBOL_REF, Pmode, "__divsf3");
                   3221:   flodiv_optab->handlers[(int) DFmode].libfunc
                   3222:     = gen_rtx (SYMBOL_REF, Pmode, "__divdf3");
                   3223: 
                   3224: #ifdef HAVE_ftruncsf2
                   3225:   if (HAVE_ftruncsf2)
                   3226:     ftrunc_optab->handlers[(int) SFmode].insn_code = CODE_FOR_ftruncsf2;
                   3227: #endif
                   3228: #ifdef HAVE_ftruncdf2
                   3229:   if (HAVE_ftruncdf2)
                   3230:     ftrunc_optab->handlers[(int) DFmode].insn_code = CODE_FOR_ftruncdf2;
                   3231: #endif
                   3232: #ifdef HAVE_ftrunctf2
                   3233:   if (HAVE_ftrunctf2)
                   3234:     ftrunc_optab->handlers[(int) TFmode].insn_code = CODE_FOR_ftrunctf2;
                   3235: #endif
                   3236: 
                   3237: #ifdef HAVE_andqi3
                   3238:   if (HAVE_andqi3)
                   3239:     and_optab->handlers[(int) QImode].insn_code = CODE_FOR_andqi3;
                   3240: #endif
                   3241: #ifdef HAVE_andhi3
                   3242:   if (HAVE_andhi3)
                   3243:     and_optab->handlers[(int) HImode].insn_code = CODE_FOR_andhi3;
                   3244: #endif
                   3245: #ifdef HAVE_andpsi3
                   3246:   if (HAVE_andpsi3)
                   3247:     and_optab->handlers[(int) PSImode].insn_code = CODE_FOR_andpsi3;
                   3248: #endif
                   3249: #ifdef HAVE_andsi3
                   3250:   if (HAVE_andsi3)
                   3251:     and_optab->handlers[(int) SImode].insn_code = CODE_FOR_andsi3;
                   3252: #endif
                   3253: #ifdef HAVE_anddi3
                   3254:   if (HAVE_anddi3)
                   3255:     and_optab->handlers[(int) DImode].insn_code = CODE_FOR_anddi3;
                   3256: #endif
                   3257: #ifdef HAVE_andti3
                   3258:   if (HAVE_andti3)
                   3259:     and_optab->handlers[(int) TImode].insn_code = CODE_FOR_andti3;
                   3260: #endif
                   3261: 
                   3262: #ifdef HAVE_iorqi3
                   3263:   if (HAVE_iorqi3)
                   3264:     ior_optab->handlers[(int) QImode].insn_code = CODE_FOR_iorqi3;
                   3265: #endif
                   3266: #ifdef HAVE_iorhi3
                   3267:   if (HAVE_iorhi3)
                   3268:     ior_optab->handlers[(int) HImode].insn_code = CODE_FOR_iorhi3;
                   3269: #endif
                   3270: #ifdef HAVE_iorpsi3
                   3271:   if (HAVE_iorpsi3)
                   3272:     ior_optab->handlers[(int) PSImode].insn_code = CODE_FOR_iorpsi3;
                   3273: #endif
                   3274: #ifdef HAVE_iorsi3
                   3275:   if (HAVE_iorsi3)
                   3276:     ior_optab->handlers[(int) SImode].insn_code = CODE_FOR_iorsi3;
                   3277: #endif
                   3278: #ifdef HAVE_iordi3
                   3279:   if (HAVE_iordi3)
                   3280:     ior_optab->handlers[(int) DImode].insn_code = CODE_FOR_iordi3;
                   3281: #endif
                   3282: #ifdef HAVE_iorti3
                   3283:   if (HAVE_iorti3)
                   3284:     ior_optab->handlers[(int) TImode].insn_code = CODE_FOR_iorti3;
                   3285: #endif
                   3286: 
                   3287: #ifdef HAVE_xorqi3
                   3288:   if (HAVE_xorqi3)
                   3289:     xor_optab->handlers[(int) QImode].insn_code = CODE_FOR_xorqi3;
                   3290: #endif
                   3291: #ifdef HAVE_xorhi3
                   3292:   if (HAVE_xorhi3)
                   3293:     xor_optab->handlers[(int) HImode].insn_code = CODE_FOR_xorhi3;
                   3294: #endif
                   3295: #ifdef HAVE_xorpsi3
                   3296:   if (HAVE_xorpsi3)
                   3297:     xor_optab->handlers[(int) PSImode].insn_code = CODE_FOR_xorpsi3;
                   3298: #endif
                   3299: #ifdef HAVE_xorsi3
                   3300:   if (HAVE_xorsi3)
                   3301:     xor_optab->handlers[(int) SImode].insn_code = CODE_FOR_xorsi3;
                   3302: #endif
                   3303: #ifdef HAVE_xordi3
                   3304:   if (HAVE_xordi3)
                   3305:     xor_optab->handlers[(int) DImode].insn_code = CODE_FOR_xordi3;
                   3306: #endif
                   3307: #ifdef HAVE_xorti3
                   3308:   if (HAVE_xorti3)
                   3309:     xor_optab->handlers[(int) TImode].insn_code = CODE_FOR_xorti3;
                   3310: #endif
                   3311: 
                   3312: #ifdef HAVE_ashlqi3
                   3313:   if (HAVE_ashlqi3)
                   3314:     ashl_optab->handlers[(int) QImode].insn_code = CODE_FOR_ashlqi3;
                   3315: #endif
                   3316: #ifdef HAVE_ashlhi3
                   3317:   if (HAVE_ashlhi3)
                   3318:     ashl_optab->handlers[(int) HImode].insn_code = CODE_FOR_ashlhi3;
                   3319: #endif
                   3320: #ifdef HAVE_ashlpsi3
                   3321:   if (HAVE_ashlpsi3)
                   3322:     ashl_optab->handlers[(int) PSImode].insn_code = CODE_FOR_ashlpsi3;
                   3323: #endif
                   3324: #ifdef HAVE_ashlsi3
                   3325:   if (HAVE_ashlsi3)
                   3326:     ashl_optab->handlers[(int) SImode].insn_code = CODE_FOR_ashlsi3;
                   3327: #endif
                   3328: #ifdef HAVE_ashldi3
                   3329:   if (HAVE_ashldi3)
                   3330:     ashl_optab->handlers[(int) DImode].insn_code = CODE_FOR_ashldi3;
                   3331: #endif
                   3332: #ifdef HAVE_ashlti3
                   3333:   if (HAVE_ashlti3)
                   3334:     ashl_optab->handlers[(int) TImode].insn_code = CODE_FOR_ashlti3;
                   3335: #endif
                   3336:   ashl_optab->handlers[(int) SImode].libfunc
                   3337:     = gen_rtx (SYMBOL_REF, Pmode, "__ashlsi3");
                   3338:   ashl_optab->handlers[(int) DImode].libfunc
                   3339:     = gen_rtx (SYMBOL_REF, Pmode, "__ashldi3");
                   3340: 
                   3341: #ifdef HAVE_ashrqi3
                   3342:   if (HAVE_ashrqi3)
                   3343:     ashr_optab->handlers[(int) QImode].insn_code = CODE_FOR_ashrqi3;
                   3344: #endif
                   3345: #ifdef HAVE_ashrhi3
                   3346:   if (HAVE_ashrhi3)
                   3347:     ashr_optab->handlers[(int) HImode].insn_code = CODE_FOR_ashrhi3;
                   3348: #endif
                   3349: #ifdef HAVE_ashrpsi3
                   3350:   if (HAVE_ashrpsi3)
                   3351:     ashr_optab->handlers[(int) PSImode].insn_code = CODE_FOR_ashrpsi3;
                   3352: #endif
                   3353: #ifdef HAVE_ashrsi3
                   3354:   if (HAVE_ashrsi3)
                   3355:     ashr_optab->handlers[(int) SImode].insn_code = CODE_FOR_ashrsi3;
                   3356: #endif
                   3357: #ifdef HAVE_ashrdi3
                   3358:   if (HAVE_ashrdi3)
                   3359:     ashr_optab->handlers[(int) DImode].insn_code = CODE_FOR_ashrdi3;
                   3360: #endif
                   3361: #ifdef HAVE_ashrti3
                   3362:   if (HAVE_ashrti3)
                   3363:     ashr_optab->handlers[(int) TImode].insn_code = CODE_FOR_ashrti3;
                   3364: #endif
                   3365:   ashr_optab->handlers[(int) SImode].libfunc
                   3366:     = gen_rtx (SYMBOL_REF, Pmode, "__ashrsi3");
                   3367:   ashr_optab->handlers[(int) DImode].libfunc
                   3368:     = gen_rtx (SYMBOL_REF, Pmode, "__ashrdi3");
                   3369: 
                   3370: #ifdef HAVE_lshlqi3
                   3371:   if (HAVE_lshlqi3)
                   3372:     lshl_optab->handlers[(int) QImode].insn_code = CODE_FOR_lshlqi3;
                   3373: #endif
                   3374: #ifdef HAVE_lshlhi3
                   3375:   if (HAVE_lshlhi3)
                   3376:     lshl_optab->handlers[(int) HImode].insn_code = CODE_FOR_lshlhi3;
                   3377: #endif
                   3378: #ifdef HAVE_lshlpsi3
                   3379:   if (HAVE_lshlpsi3)
                   3380:     lshl_optab->handlers[(int) PSImode].insn_code = CODE_FOR_lshlpsi3;
                   3381: #endif
                   3382: #ifdef HAVE_lshlsi3
                   3383:   if (HAVE_lshlsi3)
                   3384:     lshl_optab->handlers[(int) SImode].insn_code = CODE_FOR_lshlsi3;
                   3385: #endif
                   3386: #ifdef HAVE_lshldi3
                   3387:   if (HAVE_lshldi3)
                   3388:     lshl_optab->handlers[(int) DImode].insn_code = CODE_FOR_lshldi3;
                   3389: #endif
                   3390: #ifdef HAVE_lshlti3
                   3391:   if (HAVE_lshlti3)
                   3392:     lshl_optab->handlers[(int) TImode].insn_code = CODE_FOR_lshlti3;
                   3393: #endif
                   3394:   lshl_optab->handlers[(int) SImode].libfunc
                   3395:     = gen_rtx (SYMBOL_REF, Pmode, "__lshlsi3");
                   3396:   lshl_optab->handlers[(int) DImode].libfunc
                   3397:     = gen_rtx (SYMBOL_REF, Pmode, "__lshldi3");
                   3398: 
                   3399: #ifdef HAVE_lshrqi3
                   3400:   if (HAVE_lshrqi3)
                   3401:     lshr_optab->handlers[(int) QImode].insn_code = CODE_FOR_lshrqi3;
                   3402: #endif
                   3403: #ifdef HAVE_lshrhi3
                   3404:   if (HAVE_lshrhi3)
                   3405:     lshr_optab->handlers[(int) HImode].insn_code = CODE_FOR_lshrhi3;
                   3406: #endif
                   3407: #ifdef HAVE_lshrpsi3
                   3408:   if (HAVE_lshrpsi3)
                   3409:     lshr_optab->handlers[(int) PSImode].insn_code = CODE_FOR_lshrpsi3;
                   3410: #endif
                   3411: #ifdef HAVE_lshrsi3
                   3412:   if (HAVE_lshrsi3)
                   3413:     lshr_optab->handlers[(int) SImode].insn_code = CODE_FOR_lshrsi3;
                   3414: #endif
                   3415: #ifdef HAVE_lshrdi3
                   3416:   if (HAVE_lshrdi3)
                   3417:     lshr_optab->handlers[(int) DImode].insn_code = CODE_FOR_lshrdi3;
                   3418: #endif
                   3419: #ifdef HAVE_lshrti3
                   3420:   if (HAVE_lshrti3)
                   3421:     lshr_optab->handlers[(int) TImode].insn_code = CODE_FOR_lshrti3;
                   3422: #endif
                   3423:   lshr_optab->handlers[(int) SImode].libfunc
                   3424:     = gen_rtx (SYMBOL_REF, Pmode, "__lshrsi3");
                   3425:   lshr_optab->handlers[(int) DImode].libfunc
                   3426:     = gen_rtx (SYMBOL_REF, Pmode, "__lshrdi3");
                   3427: 
                   3428: #ifdef HAVE_rotlqi3
                   3429:   if (HAVE_rotlqi3)
                   3430:     rotl_optab->handlers[(int) QImode].insn_code = CODE_FOR_rotlqi3;
                   3431: #endif
                   3432: #ifdef HAVE_rotlhi3
                   3433:   if (HAVE_rotlhi3)
                   3434:     rotl_optab->handlers[(int) HImode].insn_code = CODE_FOR_rotlhi3;
                   3435: #endif
                   3436: #ifdef HAVE_rotlpsi3
                   3437:   if (HAVE_rotlpsi3)
                   3438:     rotl_optab->handlers[(int) PSImode].insn_code = CODE_FOR_rotlpsi3;
                   3439: #endif
                   3440: #ifdef HAVE_rotlsi3
                   3441:   if (HAVE_rotlsi3)
                   3442:     rotl_optab->handlers[(int) SImode].insn_code = CODE_FOR_rotlsi3;
                   3443: #endif
                   3444: #ifdef HAVE_rotldi3
                   3445:   if (HAVE_rotldi3)
                   3446:     rotl_optab->handlers[(int) DImode].insn_code = CODE_FOR_rotldi3;
                   3447: #endif
                   3448: #ifdef HAVE_rotlti3
                   3449:   if (HAVE_rotlti3)
                   3450:     rotl_optab->handlers[(int) TImode].insn_code = CODE_FOR_rotlti3;
                   3451: #endif
                   3452:   rotl_optab->handlers[(int) SImode].libfunc
                   3453:     = gen_rtx (SYMBOL_REF, Pmode, "__rotlsi3");
                   3454:   rotl_optab->handlers[(int) DImode].libfunc
                   3455:     = gen_rtx (SYMBOL_REF, Pmode, "__rotldi3");
                   3456: 
                   3457: #ifdef HAVE_rotrqi3
                   3458:   if (HAVE_rotrqi3)
                   3459:     rotr_optab->handlers[(int) QImode].insn_code = CODE_FOR_rotrqi3;
                   3460: #endif
                   3461: #ifdef HAVE_rotrhi3
                   3462:   if (HAVE_rotrhi3)
                   3463:     rotr_optab->handlers[(int) HImode].insn_code = CODE_FOR_rotrhi3;
                   3464: #endif
                   3465: #ifdef HAVE_rotrpsi3
                   3466:   if (HAVE_rotrpsi3)
                   3467:     rotr_optab->handlers[(int) PSImode].insn_code = CODE_FOR_rotrpsi3;
                   3468: #endif
                   3469: #ifdef HAVE_rotrsi3
                   3470:   if (HAVE_rotrsi3)
                   3471:     rotr_optab->handlers[(int) SImode].insn_code = CODE_FOR_rotrsi3;
                   3472: #endif
                   3473: #ifdef HAVE_rotrdi3
                   3474:   if (HAVE_rotrdi3)
                   3475:     rotr_optab->handlers[(int) DImode].insn_code = CODE_FOR_rotrdi3;
                   3476: #endif
                   3477: #ifdef HAVE_rotrti3
                   3478:   if (HAVE_rotrti3)
                   3479:     rotr_optab->handlers[(int) TImode].insn_code = CODE_FOR_rotrti3;
                   3480: #endif
                   3481:   rotr_optab->handlers[(int) SImode].libfunc
                   3482:     = gen_rtx (SYMBOL_REF, Pmode, "__rotrsi3");
                   3483:   rotr_optab->handlers[(int) DImode].libfunc
                   3484:     = gen_rtx (SYMBOL_REF, Pmode, "__rotrdi3");
                   3485: 
                   3486: #ifdef HAVE_sminqi3
                   3487:   if (HAVE_sminqi3)
                   3488:     smin_optab->handlers[(int) QImode].insn_code = CODE_FOR_sminqi3;
                   3489: #endif
                   3490: #ifdef HAVE_sminhi3
                   3491:   if (HAVE_sminhi3)
                   3492:     smin_optab->handlers[(int) HImode].insn_code = CODE_FOR_sminhi3;
                   3493: #endif
                   3494: #ifdef HAVE_sminsi3
                   3495:   if (HAVE_sminsi3)
                   3496:     smin_optab->handlers[(int) SImode].insn_code = CODE_FOR_sminsi3;
                   3497: #endif
                   3498: #ifdef HAVE_smindi3
                   3499:   if (HAVE_smindi3)
                   3500:     smin_optab->handlers[(int) DImode].insn_code = CODE_FOR_smindi3;
                   3501: #endif
                   3502: #ifdef HAVE_sminti3
                   3503:   if (HAVE_sminti3)
                   3504:     smin_optab->handlers[(int) TImode].insn_code = CODE_FOR_sminti3;
                   3505: #endif
                   3506: #ifdef HAVE_sminsf3
                   3507:   if (HAVE_sminsf3)
                   3508:     smin_optab->handlers[(int) SFmode].insn_code = CODE_FOR_sminsf3;
                   3509: #endif
                   3510: #ifdef HAVE_smindf3
                   3511:   if (HAVE_smindf3)
                   3512:     smin_optab->handlers[(int) DFmode].insn_code = CODE_FOR_smindf3;
                   3513: #endif
                   3514: #ifdef HAVE_smintf3
                   3515:   if (HAVE_smintf3)
                   3516:     smin_optab->handlers[(int) TFmode].insn_code = CODE_FOR_smintf3;
                   3517: #endif
                   3518: 
                   3519: #ifdef HAVE_smaxqi3
                   3520:   if (HAVE_smaxqi3)
                   3521:     smax_optab->handlers[(int) QImode].insn_code = CODE_FOR_smaxqi3;
                   3522: #endif
                   3523: #ifdef HAVE_smaxhi3
                   3524:   if (HAVE_smaxhi3)
                   3525:     smax_optab->handlers[(int) HImode].insn_code = CODE_FOR_smaxhi3;
                   3526: #endif
                   3527: #ifdef HAVE_smaxsi3
                   3528:   if (HAVE_smaxsi3)
                   3529:     smax_optab->handlers[(int) SImode].insn_code = CODE_FOR_smaxsi3;
                   3530: #endif
                   3531: #ifdef HAVE_smaxdi3
                   3532:   if (HAVE_smaxdi3)
                   3533:     smax_optab->handlers[(int) DImode].insn_code = CODE_FOR_smaxdi3;
                   3534: #endif
                   3535: #ifdef HAVE_smaxti3
                   3536:   if (HAVE_smaxti3)
                   3537:     smax_optab->handlers[(int) TImode].insn_code = CODE_FOR_smaxti3;
                   3538: #endif
                   3539: #ifdef HAVE_smaxsf3
                   3540:   if (HAVE_smaxsf3)
                   3541:     smax_optab->handlers[(int) SFmode].insn_code = CODE_FOR_smaxsf3;
                   3542: #endif
                   3543: #ifdef HAVE_smaxdf3
                   3544:   if (HAVE_smaxdf3)
                   3545:     smax_optab->handlers[(int) DFmode].insn_code = CODE_FOR_smaxdf3;
                   3546: #endif
                   3547: #ifdef HAVE_smaxtf3
                   3548:   if (HAVE_smaxtf3)
                   3549:     smax_optab->handlers[(int) TFmode].insn_code = CODE_FOR_smaxtf3;
                   3550: #endif
                   3551: 
                   3552: #ifdef HAVE_uminqi3
                   3553:   if (HAVE_uminqi3)
                   3554:     umin_optab->handlers[(int) QImode].insn_code = CODE_FOR_uminqi3;
                   3555: #endif
                   3556: #ifdef HAVE_uminhi3
                   3557:   if (HAVE_uminhi3)
                   3558:     umin_optab->handlers[(int) HImode].insn_code = CODE_FOR_uminhi3;
                   3559: #endif
                   3560: #ifdef HAVE_uminsi3
                   3561:   if (HAVE_uminsi3)
                   3562:     umin_optab->handlers[(int) SImode].insn_code = CODE_FOR_uminsi3;
                   3563: #endif
                   3564: #ifdef HAVE_umindi3
                   3565:   if (HAVE_umindi3)
                   3566:     umin_optab->handlers[(int) DImode].insn_code = CODE_FOR_umindi3;
                   3567: #endif
                   3568: #ifdef HAVE_uminti3
                   3569:   if (HAVE_uminti3)
                   3570:     umin_optab->handlers[(int) TImode].insn_code = CODE_FOR_uminti3;
                   3571: #endif
                   3572: 
                   3573: #ifdef HAVE_umaxqi3
                   3574:   if (HAVE_umaxqi3)
                   3575:     umax_optab->handlers[(int) QImode].insn_code = CODE_FOR_umaxqi3;
                   3576: #endif
                   3577: #ifdef HAVE_umaxhi3
                   3578:   if (HAVE_umaxhi3)
                   3579:     umax_optab->handlers[(int) HImode].insn_code = CODE_FOR_umaxhi3;
                   3580: #endif
                   3581: #ifdef HAVE_umaxsi3
                   3582:   if (HAVE_umaxsi3)
                   3583:     umax_optab->handlers[(int) SImode].insn_code = CODE_FOR_umaxsi3;
                   3584: #endif
                   3585: #ifdef HAVE_umaxdi3
                   3586:   if (HAVE_umaxdi3)
                   3587:     umax_optab->handlers[(int) DImode].insn_code = CODE_FOR_umaxdi3;
                   3588: #endif
                   3589: #ifdef HAVE_umaxti3
                   3590:   if (HAVE_umaxti3)
                   3591:     umax_optab->handlers[(int) TImode].insn_code = CODE_FOR_umaxti3;
                   3592: #endif
                   3593: 
                   3594: #ifdef HAVE_negqi2
                   3595:   if (HAVE_negqi2)
                   3596:     neg_optab->handlers[(int) QImode].insn_code = CODE_FOR_negqi2;
                   3597: #endif
                   3598: #ifdef HAVE_neghi2
                   3599:   if (HAVE_neghi2)
                   3600:     neg_optab->handlers[(int) HImode].insn_code = CODE_FOR_neghi2;
                   3601: #endif
                   3602: #ifdef HAVE_negpsi2
                   3603:   if (HAVE_negpsi2)
                   3604:     neg_optab->handlers[(int) PSImode].insn_code = CODE_FOR_negpsi2;
                   3605: #endif
                   3606: #ifdef HAVE_negsi2
                   3607:   if (HAVE_negsi2)
                   3608:     neg_optab->handlers[(int) SImode].insn_code = CODE_FOR_negsi2;
                   3609: #endif
                   3610: #ifdef HAVE_negdi2
                   3611:   if (HAVE_negdi2)
                   3612:     neg_optab->handlers[(int) DImode].insn_code = CODE_FOR_negdi2;
                   3613: #endif
                   3614: #ifdef HAVE_negti2
                   3615:   if (HAVE_negti2)
                   3616:     neg_optab->handlers[(int) TImode].insn_code = CODE_FOR_negti2;
                   3617: #endif
                   3618: #ifdef HAVE_negsf2
                   3619:   if (HAVE_negsf2)
                   3620:     neg_optab->handlers[(int) SFmode].insn_code = CODE_FOR_negsf2;
                   3621: #endif
                   3622: #ifdef HAVE_negdf2
                   3623:   if (HAVE_negdf2)
                   3624:     neg_optab->handlers[(int) DFmode].insn_code = CODE_FOR_negdf2;
                   3625: #endif
                   3626: #ifdef HAVE_negtf2
                   3627:   if (HAVE_negtf2)
                   3628:     neg_optab->handlers[(int) TFmode].insn_code = CODE_FOR_negtf2;
                   3629: #endif
                   3630:   neg_optab->handlers[(int) SImode].libfunc
                   3631:     = gen_rtx (SYMBOL_REF, Pmode, "__negsi2"); 
                   3632:   neg_optab->handlers[(int) DImode].libfunc
                   3633:     = gen_rtx (SYMBOL_REF, Pmode, "__negdi2");
                   3634:   neg_optab->handlers[(int) SFmode].libfunc
                   3635:     = gen_rtx (SYMBOL_REF, Pmode, "__negsf2");
                   3636:   neg_optab->handlers[(int) DFmode].libfunc
                   3637:     = gen_rtx (SYMBOL_REF, Pmode, "__negdf2");
                   3638: 
                   3639: #ifdef HAVE_absqi2
                   3640:   if (HAVE_absqi2)
                   3641:     abs_optab->handlers[(int) QImode].insn_code = CODE_FOR_absqi2;
                   3642: #endif
                   3643: #ifdef HAVE_abshi2
                   3644:   if (HAVE_abshi2)
                   3645:     abs_optab->handlers[(int) HImode].insn_code = CODE_FOR_abshi2;
                   3646: #endif
                   3647: #ifdef HAVE_abspsi2
                   3648:   if (HAVE_abspsi2)
                   3649:     abs_optab->handlers[(int) PSImode].insn_code = CODE_FOR_abspsi2;
                   3650: #endif
                   3651: #ifdef HAVE_abssi2
                   3652:   if (HAVE_abssi2)
                   3653:     abs_optab->handlers[(int) SImode].insn_code = CODE_FOR_abssi2;
                   3654: #endif
                   3655: #ifdef HAVE_absdi2
                   3656:   if (HAVE_absdi2)
                   3657:     abs_optab->handlers[(int) DImode].insn_code = CODE_FOR_absdi2;
                   3658: #endif
                   3659: #ifdef HAVE_absti2
                   3660:   if (HAVE_absti2)
                   3661:     abs_optab->handlers[(int) TImode].insn_code = CODE_FOR_absti2;
                   3662: #endif
                   3663: #ifdef HAVE_abssf2
                   3664:   if (HAVE_abssf2)
                   3665:     abs_optab->handlers[(int) SFmode].insn_code = CODE_FOR_abssf2;
                   3666: #endif
                   3667: #ifdef HAVE_absdf2
                   3668:   if (HAVE_absdf2)
                   3669:     abs_optab->handlers[(int) DFmode].insn_code = CODE_FOR_absdf2;
                   3670: #endif
                   3671: #ifdef HAVE_abstf2
                   3672:   if (HAVE_abstf2)
                   3673:     abs_optab->handlers[(int) TFmode].insn_code = CODE_FOR_abstf2;
                   3674: #endif
                   3675:   /* No library calls here!  If there is no abs instruction,
                   3676:      expand_expr will generate a conditional negation.  */
                   3677: 
                   3678: #ifdef HAVE_one_cmplqi2
                   3679:   if (HAVE_one_cmplqi2)
                   3680:     one_cmpl_optab->handlers[(int) QImode].insn_code = CODE_FOR_one_cmplqi2;
                   3681: #endif
                   3682: #ifdef HAVE_one_cmplhi2
                   3683:   if (HAVE_one_cmplhi2)
                   3684:     one_cmpl_optab->handlers[(int) HImode].insn_code = CODE_FOR_one_cmplhi2;
                   3685: #endif
                   3686: #ifdef HAVE_one_cmplpsi2
                   3687:   if (HAVE_one_cmplpsi2)
                   3688:     one_cmpl_optab->handlers[(int) PSImode].insn_code = CODE_FOR_one_cmplpsi2;
                   3689: #endif
                   3690: #ifdef HAVE_one_cmplsi2
                   3691:   if (HAVE_one_cmplsi2)
                   3692:     one_cmpl_optab->handlers[(int) SImode].insn_code = CODE_FOR_one_cmplsi2;
                   3693: #endif
                   3694: #ifdef HAVE_one_cmpldi2
                   3695:   if (HAVE_one_cmpldi2)
                   3696:     one_cmpl_optab->handlers[(int) DImode].insn_code = CODE_FOR_one_cmpldi2;
                   3697: #endif
                   3698: #ifdef HAVE_one_cmplti2
                   3699:   if (HAVE_one_cmplti2)
                   3700:     one_cmpl_optab->handlers[(int) TImode].insn_code = CODE_FOR_one_cmplti2;
                   3701: #endif
                   3702:   one_cmpl_optab->handlers[(int) SImode].libfunc
                   3703:     = gen_rtx (SYMBOL_REF, Pmode, "__one_cmplsi2"); 
                   3704: 
                   3705: #ifdef HAVE_ffsqi2
                   3706:   if (HAVE_ffsqi2)
                   3707:     ffs_optab->handlers[(int) QImode].insn_code = CODE_FOR_ffsqi2;
                   3708: #endif
                   3709: #ifdef HAVE_ffshi2
                   3710:   if (HAVE_ffshi2)
                   3711:     ffs_optab->handlers[(int) HImode].insn_code = CODE_FOR_ffshi2;
                   3712: #endif
                   3713: #ifdef HAVE_ffspsi2
                   3714:   if (HAVE_ffspsi2)
                   3715:     ffs_optab->handlers[(int) PSImode].insn_code = CODE_FOR_ffspsi2;
                   3716: #endif
                   3717: #ifdef HAVE_ffssi2
                   3718:   if (HAVE_ffssi2)
                   3719:     ffs_optab->handlers[(int) SImode].insn_code = CODE_FOR_ffssi2;
                   3720: #endif
                   3721: #ifdef HAVE_ffsdi2
                   3722:   if (HAVE_ffsdi2)
                   3723:     ffs_optab->handlers[(int) DImode].insn_code = CODE_FOR_ffsdi2;
                   3724: #endif
                   3725: #ifdef HAVE_ffsti2
                   3726:   if (HAVE_ffsti2)
                   3727:     ffs_optab->handlers[(int) TImode].insn_code = CODE_FOR_ffsti2;
                   3728: #endif
                   3729:   ffs_optab->handlers[(int) SImode].libfunc
                   3730:     = gen_rtx (SYMBOL_REF, Pmode, "ffs"); 
                   3731: 
                   3732: #ifdef HAVE_movqi
                   3733:   if (HAVE_movqi)
                   3734:     mov_optab->handlers[(int) QImode].insn_code = CODE_FOR_movqi;
                   3735: #endif
                   3736: #ifdef HAVE_movhi
                   3737:   if (HAVE_movhi)
                   3738:     mov_optab->handlers[(int) HImode].insn_code = CODE_FOR_movhi;
                   3739: #endif
                   3740: #ifdef HAVE_movpsi
                   3741:   if (HAVE_movpsi)
                   3742:     mov_optab->handlers[(int) PSImode].insn_code = CODE_FOR_movpsi;
                   3743: #endif
                   3744: #ifdef HAVE_movsi
                   3745:   if (HAVE_movsi)
                   3746:     mov_optab->handlers[(int) SImode].insn_code = CODE_FOR_movsi;
                   3747: #endif
                   3748: #ifdef HAVE_movdi
                   3749:   if (HAVE_movdi)
                   3750:     mov_optab->handlers[(int) DImode].insn_code = CODE_FOR_movdi;
                   3751: #endif
                   3752: #ifdef HAVE_movti
                   3753:   if (HAVE_movti)
                   3754:     mov_optab->handlers[(int) TImode].insn_code = CODE_FOR_movti;
                   3755: #endif
                   3756: #ifdef HAVE_movsf
                   3757:   if (HAVE_movsf)
                   3758:     mov_optab->handlers[(int) SFmode].insn_code = CODE_FOR_movsf;
                   3759: #endif
                   3760: #ifdef HAVE_movdf
                   3761:   if (HAVE_movdf)
                   3762:     mov_optab->handlers[(int) DFmode].insn_code = CODE_FOR_movdf;
                   3763: #endif
                   3764: #ifdef HAVE_movtf
                   3765:   if (HAVE_movtf)
                   3766:     mov_optab->handlers[(int) TFmode].insn_code = CODE_FOR_movtf;
                   3767: #endif
                   3768: #ifdef HAVE_movcc
                   3769:   if (HAVE_movcc)
                   3770:     mov_optab->handlers[(int) CCmode].insn_code = CODE_FOR_movcc;
                   3771: #endif
                   3772: 
                   3773: #ifdef EXTRA_CC_MODES
                   3774:   init_mov_optab ();
                   3775: #endif
                   3776: 
                   3777: #ifdef HAVE_movstrictqi
                   3778:   if (HAVE_movstrictqi)
                   3779:     movstrict_optab->handlers[(int) QImode].insn_code = CODE_FOR_movstrictqi;
                   3780: #endif
                   3781: #ifdef HAVE_movstricthi
                   3782:   if (HAVE_movstricthi)
                   3783:     movstrict_optab->handlers[(int) HImode].insn_code = CODE_FOR_movstricthi;
                   3784: #endif
                   3785: #ifdef HAVE_movstrictpsi
                   3786:   if (HAVE_movstrictpsi)
                   3787:     movstrict_optab->handlers[(int) PSImode].insn_code = CODE_FOR_movstrictpsi;
                   3788: #endif
                   3789: #ifdef HAVE_movstrictsi
                   3790:   if (HAVE_movstrictsi)
                   3791:     movstrict_optab->handlers[(int) SImode].insn_code = CODE_FOR_movstrictsi;
                   3792: #endif
                   3793: #ifdef HAVE_movstrictdi
                   3794:   if (HAVE_movstrictdi)
                   3795:     movstrict_optab->handlers[(int) DImode].insn_code = CODE_FOR_movstrictdi;
                   3796: #endif
                   3797: #ifdef HAVE_movstrictti
                   3798:   if (HAVE_movstrictti)
                   3799:     movstrict_optab->handlers[(int) TImode].insn_code = CODE_FOR_movstrictti;
                   3800: #endif
                   3801: 
                   3802: #ifdef HAVE_cmpqi
                   3803:   if (HAVE_cmpqi)
                   3804:     cmp_optab->handlers[(int) QImode].insn_code = CODE_FOR_cmpqi;
                   3805: #endif
                   3806: #ifdef HAVE_cmphi
                   3807:   if (HAVE_cmphi)
                   3808:     cmp_optab->handlers[(int) HImode].insn_code = CODE_FOR_cmphi;
                   3809: #endif
                   3810: #ifdef HAVE_cmppsi
                   3811:   if (HAVE_cmppsi)
                   3812:     cmp_optab->handlers[(int) PSImode].insn_code = CODE_FOR_cmppsi;
                   3813: #endif
                   3814: #ifdef HAVE_cmpsi
                   3815:   if (HAVE_cmpsi)
                   3816:     cmp_optab->handlers[(int) SImode].insn_code = CODE_FOR_cmpsi;
                   3817: #endif
                   3818: #ifdef HAVE_cmpdi
                   3819:   if (HAVE_cmpdi)
                   3820:     cmp_optab->handlers[(int) DImode].insn_code = CODE_FOR_cmpdi;
                   3821: #endif
                   3822: #ifdef HAVE_cmpti
                   3823:   if (HAVE_cmpti)
                   3824:     cmp_optab->handlers[(int) TImode].insn_code = CODE_FOR_cmpti;
                   3825: #endif
                   3826: #ifdef HAVE_cmpsf
                   3827:   if (HAVE_cmpsf)
                   3828:     cmp_optab->handlers[(int) SFmode].insn_code = CODE_FOR_cmpsf;
                   3829: #endif
                   3830: #ifdef HAVE_cmpdf
                   3831:   if (HAVE_cmpdf)
                   3832:     cmp_optab->handlers[(int) DFmode].insn_code = CODE_FOR_cmpdf;
                   3833: #endif
                   3834: #ifdef HAVE_cmptf
                   3835:   if (HAVE_cmptf)
                   3836:     cmp_optab->handlers[(int) TFmode].insn_code = CODE_FOR_cmptf;
                   3837: #endif
                   3838: #ifdef HAVE_tstqi
                   3839:   if (HAVE_tstqi)
                   3840:     tst_optab->handlers[(int) QImode].insn_code = CODE_FOR_tstqi;
                   3841: #endif
                   3842: #ifdef HAVE_tsthi
                   3843:   if (HAVE_tsthi)
                   3844:     tst_optab->handlers[(int) HImode].insn_code = CODE_FOR_tsthi;
                   3845: #endif
                   3846: #ifdef HAVE_tstpsi
                   3847:   if (HAVE_tstpsi)
                   3848:     tst_optab->handlers[(int) PSImode].insn_code = CODE_FOR_tstpsi;
                   3849: #endif
                   3850: #ifdef HAVE_tstsi
                   3851:   if (HAVE_tstsi)
                   3852:     tst_optab->handlers[(int) SImode].insn_code = CODE_FOR_tstsi;
                   3853: #endif
                   3854: #ifdef HAVE_tstdi
                   3855:   if (HAVE_tstdi)
                   3856:     tst_optab->handlers[(int) DImode].insn_code = CODE_FOR_tstdi;
                   3857: #endif
                   3858: #ifdef HAVE_tstti
                   3859:   if (HAVE_tstti)
                   3860:     tst_optab->handlers[(int) TImode].insn_code = CODE_FOR_tstti;
                   3861: #endif
                   3862: #ifdef HAVE_tstsf
                   3863:   if (HAVE_tstsf)
                   3864:     tst_optab->handlers[(int) SFmode].insn_code = CODE_FOR_tstsf;
                   3865: #endif
                   3866: #ifdef HAVE_tstdf
                   3867:   if (HAVE_tstdf)
                   3868:     tst_optab->handlers[(int) DFmode].insn_code = CODE_FOR_tstdf;
                   3869: #endif
                   3870: #ifdef HAVE_tsttf
                   3871:   if (HAVE_tsttf)
                   3872:     tst_optab->handlers[(int) TFmode].insn_code = CODE_FOR_tsttf;
                   3873: #endif
                   3874:   /* Comparison libcalls for integers MUST come in pairs, signed/unsigned.  */
                   3875:   cmp_optab->handlers[(int) DImode].libfunc
                   3876:     = gen_rtx (SYMBOL_REF, Pmode, "__cmpdi2");
                   3877:   ucmp_optab->handlers[(int) DImode].libfunc
                   3878:     = gen_rtx (SYMBOL_REF, Pmode, "__ucmpdi2");
                   3879: 
                   3880: #ifdef HAVE_beq
                   3881:   if (HAVE_beq)
                   3882:     bcc_gen_fctn[(int) EQ] = gen_beq;
                   3883: #endif
                   3884: #ifdef HAVE_bne
                   3885:   if (HAVE_bne)
                   3886:     bcc_gen_fctn[(int) NE] = gen_bne;
                   3887: #endif
                   3888: #ifdef HAVE_bgt
                   3889:   if (HAVE_bgt)
                   3890:     bcc_gen_fctn[(int) GT] = gen_bgt;
                   3891: #endif
                   3892: #ifdef HAVE_bge
                   3893:   if (HAVE_bge)
                   3894:     bcc_gen_fctn[(int) GE] = gen_bge;
                   3895: #endif
                   3896: #ifdef HAVE_bgtu
                   3897:   if (HAVE_bgtu)
                   3898:     bcc_gen_fctn[(int) GTU] = gen_bgtu;
                   3899: #endif
                   3900: #ifdef HAVE_bgeu
                   3901:   if (HAVE_bgeu)
                   3902:     bcc_gen_fctn[(int) GEU] = gen_bgeu;
                   3903: #endif
                   3904: #ifdef HAVE_blt
                   3905:   if (HAVE_blt)
                   3906:     bcc_gen_fctn[(int) LT] = gen_blt;
                   3907: #endif
                   3908: #ifdef HAVE_ble
                   3909:   if (HAVE_ble)
                   3910:     bcc_gen_fctn[(int) LE] = gen_ble;
                   3911: #endif
                   3912: #ifdef HAVE_bltu
                   3913:   if (HAVE_bltu)
                   3914:     bcc_gen_fctn[(int) LTU] = gen_bltu;
                   3915: #endif
                   3916: #ifdef HAVE_bleu
                   3917:   if (HAVE_bleu)
                   3918:     bcc_gen_fctn[(int) LEU] = gen_bleu;
                   3919: #endif
                   3920: 
                   3921:   for (i = 0; i < NUM_RTX_CODE; i++)
                   3922:     setcc_gen_code[i] = CODE_FOR_nothing;
                   3923: 
                   3924: #ifdef HAVE_seq
                   3925:   if (HAVE_seq)
                   3926:     setcc_gen_code[(int) EQ] = CODE_FOR_seq;
                   3927: #endif
                   3928: #ifdef HAVE_sne
                   3929:   if (HAVE_sne)
                   3930:     setcc_gen_code[(int) NE] = CODE_FOR_sne;
                   3931: #endif
                   3932: #ifdef HAVE_sgt
                   3933:   if (HAVE_sgt)
                   3934:     setcc_gen_code[(int) GT] = CODE_FOR_sgt;
                   3935: #endif
                   3936: #ifdef HAVE_sge
                   3937:   if (HAVE_sge)
                   3938:     setcc_gen_code[(int) GE] = CODE_FOR_sge;
                   3939: #endif
                   3940: #ifdef HAVE_sgtu
                   3941:   if (HAVE_sgtu)
                   3942:     setcc_gen_code[(int) GTU] = CODE_FOR_sgtu;
                   3943: #endif
                   3944: #ifdef HAVE_sgeu
                   3945:   if (HAVE_sgeu)
                   3946:     setcc_gen_code[(int) GEU] = CODE_FOR_sgeu;
                   3947: #endif
                   3948: #ifdef HAVE_slt
                   3949:   if (HAVE_slt)
                   3950:     setcc_gen_code[(int) LT] = CODE_FOR_slt;
                   3951: #endif
                   3952: #ifdef HAVE_sle
                   3953:   if (HAVE_sle)
                   3954:     setcc_gen_code[(int) LE] = CODE_FOR_sle;
                   3955: #endif
                   3956: #ifdef HAVE_sltu
                   3957:   if (HAVE_sltu)
                   3958:     setcc_gen_code[(int) LTU] = CODE_FOR_sltu;
                   3959: #endif
                   3960: #ifdef HAVE_sleu
                   3961:   if (HAVE_sleu)
                   3962:     setcc_gen_code[(int) LEU] = CODE_FOR_sleu;
                   3963: #endif
                   3964: 
                   3965:   extendsfdf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__extendsfdf2");
                   3966:   truncdfsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__truncdfsf2");
                   3967:   memcpy_libfunc = gen_rtx (SYMBOL_REF, Pmode, "memcpy");
                   3968:   bcopy_libfunc = gen_rtx (SYMBOL_REF, Pmode, "bcopy");
                   3969:   memcmp_libfunc = gen_rtx (SYMBOL_REF, Pmode, "memcmp");
                   3970:   bcmp_libfunc = gen_rtx (SYMBOL_REF, Pmode, "bcmp");
                   3971:   memset_libfunc = gen_rtx (SYMBOL_REF, Pmode, "memset");
                   3972:   bzero_libfunc = gen_rtx (SYMBOL_REF, Pmode, "bzero");
                   3973:   eqsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__eqsf2");
                   3974:   nesf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__nesf2");
                   3975:   gtsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gtsf2");
                   3976:   gesf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gesf2");
                   3977:   ltsf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__ltsf2");
                   3978:   lesf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__lesf2");
                   3979:   eqdf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__eqdf2");
                   3980:   nedf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__nedf2");
                   3981:   gtdf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gtdf2");
                   3982:   gedf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__gedf2");
                   3983:   ltdf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__ltdf2");
                   3984:   ledf2_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__ledf2");
                   3985:   floatdisf_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__floatdisf");
                   3986:   floatsisf_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__floatsisf");
                   3987:   floatdidf_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__floatdidf");
                   3988:   floatsidf_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__floatsidf");
                   3989:   fixsfsi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixsfsi");
                   3990:   fixsfdi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixsfdi");
                   3991:   fixdfsi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixdfsi");
                   3992:   fixdfdi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixdfdi");
                   3993:   fixunssfsi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixunssfsi");
                   3994:   fixunssfdi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixunssfdi");
                   3995:   fixunsdfsi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixunsdfsi");
                   3996:   fixunsdfdi_libfunc = gen_rtx (SYMBOL_REF, Pmode, "__fixunsdfdi");
                   3997: }

unix.superglobalmegacorp.com

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