Annotation of GNUtools/cc/config/i386/i386-old.md, revision 1.1

1.1     ! root        1: ;; GCC machine description for Intel 80386.
        !             2: ;; Copyright (C) 1988 Free Software Foundation, Inc.
        !             3: ;; Mostly by William Schelter.
        !             4: 
        !             5: ;; This file is part of GNU CC.
        !             6: 
        !             7: ;; GNU CC is free software; you can redistribute it and/or modify
        !             8: ;; it under the terms of the GNU General Public License as published by
        !             9: ;; the Free Software Foundation; either version 2, or (at your option)
        !            10: ;; any later version.
        !            11: 
        !            12: ;; GNU CC is distributed in the hope that it will be useful,
        !            13: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            15: ;; GNU General Public License for more details.
        !            16: 
        !            17: ;; You should have received a copy of the GNU General Public License
        !            18: ;; along with GNU CC; see the file COPYING.  If not, write to
        !            19: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
        !            20: 
        !            21: 
        !            22: ;; Attribute specifications
        !            23: 
        !            24: ;; Classify each instruction as to the precision control it requires.
        !            25: (define_attr "fppc" "none,single,double,conflict"
        !            26:   (cond
        !            27:    [(match_operand:DF 0 "" "") (const_string "double")
        !            28:     (match_operand:SF 0 "" "") (const_string "single")]
        !            29:    (const_string "none")))
        !            30: 
        !            31: ;; The original PO technology requires these to be ordered by speed,
        !            32: ;; so that assigner will pick the fastest.
        !            33: 
        !            34: ;; See file "rtl.def" for documentation on define_insn, match_*, et. al.
        !            35: 
        !            36: ;; Macro #define NOTICE_UPDATE_CC in file i386.h handles condition code
        !            37: ;; updates for most instructions.
        !            38: 
        !            39: ;; Macro REG_CLASS_FROM_LETTER in file i386.h defines the register
        !            40: ;; constraint letters.
        !            41: 
        !            42: ;; the special asm out single letter directives following a '%' are:
        !            43: ;; 'z' mov%z1 would be movl, movw, or movb depending on the mode of
        !            44: ;;     operands[1].
        !            45: ;; 'L' Print the opcode suffix for a 32-bit integer opcode.
        !            46: ;; 'W' Print the opcode suffix for a 16-bit integer opcode.
        !            47: ;; 'B' Print the opcode suffix for an 8-bit integer opcode.
        !            48: ;; 'S' Print the opcode suffix for a 32-bit float opcode.
        !            49: ;; 'Q' Print the opcode suffix for a 64-bit float opcode.
        !            50: 
        !            51: ;; 'b' Print the QImode name of the register for the indicated operand.
        !            52: ;;     %b0 would print %al if operands[0] is reg 0.
        !            53: ;; 'w' Likewise, print the HImode name of the register.
        !            54: ;; 'k' Likewise, print the SImode name of the register.
        !            55: ;; 'h' Print the QImode name for a "high" register, either ah, bh, ch or dh.
        !            56: ;; 'y' Print "st(0)" instead of "st" as a register.
        !            57: ;; 'T' Print the opcode suffix for an 80-bit extended real XFmode float opcode.
        !            58: 
        !            59: ;; UNSPEC usage:
        !            60: ;; 0  This is a `scas' operation.  The mode of the UNSPEC is always SImode.
        !            61: ;;    operand 0 is the memory address to scan.
        !            62: ;;    operand 1 is a register containing the value to scan for.  The mode
        !            63: ;;       of the scas opcode will be the same as the mode of this operand.
        !            64: ;;    operand 2 is the known alignment of operand 0.
        !            65: ;; 1  This is a `sin' operation.  The mode of the UNSPEC is MODE_FLOAT.
        !            66: ;;    operand 0 is the argument for `sin'.
        !            67: ;; 2  This is a `cos' operation.  The mode of the UNSPEC is MODE_FLOAT.
        !            68: ;;    operand 0 is the argument for `cos'.
        !            69: 
        !            70: ;; "movl MEM,REG / testl REG,REG" is faster on a 486 than "cmpl $0,MEM".
        !            71: ;; But restricting MEM here would mean that gcc could not remove a redundant
        !            72: ;; test in cases like "incl MEM / je TARGET".
        !            73: ;;
        !            74: ;; We don't want to allow a constant operand for test insns because
        !            75: ;; (set (cc0) (const_int foo)) has no mode information.  Such insns will
        !            76: ;; be folded while optimizing anyway.
        !            77: 
        !            78: ;; All test insns have expanders that save the operands away without
        !            79: ;; actually generating RTL.  The bCOND or sCOND (emitted immediately
        !            80: ;; after the tstM or cmp) will actually emit the tstM or cmpM.
        !            81: 
        !            82: (define_insn "tstsi_1"
        !            83:   [(set (cc0)
        !            84:        (match_operand:SI 0 "nonimmediate_operand" "rm"))]
        !            85:   ""
        !            86:   "*
        !            87: {
        !            88:   if (REG_P (operands[0]))
        !            89:     return AS2 (test%L0,%0,%0);
        !            90: 
        !            91:   operands[1] = const0_rtx;
        !            92:   return AS2 (cmp%L0,%1,%0);
        !            93: }")
        !            94: 
        !            95: (define_expand "tstsi"
        !            96:   [(set (cc0)
        !            97:        (match_operand:SI 0 "nonimmediate_operand" ""))]
        !            98:   ""
        !            99:   "
        !           100: {
        !           101:   i386_compare_gen = gen_tstsi_1;
        !           102:   i386_compare_op0 = operands[0];
        !           103:   DONE;
        !           104: }")
        !           105: 
        !           106: (define_insn "tsthi_1"
        !           107:   [(set (cc0)
        !           108:        (match_operand:HI 0 "nonimmediate_operand" "rm"))]
        !           109:   ""
        !           110:   "*
        !           111: {
        !           112:   if (REG_P (operands[0]))
        !           113:     return AS2 (test%W0,%0,%0);
        !           114: 
        !           115:   operands[1] = const0_rtx;
        !           116:   return AS2 (cmp%W0,%1,%0);
        !           117: }")
        !           118: 
        !           119: (define_expand "tsthi"
        !           120:   [(set (cc0)
        !           121:        (match_operand:HI 0 "nonimmediate_operand" ""))]
        !           122:   ""
        !           123:   "
        !           124: {
        !           125:   i386_compare_gen = gen_tsthi_1;
        !           126:   i386_compare_op0 = operands[0];
        !           127:   DONE;
        !           128: }")
        !           129: 
        !           130: (define_insn "tstqi_1"
        !           131:   [(set (cc0)
        !           132:        (match_operand:QI 0 "nonimmediate_operand" "qm"))]
        !           133:   ""
        !           134:   "*
        !           135: {
        !           136:   if (REG_P (operands[0]))
        !           137:     return AS2 (test%B0,%0,%0);
        !           138: 
        !           139:   operands[1] = const0_rtx;
        !           140:   return AS2 (cmp%B0,%1,%0);
        !           141: }")
        !           142: 
        !           143: (define_expand "tstqi"
        !           144:   [(set (cc0)
        !           145:        (match_operand:QI 0 "nonimmediate_operand" ""))]
        !           146:   ""
        !           147:   "
        !           148: {
        !           149:   i386_compare_gen = gen_tstqi_1;
        !           150:   i386_compare_op0 = operands[0];
        !           151:   DONE;
        !           152: }")
        !           153: 
        !           154: (define_insn "tstsf_cc"
        !           155:   [(set (cc0)
        !           156:        (match_operand:SF 0 "register_operand" "f"))
        !           157:    (clobber (match_scratch:HI 1 "=a"))]
        !           158:   "TARGET_80387 && ! TARGET_IEEE_FP"
        !           159:   "*
        !           160: {
        !           161:   if (! STACK_TOP_P (operands[0]))
        !           162:     abort ();
        !           163: 
        !           164:   output_asm_insn (\"ftst\", operands);
        !           165: 
        !           166:   if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG))
        !           167:     output_asm_insn (AS1 (fstp,%y0), operands);
        !           168: 
        !           169:   return (char *) output_fp_cc0_set (insn);
        !           170: }"
        !           171:   [(set_attr "fppc" "conflict")])
        !           172: 
        !           173: ;; Don't generate tstsf if generating IEEE code, since the `ftst' opcode
        !           174: ;; isn't IEEE compliant.
        !           175: 
        !           176: (define_expand "tstsf"
        !           177:   [(parallel [(set (cc0)
        !           178:                   (match_operand:SF 0 "register_operand" ""))
        !           179:              (clobber (match_scratch:HI 1 ""))])]
        !           180:   "TARGET_80387 && ! TARGET_IEEE_FP"
        !           181:   "
        !           182: {
        !           183:   i386_compare_gen = gen_tstsf_cc;
        !           184:   i386_compare_op0 = operands[0];
        !           185:   DONE;
        !           186: }")
        !           187: 
        !           188: (define_insn "tstdf_cc"
        !           189:   [(set (cc0)
        !           190:        (match_operand:DF 0 "register_operand" "f"))
        !           191:    (clobber (match_scratch:HI 1 "=a"))]
        !           192:   "TARGET_80387 && ! TARGET_IEEE_FP"
        !           193:   "*
        !           194: {
        !           195:   if (! STACK_TOP_P (operands[0]))
        !           196:     abort ();
        !           197: 
        !           198:   output_asm_insn (\"ftst\", operands);
        !           199: 
        !           200:   if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG))
        !           201:     output_asm_insn (AS1 (fstp,%y0), operands);
        !           202: 
        !           203:   return (char *) output_fp_cc0_set (insn);
        !           204: }"
        !           205:   [(set_attr "fppc" "none")])
        !           206: 
        !           207: ;; Don't generate tstdf if generating IEEE code, since the `ftst' opcode
        !           208: ;; isn't IEEE compliant.
        !           209: 
        !           210: (define_expand "tstdf"
        !           211:   [(parallel [(set (cc0)
        !           212:                   (match_operand:DF 0 "register_operand" ""))
        !           213:              (clobber (match_scratch:HI 1 ""))])]
        !           214:   "TARGET_80387 && ! TARGET_IEEE_FP"
        !           215:   "
        !           216: {
        !           217:   i386_compare_gen = gen_tstdf_cc;
        !           218:   i386_compare_op0 = operands[0];
        !           219:   DONE;
        !           220: }")
        !           221: 
        !           222: (define_insn "tstxf_cc"
        !           223:   [(set (cc0)
        !           224:        (match_operand:XF 0 "register_operand" "f"))
        !           225:    (clobber (match_scratch:HI 1 "=a"))]
        !           226:   "TARGET_80387 && ! TARGET_IEEE_FP"
        !           227:   "*
        !           228: {
        !           229:   if (! STACK_TOP_P (operands[0]))
        !           230:     abort ();
        !           231: 
        !           232:   output_asm_insn (\"ftst\", operands);
        !           233: 
        !           234:   if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG))
        !           235:     output_asm_insn (AS1 (fstp,%y0), operands);
        !           236: 
        !           237:   return (char *) output_fp_cc0_set (insn);
        !           238: }")
        !           239: 
        !           240: ;; Don't generate tstdf if generating IEEE code, since the `ftst' opcode
        !           241: ;; isn't IEEE compliant.
        !           242: 
        !           243: (define_expand "tstxf"
        !           244:   [(parallel [(set (cc0)
        !           245:                   (match_operand:XF 0 "register_operand" ""))
        !           246:              (clobber (match_scratch:HI 1 ""))])]
        !           247:   "TARGET_80387 && ! TARGET_IEEE_FP"
        !           248:   "
        !           249: {
        !           250:   i386_compare_gen = gen_tstxf_cc;
        !           251:   i386_compare_op0 = operands[0];
        !           252:   DONE;
        !           253: }")
        !           254: 
        !           255: ;;- compare instructions.  See comments above tstM patterns about
        !           256: ;;  expansion of these insns.
        !           257: 
        !           258: (define_insn "cmpsi_1"
        !           259:   [(set (cc0)
        !           260:        (compare (match_operand:SI 0 "nonimmediate_operand" "mr,r")
        !           261:                 (match_operand:SI 1 "general_operand" "ri,mr")))]
        !           262:   "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
        !           263:   "*
        !           264: {
        !           265:   if (CONSTANT_P (operands[0]) || GET_CODE (operands[1]) == MEM)
        !           266:     {
        !           267:       cc_status.flags |= CC_REVERSED;
        !           268:       return AS2 (cmp%L0,%0,%1);
        !           269:     }
        !           270:   return AS2 (cmp%L0,%1,%0);
        !           271: }")
        !           272: 
        !           273: (define_expand "cmpsi"
        !           274:   [(set (cc0)
        !           275:        (compare (match_operand:SI 0 "nonimmediate_operand" "")
        !           276:                 (match_operand:SI 1 "general_operand" "")))]
        !           277:   ""
        !           278:   "
        !           279: {
        !           280:   if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
        !           281:     operands[0] = force_reg (SImode, operands[0]);
        !           282: 
        !           283:   i386_compare_gen = gen_cmpsi_1;
        !           284:   i386_compare_op0 = operands[0];
        !           285:   i386_compare_op1 = operands[1];
        !           286:   DONE;
        !           287: }")
        !           288: 
        !           289: (define_insn "cmphi_1"
        !           290:   [(set (cc0)
        !           291:        (compare (match_operand:HI 0 "nonimmediate_operand" "mr,r")
        !           292:                 (match_operand:HI 1 "general_operand" "ri,mr")))]
        !           293:   "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
        !           294:   "*
        !           295: {
        !           296:   if (CONSTANT_P (operands[0]) || GET_CODE (operands[1]) == MEM)
        !           297:     {
        !           298:       cc_status.flags |= CC_REVERSED;
        !           299:       return AS2 (cmp%W0,%0,%1);
        !           300:     }
        !           301:   return AS2 (cmp%W0,%1,%0);
        !           302: }")
        !           303: 
        !           304: (define_expand "cmphi"
        !           305:   [(set (cc0)
        !           306:        (compare (match_operand:HI 0 "nonimmediate_operand" "")
        !           307:                 (match_operand:HI 1 "general_operand" "")))]
        !           308:   ""
        !           309:   "
        !           310: {
        !           311:   if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
        !           312:     operands[0] = force_reg (HImode, operands[0]);
        !           313: 
        !           314:   i386_compare_gen = gen_cmphi_1;
        !           315:   i386_compare_op0 = operands[0];
        !           316:   i386_compare_op1 = operands[1];
        !           317:   DONE;
        !           318: }")
        !           319: 
        !           320: (define_insn "cmpqi_1"
        !           321:   [(set (cc0)
        !           322:        (compare (match_operand:QI 0 "nonimmediate_operand" "q,mq")
        !           323:                 (match_operand:QI 1 "general_operand" "qm,nq")))]
        !           324:   "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
        !           325:   "*
        !           326: {
        !           327:   if (CONSTANT_P (operands[0]) || GET_CODE (operands[1]) == MEM)
        !           328:     {
        !           329:       cc_status.flags |= CC_REVERSED;
        !           330:       return AS2 (cmp%B0,%0,%1);
        !           331:     }
        !           332:   return AS2 (cmp%B0,%1,%0);
        !           333: }")
        !           334: 
        !           335: (define_expand "cmpqi"
        !           336:   [(set (cc0)
        !           337:        (compare (match_operand:QI 0 "nonimmediate_operand" "")
        !           338:                 (match_operand:QI 1 "general_operand" "")))]
        !           339:   ""
        !           340:   "
        !           341: {
        !           342:   if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
        !           343:     operands[0] = force_reg (QImode, operands[0]);
        !           344: 
        !           345:   i386_compare_gen = gen_cmpqi_1;
        !           346:   i386_compare_op0 = operands[0];
        !           347:   i386_compare_op1 = operands[1];
        !           348:   DONE;
        !           349: }")
        !           350: 
        !           351: ;; These implement float point compares.  For each of DFmode and
        !           352: ;; SFmode, there is the normal insn, and an insn where the second operand
        !           353: ;; is converted to the desired mode.
        !           354: 
        !           355: (define_insn ""
        !           356:   [(set (cc0)
        !           357:        (match_operator 2 "VOIDmode_compare_op"
        !           358:                        [(match_operand:XF 0 "nonimmediate_operand" "f")
        !           359:                         (match_operand:XF 1 "nonimmediate_operand" "f")]))
        !           360:    (clobber (match_scratch:HI 3 "=a"))]
        !           361:   "TARGET_80387
        !           362:    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
        !           363:   "* return (char *) output_float_compare (insn, operands);"
        !           364:   [(set_attr "fppc" "conflict")])
        !           365: 
        !           366: (define_insn ""
        !           367:   [(set (cc0)
        !           368:        (match_operator 2 "VOIDmode_compare_op"
        !           369:                        [(match_operand:XF 0 "register_operand" "f")
        !           370:                         (float:XF
        !           371:                          (match_operand:SI 1 "nonimmediate_operand" "rm"))]))
        !           372:    (clobber (match_scratch:HI 3 "=a"))]
        !           373:   "TARGET_80387"
        !           374:   "* return (char *) output_float_compare (insn, operands);"
        !           375:   [(set_attr "fppc" "conflict")])
        !           376: 
        !           377: (define_insn ""
        !           378:   [(set (cc0)
        !           379:        (match_operator 2 "VOIDmode_compare_op"
        !           380:                        [(float:XF
        !           381:                          (match_operand:SI 0 "nonimmediate_operand" "rm"))
        !           382:                         (match_operand:XF 1 "register_operand" "f")]))
        !           383:    (clobber (match_scratch:HI 3 "=a"))]
        !           384:   "TARGET_80387"
        !           385:   "* return (char *) output_float_compare (insn, operands);"
        !           386:   [(set_attr "fppc" "conflict")])
        !           387: 
        !           388: (define_insn ""
        !           389:   [(set (cc0)
        !           390:        (match_operator 2 "VOIDmode_compare_op"
        !           391:                        [(match_operand:XF 0 "register_operand" "f")
        !           392:                         (float_extend:XF
        !           393:                          (match_operand:DF 1 "nonimmediate_operand" "fm"))]))
        !           394:    (clobber (match_scratch:HI 3 "=a"))]
        !           395:   "TARGET_80387"
        !           396:   "* return (char *) output_float_compare (insn, operands);"
        !           397:   [(set_attr "fppc" "conflict")])
        !           398: 
        !           399: (define_insn ""
        !           400:   [(set (cc0)
        !           401:        (match_operator 2 "VOIDmode_compare_op"
        !           402:                        [(match_operand:XF 0 "register_operand" "f")
        !           403:                         (float_extend:XF
        !           404:                          (match_operand:SF 1 "nonimmediate_operand" "fm"))]))
        !           405:    (clobber (match_scratch:HI 3 "=a"))]
        !           406:   "TARGET_80387"
        !           407:   "* return (char *) output_float_compare (insn, operands);"
        !           408:   [(set_attr "fppc" "conflict")])
        !           409: 
        !           410: (define_insn ""
        !           411:   [(set (cc0)
        !           412:        (compare:CCFPEQ (match_operand:XF 0 "register_operand" "f")
        !           413:                        (match_operand:XF 1 "register_operand" "f")))
        !           414:    (clobber (match_scratch:HI 2 "=a"))]
        !           415:   "TARGET_80387"
        !           416:   "* return (char *) output_float_compare (insn, operands);"
        !           417:   [(set_attr "fppc" "conflict")])
        !           418: 
        !           419: (define_insn ""
        !           420:   [(set (cc0)
        !           421:        (match_operator 2 "VOIDmode_compare_op"
        !           422:                        [(match_operand:DF 0 "nonimmediate_operand" "f,fm")
        !           423:                         (match_operand:DF 1 "nonimmediate_operand" "fm,f")]))
        !           424:    (clobber (match_scratch:HI 3 "=a,a"))]
        !           425:   "TARGET_80387
        !           426:    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
        !           427:   "* return (char *) output_float_compare (insn, operands);"
        !           428:   [(set_attr "fppc" "conflict")])
        !           429: 
        !           430: (define_insn ""
        !           431:   [(set (cc0)
        !           432:        (match_operator 2 "VOIDmode_compare_op"
        !           433:                        [(match_operand:DF 0 "register_operand" "f")
        !           434:                         (float:DF
        !           435:                          (match_operand:SI 1 "nonimmediate_operand" "rm"))]))
        !           436:    (clobber (match_scratch:HI 3 "=a"))]
        !           437:   "TARGET_80387"
        !           438:   "* return (char *) output_float_compare (insn, operands);"
        !           439:   [(set_attr "fppc" "conflict")])
        !           440: 
        !           441: (define_insn ""
        !           442:   [(set (cc0)
        !           443:        (match_operator 2 "VOIDmode_compare_op"
        !           444:                        [(float:DF
        !           445:                          (match_operand:SI 0 "nonimmediate_operand" "rm"))
        !           446:                         (match_operand:DF 1 "register_operand" "f")]))
        !           447:    (clobber (match_scratch:HI 3 "=a"))]
        !           448:   "TARGET_80387"
        !           449:   "* return (char *) output_float_compare (insn, operands);"
        !           450:   [(set_attr "fppc" "conflict")])
        !           451: 
        !           452: (define_insn ""
        !           453:   [(set (cc0)
        !           454:        (match_operator 2 "VOIDmode_compare_op"
        !           455:                        [(match_operand:DF 0 "register_operand" "f")
        !           456:                         (float_extend:DF
        !           457:                          (match_operand:SF 1 "nonimmediate_operand" "fm"))]))
        !           458:    (clobber (match_scratch:HI 3 "=a"))]
        !           459:   "TARGET_80387"
        !           460:   "* return (char *) output_float_compare (insn, operands);"
        !           461:   [(set_attr "fppc" "conflict")])
        !           462: 
        !           463: (define_insn ""
        !           464:   [(set (cc0)
        !           465:        (match_operator 2 "VOIDmode_compare_op"
        !           466:                        [(float_extend:DF
        !           467:                          (match_operand:SF 0 "nonimmediate_operand" "fm"))
        !           468:                         (match_operand:DF 1 "register_operand" "f")]))
        !           469:    (clobber (match_scratch:HI 3 "=a"))]
        !           470:   "TARGET_80387"
        !           471:   "* return (char *) output_float_compare (insn, operands);"
        !           472:   [(set_attr "fppc" "conflict")])
        !           473: 
        !           474: (define_insn ""
        !           475:   [(set (cc0)
        !           476:        (compare:CCFPEQ (match_operand:DF 0 "register_operand" "f")
        !           477:                        (match_operand:DF 1 "register_operand" "f")))
        !           478:    (clobber (match_scratch:HI 2 "=a"))]
        !           479:   "TARGET_80387"
        !           480:   "* return (char *) output_float_compare (insn, operands);"
        !           481:   [(set_attr "fppc" "conflict")])
        !           482: 
        !           483: ;; These two insns will never be generated by combine due to the mode of
        !           484: ;; the COMPARE.
        !           485: ;(define_insn ""
        !           486: ;  [(set (cc0)
        !           487: ;      (compare:CCFPEQ (match_operand:DF 0 "register_operand" "f")
        !           488: ;                      (float_extend:DF
        !           489: ;                       (match_operand:SF 1 "register_operand" "f"))))
        !           490: ;   (clobber (match_scratch:HI 2 "=a"))]
        !           491: ;  "TARGET_80387"
        !           492: ;  "* return (char *) output_float_compare (insn, operands);")
        !           493: ;
        !           494: ;(define_insn ""
        !           495: ;  [(set (cc0)
        !           496: ;      (compare:CCFPEQ (float_extend:DF
        !           497: ;                       (match_operand:SF 0 "register_operand" "f"))
        !           498: ;                      (match_operand:DF 1 "register_operand" "f")))
        !           499: ;   (clobber (match_scratch:HI 2 "=a"))]
        !           500: ;  "TARGET_80387"
        !           501: ;  "* return (char *) output_float_compare (insn, operands);")
        !           502: 
        !           503: (define_insn "cmpsf_cc_1"
        !           504:   [(set (cc0)
        !           505:        (match_operator 2 "VOIDmode_compare_op"
        !           506:                        [(match_operand:SF 0 "nonimmediate_operand" "f,fm")
        !           507:                         (match_operand:SF 1 "nonimmediate_operand" "fm,f")]))
        !           508:    (clobber (match_scratch:HI 3 "=a,a"))]
        !           509:   "TARGET_80387
        !           510:    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
        !           511:   "* return (char *) output_float_compare (insn, operands);"
        !           512:   [(set_attr "fppc" "none")])
        !           513: 
        !           514: (define_insn ""
        !           515:   [(set (cc0)
        !           516:        (match_operator 2 "VOIDmode_compare_op"
        !           517:                        [(match_operand:SF 0 "register_operand" "f")
        !           518:                         (float:SF
        !           519:                          (match_operand:SI 1 "nonimmediate_operand" "rm"))]))
        !           520:    (clobber (match_scratch:HI 3 "=a"))]
        !           521:   "TARGET_80387"
        !           522:   "* return (char *) output_float_compare (insn, operands);"
        !           523:   [(set_attr "fppc" "none")])
        !           524: 
        !           525: (define_insn ""
        !           526:   [(set (cc0)
        !           527:        (match_operator 2 "VOIDmode_compare_op"
        !           528:                        [(float:SF
        !           529:                          (match_operand:SI 0 "nonimmediate_operand" "rm"))
        !           530:                         (match_operand:SF 1 "register_operand" "f")]))
        !           531:    (clobber (match_scratch:HI 3 "=a"))]
        !           532:   "TARGET_80387"
        !           533:   "* return (char *) output_float_compare (insn, operands);"
        !           534:   [(set_attr "fppc" "none")])
        !           535: 
        !           536: (define_insn ""
        !           537:   [(set (cc0)
        !           538:        (compare:CCFPEQ (match_operand:SF 0 "register_operand" "f")
        !           539:                        (match_operand:SF 1 "register_operand" "f")))
        !           540:    (clobber (match_scratch:HI 2 "=a"))]
        !           541:   "TARGET_80387"
        !           542:   "* return (char *) output_float_compare (insn, operands);"
        !           543:   [(set_attr "fppc" "none")])
        !           544: 
        !           545: (define_expand "cmpxf"
        !           546:   [(set (cc0)
        !           547:        (compare (match_operand:XF 0 "register_operand" "")
        !           548:                 (match_operand:XF 1 "nonimmediate_operand" "")))]
        !           549:   "TARGET_80387"
        !           550:   "
        !           551: {
        !           552:   i386_compare_gen = gen_cmpxf_cc;
        !           553:   i386_compare_gen_eq = gen_cmpxf_ccfpeq;
        !           554:   i386_compare_op0 = operands[0];
        !           555:   i386_compare_op1 = operands[1];
        !           556:   DONE;
        !           557: }")
        !           558: 
        !           559: (define_expand "cmpdf"
        !           560:   [(set (cc0)
        !           561:        (compare (match_operand:DF 0 "register_operand" "")
        !           562:                 (match_operand:DF 1 "nonimmediate_operand" "")))]
        !           563:   "TARGET_80387"
        !           564:   "
        !           565: {
        !           566:   i386_compare_gen = gen_cmpdf_cc;
        !           567:   i386_compare_gen_eq = gen_cmpdf_ccfpeq;
        !           568:   i386_compare_op0 = operands[0];
        !           569:   i386_compare_op1 = operands[1];
        !           570:   DONE;
        !           571: }")
        !           572: 
        !           573: (define_expand "cmpsf"
        !           574:   [(set (cc0)
        !           575:        (compare (match_operand:SF 0 "register_operand" "")
        !           576:                 (match_operand:SF 1 "nonimmediate_operand" "")))]
        !           577:   "TARGET_80387"
        !           578:   "
        !           579: {
        !           580:   i386_compare_gen = gen_cmpsf_cc;
        !           581:   i386_compare_gen_eq = gen_cmpsf_ccfpeq;
        !           582:   i386_compare_op0 = operands[0];
        !           583:   i386_compare_op1 = operands[1];
        !           584:   DONE;
        !           585: }")
        !           586: 
        !           587: (define_expand "cmpxf_cc"
        !           588:   [(parallel [(set (cc0)
        !           589:                   (compare (match_operand:XF 0 "register_operand" "")
        !           590:                            (match_operand:XF 1 "register_operand" "")))
        !           591:              (clobber (match_scratch:HI 2 ""))])]
        !           592:   "TARGET_80387"
        !           593:   "")
        !           594: 
        !           595: (define_expand "cmpxf_ccfpeq"
        !           596:   [(parallel [(set (cc0)
        !           597:                   (compare:CCFPEQ (match_operand:XF 0 "register_operand" "")
        !           598:                                   (match_operand:XF 1 "register_operand" "")))
        !           599:              (clobber (match_scratch:HI 2 ""))])]
        !           600:   "TARGET_80387"
        !           601:   "
        !           602: {
        !           603:   if (! register_operand (operands[1], XFmode))
        !           604:     operands[1] = copy_to_mode_reg (XFmode, operands[1]);
        !           605: }")
        !           606: 
        !           607: (define_expand "cmpdf_cc"
        !           608:   [(parallel [(set (cc0)
        !           609:                   (compare (match_operand:DF 0 "register_operand" "")
        !           610:                            (match_operand:DF 1 "register_operand" "")))
        !           611:              (clobber (match_scratch:HI 2 ""))])]
        !           612:   "TARGET_80387"
        !           613:   "")
        !           614: 
        !           615: (define_expand "cmpdf_ccfpeq"
        !           616:   [(parallel [(set (cc0)
        !           617:                   (compare:CCFPEQ (match_operand:DF 0 "register_operand" "")
        !           618:                                   (match_operand:DF 1 "register_operand" "")))
        !           619:              (clobber (match_scratch:HI 2 ""))])]
        !           620:   "TARGET_80387"
        !           621:   "
        !           622: {
        !           623:   if (! register_operand (operands[1], DFmode))
        !           624:     operands[1] = copy_to_mode_reg (DFmode, operands[1]);
        !           625: }")
        !           626: 
        !           627: (define_expand "cmpsf_cc"
        !           628:   [(parallel [(set (cc0)
        !           629:                   (compare (match_operand:SF 0 "register_operand" "")
        !           630:                            (match_operand:SF 1 "register_operand" "")))
        !           631:              (clobber (match_scratch:HI 2 ""))])]
        !           632:   "TARGET_80387"
        !           633:   "")
        !           634: 
        !           635: (define_expand "cmpsf_ccfpeq"
        !           636:   [(parallel [(set (cc0)
        !           637:                   (compare:CCFPEQ (match_operand:SF 0 "register_operand" "")
        !           638:                                   (match_operand:SF 1 "register_operand" "")))
        !           639:              (clobber (match_scratch:HI 2 ""))])]
        !           640:   "TARGET_80387"
        !           641:   "
        !           642: {
        !           643:   if (! register_operand (operands[1], SFmode))
        !           644:     operands[1] = copy_to_mode_reg (SFmode, operands[1]);
        !           645: }")
        !           646: 
        !           647: ;; logical compare
        !           648: 
        !           649: (define_insn ""
        !           650:   [(set (cc0)
        !           651:        (and:SI (match_operand:SI 0 "general_operand" "%ro")
        !           652:                (match_operand:SI 1 "general_operand" "ri")))]
        !           653:   ""
        !           654:   "*
        !           655: {
        !           656:   /* For small integers, we may actually use testb. */
        !           657:   if (GET_CODE (operands[1]) == CONST_INT
        !           658:       && ! (GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))
        !           659:       && (! REG_P (operands[0]) || QI_REG_P (operands[0])))
        !           660:     {
        !           661:       /* We may set the sign bit spuriously.  */
        !           662: 
        !           663:       if ((INTVAL (operands[1]) & ~0xff) == 0)
        !           664:         {
        !           665:          cc_status.flags |= CC_NOT_NEGATIVE;
        !           666:          return AS2 (test%B0,%1,%b0);
        !           667:        }
        !           668: 
        !           669:       if ((INTVAL (operands[1]) & ~0xff00) == 0)
        !           670:         {
        !           671:          cc_status.flags |= CC_NOT_NEGATIVE;
        !           672:          operands[1] = GEN_INT (INTVAL (operands[1]) >> 8);
        !           673: 
        !           674:          if (QI_REG_P (operands[0]))
        !           675:            return AS2 (test%B0,%1,%h0);
        !           676:          else
        !           677:            {
        !           678:              operands[0] = adj_offsettable_operand (operands[0], 1);
        !           679:              return AS2 (test%B0,%1,%b0);
        !           680:            }
        !           681:        }
        !           682: 
        !           683:       if (GET_CODE (operands[0]) == MEM
        !           684:          && (INTVAL (operands[1]) & ~0xff0000) == 0)
        !           685:         {
        !           686:          cc_status.flags |= CC_NOT_NEGATIVE;
        !           687:          operands[1] = GEN_INT (INTVAL (operands[1]) >> 16);
        !           688:          operands[0] = adj_offsettable_operand (operands[0], 2);
        !           689:          return AS2 (test%B0,%1,%b0);
        !           690:        }
        !           691: 
        !           692:       if (GET_CODE (operands[0]) == MEM
        !           693:          && (INTVAL (operands[1]) & ~0xff000000) == 0)
        !           694:         {
        !           695:          operands[1] = GEN_INT ((INTVAL (operands[1]) >> 24) & 0xff);
        !           696:          operands[0] = adj_offsettable_operand (operands[0], 3);
        !           697:          return AS2 (test%B0,%1,%b0);
        !           698:        }
        !           699:     }
        !           700: 
        !           701:   if (CONSTANT_P (operands[1]) || GET_CODE (operands[0]) == MEM)
        !           702:     return AS2 (test%L0,%1,%0);
        !           703: 
        !           704:   return AS2 (test%L1,%0,%1);
        !           705: }")
        !           706: 
        !           707: (define_insn ""
        !           708:   [(set (cc0)
        !           709:        (and:HI (match_operand:HI 0 "general_operand" "%ro")
        !           710:                (match_operand:HI 1 "general_operand" "ri")))]
        !           711:   ""
        !           712:   "*
        !           713: {
        !           714:   if (GET_CODE (operands[1]) == CONST_INT
        !           715:       && ! (GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))
        !           716:       && (! REG_P (operands[0]) || QI_REG_P (operands[0])))
        !           717:     {
        !           718:       if ((INTVAL (operands[1]) & 0xff00) == 0)
        !           719:        {
        !           720:          /* ??? This might not be necessary. */
        !           721:          if (INTVAL (operands[1]) & 0xffff0000)
        !           722:            operands[1] = GEN_INT (INTVAL (operands[1]) & 0xff);
        !           723: 
        !           724:          /* We may set the sign bit spuriously.  */
        !           725:          cc_status.flags |= CC_NOT_NEGATIVE;
        !           726:          return AS2 (test%B0,%1,%b0);
        !           727:        }
        !           728: 
        !           729:       if ((INTVAL (operands[1]) & 0xff) == 0)
        !           730:         {
        !           731:          operands[1] = GEN_INT ((INTVAL (operands[1]) >> 8) & 0xff);
        !           732: 
        !           733:          if (QI_REG_P (operands[0]))
        !           734:            return AS2 (test%B0,%1,%h0);
        !           735:          else
        !           736:            {
        !           737:              operands[0] = adj_offsettable_operand (operands[0], 1);
        !           738:              return AS2 (test%B0,%1,%b0);
        !           739:            }
        !           740:        }
        !           741:     }
        !           742: 
        !           743:   if (CONSTANT_P (operands[1]) || GET_CODE (operands[0]) == MEM)
        !           744:     return AS2 (test%W0,%1,%0);
        !           745: 
        !           746:   return AS2 (test%W1,%0,%1);
        !           747: }")
        !           748: 
        !           749: (define_insn ""
        !           750:   [(set (cc0)
        !           751:        (and:QI (match_operand:QI 0 "general_operand" "%qm")
        !           752:                (match_operand:QI 1 "general_operand" "qi")))]
        !           753:   ""
        !           754:   "*
        !           755: {
        !           756:   if (CONSTANT_P (operands[1]) || GET_CODE (operands[0]) == MEM)
        !           757:     return AS2 (test%B0,%1,%0);
        !           758: 
        !           759:   return AS2 (test%B1,%0,%1);
        !           760: }")
        !           761: 
        !           762: ;; move instructions.
        !           763: ;; There is one for each machine mode,
        !           764: ;; and each is preceded by a corresponding push-insn pattern
        !           765: ;; (since pushes are not general_operands on the 386).
        !           766: 
        !           767: (define_insn ""
        !           768:   [(set (match_operand:SI 0 "push_operand" "=<")
        !           769:        (match_operand:SI 1 "general_operand" "g"))]
        !           770:   "! TARGET_486"
        !           771:   "push%L0 %1")
        !           772: 
        !           773: ;; On a 486, it is faster to move MEM to a REG and then push, rather than
        !           774: ;; push MEM directly.
        !           775: 
        !           776: (define_insn ""
        !           777:   [(set (match_operand:SI 0 "push_operand" "=<")
        !           778:        (match_operand:SI 1 "general_operand" "ri"))]
        !           779:   "TARGET_486"
        !           780:   "push%L0 %1")
        !           781: 
        !           782: ;; General case of fullword move.
        !           783: 
        !           784: ;; If generating PIC code and operands[1] is a symbolic CONST, emit a
        !           785: ;; move to get the address of the symbolic object from the GOT.
        !           786: 
        !           787: (define_expand "movsi"
        !           788:   [(set (match_operand:SI 0 "general_operand" "")
        !           789:        (match_operand:SI 1 "general_operand" ""))]
        !           790:   ""
        !           791:   "
        !           792: {
        !           793:   extern int flag_pic;
        !           794: 
        !           795:   if (flag_pic && SYMBOLIC_CONST (operands[1]))
        !           796:     emit_pic_move (operands, SImode);
        !           797: }")
        !           798: 
        !           799: ;; On i486, incl reg is faster than movl $1,reg.
        !           800: 
        !           801: (define_insn ""
        !           802:   [(set (match_operand:SI 0 "general_operand" "=g,r")
        !           803:        (match_operand:SI 1 "general_operand" "ri,m"))]
        !           804:   ""
        !           805:   "*
        !           806: {
        !           807:   rtx link;
        !           808:   if (operands[1] == const0_rtx && REG_P (operands[0]))
        !           809:     return AS2 (xor%L0,%0,%0);
        !           810: 
        !           811:   if (operands[1] == const1_rtx
        !           812:       && (link = find_reg_note (insn, REG_WAS_0, 0))
        !           813:       /* Make sure the insn that stored the 0 is still present.  */
        !           814:       && ! INSN_DELETED_P (XEXP (link, 0))
        !           815:       && GET_CODE (XEXP (link, 0)) != NOTE
        !           816:       /* Make sure cross jumping didn't happen here.  */
        !           817:       && no_labels_between_p (XEXP (link, 0), insn)
        !           818:       /* Make sure the reg hasn't been clobbered.  */
        !           819:       && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
        !           820:     /* Fastest way to change a 0 to a 1.  */
        !           821:     return AS1 (inc%L0,%0);
        !           822: 
        !           823:   return AS2 (mov%L0,%1,%0);
        !           824: }")
        !           825: 
        !           826: (define_insn ""
        !           827:   [(set (match_operand:HI 0 "push_operand" "=<")
        !           828:        (match_operand:HI 1 "general_operand" "g"))]
        !           829:   ""
        !           830:   "push%W0 %1")
        !           831: 
        !           832: ;; On i486, an incl and movl are both faster than incw and movw.
        !           833: 
        !           834: (define_insn "movhi"
        !           835:   [(set (match_operand:HI 0 "general_operand" "=g,r")
        !           836:        (match_operand:HI 1 "general_operand" "ri,m"))]
        !           837:   ""
        !           838:   "*
        !           839: {
        !           840:   rtx link;
        !           841:   if (REG_P (operands[0]) && operands[1] == const0_rtx)
        !           842:     return AS2 (xor%L0,%k0,%k0);
        !           843: 
        !           844:   if (REG_P (operands[0]) && operands[1] == const1_rtx 
        !           845:       && (link = find_reg_note (insn, REG_WAS_0, 0))
        !           846:       /* Make sure the insn that stored the 0 is still present.  */
        !           847:       && ! INSN_DELETED_P (XEXP (link, 0))
        !           848:       && GET_CODE (XEXP (link, 0)) != NOTE
        !           849:       /* Make sure cross jumping didn't happen here.  */
        !           850:       && no_labels_between_p (XEXP (link, 0), insn)
        !           851:       /* Make sure the reg hasn't been clobbered.  */
        !           852:       && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
        !           853:     /* Fastest way to change a 0 to a 1.  */
        !           854:     return AS1 (inc%L0,%k0);
        !           855: 
        !           856:   if (REG_P (operands[0]))
        !           857:     {
        !           858:       if (REG_P (operands[1]))
        !           859:        return AS2 (mov%L0,%k1,%k0);
        !           860:       else if (CONSTANT_P (operands[1]))
        !           861:        return AS2 (mov%L0,%1,%k0);
        !           862:     }
        !           863: 
        !           864:   return AS2 (mov%W0,%1,%0);
        !           865: }")
        !           866: 
        !           867: (define_insn "movstricthi"
        !           868:   [(set (strict_low_part (match_operand:HI 0 "general_operand" "+g,r"))
        !           869:        (match_operand:HI 1 "general_operand" "ri,m"))]
        !           870:   ""
        !           871:   "*
        !           872: {
        !           873:   rtx link;
        !           874:   if (operands[1] == const0_rtx && REG_P (operands[0]))
        !           875:     return AS2 (xor%W0,%0,%0);
        !           876: 
        !           877:   if (operands[1] == const1_rtx
        !           878:       && (link = find_reg_note (insn, REG_WAS_0, 0))
        !           879:       /* Make sure the insn that stored the 0 is still present.  */
        !           880:       && ! INSN_DELETED_P (XEXP (link, 0))
        !           881:       && GET_CODE (XEXP (link, 0)) != NOTE
        !           882:       /* Make sure cross jumping didn't happen here.  */
        !           883:       && no_labels_between_p (XEXP (link, 0), insn)
        !           884:       /* Make sure the reg hasn't been clobbered.  */
        !           885:       && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
        !           886:     /* Fastest way to change a 0 to a 1.  */
        !           887:     return AS1 (inc%W0,%0);
        !           888: 
        !           889:   return AS2 (mov%W0,%1,%0);
        !           890: }")
        !           891: 
        !           892: ;; emit_push_insn when it calls move_by_pieces
        !           893: ;; requires an insn to "push a byte".
        !           894: ;; But actually we use pushw, which has the effect of rounding
        !           895: ;; the amount pushed up to a halfword.
        !           896: (define_insn ""
        !           897:   [(set (match_operand:QI 0 "push_operand" "=<")
        !           898:        (match_operand:QI 1 "general_operand" "q"))]
        !           899:   ""
        !           900:   "*
        !           901: {
        !           902:   operands[1] = gen_rtx (REG, HImode, REGNO (operands[1]));
        !           903:   return AS1 (push%W0,%1);
        !           904: }")
        !           905: 
        !           906: ;; On i486, incb reg is faster than movb $1,reg.
        !           907: 
        !           908: ;; ??? Do a recognizer for zero_extract that looks just like this, but reads
        !           909: ;; or writes %ah, %bh, %ch, %dh.
        !           910: 
        !           911: (define_insn "movqi"
        !           912:   [(set (match_operand:QI 0 "general_operand" "=q,*r,qm")
        !           913:        (match_operand:QI 1 "general_operand" "*g,q,qn"))]
        !           914:   ""
        !           915:   "*
        !           916: {
        !           917:   rtx link;
        !           918:   if (operands[1] == const0_rtx && REG_P (operands[0]))
        !           919:     return AS2 (xor%B0,%0,%0);
        !           920: 
        !           921:   if (operands[1] == const1_rtx
        !           922:       && (link = find_reg_note (insn, REG_WAS_0, 0))
        !           923:       /* Make sure the insn that stored the 0 is still present.  */
        !           924:       && ! INSN_DELETED_P (XEXP (link, 0))
        !           925:       && GET_CODE (XEXP (link, 0)) != NOTE
        !           926:       /* Make sure cross jumping didn't happen here.  */
        !           927:       && no_labels_between_p (XEXP (link, 0), insn)
        !           928:       /* Make sure the reg hasn't been clobbered.  */
        !           929:       && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
        !           930:     /* Fastest way to change a 0 to a 1.  */
        !           931:     return AS1 (inc%B0,%0);
        !           932: 
        !           933:   /* If mov%B0 isn't allowed for one of these regs, use mov%L0.  */
        !           934:   if (NON_QI_REG_P (operands[0]) || NON_QI_REG_P (operands[1]))
        !           935:     return (AS2 (mov%L0,%k1,%k0));
        !           936: 
        !           937:   return (AS2 (mov%B0,%1,%0));
        !           938: }")
        !           939: 
        !           940: ;; If it becomes necessary to support movstrictqi into %esi or %edi,
        !           941: ;; use the insn sequence:
        !           942: ;;
        !           943: ;;     shrdl $8,srcreg,dstreg
        !           944: ;;     rorl $24,dstreg
        !           945: ;;
        !           946: ;; If operands[1] is a constant, then an andl/orl sequence would be
        !           947: ;; faster.
        !           948: 
        !           949: (define_insn "movstrictqi"
        !           950:   [(set (strict_low_part (match_operand:QI 0 "general_operand" "+qm,q"))
        !           951:        (match_operand:QI 1 "general_operand" "*qn,m"))]
        !           952:   ""
        !           953:   "*
        !           954: {
        !           955:   rtx link;
        !           956:   if (operands[1] == const0_rtx && REG_P (operands[0]))
        !           957:     return AS2 (xor%B0,%0,%0);
        !           958: 
        !           959:   if (operands[1] == const1_rtx
        !           960:       && (link = find_reg_note (insn, REG_WAS_0, 0))
        !           961:       /* Make sure the insn that stored the 0 is still present.  */
        !           962:       && ! INSN_DELETED_P (XEXP (link, 0))
        !           963:       && GET_CODE (XEXP (link, 0)) != NOTE
        !           964:       /* Make sure cross jumping didn't happen here.  */
        !           965:       && no_labels_between_p (XEXP (link, 0), insn)
        !           966:       /* Make sure the reg hasn't been clobbered.  */
        !           967:       && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
        !           968:     /* Fastest way to change a 0 to a 1.  */
        !           969:     return AS1 (inc%B0,%0);
        !           970: 
        !           971:   /* If mov%B0 isn't allowed for one of these regs, use mov%L0.  */
        !           972:   if (NON_QI_REG_P (operands[0]) || NON_QI_REG_P (operands[1]))
        !           973:     {
        !           974:       abort ();
        !           975:       return (AS2 (mov%L0,%k1,%k0));
        !           976:     }
        !           977: 
        !           978:   return AS2 (mov%B0,%1,%0);
        !           979: }")
        !           980: 
        !           981: (define_insn ""
        !           982:   [(set (match_operand:SF 0 "push_operand" "=<,<")
        !           983:        (match_operand:SF 1 "general_operand" "gF,f"))]
        !           984:   ""
        !           985:   "*
        !           986: {
        !           987:   if (STACK_REG_P (operands[1]))
        !           988:     {
        !           989:       rtx xops[3];
        !           990: 
        !           991:       if (! STACK_TOP_P (operands[1]))
        !           992:         abort ();
        !           993: 
        !           994:       xops[0] = AT_SP (SFmode);
        !           995:       xops[1] = GEN_INT (4);
        !           996:       xops[2] = stack_pointer_rtx;
        !           997: 
        !           998:       output_asm_insn (AS2 (sub%L2,%1,%2), xops);
        !           999: 
        !          1000:       if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG))
        !          1001:         output_asm_insn (AS1 (fstp%S0,%0), xops);
        !          1002:       else
        !          1003:         output_asm_insn (AS1 (fst%S0,%0), xops);
        !          1004:       RET;
        !          1005:     }
        !          1006:   return AS1 (push%L1,%1);
        !          1007: }"
        !          1008:   [(set_attr "fppc" "none")])
        !          1009: 
        !          1010: ;; Allow MEM-MEM moves before reload.  The reload class for such a
        !          1011: ;; move will be ALL_REGS.  PREFERRED_RELOAD_CLASS will narrow this to
        !          1012: ;; GENERAL_REGS.  For the purposes of regclass, prefer FLOAT_REGS.
        !          1013: 
        !          1014: (define_insn "movsf"
        !          1015:   [(set (match_operand:SF 0 "general_operand" "=*rfm,*rf,f,!*rm")
        !          1016:        (match_operand:SF 1 "general_operand" "*rf,*rfm,fG,fF"))]
        !          1017:   ""
        !          1018:   "*
        !          1019: {
        !          1020:   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
        !          1021: 
        !          1022:   /* First handle a `pop' insn or a `fld %st(0)' */
        !          1023: 
        !          1024:   if (STACK_TOP_P (operands[0]) && STACK_TOP_P (operands[1]))
        !          1025:     {
        !          1026:       if (stack_top_dies)
        !          1027:        return AS1 (fstp,%y0);
        !          1028:       else
        !          1029:         return AS1 (fld,%y0);
        !          1030:     }
        !          1031: 
        !          1032:   /* Handle a transfer between the 387 and a 386 register */
        !          1033: 
        !          1034:   if (STACK_TOP_P (operands[0]) && NON_STACK_REG_P (operands[1]))
        !          1035:     {
        !          1036:       output_op_from_reg (operands[1], AS1 (fld%z0,%y1));
        !          1037:       RET;
        !          1038:     }
        !          1039: 
        !          1040:   if (STACK_TOP_P (operands[1]) && NON_STACK_REG_P (operands[0]))
        !          1041:     {
        !          1042:       output_to_reg (operands[0], stack_top_dies);
        !          1043:       RET;
        !          1044:     }
        !          1045: 
        !          1046:   /* Handle other kinds of writes from the 387 */
        !          1047: 
        !          1048:   if (STACK_TOP_P (operands[1]))
        !          1049:     {
        !          1050:       if (stack_top_dies)
        !          1051:        return AS1 (fstp%z0,%y0);
        !          1052:       else
        !          1053:         return AS1 (fst%z0,%y0);
        !          1054:     }
        !          1055: 
        !          1056:   /* Handle other kinds of reads to the 387 */
        !          1057: 
        !          1058:   if (STACK_TOP_P (operands[0]) && GET_CODE (operands[1]) == CONST_DOUBLE)
        !          1059:     return (char *) output_move_const_single (operands);
        !          1060: 
        !          1061:   if (STACK_TOP_P (operands[0]))
        !          1062:     return AS1 (fld%z1,%y1);
        !          1063: 
        !          1064:   /* Handle all SFmode moves not involving the 387 */
        !          1065: 
        !          1066:   return (char *) singlemove_string (operands);
        !          1067: }"
        !          1068:   [(set_attr "fppc" "none")])
        !          1069: 
        !          1070: ;;should change to handle the memory operands[1] without doing df push..
        !          1071: (define_insn ""
        !          1072:   [(set (match_operand:DF 0 "push_operand" "=<,<")
        !          1073:        (match_operand:DF 1 "general_operand" "gF,f"))]
        !          1074:   ""
        !          1075:   "*
        !          1076: {
        !          1077:   if (STACK_REG_P (operands[1]))
        !          1078:     {
        !          1079:       rtx xops[3];
        !          1080: 
        !          1081:       xops[0] = AT_SP (SFmode);
        !          1082:       xops[1] = GEN_INT (8);
        !          1083:       xops[2] = stack_pointer_rtx;
        !          1084: 
        !          1085:       output_asm_insn (AS2 (sub%L2,%1,%2), xops);
        !          1086: 
        !          1087:       if (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG))
        !          1088:         output_asm_insn (AS1 (fstp%Q0,%0), xops);
        !          1089:       else
        !          1090:         output_asm_insn (AS1 (fst%Q0,%0), xops);
        !          1091: 
        !          1092:       RET;
        !          1093:     }
        !          1094:   else
        !          1095:     return (char *) output_move_double (operands);
        !          1096: }"
        !          1097:   [(set_attr "fppc" "none")])
        !          1098: 
        !          1099: (define_insn "swapdf"
        !          1100:   [(set (match_operand:DF 0 "register_operand" "f")
        !          1101:        (match_operand:DF 1 "register_operand" "f"))
        !          1102:    (set (match_dup 1)
        !          1103:        (match_dup 0))]
        !          1104:   ""
        !          1105:   "*
        !          1106: {
        !          1107:   if (STACK_TOP_P (operands[0]))
        !          1108:     return AS1 (fxch,%1);
        !          1109:   else
        !          1110:     return AS1 (fxch,%0);
        !          1111: }"
        !          1112:   [(set_attr "fppc" "none")])
        !          1113: 
        !          1114: ;; Allow MEM-MEM moves before reload.  The reload class for such a
        !          1115: ;; move will be ALL_REGS.  PREFERRED_RELOAD_CLASS will narrow this to
        !          1116: ;; GENERAL_REGS.  For the purposes of regclass, prefer FLOAT_REGS.
        !          1117: 
        !          1118: (define_insn "movdf"
        !          1119:   [(set (match_operand:DF 0 "general_operand" "=*rfm,*rf,f,!*rm")
        !          1120:        (match_operand:DF 1 "general_operand" "*rf,*rfm,fG,fF"))]
        !          1121:   ""
        !          1122:   "*
        !          1123: {
        !          1124:   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
        !          1125: 
        !          1126:   /* First handle a `pop' insn or a `fld %st(0)' */
        !          1127: 
        !          1128:   if (STACK_TOP_P (operands[0]) && STACK_TOP_P (operands[1]))
        !          1129:     {
        !          1130:       if (stack_top_dies)
        !          1131:        return AS1 (fstp,%y0);
        !          1132:       else
        !          1133:         return AS1 (fld,%y0);
        !          1134:     }
        !          1135: 
        !          1136:   /* Handle a transfer between the 387 and a 386 register */
        !          1137: 
        !          1138:   if (STACK_TOP_P (operands[0]) && NON_STACK_REG_P (operands[1]))
        !          1139:     {
        !          1140:       output_op_from_reg (operands[1], AS1 (fld%z0,%y1));
        !          1141:       RET;
        !          1142:     }
        !          1143: 
        !          1144:   if (STACK_TOP_P (operands[1]) && NON_STACK_REG_P (operands[0]))
        !          1145:     {
        !          1146:       output_to_reg (operands[0], stack_top_dies);
        !          1147:       RET;
        !          1148:     }
        !          1149: 
        !          1150:   /* Handle other kinds of writes from the 387 */
        !          1151: 
        !          1152:   if (STACK_TOP_P (operands[1]))
        !          1153:     {
        !          1154:       if (stack_top_dies)
        !          1155:        return AS1 (fstp%z0,%y0);
        !          1156:       else
        !          1157:         return AS1 (fst%z0,%y0);
        !          1158:     }
        !          1159: 
        !          1160:   /* Handle other kinds of reads to the 387 */
        !          1161: 
        !          1162:   if (STACK_TOP_P (operands[0]) && GET_CODE (operands[1]) == CONST_DOUBLE)
        !          1163:     return (char *) output_move_const_single (operands);
        !          1164: 
        !          1165:   if (STACK_TOP_P (operands[0]))
        !          1166:     return AS1 (fld%z1,%y1);
        !          1167: 
        !          1168:   /* Handle all DFmode moves not involving the 387 */
        !          1169: 
        !          1170:   return (char *) output_move_double (operands);
        !          1171: }"
        !          1172:   [(set_attr "fppc" "none")])
        !          1173: 
        !          1174: (define_insn ""
        !          1175:   [(set (match_operand:XF 0 "push_operand" "=<,<")
        !          1176:        (match_operand:XF 1 "general_operand" "gF,f"))]
        !          1177:   ""
        !          1178:   "*
        !          1179: {
        !          1180:   if (STACK_REG_P (operands[1]))
        !          1181:     {
        !          1182:       rtx xops[3];
        !          1183: 
        !          1184:       xops[0] = AT_SP (SFmode);
        !          1185:       xops[1] = GEN_INT (12);
        !          1186:       xops[2] = stack_pointer_rtx;
        !          1187: 
        !          1188:       output_asm_insn (AS2 (sub%L2,%1,%2), xops);
        !          1189:       output_asm_insn (AS1 (fstp%T0,%0), xops);
        !          1190:       if (! find_regno_note (insn, REG_DEAD, FIRST_STACK_REG))
        !          1191:        output_asm_insn (AS1 (fld%T0,%0), xops);
        !          1192: 
        !          1193:       RET;
        !          1194:     }
        !          1195:   else
        !          1196:     return (char *) output_move_double (operands);
        !          1197:  }")
        !          1198: 
        !          1199: (define_insn "swapxf"
        !          1200:   [(set (match_operand:XF 0 "register_operand" "f")
        !          1201:        (match_operand:XF 1 "register_operand" "f"))
        !          1202:    (set (match_dup 1)
        !          1203:        (match_dup 0))]
        !          1204:   ""
        !          1205:   "*
        !          1206: {
        !          1207:   if (STACK_TOP_P (operands[0]))
        !          1208:     return AS1 (fxch,%1);
        !          1209:   else
        !          1210:     return AS1 (fxch,%0);
        !          1211: }")
        !          1212: 
        !          1213: (define_insn "movxf"
        !          1214:   [(set (match_operand:XF 0 "general_operand" "=f,fm,!*rf,!*rm")
        !          1215:        (match_operand:XF 1 "general_operand" "fmG,f,*rfm,*rfF"))]
        !          1216: ;;  [(set (match_operand:XF 0 "general_operand" "=*rf,*rfm,f,!*rm")
        !          1217: ;;     (match_operand:XF 1 "general_operand" "*rfm,*rf,fG,fF"))]
        !          1218:   ""
        !          1219:   "*
        !          1220: {
        !          1221:   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
        !          1222: 
        !          1223:   /* First handle a `pop' insn or a `fld %st(0)' */
        !          1224: 
        !          1225:   if (STACK_TOP_P (operands[0]) && STACK_TOP_P (operands[1]))
        !          1226:     {
        !          1227:       if (stack_top_dies)
        !          1228:        return AS1 (fstp,%y0);
        !          1229:       else
        !          1230:         return AS1 (fld,%y0);
        !          1231:     }
        !          1232: 
        !          1233:   /* Handle a transfer between the 387 and a 386 register */
        !          1234: 
        !          1235:   if (STACK_TOP_P (operands[0]) && NON_STACK_REG_P (operands[1]))
        !          1236:     {
        !          1237:       output_op_from_reg (operands[1], AS1 (fld%z0,%y1));
        !          1238:       RET;
        !          1239:     }
        !          1240: 
        !          1241:   if (STACK_TOP_P (operands[1]) && NON_STACK_REG_P (operands[0]))
        !          1242:     {
        !          1243:       output_to_reg (operands[0], stack_top_dies);
        !          1244:       RET;
        !          1245:     }
        !          1246: 
        !          1247:   /* Handle other kinds of writes from the 387 */
        !          1248: 
        !          1249:   if (STACK_TOP_P (operands[1]))
        !          1250:     {
        !          1251:       output_asm_insn (AS1 (fstp%z0,%y0), operands);
        !          1252:       if (! stack_top_dies)
        !          1253:        return AS1 (fld%z0,%y0);
        !          1254: 
        !          1255:       RET;
        !          1256:     }
        !          1257: 
        !          1258:   /* Handle other kinds of reads to the 387 */
        !          1259: 
        !          1260:   if (STACK_TOP_P (operands[0]) && GET_CODE (operands[1]) == CONST_DOUBLE)
        !          1261:     return (char *) output_move_const_single (operands);
        !          1262: 
        !          1263:   if (STACK_TOP_P (operands[0]))
        !          1264:        return AS1 (fld%z1,%y1);
        !          1265: 
        !          1266:   /* Handle all XFmode moves not involving the 387 */
        !          1267: 
        !          1268:   return (char *) output_move_double (operands);
        !          1269: }")
        !          1270: 
        !          1271: (define_insn ""
        !          1272:   [(set (match_operand:DI 0 "push_operand" "=<")
        !          1273:        (match_operand:DI 1 "general_operand" "roiF"))]
        !          1274:   ""
        !          1275:   "*
        !          1276: {
        !          1277:   return (char *) output_move_double (operands);
        !          1278: }")
        !          1279: 
        !          1280: (define_insn "movdi"
        !          1281:   [(set (match_operand:DI 0 "general_operand" "=r,rm")
        !          1282:        (match_operand:DI 1 "general_operand" "m,riF"))]
        !          1283:   ""
        !          1284:   "*
        !          1285: {
        !          1286:   return (char *) output_move_double (operands);
        !          1287: }")
        !          1288: 
        !          1289: ;;- conversion instructions
        !          1290: ;;- NONE
        !          1291: 
        !          1292: ;;- zero extension instructions
        !          1293: ;; See comments by `andsi' for when andl is faster than movzx.
        !          1294: 
        !          1295: (define_insn "zero_extendhisi2"
        !          1296:   [(set (match_operand:SI 0 "general_operand" "=r")
        !          1297:        (zero_extend:SI
        !          1298:         (match_operand:HI 1 "nonimmediate_operand" "rm")))]
        !          1299:   ""
        !          1300:   "*
        !          1301: {
        !          1302:   if ((TARGET_486 || REGNO (operands[0]) == 0)
        !          1303:       && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1]))
        !          1304:     {
        !          1305:       rtx xops[2];
        !          1306:       xops[0] = operands[0];
        !          1307:       xops[1] = GEN_INT (0xffff);
        !          1308:       output_asm_insn (AS2 (and%L0,%1,%k0), xops);
        !          1309:       RET;
        !          1310:     }
        !          1311: 
        !          1312: #ifdef INTEL_SYNTAX
        !          1313:   return AS2 (movzx,%1,%0);
        !          1314: #else
        !          1315:   return AS2 (movz%W0%L0,%1,%0);
        !          1316: #endif
        !          1317: }")
        !          1318: 
        !          1319: (define_insn "zero_extendqihi2"
        !          1320:   [(set (match_operand:HI 0 "general_operand" "=r")
        !          1321:        (zero_extend:HI
        !          1322:         (match_operand:QI 1 "nonimmediate_operand" "qm")))]
        !          1323:   ""
        !          1324:   "*
        !          1325: {
        !          1326:   if ((TARGET_486 || REGNO (operands[0]) == 0)
        !          1327:       && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1]))
        !          1328:     {
        !          1329:       rtx xops[2];
        !          1330:       xops[0] = operands[0];
        !          1331:       xops[1] = GEN_INT (0xff);
        !          1332:       output_asm_insn (AS2 (and%L0,%1,%k0), xops);
        !          1333:       RET;
        !          1334:     }
        !          1335: 
        !          1336: #ifdef INTEL_SYNTAX
        !          1337:   return AS2 (movzx,%1,%0);
        !          1338: #else
        !          1339:   return AS2 (movz%B0%W0,%1,%0);
        !          1340: #endif
        !          1341: }")
        !          1342: 
        !          1343: (define_insn "zero_extendqisi2"
        !          1344:   [(set (match_operand:SI 0 "general_operand" "=r")
        !          1345:        (zero_extend:SI
        !          1346:         (match_operand:QI 1 "nonimmediate_operand" "qm")))]
        !          1347:   ""
        !          1348:   "*
        !          1349: {
        !          1350:   if ((TARGET_486 || REGNO (operands[0]) == 0)
        !          1351:       && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1]))
        !          1352:     {
        !          1353:       rtx xops[2];
        !          1354:       xops[0] = operands[0];
        !          1355:       xops[1] = GEN_INT (0xff);
        !          1356:       output_asm_insn (AS2 (and%L0,%1,%k0), xops);
        !          1357:       RET;
        !          1358:     }
        !          1359: 
        !          1360: #ifdef INTEL_SYNTAX
        !          1361:   return AS2 (movzx,%1,%0);
        !          1362: #else
        !          1363:   return AS2 (movz%B0%L0,%1,%0);
        !          1364: #endif
        !          1365: }")
        !          1366: 
        !          1367: (define_insn "zero_extendsidi2"
        !          1368:   [(set (match_operand:DI 0 "register_operand" "=r")
        !          1369:        (zero_extend:DI
        !          1370:         (match_operand:SI 1 "register_operand" "0")))]
        !          1371:   ""
        !          1372:   "*
        !          1373: {
        !          1374:   operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
        !          1375:   return AS2 (xor%L0,%0,%0);
        !          1376: }")
        !          1377: 
        !          1378: ;;- sign extension instructions
        !          1379: 
        !          1380: (define_insn "extendsidi2"
        !          1381:   [(set (match_operand:DI 0 "register_operand" "=r")
        !          1382:        (sign_extend:DI
        !          1383:         (match_operand:SI 1 "register_operand" "0")))]
        !          1384:   ""
        !          1385:   "*
        !          1386: {
        !          1387:   if (REGNO (operands[0]) == 0)
        !          1388:     {
        !          1389:       /* This used to be cwtl, but that extends HI to SI somehow.  */
        !          1390: #ifdef INTEL_SYNTAX
        !          1391:       return \"cdq\";
        !          1392: #else
        !          1393:       return \"cltd\";
        !          1394: #endif
        !          1395:     }
        !          1396: 
        !          1397:   operands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
        !          1398:   output_asm_insn (AS2 (mov%L0,%0,%1), operands);
        !          1399: 
        !          1400:   operands[0] = GEN_INT (31);
        !          1401:   return AS2 (sar%L1,%0,%1);
        !          1402: }")
        !          1403: 
        !          1404: ;; Note that the i386 programmers' manual says that the opcodes
        !          1405: ;; are named movsx..., but the assembler on Unix does not accept that.
        !          1406: ;; We use what the Unix assembler expects.
        !          1407: 
        !          1408: (define_insn "extendhisi2"
        !          1409:   [(set (match_operand:SI 0 "general_operand" "=r")
        !          1410:        (sign_extend:SI
        !          1411:         (match_operand:HI 1 "nonimmediate_operand" "rm")))]
        !          1412:   ""
        !          1413:   "*
        !          1414: {
        !          1415:   if (REGNO (operands[0]) == 0
        !          1416:       && REG_P (operands[1]) && REGNO (operands[1]) == 0)
        !          1417: #ifdef INTEL_SYNTAX
        !          1418:     return \"cwde\";
        !          1419: #else
        !          1420:     return \"cwtl\";
        !          1421: #endif
        !          1422: 
        !          1423: #ifdef INTEL_SYNTAX
        !          1424:   return AS2 (movsx,%1,%0);
        !          1425: #else
        !          1426:   return AS2 (movs%W0%L0,%1,%0);
        !          1427: #endif
        !          1428: }")
        !          1429: 
        !          1430: (define_insn "extendqihi2"
        !          1431:   [(set (match_operand:HI 0 "general_operand" "=r")
        !          1432:        (sign_extend:HI
        !          1433:         (match_operand:QI 1 "nonimmediate_operand" "qm")))]
        !          1434:   ""
        !          1435:   "*
        !          1436: {
        !          1437:   if (REGNO (operands[0]) == 0
        !          1438:       && REG_P (operands[1]) && REGNO (operands[1]) == 0)
        !          1439:     return \"cbtw\";
        !          1440: 
        !          1441: #ifdef INTEL_SYNTAX
        !          1442:   return AS2 (movsx,%1,%0);
        !          1443: #else
        !          1444:   return AS2 (movs%B0%W0,%1,%0);
        !          1445: #endif
        !          1446: }")
        !          1447: 
        !          1448: (define_insn "extendqisi2"
        !          1449:   [(set (match_operand:SI 0 "general_operand" "=r")
        !          1450:        (sign_extend:SI
        !          1451:         (match_operand:QI 1 "nonimmediate_operand" "qm")))]
        !          1452:   ""
        !          1453:   "*
        !          1454: {
        !          1455: #ifdef INTEL_SYNTAX
        !          1456:   return AS2 (movsx,%1,%0);
        !          1457: #else
        !          1458:   return AS2 (movs%B0%L0,%1,%0);
        !          1459: #endif
        !          1460: }")
        !          1461: 
        !          1462: ;; Conversions between float and double.
        !          1463: 
        !          1464: (define_insn "extendsfdf2"
        !          1465:   [(set (match_operand:DF 0 "general_operand" "=fm,f")
        !          1466:        (float_extend:DF
        !          1467:         (match_operand:SF 1 "general_operand" "f,fm")))]
        !          1468:   "TARGET_80387"
        !          1469:   "*
        !          1470: {
        !          1471:   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
        !          1472: 
        !          1473:   if (NON_STACK_REG_P (operands[1]))
        !          1474:     {
        !          1475:       output_op_from_reg (operands[1], AS1 (fld%z0,%y1));
        !          1476:       RET;
        !          1477:     }
        !          1478: 
        !          1479:   if (NON_STACK_REG_P (operands[0]))
        !          1480:     {
        !          1481:       output_to_reg (operands[0], stack_top_dies);
        !          1482:       RET;
        !          1483:     }
        !          1484: 
        !          1485:   if (STACK_TOP_P (operands[0]))
        !          1486:     return AS1 (fld%z1,%y1);
        !          1487: 
        !          1488:   if (GET_CODE (operands[0]) == MEM)
        !          1489:     {
        !          1490:       if (stack_top_dies)
        !          1491:        return AS1 (fstp%z0,%y0);
        !          1492:       else
        !          1493:         return AS1 (fst%z0,%y0);
        !          1494:     }
        !          1495: 
        !          1496:   abort ();
        !          1497: }")
        !          1498: 
        !          1499: (define_insn "extenddfxf2"
        !          1500:   [(set (match_operand:XF 0 "general_operand" "=fm,f,f,!*r")
        !          1501:        (float_extend:XF
        !          1502:         (match_operand:DF 1 "general_operand" "f,fm,!*r,f")))]
        !          1503:   "TARGET_80387"
        !          1504:   "*
        !          1505: {
        !          1506:   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
        !          1507: 
        !          1508:   if (NON_STACK_REG_P (operands[1]))
        !          1509:     {
        !          1510:       output_op_from_reg (operands[1], AS1 (fld%z0,%y1));
        !          1511:       RET;
        !          1512:     }
        !          1513: 
        !          1514:   if (NON_STACK_REG_P (operands[0]))
        !          1515:     {
        !          1516:       output_to_reg (operands[0], stack_top_dies);
        !          1517:       RET;
        !          1518:     }
        !          1519: 
        !          1520:   if (STACK_TOP_P (operands[0]))
        !          1521:     return AS1 (fld%z1,%y1);
        !          1522: 
        !          1523:   if (GET_CODE (operands[0]) == MEM)
        !          1524:     {
        !          1525:       output_asm_insn (AS1 (fstp%z0,%y0), operands);
        !          1526:       if (! stack_top_dies)
        !          1527:        return AS1 (fld%z0,%y0);
        !          1528:       RET;
        !          1529:     }
        !          1530: 
        !          1531:   abort ();
        !          1532: }")
        !          1533: 
        !          1534: (define_insn "extendsfxf2"
        !          1535:   [(set (match_operand:XF 0 "general_operand" "=fm,f,f,!*r")
        !          1536:        (float_extend:XF
        !          1537:         (match_operand:SF 1 "general_operand" "f,fm,!*r,f")))]
        !          1538:   "TARGET_80387"
        !          1539:   "*
        !          1540: {
        !          1541:   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
        !          1542: 
        !          1543:   if (NON_STACK_REG_P (operands[1]))
        !          1544:     {
        !          1545:       output_op_from_reg (operands[1], AS1 (fld%z0,%y1));
        !          1546:       RET;
        !          1547:     }
        !          1548: 
        !          1549:   if (NON_STACK_REG_P (operands[0]))
        !          1550:     {
        !          1551:       output_to_reg (operands[0], stack_top_dies);
        !          1552:       RET;
        !          1553:     }
        !          1554: 
        !          1555:   if (STACK_TOP_P (operands[0]))
        !          1556:     return AS1 (fld%z1,%y1);
        !          1557: 
        !          1558:   if (GET_CODE (operands[0]) == MEM)
        !          1559:     {
        !          1560:       output_asm_insn (AS1 (fstp%z0,%y0), operands);
        !          1561:       if (! stack_top_dies)
        !          1562:        return AS1 (fld%z0,%y0);
        !          1563:       RET;
        !          1564:     }
        !          1565: 
        !          1566:   abort ();
        !          1567: }")
        !          1568: 
        !          1569: (define_expand "truncdfsf2"
        !          1570:   [(parallel [(set (match_operand:SF 0 "nonimmediate_operand" "")
        !          1571:                   (float_truncate:SF
        !          1572:                    (match_operand:DF 1 "register_operand" "")))
        !          1573:              (clobber (match_dup 2))])]
        !          1574:   "TARGET_80387"
        !          1575:   "
        !          1576: {
        !          1577:   operands[2] = (rtx) assign_386_stack_local (SFmode, 0);
        !          1578: }")
        !          1579: 
        !          1580: ;; This cannot output into an f-reg because there is no way to be sure
        !          1581: ;; of truncating in that case.  Otherwise this is just like a simple move
        !          1582: ;; insn.  So we pretend we can output to a reg in order to get better
        !          1583: ;; register preferencing, but we really use a stack slot.
        !          1584: 
        !          1585: (define_insn ""
        !          1586:   [(set (match_operand:SF 0 "nonimmediate_operand" "=f,m")
        !          1587:        (float_truncate:SF
        !          1588:         (match_operand:DF 1 "register_operand" "0,f")))
        !          1589:    (clobber (match_operand:SF 2 "memory_operand" "m,m"))]
        !          1590:   "TARGET_80387"
        !          1591:   "*
        !          1592: {
        !          1593:   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
        !          1594: 
        !          1595:   if (GET_CODE (operands[0]) == MEM)
        !          1596:     {
        !          1597:       if (stack_top_dies)
        !          1598:        return AS1 (fstp%z0,%0);
        !          1599:       else
        !          1600:         return AS1 (fst%z0,%0);
        !          1601:     }
        !          1602:   else if (STACK_TOP_P (operands[0]))
        !          1603:     {
        !          1604:       output_asm_insn (AS1 (fstp%z2,%y2), operands);
        !          1605:       return AS1 (fld%z2,%y2);
        !          1606:     }
        !          1607:   else
        !          1608:     abort ();
        !          1609: }" 
        !          1610:   [(set_attr "fppc" "none")])
        !          1611: 
        !          1612: (define_insn "truncxfsf2"
        !          1613:   [(set (match_operand:SF 0 "general_operand" "=m,!*r")
        !          1614:        (float_truncate:SF
        !          1615:         (match_operand:XF 1 "register_operand" "f,f")))]
        !          1616:   "TARGET_80387"
        !          1617:   "*
        !          1618: {
        !          1619:   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
        !          1620: 
        !          1621:   if (NON_STACK_REG_P (operands[0]))
        !          1622:     {
        !          1623:       if (stack_top_dies == 0)
        !          1624:        {
        !          1625:          output_asm_insn (AS1 (fld,%y1), operands);
        !          1626:          stack_top_dies = 1;
        !          1627:        }
        !          1628:       output_to_reg (operands[0], stack_top_dies);
        !          1629:       RET;
        !          1630:     }
        !          1631:   else if (GET_CODE (operands[0]) == MEM)
        !          1632:     {
        !          1633:       if (stack_top_dies)
        !          1634:        return AS1 (fstp%z0,%0);
        !          1635:       else
        !          1636:        {
        !          1637:          output_asm_insn (AS1 (fld,%y1), operands);
        !          1638:          return AS1 (fstp%z0,%0);
        !          1639:        }
        !          1640:     }
        !          1641:   else
        !          1642:     abort ();
        !          1643: }"
        !          1644:   [(set_attr "fppc" "none")])
        !          1645: 
        !          1646: (define_insn "truncxfdf2"
        !          1647:   [(set (match_operand:DF 0 "general_operand" "=m,!*r")
        !          1648:        (float_truncate:DF
        !          1649:         (match_operand:XF 1 "register_operand" "f,f")))]
        !          1650:   "TARGET_80387"
        !          1651:   "*
        !          1652: {
        !          1653:   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
        !          1654: 
        !          1655:   if (NON_STACK_REG_P (operands[0]))
        !          1656:     {
        !          1657:       if (stack_top_dies == 0)
        !          1658:        {
        !          1659:          output_asm_insn (AS1 (fld,%y1), operands);
        !          1660:          stack_top_dies = 1;
        !          1661:        }
        !          1662:       output_to_reg (operands[0], stack_top_dies);
        !          1663:       RET;
        !          1664:     }
        !          1665:   else if (GET_CODE (operands[0]) == MEM)
        !          1666:     {
        !          1667:       if (stack_top_dies)
        !          1668:        return AS1 (fstp%z0,%0);
        !          1669:       else
        !          1670:        {
        !          1671:          output_asm_insn (AS1 (fld,%y1), operands);
        !          1672:          return AS1 (fstp%z0,%0);
        !          1673:        }
        !          1674:     }
        !          1675:   else
        !          1676:     abort ();
        !          1677: }"
        !          1678:   [(set_attr "fppc" "none")])
        !          1679: 
        !          1680: 
        !          1681: ;; The 387 requires that the stack top dies after converting to DImode.
        !          1682: 
        !          1683: ;; Represent an unsigned conversion from SImode to MODE_FLOAT by first
        !          1684: ;; doing a signed conversion to DImode, and then taking just the low
        !          1685: ;; part.
        !          1686: 
        !          1687: (define_expand "fixuns_truncxfsi2"
        !          1688:   [(set (match_dup 4)
        !          1689:        (match_operand:XF 1 "register_operand" ""))
        !          1690:    (parallel [(set (match_dup 2)
        !          1691:                   (fix:DI (fix:XF (match_dup 4))))
        !          1692:              (clobber (match_dup 4))
        !          1693:              (clobber (match_dup 5))
        !          1694:              (clobber (match_dup 6))
        !          1695:              (clobber (match_scratch:SI 7 ""))])
        !          1696:    (set (match_operand:SI 0 "general_operand" "")
        !          1697:        (match_dup 3))]
        !          1698:   "TARGET_80387"
        !          1699:   "
        !          1700: {
        !          1701:   operands[2] = gen_reg_rtx (DImode);
        !          1702:   operands[3] = gen_lowpart (SImode, operands[2]);
        !          1703:   operands[4] = gen_reg_rtx (XFmode);
        !          1704:   operands[5] = (rtx) assign_386_stack_local (SImode, 0);
        !          1705:   operands[6] = (rtx) assign_386_stack_local (SImode, 1);
        !          1706: }")
        !          1707: 
        !          1708: (define_expand "fixuns_truncdfsi2"
        !          1709:   [(set (match_dup 4)
        !          1710:        (match_operand:DF 1 "register_operand" ""))
        !          1711:    (parallel [(set (match_dup 2)
        !          1712:                   (fix:DI (fix:DF (match_dup 4))))
        !          1713:              (clobber (match_dup 4))
        !          1714:              (clobber (match_dup 5))
        !          1715:              (clobber (match_dup 6))
        !          1716:              (clobber (match_scratch:SI 7 ""))])
        !          1717:    (set (match_operand:SI 0 "general_operand" "")
        !          1718:        (match_dup 3))]
        !          1719:   "TARGET_80387"
        !          1720:   "
        !          1721: {
        !          1722:   operands[2] = gen_reg_rtx (DImode);
        !          1723:   operands[3] = gen_lowpart (SImode, operands[2]);
        !          1724:   operands[4] = gen_reg_rtx (DFmode);
        !          1725:   operands[5] = (rtx) assign_386_stack_local (SImode, 0);
        !          1726:   operands[6] = (rtx) assign_386_stack_local (SImode, 1);
        !          1727: }")
        !          1728: 
        !          1729: (define_expand "fixuns_truncsfsi2"
        !          1730:   [(set (match_dup 4)
        !          1731:        (match_operand:SF 1 "register_operand" ""))
        !          1732:    (parallel [(set (match_dup 2)
        !          1733:                   (fix:DI (fix:SF (match_dup 4))))
        !          1734:              (clobber (match_dup 4))
        !          1735:              (clobber (match_dup 5))
        !          1736:              (clobber (match_dup 6))
        !          1737:              (clobber (match_scratch:SI 7 ""))])
        !          1738:    (set (match_operand:SI 0 "general_operand" "")
        !          1739:        (match_dup 3))]
        !          1740:   "TARGET_80387"
        !          1741:   "
        !          1742: {
        !          1743:   operands[2] = gen_reg_rtx (DImode);
        !          1744:   operands[3] = gen_lowpart (SImode, operands[2]);
        !          1745:   operands[4] = gen_reg_rtx (SFmode);
        !          1746:   operands[5] = (rtx) assign_386_stack_local (SImode, 0);
        !          1747:   operands[6] = (rtx) assign_386_stack_local (SImode, 1);
        !          1748: }")
        !          1749: 
        !          1750: ;; Signed conversion to DImode.
        !          1751: 
        !          1752: (define_expand "fix_truncxfdi2"
        !          1753:   [(set (match_dup 2)
        !          1754:        (match_operand:XF 1 "register_operand" ""))
        !          1755:    (parallel [(set (match_operand:DI 0 "general_operand" "")
        !          1756:                   (fix:DI (fix:XF (match_dup 2))))
        !          1757:              (clobber (match_dup 2))
        !          1758:              (clobber (match_dup 3))
        !          1759:              (clobber (match_dup 4))
        !          1760:              (clobber (match_scratch:SI 5 ""))])]
        !          1761:   "TARGET_80387"
        !          1762:   "
        !          1763: {
        !          1764:   operands[1] = copy_to_mode_reg (XFmode, operands[1]);
        !          1765:   operands[2] = gen_reg_rtx (XFmode);
        !          1766:   operands[3] = (rtx) assign_386_stack_local (SImode, 0);
        !          1767:   operands[4] = (rtx) assign_386_stack_local (SImode, 1);
        !          1768: }")
        !          1769: 
        !          1770: (define_expand "fix_truncdfdi2"
        !          1771:   [(set (match_dup 2)
        !          1772:        (match_operand:DF 1 "register_operand" ""))
        !          1773:    (parallel [(set (match_operand:DI 0 "general_operand" "")
        !          1774:                   (fix:DI (fix:DF (match_dup 2))))
        !          1775:              (clobber (match_dup 2))
        !          1776:              (clobber (match_dup 3))
        !          1777:              (clobber (match_dup 4))
        !          1778:              (clobber (match_scratch:SI 5 ""))])]
        !          1779:   "TARGET_80387"
        !          1780:   "
        !          1781: {
        !          1782:   operands[1] = copy_to_mode_reg (DFmode, operands[1]);
        !          1783:   operands[2] = gen_reg_rtx (DFmode);
        !          1784:   operands[3] = (rtx) assign_386_stack_local (SImode, 0);
        !          1785:   operands[4] = (rtx) assign_386_stack_local (SImode, 1);
        !          1786: }")
        !          1787: 
        !          1788: (define_expand "fix_truncsfdi2"
        !          1789:   [(set (match_dup 2)
        !          1790:        (match_operand:SF 1 "register_operand" ""))
        !          1791:    (parallel [(set (match_operand:DI 0 "general_operand" "")
        !          1792:                   (fix:DI (fix:SF (match_dup 2))))
        !          1793:              (clobber (match_dup 2))
        !          1794:              (clobber (match_dup 3))
        !          1795:              (clobber (match_dup 4))
        !          1796:              (clobber (match_scratch:SI 5 ""))])]
        !          1797:   "TARGET_80387"
        !          1798:   "
        !          1799: {
        !          1800:   operands[1] = copy_to_mode_reg (SFmode, operands[1]);
        !          1801:   operands[2] = gen_reg_rtx (SFmode);
        !          1802:   operands[3] = (rtx) assign_386_stack_local (SImode, 0);
        !          1803:   operands[4] = (rtx) assign_386_stack_local (SImode, 1);
        !          1804: }")
        !          1805: 
        !          1806: ;; These match a signed conversion of either DFmode or SFmode to DImode.
        !          1807: 
        !          1808: (define_insn ""
        !          1809:   [(set (match_operand:DI 0 "general_operand" "=rm")
        !          1810:        (fix:DI (fix:XF (match_operand:XF 1 "register_operand" "f"))))
        !          1811:    (clobber (match_dup 1))
        !          1812:    (clobber (match_operand:SI 2 "memory_operand" "m"))
        !          1813:    (clobber (match_operand:SI 3 "memory_operand" "m"))
        !          1814:    (clobber (match_scratch:SI 4 "=&q"))]
        !          1815:   "TARGET_80387"
        !          1816:   "* return (char *) output_fix_trunc (insn, operands);")
        !          1817: 
        !          1818: (define_insn ""
        !          1819:   [(set (match_operand:DI 0 "general_operand" "=rm")
        !          1820:        (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
        !          1821:    (clobber (match_dup 1))
        !          1822:    (clobber (match_operand:SI 2 "memory_operand" "m"))
        !          1823:    (clobber (match_operand:SI 3 "memory_operand" "m"))
        !          1824:    (clobber (match_scratch:SI 4 "=&q"))]
        !          1825:   "TARGET_80387"
        !          1826:   "* return (char *) output_fix_trunc (insn, operands);")
        !          1827: 
        !          1828: (define_insn ""
        !          1829:   [(set (match_operand:DI 0 "general_operand" "=rm")
        !          1830:        (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "f"))))
        !          1831:    (clobber (match_dup 1))
        !          1832:    (clobber (match_operand:SI 2 "memory_operand" "m"))
        !          1833:    (clobber (match_operand:SI 3 "memory_operand" "m"))
        !          1834:    (clobber (match_scratch:SI 4 "=&q"))]
        !          1835:   "TARGET_80387"
        !          1836:   "* return (char *) output_fix_trunc (insn, operands);")
        !          1837: 
        !          1838: ;; Signed MODE_FLOAT conversion to SImode.
        !          1839: 
        !          1840: (define_expand "fix_truncxfsi2"
        !          1841:   [(parallel [(set (match_operand:SI 0 "general_operand" "")
        !          1842:                   (fix:SI
        !          1843:                    (fix:XF (match_operand:XF 1 "register_operand" ""))))
        !          1844:              (clobber (match_dup 2))
        !          1845:              (clobber (match_dup 3))
        !          1846:              (clobber (match_scratch:SI 4 ""))])]
        !          1847:   "TARGET_80387"
        !          1848:   "
        !          1849: {
        !          1850:   operands[2] = (rtx) assign_386_stack_local (SImode, 0);
        !          1851:   operands[3] = (rtx) assign_386_stack_local (SImode, 1);
        !          1852: }")
        !          1853: 
        !          1854: (define_expand "fix_truncdfsi2"
        !          1855:   [(parallel [(set (match_operand:SI 0 "general_operand" "")
        !          1856:                   (fix:SI
        !          1857:                    (fix:DF (match_operand:DF 1 "register_operand" ""))))
        !          1858:              (clobber (match_dup 2))
        !          1859:              (clobber (match_dup 3))
        !          1860:              (clobber (match_scratch:SI 4 ""))])]
        !          1861:   "TARGET_80387"
        !          1862:   "
        !          1863: {
        !          1864:   operands[2] = (rtx) assign_386_stack_local (SImode, 0);
        !          1865:   operands[3] = (rtx) assign_386_stack_local (SImode, 1);
        !          1866: }")
        !          1867: 
        !          1868: (define_expand "fix_truncsfsi2"
        !          1869:   [(parallel [(set (match_operand:SI 0 "general_operand" "")
        !          1870:                   (fix:SI
        !          1871:                    (fix:SF (match_operand:SF 1 "register_operand" ""))))
        !          1872:              (clobber (match_dup 2))
        !          1873:              (clobber (match_dup 3))
        !          1874:              (clobber (match_scratch:SI 4 ""))])]
        !          1875:   "TARGET_80387"
        !          1876:   "
        !          1877: {
        !          1878:   operands[2] = (rtx) assign_386_stack_local (SImode, 0);
        !          1879:   operands[3] = (rtx) assign_386_stack_local (SImode, 1);
        !          1880: }")
        !          1881: 
        !          1882: (define_insn ""
        !          1883:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          1884:        (fix:SI (fix:XF (match_operand:XF 1 "register_operand" "f"))))
        !          1885:    (clobber (match_operand:SI 2 "memory_operand" "m"))
        !          1886:    (clobber (match_operand:SI 3 "memory_operand" "m"))
        !          1887:    (clobber (match_scratch:SI 4 "=&q"))]
        !          1888:   "TARGET_80387"
        !          1889:   "* return (char *) output_fix_trunc (insn, operands);")
        !          1890: 
        !          1891: (define_insn ""
        !          1892:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          1893:        (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
        !          1894:    (clobber (match_operand:SI 2 "memory_operand" "m"))
        !          1895:    (clobber (match_operand:SI 3 "memory_operand" "m"))
        !          1896:    (clobber (match_scratch:SI 4 "=&q"))]
        !          1897:   "TARGET_80387"
        !          1898:   "* return (char *) output_fix_trunc (insn, operands);")
        !          1899: 
        !          1900: (define_insn ""
        !          1901:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          1902:        (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "f"))))
        !          1903:    (clobber (match_operand:SI 2 "memory_operand" "m"))
        !          1904:    (clobber (match_operand:SI 3 "memory_operand" "m"))
        !          1905:    (clobber (match_scratch:SI 4 "=&q"))]
        !          1906:   "TARGET_80387"
        !          1907:   "* return (char *) output_fix_trunc (insn, operands);")
        !          1908: 
        !          1909: ;; Conversion between fixed point and floating point.
        !          1910: ;; The actual pattern that matches these is at the end of this file.
        !          1911: 
        !          1912: ;; ??? Possibly represent floatunssidf2 here in gcc2.
        !          1913: 
        !          1914: (define_expand "floatsisf2"
        !          1915:   [(set (match_operand:SF 0 "register_operand" "")
        !          1916:        (float:SF (match_operand:SI 1 "nonimmediate_operand" "")))]
        !          1917:   "TARGET_80387"
        !          1918:   "")
        !          1919: 
        !          1920: (define_expand "floatdisf2"
        !          1921:   [(set (match_operand:SF 0 "register_operand" "")
        !          1922:        (float:SF (match_operand:DI 1 "nonimmediate_operand" "")))]
        !          1923:   "TARGET_80387"
        !          1924:   "")
        !          1925: 
        !          1926: (define_expand "floatsidf2"
        !          1927:   [(set (match_operand:DF 0 "register_operand" "")
        !          1928:        (float:DF (match_operand:SI 1 "nonimmediate_operand" "")))]
        !          1929:   "TARGET_80387"
        !          1930:   "")
        !          1931: 
        !          1932: (define_expand "floatdidf2"
        !          1933:   [(set (match_operand:DF 0 "register_operand" "")
        !          1934:        (float:DF (match_operand:DI 1 "nonimmediate_operand" "")))]
        !          1935:   "TARGET_80387"
        !          1936:   "")
        !          1937: 
        !          1938: (define_expand "floatsixf2"
        !          1939:   [(set (match_operand:XF 0 "register_operand" "")
        !          1940:        (float:XF (match_operand:SI 1 "nonimmediate_operand" "")))]
        !          1941:   "TARGET_80387"
        !          1942:   "")
        !          1943: 
        !          1944: (define_expand "floatdixf2"
        !          1945:   [(set (match_operand:XF 0 "register_operand" "")
        !          1946:        (float:XF (match_operand:DI 1 "nonimmediate_operand" "")))]
        !          1947:   "TARGET_80387"
        !          1948:   "")
        !          1949: 
        !          1950: ;; This will convert from SImode or DImode to MODE_FLOAT.
        !          1951: 
        !          1952: (define_insn ""
        !          1953:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          1954:        (float:XF (match_operand:DI 1 "general_operand" "rm")))]
        !          1955:   "TARGET_80387"
        !          1956:   "*
        !          1957: {
        !          1958:   if (NON_STACK_REG_P (operands[1]))
        !          1959:     {
        !          1960:       output_op_from_reg (operands[1], AS1 (fild%z0,%1));
        !          1961:       RET;
        !          1962:     }
        !          1963:   else if (GET_CODE (operands[1]) == MEM)
        !          1964:     return AS1 (fild%z1,%1);
        !          1965:   else
        !          1966:     abort ();
        !          1967: }")
        !          1968: 
        !          1969: (define_insn ""
        !          1970:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          1971:        (float:DF (match_operand:DI 1 "nonimmediate_operand" "rm")))]
        !          1972:   "TARGET_80387"
        !          1973:   "*
        !          1974: {
        !          1975:   if (NON_STACK_REG_P (operands[1]))
        !          1976:     {
        !          1977:       output_op_from_reg (operands[1], AS1 (fild%z0,%1));
        !          1978:       RET;
        !          1979:     }
        !          1980:   else if (GET_CODE (operands[1]) == MEM)
        !          1981:     return AS1 (fild%z1,%1);
        !          1982:   else
        !          1983:     abort ();
        !          1984: }")
        !          1985: 
        !          1986: (define_insn ""
        !          1987:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          1988:        (float:SF (match_operand:DI 1 "nonimmediate_operand" "rm")))]
        !          1989:   "TARGET_80387"
        !          1990:   "*
        !          1991: {
        !          1992:   if (NON_STACK_REG_P (operands[1]))
        !          1993:     {
        !          1994:       output_op_from_reg (operands[1], AS1 (fild%z0,%1));
        !          1995:       RET;
        !          1996:     }
        !          1997:   else if (GET_CODE (operands[1]) == MEM)
        !          1998:     return AS1 (fild%z1,%1);
        !          1999:   else
        !          2000:     abort ();
        !          2001: }")
        !          2002: 
        !          2003: (define_insn ""
        !          2004:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          2005:        (float:DF (match_operand:SI 1 "nonimmediate_operand" "rm")))]
        !          2006:   "TARGET_80387"
        !          2007:   "*
        !          2008: {
        !          2009:   if (NON_STACK_REG_P (operands[1]))
        !          2010:     {
        !          2011:       output_op_from_reg (operands[1], AS1 (fild%z0,%1));
        !          2012:       RET;
        !          2013:     }
        !          2014:   else if (GET_CODE (operands[1]) == MEM)
        !          2015:     return AS1 (fild%z1,%1);
        !          2016:   else
        !          2017:     abort ();
        !          2018: }")
        !          2019: 
        !          2020: (define_insn ""
        !          2021:   [(set (match_operand:XF 0 "register_operand" "=f,f")
        !          2022:        (float:XF (match_operand:SI 1 "general_operand" "m,!*r")))]
        !          2023:   "TARGET_80387"
        !          2024:   "*
        !          2025: {
        !          2026:   if (NON_STACK_REG_P (operands[1]))
        !          2027:     {
        !          2028:       output_op_from_reg (operands[1], AS1 (fild%z0,%1));
        !          2029:       RET;
        !          2030:     }
        !          2031:   else if (GET_CODE (operands[1]) == MEM)
        !          2032:     return AS1 (fild%z1,%1);
        !          2033:   else
        !          2034:     abort ();
        !          2035: }")
        !          2036: 
        !          2037: (define_insn ""
        !          2038:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          2039:        (float:SF (match_operand:SI 1 "nonimmediate_operand" "rm")))]
        !          2040:   "TARGET_80387"
        !          2041:   "*
        !          2042: {
        !          2043:   if (NON_STACK_REG_P (operands[1]))
        !          2044:     {
        !          2045:       output_op_from_reg (operands[1], AS1 (fild%z0,%1));
        !          2046:       RET;
        !          2047:     }
        !          2048:   else if (GET_CODE (operands[1]) == MEM)
        !          2049:     return AS1 (fild%z1,%1);
        !          2050:   else
        !          2051:     abort ();
        !          2052: }")
        !          2053: 
        !          2054: ;;- add instructions
        !          2055: 
        !          2056: (define_insn "adddi3"
        !          2057:   [(set (match_operand:DI 0 "general_operand" "=&r,ro")
        !          2058:        (plus:DI (match_operand:DI 1 "general_operand" "%0,0")
        !          2059:                 (match_operand:DI 2 "general_operand" "o,riF")))]
        !          2060:   ""
        !          2061:   "*
        !          2062: {
        !          2063:   rtx low[3], high[3];
        !          2064: 
        !          2065:   CC_STATUS_INIT;
        !          2066: 
        !          2067:   split_di (operands, 3, low, high);
        !          2068: 
        !          2069:   if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0)
        !          2070:     {
        !          2071:       output_asm_insn (AS2 (add%L0,%2,%0), low);
        !          2072:       output_asm_insn (AS2 (adc%L0,%2,%0), high);
        !          2073:     }
        !          2074:   else
        !          2075:     output_asm_insn (AS2 (add%L0,%2,%0), high);
        !          2076:   RET;
        !          2077: }")
        !          2078: 
        !          2079: ;; On a 486, it is faster to do movl/addl than to do a single leal if
        !          2080: ;; operands[1] and operands[2] are both registers.
        !          2081: 
        !          2082: (define_insn "addsi3"
        !          2083:   [(set (match_operand:SI 0 "general_operand" "=?r,rm,r")
        !          2084:        (plus:SI (match_operand:SI 1 "general_operand" "%r,0,0")
        !          2085:                 (match_operand:SI 2 "general_operand" "ri,ri,rm")))]
        !          2086:   ""
        !          2087:   "*
        !          2088: {
        !          2089:   if (REG_P (operands[0]) && REGNO (operands[0]) != REGNO (operands[1]))
        !          2090:     {
        !          2091:       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
        !          2092:        return AS2 (add%L0,%1,%0);
        !          2093: 
        !          2094:       if (! TARGET_486 || ! REG_P (operands[2]))
        !          2095:         {
        !          2096:          CC_STATUS_INIT;
        !          2097: 
        !          2098:          if (operands[2] == stack_pointer_rtx)
        !          2099:            {
        !          2100:              rtx temp;
        !          2101: 
        !          2102:              temp = operands[1];
        !          2103:              operands[1] = operands[2];
        !          2104:              operands[2] = temp;
        !          2105:            }
        !          2106:          if (operands[2] != stack_pointer_rtx)
        !          2107:            {
        !          2108:              operands[1] = SET_SRC (PATTERN (insn));
        !          2109:              return AS2 (lea%L0,%a1,%0);
        !          2110:            }
        !          2111:        }
        !          2112: 
        !          2113:       output_asm_insn (AS2 (mov%L0,%1,%0), operands);
        !          2114:     }
        !          2115: 
        !          2116:   if (operands[2] == const1_rtx)
        !          2117:     return AS1 (inc%L0,%0);
        !          2118: 
        !          2119:   if (operands[2] == constm1_rtx)
        !          2120:     return AS1 (dec%L0,%0);
        !          2121: 
        !          2122:   return AS2 (add%L0,%2,%0);
        !          2123: }")
        !          2124: 
        !          2125: ;; ??? `lea' here, for three operand add?  If leaw is used, only %bx,
        !          2126: ;; %si and %di can appear in SET_SRC, and output_asm_insn might not be
        !          2127: ;; able to handle the operand.  But leal always works?
        !          2128: 
        !          2129: (define_insn "addhi3"
        !          2130:   [(set (match_operand:HI 0 "general_operand" "=rm,r")
        !          2131:        (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
        !          2132:                 (match_operand:HI 2 "general_operand" "ri,rm")))]
        !          2133:   ""
        !          2134:   "*
        !          2135: {
        !          2136:   /* ??? what about offsettable memory references? */
        !          2137:   if (QI_REG_P (operands[0])
        !          2138:       && GET_CODE (operands[2]) == CONST_INT
        !          2139:       && (INTVAL (operands[2]) & 0xff) == 0)
        !          2140:     {
        !          2141:       CC_STATUS_INIT;
        !          2142: 
        !          2143:       operands[2] = GEN_INT ((INTVAL (operands[2]) >> 8) & 0xff);
        !          2144: 
        !          2145:       if (operands[2] == const1_rtx)
        !          2146:        return AS1 (inc%B0,%h0);
        !          2147: 
        !          2148:       if (operands[2] == constm1_rtx)
        !          2149:        return AS1 (dec%B0,%h0);
        !          2150: 
        !          2151:       return AS2 (add%B0,%2,%h0);
        !          2152:     }
        !          2153: 
        !          2154:   if (operands[2] == const1_rtx)
        !          2155:     return AS1 (inc%W0,%0);
        !          2156: 
        !          2157:   if (operands[2] == constm1_rtx)
        !          2158:     return AS1 (dec%W0,%0);
        !          2159: 
        !          2160:   return AS2 (add%W0,%2,%0);
        !          2161: }")
        !          2162: 
        !          2163: (define_insn "addqi3"
        !          2164:   [(set (match_operand:QI 0 "general_operand" "=qm,q")
        !          2165:        (plus:QI (match_operand:QI 1 "general_operand" "%0,0")
        !          2166:                 (match_operand:QI 2 "general_operand" "qn,qmn")))]
        !          2167:   ""
        !          2168:   "*
        !          2169: {
        !          2170:   if (operands[2] == const1_rtx)
        !          2171:     return AS1 (inc%B0,%0);
        !          2172: 
        !          2173:   if (operands[2] == constm1_rtx)
        !          2174:     return AS1 (dec%B0,%0);
        !          2175: 
        !          2176:   return AS2 (add%B0,%2,%0);
        !          2177: }")
        !          2178: 
        !          2179: ;Lennart Augustsson <[email protected]>
        !          2180: ;says this pattern just makes slower code:
        !          2181: ;      pushl   %ebp
        !          2182: ;      addl    $-80,(%esp)
        !          2183: ;instead of
        !          2184: ;      leal    -80(%ebp),%eax
        !          2185: ;      pushl   %eax
        !          2186: ;
        !          2187: ;(define_insn ""
        !          2188: ;  [(set (match_operand:SI 0 "push_operand" "=<")
        !          2189: ;      (plus:SI (match_operand:SI 1 "general_operand" "%r")
        !          2190: ;               (match_operand:SI 2 "general_operand" "ri")))]
        !          2191: ;  ""
        !          2192: ;  "*
        !          2193: ;{
        !          2194: ;  rtx xops[4];
        !          2195: ;  xops[0] = operands[0];
        !          2196: ;  xops[1] = operands[1];
        !          2197: ;  xops[2] = operands[2];
        !          2198: ;  xops[3] = gen_rtx (MEM, SImode, stack_pointer_rtx);
        !          2199: ;  output_asm_insn (\"push%z1 %1\", xops);
        !          2200: ;  output_asm_insn (AS2 (add%z3,%2,%3), xops);
        !          2201: ;  RET;
        !          2202: ;}")
        !          2203: 
        !          2204: ;; addsi3 is faster, so put this after.
        !          2205: 
        !          2206: (define_insn ""
        !          2207:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          2208:         (match_operand:QI 1 "address_operand" "p"))]
        !          2209:   ""
        !          2210:   "*
        !          2211: {
        !          2212:   CC_STATUS_INIT;
        !          2213:   /* Adding a constant to a register is faster with an add.  */
        !          2214:   /* ??? can this ever happen? */
        !          2215:   if (GET_CODE (operands[1]) == PLUS
        !          2216:       && GET_CODE (XEXP (operands[1], 1)) == CONST_INT
        !          2217:       && rtx_equal_p (operands[0], XEXP (operands[1], 0)))
        !          2218:     {
        !          2219:       operands[1] = XEXP (operands[1], 1);
        !          2220: 
        !          2221:       if (operands[1] == const1_rtx)
        !          2222:         return AS1 (inc%L0,%0);
        !          2223: 
        !          2224:       if (operands[1] == constm1_rtx)
        !          2225:         return AS1 (dec%L0,%0);
        !          2226: 
        !          2227:       return AS2 (add%L0,%1,%0);
        !          2228:     }
        !          2229:   return AS2 (lea%L0,%a1,%0);
        !          2230: }")
        !          2231: 
        !          2232: ;; The patterns that match these are at the end of this file.
        !          2233: 
        !          2234: (define_expand "addxf3"
        !          2235:   [(set (match_operand:XF 0 "register_operand" "")
        !          2236:        (plus:XF (match_operand:XF 1 "nonimmediate_operand" "")
        !          2237:                 (match_operand:XF 2 "nonimmediate_operand" "")))]
        !          2238:   "TARGET_80387"
        !          2239:   "")
        !          2240: 
        !          2241: (define_expand "adddf3"
        !          2242:   [(set (match_operand:DF 0 "register_operand" "")
        !          2243:        (plus:DF (match_operand:DF 1 "nonimmediate_operand" "")
        !          2244:                 (match_operand:DF 2 "nonimmediate_operand" "")))]
        !          2245:   "TARGET_80387"
        !          2246:   "")
        !          2247: 
        !          2248: (define_expand "addsf3"
        !          2249:   [(set (match_operand:SF 0 "register_operand" "")
        !          2250:        (plus:SF (match_operand:SF 1 "nonimmediate_operand" "")
        !          2251:                 (match_operand:SF 2 "nonimmediate_operand" "")))]
        !          2252:   "TARGET_80387"
        !          2253:   "")
        !          2254: 
        !          2255: ;;- subtract instructions
        !          2256: 
        !          2257: (define_insn "subdi3"
        !          2258:   [(set (match_operand:DI 0 "general_operand" "=&r,ro")
        !          2259:        (minus:DI (match_operand:DI 1 "general_operand" "0,0")
        !          2260:                  (match_operand:DI 2 "general_operand" "o,riF")))]
        !          2261:   ""
        !          2262:   "*
        !          2263: {
        !          2264:   rtx low[3], high[3];
        !          2265: 
        !          2266:   CC_STATUS_INIT;
        !          2267: 
        !          2268:   split_di (operands, 3, low, high);
        !          2269: 
        !          2270:   if (GET_CODE (low[2]) != CONST_INT || INTVAL (low[2]) != 0)
        !          2271:     {
        !          2272:       output_asm_insn (AS2 (sub%L0,%2,%0), low);
        !          2273:       output_asm_insn (AS2 (sbb%L0,%2,%0), high);
        !          2274:     }
        !          2275:   else
        !          2276:     output_asm_insn (AS2 (sub%L0,%2,%0), high);
        !          2277: 
        !          2278:   RET;
        !          2279: }")
        !          2280: 
        !          2281: (define_insn "subsi3"
        !          2282:   [(set (match_operand:SI 0 "general_operand" "=rm,r")
        !          2283:        (minus:SI (match_operand:SI 1 "general_operand" "0,0")
        !          2284:                  (match_operand:SI 2 "general_operand" "ri,rm")))]
        !          2285:   ""
        !          2286:   "* return AS2 (sub%L0,%2,%0);")
        !          2287: 
        !          2288: (define_insn "subhi3"
        !          2289:   [(set (match_operand:HI 0 "general_operand" "=rm,r")
        !          2290:        (minus:HI (match_operand:HI 1 "general_operand" "0,0")
        !          2291:                  (match_operand:HI 2 "general_operand" "ri,rm")))]
        !          2292:   ""
        !          2293:   "* return AS2 (sub%W0,%2,%0);")
        !          2294: 
        !          2295: (define_insn "subqi3"
        !          2296:   [(set (match_operand:QI 0 "general_operand" "=qm,q")
        !          2297:        (minus:QI (match_operand:QI 1 "general_operand" "0,0")
        !          2298:                  (match_operand:QI 2 "general_operand" "qn,qmn")))]
        !          2299:   ""
        !          2300:   "* return AS2 (sub%B0,%2,%0);")
        !          2301: 
        !          2302: ;; The patterns that match these are at the end of this file.
        !          2303: 
        !          2304: (define_expand "subxf3"
        !          2305:   [(set (match_operand:XF 0 "register_operand" "")
        !          2306:        (minus:XF (match_operand:XF 1 "nonimmediate_operand" "")
        !          2307:                  (match_operand:XF 2 "nonimmediate_operand" "")))]
        !          2308:   "TARGET_80387"
        !          2309:   "")
        !          2310: 
        !          2311: (define_expand "subdf3"
        !          2312:   [(set (match_operand:DF 0 "register_operand" "")
        !          2313:        (minus:DF (match_operand:DF 1 "nonimmediate_operand" "")
        !          2314:                  (match_operand:DF 2 "nonimmediate_operand" "")))]
        !          2315:   "TARGET_80387"
        !          2316:   "")
        !          2317: 
        !          2318: (define_expand "subsf3"
        !          2319:   [(set (match_operand:SF 0 "register_operand" "")
        !          2320:        (minus:SF (match_operand:SF 1 "nonimmediate_operand" "")
        !          2321:                  (match_operand:SF 2 "nonimmediate_operand" "")))]
        !          2322:   "TARGET_80387"
        !          2323:   "")
        !          2324: 
        !          2325: ;;- multiply instructions
        !          2326: 
        !          2327: ;(define_insn "mulqi3"
        !          2328: ;  [(set (match_operand:QI 0 "general_operand" "=a")
        !          2329: ;      (mult:QI (match_operand:QI 1 "general_operand" "%0")
        !          2330: ;               (match_operand:QI 2 "general_operand" "qm")))]
        !          2331: ;  ""
        !          2332: ;  "imul%B0 %2,%0")
        !          2333: 
        !          2334: (define_insn ""
        !          2335:   [(set (match_operand:HI 0 "general_operand" "=r")
        !          2336:        (mult:SI (match_operand:HI 1 "general_operand" "%0")
        !          2337:                 (match_operand:HI 2 "general_operand" "r")))]
        !          2338:   "GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 0x80"
        !          2339:   "* return AS2 (imul%W0,%2,%0);")
        !          2340: 
        !          2341: (define_insn "mulhi3"
        !          2342:   [(set (match_operand:HI 0 "general_operand" "=r,r")
        !          2343:        (mult:SI (match_operand:HI 1 "general_operand" "%0,rm")
        !          2344:                 (match_operand:HI 2 "general_operand" "g,i")))]
        !          2345:   ""
        !          2346:   "*
        !          2347: {
        !          2348:   if (GET_CODE (operands[1]) == REG
        !          2349:       && REGNO (operands[1]) == REGNO (operands[0])
        !          2350:       && (GET_CODE (operands[2]) == MEM || GET_CODE (operands[2]) == REG))
        !          2351:     /* Assembler has weird restrictions.  */
        !          2352:     return AS2 (imul%W0,%2,%0);
        !          2353:   return AS3 (imul%W0,%2,%1,%0);
        !          2354: }")
        !          2355: 
        !          2356: (define_insn ""
        !          2357:   [(set (match_operand:SI 0 "general_operand" "=r")
        !          2358:        (mult:SI (match_operand:SI 1 "general_operand" "%0")
        !          2359:                 (match_operand:SI 2 "general_operand" "r")))]
        !          2360:   "GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 0x80"
        !          2361:   "* return AS2 (imul%L0,%2,%0);")
        !          2362: 
        !          2363: (define_insn "mulsi3"
        !          2364:   [(set (match_operand:SI 0 "general_operand" "=r,r")
        !          2365:        (mult:SI (match_operand:SI 1 "general_operand" "%0,rm")
        !          2366:                 (match_operand:SI 2 "general_operand" "g,i")))]
        !          2367:   ""
        !          2368:   "*
        !          2369: {
        !          2370:   if (GET_CODE (operands[1]) == REG
        !          2371:       && REGNO (operands[1]) == REGNO (operands[0])
        !          2372:       && (GET_CODE (operands[2]) == MEM || GET_CODE (operands[2]) == REG))
        !          2373:     /* Assembler has weird restrictions.  */
        !          2374:     return AS2 (imul%L0,%2,%0);
        !          2375:   return AS3 (imul%L0,%2,%1,%0);
        !          2376: }")
        !          2377: 
        !          2378: (define_insn ""
        !          2379:   [(set (match_operand:HI 0 "general_operand" "=a")
        !          2380:        (mult:SI (zero_extend:HI
        !          2381:                  (match_operand:QI 1 "nonimmediate_operand" "%0"))
        !          2382:                 (zero_extend:HI
        !          2383:                  (match_operand:QI 2 "nonimmediate_operand" "qm"))))]
        !          2384:   ""
        !          2385:   "mul%B0 %2")
        !          2386: 
        !          2387: ;; The patterns that match these are at the end of this file.
        !          2388: 
        !          2389: (define_expand "mulxf3"
        !          2390:   [(set (match_operand:XF 0 "register_operand" "")
        !          2391:        (mult:XF (match_operand:XF 1 "nonimmediate_operand" "")
        !          2392:                 (match_operand:XF 2 "nonimmediate_operand" "")))]
        !          2393:   "TARGET_80387"
        !          2394:   "")
        !          2395: 
        !          2396: (define_expand "muldf3"
        !          2397:   [(set (match_operand:DF 0 "register_operand" "")
        !          2398:        (mult:DF (match_operand:DF 1 "nonimmediate_operand" "")
        !          2399:                 (match_operand:DF 2 "nonimmediate_operand" "")))]
        !          2400:   "TARGET_80387"
        !          2401:   "")
        !          2402: 
        !          2403: (define_expand "mulsf3"
        !          2404:   [(set (match_operand:SF 0 "register_operand" "")
        !          2405:        (mult:SF (match_operand:SF 1 "nonimmediate_operand" "")
        !          2406:                 (match_operand:SF 2 "nonimmediate_operand" "")))]
        !          2407:   "TARGET_80387"
        !          2408:   "")
        !          2409: 
        !          2410: ;;- divide instructions
        !          2411: 
        !          2412: (define_insn "divqi3"
        !          2413:   [(set (match_operand:QI 0 "general_operand" "=a")
        !          2414:        (div:QI (match_operand:HI 1 "general_operand" "0")
        !          2415:                (match_operand:QI 2 "general_operand" "qm")))]
        !          2416:   ""
        !          2417:   "idiv%B0 %2")
        !          2418: 
        !          2419: (define_insn "udivqi3"
        !          2420:   [(set (match_operand:QI 0 "general_operand" "=a")
        !          2421:        (udiv:QI (match_operand:HI 1 "general_operand" "0")
        !          2422:                 (match_operand:QI 2 "general_operand" "qm")))]
        !          2423:   ""
        !          2424:   "div%B0 %2")
        !          2425: 
        !          2426: ;; The patterns that match these are at the end of this file.
        !          2427: 
        !          2428: (define_expand "divxf3"
        !          2429:   [(set (match_operand:XF 0 "register_operand" "")
        !          2430:        (div:XF (match_operand:XF 1 "nonimmediate_operand" "")
        !          2431:                (match_operand:XF 2 "nonimmediate_operand" "")))]
        !          2432:   "TARGET_80387"
        !          2433:   "")
        !          2434: 
        !          2435: (define_expand "divdf3"
        !          2436:   [(set (match_operand:DF 0 "register_operand" "")
        !          2437:        (div:DF (match_operand:DF 1 "nonimmediate_operand" "")
        !          2438:                (match_operand:DF 2 "nonimmediate_operand" "")))]
        !          2439:   "TARGET_80387"
        !          2440:   "")
        !          2441: 
        !          2442: (define_expand "divsf3"
        !          2443:   [(set (match_operand:SF 0 "register_operand" "")
        !          2444:        (div:SF (match_operand:SF 1 "nonimmediate_operand" "")
        !          2445:                (match_operand:SF 2 "nonimmediate_operand" "")))]
        !          2446:   "TARGET_80387"
        !          2447:   "")
        !          2448: 
        !          2449: ;; Remainder instructions.
        !          2450: 
        !          2451: (define_insn "divmodsi4"
        !          2452:   [(set (match_operand:SI 0 "register_operand" "=a")
        !          2453:        (div:SI (match_operand:SI 1 "register_operand" "0")
        !          2454:                (match_operand:SI 2 "general_operand" "rm")))
        !          2455:    (set (match_operand:SI 3 "register_operand" "=&d")
        !          2456:        (mod:SI (match_dup 1) (match_dup 2)))]
        !          2457:   ""
        !          2458:   "*
        !          2459: {
        !          2460: #ifdef INTEL_SYNTAX
        !          2461:   output_asm_insn (\"cdq\", operands);
        !          2462: #else
        !          2463:   output_asm_insn (\"cltd\", operands);
        !          2464: #endif
        !          2465:   return AS1 (idiv%L0,%2);
        !          2466: }")
        !          2467: 
        !          2468: (define_insn "divmodhi4"
        !          2469:   [(set (match_operand:HI 0 "register_operand" "=a")
        !          2470:        (div:HI (match_operand:HI 1 "register_operand" "0")
        !          2471:                (match_operand:HI 2 "general_operand" "rm")))
        !          2472:    (set (match_operand:HI 3 "register_operand" "=&d")
        !          2473:        (mod:HI (match_dup 1) (match_dup 2)))]
        !          2474:   ""
        !          2475:   "cwtd\;idiv%W0 %2")
        !          2476: 
        !          2477: ;; ??? Can we make gcc zero extend operand[0]?
        !          2478: (define_insn "udivmodsi4"
        !          2479:   [(set (match_operand:SI 0 "register_operand" "=a")
        !          2480:        (udiv:SI (match_operand:SI 1 "register_operand" "0")
        !          2481:                 (match_operand:SI 2 "general_operand" "rm")))
        !          2482:    (set (match_operand:SI 3 "register_operand" "=&d")
        !          2483:        (umod:SI (match_dup 1) (match_dup 2)))]
        !          2484:   ""
        !          2485:   "*
        !          2486: {
        !          2487:   output_asm_insn (AS2 (xor%L3,%3,%3), operands);
        !          2488:   return AS1 (div%L0,%2);
        !          2489: }")
        !          2490: 
        !          2491: ;; ??? Can we make gcc zero extend operand[0]?
        !          2492: (define_insn "udivmodhi4"
        !          2493:   [(set (match_operand:HI 0 "register_operand" "=a")
        !          2494:        (udiv:HI (match_operand:HI 1 "register_operand" "0")
        !          2495:                 (match_operand:HI 2 "general_operand" "rm")))
        !          2496:    (set (match_operand:HI 3 "register_operand" "=&d")
        !          2497:        (umod:HI (match_dup 1) (match_dup 2)))]
        !          2498:   ""
        !          2499:   "*
        !          2500: {
        !          2501:   output_asm_insn (AS2 (xor%W0,%3,%3), operands);
        !          2502:   return AS1 (div%W0,%2);
        !          2503: }")
        !          2504: 
        !          2505: /*
        !          2506: ;;this should be a valid double division which we may want to add
        !          2507: 
        !          2508: (define_insn ""
        !          2509:   [(set (match_operand:SI 0 "register_operand" "=a")
        !          2510:        (udiv:DI (match_operand:DI 1 "register_operand" "a")
        !          2511:                 (match_operand:SI 2 "general_operand" "rm")))
        !          2512:    (set (match_operand:SI 3 "register_operand" "=d")
        !          2513:        (umod:SI (match_dup 1) (match_dup 2)))]
        !          2514:   ""
        !          2515:   "div%L0 %2,%0")
        !          2516: */
        !          2517: 
        !          2518: ;;- and instructions
        !          2519: 
        !          2520: ;; On i386,
        !          2521: ;;                     movzbl %bl,%ebx
        !          2522: ;; is faster than
        !          2523: ;;                     andl $255,%ebx
        !          2524: ;;
        !          2525: ;; but if the reg is %eax, then the "andl" is faster.
        !          2526: ;;
        !          2527: ;; On i486, the "andl" is always faster than the "movzbl".
        !          2528: ;;
        !          2529: ;; On both i386 and i486, a three operand AND is as fast with movzbl or
        !          2530: ;; movzwl as with andl, if operands[0] != operands[1].
        !          2531: 
        !          2532: ;; The `r' in `rm' for operand 3 looks redundant, but it causes
        !          2533: ;; optional reloads to be generated if op 3 is a pseudo in a stack slot.
        !          2534: 
        !          2535: ;; ??? What if we only change one byte of an offsettable memory reference?
        !          2536: (define_insn "andsi3"
        !          2537:   [(set (match_operand:SI 0 "general_operand" "=r,r,rm,r")
        !          2538:        (and:SI (match_operand:SI 1 "general_operand" "%rm,qm,0,0")
        !          2539:                (match_operand:SI 2 "general_operand" "L,K,ri,rm")))]
        !          2540:   ""
        !          2541:   "*
        !          2542: {
        !          2543:   if (GET_CODE (operands[2]) == CONST_INT
        !          2544:       && ! (GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))
        !          2545:     {
        !          2546:       if (INTVAL (operands[2]) == 0xffff && REG_P (operands[0])
        !          2547:          && (! REG_P (operands[1])
        !          2548:              || REGNO (operands[0]) != 0 || REGNO (operands[1]) != 0)
        !          2549:          && (! TARGET_486 || ! rtx_equal_p (operands[0], operands[1])))
        !          2550:        {
        !          2551:          /* ??? tege: Should forget CC_STATUS only if we clobber a
        !          2552:             remembered operand.  Fix that later.  */
        !          2553:          CC_STATUS_INIT;
        !          2554: #ifdef INTEL_SYNTAX
        !          2555:          return AS2 (movzx,%w1,%0);
        !          2556: #else
        !          2557:          return AS2 (movz%W0%L0,%w1,%0);
        !          2558: #endif
        !          2559:        }
        !          2560: 
        !          2561:       if (INTVAL (operands[2]) == 0xff && REG_P (operands[0])
        !          2562:          && !(REG_P (operands[1]) && NON_QI_REG_P (operands[1]))
        !          2563:          && (! REG_P (operands[1])
        !          2564:              || REGNO (operands[0]) != 0 || REGNO (operands[1]) != 0)
        !          2565:          && (! TARGET_486 || ! rtx_equal_p (operands[0], operands[1])))
        !          2566:        {
        !          2567:          /* ??? tege: Should forget CC_STATUS only if we clobber a
        !          2568:             remembered operand.  Fix that later.  */
        !          2569:          CC_STATUS_INIT;
        !          2570: #ifdef INTEL_SYNTAX
        !          2571:          return AS2 (movzx,%b1,%0);
        !          2572: #else
        !          2573:          return AS2 (movz%B0%L0,%b1,%0);
        !          2574: #endif
        !          2575:        }
        !          2576: 
        !          2577:       if (QI_REG_P (operands[0]) && ~(INTVAL (operands[2]) | 0xff) == 0)
        !          2578:        {
        !          2579:          CC_STATUS_INIT;
        !          2580: 
        !          2581:          if (INTVAL (operands[2]) == 0xffffff00)
        !          2582:            {
        !          2583:              operands[2] = const0_rtx;
        !          2584:              return AS2 (mov%B0,%2,%b0);
        !          2585:            }
        !          2586: 
        !          2587:          operands[2] = GEN_INT (INTVAL (operands[2]) & 0xff);
        !          2588:          return AS2 (and%B0,%2,%b0);
        !          2589:        }
        !          2590: 
        !          2591:       if (QI_REG_P (operands[0]) && ~(INTVAL (operands[2]) | 0xff00) == 0)
        !          2592:        {
        !          2593:          CC_STATUS_INIT;
        !          2594: 
        !          2595:          if (INTVAL (operands[2]) == 0xffff00ff)
        !          2596:            {
        !          2597:              operands[2] = const0_rtx;
        !          2598:              return AS2 (mov%B0,%2,%h0);
        !          2599:            }
        !          2600: 
        !          2601:          operands[2] = GEN_INT ((INTVAL (operands[2]) >> 8) & 0xff);
        !          2602:          return AS2 (and%B0,%2,%h0);
        !          2603:        }
        !          2604: 
        !          2605:       if (GET_CODE (operands[0]) == MEM && INTVAL (operands[2]) == 0xffff0000)
        !          2606:         {
        !          2607:          operands[2] = const0_rtx;
        !          2608:          return AS2 (mov%W0,%2,%w0);
        !          2609:        }
        !          2610:     }
        !          2611: 
        !          2612:   return AS2 (and%L0,%2,%0);
        !          2613: }")
        !          2614: 
        !          2615: (define_insn "andhi3"
        !          2616:   [(set (match_operand:HI 0 "general_operand" "=rm,r")
        !          2617:        (and:HI (match_operand:HI 1 "general_operand" "%0,0")
        !          2618:                (match_operand:HI 2 "general_operand" "ri,rm")))]
        !          2619:   ""
        !          2620:   "*
        !          2621: {
        !          2622:   if (GET_CODE (operands[2]) == CONST_INT
        !          2623:       && ! (GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))
        !          2624:     {
        !          2625:       /* Can we ignore the upper byte? */
        !          2626:       if ((! REG_P (operands[0]) || QI_REG_P (operands[0]))
        !          2627:          && (INTVAL (operands[2]) & 0xff00) == 0xff00)
        !          2628:        {
        !          2629:          CC_STATUS_INIT;
        !          2630: 
        !          2631:          if ((INTVAL (operands[2]) & 0xff) == 0)
        !          2632:            {
        !          2633:              operands[2] = const0_rtx;
        !          2634:              return AS2 (mov%B0,%2,%b0);
        !          2635:            }
        !          2636: 
        !          2637:          operands[2] = GEN_INT (INTVAL (operands[2]) & 0xff);
        !          2638:          return AS2 (and%B0,%2,%b0);
        !          2639:        }
        !          2640: 
        !          2641:       /* Can we ignore the lower byte? */
        !          2642:       /* ??? what about offsettable memory references? */
        !          2643:       if (QI_REG_P (operands[0]) && (INTVAL (operands[2]) & 0xff) == 0xff)
        !          2644:        {
        !          2645:          CC_STATUS_INIT;
        !          2646: 
        !          2647:          if ((INTVAL (operands[2]) & 0xff00) == 0)
        !          2648:            {
        !          2649:              operands[2] = const0_rtx;
        !          2650:              return AS2 (mov%B0,%2,%h0);
        !          2651:            }
        !          2652: 
        !          2653:          operands[2] = GEN_INT ((INTVAL (operands[2]) >> 8) & 0xff);
        !          2654:          return AS2 (and%B0,%2,%h0);
        !          2655:        }
        !          2656:     }
        !          2657: 
        !          2658:   return AS2 (and%W0,%2,%0);
        !          2659: }")
        !          2660: 
        !          2661: (define_insn "andqi3"
        !          2662:   [(set (match_operand:QI 0 "general_operand" "=qm,q")
        !          2663:        (and:QI (match_operand:QI 1 "general_operand" "%0,0")
        !          2664:                (match_operand:QI 2 "general_operand" "qn,qmn")))]
        !          2665:   ""
        !          2666:   "* return AS2 (and%B0,%2,%0);")
        !          2667: 
        !          2668: /* I am nervous about these two.. add them later..
        !          2669: ;I presume this means that we have something in say op0= eax which is small
        !          2670: ;and we want to and it with memory so we can do this by just an
        !          2671: ;andb m,%al  and have success.
        !          2672: (define_insn ""
        !          2673:   [(set (match_operand:SI 0 "general_operand" "=r")
        !          2674:        (and:SI (zero_extend:SI
        !          2675:                 (match_operand:HI 1 "nonimmediate_operand" "rm"))
        !          2676:                (match_operand:SI 2 "general_operand" "0")))]
        !          2677:   "GET_CODE (operands[2]) == CONST_INT
        !          2678:    && (unsigned int) INTVAL (operands[2]) < (1 << GET_MODE_BITSIZE (HImode))"
        !          2679:   "and%W0 %1,%0")
        !          2680: 
        !          2681: (define_insn ""
        !          2682:   [(set (match_operand:SI 0 "general_operand" "=q")
        !          2683:        (and:SI
        !          2684:         (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm"))
        !          2685:                (match_operand:SI 2 "general_operand" "0")))]
        !          2686:   "GET_CODE (operands[2]) == CONST_INT
        !          2687:    && (unsigned int) INTVAL (operands[2]) < (1 << GET_MODE_BITSIZE (QImode))"
        !          2688:   "and%L0 %1,%0")
        !          2689: 
        !          2690: */
        !          2691: 
        !          2692: ;;- Bit set (inclusive or) instructions
        !          2693: 
        !          2694: ;; ??? What if we only change one byte of an offsettable memory reference?
        !          2695: (define_insn "iorsi3"
        !          2696:   [(set (match_operand:SI 0 "general_operand" "=rm,r")
        !          2697:        (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
        !          2698:                (match_operand:SI 2 "general_operand" "ri,rm")))]
        !          2699:   ""
        !          2700:   "*
        !          2701: {
        !          2702:   if (GET_CODE (operands[2]) == CONST_INT
        !          2703:       && ! (GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))
        !          2704:     {
        !          2705:       if ((! REG_P (operands[0]) || QI_REG_P (operands[0]))
        !          2706:          && (INTVAL (operands[2]) & ~0xff) == 0)
        !          2707:        {
        !          2708:          CC_STATUS_INIT;
        !          2709: 
        !          2710:          if (INTVAL (operands[2]) == 0xff)
        !          2711:            return AS2 (mov%B0,%2,%b0);
        !          2712: 
        !          2713:          return AS2 (or%B0,%2,%b0);
        !          2714:        }
        !          2715: 
        !          2716:       if (QI_REG_P (operands[0]) && (INTVAL (operands[2]) & ~0xff00) == 0)
        !          2717:        {
        !          2718:          CC_STATUS_INIT;
        !          2719:          operands[2] = GEN_INT (INTVAL (operands[2]) >> 8);
        !          2720: 
        !          2721:          if (INTVAL (operands[2]) == 0xff)
        !          2722:            return AS2 (mov%B0,%2,%h0);
        !          2723: 
        !          2724:          return AS2 (or%B0,%2,%h0);
        !          2725:        }
        !          2726:     }
        !          2727: 
        !          2728:   return AS2 (or%L0,%2,%0);
        !          2729: }")
        !          2730: 
        !          2731: (define_insn "iorhi3"
        !          2732:   [(set (match_operand:HI 0 "general_operand" "=rm,r")
        !          2733:        (ior:HI (match_operand:HI 1 "general_operand" "%0,0")
        !          2734:                (match_operand:HI 2 "general_operand" "ri,rm")))]
        !          2735:   ""
        !          2736:   "*
        !          2737: {
        !          2738:   if (GET_CODE (operands[2]) == CONST_INT
        !          2739:       && ! (GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))
        !          2740:     {
        !          2741:       /* Can we ignore the upper byte? */
        !          2742:       if ((! REG_P (operands[0]) || QI_REG_P (operands[0]))
        !          2743:          && (INTVAL (operands[2]) & 0xff00) == 0)
        !          2744:        {
        !          2745:          CC_STATUS_INIT;
        !          2746:          if (INTVAL (operands[2]) & 0xffff0000)
        !          2747:            operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffff);
        !          2748: 
        !          2749:          if (INTVAL (operands[2]) == 0xff)
        !          2750:            return AS2 (mov%B0,%2,%b0);
        !          2751: 
        !          2752:          return AS2 (or%B0,%2,%b0);
        !          2753:        }
        !          2754: 
        !          2755:       /* Can we ignore the lower byte? */
        !          2756:       /* ??? what about offsettable memory references? */
        !          2757:       if (QI_REG_P (operands[0])
        !          2758:          && (INTVAL (operands[2]) & 0xff) == 0)
        !          2759:        {
        !          2760:          CC_STATUS_INIT;
        !          2761:          operands[2] = GEN_INT ((INTVAL (operands[2]) >> 8) & 0xff);
        !          2762: 
        !          2763:          if (INTVAL (operands[2]) == 0xff)
        !          2764:            return AS2 (mov%B0,%2,%h0);
        !          2765: 
        !          2766:          return AS2 (or%B0,%2,%h0);
        !          2767:        }
        !          2768:     }
        !          2769: 
        !          2770:   return AS2 (or%W0,%2,%0);
        !          2771: }")
        !          2772: 
        !          2773: (define_insn "iorqi3"
        !          2774:   [(set (match_operand:QI 0 "general_operand" "=qm,q")
        !          2775:        (ior:QI (match_operand:QI 1 "general_operand" "%0,0")
        !          2776:                (match_operand:QI 2 "general_operand" "qn,qmn")))]
        !          2777:   ""
        !          2778:   "* return AS2 (or%B0,%2,%0);")
        !          2779: 
        !          2780: ;;- xor instructions
        !          2781: 
        !          2782: ;; ??? What if we only change one byte of an offsettable memory reference?
        !          2783: (define_insn "xorsi3"
        !          2784:   [(set (match_operand:SI 0 "general_operand" "=rm,r")
        !          2785:        (xor:SI (match_operand:SI 1 "general_operand" "%0,0")
        !          2786:                (match_operand:SI 2 "general_operand" "ri,rm")))]
        !          2787:   ""
        !          2788:   "*
        !          2789: {
        !          2790:   if (GET_CODE (operands[2]) == CONST_INT
        !          2791:       && ! (GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))
        !          2792:     {
        !          2793:       if ((! REG_P (operands[0]) || QI_REG_P (operands[0]))
        !          2794:          && (INTVAL (operands[2]) & ~0xff) == 0)
        !          2795:        {
        !          2796:          CC_STATUS_INIT;
        !          2797: 
        !          2798:          if (INTVAL (operands[2]) == 0xff)
        !          2799:            return AS1 (not%B0,%b0);
        !          2800: 
        !          2801:          return AS2 (xor%B0,%2,%b0);
        !          2802:        }
        !          2803: 
        !          2804:       if (QI_REG_P (operands[0]) && (INTVAL (operands[2]) & ~0xff00) == 0)
        !          2805:        {
        !          2806:          CC_STATUS_INIT;
        !          2807:          operands[2] = GEN_INT (INTVAL (operands[2]) >> 8);
        !          2808: 
        !          2809:          if (INTVAL (operands[2]) == 0xff)
        !          2810:            return AS1 (not%B0,%h0);
        !          2811: 
        !          2812:          return AS2 (xor%B0,%2,%h0);
        !          2813:        }
        !          2814:     }
        !          2815: 
        !          2816:   return AS2 (xor%L0,%2,%0);
        !          2817: }")
        !          2818: 
        !          2819: (define_insn "xorhi3"
        !          2820:   [(set (match_operand:HI 0 "general_operand" "=rm,r")
        !          2821:        (xor:HI (match_operand:HI 1 "general_operand" "%0,0")
        !          2822:                (match_operand:HI 2 "general_operand" "ri,rm")))]
        !          2823:   ""
        !          2824:   "*
        !          2825: {
        !          2826:   if (GET_CODE (operands[2]) == CONST_INT
        !          2827:       && ! (GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))
        !          2828:     {
        !          2829:       /* Can we ignore the upper byte? */
        !          2830:       if ((! REG_P (operands[0]) || QI_REG_P (operands[0]))
        !          2831:          && (INTVAL (operands[2]) & 0xff00) == 0)
        !          2832:        {
        !          2833:          CC_STATUS_INIT;
        !          2834:          if (INTVAL (operands[2]) & 0xffff0000)
        !          2835:            operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffff);
        !          2836: 
        !          2837:          if (INTVAL (operands[2]) == 0xff)
        !          2838:            return AS1 (not%B0,%b0);
        !          2839: 
        !          2840:          return AS2 (xor%B0,%2,%b0);
        !          2841:        }
        !          2842: 
        !          2843:       /* Can we ignore the lower byte? */
        !          2844:       /* ??? what about offsettable memory references? */
        !          2845:       if (QI_REG_P (operands[0])
        !          2846:          && (INTVAL (operands[2]) & 0xff) == 0)
        !          2847:        {
        !          2848:          CC_STATUS_INIT;
        !          2849:          operands[2] = GEN_INT ((INTVAL (operands[2]) >> 8) & 0xff);
        !          2850: 
        !          2851:          if (INTVAL (operands[2]) == 0xff)
        !          2852:            return AS1 (not%B0,%h0);
        !          2853: 
        !          2854:          return AS2 (xor%B0,%2,%h0);
        !          2855:        }
        !          2856:     }
        !          2857: 
        !          2858:   return AS2 (xor%W0,%2,%0);
        !          2859: }")
        !          2860: 
        !          2861: (define_insn "xorqi3"
        !          2862:   [(set (match_operand:QI 0 "general_operand" "=qm,q")
        !          2863:        (xor:QI (match_operand:QI 1 "general_operand" "%0,0")
        !          2864:                (match_operand:QI 2 "general_operand" "qn,qm")))]
        !          2865:   ""
        !          2866:   "* return AS2 (xor%B0,%2,%0);")
        !          2867: 
        !          2868: ;;- negation instructions
        !          2869: 
        !          2870: (define_insn "negdi2"
        !          2871:   [(set (match_operand:DI 0 "general_operand" "=&ro")
        !          2872:        (neg:DI (match_operand:DI 1 "general_operand" "0")))]
        !          2873:   ""
        !          2874:   "*
        !          2875: {
        !          2876:   rtx xops[2], low[1], high[1];
        !          2877: 
        !          2878:   CC_STATUS_INIT;
        !          2879: 
        !          2880:   split_di (operands, 1, low, high);
        !          2881:   xops[0] = const0_rtx;
        !          2882:   xops[1] = high[0];
        !          2883: 
        !          2884:   output_asm_insn (AS1 (neg%L0,%0), low);
        !          2885:   output_asm_insn (AS2 (adc%L1,%0,%1), xops);
        !          2886:   output_asm_insn (AS1 (neg%L0,%0), high);
        !          2887:   RET;
        !          2888: }")
        !          2889: 
        !          2890: (define_insn "negsi2"
        !          2891:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          2892:        (neg:SI (match_operand:SI 1 "general_operand" "0")))]
        !          2893:   ""
        !          2894:   "neg%L0 %0")
        !          2895: 
        !          2896: (define_insn "neghi2"
        !          2897:   [(set (match_operand:HI 0 "general_operand" "=rm")
        !          2898:        (neg:HI (match_operand:HI 1 "general_operand" "0")))]
        !          2899:   ""
        !          2900:   "neg%W0 %0")
        !          2901: 
        !          2902: (define_insn "negqi2"
        !          2903:   [(set (match_operand:QI 0 "general_operand" "=qm")
        !          2904:        (neg:QI (match_operand:QI 1 "general_operand" "0")))]
        !          2905:   ""
        !          2906:   "neg%B0 %0")
        !          2907: 
        !          2908: (define_insn "negsf2"
        !          2909:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          2910:        (neg:SF (match_operand:SF 1 "general_operand" "0")))]
        !          2911:   "TARGET_80387"
        !          2912:   "fchs")
        !          2913: 
        !          2914: (define_insn "negdf2"
        !          2915:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          2916:        (neg:DF (match_operand:DF 1 "general_operand" "0")))]
        !          2917:   "TARGET_80387"
        !          2918:   "fchs")
        !          2919: 
        !          2920: (define_insn ""
        !          2921:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          2922:        (neg:DF (float_extend:DF (match_operand:SF 1 "general_operand" "0"))))]
        !          2923:   "TARGET_80387"
        !          2924:   "fchs")
        !          2925: 
        !          2926: (define_insn "negxf2"
        !          2927:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          2928:        (neg:XF (match_operand:XF 1 "general_operand" "0")))]
        !          2929:   "TARGET_80387"
        !          2930:   "fchs")
        !          2931: 
        !          2932: (define_insn ""
        !          2933:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          2934:        (neg:XF (float_extend:XF (match_operand:DF 1 "general_operand" "0"))))]
        !          2935:   "TARGET_80387"
        !          2936:   "fchs")
        !          2937: 
        !          2938: ;; Absolute value instructions
        !          2939: 
        !          2940: (define_insn "abssf2"
        !          2941:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          2942:        (abs:SF (match_operand:SF 1 "general_operand" "0")))]
        !          2943:   "TARGET_80387"
        !          2944:   "fabs")
        !          2945: 
        !          2946: (define_insn "absdf2"
        !          2947:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          2948:        (abs:DF (match_operand:DF 1 "general_operand" "0")))]
        !          2949:   "TARGET_80387"
        !          2950:   "fabs")
        !          2951: 
        !          2952: (define_insn ""
        !          2953:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          2954:        (abs:DF (float_extend:DF (match_operand:SF 1 "general_operand" "0"))))]
        !          2955:   "TARGET_80387"
        !          2956:   "fabs")
        !          2957: 
        !          2958: (define_insn "absxf2"
        !          2959:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          2960:        (abs:XF (match_operand:XF 1 "general_operand" "0")))]
        !          2961:   "TARGET_80387"
        !          2962:   "fabs")
        !          2963: 
        !          2964: (define_insn ""
        !          2965:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          2966:        (abs:XF (float_extend:XF (match_operand:DF 1 "general_operand" "0"))))]
        !          2967:   "TARGET_80387"
        !          2968:   "fabs")
        !          2969: 
        !          2970: (define_insn "sqrtsf2"
        !          2971:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          2972:        (sqrt:SF (match_operand:SF 1 "general_operand" "0")))]
        !          2973:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          2974:   "fsqrt")
        !          2975: 
        !          2976: (define_insn "sqrtdf2"
        !          2977:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          2978:        (sqrt:DF (match_operand:DF 1 "general_operand" "0")))]
        !          2979:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          2980:   "fsqrt")
        !          2981: 
        !          2982: (define_insn ""
        !          2983:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          2984:        (sqrt:DF (float_extend:DF
        !          2985:                  (match_operand:SF 1 "general_operand" "0"))))]
        !          2986:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          2987:   "fsqrt")
        !          2988: 
        !          2989: (define_insn "sqrtxf2"
        !          2990:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          2991:        (sqrt:XF (match_operand:XF 1 "general_operand" "0")))]
        !          2992:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          2993:   "fsqrt")
        !          2994: 
        !          2995: (define_insn ""
        !          2996:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          2997:        (sqrt:XF (float_extend:XF
        !          2998:                  (match_operand:DF 1 "general_operand" "0"))))]
        !          2999:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          3000:   "fsqrt")
        !          3001: 
        !          3002: (define_insn ""
        !          3003:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          3004:        (sqrt:XF (float_extend:XF
        !          3005:                  (match_operand:SF 1 "general_operand" "0"))))]
        !          3006:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          3007:   "fsqrt")
        !          3008: 
        !          3009: (define_insn "sindf2"
        !          3010:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          3011:        (unspec:DF [(match_operand:DF 1 "register_operand" "0")] 1))]
        !          3012:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          3013:   "fsin")
        !          3014: 
        !          3015: (define_insn "sinsf2"
        !          3016:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          3017:        (unspec:SF [(match_operand:SF 1 "register_operand" "0")] 1))]
        !          3018:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          3019:   "fsin")
        !          3020: 
        !          3021: (define_insn ""
        !          3022:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          3023:        (unspec:DF [(float_extend:DF
        !          3024:                     (match_operand:SF 1 "register_operand" "0"))] 1))]
        !          3025:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          3026:   "fsin")
        !          3027: 
        !          3028: (define_insn "cosdf2"
        !          3029:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          3030:        (unspec:DF [(match_operand:DF 1 "register_operand" "0")] 2))]
        !          3031:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          3032:   "fcos")
        !          3033: 
        !          3034: (define_insn "cossf2"
        !          3035:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          3036:        (unspec:SF [(match_operand:SF 1 "register_operand" "0")] 2))]
        !          3037:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          3038:   "fcos")
        !          3039: 
        !          3040: (define_insn ""
        !          3041:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          3042:        (unspec:DF [(float_extend:DF
        !          3043:                     (match_operand:SF 1 "register_operand" "0"))] 2))]
        !          3044:   "TARGET_80387 && (TARGET_IEEE_FP || flag_fast_math)"
        !          3045:   "fcos")
        !          3046: 
        !          3047: ;;- one complement instructions
        !          3048: 
        !          3049: (define_insn "one_cmplsi2"
        !          3050:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          3051:        (not:SI (match_operand:SI 1 "general_operand" "0")))]
        !          3052:   ""
        !          3053:   "not%L0 %0")
        !          3054: 
        !          3055: (define_insn "one_cmplhi2"
        !          3056:   [(set (match_operand:HI 0 "general_operand" "=rm")
        !          3057:        (not:HI (match_operand:HI 1 "general_operand" "0")))]
        !          3058:   ""
        !          3059:   "not%W0 %0")
        !          3060: 
        !          3061: (define_insn "one_cmplqi2"
        !          3062:   [(set (match_operand:QI 0 "general_operand" "=qm")
        !          3063:        (not:QI (match_operand:QI 1 "general_operand" "0")))]
        !          3064:   ""
        !          3065:   "not%B0 %0")
        !          3066: 
        !          3067: ;;- arithmetic shift instructions
        !          3068: 
        !          3069: ;; DImode shifts are implemented using the i386 "shift double" opcode,
        !          3070: ;; which is written as "sh[lr]d[lw] imm,reg,reg/mem".  If the shift count
        !          3071: ;; is variable, then the count is in %cl and the "imm" operand is dropped
        !          3072: ;; from the assembler input.
        !          3073: 
        !          3074: ;; This instruction shifts the target reg/mem as usual, but instead of
        !          3075: ;; shifting in zeros, bits are shifted in from reg operand.  If the insn
        !          3076: ;; is a left shift double, bits are taken from the high order bits of
        !          3077: ;; reg, else if the insn is a shift right double, bits are taken from the
        !          3078: ;; low order bits of reg.  So if %eax is "1234" and %edx is "5678",
        !          3079: ;; "shldl $8,%edx,%eax" leaves %edx unchanged and sets %eax to "2345".
        !          3080: 
        !          3081: ;; Since sh[lr]d does not change the `reg' operand, that is done
        !          3082: ;; separately, making all shifts emit pairs of shift double and normal
        !          3083: ;; shift.  Since sh[lr]d does not shift more than 31 bits, and we wish to
        !          3084: ;; support a 63 bit shift, each shift where the count is in a reg expands
        !          3085: ;; to three pairs.  If the overall shift is by N bits, then the first two
        !          3086: ;; pairs shift by N / 2 and the last pair by N & 1.
        !          3087: 
        !          3088: ;; If the shift count is a constant, we need never emit more than one
        !          3089: ;; shift pair, instead using moves and sign extension for counts greater
        !          3090: ;; than 31.
        !          3091: 
        !          3092: (define_expand "ashldi3"
        !          3093:   [(set (match_operand:DI 0 "register_operand" "")
        !          3094:        (ashift:DI (match_operand:DI 1 "register_operand" "")
        !          3095:                   (match_operand:QI 2 "nonmemory_operand" "")))]
        !          3096:   ""
        !          3097:   "
        !          3098: {
        !          3099:   if (GET_CODE (operands[2]) != CONST_INT
        !          3100:       || ! CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
        !          3101:     {
        !          3102:       operands[2] = copy_to_mode_reg (QImode, operands[2]);
        !          3103:       emit_insn (gen_ashldi3_non_const_int (operands[0], operands[1],
        !          3104:                                            operands[2]));
        !          3105:     }
        !          3106:   else
        !          3107:     emit_insn (gen_ashldi3_const_int (operands[0], operands[1], operands[2]));
        !          3108: 
        !          3109:   DONE;
        !          3110: }")
        !          3111: 
        !          3112: (define_insn "ashldi3_const_int"
        !          3113:   [(set (match_operand:DI 0 "register_operand" "=&r")
        !          3114:        (ashift:DI (match_operand:DI 1 "register_operand" "0")
        !          3115:                   (match_operand:QI 2 "const_int_operand" "J")))]
        !          3116:   ""
        !          3117:   "*
        !          3118: {
        !          3119:   rtx xops[4], low[1], high[1];
        !          3120: 
        !          3121:   CC_STATUS_INIT;
        !          3122: 
        !          3123:   split_di (operands, 1, low, high);
        !          3124:   xops[0] = operands[2];
        !          3125:   xops[1] = const1_rtx;
        !          3126:   xops[2] = low[0];
        !          3127:   xops[3] = high[0];
        !          3128: 
        !          3129:   if (INTVAL (xops[0]) > 31)
        !          3130:     {
        !          3131:       output_asm_insn (AS2 (mov%L3,%2,%3), xops);      /* Fast shift by 32 */
        !          3132:       output_asm_insn (AS2 (xor%L2,%2,%2), xops);
        !          3133: 
        !          3134:       if (INTVAL (xops[0]) > 32)
        !          3135:         {
        !          3136:          xops[0] = GEN_INT (INTVAL (xops[0]) - 32);
        !          3137:          output_asm_insn (AS2 (sal%L3,%0,%3), xops); /* Remaining shift */
        !          3138:        }
        !          3139:     }
        !          3140:   else
        !          3141:     {
        !          3142:       output_asm_insn (AS3 (shld%L3,%0,%2,%3), xops);
        !          3143:       output_asm_insn (AS2 (sal%L2,%0,%2), xops);
        !          3144:     }
        !          3145:   RET;
        !          3146: }")
        !          3147: 
        !          3148: (define_insn "ashldi3_non_const_int"
        !          3149:   [(set (match_operand:DI 0 "register_operand" "=&r")
        !          3150:        (ashift:DI (match_operand:DI 1 "register_operand" "0")
        !          3151:                   (match_operand:QI 2 "register_operand" "c")))
        !          3152:    (clobber (match_dup 2))]
        !          3153:   ""
        !          3154:   "*
        !          3155: {
        !          3156:   rtx xops[4], low[1], high[1];
        !          3157: 
        !          3158:   CC_STATUS_INIT;
        !          3159: 
        !          3160:   split_di (operands, 1, low, high);
        !          3161:   xops[0] = operands[2];
        !          3162:   xops[1] = const1_rtx;
        !          3163:   xops[2] = low[0];
        !          3164:   xops[3] = high[0];
        !          3165: 
        !          3166:   output_asm_insn (AS2 (ror%B0,%1,%0), xops);  /* shift count / 2 */
        !          3167: 
        !          3168:   output_asm_insn (AS3_SHIFT_DOUBLE (shld%L3,%0,%2,%3), xops);
        !          3169:   output_asm_insn (AS2 (sal%L2,%0,%2), xops);
        !          3170:   output_asm_insn (AS3_SHIFT_DOUBLE (shld%L3,%0,%2,%3), xops);
        !          3171:   output_asm_insn (AS2 (sal%L2,%0,%2), xops);
        !          3172: 
        !          3173:   xops[1] = GEN_INT (7);                       /* shift count & 1 */
        !          3174: 
        !          3175:   output_asm_insn (AS2 (shr%B0,%1,%0), xops);
        !          3176: 
        !          3177:   output_asm_insn (AS3_SHIFT_DOUBLE (shld%L3,%0,%2,%3), xops);
        !          3178:   output_asm_insn (AS2 (sal%L2,%0,%2), xops);
        !          3179: 
        !          3180:   RET;
        !          3181: }")
        !          3182: 
        !          3183: ;; On i386 and i486, "addl reg,reg" is faster than "sall $1,reg"
        !          3184: ;; On i486, movl/sall appears slightly faster than leal, but the leal
        !          3185: ;; is smaller - use leal for now unless the shift count is 1.
        !          3186: 
        !          3187: (define_insn "ashlsi3"
        !          3188:   [(set (match_operand:SI 0 "general_operand" "=r,rm")
        !          3189:        (ashift:SI (match_operand:SI 1 "general_operand" "r,0")
        !          3190:                   (match_operand:SI 2 "nonmemory_operand" "M,cI")))]
        !          3191:   ""
        !          3192:   "*
        !          3193: {
        !          3194:   if (REG_P (operands[0]) && REGNO (operands[0]) != REGNO (operands[1]))
        !          3195:     {
        !          3196:       if (TARGET_486 && INTVAL (operands[2]) == 1)
        !          3197:        {
        !          3198:          output_asm_insn (AS2 (mov%L0,%1,%0), operands);
        !          3199:          return AS2 (add%L0,%1,%0);
        !          3200:        }
        !          3201:       else
        !          3202:         {
        !          3203:           CC_STATUS_INIT;
        !          3204: 
        !          3205:          if (operands[1] == stack_pointer_rtx)
        !          3206:            {
        !          3207:              output_asm_insn (AS2 (mov%L0,%1,%0), operands);
        !          3208:              operands[1] = operands[0];
        !          3209:            }
        !          3210:           operands[1] = gen_rtx (MULT, SImode, operands[1],
        !          3211:                                 GEN_INT (1 << INTVAL (operands[2])));
        !          3212:          return AS2 (lea%L0,%a1,%0);
        !          3213:        }
        !          3214:     }
        !          3215: 
        !          3216:   if (REG_P (operands[2]))
        !          3217:     return AS2 (sal%L0,%b2,%0);
        !          3218: 
        !          3219:   if (REG_P (operands[0]) && operands[2] == const1_rtx)
        !          3220:     return AS2 (add%L0,%0,%0);
        !          3221: 
        !          3222:   return AS2 (sal%L0,%2,%0);
        !          3223: }")
        !          3224: 
        !          3225: (define_insn "ashlhi3"
        !          3226:   [(set (match_operand:HI 0 "general_operand" "=rm")
        !          3227:        (ashift:HI (match_operand:HI 1 "general_operand" "0")
        !          3228:                   (match_operand:HI 2 "nonmemory_operand" "cI")))]
        !          3229:   ""
        !          3230:   "*
        !          3231: {
        !          3232:   if (REG_P (operands[2]))
        !          3233:     return AS2 (sal%W0,%b2,%0);
        !          3234: 
        !          3235:   if (REG_P (operands[0]) && operands[2] == const1_rtx)
        !          3236:     return AS2 (add%W0,%0,%0);
        !          3237: 
        !          3238:   return AS2 (sal%W0,%2,%0);
        !          3239: }")
        !          3240: 
        !          3241: (define_insn "ashlqi3"
        !          3242:   [(set (match_operand:QI 0 "general_operand" "=qm")
        !          3243:        (ashift:QI (match_operand:QI 1 "general_operand" "0")
        !          3244:                   (match_operand:QI 2 "nonmemory_operand" "cI")))]
        !          3245:   ""
        !          3246:   "*
        !          3247: {
        !          3248:   if (REG_P (operands[2]))
        !          3249:     return AS2 (sal%B0,%b2,%0);
        !          3250: 
        !          3251:   if (REG_P (operands[0]) && operands[2] == const1_rtx)
        !          3252:     return AS2 (add%B0,%0,%0);
        !          3253: 
        !          3254:   return AS2 (sal%B0,%2,%0);
        !          3255: }")
        !          3256: 
        !          3257: ;; See comment above `ashldi3' about how this works.
        !          3258: 
        !          3259: (define_expand "ashrdi3"
        !          3260:   [(set (match_operand:DI 0 "register_operand" "")
        !          3261:        (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
        !          3262:                     (match_operand:QI 2 "nonmemory_operand" "")))]
        !          3263:   ""
        !          3264:   "
        !          3265: {
        !          3266:   if (GET_CODE (operands[2]) != CONST_INT
        !          3267:       || ! CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
        !          3268:     {
        !          3269:       operands[2] = copy_to_mode_reg (QImode, operands[2]);
        !          3270:       emit_insn (gen_ashrdi3_non_const_int (operands[0], operands[1],
        !          3271:                                            operands[2]));
        !          3272:     }
        !          3273:   else
        !          3274:     emit_insn (gen_ashrdi3_const_int (operands[0], operands[1], operands[2]));
        !          3275: 
        !          3276:   DONE;
        !          3277: }")
        !          3278: 
        !          3279: (define_insn "ashrdi3_const_int"
        !          3280:   [(set (match_operand:DI 0 "register_operand" "=&r")
        !          3281:        (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
        !          3282:                     (match_operand:QI 2 "const_int_operand" "J")))]
        !          3283:   ""
        !          3284:   "*
        !          3285: {
        !          3286:   rtx xops[4], low[1], high[1];
        !          3287: 
        !          3288:   CC_STATUS_INIT;
        !          3289: 
        !          3290:   split_di (operands, 1, low, high);
        !          3291:   xops[0] = operands[2];
        !          3292:   xops[1] = const1_rtx;
        !          3293:   xops[2] = low[0];
        !          3294:   xops[3] = high[0];
        !          3295: 
        !          3296:   if (INTVAL (xops[0]) > 31)
        !          3297:     {
        !          3298:       xops[1] = GEN_INT (31);
        !          3299:       output_asm_insn (AS2 (mov%L2,%3,%2), xops);
        !          3300:       output_asm_insn (AS2 (sar%L3,%1,%3), xops);      /* shift by 32 */
        !          3301: 
        !          3302:       if (INTVAL (xops[0]) > 32)
        !          3303:         {
        !          3304:          xops[0] = GEN_INT (INTVAL (xops[0]) - 32);
        !          3305:          output_asm_insn (AS2 (sar%L2,%0,%2), xops); /* Remaining shift */
        !          3306:        }
        !          3307:     }
        !          3308:   else
        !          3309:     {
        !          3310:       output_asm_insn (AS3 (shrd%L2,%0,%3,%2), xops);
        !          3311:       output_asm_insn (AS2 (sar%L3,%0,%3), xops);
        !          3312:     }
        !          3313: 
        !          3314:   RET;
        !          3315: }")
        !          3316: 
        !          3317: (define_insn "ashrdi3_non_const_int"
        !          3318:   [(set (match_operand:DI 0 "register_operand" "=&r")
        !          3319:        (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
        !          3320:                     (match_operand:QI 2 "register_operand" "c")))
        !          3321:    (clobber (match_dup 2))]
        !          3322:   ""
        !          3323:   "*
        !          3324: {
        !          3325:   rtx xops[4], low[1], high[1];
        !          3326: 
        !          3327:   CC_STATUS_INIT;
        !          3328: 
        !          3329:   split_di (operands, 1, low, high);
        !          3330:   xops[0] = operands[2];
        !          3331:   xops[1] = const1_rtx;
        !          3332:   xops[2] = low[0];
        !          3333:   xops[3] = high[0];
        !          3334: 
        !          3335:   output_asm_insn (AS2 (ror%B0,%1,%0), xops);  /* shift count / 2 */
        !          3336: 
        !          3337:   output_asm_insn (AS3_SHIFT_DOUBLE (shrd%L2,%0,%3,%2), xops);
        !          3338:   output_asm_insn (AS2 (sar%L3,%0,%3), xops);
        !          3339:   output_asm_insn (AS3_SHIFT_DOUBLE (shrd%L2,%0,%3,%2), xops);
        !          3340:   output_asm_insn (AS2 (sar%L3,%0,%3), xops);
        !          3341: 
        !          3342:   xops[1] = GEN_INT (7);                       /* shift count & 1 */
        !          3343: 
        !          3344:   output_asm_insn (AS2 (shr%B0,%1,%0), xops);
        !          3345: 
        !          3346:   output_asm_insn (AS3_SHIFT_DOUBLE (shrd%L2,%0,%3,%2), xops);
        !          3347:   output_asm_insn (AS2 (sar%L3,%0,%3), xops);
        !          3348: 
        !          3349:   RET;
        !          3350: }")
        !          3351: 
        !          3352: (define_insn "ashrsi3"
        !          3353:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          3354:        (ashiftrt:SI (match_operand:SI 1 "general_operand" "0")
        !          3355:                     (match_operand:SI 2 "nonmemory_operand" "cI")))]
        !          3356:   ""
        !          3357:   "*
        !          3358: {
        !          3359:   if (REG_P (operands[2]))
        !          3360:     return AS2 (sar%L0,%b2,%0);
        !          3361:   else
        !          3362:     return AS2 (sar%L0,%2,%0);
        !          3363: }")
        !          3364: 
        !          3365: (define_insn "ashrhi3"
        !          3366:   [(set (match_operand:HI 0 "general_operand" "=rm")
        !          3367:        (ashiftrt:HI (match_operand:HI 1 "general_operand" "0")
        !          3368:                     (match_operand:HI 2 "nonmemory_operand" "cI")))]
        !          3369:   ""
        !          3370:   "*
        !          3371: {
        !          3372:   if (REG_P (operands[2]))
        !          3373:     return AS2 (sar%W0,%b2,%0);
        !          3374:   else
        !          3375:     return AS2 (sar%W0,%2,%0);
        !          3376: }")
        !          3377: 
        !          3378: (define_insn "ashrqi3"
        !          3379:   [(set (match_operand:QI 0 "general_operand" "=qm")
        !          3380:        (ashiftrt:QI (match_operand:QI 1 "general_operand" "0")
        !          3381:                     (match_operand:QI 2 "nonmemory_operand" "cI")))]
        !          3382:   ""
        !          3383:   "*
        !          3384: {
        !          3385:   if (REG_P (operands[2]))
        !          3386:     return AS2 (sar%B0,%b2,%0);
        !          3387:   else
        !          3388:     return AS2 (sar%B0,%2,%0);
        !          3389: }")
        !          3390: 
        !          3391: ;;- logical shift instructions
        !          3392: 
        !          3393: ;; See comment above `ashldi3' about how this works.
        !          3394: 
        !          3395: (define_expand "lshrdi3"
        !          3396:   [(set (match_operand:DI 0 "register_operand" "")
        !          3397:        (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
        !          3398:                     (match_operand:QI 2 "nonmemory_operand" "")))]
        !          3399:   ""
        !          3400:   "
        !          3401: {
        !          3402:   if (GET_CODE (operands[2]) != CONST_INT
        !          3403:       || ! CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
        !          3404:     {
        !          3405:       operands[2] = copy_to_mode_reg (QImode, operands[2]);
        !          3406:       emit_insn (gen_lshrdi3_non_const_int (operands[0], operands[1],
        !          3407:                                            operands[2]));
        !          3408:     }
        !          3409:   else
        !          3410:     emit_insn (gen_lshrdi3_const_int (operands[0], operands[1], operands[2]));
        !          3411: 
        !          3412:   DONE;
        !          3413: }")
        !          3414: 
        !          3415: (define_insn "lshrdi3_const_int"
        !          3416:   [(set (match_operand:DI 0 "register_operand" "=&r")
        !          3417:        (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
        !          3418:                     (match_operand:QI 2 "const_int_operand" "J")))]
        !          3419:   ""
        !          3420:   "*
        !          3421: {
        !          3422:   rtx xops[4], low[1], high[1];
        !          3423: 
        !          3424:   CC_STATUS_INIT;
        !          3425: 
        !          3426:   split_di (operands, 1, low, high);
        !          3427:   xops[0] = operands[2];
        !          3428:   xops[1] = const1_rtx;
        !          3429:   xops[2] = low[0];
        !          3430:   xops[3] = high[0];
        !          3431: 
        !          3432:   if (INTVAL (xops[0]) > 31)
        !          3433:     {
        !          3434:       output_asm_insn (AS2 (mov%L2,%3,%2), xops);      /* Fast shift by 32 */
        !          3435:       output_asm_insn (AS2 (xor%L3,%3,%3), xops);
        !          3436: 
        !          3437:       if (INTVAL (xops[0]) > 32)
        !          3438:         {
        !          3439:          xops[0] = GEN_INT (INTVAL (xops[0]) - 32);
        !          3440:          output_asm_insn (AS2 (shr%L2,%0,%2), xops); /* Remaining shift */
        !          3441:        }
        !          3442:     }
        !          3443:   else
        !          3444:     {
        !          3445:       output_asm_insn (AS3 (shrd%L2,%0,%3,%2), xops);
        !          3446:       output_asm_insn (AS2 (shr%L3,%0,%3), xops);
        !          3447:     }
        !          3448: 
        !          3449:   RET;
        !          3450: }")
        !          3451: 
        !          3452: (define_insn "lshrdi3_non_const_int"
        !          3453:   [(set (match_operand:DI 0 "register_operand" "=&r")
        !          3454:        (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
        !          3455:                     (match_operand:QI 2 "register_operand" "c")))
        !          3456:    (clobber (match_dup 2))]
        !          3457:   ""
        !          3458:   "*
        !          3459: {
        !          3460:   rtx xops[4], low[1], high[1];
        !          3461: 
        !          3462:   CC_STATUS_INIT;
        !          3463: 
        !          3464:   split_di (operands, 1, low, high);
        !          3465:   xops[0] = operands[2];
        !          3466:   xops[1] = const1_rtx;
        !          3467:   xops[2] = low[0];
        !          3468:   xops[3] = high[0];
        !          3469: 
        !          3470:   output_asm_insn (AS2 (ror%B0,%1,%0), xops);  /* shift count / 2 */
        !          3471: 
        !          3472:   output_asm_insn (AS3_SHIFT_DOUBLE (shrd%L2,%0,%3,%2), xops);
        !          3473:   output_asm_insn (AS2 (shr%L3,%0,%3), xops);
        !          3474:   output_asm_insn (AS3_SHIFT_DOUBLE (shrd%L2,%0,%3,%2), xops);
        !          3475:   output_asm_insn (AS2 (shr%L3,%0,%3), xops);
        !          3476: 
        !          3477:   xops[1] = GEN_INT (7);                       /* shift count & 1 */
        !          3478: 
        !          3479:   output_asm_insn (AS2 (shr%B0,%1,%0), xops);
        !          3480: 
        !          3481:   output_asm_insn (AS3_SHIFT_DOUBLE (shrd%L2,%0,%3,%2), xops);
        !          3482:   output_asm_insn (AS2 (shr%L3,%0,%3), xops);
        !          3483: 
        !          3484:   RET;
        !          3485: }")
        !          3486: 
        !          3487: (define_insn "lshrsi3"
        !          3488:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          3489:        (lshiftrt:SI (match_operand:SI 1 "general_operand" "0")
        !          3490:                     (match_operand:SI 2 "nonmemory_operand" "cI")))]
        !          3491:   ""
        !          3492:   "*
        !          3493: {
        !          3494:   if (REG_P (operands[2]))
        !          3495:     return AS2 (shr%L0,%b2,%0);
        !          3496:   else
        !          3497:     return AS2 (shr%L0,%2,%1);
        !          3498: }")
        !          3499: 
        !          3500: (define_insn "lshrhi3"
        !          3501:   [(set (match_operand:HI 0 "general_operand" "=rm")
        !          3502:        (lshiftrt:HI (match_operand:HI 1 "general_operand" "0")
        !          3503:                     (match_operand:HI 2 "nonmemory_operand" "cI")))]
        !          3504:   ""
        !          3505:   "*
        !          3506: {
        !          3507:   if (REG_P (operands[2]))
        !          3508:     return AS2 (shr%W0,%b2,%0);
        !          3509:   else
        !          3510:     return AS2 (shr%W0,%2,%0);
        !          3511: }")
        !          3512: 
        !          3513: (define_insn "lshrqi3"
        !          3514:   [(set (match_operand:QI 0 "general_operand" "=qm")
        !          3515:        (lshiftrt:QI (match_operand:QI 1 "general_operand" "0")
        !          3516:                     (match_operand:QI 2 "nonmemory_operand" "cI")))]
        !          3517:   ""
        !          3518:   "*
        !          3519: {
        !          3520:   if (REG_P (operands[2]))
        !          3521:     return AS2 (shr%B0,%b2,%0);
        !          3522:   else
        !          3523:     return AS2 (shr%B0,%2,%0);
        !          3524: }")
        !          3525: 
        !          3526: ;;- rotate instructions
        !          3527: 
        !          3528: (define_insn "rotlsi3"
        !          3529:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          3530:        (rotate:SI (match_operand:SI 1 "general_operand" "0")
        !          3531:                   (match_operand:SI 2 "nonmemory_operand" "cI")))]
        !          3532:   ""
        !          3533:   "*
        !          3534: {
        !          3535:   if (REG_P (operands[2]))
        !          3536:     return AS2 (rol%L0,%b2,%0);
        !          3537:   else
        !          3538:     return AS2 (rol%L0,%2,%0);
        !          3539: }")
        !          3540: 
        !          3541: (define_insn "rotlhi3"
        !          3542:   [(set (match_operand:HI 0 "general_operand" "=rm")
        !          3543:        (rotate:HI (match_operand:HI 1 "general_operand" "0")
        !          3544:                   (match_operand:HI 2 "nonmemory_operand" "cI")))]
        !          3545:   ""
        !          3546:   "*
        !          3547: {
        !          3548:   if (REG_P (operands[2]))
        !          3549:     return AS2 (rol%W0,%b2,%0);
        !          3550:   else
        !          3551:     return AS2 (rol%W0,%2,%0);
        !          3552: }")
        !          3553: 
        !          3554: (define_insn "rotlqi3"
        !          3555:   [(set (match_operand:QI 0 "general_operand" "=qm")
        !          3556:        (rotate:QI (match_operand:QI 1 "general_operand" "0")
        !          3557:                   (match_operand:QI 2 "nonmemory_operand" "cI")))]
        !          3558:   ""
        !          3559:   "*
        !          3560: {
        !          3561:   if (REG_P (operands[2]))
        !          3562:     return AS2 (rol%B0,%b2,%0);
        !          3563:   else
        !          3564:     return AS2 (rol%B0,%2,%0);
        !          3565: }")
        !          3566: 
        !          3567: (define_insn "rotrsi3"
        !          3568:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          3569:        (rotatert:SI (match_operand:SI 1 "general_operand" "0")
        !          3570:                     (match_operand:SI 2 "nonmemory_operand" "cI")))]
        !          3571:   ""
        !          3572:   "*
        !          3573: {
        !          3574:   if (REG_P (operands[2]))
        !          3575:     return AS2 (ror%L0,%b2,%0);
        !          3576:   else
        !          3577:     return AS2 (ror%L0,%2,%0);
        !          3578: }")
        !          3579: 
        !          3580: (define_insn "rotrhi3"
        !          3581:   [(set (match_operand:HI 0 "general_operand" "=rm")
        !          3582:        (rotatert:HI (match_operand:HI 1 "general_operand" "0")
        !          3583:                     (match_operand:HI 2 "nonmemory_operand" "cI")))]
        !          3584:   ""
        !          3585:   "*
        !          3586: {
        !          3587:   if (REG_P (operands[2]))
        !          3588:     return AS2 (ror%W0,%b2,%0);
        !          3589:   else
        !          3590:     return AS2 (ror%W0,%2,%0);
        !          3591: }")
        !          3592: 
        !          3593: (define_insn "rotrqi3"
        !          3594:   [(set (match_operand:QI 0 "general_operand" "=qm")
        !          3595:        (rotatert:QI (match_operand:QI 1 "general_operand" "0")
        !          3596:                     (match_operand:QI 2 "nonmemory_operand" "cI")))]
        !          3597:   ""
        !          3598:   "*
        !          3599: {
        !          3600:   if (REG_P (operands[2]))
        !          3601:     return AS2 (ror%B0,%b2,%0);
        !          3602:   else
        !          3603:     return AS2 (ror%B0,%2,%0);
        !          3604: }")
        !          3605: 
        !          3606: /*
        !          3607: ;; This usually looses.  But try a define_expand to recognize a few case
        !          3608: ;; we can do efficiently, such as accessing the "high" QImode registers,
        !          3609: ;; %ah, %bh, %ch, %dh.
        !          3610: (define_insn "insv"
        !          3611:   [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+&r")
        !          3612:                         (match_operand:SI 1 "general_operand" "i")
        !          3613:                         (match_operand:SI 2 "general_operand" "i"))
        !          3614:        (match_operand:SI 3 "general_operand" "ri"))]
        !          3615:   ""
        !          3616:   "*
        !          3617: {
        !          3618:   if (INTVAL (operands[1]) + INTVAL (operands[2]) > GET_MODE_BITSIZE (SImode))
        !          3619:     abort ();
        !          3620:   if (GET_CODE (operands[3]) == CONST_INT)
        !          3621:     {
        !          3622:       unsigned int mask = (1 << INTVAL (operands[1])) - 1; 
        !          3623:       operands[1] = GEN_INT (~(mask << INTVAL (operands[2])));
        !          3624:       output_asm_insn (AS2 (and%L0,%1,%0), operands);
        !          3625:       operands[3] = GEN_INT (INTVAL (operands[3]) << INTVAL (operands[2]));
        !          3626:       output_asm_insn (AS2 (or%L0,%3,%0), operands);
        !          3627:     }
        !          3628:   else
        !          3629:     {
        !          3630:       operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
        !          3631:       if (INTVAL (operands[2]))
        !          3632:        output_asm_insn (AS2 (ror%L0,%2,%0), operands);
        !          3633:       output_asm_insn (AS3 (shrd%L0,%1,%3,%0), operands);
        !          3634:       operands[2] = GEN_INT (BITS_PER_WORD
        !          3635:                             - INTVAL (operands[1]) - INTVAL (operands[2]));
        !          3636:       if (INTVAL (operands[2]))
        !          3637:        output_asm_insn (AS2 (ror%L0,%2,%0), operands);
        !          3638:     }
        !          3639:   RET;
        !          3640: }")
        !          3641: */
        !          3642: /*
        !          3643: ;; ??? There are problems with the mode of operand[3].  The point of this
        !          3644: ;; is to represent an HImode move to a "high byte" register.
        !          3645: 
        !          3646: (define_expand "insv"
        !          3647:   [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "")
        !          3648:                         (match_operand:SI 1 "immediate_operand" "")
        !          3649:                         (match_operand:SI 2 "immediate_operand" ""))
        !          3650:        (match_operand:QI 3 "general_operand" "ri"))]
        !          3651:   ""
        !          3652:   "
        !          3653: {
        !          3654:   if (GET_CODE (operands[1]) != CONST_INT
        !          3655:       || GET_CODE (operands[2]) != CONST_INT)
        !          3656:     FAIL;
        !          3657: 
        !          3658:   if (! (INTVAL (operands[1]) == 8
        !          3659:         && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 0))
        !          3660:       && ! INTVAL (operands[1]) == 1)
        !          3661:     FAIL;
        !          3662: }")
        !          3663: 
        !          3664: ;; ??? Are these constraints right?
        !          3665: (define_insn ""
        !          3666:   [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+&qo")
        !          3667:                         (const_int 8)
        !          3668:                         (const_int 8))
        !          3669:        (match_operand:QI 1 "general_operand" "qn"))]
        !          3670:   ""
        !          3671:   "*
        !          3672: {
        !          3673:   if (REG_P (operands[0]))
        !          3674:     return AS2 (mov%B0,%1,%h0);
        !          3675: 
        !          3676:   operands[0] = adj_offsettable_operand (operands[0], 1);
        !          3677:   return AS2 (mov%B0,%1,%0);
        !          3678: }")
        !          3679: */
        !          3680: 
        !          3681: ;; On i386, the register count for a bit operation is *not* truncated,
        !          3682: ;; so SHIFT_COUNT_TRUNCATED must not be defined.
        !          3683: 
        !          3684: ;; On i486, the shift & or/and code is faster than bts or btr.  If
        !          3685: ;; operands[0] is a MEM, the bt[sr] is half as fast as the normal code.
        !          3686: 
        !          3687: ;; On i386, bts is a little faster if operands[0] is a reg, and a
        !          3688: ;; little slower if operands[0] is a MEM, than the shift & or/and code.
        !          3689: ;; Use bts & btr, since they reload better.
        !          3690: 
        !          3691: ;; General bit set and clear.
        !          3692: (define_insn ""
        !          3693:   [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+rm")
        !          3694:                         (const_int 1)
        !          3695:                         (match_operand:SI 2 "general_operand" "r"))
        !          3696:        (match_operand:SI 3 "const_int_operand" "n"))]
        !          3697:   "! TARGET_486 && GET_CODE (operands[2]) != CONST_INT"
        !          3698:   "*
        !          3699: {
        !          3700:   CC_STATUS_INIT;
        !          3701: 
        !          3702:   if (INTVAL (operands[3]) == 1)
        !          3703:     return AS2 (bts%L0,%2,%0);
        !          3704:   else
        !          3705:     return AS2 (btr%L0,%2,%0);
        !          3706: }")
        !          3707: 
        !          3708: ;; Bit complement.  See comments on previous pattern.
        !          3709: ;; ??? Is this really worthwhile?
        !          3710: (define_insn ""
        !          3711:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          3712:        (xor:SI (ashift:SI (const_int 1)
        !          3713:                           (match_operand:SI 1 "general_operand" "r"))
        !          3714:                (match_operand:SI 2 "general_operand" "0")))]
        !          3715:   "! TARGET_486 && GET_CODE (operands[1]) != CONST_INT"
        !          3716:   "*
        !          3717: {
        !          3718:   CC_STATUS_INIT;
        !          3719: 
        !          3720:   return AS2 (btc%L0,%1,%0);
        !          3721: }")
        !          3722: 
        !          3723: (define_insn ""
        !          3724:   [(set (match_operand:SI 0 "general_operand" "=rm")
        !          3725:        (xor:SI (match_operand:SI 1 "general_operand" "0")
        !          3726:                (ashift:SI (const_int 1)
        !          3727:                           (match_operand:SI 2 "general_operand" "r"))))]
        !          3728:   "! TARGET_486 && GET_CODE (operands[2]) != CONST_INT"
        !          3729:   "*
        !          3730: {
        !          3731:   CC_STATUS_INIT;
        !          3732: 
        !          3733:   return AS2 (btc%L0,%2,%0);
        !          3734: }")
        !          3735: 
        !          3736: ;; Recognizers for bit-test instructions.
        !          3737: 
        !          3738: ;; The bt opcode allows a MEM in operands[0].  But on both i386 and
        !          3739: ;; i486, it is faster to copy a MEM to REG and then use bt, than to use
        !          3740: ;; bt on the MEM directly.
        !          3741: 
        !          3742: ;; ??? The first argument of a zero_extract must not be reloaded, so
        !          3743: ;; don't allow a MEM in the operand predicate without allowing it in the
        !          3744: ;; constraint.
        !          3745: 
        !          3746: (define_insn ""
        !          3747:   [(set (cc0) (zero_extract (match_operand:SI 0 "register_operand" "r")
        !          3748:                            (const_int 1)
        !          3749:                            (match_operand:SI 1 "general_operand" "r")))]
        !          3750:   "GET_CODE (operands[1]) != CONST_INT"
        !          3751:   "*
        !          3752: {
        !          3753:   cc_status.flags |= CC_Z_IN_NOT_C;
        !          3754:   return AS2 (bt%L0,%1,%0);
        !          3755: }")
        !          3756: 
        !          3757: (define_insn ""
        !          3758:   [(set (cc0) (zero_extract (match_operand:SI 0 "register_operand" "r")
        !          3759:                            (match_operand:SI 1 "const_int_operand" "n")
        !          3760:                            (match_operand:SI 2 "const_int_operand" "n")))]
        !          3761:   ""
        !          3762:   "*
        !          3763: {
        !          3764:   unsigned int mask;
        !          3765: 
        !          3766:   mask = ((1 << INTVAL (operands[1])) - 1) << INTVAL (operands[2]);
        !          3767:   operands[1] = GEN_INT (mask);
        !          3768: 
        !          3769:   if (QI_REG_P (operands[0]))
        !          3770:     {
        !          3771:       if ((mask & ~0xff) == 0)
        !          3772:         {
        !          3773:          cc_status.flags |= CC_NOT_NEGATIVE;
        !          3774:          return AS2 (test%B0,%1,%b0);
        !          3775:        }
        !          3776: 
        !          3777:       if ((mask & ~0xff00) == 0)
        !          3778:         {
        !          3779:          cc_status.flags |= CC_NOT_NEGATIVE;
        !          3780:          operands[1] = GEN_INT (mask >> 8);
        !          3781:          return AS2 (test%B0,%1,%h0);
        !          3782:        }
        !          3783:     }
        !          3784: 
        !          3785:   return AS2 (test%L0,%1,%0);
        !          3786: }")
        !          3787: 
        !          3788: ;; ??? All bets are off if operand 0 is a volatile MEM reference.
        !          3789: ;; The CPU may access unspecified bytes around the actual target byte.
        !          3790: 
        !          3791: (define_insn ""
        !          3792:   [(set (cc0) (zero_extract (match_operand:QI 0 "general_operand" "rm")
        !          3793:                            (match_operand:SI 1 "const_int_operand" "n")
        !          3794:                            (match_operand:SI 2 "const_int_operand" "n")))]
        !          3795:   "GET_CODE (operands[0]) != MEM || ! MEM_VOLATILE_P (operands[0])"
        !          3796:   "*
        !          3797: {
        !          3798:   unsigned int mask;
        !          3799: 
        !          3800:   mask = ((1 << INTVAL (operands[1])) - 1) << INTVAL (operands[2]);
        !          3801:   operands[1] = GEN_INT (mask);
        !          3802: 
        !          3803:   if (! REG_P (operands[0]) || QI_REG_P (operands[0]))
        !          3804:     {
        !          3805:       if ((mask & ~0xff) == 0)
        !          3806:         {
        !          3807:          cc_status.flags |= CC_NOT_NEGATIVE;
        !          3808:          return AS2 (test%B0,%1,%b0);
        !          3809:        }
        !          3810: 
        !          3811:       if ((mask & ~0xff00) == 0)
        !          3812:         {
        !          3813:          cc_status.flags |= CC_NOT_NEGATIVE;
        !          3814:          operands[1] = GEN_INT (mask >> 8);
        !          3815: 
        !          3816:          if (QI_REG_P (operands[0]))
        !          3817:            return AS2 (test%B0,%1,%h0);
        !          3818:          else
        !          3819:            {
        !          3820:              operands[0] = adj_offsettable_operand (operands[0], 1);
        !          3821:              return AS2 (test%B0,%1,%b0);
        !          3822:            }
        !          3823:        }
        !          3824: 
        !          3825:       if (GET_CODE (operands[0]) == MEM && (mask & ~0xff0000) == 0)
        !          3826:         {
        !          3827:          cc_status.flags |= CC_NOT_NEGATIVE;
        !          3828:          operands[1] = GEN_INT (mask >> 16);
        !          3829:          operands[0] = adj_offsettable_operand (operands[0], 2);
        !          3830:          return AS2 (test%B0,%1,%b0);
        !          3831:        }
        !          3832: 
        !          3833:       if (GET_CODE (operands[0]) == MEM && (mask & ~0xff000000) == 0)
        !          3834:         {
        !          3835:          cc_status.flags |= CC_NOT_NEGATIVE;
        !          3836:          operands[1] = GEN_INT (mask >> 24);
        !          3837:          operands[0] = adj_offsettable_operand (operands[0], 3);
        !          3838:          return AS2 (test%B0,%1,%b0);
        !          3839:        }
        !          3840:     }
        !          3841: 
        !          3842:   if (CONSTANT_P (operands[1]) || GET_CODE (operands[0]) == MEM)
        !          3843:     return AS2 (test%L0,%1,%0);
        !          3844: 
        !          3845:   return AS2 (test%L1,%0,%1);
        !          3846: }")
        !          3847: 
        !          3848: ;; Store-flag instructions.
        !          3849: 
        !          3850: ;; For all sCOND expanders, also expand the compare or test insn that
        !          3851: ;; generates cc0.  Generate an equality comparison if `seq' or `sne'.
        !          3852: 
        !          3853: ;; The 386 sCOND opcodes can write to memory.  But a gcc sCOND insn may
        !          3854: ;; not have any input reloads.  A MEM write might need an input reload
        !          3855: ;; for the address of the MEM.  So don't allow MEM as the SET_DEST.
        !          3856: 
        !          3857: (define_expand "seq"
        !          3858:   [(match_dup 1)
        !          3859:    (set (match_operand:QI 0 "register_operand" "")
        !          3860:        (eq:QI (cc0) (const_int 0)))]
        !          3861:   ""
        !          3862:   "
        !          3863: {
        !          3864:   if (TARGET_IEEE_FP
        !          3865:       && GET_MODE_CLASS (GET_MODE (i386_compare_op0)) == MODE_FLOAT)
        !          3866:     operands[1] = (*i386_compare_gen_eq)(i386_compare_op0, i386_compare_op1);
        !          3867:   else
        !          3868:     operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);
        !          3869: }")
        !          3870: 
        !          3871: (define_insn ""
        !          3872:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          3873:        (eq:QI (cc0) (const_int 0)))]
        !          3874:   ""
        !          3875:   "*
        !          3876: {
        !          3877:   if (cc_prev_status.flags & CC_Z_IN_NOT_C)
        !          3878:     return AS1 (setnb,%0);
        !          3879:   else
        !          3880:     return AS1 (sete,%0);
        !          3881: }")
        !          3882: 
        !          3883: (define_expand "sne"
        !          3884:   [(match_dup 1)
        !          3885:    (set (match_operand:QI 0 "register_operand" "")
        !          3886:        (ne:QI (cc0) (const_int 0)))]
        !          3887:   ""
        !          3888:   "
        !          3889: {
        !          3890:   if (TARGET_IEEE_FP
        !          3891:       && GET_MODE_CLASS (GET_MODE (i386_compare_op0)) == MODE_FLOAT)
        !          3892:     operands[1] = (*i386_compare_gen_eq)(i386_compare_op0, i386_compare_op1);
        !          3893:   else
        !          3894:     operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);
        !          3895: }")
        !          3896: 
        !          3897: (define_insn ""
        !          3898:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          3899:        (ne:QI (cc0) (const_int 0)))]
        !          3900:   ""
        !          3901:   "*
        !          3902: {
        !          3903:   if (cc_prev_status.flags & CC_Z_IN_NOT_C)
        !          3904:     return AS1 (setb,%0);
        !          3905:   else
        !          3906:     return AS1 (setne,%0);
        !          3907: }
        !          3908: ")
        !          3909: 
        !          3910: (define_expand "sgt"
        !          3911:   [(match_dup 1)
        !          3912:    (set (match_operand:QI 0 "register_operand" "")
        !          3913:        (gt:QI (cc0) (const_int 0)))]
        !          3914:   ""
        !          3915:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          3916: 
        !          3917: (define_insn ""
        !          3918:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          3919:        (gt:QI (cc0) (const_int 0)))]
        !          3920:   ""
        !          3921:   "*
        !          3922: {
        !          3923:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          3924:     return AS1 (sete,%0);
        !          3925: 
        !          3926:   OUTPUT_JUMP (\"setg %0\", \"seta %0\", NULL_PTR);
        !          3927: }")
        !          3928: 
        !          3929: (define_expand "sgtu"
        !          3930:   [(match_dup 1)
        !          3931:    (set (match_operand:QI 0 "register_operand" "")
        !          3932:        (gtu:QI (cc0) (const_int 0)))]
        !          3933:   ""
        !          3934:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          3935: 
        !          3936: (define_insn ""
        !          3937:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          3938:        (gtu:QI (cc0) (const_int 0)))]
        !          3939:   ""
        !          3940:   "* return \"seta %0\"; ")
        !          3941: 
        !          3942: (define_expand "slt"
        !          3943:   [(match_dup 1)
        !          3944:    (set (match_operand:QI 0 "register_operand" "")
        !          3945:        (lt:QI (cc0) (const_int 0)))]
        !          3946:   ""
        !          3947:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          3948: 
        !          3949: (define_insn ""
        !          3950:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          3951:        (lt:QI (cc0) (const_int 0)))]
        !          3952:   ""
        !          3953:   "*
        !          3954: {
        !          3955:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          3956:     return AS1 (sete,%0);
        !          3957: 
        !          3958:   OUTPUT_JUMP (\"setl %0\", \"setb %0\", \"sets %0\");
        !          3959: }")
        !          3960: 
        !          3961: (define_expand "sltu"
        !          3962:   [(match_dup 1)
        !          3963:    (set (match_operand:QI 0 "register_operand" "")
        !          3964:        (ltu:QI (cc0) (const_int 0)))]
        !          3965:   ""
        !          3966:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          3967: 
        !          3968: (define_insn ""
        !          3969:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          3970:        (ltu:QI (cc0) (const_int 0)))]
        !          3971:   ""
        !          3972:   "* return \"setb %0\"; ")
        !          3973: 
        !          3974: (define_expand "sge"
        !          3975:   [(match_dup 1)
        !          3976:    (set (match_operand:QI 0 "register_operand" "")
        !          3977:        (ge:QI (cc0) (const_int 0)))]
        !          3978:   ""
        !          3979:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          3980: 
        !          3981: (define_insn ""
        !          3982:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          3983:        (ge:QI (cc0) (const_int 0)))]
        !          3984:   ""
        !          3985:   "*
        !          3986: {
        !          3987:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          3988:     return AS1 (sete,%0);
        !          3989: 
        !          3990:   OUTPUT_JUMP (\"setge %0\", \"setae %0\", \"setns %0\");
        !          3991: }")
        !          3992: 
        !          3993: (define_expand "sgeu"
        !          3994:   [(match_dup 1)
        !          3995:    (set (match_operand:QI 0 "register_operand" "")
        !          3996:        (geu:QI (cc0) (const_int 0)))]
        !          3997:   ""
        !          3998:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          3999: 
        !          4000: (define_insn ""
        !          4001:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          4002:        (geu:QI (cc0) (const_int 0)))]
        !          4003:   ""
        !          4004:   "* return \"setae %0\"; ")
        !          4005: 
        !          4006: (define_expand "sle"
        !          4007:   [(match_dup 1)
        !          4008:    (set (match_operand:QI 0 "register_operand" "")
        !          4009:        (le:QI (cc0) (const_int 0)))]
        !          4010:   ""
        !          4011:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4012: 
        !          4013: (define_insn ""
        !          4014:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          4015:        (le:QI (cc0) (const_int 0)))]
        !          4016:   ""
        !          4017:   "*
        !          4018: {
        !          4019:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          4020:     return AS1 (setb,%0);
        !          4021: 
        !          4022:   OUTPUT_JUMP (\"setle %0\", \"setbe %0\", NULL_PTR);
        !          4023: }")
        !          4024: 
        !          4025: (define_expand "sleu"
        !          4026:   [(match_dup 1)
        !          4027:    (set (match_operand:QI 0 "register_operand" "")
        !          4028:        (leu:QI (cc0) (const_int 0)))]
        !          4029:   ""
        !          4030:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4031: 
        !          4032: (define_insn ""
        !          4033:   [(set (match_operand:QI 0 "register_operand" "=q")
        !          4034:        (leu:QI (cc0) (const_int 0)))]
        !          4035:   ""
        !          4036:   "* return \"setbe %0\"; ")
        !          4037: 
        !          4038: ;; Basic conditional jump instructions.
        !          4039: ;; We ignore the overflow flag for signed branch instructions.
        !          4040: 
        !          4041: ;; For all bCOND expanders, also expand the compare or test insn that
        !          4042: ;; generates cc0.  Generate an equality comparison if `beq' or `bne'.
        !          4043: 
        !          4044: (define_expand "beq"
        !          4045:   [(match_dup 1)
        !          4046:    (set (pc)
        !          4047:        (if_then_else (eq (cc0)
        !          4048:                          (const_int 0))
        !          4049:                      (label_ref (match_operand 0 "" ""))
        !          4050:                      (pc)))]
        !          4051:   ""
        !          4052:   "
        !          4053: {
        !          4054:   if (TARGET_IEEE_FP
        !          4055:       && GET_MODE_CLASS (GET_MODE (i386_compare_op0)) == MODE_FLOAT)
        !          4056:     operands[1] = (*i386_compare_gen_eq)(i386_compare_op0, i386_compare_op1);
        !          4057:   else
        !          4058:     operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);
        !          4059: }")
        !          4060: 
        !          4061: (define_insn ""
        !          4062:   [(set (pc)
        !          4063:        (if_then_else (eq (cc0)
        !          4064:                          (const_int 0))
        !          4065:                      (label_ref (match_operand 0 "" ""))
        !          4066:                      (pc)))]
        !          4067:   ""
        !          4068:   "*
        !          4069: {
        !          4070:   if (cc_prev_status.flags & CC_Z_IN_NOT_C)
        !          4071:     return \"jnc %l0\";
        !          4072:   else
        !          4073:     return \"je %l0\";
        !          4074: }")
        !          4075: 
        !          4076: (define_expand "bne"
        !          4077:   [(match_dup 1)
        !          4078:    (set (pc)
        !          4079:        (if_then_else (ne (cc0)
        !          4080:                          (const_int 0))
        !          4081:                      (label_ref (match_operand 0 "" ""))
        !          4082:                      (pc)))]
        !          4083:   ""
        !          4084:   "
        !          4085: {
        !          4086:   if (TARGET_IEEE_FP
        !          4087:       && GET_MODE_CLASS (GET_MODE (i386_compare_op0)) == MODE_FLOAT)
        !          4088:     operands[1] = (*i386_compare_gen_eq)(i386_compare_op0, i386_compare_op1);
        !          4089:   else
        !          4090:     operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);
        !          4091: }")
        !          4092: 
        !          4093: (define_insn ""
        !          4094:   [(set (pc)
        !          4095:        (if_then_else (ne (cc0)
        !          4096:                          (const_int 0))
        !          4097:                      (label_ref (match_operand 0 "" ""))
        !          4098:                      (pc)))]
        !          4099:   ""
        !          4100:   "*
        !          4101: {
        !          4102:   if (cc_prev_status.flags & CC_Z_IN_NOT_C)
        !          4103:     return \"jc %l0\";
        !          4104:   else
        !          4105:     return \"jne %l0\";
        !          4106: }")
        !          4107: 
        !          4108: (define_expand "bgt"
        !          4109:   [(match_dup 1)
        !          4110:    (set (pc)
        !          4111:        (if_then_else (gt (cc0)
        !          4112:                          (const_int 0))
        !          4113:                      (label_ref (match_operand 0 "" ""))
        !          4114:                      (pc)))]
        !          4115:   ""
        !          4116:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4117: 
        !          4118: (define_insn ""
        !          4119:   [(set (pc)
        !          4120:        (if_then_else (gt (cc0)
        !          4121:                          (const_int 0))
        !          4122:                      (label_ref (match_operand 0 "" ""))
        !          4123:                      (pc)))]
        !          4124:   ""
        !          4125:   "*
        !          4126: {
        !          4127:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          4128:     return AS1 (je,%l0);
        !          4129: 
        !          4130:   OUTPUT_JUMP (\"jg %l0\", \"ja %l0\", NULL_PTR);
        !          4131: }")
        !          4132: 
        !          4133: (define_expand "bgtu"
        !          4134:   [(match_dup 1)
        !          4135:    (set (pc)
        !          4136:        (if_then_else (gtu (cc0)
        !          4137:                           (const_int 0))
        !          4138:                      (label_ref (match_operand 0 "" ""))
        !          4139:                      (pc)))]
        !          4140:   ""
        !          4141:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4142: 
        !          4143: (define_insn ""
        !          4144:   [(set (pc)
        !          4145:        (if_then_else (gtu (cc0)
        !          4146:                           (const_int 0))
        !          4147:                      (label_ref (match_operand 0 "" ""))
        !          4148:                      (pc)))]
        !          4149:   ""
        !          4150:   "ja %l0")
        !          4151: 
        !          4152: (define_expand "blt"
        !          4153:   [(match_dup 1)
        !          4154:    (set (pc)
        !          4155:        (if_then_else (lt (cc0)
        !          4156:                          (const_int 0))
        !          4157:                      (label_ref (match_operand 0 "" ""))
        !          4158:                      (pc)))]
        !          4159:   ""
        !          4160:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4161: 
        !          4162: (define_insn ""
        !          4163:   [(set (pc)
        !          4164:        (if_then_else (lt (cc0)
        !          4165:                          (const_int 0))
        !          4166:                      (label_ref (match_operand 0 "" ""))
        !          4167:                      (pc)))]
        !          4168:   ""
        !          4169:   "*
        !          4170: {
        !          4171:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          4172:     return AS1 (je,%l0);
        !          4173: 
        !          4174:   OUTPUT_JUMP (\"jl %l0\", \"jb %l0\", \"js %l0\");
        !          4175: }")
        !          4176: 
        !          4177: (define_expand "bltu"
        !          4178:   [(match_dup 1)
        !          4179:    (set (pc)
        !          4180:        (if_then_else (ltu (cc0)
        !          4181:                           (const_int 0))
        !          4182:                      (label_ref (match_operand 0 "" ""))
        !          4183:                      (pc)))]
        !          4184:   ""
        !          4185:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4186: 
        !          4187: (define_insn ""
        !          4188:   [(set (pc)
        !          4189:        (if_then_else (ltu (cc0)
        !          4190:                           (const_int 0))
        !          4191:                      (label_ref (match_operand 0 "" ""))
        !          4192:                      (pc)))]
        !          4193:   ""
        !          4194:   "jb %l0")
        !          4195: 
        !          4196: (define_expand "bge"
        !          4197:   [(match_dup 1)
        !          4198:    (set (pc)
        !          4199:        (if_then_else (ge (cc0)
        !          4200:                          (const_int 0))
        !          4201:                      (label_ref (match_operand 0 "" ""))
        !          4202:                      (pc)))]
        !          4203:   ""
        !          4204:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4205: 
        !          4206: (define_insn ""
        !          4207:   [(set (pc)
        !          4208:        (if_then_else (ge (cc0)
        !          4209:                          (const_int 0))
        !          4210:                      (label_ref (match_operand 0 "" ""))
        !          4211:                      (pc)))]
        !          4212:   ""
        !          4213:   "*
        !          4214: {
        !          4215:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          4216:     return AS1 (je,%l0);
        !          4217: 
        !          4218:   OUTPUT_JUMP (\"jge %l0\", \"jae %l0\", \"jns %l0\");
        !          4219: }")
        !          4220: 
        !          4221: (define_expand "bgeu"
        !          4222:   [(match_dup 1)
        !          4223:    (set (pc)
        !          4224:        (if_then_else (geu (cc0)
        !          4225:                           (const_int 0))
        !          4226:                      (label_ref (match_operand 0 "" ""))
        !          4227:                      (pc)))]
        !          4228:   ""
        !          4229:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4230: 
        !          4231: (define_insn ""
        !          4232:   [(set (pc)
        !          4233:        (if_then_else (geu (cc0)
        !          4234:                           (const_int 0))
        !          4235:                      (label_ref (match_operand 0 "" ""))
        !          4236:                      (pc)))]
        !          4237:   ""
        !          4238:   "jae %l0")
        !          4239: 
        !          4240: (define_expand "ble"
        !          4241:   [(match_dup 1)
        !          4242:    (set (pc)
        !          4243:        (if_then_else (le (cc0)
        !          4244:                          (const_int 0))
        !          4245:                      (label_ref (match_operand 0 "" ""))
        !          4246:                      (pc)))]
        !          4247:   ""
        !          4248:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4249: 
        !          4250: (define_insn ""
        !          4251:   [(set (pc)
        !          4252:        (if_then_else (le (cc0)
        !          4253:                          (const_int 0))
        !          4254:                      (label_ref (match_operand 0 "" ""))
        !          4255:                      (pc)))]
        !          4256:   ""
        !          4257:   "*
        !          4258: {
        !          4259:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          4260:     return AS1 (jb,%l0);
        !          4261: 
        !          4262:   OUTPUT_JUMP (\"jle %l0\", \"jbe %l0\", NULL_PTR);
        !          4263: }")
        !          4264: 
        !          4265: (define_expand "bleu"
        !          4266:   [(match_dup 1)
        !          4267:    (set (pc)
        !          4268:        (if_then_else (leu (cc0)
        !          4269:                           (const_int 0))
        !          4270:                      (label_ref (match_operand 0 "" ""))
        !          4271:                      (pc)))]
        !          4272:   ""
        !          4273:   "operands[1] = (*i386_compare_gen)(i386_compare_op0, i386_compare_op1);")
        !          4274: 
        !          4275: (define_insn ""
        !          4276:   [(set (pc)
        !          4277:        (if_then_else (leu (cc0)
        !          4278:                           (const_int 0))
        !          4279:                      (label_ref (match_operand 0 "" ""))
        !          4280:                      (pc)))]
        !          4281:   ""
        !          4282:   "jbe %l0")
        !          4283: 
        !          4284: ;; Negated conditional jump instructions.
        !          4285: 
        !          4286: (define_insn ""
        !          4287:   [(set (pc)
        !          4288:        (if_then_else (eq (cc0)
        !          4289:                          (const_int 0))
        !          4290:                      (pc)
        !          4291:                      (label_ref (match_operand 0 "" ""))))]
        !          4292:   ""
        !          4293:   "*
        !          4294: {
        !          4295:   if (cc_prev_status.flags & CC_Z_IN_NOT_C)
        !          4296:     return \"jc %l0\";
        !          4297:   else
        !          4298:     return \"jne %l0\";
        !          4299: }")
        !          4300: 
        !          4301: (define_insn ""
        !          4302:   [(set (pc)
        !          4303:        (if_then_else (ne (cc0)
        !          4304:                          (const_int 0))
        !          4305:                      (pc)
        !          4306:                      (label_ref (match_operand 0 "" ""))))]
        !          4307:   ""
        !          4308:   "*
        !          4309: {
        !          4310:   if (cc_prev_status.flags & CC_Z_IN_NOT_C)
        !          4311:     return \"jnc %l0\";
        !          4312:   else
        !          4313:     return \"je %l0\";
        !          4314: }")
        !          4315: 
        !          4316: (define_insn ""
        !          4317:   [(set (pc)
        !          4318:        (if_then_else (gt (cc0)
        !          4319:                          (const_int 0))
        !          4320:                      (pc)
        !          4321:                      (label_ref (match_operand 0 "" ""))))]
        !          4322:   ""
        !          4323:   "*
        !          4324: {
        !          4325:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          4326:     return AS1 (jne,%l0);
        !          4327: 
        !          4328:   OUTPUT_JUMP (\"jle %l0\", \"jbe %l0\", NULL_PTR);
        !          4329: }")
        !          4330: 
        !          4331: (define_insn ""
        !          4332:   [(set (pc)
        !          4333:        (if_then_else (gtu (cc0)
        !          4334:                           (const_int 0))
        !          4335:                      (pc)
        !          4336:                      (label_ref (match_operand 0 "" ""))))]
        !          4337:   ""
        !          4338:   "jbe %l0")
        !          4339: 
        !          4340: (define_insn ""
        !          4341:   [(set (pc)
        !          4342:        (if_then_else (lt (cc0)
        !          4343:                          (const_int 0))
        !          4344:                      (pc)
        !          4345:                      (label_ref (match_operand 0 "" ""))))]
        !          4346:   ""
        !          4347:   "*
        !          4348: {
        !          4349:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          4350:     return AS1 (jne,%l0);
        !          4351: 
        !          4352:   OUTPUT_JUMP (\"jge %l0\", \"jae %l0\", \"jns %l0\");
        !          4353: }")
        !          4354: 
        !          4355: (define_insn ""
        !          4356:   [(set (pc)
        !          4357:        (if_then_else (ltu (cc0)
        !          4358:                           (const_int 0))
        !          4359:                      (pc)
        !          4360:                      (label_ref (match_operand 0 "" ""))))]
        !          4361:   ""
        !          4362:   "jae %l0")
        !          4363: 
        !          4364: (define_insn ""
        !          4365:   [(set (pc)
        !          4366:        (if_then_else (ge (cc0)
        !          4367:                          (const_int 0))
        !          4368:                      (pc)
        !          4369:                      (label_ref (match_operand 0 "" ""))))]
        !          4370:   ""
        !          4371:   "*
        !          4372: {
        !          4373:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          4374:     return AS1 (jne,%l0);
        !          4375: 
        !          4376:   OUTPUT_JUMP (\"jl %l0\", \"jb %l0\", \"js %l0\");
        !          4377: }")
        !          4378: 
        !          4379: (define_insn ""
        !          4380:   [(set (pc)
        !          4381:        (if_then_else (geu (cc0)
        !          4382:                           (const_int 0))
        !          4383:                      (pc)
        !          4384:                      (label_ref (match_operand 0 "" ""))))]
        !          4385:   ""
        !          4386:   "jb %l0")
        !          4387: 
        !          4388: (define_insn ""
        !          4389:   [(set (pc)
        !          4390:        (if_then_else (le (cc0)
        !          4391:                          (const_int 0))
        !          4392:                      (pc)
        !          4393:                      (label_ref (match_operand 0 "" ""))))]
        !          4394:   ""
        !          4395:   "*
        !          4396: {
        !          4397:   if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
        !          4398:     return AS1 (jae,%l0);
        !          4399: 
        !          4400:   OUTPUT_JUMP (\"jg %l0\", \"ja %l0\", NULL_PTR);
        !          4401: }")
        !          4402: 
        !          4403: (define_insn ""
        !          4404:   [(set (pc)
        !          4405:        (if_then_else (leu (cc0)
        !          4406:                           (const_int 0))
        !          4407:                      (pc)
        !          4408:                      (label_ref (match_operand 0 "" ""))))]
        !          4409:   ""
        !          4410:   "ja %l0")
        !          4411: 
        !          4412: ;; Unconditional and other jump instructions
        !          4413: 
        !          4414: (define_insn "jump"
        !          4415:   [(set (pc)
        !          4416:        (label_ref (match_operand 0 "" "")))]
        !          4417:   ""
        !          4418:   "jmp %l0")
        !          4419: 
        !          4420: (define_insn "indirect_jump"
        !          4421:   [(set (pc) (match_operand:SI 0 "general_operand" "rm"))]
        !          4422:   ""
        !          4423:   "*
        !          4424: {
        !          4425:   CC_STATUS_INIT;
        !          4426: 
        !          4427:   return AS1 (jmp,%*%0);
        !          4428: }")
        !          4429: 
        !          4430: ;; Implement switch statements when generating PIC code.  Switches are
        !          4431: ;; implemented by `tablejump' when not using -fpic.
        !          4432: 
        !          4433: ;; Emit code here to do the range checking and make the index zero based.
        !          4434: 
        !          4435: (define_expand "casesi"
        !          4436:   [(set (match_dup 5)
        !          4437:        (minus:SI (match_operand:SI 0 "general_operand" "")
        !          4438:                  (match_operand:SI 1 "general_operand" "")))
        !          4439:    (set (cc0)
        !          4440:        (compare:CC (match_dup 5)
        !          4441:                    (match_operand:SI 2 "general_operand" "")))
        !          4442:    (set (pc)
        !          4443:        (if_then_else (gtu (cc0)
        !          4444:                           (const_int 0))
        !          4445:                      (label_ref (match_operand 4 "" ""))
        !          4446:                      (pc)))
        !          4447:    (parallel
        !          4448:     [(set (pc)
        !          4449:          (minus:SI (reg:SI 3)
        !          4450:                    (mem:SI (plus:SI (mult:SI (match_dup 5)
        !          4451:                                              (const_int 4))
        !          4452:                                     (label_ref (match_operand 3 "" ""))))))
        !          4453:      (clobber (match_scratch:SI 6 ""))])]
        !          4454:   "flag_pic"
        !          4455:   "
        !          4456: {
        !          4457:   operands[5] = gen_reg_rtx (SImode);
        !          4458:   current_function_uses_pic_offset_table = 1;
        !          4459: }")
        !          4460: 
        !          4461: ;; Implement a casesi insn.
        !          4462: 
        !          4463: ;; Each entry in the "addr_diff_vec" looks like this as the result of the
        !          4464: ;; two rules below:
        !          4465: ;; 
        !          4466: ;;     .long _GLOBAL_OFFSET_TABLE_+[.-.L2]
        !          4467: ;; 
        !          4468: ;; 1. An expression involving an external reference may only use the
        !          4469: ;;    addition operator, and only with an assembly-time constant.
        !          4470: ;;    The example above satisfies this because ".-.L2" is a constant.
        !          4471: ;; 
        !          4472: ;; 2. The symbol _GLOBAL_OFFSET_TABLE_ is magic, and at link time is
        !          4473: ;;    given the value of "GOT - .", where GOT is the actual address of
        !          4474: ;;    the Global Offset Table.  Therefore, the .long above actually
        !          4475: ;;    stores the value "( GOT - . ) + [ . - .L2 ]", or "GOT - .L2".  The
        !          4476: ;;    expression "GOT - .L2" by itself would generate an error from as(1).
        !          4477: ;; 
        !          4478: ;; The pattern below emits code that looks like this:
        !          4479: ;; 
        !          4480: ;;     movl %ebx,reg
        !          4481: ;;     subl TABLE@GOTOFF(%ebx,index,4),reg
        !          4482: ;;     jmp reg
        !          4483: ;; 
        !          4484: ;; The addr_diff_vec contents may be directly referenced with @GOTOFF, since
        !          4485: ;; the addr_diff_vec is known to be part of this module.
        !          4486: ;; 
        !          4487: ;; The subl above calculates "GOT - (( GOT - . ) + [ . - .L2 ])", which
        !          4488: ;; evaluates to just ".L2".
        !          4489: 
        !          4490: (define_insn ""
        !          4491:   [(set (pc)
        !          4492:        (minus:SI (reg:SI 3)
        !          4493:                  (mem:SI (plus:SI
        !          4494:                           (mult:SI (match_operand:SI 0 "register_operand" "r")
        !          4495:                                    (const_int 4))
        !          4496:                           (label_ref (match_operand 1 "" ""))))))
        !          4497:    (clobber (match_scratch:SI 2 "=&r"))]
        !          4498:   ""
        !          4499:   "*
        !          4500: {
        !          4501:   rtx xops[4];
        !          4502: 
        !          4503:   xops[0] = operands[0];
        !          4504:   xops[1] = operands[1];
        !          4505:   xops[2] = operands[2];
        !          4506:   xops[3] = pic_offset_table_rtx;
        !          4507: 
        !          4508:   output_asm_insn (AS2 (mov%L2,%3,%2), xops);
        !          4509:   output_asm_insn (\"sub%L2 %l1@GOTOFF(%3,%0,4),%2\", xops);
        !          4510:   output_asm_insn (AS1 (jmp,%*%2), xops);
        !          4511:   ASM_OUTPUT_ALIGN_CODE (asm_out_file);
        !          4512:   RET;
        !          4513: }")
        !          4514: 
        !          4515: (define_insn "tablejump"
        !          4516:   [(set (pc) (match_operand:SI 0 "general_operand" "rm"))
        !          4517:    (use (label_ref (match_operand 1 "" "")))]
        !          4518:   ""
        !          4519:   "*
        !          4520: {
        !          4521:   CC_STATUS_INIT;
        !          4522: 
        !          4523:   return AS1 (jmp,%*%0);
        !          4524: }")
        !          4525: 
        !          4526: ;; Call insns.
        !          4527: 
        !          4528: ;; If generating PIC code, the predicate indirect_operand will fail
        !          4529: ;; for operands[0] containing symbolic references on all of the named
        !          4530: ;; call* patterns.  Each named pattern is followed by an unnamed pattern
        !          4531: ;; that matches any call to a symbolic CONST (ie, a symbol_ref).  The
        !          4532: ;; unnamed patterns are only used while generating PIC code, because
        !          4533: ;; otherwise the named patterns match.
        !          4534: 
        !          4535: ;; Call subroutine returning no value.
        !          4536: 
        !          4537: (define_expand "call_pop"
        !          4538:   [(parallel [(call (match_operand:QI 0 "indirect_operand" "")
        !          4539:                    (match_operand:SI 1 "general_operand" ""))
        !          4540:              (set (reg:SI 7)
        !          4541:                   (plus:SI (reg:SI 7)
        !          4542:                            (match_operand:SI 3 "immediate_operand" "")))])]
        !          4543:   ""
        !          4544:   "
        !          4545: {
        !          4546:   rtx addr;
        !          4547: 
        !          4548:   if (flag_pic)
        !          4549:     current_function_uses_pic_offset_table = 1;
        !          4550: 
        !          4551:   /* With half-pic, force the address into a register.  */
        !          4552:   addr = XEXP (operands[0], 0);
        !          4553:   if (GET_CODE (addr) != REG && HALF_PIC_P () && !CONSTANT_ADDRESS_P (addr))
        !          4554:     XEXP (operands[0], 0) = force_reg (Pmode, addr);
        !          4555: 
        !          4556:   if (! expander_call_insn_operand (operands[0], QImode))
        !          4557:     operands[0]
        !          4558:       = change_address (operands[0], VOIDmode,
        !          4559:                        copy_to_mode_reg (Pmode, XEXP (operands[0], 0)));
        !          4560: }")
        !          4561: 
        !          4562: (define_insn ""
        !          4563:   [(call (match_operand:QI 0 "call_insn_operand" "m")
        !          4564:         (match_operand:SI 1 "general_operand" "g"))
        !          4565:    (set (reg:SI 7) (plus:SI (reg:SI 7)
        !          4566:                            (match_operand:SI 3 "immediate_operand" "i")))]
        !          4567:   ""
        !          4568:   "*
        !          4569: {
        !          4570:   if (GET_CODE (operands[0]) == MEM
        !          4571:       && ! CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          4572:     {
        !          4573:       operands[0] = XEXP (operands[0], 0);
        !          4574:       return AS1 (call,%*%0);
        !          4575:     }
        !          4576:   else
        !          4577:     return AS1 (call,%P0);
        !          4578: }")
        !          4579: 
        !          4580: (define_insn ""
        !          4581:   [(call (mem:QI (match_operand:SI 0 "symbolic_operand" ""))
        !          4582:         (match_operand:SI 1 "general_operand" "g"))
        !          4583:    (set (reg:SI 7) (plus:SI (reg:SI 7)
        !          4584:                            (match_operand:SI 3 "immediate_operand" "i")))]
        !          4585:   "!HALF_PIC_P ()"
        !          4586:   "call %P0")
        !          4587: 
        !          4588: (define_expand "call"
        !          4589:   [(call (match_operand:QI 0 "indirect_operand" "")
        !          4590:         (match_operand:SI 1 "general_operand" ""))]
        !          4591:   ;; Operand 1 not used on the i386.
        !          4592:   ""
        !          4593:   "
        !          4594: {
        !          4595:   rtx addr;
        !          4596: 
        !          4597:   if (flag_pic)
        !          4598:     current_function_uses_pic_offset_table = 1;
        !          4599: 
        !          4600:   /* With half-pic, force the address into a register.  */
        !          4601:   addr = XEXP (operands[0], 0);
        !          4602:   if (GET_CODE (addr) != REG && HALF_PIC_P () && !CONSTANT_ADDRESS_P (addr))
        !          4603:     XEXP (operands[0], 0) = force_reg (Pmode, addr);
        !          4604: 
        !          4605:   if (! expander_call_insn_operand (operands[0], QImode))
        !          4606:     operands[0]
        !          4607:       = change_address (operands[0], VOIDmode,
        !          4608:                        copy_to_mode_reg (Pmode, XEXP (operands[0], 0)));
        !          4609: }")
        !          4610: 
        !          4611: (define_insn ""
        !          4612:   [(call (match_operand:QI 0 "call_insn_operand" "m")
        !          4613:         (match_operand:SI 1 "general_operand" "g"))]
        !          4614:   ;; Operand 1 not used on the i386.
        !          4615:   ""
        !          4616:   "*
        !          4617: {
        !          4618:   if (GET_CODE (operands[0]) == MEM
        !          4619:       && ! CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          4620:     {
        !          4621:       operands[0] = XEXP (operands[0], 0);
        !          4622:       return AS1 (call,%*%0);
        !          4623:     }
        !          4624:   else
        !          4625:     return AS1 (call,%P0);
        !          4626: }")
        !          4627: 
        !          4628: (define_insn ""
        !          4629:   [(call (mem:QI (match_operand:SI 0 "symbolic_operand" ""))
        !          4630:         (match_operand:SI 1 "general_operand" "g"))]
        !          4631:   ;; Operand 1 not used on the i386.
        !          4632:   "!HALF_PIC_P ()"
        !          4633:   "call %P0")
        !          4634: 
        !          4635: ;; Call subroutine, returning value in operand 0
        !          4636: ;; (which must be a hard register).
        !          4637: 
        !          4638: (define_expand "call_value_pop"
        !          4639:   [(parallel [(set (match_operand 0 "" "")
        !          4640:                   (call (match_operand:QI 1 "indirect_operand" "")
        !          4641:                         (match_operand:SI 2 "general_operand" "")))
        !          4642:              (set (reg:SI 7)
        !          4643:                   (plus:SI (reg:SI 7)
        !          4644:                            (match_operand:SI 4 "immediate_operand" "")))])]
        !          4645:   ""
        !          4646:   "
        !          4647: {
        !          4648:   rtx addr;
        !          4649: 
        !          4650:   if (flag_pic)
        !          4651:     current_function_uses_pic_offset_table = 1;
        !          4652: 
        !          4653:   /* With half-pic, force the address into a register.  */
        !          4654:   addr = XEXP (operands[1], 0);
        !          4655:   if (GET_CODE (addr) != REG && HALF_PIC_P () && !CONSTANT_ADDRESS_P (addr))
        !          4656:     XEXP (operands[1], 0) = force_reg (Pmode, addr);
        !          4657: 
        !          4658:   if (! expander_call_insn_operand (operands[1], QImode))
        !          4659:     operands[1]
        !          4660:       = change_address (operands[1], VOIDmode,
        !          4661:                        copy_to_mode_reg (Pmode, XEXP (operands[1], 0)));
        !          4662: }")
        !          4663: 
        !          4664: (define_insn ""
        !          4665:   [(set (match_operand 0 "" "=rf")
        !          4666:        (call (match_operand:QI 1 "call_insn_operand" "m")
        !          4667:              (match_operand:SI 2 "general_operand" "g")))
        !          4668:    (set (reg:SI 7) (plus:SI (reg:SI 7)
        !          4669:                            (match_operand:SI 4 "immediate_operand" "i")))]
        !          4670:   ""
        !          4671:   "*
        !          4672: {
        !          4673:   if (GET_CODE (operands[1]) == MEM
        !          4674:       && ! CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          4675:     {
        !          4676:       operands[1] = XEXP (operands[1], 0);
        !          4677:       output_asm_insn (AS1 (call,%*%1), operands);
        !          4678:     }
        !          4679:   else
        !          4680:     output_asm_insn (AS1 (call,%P1), operands);
        !          4681: 
        !          4682:   RET;
        !          4683: }")
        !          4684: 
        !          4685: (define_insn ""
        !          4686:   [(set (match_operand 0 "" "=rf")
        !          4687:        (call (mem:QI (match_operand:SI 1 "symbolic_operand" ""))
        !          4688:              (match_operand:SI 2 "general_operand" "g")))
        !          4689:    (set (reg:SI 7) (plus:SI (reg:SI 7)
        !          4690:                            (match_operand:SI 4 "immediate_operand" "i")))]
        !          4691:   "!HALF_PIC_P ()"
        !          4692:   "call %P1")
        !          4693: 
        !          4694: (define_expand "call_value"
        !          4695:   [(set (match_operand 0 "" "")
        !          4696:        (call (match_operand:QI 1 "indirect_operand" "")
        !          4697:              (match_operand:SI 2 "general_operand" "")))]
        !          4698:   ;; Operand 2 not used on the i386.
        !          4699:   ""
        !          4700:   "
        !          4701: {
        !          4702:   rtx addr;
        !          4703: 
        !          4704:   if (flag_pic)
        !          4705:     current_function_uses_pic_offset_table = 1;
        !          4706: 
        !          4707:   /* With half-pic, force the address into a register.  */
        !          4708:   addr = XEXP (operands[1], 0);
        !          4709:   if (GET_CODE (addr) != REG && HALF_PIC_P () && !CONSTANT_ADDRESS_P (addr))
        !          4710:     XEXP (operands[1], 0) = force_reg (Pmode, addr);
        !          4711: 
        !          4712:   if (! expander_call_insn_operand (operands[1], QImode))
        !          4713:     operands[1]
        !          4714:       = change_address (operands[1], VOIDmode,
        !          4715:                        copy_to_mode_reg (Pmode, XEXP (operands[1], 0)));
        !          4716: }")
        !          4717: 
        !          4718: (define_insn ""
        !          4719:   [(set (match_operand 0 "" "=rf")
        !          4720:        (call (match_operand:QI 1 "call_insn_operand" "m")
        !          4721:              (match_operand:SI 2 "general_operand" "g")))]
        !          4722:   ;; Operand 2 not used on the i386.
        !          4723:   ""
        !          4724:   "*
        !          4725: {
        !          4726:   if (GET_CODE (operands[1]) == MEM
        !          4727:       && ! CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          4728:     {
        !          4729:       operands[1] = XEXP (operands[1], 0);
        !          4730:       output_asm_insn (AS1 (call,%*%1), operands);
        !          4731:     }
        !          4732:   else
        !          4733:     output_asm_insn (AS1 (call,%P1), operands);
        !          4734: 
        !          4735:   RET;
        !          4736: }")
        !          4737: 
        !          4738: (define_insn ""
        !          4739:   [(set (match_operand 0 "" "=rf")
        !          4740:        (call (mem:QI (match_operand:SI 1 "symbolic_operand" ""))
        !          4741:              (match_operand:SI 2 "general_operand" "g")))]
        !          4742:   ;; Operand 2 not used on the i386.
        !          4743:   "!HALF_PIC_P ()"
        !          4744:   "call %P1")
        !          4745: 
        !          4746: (define_expand "untyped_call"
        !          4747:   [(parallel [(call (match_operand:QI 0 "indirect_operand" "")
        !          4748:                    (const_int 0))
        !          4749:              (match_operand:BLK 1 "memory_operand" "")
        !          4750:              (match_operand 2 "" "")])]
        !          4751:   ""
        !          4752:   "
        !          4753: {
        !          4754:   rtx addr;
        !          4755: 
        !          4756:   if (flag_pic)
        !          4757:     current_function_uses_pic_offset_table = 1;
        !          4758: 
        !          4759:   /* With half-pic, force the address into a register.  */
        !          4760:   addr = XEXP (operands[0], 0);
        !          4761:   if (GET_CODE (addr) != REG && HALF_PIC_P () && !CONSTANT_ADDRESS_P (addr))
        !          4762:     XEXP (operands[0], 0) = force_reg (Pmode, addr);
        !          4763: 
        !          4764:   operands[1] = change_address (operands[1], DImode, XEXP (operands[1], 0));
        !          4765:   if (! expander_call_insn_operand (operands[1], QImode))
        !          4766:     operands[1]
        !          4767:       = change_address (operands[1], VOIDmode,
        !          4768:                        copy_to_mode_reg (Pmode, XEXP (operands[1], 0)));
        !          4769: }")
        !          4770: 
        !          4771: (define_insn ""
        !          4772:   [(call (match_operand:QI 0 "call_insn_operand" "m")
        !          4773:         (const_int 0))
        !          4774:    (match_operand:DI 1 "memory_operand" "o")
        !          4775:    (match_operand 2 "" "")]
        !          4776:   ""
        !          4777:   "*
        !          4778: {
        !          4779:   rtx addr = operands[1];
        !          4780: 
        !          4781:   if (GET_CODE (operands[0]) == MEM
        !          4782:       && ! CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          4783:     {
        !          4784:       operands[0] = XEXP (operands[0], 0);
        !          4785:       output_asm_insn (AS1 (call,%*%0), operands);
        !          4786:     }
        !          4787:   else
        !          4788:     output_asm_insn (AS1 (call,%P0), operands);
        !          4789: 
        !          4790:   operands[2] = gen_rtx (REG, SImode, 0);
        !          4791:   output_asm_insn (AS2 (mov%L2,%2,%1), operands);
        !          4792: 
        !          4793:   operands[2] = gen_rtx (REG, SImode, 1);
        !          4794:   operands[1] = adj_offsettable_operand (addr, 4);
        !          4795:   output_asm_insn (AS2 (mov%L2,%2,%1), operands);
        !          4796: 
        !          4797:   operands[1] = adj_offsettable_operand (addr, 8);
        !          4798:   return AS1 (fnsave,%1);
        !          4799: }")
        !          4800: 
        !          4801: (define_insn ""
        !          4802:   [(call (mem:QI (match_operand:SI 0 "symbolic_operand" ""))
        !          4803:         (const_int 0))
        !          4804:    (match_operand:DI 1 "memory_operand" "o")
        !          4805:    (match_operand 2 "" "")]
        !          4806:   "!HALF_PIC_P ()"
        !          4807:   "*
        !          4808: {
        !          4809:   rtx addr = operands[1];
        !          4810: 
        !          4811:   output_asm_insn (AS1 (call,%P0), operands);
        !          4812: 
        !          4813:   operands[2] = gen_rtx (REG, SImode, 0);
        !          4814:   output_asm_insn (AS2 (mov%L2,%2,%1), operands);
        !          4815: 
        !          4816:   operands[2] = gen_rtx (REG, SImode, 1);
        !          4817:   operands[1] = adj_offsettable_operand (addr, 4);
        !          4818:   output_asm_insn (AS2 (mov%L2,%2,%1), operands);
        !          4819: 
        !          4820:   operands[1] = adj_offsettable_operand (addr, 8);
        !          4821:   return AS1 (fnsave,%1);
        !          4822: }")
        !          4823: 
        !          4824: ;; We use fnsave and frstor to save and restore the floating point result.
        !          4825: ;; These are expensive instructions and require a large space to save the
        !          4826: ;; FPU state.  An more complicated alternative is to use fnstenv to store
        !          4827: ;; the FPU environment and test whether the stack top is valid.  Store the
        !          4828: ;; result of the test, and if it is valid, pop and save the value.  The
        !          4829: ;; untyped_return would check the test and optionally push the saved value.
        !          4830: 
        !          4831: (define_expand "untyped_return"
        !          4832:   [(match_operand:BLK 0 "memory_operand" "")
        !          4833:    (match_operand 1 "" "")]
        !          4834:   ""
        !          4835:   "
        !          4836: {
        !          4837:   rtx valreg1 = gen_rtx (REG, SImode, 0);
        !          4838:   rtx valreg2 = gen_rtx (REG, SImode, 1);
        !          4839:   rtx result = operands[0];
        !          4840: 
        !          4841:   /* Restore the FPU state.  */
        !          4842:   emit_insn (gen_update_return (change_address (result, SImode,
        !          4843:                                                plus_constant (XEXP (result, 0),
        !          4844:                                                               8))));
        !          4845: 
        !          4846:   /* Reload the function value registers.  */
        !          4847:   emit_move_insn (valreg1, change_address (result, SImode, XEXP (result, 0)));
        !          4848:   emit_move_insn (valreg2,
        !          4849:                  change_address (result, SImode,
        !          4850:                                  plus_constant (XEXP (result, 0), 4)));
        !          4851: 
        !          4852:   /* Put USE insns before the return.  */
        !          4853:   emit_insn (gen_rtx (USE, VOIDmode, valreg1));
        !          4854:   emit_insn (gen_rtx (USE, VOIDmode, valreg2));
        !          4855: 
        !          4856:   /* Construct the return.  */
        !          4857:   expand_null_return ();
        !          4858: 
        !          4859:   DONE;
        !          4860: }")
        !          4861: 
        !          4862: (define_insn "update_return"
        !          4863:   [(unspec:SI [(match_operand:SI 0 "memory_operand" "m")] 0)]
        !          4864:   ""
        !          4865:   "frstor %0")
        !          4866: 
        !          4867: ;; Insn emitted into the body of a function to return from a function.
        !          4868: ;; This is only done if the function's epilogue is known to be simple.
        !          4869: ;; See comments for simple_386_epilogue in i386.c.
        !          4870: 
        !          4871: (define_insn "return"
        !          4872:   [(return)]
        !          4873:   "simple_386_epilogue ()"
        !          4874:   "*
        !          4875: {
        !          4876:   function_epilogue (asm_out_file, get_frame_size ());
        !          4877:   RET;
        !          4878: }")
        !          4879: 
        !          4880: (define_insn "nop"
        !          4881:   [(const_int 0)]
        !          4882:   ""
        !          4883:   "nop")
        !          4884: 
        !          4885: (define_expand "movstrsi"
        !          4886:   [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
        !          4887:                   (match_operand:BLK 1 "memory_operand" ""))
        !          4888:              (use (match_operand:SI 2 "const_int_operand" ""))
        !          4889:              (use (match_operand:SI 3 "const_int_operand" ""))
        !          4890:              (clobber (match_scratch:SI 4 ""))
        !          4891:              (clobber (match_dup 5))
        !          4892:              (clobber (match_dup 6))])]
        !          4893:   ""
        !          4894:   "
        !          4895: {
        !          4896:   rtx addr0, addr1;
        !          4897: 
        !          4898:   if (GET_CODE (operands[2]) != CONST_INT)
        !          4899:     FAIL;
        !          4900: 
        !          4901:   addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
        !          4902:   addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
        !          4903: 
        !          4904:   operands[5] = addr0;
        !          4905:   operands[6] = addr1;
        !          4906: 
        !          4907:   operands[0] = gen_rtx (MEM, BLKmode, addr0);
        !          4908:   operands[1] = gen_rtx (MEM, BLKmode, addr1);
        !          4909: }")
        !          4910: 
        !          4911: ;; It might seem that operands 0 & 1 could use predicate register_operand.
        !          4912: ;; But strength reduction might offset the MEM expression.  So we let
        !          4913: ;; reload put the address into %edi & %esi.
        !          4914: 
        !          4915: (define_insn ""
        !          4916:   [(set (mem:BLK (match_operand:SI 0 "address_operand" "D"))
        !          4917:        (mem:BLK (match_operand:SI 1 "address_operand" "S")))
        !          4918:    (use (match_operand:SI 2 "const_int_operand" "n"))
        !          4919:    (use (match_operand:SI 3 "immediate_operand" "i"))
        !          4920:    (clobber (match_scratch:SI 4 "=&c"))
        !          4921:    (clobber (match_dup 0))
        !          4922:    (clobber (match_dup 1))]
        !          4923:   ""
        !          4924:   "*
        !          4925: {
        !          4926:   rtx xops[2];
        !          4927: 
        !          4928:   output_asm_insn (\"cld\", operands);
        !          4929:   if (GET_CODE (operands[2]) == CONST_INT)
        !          4930:     {
        !          4931:       if (INTVAL (operands[2]) & ~0x03)
        !          4932:        {
        !          4933:          xops[0] = GEN_INT ((INTVAL (operands[2]) >> 2) & 0x3fffffff);
        !          4934:          xops[1] = operands[4];
        !          4935: 
        !          4936:          output_asm_insn (AS2 (mov%L1,%0,%1), xops);
        !          4937: #ifdef INTEL_SYNTAX
        !          4938:          output_asm_insn (\"rep movsd\", xops);
        !          4939: #else
        !          4940:          output_asm_insn (\"rep\;movsl\", xops);
        !          4941: #endif
        !          4942:        }
        !          4943:       if (INTVAL (operands[2]) & 0x02)
        !          4944:        output_asm_insn (\"movsw\", operands);
        !          4945:       if (INTVAL (operands[2]) & 0x01)
        !          4946:        output_asm_insn (\"movsb\", operands);
        !          4947:     }
        !          4948:   else
        !          4949:     abort ();
        !          4950:   RET;
        !          4951: }")
        !          4952: 
        !          4953: (define_expand "cmpstrsi"
        !          4954:   [(parallel [(set (match_operand:SI 0 "general_operand" "")
        !          4955:                   (compare:SI (match_operand:BLK 1 "general_operand" "")
        !          4956:                               (match_operand:BLK 2 "general_operand" "")))
        !          4957:              (use (match_operand:SI 3 "general_operand" ""))
        !          4958:              (use (match_operand:SI 4 "immediate_operand" ""))
        !          4959:              (clobber (match_dup 5))
        !          4960:              (clobber (match_dup 6))
        !          4961:              (clobber (match_dup 3))])]
        !          4962:   ""
        !          4963:   "
        !          4964: {
        !          4965:   rtx addr1, addr2;
        !          4966: 
        !          4967:   addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
        !          4968:   addr2 = copy_to_mode_reg (Pmode, XEXP (operands[2], 0));
        !          4969:   operands[3] = copy_to_mode_reg (SImode, operands[3]);
        !          4970: 
        !          4971:   operands[5] = addr1;
        !          4972:   operands[6] = addr2;
        !          4973: 
        !          4974:   operands[1] = gen_rtx (MEM, BLKmode, addr1);
        !          4975:   operands[2] = gen_rtx (MEM, BLKmode, addr2);
        !          4976: 
        !          4977: }")
        !          4978: 
        !          4979: ;; memcmp recognizers.  The `cmpsb' opcode does nothing if the count is
        !          4980: ;; zero.  Emit extra code to make sure that a zero-length compare is EQ.
        !          4981: 
        !          4982: ;; It might seem that operands 0 & 1 could use predicate register_operand.
        !          4983: ;; But strength reduction might offset the MEM expression.  So we let
        !          4984: ;; reload put the address into %edi & %esi.
        !          4985: 
        !          4986: ;; ??? Most comparisons have a constant length, and it's therefore
        !          4987: ;; possible to know that the length is non-zero, and to avoid the extra
        !          4988: ;; code to handle zero-length compares.
        !          4989: 
        !          4990: (define_insn ""
        !          4991:   [(set (match_operand:SI 0 "general_operand" "=&r")
        !          4992:        (compare:SI (mem:BLK (match_operand:SI 1 "address_operand" "S"))
        !          4993:                    (mem:BLK (match_operand:SI 2 "address_operand" "D"))))
        !          4994:    (use (match_operand:SI 3 "register_operand" "c"))
        !          4995:    (use (match_operand:SI 4 "immediate_operand" "i"))
        !          4996:    (clobber (match_dup 1))
        !          4997:    (clobber (match_dup 2))
        !          4998:    (clobber (match_dup 3))]
        !          4999:   ""
        !          5000:   "*
        !          5001: {
        !          5002:   rtx xops[4], label;
        !          5003: 
        !          5004:   label = gen_label_rtx ();
        !          5005: 
        !          5006:   output_asm_insn (\"cld\", operands);
        !          5007:   output_asm_insn (AS2 (xor%L0,%0,%0), operands);
        !          5008:   output_asm_insn (\"repz\;cmps%B2\", operands);
        !          5009:   output_asm_insn (\"je %l0\", &label);
        !          5010: 
        !          5011:   xops[0] = operands[0];
        !          5012:   xops[1] = gen_rtx (MEM, QImode,
        !          5013:                     gen_rtx (PLUS, SImode, operands[1], constm1_rtx));
        !          5014:   xops[2] = gen_rtx (MEM, QImode,
        !          5015:                     gen_rtx (PLUS, SImode, operands[2], constm1_rtx));
        !          5016:   xops[3] = operands[3];
        !          5017: 
        !          5018:   output_asm_insn (AS2 (movz%B1%L0,%1,%0), xops);
        !          5019:   output_asm_insn (AS2 (movz%B2%L3,%2,%3), xops);
        !          5020: 
        !          5021:   output_asm_insn (AS2 (sub%L0,%3,%0), xops);
        !          5022:   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (label));
        !          5023:   RET;
        !          5024: }")
        !          5025: 
        !          5026: (define_insn ""
        !          5027:   [(set (cc0)
        !          5028:        (compare:SI (mem:BLK (match_operand:SI 0 "address_operand" "S"))
        !          5029:                    (mem:BLK (match_operand:SI 1 "address_operand" "D"))))
        !          5030:    (use (match_operand:SI 2 "register_operand" "c"))
        !          5031:    (use (match_operand:SI 3 "immediate_operand" "i"))
        !          5032:    (clobber (match_dup 0))
        !          5033:    (clobber (match_dup 1))
        !          5034:    (clobber (match_dup 2))]
        !          5035:   ""
        !          5036:   "*
        !          5037: {
        !          5038:   rtx xops[2];
        !          5039: 
        !          5040:   cc_status.flags |= CC_NOT_SIGNED;
        !          5041: 
        !          5042:   xops[0] = gen_rtx (REG, QImode, 0);
        !          5043:   xops[1] = CONST0_RTX (QImode);
        !          5044: 
        !          5045:   output_asm_insn (\"cld\", operands);
        !          5046:   output_asm_insn (AS2 (test%B0,%1,%0), xops);
        !          5047:   return \"repz\;cmps%B2\";
        !          5048: }")
        !          5049: 
        !          5050: (define_expand "ffssi2"
        !          5051:   [(set (match_dup 2)
        !          5052:        (plus:SI (ffs:SI (match_operand:SI 1 "general_operand" ""))
        !          5053:                 (const_int -1)))
        !          5054:    (set (match_operand:SI 0 "general_operand" "")
        !          5055:        (plus:SI (match_dup 2) (const_int 1)))]
        !          5056:   ""
        !          5057:   "operands[2] = gen_reg_rtx (SImode);")
        !          5058: 
        !          5059: (define_insn ""
        !          5060:   [(set (match_operand:SI 0 "general_operand" "=&r")
        !          5061:        (plus:SI (ffs:SI (match_operand:SI 1 "general_operand" "rm"))
        !          5062:                 (const_int -1)))]
        !          5063:   ""
        !          5064:   "*
        !          5065: {
        !          5066:   rtx xops[3];
        !          5067:   static int ffssi_label_number;
        !          5068:   char buffer[30];
        !          5069: 
        !          5070:   xops[0] = operands[0];
        !          5071:   xops[1] = operands[1];
        !          5072:   xops[2] = constm1_rtx;
        !          5073:   /* Can there be a way to avoid the jump here?  */
        !          5074:   output_asm_insn (AS2 (bsf%L0,%1,%0), xops);
        !          5075: #ifdef LOCAL_LABEL_PREFIX
        !          5076:   sprintf (buffer, \"jnz %sLFFSSI%d\",
        !          5077:           LOCAL_LABEL_PREFIX, ffssi_label_number);
        !          5078: #else
        !          5079:   sprintf (buffer, \"jnz %sLFFSSI%d\",
        !          5080:           \"\", ffssi_label_number);
        !          5081: #endif
        !          5082:   output_asm_insn (buffer, xops);
        !          5083:   output_asm_insn (AS2 (mov%L0,%2,%0), xops);
        !          5084: #ifdef LOCAL_LABEL_PREFIX
        !          5085:   sprintf (buffer, \"%sLFFSSI%d:\",
        !          5086:           LOCAL_LABEL_PREFIX, ffssi_label_number);
        !          5087: #else
        !          5088:   sprintf (buffer, \"%sLFFSSI%d:\",
        !          5089:           \"\", ffssi_label_number);
        !          5090: #endif
        !          5091:   output_asm_insn (buffer, xops);
        !          5092: 
        !          5093:   ffssi_label_number++;
        !          5094:   return \"\";
        !          5095: }")
        !          5096: 
        !          5097: (define_expand "ffshi2"
        !          5098:   [(set (match_dup 2)
        !          5099:        (plus:HI (ffs:HI (match_operand:HI 1 "general_operand" ""))
        !          5100:                 (const_int -1)))
        !          5101:    (set (match_operand:HI 0 "general_operand" "")
        !          5102:        (plus:HI (match_dup 2) (const_int 1)))]
        !          5103:   ""
        !          5104:   "operands[2] = gen_reg_rtx (HImode);")
        !          5105: 
        !          5106: (define_insn ""
        !          5107:   [(set (match_operand:HI 0 "general_operand" "=&r")
        !          5108:        (plus:HI (ffs:HI (match_operand:SI 1 "general_operand" "rm"))
        !          5109:                 (const_int -1)))]
        !          5110:   ""
        !          5111:   "*
        !          5112: {
        !          5113:   rtx xops[3];
        !          5114:   static int ffshi_label_number;
        !          5115:   char buffer[30];
        !          5116: 
        !          5117:   xops[0] = operands[0];
        !          5118:   xops[1] = operands[1];
        !          5119:   xops[2] = constm1_rtx;
        !          5120:   output_asm_insn (AS2 (bsf%W0,%1,%0), xops);
        !          5121: #ifdef LOCAL_LABEL_PREFIX
        !          5122:   sprintf (buffer, \"jnz %sLFFSHI%d\",
        !          5123:           LOCAL_LABEL_PREFIX, ffshi_label_number);
        !          5124: #else
        !          5125:   sprintf (buffer, \"jnz %sLFFSHI%d\",
        !          5126:           \"\", ffshi_label_number);
        !          5127: #endif
        !          5128:   output_asm_insn (buffer, xops);
        !          5129:   output_asm_insn (AS2 (mov%W0,%2,%0), xops);
        !          5130: #ifdef LOCAL_LABEL_PREFIX
        !          5131:   sprintf (buffer, \"%sLFFSHI%d:\",
        !          5132:           LOCAL_LABEL_PREFIX, ffshi_label_number);
        !          5133: #else
        !          5134:   sprintf (buffer, \"%sLFFSHI%d:\",
        !          5135:           \"\", ffshi_label_number);
        !          5136: #endif
        !          5137:   output_asm_insn (buffer, xops);
        !          5138: 
        !          5139:   ffshi_label_number++;
        !          5140:   return \"\";
        !          5141: }")
        !          5142: 
        !          5143: ;; These patterns match the binary 387 instructions for addM3, subM3,
        !          5144: ;; mulM3 and divM3.  There are three patterns for each of DFmode and
        !          5145: ;; SFmode.  The first is the normal insn, the second the same insn but
        !          5146: ;; with one operand a conversion, and the third the same insn but with
        !          5147: ;; the other operand a conversion.  The conversion may be SFmode or
        !          5148: ;; SImode if the target mode DFmode, but only SImode if the target mode
        !          5149: ;; is SFmode.
        !          5150: 
        !          5151: (define_insn ""
        !          5152:   [(set (match_operand:DF 0 "register_operand" "=f,f")
        !          5153:        (match_operator:DF 3 "binary_387_op"
        !          5154:                        [(match_operand:DF 1 "nonimmediate_operand" "0,fm")
        !          5155:                         (match_operand:DF 2 "nonimmediate_operand" "fm,0")]))]
        !          5156:   "TARGET_80387"
        !          5157:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5158: 
        !          5159: (define_insn ""
        !          5160:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          5161:        (match_operator:DF 3 "binary_387_op"
        !          5162:           [(float:DF (match_operand:SI 1 "general_operand" "rm"))
        !          5163:            (match_operand:DF 2 "general_operand" "0")]))]
        !          5164:   "TARGET_80387"
        !          5165:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5166: 
        !          5167: (define_insn ""
        !          5168:   [(set (match_operand:XF 0 "register_operand" "=f,f")
        !          5169:        (match_operator:XF 3 "binary_387_op"
        !          5170:                        [(match_operand:XF 1 "nonimmediate_operand" "0,f")
        !          5171:                         (match_operand:XF 2 "nonimmediate_operand" "f,0")]))]
        !          5172:   "TARGET_80387"
        !          5173:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5174: 
        !          5175: (define_insn ""
        !          5176:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          5177:        (match_operator:XF 3 "binary_387_op"
        !          5178:           [(float:XF (match_operand:SI 1 "general_operand" "rm"))
        !          5179:            (match_operand:XF 2 "general_operand" "0")]))]
        !          5180:   "TARGET_80387"
        !          5181:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5182: 
        !          5183: (define_insn ""
        !          5184:   [(set (match_operand:XF 0 "register_operand" "=f,f")
        !          5185:        (match_operator:XF 3 "binary_387_op"
        !          5186:           [(float_extend:XF (match_operand:SF 1 "general_operand" "fm,0"))
        !          5187:            (match_operand:XF 2 "general_operand" "0,f")]))]
        !          5188:   "TARGET_80387"
        !          5189:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5190: 
        !          5191: (define_insn ""
        !          5192:   [(set (match_operand:XF 0 "register_operand" "=f")
        !          5193:        (match_operator:XF 3 "binary_387_op"
        !          5194:          [(match_operand:XF 1 "general_operand" "0")
        !          5195:           (float:XF (match_operand:SI 2 "general_operand" "rm"))]))]
        !          5196:   "TARGET_80387"
        !          5197:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5198: 
        !          5199: (define_insn ""
        !          5200:   [(set (match_operand:XF 0 "register_operand" "=f,f")
        !          5201:        (match_operator:XF 3 "binary_387_op"
        !          5202:          [(match_operand:XF 1 "general_operand" "0,f")
        !          5203:           (float_extend:XF
        !          5204:            (match_operand:SF 2 "general_operand" "fm,0"))]))]
        !          5205:   "TARGET_80387"
        !          5206:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5207: 
        !          5208: (define_insn ""
        !          5209:   [(set (match_operand:DF 0 "register_operand" "=f,f")
        !          5210:        (match_operator:DF 3 "binary_387_op"
        !          5211:           [(float_extend:DF (match_operand:SF 1 "general_operand" "fm,0"))
        !          5212:            (match_operand:DF 2 "general_operand" "0,f")]))]
        !          5213:   "TARGET_80387"
        !          5214:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5215: 
        !          5216: (define_insn ""
        !          5217:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          5218:        (match_operator:DF 3 "binary_387_op"
        !          5219:          [(match_operand:DF 1 "general_operand" "0")
        !          5220:           (float:DF (match_operand:SI 2 "general_operand" "rm"))]))]
        !          5221:   "TARGET_80387"
        !          5222:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5223: 
        !          5224: (define_insn ""
        !          5225:   [(set (match_operand:DF 0 "register_operand" "=f,f")
        !          5226:        (match_operator:DF 3 "binary_387_op"
        !          5227:          [(match_operand:DF 1 "general_operand" "0,f")
        !          5228:           (float_extend:DF
        !          5229:            (match_operand:SF 2 "general_operand" "fm,0"))]))]
        !          5230:   "TARGET_80387"
        !          5231:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5232: 
        !          5233: (define_insn ""
        !          5234:   [(set (match_operand:SF 0 "register_operand" "=f,f")
        !          5235:        (match_operator:SF 3 "binary_387_op"
        !          5236:                        [(match_operand:SF 1 "nonimmediate_operand" "0,fm")
        !          5237:                         (match_operand:SF 2 "nonimmediate_operand" "fm,0")]))]
        !          5238:   "TARGET_80387"
        !          5239:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5240: 
        !          5241: (define_insn ""
        !          5242:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          5243:        (match_operator:SF 3 "binary_387_op"
        !          5244:          [(float:SF (match_operand:SI 1 "general_operand" "rm"))
        !          5245:           (match_operand:SF 2 "general_operand" "0")]))]
        !          5246:   "TARGET_80387"
        !          5247:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5248: 
        !          5249: (define_insn ""
        !          5250:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          5251:        (match_operator:SF 3 "binary_387_op"
        !          5252:          [(match_operand:SF 1 "general_operand" "0")
        !          5253:           (float:SF (match_operand:SI 2 "general_operand" "rm"))]))]
        !          5254:   "TARGET_80387"
        !          5255:   "* return (char *) output_387_binary_op (insn, operands);")
        !          5256: 
        !          5257: (define_expand "strlensi"
        !          5258:   [(parallel [(set (match_dup 4)
        !          5259:                   (unspec:SI [(mem:BLK (match_operand:BLK 1 "general_operand" ""))
        !          5260:                               (match_operand:QI 2 "register_operand" "")
        !          5261:                               (match_operand:SI 3 "immediate_operand" "")] 0))
        !          5262:              (clobber (match_dup 1))])
        !          5263:    (set (match_dup 5)
        !          5264:        (not:SI (match_dup 4)))
        !          5265:    (set (match_operand:SI 0 "register_operand" "")
        !          5266:        (minus:SI (match_dup 5)
        !          5267:                 (const_int 1)))]
        !          5268:   ""
        !          5269:   "
        !          5270: {
        !          5271:   operands[1] = copy_to_mode_reg (SImode, XEXP (operands[1], 0));
        !          5272:   operands[4] = gen_reg_rtx (SImode);
        !          5273:   operands[5] = gen_reg_rtx (SImode);
        !          5274: }")
        !          5275: 
        !          5276: ;; It might seem that operands 0 & 1 could use predicate register_operand.
        !          5277: ;; But strength reduction might offset the MEM expression.  So we let
        !          5278: ;; reload put the address into %edi.
        !          5279: 
        !          5280: (define_insn ""
        !          5281:   [(set (match_operand:SI 0 "register_operand" "=&c")
        !          5282:        (unspec:SI [(mem:BLK (match_operand:SI 1 "address_operand" "D"))
        !          5283:                    (match_operand:QI 2 "register_operand" "a")
        !          5284:                    (match_operand:SI 3 "immediate_operand" "i")] 0))
        !          5285:    (clobber (match_dup 1))]
        !          5286:   ""
        !          5287:   "*
        !          5288: {
        !          5289:   rtx xops[2];
        !          5290: 
        !          5291:   xops[0] = operands[0];
        !          5292:   xops[1] = constm1_rtx;
        !          5293:   output_asm_insn (\"cld\", operands);
        !          5294:   output_asm_insn (AS2 (mov%L0,%1,%0), xops);
        !          5295:   return \"repnz\;scas%B2\";
        !          5296: }")
        !          5297: 
        !          5298: 
        !          5299: ;; Switch the floating-point precision control between single and double.
        !          5300: ;; This doesn't work if the precision control is set to extended.
        !          5301: 
        !          5302: (define_insn "fppc_switch"
        !          5303:   [(unspec [(match_operand:HI 0 "memory_operand" "m")] 0)]
        !          5304:   ""
        !          5305:   "fnstcw %0\;xorw $512,%0\;fldcw %0")
        !          5306: 

unix.superglobalmegacorp.com

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