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

unix.superglobalmegacorp.com

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