Annotation of gcc/config/arm/arm.md, revision 1.1.1.3

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

unix.superglobalmegacorp.com

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