Annotation of GNUtools/cc/config/arm/arm.md, revision 1.1

1.1     ! root        1: ;;- Machine description Acorn RISC Machine for GNU compiler
        !             2: ;;  Copyright (C) 1991, 1993 Free Software Foundation, Inc.
        !             3: ;;  Contributed by Pieter `Tiggr' Schoenmakers ([email protected])
        !             4: ;;             and Martin Simmons (@harleqn.co.uk).
        !             5: ;;  More major hacks by Richard Earnshaw ([email protected])
        !             6: 
        !             7: ;; This file is part of GNU CC.
        !             8: 
        !             9: ;; GNU CC is free software; you can redistribute it and/or modify
        !            10: ;; it under the terms of the GNU General Public License as published by
        !            11: ;; the Free Software Foundation; either version 2, or (at your option)
        !            12: ;; any later version.
        !            13: 
        !            14: ;; GNU CC is distributed in the hope that it will be useful,
        !            15: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            16: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            17: ;; GNU General Public License for more details.
        !            18: 
        !            19: ;; You should have received a copy of the GNU General Public License
        !            20: ;; along with GNU CC; see the file COPYING.  If not, write to
        !            21: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
        !            22: 
        !            23: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
        !            24: 
        !            25: ;; Every template must be output by arm_output_asm_insn, since this keeps
        !            26: ;; track of the offset of labels within the text segment.  This is needed to
        !            27: ;; to be able to (correctly) output instructions for loading a value from a
        !            28: ;; function's constant pool, since different instructions are needed when the
        !            29: ;; constant pool is more than 4095 bytes away from the PC.
        !            30: 
        !            31: ;; There are patterns in this file to support XFmode arithmetic.
        !            32: ;; Unfortunately RISCiX doesn't work well with these so they are disabled.
        !            33: ;; (See arm.h)
        !            34: 
        !            35: ;; UNSPEC Usage:
        !            36: ;; 0 `sin' operation: operand 0 is the result, operand 1 the parameter,
        !            37: ;;   the mode is MODE_FLOAT
        !            38: ;; 1 `cos' operation: operand 0 is the result, operand 1 the parameter,
        !            39: ;;   the mode is MODE_FLOAT
        !            40: 
        !            41: ;; Attributes
        !            42: 
        !            43: ; condition codes: this one is used by final_prescan_insn to speed up
        !            44: ; conditionalizing instructions.  It saves having to scan the rtl to see if
        !            45: ; it uses or alters the condition codes.
        !            46: 
        !            47: ; USE means that the condition codes are used by the insn in the process of
        !            48: ; outputting code, this means (at present) that we can't use the insn in
        !            49: ; inlined branches
        !            50: 
        !            51: ; SET means that the purpose of the insn is to set the condition codes in a
        !            52: ; well defined manner.
        !            53: 
        !            54: ; CLOB means that the condition codes are altered in an undefined manner, if
        !            55: ; they are altered at all
        !            56: 
        !            57: ; JUMP_CLOB is used when the conditions are not defined if a branch is taken,
        !            58: ; but are if the branch wasn't taken; the effect is to limit the branch
        !            59: ; elimination scanning.
        !            60: 
        !            61: ; NOCOND means that the condition codes are niether altered nor affect the
        !            62: ; output of this insn
        !            63: 
        !            64: (define_attr "conds" "use,set,clob,jump_clob,nocond"
        !            65:        (const_string "nocond"))
        !            66: 
        !            67: ; CPU attribute is used to determine whether condition codes are clobbered
        !            68: ; by a call insn: on the arm6 they are if in 32-bit addressing mode; on the
        !            69: ; arm2 and arm3 the condition codes are restored by the return.
        !            70: 
        !            71: (define_attr "cpu" "arm2,arm3,arm6" (const (symbol_ref "arm_cpu_attr")))
        !            72: 
        !            73: ; LENGTH, all instructions are 4 bytes
        !            74: (define_attr "length" "" (const_int 1))
        !            75: 
        !            76: ; An assembler sequence may clobber the condition codes without us knowing
        !            77: (define_asm_attributes
        !            78:  [(set_attr "conds" "clob")
        !            79:   (set_attr "length" "1")])
        !            80: 
        !            81: ; TYPE attribute is used to detect floating point instructions which, if
        !            82: ; running on a co-processor can run in parallel with other, basic instructions
        !            83: ; If write-buffer scheduling is enabled then it can also be used in the
        !            84: ; scheduling of writes.
        !            85: 
        !            86: ; Classification of each insn
        !            87: ; normal       any data instruction that doesn't hit memory or fp regs
        !            88: ; block                blockage insn, this blocks all functional units
        !            89: ; float                a floating point arithmetic operation (subject to expansion)
        !            90: ; float_em     a floating point arithmetic operation that is normally emulated
        !            91: ; f_load       a floating point load from memory
        !            92: ; f_store      a floating point store to memory
        !            93: ; f_mem_r      a transfer of a floating point register to a real reg via mem
        !            94: ; r_mem_f      the reverse of f_mem_r
        !            95: ; f_2_r                fast transfer float to arm (no memory needed)
        !            96: ; r_2_f                fast transfer arm to float
        !            97: ; call         a subroutine call
        !            98: ; load         any load from memory
        !            99: ; store1       store 1 word to memory from arm registers
        !           100: ; store2       store 2 words
        !           101: ; store3       store 3 words
        !           102: ; store4       store 4 words
        !           103: ;
        !           104: (define_attr "type"
        !           105:        "normal,block,float,float_em,f_load,f_store,f_mem_r,r_mem_f,f_2_r,r_2_f,call,load,store1,store2,store3,store4" 
        !           106:        (const_string "normal"))
        !           107: 
        !           108: (define_attr "write_conflict" "no,yes"
        !           109:   (if_then_else (eq_attr "type"
        !           110:                 "block,float_em,f_load,f_store,f_mem_r,r_mem_f,call,load")
        !           111:                (const_string "yes")
        !           112:                (const_string "no")))
        !           113: 
        !           114: ; The write buffer on some of the arm6 processors is hard to model exactly.
        !           115: ; There is room in the buffer for up to two addresses and up to eight words
        !           116: ; of memory, but the two needn't be split evenly.  When writing the two
        !           117: ; addresses are fully pipelined.  However, a read from memory that is not
        !           118: ; currently in the cache will block until the writes have completed.
        !           119: ; It is normally the case that FCLK and MCLK will be in the ratio 2:1, so
        !           120: ; writes will take 2 FCLK cycles per word, if FCLK and MCLK are asynchronous
        !           121: ; (they aren't allowed to be at present) then there is a startup cost of 1MCLK
        !           122: ; cycle to add as well.
        !           123: 
        !           124: ;; (define_function_unit {name} {num-units} {n-users} {test}
        !           125: ;;                       {ready-delay} {issue-delay} [{conflict-list}])
        !           126: ;; This is not well tuned, but I don't have all the details.
        !           127: (define_function_unit "fpa" 1 1 (eq_attr "type" "float") 5 0)
        !           128: 
        !           129: (define_function_unit "write_buf" 1 2 (eq_attr "type" "store1") 3 3
        !           130:        [(eq_attr "write_conflict" "yes")])
        !           131: (define_function_unit "write_buf" 1 2 (eq_attr "type" "store2") 5 5
        !           132:        [(eq_attr "write_conflict" "yes")])
        !           133: (define_function_unit "write_buf" 1 2 (eq_attr "type" "store3") 7 7
        !           134:        [(eq_attr "write_conflict" "yes")])
        !           135: (define_function_unit "write_buf" 1 2 (eq_attr "type" "store4") 9 9
        !           136:        [(eq_attr "write_conflict" "yes")])
        !           137: (define_function_unit "write_buf" 1 2 (eq_attr "type" "r_mem_f") 3 3
        !           138:        [(eq_attr "write_conflict" "yes")])
        !           139: 
        !           140: ;; Note: For DImode insns, there is normally no reason why operands should
        !           141: ;; not be in the same register, what we don't want is for something being
        !           142: ;; written to partially overlap something that is an input.
        !           143: 
        !           144: ;; Addition insns.
        !           145: 
        !           146: (define_insn "adddi3"
        !           147:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           148:        (plus:DI (match_operand:DI 1 "s_register_operand" "%0,0")
        !           149:                 (match_operand:DI 2 "s_register_operand" "r,0")))
        !           150:    (clobber (reg:CC 24))]
        !           151:   ""
        !           152:   "*
        !           153:   arm_output_asm_insn (\"adds\\t%0, %1, %2\", operands);
        !           154:   return (arm_output_asm_insn (\"adc\\t%R0, %R1, %R2\", operands));
        !           155: "
        !           156: [(set_attr "conds" "clob")
        !           157:  (set_attr "length" "2")])
        !           158: 
        !           159: (define_insn ""
        !           160:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           161:        (plus:DI (sign_extend:DI
        !           162:                  (match_operand:SI 1 "s_register_operand" "r,r"))
        !           163:                 (match_operand:DI 2 "s_register_operand" "r,0")))
        !           164:    (clobber (reg:CC 24))]
        !           165:   ""
        !           166:   "*
        !           167:   arm_output_asm_insn (\"adds\\t%0, %2, %1\", operands);
        !           168:   return (arm_output_asm_insn (\"adc\\t%R0, %R2, %1, asr #31\", operands));
        !           169: "
        !           170: [(set_attr "conds" "clob")
        !           171:  (set_attr "length" "2")])
        !           172: 
        !           173: (define_insn ""
        !           174:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           175:        (plus:DI (zero_extend:DI
        !           176:                  (match_operand:SI 1 "s_register_operand" "r,r"))
        !           177:                 (match_operand:DI 2 "s_register_operand" "r,0")))
        !           178:    (clobber (reg:CC 24))]
        !           179:   ""
        !           180:   "*
        !           181:   arm_output_asm_insn (\"adds\\t%0, %2, %1\", operands);
        !           182:   return (arm_output_asm_insn (\"adc\\t%R0, %R2, #0\", operands));
        !           183: "
        !           184: [(set_attr "conds" "clob")
        !           185:  (set_attr "length" "2")])
        !           186: 
        !           187: (define_insn "addsi3"
        !           188:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !           189:        (plus:SI (match_operand:SI 1 "s_register_operand" "r")
        !           190:                 (match_operand:SI 2 "arm_add_operand" "rL")))]
        !           191:   ""
        !           192:   "*
        !           193:   if (GET_CODE (operands[2]) == CONST_INT
        !           194:       && !const_ok_for_arm (INTVAL (operands[2])))
        !           195:     {
        !           196:       operands[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2]));
        !           197:       return arm_output_asm_insn (\"sub\\t%0, %1, %2\", operands);
        !           198:     }
        !           199:   return arm_output_asm_insn (\"add\\t%0, %1, %2\", operands);
        !           200: ")
        !           201: 
        !           202: (define_insn ""
        !           203:   [(set (reg:CC_NOOV 24)
        !           204:        (compare:CC_NOOV (plus:SI (match_operand:SI 1 "s_register_operand" "r")
        !           205:                                  (match_operand:SI 2 "arm_add_operand" "rL"))
        !           206:                         (const_int 0)))
        !           207:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !           208:        (plus:SI (match_dup 1) (match_dup 2)))]
        !           209:   ""
        !           210:   "*
        !           211:   if (GET_CODE (operands[2]) == CONST_INT
        !           212:       && !const_ok_for_arm (INTVAL (operands[2])))
        !           213:     {
        !           214:       operands[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2]));
        !           215:       return arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
        !           216:     }
        !           217:   return (arm_output_asm_insn (\"adds\\t%0, %1, %2\", operands));
        !           218: "
        !           219: [(set_attr "conds" "set")])
        !           220: 
        !           221: (define_insn ""
        !           222:   [(set (reg:CC 24)
        !           223:        (compare:CC (match_operand:SI 1 "s_register_operand" "r")
        !           224:                    (neg:SI (match_operand:SI 2 "arm_add_operand" "rL"))))
        !           225:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !           226:        (plus:SI (match_dup 1) (match_dup 2)))]
        !           227:   ""
        !           228:   "*
        !           229:   if (GET_CODE (operands[2]) == CONST_INT
        !           230:       && !const_ok_for_arm (INTVAL (operands[2])))
        !           231:     {
        !           232:       operands[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2]));
        !           233:       return arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
        !           234:     }
        !           235:   return (arm_output_asm_insn (\"adds\\t%0, %1, %2\", operands));
        !           236: "
        !           237: [(set_attr "conds" "set")])
        !           238: 
        !           239: (define_insn "incscc"
        !           240:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !           241:         (plus:SI (match_operator:SI 2 "comparison_operator"
        !           242:                     [(reg 24) (const_int 0)])
        !           243:                  (match_operand:SI 1 "s_register_operand" "0,?r")))]
        !           244:   ""
        !           245:   "*
        !           246:   if (which_alternative == 1)
        !           247:     arm_output_asm_insn (\"mov%D2\\t%0, %1\", operands);
        !           248:   return arm_output_asm_insn (\"add%d2\\t%0, %1, #1\", operands);
        !           249: "
        !           250: [(set_attr "conds" "use")
        !           251:  (set_attr "length" "*,2")])
        !           252: 
        !           253: ; If a constant is too big to fit in a single instruction then the constant
        !           254: ; will be pre-loaded into a register taking at least two insns, we might be
        !           255: ; able to merge it with an add, but it depends on the exact value.
        !           256: 
        !           257: (define_split
        !           258:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !           259:        (plus:SI (match_operand:SI 1 "s_register_operand" "r")
        !           260:                 (match_operand:SI 2 "immediate_operand" "n")))]
        !           261:   "!(const_ok_for_arm (INTVAL (operands[2]))
        !           262:      || const_ok_for_arm (-INTVAL (operands[2])))"
        !           263:   [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))
        !           264:    (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 3)))]
        !           265:   "
        !           266: {
        !           267:   unsigned int val = (unsigned) INTVAL (operands[2]);
        !           268:   int i;
        !           269:   unsigned int temp;
        !           270: 
        !           271:   /* this code is similar to the approach followed in movsi, but it must
        !           272:      generate exactly two insns */
        !           273: 
        !           274:   for (i = 30; i >= 0; i -= 2)
        !           275:     {
        !           276:       if (val & (3 << i))
        !           277:        {
        !           278:          i -= 6;
        !           279:          if (i < 0) i = 0;
        !           280:          if (const_ok_for_arm (temp = (val & ~(255 << i))))
        !           281:            {
        !           282:              val &= 255 << i;
        !           283:              break;
        !           284:            }
        !           285:          /* we might be able to do this as (larger number - small number) */
        !           286:          temp = ((val >> i) & 255) + 1;
        !           287:          if (temp > 255 && i < 24)
        !           288:            {
        !           289:              i += 2;
        !           290:              temp = ((val >> i) & 255) + 1;
        !           291:            }
        !           292:          if (const_ok_for_arm ((temp << i) - val))
        !           293:            {
        !           294:              i = temp << i;
        !           295:              temp = (unsigned) - (int) (i - val);
        !           296:              val = i;
        !           297:              break;
        !           298:            }
        !           299:          FAIL;
        !           300:        }
        !           301:     }
        !           302:   /* if we got here, we have found a way of doing it in two instructions.
        !           303:      the two constants are in val and temp */
        !           304:   operands[2] = GEN_INT ((int)val);
        !           305:   operands[3] = GEN_INT ((int)temp);
        !           306: }
        !           307: ")
        !           308: 
        !           309: (define_insn "addsf3"
        !           310:   [(set (match_operand:SF 0 "s_register_operand" "=f,f")
        !           311:        (plus:SF (match_operand:SF 1 "s_register_operand" "f,f")
        !           312:                 (match_operand:SF 2 "fpu_add_operand" "fG,H")))]
        !           313:   ""
        !           314:   "*
        !           315: {
        !           316:   REAL_VALUE_TYPE r;
        !           317: 
        !           318:   switch (which_alternative)
        !           319:     {
        !           320:     case 0:
        !           321:       return arm_output_asm_insn (\"adfs\\t%0, %1, %2\", operands);
        !           322:     case 1:
        !           323:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[2]);
        !           324:       r = REAL_VALUE_NEGATE (r);
        !           325:       operands[2] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[2]));
        !           326:       return arm_output_asm_insn (\"sufs\\t%0, %1, %2\", operands);
        !           327:     }
        !           328: }
        !           329: "
        !           330: [(set_attr "type" "float")])
        !           331: 
        !           332: (define_insn "adddf3"
        !           333:   [(set (match_operand:DF 0 "s_register_operand" "=f,f")
        !           334:        (plus:DF (match_operand:DF 1 "s_register_operand" "f,f")
        !           335:                 (match_operand:DF 2 "fpu_add_operand" "fG,H")))]
        !           336:   ""
        !           337:   "*
        !           338: {
        !           339:   REAL_VALUE_TYPE r;
        !           340: 
        !           341:   switch (which_alternative)
        !           342:     {
        !           343:     case 0:
        !           344:       return (arm_output_asm_insn (\"adfd\\t%0, %1, %2\", operands));
        !           345:     case 1:
        !           346:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[2]);
        !           347:       r = REAL_VALUE_NEGATE (r);
        !           348:       operands[2] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[2]));
        !           349:       return arm_output_asm_insn (\"sufd\\t%0, %1, %2\", operands);
        !           350:     }
        !           351: }
        !           352: "
        !           353: [(set_attr "type" "float")])
        !           354: 
        !           355: (define_insn ""
        !           356:   [(set (match_operand:DF 0 "s_register_operand" "=f,f")
        !           357:        (plus:DF (float_extend:DF
        !           358:                  (match_operand:SF 1 "s_register_operand" "f,f"))
        !           359:                 (match_operand:DF 2 "fpu_add_operand" "fG,H")))]
        !           360:   ""
        !           361:   "*
        !           362: {
        !           363:   REAL_VALUE_TYPE r;
        !           364: 
        !           365:   switch (which_alternative)
        !           366:     {
        !           367:     case 0:
        !           368:       return (arm_output_asm_insn (\"adfd\\t%0, %1, %2\", operands));
        !           369:     case 1:
        !           370:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[2]);
        !           371:       r = REAL_VALUE_NEGATE (r);
        !           372:       operands[2] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[2]));
        !           373:       return arm_output_asm_insn (\"sufd\\t%0, %1, %2\", operands);
        !           374:     }
        !           375: }
        !           376: "
        !           377: [(set_attr "type" "float")])
        !           378: 
        !           379: (define_insn ""
        !           380:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           381:        (plus:DF (match_operand:DF 1 "s_register_operand" "f")
        !           382:                 (float_extend:DF
        !           383:                  (match_operand:SF 2 "s_register_operand" "f"))))]
        !           384:   ""
        !           385:   "*
        !           386:   return (arm_output_asm_insn (\"adfd\\t%0, %1, %2\", operands));
        !           387: "
        !           388: [(set_attr "type" "float")])
        !           389: 
        !           390: (define_insn ""
        !           391:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           392:        (plus:DF (float_extend:DF 
        !           393:                  (match_operand:SF 1 "s_register_operand" "f"))
        !           394:                 (float_extend:DF
        !           395:                  (match_operand:SF 2 "s_register_operand" "f"))))]
        !           396:   ""
        !           397:   "*
        !           398:   return (arm_output_asm_insn (\"adfd\\t%0, %1, %2\", operands));
        !           399: "
        !           400: [(set_attr "type" "float")])
        !           401: 
        !           402: (define_insn "addxf3"
        !           403:   [(set (match_operand:XF 0 "s_register_operand" "=f,f")
        !           404:        (plus:XF (match_operand:XF 1 "s_register_operand" "f,f")
        !           405:                 (match_operand:XF 2 "fpu_add_operand" "fG,H")))]
        !           406:   "ENABLE_XF_PATTERNS"
        !           407:   "*
        !           408: {
        !           409:   REAL_VALUE_TYPE r;
        !           410: 
        !           411:   switch (which_alternative)
        !           412:     {
        !           413:     case 0:
        !           414:       return (arm_output_asm_insn (\"adfe\\t%0, %1, %2\", operands));
        !           415:     case 1:
        !           416:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[2]);
        !           417:       r = REAL_VALUE_NEGATE (r);
        !           418:       operands[2] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[2]));
        !           419:       return arm_output_asm_insn (\"sufe\\t%0, %1, %2\", operands);
        !           420:     }
        !           421: }
        !           422: "
        !           423: [(set_attr "type" "float")])
        !           424: 
        !           425: (define_insn "subdi3"
        !           426:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r,&r")
        !           427:        (minus:DI (match_operand:DI 1 "s_register_operand" "0,r,0")
        !           428:                  (match_operand:DI 2 "s_register_operand" "r,0,0")))
        !           429:    (clobber (reg:CC 24))]
        !           430:   ""
        !           431:   "*
        !           432:   arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
        !           433:   return (arm_output_asm_insn (\"sbc\\t%R0, %R1, %R2\", operands));
        !           434: "
        !           435: [(set_attr "conds" "clob")
        !           436:  (set_attr "length" "2")])
        !           437: 
        !           438: (define_insn ""
        !           439:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           440:        (minus:DI (match_operand:DI 1 "s_register_operand" "?r,0")
        !           441:                  (zero_extend:DI
        !           442:                   (match_operand:SI 2 "s_register_operand" "r,r"))))
        !           443:    (clobber (reg:CC 24))]
        !           444:   ""
        !           445:   "*
        !           446:   arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
        !           447:   return (arm_output_asm_insn (\"sbc\\t%R0, %R1, #0\", operands));
        !           448: "
        !           449: [(set_attr "conds" "clob")
        !           450:  (set_attr "length" "2")])
        !           451: 
        !           452: (define_insn ""
        !           453:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           454:        (minus:DI (match_operand:DI 1 "s_register_operand" "r,0")
        !           455:                  (sign_extend:DI
        !           456:                   (match_operand:SI 2 "s_register_operand" "r,r"))))
        !           457:    (clobber (reg:CC 24))]
        !           458:   ""
        !           459:   "*
        !           460:   arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
        !           461:   return (arm_output_asm_insn (\"sbc\\t%R0, %R1, %2, asr #31\", operands));
        !           462: "
        !           463: [(set_attr "conds" "clob")
        !           464:  (set_attr "length" "2")])
        !           465: 
        !           466: (define_insn ""
        !           467:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           468:        (minus:DI (zero_extend:DI
        !           469:                   (match_operand:SI 2 "s_register_operand" "r,r"))
        !           470:                  (match_operand:DI 1 "s_register_operand" "?r,0")))
        !           471:    (clobber (reg:CC 24))]
        !           472:   ""
        !           473:   "*
        !           474:   arm_output_asm_insn (\"rsbs\\t%0, %1, %2\", operands);
        !           475:   return (arm_output_asm_insn (\"rsc\\t%R0, %R1, #0\", operands));
        !           476: "
        !           477: [(set_attr "conds" "clob")
        !           478:  (set_attr "length" "2")])
        !           479: 
        !           480: (define_insn ""
        !           481:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           482:        (minus:DI (sign_extend:DI
        !           483:                   (match_operand:SI 2 "s_register_operand" "r,r"))
        !           484:                  (match_operand:DI 1 "s_register_operand" "?r,0")))
        !           485:    (clobber (reg:CC 24))]
        !           486:   ""
        !           487:   "*
        !           488:   arm_output_asm_insn (\"rsbs\\t%0, %1, %2\", operands);
        !           489:   return (arm_output_asm_insn (\"rsc\\t%R0, %R1, %2, asr #31\", operands));
        !           490: "
        !           491: [(set_attr "conds" "clob")
        !           492:  (set_attr "length" "2")])
        !           493: 
        !           494: (define_insn ""
        !           495:   [(set (match_operand:DI 0 "s_register_operand" "=r")
        !           496:        (minus:DI (zero_extend:DI
        !           497:                   (match_operand:SI 1 "s_register_operand" "r"))
        !           498:                  (zero_extend:DI
        !           499:                   (match_operand:SI 2 "s_register_operand" "r"))))
        !           500:    (clobber (reg:CC 24))]
        !           501:   ""
        !           502:   "*
        !           503:   arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
        !           504:   return (arm_output_asm_insn (\"rsc\\t%R0, %1, %1 @ extend carry\",
        !           505:          operands));
        !           506: "
        !           507: [(set_attr "conds" "clob")
        !           508:  (set_attr "length" "2")])
        !           509: 
        !           510: (define_insn "subsi3"
        !           511:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !           512:        (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,I")
        !           513:                  (match_operand:SI 2 "arm_rhs_operand" "rI,r")))]
        !           514:   ""
        !           515:   "*
        !           516:   switch (which_alternative)
        !           517:     {
        !           518:     case 0:
        !           519:       return (arm_output_asm_insn (\"sub\\t%0, %1, %2\", operands));
        !           520:     case 1:
        !           521:       return (arm_output_asm_insn (\"rsb\\t%0, %2, %1\", operands));
        !           522:     }
        !           523: ")
        !           524: 
        !           525: (define_insn ""
        !           526:   [(set (reg:CC_NOOV 24)
        !           527:        (compare:CC_NOOV (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,I")
        !           528:                                 (match_operand:SI 2 "arm_rhs_operand" "rI,r"))
        !           529:                         (const_int 0)))
        !           530:    (set (match_operand:SI 0 "s_register_operand" "=r,r")
        !           531:        (minus:SI (match_dup 1) (match_dup 2)))]
        !           532:   ""
        !           533:   "*
        !           534:   switch (which_alternative)
        !           535:     {
        !           536:     case 0:
        !           537:       return arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
        !           538:     case 1:
        !           539:       return arm_output_asm_insn (\"rsbs\\t%0, %2, %1\", operands);
        !           540:     }
        !           541: "
        !           542: [(set_attr "conds" "set")])
        !           543: 
        !           544: (define_insn "decscc"
        !           545:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !           546:         (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r")
        !           547:                  (match_operator:SI 2 "comparison_operator"
        !           548:                    [(reg 24) (const_int 0)])))]
        !           549:   ""
        !           550:   "*
        !           551:   if (which_alternative == 1)
        !           552:     arm_output_asm_insn (\"mov%D2\\t%0, %1\", operands);
        !           553:   return arm_output_asm_insn (\"sub%d2\\t%0, %1, #1\", operands);
        !           554: "
        !           555: [(set_attr "conds" "use")
        !           556:  (set_attr "length" "*,2")])
        !           557: 
        !           558: (define_insn "subsf3"
        !           559:   [(set (match_operand:SF 0 "s_register_operand" "=f,f")
        !           560:        (minus:SF (match_operand:SF 1 "fpu_rhs_operand" "f,G")
        !           561:                  (match_operand:SF 2 "fpu_rhs_operand" "fG,f")))]
        !           562:   ""
        !           563:   "*
        !           564:   switch (which_alternative)
        !           565:     {
        !           566:     case 0:
        !           567:       return (arm_output_asm_insn (\"sufs\\t%0, %1, %2\", operands));
        !           568:     case 1:
        !           569:       return (arm_output_asm_insn (\"rsfs\\t%0, %2, %1\", operands));
        !           570:     }
        !           571: "
        !           572: [(set_attr "type" "float")])
        !           573: 
        !           574: (define_insn "subdf3"
        !           575:   [(set (match_operand:DF 0 "s_register_operand" "=f,f")
        !           576:        (minus:DF (match_operand:DF 1 "fpu_rhs_operand" "f,G")
        !           577:                  (match_operand:DF 2 "fpu_rhs_operand" "fG,f")))]
        !           578:   ""
        !           579:   "*
        !           580:   switch (which_alternative)
        !           581:     {
        !           582:     case 0:
        !           583:       return (arm_output_asm_insn (\"sufd\\t%0, %1, %2\", operands));
        !           584:     case 1:
        !           585:       return (arm_output_asm_insn (\"rsfd\\t%0, %2, %1\", operands));
        !           586:     }
        !           587: "
        !           588: [(set_attr "type" "float")])
        !           589: 
        !           590: (define_insn ""
        !           591:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           592:        (minus:DF (float_extend:DF
        !           593:                   (match_operand:SF 1 "s_register_operand" "f"))
        !           594:                  (match_operand:DF 2 "fpu_rhs_operand" "fG")))]
        !           595:   ""
        !           596:   "*
        !           597:   return arm_output_asm_insn (\"sufd\\t%0, %1, %2\", operands);
        !           598: "
        !           599: [(set_attr "type" "float")])
        !           600: 
        !           601: (define_insn ""
        !           602:   [(set (match_operand:DF 0 "s_register_operand" "=f,f")
        !           603:        (minus:DF (match_operand:DF 1 "fpu_rhs_operand" "f,G")
        !           604:                  (float_extend:DF
        !           605:                   (match_operand:SF 2 "s_register_operand" "f,f"))))]
        !           606:   ""
        !           607:   "*
        !           608:   switch (which_alternative)
        !           609:     {
        !           610:     case 0:
        !           611:       return (arm_output_asm_insn (\"sufd\\t%0, %1, %2\", operands));
        !           612:     case 1:
        !           613:       return (arm_output_asm_insn (\"rsfd\\t%0, %2, %1\", operands));
        !           614:     }
        !           615: "
        !           616: [(set_attr "type" "float")])
        !           617: 
        !           618: (define_insn ""
        !           619:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           620:        (minus:DF (float_extend:DF
        !           621:                   (match_operand:SF 1 "s_register_operand" "f"))
        !           622:                  (float_extend:DF
        !           623:                   (match_operand:SF 2 "s_register_operand" "f"))))]
        !           624:   ""
        !           625:   "*
        !           626:   return arm_output_asm_insn (\"sufd\\t%0, %1, %2\", operands);
        !           627: "
        !           628: [(set_attr "type" "float")])
        !           629: 
        !           630: (define_insn "subxf3"
        !           631:   [(set (match_operand:XF 0 "s_register_operand" "=f,f")
        !           632:        (minus:XF (match_operand:XF 1 "fpu_rhs_operand" "f,G")
        !           633:                  (match_operand:XF 2 "fpu_rhs_operand" "fG,f")))]
        !           634:   "ENABLE_XF_PATTERNS"
        !           635:   "*
        !           636:   switch (which_alternative)
        !           637:     {
        !           638:     case 0:
        !           639:       return (arm_output_asm_insn (\"sufe\\t%0, %1, %2\", operands));
        !           640:     case 1:
        !           641:       return (arm_output_asm_insn (\"rsfe\\t%0, %2, %1\", operands));
        !           642:     }
        !           643: "
        !           644: [(set_attr "type" "float")])
        !           645: 
        !           646: ;; Multiplication insns
        !           647: 
        !           648: ;; Use `&' and then `0' to prevent the operands 0 and 1 being the same
        !           649: (define_insn "mulsi3"
        !           650:   [(set (match_operand:SI 0 "s_register_operand" "=&r,&r")
        !           651:        (mult:SI (match_operand:SI 2 "s_register_operand" "r,r")
        !           652:                 (match_operand:SI 1 "s_register_operand" "%?r,0")))]
        !           653:   ""
        !           654:   "*
        !           655:   return (arm_output_asm_insn (\"mul\\t%0, %2, %1\", operands));
        !           656: ")
        !           657: 
        !           658: (define_insn ""
        !           659:   [(set (reg:CC_NOOV 24)
        !           660:        (compare:CC_NOOV (mult:SI
        !           661:                          (match_operand:SI 2 "s_register_operand" "r,r")
        !           662:                          (match_operand:SI 1 "s_register_operand" "%?r,0"))
        !           663:                         (const_int 0)))
        !           664:    (set (match_operand:SI 0 "s_register_operand" "=&r,&r")
        !           665:        (mult:SI (match_dup 2) (match_dup 1)))]
        !           666:   ""
        !           667:   "*
        !           668:   return (arm_output_asm_insn (\"muls\\t%0, %2, %1\", operands));
        !           669: "
        !           670: [(set_attr "conds" "set")])
        !           671: 
        !           672: (define_insn ""
        !           673:   [(set (reg:CC_NOOV 24)
        !           674:        (compare:CC_NOOV (mult:SI
        !           675:                          (match_operand:SI 2 "s_register_operand" "r,r")
        !           676:                          (match_operand:SI 1 "s_register_operand" "%?r,0"))
        !           677:                         (const_int 0)))
        !           678:    (clobber (match_scratch:SI 0 "=&r,&r"))]
        !           679:   ""
        !           680:   "*
        !           681:   return (arm_output_asm_insn (\"muls\\t%0, %2, %1\", operands));
        !           682: "
        !           683: [(set_attr "conds" "set")])
        !           684: 
        !           685: ;; Unnamed templates to match MLA instruction.
        !           686: 
        !           687: (define_insn ""
        !           688:   [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r,&r")
        !           689:        (plus:SI
        !           690:          (mult:SI (match_operand:SI 2 "s_register_operand" "r,r,r,r")
        !           691:                   (match_operand:SI 1 "s_register_operand" "%r,0,r,0"))
        !           692:          (match_operand:SI 3 "s_register_operand" "?r,r,0,0")))]
        !           693:   ""
        !           694:   "*
        !           695:   return (arm_output_asm_insn (\"mla\\t%0, %2, %1, %3\", operands));
        !           696: ")
        !           697: 
        !           698: (define_insn ""
        !           699:   [(set (reg:CC_NOOV 24)
        !           700:        (compare:CC_NOOV (plus:SI
        !           701:                          (mult:SI
        !           702:                           (match_operand:SI 2 "s_register_operand" "r,r,r,r")
        !           703:                           (match_operand:SI 1 "s_register_operand" "%r,0,r,0"))
        !           704:                          (match_operand:SI 3 "s_register_operand" "?r,r,0,0"))
        !           705:                         (const_int 0)))
        !           706:    (set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r,&r")
        !           707:        (plus:SI (mult:SI (match_dup 2) (match_dup 1))
        !           708:                 (match_dup 3)))]
        !           709:   ""
        !           710:   "*
        !           711:   return (arm_output_asm_insn (\"mlas\\t%0, %2, %1, %3\", operands));
        !           712: "
        !           713: [(set_attr "conds" "set")])
        !           714: 
        !           715: (define_insn ""
        !           716:   [(set (reg:CC_NOOV 24)
        !           717:        (compare:CC_NOOV (plus:SI
        !           718:                          (mult:SI
        !           719:                           (match_operand:SI 2 "s_register_operand" "r,r,r,r")
        !           720:                           (match_operand:SI 1 "s_register_operand" "%r,0,r,0"))
        !           721:                          (match_operand:SI 3 "s_register_operand" "?r,r,0,0"))
        !           722:                         (const_int 0)))
        !           723:    (clobber (match_scratch:SI 0 "=&r,&r,&r,&r"))]
        !           724:   ""
        !           725:   "*
        !           726:   return (arm_output_asm_insn (\"mlas\\t%0, %2, %1, %3\", operands));
        !           727: "
        !           728: [(set_attr "conds" "set")])
        !           729: 
        !           730: (define_insn "mulsf3"
        !           731:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !           732:        (mult:SF (match_operand:SF 1 "s_register_operand" "f")
        !           733:                 (match_operand:SF 2 "fpu_rhs_operand" "fG")))]
        !           734:   ""
        !           735:   "*
        !           736:   return (arm_output_asm_insn (\"fmls\\t%0, %1, %2\", operands));
        !           737: "
        !           738: [(set_attr "type" "float")])
        !           739: 
        !           740: (define_insn "muldf3"
        !           741:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           742:        (mult:DF (match_operand:DF 1 "s_register_operand" "f")
        !           743:                 (match_operand:DF 2 "fpu_rhs_operand" "fG")))]
        !           744:   ""
        !           745:   "*
        !           746:   return (arm_output_asm_insn (\"mufd\\t%0, %1, %2\", operands));
        !           747: "
        !           748: [(set_attr "type" "float")])
        !           749: 
        !           750: (define_insn ""
        !           751:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           752:        (mult:DF (float_extend:DF
        !           753:                  (match_operand:SF 1 "s_register_operand" "f"))
        !           754:                 (match_operand:DF 2 "fpu_rhs_operand" "fG")))]
        !           755:   ""
        !           756:   "*
        !           757:   return (arm_output_asm_insn (\"mufd\\t%0, %1, %2\", operands));
        !           758: "
        !           759: [(set_attr "type" "float")])
        !           760: 
        !           761: (define_insn ""
        !           762:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           763:        (mult:DF (match_operand:DF 1 "s_register_operand" "f")
        !           764:                 (float_extend:DF
        !           765:                  (match_operand:SF 2 "s_register_operand" "f"))))]
        !           766:   ""
        !           767:   "*
        !           768:   return (arm_output_asm_insn (\"mufd\\t%0, %1, %2\", operands));
        !           769: "
        !           770: [(set_attr "type" "float")])
        !           771: 
        !           772: (define_insn ""
        !           773:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           774:        (mult:DF (float_extend:DF
        !           775:                  (match_operand:SF 1 "s_register_operand" "f"))
        !           776:                 (float_extend:DF
        !           777:                  (match_operand:SF 2 "s_register_operand" "f"))))]
        !           778:   ""
        !           779:   "*
        !           780:   return (arm_output_asm_insn (\"mufd\\t%0, %1, %2\", operands));
        !           781: "
        !           782: [(set_attr "type" "float")])
        !           783: 
        !           784: (define_insn "mulxf3"
        !           785:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !           786:        (mult:XF (match_operand:XF 1 "s_register_operand" "f")
        !           787:                 (match_operand:XF 2 "fpu_rhs_operand" "fG")))]
        !           788:   "ENABLE_XF_PATTERNS"
        !           789:   "*
        !           790:   return (arm_output_asm_insn (\"mufe\\t%0, %1, %2\", operands));
        !           791: "
        !           792: [(set_attr "type" "float")])
        !           793: 
        !           794: ;; Division insns
        !           795: 
        !           796: (define_insn "divsf3"
        !           797:   [(set (match_operand:SF 0 "s_register_operand" "=f,f")
        !           798:        (div:SF (match_operand:SF 1 "fpu_rhs_operand" "f,G")
        !           799:                (match_operand:SF 2 "fpu_rhs_operand" "fG,f")))]
        !           800:   ""
        !           801:   "*
        !           802:   switch (which_alternative)
        !           803:     {
        !           804:     case 0:
        !           805:       return (arm_output_asm_insn (\"fdvs\\t%0, %1, %2\", operands));
        !           806:     case 1:
        !           807:       return (arm_output_asm_insn (\"frds\\t%0, %2, %1\", operands));
        !           808:     }
        !           809: "
        !           810: [(set_attr "type" "float")])
        !           811: 
        !           812: (define_insn "divdf3"
        !           813:   [(set (match_operand:DF 0 "s_register_operand" "=f,f")
        !           814:        (div:DF (match_operand:DF 1 "fpu_rhs_operand" "f,G")
        !           815:                (match_operand:DF 2 "fpu_rhs_operand" "fG,f")))]
        !           816:   ""
        !           817:   "*
        !           818:   switch (which_alternative)
        !           819:     {
        !           820:     case 0:
        !           821:       return (arm_output_asm_insn (\"dvfd\\t%0, %1, %2\", operands));
        !           822:     case 1:
        !           823:       return (arm_output_asm_insn (\"rdfd\\t%0, %2, %1\", operands));
        !           824:     }
        !           825: "
        !           826: [(set_attr "type" "float")])
        !           827: 
        !           828: (define_insn ""
        !           829:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           830:        (div:DF (float_extend:DF
        !           831:                 (match_operand:SF 1 "s_register_operand" "f"))
        !           832:                (match_operand:DF 2 "fpu_rhs_operand" "fG")))]
        !           833:   ""
        !           834:   "*
        !           835:   return (arm_output_asm_insn (\"dvfd\\t%0, %1, %2\", operands));
        !           836: "
        !           837: [(set_attr "type" "float")])
        !           838: 
        !           839: (define_insn ""
        !           840:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           841:        (div:DF (match_operand:DF 1 "fpu_rhs_operand" "fG")
        !           842:                (float_extend:DF
        !           843:                 (match_operand:SF 2 "s_register_operand" "f"))))]
        !           844:   ""
        !           845:   "*
        !           846:   return (arm_output_asm_insn (\"rdfd\\t%0, %2, %1\", operands));
        !           847: "
        !           848: [(set_attr "type" "float")])
        !           849: 
        !           850: (define_insn ""
        !           851:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           852:        (div:DF (float_extend:DF
        !           853:                 (match_operand:SF 1 "s_register_operand" "f"))
        !           854:                (float_extend:DF
        !           855:                 (match_operand:SF 2 "s_register_operand" "f"))))]
        !           856:   ""
        !           857:   "*
        !           858:   return (arm_output_asm_insn (\"dvfd\\t%0, %1, %2\", operands));
        !           859: "
        !           860: [(set_attr "type" "float")])
        !           861: 
        !           862: (define_insn "divxf3"
        !           863:   [(set (match_operand:XF 0 "s_register_operand" "=f,f")
        !           864:        (div:XF (match_operand:XF 1 "fpu_rhs_operand" "f,G")
        !           865:                (match_operand:XF 2 "fpu_rhs_operand" "fG,f")))]
        !           866:   "ENABLE_XF_PATTERNS"
        !           867:   "*
        !           868:   switch (which_alternative)
        !           869:     {
        !           870:     case 0:
        !           871:       return (arm_output_asm_insn (\"dvfe\\t%0, %1, %2\", operands));
        !           872:     case 1:
        !           873:       return (arm_output_asm_insn (\"rdfe\\t%0, %2, %1\", operands));
        !           874:     }
        !           875: "
        !           876: [(set_attr "type" "float")])
        !           877: 
        !           878: ;; Modulo insns
        !           879: 
        !           880: (define_insn "modsf3"
        !           881:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !           882:        (mod:SF (match_operand:SF 1 "s_register_operand" "f")
        !           883:                (match_operand:SF 2 "fpu_rhs_operand" "fG")))]
        !           884:   ""
        !           885:   "*
        !           886:   return (arm_output_asm_insn (\"rmfs\\t%0, %1, %2\", operands));
        !           887: "
        !           888: [(set_attr "type" "float")])
        !           889: 
        !           890: (define_insn "moddf3"
        !           891:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           892:        (mod:DF (match_operand:DF 1 "s_register_operand" "f")
        !           893:                (match_operand:DF 2 "fpu_rhs_operand" "fG")))]
        !           894:   ""
        !           895:   "*
        !           896:   return (arm_output_asm_insn (\"rmfd\\t%0, %1, %2\", operands));
        !           897: "
        !           898: [(set_attr "type" "float")])
        !           899: 
        !           900: (define_insn ""
        !           901:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           902:        (mod:DF (float_extend:DF
        !           903:                 (match_operand:SF 1 "s_register_operand" "f"))
        !           904:                (match_operand:DF 2 "fpu_rhs_operand" "fG")))]
        !           905:   ""
        !           906:   "*
        !           907:   return (arm_output_asm_insn (\"rmfd\\t%0, %1, %2\", operands));
        !           908: "
        !           909: [(set_attr "type" "float")])
        !           910: 
        !           911: (define_insn ""
        !           912:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           913:        (mod:DF (match_operand:DF 1 "s_register_operand" "f")
        !           914:                (float_extend:DF
        !           915:                 (match_operand:SF 2 "s_register_operand" "f"))))]
        !           916:   ""
        !           917:   "*
        !           918:   return (arm_output_asm_insn (\"rmfd\\t%0, %1, %2\", operands));
        !           919: "
        !           920: [(set_attr "type" "float")])
        !           921: 
        !           922: (define_insn ""
        !           923:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !           924:        (mod:DF (float_extend:DF
        !           925:                 (match_operand:SF 1 "s_register_operand" "f"))
        !           926:                (float_extend:DF
        !           927:                 (match_operand:SF 2 "s_register_operand" "f"))))]
        !           928:   ""
        !           929:   "*
        !           930:   return (arm_output_asm_insn (\"rmfd\\t%0, %1, %2\", operands));
        !           931: "
        !           932: [(set_attr "type" "float")])
        !           933: 
        !           934: (define_insn "modxf3"
        !           935:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !           936:        (mod:XF (match_operand:XF 1 "s_register_operand" "f")
        !           937:                (match_operand:XF 2 "fpu_rhs_operand" "fG")))]
        !           938:   "ENABLE_XF_PATTERNS"
        !           939:   "*
        !           940:   return (arm_output_asm_insn (\"rmfe\\t%0, %1, %2\", operands));
        !           941: "
        !           942: [(set_attr "type" "float")])
        !           943: 
        !           944: ;; Boolean and,ior,xor insns
        !           945: 
        !           946: (define_insn "anddi3"
        !           947:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           948:        (and:DI (match_operand:DI 1 "s_register_operand" "%0,0")
        !           949:                (match_operand:DI 2 "s_register_operand" "r,0")))]
        !           950:   ""
        !           951:   "*
        !           952:   arm_output_asm_insn (\"and\\t%0, %1, %2\", operands);
        !           953:   return (arm_output_asm_insn (\"and\\t%R0, %R1, %R2\", operands));
        !           954: "
        !           955: [(set_attr "length" "2")])
        !           956: 
        !           957: (define_insn ""
        !           958:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           959:        (and:DI (zero_extend:DI
        !           960:                 (match_operand:SI 2 "s_register_operand" "r,r"))
        !           961:                (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !           962:   ""
        !           963:   "*
        !           964:   arm_output_asm_insn (\"and\\t%0, %1, %2\", operands);
        !           965:   return arm_output_asm_insn (\"mov\\t%R0, #0\", operands);
        !           966: "
        !           967: [(set_attr "length" "2")])
        !           968: 
        !           969: (define_insn ""
        !           970:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !           971:        (and:DI (sign_extend:DI
        !           972:                 (match_operand:SI 2 "s_register_operand" "r,r"))
        !           973:                (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !           974:   ""
        !           975:   "*
        !           976:   arm_output_asm_insn (\"and\\t%0, %1, %2\", operands);
        !           977:   return arm_output_asm_insn (\"and\\t%R0, %R1, %2, asr #31\", operands);
        !           978: "
        !           979: [(set_attr "length" "2")])
        !           980: 
        !           981: (define_insn "andsi3"
        !           982:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !           983:        (and:SI (match_operand:SI 1 "s_register_operand" "r")
        !           984:                (match_operand:SI 2 "arm_not_operand" "rK")))]
        !           985:   ""
        !           986:   "*
        !           987:   if (GET_CODE (operands[2]) == CONST_INT
        !           988:       && !const_ok_for_arm (INTVAL (operands[2])))
        !           989:     {
        !           990:       operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
        !           991:       return arm_output_asm_insn (\"bic\\t%0, %1, %2\", operands);
        !           992:     }
        !           993:   return arm_output_asm_insn (\"and\\t%0, %1, %2\", operands);
        !           994: ")
        !           995: 
        !           996: (define_insn ""
        !           997:   [(set (reg:CC_NOOV 24)
        !           998:        (compare:CC_NOOV (and:SI (match_operand:SI 1 "s_register_operand" "r")
        !           999:                                 (match_operand:SI 2 "arm_not_operand" "rK"))
        !          1000:                         (const_int 0)))
        !          1001:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          1002:        (and:SI (match_dup 1) (match_dup 2)))]
        !          1003:   ""
        !          1004:   "*
        !          1005:   if (GET_CODE (operands[2]) == CONST_INT
        !          1006:       && !const_ok_for_arm (INTVAL (operands[2])))
        !          1007:     {
        !          1008:       operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
        !          1009:       return arm_output_asm_insn (\"bics\\t%0, %1, %2\", operands);
        !          1010:     }
        !          1011:   return arm_output_asm_insn (\"ands\\t%0, %1, %2\", operands);
        !          1012: "
        !          1013: [(set_attr "conds" "set")])
        !          1014: 
        !          1015: (define_insn ""
        !          1016:   [(set (reg:CC_NOOV 24)
        !          1017:        (compare:CC_NOOV (and:SI (match_operand:SI 0 "s_register_operand" "r")
        !          1018:                                 (match_operand:SI 1 "arm_rhs_operand" "rI"))
        !          1019:                         (const_int 0)))]
        !          1020:   ""
        !          1021:   "*
        !          1022:   return arm_output_asm_insn (\"tst\\t%0, %1\", operands);
        !          1023: "
        !          1024: [(set_attr "conds" "set")])
        !          1025: 
        !          1026: (define_insn ""
        !          1027:   [(set (reg:CC_NOOV 24)
        !          1028:        (compare:CC_NOOV (and:SI (match_operand:SI 0 "s_register_operand" "r")
        !          1029:                                 (match_operand:SI 1 "immediate_operand" "K"))
        !          1030:                         (const_int 0)))
        !          1031:    (clobber (match_scratch:SI 3 "=r"))]
        !          1032:   "const_ok_for_arm (~INTVAL (operands[1]))"
        !          1033:   "*
        !          1034:   operands[1] = GEN_INT (~INTVAL (operands[1]));
        !          1035:   return arm_output_asm_insn (\"bics\\t%3, %0, %1\", operands);
        !          1036: "
        !          1037: [(set_attr "conds" "set")])
        !          1038: 
        !          1039: (define_insn ""
        !          1040:   [(set (reg:CC_NOOV 24)
        !          1041:        (compare:CC_NOOV (zero_extract:SI
        !          1042:                          (match_operand:SI 0 "s_register_operand" "r")
        !          1043:                          (match_operand:SI 1 "immediate_operand" "n")
        !          1044:                          (match_operand:SI 2 "immediate_operand" "n"))
        !          1045:                         (const_int 0)))]
        !          1046:   "INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 32
        !          1047:    && INTVAL (operands[1]) > 0 
        !          1048:    && INTVAL (operands[1]) + (INTVAL (operands[2]) & 1) <= 8
        !          1049:    && INTVAL (operands[1]) + INTVAL (operands[2]) <= 32"
        !          1050:   "*
        !          1051: {
        !          1052:   unsigned int mask = 0;
        !          1053:   int cnt = INTVAL (operands[1]);
        !          1054:   
        !          1055:   while (cnt--)
        !          1056:     mask = (mask << 1) | 1;
        !          1057:   operands[1] = gen_rtx (CONST_INT, VOIDmode, mask << INTVAL (operands[2]));
        !          1058:   return arm_output_asm_insn (\"tst\\t%0, %1\", operands);
        !          1059: }
        !          1060: "
        !          1061: [(set_attr "conds" "set")])
        !          1062: 
        !          1063: (define_insn ""
        !          1064:   [(set (reg:CC_NOOV 24)
        !          1065:        (compare:CC_NOOV (zero_extract:SI
        !          1066:                          (match_operand:QI 0 "memory_operand" "m")
        !          1067:                          (match_operand 1 "immediate_operand" "n")
        !          1068:                          (match_operand 2 "immediate_operand" "n"))
        !          1069:                         (const_int 0)))
        !          1070:    (clobber (match_scratch:QI 3 "=r"))]
        !          1071:   "INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 8
        !          1072:    && INTVAL (operands[1]) > 0 && INTVAL (operands[1]) <= 8"
        !          1073:   "*
        !          1074: {
        !          1075:   unsigned int mask = 0;
        !          1076:   int cnt = INTVAL (operands[1]);
        !          1077:   
        !          1078:   while (cnt--)
        !          1079:     mask = (mask << 1) | 1;
        !          1080:   operands[1] = gen_rtx (CONST_INT, VOIDmode, mask << INTVAL (operands[2]));
        !          1081:   arm_output_asm_insn (\"ldrb\\t%3, %0\", operands);
        !          1082:   return arm_output_asm_insn (\"tst\\t%3, %1\", operands);
        !          1083: }
        !          1084: "
        !          1085: [(set_attr "conds" "set")
        !          1086:  (set_attr "length" "2")])
        !          1087: 
        !          1088: ;; constants for op 2 will never be given to these patterns.
        !          1089: (define_insn ""
        !          1090:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1091:        (and:DI (not:DI (match_operand:DI 2 "s_register_operand" "r,0"))
        !          1092:                (match_operand:DI 1 "s_register_operand" "0,r")))]
        !          1093:   ""
        !          1094:   "*
        !          1095:   arm_output_asm_insn (\"bic\\t%0, %1, %2\", operands);
        !          1096:   return arm_output_asm_insn (\"bic\\t%R0, %R1, %R2\", operands);
        !          1097: "
        !          1098: [(set_attr "length" "2")])
        !          1099:   
        !          1100: (define_insn ""
        !          1101:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1102:        (and:DI (not:DI (zero_extend:DI
        !          1103:                         (match_operand:SI 2 "s_register_operand" "r,r")))
        !          1104:                (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !          1105:   ""
        !          1106:   "*
        !          1107:   arm_output_asm_insn (\"bic\\t%0, %1, %2\", operands);
        !          1108:   if (REGNO (operands[1]) != REGNO (operands[0]))
        !          1109:     return arm_output_asm_insn (\"mov\\t%R0, %R1\", operands);
        !          1110:   return \"\";
        !          1111: "
        !          1112: [(set_attr "length" "2,1")])
        !          1113:   
        !          1114: (define_insn ""
        !          1115:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1116:        (and:DI (not:DI (sign_extend:DI
        !          1117:                         (match_operand:SI 2 "s_register_operand" "r,r")))
        !          1118:                (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !          1119:   ""
        !          1120:   "*
        !          1121:   arm_output_asm_insn (\"bic\\t%0, %1, %2\", operands);
        !          1122:   return arm_output_asm_insn (\"bic\\t%R0, %R1, %2, asr #31\", operands);
        !          1123: "
        !          1124: [(set_attr "length" "2")])
        !          1125:   
        !          1126: (define_insn ""
        !          1127:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1128:        (and:SI (not:SI (match_operand:SI 2 "s_register_operand" "r"))
        !          1129:                (match_operand:SI 1 "s_register_operand" "r")))]
        !          1130:   ""
        !          1131:   "*
        !          1132:   return (arm_output_asm_insn (\"bic\\t%0, %1, %2\", operands));
        !          1133: ")
        !          1134: 
        !          1135: (define_insn ""
        !          1136:   [(set (reg:CC_NOOV 24)
        !          1137:        (compare:CC_NOOV (and:SI
        !          1138:                          (not:SI (match_operand:SI 2 "s_register_operand" "r"))
        !          1139:                          (match_operand:SI 1 "s_register_operand" "r"))
        !          1140:                         (const_int 0)))
        !          1141:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          1142:        (and:SI (not:SI (match_dup 2)) (match_dup 1)))]
        !          1143:   ""
        !          1144:   "*
        !          1145:   return (arm_output_asm_insn (\"bics\\t%0, %1, %2\", operands));
        !          1146: "
        !          1147: [(set_attr "conds" "set")])
        !          1148: 
        !          1149: (define_insn ""
        !          1150:   [(set (reg:CC_NOOV 24)
        !          1151:        (compare:CC_NOOV (and:SI
        !          1152:                          (not:SI (match_operand:SI 2 "s_register_operand" "r"))
        !          1153:                          (match_operand:SI 1 "s_register_operand" "r"))
        !          1154:                         (const_int 0)))
        !          1155:    (clobber (match_scratch:SI 0 "=r"))]
        !          1156:   ""
        !          1157:   "*
        !          1158:   return (arm_output_asm_insn (\"bics\\t%0, %1, %2\", operands));
        !          1159: "
        !          1160: [(set_attr "conds" "set")])
        !          1161: 
        !          1162: (define_insn "iordi3"
        !          1163:   [(set (match_operand:DI 0 "s_register_operand" "=&r")
        !          1164:        (ior:DI (match_operand:DI 1 "s_register_operand" "%0")
        !          1165:                (match_operand:DI 2 "s_register_operand" "r")))]
        !          1166:   ""
        !          1167:   "*
        !          1168:   arm_output_asm_insn (\"orr\\t%0, %1, %2\", operands);
        !          1169:   return (arm_output_asm_insn (\"orr\\t%R0, %R1, %R2\", operands));
        !          1170: "
        !          1171: [(set_attr "length" "2")])
        !          1172: 
        !          1173: (define_insn ""
        !          1174:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1175:        (ior:DI (zero_extend:DI
        !          1176:                 (match_operand:SI 2 "s_register_operand" "r,r"))
        !          1177:                (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !          1178:   ""
        !          1179:   "*
        !          1180:   arm_output_asm_insn (\"orr\\t%0, %1, %2\", operands);
        !          1181:   if (REGNO (operands[0]) != REGNO (operands[1]))
        !          1182:     return (arm_output_asm_insn (\"mov\\t%R0, %R1\", operands));
        !          1183:   return \"\";
        !          1184: "
        !          1185: [(set_attr "length" "2,1")])
        !          1186: 
        !          1187: (define_insn ""
        !          1188:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1189:        (ior:DI (sign_extend:DI
        !          1190:                 (match_operand:SI 2 "s_register_operand" "r,r"))
        !          1191:                (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !          1192:   ""
        !          1193:   "*
        !          1194:   arm_output_asm_insn (\"orr\\t%0, %1, %2\", operands);
        !          1195:   return (arm_output_asm_insn (\"orr\\t%R0, %R1, %2, asr #31\", operands));
        !          1196: "
        !          1197: [(set_attr "length" "2")])
        !          1198: 
        !          1199: (define_insn "iorsi3"
        !          1200:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1201:        (ior:SI (match_operand:SI 1 "s_register_operand" "r")
        !          1202:                (match_operand:SI 2 "arm_rhs_operand" "rI")))]
        !          1203:   ""
        !          1204:   "*
        !          1205:   return (arm_output_asm_insn (\"orr\\t%0, %1, %2\", operands));
        !          1206: ")
        !          1207: 
        !          1208: (define_insn ""
        !          1209:   [(set (reg:CC_NOOV 24)
        !          1210:        (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r")
        !          1211:                                 (match_operand:SI 2 "arm_rhs_operand" "rI"))
        !          1212:                         (const_int 0)))
        !          1213:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          1214:        (ior:SI (match_dup 1) (match_dup 2)))]
        !          1215:   ""
        !          1216:   "*
        !          1217:   return arm_output_asm_insn (\"orrs\\t%0, %1, %2\", operands);
        !          1218: "
        !          1219: [(set_attr "conds" "set")])
        !          1220: 
        !          1221: (define_insn ""
        !          1222:   [(set (reg:CC_NOOV 24)
        !          1223:        (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r")
        !          1224:                                 (match_operand:SI 2 "arm_rhs_operand" "rI"))
        !          1225:                         (const_int 0)))
        !          1226:    (clobber (match_scratch:SI 0 "=r"))]
        !          1227:   ""
        !          1228:   "*
        !          1229:   return arm_output_asm_insn (\"orrs\\t%0, %1, %2\", operands);
        !          1230: "
        !          1231: [(set_attr "conds" "set")])
        !          1232: 
        !          1233: (define_insn "xordi3"
        !          1234:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1235:        (xor:DI (match_operand:DI 1 "s_register_operand" "%0,0")
        !          1236:                (match_operand:DI 2 "s_register_operand" "r,0")))]
        !          1237:   ""
        !          1238:   "*
        !          1239:   arm_output_asm_insn (\"eor\\t%0, %1, %2\", operands);
        !          1240:   return arm_output_asm_insn (\"eor\\t%R0, %R1, %R2\", operands);
        !          1241: "
        !          1242: [(set_attr "length" "2")])
        !          1243: 
        !          1244: (define_insn ""
        !          1245:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1246:        (xor:DI (zero_extend:DI
        !          1247:                 (match_operand:SI 2 "s_register_operand" "r,r"))
        !          1248:                (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !          1249:   ""
        !          1250:   "*
        !          1251:   arm_output_asm_insn (\"eor\\t%0, %1, %2\", operands);
        !          1252:   if (REGNO (operands[0]) != REGNO (operands[1]))
        !          1253:     return arm_output_asm_insn (\"mov\\t%R0, %R1\", operands);
        !          1254:   return \"\";
        !          1255: "
        !          1256: [(set_attr "length" "2,1")])
        !          1257: 
        !          1258: (define_insn ""
        !          1259:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1260:        (xor:DI (sign_extend:DI
        !          1261:                 (match_operand:SI 2 "s_register_operand" "r,r"))
        !          1262:                (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !          1263:   ""
        !          1264:   "*
        !          1265:   arm_output_asm_insn (\"eor\\t%0, %1, %2\", operands);
        !          1266:   return arm_output_asm_insn (\"eor\\t%R0, %R1, %2, asr #31\", operands);
        !          1267: "
        !          1268: [(set_attr "length" "2")])
        !          1269: 
        !          1270: (define_insn "xorsi3"
        !          1271:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1272:        (xor:SI (match_operand:SI 1 "s_register_operand" "r")
        !          1273:                (match_operand:SI 2 "arm_rhs_operand" "rI")))]
        !          1274:   ""
        !          1275:   "*
        !          1276:   return (arm_output_asm_insn (\"eor\\t%0, %1, %2\", operands));
        !          1277: ")
        !          1278: 
        !          1279: (define_insn ""
        !          1280:   [(set (reg:CC_NOOV 24)
        !          1281:        (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" "r")
        !          1282:                                 (match_operand:SI 2 "arm_rhs_operand" "rI"))
        !          1283:                         (const_int 0)))
        !          1284:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          1285:        (xor:SI (match_dup 1) (match_dup 2)))]
        !          1286:   ""
        !          1287:   "*
        !          1288:   return arm_output_asm_insn (\"eors\\t%0, %1, %2\", operands);
        !          1289: "
        !          1290: [(set_attr "conds" "set")])
        !          1291: 
        !          1292: (define_insn ""
        !          1293:   [(set (reg:CC_NOOV 24)
        !          1294:        (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" "r")
        !          1295:                                 (match_operand:SI 1 "arm_rhs_operand" "rI"))
        !          1296:                         (const_int 0)))]
        !          1297:   ""
        !          1298:   "*
        !          1299:   return arm_output_asm_insn (\"teq\\t%0, %1\", operands);
        !          1300: "
        !          1301: [(set_attr "conds" "set")])
        !          1302: 
        !          1303: ;; by splitting (IOR (AND (NOT A) (NOT B)) C) as D = AND (IOR A B) (NOT C), 
        !          1304: ;; (NOT D) we can sometimes merge the final NOT into one of the following
        !          1305: ;; insns
        !          1306: 
        !          1307: (define_split
        !          1308:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1309:        (ior:SI (and:SI (not:SI (match_operand:SI 1 "s_register_operand" "r"))
        !          1310:                        (not:SI (match_operand:SI 2 "arm_rhs_operand" "rI")))
        !          1311:                (match_operand:SI 3 "arm_rhs_operand" "rI")))
        !          1312:    (clobber (match_operand:SI 4 "s_register_operand" "=r"))]
        !          1313:   ""
        !          1314:   [(set (match_dup 4) (and:SI (ior:SI (match_dup 1) (match_dup 2))
        !          1315:                              (not:SI (match_dup 3))))
        !          1316:    (set (match_dup 0) (not:SI (match_dup 4)))]
        !          1317:   ""
        !          1318: )
        !          1319: 
        !          1320: (define_insn ""
        !          1321:   [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r")
        !          1322:        (and:SI (ior:SI (match_operand:SI 1 "s_register_operand" "r,r,0")
        !          1323:                        (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))
        !          1324:                (not:SI (match_operand:SI 3 "arm_rhs_operand" "rI,rI,rI"))))]
        !          1325:   ""
        !          1326:   "*
        !          1327:   arm_output_asm_insn (\"orr\\t%0, %1, %2\", operands);
        !          1328:   return arm_output_asm_insn (\"bic\\t%0, %0, %3\", operands);
        !          1329: "
        !          1330: [(set_attr "length" "2")])
        !          1331: 
        !          1332: 
        !          1333: 
        !          1334: ;; Minimum and maximum insns
        !          1335: 
        !          1336: (define_insn "smaxsi3"
        !          1337:   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
        !          1338:        (smax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
        !          1339:                 (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
        !          1340:    (clobber (reg:CC 24))]
        !          1341:   ""
        !          1342:   "*
        !          1343:   arm_output_asm_insn (\"cmp\\t%1, %2\", operands);
        !          1344:   if (which_alternative != 0)
        !          1345:     arm_output_asm_insn (\"movge\\t%0, %1\", operands);
        !          1346:   if (which_alternative != 1)
        !          1347:     return arm_output_asm_insn (\"movlt\\t%0, %2\", operands);
        !          1348:   return \"\";
        !          1349: "
        !          1350: [(set_attr "conds" "clob")
        !          1351:  (set_attr "length" "2,2,3")])
        !          1352: 
        !          1353: (define_insn "sminsi3"
        !          1354:   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
        !          1355:        (smin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
        !          1356:                 (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
        !          1357:    (clobber (reg:CC 24))]
        !          1358:   ""
        !          1359:   "*
        !          1360:   arm_output_asm_insn (\"cmp\\t%1, %2\", operands);
        !          1361:   if (which_alternative != 0)
        !          1362:     arm_output_asm_insn (\"movle\\t%0, %1\", operands);
        !          1363:   if (which_alternative != 1)
        !          1364:     return arm_output_asm_insn (\"movgt\\t%0, %2\", operands);
        !          1365:   return \"\";
        !          1366: "
        !          1367: [(set_attr "conds" "clob")
        !          1368:  (set_attr "length" "2,2,3")])
        !          1369: 
        !          1370: (define_insn "umaxsi3"
        !          1371:   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
        !          1372:        (umax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
        !          1373:                 (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
        !          1374:    (clobber (reg:CC 24))]
        !          1375:   ""
        !          1376:   "*
        !          1377:   arm_output_asm_insn (\"cmp\\t%1, %2\", operands);
        !          1378:   if (which_alternative != 0)
        !          1379:     arm_output_asm_insn (\"movcs\\t%0, %1\", operands);
        !          1380:   if (which_alternative != 1)
        !          1381:     return arm_output_asm_insn (\"movcc\\t%0, %2\", operands);
        !          1382:   return \"\";
        !          1383: "
        !          1384: [(set_attr "conds" "clob")
        !          1385:  (set_attr "length" "2,2,3")])
        !          1386: 
        !          1387: (define_insn "uminsi3"
        !          1388:   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
        !          1389:        (umin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
        !          1390:                 (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
        !          1391:    (clobber (reg:CC 24))]
        !          1392:   ""
        !          1393:   "*
        !          1394:   arm_output_asm_insn (\"cmp\\t%1, %2\", operands);
        !          1395:   if (which_alternative != 0)
        !          1396:     arm_output_asm_insn (\"movcc\\t%0, %1\", operands);
        !          1397:   if (which_alternative != 1)
        !          1398:     return arm_output_asm_insn (\"movcs\\t%0, %2\", operands);
        !          1399:   return \"\";
        !          1400: "
        !          1401: [(set_attr "conds" "clob")
        !          1402:  (set_attr "length" "2,2,3")])
        !          1403: 
        !          1404: (define_insn ""
        !          1405:   [(set (match_operand:SI 0 "memory_operand" "=m")
        !          1406:        (match_operator:SI 3 "minmax_operator"
        !          1407:         [(match_operand:SI 1 "s_register_operand" "r")
        !          1408:          (match_operand:SI 2 "s_register_operand" "r")]))
        !          1409:    (clobber (reg:CC 24))]
        !          1410:   ""
        !          1411:   "*
        !          1412:   operands[3] = gen_rtx (minmax_code (operands[3]), SImode, operands[1],
        !          1413:                         operands[2]);
        !          1414:   arm_output_asm_insn (\"cmp\\t%1, %2\", operands);
        !          1415:   arm_output_asm_insn (\"str%d3\\t%1, %0\", operands);
        !          1416:   return arm_output_asm_insn (\"str%D3\\t%2, %0\", operands);
        !          1417: "
        !          1418: [(set_attr "conds" "clob")
        !          1419:  (set_attr "length" "3")
        !          1420:  (set_attr "type" "store1")])
        !          1421: 
        !          1422: (define_insn ""
        !          1423:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          1424:        (match_operator:SI 4 "shiftable_operator"
        !          1425:         [(match_operator:SI 5 "minmax_operator"
        !          1426:           [(match_operand:SI 2 "s_register_operand" "r,r")
        !          1427:            (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])
        !          1428:          (match_operand:SI 1 "s_register_operand" "0,?r")]))
        !          1429:    (clobber (reg:CC 24))]
        !          1430:   ""
        !          1431:   "*
        !          1432: {
        !          1433:   char buf[100];
        !          1434:   enum rtx_code code = GET_CODE (operands[4]);
        !          1435:   char *inst = arithmetic_instr (operands[4], TRUE);
        !          1436: 
        !          1437:   operands[5] = gen_rtx (minmax_code (operands[5]), SImode, operands[2],
        !          1438:                         operands[3]);
        !          1439:   arm_output_asm_insn (\"cmp\\t%2, %3\", operands);
        !          1440:   sprintf (buf, \"%s%%d5\\t%%0, %%1, %%2\", inst);
        !          1441:   arm_output_asm_insn (buf, operands);
        !          1442:   if (which_alternative != 0 || operands[3] != const0_rtx
        !          1443:       || (code != PLUS && code != MINUS && code != IOR && code != XOR))
        !          1444:   {
        !          1445:     sprintf (buf, \"%s%%D5\\t%%0, %%1, %%3\", inst);
        !          1446:     return arm_output_asm_insn (buf, operands);
        !          1447:   }
        !          1448:   return \"\";
        !          1449: }
        !          1450: "
        !          1451: [(set_attr "conds" "clob")
        !          1452:  (set_attr "length" "3")])
        !          1453: 
        !          1454: 
        !          1455: ;; Shift and rotation insns
        !          1456: 
        !          1457: (define_insn "ashlsi3"
        !          1458:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1459:        (ashift:SI (match_operand:SI 1 "s_register_operand" "r")
        !          1460:                   (match_operand:SI 2 "arm_rhs_operand" "rn")))]
        !          1461:   ""
        !          1462:   "*
        !          1463:   return (output_shifted_move (ASHIFT, operands));
        !          1464: ")
        !          1465: 
        !          1466: (define_insn "ashrsi3"
        !          1467:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1468:        (ashiftrt:SI (match_operand:SI 1 "s_register_operand" "r")
        !          1469:                     (match_operand:SI 2 "arm_rhs_operand" "rn")))]
        !          1470:   ""
        !          1471:   "*
        !          1472:   return (output_shifted_move (ASHIFTRT, operands));
        !          1473: ")
        !          1474: 
        !          1475: ;; lshlsi3 is not defined because shift counts cannot be negative
        !          1476: ;; An unnamed pattern is needed for expansion of zero_extend.
        !          1477: 
        !          1478: (define_insn ""
        !          1479:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1480:        (lshift:SI (match_operand:SI 1 "s_register_operand" "r")
        !          1481:                   (match_operand:SI 2 "arm_rhs_operand" "rn")))]
        !          1482:   ""
        !          1483:   "*
        !          1484:   return (output_shifted_move (LSHIFT, operands));
        !          1485: ")
        !          1486: 
        !          1487: (define_insn "lshrsi3"
        !          1488:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1489:        (lshiftrt:SI (match_operand:SI 1 "s_register_operand" "r")
        !          1490:                     (match_operand:SI 2 "arm_rhs_operand" "rn")))]
        !          1491:   ""
        !          1492:   "*
        !          1493:   return (output_shifted_move (LSHIFTRT, operands));
        !          1494: ")
        !          1495: 
        !          1496: ;; rotlsi3 is not defined yet to see what happens
        !          1497: 
        !          1498: (define_insn "rotrsi3"
        !          1499:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          1500:        (rotatert:SI (match_operand:SI 1 "s_register_operand" "r,r")
        !          1501:                     (match_operand:SI 2 "arm_rhs_operand" "r,n")))]
        !          1502:   ""
        !          1503:   "*
        !          1504:   switch (which_alternative)
        !          1505:     {
        !          1506:     case 0:
        !          1507:       return (arm_output_asm_insn (\"mov\\t%0, %1, ror %2\", operands));
        !          1508:     case 1:
        !          1509:       if (INTVAL(operands[2]) > 31)
        !          1510:        operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) % 32);
        !          1511:       return (arm_output_asm_insn (\"mov\\t%0, %1, ror %2\", operands));
        !          1512:     }
        !          1513: ")
        !          1514: 
        !          1515: (define_insn ""
        !          1516:   [(set (reg:CC_NOOV 24)
        !          1517:        (compare:CC_NOOV (match_operator:SI 1 "shift_operator"
        !          1518:                          [(match_operand:SI 2 "s_register_operand" "r")
        !          1519:                           (match_operand:SI 3 "arm_rhs_operand" "rn")])
        !          1520:                         (const_int 0)))
        !          1521:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          1522:        (match_op_dup 1 [(match_dup 2) (match_dup 3)]))]
        !          1523:   ""
        !          1524:   "*
        !          1525: {
        !          1526:   char buf[100];
        !          1527: 
        !          1528:   sprintf (buf, \"movs\\t%%0, %%2, %s %%3\",
        !          1529:           shift_instr (GET_CODE (operands[1]), &operands[3]));
        !          1530:   return arm_output_asm_insn (buf, operands);
        !          1531: }
        !          1532: "
        !          1533: [(set_attr "conds" "set")])
        !          1534: 
        !          1535: (define_insn ""
        !          1536:   [(set (reg:CC_NOOV 24)
        !          1537:        (compare:CC_NOOV (match_operator:SI 1 "shift_operator"
        !          1538:                          [(match_operand:SI 2 "s_register_operand" "r")
        !          1539:                           (match_operand:SI 3 "arm_rhs_operand" "rn")])
        !          1540:                         (const_int 0)))
        !          1541:    (clobber (match_scratch:SI 0 "=r"))]
        !          1542:   ""
        !          1543:   "*
        !          1544: {
        !          1545:   char buf[100];
        !          1546: 
        !          1547:   sprintf (buf, \"movs\\t%%0, %%2, %s %%3\",
        !          1548:           shift_instr (GET_CODE (operands[1]), &operands[3]));
        !          1549:   return arm_output_asm_insn (buf, operands);
        !          1550: }
        !          1551: "
        !          1552: [(set_attr "conds" "set")])
        !          1553: 
        !          1554: (define_insn ""
        !          1555:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1556:        (not:SI (match_operator:SI 1 "shift_operator"
        !          1557:                 [(match_operand:SI 2 "s_register_operand" "r")
        !          1558:                  (match_operand:SI 3 "arm_rhs_operand" "rn")])))]
        !          1559:   ""
        !          1560:   "*
        !          1561: {
        !          1562:   char buf[100];
        !          1563:   sprintf (buf, \"mvn\\t%%0, %%2, %s %%3\",
        !          1564:           shift_instr (GET_CODE (operands[1]), &operands[3]));
        !          1565:   return arm_output_asm_insn (buf, operands);
        !          1566: }
        !          1567: ")
        !          1568: 
        !          1569: (define_insn ""
        !          1570:   [(set (reg:CC_NOOV 24)
        !          1571:        (compare:CC_NOOV (not:SI (match_operator:SI 1 "shift_operator"
        !          1572:                          [(match_operand:SI 2 "s_register_operand" "r")
        !          1573:                           (match_operand:SI 3 "arm_rhs_operand" "rn")]))
        !          1574:                         (const_int 0)))
        !          1575:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          1576:        (not:SI (match_op_dup 1 [(match_dup 2) (match_dup 3)])))]
        !          1577:   ""
        !          1578:   "*
        !          1579: {
        !          1580:   char buf[100];
        !          1581:   sprintf (buf, \"mvns\\t%%0, %%2, %s %%3\",
        !          1582:           shift_instr (GET_CODE (operands[1]), &operands[3]));
        !          1583:   return arm_output_asm_insn (buf, operands);
        !          1584: }
        !          1585: "
        !          1586: [(set_attr "conds" "set")])
        !          1587: 
        !          1588: (define_insn ""
        !          1589:   [(set (reg:CC_NOOV 24)
        !          1590:        (compare:CC_NOOV (not:SI (match_operator:SI 1 "shift_operator"
        !          1591:                          [(match_operand:SI 2 "s_register_operand" "r")
        !          1592:                           (match_operand:SI 3 "arm_rhs_operand" "rn")]))
        !          1593:                         (const_int 0)))
        !          1594:    (clobber (match_scratch:SI 0 "=r"))]
        !          1595:   ""
        !          1596:   "*
        !          1597: {
        !          1598:   char buf[100];
        !          1599:   sprintf (buf, \"mvns\\t%%0, %%2, %s %%3\",
        !          1600:           shift_instr (GET_CODE (operands[1]), &operands[3]));
        !          1601:   return arm_output_asm_insn (buf, operands);
        !          1602: }
        !          1603: "
        !          1604: [(set_attr "conds" "set")])
        !          1605: 
        !          1606: 
        !          1607: ;; Unary arithmetic insns
        !          1608: 
        !          1609: (define_insn "negdi2"
        !          1610:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1611:        (neg:DI (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !          1612:   ""
        !          1613:   "*
        !          1614:   arm_output_asm_insn (\"rsbs\\t%0, %1, #0\", operands);
        !          1615:   return (arm_output_asm_insn (\"rsc\\t%R0, %R1, #0\", operands));
        !          1616: "
        !          1617: [(set_attr "conds" "clob")
        !          1618:  (set_attr "length" "2")])
        !          1619: 
        !          1620: (define_insn "negsi2"
        !          1621:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1622:        (neg:SI (match_operand:SI 1 "s_register_operand" "r")))]
        !          1623:   ""
        !          1624:   "*
        !          1625:   return (arm_output_asm_insn (\"rsb\\t%0, %1, #0\", operands));
        !          1626: ")
        !          1627: 
        !          1628: (define_insn "negsf2"
        !          1629:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !          1630:        (neg:SF (match_operand:SF 1 "s_register_operand" "f")))]
        !          1631:   ""
        !          1632:   "*
        !          1633:   return (arm_output_asm_insn (\"mnfs\\t%0, %1\", operands));
        !          1634: "
        !          1635: [(set_attr "type" "float")])
        !          1636: 
        !          1637: (define_insn "negdf2"
        !          1638:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1639:        (neg:DF (match_operand:DF 1 "s_register_operand" "f")))]
        !          1640:   ""
        !          1641:   "*
        !          1642:   return (arm_output_asm_insn (\"mnfd\\t%0, %1\", operands));
        !          1643: "
        !          1644: [(set_attr "type" "float")])
        !          1645: 
        !          1646: (define_insn ""
        !          1647:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1648:        (neg:DF (float_extend:DF
        !          1649:                 (match_operand:SF 1 "s_register_operand" "f"))))]
        !          1650:   ""
        !          1651:   "*
        !          1652:   return (arm_output_asm_insn (\"mnfd\\t%0, %1\", operands));
        !          1653: "
        !          1654: [(set_attr "type" "float")])
        !          1655: 
        !          1656: (define_insn "negxf2"
        !          1657:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !          1658:        (neg:XF (match_operand:XF 1 "s_register_operand" "f")))]
        !          1659:   "ENABLE_XF_PATTERNS"
        !          1660:   "*
        !          1661:   return (arm_output_asm_insn (\"mnfe\\t%0, %1\", operands));
        !          1662: "
        !          1663: [(set_attr "type" "float")])
        !          1664: 
        !          1665: ;; abssi2 doesn't really clobber the condition codes if a different register
        !          1666: ;; is being set.  To keep things simple, assume during rtl manipulations that
        !          1667: ;; it does, but tell the final scan operator the truth.  Similarly for
        !          1668: ;; (neg (abs...))
        !          1669: 
        !          1670: (define_insn "abssi2"
        !          1671:   [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
        !          1672:        (abs:SI (match_operand:SI 1 "s_register_operand" "0,r")))
        !          1673:    (clobber (reg 24))]
        !          1674:   ""
        !          1675:   "*
        !          1676:   switch (which_alternative)
        !          1677:     {
        !          1678:     case 0:
        !          1679:       arm_output_asm_insn (\"cmp\\t%0, #0\", operands);
        !          1680:       return arm_output_asm_insn (\"rsblt\\t%0, %0, #0\", operands);
        !          1681:     case 1:
        !          1682:       arm_output_asm_insn (\"eor\\t%0, %1, %1, asr #31\", operands);
        !          1683:       return arm_output_asm_insn (\"sub\\t%0, %0, %1, asr #31\", operands);
        !          1684:     }
        !          1685: "
        !          1686: [(set_attr "conds" "clob,*")
        !          1687:  (set_attr "length" "2")])
        !          1688: 
        !          1689: (define_insn ""
        !          1690:   [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
        !          1691:        (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "0,r"))))
        !          1692:    (clobber (reg 24))]
        !          1693:   ""
        !          1694:   "*
        !          1695:   switch (which_alternative)
        !          1696:     {
        !          1697:     case 0:
        !          1698:       arm_output_asm_insn (\"cmp\\t%0, #0\", operands);
        !          1699:       return arm_output_asm_insn (\"rsbgt\\t%0, %0, #0\", operands);
        !          1700:     case 1:
        !          1701:       arm_output_asm_insn (\"eor\\t%0, %1, %1, asr #31\", operands);
        !          1702:       return arm_output_asm_insn (\"rsb\\t%0, %0, %1, asr #31\", operands);
        !          1703:     }
        !          1704: "
        !          1705: [(set_attr "conds" "clob,*")
        !          1706:  (set_attr "length" "2")])
        !          1707: 
        !          1708: (define_insn "abssf2"
        !          1709:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !          1710:         (abs:SF (match_operand:SF 1 "s_register_operand" "f")))]
        !          1711:   ""
        !          1712:   "*
        !          1713:   return (arm_output_asm_insn (\"abss\\t%0, %1\", operands));
        !          1714: "
        !          1715: [(set_attr "type" "float")])
        !          1716: 
        !          1717: (define_insn "absdf2"
        !          1718:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1719:        (abs:DF (match_operand:DF 1 "s_register_operand" "f")))]
        !          1720:   ""
        !          1721:   "*
        !          1722:   return (arm_output_asm_insn (\"absd\\t%0, %1\", operands));
        !          1723: "
        !          1724: [(set_attr "type" "float")])
        !          1725: 
        !          1726: (define_insn ""
        !          1727:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1728:        (abs:DF (float_extend:DF
        !          1729:                 (match_operand:SF 1 "s_register_operand" "f"))))]
        !          1730:   ""
        !          1731:   "*
        !          1732:   return (arm_output_asm_insn (\"absd\\t%0, %1\", operands));
        !          1733: "
        !          1734: [(set_attr "type" "float")])
        !          1735: 
        !          1736: (define_insn "absxf2"
        !          1737:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !          1738:        (abs:XF (match_operand:XF 1 "s_register_operand" "f")))]
        !          1739:   "ENABLE_XF_PATTERNS"
        !          1740:   "*
        !          1741:   return (arm_output_asm_insn (\"abse\\t%0, %1\", operands));
        !          1742: "
        !          1743: [(set_attr "type" "float")])
        !          1744: 
        !          1745: (define_insn "sqrtsf2"
        !          1746:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !          1747:        (sqrt:SF (match_operand:SF 1 "s_register_operand" "f")))]
        !          1748:   ""
        !          1749:   "*
        !          1750:   return (arm_output_asm_insn (\"sqts\\t%0, %1\", operands));
        !          1751: "
        !          1752: [(set_attr "type" "float_em")])
        !          1753: 
        !          1754: (define_insn "sqrtdf2"
        !          1755:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1756:        (sqrt:DF (match_operand:DF 1 "s_register_operand" "f")))]
        !          1757:   ""
        !          1758:   "*
        !          1759:   return (arm_output_asm_insn (\"sqtd\\t%0, %1\", operands));
        !          1760: "
        !          1761: [(set_attr "type" "float_em")])
        !          1762: 
        !          1763: (define_insn ""
        !          1764:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1765:        (sqrt:DF (float_extend:DF
        !          1766:                  (match_operand:SF 1 "s_register_operand" "f"))))]
        !          1767:   ""
        !          1768:   "*
        !          1769:   return (arm_output_asm_insn (\"sqtd\\t%0, %1\", operands));
        !          1770: "
        !          1771: [(set_attr "type" "float_em")])
        !          1772: 
        !          1773: (define_insn "sqrtxf2"
        !          1774:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !          1775:        (sqrt:XF (match_operand:XF 1 "s_register_operand" "f")))]
        !          1776:   "ENABLE_XF_PATTERNS"
        !          1777:   "*
        !          1778:   return (arm_output_asm_insn (\"sqte\\t%0, %1\", operands));
        !          1779: "
        !          1780: [(set_attr "type" "float_em")])
        !          1781: 
        !          1782: (define_insn "sinsf2"
        !          1783:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !          1784:        (unspec:SF [(match_operand:SF 1 "s_register_operand" "f")] 0))]
        !          1785:   ""
        !          1786:   "*
        !          1787:   return arm_output_asm_insn (\"sins\\t%0, %1\", operands);
        !          1788: "
        !          1789: [(set_attr "type" "float_em")])
        !          1790: 
        !          1791: (define_insn "sindf2"
        !          1792:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1793:        (unspec:DF [(match_operand:DF 1 "s_register_operand" "f")] 0))]
        !          1794:   ""
        !          1795:   "*
        !          1796:   return arm_output_asm_insn (\"sind\\t%0, %1\", operands);
        !          1797: "
        !          1798: [(set_attr "type" "float_em")])
        !          1799: 
        !          1800: (define_insn ""
        !          1801:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1802:        (unspec:DF [(float_extend:DF
        !          1803:                     (match_operand:SF 1 "s_register_operand" "f"))] 0))]
        !          1804:   ""
        !          1805:   "*
        !          1806:   return arm_output_asm_insn (\"sind\\t%0, %1\", operands);
        !          1807: "
        !          1808: [(set_attr "type" "float_em")])
        !          1809: 
        !          1810: (define_insn "sinxf2"
        !          1811:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !          1812:        (unspec:XF [(match_operand:XF 1 "s_register_operand" "f")] 0))]
        !          1813:   "ENABLE_XF_PATTERNS"
        !          1814:   "*
        !          1815:   return arm_output_asm_insn (\"sine\\t%0, %1\", operands);
        !          1816: "
        !          1817: [(set_attr "type" "float_em")])
        !          1818: 
        !          1819: (define_insn "cossf2"
        !          1820:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !          1821:        (unspec:SF [(match_operand:SF 1 "s_register_operand" "f")] 1))]
        !          1822:   ""
        !          1823:   "*
        !          1824:   return arm_output_asm_insn (\"coss\\t%0, %1\", operands);
        !          1825: "
        !          1826: [(set_attr "type" "float_em")])
        !          1827: 
        !          1828: (define_insn "cosdf2"
        !          1829:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1830:        (unspec:DF [(match_operand:DF 1 "s_register_operand" "f")] 1))]
        !          1831:   ""
        !          1832:   "*
        !          1833:   return arm_output_asm_insn (\"cosd\\t%0, %1\", operands);
        !          1834: "
        !          1835: [(set_attr "type" "float_em")])
        !          1836: 
        !          1837: (define_insn ""
        !          1838:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1839:        (unspec:DF [(float_extend:DF
        !          1840:                     (match_operand:SF 1 "s_register_operand" "f"))] 1))]
        !          1841:   ""
        !          1842:   "*
        !          1843:   return arm_output_asm_insn (\"cosd\\t%0, %1\", operands);
        !          1844: "
        !          1845: [(set_attr "type" "float_em")])
        !          1846: 
        !          1847: (define_insn "cosxf2"
        !          1848:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !          1849:        (unspec:XF [(match_operand:XF 1 "s_register_operand" "f")] 1))]
        !          1850:   "ENABLE_XF_PATTERNS"
        !          1851:   "*
        !          1852:   return arm_output_asm_insn (\"cose\\t%0, %1\", operands);
        !          1853: "
        !          1854: [(set_attr "type" "float_em")])
        !          1855: 
        !          1856: (define_insn "one_cmpldi2"
        !          1857:   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
        !          1858:        (not:DI (match_operand:DI 1 "s_register_operand" "?r,0")))]
        !          1859:   ""
        !          1860:   "*
        !          1861:   arm_output_asm_insn (\"mvn\\t%0, %1\", operands);
        !          1862:   return arm_output_asm_insn (\"mvn\\t%R0, %R1\", operands);
        !          1863: "
        !          1864: [(set_attr "length" "2")])
        !          1865: 
        !          1866: (define_insn "one_cmplsi2"
        !          1867:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1868:        (not:SI (match_operand:SI 1 "s_register_operand" "r")))]
        !          1869:   ""
        !          1870:   "*
        !          1871:   return (arm_output_asm_insn (\"mvn\\t%0, %1\", operands));
        !          1872: ")
        !          1873: 
        !          1874: (define_insn ""
        !          1875:   [(set (reg:CC_NOOV 24)
        !          1876:        (compare:CC_NOOV (not:SI (match_operand:SI 1 "s_register_operand" "r"))
        !          1877:                         (const_int 0)))
        !          1878:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          1879:        (not:SI (match_dup 1)))]
        !          1880:   ""
        !          1881:   "*
        !          1882:   return (arm_output_asm_insn (\"mvns\\t%0, %1\", operands));
        !          1883: "
        !          1884: [(set_attr "conds" "set")])
        !          1885: 
        !          1886: (define_insn ""
        !          1887:   [(set (reg:CC_NOOV 24)
        !          1888:        (compare:CC_NOOV (not:SI (match_operand:SI 1 "s_register_operand" "r"))
        !          1889:                         (const_int 0)))
        !          1890:    (clobber (match_scratch:SI 0 "=r"))]
        !          1891:   ""
        !          1892:   "*
        !          1893:   return (arm_output_asm_insn (\"mvns\\t%0, %1\", operands));
        !          1894: "
        !          1895: [(set_attr "conds" "set")])
        !          1896: 
        !          1897: ;; Fixed <--> Floating conversion insns
        !          1898: 
        !          1899: (define_insn "floatsisf2"
        !          1900:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !          1901:        (float:SF (match_operand:SI 1 "s_register_operand" "r")))]
        !          1902:   ""
        !          1903:   "*
        !          1904:   return (arm_output_asm_insn (\"flts\\t%0, %1\", operands));
        !          1905: "
        !          1906: [(set_attr "type" "r_2_f")])
        !          1907: 
        !          1908: (define_insn "floatsidf2"
        !          1909:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1910:        (float:DF (match_operand:SI 1 "s_register_operand" "r")))]
        !          1911:   ""
        !          1912:   "*
        !          1913:   return (arm_output_asm_insn (\"fltd\\t%0, %1\", operands));
        !          1914: "
        !          1915: [(set_attr "type" "r_2_f")])
        !          1916: 
        !          1917: (define_insn "floatsixf2"
        !          1918:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !          1919:        (float:XF (match_operand:SI 1 "s_register_operand" "r")))]
        !          1920:   "ENABLE_XF_PATTERNS"
        !          1921:   "*
        !          1922:   return (arm_output_asm_insn (\"flte\\t%0, %1\", operands));
        !          1923: "
        !          1924: [(set_attr "type" "r_2_f")])
        !          1925: 
        !          1926: (define_insn "fix_truncsfsi2"
        !          1927:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1928:        (fix:SI (match_operand:SF 1 "s_register_operand" "f")))]
        !          1929:   ""
        !          1930:   "*
        !          1931:   return arm_output_asm_insn (\"fixz\\t%0, %1\", operands);
        !          1932: "
        !          1933: [(set_attr "type" "f_2_r")])
        !          1934: 
        !          1935: (define_insn "fix_truncdfsi2"
        !          1936:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1937:        (fix:SI (match_operand:DF 1 "s_register_operand" "f")))]
        !          1938:   ""
        !          1939:   "*
        !          1940:   return arm_output_asm_insn (\"fixz\\t%0, %1\", operands);
        !          1941: "
        !          1942: [(set_attr "type" "f_2_r")])
        !          1943: 
        !          1944: (define_insn "fix_truncxfsi2"
        !          1945:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          1946:        (fix:SI (match_operand:XF 1 "s_register_operand" "f")))]
        !          1947:   "ENABLE_XF_PATTERNS"
        !          1948:   "*
        !          1949:   return arm_output_asm_insn (\"fixz\\t%0, %1\", operands);
        !          1950: "
        !          1951: [(set_attr "type" "f_2_r")])
        !          1952: 
        !          1953: ;; Truncation insns
        !          1954: 
        !          1955: (define_insn "truncdfsf2"
        !          1956:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !          1957:        (float_truncate:SF
        !          1958:         (match_operand:DF 1 "s_register_operand" "f")))]
        !          1959:   ""
        !          1960:   "*
        !          1961:   return (arm_output_asm_insn (\"mvfs\\t%0, %1\", operands));
        !          1962: "
        !          1963: [(set_attr "type" "float")])
        !          1964: 
        !          1965: (define_insn "truncxfsf2"
        !          1966:   [(set (match_operand:SF 0 "s_register_operand" "=f")
        !          1967:        (float_truncate:SF
        !          1968:         (match_operand:XF 1 "s_register_operand" "f")))]
        !          1969:   "ENABLE_XF_PATTERNS"
        !          1970:   "*
        !          1971:   return (arm_output_asm_insn (\"mvfs\\t%0, %1\", operands));
        !          1972: "
        !          1973: [(set_attr "type" "float")])
        !          1974: 
        !          1975: (define_insn "truncxfdf2"
        !          1976:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          1977:        (float_truncate:DF
        !          1978:         (match_operand:XF 1 "s_register_operand" "f")))]
        !          1979:   "ENABLE_XF_PATTERNS"
        !          1980:   "*
        !          1981:   return (arm_output_asm_insn (\"mvfd\\t%0, %1\", operands));
        !          1982: "
        !          1983: [(set_attr "type" "float")])
        !          1984: 
        !          1985: ;; Zero and sign extension instructions.
        !          1986: 
        !          1987: (define_insn "zero_extendsidi2"
        !          1988:   [(set (match_operand:DI 0 "s_register_operand" "=r")
        !          1989:         (zero_extend:DI (match_operand:SI 1 "s_register_operand" "r")))]
        !          1990:   ""
        !          1991:   "*
        !          1992:   if (REGNO (operands[1]) != REGNO (operands[0]))
        !          1993:     arm_output_asm_insn (\"mov\\t%0, %1\", operands);
        !          1994:   return arm_output_asm_insn (\"mov\\t%R0, #0\", operands);
        !          1995: "
        !          1996: [(set_attr "length" "2")])
        !          1997: 
        !          1998: (define_insn "zero_extendqidi2"
        !          1999:   [(set (match_operand:DI 0 "s_register_operand" "=r,r")
        !          2000:        (zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
        !          2001:   ""
        !          2002:   "*
        !          2003:   switch (which_alternative)
        !          2004:     {
        !          2005:     case 0:
        !          2006:       arm_output_asm_insn (\"and\\t%0, %1, #255\", operands);
        !          2007:       break;
        !          2008:     case 1:
        !          2009:       arm_output_asm_insn (\"ldrb\\t%0, %1\",operands);
        !          2010:       break;
        !          2011:     }
        !          2012:   return arm_output_asm_insn (\"mov\\t%R0, #0\", operands);
        !          2013: "
        !          2014: [(set_attr "length" "2")
        !          2015:  (set_attr "type" "*,load")])
        !          2016: 
        !          2017: (define_insn "extendsidi2"
        !          2018:   [(set (match_operand:DI 0 "s_register_operand" "=r")
        !          2019:         (sign_extend:DI (match_operand:SI 1 "s_register_operand" "r")))]
        !          2020:   ""
        !          2021:   "*
        !          2022:   if (REGNO (operands[1]) != REGNO (operands[0]))
        !          2023:     arm_output_asm_insn (\"mov\\t%0, %1\", operands);
        !          2024:   return arm_output_asm_insn (\"mov\\t%R0, %0, asr #31\", operands);
        !          2025: "
        !          2026: [(set_attr "length" "2")])
        !          2027: 
        !          2028: (define_expand "zero_extendhisi2"
        !          2029:   [(set (match_dup 2)
        !          2030:        (ashift:SI (match_operand:HI 1 "s_register_operand" "")
        !          2031:                   (const_int 16)))
        !          2032:    (set (match_operand:SI 0 "s_register_operand" "")
        !          2033:        (lshiftrt:SI (match_dup 2)
        !          2034:                     (const_int 16)))]
        !          2035:   ""
        !          2036:   "
        !          2037: { operands[1] = gen_lowpart (SImode, operands[1]);
        !          2038:   operands[2] = gen_reg_rtx (SImode); }")
        !          2039: 
        !          2040: (define_insn "zero_extendqihi2"
        !          2041:   [(set (match_operand:HI 0 "s_register_operand" "=r")
        !          2042:        (zero_extend:HI
        !          2043:         (match_operand:QI 1 "s_register_operand" "r")))]
        !          2044:   ""
        !          2045:   "*
        !          2046:   return (arm_output_asm_insn (\"and\\t%0, %1, #255\\t@ zero_extendqihi2\", operands));
        !          2047: ")
        !          2048: 
        !          2049: (define_insn ""
        !          2050:   [(set (reg:CC_NOOV 24)
        !          2051:        (compare:CC_NOOV (match_operand:QI 1 "s_register_operand" "r")
        !          2052:                         (const_int 0)))
        !          2053:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          2054:        (zero_extend:HI (match_dup 1)))]
        !          2055:   ""
        !          2056:   "*
        !          2057:   return arm_output_asm_insn (\"ands\\t%0, %1, #255\", operands);
        !          2058: "
        !          2059: [(set_attr "conds" "set")])
        !          2060: 
        !          2061: (define_insn ""
        !          2062:   [(set (reg:CC_NOOV 24)
        !          2063:        (compare:CC_NOOV (match_operand:QI 0 "s_register_operand" "r")
        !          2064:                         (const_int 0)))]
        !          2065:   ""
        !          2066:   "*
        !          2067:   return arm_output_asm_insn (\"tst\\t%0, #255\", operands);
        !          2068: "
        !          2069: [(set_attr "conds" "set")])
        !          2070: 
        !          2071: (define_insn "zero_extendqisi2"
        !          2072:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          2073:        (zero_extend:SI
        !          2074:         (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
        !          2075:   ""
        !          2076:   "*
        !          2077:   switch (which_alternative)
        !          2078:     {
        !          2079:     case 0:
        !          2080:       return (arm_output_asm_insn (\"and\\t%0, %1, #255\\t@ zero_extendqisi2\", operands));
        !          2081:     case 1:
        !          2082:       return (arm_output_asm_insn (\"ldrb\\t%0, %1\\t@ zero_extendqisi2\", operands));
        !          2083:     }
        !          2084: "
        !          2085: [(set_attr "type" "*,load")])
        !          2086: 
        !          2087: (define_insn ""
        !          2088:   [(set (reg:CC_NOOV 24)
        !          2089:        (compare:CC_NOOV (match_operand:QI 1 "s_register_operand" "r")
        !          2090:                         (const_int 0)))
        !          2091:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          2092:        (zero_extend:SI (match_dup 1)))]
        !          2093:   ""
        !          2094:   "*
        !          2095:   return arm_output_asm_insn (\"ands\\t%0, %1, #255\", operands);
        !          2096: "
        !          2097: [(set_attr "conds" "set")])
        !          2098: 
        !          2099: (define_insn ""
        !          2100:   [(set (reg:CC_NOOV 24)
        !          2101:        (compare:CC_NOOV (match_operand:QI 1 "s_register_operand" "r")
        !          2102:                         (const_int 0)))
        !          2103:    (set (match_operand:QI 0 "s_register_operand" "=r")
        !          2104:        (match_dup 1))]
        !          2105:   ""
        !          2106:   "*
        !          2107:   return arm_output_asm_insn (\"ands\\t%0, %1, #255\", operands);
        !          2108: "
        !          2109: [(set_attr "conds" "set")])
        !          2110: 
        !          2111: (define_expand "extendhisi2"
        !          2112:   [(set (match_dup 2)
        !          2113:        (ashift:SI (match_operand:HI 1 "s_register_operand" "")
        !          2114:                   (const_int 16)))
        !          2115:    (set (match_operand:SI 0 "s_register_operand" "")
        !          2116:        (ashiftrt:SI (match_dup 2)
        !          2117:                     (const_int 16)))]
        !          2118:   ""
        !          2119:   "
        !          2120: { operands[1] = gen_lowpart (SImode, operands[1]);
        !          2121:   operands[2] = gen_reg_rtx (SImode); }")
        !          2122: 
        !          2123: (define_expand "extendqihi2"
        !          2124:   [(set (match_dup 2)
        !          2125:        (ashift:SI (match_operand:QI 1 "s_register_operand" "")
        !          2126:                   (const_int 24)))
        !          2127:    (set (match_operand:HI 0 "s_register_operand" "")
        !          2128:        (ashiftrt:SI (match_dup 2)
        !          2129:                     (const_int 24)))]
        !          2130:   ""
        !          2131:   "
        !          2132: { operands[0] = gen_lowpart (SImode, operands[0]);
        !          2133:   operands[1] = gen_lowpart (SImode, operands[1]);
        !          2134:   operands[2] = gen_reg_rtx (SImode); }")
        !          2135: 
        !          2136: (define_expand "extendqisi2"
        !          2137:   [(set (match_dup 2)
        !          2138:        (ashift:SI (match_operand:QI 1 "s_register_operand" "")
        !          2139:                   (const_int 24)))
        !          2140:    (set (match_operand:SI 0 "s_register_operand" "")
        !          2141:        (ashiftrt:SI (match_dup 2)
        !          2142:                     (const_int 24)))]
        !          2143:   ""
        !          2144:   "
        !          2145: { operands[1] = gen_lowpart (SImode, operands[1]);
        !          2146:   operands[2] = gen_reg_rtx (SImode); }")
        !          2147: 
        !          2148: (define_insn "extendsfdf2"
        !          2149:   [(set (match_operand:DF 0 "s_register_operand" "=f")
        !          2150:        (float_extend:DF (match_operand:SF 1 "s_register_operand" "f")))]
        !          2151:   ""
        !          2152:   "*
        !          2153:   return (arm_output_asm_insn (\"mvfd\\t%0, %1\", operands));
        !          2154: "
        !          2155: [(set_attr "type" "float")])
        !          2156: 
        !          2157: (define_insn "extendsfxf2"
        !          2158:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !          2159:        (float_extend:XF (match_operand:SF 1 "s_register_operand" "f")))]
        !          2160:   "ENABLE_XF_PATTERNS"
        !          2161:   "*
        !          2162:   return (arm_output_asm_insn (\"mvfe\\t%0, %1\", operands));
        !          2163: ")
        !          2164: 
        !          2165: (define_insn "extenddfxf2"
        !          2166:   [(set (match_operand:XF 0 "s_register_operand" "=f")
        !          2167:        (float_extend:XF (match_operand:DF 1 "s_register_operand" "f")))]
        !          2168:   "ENABLE_XF_PATTERNS"
        !          2169:   "*
        !          2170:   return (arm_output_asm_insn (\"mvfe\\t%0, %1\", operands));
        !          2171: "
        !          2172: [(set_attr "type" "float")])
        !          2173: 
        !          2174: 
        !          2175: ;; Move insns (including loads and stores)
        !          2176: 
        !          2177: ;; XXX Just some ideas about movti.
        !          2178: ;; I don't think these are a good idea on the arm, there just aren't enough
        !          2179: ;; registers
        !          2180: ;;(define_expand "loadti"
        !          2181: ;;  [(set (match_operand:TI 0 "s_register_operand" "")
        !          2182: ;;     (mem:TI (match_operand:SI 1 "address_operand" "")))]
        !          2183: ;;  "" "")
        !          2184: 
        !          2185: ;;(define_expand "storeti"
        !          2186: ;;  [(set (mem:TI (match_operand:TI 0 "address_operand" ""))
        !          2187: ;;     (match_operand:TI 1 "s_register_operand" ""))]
        !          2188: ;;  "" "")
        !          2189: 
        !          2190: ;;(define_expand "movti"
        !          2191: ;;  [(set (match_operand:TI 0 "general_operand" "")
        !          2192: ;;     (match_operand:TI 1 "general_operand" ""))]
        !          2193: ;;  ""
        !          2194: ;;  "
        !          2195: ;;{
        !          2196: ;;  rtx insn;
        !          2197: ;;
        !          2198: ;;  if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
        !          2199: ;;    operands[1] = copy_to_reg (operands[1]);
        !          2200: ;;  if (GET_CODE (operands[0]) == MEM)
        !          2201: ;;    insn = gen_storeti (XEXP (operands[0], 0), operands[1]);
        !          2202: ;;  else if (GET_CODE (operands[1]) == MEM)
        !          2203: ;;    insn = gen_loadti (operands[0], XEXP (operands[1], 0));
        !          2204: ;;  else
        !          2205: ;;    FAIL;
        !          2206: ;;
        !          2207: ;;  emit_insn (insn);
        !          2208: ;;  DONE;
        !          2209: ;;}")
        !          2210: 
        !          2211: ;; Recognise garbage generated above.
        !          2212: 
        !          2213: ;;(define_insn ""
        !          2214: ;;  [(set (match_operand:TI 0 "general_operand" "=r,r,r,<,>,m")
        !          2215: ;;     (match_operand:TI 1 "general_operand" "<,>,m,r,r,r"))]
        !          2216: ;;  ""
        !          2217: ;;  "*
        !          2218: ;;  {
        !          2219: ;;    register mem = (which_alternative < 3);
        !          2220: ;;    register char *template;
        !          2221: ;;
        !          2222: ;;    operands[mem] = XEXP (operands[mem], 0);
        !          2223: ;;    switch (which_alternative)
        !          2224: ;;      {
        !          2225: ;;      case 0: template = \"ldmdb\\t%1!, %M0\"; break;
        !          2226: ;;      case 1: template = \"ldmia\\t%1!, %M0\"; break;
        !          2227: ;;      case 2: template = \"ldmia\\t%1, %M0\"; break;
        !          2228: ;;      case 3: template = \"stmdb\\t%0!, %M1\"; break;
        !          2229: ;;      case 4: template = \"stmia\\t%0!, %M1\"; break;
        !          2230: ;;      case 5: template = \"stmia\\t%0, %M1\"; break;
        !          2231: ;;      }
        !          2232: ;;    return (arm_output_asm_insn (template, operands));
        !          2233: ;;  }")
        !          2234: 
        !          2235: 
        !          2236: (define_insn "movdi"
        !          2237:   [(set (match_operand:DI 0 "di_operand" "=r,r,r,o<>,r")
        !          2238:        (match_operand:DI 1 "di_operand" "rK,n,o<>,r,F"))]
        !          2239:   ""
        !          2240:   "*
        !          2241:   return (output_move_double (operands));
        !          2242: "
        !          2243: [(set_attr "length" "2,8,2,2,8")
        !          2244:  (set_attr "type" "*,*,load,store2,*")])
        !          2245: 
        !          2246: (define_expand "movsi"
        !          2247:   [(set (match_operand:SI 0 "general_operand" "")
        !          2248:         (match_operand:SI 1 "general_operand" ""))]
        !          2249:   ""
        !          2250:   "
        !          2251:   /* Everything except mem = const or mem = mem can be done easily */
        !          2252:   if (GET_CODE (operands[0]) == MEM)
        !          2253:     operands[1] = force_reg (SImode, operands[1]);
        !          2254:   if (GET_CODE (operands[1]) == CONST_INT
        !          2255:       && !(const_ok_for_arm (INTVAL (operands[1]))
        !          2256:            || const_ok_for_arm (~INTVAL (operands[1]))))
        !          2257:     {
        !          2258:       int n = INTVAL (operands[1]);
        !          2259:       rtx tmpreg, tmpreg2;
        !          2260:       int i, n_ones = 0, first = 1, last = 0;
        !          2261: 
        !          2262:       if (GET_CODE (operands[0]) != REG
        !          2263:           && GET_CODE (operands[0]) != SUBREG)
        !          2264:         abort ();
        !          2265:       for (i = 0; i < 32; i++)
        !          2266:         if (n & 1 << i)
        !          2267:           n_ones++;
        !          2268:       /* These loops go the opposite way around to those in arm.c so that
        !          2269:          the last constant may be more likely to be eliminted into the
        !          2270:          next instruction */
        !          2271: 
        !          2272:       if (n_ones > 16)
        !          2273:         {
        !          2274:           n = (~n) & 0xffffffff;
        !          2275:           for (i = 30; i >= 0; i -= 2)
        !          2276:             {
        !          2277:               if (n & (3 << i))
        !          2278:                 {
        !          2279:                   i -= 6;
        !          2280:                   if (i < 0)
        !          2281:                     i = 0;
        !          2282:                   if ((n & (255 << i)) == n)
        !          2283:                     last = 1;
        !          2284:                   if (first)
        !          2285:                     {
        !          2286:                       rtx equal;
        !          2287:                       rtx insn =
        !          2288:                         emit_insn (gen_movsi (tmpreg = (reload_in_progress
        !          2289:                                                         || reload_completed)
        !          2290:                                                       ? operands[0]
        !          2291:                                                       : gen_reg_rtx (SImode),
        !          2292:                                       equal = gen_rtx (CONST_INT, VOIDmode,
        !          2293:                                                        ~(n & (255 << i)))));
        !          2294:                       first = 0;
        !          2295:                     }
        !          2296:                   else
        !          2297:                     {
        !          2298:                       rtx constant;
        !          2299:                       rtx insn =
        !          2300:                         emit_insn (gen_subsi3 (tmpreg2 = (reload_in_progress
        !          2301:                                                           || reload_completed
        !          2302:                                                           || last)
        !          2303:                                                         ? operands[0]
        !          2304:                                                         : gen_reg_rtx (SImode),
        !          2305:                                                tmpreg,
        !          2306:                                     constant = gen_rtx (CONST_INT, VOIDmode,
        !          2307:                                                         n & (255 << i))));
        !          2308:                       tmpreg = tmpreg2;
        !          2309:                     }
        !          2310:                   n &= ~(255 << i);
        !          2311:                 }
        !          2312:             }
        !          2313:         }
        !          2314:       else
        !          2315:         {
        !          2316:           for (i = 30; i >= 0; i -= 2)
        !          2317:             {
        !          2318:               if (n & (3 << i))
        !          2319:                 {
        !          2320:                   i -= 6;
        !          2321:                   if (i < 0)
        !          2322:                     i = 0;
        !          2323:                   if ((n & (255 << i)) == n)
        !          2324:                     last = 1;
        !          2325:                   if (first)
        !          2326:                     {
        !          2327:                       rtx equal;
        !          2328:                       rtx insn =
        !          2329:                         emit_insn (gen_movsi (tmpreg = (reload_in_progress
        !          2330:                                                         || reload_completed)
        !          2331:                                                       ? operands[0]
        !          2332:                                                       : gen_reg_rtx (SImode),
        !          2333:                                       equal = gen_rtx (CONST_INT, VOIDmode,
        !          2334:                                                        n & (255 << i))));
        !          2335:                       first = 0;
        !          2336:                     }
        !          2337:                   else
        !          2338:                     {
        !          2339:                       rtx constant;
        !          2340:                       rtx insn =
        !          2341:                         emit_insn (gen_addsi3 (tmpreg2 = (reload_in_progress
        !          2342:                                                           || reload_completed
        !          2343:                                                           || last)
        !          2344:                                                         ? operands[0]
        !          2345:                                                         : gen_reg_rtx (SImode),
        !          2346:                                                tmpreg,
        !          2347:                                     constant = gen_rtx (CONST_INT, VOIDmode,
        !          2348:                                                         n & (255 << i))));
        !          2349:                       tmpreg = tmpreg2;
        !          2350:                     }
        !          2351:                   n &= ~(255 << i);
        !          2352:                 }
        !          2353:             }
        !          2354:         }
        !          2355:       DONE;
        !          2356:     }
        !          2357: ")
        !          2358: 
        !          2359: (define_insn ""
        !          2360:   [(set (match_operand:SI 0 "general_operand" "=r,r,r,m,r")
        !          2361:        (match_operand:SI 1 "general_operand"  "m,K,r,r,S"))]
        !          2362:   "(register_operand (operands[0], SImode)
        !          2363:     && (GET_CODE (operands[1]) != CONST_INT
        !          2364:         || const_ok_for_arm (INTVAL (operands[1]))
        !          2365:         || const_ok_for_arm (~INTVAL (operands[1])))
        !          2366:     && (GET_CODE (operands[1]) != SYMBOL_REF
        !          2367:        || CONSTANT_ADDRESS_P (operands[1])))
        !          2368:    || register_operand (operands[1], SImode)"
        !          2369:   "*
        !          2370:   switch (which_alternative)
        !          2371:     {
        !          2372:     case 2:
        !          2373:       return (arm_output_asm_insn (\"mov\\t%0, %1\", operands));
        !          2374:     case 1:
        !          2375:       if (!const_ok_for_arm (INTVAL (operands[1])))
        !          2376:        {
        !          2377:          operands[1] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[1]));
        !          2378:          return arm_output_asm_insn (\"mvn\\t%0, %1\", operands);
        !          2379:        }
        !          2380:       return arm_output_asm_insn (\"mov\\t%0, %1\", operands);
        !          2381:     case 0:
        !          2382:       if (GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
        !          2383:          &&  CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
        !          2384:        return (arm_output_llc (operands));
        !          2385:       else
        !          2386:        return (arm_output_asm_insn (\"ldr\\t%0, %1\", operands));
        !          2387:     case 3:
        !          2388:       return (arm_output_asm_insn (\"str\\t%1, %0\", operands));
        !          2389:     case 4:
        !          2390:       return output_load_symbol (operands);
        !          2391:     }
        !          2392: "
        !          2393: [(set_attr "length" "2,*,*,*,4")
        !          2394:  (set_attr "type" "load,*,*,store1,*")])
        !          2395: 
        !          2396: ;; If copying one reg to another we can set the condition codes according to
        !          2397: ;; its value.  Such a move is common after a return from subroutine and the
        !          2398: ;; result is being tested against zero.
        !          2399: 
        !          2400: (define_insn ""
        !          2401:   [(set (reg:CC 24) (compare (match_operand:SI 1 "s_register_operand" "r")
        !          2402:                             (const_int 0)))
        !          2403:    (set (match_operand:SI 0 "s_register_operand" "=r") (match_dup 1))]
        !          2404:   ""
        !          2405:   "*
        !          2406:   if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG
        !          2407:       && REGNO (operands[0]) == REGNO (operands[1]))
        !          2408:     return arm_output_asm_insn (\"cmp\\t%0, #0\", operands);
        !          2409:   return arm_output_asm_insn (\"subs\\t%0, %1, #0\", operands);
        !          2410: "
        !          2411: [(set_attr "conds" "set")])
        !          2412: 
        !          2413: ;; Subroutine to store a half word from a register into memory.
        !          2414: ;; Operand 0 is the source register (HImode)
        !          2415: ;; Operand 1 is the destination address in a register (SImode)
        !          2416: 
        !          2417: ;; In both this routine and the next, we must be careful not to spill
        !          2418: ;; a memory address of reg+large_const into a seperate PLUS insn, since this
        !          2419: ;; can generate unrecognizable rtl.
        !          2420: 
        !          2421: (define_expand "storehi"
        !          2422:   [;; store the low byte
        !          2423:    (set (mem:QI (match_operand:SI 1 "" "")) (match_dup 3))
        !          2424:    ;; extract the high byte
        !          2425:    (set (match_dup 2)
        !          2426:        (ashiftrt:SI (match_operand 0 "" "") (const_int 8)))
        !          2427:    ;; store the high byte
        !          2428:    (set (mem:QI (match_dup 4))
        !          2429:        (subreg:QI (match_dup 2) 0))]   ;explicit subreg safe
        !          2430:   ""
        !          2431:   "
        !          2432: {
        !          2433:   enum rtx_code code = GET_CODE (operands[1]);
        !          2434: 
        !          2435:   if ((code == PLUS || code == MINUS)
        !          2436:       && (GET_CODE (XEXP (operands[1], 1)) == REG
        !          2437:          || GET_CODE (XEXP (operands[1], 0)) != REG))
        !          2438:     operands[1] = force_reg (SImode, operands[1]);
        !          2439:   operands[4] = plus_constant (operands[1], 1);
        !          2440:   operands[3] = gen_lowpart (QImode, operands[0]);
        !          2441:   operands[0] = gen_lowpart (SImode, operands[0]);
        !          2442:   operands[2] = gen_reg_rtx (SImode); 
        !          2443: }
        !          2444: ")
        !          2445: 
        !          2446: ;; Subroutine to store a half word integer constant into memory.
        !          2447: ;; Operand 0 is the constant
        !          2448: ;; Operand 1 is the destination address in a register (SImode)
        !          2449: 
        !          2450: (define_expand "storeinthi"
        !          2451:   [;; store the low byte
        !          2452:    (set (mem:QI (match_operand:SI 1 "" "")) (match_operand 0 "" ""))
        !          2453:    ;; store the high byte
        !          2454:    (set (mem:QI (match_dup 3)) (match_dup 2))]
        !          2455:   ""
        !          2456:   "
        !          2457: {
        !          2458:   int value = INTVAL (operands[0]);
        !          2459:   enum rtx_code code = GET_CODE (operands[1]);
        !          2460: 
        !          2461:   if ((code == PLUS || code == MINUS)
        !          2462:       && (GET_CODE (XEXP (operands[1], 1)) == REG
        !          2463:          || GET_CODE (XEXP (operands[1], 0)) != REG))
        !          2464:   operands[1] = force_reg (SImode, operands[1]);
        !          2465: 
        !          2466:   operands[0] = force_reg (QImode, gen_rtx (CONST_INT, VOIDmode, value & 255));
        !          2467:   operands[2] = force_reg (QImode,
        !          2468:                           gen_rtx (CONST_INT, VOIDmode,(value>>8) & 255));
        !          2469:   operands[3] = plus_constant (operands[1], 1);
        !          2470: }
        !          2471: ")
        !          2472: 
        !          2473: (define_expand "movhi"
        !          2474:   [(set (match_operand:HI 0 "general_operand" "")
        !          2475:        (match_operand:HI 1 "general_operand" ""))]
        !          2476:   ""
        !          2477:   "
        !          2478: {
        !          2479:   rtx insn;
        !          2480: 
        !          2481:   if (reload_in_progress || reload_completed)
        !          2482:     insn = gen_rtx (SET, VOIDmode, operands[0], operands[1]);
        !          2483:   else
        !          2484:     {
        !          2485:       if (GET_CODE (operands[0]) == MEM)
        !          2486:        {
        !          2487:          if (GET_CODE (operands[1]) == CONST_INT)
        !          2488:            {
        !          2489:              insn = gen_storeinthi (operands[1], XEXP (operands[0],0));
        !          2490:            }
        !          2491:          else
        !          2492:            {
        !          2493:              if (GET_CODE (operands[1]) == MEM)
        !          2494:                operands[1] = force_reg (HImode, operands[1]);
        !          2495:              insn = gen_storehi (operands[1], XEXP (operands[0], 0));
        !          2496:            }
        !          2497:        }
        !          2498:       else if (GET_CODE (operands[1]) == CONST_INT
        !          2499:               && !(const_ok_for_arm (INTVAL (operands[1]))
        !          2500:                   || const_ok_for_arm (~INTVAL (operands[1]))))
        !          2501:        {
        !          2502:          rtx reg, reg2;
        !          2503: 
        !          2504:          /* no need to be clever, this will always take two insns.
        !          2505:             The top sixteen bits should be all zeros or all ones. */
        !          2506:          if (INTVAL (operands[1]) < 0)
        !          2507:            {
        !          2508:              emit_insn (gen_movsi (reg = gen_reg_rtx (SImode),
        !          2509:                                    GEN_INT (INTVAL (operands[1])
        !          2510:                                             | ~(0x0ff00))));
        !          2511:              emit_insn (gen_addsi3 (reg2 = gen_reg_rtx (SImode), reg,
        !          2512:                                     GEN_INT (-((~INTVAL (operands[1]))
        !          2513:                                                & 0xff))));
        !          2514:            }
        !          2515:          else
        !          2516:            {
        !          2517:              emit_insn (gen_movsi (reg = gen_reg_rtx (SImode),
        !          2518:                                    GEN_INT (INTVAL (operands[1]) & 0xff00)));
        !          2519:              emit_insn (gen_addsi3 (reg2 = gen_reg_rtx (SImode), reg,
        !          2520:                                     GEN_INT (INTVAL (operands[1]) & 0x00ff)));
        !          2521:            }
        !          2522:          insn = gen_rtx (SET, HImode, operands[0],
        !          2523:                          gen_rtx (SUBREG, HImode, reg2, 0));
        !          2524:        }
        !          2525:       else
        !          2526:        insn = gen_rtx (SET, VOIDmode, operands[0], operands[1]);
        !          2527:     }
        !          2528: 
        !          2529:   emit_insn (insn);
        !          2530:   DONE;
        !          2531: }")
        !          2532: 
        !          2533: ;; Pattern to recognise insn generated default case above
        !          2534: 
        !          2535: (define_insn ""
        !          2536:   [(set (match_operand:HI 0 "general_operand" "=r,r,r,m")
        !          2537:        (match_operand:HI 1 "general_operand"  "r,K,m,r"))]
        !          2538:   "(register_operand (operands[0], HImode)
        !          2539:     && (GET_CODE (operands[1]) != CONST_INT
        !          2540:        || const_ok_for_arm (INTVAL (operands[1]))
        !          2541:        || const_ok_for_arm (~INTVAL (operands[1]))))
        !          2542:    || register_operand (operands[1], HImode)"
        !          2543:   "*
        !          2544:   switch (which_alternative)
        !          2545:     {
        !          2546:       case 1:
        !          2547:        if (!const_ok_for_arm (INTVAL (operands[1])))
        !          2548:          {
        !          2549:            operands[1] = GEN_INT (~INTVAL (operands[1]));
        !          2550:            return arm_output_asm_insn (\"mvn\\t%0, %1\", operands);
        !          2551:          }
        !          2552:        /* fall through */
        !          2553:       case 0:
        !          2554:        return arm_output_asm_insn (\"mov\\t%0, %1\\t@movhi\", operands);
        !          2555:       case 2:
        !          2556:        return arm_output_asm_insn (\"ldr\\t%0, %1\\t@movhi\", operands);
        !          2557:       case 3:
        !          2558:        return arm_output_asm_insn (\"str\\t%1, %0\\t@movhi\", operands);
        !          2559:     }
        !          2560: "
        !          2561: [(set_attr "type" "*,*,load,store1")])
        !          2562: 
        !          2563: (define_expand "reload_outhi"
        !          2564:   [(parallel [(match_operand:HI 0 "reload_memory_operand" "=o")
        !          2565:              (match_operand:HI 1 "s_register_operand" "r")
        !          2566:              (match_operand:SI 2 "s_register_operand" "=&r")])]
        !          2567:   ""
        !          2568:   "
        !          2569:   arm_reload_out_hi (operands);
        !          2570:   DONE;
        !          2571: ")
        !          2572: 
        !          2573: (define_expand "movqi"
        !          2574:   [(set (match_operand:QI 0 "general_operand" "")
        !          2575:         (match_operand:QI 1 "general_operand" ""))]
        !          2576:   ""
        !          2577:   "
        !          2578:   /* Everything except mem = const or mem = mem can be done easily */
        !          2579: 
        !          2580:   if (!(reload_in_progress || reload_completed))
        !          2581:     {
        !          2582:       rtx reg;
        !          2583:       if (GET_CODE (operands[1]) == CONST_INT)
        !          2584:        {
        !          2585:          emit_insn (gen_movsi (reg = gen_reg_rtx (SImode), operands[1]));
        !          2586:          operands[1] = gen_rtx (SUBREG, QImode, reg, 0);
        !          2587:        }
        !          2588:     }
        !          2589:   if (GET_CODE (operands[0]) == MEM)
        !          2590:     operands[1] = force_reg (QImode, operands[1]);
        !          2591: ")
        !          2592: 
        !          2593: 
        !          2594: (define_insn ""
        !          2595:   [(set (match_operand:QI 0 "general_operand" "=r,r,r,m")
        !          2596:        (match_operand:QI 1 "general_operand" "r,K,m,r"))]
        !          2597:   "register_operand (operands[0], QImode)
        !          2598:    || register_operand (operands[1], QImode)"
        !          2599:   "*
        !          2600:   switch (which_alternative)
        !          2601:     {
        !          2602:     case 1:
        !          2603:       if (INTVAL (operands[1]) < 0)
        !          2604:        {
        !          2605:          operands[1] = GEN_INT (~INTVAL (operands[1]));
        !          2606:          return arm_output_asm_insn (\"mvn\\t%0, %1\", operands);
        !          2607:        }
        !          2608:     case 0:
        !          2609:       return (arm_output_asm_insn (\"mov\\t%0, %1\", operands));
        !          2610:     case 2:
        !          2611:       return (arm_output_asm_insn (\"ldrb\\t%0, %1\", operands));
        !          2612:     case 3:
        !          2613:       return (arm_output_asm_insn (\"strb\\t%1, %0\", operands));
        !          2614:     }
        !          2615: "
        !          2616: [(set_attr "type" "*,*,load,store1")])
        !          2617: 
        !          2618: (define_insn "movsf"
        !          2619:   [(set (match_operand:SF 0 "general_operand" "=f,f,f,m,f,r,r,r,m")
        !          2620:        (match_operand:SF 1 "general_operand" "fG,H,m,f,r,f,r,m,r"))]
        !          2621:   ""
        !          2622:   "*
        !          2623: {
        !          2624:   REAL_VALUE_TYPE r;
        !          2625: 
        !          2626:   switch (which_alternative)
        !          2627:     {
        !          2628:     case 0:
        !          2629:       return arm_output_asm_insn (\"mvfs\\t%0, %1\", operands);
        !          2630:     case 1:
        !          2631:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          2632:       r = REAL_VALUE_NEGATE (r);
        !          2633:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          2634:       return arm_output_asm_insn (\"mnfs\\t%0, %1\", operands);
        !          2635:     case 2:
        !          2636:       return arm_output_asm_insn (\"ldfs\\t%0, %1\", operands);
        !          2637:     case 3:
        !          2638:       return arm_output_asm_insn (\"stfs\\t%1, %0\", operands);
        !          2639:     case 4:
        !          2640:       arm_output_asm_insn(\"stmfd\\tsp!, {%1}\", operands);
        !          2641:       return arm_output_asm_insn (\"ldfs\\t%0, [sp],#4\", operands);
        !          2642:     case 5:
        !          2643:       arm_output_asm_insn(\"stfs\\t%1, [sp,#-4]!\", operands);
        !          2644:       return arm_output_asm_insn (\"ldmfd\\tsp!, {%0}\", operands);
        !          2645:     case 6:
        !          2646:       return arm_output_asm_insn (\"mov\\t%0, %1\", operands);
        !          2647:     case 7:
        !          2648:       return arm_output_asm_insn (\"ldr\\t%0, %1\\t@ float\", operands);
        !          2649:     case 8:
        !          2650:       return arm_output_asm_insn (\"str\\t%1, %0\\t@ float\", operands);
        !          2651:   }
        !          2652: }
        !          2653: "
        !          2654: [(set_attr "length" "1,1,1,1,2,2,1,1,1")
        !          2655:  (set_attr "type" "float,float,f_load,f_store,r_mem_f,f_mem_r,*,load,store1")])
        !          2656: 
        !          2657: (define_expand "movdf"
        !          2658:   [(parallel [(set (match_operand:DF 0 "general_operand" "")
        !          2659:                   (match_operand:DF 1 "general_operand" ""))
        !          2660:              (clobber (match_scratch:SI 2 ""))])]
        !          2661:   ""
        !          2662:   "
        !          2663:   if (GET_CODE (operands[0]) == MEM)
        !          2664:     operands[1] = force_reg (DFmode, operands[1]);
        !          2665: ")
        !          2666: 
        !          2667: ;; Reloading a df mode value stored in integer regs to memory can require a
        !          2668: ;; scratch reg.
        !          2669: (define_expand "reload_outdf"
        !          2670:   [(parallel [(set (match_operand:DF 0 "reload_memory_operand" "=o")
        !          2671:                   (match_operand:DF 1 "s_register_operand" "r"))
        !          2672:              (clobber (match_operand:SI 2 "s_register_operand" "=&r"))])]
        !          2673:   ""
        !          2674:   "")
        !          2675: 
        !          2676: (define_insn ""
        !          2677:   [(set (match_operand:DF 0 "general_operand" "=r,Q,r,o,f,f,f,f,m,!f,!r,r")
        !          2678:        (match_operand:DF 1 "general_operand" 
        !          2679:                "Q,r,?o,?r,?f,!G,!H,m,f,r,f,??r"))
        !          2680:    (clobber (match_scratch:SI 2 "=X,X,X,&r,X,X,X,X,X,X,X,X"))]
        !          2681:   "GET_CODE (operands[0]) != MEM || register_operand (operands[1], DFmode)"
        !          2682:   "*
        !          2683: {
        !          2684:   REAL_VALUE_TYPE r;
        !          2685:   rtx ops[3];
        !          2686: 
        !          2687:   switch (which_alternative)
        !          2688:     {
        !          2689:     case 0:
        !          2690:       operands[1] = XEXP (operands[1], 0);
        !          2691:       return arm_output_asm_insn (\"ldmia\\t%1, {%0, %R0}\\t@ double\",
        !          2692:                                  operands);
        !          2693:     case 1:
        !          2694:       operands[0] = XEXP (operands[0], 0);
        !          2695:       return arm_output_asm_insn (\"stmia\\t%0, {%1, %R1}\\t@ double\",
        !          2696:                                  operands);
        !          2697:     case 2:
        !          2698:       ops[0] = operands[0];
        !          2699:       ops[1] = XEXP (XEXP (operands[1], 0), 0);
        !          2700:       ops[2] = XEXP (XEXP (operands[1], 0), 1);
        !          2701:       if (!INTVAL (ops[2]) || const_ok_for_arm (INTVAL (ops[2])))
        !          2702:        arm_output_asm_insn (\"add\\t%0, %1, %2\", ops);
        !          2703:       else
        !          2704:        arm_output_asm_insn (\"sub\\t%0, %1, #%n2\", ops);
        !          2705:       return arm_output_asm_insn (\"ldmia\\t%0, {%0, %R0}\\t@ double\",
        !          2706:                                  operands);
        !          2707:     case 3:
        !          2708: 
        !          2709:       ops[0] = operands[2];
        !          2710:       ops[1] = XEXP (XEXP (operands[0], 0), 0);
        !          2711:       ops[2] = XEXP (XEXP (operands[0], 0), 1);
        !          2712:       if (!INTVAL (ops[2]) || const_ok_for_arm (INTVAL (ops[2])))
        !          2713:        arm_output_asm_insn (\"add\\t%0, %1, %2\", ops);
        !          2714:       else
        !          2715:        arm_output_asm_insn (\"sub\\t%0, %1, #%n2\", ops);
        !          2716:       return arm_output_asm_insn (\"stmia\\t%2, {%1, %R1}\\t@ double\",
        !          2717:                                  operands);
        !          2718:     case 4:
        !          2719:     case 5:
        !          2720:       return arm_output_asm_insn (\"mvfd\\t%0, %1\", operands);
        !          2721:     case 6:
        !          2722:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          2723:       r = REAL_VALUE_NEGATE (r);
        !          2724:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          2725:       return arm_output_asm_insn (\"mnfd\\t%0, %1\", operands);
        !          2726:     case 7: return arm_output_asm_insn (\"ldfd\\t%0, %1\", operands);
        !          2727:     case 8: return arm_output_asm_insn (\"stfd\\t%1, %0\", operands);
        !          2728:     case 9: return output_mov_double_fpu_from_arm (operands);
        !          2729:     case 10: return output_mov_double_arm_from_fpu (operands);
        !          2730:     case 11: return output_move_double (operands);
        !          2731:     }
        !          2732: }
        !          2733: "
        !          2734: [(set_attr "length" "1,1,2,2,1,1,1,1,1,2,2,2")
        !          2735:  (set_attr "type" 
        !          2736: "load,store2,load,store2,float,float,float,f_load,f_store,r_mem_f,f_mem_r,*")])
        !          2737: 
        !          2738: (define_insn "movxf"
        !          2739:   [(set (match_operand:XF 0 "general_operand" "=f,f,f,m,f,r,r")
        !          2740:        (match_operand:XF 1 "general_operand" "fG,H,m,f,r,f,r"))]
        !          2741:   "ENABLE_XF_PATTERNS"
        !          2742:   "*
        !          2743: {
        !          2744:   REAL_VALUE_TYPE r;
        !          2745: 
        !          2746:   switch (which_alternative)
        !          2747:     {
        !          2748:     case 0: return arm_output_asm_insn (\"mvfe\\t%0, %1\", operands);
        !          2749:     case 1:
        !          2750:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          2751:       r = REAL_VALUE_NEGATE (r);
        !          2752:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          2753:       return arm_output_asm_insn (\"mnfe\\t%0, %1\", operands);
        !          2754:     case 2: return arm_output_asm_insn (\"ldfe\\t%0, %1\", operands);
        !          2755:     case 3: return arm_output_asm_insn (\"stfe\\t%1, %0\", operands);
        !          2756:     case 4: return output_mov_long_double_fpu_from_arm (operands);
        !          2757:     case 5: return output_mov_long_double_arm_from_fpu (operands);
        !          2758:     case 6: return output_mov_long_double_arm_from_arm (operands);
        !          2759:     }
        !          2760: }
        !          2761: "
        !          2762: [(set_attr "length" "1,1,1,1,2,2,3")
        !          2763:  (set_attr "type" "float,float,f_load,f_store,r_mem_f,f_mem_r,*")])
        !          2764: 
        !          2765: 
        !          2766: ;; load- and store-multiple insns
        !          2767: ;; The arm can load/store any set of registers, provided that they are in
        !          2768: ;; ascending order; but that is beyond GCC so stick with what it knows.
        !          2769: 
        !          2770: (define_expand "load_multiple"
        !          2771:   [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
        !          2772:                           (match_operand:SI 1 "" ""))
        !          2773:                      (use (match_operand:SI 2 "" ""))])]
        !          2774:   ""
        !          2775:   "
        !          2776:   /* Support only fixed point registers */
        !          2777:   if (GET_CODE (operands[2]) != CONST_INT
        !          2778:       || INTVAL (operands[2]) > 14
        !          2779:       || INTVAL (operands[2]) < 2
        !          2780:       || GET_CODE (operands[1]) != MEM
        !          2781:       || GET_CODE (operands[0]) != REG
        !          2782:       || REGNO (operands[0]) > 14
        !          2783:       || REGNO (operands[0]) + INTVAL (operands[2]) > 15)
        !          2784:     FAIL;
        !          2785: 
        !          2786:   operands[3]
        !          2787:             = arm_gen_load_multiple (REGNO (operands[0]), INTVAL (operands[2]),
        !          2788:                                      force_reg (SImode, XEXP (operands[1], 0)),
        !          2789:                                      TRUE, FALSE);
        !          2790: ")
        !          2791: 
        !          2792: ;; Load multiple with write-back
        !          2793: 
        !          2794: (define_insn ""
        !          2795:   [(match_parallel 0 "load_multiple_operation"
        !          2796:                    [(set (match_operand:SI 1 "s_register_operand" "+r")
        !          2797:                          (plus:SI (match_dup 1)
        !          2798:                                   (match_operand:SI 2 "immediate_operand" "n")))
        !          2799:                     (set (match_operand:SI 3 "s_register_operand" "=r")
        !          2800:                          (mem:SI (match_dup 1)))])]
        !          2801:   "(INTVAL (operands[2])  == 4 * (XVECLEN (operands[0], 0) - 2))"
        !          2802:   "*
        !          2803: {
        !          2804:   rtx ops[3];
        !          2805:   int count = XVECLEN (operands[0], 0);
        !          2806: 
        !          2807:   ops[0] = XEXP (SET_SRC (XVECEXP (operands[0], 0, 0)), 0);
        !          2808:   ops[1] = SET_DEST (XVECEXP (operands[0], 0, 1));
        !          2809:   ops[2] = SET_DEST (XVECEXP (operands[0], 0, count - 2));
        !          2810: 
        !          2811:   return arm_output_asm_insn (\"ldmia\\t%0!, {%1-%2}\\t@ load multiple\", ops);
        !          2812: }
        !          2813: "
        !          2814: [(set_attr "type" "load")])
        !          2815: 
        !          2816: ;; Ordinary load multiple
        !          2817: 
        !          2818: (define_insn ""
        !          2819:   [(match_parallel 0 "load_multiple_operation"
        !          2820:                    [(set (match_operand:SI 1 "s_register_operand" "=r")
        !          2821:                          (match_operand:SI 2 "indirect_operand" "Q"))])]
        !          2822:   ""
        !          2823:   "*
        !          2824: {
        !          2825:   rtx ops[3];
        !          2826:   int count = XVECLEN (operands[0], 0);
        !          2827: 
        !          2828:   ops[0] = XEXP (SET_SRC (XVECEXP (operands[0], 0, 0)), 0);
        !          2829:   ops[1] = SET_DEST (XVECEXP (operands[0], 0, 0));
        !          2830:   ops[2] = SET_DEST (XVECEXP (operands[0], 0, count - 1));
        !          2831: 
        !          2832:   return arm_output_asm_insn (\"ldmia\\t%0, {%1-%2}\\t@ load multiple\", ops);
        !          2833: }
        !          2834: "
        !          2835: [(set_attr "type" "load")])
        !          2836: 
        !          2837: (define_expand "store_multiple"
        !          2838:   [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
        !          2839:                           (match_operand:SI 1 "" ""))
        !          2840:                      (use (match_operand:SI 2 "" ""))])]
        !          2841:   ""
        !          2842:   "
        !          2843:   /* Support only fixed point registers */
        !          2844:   if (GET_CODE (operands[2]) != CONST_INT
        !          2845:       || INTVAL (operands[2]) > 14
        !          2846:       || INTVAL (operands[2]) < 2
        !          2847:       || GET_CODE (operands[1]) != REG
        !          2848:       || GET_CODE (operands[0]) != MEM
        !          2849:       || REGNO (operands[1]) > 14
        !          2850:       || REGNO (operands[1]) + INTVAL (operands[2]) > 15)
        !          2851:     FAIL;
        !          2852: 
        !          2853:   operands[3]
        !          2854:            = arm_gen_store_multiple (REGNO (operands[1]), INTVAL (operands[2]),
        !          2855:                                      force_reg (SImode, XEXP (operands[0], 0)),
        !          2856:                                      TRUE, FALSE);
        !          2857: ")
        !          2858: 
        !          2859: ;; Store multiple with write-back
        !          2860: 
        !          2861: (define_insn ""
        !          2862:   [(match_parallel 0 "store_multiple_operation"
        !          2863:                    [(set (match_operand:SI 1 "s_register_operand" "+r")
        !          2864:                          (plus:SI (match_dup 1)
        !          2865:                                   (match_operand:SI 2 "immediate_operand" "n")))
        !          2866:                     (set (mem:SI (match_dup 1))
        !          2867:                          (match_operand:SI 3 "s_register_operand" "r"))])]
        !          2868:   "(INTVAL (operands[2]) == 4 * (XVECLEN (operands[0], 0) - 2))"
        !          2869:   "*
        !          2870: {
        !          2871:   rtx ops[3];
        !          2872:   int count = XVECLEN (operands[0], 0);
        !          2873: 
        !          2874:   ops[0] = XEXP (SET_SRC (XVECEXP (operands[0], 0, 0)), 0);
        !          2875:   ops[1] = SET_SRC (XVECEXP (operands[0], 0, 1));
        !          2876:   ops[2] = SET_SRC (XVECEXP (operands[0], 0, count - 2));
        !          2877: 
        !          2878:   return arm_output_asm_insn (\"stmia\\t%0!, {%1-%2}\\t@ str multiple\", ops);
        !          2879: }
        !          2880: "
        !          2881: [(set (attr "type")
        !          2882:       (cond [(eq (symbol_ref "XVECLEN (operands[0],0)") (const_int 4))
        !          2883:                (const_string "store2")
        !          2884:             (eq (symbol_ref "XVECLEN (operands[0],0)") (const_int 5))
        !          2885:                (const_string "store3")]
        !          2886:          (const_string "store4")))])
        !          2887: 
        !          2888: ;; Ordinary store multiple
        !          2889: 
        !          2890: (define_insn ""
        !          2891:   [(match_parallel 0 "store_multiple_operation"
        !          2892:                    [(set (match_operand:SI 2 "indirect_operand" "=Q")
        !          2893:                          (match_operand:SI 1 "s_register_operand" "r"))])]
        !          2894:   ""
        !          2895:   "*
        !          2896: {
        !          2897:   rtx ops[3];
        !          2898:   int count = XVECLEN (operands[0], 0);
        !          2899: 
        !          2900:   ops[0] = XEXP (SET_DEST (XVECEXP (operands[0], 0, 0)), 0);
        !          2901:   ops[1] = SET_SRC (XVECEXP (operands[0], 0, 0));
        !          2902:   ops[2] = SET_SRC (XVECEXP (operands[0], 0, count - 1));
        !          2903: 
        !          2904:   return arm_output_asm_insn (\"stmia\\t%0, {%1-%2}\\t@ str multiple\", ops);
        !          2905: }
        !          2906: "
        !          2907: [(set (attr "type")
        !          2908:       (cond [(eq (symbol_ref "XVECLEN (operands[0],0)") (const_int 3))
        !          2909:                (const_string "store2")
        !          2910:             (eq (symbol_ref "XVECLEN (operands[0],0)") (const_int 4))
        !          2911:                (const_string "store3")]
        !          2912:          (const_string "store4")))])
        !          2913: 
        !          2914: ;; Move a block of memory if it is word aligned and MORE than 2 words long.
        !          2915: ;; We could let this apply for blocks of less than this, but it clobbers so
        !          2916: ;; many registers that there is then probably a better way.
        !          2917: 
        !          2918: ;; If optimizing, output redundant moves with REG_NOTES on them, this 
        !          2919: ;; produces better code.
        !          2920: 
        !          2921: (define_expand "movstrsi"
        !          2922:   [(set (match_operand:BLK 0 "general_operand" "=m")
        !          2923:         (match_operand:BLK 1 "general_operand" "m"))
        !          2924:    (use (match_operand:SI 2 "immediate_operand" "n"))
        !          2925:    (use (match_operand:SI 3 "immediate_operand" "n"))
        !          2926:    (clobber (reg:SI 0))
        !          2927:    (clobber (reg:SI 1))
        !          2928:    (clobber (reg:SI 2))
        !          2929:    (clobber (reg:SI 3))
        !          2930:    (clobber (match_scratch:SI 4 "=+r"))
        !          2931:    (clobber (match_scratch:SI 5 "=+r"))]
        !          2932:   ""
        !          2933:   "
        !          2934: {
        !          2935:   int words_to_go;
        !          2936:   int i, r;
        !          2937:   rtx const_sxteen = gen_rtx (CONST_INT, SImode, 16);
        !          2938:   rtx src = gen_reg_rtx (SImode);
        !          2939:   rtx dst = gen_reg_rtx (SImode);
        !          2940:   rtx st_src, st_dst, end_src, end_dst, fin_src, fin_dst;
        !          2941:   extern int optimize;
        !          2942: 
        !          2943:   if (GET_CODE (operands[2]) != CONST_INT
        !          2944:       || GET_CODE (operands[3]) != CONST_INT
        !          2945:       || INTVAL (operands[2]) % 4 != 0
        !          2946:       || INTVAL (operands[2]) < 4
        !          2947:       || INTVAL (operands[2]) > 64
        !          2948:       || INTVAL (operands[3]) < 4
        !          2949:       || INTVAL (operands[3]) % 4 != 0)
        !          2950:     FAIL;
        !          2951:   emit_move_insn (dst, st_dst = force_reg (SImode, XEXP (operands[0], 0)));
        !          2952:   emit_move_insn (src, st_src = force_reg (SImode, XEXP (operands[1], 0)));
        !          2953:   fin_src = src;
        !          2954:   fin_dst = dst;
        !          2955: 
        !          2956:   for (i = 0, words_to_go = INTVAL (operands[2]) / 4; words_to_go >= 2; i+=4)
        !          2957:     {
        !          2958:       emit_insn (arm_gen_load_multiple (0, words_to_go > 4 ? 4 : words_to_go,
        !          2959:                                         src, TRUE, TRUE));
        !          2960:       emit_insn (arm_gen_store_multiple (0, words_to_go > 4 ? 4 : words_to_go,
        !          2961:                                         dst, TRUE, TRUE));
        !          2962:       if (optimize)
        !          2963:         for (r = (words_to_go > 4) ? 3 : words_to_go - 1; r >= 0; r--)
        !          2964:           {
        !          2965:             rtx note;
        !          2966:             note = emit_move_insn (gen_reg_rtx (SImode),
        !          2967:                                    gen_rtx (REG, SImode, r));
        !          2968:             REG_NOTES (note) = gen_rtx (EXPR_LIST, REG_EQUIV,
        !          2969:                                         gen_rtx (MEM, SImode,
        !          2970:                                               plus_constant (st_src, 4*(i+r))),
        !          2971:                                         REG_NOTES (note));
        !          2972:             REG_NOTES (note) = gen_rtx (EXPR_LIST, REG_EQUIV,
        !          2973:                                         gen_rtx (MEM, SImode,
        !          2974:                                               plus_constant (st_dst, 4*(i+r))),
        !          2975:                                         REG_NOTES (note));
        !          2976:           }
        !          2977:       words_to_go -= words_to_go < 4 ? words_to_go : 4;
        !          2978:     }
        !          2979:   if (words_to_go)
        !          2980:   {
        !          2981:     rtx sreg;
        !          2982: 
        !          2983:     emit_move_insn (sreg = gen_reg_rtx (SImode), gen_rtx (MEM, SImode, src));
        !          2984:     emit_move_insn (fin_src = gen_reg_rtx (SImode), plus_constant (src, 4));
        !          2985:     emit_move_insn (gen_rtx (MEM, SImode, dst), sreg);
        !          2986:     emit_move_insn (fin_dst = gen_reg_rtx (SImode), plus_constant (dst, 4));
        !          2987:   }
        !          2988:   if (optimize)
        !          2989:     {
        !          2990:       /* Insns for the REG_NOTES: These notes tell the optimiser where the
        !          2991:          index registers have got to so that consecutive block moves of
        !          2992:          contiguous data work efficiently */
        !          2993: 
        !          2994:       end_src = emit_move_insn (fin_src, fin_src);
        !          2995:       REG_NOTES (end_src) = gen_rtx(EXPR_LIST, REG_EQUAL,
        !          2996:                                   plus_constant (st_src, INTVAL (operands[2])),
        !          2997:                                   REG_NOTES (end_src));
        !          2998:       end_dst = emit_move_insn (fin_dst, fin_dst);
        !          2999:       REG_NOTES (end_dst) = gen_rtx(EXPR_LIST, REG_EQUAL,
        !          3000:                                   plus_constant (st_dst, INTVAL (operands[2])),
        !          3001:                                   REG_NOTES (end_dst));
        !          3002:     }
        !          3003:   DONE;
        !          3004: }
        !          3005: ")
        !          3006: 
        !          3007: 
        !          3008: ;; Comparison and test insns
        !          3009: 
        !          3010: (define_expand "cmpsi"
        !          3011:   [(set (reg:CC 24)
        !          3012:        (compare:CC (match_operand:SI 0 "s_register_operand" "")
        !          3013:                    (match_operand:SI 1 "arm_add_operand" "")))]
        !          3014:   ""
        !          3015:   "
        !          3016: {
        !          3017:   arm_compare_op0 = operands[0];
        !          3018:   arm_compare_op1 = operands[1];
        !          3019:   arm_compare_fp = 0;
        !          3020:   DONE;
        !          3021: }
        !          3022: ")
        !          3023: 
        !          3024: (define_expand "cmpsf"
        !          3025:   [(set (reg:CC 24)
        !          3026:        (compare:CC (match_operand:SF 0 "s_register_operand" "")
        !          3027:                    (match_operand:SF 1 "fpu_rhs_operand" "")))]
        !          3028:   ""
        !          3029:   "
        !          3030: {
        !          3031:   arm_compare_op0 = operands[0];
        !          3032:   arm_compare_op1 = operands[1];
        !          3033:   arm_compare_fp = 1;
        !          3034:   DONE;
        !          3035: }
        !          3036: ")
        !          3037: 
        !          3038: (define_expand "cmpdf"
        !          3039:   [(set (reg:CC 24)
        !          3040:        (compare:CC (match_operand:DF 0 "s_register_operand" "")
        !          3041:                    (match_operand:DF 1 "fpu_rhs_operand" "")))]
        !          3042:   ""
        !          3043:   "
        !          3044: {
        !          3045:   arm_compare_op0 = operands[0];
        !          3046:   arm_compare_op1 = operands[1];
        !          3047:   arm_compare_fp = 1;
        !          3048:   DONE;
        !          3049: }
        !          3050: ")
        !          3051: 
        !          3052: (define_expand "cmpxf"
        !          3053:   [(set (reg:CC 24)
        !          3054:        (compare:CC (match_operand:XF 0 "s_register_operand" "")
        !          3055:                    (match_operand:XF 1 "fpu_rhs_operand" "")))]
        !          3056:   "ENABLE_XF_PATTERNS"
        !          3057:   "
        !          3058: {
        !          3059:   arm_compare_op0 = operands[0];
        !          3060:   arm_compare_op1 = operands[1];
        !          3061:   arm_compare_fp = 1;
        !          3062:   DONE;
        !          3063: }
        !          3064: ")
        !          3065: 
        !          3066: (define_insn ""
        !          3067:   [(set (match_operand 0 "cc_register" "")
        !          3068:        (compare (match_operand:SI 1 "s_register_operand" "r")
        !          3069:                 (match_operand:SI 2 "arm_add_operand" "rL")))]
        !          3070:   ""
        !          3071:   "*
        !          3072:   if (GET_CODE (operands[2]) == CONST_INT
        !          3073:       && !const_ok_for_arm (INTVAL (operands[2])))
        !          3074:     return arm_output_asm_insn (\"cmn\\t%1, #%n2\", operands);
        !          3075:   return arm_output_asm_insn (\"cmp\\t%1, %2\", operands);
        !          3076: "
        !          3077: [(set_attr "conds" "set")])
        !          3078: 
        !          3079: (define_insn ""
        !          3080:   [(set (match_operand 0 "cc_register" "")
        !          3081:        (compare (match_operand:SI 1 "s_register_operand" "r")
        !          3082:                 (neg:SI (match_operand:SI 2 "s_register_operand" "r"))))]
        !          3083:   ""
        !          3084:   "*
        !          3085:   return arm_output_asm_insn (\"cmn\\t%1, %2\", operands);
        !          3086: "
        !          3087: [(set_attr "conds" "set")])
        !          3088: 
        !          3089: (define_insn ""
        !          3090:   [(set (match_operand 0 "cc_register" "")
        !          3091:        (compare (match_operand:SI 1 "s_register_operand" "r")
        !          3092:                 (match_operator:SI 2 "shift_operator"
        !          3093:                  [(match_operand:SI 3 "s_register_operand" "r")
        !          3094:                   (match_operand:SI 4 "arm_rhs_operand" "rn")])))]
        !          3095:   ""
        !          3096:   "*
        !          3097:   return output_shift_compare (operands, FALSE);
        !          3098: "
        !          3099: [(set_attr "conds" "set")])
        !          3100: 
        !          3101: (define_insn ""
        !          3102:   [(set (match_operand 0 "cc_register" "")
        !          3103:        (compare (match_operand:SI 1 "s_register_operand" "r")
        !          3104:                 (neg:SI (match_operator:SI 2 "shift_operator"
        !          3105:                          [(match_operand:SI 3 "s_register_operand" "r")
        !          3106:                           (match_operand:SI 4 "arm_rhs_operand" "rn")]))))]
        !          3107:   ""
        !          3108:   "*
        !          3109:   return output_shift_compare (operands, TRUE);
        !          3110: "
        !          3111: [(set_attr "conds" "set")])
        !          3112: 
        !          3113: (define_insn ""
        !          3114:   [(set (reg:CCFP 24)
        !          3115:        (compare:CCFP (match_operand:SF 0 "s_register_operand" "f,f")
        !          3116:                      (match_operand:SF 1 "fpu_add_operand" "fG,H")))]
        !          3117:   ""
        !          3118:   "*
        !          3119: {
        !          3120:   REAL_VALUE_TYPE r;
        !          3121: 
        !          3122:   switch (which_alternative)
        !          3123:     {
        !          3124:     case 0:
        !          3125:       return arm_output_asm_insn (\"cmf\\t%0, %1\", operands);
        !          3126:     case 1:
        !          3127:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          3128:       r = REAL_VALUE_NEGATE (r);
        !          3129:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          3130:       return arm_output_asm_insn (\"cnf\\t%0, %1\", operands);
        !          3131:     }
        !          3132: }
        !          3133: "
        !          3134: [(set_attr "conds" "set")
        !          3135:  (set_attr "type" "f_2_r")])
        !          3136: 
        !          3137: (define_insn ""
        !          3138:   [(set (reg:CCFP 24)
        !          3139:        (compare:CCFP (match_operand:DF 0 "s_register_operand" "f,f")
        !          3140:                      (match_operand:DF 1 "fpu_add_operand" "fG,H")))]
        !          3141:   ""
        !          3142:   "*
        !          3143: {
        !          3144:   REAL_VALUE_TYPE r;
        !          3145: 
        !          3146:   switch (which_alternative)
        !          3147:     {
        !          3148:     case 0:
        !          3149:       return arm_output_asm_insn (\"cmf\\t%0, %1\", operands);
        !          3150:     case 1:
        !          3151:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          3152:       r = REAL_VALUE_NEGATE (r);
        !          3153:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          3154:       return arm_output_asm_insn (\"cnf\\t%0, %1\", operands);
        !          3155:     }
        !          3156: }
        !          3157: "
        !          3158: [(set_attr "conds" "set")
        !          3159:  (set_attr "type" "f_2_r")])
        !          3160: 
        !          3161: (define_insn ""
        !          3162:   [(set (reg:CCFP 24)
        !          3163:        (compare:CCFP (float_extend:DF
        !          3164:                       (match_operand:SF 0 "s_register_operand" "f,f"))
        !          3165:                      (match_operand:DF 1 "fpu_add_operand" "fG,H")))]
        !          3166:   ""
        !          3167:   "*
        !          3168: {
        !          3169:   REAL_VALUE_TYPE r;
        !          3170: 
        !          3171:   switch (which_alternative)
        !          3172:     {
        !          3173:     case 0:
        !          3174:       return arm_output_asm_insn (\"cmf\\t%0, %1\", operands);
        !          3175:     case 1:
        !          3176:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          3177:       r = REAL_VALUE_NEGATE (r);
        !          3178:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          3179:       return arm_output_asm_insn (\"cnf\\t%0, %1\", operands);
        !          3180:     }
        !          3181: }
        !          3182: "
        !          3183: [(set_attr "conds" "set")
        !          3184:  (set_attr "type" "f_2_r")])
        !          3185: 
        !          3186: (define_insn ""
        !          3187:   [(set (reg:CCFP 24)
        !          3188:        (compare:CCFP (match_operand:DF 0 "s_register_operand" "f")
        !          3189:                      (float_extend:DF
        !          3190:                       (match_operand:SF 1 "s_register_operand" "f"))))]
        !          3191:   ""
        !          3192:   "*
        !          3193:   return arm_output_asm_insn (\"cmf\\t%0, %1\", operands);
        !          3194: "
        !          3195: [(set_attr "conds" "set")
        !          3196:  (set_attr "type" "f_2_r")])
        !          3197: 
        !          3198: (define_insn ""
        !          3199:   [(set (reg:CCFP 24)
        !          3200:        (compare:CCFP (match_operand:XF 0 "s_register_operand" "f,f")
        !          3201:                      (match_operand:XF 1 "fpu_add_operand" "fG,H")))]
        !          3202:   "ENABLE_XF_PATTERNS"
        !          3203:   "*
        !          3204: {
        !          3205:   REAL_VALUE_TYPE r;
        !          3206: 
        !          3207:   switch (which_alternative)
        !          3208:     {
        !          3209:     case 0:
        !          3210:       return arm_output_asm_insn (\"cmf\\t%0, %1\", operands);
        !          3211:     case 1:
        !          3212:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          3213:       r = REAL_VALUE_NEGATE (r);
        !          3214:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          3215:       return arm_output_asm_insn (\"cnf\\t%0, %1\", operands);
        !          3216:     }
        !          3217: }
        !          3218: "
        !          3219: [(set_attr "conds" "set")
        !          3220:  (set_attr "type" "f_2_r")])
        !          3221: 
        !          3222: (define_insn ""
        !          3223:   [(set (reg:CCFPE 24)
        !          3224:        (compare:CCFPE (match_operand:SF 0 "s_register_operand" "f,f")
        !          3225:                       (match_operand:SF 1 "fpu_add_operand" "fG,H")))]
        !          3226:   ""
        !          3227:   "*
        !          3228: {
        !          3229:   REAL_VALUE_TYPE r;
        !          3230: 
        !          3231:   switch (which_alternative)
        !          3232:     {
        !          3233:     case 0:
        !          3234:       return arm_output_asm_insn (\"cmfe\\t%0, %1\", operands);
        !          3235:     case 1:
        !          3236:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          3237:       r = REAL_VALUE_NEGATE (r);
        !          3238:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          3239:       return arm_output_asm_insn (\"cnfe\\t%0, %1\", operands);
        !          3240:     }
        !          3241: }
        !          3242: "
        !          3243: [(set_attr "conds" "set")
        !          3244:  (set_attr "type" "f_2_r")])
        !          3245: 
        !          3246: (define_insn ""
        !          3247:   [(set (reg:CCFPE 24)
        !          3248:        (compare:CCFPE (match_operand:DF 0 "s_register_operand" "f,f")
        !          3249:                       (match_operand:DF 1 "fpu_add_operand" "fG,H")))]
        !          3250:   ""
        !          3251:   "*
        !          3252: {
        !          3253:   REAL_VALUE_TYPE r;
        !          3254: 
        !          3255:   switch (which_alternative)
        !          3256:     {
        !          3257:     case 0:
        !          3258:       return arm_output_asm_insn (\"cmfe\\t%0, %1\", operands);
        !          3259:     case 1:
        !          3260:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          3261:       r = REAL_VALUE_NEGATE (r);
        !          3262:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          3263:       return arm_output_asm_insn (\"cnfe\\t%0, %1\", operands);
        !          3264:     }
        !          3265: }
        !          3266: "
        !          3267: [(set_attr "conds" "set")
        !          3268:  (set_attr "type" "f_2_r")])
        !          3269: 
        !          3270: (define_insn ""
        !          3271:   [(set (reg:CCFPE 24)
        !          3272:        (compare:CCFPE (float_extend:DF
        !          3273:                        (match_operand:SF 0 "s_register_operand" "f,f"))
        !          3274:                       (match_operand:DF 1 "fpu_add_operand" "fG,H")))]
        !          3275:   ""
        !          3276:   "*
        !          3277: {
        !          3278:   REAL_VALUE_TYPE r;
        !          3279: 
        !          3280:   switch (which_alternative)
        !          3281:     {
        !          3282:     case 0:
        !          3283:       return arm_output_asm_insn (\"cmfe\\t%0, %1\", operands);
        !          3284:     case 1:
        !          3285:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          3286:       r = REAL_VALUE_NEGATE (r);
        !          3287:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          3288:       return arm_output_asm_insn (\"cnfe\\t%0, %1\", operands);
        !          3289:     }
        !          3290: }
        !          3291: "
        !          3292: [(set_attr "conds" "set")
        !          3293:  (set_attr "type" "f_2_r")])
        !          3294: 
        !          3295: (define_insn ""
        !          3296:   [(set (reg:CCFPE 24)
        !          3297:        (compare:CCFPE (match_operand:DF 0 "s_register_operand" "f")
        !          3298:                       (float_extend:DF
        !          3299:                        (match_operand:SF 1 "s_register_operand" "f"))))]
        !          3300:   ""
        !          3301:   "*
        !          3302:   return arm_output_asm_insn (\"cmfe\\t%0, %1\", operands);
        !          3303: "
        !          3304: [(set_attr "conds" "set")
        !          3305:  (set_attr "type" "f_2_r")])
        !          3306: 
        !          3307: (define_insn ""
        !          3308:   [(set (reg:CCFPE 24)
        !          3309:        (compare:CCFPE (match_operand:XF 0 "s_register_operand" "f,f")
        !          3310:                       (match_operand:XF 1 "fpu_add_operand" "fG,H")))]
        !          3311:   "ENABLE_XF_PATTERNS"
        !          3312:   "*
        !          3313: {
        !          3314:   REAL_VALUE_TYPE r;
        !          3315: 
        !          3316:   switch (which_alternative)
        !          3317:     {
        !          3318:     case 0:
        !          3319:       return arm_output_asm_insn (\"cmfe\\t%0, %1\", operands);
        !          3320:     case 1:
        !          3321:       REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
        !          3322:       r = REAL_VALUE_NEGATE (r);
        !          3323:       operands[1] = CONST_DOUBLE_FROM_REAL_VALUE (r, GET_MODE (operands[1]));
        !          3324:       return arm_output_asm_insn (\"cnfe\\t%0, %1\", operands);
        !          3325:     }
        !          3326: }
        !          3327: "
        !          3328: [(set_attr "conds" "set")
        !          3329:  (set_attr "type" "f_2_r")])
        !          3330: 
        !          3331: ; This insn allows redundant compares to be removed by cse, nothing should
        !          3332: ; ever appear in the output file since (set (reg x) (reg x)) is a no-op that
        !          3333: ; is deleted later on. The match_dup will match the mode here, so that
        !          3334: ; mode changes of the condition codes aren't lost by this even though we don't
        !          3335: ; specify what they are.
        !          3336: 
        !          3337: (define_insn ""
        !          3338:   [(set (match_operand 0 "cc_register" "") (match_dup 0))]
        !          3339:   ""
        !          3340:   "\\t@ deleted compare"
        !          3341: [(set_attr "conds" "set")
        !          3342:  (set_attr "length" "0")])
        !          3343: 
        !          3344: 
        !          3345: ;; Conditional branch insns
        !          3346: 
        !          3347: (define_expand "beq"
        !          3348:   [(set (pc)
        !          3349:        (if_then_else (eq (match_dup 1) (const_int 0))
        !          3350:                      (label_ref (match_operand 0 "" ""))
        !          3351:                      (pc)))]
        !          3352:   ""
        !          3353:   "
        !          3354: {
        !          3355:   operands[1] = gen_compare_reg (EQ, arm_compare_op0, arm_compare_op1,
        !          3356:                                 arm_compare_fp);
        !          3357: }
        !          3358: ")
        !          3359: 
        !          3360: (define_expand "bne"
        !          3361:   [(set (pc)
        !          3362:        (if_then_else (ne (match_dup 1) (const_int 0))
        !          3363:                      (label_ref (match_operand 0 "" ""))
        !          3364:                      (pc)))]
        !          3365:   ""
        !          3366:   "
        !          3367: {
        !          3368:   operands[1] = gen_compare_reg (NE, arm_compare_op0, arm_compare_op1,
        !          3369:                                 arm_compare_fp);
        !          3370: }
        !          3371: ")
        !          3372: 
        !          3373: (define_expand "bgt"
        !          3374:   [(set (pc)
        !          3375:        (if_then_else (gt (match_dup 1) (const_int 0))
        !          3376:                      (label_ref (match_operand 0 "" ""))
        !          3377:                      (pc)))]
        !          3378:   ""
        !          3379:   "
        !          3380: {
        !          3381:   operands[1] = gen_compare_reg (GT, arm_compare_op0, arm_compare_op1,
        !          3382:                                 arm_compare_fp);
        !          3383: }
        !          3384: ")
        !          3385: 
        !          3386: (define_expand "ble"
        !          3387:   [(set (pc)
        !          3388:        (if_then_else (le (match_dup 1) (const_int 0))
        !          3389:                      (label_ref (match_operand 0 "" ""))
        !          3390:                      (pc)))]
        !          3391:   ""
        !          3392:   "
        !          3393: {
        !          3394:   operands[1] = gen_compare_reg (LE, arm_compare_op0, arm_compare_op1,
        !          3395:                                 arm_compare_fp);
        !          3396: }
        !          3397: ")
        !          3398: 
        !          3399: (define_expand "bge"
        !          3400:   [(set (pc)
        !          3401:        (if_then_else (ge (match_dup 1) (const_int 0))
        !          3402:                      (label_ref (match_operand 0 "" ""))
        !          3403:                      (pc)))]
        !          3404:   ""
        !          3405:   "
        !          3406: {
        !          3407:   operands[1] = gen_compare_reg (GE, arm_compare_op0, arm_compare_op1,
        !          3408:                                 arm_compare_fp);
        !          3409: }
        !          3410: ")
        !          3411: 
        !          3412: (define_expand "blt"
        !          3413:   [(set (pc)
        !          3414:        (if_then_else (lt (match_dup 1) (const_int 0))
        !          3415:                      (label_ref (match_operand 0 "" ""))
        !          3416:                      (pc)))]
        !          3417:   ""
        !          3418:   "
        !          3419: {
        !          3420:   operands[1] = gen_compare_reg (LT, arm_compare_op0, arm_compare_op1,
        !          3421:                                 arm_compare_fp);
        !          3422: }
        !          3423: ")
        !          3424: 
        !          3425: (define_expand "bgtu"
        !          3426:   [(set (pc)
        !          3427:        (if_then_else (gtu (match_dup 1) (const_int 0))
        !          3428:                      (label_ref (match_operand 0 "" ""))
        !          3429:                      (pc)))]
        !          3430:   ""
        !          3431:   "
        !          3432: {
        !          3433:   operands[1] = gen_compare_reg (GTU, arm_compare_op0, arm_compare_op1,
        !          3434:                                 arm_compare_fp);
        !          3435: }
        !          3436: ")
        !          3437: 
        !          3438: (define_expand "bleu"
        !          3439:   [(set (pc)
        !          3440:        (if_then_else (leu (match_dup 1) (const_int 0))
        !          3441:                      (label_ref (match_operand 0 "" ""))
        !          3442:                      (pc)))]
        !          3443:   ""
        !          3444:   "
        !          3445: {
        !          3446:   operands[1] = gen_compare_reg (LEU, arm_compare_op0, arm_compare_op1,
        !          3447:                                 arm_compare_fp);
        !          3448: }
        !          3449: ")
        !          3450: 
        !          3451: (define_expand "bgeu"
        !          3452:   [(set (pc)
        !          3453:        (if_then_else (geu (match_dup 1) (const_int 0))
        !          3454:                      (label_ref (match_operand 0 "" ""))
        !          3455:                      (pc)))]
        !          3456:   ""
        !          3457:   "
        !          3458: {
        !          3459:   operands[1] = gen_compare_reg (GEU, arm_compare_op0, arm_compare_op1,
        !          3460:                                 arm_compare_fp);
        !          3461: }
        !          3462: ")
        !          3463: 
        !          3464: (define_expand "bltu"
        !          3465:   [(set (pc)
        !          3466:        (if_then_else (ltu (match_dup 1) (const_int 0))
        !          3467:                      (label_ref (match_operand 0 "" ""))
        !          3468:                      (pc)))]
        !          3469:   ""
        !          3470:   "
        !          3471: {
        !          3472:   operands[1] = gen_compare_reg (LTU, arm_compare_op0, arm_compare_op1,
        !          3473:                                 arm_compare_fp);
        !          3474: }
        !          3475: ")
        !          3476: 
        !          3477: ;; patterns to match conditional branch insns
        !          3478: 
        !          3479: (define_insn ""
        !          3480:   [(set (pc)
        !          3481:        (if_then_else (match_operator 1 "comparison_operator"
        !          3482:                                        [(reg 24) (const_int 0)])
        !          3483:                      (label_ref (match_operand 0 "" ""))
        !          3484:                      (pc)))]
        !          3485:   ""
        !          3486:   "*
        !          3487: {
        !          3488:   extern int arm_ccfsm_state;
        !          3489: 
        !          3490:   if (arm_ccfsm_state == 1 || arm_ccfsm_state == 2)
        !          3491:   {
        !          3492:     arm_ccfsm_state += 2;
        !          3493:     return \"\";
        !          3494:   }
        !          3495:   return (arm_output_asm_insn (\"b%d1\\t%l0\", operands));
        !          3496: }"
        !          3497: [(set_attr "conds" "use")])
        !          3498: 
        !          3499: (define_insn ""
        !          3500:   [(set (pc)
        !          3501:        (if_then_else (match_operator 1 "comparison_operator"
        !          3502:                                        [(reg 24) (const_int 0)])
        !          3503:                      (pc)
        !          3504:                      (label_ref (match_operand 0 "" ""))))]
        !          3505:   ""
        !          3506:   "*
        !          3507: {
        !          3508:   extern int arm_ccfsm_state;
        !          3509: 
        !          3510:   if (arm_ccfsm_state == 1 || arm_ccfsm_state == 2)
        !          3511:   {
        !          3512:     arm_ccfsm_state += 2;
        !          3513:     return \"\";
        !          3514:   }
        !          3515:   return (arm_output_asm_insn (\"b%D1\\t%l0\", operands));
        !          3516: }"
        !          3517: [(set_attr "conds" "use")])
        !          3518: 
        !          3519: 
        !          3520: ; scc insns
        !          3521: 
        !          3522: (define_expand "seq"
        !          3523:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3524:        (eq:SI (match_dup 1) (const_int 0)))]
        !          3525:   ""
        !          3526:   "
        !          3527: {
        !          3528:   operands[1] = gen_compare_reg (EQ, arm_compare_op0, arm_compare_op1,
        !          3529:                                 arm_compare_fp);
        !          3530: }
        !          3531: ")
        !          3532: 
        !          3533: (define_expand "sne"
        !          3534:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3535:        (ne:SI (match_dup 1) (const_int 0)))]
        !          3536:   ""
        !          3537:   "
        !          3538: {
        !          3539:   operands[1] = gen_compare_reg (NE, arm_compare_op0, arm_compare_op1,
        !          3540:                                 arm_compare_fp);
        !          3541: }
        !          3542: ")
        !          3543: 
        !          3544: (define_expand "sgt"
        !          3545:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3546:        (gt:SI (match_dup 1) (const_int 0)))]
        !          3547:   ""
        !          3548:   "
        !          3549: {
        !          3550:   operands[1] = gen_compare_reg (GT, arm_compare_op0, arm_compare_op1,
        !          3551:                                 arm_compare_fp);
        !          3552: }
        !          3553: ")
        !          3554: 
        !          3555: (define_expand "sle"
        !          3556:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3557:        (le:SI (match_dup 1) (const_int 0)))]
        !          3558:   ""
        !          3559:   "
        !          3560: {
        !          3561:   operands[1] = gen_compare_reg (LE, arm_compare_op0, arm_compare_op1,
        !          3562:                                 arm_compare_fp);
        !          3563: }
        !          3564: ")
        !          3565: 
        !          3566: (define_expand "sge"
        !          3567:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3568:        (ge:SI (match_dup 1) (const_int 0)))]
        !          3569:   ""
        !          3570:   "
        !          3571: {
        !          3572:   operands[1] = gen_compare_reg (GE, arm_compare_op0, arm_compare_op1,
        !          3573:                                 arm_compare_fp);
        !          3574: }
        !          3575: ")
        !          3576: 
        !          3577: (define_expand "slt"
        !          3578:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3579:        (lt:SI (match_dup 1) (const_int 0)))]
        !          3580:   ""
        !          3581:   "
        !          3582: {
        !          3583:   operands[1] = gen_compare_reg (LT, arm_compare_op0, arm_compare_op1,
        !          3584:                                 arm_compare_fp);
        !          3585: }
        !          3586: ")
        !          3587: 
        !          3588: (define_expand "sgtu"
        !          3589:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3590:        (gtu:SI (match_dup 1) (const_int 0)))]
        !          3591:   ""
        !          3592:   "
        !          3593: {
        !          3594:   operands[1] = gen_compare_reg (GTU, arm_compare_op0, arm_compare_op1,
        !          3595:                                 arm_compare_fp);
        !          3596: }
        !          3597: ")
        !          3598: 
        !          3599: (define_expand "sleu"
        !          3600:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3601:        (leu:SI (match_dup 1) (const_int 0)))]
        !          3602:   ""
        !          3603:   "
        !          3604: {
        !          3605:   operands[1] = gen_compare_reg (LEU, arm_compare_op0, arm_compare_op1,
        !          3606:                                 arm_compare_fp);
        !          3607: }
        !          3608: ")
        !          3609: 
        !          3610: (define_expand "sgeu"
        !          3611:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3612:        (geu:SI (match_dup 1) (const_int 0)))]
        !          3613:   ""
        !          3614:   "
        !          3615: {
        !          3616:   operands[1] = gen_compare_reg (GEU, arm_compare_op0, arm_compare_op1,
        !          3617:                                 arm_compare_fp);
        !          3618: }
        !          3619: ")
        !          3620: 
        !          3621: (define_expand "sltu"
        !          3622:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3623:        (ltu:SI (match_dup 1) (const_int 0)))]
        !          3624:   ""
        !          3625:   "
        !          3626: {
        !          3627:   operands[1] = gen_compare_reg (LTU, arm_compare_op0, arm_compare_op1,
        !          3628:                                 arm_compare_fp);
        !          3629: }
        !          3630: ")
        !          3631: 
        !          3632: (define_insn ""
        !          3633:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3634:        (match_operator:SI 1 "comparison_operator" [(reg 24) (const_int 0)]))]
        !          3635:   ""
        !          3636:   "*
        !          3637:   arm_output_asm_insn (\"mov%d1\\t%0, #1\", operands);
        !          3638:   return arm_output_asm_insn (\"mov%D1\\t%0, #0\", operands);
        !          3639: "
        !          3640: [(set_attr "conds" "use")
        !          3641:  (set_attr "length" "2")])
        !          3642: 
        !          3643: (define_insn ""
        !          3644:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3645:        (neg:SI (match_operator:SI 1 "comparison_operator"
        !          3646:                 [(reg 24) (const_int 0)])))]
        !          3647:   ""
        !          3648:   "*
        !          3649:   arm_output_asm_insn (\"mvn%d1\\t%0, #0\", operands);
        !          3650:   return arm_output_asm_insn (\"mov%D1\\t%0, #0\", operands);
        !          3651: "
        !          3652: [(set_attr "conds" "use")
        !          3653:  (set_attr "length" "2")])
        !          3654: 
        !          3655: (define_insn ""
        !          3656:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3657:        (not:SI (match_operator:SI 1 "comparison_operator"
        !          3658:                 [(reg 24) (const_int 0)])))]
        !          3659:   ""
        !          3660:   "*
        !          3661:   arm_output_asm_insn (\"mvn%d1\\t%0, #1\", operands);
        !          3662:   return arm_output_asm_insn (\"mov%D1\\t%0, #0\", operands);
        !          3663: "
        !          3664: [(set_attr "conds" "use")
        !          3665:  (set_attr "length" "2")])
        !          3666: 
        !          3667: 
        !          3668: ;; Jump and linkage insns
        !          3669: 
        !          3670: (define_insn "jump"
        !          3671:   [(set (pc)
        !          3672:        (label_ref (match_operand 0 "" "")))]
        !          3673:   ""
        !          3674:   "*
        !          3675: {
        !          3676:   extern int arm_ccfsm_state;
        !          3677: 
        !          3678:   if (arm_ccfsm_state == 1 || arm_ccfsm_state == 2)
        !          3679:   {
        !          3680:     arm_ccfsm_state += 2;
        !          3681:     return \"\";
        !          3682:   }
        !          3683:   return (arm_output_asm_insn (\"b\\t%l0\", operands));
        !          3684: }")
        !          3685: 
        !          3686: (define_expand "call"
        !          3687:   [(parallel [(call (match_operand 0 "memory_operand" "")
        !          3688:                    (match_operand 1 "general_operand" ""))
        !          3689:              (clobber (reg:SI 14))])]
        !          3690:   ""
        !          3691:   "")
        !          3692: 
        !          3693: (define_insn ""
        !          3694:   [(call (mem:SI (match_operand:SI 0 "s_register_operand" "r"))
        !          3695:          (match_operand 1 "" "g"))
        !          3696:    (clobber (reg:SI 14))]
        !          3697:   ""
        !          3698:   "*
        !          3699:   return (output_call (operands));
        !          3700: "
        !          3701: [(set (attr "conds")
        !          3702:       (if_then_else (eq_attr "cpu" "arm6")
        !          3703:                    (const_string "clob")
        !          3704:                    (const_string "nocond")))
        !          3705: ;; length is worst case, normally it is only two
        !          3706:  (set_attr "length" "3")
        !          3707:  (set_attr "type" "call")])
        !          3708: 
        !          3709: (define_insn ""
        !          3710:   [(call (mem:SI (match_operand 0 "memory_operand" "m"))
        !          3711:         (match_operand 1 "general_operand" "g"))
        !          3712:    (clobber (reg:SI 14))]
        !          3713:   ""
        !          3714:   "*
        !          3715:   return (output_call_mem (operands));
        !          3716: "
        !          3717: [(set (attr "conds")
        !          3718:       (if_then_else (eq_attr "cpu" "arm6")
        !          3719:                    (const_string "clob")
        !          3720:                    (const_string "nocond")))
        !          3721:  (set_attr "length" "3")
        !          3722:  (set_attr "type" "call")])
        !          3723: 
        !          3724: (define_expand "call_value"
        !          3725:   [(parallel [(set (match_operand 0 "" "=rf")
        !          3726:                   (call (match_operand 1 "memory_operand" "m")
        !          3727:                         (match_operand 2 "general_operand" "g")))
        !          3728:              (clobber (reg:SI 14))])]
        !          3729:   ""
        !          3730:   "")
        !          3731: 
        !          3732: (define_insn ""
        !          3733:   [(set (match_operand 0 "" "=rf")
        !          3734:         (call (mem:SI (match_operand:SI 1 "s_register_operand" "r"))
        !          3735:              (match_operand 2 "general_operand" "g")))
        !          3736:    (clobber (reg:SI 14))]
        !          3737:   ""
        !          3738:   "*
        !          3739:   return (output_call (&operands[1]));
        !          3740: "
        !          3741: [(set (attr "conds")
        !          3742:       (if_then_else (eq_attr "cpu" "arm6")
        !          3743:                    (const_string "clob")
        !          3744:                    (const_string "nocond")))
        !          3745:  (set_attr "length" "3")
        !          3746:  (set_attr "type" "call")])
        !          3747: 
        !          3748: (define_insn ""
        !          3749:   [(set (match_operand 0 "" "=rf")
        !          3750:        (call (mem:SI (match_operand 1 "memory_operand" "m"))
        !          3751:        (match_operand 2 "general_operand" "g")))
        !          3752:    (clobber (reg:SI 14))]
        !          3753:   "! CONSTANT_ADDRESS_P (XEXP (operands[1], 0))"
        !          3754:   "*
        !          3755:   return (output_call_mem (&operands[1]));
        !          3756: "
        !          3757: [(set (attr "conds")
        !          3758:       (if_then_else (eq_attr "cpu" "arm6")
        !          3759:                    (const_string "clob")
        !          3760:                    (const_string "nocond")))
        !          3761:  (set_attr "length" "3")
        !          3762:  (set_attr "type" "call")])
        !          3763: 
        !          3764: ;; Allow calls to SYMBOL_REFs specially as they are not valid general addresses
        !          3765: ;; The 'a' causes the operand to be treated as an address, i.e. no '#' output.
        !          3766: 
        !          3767: (define_insn ""
        !          3768:   [(call (mem:SI (match_operand:SI 0 "" "i"))
        !          3769:         (match_operand:SI 1 "general_operand" "g"))
        !          3770:    (clobber (reg:SI 14))]
        !          3771:   "GET_CODE (operands[0]) == SYMBOL_REF"
        !          3772:   "*
        !          3773:   return (arm_output_asm_insn (\"bl\\t%a0\", operands));
        !          3774: "
        !          3775: [(set (attr "conds")
        !          3776:       (if_then_else (eq_attr "cpu" "arm6")
        !          3777:                    (const_string "clob")
        !          3778:                    (const_string "nocond")))
        !          3779:  (set_attr "type" "call")])
        !          3780: 
        !          3781: (define_insn ""
        !          3782:   [(set (match_operand 0 "s_register_operand" "=rf")
        !          3783:        (call (mem:SI (match_operand:SI 1 "" "i"))
        !          3784:        (match_operand:SI 2 "general_operand" "g")))
        !          3785:    (clobber (reg:SI 14))]
        !          3786:   "GET_CODE(operands[1]) == SYMBOL_REF"
        !          3787:   "*
        !          3788:   return (arm_output_asm_insn (\"bl\\t%a1\", operands));
        !          3789: "
        !          3790: [(set (attr "conds")
        !          3791:       (if_then_else (eq_attr "cpu" "arm6")
        !          3792:                    (const_string "clob")
        !          3793:                    (const_string "nocond")))
        !          3794:  (set_attr "type" "call")])
        !          3795: 
        !          3796: ;; Often the return insn will be the same as loading from memory, so set attr
        !          3797: (define_insn "return"
        !          3798:   [(return)]
        !          3799:   "USE_RETURN_INSN"
        !          3800:   "*
        !          3801: {
        !          3802:   extern int arm_ccfsm_state;
        !          3803: 
        !          3804:   if (arm_ccfsm_state == 2)
        !          3805:   {
        !          3806:     arm_ccfsm_state += 2;
        !          3807:     return \"\";
        !          3808:   }
        !          3809:   return output_return_instruction (NULL, TRUE);
        !          3810: }"
        !          3811: [(set_attr "type" "load")])
        !          3812: 
        !          3813: (define_insn ""
        !          3814:   [(set (pc)
        !          3815:         (if_then_else (match_operator 0 "comparison_operator"
        !          3816:                       [(reg 24) (const_int 0)])
        !          3817:                       (return)
        !          3818:                       (pc)))]
        !          3819:   "USE_RETURN_INSN"
        !          3820:   "*
        !          3821: {
        !          3822:   extern int arm_ccfsm_state;
        !          3823: 
        !          3824:   if (arm_ccfsm_state == 2)
        !          3825:   {
        !          3826:     arm_ccfsm_state += 2;
        !          3827:     return \"\";
        !          3828:   }
        !          3829:   return output_return_instruction (operands[0], TRUE);
        !          3830: }"
        !          3831: [(set_attr "conds" "use")
        !          3832:  (set_attr "type" "load")])
        !          3833: 
        !          3834: (define_insn ""
        !          3835:   [(set (pc)
        !          3836:         (if_then_else (match_operator 0 "comparison_operator"
        !          3837:                       [(reg 24) (const_int 0)])
        !          3838:                       (pc)
        !          3839:                      (return)))]
        !          3840:   "USE_RETURN_INSN"
        !          3841:   "*
        !          3842: {
        !          3843:   extern int arm_ccfsm_state;
        !          3844: 
        !          3845:   if (arm_ccfsm_state == 2)
        !          3846:   {
        !          3847:     arm_ccfsm_state += 2;
        !          3848:     return \"\";
        !          3849:   }
        !          3850:   return output_return_instruction 
        !          3851:        (gen_rtx (reverse_condition (GET_CODE (operands[0])),
        !          3852:                  GET_MODE (operands[0]), XEXP (operands[0], 0),
        !          3853:                  XEXP (operands[0], 1)),
        !          3854:         TRUE);
        !          3855: }"
        !          3856: [(set_attr "conds" "use")
        !          3857:  (set_attr "type" "load")])
        !          3858: 
        !          3859: ;; Call subroutine returning any type.
        !          3860: 
        !          3861: (define_expand "untyped_call"
        !          3862:   [(parallel [(call (match_operand 0 "" "")
        !          3863:                    (const_int 0))
        !          3864:              (match_operand 1 "" "")
        !          3865:              (match_operand 2 "" "")])]
        !          3866:   ""
        !          3867:   "
        !          3868: {
        !          3869:   int i;
        !          3870: 
        !          3871:   emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
        !          3872: 
        !          3873:   for (i = 0; i < XVECLEN (operands[2], 0); i++)
        !          3874:     {
        !          3875:       rtx set = XVECEXP (operands[2], 0, i);
        !          3876:       emit_move_insn (SET_DEST (set), SET_SRC (set));
        !          3877:     }
        !          3878: 
        !          3879:   /* The optimizer does not know that the call sets the function value
        !          3880:      registers we stored in the result block.  We avoid problems by
        !          3881:      claiming that all hard registers are used and clobbered at this
        !          3882:      point.  */
        !          3883:   emit_insn (gen_blockage ());
        !          3884: 
        !          3885:   DONE;
        !          3886: }")
        !          3887: 
        !          3888: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
        !          3889: ;; all of memory.  This blocks insns from being moved across this point.
        !          3890: 
        !          3891: (define_insn "blockage"
        !          3892:   [(unspec_volatile [(const_int 0)] 0)]
        !          3893:   ""
        !          3894:   ""
        !          3895: [(set_attr "length" "0")
        !          3896:  (set_attr "type" "block")])
        !          3897: 
        !          3898: (define_insn "tablejump"
        !          3899:   [(set (pc)
        !          3900:        (match_operand:SI 0 "s_register_operand" "r"))
        !          3901:    (use (label_ref (match_operand 1 "" "")))]
        !          3902:   ""
        !          3903:   "*
        !          3904:   return arm_output_asm_insn (\"mov\\tpc, %0\\t@ table jump, label %l1\",
        !          3905:                              operands);
        !          3906: ")
        !          3907: 
        !          3908: (define_insn ""
        !          3909:   [(set (pc)
        !          3910:        (match_operand:SI 0 "memory_operand" "m"))
        !          3911:    (use (label_ref (match_operand 1 "" "")))]
        !          3912:   ""
        !          3913:   "*
        !          3914:   return arm_output_asm_insn (\"ldr\\tpc, %0\\t@ table jump, label %l1\",
        !          3915:                              operands);
        !          3916: "
        !          3917: [(set_attr "type" "load")])
        !          3918: 
        !          3919: (define_insn "indirect_jump"
        !          3920:   [(set (pc)
        !          3921:        (match_operand:SI 0 "s_register_operand" "r"))]
        !          3922:   ""
        !          3923:   "*
        !          3924:   return arm_output_asm_insn (\"mov\\tpc, %0\\t@ indirect jump\", operands);
        !          3925: ")
        !          3926: 
        !          3927: (define_insn ""
        !          3928:   [(set (pc)
        !          3929:        (match_operand:SI 0 "memory_operand" "m"))]
        !          3930:   ""
        !          3931:   "*
        !          3932:   return arm_output_asm_insn (\"ldr\\tpc, %0\\t@ indirect jump\", operands);
        !          3933: "
        !          3934: [(set_attr "type" "load")])
        !          3935: 
        !          3936: ;; Misc insns
        !          3937: 
        !          3938: (define_insn "nop"
        !          3939:   [(const_int 0)]
        !          3940:   ""
        !          3941:   "*
        !          3942:   return arm_output_asm_insn (\"mov\\tr0, r0\\t@ nop\", operands);
        !          3943: ")
        !          3944: 
        !          3945: ;; Patterns to allow combination of arithmetic, cond code and shifts
        !          3946: 
        !          3947: (define_insn ""
        !          3948:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3949:         (match_operator:SI 1 "shiftable_operator"
        !          3950:           [(match_operator:SI 3 "shift_operator"
        !          3951:              [(match_operand:SI 4 "s_register_operand" "r")
        !          3952:               (match_operand:SI 5 "nonmemory_operand" "rI")])
        !          3953:            (match_operand:SI 2 "s_register_operand" "r")]))]
        !          3954:   ""
        !          3955:   "*
        !          3956:   return (output_arithmetic_with_shift (operands, TRUE, FALSE));
        !          3957: ")
        !          3958: 
        !          3959: (define_insn ""
        !          3960:   [(set (reg:CC_NOOV 24)
        !          3961:         (compare:CC_NOOV (match_operator:SI 1 "shiftable_operator"
        !          3962:                          [(match_operator:SI 3 "shift_operator"
        !          3963:                            [(match_operand:SI 4 "s_register_operand" "r")
        !          3964:                             (match_operand:SI 5 "nonmemory_operand" "rI")])
        !          3965:                           (match_operand:SI 2 "s_register_operand" "r")])
        !          3966:                         (const_int 0)))
        !          3967:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          3968:        (match_op_dup 1 [(match_op_dup 3 [(match_dup 4) (match_dup 5)])
        !          3969:                         (match_dup 2)]))]
        !          3970:   ""
        !          3971:   "*
        !          3972:   return (output_arithmetic_with_shift (operands, TRUE, TRUE));
        !          3973: "
        !          3974: [(set_attr "conds" "set")])
        !          3975: 
        !          3976: (define_insn ""
        !          3977:   [(set (reg:CC_NOOV 24)
        !          3978:         (compare:CC_NOOV (match_operator:SI 1 "shiftable_operator"
        !          3979:                          [(match_operator:SI 3 "shift_operator"
        !          3980:                            [(match_operand:SI 4 "s_register_operand" "r")
        !          3981:                             (match_operand:SI 5 "nonmemory_operand" "rI")])
        !          3982:                           (match_operand:SI 2 "s_register_operand" "r")])
        !          3983:                         (const_int 0)))
        !          3984:    (clobber (match_scratch:SI 0 "=r"))]
        !          3985:   ""
        !          3986:   "*
        !          3987:   return (output_arithmetic_with_shift (operands, TRUE, TRUE));
        !          3988: "
        !          3989: [(set_attr "conds" "set")])
        !          3990: 
        !          3991: (define_insn ""
        !          3992:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          3993:        (minus:SI (match_operand:SI 1 "s_register_operand" "r")
        !          3994:                  (match_operator:SI 2 "shift_operator"
        !          3995:                   [(match_operand:SI 3 "s_register_operand" "r")
        !          3996:                    (match_operand:SI 4 "nonmemory_operand" "rn")])))]
        !          3997:   ""
        !          3998:   "*
        !          3999: {
        !          4000:   rtx ops[6];
        !          4001: 
        !          4002:   ops[0] = operands[0];
        !          4003:   ops[1] = gen_rtx (MINUS, SImode, operands[1], operands[2]);
        !          4004:   ops[2] = operands[1];
        !          4005:   ops[3] = operands[2];
        !          4006:   ops[4] = operands[3];
        !          4007:   ops[5] = operands[4];
        !          4008:   return output_arithmetic_with_shift (ops, FALSE, FALSE);
        !          4009: }
        !          4010: ")
        !          4011: 
        !          4012: (define_insn ""
        !          4013:   [(set (reg:CC_NOOV 24)
        !          4014:        (compare:CC_NOOV (minus:SI (match_operand:SI 1 "s_register_operand" "r")
        !          4015:                                   (match_operator:SI 2 "shift_operator"
        !          4016:                                    [(match_operand:SI 3 "s_register_operand" "r")
        !          4017:                                     (match_operand:SI 4 "nonmemory_operand" "rn")]))
        !          4018:                         (const_int 0)))
        !          4019:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          4020:        (minus:SI (match_dup 1) (match_op_dup 2 [(match_dup 3)
        !          4021:                                                 (match_dup 4)])))]
        !          4022:   ""
        !          4023:   "*
        !          4024: {
        !          4025:   rtx ops[6];
        !          4026: 
        !          4027:   ops[0] = operands[0];
        !          4028:   ops[1] = gen_rtx (MINUS, SImode, operands[1], operands[2]);
        !          4029:   ops[2] = operands[1];
        !          4030:   ops[3] = operands[2];
        !          4031:   ops[4] = operands[3];
        !          4032:   ops[5] = operands[4];
        !          4033:   return output_arithmetic_with_shift (ops, FALSE, TRUE);
        !          4034: }
        !          4035: "
        !          4036: [(set_attr "conds" "set")])
        !          4037: 
        !          4038: (define_insn ""
        !          4039:   [(set (reg:CC_NOOV 24)
        !          4040:        (compare:CC_NOOV (minus:SI (match_operand:SI 1 "s_register_operand" "r")
        !          4041:                                   (match_operator:SI 2 "shift_operator"
        !          4042:                                    [(match_operand:SI 3 "s_register_operand" "r")
        !          4043:                                     (match_operand:SI 4 "nonmemory_operand" "rn")]))
        !          4044:                         (const_int 0)))
        !          4045:    (clobber (match_scratch:SI 0 "=r"))]
        !          4046:   ""
        !          4047:   "*
        !          4048: {
        !          4049:   rtx ops[6];
        !          4050: 
        !          4051:   ops[0] = operands[0];
        !          4052:   ops[1] = gen_rtx (MINUS, SImode, operands[1], operands[2]);
        !          4053:   ops[2] = operands[1];
        !          4054:   ops[3] = operands[2];
        !          4055:   ops[4] = operands[3];
        !          4056:   ops[5] = operands[4];
        !          4057:   return output_arithmetic_with_shift (ops, FALSE, TRUE);
        !          4058: }
        !          4059: "
        !          4060: [(set_attr "conds" "set")])
        !          4061: 
        !          4062: ;; These variants of the above insns can occur if the first operand is the
        !          4063: ;; frame pointer and we eliminate that.  This is a kludge, but there doesn't
        !          4064: ;; seem to be a way around it.  Most of the predicates have to be null
        !          4065: ;; because the format can be generated part way through reload, so
        !          4066: ;; if we don't match it as soon as it becomes available, reload doesn't know
        !          4067: ;; how to reload pseudos that haven't got hard registers; the constraints will
        !          4068: ;; sort everything out.
        !          4069: 
        !          4070: (define_insn ""
        !          4071:   [(set (match_operand:SI 0 "" "=&r")
        !          4072:        (plus:SI (plus:SI (match_operator:SI 5 "shift_operator"
        !          4073:                           [(match_operand:SI 3 "" "r")
        !          4074:                            (match_operand:SI 4 "" "rn")])
        !          4075:                          (match_operand:SI 2 "" "r"))
        !          4076:                 (match_operand:SI 1 "const_int_operand" "n")))]
        !          4077:   "reload_in_progress"
        !          4078:   "*
        !          4079: {
        !          4080:   char instr[100];
        !          4081:   sprintf (instr, \"add\\t%%0, %%2, %%3, %s %%4\", 
        !          4082:           shift_instr (GET_CODE (operands[5]), &operands[4]));
        !          4083:   arm_output_asm_insn (instr, operands);
        !          4084:   operands[2] = operands[1];
        !          4085:   operands[1] = operands[0];
        !          4086:   return output_add_immediate (operands);
        !          4087: }"
        !          4088: ; we have no idea how long the add_immediate is, it could be up to 4.
        !          4089: [(set_attr "length" "5")])
        !          4090: 
        !          4091: (define_insn ""
        !          4092:   [(set (reg:CC_NOOV 24)
        !          4093:        (compare:CC_NOOV (plus:SI
        !          4094:                          (plus:SI 
        !          4095:                           (match_operator:SI 5 "shift_operator"
        !          4096:                            [(match_operand:SI 3 "" "r")
        !          4097:                             (match_operand:SI 4 "" "rn")])
        !          4098:                           (match_operand:SI 1 "" "r"))
        !          4099:                          (match_operand:SI 2 "const_int_operand" "n"))
        !          4100:                         (const_int 0)))
        !          4101:    (set (match_operand:SI 0 "" "=&r")
        !          4102:        (plus:SI (plus:SI (match_op_dup 5 [(match_dup 3) (match_dup 4)])
        !          4103:                          (match_dup 1))
        !          4104:                 (match_dup 2)))]
        !          4105:   "reload_in_progress"
        !          4106:   "*
        !          4107: {
        !          4108:   char instr[100];
        !          4109:   sprintf (instr, \"adds\\t%%0, %%0, %%3, %s %%4\",
        !          4110:           shift_instr (GET_CODE (operands[5]), &operands[4]));
        !          4111:   output_add_immediate (operands);
        !          4112:   return arm_output_asm_insn (instr, operands);
        !          4113: }"
        !          4114: [(set_attr "conds" "set")
        !          4115:  (set_attr "length" "5")])
        !          4116: 
        !          4117: (define_insn ""
        !          4118:   [(set (reg:CC_NOOV 24)
        !          4119:        (compare:CC_NOOV (plus:SI
        !          4120:                          (plus:SI 
        !          4121:                           (match_operator:SI 5 "shift_operator"
        !          4122:                            [(match_operand:SI 3 "" "r")
        !          4123:                             (match_operand:SI 4 "" "rn")])
        !          4124:                           (match_operand:SI 1 "" "r"))
        !          4125:                          (match_operand:SI 2 "const_int_operand" "n"))
        !          4126:                         (const_int 0)))
        !          4127:    (clobber (match_scratch:SI 0 "=&r"))]
        !          4128:   "reload_in_progress"
        !          4129:   "*
        !          4130: {
        !          4131:   char instr[100];
        !          4132:   sprintf (instr, \"adds\\t%%0, %%0, %%3, %s %%4\",
        !          4133:           shift_instr (GET_CODE (operands[5]), &operands[4]));
        !          4134:   output_add_immediate (operands);
        !          4135:   return arm_output_asm_insn (instr, operands);
        !          4136: }"
        !          4137: [(set_attr "conds" "set")
        !          4138:  (set_attr "length" "5")])
        !          4139: 
        !          4140: ;; These are similar, but are needed when the mla pattern contains the
        !          4141: ;; eliminated register as operand 3.
        !          4142: 
        !          4143: (define_insn ""
        !          4144:   [(set (match_operand:SI 0 "" "=&r,&r")
        !          4145:        (plus:SI (plus:SI (mult:SI (match_operand:SI 1 "" "%0,r")
        !          4146:                                   (match_operand:SI 2 "" "r,r"))
        !          4147:                          (match_operand:SI 3 "" "r,r"))
        !          4148:                 (match_operand:SI 4 "const_int_operand" "n,n")))]
        !          4149:   "reload_in_progress"
        !          4150:   "*
        !          4151:   arm_output_asm_insn (\"mla\\t%0, %2, %1, %3\", operands);
        !          4152:   operands[2] = operands[4];
        !          4153:   operands[1] = operands[0];
        !          4154:   return output_add_immediate (operands);
        !          4155: "
        !          4156: [(set_attr "length" "5")])
        !          4157: 
        !          4158: (define_insn ""
        !          4159:   [(set (reg:CC_NOOV 24)
        !          4160:        (compare:CC_NOOV (plus:SI (plus:SI (mult:SI
        !          4161:                                            (match_operand:SI 3 "" "r")
        !          4162:                                            (match_operand:SI 4 "" "r"))
        !          4163:                                           (match_operand:SI 1 "" "r"))
        !          4164:                                  (match_operand:SI 2 "const_int_operand" "n"))
        !          4165:                         (const_int 0)))
        !          4166:    (set (match_operand:SI 0 "" "=&r")
        !          4167:        (plus:SI (plus:SI (mult:SI (match_dup 3) (match_dup 4)) (match_dup 1))
        !          4168:                 (match_dup 2)))]
        !          4169:   "reload_in_progress"
        !          4170:   "*
        !          4171:   output_add_immediate (operands);
        !          4172:   return arm_output_asm_insn (\"mlas\\t%0, %3, %4, %0\", operands);
        !          4173: "
        !          4174: [(set_attr "length" "5")
        !          4175:  (set_attr "conds" "set")])
        !          4176: 
        !          4177: (define_insn ""
        !          4178:   [(set (reg:CC_NOOV 24)
        !          4179:        (compare:CC_NOOV (plus:SI (plus:SI (mult:SI
        !          4180:                                            (match_operand:SI 3 "" "r")
        !          4181:                                            (match_operand:SI 4 "" "r"))
        !          4182:                                           (match_operand:SI 1 "" "r"))
        !          4183:                                  (match_operand:SI 2 "const_int_operand" "n"))
        !          4184:                         (const_int 0)))
        !          4185:    (clobber (match_scratch:SI 0 "=&r"))]
        !          4186:   "reload_in_progress"
        !          4187:   "*
        !          4188:   output_add_immediate (operands);
        !          4189:   return arm_output_asm_insn (\"mlas\\t%0, %3, %4, %0\", operands);
        !          4190: "
        !          4191: [(set_attr "length" "5")
        !          4192:  (set_attr "conds" "set")])
        !          4193: 
        !          4194: 
        !          4195: 
        !          4196: 
        !          4197: (define_insn ""
        !          4198:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          4199:        (and:SI (match_operator 1 "comparison_operator"
        !          4200:                 [(reg 24) (const_int 0)])
        !          4201:                (match_operand:SI 2 "s_register_operand" "r")))]
        !          4202:   ""
        !          4203:   "*
        !          4204:   arm_output_asm_insn (\"mov%D1\\t%0, #0\", operands);
        !          4205:   return arm_output_asm_insn (\"and%d1\\t%0, %2, #1\", operands);
        !          4206: "
        !          4207: [(set_attr "conds" "use")
        !          4208:  (set_attr "length" "2")])
        !          4209: 
        !          4210: (define_insn ""
        !          4211:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          4212:        (ior:SI (match_operator 2 "comparison_operator"
        !          4213:                 [(reg 24) (const_int 0)])
        !          4214:                (match_operand:SI 1 "s_register_operand" "0,?r")))]
        !          4215:   ""
        !          4216:   "*
        !          4217:   if (which_alternative != 0)
        !          4218:     arm_output_asm_insn (\"mov%D2\\t%0, %1\", operands);
        !          4219:   return arm_output_asm_insn (\"orr%d2\\t%0, %1, #1\", operands);
        !          4220: "
        !          4221: [(set_attr "conds" "use")
        !          4222:  (set_attr "length" "1,2")])
        !          4223: 
        !          4224: (define_insn ""
        !          4225:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          4226:        (match_operator 1 "comparison_operator"
        !          4227:         [(match_operand:SI 2 "s_register_operand" "r")
        !          4228:          (match_operand:SI 3 "arm_add_operand" "rL")]))
        !          4229:    (clobber (reg 24))]
        !          4230:   ""
        !          4231:   "*
        !          4232:   if (GET_CODE (operands[1]) == LT && operands[3] == const0_rtx)
        !          4233:     return arm_output_asm_insn (\"mov\\t%0, %2, lsr #31\", operands);
        !          4234:   if (GET_CODE (operands[1]) == GE && operands[3] == const0_rtx)
        !          4235:     {
        !          4236:       arm_output_asm_insn (\"mvn\\t%0, %2\", operands);
        !          4237:       return arm_output_asm_insn (\"mov\\t%0, %0, lsr #31\", operands);
        !          4238:     }
        !          4239:   if (GET_CODE (operands[1]) == NE)
        !          4240:     {
        !          4241:       if (GET_CODE (operands[3]) == CONST_INT
        !          4242:          && !const_ok_for_arm (INTVAL (operands[3])))
        !          4243:        arm_output_asm_insn (\"adds\\t%0, %2, #%n3\", operands);
        !          4244:       else
        !          4245:         arm_output_asm_insn (\"subs\\t%0, %2, %3\", operands);
        !          4246:       return arm_output_asm_insn (\"movne\\t%0, #1\", operands);
        !          4247:     }
        !          4248:   if (GET_CODE (operands[3]) == CONST_INT
        !          4249:       && !const_ok_for_arm (INTVAL (operands[3])))
        !          4250:     arm_output_asm_insn (\"cmn\\t%2, #%n3\", operands);
        !          4251:   else
        !          4252:     arm_output_asm_insn (\"cmp\\t%2, %3\", operands);
        !          4253:   arm_output_asm_insn (\"mov%D1\\t%0, #0\", operands);
        !          4254:   return arm_output_asm_insn (\"mov%d1\\t%0, #1\", operands);
        !          4255: "
        !          4256: [(set_attr "conds" "clob")
        !          4257:  (set_attr "length" "3")])
        !          4258: 
        !          4259: (define_insn ""
        !          4260:   [(set (match_operand:SI 0 "s_register_operand" "=&r")
        !          4261:        (ior:SI (match_operator 1 "comparison_operator"
        !          4262:                 [(match_operand:SI 2 "s_register_operand" "r")
        !          4263:                  (match_operand:SI 3 "arm_rhs_operand" "rI")])
        !          4264:                (match_operator 4 "comparison_operator"
        !          4265:                 [(match_operand:SI 5 "s_register_operand" "r")
        !          4266:                  (match_operand:SI 6 "arm_rhs_operand" "rI")])))
        !          4267:    (clobber (reg 24))]
        !          4268:   ""
        !          4269:   "*
        !          4270: {
        !          4271:   int dominant = comparison_dominates_p (GET_CODE (operands[4]),
        !          4272:                                         GET_CODE (operands[1]));
        !          4273: 
        !          4274:   arm_output_asm_insn (dominant ? \"cmp\\t%5, %6\" : \"cmp\\t%2, %3\",
        !          4275:                       operands);
        !          4276:   arm_output_asm_insn (\"mov\\t%0, #0\", operands);
        !          4277:   if (GET_CODE (operands[1]) == GET_CODE (operands[4])
        !          4278:       || comparison_dominates_p (GET_CODE (operands[1]),
        !          4279:                                 GET_CODE (operands[4]))
        !          4280:       || dominant)
        !          4281:     {
        !          4282:       arm_output_asm_insn (dominant ? \"cmp%D4\\t%2, %3\" : \"cmp%D1\\t%5,%6\",
        !          4283:                           operands);
        !          4284:     }
        !          4285:   else
        !          4286:     {
        !          4287:       arm_output_asm_insn (\"mov%d1\\t%0, #1\", operands);
        !          4288:       arm_output_asm_insn (\"cmp\\t%5, %6\", operands);
        !          4289:     }
        !          4290:   return arm_output_asm_insn (dominant ? \"mov%d1\\t%0, #1\"
        !          4291:                              : \"mov%d4\\t%0, #1\", operands);
        !          4292: }
        !          4293: "
        !          4294: [(set_attr "conds" "clob")
        !          4295: ; worst case length
        !          4296:  (set_attr "length" "5")])
        !          4297: 
        !          4298: (define_split
        !          4299:   [(set (pc)
        !          4300:        (if_then_else (match_operator 5 "equality_operator"
        !          4301:                       [(ior:SI (match_operator 6 "comparison_operator"
        !          4302:                                 [(match_operand:SI 0 "s_register_operand" "r")
        !          4303:                                  (match_operand:SI 1 "arm_add_operand" "rL")])
        !          4304:                                (match_operator 7 "comparison_operator"
        !          4305:                                 [(match_operand:SI 2 "s_register_operand" "r")
        !          4306:                                  (match_operand:SI 3 "arm_add_operand" "rL")]))
        !          4307:                        (const_int 0)])
        !          4308:                      (label_ref (match_operand 4 "" ""))
        !          4309:                      (pc)))
        !          4310:    (clobber (reg 24))]
        !          4311:   "(GET_CODE (operands[6]) == GET_CODE (operands[7])
        !          4312:     || comparison_dominates_p (GET_CODE (operands[6]), GET_CODE (operands[7]))
        !          4313:     || comparison_dominates_p (GET_CODE (operands[7]), GET_CODE (operands[6])))"
        !          4314:   [(set (reg:CC 24)
        !          4315:        (compare:CC (ior:CC (match_op_dup 6
        !          4316:                             [(match_dup 0) (match_dup 1)])
        !          4317:                            (match_op_dup 7
        !          4318:                             [(match_dup 2) (match_dup 3)]))
        !          4319:                    (const_int 0)))
        !          4320:    (set (pc)
        !          4321:         (if_then_else (match_op_dup 5 [(reg:CC 24) (const_int 0)])
        !          4322:                      (label_ref (match_dup 4))
        !          4323:                      (pc)))]
        !          4324:   "
        !          4325: {
        !          4326:   enum rtx_code code = comparison_dominates_p (GET_CODE (operands[6]),
        !          4327:                                               GET_CODE (operands[7]))
        !          4328:                       ? GET_CODE (operands[7]) : GET_CODE (operands[6]);
        !          4329: 
        !          4330:   if (GET_CODE (operands[5]) == NE)
        !          4331:     operands[5] = gen_rtx (code, CCmode,
        !          4332:                           XEXP (operands[5], 0), XEXP (operands[5], 1));
        !          4333:   else
        !          4334:     operands[5] = gen_rtx (reverse_condition (code), CCmode,
        !          4335:                           XEXP (operands[5], 0), XEXP (operands[5], 1));
        !          4336: }
        !          4337: ")
        !          4338: 
        !          4339: ;; Don't match these patterns if we can use a conditional compare, since they
        !          4340: ;; tell the final prescan branch elimator code that full branch inlining
        !          4341: ;; can't be done.
        !          4342: 
        !          4343: (define_insn ""
        !          4344:   [(set (pc)
        !          4345:        (if_then_else (ne
        !          4346:                       (ior:SI (match_operator 5 "comparison_operator"
        !          4347:                                [(match_operand:SI 0 "s_register_operand" "r")
        !          4348:                                 (match_operand:SI 1 "arm_add_operand" "rL")])
        !          4349:                               (match_operator 6 "comparison_operator"
        !          4350:                                [(match_operand:SI 2 "s_register_operand" "r")
        !          4351:                                 (match_operand:SI 3 "arm_rhs_operand" "rL")]))
        !          4352:                       (const_int 0))
        !          4353:                      (label_ref (match_operand 4 "" ""))
        !          4354:                      (pc)))
        !          4355:    (clobber (reg 24))]
        !          4356:   "!(GET_CODE (operands[5]) == GET_CODE (operands[6])
        !          4357:      || comparison_dominates_p (GET_CODE (operands[5]), GET_CODE (operands[6]))
        !          4358:      || comparison_dominates_p (GET_CODE (operands[6]), GET_CODE (operands[5])))"
        !          4359:   "*
        !          4360: {
        !          4361:   extern int arm_ccfsm_state;
        !          4362: 
        !          4363:   if (GET_CODE (operands[1]) == CONST_INT
        !          4364:       && !const_ok_for_arm (INTVAL (operands[1])))
        !          4365:     arm_output_asm_insn (\"cmn\\t%0, #%n1\", operands);
        !          4366:   else
        !          4367:     arm_output_asm_insn (\"cmp\\t%0, %1\", operands);
        !          4368:   arm_output_asm_insn (\"b%d5\\t%l4\", operands);
        !          4369:   if (GET_CODE (operands[3]) == CONST_INT
        !          4370:       && !const_ok_for_arm (INTVAL (operands[3])))
        !          4371:     arm_output_asm_insn (\"cmn\\t%2, #%n3\", operands);
        !          4372:   else
        !          4373:     arm_output_asm_insn (\"cmp\\t%2, %3\", operands);
        !          4374:   if (arm_ccfsm_state == 1 || arm_ccfsm_state == 2)
        !          4375:   {
        !          4376:     arm_ccfsm_state += 2;
        !          4377:     return \"\";
        !          4378:   }
        !          4379:   return arm_output_asm_insn (\"b%d6\\t%l4\", operands);
        !          4380: }"
        !          4381: [(set_attr "conds" "jump_clob")
        !          4382:  (set_attr "length" "4")])
        !          4383: 
        !          4384: (define_insn ""
        !          4385:   [(set (reg:CC 24)
        !          4386:        (compare:CC (ior:CC (match_operator 4 "comparison_operator"
        !          4387:                             [(match_operand:SI 0 "s_register_operand" "r")
        !          4388:                              (match_operand:SI 1 "arm_add_operand" "rL")])
        !          4389:                            (match_operator 5 "comparison_operator"
        !          4390:                             [(match_operand:SI 2 "s_register_operand" "r")
        !          4391:                              (match_operand:SI 3 "arm_add_operand" "rL")]))
        !          4392:                    (const_int 0)))]
        !          4393:   "(GET_CODE (operands[4]) == GET_CODE (operands[5])
        !          4394:     || comparison_dominates_p (GET_CODE (operands[4]), GET_CODE (operands[5]))
        !          4395:     || comparison_dominates_p (GET_CODE (operands[5]), GET_CODE (operands[4])))"
        !          4396:   "*
        !          4397:   if (comparison_dominates_p (GET_CODE (operands[5]), GET_CODE (operands[4])))
        !          4398:     {
        !          4399:       if (GET_CODE (operands[3]) == CONST_INT
        !          4400:          && !const_ok_for_arm (INTVAL (operands[3])))
        !          4401:        arm_output_asm_insn (\"cmn\\t%2, #%n3\", operands);
        !          4402:       else
        !          4403:        arm_output_asm_insn (\"cmp\\t%2, %3\", operands);
        !          4404:       if (GET_CODE (operands[1]) == CONST_INT
        !          4405:          && !const_ok_for_arm (INTVAL (operands[1])))
        !          4406:        return arm_output_asm_insn (\"cmn%D5\\t%0, #%n1\", operands);
        !          4407:       return arm_output_asm_insn (\"cmp%D5\\t%0, %1\", operands);
        !          4408:     }
        !          4409:   if (GET_CODE (operands[1]) == CONST_INT
        !          4410:       && !const_ok_for_arm (INTVAL (operands[1])))
        !          4411:     arm_output_asm_insn (\"cmn\\t%0, #%n1\", operands);
        !          4412:   else
        !          4413:     arm_output_asm_insn (\"cmp\\t%0, %1\", operands);
        !          4414:   if (GET_CODE (operands[3]) == CONST_INT
        !          4415:       && !const_ok_for_arm (INTVAL (operands[3])))
        !          4416:     return arm_output_asm_insn (\"cmn%D4\\t%2, #%n3\", operands);
        !          4417:   return arm_output_asm_insn (\"cmp%D4\\t%2, %3\", operands);
        !          4418: "
        !          4419: [(set_attr "conds" "set")
        !          4420:  (set_attr "length" "2")])
        !          4421: 
        !          4422: (define_insn ""
        !          4423:   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
        !          4424:        (if_then_else (match_operator 3 "equality_operator"
        !          4425:                       [(match_operator 4 "comparison_operator"
        !          4426:                         [(reg 24) (const_int 0)])
        !          4427:                        (const_int 0)])
        !          4428:                      (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI")
        !          4429:                      (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))]
        !          4430:   ""
        !          4431:   "*
        !          4432:   if (GET_CODE (operands[3]) == NE)
        !          4433:     {
        !          4434:       if (which_alternative != 0)
        !          4435:        arm_output_asm_insn (\"mov%d4\\t%0, %1\", operands);
        !          4436:       if (which_alternative != 1)
        !          4437:        arm_output_asm_insn (\"mov%D4\\t%0, %2\", operands);
        !          4438:       return \"\";
        !          4439:     }
        !          4440:   if (which_alternative != 0)
        !          4441:     arm_output_asm_insn (\"mov%D4\\t%0, %1\", operands);
        !          4442:   if (which_alternative != 1)
        !          4443:     arm_output_asm_insn (\"mov%d4\\t%0, %2\", operands);
        !          4444:   return \"\";
        !          4445: "
        !          4446: [(set_attr "conds" "use")
        !          4447:  (set_attr "length" "1,1,2")])
        !          4448: 
        !          4449: (define_insn ""
        !          4450:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          4451:         (match_operator:SI 5 "shiftable_operator" 
        !          4452:         [(match_operator:SI 4 "comparison_operator"
        !          4453:            [(match_operand:SI 2 "s_register_operand" "r,r")
        !          4454:            (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])
        !          4455:           (match_operand:SI 1 "s_register_operand" "0,?r")]))
        !          4456:    (clobber (reg 24))]
        !          4457:   ""
        !          4458:   "*
        !          4459: {
        !          4460:   char *instr = arithmetic_instr (operands[5], TRUE);
        !          4461:   char pattern[100];
        !          4462: 
        !          4463:   if (GET_CODE (operands[4]) == LT && operands[3] == const0_rtx)
        !          4464:     {
        !          4465:       sprintf (pattern, \"%s\\t%%0, %%1, %%2, lsr #31\", instr);
        !          4466:       return arm_output_asm_insn (pattern, operands);
        !          4467:     }
        !          4468:   arm_output_asm_insn (\"cmp\\t%2, %3\", operands);
        !          4469:   if (GET_CODE (operands[5]) == AND)
        !          4470:     arm_output_asm_insn (\"mov%D4\\t%0, #0\", operands);
        !          4471:   else if (which_alternative != 0)
        !          4472:     arm_output_asm_insn (\"mov%D4\\t%0, %1\", operands);
        !          4473:   sprintf (pattern, \"%s%%d4\\t%%0, %%1, #1\", instr);
        !          4474:   return arm_output_asm_insn (pattern, operands);
        !          4475: }
        !          4476: "
        !          4477: [(set_attr "conds" "clob")
        !          4478:  (set_attr "length" "3")])
        !          4479: 
        !          4480: (define_insn ""
        !          4481:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          4482:         (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r")
        !          4483:                  (match_operator:SI 4 "comparison_operator"
        !          4484:                    [(match_operand:SI 2 "s_register_operand" "r,r")
        !          4485:                    (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])))
        !          4486:    (clobber (reg 24))]
        !          4487:   ""
        !          4488:   "*
        !          4489:   arm_output_asm_insn (\"cmp\\t%2, %3\", operands);
        !          4490:   if (which_alternative != 0)
        !          4491:     arm_output_asm_insn (\"mov%D4\\t%0, %1\", operands);
        !          4492:   return arm_output_asm_insn (\"sub%d4\\t%0, %1, #1\", operands);
        !          4493: "
        !          4494: [(set_attr "conds" "clob")
        !          4495:  (set_attr "length" "2,3")])
        !          4496: 
        !          4497: (define_insn ""
        !          4498:   [(set (match_operand:SI 0 "s_register_operand" "=&r")
        !          4499:        (and:SI (match_operator 1 "comparison_operator"
        !          4500:                 [(match_operand:SI 2 "s_register_operand" "r")
        !          4501:                  (match_operand:SI 3 "arm_rhs_operand" "rI")])
        !          4502:                (match_operator 4 "comparison_operator"
        !          4503:                 [(match_operand:SI 5 "s_register_operand" "r")
        !          4504:                  (match_operand:SI 6 "arm_rhs_operand" "rI")])))
        !          4505:    (clobber (reg 24))]
        !          4506:   ""
        !          4507:   "*
        !          4508: {
        !          4509:   int dominant =
        !          4510:        comparison_dominates_p (reverse_condition (GET_CODE (operands[1])),
        !          4511:                                reverse_condition (GET_CODE (operands[4])))
        !          4512:        ? 1 
        !          4513:        : comparison_dominates_p (reverse_condition (GET_CODE (operands[4])),
        !          4514:                                  reverse_condition (GET_CODE (operands[1])))
        !          4515:        ? 2 : 0;
        !          4516:   arm_output_asm_insn (dominant == 2 ? \"cmp\\t%5, %6\" : \"cmp\\t%2, %3\",
        !          4517:                       operands);
        !          4518:   arm_output_asm_insn (\"mov\\t%0, #1\", operands);
        !          4519:   if (GET_CODE (operands[1]) == GET_CODE (operands[4]) || dominant)
        !          4520:     {
        !          4521:       arm_output_asm_insn (dominant == 2 ? \"cmp%d4\\t%2, %3\"
        !          4522:                           : \"cmp%d1\\t%5, %6\", operands);
        !          4523:     }
        !          4524:   else
        !          4525:     {
        !          4526:       arm_output_asm_insn (\"mov%D1\\t%0, #0\", operands);
        !          4527:       arm_output_asm_insn (\"cmp\\t%5, %6\", operands);
        !          4528:     }
        !          4529:   return arm_output_asm_insn (dominant == 2 ? \"mov%D1\\t%0, #0\" 
        !          4530:                              : \"mov%D4\\t%0, #0\", operands);
        !          4531: }
        !          4532: "
        !          4533: [(set_attr "conds" "clob")
        !          4534:  (set_attr "length" "5")])
        !          4535: 
        !          4536: (define_split
        !          4537:   [(set (pc)
        !          4538:        (if_then_else (match_operator 1 "equality_operator"
        !          4539:                       [(and:SI (match_operator 2 "comparison_operator"
        !          4540:                                 [(match_operand:SI 3 "s_register_operand" "r")
        !          4541:                                  (match_operand:SI 4 "arm_add_operand" "rL")])
        !          4542:                                (match_operator 0 "comparison_operator"
        !          4543:                                 [(match_operand:SI 5 "s_register_operand" "r")
        !          4544:                                  (match_operand:SI 6 "arm_add_operand" "rL")]))
        !          4545:                        (const_int 0)])
        !          4546:                      (label_ref (match_operand 7 "" ""))
        !          4547:                      (pc)))
        !          4548:    (clobber (reg 24))]
        !          4549:   "(GET_CODE (operands[2]) == GET_CODE (operands[0])
        !          4550:     || comparison_dominates_p (reverse_condition (GET_CODE (operands[2])),
        !          4551:                               reverse_condition (GET_CODE (operands[0])))
        !          4552:     || comparison_dominates_p (reverse_condition (GET_CODE (operands[0])),
        !          4553:                               reverse_condition (GET_CODE (operands[2]))))"
        !          4554:   [(set (reg:CC 24)
        !          4555:        (compare:CC (ior:CC (match_op_dup 2
        !          4556:                             [(match_dup 3) (match_dup 4)])
        !          4557:                            (match_op_dup 0
        !          4558:                             [(match_dup 5) (match_dup 6)]))
        !          4559:                    (const_int 0)))
        !          4560:    (set (pc)
        !          4561:         (if_then_else (match_op_dup 1 [(reg:CC 24) (const_int 0)])
        !          4562:                      (label_ref (match_dup 7))
        !          4563:                      (pc)))]
        !          4564:   "
        !          4565: {
        !          4566:   /* Use DeMorgans law to convert this into an IOR of the inverse conditions 
        !          4567:      This is safe since we only do it for integer comparisons. */
        !          4568:   enum rtx_code code = 
        !          4569:        comparison_dominates_p (reverse_condition (GET_CODE (operands[2])),
        !          4570:                                reverse_condition (GET_CODE (operands[0])))
        !          4571:        ? GET_CODE (operands[0]) : GET_CODE (operands[2]);
        !          4572: 
        !          4573:   operands[2] = gen_rtx (reverse_condition (GET_CODE (operands[2])),
        !          4574:                         GET_MODE (operands[2]), operands[3], operands[4]);
        !          4575:   operands[0] = gen_rtx (reverse_condition (GET_CODE (operands[0])),
        !          4576:                         GET_MODE (operands[0]), operands[5], operands[6]);
        !          4577:   if (GET_CODE (operands[1]) == NE)
        !          4578:     operands[1] = gen_rtx (code, CCmode,
        !          4579:                           XEXP (operands[1], 0), XEXP (operands[1], 1));
        !          4580:   else
        !          4581:     operands[1] = gen_rtx (reverse_condition (code), CCmode,
        !          4582:                           XEXP (operands[1], 0), XEXP (operands[1], 1));
        !          4583: }
        !          4584: ")
        !          4585: 
        !          4586: ;; Don't match these patterns if we can use a conditional compare, since they
        !          4587: ;; tell the final prescan branch elimator code that full branch inlining
        !          4588: ;; can't be done.
        !          4589: 
        !          4590: (define_insn ""
        !          4591:   [(set (pc)
        !          4592:        (if_then_else (eq
        !          4593:                       (and:SI (match_operator 1 "comparison_operator"
        !          4594:                                [(match_operand:SI 2 "s_register_operand" "r")
        !          4595:                                 (match_operand:SI 3 "arm_add_operand" "rL")])
        !          4596:                               (match_operator 4 "comparison_operator"
        !          4597:                                [(match_operand:SI 5 "s_register_operand" "r")
        !          4598:                                 (match_operand:SI 6 "arm_rhs_operand" "rL")]))
        !          4599:                       (const_int 0))
        !          4600:                      (label_ref (match_operand 0 "" ""))
        !          4601:                      (pc)))
        !          4602:    (clobber (reg 24))]
        !          4603:   "!(GET_CODE (operands[1]) == GET_CODE (operands[4])
        !          4604:      || comparison_dominates_p (reverse_condition (GET_CODE (operands[1])),
        !          4605:                                reverse_condition (GET_CODE (operands[4])))
        !          4606:      || comparison_dominates_p (reverse_condition (GET_CODE (operands[4])),
        !          4607:                                reverse_condition (GET_CODE (operands[1]))))"
        !          4608:   "*
        !          4609: {
        !          4610:   extern int arm_ccfsm_state;
        !          4611: 
        !          4612:   if (GET_CODE (operands[3]) == CONST_INT
        !          4613:       && !const_ok_for_arm (INTVAL (operands[3])))
        !          4614:     arm_output_asm_insn (\"cmn\\t%2, #%n3\", operands);
        !          4615:   else
        !          4616:     arm_output_asm_insn (\"cmp\\t%2, %3\", operands);
        !          4617:   arm_output_asm_insn (\"b%D1\\t%l0\", operands);
        !          4618:   if (GET_CODE (operands[6]) == CONST_INT
        !          4619:       && !const_ok_for_arm (INTVAL (operands[6])))
        !          4620:     arm_output_asm_insn (\"cmn\\t%5, #%n6\", operands);
        !          4621:   else
        !          4622:     arm_output_asm_insn (\"cmp\\t%5, %6\", operands);
        !          4623:   if (arm_ccfsm_state == 1 || arm_ccfsm_state == 2)
        !          4624:   {
        !          4625:     arm_ccfsm_state += 2;
        !          4626:     return \"\";
        !          4627:   }
        !          4628:   return arm_output_asm_insn (\"b%D4\\t%l0\", operands);
        !          4629: }"
        !          4630: [(set_attr "conds" "jump_clob")
        !          4631:  (set_attr "length" "4")])
        !          4632: 
        !          4633: (define_insn ""
        !          4634:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          4635:        (neg:SI (match_operator 3 "comparison_operator"
        !          4636:                 [(match_operand:SI 1 "s_register_operand" "r")
        !          4637:                  (match_operand:SI 2 "arm_rhs_operand" "rI")])))
        !          4638:    (clobber (reg 24))]
        !          4639:   ""
        !          4640:   "*
        !          4641:   if (GET_CODE (operands[3]) == LT && operands[3] == const0_rtx)
        !          4642:     return arm_output_asm_insn (\"mov\\t%0, %1, asr #31\", operands);
        !          4643:   if (GET_CODE (operands[3]) == NE)
        !          4644:     {
        !          4645:       arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
        !          4646:       return arm_output_asm_insn (\"mvnne\\t%0, #0\", operands);
        !          4647:     }
        !          4648:   if (GET_CODE (operands[3]) == GT)
        !          4649:     {
        !          4650:       arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
        !          4651:       return arm_output_asm_insn (\"mvnne\\t%0, %0, asr #31\", operands);
        !          4652:     }
        !          4653:   arm_output_asm_insn (\"cmp\\t%1, %2\", operands);
        !          4654:   arm_output_asm_insn (\"mov%D3\\t%0, #0\", operands);
        !          4655:   return arm_output_asm_insn (\"mvn%d3\\t%0, #0\", operands);
        !          4656: "
        !          4657: [(set_attr "conds" "clob")
        !          4658:  (set_attr "length" "3")])
        !          4659: 
        !          4660: (define_insn "movcond"
        !          4661:   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
        !          4662:        (if_then_else:SI (match_operator 5 "comparison_operator"
        !          4663:                          [(match_operand:SI 3 "s_register_operand" "r,r,r")
        !          4664:                           (match_operand:SI 4 "arm_add_operand" "rL,rL,rL")])
        !          4665:                         (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI")
        !          4666:                         (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
        !          4667:    (clobber (reg 24))]
        !          4668:   ""
        !          4669:   "*
        !          4670:   if (GET_CODE (operands[5]) == LT
        !          4671:       && (operands[4] == const0_rtx))
        !          4672:     {
        !          4673:       if (which_alternative != 1 && GET_CODE (operands[4]) == REG)
        !          4674:        {
        !          4675:          arm_output_asm_insn (\"ands\\t%0, %1, %3, asr #32\", operands);
        !          4676:          if (operands[2] == const0_rtx)
        !          4677:            return \"\";
        !          4678:          return arm_output_asm_insn (\"movcc\\t%0, %2\", operands);
        !          4679:        }
        !          4680:       else if (which_alternative != 0 && GET_CODE (operands[2]) == REG)
        !          4681:        {
        !          4682:          arm_output_asm_insn (\"bics\\t%0, %2, %3, asr #32\", operands);
        !          4683:          if (operands[1] == const0_rtx)
        !          4684:            return \"\";
        !          4685:          return arm_output_asm_insn (\"movcs\\t%0, %1\", operands);
        !          4686:        }
        !          4687:       /* The only case that falls through to here is when both ops 1 & 2
        !          4688:         are constants */
        !          4689:     }
        !          4690:   if (GET_CODE (operands[5]) == GE
        !          4691:       && (operands[4] == const0_rtx))
        !          4692:     {
        !          4693:       if (which_alternative != 1 && GET_CODE (operands[1]) == REG)
        !          4694:        {
        !          4695:          arm_output_asm_insn (\"bics\\t%0, %1, %3, asr #32\", operands);
        !          4696:          if (operands[2] == const0_rtx)
        !          4697:            return \"\";
        !          4698:          return arm_output_asm_insn (\"movcs\\t%0, %2\", operands);
        !          4699:        }
        !          4700:       else if (which_alternative != 0 && GET_CODE (operands[2]) == REG)
        !          4701:        {
        !          4702:          arm_output_asm_insn (\"ands\\t%0, %2, %3, asr #32\", operands);
        !          4703:          if (operands[1] == const0_rtx)
        !          4704:            return \"\";
        !          4705:          return arm_output_asm_insn (\"movcc\\t%0, %1\", operands);
        !          4706:        }
        !          4707:       /* The only case that falls through to here is when both ops 1 & 2
        !          4708:         are constants */
        !          4709:     }
        !          4710:   if (GET_CODE (operands[4]) == CONST_INT
        !          4711:       && !const_ok_for_arm (INTVAL (operands[4])))
        !          4712:     arm_output_asm_insn (\"cmn\\t%3, #%n4\", operands);
        !          4713:   else
        !          4714:     arm_output_asm_insn (\"cmp\\t%3, %4\", operands);
        !          4715:   if (which_alternative != 0)
        !          4716:     arm_output_asm_insn (\"mov%d5\\t%0, %1\", operands);
        !          4717:   if (which_alternative != 1)
        !          4718:     arm_output_asm_insn (\"mov%D5\\t%0, %2\", operands);
        !          4719:   return \"\";
        !          4720: "
        !          4721: [(set_attr "conds" "clob")
        !          4722:  (set_attr "length" "2,2,3")])
        !          4723: 
        !          4724: (define_insn ""
        !          4725:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          4726:        (if_then_else:SI (match_operator 9 "comparison_operator"
        !          4727:                          [(match_operand:SI 5 "s_register_operand" "r")
        !          4728:                           (match_operand:SI 6 "arm_add_operand" "rL")])
        !          4729:                         (match_operator:SI 8 "shiftable_operator"
        !          4730:                          [(match_operand:SI 1 "s_register_operand" "r")
        !          4731:                           (match_operand:SI 2 "arm_rhs_operand" "rI")])
        !          4732:                         (match_operator:SI 7 "shiftable_operator"
        !          4733:                          [(match_operand:SI 3 "s_register_operand" "r")
        !          4734:                           (match_operand:SI 4 "arm_rhs_operand" "rI")])))
        !          4735:    (clobber (reg 24))]
        !          4736:   ""
        !          4737:   "*
        !          4738: {
        !          4739:   char pattern[100];
        !          4740: 
        !          4741:   if (GET_CODE (operands[6]) == CONST_INT
        !          4742:       && !const_ok_for_arm (INTVAL (operands[6])))
        !          4743:     arm_output_asm_insn (\"cmn\\t%5, #%n6\", operands);
        !          4744:   else
        !          4745:     arm_output_asm_insn (\"cmp\\t%5, %6\", operands);
        !          4746:   sprintf (pattern, \"%s%%d9\\t%%0, %%1, %%2\", arithmetic_instr (operands[8],
        !          4747:                                                                  FALSE));
        !          4748:   arm_output_asm_insn (pattern, operands);
        !          4749:   sprintf (pattern, \"%s%%D9\\t%%0, %%3, %%4\", arithmetic_instr (operands[7],
        !          4750:                                                                  FALSE));
        !          4751:   return arm_output_asm_insn (pattern, operands);
        !          4752: }
        !          4753: "
        !          4754: [(set_attr "conds" "clob")
        !          4755:  (set_attr "length" "3")])
        !          4756: 
        !          4757: (define_insn ""
        !          4758:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          4759:        (if_then_else:SI (match_operator 6 "comparison_operator"
        !          4760:                          [(match_operand:SI 2 "s_register_operand" "r,r")
        !          4761:                           (match_operand:SI 3 "arm_add_operand" "rL,rL")])
        !          4762:                         (match_operator:SI 7 "shiftable_operator"
        !          4763:                          [(match_operand:SI 4 "s_register_operand" "r,r")
        !          4764:                           (match_operand:SI 5 "arm_rhs_operand" "rI,rI")])
        !          4765:                         (match_operand:SI 1 "arm_rhsm_operand" "0,?rIm")))
        !          4766:    (clobber (reg 24))]
        !          4767:   ""
        !          4768:   "*
        !          4769: {
        !          4770:   char pattern[100];
        !          4771: 
        !          4772:   /* If we have an operation where (op x 0) is the identity operation and
        !          4773:      the condtional operator is LT or GE and we are comparing against zero and
        !          4774:      everything is in registers then we can do this in two instructions */
        !          4775:   if (operands[3] == const0_rtx
        !          4776:       && GET_CODE (operands[7]) != AND
        !          4777:       && GET_CODE (operands[5]) == REG
        !          4778:       && GET_CODE (operands[1]) == REG 
        !          4779:       && REGNO (operands[1]) == REGNO (operands[4])
        !          4780:       && REGNO (operands[4]) != REGNO (operands[0]))
        !          4781:     {
        !          4782:       if (GET_CODE (operands[6]) == LT)
        !          4783:        {
        !          4784:          arm_output_asm_insn (\"and\\t%0, %5, %2, asr #31\", operands);
        !          4785:          sprintf (pattern, \"%s\\t%%0, %%4, %%0\",
        !          4786:                   arithmetic_instr (operands[7], FALSE));
        !          4787:          return arm_output_asm_insn (pattern, operands);
        !          4788:         }
        !          4789:       else if (GET_CODE (operands[6]) == GE)
        !          4790:        {
        !          4791:          arm_output_asm_insn (\"bic\\t%0, %5, %2, asr #31\", operands);
        !          4792:          sprintf (pattern, \"%s\\t%%0, %%4, %%0\",
        !          4793:                   arithmetic_instr (operands[7], FALSE));
        !          4794:          return arm_output_asm_insn (pattern, operands);
        !          4795:         }
        !          4796:     }
        !          4797:   if (GET_CODE (operands[3]) == CONST_INT
        !          4798:       && !const_ok_for_arm (INTVAL (operands[3])))
        !          4799:     arm_output_asm_insn (\"cmn\\t%2, #%n3\", operands);
        !          4800:   else
        !          4801:     arm_output_asm_insn (\"cmp\\t%2, %3\", operands);
        !          4802:   sprintf (pattern, \"%s%%d6\\t%%0, %%4, %%5\", arithmetic_instr (operands[7],
        !          4803:                                                                  FALSE));
        !          4804:   arm_output_asm_insn (pattern, operands);
        !          4805:   if (which_alternative != 0)
        !          4806:     {
        !          4807:       if (GET_CODE (operands[1]) == MEM)
        !          4808:        arm_output_asm_insn (\"ldr%D6\\t%0, %1\", operands);
        !          4809:       else
        !          4810:        arm_output_asm_insn (\"mov%D6\\t%0, %1\", operands);
        !          4811:     }
        !          4812:   return \"\";
        !          4813: }
        !          4814: "
        !          4815: [(set_attr "conds" "clob")
        !          4816:  (set_attr "length" "2,3")])
        !          4817: 
        !          4818: (define_insn ""
        !          4819:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          4820:        (if_then_else:SI (match_operator 6 "comparison_operator"
        !          4821:                          [(match_operand:SI 4 "s_register_operand" "r,r")
        !          4822:                           (match_operand:SI 5 "arm_add_operand" "rL,rL")])
        !          4823:                         (match_operand:SI 1 "arm_rhsm_operand" "0,?rIm")
        !          4824:                         (match_operator:SI 7 "shiftable_operator"
        !          4825:                          [(match_operand:SI 2 "s_register_operand" "r,r")
        !          4826:                           (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])))
        !          4827:    (clobber (reg 24))]
        !          4828:   ""
        !          4829:   "*
        !          4830: {
        !          4831:   char pattern[100];
        !          4832: 
        !          4833:   /* If we have an operation where (op x 0) is the identity operation and
        !          4834:      the condtional operator is LT or GE and we are comparing against zero and
        !          4835:      everything is in registers then we can do this in two instructions */
        !          4836:   if (operands[5] == const0_rtx
        !          4837:       && GET_CODE (operands[7]) != AND
        !          4838:       && GET_CODE (operands[3]) == REG
        !          4839:       && GET_CODE (operands[1]) == REG 
        !          4840:       && REGNO (operands[1]) == REGNO (operands[2])
        !          4841:       && REGNO (operands[2]) != REGNO (operands[0]))
        !          4842:     {
        !          4843:       if (GET_CODE (operands[6]) == GE)
        !          4844:        {
        !          4845:          arm_output_asm_insn (\"and\\t%0, %3, %4, asr #31\", operands);
        !          4846:          sprintf (pattern, \"%s\\t%%0, %%2, %%0\",
        !          4847:                   arithmetic_instr (operands[7], FALSE));
        !          4848:          return arm_output_asm_insn (pattern, operands);
        !          4849:         }
        !          4850:       else if (GET_CODE (operands[6]) == LT)
        !          4851:        {
        !          4852:          arm_output_asm_insn (\"bic\\t%0, %3, %4, asr #31\", operands);
        !          4853:          sprintf (pattern, \"%s\\t%%0, %%2, %%0\",
        !          4854:                   arithmetic_instr (operands[7], FALSE));
        !          4855:          return arm_output_asm_insn (pattern, operands);
        !          4856:         }
        !          4857:     }
        !          4858:   if (GET_CODE (operands[5]) == CONST_INT
        !          4859:       && !const_ok_for_arm (INTVAL (operands[5])))
        !          4860:     arm_output_asm_insn (\"cmn\\t%4, #%n5\", operands);
        !          4861:   else
        !          4862:     arm_output_asm_insn (\"cmp\\t%4, %5\", operands);
        !          4863:   if (which_alternative != 0)
        !          4864:     {
        !          4865:       if (GET_CODE (operands[1]) == MEM)
        !          4866:        arm_output_asm_insn (\"ldr%d6\\t%0, %1\", operands);
        !          4867:       else
        !          4868:        arm_output_asm_insn (\"mov%d6\\t%0, %1\", operands);
        !          4869:     }
        !          4870:   sprintf (pattern, \"%s%%D6\\t%%0, %%2, %%3\", arithmetic_instr (operands[7],
        !          4871:                                                                  FALSE));
        !          4872:   return arm_output_asm_insn (pattern, operands);
        !          4873: }
        !          4874: "
        !          4875: [(set_attr "conds" "clob")
        !          4876:  (set_attr "length" "2,3")])
        !          4877: 
        !          4878: (define_insn ""
        !          4879:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          4880:        (if_then_else:SI (match_operator 6 "comparison_operator"
        !          4881:                          [(match_operand:SI 4 "s_register_operand" "r,r")
        !          4882:                           (match_operand:SI 5 "arm_add_operand" "rL,rL")])
        !          4883:                         (plus:SI
        !          4884:                          (match_operand:SI 2 "s_register_operand" "r,r")
        !          4885:                          (match_operand:SI 3 "arm_add_operand" "rL,rL"))
        !          4886:                         (match_operand:SI 1 "arm_rhsm_operand" "0,?rIm")))
        !          4887:    (clobber (reg 24))]
        !          4888:   ""
        !          4889:   "*
        !          4890: {
        !          4891:   if (GET_CODE (operands[5]) == CONST_INT
        !          4892:       && !const_ok_for_arm (INTVAL (operands[5])))
        !          4893:     arm_output_asm_insn (\"cmn\\t%4, #%n5\", operands);
        !          4894:   else
        !          4895:     arm_output_asm_insn (\"cmp\\t%4, %5\", operands);
        !          4896:   if (GET_CODE (operands[3]) == CONST_INT
        !          4897:       && !const_ok_for_arm (INTVAL (operands[3])))
        !          4898:     arm_output_asm_insn (\"sub%d6\\t%0, %2, #%n3\", operands);
        !          4899:   else
        !          4900:     arm_output_asm_insn (\"add%d6\\t%0, %2, %3\", operands);
        !          4901:   if (which_alternative != 0)
        !          4902:     {
        !          4903:       if (GET_CODE (operands[1]) == MEM)
        !          4904:        arm_output_asm_insn (\"ldr%D6\\t%0, %1\", operands);
        !          4905:       else
        !          4906:        arm_output_asm_insn (\"mov%D6\\t%0, %1\", operands);
        !          4907:     }
        !          4908:   return \"\";
        !          4909: }
        !          4910: "
        !          4911: [(set_attr "conds" "clob")
        !          4912:  (set_attr "length" "2,3")])
        !          4913: 
        !          4914: (define_insn ""
        !          4915:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          4916:        (if_then_else:SI (match_operator 6 "comparison_operator"
        !          4917:                          [(match_operand:SI 4 "s_register_operand" "r,r")
        !          4918:                           (match_operand:SI 5 "arm_add_operand" "rL,rL")])
        !          4919:                         (match_operand:SI 1 "arm_rhsm_operand" "0,?rIm")
        !          4920:                         (plus:SI
        !          4921:                          (match_operand:SI 2 "s_register_operand" "r,r")
        !          4922:                          (match_operand:SI 3 "arm_add_operand" "rL,rL"))))
        !          4923:    (clobber (reg 24))]
        !          4924:   ""
        !          4925:   "*
        !          4926: {
        !          4927:   if (GET_CODE (operands[5]) == CONST_INT
        !          4928:       && !const_ok_for_arm (INTVAL (operands[5])))
        !          4929:     arm_output_asm_insn (\"cmn\\t%4, #%n5\", operands);
        !          4930:   else
        !          4931:     arm_output_asm_insn (\"cmp\\t%4, %5\", operands);
        !          4932:   if (GET_CODE (operands[3]) == CONST_INT
        !          4933:       && !const_ok_for_arm (INTVAL (operands[3])))
        !          4934:     arm_output_asm_insn (\"sub%D6\\t%0, %2, #%n3\", operands);
        !          4935:   else
        !          4936:     arm_output_asm_insn (\"add%D6\\t%0, %2, %3\", operands);
        !          4937:   if (which_alternative != 0)
        !          4938:     {
        !          4939:       if (GET_CODE (operands[6]) == MEM)
        !          4940:        arm_output_asm_insn (\"ldr%d6\\t%0, %1\", operands);
        !          4941:       else
        !          4942:        arm_output_asm_insn (\"mov%d6\\t%0, %1\", operands);
        !          4943:     }
        !          4944:   return \"\";
        !          4945: }
        !          4946: "
        !          4947: [(set_attr "conds" "clob")
        !          4948:  (set_attr "length" "2,3")])
        !          4949: 
        !          4950: (define_insn ""
        !          4951:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          4952:        (if_then_else:SI (match_operator 5 "comparison_operator"
        !          4953:                          [(match_operand:SI 3 "s_register_operand" "r,r")
        !          4954:                           (match_operand:SI 4 "arm_add_operand" "rL,rL")])
        !          4955:                         (match_operand:SI 1 "arm_rhs_operand" "0,?rI")
        !          4956:                         (not:SI
        !          4957:                          (match_operand:SI 2 "s_register_operand" "r,r"))))
        !          4958:    (clobber (reg 24))]
        !          4959:   ""
        !          4960:   "#"
        !          4961: [(set_attr "conds" "clob")
        !          4962:  (set_attr "length" "2,3")])
        !          4963: 
        !          4964: ;;  if (GET_CODE (operands[3]) == CONST_INT
        !          4965: ;;      && !const_ok_for_arm (INTVAL (operands[3])))
        !          4966: ;;    arm_output_asm_insn (\"cmn\\t%2, #%n3\", operands);
        !          4967: ;;  else
        !          4968: ;;    arm_output_asm_insn (\"cmp\\t%2, %3\", operands);
        !          4969: ;;  if (which_alternative != 0)
        !          4970: ;;    arm_output_asm_insn (\"mov%d1\\t%0, %4\", operands);
        !          4971: ;;  return arm_output_asm_insn (\"mvn%D1\\t%0, %5\", operands);
        !          4972: 
        !          4973: (define_insn ""
        !          4974:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          4975:        (if_then_else:SI (match_operator 5 "comparison_operator"
        !          4976:                          [(match_operand:SI 3 "s_register_operand" "r,r")
        !          4977:                           (match_operand:SI 4 "arm_add_operand" "rL,rL")])
        !          4978:                         (not:SI
        !          4979:                          (match_operand:SI 2 "s_register_operand" "r,r"))
        !          4980:                         (match_operand:SI 1 "arm_rhs_operand" "0,?rI")))
        !          4981:    (clobber (reg 24))]
        !          4982:   ""
        !          4983:   "*
        !          4984: {
        !          4985:   char pattern[100];
        !          4986: 
        !          4987:   if (GET_CODE (operands[30]) == CONST_INT
        !          4988:       && !const_ok_for_arm (INTVAL (operands[4])))
        !          4989:     arm_output_asm_insn (\"cmn\\t%3, #%n4\", operands);
        !          4990:   else
        !          4991:     arm_output_asm_insn (\"cmp\\t%3, %4\", operands);
        !          4992:   if (which_alternative != 0)
        !          4993:     arm_output_asm_insn (\"mov%D5\\t%0, %1\", operands);
        !          4994:   return arm_output_asm_insn (\"mvn%d5\\t%0, %2\", operands);
        !          4995: 
        !          4996: }
        !          4997: "
        !          4998: [(set_attr "conds" "clob")
        !          4999:  (set_attr "length" "2,3")])
        !          5000: 
        !          5001: (define_insn ""
        !          5002:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          5003:        (if_then_else:SI (match_operator 6 "comparison_operator"
        !          5004:                          [(match_operand:SI 4 "s_register_operand" "r,r")
        !          5005:                           (match_operand:SI 5 "arm_add_operand" "rL,rL")])
        !          5006:                         (match_operator:SI 7 "shift_operator"
        !          5007:                          [(match_operand:SI 2 "s_register_operand" "r,r")
        !          5008:                           (match_operand:SI 3 "arm_rhs_operand" "rn,rn")])
        !          5009:                         (match_operand:SI 1 "arm_rhs_operand" "0,?rI")))
        !          5010:    (clobber (reg 24))]
        !          5011:   ""
        !          5012:   "*
        !          5013: {
        !          5014:   char pattern[100];
        !          5015: 
        !          5016:   if (GET_CODE (operands[5]) == CONST_INT
        !          5017:       && !const_ok_for_arm (INTVAL (operands[5])))
        !          5018:     arm_output_asm_insn (\"cmn\\t%4, #%n5\", operands);
        !          5019:   else
        !          5020:     arm_output_asm_insn (\"cmp\\t%4, %5\", operands);
        !          5021:   if (which_alternative != 0)
        !          5022:     arm_output_asm_insn (\"mov%D6\\t%0, %1\", operands);
        !          5023:   sprintf (pattern, \"mov%%d6\\t%%0, %%2, %s %%3\", 
        !          5024:           shift_instr (GET_CODE (operands[7]), &operands[3]));
        !          5025:   return arm_output_asm_insn (pattern, operands);
        !          5026: }
        !          5027: "
        !          5028: [(set_attr "conds" "clob")
        !          5029:  (set_attr "length" "2,3")])
        !          5030: 
        !          5031: (define_insn ""
        !          5032:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          5033:        (if_then_else:SI (match_operator 6 "comparison_operator"
        !          5034:                          [(match_operand:SI 4 "s_register_operand" "r,r")
        !          5035:                           (match_operand:SI 5 "arm_add_operand" "rL,rL")])
        !          5036:                         (match_operand:SI 1 "arm_rhs_operand" "0,?rI")
        !          5037:                         (match_operator:SI 7 "shift_operator"
        !          5038:                          [(match_operand:SI 2 "s_register_operand" "r,r")
        !          5039:                           (match_operand:SI 3 "arm_rhs_operand" "rn,rn")])))
        !          5040:    (clobber (reg 24))]
        !          5041:   ""
        !          5042:   "*
        !          5043: {
        !          5044:   char pattern[100];
        !          5045: 
        !          5046:   if (GET_CODE (operands[5]) == CONST_INT
        !          5047:       && !const_ok_for_arm (INTVAL (operands[5])))
        !          5048:     arm_output_asm_insn (\"cmn\\t%4, #%n5\", operands);
        !          5049:   else
        !          5050:     arm_output_asm_insn (\"cmp\\t%4, %5\", operands);
        !          5051:   if (which_alternative != 0)
        !          5052:     arm_output_asm_insn (\"mov%d6\\t%0, %1\", operands);
        !          5053:   sprintf (pattern, \"mov%%D6\\t%%0, %%2, %s %%3\", 
        !          5054:           shift_instr (GET_CODE (operands[7]), &operands[3]));
        !          5055:   return arm_output_asm_insn (pattern, operands);
        !          5056: }
        !          5057: "
        !          5058: [(set_attr "conds" "clob")
        !          5059:  (set_attr "length" "2,3")])
        !          5060: 
        !          5061: (define_insn ""
        !          5062:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          5063:        (if_then_else:SI (match_operator 7 "comparison_operator"
        !          5064:                          [(match_operand:SI 5 "s_register_operand" "r")
        !          5065:                           (match_operand:SI 6 "arm_add_operand" "rL")])
        !          5066:                         (match_operator:SI 8 "shift_operator"
        !          5067:                          [(match_operand:SI 1 "s_register_operand" "r")
        !          5068:                           (match_operand:SI 2 "arm_rhs_operand" "rn")])
        !          5069:                         (match_operator:SI 9 "shift_operator"
        !          5070:                          [(match_operand:SI 3 "s_register_operand" "r")
        !          5071:                           (match_operand:SI 4 "arm_rhs_operand" "rI")])))
        !          5072:    (clobber (reg 24))]
        !          5073:   ""
        !          5074:   "*
        !          5075: {
        !          5076:   char pattern[100];
        !          5077: 
        !          5078:   if (GET_CODE (operands[6]) == CONST_INT
        !          5079:       && !const_ok_for_arm (INTVAL (operands[6])))
        !          5080:     arm_output_asm_insn (\"cmn\\t%5, #%n6\", operands);
        !          5081:   else
        !          5082:     arm_output_asm_insn (\"cmp\\t%5, %6\", operands);
        !          5083:   sprintf (pattern, \"mov%%d7\\t%%0, %%1, %s %%2\", 
        !          5084:           shift_instr (GET_CODE (operands[8]), &operands[2]));
        !          5085:   arm_output_asm_insn (pattern, operands);
        !          5086:   sprintf (pattern, \"mov%%D7\\t%%0, %%3, %s %%4\", 
        !          5087:           shift_instr (GET_CODE (operands[9]), &operands[4]));
        !          5088:   return arm_output_asm_insn (pattern, operands);
        !          5089: }
        !          5090: "
        !          5091: [(set_attr "conds" "clob")
        !          5092:  (set_attr "length" "3")])
        !          5093: 
        !          5094: (define_insn ""
        !          5095:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          5096:        (if_then_else:SI (match_operator 6 "comparison_operator"
        !          5097:                          [(match_operand:SI 4 "s_register_operand" "r")
        !          5098:                           (match_operand:SI 5 "arm_add_operand" "rL")])
        !          5099:                         (not:SI (match_operand:SI 1 "s_register_operand" "r"))
        !          5100:                         (match_operator:SI 7 "shiftable_operator"
        !          5101:                          [(match_operand:SI 2 "s_register_operand" "r")
        !          5102:                           (match_operand:SI 3 "arm_rhs_operand" "rI")])))
        !          5103:    (clobber (reg 24))]
        !          5104:   ""
        !          5105:   "*
        !          5106: {
        !          5107:   char pattern[100];
        !          5108: 
        !          5109:   if (GET_CODE (operands[5]) == CONST_INT
        !          5110:       && !const_ok_for_arm (INTVAL (operands[5])))
        !          5111:     arm_output_asm_insn (\"cmn\\t%4, #%n5\", operands);
        !          5112:   else
        !          5113:     arm_output_asm_insn (\"cmp\\t%4, %5\", operands);
        !          5114:   arm_output_asm_insn (\"mvn%d6\\t%0, %1\", operands);
        !          5115:   sprintf (pattern, \"%s%%D6\\t%%0, %%2, %%3\", arithmetic_instr (operands[7],
        !          5116:                                                                  FALSE));
        !          5117:   return arm_output_asm_insn (pattern, operands);
        !          5118: }
        !          5119: "
        !          5120: [(set_attr "conds" "clob")
        !          5121:  (set_attr "length" "3")])
        !          5122: 
        !          5123: (define_insn ""
        !          5124:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          5125:        (if_then_else:SI (match_operator 6 "comparison_operator"
        !          5126:                          [(match_operand:SI 4 "s_register_operand" "r")
        !          5127:                           (match_operand:SI 5 "arm_add_operand" "rL")])
        !          5128:                         (match_operator:SI 7 "shiftable_operator"
        !          5129:                          [(match_operand:SI 2 "s_register_operand" "r")
        !          5130:                           (match_operand:SI 3 "arm_rhs_operand" "rI")])
        !          5131:                         (not:SI (match_operand:SI 1 "s_register_operand" "r"))))
        !          5132:    (clobber (reg 24))]
        !          5133:   ""
        !          5134:   "*
        !          5135: {
        !          5136:   char pattern[100];
        !          5137: 
        !          5138:   if (GET_CODE (operands[5]) == CONST_INT
        !          5139:       && !const_ok_for_arm (INTVAL (operands[5])))
        !          5140:     arm_output_asm_insn (\"cmn\\t%4, #%n5\", operands);
        !          5141:   else
        !          5142:     arm_output_asm_insn (\"cmp\\t%4, %5\", operands);
        !          5143:   arm_output_asm_insn (\"mvn%D6\\t%0, %1\", operands);
        !          5144:   sprintf (pattern, \"%s%%d6\\t%%0, %%2, %%3\", arithmetic_instr (operands[7],
        !          5145:                                                                  FALSE));
        !          5146:   return arm_output_asm_insn (pattern, operands);
        !          5147: }
        !          5148: "
        !          5149: [(set_attr "conds" "clob")
        !          5150:  (set_attr "length" "3")])
        !          5151: 
        !          5152: (define_insn ""
        !          5153:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          5154:        (if_then_else:SI (match_operator 5 "comparison_operator"
        !          5155:                          [(match_operand:SI 3 "s_register_operand" "r,r")
        !          5156:                           (match_operand:SI 4 "arm_add_operand" "rL,rL")])
        !          5157:                         (neg:SI
        !          5158:                          (match_operand:SI 2 "s_register_operand" "r,r"))
        !          5159:                         (match_operand:SI 1 "arm_rhs_operand" "0,?rI")))
        !          5160:    (clobber (reg:CC 24))]
        !          5161:   ""
        !          5162:   "*
        !          5163:   if (GET_CODE (operands[4]) == CONST_INT
        !          5164:       && !const_ok_for_arm (INTVAL (operands[4])))
        !          5165:     arm_output_asm_insn (\"cmn\\t%3, #%n4\", operands);
        !          5166:   else
        !          5167:     arm_output_asm_insn (\"cmp\\t%3, %4\", operands);
        !          5168:   if (which_alternative != 0)
        !          5169:     arm_output_asm_insn (\"mov%D5\\t%0, %1\", operands);
        !          5170:   return arm_output_asm_insn (\"rsb%d5\\t%0, %2, #0\", operands);
        !          5171: "
        !          5172: [(set_attr "conds" "clob")
        !          5173:  (set_attr "length" "2,3")])
        !          5174: 
        !          5175: (define_insn ""
        !          5176:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          5177:        (if_then_else:SI (match_operator 5 "comparison_operator"
        !          5178:                          [(match_operand:SI 3 "s_register_operand" "r,r")
        !          5179:                           (match_operand:SI 4 "arm_add_operand" "rL,rL")])
        !          5180:                         (match_operand:SI 1 "arm_rhs_operand" "0,?rI")
        !          5181:                         (neg:SI
        !          5182:                          (match_operand:SI 2 "s_register_operand" "r,r"))))
        !          5183:    (clobber (reg:CC 24))]
        !          5184:   ""
        !          5185:   "*
        !          5186:   if (GET_CODE (operands[4]) == CONST_INT
        !          5187:       && !const_ok_for_arm (INTVAL (operands[4])))
        !          5188:     arm_output_asm_insn (\"cmn\\t%3, #%n4\", operands);
        !          5189:   else
        !          5190:     arm_output_asm_insn (\"cmp\\t%3, %4\", operands);
        !          5191:   if (which_alternative != 0)
        !          5192:     arm_output_asm_insn (\"mov%d5\\t%0, %1\", operands);
        !          5193:   return arm_output_asm_insn (\"rsb%D5\\t%0, %2, #0\", operands);
        !          5194: "
        !          5195: [(set_attr "conds" "clob")
        !          5196:  (set_attr "length" "2,3")])
        !          5197: 
        !          5198: (define_insn ""
        !          5199:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          5200:        (match_operator:SI 1 "shiftable_operator"
        !          5201:         [(match_operand:SI 2 "memory_operand" "m")
        !          5202:          (match_operand:SI 3 "memory_operand" "m")]))
        !          5203:    (clobber (match_scratch:SI 4 "=r"))]
        !          5204:   "adjacent_mem_locations (operands[2], operands[3])"
        !          5205:   "*
        !          5206: {
        !          5207:   rtx ldm[3];
        !          5208:   rtx arith[3];
        !          5209:   char pattern[100];
        !          5210:   int val1 = 0, val2 = 0;
        !          5211: 
        !          5212:   sprintf (pattern, \"%s\\t%%0, %%1, %%2\",
        !          5213:           arithmetic_instr (operands[1], FALSE));
        !          5214:   if (REGNO (operands[0]) > REGNO (operands[4]))
        !          5215:     {
        !          5216:       ldm[1] = operands[4];
        !          5217:       ldm[2] = operands[0];
        !          5218:     }
        !          5219:   else
        !          5220:     {
        !          5221:       ldm[1] = operands[0];
        !          5222:       ldm[2] = operands[4];
        !          5223:     }
        !          5224:   if (GET_CODE (XEXP (operands[2], 0)) != REG)
        !          5225:     val1 = INTVAL (XEXP (XEXP (operands[2], 0), 1));
        !          5226:   if (GET_CODE (XEXP (operands[3], 0)) != REG)
        !          5227:     val2 = INTVAL (XEXP (XEXP (operands[3], 0), 1));
        !          5228:   arith[0] = operands[0];
        !          5229:   if (val1 < val2)
        !          5230:     {
        !          5231:       arith[1] = ldm[1];
        !          5232:       arith[2] = ldm[2];
        !          5233:     }
        !          5234:   else
        !          5235:     {
        !          5236:       arith[1] = ldm[2];
        !          5237:       arith[2] = ldm[1];
        !          5238:     }
        !          5239:   if (val1 && val2)
        !          5240:     {
        !          5241:       rtx ops[3];
        !          5242:       ldm[0] = ops[0] = operands[4];
        !          5243:       ops[1] = XEXP (XEXP (operands[2], 0), 0);
        !          5244:       ops[2] = XEXP (XEXP (operands[2], 0), 1);
        !          5245:       output_add_immediate (ops);
        !          5246:       if (val1 < val2)
        !          5247:        arm_output_asm_insn (\"ldmia\\t%0, {%1, %2}\", ldm);
        !          5248:       else
        !          5249:        arm_output_asm_insn (\"ldmda\\t%0, {%1, %2}\", ldm);
        !          5250:     }
        !          5251:   else if (val1)
        !          5252:     {
        !          5253:       ldm[0] = XEXP (operands[3], 0);
        !          5254:       if (val1 < val2)
        !          5255:        arm_output_asm_insn (\"ldmda\\t%0, {%1, %2}\", ldm);
        !          5256:       else
        !          5257:        arm_output_asm_insn (\"ldmia\\t%0, {%1, %2}\", ldm);
        !          5258:     }
        !          5259:   else
        !          5260:     {
        !          5261:       ldm[0] = XEXP (operands[2], 0);
        !          5262:       if (val1 < val2)
        !          5263:        arm_output_asm_insn (\"ldmia\\t%0, {%1, %2}\", ldm);
        !          5264:       else
        !          5265:        arm_output_asm_insn (\"ldmda\\t%0, {%1, %2}\", ldm);
        !          5266:     }
        !          5267:   return arm_output_asm_insn (pattern, arith);
        !          5268: }
        !          5269: "
        !          5270: [(set_attr "length" "3")
        !          5271:  (set_attr "type" "load")])
        !          5272: 
        !          5273: ;; the arm can support extended pre-inc instructions
        !          5274: 
        !          5275: ;; In all these cases, we use operands 0 and 1 for the register being
        !          5276: ;; incremented because those are the operands that local-alloc will
        !          5277: ;; tie and these are the pair most likely to be tieable (and the ones
        !          5278: ;; that will benefit the most).
        !          5279: 
        !          5280: ;; We reject the frame pointer if it occurs anywhere in these patterns since
        !          5281: ;; elimination will cause too many headaches.
        !          5282: 
        !          5283: (define_insn ""
        !          5284:   [(set (mem:QI (plus:SI (match_operand:SI 1 "s_register_operand" "%0")
        !          5285:                         (match_operand:SI 2 "index_operand" "rJ")))
        !          5286:        (match_operand:QI 3 "s_register_operand" "r"))
        !          5287:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5288:        (plus:SI (match_dup 1) (match_dup 2)))]
        !          5289:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5290:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5291:    && (GET_CODE (operands[2]) != REG
        !          5292:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5293:   "*
        !          5294:   return arm_output_asm_insn (\"strb\\t%3, [%0, %2]!\", operands);
        !          5295: "
        !          5296: [(set_attr "type" "store1")])
        !          5297: 
        !          5298: (define_insn ""
        !          5299:   [(set (mem:QI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5300:                          (match_operand:SI 2 "s_register_operand" "r")))
        !          5301:        (match_operand:QI 3 "s_register_operand" "r"))
        !          5302:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5303:        (minus:SI (match_dup 1) (match_dup 2)))]
        !          5304:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5305:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5306:    && (GET_CODE (operands[2]) != REG
        !          5307:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5308:   "*
        !          5309:   return arm_output_asm_insn (\"strb\\t%3, [%0, -%2]!\", operands);
        !          5310: "
        !          5311: [(set_attr "type" "store1")])
        !          5312: 
        !          5313: (define_insn ""
        !          5314:   [(set (match_operand:QI 3 "s_register_operand" "=r")
        !          5315:        (mem:QI (plus:SI (match_operand:SI 1 "s_register_operand" "%0")
        !          5316:                         (match_operand:SI 2 "index_operand" "rJ"))))
        !          5317:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5318:        (plus:SI (match_dup 1) (match_dup 2)))]
        !          5319:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5320:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5321:    && (GET_CODE (operands[2]) != REG
        !          5322:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5323:   "*
        !          5324:   return arm_output_asm_insn (\"ldrb\\t%3, [%0, %2]!\", operands);
        !          5325: "
        !          5326: [(set_attr "type" "load")])
        !          5327: 
        !          5328: (define_insn ""
        !          5329:   [(set (match_operand:QI 3 "s_register_operand" "=r")
        !          5330:        (mem:QI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5331:                          (match_operand:SI 2 "s_register_operand" "r"))))
        !          5332:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5333:        (minus:SI (match_dup 1) (match_dup 2)))]
        !          5334:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5335:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5336:    && (GET_CODE (operands[2]) != REG
        !          5337:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5338:   "*
        !          5339:   return arm_output_asm_insn (\"ldrb\\t%3, [%0, -%2]!\", operands);
        !          5340: "
        !          5341: [(set_attr "type" "load")])
        !          5342: 
        !          5343: (define_insn ""
        !          5344:   [(set (match_operand:SI 3 "s_register_operand" "=r")
        !          5345:        (zero_extend:SI
        !          5346:         (mem:QI (plus:SI (match_operand:SI 1 "s_register_operand" "%0")
        !          5347:                          (match_operand:SI 2 "index_operand" "rJ")))))
        !          5348:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5349:        (plus:SI (match_dup 1) (match_dup 2)))]
        !          5350:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5351:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5352:    && (GET_CODE (operands[2]) != REG
        !          5353:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5354:   "*
        !          5355:   return arm_output_asm_insn (\"ldrb\\t%3, [%0, %2]!\\t@ z_extendqisi\",
        !          5356:                              operands);
        !          5357: "
        !          5358: [(set_attr "type" "load")])
        !          5359: 
        !          5360: (define_insn ""
        !          5361:   [(set (match_operand:SI 3 "s_register_operand" "=r")
        !          5362:        (zero_extend:SI
        !          5363:         (mem:QI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5364:                           (match_operand:SI 2 "s_register_operand" "r")))))
        !          5365:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5366:        (minus:SI (match_dup 1) (match_dup 2)))]
        !          5367:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5368:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5369:    && (GET_CODE (operands[2]) != REG
        !          5370:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5371:   "*
        !          5372:   return arm_output_asm_insn (\"ldrb\\t%3, [%0, -%2]!\\t@ z_extendqisi\",
        !          5373:                              operands);
        !          5374: "
        !          5375: [(set_attr "type" "load")])
        !          5376: 
        !          5377: (define_insn ""
        !          5378:   [(set (mem:SI (plus:SI (match_operand:SI 1 "s_register_operand" "%0")
        !          5379:                         (match_operand:SI 2 "index_operand" "rJ")))
        !          5380:        (match_operand:SI 3 "s_register_operand" "r"))
        !          5381:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5382:        (plus:SI (match_dup 1) (match_dup 2)))]
        !          5383:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5384:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5385:    && (GET_CODE (operands[2]) != REG
        !          5386:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5387:   "*
        !          5388:   return arm_output_asm_insn (\"str\\t%3, [%0, %2]!\", operands);
        !          5389: "
        !          5390: [(set_attr "type" "store1")])
        !          5391: 
        !          5392: (define_insn ""
        !          5393:   [(set (mem:SI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5394:                          (match_operand:SI 2 "s_register_operand" "r")))
        !          5395:        (match_operand:SI 3 "s_register_operand" "r"))
        !          5396:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5397:        (minus:SI (match_dup 1) (match_dup 2)))]
        !          5398:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5399:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5400:    && (GET_CODE (operands[2]) != REG
        !          5401:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5402:   "*
        !          5403:   return arm_output_asm_insn (\"str\\t%3, [%0, -%2]!\", operands);
        !          5404: "
        !          5405: [(set_attr "type" "store1")])
        !          5406: 
        !          5407: (define_insn ""
        !          5408:   [(set (match_operand:SI 3 "s_register_operand" "=r")
        !          5409:        (mem:SI (plus:SI (match_operand:SI 1 "s_register_operand" "%0")
        !          5410:                         (match_operand:SI 2 "index_operand" "rJ"))))
        !          5411:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5412:        (plus:SI (match_dup 1) (match_dup 2)))]
        !          5413:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5414:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5415:    && (GET_CODE (operands[2]) != REG
        !          5416:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5417:   "*
        !          5418:   return arm_output_asm_insn (\"ldr\\t%3, [%0, %2]!\", operands);
        !          5419: "
        !          5420: [(set_attr "type" "load")])
        !          5421: 
        !          5422: (define_insn ""
        !          5423:   [(set (match_operand:SI 3 "s_register_operand" "=r")
        !          5424:        (mem:SI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5425:                          (match_operand:SI 2 "s_register_operand" "r"))))
        !          5426:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5427:        (minus:SI (match_dup 1) (match_dup 2)))]
        !          5428:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5429:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5430:    && (GET_CODE (operands[2]) != REG
        !          5431:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5432:   "*
        !          5433:   return arm_output_asm_insn (\"ldr\\t%3, [%0, -%2]!\", operands);
        !          5434: "
        !          5435: [(set_attr "type" "load")])
        !          5436: 
        !          5437: (define_insn ""
        !          5438:   [(set (match_operand:HI 3 "s_register_operand" "=r")
        !          5439:        (mem:HI (plus:SI (match_operand:SI 1 "s_register_operand" "%0")
        !          5440:                         (match_operand:SI 2 "index_operand" "rJ"))))
        !          5441:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5442:        (plus:SI (match_dup 1) (match_dup 2)))]
        !          5443:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5444:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5445:    && (GET_CODE (operands[2]) != REG
        !          5446:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5447:   "*
        !          5448:   return arm_output_asm_insn (\"ldr\\t%3, [%0, %2]!\\t@ loadhi\", operands);
        !          5449: "
        !          5450: [(set_attr "type" "load")])
        !          5451: 
        !          5452: (define_insn ""
        !          5453:   [(set (match_operand:HI 3 "s_register_operand" "=r")
        !          5454:        (mem:HI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5455:                          (match_operand:SI 2 "s_register_operand" "r"))))
        !          5456:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5457:        (minus:SI (match_dup 1) (match_dup 2)))]
        !          5458:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5459:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5460:    && (GET_CODE (operands[2]) != REG
        !          5461:        || REGNO (operands[2]) != FRAME_POINTER_REGNUM)"
        !          5462:   "*
        !          5463:   return arm_output_asm_insn (\"ldr\\t%3, [%0, -%2]!\\t@ loadhi\", operands);
        !          5464: "
        !          5465: [(set_attr "type" "load")])
        !          5466: 
        !          5467: (define_insn ""
        !          5468:   [(set (mem:QI (plus:SI (match_operator:SI 2 "shift_operator"
        !          5469:                          [(match_operand:SI 3 "s_register_operand" "r")
        !          5470:                           (match_operand:SI 4 "const_shift_operand" "n")])
        !          5471:                         (match_operand:SI 1 "s_register_operand" "0")))
        !          5472:        (match_operand:QI 5 "s_register_operand" "r"))
        !          5473:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5474:        (plus:SI (match_op_dup 2 [(match_dup 3) (match_dup 4)])
        !          5475:                 (match_dup 1)))]
        !          5476:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5477:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5478:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5479:   "*
        !          5480: {
        !          5481:   char instr[100];
        !          5482: 
        !          5483:   sprintf (instr, \"strb\\t%%5, [%%0, %%3, %s %%4]!\",
        !          5484:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5485:   return arm_output_asm_insn (instr, operands);
        !          5486: }
        !          5487: "
        !          5488: [(set_attr "type" "store1")])
        !          5489: 
        !          5490: (define_insn ""
        !          5491:   [(set (mem:QI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5492:                          (match_operator:SI 2 "shift_operator"
        !          5493:                           [(match_operand:SI 3 "s_register_operand" "r")
        !          5494:                            (match_operand:SI 4 "const_shift_operand" "n")])))
        !          5495:        (match_operand:QI 5 "s_register_operand" "r"))
        !          5496:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5497:        (minus:SI (match_dup 1) (match_op_dup 2 [(match_dup 3)
        !          5498:                                                 (match_dup 4)])))]
        !          5499:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5500:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5501:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5502:   "*
        !          5503: {
        !          5504:   char instr[100];
        !          5505: 
        !          5506:   sprintf (instr, \"strb\\t%%5, [%%0, -%%3, %s %%4]!\",
        !          5507:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5508:   return arm_output_asm_insn (instr, operands);
        !          5509: }
        !          5510: "
        !          5511: [(set_attr "type" "store1")])
        !          5512: 
        !          5513: (define_insn ""
        !          5514:   [(set (match_operand:QI 5 "s_register_operand" "=r")
        !          5515:        (mem:QI (plus:SI (match_operator:SI 2 "shift_operator"
        !          5516:                          [(match_operand:SI 3 "s_register_operand" "r")
        !          5517:                           (match_operand:SI 4 "const_shift_operand" "n")])
        !          5518:                         (match_operand:SI 1 "s_register_operand" "0"))))
        !          5519:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5520:        (plus:SI (match_op_dup 2 [(match_dup 3) (match_dup 4)])
        !          5521:                 (match_dup 1)))]
        !          5522:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5523:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5524:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5525:   "*
        !          5526: {
        !          5527:   char instr[100];
        !          5528: 
        !          5529:   sprintf (instr, \"ldrb\\t%%5, [%%0, %%3, %s %%4]!\",
        !          5530:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5531:   return arm_output_asm_insn (instr, operands);
        !          5532: }
        !          5533: "
        !          5534: [(set_attr "type" "load")])
        !          5535: 
        !          5536: (define_insn ""
        !          5537:   [(set (match_operand:QI 5 "s_register_operand" "=r")
        !          5538:        (mem:QI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5539:                          (match_operator:SI 2 "shift_operator"
        !          5540:                           [(match_operand:SI 3 "s_register_operand" "r")
        !          5541:                            (match_operand:SI 4 "const_shift_operand" "n")]))))
        !          5542:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5543:        (minus:SI (match_dup 1) (match_op_dup 2 [(match_dup 3)
        !          5544:                                                 (match_dup 4)])))]
        !          5545:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5546:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5547:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5548:   "*
        !          5549: {
        !          5550:   char instr[100];
        !          5551: 
        !          5552:   sprintf (instr, \"ldrb\\t%%5, [%%0, -%%3, %s %%4]!\",
        !          5553:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5554:   return arm_output_asm_insn (instr, operands);
        !          5555: }
        !          5556: "
        !          5557: [(set_attr "type" "load")])
        !          5558: 
        !          5559: (define_insn ""
        !          5560:   [(set (mem:SI (plus:SI (match_operator:SI 2 "shift_operator"
        !          5561:                          [(match_operand:SI 3 "s_register_operand" "r")
        !          5562:                           (match_operand:SI 4 "const_shift_operand" "n")])
        !          5563:                         (match_operand:SI 1 "s_register_operand" "0")))
        !          5564:        (match_operand:SI 5 "s_register_operand" "r"))
        !          5565:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5566:        (plus:SI (match_op_dup 2 [(match_dup 3) (match_dup 4)])
        !          5567:                 (match_dup 1)))]
        !          5568:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5569:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5570:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5571:   "*
        !          5572: {
        !          5573:   char instr[100];
        !          5574: 
        !          5575:   sprintf (instr, \"str\\t%%5, [%%0, %%3, %s %%4]!\",
        !          5576:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5577:   return arm_output_asm_insn (instr, operands);
        !          5578: }
        !          5579: "
        !          5580: [(set_attr "type" "store1")])
        !          5581: 
        !          5582: (define_insn ""
        !          5583:   [(set (mem:SI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5584:                          (match_operator:SI 2 "shift_operator"
        !          5585:                           [(match_operand:SI 3 "s_register_operand" "r")
        !          5586:                            (match_operand:SI 4 "const_shift_operand" "n")])))
        !          5587:        (match_operand:SI 5 "s_register_operand" "r"))
        !          5588:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5589:        (minus:SI (match_dup 1) (match_op_dup 2 [(match_dup 3)
        !          5590:                                                 (match_dup 4)])))]
        !          5591:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5592:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5593:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5594:   "*
        !          5595: {
        !          5596:   char instr[100];
        !          5597: 
        !          5598:   sprintf (instr, \"str\\t%%5, [%%0, -%%3, %s %%4]!\",
        !          5599:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5600:   return arm_output_asm_insn (instr, operands);
        !          5601: }
        !          5602: "
        !          5603: [(set_attr "type" "store1")])
        !          5604: 
        !          5605: (define_insn ""
        !          5606:   [(set (match_operand:SI 5 "s_register_operand" "=r")
        !          5607:        (mem:SI (plus:SI (match_operator:SI 2 "shift_operator"
        !          5608:                          [(match_operand:SI 3 "s_register_operand" "r")
        !          5609:                           (match_operand:SI 4 "const_shift_operand" "n")])
        !          5610:                         (match_operand:SI 1 "s_register_operand" "0"))))
        !          5611:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5612:        (plus:SI (match_op_dup 2 [(match_dup 3) (match_dup 4)])
        !          5613:                 (match_dup 1)))]
        !          5614:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5615:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5616:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5617:   "*
        !          5618: {
        !          5619:   char instr[100];
        !          5620: 
        !          5621:   sprintf (instr, \"ldr\\t%%5, [%%0, %%3, %s %%4]!\",
        !          5622:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5623:   return arm_output_asm_insn (instr, operands);
        !          5624: }
        !          5625: "
        !          5626: [(set_attr "type" "load")])
        !          5627: 
        !          5628: (define_insn ""
        !          5629:   [(set (match_operand:SI 5 "s_register_operand" "=r")
        !          5630:        (mem:SI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5631:                          (match_operator:SI 2 "shift_operator"
        !          5632:                           [(match_operand:SI 3 "s_register_operand" "r")
        !          5633:                            (match_operand:SI 4 "const_shift_operand" "n")]))))
        !          5634:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5635:        (minus:SI (match_dup 1) (match_op_dup 2 [(match_dup 3)
        !          5636:                                                 (match_dup 4)])))]
        !          5637:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5638:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5639:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5640:   "*
        !          5641: {
        !          5642:   char instr[100];
        !          5643: 
        !          5644:   sprintf (instr, \"ldr\\t%%5, [%%0, -%%3, %s %%4]!\",
        !          5645:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5646:   return arm_output_asm_insn (instr, operands);
        !          5647: }
        !          5648: "
        !          5649: [(set_attr "type" "load")])
        !          5650: 
        !          5651: (define_insn ""
        !          5652:   [(set (match_operand:HI 5 "s_register_operand" "=r")
        !          5653:        (mem:HI (plus:SI (match_operator:SI 2 "shift_operator"
        !          5654:                          [(match_operand:SI 3 "s_register_operand" "r")
        !          5655:                           (match_operand:SI 4 "const_shift_operand" "n")])
        !          5656:                         (match_operand:SI 1 "s_register_operand" "0"))))
        !          5657:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5658:        (plus:SI (match_op_dup 2 [(match_dup 3) (match_dup 4)])
        !          5659:                 (match_dup 1)))]
        !          5660:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5661:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5662:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5663:   "*
        !          5664: {
        !          5665:   char instr[100];
        !          5666: 
        !          5667:   sprintf (instr, \"ldr\\t%%5, [%%0, %%3, %s %%4]!\\t@ loadhi\",
        !          5668:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5669:   return arm_output_asm_insn (instr, operands);
        !          5670: }
        !          5671: "
        !          5672: [(set_attr "type" "load")])
        !          5673: 
        !          5674: (define_insn ""
        !          5675:   [(set (match_operand:HI 5 "s_register_operand" "=r")
        !          5676:        (mem:HI (minus:SI (match_operand:SI 1 "s_register_operand" "0")
        !          5677:                          (match_operator:SI 2 "shift_operator"
        !          5678:                           [(match_operand:SI 3 "s_register_operand" "r")
        !          5679:                            (match_operand:SI 4 "const_shift_operand" "n")]))))
        !          5680:    (set (match_operand:SI 0 "s_register_operand" "=r")
        !          5681:        (minus:SI (match_dup 1) (match_op_dup 2 [(match_dup 3)
        !          5682:                                                 (match_dup 4)])))]
        !          5683:   "REGNO (operands[0]) != FRAME_POINTER_REGNUM
        !          5684:    && REGNO (operands[1]) != FRAME_POINTER_REGNUM
        !          5685:    && REGNO (operands[3]) != FRAME_POINTER_REGNUM"
        !          5686:   "*
        !          5687: {
        !          5688:   char instr[100];
        !          5689: 
        !          5690:   sprintf (instr, \"ldr\\t%%5, [%%0, -%%3, %s %%4]!\\t@ loadhi\",
        !          5691:           shift_instr (GET_CODE (operands[2]), &operands[4]));
        !          5692:   return arm_output_asm_insn (instr, operands);
        !          5693: }
        !          5694: "
        !          5695: [(set_attr "type" "load")])
        !          5696: 
        !          5697: ; It can also support extended post-inc expressions, but combine doesn't
        !          5698: ; try these....
        !          5699: ; It doesn't seem worth adding peepholes for anything but the most common
        !          5700: ; cases since, unlike combine, the increment must immediately follow the load
        !          5701: ; for this pattern to match.
        !          5702: ; When loading we must watch to see that the base register isn't trampled by
        !          5703: ; the load.  In such cases this isn't a post-inc expression.
        !          5704: 
        !          5705: (define_peephole
        !          5706:   [(set (mem:QI (match_operand:SI 0 "s_register_operand" "+r"))
        !          5707:        (match_operand:QI 2 "s_register_operand" "r"))
        !          5708:    (set (match_dup 0)
        !          5709:        (plus:SI (match_dup 0) (match_operand:SI 1 "index_operand" "rJ")))]
        !          5710:   ""
        !          5711:   "*
        !          5712:   return arm_output_asm_insn (\"strb\\t%2, [%0], %1\", operands);
        !          5713: ")
        !          5714: 
        !          5715: (define_peephole
        !          5716:   [(set (match_operand:QI 0 "s_register_operand" "=r")
        !          5717:        (mem:QI (match_operand:SI 1 "s_register_operand" "+r")))
        !          5718:    (set (match_dup 1)
        !          5719:        (plus:SI (match_dup 1) (match_operand:SI 2 "index_operand" "rJ")))]
        !          5720:   "REGNO(operands[0]) != REGNO(operands[1])
        !          5721:    && (GET_CODE (operands[2]) != REG
        !          5722:        || REGNO(operands[0]) != REGNO (operands[2]))"
        !          5723:   "*
        !          5724:   return arm_output_asm_insn (\"ldrb\\t%0, [%1], %2\", operands);
        !          5725: ")
        !          5726: 
        !          5727: (define_peephole
        !          5728:   [(set (mem:SI (match_operand:SI 0 "s_register_operand" "+r"))
        !          5729:        (match_operand:SI 2 "s_register_operand" "r"))
        !          5730:    (set (match_dup 0)
        !          5731:        (plus:SI (match_dup 0) (match_operand:SI 1 "index_operand" "rJ")))]
        !          5732:   ""
        !          5733:   "*
        !          5734:   return arm_output_asm_insn (\"str\\t%2, [%0], %1\", operands);
        !          5735: ")
        !          5736: 
        !          5737: (define_peephole
        !          5738:   [(set (match_operand:HI 0 "s_register_operand" "=r")
        !          5739:        (mem:HI (match_operand:SI 1 "s_register_operand" "+r")))
        !          5740:    (set (match_dup 1)
        !          5741:        (plus:SI (match_dup 1) (match_operand:SI 2 "index_operand" "rJ")))]
        !          5742:   "REGNO(operands[0]) != REGNO(operands[1])
        !          5743:    && (GET_CODE (operands[2]) != REG
        !          5744:        || REGNO(operands[0]) != REGNO (operands[2]))"
        !          5745:   "*
        !          5746:   return arm_output_asm_insn (\"ldr\\t%0, [%1], %2\\t@ loadhi\", operands);
        !          5747: ")
        !          5748: 
        !          5749: (define_peephole
        !          5750:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          5751:        (mem:SI (match_operand:SI 1 "s_register_operand" "+r")))
        !          5752:    (set (match_dup 1)
        !          5753:        (plus:SI (match_dup 1) (match_operand:SI 2 "index_operand" "rJ")))]
        !          5754:   "REGNO(operands[0]) != REGNO(operands[1])
        !          5755:    && (GET_CODE (operands[2]) != REG
        !          5756:        || REGNO(operands[0]) != REGNO (operands[2]))"
        !          5757:   "*
        !          5758:   return arm_output_asm_insn (\"ldr\\t%0, [%1], %2\", operands);
        !          5759: ")
        !          5760: 
        !          5761: ; This pattern is never tried by combine, so do it as a peephole
        !          5762: 
        !          5763: (define_peephole
        !          5764:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          5765:        (match_operand:SI 1 "s_register_operand" "r"))
        !          5766:    (set (match_operand 2 "cc_register" "")
        !          5767:        (compare (match_dup 1) (const_int 0)))]
        !          5768:   ""
        !          5769:   "*
        !          5770:   return arm_output_asm_insn (\"subs\\t%0, %1, #0\", operands);
        !          5771: "
        !          5772: [(set_attr "conds" "set")])
        !          5773: 
        !          5774: ; Peepholes to spot possible load- and store-multiples, if the ordering is
        !          5775: ; reversed, check that the memory references aren't volatile.
        !          5776: 
        !          5777: (define_peephole
        !          5778:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          5779:         (mem:SI (plus:SI (match_operand:SI 1 "s_register_operand" "r")
        !          5780:                          (const_int 12))))
        !          5781:    (set (match_operand:SI 2 "s_register_operand" "=r")
        !          5782:         (mem:SI (plus:SI (match_dup 1) (const_int 8))))
        !          5783:    (set (match_operand:SI 3 "s_register_operand" "=r")
        !          5784:         (mem:SI (plus:SI (match_dup 1) (const_int 4))))
        !          5785:    (set (match_operand:SI 4 "s_register_operand" "=r")
        !          5786:         (mem:SI (match_dup 1)))]
        !          5787:   "REGNO (operands[0]) > REGNO (operands[2])
        !          5788:    && REGNO (operands[2]) > REGNO (operands[3])
        !          5789:    && REGNO (operands[3]) > REGNO (operands[4])
        !          5790:    && !(REGNO (operands[1]) == REGNO (operands[0])
        !          5791:        || REGNO (operands[1]) == REGNO (operands[2])
        !          5792:        || REGNO (operands[1]) == REGNO (operands[3])
        !          5793:        || REGNO (operands[1]) == REGNO (operands[4]))
        !          5794:    && !MEM_VOLATILE_P (SET_SRC (PATTERN (insn)))
        !          5795:    && !MEM_VOLATILE_P (SET_SRC (PATTERN (prev_nonnote_insn (insn))))
        !          5796:    && !MEM_VOLATILE_P (SET_SRC (PATTERN (prev_nonnote_insn
        !          5797:                                         (prev_nonnote_insn (insn)))))
        !          5798:    && !MEM_VOLATILE_P (SET_SRC (PATTERN (prev_nonnote_insn
        !          5799:                                         (prev_nonnote_insn 
        !          5800:                                          (prev_nonnote_insn (insn))))))"
        !          5801:   "*
        !          5802:   return arm_output_asm_insn (\"ldmia\\t%1, {%4, %3, %2, %0}\\t@ phole ldm\",
        !          5803:                              operands);
        !          5804: ")
        !          5805: 
        !          5806: (define_peephole
        !          5807:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          5808:         (mem:SI (plus:SI (match_operand:SI 1 "s_register_operand" "r")
        !          5809:                          (const_int 8))))
        !          5810:    (set (match_operand:SI 2 "s_register_operand" "=r")
        !          5811:         (mem:SI (plus:SI (match_dup 1) (const_int 4))))
        !          5812:    (set (match_operand:SI 3 "s_register_operand" "=r")
        !          5813:         (mem:SI (match_dup 1)))]
        !          5814:   "REGNO (operands[0]) >  REGNO (operands[2])
        !          5815:    && REGNO (operands[2]) > REGNO (operands[3])
        !          5816:    && !(REGNO (operands[1]) == REGNO (operands[0])
        !          5817:        || REGNO (operands[1]) == REGNO (operands[2])
        !          5818:        || REGNO (operands[1]) == REGNO (operands[3]))
        !          5819:    && !MEM_VOLATILE_P (SET_SRC (PATTERN (insn)))
        !          5820:    && !MEM_VOLATILE_P (SET_SRC (PATTERN (prev_nonnote_insn (insn))))
        !          5821:    && !MEM_VOLATILE_P (SET_SRC (PATTERN (prev_nonnote_insn
        !          5822:                                         (prev_nonnote_insn (insn)))))"
        !          5823:   "*
        !          5824:   return arm_output_asm_insn (\"ldmia\\t%1, {%3, %2, %0}\\t@ phole ldm\",
        !          5825:                              operands);
        !          5826: ")
        !          5827: 
        !          5828: (define_peephole
        !          5829:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          5830:         (mem:SI (plus:SI (match_operand:SI 1 "s_register_operand" "r")
        !          5831:                          (const_int 4))))
        !          5832:    (set (match_operand:SI 2 "s_register_operand" "=r")
        !          5833:         (mem:SI (match_dup 1)))]
        !          5834:   "REGNO (operands[0]) > REGNO (operands[2])
        !          5835:    && !(REGNO (operands[1]) == REGNO (operands[0])
        !          5836:        || REGNO (operands[1]) == REGNO (operands[2]))
        !          5837:    && !MEM_VOLATILE_P (SET_SRC (PATTERN (insn)))
        !          5838:    && !MEM_VOLATILE_P (SET_SRC (PATTERN (prev_nonnote_insn (insn))))"
        !          5839:   "*
        !          5840:   return arm_output_asm_insn (\"ldmia\\t%1, {%2, %0}\\t@ phole ldm\",
        !          5841:                              operands);
        !          5842: ")
        !          5843: 
        !          5844: (define_peephole
        !          5845:   [(set (mem:SI (plus:SI (match_operand:SI 1 "s_register_operand" "r")
        !          5846:                          (const_int 12)))
        !          5847:         (match_operand:SI 0 "s_register_operand" "r"))
        !          5848:    (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
        !          5849:         (match_operand:SI 2 "s_register_operand" "r"))
        !          5850:    (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
        !          5851:         (match_operand:SI 3 "s_register_operand" "r"))
        !          5852:    (set (mem:SI (match_dup 1))
        !          5853:         (match_operand:SI 4 "s_register_operand" "r"))]
        !          5854:   "REGNO (operands[0]) >  REGNO (operands[2])
        !          5855:    && REGNO (operands[2]) > REGNO (operands[3])
        !          5856:    && REGNO (operands[3]) > REGNO (operands[4])
        !          5857:    && !MEM_VOLATILE_P (SET_DEST (PATTERN (insn)))
        !          5858:    && !MEM_VOLATILE_P (SET_DEST (PATTERN (prev_nonnote_insn (insn))))
        !          5859:    && !MEM_VOLATILE_P (SET_DEST (PATTERN (prev_nonnote_insn
        !          5860:                                          (prev_nonnote_insn (insn)))))
        !          5861:    && !MEM_VOLATILE_P (SET_DEST (PATTERN (prev_nonnote_insn
        !          5862:                                          (prev_nonnote_insn 
        !          5863:                                           (prev_nonnote_insn (insn))))))"
        !          5864:   "*
        !          5865:   return arm_output_asm_insn (\"stmia\\t%1, {%4, %3, %2, %0}\\t@ phole stm\",
        !          5866:                              operands);
        !          5867: ")
        !          5868: 
        !          5869: (define_peephole
        !          5870:   [(set (mem:SI (plus:SI (match_operand:SI 1 "s_register_operand" "r")
        !          5871:                          (const_int 8)))
        !          5872:         (match_operand:SI 0 "s_register_operand" "r"))
        !          5873:    (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
        !          5874:         (match_operand:SI 2 "s_register_operand" "r"))
        !          5875:    (set (mem:SI (match_dup 1))
        !          5876:         (match_operand:SI 3 "s_register_operand" "r"))]
        !          5877:   "REGNO (operands[0]) >  REGNO (operands[2])
        !          5878:    && REGNO (operands[2]) > REGNO (operands[3])
        !          5879:    && !MEM_VOLATILE_P (SET_DEST (PATTERN (insn)))
        !          5880:    && !MEM_VOLATILE_P (SET_DEST (PATTERN (prev_nonnote_insn (insn))))
        !          5881:    && !MEM_VOLATILE_P (SET_DEST (PATTERN (prev_nonnote_insn
        !          5882:                                          (prev_nonnote_insn (insn)))))"
        !          5883:   "*
        !          5884:   return arm_output_asm_insn (\"stmia\\t%1, {%3, %2, %0}\\t@ phole stm\",
        !          5885:                              operands);
        !          5886: ")
        !          5887: 
        !          5888: (define_peephole
        !          5889:   [(set (mem:SI (plus:SI (match_operand:SI 1 "s_register_operand" "r")
        !          5890:                          (const_int 4)))
        !          5891:         (match_operand:SI 0 "s_register_operand" "r"))
        !          5892:    (set (mem:SI (match_dup 1))
        !          5893:         (match_operand:SI 2 "s_register_operand" "r"))]
        !          5894:   "REGNO (operands[0]) >  REGNO (operands[2])
        !          5895:    && !MEM_VOLATILE_P (SET_DEST (PATTERN (insn)))
        !          5896:    && !MEM_VOLATILE_P (SET_DEST (PATTERN (prev_nonnote_insn (insn))))"
        !          5897:   "*
        !          5898:   return arm_output_asm_insn (\"stmia\\t%1, {%2, %0}\\t@ phole stm\",
        !          5899:                              operands);
        !          5900: ")
        !          5901: 
        !          5902: ;; A call followed by return can be replaced by restoring the regs and
        !          5903: ;; jumping to the subroutine, provided we aren't passing the address of
        !          5904: ;; any of our local variables.  If we call alloca then this is unsafe
        !          5905: ;; since restoring the frame frees the memory, which is not what we want.
        !          5906: ;; Sometimes the return might have been targeted by the final prescan:
        !          5907: ;; if so then emit a propper return insn as well.
        !          5908: ;; Unfortunately, if the frame pointer is required, we don't know if the
        !          5909: ;; current function has any implicit stack pointer adjustments that will 
        !          5910: ;; be restored by the return: we can't therefore do a tail call.
        !          5911: ;; Another unfortunate that we can't handle is if current_function_args_size
        !          5912: ;; is non-zero: in this case elimination of the argument pointer assumed
        !          5913: ;; that lr was pushed onto the stack, so eliminating upsets the offset
        !          5914: ;; calculations.
        !          5915: 
        !          5916: (define_peephole
        !          5917:   [(parallel [(call (mem:SI (match_operand:SI 0 "" "i"))
        !          5918:                          (match_operand:SI 1 "general_operand" "g"))
        !          5919:                    (clobber (reg:SI 14))])
        !          5920:    (return)]
        !          5921:   "(GET_CODE (operands[0]) == SYMBOL_REF && USE_RETURN_INSN
        !          5922:     && !get_frame_size () && !current_function_calls_alloca
        !          5923:     && !frame_pointer_needed && !current_function_args_size)"
        !          5924:   "*
        !          5925: {
        !          5926:   extern rtx arm_target_insn;
        !          5927:   extern int arm_ccfsm_state, arm_current_cc;
        !          5928: 
        !          5929:   if (arm_ccfsm_state && arm_target_insn && INSN_DELETED_P (arm_target_insn))
        !          5930:   {
        !          5931:     arm_current_cc ^= 1;
        !          5932:     output_return_instruction (NULL, TRUE);
        !          5933:     arm_ccfsm_state = 0;
        !          5934:     arm_target_insn = NULL;
        !          5935:   }
        !          5936: 
        !          5937:   output_return_instruction (NULL, FALSE);
        !          5938:   return (arm_output_asm_insn (\"b\\t%a0\", operands));
        !          5939: }"
        !          5940: [(set (attr "conds")
        !          5941:       (if_then_else (eq_attr "cpu" "arm6")
        !          5942:                    (const_string "clob")
        !          5943:                    (const_string "nocond")))
        !          5944:  (set_attr "length" "2")])
        !          5945: 
        !          5946: (define_peephole
        !          5947:   [(parallel [(set (match_operand 0 "s_register_operand" "=rf")
        !          5948:                   (call (mem:SI (match_operand:SI 1 "" "i"))
        !          5949:                         (match_operand:SI 2 "general_operand" "g")))
        !          5950:              (clobber (reg:SI 14))])
        !          5951:    (return)]
        !          5952:   "(GET_CODE (operands[1]) == SYMBOL_REF && USE_RETURN_INSN
        !          5953:     && !get_frame_size () && !current_function_calls_alloca
        !          5954:     && !frame_pointer_needed && !current_function_args_size)"
        !          5955:   "*
        !          5956: {
        !          5957:   extern rtx arm_target_insn;
        !          5958:   extern int arm_ccfsm_state, arm_current_cc;
        !          5959: 
        !          5960:   if (arm_ccfsm_state && arm_target_insn && INSN_DELETED_P (arm_target_insn))
        !          5961:   {
        !          5962:     arm_current_cc ^= 1;
        !          5963:     output_return_instruction (NULL, TRUE);
        !          5964:     arm_ccfsm_state = 0;
        !          5965:     arm_target_insn = NULL;
        !          5966:   }
        !          5967: 
        !          5968:   output_return_instruction (NULL, FALSE);
        !          5969:   return (arm_output_asm_insn (\"b\\t%a1\", operands));
        !          5970: }"
        !          5971: [(set (attr "conds")
        !          5972:       (if_then_else (eq_attr "cpu" "arm6")
        !          5973:                    (const_string "clob")
        !          5974:                    (const_string "nocond")))
        !          5975:  (set_attr "length" "2")])
        !          5976: 
        !          5977: ;; As above but when this function is not void, we must be returning the
        !          5978: ;; result of the called subroutine.
        !          5979: 
        !          5980: (define_peephole
        !          5981:   [(parallel [(set (match_operand 0 "s_register_operand" "=rf")
        !          5982:                   (call (mem:SI (match_operand:SI 1 "" "i"))
        !          5983:                         (match_operand:SI 2 "general_operand" "g")))
        !          5984:              (clobber (reg:SI 14))])
        !          5985:    (use (match_dup 0))
        !          5986:    (return)]
        !          5987:   "(GET_CODE (operands[1]) == SYMBOL_REF && USE_RETURN_INSN
        !          5988:     && !get_frame_size () && !current_function_calls_alloca
        !          5989:     && !frame_pointer_needed && !current_function_args_size)"
        !          5990:   "*
        !          5991: {
        !          5992:   extern rtx arm_target_insn;
        !          5993:   extern int arm_ccfsm_state, arm_current_cc;
        !          5994: 
        !          5995:   if (arm_ccfsm_state && arm_target_insn && INSN_DELETED_P (arm_target_insn))
        !          5996:   {
        !          5997:     arm_current_cc ^= 1;
        !          5998:     output_return_instruction (NULL, TRUE);
        !          5999:     arm_ccfsm_state = 0;
        !          6000:     arm_target_insn = NULL;
        !          6001:   }
        !          6002: 
        !          6003:   output_return_instruction (NULL, FALSE);
        !          6004:   return (arm_output_asm_insn (\"b\\t%a1\", operands));
        !          6005: }"
        !          6006: [(set (attr "conds")
        !          6007:       (if_then_else (eq_attr "cpu" "arm6")
        !          6008:                    (const_string "clob")
        !          6009:                    (const_string "nocond")))
        !          6010:  (set_attr "length" "2")])
        !          6011: 
        !          6012: ;; If calling a subroutine and then jumping back to somewhere else, but not
        !          6013: ;; too far away, then we can set the link register with the branch address
        !          6014: ;; and jump direct to the subroutine.  On return from the subroutine
        !          6015: ;; execution continues at the branch; this avoids a prefetch stall.
        !          6016: ;; We use the length attribute (via short_branch ()) to establish whether or
        !          6017: ;; not this is possible, this is the same asthe sparc does.
        !          6018: 
        !          6019: (define_peephole
        !          6020:   [(parallel[(call (mem:SI (match_operand:SI 0 "" "i"))
        !          6021:                    (match_operand:SI 1 "general_operand" "g"))
        !          6022:              (clobber (reg:SI 14))])
        !          6023:    (set (pc)
        !          6024:         (label_ref (match_operand 2 "" "")))]
        !          6025:   "GET_CODE (operands[0]) == SYMBOL_REF 
        !          6026:    && short_branch (INSN_UID (insn), INSN_UID (operands[2]))
        !          6027:    && arm_insn_not_targeted (insn)"
        !          6028:   "*
        !          6029: {
        !          6030:   int backward = arm_backwards_branch (INSN_UID (insn),
        !          6031:                                       INSN_UID (operands[2]));
        !          6032: 
        !          6033: #if 0
        !          6034:   /* Putting this in means that TARGET_6 code will ONLY run on an arm6 or
        !          6035:    * above, leaving it out means that the code will still run on an arm 2 or 3
        !          6036:    */
        !          6037:   if (TARGET_6)
        !          6038:     {
        !          6039:       if (backward)
        !          6040:        arm_output_asm_insn (\"sub\\tlr, pc, #(8 + . -%l2)\", operands);
        !          6041:       else
        !          6042:        arm_output_asm_insn (\"add\\tlr, pc, #(%l2 - . -8)\", operands);
        !          6043:     }
        !          6044:   else
        !          6045: #endif
        !          6046:     {
        !          6047:       arm_output_asm_insn (\"mov\\tlr, pc\\t@ protect cc\");
        !          6048:       if (backward)
        !          6049:        arm_output_asm_insn (\"sub\\tlr, lr, #(4 + . -%l2)\", operands);
        !          6050:       else
        !          6051:        arm_output_asm_insn (\"add\\tlr, lr, #(%l2 - . -4)\", operands);
        !          6052:     }
        !          6053:   return arm_output_asm_insn (\"b\\t%a0\", operands);
        !          6054: }"
        !          6055: [(set (attr "conds")
        !          6056:       (if_then_else (eq_attr "cpu" "arm6")
        !          6057:                    (const_string "clob")
        !          6058:                    (const_string "nocond")))
        !          6059:  (set (attr "length")
        !          6060:       (if_then_else (eq_attr "cpu" "arm6")
        !          6061:                    (const_int 2)
        !          6062:                    (const_int 3)))])
        !          6063: 
        !          6064: (define_peephole
        !          6065:   [(parallel[(set (match_operand:SI 0 "s_register_operand" "=r")
        !          6066:                  (call (mem:SI (match_operand:SI 1 "" "i"))
        !          6067:                         (match_operand:SI 2 "general_operand" "g")))
        !          6068:              (clobber (reg:SI 14))])
        !          6069:    (set (pc)
        !          6070:         (label_ref (match_operand 3 "" "")))]
        !          6071:   "GET_CODE (operands[0]) == SYMBOL_REF
        !          6072:    && short_branch (INSN_UID (insn), INSN_UID (operands[3]))
        !          6073:    && arm_insn_not_targeted (insn)"
        !          6074:   "*
        !          6075: {
        !          6076:   int backward = arm_backwards_branch (INSN_UID (insn),
        !          6077:                                       INSN_UID (operands[3]));
        !          6078: 
        !          6079: #if 0
        !          6080:   /* Putting this in means that TARGET_6 code will ONLY run on an arm6 or
        !          6081:    * above, leaving it out means that the code will still run on an arm 2 or 3
        !          6082:    */
        !          6083:   if (TARGET_6)
        !          6084:     {
        !          6085:       if (backward)
        !          6086:        arm_output_asm_insn (\"sub\\tlr, pc, #(8 + . -%l3)\", operands);
        !          6087:       else
        !          6088:        arm_output_asm_insn (\"add\\tlr, pc, #(%l3 - . -8)\", operands);
        !          6089:     }
        !          6090:   else
        !          6091: #endif
        !          6092:     {
        !          6093:       arm_output_asm_insn (\"mov\\tlr, pc\\t@ protect cc\");
        !          6094:       if (backward)
        !          6095:        arm_output_asm_insn (\"sub\\tlr, lr, #(4 + . -%l3)\", operands);
        !          6096:       else
        !          6097:        arm_output_asm_insn (\"add\\tlr, lr, #(%l3 - . -4)\", operands);
        !          6098:     }
        !          6099:   return arm_output_asm_insn (\"b\\t%a1\", operands);
        !          6100: }"
        !          6101: [(set (attr "conds")
        !          6102:       (if_then_else (eq_attr "cpu" "arm6")
        !          6103:                    (const_string "clob")
        !          6104:                    (const_string "nocond")))
        !          6105:  (set (attr "length")
        !          6106:       (if_then_else (eq_attr "cpu" "arm6")
        !          6107:                    (const_int 2)
        !          6108:                    (const_int 3)))])
        !          6109: 
        !          6110: (define_split
        !          6111:   [(set (pc)
        !          6112:        (if_then_else (match_operator 0 "comparison_operator"
        !          6113:                       [(match_operator:SI 1 "shift_operator"
        !          6114:                         [(match_operand:SI 2 "s_register_operand" "r")
        !          6115:                          (match_operand:SI 3 "nonmemory_operand" "rn")])
        !          6116:                        (match_operand:SI 4 "s_register_operand" "r")])
        !          6117:                      (label_ref (match_operand 5 "" ""))
        !          6118:                      (pc)))
        !          6119:    (clobber (reg 24))]
        !          6120:   ""
        !          6121:   [(set (reg:CC 24)
        !          6122:        (compare:CC (match_dup 4)
        !          6123:                    (match_op_dup 1 [(match_dup 2) (match_dup 3)])))
        !          6124:    (set (pc)
        !          6125:        (if_then_else (match_op_dup 0 [(reg 24) (const_int 0)])
        !          6126:                      (label_ref (match_dup 5))
        !          6127:                      (pc)))]
        !          6128:   "
        !          6129:   operands[0] = gen_rtx (swap_condition (GET_CODE (operands[0])), VOIDmode,
        !          6130:                         operands[1], operands[2]);
        !          6131: ")
        !          6132: 
        !          6133: (define_split
        !          6134:   [(set (match_operand:SI 0 "s_register_operand" "")
        !          6135:        (and:SI (ge:SI (match_operand:SI 1 "s_register_operand" "")
        !          6136:                       (const_int 0))
        !          6137:                (neg:SI (match_operator:SI 2 "comparison_operator"
        !          6138:                         [(match_operand:SI 3 "s_register_operand" "")
        !          6139:                          (match_operand:SI 4 "arm_rhs_operand" "")]))))
        !          6140:    (clobber (match_operand:SI 5 "s_register_operand" ""))]
        !          6141:   ""
        !          6142:   [(set (match_dup 5) (not:SI (ashiftrt:SI (match_dup 1) (const_int 31))))
        !          6143:    (set (match_dup 0) (and:SI (match_op_dup 2 [(match_dup 3) (match_dup 4)])
        !          6144:                              (match_dup 5)))]
        !          6145:   "")
        !          6146: 
        !          6147: ;; This pattern can be used because cc_noov mode implies that the following
        !          6148: ;; branch will be an equality (EQ or NE), so the sign extension is not
        !          6149: ;; needed.  Combine doesn't eliminate these because by the time it sees the
        !          6150: ;; branch it no-longer knows that the data came from memory.
        !          6151: 
        !          6152: (define_insn ""
        !          6153:   [(set (reg:CC_NOOV 24)
        !          6154:        (compare:CC_NOOV
        !          6155:         (ashift:SI (subreg:SI (match_operand:QI 0 "memory_operand" "m") 0)
        !          6156:                    (const_int 24))
        !          6157:         (match_operand 1 "immediate_operand" "I")))
        !          6158:    (clobber (match_scratch:SI 2 "=r"))]
        !          6159:   "((unsigned long) INTVAL (operands[1]))
        !          6160:    == (((unsigned long) INTVAL (operands[1])) >> 24) << 24"
        !          6161:   "*
        !          6162:   operands[1] = GEN_INT (((unsigned long) INTVAL (operands[1])) >> 24);
        !          6163:   arm_output_asm_insn (\"ldrb\\t%2, %0\", operands);
        !          6164:   return arm_output_asm_insn (\"cmp\\t%2, %1\", operands);
        !          6165: "
        !          6166: [(set_attr "conds" "set")
        !          6167:  (set_attr "length" "2")
        !          6168:  (set_attr "type" "load")])
        !          6169: 
        !          6170: (define_expand "save_stack_nonlocal"
        !          6171:   [(match_operand:DI 0 "memory_operand" "")
        !          6172:    (match_operand:SI 1 "s_register_operand" "")]
        !          6173:   ""
        !          6174:   "
        !          6175: {
        !          6176:   /* We also need to save the frame pointer for non-local gotos */
        !          6177:   emit_move_insn (operand_subword (operands[0], 0, 0, DImode),
        !          6178:                  hard_frame_pointer_rtx);
        !          6179:   emit_move_insn (operand_subword (operands[0], 1, 0, DImode), operands[1]);
        !          6180:   DONE;
        !          6181: }")
        !          6182: 
        !          6183: (define_expand "restore_stack_nonlocal"
        !          6184:   [(match_operand:SI 0 "s_register_operand" "")
        !          6185:    (match_operand:DI 1 "memory_operand" "")]
        !          6186:   ""
        !          6187:   "
        !          6188: {
        !          6189:   /* Restore the frame pointer first, the stack pointer second. */
        !          6190:   emit_move_insn (operands[0], operand_subword (operands[1], 1, 0, DImode));
        !          6191:   emit_move_insn (hard_frame_pointer_rtx, operand_subword (operands[1], 0, 0,
        !          6192:                                                           DImode));
        !          6193:   DONE;
        !          6194: }")
        !          6195: 
        !          6196: ;; This split is only used during output to reduce the number of patterns
        !          6197: ;; that need assembler instructions adding to them.  We allowed the setting
        !          6198: ;; of the conditions to be implicit during rtl generation so that
        !          6199: ;; the conditional compare patterns would work.  However this conflicts to
        !          6200: ;; some extend with the conditional data operations, so we have to split them
        !          6201: ;; up again here.
        !          6202: 
        !          6203: (define_split
        !          6204:   [(set (match_operand:SI 0 "s_register_operand" "")
        !          6205:        (if_then_else:SI (match_operator 1 "comparison_operator"
        !          6206:                          [(match_operand 2 "" "") (match_operand 3 "" "")])
        !          6207:                         (match_operand 4 "" "")
        !          6208:                         (match_operand 5 "" "")))
        !          6209:    (clobber (reg 24))]
        !          6210:   "reload_completed"
        !          6211:   [(set (match_dup 6) (match_dup 7))
        !          6212:    (set (match_dup 0) 
        !          6213:        (if_then_else:SI (match_op_dup 1 [(match_dup 6) (const_int 0)])
        !          6214:                         (match_dup 4)
        !          6215:                         (match_dup 5)))]
        !          6216:   "
        !          6217: {
        !          6218:   enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), operands[2],
        !          6219:                                           operands[3]);
        !          6220: 
        !          6221:   operands[6] = gen_rtx (REG, mode, 24);
        !          6222:   operands[7] = gen_rtx (COMPARE, mode, operands[2], operands[3]);
        !          6223: }
        !          6224: ")
        !          6225: 
        !          6226: 
        !          6227: (define_insn ""
        !          6228:   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
        !          6229:        (if_then_else:SI (match_operator 4 "comparison_operator"
        !          6230:                          [(match_operand 3 "cc_register" "") (const_int 0)])
        !          6231:                         (match_operand:SI 1 "arm_rhs_operand" "0,?rI")
        !          6232:                         (not:SI
        !          6233:                          (match_operand:SI 2 "s_register_operand" "r,r"))))]
        !          6234:   ""
        !          6235:   "*
        !          6236:   if (which_alternative != 0)
        !          6237:     arm_output_asm_insn (\"mov%d4\\t%0, %1\", operands);
        !          6238:   return arm_output_asm_insn (\"mvn%D4\\t%0, %2\", operands);
        !          6239: "
        !          6240: [(set_attr "conds" "use")
        !          6241:  (set_attr "length" "1,2")])
        !          6242: 
        !          6243: ;; The next two patterns occur when an AND operation is followed by a
        !          6244: ;; scc insn sequence 
        !          6245: 
        !          6246: (define_insn ""
        !          6247:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          6248:        (sign_extract:SI (match_operand:SI 1 "s_register_operand" "r")
        !          6249:                         (const_int 1)
        !          6250:                         (match_operand:SI 2 "immediate_operand" "n")))]
        !          6251:   ""
        !          6252:   "*
        !          6253:   operands[2] = GEN_INT (1 << INTVAL (operands[2]));
        !          6254:   arm_output_asm_insn (\"ands\\t%0, %1, %2\", operands);
        !          6255:   return arm_output_asm_insn (\"mvnne\\t%0, #0\", operands);
        !          6256: "
        !          6257: [(set_attr "conds" "clob")
        !          6258:  (set_attr "length" "2")])
        !          6259: 
        !          6260: (define_insn ""
        !          6261:   [(set (match_operand:SI 0 "s_register_operand" "=r")
        !          6262:        (not:SI
        !          6263:         (sign_extract:SI (match_operand:SI 1 "s_register_operand" "r")
        !          6264:                          (const_int 1)
        !          6265:                          (match_operand:SI 2 "immediate_operand" "n"))))]
        !          6266:   ""
        !          6267:   "*
        !          6268:   operands[2] = GEN_INT (1 << INTVAL (operands[2]));
        !          6269:   arm_output_asm_insn (\"tst\\t%1, %2\", operands);
        !          6270:   arm_output_asm_insn (\"mvneq\\t%0, #0\", operands);
        !          6271:   return arm_output_asm_insn (\"movne\\t%0, #0\", operands);
        !          6272: "
        !          6273: [(set_attr "conds" "clob")
        !          6274:  (set_attr "length" "3")])

unix.superglobalmegacorp.com

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