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

1.1       root        1: ;;- Machine description Acorn RISC Machine for GNU compiler
                      2: ;;  Copyright (C) 1991 Free Software Foundation, Inc.
                      3: ;;  Contributed by Pieter `Tiggr' Schoenmakers ([email protected])
                      4: ;;             and Martin Simmons (@harleqn.co.uk).
                      5: 
                      6: ;; This file is part of GNU CC.
                      7: 
                      8: ;; GNU CC is free software; you can redistribute it and/or modify
                      9: ;; it under the terms of the GNU General Public License as published by
                     10: ;; the Free Software Foundation; either version 2, or (at your option)
                     11: ;; any later version.
                     12: 
                     13: ;; GNU CC is distributed in the hope that it will be useful,
                     14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     16: ;; GNU General Public License for more details.
                     17: 
                     18: ;; You should have received a copy of the GNU General Public License
                     19: ;; along with GNU CC; see the file COPYING.  If not, write to
                     20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     21: 
                     22: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     23: 
                     24: ;; Every template must be output by arm_output_asm_insn, since this keeps
                     25: ;; track of the offset of labels within the text segment.  This is needed to
                     26: ;; to be able to (correctly) output instructions for loading a value from a
                     27: ;; function's constant pool, since different instructions are needed when the
                     28: ;; constant pool is more than 4095 bytes away from the PC.
                     29: 
                     30: ;; Addition insns.
                     31: 
                     32: (define_insn "adddi3"
                     33:   [(set (match_operand:DI 0 "di_operand" "=r")
                     34:        (plus:DI (match_operand:DI 1 "di_operand" "%r")
                     35:                 (match_operand:DI 2 "di_operand" "r")))]
                     36:   ""
                     37:   "*
                     38:   arm_output_asm_insn (\"adds\\t%0, %1, %2\", operands);
                     39:   return (arm_output_asm_insn (\"adc\\t%R0, %R1, %R2\", operands));
                     40: ")
                     41: 
                     42: (define_insn "addsi3"
                     43:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                     44:         (plus:SI (match_operand:SI 1 "register_operand" "r,r")
                     45:                  (match_operand:SI 2 "general_operand" "r,n")))]
                     46:   ""
                     47:   "*
                     48:   switch (which_alternative)
                     49:     {
                     50:     case 0:
                     51:       return (arm_output_asm_insn (\"add\\t%0, %1, %2\", operands));
                     52:     case 1:
                     53:       return (output_add_immediate (operands));
                     54:     }
                     55: ")
                     56: 
                     57: (define_insn "addsf3"
                     58:   [(set (match_operand:SF 0 "register_operand" "=f")
                     59:         (plus:SF (match_operand:SF 1 "register_operand" "f")
                     60:                  (match_operand:SF 2 "fpu_rhs_operand" "fG")))]
                     61:   ""
                     62:   "*
                     63:   return (arm_output_asm_insn (\"adfs\\t%0, %1, %2\", operands));
                     64: ")
                     65: 
                     66: (define_insn "adddf3"
                     67:   [(set (match_operand:DF 0 "register_operand" "=f")
                     68:         (plus:DF (match_operand:DF 1 "register_operand" "f")
                     69:                  (match_operand:DF 2 "fpu_rhs_operand" "fG")))]
                     70:   ""
                     71:   "*
                     72:   return (arm_output_asm_insn (\"adfd\\t%0, %1, %2\", operands));
                     73: ")
                     74: 
                     75: (define_insn "subdi3"
                     76:   [(set (match_operand:DI 0 "di_operand" "=r")
                     77:        (minus:DI (match_operand:DI 1 "di_operand" "%r")
                     78:                  (match_operand:DI 2 "di_operand" "r")))]
                     79:   ""
                     80:   "*
                     81:   arm_output_asm_insn (\"subs\\t%0, %1, %2\", operands);
                     82:   return (arm_output_asm_insn (\"sbc\\t%R0, %R1, %R2\", operands));
                     83: ")
                     84: 
                     85: (define_insn "subsi3"
                     86:   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
                     87:         (minus:SI (match_operand:SI 1 "arm_rhs_operand" "r,r,I")
                     88:                   (match_operand:SI 2 "general_operand" "r,n,r")))]
                     89:   ""
                     90:   "*
                     91:   switch (which_alternative)
                     92:     {
                     93:     case 0:
                     94:       return (arm_output_asm_insn (\"sub\\t%0, %1, %2\", operands));
                     95:     case 1:
                     96:       operands[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2]));
                     97:       return (output_add_immediate (operands));
                     98:     case 2:
                     99:       return (arm_output_asm_insn (\"rsb\\t%0, %2, %1\", operands));
                    100:     }
                    101: ")
                    102: 
                    103: (define_insn "subsf3"
                    104:   [(set (match_operand:SF 0 "register_operand" "=f,f")
                    105:         (minus:SF (match_operand:SF 1 "fpu_rhs_operand" "f,G")
                    106:                   (match_operand:SF 2 "fpu_rhs_operand" "fG,f")))]
                    107:   ""
                    108:   "*
                    109:   switch (which_alternative)
                    110:     {
                    111:     case 0:
                    112:       return (arm_output_asm_insn (\"sufs\\t%0, %1, %2\", operands));
                    113:     case 1:
                    114:       return (arm_output_asm_insn (\"rsfs\\t%0, %2, %1\", operands));
                    115:     }
                    116: ")
                    117: 
                    118: (define_insn "subdf3"
                    119:   [(set (match_operand:DF 0 "register_operand" "=f,f")
                    120:         (minus:DF (match_operand:DF 1 "fpu_rhs_operand" "f,G")
                    121:       (match_operand:DF 2 "fpu_rhs_operand" "fG,f")))]
                    122:   ""
                    123:   "*
                    124:   switch (which_alternative)
                    125:     {
                    126:     case 0:
                    127:       return (arm_output_asm_insn (\"sufd\\t%0, %1, %2\", operands));
                    128:     case 2:
                    129:       return (arm_output_asm_insn (\"rsfd\\t%0, %2, %1\", operands));
                    130:     }
                    131: ")
                    132: 
                    133: ;; Multiplication insns
                    134: 
                    135: ;; The `&' is too strict, but at least generates correct code.
                    136: (define_insn "mulsi3"
                    137:   [(set (match_operand:SI 0 "register_operand" "=&r")
                    138:         (mult:SI (match_operand:SI 1 "register_operand" "%r")
                    139:                  (match_operand:SI 2 "register_operand" "r")))]
                    140:   ""
                    141:   "*
                    142:   if (REGNO (operands[0]) == REGNO (operands[1]))
                    143:     return (arm_output_asm_insn (\"mul\\t%0, %2, %1\", operands));
                    144:   else
                    145:     return (arm_output_asm_insn (\"mul\\t%0, %1, %2\", operands));
                    146: ")
                    147: 
                    148: ;; Unnamed templates to match MLA instruction.
                    149: 
                    150: (define_insn ""
                    151:   [(set (match_operand:SI 0 "register_operand" "=&r")
                    152:         (plus:SI
                    153:           (mult:SI (match_operand:SI 1 "register_operand" "%r")
                    154:                    (match_operand:SI 2 "register_operand" "r"))
                    155:           (match_operand:SI 3 "register_operand" "r")))]
                    156:   ""
                    157:   "*
                    158:   if (REGNO (operands[0]) == REGNO (operands[1]))
                    159:     return (arm_output_asm_insn (\"mla\\t%0, %2, %1, %3\", operands));
                    160:   else
                    161:     return (arm_output_asm_insn (\"mla\\t%0, %1, %2, %3\", operands));
                    162: ")
                    163: 
                    164: (define_insn ""
                    165:   [(set (match_operand:SI 0 "register_operand" "=&r")
                    166:         (plus:SI
                    167:           (match_operand:SI 3 "register_operand" "r")
                    168:           (mult:SI (match_operand:SI 1 "register_operand" "%r")
                    169:                    (match_operand:SI 2 "register_operand" "r"))))]
                    170:   ""
                    171:   "*
                    172:   if (REGNO (operands[0]) == REGNO (operands[1]))
                    173:     return (arm_output_asm_insn (\"mla\\t%0, %2, %1, %3\", operands));
                    174:   else
                    175:     return (arm_output_asm_insn (\"mla\\t%0, %1, %2, %3\", operands));
                    176: ")
                    177: 
                    178: (define_insn "mulsf3"
                    179:   [(set (match_operand:SF 0 "register_operand" "=f")
                    180:         (mult:SF (match_operand:SF 1 "register_operand" "f")
                    181:                  (match_operand:SF 2 "fpu_rhs_operand" "fG")))]
                    182:   ""
                    183:   "*return (arm_output_asm_insn (\"mufs\\t%0, %1, %2\", operands));")
                    184: 
                    185: (define_insn "muldf3"
                    186:   [(set (match_operand:DF 0 "register_operand" "=f")
                    187:         (mult:DF (match_operand:DF 1 "register_operand" "f")
                    188:                  (match_operand:DF 2 "fpu_rhs_operand" "fG")))]
                    189:   ""
                    190:   "*
                    191:   return (arm_output_asm_insn (\"mufd\\t%0, %1, %2\", operands));
                    192: ")
                    193: 
                    194: ;; Division insns
                    195: 
                    196: (define_insn "divsf3"
                    197:   [(set (match_operand:SF 0 "register_operand" "=f,f")
                    198:         (div:SF (match_operand:SF 1 "fpu_rhs_operand" "f,G")
                    199:                 (match_operand:SF 2 "fpu_rhs_operand" "fG,f")))]
                    200:   ""
                    201:   "*
                    202:   switch (which_alternative)
                    203:     {
                    204:     case 0:
                    205:       return (arm_output_asm_insn (\"dvfs\\t%0, %1, %2\", operands));
                    206:     case 1:
                    207:       return (arm_output_asm_insn (\"rdfs\\t%0, %2, %1\", operands));
                    208:     }
                    209: ")
                    210: 
                    211: (define_insn "divdf3"
                    212:   [(set (match_operand:DF 0 "register_operand" "=f,f")
                    213:         (div:DF (match_operand:DF 1 "fpu_rhs_operand" "f,G")
                    214:                 (match_operand:DF 2 "fpu_rhs_operand" "fG,f")))]
                    215:   ""
                    216:   "*
                    217:   switch (which_alternative)
                    218:     {
                    219:     case 0:
                    220:       return (arm_output_asm_insn (\"dvfd\\t%0, %1, %2\", operands));
                    221:     case 1:
                    222:       return (arm_output_asm_insn (\"rdfd\\t%0, %2, %1\", operands));
                    223:     }
                    224: ")
                    225: 
                    226: ;; Modulo insns
                    227: 
                    228: (define_insn "modsf3"
                    229:   [(set (match_operand:SF 0 "register_operand" "=f")
                    230:         (mod:SF (match_operand:SF 1 "register_operand" "f")
                    231:                 (match_operand:SF 2 "fpu_rhs_operand" "fG")))]
                    232:   ""
                    233:   "*
                    234:   return (arm_output_asm_insn (\"rmfs\\t%0, %1, %2\", operands));
                    235: ")
                    236: 
                    237: (define_insn "moddf3"
                    238:   [(set (match_operand:DF 0 "register_operand" "=f")
                    239:         (mod:DF (match_operand:DF 1 "register_operand" "f")
                    240:                 (match_operand:DF 2 "fpu_rhs_operand" "fG")))]
                    241:   ""
                    242:   "*
                    243:   return (arm_output_asm_insn (\"rmfd\\t%0, %1, %2\", operands));
                    244: ")
                    245: 
                    246: ;; Boolean and,ior,xor insns
                    247: 
                    248: (define_insn "anddi3"
                    249:   [(set (match_operand:DI 0 "di_operand" "=r")
                    250:        (and:DI (match_operand:DI 1 "di_operand" "%r")
                    251:                (match_operand:DI 2 "di_operand" "r")))]
                    252:   ""
                    253:   "*
                    254:   arm_output_asm_insn (\"and\\t%0, %1, %2\", operands);
                    255:   return (arm_output_asm_insn (\"and\\t%R0, %R1, %R2\", operands));
                    256: ")
                    257: 
                    258: (define_insn "andsi3"
                    259:   [(set (match_operand:SI 0 "register_operand" "=r")
                    260:         (and:SI (match_operand:SI 1 "register_operand" "r")
                    261:                 (match_operand:SI 2 "arm_rhs_operand" "rI")))]
                    262:   ""
                    263:   "*
                    264:   return (arm_output_asm_insn (\"and\\t%0, %1, %2\", operands));
                    265: ")
                    266: 
                    267: (define_insn "andcbsi3"
                    268:   [(set (match_operand:SI 0 "register_operand" "=r")
                    269:         (and:SI (match_operand:SI 1 "register_operand" "r")
                    270:                 (not:SI (match_operand:SI 2 "arm_rhs_operand" "rI"))))]
                    271:   ""
                    272:   "*
                    273:   return (arm_output_asm_insn (\"bic\\t%0, %1, %2\", operands));
                    274: ")
                    275: 
                    276: (define_insn "iordi3"
                    277:   [(set (match_operand:DI 0 "di_operand" "=r")
                    278:        (ior:DI (match_operand:DI 1 "di_operand" "%r")
                    279:                (match_operand:DI 2 "di_operand" "r")))]
                    280:   ""
                    281:   "*
                    282:   arm_output_asm_insn (\"orr\\t%0, %1, %2\", operands);
                    283:   return (arm_output_asm_insn (\"orr\\t%R0, %R1, %R2\", operands));
                    284: ")
                    285: 
                    286: (define_insn "iorsi3"
                    287:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    288:         (ior:SI (match_operand:SI 1 "register_operand" "r,r")
                    289:                 (match_operand:SI 2 "nonmemory_operand" "r,n")))]
                    290:   ""
                    291:   "*
                    292:   switch (which_alternative)
                    293:     {
                    294:     case 0:
                    295:       return (arm_output_asm_insn (\"orr\\t%0, %1, %2\", operands));
                    296:     case 1:
                    297:       return (output_multi_immediate (operands,
                    298:                                      \"orr\\t%0, %1, %2\", \"orr\\t%0, %0, %2\",
                    299:                                      2, INTVAL (operands[2])));
                    300:     }
                    301: ")
                    302: 
                    303: (define_insn "xorsi3"
                    304:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    305:         (xor:SI (match_operand:SI 1 "register_operand" "r,r")
                    306:                 (match_operand:SI 2 "nonmemory_operand" "r,n")))]
                    307:   ""
                    308:   "*
                    309:   switch (which_alternative)
                    310:     {
                    311:     case 0:
                    312:       return (arm_output_asm_insn (\"eor\\t%0, %1, %2\", operands));
                    313:     case 1:
                    314:       return (output_multi_immediate (operands,
                    315:                                      \"eor\\t%0, %1, %2\", \"eor\\t%0, %0, %2\",
                    316:                                      2, INTVAL (operands[2])));
                    317:     }
                    318: ")
                    319: 
                    320: ;; Shift and rotation insns
                    321: 
                    322: (define_insn "ashlsi3"
                    323:   [(set (match_operand:SI 0 "register_operand" "=r")
                    324:         (ashift:SI (match_operand:SI 1 "register_operand" "r")
                    325:                    (match_operand:SI 2 "general_operand" "rn")))]
                    326:   ""
                    327:   "*
                    328:   return (output_shifted_move (ASHIFT, operands));
                    329: ")
                    330: 
                    331: (define_insn "ashrsi3"
                    332:   [(set (match_operand:SI 0 "register_operand" "=r")
                    333:         (ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
                    334:                      (match_operand:SI 2 "general_operand" "rn")))]
                    335:   ""
                    336:   "*
                    337:   return (output_shifted_move (ASHIFTRT, operands));
                    338: ")
                    339: 
                    340: ;; lshlsi3 is not defined because shift counts cannot be negative
                    341: ;; An unnamed pattern is needed for expansion of zero_extend.
                    342: 
                    343: (define_insn ""
                    344:   [(set (match_operand:SI 0 "register_operand" "=r")
                    345:         (lshift:SI (match_operand:SI 1 "register_operand" "r")
                    346:                    (match_operand:SI 2 "general_operand" "rn")))]
                    347:   ""
                    348:   "*
                    349:   return (output_shifted_move (LSHIFT, operands));
                    350: ")
                    351: 
                    352: (define_insn "lshrsi3"
                    353:   [(set (match_operand:SI 0 "register_operand" "=r")
                    354:         (lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
                    355:                      (match_operand:SI 2 "general_operand" "rn")))]
                    356:   ""
                    357:   "*
                    358:   return (output_shifted_move (LSHIFTRT, operands));
                    359: ")
                    360: 
                    361: ;; rotlsi3 is not defined yet to see what happens
                    362: 
                    363: (define_insn "rotrsi3"
                    364:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    365:         (rotatert:SI (match_operand:SI 1 "register_operand" "r,r")
                    366:                      (match_operand:SI 2 "general_operand" "r,n")))]
                    367:   ""
                    368:   "*
                    369:   switch (which_alternative)
                    370:     {
                    371:     case 0:
                    372:       return (arm_output_asm_insn (\"mov\\t%0, %1,ror %2\", operands));
                    373:     case 1:
                    374:       if (INTVAL(operands[2]) > 31)
                    375:         operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) % 32);
                    376:       return (arm_output_asm_insn (\"mov\\t%0, %1,ror%2\", operands));
                    377:     }
                    378: ")
                    379: 
                    380: ;; Unary arithmetic insns
                    381: 
                    382: (define_insn "negdi2"
                    383:   [(set (match_operand:DI 0 "di_operand" "=r")
                    384:         (neg:DI (match_operand:DI 1 "di_operand" "r")))]
                    385:   ""
                    386:   "*
                    387:   arm_output_asm_insn (\"rsb\\t%0, %1, #0\", operands);
                    388:   return (arm_output_asm_insn (\"rsc\\t%R0, %R1, #0\", operands));
                    389: ")
                    390: 
                    391: (define_insn "negsi2"
                    392:   [(set (match_operand:SI 0 "register_operand" "=r")
                    393:         (neg:SI (match_operand:SI 1 "register_operand" "r")))]
                    394:   ""
                    395:   "*
                    396:   return (arm_output_asm_insn (\"rsb\\t%0, %1, #0\", operands));
                    397: ")
                    398: 
                    399: (define_insn "negsf2"
                    400:   [(set (match_operand:SF 0 "register_operand" "=f")
                    401:         (neg:SF (match_operand:SF 1 "register_operand" "f")))]
                    402:   ""
                    403:   "*
                    404:   return (arm_output_asm_insn (\"mnfs\\t%0, %1\", operands));
                    405: ")
                    406: 
                    407: (define_insn "negdf2"
                    408:   [(set (match_operand:DF 0 "register_operand" "=f")
                    409:         (neg:DF (match_operand:DF 1 "register_operand" "f")))]
                    410:   ""
                    411:   "*
                    412:   return (arm_output_asm_insn (\"mnfd\\t%0, %1\", operands));
                    413: ")
                    414: 
                    415: (define_insn "abssf2"
                    416:   [(set (match_operand:SF 0 "register_operand" "=f")
                    417:          (abs:SF (match_operand:SF 1 "register_operand" "f")))]
                    418:   ""
                    419:   "*
                    420:   return (arm_output_asm_insn (\"abss\\t%0, %1\", operands));
                    421: ")
                    422: 
                    423: (define_insn "absdf2"
                    424:   [(set (match_operand:DF 0 "register_operand" "=f")
                    425:         (abs:DF (match_operand:DF 1 "register_operand" "f")))]
                    426:   ""
                    427:   "*
                    428:   return (arm_output_asm_insn (\"absd\\t%0, %1\", operands));
                    429: ")
                    430: 
                    431: (define_insn "sqrtsf2"
                    432:   [(set (match_operand:SF 0 "register_operand" "=f")
                    433:         (sqrt:SF (match_operand:SF 1 "register_operand" "f")))]
                    434:   ""
                    435:   "*
                    436:   return (arm_output_asm_insn (\"sqts\\t%0, %1\", operands));
                    437: ")
                    438: 
                    439: (define_insn "sqrtdf2"
                    440:   [(set (match_operand:DF 0 "register_operand" "=f")
                    441:         (sqrt:DF (match_operand:DF 1 "register_operand" "f")))]
                    442:   ""
                    443:   "*
                    444:   return (arm_output_asm_insn (\"sqtd\\t%0, %1\", operands));
                    445: ")
                    446: 
                    447: (define_insn "one_cmplsi2"
                    448:   [(set (match_operand:SI 0 "register_operand" "=r")
                    449:         (not:SI (match_operand:SI 1 "register_operand" "r")))]
                    450:   ""
                    451:   "*
                    452:   return (arm_output_asm_insn (\"mvn\\t%0, %1\", operands));
                    453: ")
                    454: 
                    455: ;; Fixed <--> Floating conversion insns
                    456: 
                    457: (define_insn "floatsisf2"
                    458:   [(set (match_operand:SF 0 "register_operand" "=f")
                    459:         (float:SF (match_operand:SI 1 "register_operand" "r")))]
                    460:   ""
                    461:   "*
                    462:   return (arm_output_asm_insn (\"flts\\t%0, %1\", operands));
                    463: ")
                    464: 
                    465: (define_insn "floatsidf2"
                    466:   [(set (match_operand:DF 0 "register_operand" "=f")
                    467:         (float:DF (match_operand:SI 1 "register_operand" "r")))]
                    468:   ""
                    469:   "*
                    470:   return (arm_output_asm_insn (\"fltd\\t%0, %1\", operands));
                    471: ")
                    472: 
                    473: ;; Truncation insns
                    474: 
                    475: (define_insn "truncsiqi2"
                    476:   [(set (match_operand:QI 0 "general_operand" "=mr")
                    477:         (truncate:QI (match_operand:SI 1 "register_operand" "r")))]
                    478:   ""
                    479:   "*
                    480:   if (GET_CODE (operands[0]) == MEM)
                    481:     return (arm_output_asm_insn (\"strb\\t%1, %0\\t@ truncsiqi2\", operands));
                    482:   else
                    483:     return (arm_output_asm_insn (\"and\\t%0, %1, #255\\t@ truncsiqi2\", operands));
                    484: ")
                    485: 
                    486: (define_insn "trunchiqi2"
                    487:   [(set (match_operand:QI 0 "general_operand" "=mr")
                    488:         (truncate:QI (match_operand:HI 1 "register_operand" "r")))]
                    489:   ""
                    490:   "*
                    491:   if (GET_CODE(operands[0]) == MEM)
                    492:     return (arm_output_asm_insn (\"strb\\t%1, %0\\t@ trunchiqi2\", operands));
                    493:   else
                    494:     return (arm_output_asm_insn (\"and\\t%0, %1, #255\\t@ trunchiqi2\", operands));
                    495: ")
                    496: 
                    497: ;; Mode is changed to SI below
                    498: 
                    499: (define_expand "truncsihi2"
                    500:   [(set (match_operand:SI 0 "register_operand" "")
                    501:         (ashift:SI (match_operand:HI 1 "register_operand" "")
                    502:                    (const_int 16)))
                    503:    (set (match_dup 0)
                    504:         (ashiftrt:SI (match_dup 0) (const_int 16)))]
                    505:   ""
                    506:   "
                    507:   if (GET_CODE (operands[1]) == SUBREG)
                    508:       operands[1] = gen_rtx (SUBREG, SImode, SUBREG_REG (operands[1]),
                    509:                              SUBREG_WORD (operands[1]));
                    510:   else
                    511:       operands[1] = gen_rtx(SUBREG, SImode, operands[1], 0);
                    512: ")
                    513: 
                    514: (define_insn "truncdfsf2"
                    515:   [(set (match_operand:SF 0 "register_operand" "=f")
                    516:         (float_truncate:SF
                    517:             (match_operand:DF 1 "register_operand" "f")))]
                    518:   ""
                    519:   "*
                    520:   return (arm_output_asm_insn (\"mvfs\\t%0, %1\", operands));
                    521: ")
                    522: 
                    523: ;; Zero extention instructions.
                    524: 
                    525: (define_expand "zero_extendhisi2"
                    526:   [(set (match_operand:SI 0 "register_operand" "")
                    527:        (ashift:SI (match_operand:HI 1 "register_operand" "")
                    528:                   (const_int 16)))
                    529:    (set (match_dup 0)
                    530:        (lshiftrt:SI (match_dup 0) (const_int 16)))]
                    531:   ""
                    532:   "
                    533:   if (GET_CODE (operands[1]) == SUBREG)
                    534:       operands[1] = gen_rtx (SUBREG, SImode, SUBREG_REG (operands[1]),
                    535:                              SUBREG_WORD (operands[1]));
                    536:   else
                    537:       operands[1] = gen_rtx (SUBREG, SImode, operands[1], 0);
                    538: ")
                    539: 
                    540: (define_insn "zero_extendqihi2"
                    541:   [(set (match_operand:HI 0 "register_operand" "=r")
                    542:         (zero_extend:HI
                    543:         (match_operand:QI 1 "register_operand" "r")))]
                    544:   ""
                    545:   "*
                    546:   return (arm_output_asm_insn (\"and\\t%0, %1, #255\\t@ zero_extendqihi2\", operands));
                    547: ")
                    548: 
                    549: (define_insn "zero_extendqisi2"
                    550:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    551:         (zero_extend:SI
                    552:         (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
                    553:   ""
                    554:   "*
                    555:   switch (which_alternative)
                    556:     {
                    557:     case 0:
                    558:       return (arm_output_asm_insn (\"and\\t%0, %1, #255\\t@ zero_extendqisi2\", operands));
                    559:     case 1:
                    560:       return (arm_output_asm_insn (\"ldrb\\t%0, %1\\t@ zero_extendqisi2\", operands));
                    561:     }
                    562: ")
                    563: 
                    564: ;; Note that the ones starting from HImode come before those for QImode so
                    565: ;; that a constant operand will match HImode, not QImode.
                    566: 
                    567: (define_expand "extendhisi2"
                    568:   [(set (match_operand:SI 0 "register_operand" "")
                    569:        (ashift:SI (match_operand:HI 1 "register_operand" "")
                    570:                   (const_int 16)))
                    571:    (set (match_dup 0)
                    572:        (ashiftrt:SI (match_dup 0) (const_int 16)))]
                    573:   ""
                    574:   "
                    575:   if (GET_CODE (operands[1]) == SUBREG)
                    576:       operands[1] = gen_rtx (SUBREG, SImode, SUBREG_REG (operands[1]),
                    577:                              SUBREG_WORD (operands[1]));
                    578:   else
                    579:       operands[1] = gen_rtx (SUBREG, SImode, operands[1], 0);
                    580: ")
                    581: 
                    582: ;; XXX Is this ever used?
                    583: 
                    584: (define_insn "extendqihi2"
                    585:   [(set (match_operand:HI 0 "register_operand" "=r")
                    586:        (sign_extend:SI
                    587:         (match_operand:QI 1 "register_operand" "r")))]
                    588:   ""
                    589:   "*
                    590:   arm_output_asm_insn (\"mov\\t%0, %1, lsl#24\\t@ extendqihi\", operands);
                    591:   return (arm_output_asm_insn (\"mov\\t%0, %0, asr#24\", operands));
                    592: ")
                    593: 
                    594: 
                    595: (define_expand "extendqisi2"
                    596:   [(set (match_operand:SI 0 "register_operand" "")
                    597:        (ashift:SI (match_operand:QI 1 "register_operand" "")
                    598:                   (const_int 24)))
                    599:    (set (match_dup 0)
                    600:        (ashiftrt:SI (match_dup 0) (const_int 24)))]
                    601:   ""
                    602:   "
                    603:   if (GET_CODE (operands[1]) == SUBREG)
                    604:       operands[1] = gen_rtx (SUBREG, SImode, SUBREG_REG (operands[1]),
                    605:                              SUBREG_WORD(operands[1]));
                    606:   else
                    607:       operands[1] = gen_rtx (SUBREG, SImode, operands[1], 0);
                    608: ")
                    609: 
                    610: (define_insn "extendsfdf2"
                    611:   [(set (match_operand:DF 0 "register_operand" "=f")
                    612:         (float_extend:DF (match_operand:SF 1 "register_operand" "f")))]
                    613:   ""
                    614:   "*
                    615:   return (arm_output_asm_insn (\"mvfd\\t%0, %1\", operands));
                    616: ")
                    617: 
                    618: ;; Move insns (including loads and stores)
                    619: 
                    620: ;; XXX Just some ideas about movti.
                    621: 
                    622: ;;(define_expand "loadti"
                    623: ;;  [(set (match_operand:TI 0 "register_operand" "")
                    624: ;;     (mem:TI (match_operand:SI 1 "address_operand" "")))]
                    625: ;;  "" "")
                    626: 
                    627: ;;(define_expand "storeti"
                    628: ;;  [(set (mem:TI (match_operand:TI 0 "address_operand" ""))
                    629: ;;     (match_operand:TI 1 "register_operand" ""))]
                    630: ;;  "" "")
                    631: 
                    632: ;;(define_expand "movti"
                    633: ;;  [(set (match_operand:TI 0 "general_operand" "")
                    634: ;;     (match_operand:TI 1 "general_operand" ""))]
                    635: ;;  ""
                    636: ;;  "
                    637: ;;{
                    638: ;;  rtx insn;
                    639: ;;
                    640: ;;  if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
                    641: ;;    operands[1] = copy_to_reg (operands[1]);
                    642: ;;  if (GET_CODE (operands[0]) == MEM)
                    643: ;;    insn = gen_storeti (XEXP (operands[0], 0), operands[1]);
                    644: ;;  else if (GET_CODE (operands[1]) == MEM)
                    645: ;;    insn = gen_loadti (operands[0], XEXP (operands[1], 0));
                    646: ;;  else
                    647: ;;    FAIL;
                    648: ;;
                    649: ;;  emit_insn (insn);
                    650: ;;  DONE;
                    651: ;;}")
                    652: 
                    653: ;; Recognise garbage generated above.
                    654: 
                    655: ;;(define_insn ""
                    656: ;;  [(set (match_operand:TI 0 "general_operand" "=r,r,r,<,>,m")
                    657: ;;     (match_operand:TI 1 "general_operand" "<,>,m,r,r,r"))]
                    658: ;;  ""
                    659: ;;  "*
                    660: ;;  {
                    661: ;;    register mem = (which_alternative < 3);
                    662: ;;    register char *template;
                    663: ;;
                    664: ;;    operands[mem] = XEXP (operands[mem], 0);
                    665: ;;    switch (which_alternative)
                    666: ;;      {
                    667: ;;      case 0: template = \"ldmdb\\t%1!, %M0\"; break;
                    668: ;;      case 1: template = \"ldmia\\t%1!, %M0\"; break;
                    669: ;;      case 2: template = \"ldmia\\t%1, %M0\"; break;
                    670: ;;      case 3: template = \"stmdb\\t%0!, %M1\"; break;
                    671: ;;      case 4: template = \"stmia\\t%0!, %M1\"; break;
                    672: ;;      case 5: template = \"stmia\\t%0, %M1\"; break;
                    673: ;;      }
                    674: ;;    return (arm_output_asm_insn (template, operands));
                    675: ;;  }")
                    676: 
                    677: 
                    678: (define_insn "movdi"
                    679:   [(set (match_operand:DI 0 "di_operand" "=r,r,r,o,r")
                    680:         (match_operand:DI 1 "di_operand" "r,n,o,r,F"))]
                    681:   ""
                    682:   "*
                    683:   return (output_move_double (operands));
                    684: ")
                    685: 
                    686: (define_insn "movsi"
                    687:   [(set (match_operand:SI 0 "general_operand" "=r,r,r,m")
                    688:         (match_operand:SI 1 "general_operand"  "r,n,m,r"))]
                    689:   ""
                    690:   "*
                    691:   switch (which_alternative)
                    692:     {
                    693:     case 0:
                    694:       return (arm_output_asm_insn (\"mov\\t%0, %1\", operands));
                    695:     case 1:
                    696:       return (output_mov_immediate (operands));
                    697:     case 2:
                    698:       if (GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
                    699:           &&  CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
                    700:        return (arm_output_llc (operands));
                    701:       else
                    702:         return (arm_output_asm_insn (\"ldr\\t%0, %1\", operands));
                    703:     case 3:
                    704:       return (arm_output_asm_insn (\"str\\t%1, %0\", operands));
                    705:     }
                    706: ")
                    707: 
                    708: ;; XXX The movhi stuff isn't as correct or as nice as it could be...
                    709: 
                    710: ;; Subroutine to load a half word into a register from memory.
                    711: ;; Operand 0 is the destination register (HImode).
                    712: ;; Operand 1 is the source address (SImode).
                    713: ;; Operand 2 is a temporary (SImode).
                    714: 
                    715: ;;(define_expand "loadhi"
                    716: ;;  [;; load the whole word (ARM realigns it if not on word boundary)
                    717: ;;   (set (match_operand:SI 2 "register_operand" "")
                    718: ;;        (mem:SI (match_operand:SI 1 "address_operand" "")))
                    719: ;;   ;; quietly forget the upper 16 bits
                    720: ;;   (set (match_operand:HI 0 "register_operand" "")
                    721: ;;        (subreg:HI (match_dup 2) 0))]
                    722: ;;  ""
                    723: ;;  ""
                    724: ;;)
                    725: 
                    726: ;; Load op0 from mem:op1.  Subroutine in case we're reloading and the normal
                    727: ;; loadhi is not allowed.
                    728: 
                    729: ;;(define_expand "reloadhi"
                    730: ;;  [(set (reg:SI 10)
                    731: ;;     (mem:SI (match_operand:SI 1 "address_operand" "")))
                    732: ;;   (set (match_operand:HI 0 "register_operand" "")
                    733: ;;     (subreg:HI (reg:SI 10) 0))]
                    734: ;;  "" "")
                    735: 
                    736: ;; Store op0 into mem:op1.  Subroutine in case we're reloading and the normal
                    737: ;; storehi is not allowed.
                    738: 
                    739: (define_expand "restorehi"
                    740:   [(set (mem:QI (match_operand:SI 1 "address_operand" ""))
                    741:        (truncate:QI (match_operand:HI 0 "register_operand" "")))
                    742:    (set (reg:HI 10)
                    743:        (ashiftrt:HI (match_dup 0) (const_int 8)))
                    744:    (set (mem:QI (plus:SI (match_dup 1) (const_int 1)))
                    745:        (truncate:QI (reg:HI 10)))]
                    746:   "" "")
                    747: 
                    748: ;; Subroutine to store a half word from a register into memory.
                    749: ;; Operand 0 is the source register (HImode)
                    750: ;; Operand 1 is the destination address (SImode)
                    751: ;; Operand 2 is a temporary (SImode).
                    752: ;; Operand 3 is a temporary (SImode).
                    753: ;; Operand 4 is a temporary (SImode).
                    754: ;; Operand 5 is a local temporary (SImode).
                    755: 
                    756: (define_expand "storehi"
                    757:   [;; compute the address into a register
                    758:    (set (match_operand:SI 2 "register_operand" "")
                    759:         (match_operand:SI 1 "address_operand" ""))
                    760:    ;; get the half word into a full word register
                    761:    (set (match_operand:SI 3 "register_operand" "")
                    762:         (match_dup 5))
                    763:    ;; store the low byte
                    764:    (set (mem:QI (match_dup 2))
                    765:         (truncate:QI (match_dup 3)))
                    766:    ;; extract the high byte
                    767:    (set (match_operand:SI 4 "register_operand" "")
                    768:         (ashiftrt:SI (match_dup 3) (const_int 8)))
                    769:    ;; store the high byte
                    770:    (set (mem:QI (plus (match_dup 2) (const_int 1)))
                    771:         (truncate:QI (match_dup 4)))]
                    772:   ""
                    773:   "
                    774:   if (GET_CODE(operands[0]) == SUBREG)
                    775:     operands[5] = gen_rtx(SUBREG, SImode, SUBREG_REG(operands[0]),
                    776:               SUBREG_WORD(operands[0]));
                    777:   else
                    778:     operands[5] = gen_rtx(SUBREG, SImode, operands[0], 0);
                    779:   
                    780: ")
                    781: 
                    782: ;; Subroutine to store a half word integer constant into memory.
                    783: ;; Operand 0 is the constant
                    784: ;; Operand 1 is the destination address (SImode)
                    785: ;; Operand 2 is a temporary (SImode).
                    786: ;; Operand 3 is a temporary (QImode).
                    787: ;; Operand 4 is a temporary (QImode).
                    788: ;; Operand 5 is a local CONST_INT.
                    789: ;; Operand 6 is a local CONST_INT.
                    790: 
                    791: (define_expand "storeinthi"
                    792:   [;; compute the address into a register
                    793:    (set (match_operand:SI 2 "register_operand" "")
                    794:         (match_operand:SI 1 "address_operand" ""))
                    795:    ;; load the low byte
                    796:    (set (match_operand:QI 3 "register_operand" "")
                    797:         (match_dup 5))
                    798:    ;; store the low byte
                    799:    (set (mem:QI (match_dup 2))
                    800:         (match_dup 3))
                    801:    ;; load the high byte
                    802:    (set (match_operand:QI 4 "register_operand" "")
                    803:         (match_dup 6))
                    804:    ;; store the high byte
                    805:    (set (mem:QI (plus (match_dup 2) (const_int 1)))
                    806:         (match_dup 4))]
                    807:   ""
                    808:   "
                    809:     {
                    810:       int value = INTVAL(operands[0]);
                    811: 
                    812:       operands[5] = gen_rtx(CONST_INT, VOIDmode, value & 255);
                    813:       operands[6] = gen_rtx(CONST_INT, VOIDmode,(value>>8) & 255);
                    814:     }
                    815: ")
                    816: 
                    817: (define_expand "movhi"
                    818:   [(set (match_operand:HI 0 "general_operand" "")
                    819:         (match_operand:HI 1 "general_operand" ""))]
                    820:   ""
                    821:   "
                    822: {
                    823:   rtx insn;
                    824: 
                    825:   if (reload_in_progress || reload_completed)
                    826:     {
                    827:       if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == REG)
                    828:        insn = gen_restorehi (operands[1], XEXP (operands[0], 0));
                    829:       else
                    830:        insn = gen_rtx (SET, VOIDmode, operands[0], operands[1]);
                    831:     }
                    832:   else
                    833:     {
                    834:       if (GET_CODE (operands[0]) == MEM)
                    835:        {
                    836:          if (GET_CODE (operands[1]) == MEM)
                    837:            operands[1] = copy_to_reg (operands[1]);
                    838: 
                    839:          if (GET_CODE (operands[1]) == CONST_INT)
                    840:            {
                    841:              insn = gen_storeinthi (operands[1], XEXP (operands[0], 0),
                    842:                                     gen_reg_rtx (SImode),
                    843:                                     gen_reg_rtx (QImode),
                    844:                                     gen_reg_rtx (QImode));
                    845:            }
                    846:          else
                    847:            {
                    848:              insn = gen_storehi (operands[1], XEXP (operands[0], 0),
                    849:                                  gen_reg_rtx (SImode),
                    850:                                  gen_reg_rtx (SImode),
                    851:                                  gen_reg_rtx (SImode));
                    852:            }
                    853:        }
                    854: #if 0
                    855:       else if (GET_CODE (operands[1]) == MEM)
                    856:        {
                    857:          insn = gen_loadhi (operands[0], XEXP (operands[1], 0),
                    858:                             gen_reg_rtx (SImode));
                    859:        }
                    860: #endif
                    861:       else
                    862:        insn = gen_rtx (SET, VOIDmode, operands[0], operands[1]);
                    863:     }
                    864: 
                    865:   emit_insn (insn);
                    866:   DONE;
                    867: }")
                    868: 
                    869: ;; Pattern to recognise insn generated default case above
                    870: 
                    871: (define_insn ""
                    872:   [(set (match_operand:HI 0 "general_operand" "=r,r,r,m")
                    873:         (match_operand:HI 1 "general_operand"  "r,n,m,r"))]
                    874:   ""
                    875:   "*
                    876:   switch (which_alternative)
                    877:     {
                    878:       case 0: return (arm_output_asm_insn (\"mov\\t%0, %1\\t@movhi\", operands));
                    879:       case 1: return (output_mov_immediate (operands));
                    880:       case 2: return (arm_output_asm_insn (\"ldr\\t%0, %1\\t@movhi\", operands));
                    881:       case 3: return (arm_output_asm_insn (\"str\\t%1, %0\\t@movhi\", operands));
                    882:     }
                    883: ")
                    884: 
                    885: (define_insn "movqi"
                    886:   [(set (match_operand:QI 0 "general_operand" "=r,r,r,m")
                    887:         (match_operand:QI 1 "general_operand" "r,n,m,r"))]
                    888:   ""
                    889:   "*
                    890:   switch (which_alternative)
                    891:     {
                    892:     case 0:
                    893:       return (arm_output_asm_insn (\"mov\\t%0, %1\", operands));
                    894:     case 1:
                    895:       return (output_mov_immediate (operands));
                    896:     case 2:
                    897:       return (arm_output_asm_insn (\"ldrb\\t%0, %1\", operands));
                    898:     case 3:
                    899:       return (arm_output_asm_insn (\"strb\\t%1, %0\", operands));
                    900:     }
                    901:   
                    902: ")
                    903: 
                    904: (define_insn "movsf"
                    905:   [(set (match_operand:SF 0 "general_operand" "=f,f,m,f,r,r")
                    906:         (match_operand:SF 1 "general_operand" "fG,m,f,r,f,r"))]
                    907:   ""
                    908:   "*
                    909:   switch (which_alternative)
                    910:     {
                    911:     case 0:
                    912:       return (arm_output_asm_insn (\"mvfs\\t%0, %1\", operands));
                    913:     case 1:
                    914:       return (arm_output_asm_insn (\"ldfs\\t%0, %1\", operands));
                    915:     case 2:
                    916:       return (arm_output_asm_insn (\"stfs\\t%1, %0\", operands));
                    917:     case 3:
                    918:       arm_output_asm_insn(\"stmfd\\tsp!, {%1}\", operands);
                    919:       return (arm_output_asm_insn (\"ldfs\\t%0, [sp],#4\", operands));
                    920:     case 4:
                    921:       arm_output_asm_insn(\"stfs\\t%1, [sp,#-4]!\", operands);
                    922:       return (arm_output_asm_insn (\"ldmfd\\tsp!, {%0}\", operands));
                    923:     case 5:
                    924:       return (arm_output_asm_insn (\"mov\\t%0, %1\", operands));
                    925:   }
                    926: ")
                    927: 
                    928: (define_insn "movdf"
                    929:   [(set (match_operand:DF 0 "general_operand" "=f,f,m,f,r,r")
                    930:         (match_operand:DF 1 "general_operand" "fG,m,f,r,f,r"))]
                    931:   ""
                    932:   "*
                    933:   switch (which_alternative)
                    934:     {
                    935:       case 0: return (arm_output_asm_insn (\"mvfd\\t%0, %1\", operands));
                    936:       case 1: return (arm_output_asm_insn (\"ldfd\\t%0, %1\", operands));
                    937:       case 2: return (arm_output_asm_insn (\"stfd\\t%1, %0\", operands));
                    938:       case 3: return (output_mov_double_fpu_from_arm (operands));
                    939:       case 4: return (output_mov_double_arm_from_fpu (operands));
                    940:       case 5: return (output_move_double (operands));
                    941:     }
                    942: ")
                    943: 
                    944: ;; Comparison and test insns
                    945: 
                    946: (define_insn "cmpsi"
                    947:   [(set (cc0)
                    948:         (compare (match_operand:SI 0 "register_operand" "r")
                    949:                 (match_operand:SI 1 "arm_rhs_operand" "rI")))]
                    950:   ""
                    951:   "*
                    952:   return (arm_output_asm_insn (\"cmp\\t%0, %1\", operands));
                    953: ")
                    954: 
                    955: (define_insn "tstsi"
                    956:   [(set (cc0) (match_operand:SI 0 "register_operand" "r"))]
                    957:   ""
                    958:   "*
                    959:   return (arm_output_asm_insn (\"cmp\\t%0, #0\", operands));
                    960: ")
                    961: 
                    962: (define_insn ""
                    963:   [(set (cc0)
                    964:         (compare (match_operand:SI 0 "register_operand" "r")
                    965:                  (neg:SI (match_operand:SI 1 "arm_rhs_operand" "rI"))))]
                    966:   ""
                    967:   "*
                    968:   return (arm_output_asm_insn (\"cmn\\t%0, %1\", operands));
                    969: ")
                    970: 
                    971: (define_insn "cmpsf"
                    972:   [(set (cc0)
                    973:         (compare (match_operand:SF 0 "register_operand" "f")
                    974:                 (match_operand:SF 1 "fpu_rhs_operand" "fG")))]
                    975:   ""
                    976:   "*
                    977:   return (arm_output_asm_insn (\"cmf\\t%0, %1\", operands));
                    978: ")
                    979: 
                    980: (define_insn "cmpdf"
                    981:   [(set (cc0)
                    982:         (compare (match_operand:DF 0 "register_operand" "f")
                    983:                 (match_operand:DF 1 "fpu_rhs_operand" "fG")))]
                    984:   ""
                    985:   "*
                    986:   return (arm_output_asm_insn (\"cmf\\t%0, %1\", operands));
                    987: ")
                    988: 
                    989: ;; Conditional branch insns
                    990: 
                    991: (define_insn "beq"
                    992:   [(set (pc)
                    993:         (if_then_else (eq (cc0) (const_int 0))
                    994:       (label_ref (match_operand 0 "" ""))
                    995:       (pc)))]
                    996:   ""
                    997:   "*
                    998:   return (arm_output_asm_insn (\"beq\\t%l0\", operands));
                    999: ")
                   1000: 
                   1001: (define_insn "bne"
                   1002:   [(set (pc)
                   1003:         (if_then_else (ne (cc0) (const_int 0))
                   1004:       (label_ref (match_operand 0 "" ""))
                   1005:       (pc)))]
                   1006:   ""
                   1007:   "*
                   1008:   return (arm_output_asm_insn (\"bne\\t%l0\", operands));
                   1009: ")
                   1010: 
                   1011: (define_insn "bgt"
                   1012:   [(set (pc)
                   1013:         (if_then_else (gt (cc0) (const_int 0))
                   1014:       (label_ref (match_operand 0 "" ""))
                   1015:       (pc)))]
                   1016:   ""
                   1017:   "*
                   1018:   return (arm_output_asm_insn (\"bgt\\t%l0\", operands));
                   1019: ")
                   1020: 
                   1021: (define_insn "ble"
                   1022:   [(set (pc)
                   1023:         (if_then_else (le (cc0) (const_int 0))
                   1024:       (label_ref (match_operand 0 "" ""))
                   1025:       (pc)))]
                   1026:   ""
                   1027:   "*
                   1028:   return (arm_output_asm_insn (\"ble\\t%l0\", operands));
                   1029: ")
                   1030: 
                   1031: (define_insn "bge"
                   1032:   [(set (pc)
                   1033:         (if_then_else (ge (cc0) (const_int 0))
                   1034:       (label_ref (match_operand 0 "" ""))
                   1035:       (pc)))]
                   1036:   ""
                   1037:   "*
                   1038:   return (arm_output_asm_insn (\"bge\\t%l0\", operands));
                   1039: ")
                   1040: 
                   1041: (define_insn "blt"
                   1042:   [(set (pc)
                   1043:         (if_then_else (lt (cc0) (const_int 0))
                   1044:       (label_ref (match_operand 0 "" ""))
                   1045:       (pc)))]
                   1046:   ""
                   1047:   "*
                   1048:   return (arm_output_asm_insn (\"blt\\t%l0\", operands));
                   1049: ")
                   1050: 
                   1051: (define_insn "bgtu"
                   1052:   [(set (pc)
                   1053:         (if_then_else (gtu (cc0) (const_int 0))
                   1054:       (label_ref (match_operand 0 "" ""))
                   1055:       (pc)))]
                   1056:   ""
                   1057:   "*
                   1058:   return (arm_output_asm_insn (\"bhi\\t%l0\", operands));
                   1059: ")
                   1060: 
                   1061: (define_insn "bleu"
                   1062:   [(set (pc)
                   1063:         (if_then_else (leu (cc0) (const_int 0))
                   1064:       (label_ref (match_operand 0 "" ""))
                   1065:       (pc)))]
                   1066:   ""
                   1067:   "*
                   1068:   return (arm_output_asm_insn (\"bls\\t%l0\", operands));
                   1069: ")
                   1070: 
                   1071: (define_insn "bgeu"
                   1072:   [(set (pc)
                   1073:         (if_then_else (geu (cc0) (const_int 0))
                   1074:       (label_ref (match_operand 0 "" ""))
                   1075:       (pc)))]
                   1076:   ""
                   1077:   "*
                   1078:   return (arm_output_asm_insn (\"bhs\\t%l0\", operands));
                   1079: ")
                   1080: 
                   1081: (define_insn "bltu"
                   1082:   [(set (pc)
                   1083:         (if_then_else (ltu (cc0) (const_int 0))
                   1084:       (label_ref (match_operand 0 "" ""))
                   1085:       (pc)))]
                   1086:   ""
                   1087:   "*
                   1088:   return (arm_output_asm_insn (\"blo\\t%l0\", operands));
                   1089: ")
                   1090: 
                   1091: ;; Inverted conditional branch insns
                   1092: 
                   1093: (define_insn ""
                   1094:   [(set (pc)
                   1095:         (if_then_else (eq (cc0) (const_int 0))
                   1096:       (pc)
                   1097:       (label_ref (match_operand 0 "" ""))))]
                   1098:   ""
                   1099:   "*
                   1100:   return (arm_output_asm_insn (\"bne\\t%l0\", operands));
                   1101: ")
                   1102: 
                   1103: (define_insn ""
                   1104:   [(set (pc)
                   1105:         (if_then_else (ne (cc0) (const_int 0))
                   1106:       (pc)
                   1107:       (label_ref (match_operand 0 "" ""))))]
                   1108:   ""
                   1109:   "*
                   1110:   return (arm_output_asm_insn (\"beq\\t%l0\", operands));
                   1111: ")
                   1112: 
                   1113: (define_insn ""
                   1114:   [(set (pc)
                   1115:         (if_then_else (gt (cc0) (const_int 0))
                   1116:       (pc)
                   1117:       (label_ref (match_operand 0 "" ""))))]
                   1118:   ""
                   1119:   "*
                   1120:   return (arm_output_asm_insn (\"ble\\t%l0\", operands));
                   1121: ")
                   1122: 
                   1123: (define_insn ""
                   1124:   [(set (pc)
                   1125:         (if_then_else (le (cc0) (const_int 0))
                   1126:       (pc)
                   1127:       (label_ref (match_operand 0 "" ""))))]
                   1128:   ""
                   1129:   "*
                   1130:   return (arm_output_asm_insn (\"bgt\\t%l0\", operands));
                   1131: ")
                   1132: 
                   1133: (define_insn ""
                   1134:   [(set (pc)
                   1135:         (if_then_else (ge (cc0) (const_int 0))
                   1136:       (pc)
                   1137:       (label_ref (match_operand 0 "" ""))))]
                   1138:   ""
                   1139:   "*
                   1140:   return (arm_output_asm_insn (\"blt\\t%l0\", operands));
                   1141: ")
                   1142: 
                   1143: (define_insn ""
                   1144:   [(set (pc)
                   1145:         (if_then_else (lt (cc0) (const_int 0))
                   1146:       (pc)
                   1147:       (label_ref (match_operand 0 "" ""))))]
                   1148:   ""
                   1149:   "*
                   1150:   return (arm_output_asm_insn (\"bge\\t%l0\", operands));
                   1151: ")
                   1152: 
                   1153: (define_insn ""
                   1154:   [(set (pc)
                   1155:         (if_then_else (gtu (cc0) (const_int 0))
                   1156:       (pc)
                   1157:       (label_ref (match_operand 0 "" ""))))]
                   1158:   ""
                   1159:   "*
                   1160:   return (arm_output_asm_insn (\"bls\\t%l0\", operands));
                   1161: ")
                   1162: 
                   1163: (define_insn ""
                   1164:   [(set (pc)
                   1165:         (if_then_else (leu (cc0) (const_int 0))
                   1166:       (pc)
                   1167:       (label_ref (match_operand 0 "" ""))))]
                   1168:   ""
                   1169:   "*
                   1170:   return (arm_output_asm_insn (\"bhi\\t%l0\", operands));
                   1171: ")
                   1172: 
                   1173: (define_insn ""
                   1174:   [(set (pc)
                   1175:         (if_then_else (geu (cc0) (const_int 0))
                   1176:       (pc)
                   1177:       (label_ref (match_operand 0 "" ""))))]
                   1178:   ""
                   1179:   "*
                   1180:   return (arm_output_asm_insn (\"blo\\t%l0\", operands));
                   1181: ")
                   1182: 
                   1183: (define_insn ""
                   1184:   [(set (pc)
                   1185:         (if_then_else (ltu (cc0) (const_int 0))
                   1186:       (pc)
                   1187:       (label_ref (match_operand 0 "" ""))))]
                   1188:   ""
                   1189:   "*
                   1190:   return (arm_output_asm_insn (\"bhs\\t%l0\", operands));
                   1191: ")
                   1192: 
                   1193: ;; Jump and linkage insns
                   1194: ;; `return' is still a jump-to-epilogue...
                   1195: 
                   1196: (define_insn "jump"
                   1197:   [(set (pc)
                   1198:         (label_ref (match_operand 0 "" "")))]
                   1199:   ""
                   1200:   "*
                   1201:   return (arm_output_asm_insn (\"b\\t%l0\", operands));
                   1202: ")
                   1203: 
                   1204: (define_insn "call"
                   1205:   [(call (match_operand 0 "memory_operand" "m")
                   1206:          (match_operand 1 "general_operand" "g"))
                   1207:    (clobber (reg:SI 14))]
                   1208:   ""
                   1209:   "*
                   1210:   return (output_call (operands));
                   1211: ")
                   1212: 
                   1213: (define_insn "call_value"
                   1214:   [(set (match_operand 0 "" "rf")
                   1215:         (call (match_operand 1 "memory_operand" "m")
                   1216:         (match_operand 2 "general_operand" "g")))
                   1217:    (clobber (reg:SI 14))]
                   1218:   ""
                   1219:   "*
                   1220:   return (output_call (&operands[1]));
                   1221: ")
                   1222: 
                   1223: ;; Allow calls to SYMBOL_REFs specially as they are not valid general addresses
                   1224: ;; The 'a' causes the operand to be treated as an address, i.e. no '#' output.
                   1225: 
                   1226: (define_insn ""
                   1227:   [(call (mem:SI (match_operand:SI 0 "" "i"))
                   1228:          (match_operand:SI 1 "general_operand" "g"))
                   1229:    (clobber (reg:SI 14))]
                   1230:   "GET_CODE (operands[0]) == SYMBOL_REF"
                   1231:   "*
                   1232:   return (arm_output_asm_insn (\"bl\\t%a0\", operands));
                   1233: ")
                   1234: 
                   1235: (define_insn ""
                   1236:   [(set (match_operand 0 "register_operand" "=rf")
                   1237:         (call (mem:SI (match_operand:SI 1 "" "i"))
                   1238:         (match_operand:SI 2 "general_operand" "g")))
                   1239:    (clobber (reg:SI 14))]
                   1240:   "GET_CODE(operands[1]) == SYMBOL_REF"
                   1241:   "*
                   1242:   return (arm_output_asm_insn (\"bl\\t%a1\", operands));
                   1243: ")
                   1244: 
                   1245: (define_insn "tablejump"
                   1246:   [(set (pc)
                   1247:         (match_operand:SI 0 "register_operand" "r"))
                   1248:    (use (label_ref (match_operand 1 "" "")))]
                   1249:   ""
                   1250:   "*
                   1251:   return (arm_output_asm_insn (\"mov\\tpc, %0\\t@ table jump, label %l1\", operands));
                   1252: ")
                   1253: 
                   1254: (define_insn "indirect_jump"
                   1255:   [(set (pc)
                   1256:         (match_operand:SI 0 "register_operand" "r"))]
                   1257:   ""
                   1258:   "*
                   1259:   return (arm_output_asm_insn (\"mov\\tpc, %0\\t@ indirect jump\", operands));
                   1260: ")
                   1261: 
                   1262: ;; Misc insns
                   1263: 
                   1264: (define_insn "nop"
                   1265:   [(const_int 0)]
                   1266:   ""
                   1267:   "*
                   1268:   return (arm_output_asm_insn (\"mov\\tr0, r0\\t@ nop\", operands));
                   1269: ")
                   1270: 
                   1271: ;; Patterns to allow combination of arithmetic, cond code and shifts
                   1272: 
                   1273: ;(define_insn ""
                   1274: ;  [(set (match_operand:SI 0 "register_operand" "=r")
                   1275: ;        (match_operator:SI 1 "shiftable_operator"
                   1276: ;          [(match_operand:SI 2 "register_operand" "r")
                   1277: ;           (match_operator:SI 3 "shift_operator"
                   1278: ;             [(match_operand:SI 4 "register_operand" "r")
                   1279: ;            (match_operand:SI 5 "nonmemory_operand" "rn")])]))]
                   1280: ;  ""
                   1281: ;  "*
                   1282: ;  return (output_arithmetic_with_shift (operands, FALSE, FALSE));
                   1283: ;  "
                   1284: ;)
                   1285: 
                   1286: ;(define_insn ""
                   1287: ;  [(set (match_operand:SI 0 "register_operand" "=r")
                   1288: ;        (match_operator:SI 1 "shiftable_operator"
                   1289: ;          [(match_operator:SI 3 "shift_operator"
                   1290: ;             [(match_operand:SI 4 "register_operand" "r")
                   1291: ;              (match_operand:SI 5 "nonmemory_operand" "rI")])
                   1292: ;           (match_operand:SI 2 "register_operand" "r")]))]
                   1293: ;  ""
                   1294: ;  "*
                   1295: ;  return (output_arithmetic_with_shift (operands, TRUE, FALSE));
                   1296: ;")
                   1297: 
                   1298: ;; Patterns to allow combination of arithmetic and multiplication
                   1299: 
                   1300: ;(define_insn ""
                   1301: ;  [(set (match_operand:SI 0 "register_operand" "=r")
                   1302: ;        (match_operator:SI 1 "shiftable_operator"
                   1303: ;          [(match_operand:SI 2 "register_operand" "r")
                   1304: ;             (mult:SI
                   1305: ;               (match_operand:SI 3 "register_operand" "r")
                   1306: ;               (match_operand:SI 4 "power_of_two_operand" "n"))]))]
                   1307: ;  ""
                   1308: ;  "*
                   1309: ;  return (output_arithmetic_with_immediate_multiply (operands, FALSE));
                   1310: ;")
                   1311: 
                   1312: ; Uncomment this to show combiner problem (see ../COMBINER-PROBLEM).
                   1313: ;(define_insn ""
                   1314: ;  [(set (match_operand:SI 0 "register_operand" "=r")
                   1315: ;        (match_operator:SI 1 "shiftable_operator"
                   1316: ;        [(mult:SI
                   1317: ;          (match_operand:SI 3 "register_operand" "r")
                   1318: ;          (match_operand:SI 4 "power_of_two_operand" "n"))
                   1319: ;         (match_operand:SI 2 "register_operand" "r")]))]
                   1320: ;  ""
                   1321: ;  "*
                   1322: ;  return (output_arithmetic_with_immediate_multiply (operands, TRUE));
                   1323: ;")
                   1324: 
                   1325: ;; Peephole optimizations.
                   1326: 
                   1327: ;; When testing a bitset smaller than 9 bits for (un)equality, a
                   1328: ;; shift/and/cmp/b{eq,ne} sequence can be replaced by one tst and the same
                   1329: ;; branch sequence.
                   1330: 
                   1331: ;;(define_peephole
                   1332: ;;  [(set (match_operand:SI 0 "register_operand" "=r")
                   1333: ;;     (lshiftrt:SI (match_dup 0)
                   1334: ;;                  (match_operand 1 "immediate_operand" "")))
                   1335: ;;   (set (match_dup 0)
                   1336: ;;     (and:SI (match_dup 0)
                   1337: ;;             (match_operand 2 "immediate_operand" "")))
                   1338: ;;   (set (cc0) (match_dup 0))
                   1339: ;;   (set (pc)
                   1340: ;;     (if_then_else (ne (cc0) (const_int 0))
                   1341: ;;                   (label_ref (match_operand 3 "" ""))
                   1342: ;;                   (pc)))]
                   1343: ;;  "dead_or_set_p (PREV_INSN (insn), operands[0])
                   1344: ;;   && GET_CODE (operands[2]) == CONST_INT && GET_CODE (operands[1]) == CONST_INT
                   1345: ;;   && const_ok_for_arm (INTVAL (operands[2]) << INTVAL (operands[1]))"
                   1346: ;;  "*
                   1347: ;;  operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1348: ;;                         INTVAL (operands[2]) << INTVAL (operands[1]));
                   1349: ;;  arm_output_asm_insn (\"tst\\t%0, %2\\t\\t@ ph test bitfield\", operands);
                   1350: ;;  return (arm_output_asm_insn (\"bne\\t%l3\", operands));
                   1351: ;;")
                   1352: 
                   1353: ;;(define_peephole
                   1354: ;;  [(set (match_operand:SI 0 "register_operand" "=r")
                   1355: ;;     (lshiftrt:SI (match_dup 0)
                   1356: ;;                  (match_operand 1 "immediate_operand" "")))
                   1357: ;;   (set (match_dup 0)
                   1358: ;;     (and:SI (match_dup 0)
                   1359: ;;             (match_operand 2 "immediate_operand" "")))
                   1360: ;;   (set (cc0) (match_dup 0))
                   1361: ;;   (set (pc)
                   1362: ;;     (if_then_else (ne (cc0) (const_int 0))
                   1363: ;;                   (pc)
                   1364: ;;                   (label_ref (match_operand 3 "" ""))))]
                   1365: ;;  "dead_or_set_p (prev_real_insn (insn), operands[0])
                   1366: ;;   && GET_CODE (operands[2]) == CONST_INT && GET_CODE (operands[1]) == CONST_INT
                   1367: ;;   && const_ok_for_arm (INTVAL (operands[2]) << INTVAL (operands[1]))"
                   1368: ;;  "*
                   1369: ;;  operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1370: ;;                         INTVAL (operands[2]) << INTVAL (operands[1]));
                   1371: ;;  arm_output_asm_insn (\"tst\\t%0, %2\\t\\t@ ph test bitfield\", operands);
                   1372: ;;  return (arm_output_asm_insn (\"beq\\t%l3\", operands));
                   1373: ;;")
                   1374: 
                   1375: ;; This allows negative constants to be compared since GCC appears not to try
                   1376: ;; converting them with a NEG.
                   1377: 
                   1378: ;;(define_peephole
                   1379: ;;  [(set (match_operand:SI 2 "register_operand" "=r")
                   1380: ;;        (match_operand:SI 1 "immediate_operand" "n"))
                   1381: ;;   (set (cc0)
                   1382: ;;        (compare (match_operand:SI 0 "register_operand" "r")
                   1383: ;;                 (match_dup 1)))]
                   1384: ;;  "const_ok_for_arm (-INTVAL (operands[1]))
                   1385: ;;   && dead_or_set_p (prev_real_insn (insn), operands[0])"
                   1386: ;;  "*
                   1387: ;;  operands[1] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[1]));
                   1388: ;;  return (arm_output_asm_insn (\"cmn\\t%0, %1\\t\\t@ ph negate comparison\", operands));
                   1389: ;;")
                   1390: 
                   1391: ;; Local variables:
                   1392: ;; mode:emacs-lisp
                   1393: ;; eval: (setq comment-start ";; ")
                   1394: ;; eval: (setq comment-end "")
                   1395: ;; eval: (setq comment-start-skip ";;+ *")
                   1396: ;; eval: (set-syntax-table (copy-sequence (syntax-table)))
                   1397: ;; eval: (modify-syntax-entry ?[ "(]")
                   1398: ;; eval: (modify-syntax-entry ?] ")[")
                   1399: ;; eval: (modify-syntax-entry ?{ "(}")
                   1400: ;; eval: (modify-syntax-entry ?} "){")
                   1401: ;; End:

unix.superglobalmegacorp.com

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