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

1.1.1.3 ! root        1: ;;- Machine description for GNU compiler, Convex Version
        !             2: ;;  Copyright (C) 1988, 1994 Free Software Foundation, Inc.
1.1       root        3: 
                      4: ;; This file is part of GNU CC.
                      5: 
                      6: ;; GNU CC is free software; you can redistribute it and/or modify
                      7: ;; it under the terms of the GNU General Public License as published by
                      8: ;; the Free Software Foundation; either version 2, or (at your option)
                      9: ;; any later version.
                     10: 
                     11: ;; GNU CC is distributed in the hope that it will be useful,
                     12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: ;; GNU General Public License for more details.
                     15: 
                     16: ;; You should have received a copy of the GNU General Public License
                     17: ;; along with GNU CC; see the file COPYING.  If not, write to
                     18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     19: 
                     20: ;; Attribute specifications
                     21: 
                     22: ; Target CPU
                     23: (define_attr "cpu" "c1,c32,c34,c38"
                     24:   (const (symbol_ref "(enum attr_cpu) target_cpu")))
                     25: 
                     26: ;; Instruction classification
                     27: 
                     28: (define_attr "type"
                     29:   "alu,xalu,mldw,mldl,mldb,mst,adds,addd,mulw,mull,muls,muld,divw,divl,divs,divd,shfw,shfl,cvts,cvtd"
                     30:   (const_string "alu"))
                     31: 
                     32: ;; Instruction times
                     33: 
                     34: (define_function_unit "mem" 1 0
                     35:   (and (eq_attr "cpu" "c1") (eq_attr "type" "mldw")) 2 0)
                     36: (define_function_unit "mem" 1 0
                     37:   (and (eq_attr "cpu" "c1") (eq_attr "type" "mldl")) 4 0)
                     38: (define_function_unit "mem" 1 0
                     39:   (and (eq_attr "cpu" "c32") (eq_attr "type" "mldw,mldl")) 2 0)
                     40: (define_function_unit "mem" 1 0
                     41:   (and (eq_attr "cpu" "c34") (eq_attr "type" "mldw,mldl")) 4 0)
                     42: (define_function_unit "mem" 1 0
                     43:   (and (eq_attr "cpu" "c38") (eq_attr "type" "mldw,mldl")) 2 0)
                     44: 
                     45: (define_function_unit "mem" 1 0
                     46:   (and (eq_attr "cpu" "c32") (eq_attr "type" "mldb")) 9 0)
                     47: (define_function_unit "mem" 1 0
                     48:   (and (eq_attr "cpu" "c34") (eq_attr "type" "mldb")) 36 0)
                     49: (define_function_unit "mem" 1 0
                     50:   (and (eq_attr "cpu" "c38") (eq_attr "type" "mldb")) 21 0)
                     51: 
                     52: (define_function_unit "mem" 1 0
                     53:   (and (eq_attr "cpu" "c1") (eq_attr "type" "xalu")) 1 0)
                     54: (define_function_unit "mem" 1 0
                     55:   (and (eq_attr "cpu" "c32") (eq_attr "type" "xalu")) 1 0)
                     56: (define_function_unit "mem" 1 0
                     57:   (and (eq_attr "cpu" "c34") (eq_attr "type" "xalu")) 5 0)
                     58: (define_function_unit "mem" 1 0
                     59:   (and (eq_attr "cpu" "c38") (eq_attr "type" "xalu")) 2 0)
                     60: 
                     61: (define_function_unit "add" 1 0
                     62:   (and (eq_attr "cpu" "c1") (eq_attr "type" "adds,addd")) 3 2)
                     63: (define_function_unit "add" 1 0
                     64:   (and (eq_attr "cpu" "c32") (eq_attr "type" "adds,addd")) 2 1)
                     65: (define_function_unit "add" 1 0
                     66:   (and (eq_attr "cpu" "c34") (eq_attr "type" "adds,addd")) 5 2)
                     67: (define_function_unit "add" 1 0
                     68:   (and (eq_attr "cpu" "c38") (eq_attr "type" "adds,addd")) 2 1)
                     69: 
                     70: (define_function_unit "mul" 1 0
                     71:   (and (eq_attr "cpu" "c1") (eq_attr "type" "mulw,muls")) 3 2)
                     72: (define_function_unit "mul" 1 0
                     73:   (and (eq_attr "cpu" "c32") (eq_attr "type" "mulw,muls")) 4 2)
                     74: (define_function_unit "mul" 1 0
                     75:   (and (eq_attr "cpu" "c34") (eq_attr "type" "mulw,muls")) 6 2)
                     76: (define_function_unit "mul" 1 0
                     77:   (and (eq_attr "cpu" "c38") (eq_attr "type" "mulw,muls")) 3 2)
                     78: 
                     79: (define_function_unit "mul" 1 0
                     80:   (and (eq_attr "cpu" "c1") (eq_attr "type" "mull,muld")) 4 3)
                     81: (define_function_unit "mul" 1 0
                     82:   (and (eq_attr "cpu" "c32") (eq_attr "type" "mull")) 10 7)
                     83: (define_function_unit "mul" 1 0
                     84:   (and (eq_attr "cpu" "c32") (eq_attr "type" "muld")) 5 2)
                     85: (define_function_unit "mul" 1 0
                     86:   (and (eq_attr "cpu" "c34") (eq_attr "type" "mull,muld")) 7 3)
                     87: (define_function_unit "mul" 1 0
                     88:   (and (eq_attr "cpu" "c38") (eq_attr "type" "mull,muld")) 4 3)
                     89: 
                     90: (define_function_unit "div" 1 0
                     91:   (and (eq_attr "cpu" "c1") (eq_attr "type" "divw")) 24 24)
                     92: (define_function_unit "div" 1 0
                     93:   (and (eq_attr "cpu" "c32") (eq_attr "type" "divw")) 44 6)
                     94: (define_function_unit "div" 1 0
                     95:   (and (eq_attr "cpu" "c34") (eq_attr "type" "divw")) 14 10)
                     96: (define_function_unit "div" 1 0
                     97:   (and (eq_attr "cpu" "c38") (eq_attr "type" "divw")) 11 10)
                     98: 
                     99: (define_function_unit "div" 1 0
                    100:   (and (eq_attr "cpu" "c1") (eq_attr "type" "divl")) 41 42)
                    101: (define_function_unit "div" 1 0
                    102:   (and (eq_attr "cpu" "c32") (eq_attr "type" "divl")) 76 5)
                    103: (define_function_unit "div" 1 0
                    104:   (and (eq_attr "cpu" "c34") (eq_attr "type" "divl")) 22 18)
                    105: (define_function_unit "div" 1 0
                    106:   (and (eq_attr "cpu" "c38") (eq_attr "type" "divl")) 19 18)
                    107: 
                    108: (define_function_unit "div" 1 0
                    109:   (and (eq_attr "cpu" "c1") (eq_attr "type" "divs")) 22 22)
                    110: (define_function_unit "div" 1 0
                    111:   (and (eq_attr "cpu" "c32") (eq_attr "type" "divs")) 8 6)
                    112: (define_function_unit "div" 1 0
                    113:   (and (eq_attr "cpu" "c34") (eq_attr "type" "divs")) 13 9)
                    114: (define_function_unit "div" 1 0
                    115:   (and (eq_attr "cpu" "c38") (eq_attr "type" "divs")) 10 9)
                    116: 
                    117: (define_function_unit "div" 1 0
                    118:   (and (eq_attr "cpu" "c1") (eq_attr "type" "divd")) 37 38)
                    119: (define_function_unit "div" 1 0
                    120:   (and (eq_attr "cpu" "c32") (eq_attr "type" "divd")) 12 8)
                    121: (define_function_unit "div" 1 0
                    122:   (and (eq_attr "cpu" "c34") (eq_attr "type" "divd")) 20 16)
                    123: (define_function_unit "div" 1 0
                    124:   (and (eq_attr "cpu" "c38") (eq_attr "type" "divd")) 17 16)
                    125: 
                    126: (define_function_unit "misc" 1 0
                    127:   (and (eq_attr "cpu" "c1") (eq_attr "type" "cvts,cvtd")) 4 3)
                    128: (define_function_unit "misc" 1 0
                    129:   (and (eq_attr "cpu" "c32") (eq_attr "type" "cvts")) 9 7)
                    130: (define_function_unit "misc" 1 0
                    131:   (and (eq_attr "cpu" "c32") (eq_attr "type" "cvtd")) 9 6)
                    132: (define_function_unit "misc" 1 0
                    133:   (and (eq_attr "cpu" "c34") (eq_attr "type" "cvts")) 6 2)
                    134: (define_function_unit "misc" 1 0
                    135:   (and (eq_attr "cpu" "c34") (eq_attr "type" "cvtd")) 6 1)
                    136: (define_function_unit "misc" 1 0
                    137:   (and (eq_attr "cpu" "c38") (eq_attr "type" "cvts,cvtd")) 3 1)
                    138: 
                    139: (define_function_unit "misc" 1 0
                    140:   (and (eq_attr "cpu" "c1") (eq_attr "type" "shfw,shfl")) 3 2)
                    141: (define_function_unit "misc" 1 0
                    142:   (and (eq_attr "cpu" "c32") (eq_attr "type" "shfw")) 7 5)
                    143: (define_function_unit "misc" 1 0
                    144:   (and (eq_attr "cpu" "c32") (eq_attr "type" "shfl")) 7 4)
                    145: (define_function_unit "misc" 1 0
                    146:   (and (eq_attr "cpu" "c38") (eq_attr "type" "shfw,shfl")) 3 1)
                    147: 
                    148: (define_function_unit "mystery_latch" 1 1
                    149:   (and (eq_attr "type" "!alu,mldw,mldl,adds,addd") (eq_attr "cpu" "c32")) 2 2)
                    150: 
                    151: ;(define_function_unit "ip" 1 1
                    152: ;  (and (eq_attr "cpu" "c1")
                    153: ;       (eq_attr "type" "divw,divl,divs,divd,xalu")) 2 2)
                    154: ;(define_function_unit "ip" 1 1
                    155: ;  (and (eq_attr "cpu" "c1")
                    156: ;       (eq_attr "type" "!divw,divl,divs,divd,xalu")) 1 1)
                    157: ;(define_function_unit "ip" 1 1
                    158: ;  (and (eq_attr "cpu" "c32")
                    159: ;       (eq_attr "type" "mull,muld,divl,divd,shfl,cvtd,xalu")) 2 2)
                    160: ;(define_function_unit "ip" 1 1
                    161: ;  (and (eq_attr "cpu" "c32")
                    162: ;       (eq_attr "type" "!mull,muld,divl,divd,shfl,cvtd,xalu")) 1 1)
                    163: ;(define_function_unit "ip" 1 1
                    164: ;  (and (eq_attr "cpu" "c34")
                    165: ;       (eq_attr "type" "addd,mull,muld,divl,divd,cvtd,xalu")) 2 2)
                    166: ;(define_function_unit "ip" 1 1
                    167: ;  (and (eq_attr "cpu" "c34")
                    168: ;       (eq_attr "type" "!addd,mull,muld,divl,divd,cvtd,xalu")) 1 1)
                    169: 
                    170: ;; Make the first thing a real insn in case of genattrtab bug
                    171: 
                    172: (define_insn "nop"
                    173:   [(const_int 0)]
                    174:   ""
                    175:   "nop")
                    176: 
                    177: ;; Moves
                    178: 
                    179: (define_expand "movdf"
                    180:   [(set (match_operand:DF 0 "general_operand" "")
                    181:        (match_operand:DF 1 "general_operand" ""))]
                    182:   ""
                    183:   "if (GET_CODE (operands[0]) != REG)
                    184:      operands[1] = force_reg (DFmode, operands[1]);")
                    185: 
                    186: (define_insn ""
                    187:   [(set (match_operand:DF 0 "general_operand" "=d,d,d,d,d,<,m")
                    188:        (match_operand:DF 1 "general_operand"  "d,Q,m,G,H,d,d"))]
                    189:   "register_operand (operands[0], DFmode)
                    190:    || register_operand (operands[1], DFmode)"
                    191:   "@
                    192:    mov %1,%0
                    193:    ldb.d %1,%0
                    194:    ld.d %1,%0
                    195:    ld.d %u1,%0
                    196:    ld.l %v1,%0
                    197:    psh.l %1
                    198:    st.d %1,%0"
                    199:   [(set_attr "type" "alu,mldb,mldl,alu,alu,alu,mst")])
                    200: 
                    201: ;; This is here so we can load any result of RTL constant folding
                    202: ;; but do not use it on constants that can be loaded from memory.
                    203: ;; It is never better and can be worse.
                    204: 
                    205: (define_insn ""
                    206:   [(set (match_operand:DF 0 "register_operand" "=d")
                    207:        (match_operand:DF 1 "const_double_operand" "F"))]
                    208:   "CONST_DOUBLE_MEM (operands[1]) == const0_rtx"
                    209:   "ld.u %u1,%0\;ld.w %v1,%0"
                    210:   [(set_attr "type" "xalu")])
                    211: 
                    212: (define_expand "movsf"
                    213:   [(set (match_operand:SF 0 "general_operand" "")
                    214:        (match_operand:SF 1 "general_operand" ""))]
                    215:   ""
                    216:   "if (GET_CODE (operands[0]) != REG)
                    217:      operands[1] = force_reg (SFmode, operands[1]);")
                    218: 
                    219: (define_insn ""
                    220:   [(set (match_operand:SF 0 "general_operand" "=d,d,d,d,<,m")
                    221:        (match_operand:SF 1 "general_operand" "d,Q,m,F,d,d"))]
                    222:   "register_operand (operands[0], SFmode)
                    223:    || register_operand (operands[1], SFmode)"
                    224:   "@
                    225:    mov.s %1,%0
                    226:    ldb.s %1,%0
                    227:    ld.s %1,%0
                    228:    ld.s %1,%0
                    229:    psh.w %1
                    230:    st.s %1,%0"
                    231:   [(set_attr "type" "alu,mldb,mldw,alu,alu,mst")])
                    232: 
                    233: (define_expand "movdi"
                    234:   [(set (match_operand:DI 0 "general_operand" "")
                    235:        (match_operand:DI 1 "general_operand" ""))]
                    236:   ""
                    237:   "if (GET_CODE (operands[0]) != REG)
                    238:      operands[1] = force_reg (DImode, operands[1]);")
                    239: 
                    240: (define_insn ""
                    241:   [(set (match_operand:DI 0 "general_operand" "=d,d,d,d,d,<,m")
                    242:        (match_operand:DI 1 "general_operand" "d,Q,m,G,HI,d,d"))]
                    243:   "register_operand (operands[0], DImode)
                    244:    || register_operand (operands[1], DImode)"
                    245:   "@
                    246:    mov %1,%0
                    247:    ldb.l %1,%0
                    248:    ld.l %1,%0
                    249:    ld.d %u1,%0
                    250:    ld.l %1,%0
                    251:    psh.l %1
                    252:    st.l %1,%0"
                    253:   [(set_attr "type" "alu,mldb,mldl,alu,alu,alu,mst")])
                    254: 
                    255: ;; This is here so we can load any result of RTL constant folding
                    256: ;; but do not use it on constants that can be loaded from memory.
                    257: ;; It is never better and can be worse.
                    258: 
                    259: (define_insn ""
                    260:   [(set (match_operand:DI 0 "register_operand" "=d")
                    261:        (match_operand:DI 1 "const_double_operand" "F"))]
                    262:   "CONST_DOUBLE_MEM (operands[1]) == const0_rtx"
                    263:   "ld.u %u1,%0\;ld.w %v1,%0"
                    264:   [(set_attr "type" "xalu")])
                    265: 
                    266: (define_expand "movsi"
                    267:   [(set (match_operand:SI 0 "general_operand" "")
                    268:        (match_operand:SI 1 "general_operand" ""))]
                    269:   ""
                    270:   "if (GET_CODE (operands[0]) != REG)
                    271:      operands[1] = force_reg (SImode, operands[1]);")
                    272: 
                    273: (define_insn ""
                    274:   [(set (match_operand:SI 0 "push_operand" "=<,<")
                    275:        (match_operand:SI 1 "nonmemory_operand" "Ad,i"))]
                    276:   ""
                    277:   "@
                    278:    psh.w %1
                    279:    pshea %a1")
                    280: 
                    281: (define_insn ""
                    282:   [(set (match_operand:SI 0 "general_operand" "=d,r,d,r,r,m")
                    283:        (match_operand:SI 1 "general_operand" "d,r,Q,m,i,r"))]
                    284:   "register_operand (operands[0], SImode)
                    285:    || register_operand (operands[1], SImode)"
                    286:   "@
                    287:    mov.w %1,%0
                    288:    mov %1,%0
                    289:    ldb.w %1,%0
                    290:    ld.w %1,%0
                    291:    ld.w %1,%0
                    292:    st.w %1,%0"
                    293:   [(set_attr "type" "alu,alu,mldb,mldw,alu,mst")])
                    294: 
                    295: (define_expand "movstrictsi"
                    296:   [(set (strict_low_part (match_operand:SI 0 "general_operand" ""))
                    297:        (match_operand:SI 1 "general_operand" ""))]
                    298:   ""
                    299:   "if (GET_CODE (operands[0]) != REG)
                    300:      operands[1] = force_reg (SImode, operands[1]);")
                    301: 
                    302: (define_insn ""
                    303:   [(set (strict_low_part (match_operand:SI 0 "general_operand" "=d,r,d,r,r,m"))
                    304:        (match_operand:SI 1 "general_operand" "d,r,Q,m,i,r"))]
                    305:   "register_operand (operands[0], SImode)
                    306:    || register_operand (operands[1], SImode)"
                    307:   "@
                    308:    mov.w %1,%0
                    309:    mov %1,%0
                    310:    ldb.w %1,%0
                    311:    ld.w %1,%0
                    312:    ld.w %1,%0
                    313:    st.w %1,%0"
                    314:   [(set_attr "type" "alu,alu,mldb,mldw,alu,mst")])
                    315: 
                    316: (define_expand "movhi"
                    317:   [(set (match_operand:HI 0 "general_operand" "")
                    318:        (match_operand:HI 1 "general_operand" ""))]
                    319:   ""
                    320:   "if (GET_CODE (operands[0]) != REG)
                    321:      operands[1] = force_reg (HImode, operands[1]);")
                    322: 
                    323: (define_insn ""
                    324:   [(set (match_operand:HI 0 "general_operand" "=d,r,d,r,r,<,m")
                    325:        (match_operand:HI 1 "general_operand" "d,r,Q,m,i,Ad,r"))]
                    326:   "register_operand (operands[0], HImode)
                    327:    || register_operand (operands[1], HImode)"
                    328:   "@
                    329:    mov.w %1,%0
                    330:    mov %1,%0
                    331:    ldb.h %1,%0
                    332:    ld.h %1,%0
                    333:    ld.w %1,%0
                    334:    psh.w %1
                    335:    st.h %1,%0"
                    336:   [(set_attr "type" "alu,alu,mldb,mldw,alu,alu,mst")])
                    337: 
                    338: (define_expand "movqi"
                    339:   [(set (match_operand:QI 0 "general_operand" "")
                    340:        (match_operand:QI 1 "general_operand" ""))]
                    341:   ""
                    342:   "if (GET_CODE (operands[0]) != REG)
                    343:      operands[1] = force_reg (QImode, operands[1]);")
                    344: 
                    345: (define_insn ""
                    346:   [(set (match_operand:QI 0 "general_operand" "=d,r,d,r,r,<,m")
                    347:        (match_operand:QI 1 "general_operand" "d,r,Q,m,i,Ad,r"))]
                    348:   "register_operand (operands[0], QImode)
                    349:    || register_operand (operands[1], QImode)"
                    350:   "@
                    351:    mov.w %1,%0
                    352:    mov %1,%0
                    353:    ldb.b %1,%0
                    354:    ld.b %1,%0
                    355:    ld.w %1,%0
                    356:    psh.w %1
                    357:    st.b %1,%0"
                    358:   [(set_attr "type" "alu,alu,mldb,mldw,alu,alu,mst")])
                    359: 
                    360: ;; Expand block moves manually to get code that pipelines the loads.
                    361: 
                    362: (define_expand "movstrsi"
                    363:   [(set (match_operand:BLK 0 "memory_operand" "=m")
                    364:        (match_operand:BLK 1 "memory_operand" "m"))
                    365:    (use (match_operand:SI 2 "const_int_operand" "i"))
                    366:    (use (match_operand:SI 3 "const_int_operand" "i"))]
                    367:   ""
                    368:   " expand_movstr (operands); DONE; ")
                    369: 
                    370: ;; Extension and truncation insns.
                    371: ;; Those for integer source operand
                    372: ;; are ordered widest source type first.
                    373: 
                    374: (define_insn "truncsiqi2"
                    375:   [(set (match_operand:QI 0 "register_operand" "=d,a")
                    376:        (truncate:QI (match_operand:SI 1 "register_operand" "d,a")))]
                    377:   ""
                    378:   "cvtw.b %1,%0")
                    379: 
                    380: (define_insn "truncsihi2"
                    381:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                    382:        (truncate:HI (match_operand:SI 1 "register_operand" "d,a")))]
                    383:   ""
                    384:   "cvtw.h %1,%0")
                    385: 
                    386: (define_insn "trunchiqi2"
                    387:   [(set (match_operand:QI 0 "register_operand" "=r")
                    388:        (truncate:QI (match_operand:HI 1 "register_operand" "0")))]
                    389:   ""
                    390:   "")
                    391: 
                    392: (define_insn "truncdisi2"
                    393:   [(set (match_operand:SI 0 "register_operand" "=d")
                    394:        (truncate:SI (match_operand:DI 1 "register_operand" "d")))]
                    395:   ""
                    396:   "cvtl.w %1,%0")
                    397: 
                    398: (define_insn "extendsidi2"
                    399:   [(set (match_operand:DI 0 "register_operand" "=d")
                    400:        (sign_extend:DI (match_operand:SI 1 "register_operand" "d")))]
                    401:   ""
                    402:   "cvtw.l %1,%0")
                    403: 
                    404: (define_insn "extendhisi2"
                    405:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                    406:        (sign_extend:SI (match_operand:HI 1 "register_operand" "d,a")))]
                    407:   ""
                    408:   "cvth.w %1,%0")
                    409: 
                    410: (define_insn "extendqihi2"
                    411:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                    412:        (sign_extend:HI (match_operand:QI 1 "register_operand" "d,a")))]
                    413:   ""
                    414:   "cvtb.w %1,%0")
                    415: 
                    416: (define_insn "extendqisi2"
                    417:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                    418:        (sign_extend:SI (match_operand:QI 1 "register_operand" "d,a")))]
                    419:   ""
                    420:   "cvtb.w %1,%0")
                    421: 
                    422: (define_insn "extendsfdf2"
                    423:   [(set (match_operand:DF 0 "register_operand" "=d")
                    424:        (float_extend:DF (match_operand:SF 1 "register_operand" "d")))]
                    425:   ""
                    426:   "cvts.d %1,%0"
                    427:   [(set_attr "type" "cvts")])
                    428: 
                    429: (define_insn "truncdfsf2"
                    430:   [(set (match_operand:SF 0 "register_operand" "=d")
                    431:        (float_truncate:SF (match_operand:DF 1 "register_operand" "d")))]
                    432:   ""
                    433:   "cvtd.s %1,%0"
                    434:   [(set_attr "type" "cvtd")])
                    435: 
                    436: (define_insn "zero_extendhisi2"
                    437:   [(set (match_operand:SI 0 "register_operand" "=r")
                    438:        (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))]
                    439:   ""
                    440:   "and #0xffff,%0")
                    441: 
                    442: (define_insn "zero_extendqihi2"
                    443:   [(set (match_operand:HI 0 "register_operand" "=r")
                    444:        (zero_extend:HI (match_operand:QI 1 "register_operand" "0")))]
                    445:   ""
                    446:   "and #0xff,%0")
                    447: 
                    448: (define_insn "zero_extendqisi2"
                    449:   [(set (match_operand:SI 0 "register_operand" "=r")
                    450:        (zero_extend:SI (match_operand:QI 1 "register_operand" "0")))]
                    451:   ""
                    452:   "and #0xff,%0")
                    453: 
                    454: (define_insn "zero_extendsidi2"
                    455:   [(set (match_operand:DI 0 "register_operand" "=d")
                    456:        (zero_extend:DI (match_operand:SI 1 "register_operand" "0")))]
                    457:   ""
                    458:   "ld.u #0,%0")
                    459: 
                    460: ;; Fix-to-float conversion insns.
                    461: ;; Note that the ones that start with SImode come first.
                    462: ;; That is so that an operand that is a CONST_INT
                    463: ;; (and therefore lacks a specific machine mode).
                    464: ;; will be recognized as SImode (which is always valid)
                    465: ;; rather than as QImode or HImode.
                    466: 
                    467: (define_insn "floatsisf2"
                    468:   [(set (match_operand:SF 0 "register_operand" "=d")
                    469:        (float:SF (match_operand:SI 1 "register_operand" "d")))]
                    470:   ""
                    471:   "cvtw.s %1,%0"
                    472:   [(set_attr "type" "cvts")])
                    473: 
                    474: (define_insn "floatdisf2"
                    475:   [(set (match_operand:SF 0 "register_operand" "=d")
                    476:        (float:SF (match_operand:DI 1 "register_operand" "d")))]
                    477:   ""
                    478:   "cvtl.s %1,%0"
                    479:   [(set_attr "type" "cvtd")])
                    480: 
                    481: (define_insn "floatsidf2"
                    482:   [(set (match_operand:DF 0 "register_operand" "=d")
                    483:        (float:DF (match_operand:SI 1 "register_operand" "d")))]
                    484:   "! TARGET_C1"
                    485:   "cvtw.d %1,%0"
                    486:   [(set_attr "type" "cvts")])
                    487: 
                    488: (define_insn "floatdidf2"
                    489:   [(set (match_operand:DF 0 "register_operand" "=d")
                    490:        (float:DF (match_operand:DI 1 "register_operand" "d")))]
                    491:   ""
                    492:   "cvtl.d %1,%0"
                    493:   [(set_attr "type" "cvtd")])
                    494: 
                    495: ;; These are a little slower than gcc's normal way of doing unsigned
                    496: ;; DI floats (if the DI number is "negative") but they avoid double
                    497: ;; rounding and they avoid explicit constants.
                    498: 
                    499: (define_expand "floatunsdidf2"
                    500:   [(set (match_operand:DF 0 "register_operand" "=d")
                    501:        (float:DF (match_operand:DI 1 "register_operand" "d")))
                    502:    (set (cc0) (compare:DI (match_dup 3) (match_dup 1)))
                    503:    (set (pc)
                    504:        (if_then_else (le (cc0) (const_int 0))
                    505:                      (label_ref (match_dup 4))
                    506:                      (pc)))
                    507:    (set (match_dup 2) (lshiftrt:DI (match_dup 1) (const_int 1)))
                    508:    (set (match_dup 0) (float:DF (match_dup 2)))
                    509:    (set (match_dup 0) (plus:DF (match_dup 0) (match_dup 0)))
                    510:    (match_dup 4)
                    511:    (set (match_dup 0) (match_dup 0))]
                    512:   ""
                    513:   "
                    514: {
                    515:   operands[2] = gen_reg_rtx (DImode);
                    516:   operands[3] = force_reg (DImode, const0_rtx);
                    517:   operands[4] = gen_label_rtx ();
                    518: }")
                    519: 
                    520: (define_expand "floatunsdisf2"
                    521:   [(set (match_operand:SF 0 "register_operand" "=d")
                    522:        (float:SF (match_operand:DI 1 "register_operand" "d")))
                    523:    (set (cc0) (compare:DI (match_dup 3) (match_dup 1)))
                    524:    (set (pc)
                    525:        (if_then_else (le (cc0) (const_int 0))
                    526:                      (label_ref (match_dup 4))
                    527:                      (pc)))
                    528:    (set (match_dup 2) (lshiftrt:DI (match_dup 1) (const_int 1)))
                    529:    (set (match_dup 0) (float:SF (match_dup 2)))
                    530:    (set (match_dup 0) (plus:SF (match_dup 0) (match_dup 0)))
                    531:    (match_dup 4)
                    532:    (set (match_dup 0) (match_dup 0))]
                    533:   ""
                    534:   "
                    535: {
                    536:   operands[2] = gen_reg_rtx (DImode);
                    537:   operands[3] = force_reg (DImode, const0_rtx);
                    538:   operands[4] = gen_label_rtx ();
                    539: }")
                    540: 
                    541: ;; These patterns are identical to gcc's default action 
                    542: ;; if DI->DF and DI->SF are not present.  There are here
                    543: ;; only to prevent SI->*F from promoting to DI->*F.
                    544: 
                    545: (define_expand "floatunssidf2"
                    546:   [(set (match_dup 2)
                    547:        (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
                    548:    (set (match_operand:DF 0 "register_operand" "")
                    549:        (float:DF (match_dup 2)))]
                    550:   ""
                    551:   "operands[2] = gen_reg_rtx (DImode);")
                    552: 
                    553: (define_expand "floatunssisf2"
                    554:   [(set (match_dup 2)
                    555:         (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
                    556:    (set (match_operand:SF 0 "register_operand" "")
                    557:         (float:SF (match_dup 2)))]
                    558:   ""
                    559:   "operands[2] = gen_reg_rtx (DImode);")
                    560: 
                    561: ;; Float-to-fix conversion insns.
                    562: 
                    563: (define_insn "fix_truncsfsi2"
                    564:   [(set (match_operand:SI 0 "register_operand" "=d")
                    565:        (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "d"))))]
                    566:   ""
                    567:   "cvts.w %1,%0"
                    568:   [(set_attr "type" "cvts")])
                    569: 
                    570: (define_insn "fix_truncsfdi2"
                    571:   [(set (match_operand:DI 0 "register_operand" "=d")
                    572:        (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "d"))))]
                    573:   ""
                    574:   "cvts.l %1,%0"
                    575:   [(set_attr "type" "cvts")])
                    576: 
                    577: (define_insn "fix_truncdfsi2"
                    578:   [(set (match_operand:SI 0 "register_operand" "=d")
                    579:        (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "d"))))]
                    580:   ""
                    581:   "cvtd.l %1,%0"
                    582:   [(set_attr "type" "cvtd")])
                    583: 
                    584: (define_insn "fix_truncdfdi2"
                    585:   [(set (match_operand:DI 0 "register_operand" "=d")
                    586:        (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "d"))))]
                    587:   ""
                    588:   "cvtd.l %1,%0"
                    589:   [(set_attr "type" "cvtd")])
                    590: 
                    591: ;;- All kinds of add instructions.
                    592: 
                    593: (define_insn "adddf3"
                    594:   [(set (match_operand:DF 0 "register_operand" "=d")
                    595:        (plus:DF (match_operand:DF 1 "register_operand" "%0")
                    596:                 (match_operand:DF 2 "register_operand" "d")))]
                    597:   ""
                    598:   "add.d %2,%0"
                    599:   [(set_attr "type" "addd")])
                    600: 
                    601: (define_insn "addsf3"
                    602:   [(set (match_operand:SF 0 "register_operand" "=d")
                    603:        (plus:SF (match_operand:SF 1 "register_operand" "%0")
                    604:                 (match_operand:SF 2 "nonmemory_operand" "dF")))]
                    605:   ""
                    606:   "add.s %2,%0"
                    607:   [(set_attr "type" "adds")])
                    608: 
                    609: (define_insn "adddi3"
                    610:   [(set (match_operand:DI 0 "register_operand" "=d")
                    611:        (plus:DI (match_operand:DI 1 "register_operand" "%0")
                    612:                 (match_operand:DI 2 "register_operand" "d")))]
                    613:   ""
                    614:   "add.l %2,%0")
                    615: 
                    616: (define_expand "addsi3"
                    617:   [(set (match_operand:SI 0 "register_operand" "")
                    618:        (plus:SI (match_operand:SI 1 "register_operand" "")
                    619:                 (match_operand:SI 2 "nonmemory_operand" "")))]
                    620:   ""
                    621:   "")
                    622: 
                    623: (define_insn ""
                    624:   [(set (match_operand:SI 0 "register_operand" "=a")
                    625:        (plus:SI (match_operand:SI 1 "register_operand" "%A")
                    626:                 (match_operand:SI 2 "immediate_operand" "i")))]
                    627:   "operands[1] == frame_pointer_rtx || operands[1] == arg_pointer_rtx"
                    628:   "ldea %a2(%1),%0")
                    629: 
                    630: (define_insn ""
                    631:   [(set (match_operand:SI 0 "register_operand" "=a")
                    632:        (plus:SI (match_operand:SI 1 "register_operand" "%a")
                    633:                 (match_operand:SI 2 "nonmemory_operand" "ri")))]
                    634:   "operands[1] == stack_pointer_rtx && operands[0] != stack_pointer_rtx"
                    635:   "mov %1,%0\;add.w %2,%0")
                    636: 
                    637: (define_insn ""
                    638:   [(set (match_operand:SI 0 "push_operand" "=<")
                    639:        (plus:SI (match_operand:SI 1 "register_operand" "A")
                    640:                 (match_operand:SI 2 "immediate_operand" "i")))]
                    641:   "operands[1] != stack_pointer_rtx"
                    642:   "pshea %a2(%1)"
                    643:   [(set_attr "type" "mst")])
                    644: 
                    645: (define_insn ""
                    646:   [(set (match_operand:SI 0 "register_operand" "=d,a,a")
                    647:        (plus:SI (match_operand:SI 1 "register_operand" "%0,0,A")
                    648:                 (match_operand:SI 2 "nonmemory_operand" "di,ri,i")))]
                    649:   "TARGET_C1"
                    650:   "@
                    651:    add.w %2,%0
                    652:    add.w %2,%0
                    653:    ldea %a2(%1),%0")
                    654: 
                    655: (define_insn ""
                    656:   [(set (match_operand:SI 0 "register_operand" "=d,a,r")
                    657:        (plus:SI (match_operand:SI 1 "register_operand" "%0,0,A")
                    658:                 (match_operand:SI 2 "nonmemory_operand" "di,ri,i")))]
                    659:   ""
                    660:   "@
                    661:    add.w %2,%0
                    662:    add.w %2,%0
                    663:    ldea %a2(%1),%0")
                    664: 
                    665: (define_insn "addhi3"
                    666:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                    667:        (plus:HI (match_operand:HI 1 "register_operand" "%0,0")
                    668:                 (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
                    669:   ""
                    670:   "add.h %2,%0")
                    671: 
                    672: (define_insn "addqi3"
                    673:   [(set (match_operand:QI 0 "register_operand" "=d,d")
                    674:        (plus:QI (match_operand:QI 1 "register_operand" "%0,0")
                    675:                 (match_operand:QI 2 "nonmemory_operand" "d,i")))]
                    676:   ""
                    677:   "@
                    678:    add.b %2,%0
                    679:    add.w %2,%0")
                    680: 
                    681: ;;- All kinds of subtract instructions.
                    682: 
                    683: (define_insn "subdf3"
                    684:   [(set (match_operand:DF 0 "register_operand" "=d")
                    685:        (minus:DF (match_operand:DF 1 "register_operand" "0")
                    686:                  (match_operand:DF 2 "register_operand" "d")))]
                    687:   ""
                    688:   "sub.d %2,%0"
                    689:   [(set_attr "type" "addd")])
                    690: 
                    691: (define_insn "subsf3"
                    692:   [(set (match_operand:SF 0 "register_operand" "=d")
                    693:        (minus:SF (match_operand:SF 1 "register_operand" "0")
                    694:                  (match_operand:SF 2 "nonmemory_operand" "dF")))]
                    695:   ""
                    696:   "sub.s %2,%0"
                    697:   [(set_attr "type" "adds")])
                    698: 
                    699: (define_insn "subdi3"
                    700:   [(set (match_operand:DI 0 "register_operand" "=d")
                    701:        (minus:DI (match_operand:DI 1 "register_operand" "0")
                    702:                  (match_operand:DI 2 "register_operand" "d")))]
                    703:   ""
                    704:   "sub.l %2,%0")
                    705: 
                    706: (define_insn "subsi3"
                    707:   [(set (match_operand:SI 0 "register_operand" "=d,a,?d,?a")
                    708:        (minus:SI (match_operand:SI 1 "nonmemory_operand" "0,0,di,ai")
                    709:                  (match_operand:SI 2 "nonmemory_operand" "di,ai,0,0")))]
                    710:   ""
                    711:   "@
                    712:   sub.w %2,%0
                    713:   sub.w %2,%0
                    714:   sub.w %1,%0\;neg.w %0,%0
                    715:   sub.w %1,%0\;neg.w %0,%0")
                    716: 
                    717: (define_insn "subhi3"
                    718:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                    719:        (minus:HI (match_operand:HI 1 "register_operand" "0,0")
                    720:                  (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
                    721:   ""
                    722:   "sub.h %2,%0")
                    723: 
                    724: (define_insn "subqi3"
                    725:   [(set (match_operand:QI 0 "register_operand" "=d,d")
                    726:        (minus:QI (match_operand:QI 1 "register_operand" "0,0")
                    727:                  (match_operand:QI 2 "nonmemory_operand" "d,i")))]
                    728:   ""
                    729:   "@
                    730:    sub.b %2,%0
                    731:    sub.w %2,%0")
                    732: 
                    733: ;;- Multiply instructions.
                    734: 
                    735: (define_insn "muldf3"
                    736:   [(set (match_operand:DF 0 "register_operand" "=d")
                    737:        (mult:DF (match_operand:DF 1 "register_operand" "%0")
                    738:                 (match_operand:DF 2 "register_operand" "d")))]
                    739:   ""
                    740:   "mul.d %2,%0"
                    741:   [(set_attr "type" "muld")])
                    742: 
                    743: (define_insn "mulsf3"
                    744:   [(set (match_operand:SF 0 "register_operand" "=d")
                    745:        (mult:SF (match_operand:SF 1 "register_operand" "%0")
                    746:                 (match_operand:SF 2 "nonmemory_operand" "dF")))]
                    747:   ""
                    748:   "mul.s %2,%0"
                    749:   [(set_attr "type" "muls")])
                    750: 
                    751: (define_insn "muldi3"
                    752:   [(set (match_operand:DI 0 "register_operand" "=d")
                    753:        (mult:DI (match_operand:DI 1 "register_operand" "%0")
                    754:                 (match_operand:DI 2 "register_operand" "d")))]
                    755:   ""
                    756:   "mul.l %2,%0"
                    757:   [(set_attr "type" "mull")])
                    758: 
                    759: (define_insn "mulsi3"
                    760:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                    761:        (mult:SI (match_operand:SI 1 "register_operand" "%0,0")
                    762:                 (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
                    763:   ""
                    764:   "mul.w %2,%0"
                    765:   [(set_attr "type" "mulw")])
                    766: 
                    767: (define_insn "mulhi3"
                    768:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                    769:        (mult:HI (match_operand:HI 1 "register_operand" "%0,0")
                    770:                 (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
                    771:   ""
                    772:   "mul.h %2,%0"
                    773:   [(set_attr "type" "mulw")])
                    774: 
                    775: (define_insn "mulqi3"
                    776:   [(set (match_operand:QI 0 "register_operand" "=d,d")
                    777:        (mult:QI (match_operand:QI 1 "register_operand" "%0,0")
                    778:                 (match_operand:QI 2 "nonmemory_operand" "d,i")))]
                    779:   ""
                    780:   "@
                    781:    mul.b %2,%0
                    782:    mul.w %2,%0"
                    783:   [(set_attr "type" "mulw,mulw")])
                    784: 
                    785: ;;- Divide instructions.
                    786: 
                    787: (define_insn "divdf3"
                    788:   [(set (match_operand:DF 0 "register_operand" "=d")
                    789:        (div:DF (match_operand:DF 1 "register_operand" "0")
                    790:                (match_operand:DF 2 "register_operand" "d")))]
                    791:   ""
                    792:   "div.d %2,%0"
                    793:   [(set_attr "type" "divd")])
                    794: 
                    795: (define_insn "divsf3"
                    796:   [(set (match_operand:SF 0 "register_operand" "=d")
                    797:        (div:SF (match_operand:SF 1 "register_operand" "0")
                    798:                (match_operand:SF 2 "nonmemory_operand" "dF")))]
                    799:   ""
                    800:   "div.s %2,%0"
                    801:   [(set_attr "type" "divs")])
                    802: 
                    803: (define_insn "divdi3"
                    804:   [(set (match_operand:DI 0 "register_operand" "=d")
                    805:        (div:DI (match_operand:DI 1 "register_operand" "0")
                    806:                (match_operand:DI 2 "register_operand" "d")))]
                    807:   ""
                    808:   "div.l %2,%0"
                    809:   [(set_attr "type" "divl")])
                    810: 
                    811: (define_expand "udivsi3"
                    812:   [(set (match_dup 3)
                    813:        (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
                    814:    (set (match_dup 4)
                    815:        (zero_extend:DI (match_operand:SI 2 "register_operand" "")))
                    816:    (set (match_dup 3)
                    817:        (div:DI (match_dup 3) (match_dup 4)))
                    818:    (set (match_operand:SI 0 "register_operand" "")
                    819:        (subreg:SI (match_dup 3) 0))]
                    820:   ""
                    821:   "operands[3] = gen_reg_rtx (DImode);
                    822:    operands[4] = gen_reg_rtx (DImode); ")
                    823: 
                    824: (define_insn "udivdi3"
                    825:   [(set (match_operand:DI 0 "register_operand" "=d")
                    826:        (udiv:DI (match_operand:DI 1 "register_operand" "d")
                    827:                 (match_operand:DI 2 "register_operand" "d")))]
                    828:   ""
                    829:   "psh.l %2\;psh.l %1\;callq udiv64\;pop.l %0\;add.w #8,sp")
                    830: 
                    831: (define_insn "divsi3"
                    832:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                    833:        (div:SI (match_operand:SI 1 "register_operand" "0,0")
                    834:                (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
                    835:   ""
                    836:   "div.w %2,%0"
                    837:   [(set_attr "type" "divw")])
                    838: 
                    839: (define_insn "divhi3"
                    840:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                    841:        (div:HI (match_operand:HI 1 "register_operand" "0,0")
                    842:                (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
                    843:   ""
                    844:   "div.h %2,%0"
                    845:   [(set_attr "type" "divw")])
                    846: 
                    847: (define_insn "divqi3"
                    848:   [(set (match_operand:QI 0 "register_operand" "=d")
                    849:        (div:QI (match_operand:QI 1 "register_operand" "0")
                    850:                (match_operand:QI 2 "register_operand" "d")))]
                    851:   ""
                    852:   "div.b %2,%0"
                    853:   [(set_attr "type" "divw")])
                    854: 
                    855: ;;- Bit clear instructions.
                    856: 
                    857: (define_insn ""
                    858:   [(set (match_operand:DI 0 "register_operand" "=d")
                    859:        (and:DI (match_operand:DI 1 "register_operand" "%0")
                    860:                (match_operand:DI 2 "" "")))]
                    861:   "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
                    862:    || (GET_CODE (operands[2]) == CONST_DOUBLE
                    863:        && CONST_DOUBLE_HIGH (operands[2]) == -1)"
                    864:   "and %2,%0")
                    865: 
                    866: (define_insn "anddi3"
                    867:   [(set (match_operand:DI 0 "register_operand" "=d")
                    868:        (and:DI (match_operand:DI 1 "register_operand" "%0")
                    869:                (match_operand:DI 2 "register_operand" "d")))]
                    870:   ""
                    871:   "and %2,%0")
                    872: 
                    873: (define_insn "andsi3"
                    874:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                    875:        (and:SI (match_operand:SI 1 "register_operand" "%0,0")
                    876:                (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
                    877:   ""
                    878:   "and %2,%0")
                    879: 
                    880: (define_insn "andhi3"
                    881:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                    882:        (and:HI (match_operand:HI 1 "register_operand" "%0,0")
                    883:                (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
                    884:   ""
                    885:   "and %2,%0")
                    886: 
                    887: (define_insn "andqi3"
                    888:   [(set (match_operand:QI 0 "register_operand" "=d,a")
                    889:        (and:QI (match_operand:QI 1 "register_operand" "%0,0")
                    890:                (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
                    891:   ""
                    892:   "and %2,%0")
                    893: 
                    894: ;;- Bit set instructions.
                    895: 
                    896: (define_insn ""
                    897:   [(set (match_operand:DI 0 "register_operand" "=d")
                    898:        (ior:DI (match_operand:DI 1 "register_operand" "%0")
                    899:                (match_operand:DI 2 "" "")))]
                    900:   "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0)
                    901:    || (GET_CODE (operands[2]) == CONST_DOUBLE
                    902:        && CONST_DOUBLE_HIGH (operands[2]) == 0)"
                    903:   "or %2,%0")
                    904: 
                    905: (define_insn "iordi3"
                    906:   [(set (match_operand:DI 0 "register_operand" "=d")
                    907:        (ior:DI (match_operand:DI 1 "register_operand" "%0")
                    908:                (match_operand:DI 2 "register_operand" "d")))]
                    909:   ""
                    910:   "or %2,%0")
                    911: 
                    912: (define_insn "iorsi3"
                    913:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                    914:        (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
                    915:                (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
                    916:   ""
                    917:   "or %2,%0")
                    918: 
                    919: (define_insn "iorhi3"
                    920:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                    921:        (ior:HI (match_operand:HI 1 "register_operand" "%0,0")
                    922:                (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
                    923:   ""
                    924:   "or %2,%0")
                    925: 
                    926: (define_insn "iorqi3"
                    927:   [(set (match_operand:QI 0 "register_operand" "=d,a")
                    928:        (ior:QI (match_operand:QI 1 "register_operand" "%0,0")
                    929:                (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
                    930:   ""
                    931:   "or %2,%0")
                    932: 
                    933: ;;- xor instructions.
                    934: 
                    935: (define_insn ""
                    936:   [(set (match_operand:DI 0 "register_operand" "=d")
                    937:        (xor:DI (match_operand:DI 1 "register_operand" "%0")
                    938:                (match_operand:DI 2 "" "")))]
                    939:   "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0)
                    940:    || (GET_CODE (operands[2]) == CONST_DOUBLE
                    941:        && CONST_DOUBLE_HIGH (operands[2]) == 0)"
                    942:   "xor %2,%0")
                    943: 
                    944: (define_insn "xordi3"
                    945:   [(set (match_operand:DI 0 "register_operand" "=d")
                    946:        (xor:DI (match_operand:DI 1 "register_operand" "%0")
                    947:                (match_operand:DI 2 "register_operand" "d")))]
                    948:   ""
                    949:   "xor %2,%0")
                    950: 
                    951: (define_insn "xorsi3"
                    952:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                    953:        (xor:SI (match_operand:SI 1 "register_operand" "%0,0")
                    954:                (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
                    955:   ""
                    956:   "xor %2,%0")
                    957: 
                    958: (define_insn "xorhi3"
                    959:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                    960:        (xor:HI (match_operand:HI 1 "register_operand" "%0,0")
                    961:                (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
                    962:   ""
                    963:   "xor %2,%0")
                    964: 
                    965: (define_insn "xorqi3"
                    966:   [(set (match_operand:QI 0 "register_operand" "=d,a")
                    967:        (xor:QI (match_operand:QI 1 "register_operand" "%0,0")
                    968:                (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
                    969:   ""
                    970:   "xor %2,%0")
                    971: 
                    972: (define_insn "negdf2"
                    973:   [(set (match_operand:DF 0 "register_operand" "=d")
                    974:        (neg:DF (match_operand:DF 1 "register_operand" "d")))]
                    975:   ""
                    976:   "neg.d %1,%0"
                    977:   [(set_attr "type" "addd")])
                    978: 
                    979: (define_insn "negsf2"
                    980:   [(set (match_operand:SF 0 "register_operand" "=d")
                    981:        (neg:SF (match_operand:SF 1 "register_operand" "d")))]
                    982:   ""
                    983:   "neg.s %1,%0"
                    984:   [(set_attr "type" "adds")])
                    985: 
                    986: (define_insn "negdi2"
                    987:   [(set (match_operand:DI 0 "register_operand" "=d")
                    988:        (neg:DI (match_operand:DI 1 "register_operand" "d")))]
                    989:   ""
                    990:   "neg.l %1,%0")
                    991: 
                    992: (define_insn "negsi2"
                    993:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                    994:        (neg:SI (match_operand:SI 1 "register_operand" "d,a")))]
                    995:   ""
                    996:   "neg.w %1,%0")
                    997: 
                    998: (define_insn "neghi2"
                    999:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                   1000:        (neg:HI (match_operand:HI 1 "register_operand" "d,a")))]
                   1001:   ""
                   1002:   "neg.h %1,%0")
                   1003: 
                   1004: (define_insn "negqi2"
                   1005:   [(set (match_operand:QI 0 "register_operand" "=d")
                   1006:        (neg:QI (match_operand:QI 1 "register_operand" "d")))]
                   1007:   ""
                   1008:   "neg.b %1,%0")
                   1009: 
                   1010: (define_insn "one_cmpldi2"
                   1011:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1012:        (not:DI (match_operand:DI 1 "register_operand" "d")))]
                   1013:   ""
                   1014:   "not %1,%0")
                   1015: 
                   1016: (define_insn "one_cmplsi2"
                   1017:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                   1018:        (not:SI (match_operand:SI 1 "register_operand" "d,a")))]
                   1019:   ""
                   1020:   "not %1,%0")
                   1021: 
                   1022: (define_insn "one_cmplhi2"
                   1023:   [(set (match_operand:HI 0 "register_operand" "=d,a")
                   1024:        (not:HI (match_operand:HI 1 "register_operand" "d,a")))]
                   1025:   ""
                   1026:   "not %1,%0")
                   1027: 
                   1028: (define_insn "one_cmplqi2"
                   1029:   [(set (match_operand:QI 0 "register_operand" "=d,a")
                   1030:        (not:QI (match_operand:QI 1 "register_operand" "d,a")))]
                   1031:   ""
                   1032:   "not %1,%0")
                   1033: 
                   1034: ;;- Shifts
                   1035: ;;
                   1036: ;; The extreme profusion of patterns here is due to the different-speed
                   1037: ;; shifts on different machines, and the C1's lack of word shift S-register
                   1038: ;; instructions.
                   1039: 
                   1040: ;; SImode
                   1041: 
                   1042: ;; Arithmetic left 1, 1 cycle on all machines via add
                   1043: 
                   1044: (define_insn ""
                   1045:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1046:        (ashift:SI (match_operand:SI 1 "register_operand" "0")
                   1047:                   (const_int 1)))]
                   1048:   ""
                   1049:   "add.w %0,%0")
                   1050: 
                   1051: ;; C34 general shift is 1 cycle
                   1052: 
                   1053: (define_insn ""
                   1054:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                   1055:        (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
                   1056:                   (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
                   1057:   "TARGET_C34"
                   1058:   "@
                   1059:    shf.w %2,%0
                   1060:    shf %2,%0"
                   1061:   [(set_attr "type" "shfw,shfw")])
                   1062: 
                   1063: ;; else shift left 0..7 is 1 cycle if we use an A register
                   1064: 
                   1065: (define_insn ""
                   1066:   [(set (match_operand:SI 0 "register_operand" "=a,?d")
                   1067:        (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
                   1068:                   (match_operand:SI 2 "immediate_operand" "ai,di")))]
                   1069:   "TARGET_C1 && INTVAL (operands[2]) < (unsigned) 8"
                   1070:   "@
                   1071:    shf %2,%0
                   1072:    shf %2,%0"
                   1073:   [(set_attr "type" "alu,shfl")])
                   1074: 
                   1075: (define_insn ""
                   1076:   [(set (match_operand:SI 0 "register_operand" "=a,?d")
                   1077:        (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
                   1078:                   (match_operand:SI 2 "immediate_operand" "ai,di")))]
                   1079:   "INTVAL (operands[2]) < (unsigned) 8"
                   1080:   "@
                   1081:    shf %2,%0
                   1082:    shf.w %2,%0"
                   1083:   [(set_attr "type" "alu,shfw")])
                   1084: 
                   1085: ;; else general left shift
                   1086: 
                   1087: (define_insn ""
                   1088:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                   1089:        (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
                   1090:                   (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
                   1091:   "TARGET_C1"
                   1092:   "@
                   1093:    shf %2,%0
                   1094:    shf %2,%0"
                   1095:   [(set_attr "type" "shfl,shfw")])
                   1096: 
1.1.1.3 ! root     1097: ;; but C2 left shift by a constant is faster via multiply
        !          1098: 
1.1       root     1099: (define_insn ""
                   1100:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1101:        (ashift:SI (match_operand:SI 1 "register_operand" "0")
                   1102:                   (match_operand:SI 2 "const_int_operand" "i")))]
                   1103:   "TARGET_C2 && INTVAL (operands[2]) < (unsigned) 32"
                   1104:   "mul.w %z2,%0"
                   1105:   [(set_attr "type" "mulw")])
                   1106: 
                   1107: (define_insn "ashlsi3"
                   1108:   [(set (match_operand:SI 0 "register_operand" "=d,a")
                   1109:        (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
                   1110:                   (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
                   1111:   ""
                   1112:   "@
                   1113:    shf.w %2,%0
                   1114:    shf %2,%0"
                   1115:   [(set_attr "type" "shfw,shfw")])
                   1116: 
                   1117: ;; Logical right, general
                   1118: ;; The hardware wants the negative of the shift count
                   1119: 
                   1120: (define_expand "lshrsi3"
                   1121:   [(set (match_operand:SI 0 "register_operand" "")
                   1122:        (lshiftrt:SI (match_operand:SI 1 "register_operand" "")
                   1123:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" ""))))]
                   1124:   ""
                   1125:   "operands[2] = negate_rtx (SImode, operands[2]);")
                   1126: 
                   1127: ;; C1 lacks word shift S reg
                   1128: 
                   1129: (define_insn ""
                   1130:   [(set
                   1131:     (match_operand:SI 0 "register_operand" "=a,?d")
                   1132:     (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0")
                   1133:                 (neg:SI (match_operand:SI 2 "nonmemory_operand" "ai,di"))))]
                   1134:   "TARGET_C1"
                   1135:   "@
                   1136:    shf %2,%0
                   1137:    ld.u #0,%0\;shf %2,%0"
                   1138:   [(set_attr "type" "shfw,shfl")])
                   1139: 
                   1140: ;; general case
                   1141: 
                   1142: (define_insn ""
                   1143:   [(set
                   1144:     (match_operand:SI 0 "register_operand" "=d,a")
                   1145:     (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0")
                   1146:                 (neg:SI (match_operand:SI 2 "nonmemory_operand" "di,ai"))))]
                   1147:   ""
                   1148:   "@
                   1149:    shf.w %2,%0
                   1150:    shf %2,%0"
                   1151:   [(set_attr "type" "shfw,shfw")])
                   1152: 
                   1153: ;; Patterns without neg produced by constant folding
                   1154: 
                   1155: (define_insn ""
                   1156:   [(set
                   1157:     (match_operand:SI 0 "register_operand" "=a,?d")
                   1158:     (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0")
                   1159:                 (match_operand:SI 2 "immediate_operand" "i,i")))]
                   1160:   "TARGET_C1"
                   1161:   "@
                   1162:    shf #%n2,%0
                   1163:    ld.u #0,%0\;shf #%n2,%0"
                   1164:   [(set_attr "type" "shfw,shfl")])
                   1165: 
                   1166: (define_insn ""
                   1167:   [(set
                   1168:     (match_operand:SI 0 "register_operand" "=d,a")
                   1169:     (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0")
                   1170:                 (match_operand:SI 2 "immediate_operand" "i,i")))]
                   1171:   ""
                   1172:   "@
                   1173:    shf.w #%n2,%0
                   1174:    shf #%n2,%0"
                   1175:   [(set_attr "type" "shfw,shfw")])
                   1176: 
                   1177: ;; Arithmetic right, general
                   1178: ;; Sign-extend to 64 bits, then shift that.  Works for 0..32.
                   1179: 
                   1180: (define_expand "ashrsi3"
                   1181:   [(set (match_operand:SI 0 "register_operand" "")
                   1182:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "")
                   1183:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" ""))))]
                   1184:   ""
                   1185:   "operands[2] = negate_rtx (SImode, operands[2]);")
                   1186: 
                   1187: (define_insn ""
                   1188:   [(set (match_operand:SI 0 "register_operand" "=d,&d")
                   1189:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "0,d")
                   1190:                     (neg:SI
                   1191:                      (match_operand:SI 2 "nonmemory_operand" "di,di"))))]
                   1192:   ""
                   1193:   "cvtw.l %1,%0\;shf %2,%0"
                   1194:   [(set_attr "type" "shfl,shfl")])
                   1195: 
                   1196: (define_insn ""
                   1197:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1198:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "d")
                   1199:                     (match_operand:SI 2 "immediate_operand" "i")))]
                   1200:   ""
                   1201:   "cvtw.l %1,%0\;shf #%n2,%0"
                   1202:   [(set_attr "type" "shfl")])
                   1203: 
                   1204: ;; DImode
                   1205: ;; Arithmetic left, 1-cycle
                   1206: 
                   1207: (define_insn ""
                   1208:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1209:        (ashift:DI (match_operand:DI 1 "register_operand" "0")
                   1210:                   (const_int 1)))]
                   1211:   ""
                   1212:   "add.l %0,%0")
                   1213: 
                   1214: ;; Arithmetic left, general
                   1215: 
                   1216: (define_insn "ashldi3"
                   1217:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1218:        (ashift:DI (match_operand:DI 1 "register_operand" "0")
                   1219:                   (match_operand:SI 2 "nonmemory_operand" "di")))]
                   1220:   ""
                   1221:   "shf %2,%0"
                   1222:   [(set_attr "type" "shfl")])
                   1223: 
                   1224: ;; Can omit zero- or sign-extend if shift is 32 or more.
                   1225: 
                   1226: (define_insn ""
                   1227:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1228:        (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "0"))
                   1229:                   (match_operand:SI 2 "const_int_operand" "i")))]
                   1230:   "INTVAL (operands[2]) >= 32"
                   1231:   "shf %2,%0"
                   1232:   [(set_attr "type" "shfl")])
                   1233: 
                   1234: (define_insn ""
                   1235:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1236:        (ashift:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "0"))
                   1237:                   (match_operand:SI 2 "const_int_operand" "i")))]
                   1238:   "INTVAL (operands[2]) >= 32"
                   1239:   "shf %2,%0"
                   1240:   [(set_attr "type" "shfl")])
                   1241: 
                   1242: ;; Logical right, general
                   1243: 
                   1244: (define_expand "lshrdi3"
                   1245:   [(set (match_operand:DI 0 "register_operand" "")
                   1246:        (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
                   1247:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" ""))))]
                   1248:   ""
                   1249:   "operands[2] = negate_rtx (SImode, operands[2]);")
                   1250: 
                   1251: (define_insn ""
                   1252:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1253:        (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
                   1254:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "di"))))]
                   1255:   ""
                   1256:   "shf %2,%0"
                   1257:   [(set_attr "type" "shfl")])
                   1258: 
                   1259: (define_insn ""
                   1260:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1261:        (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
                   1262:                     (match_operand:SI 2 "immediate_operand" "i")))]
                   1263:   ""
                   1264:   "shf #%n2,%0"
                   1265:   [(set_attr "type" "shfl")])
                   1266: 
                   1267: ;; Arithmetic right, general
                   1268: ;; Use
                   1269: ;;     ((a >> b) ^ signbit) - signbit
                   1270: ;; where signbit is (1 << 63) >> b
                   1271: ;; Works for 0..63.  Does not work for 64; unfortunate but legal.
                   1272: 
                   1273: (define_expand "ashrdi3"
                   1274:   [(set (match_operand:DI 0 "register_operand" "")
                   1275:        (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
                   1276:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" ""))))
                   1277:    (set (match_dup 3) (lshiftrt:DI (match_dup 3) (neg:SI (match_dup 2))))
                   1278:    (set (match_dup 0) (xor:DI (match_dup 0) (match_dup 3)))
                   1279:    (set (match_dup 0) (minus:DI (match_dup 0) (match_dup 3)))]
                   1280:   ""
                   1281:   "
                   1282: {
                   1283:   if (GET_CODE (operands[2]) == CONST_INT)
                   1284:     switch (INTVAL (operands[2]))
                   1285:       {
                   1286:       case 32:
                   1287:        emit_insn (gen_ashrdi3_32 (operands[0], operands[1]));
                   1288:        DONE;
                   1289:       }
                   1290: 
                   1291:   operands[2] = negate_rtx (SImode, operands[2]);
                   1292:   operands[3] = force_reg (DImode, immed_double_const (0, 1 << 31, DImode));
                   1293: }")
                   1294: 
                   1295: ;; Arithmetic right 32, a common case that can save a couple of insns.
                   1296: 
                   1297: (define_expand "ashrdi3_32"
                   1298:   [(set (match_operand:DI 0 "register_operand" "")
                   1299:        (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
                   1300:                     (const_int 32)))
                   1301:    (set (match_dup 0)
                   1302:        (sign_extend:DI (subreg:SI (match_dup 0) 0)))]
                   1303:   ""
                   1304:   "")
                   1305: 
                   1306: ;; __builtin instructions
                   1307: 
                   1308: (define_insn "sqrtdf2"
                   1309:   [(set (match_operand:DF 0 "register_operand" "=d")
                   1310:        (sqrt:DF (match_operand:DF 1 "register_operand" "0")))]
                   1311:   "! TARGET_C1 && flag_fast_math"
                   1312:   "sqrt.d %0"
                   1313:   [(set_attr "type" "divd")])
                   1314: 
                   1315: (define_insn "sqrtsf2"
                   1316:   [(set (match_operand:SF 0 "register_operand" "=d")
                   1317:        (sqrt:SF (match_operand:SF 1 "register_operand" "0")))]
                   1318:   "! TARGET_C1 && flag_fast_math"
                   1319:   "sqrt.s %0"
                   1320:   [(set_attr "type" "divs")])
                   1321: 
                   1322: (define_insn "sindf2"
                   1323:   [(set (match_operand:DF 0 "register_operand" "=d")
                   1324:        (unspec:DF [(match_operand:DF 1 "register_operand" "0")] 1))]
                   1325:   "! TARGET_C1 && flag_fast_math"
                   1326:   "sin.d %0")
                   1327: 
                   1328: (define_insn "sinsf2"
                   1329:   [(set (match_operand:SF 0 "register_operand" "=d")
                   1330:        (unspec:SF [(match_operand:SF 1 "register_operand" "0")] 1))]
                   1331:   "! TARGET_C1 && flag_fast_math"
                   1332:   "sin.s %0")
                   1333: 
                   1334: (define_insn "cosdf2"
                   1335:   [(set (match_operand:DF 0 "register_operand" "=d")
                   1336:        (unspec:DF [(match_operand:DF 1 "register_operand" "0")] 2))]
                   1337:   "! TARGET_C1 && flag_fast_math"
                   1338:   "cos.d %0")
                   1339: 
                   1340: (define_insn "cossf2"
                   1341:   [(set (match_operand:SF 0 "register_operand" "=d")
                   1342:        (unspec:SF [(match_operand:SF 1 "register_operand" "0")] 2))]
                   1343:   "! TARGET_C1 && flag_fast_math"
                   1344:   "cos.s %0")
                   1345: 
                   1346: (define_insn "ftruncdf2"
                   1347:   [(set (match_operand:DF 0 "register_operand" "=d")
                   1348:        (fix:DF (match_operand:DF 1 "register_operand" "d")))]
                   1349:   "! TARGET_C1"
                   1350:   "frint.d %1,%0"
                   1351:   [(set_attr "type" "cvtd")])
                   1352: 
                   1353: (define_insn "ftruncsf2"
                   1354:   [(set (match_operand:SF 0 "register_operand" "=d")
                   1355:        (fix:SF (match_operand:SF 1 "register_operand" "d")))]
                   1356:   "! TARGET_C1"
                   1357:   "frint.s %1,%0"
                   1358:   [(set_attr "type" "cvts")])
                   1359: 
                   1360: (define_insn ""
                   1361:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1362:        (minus:SI (ffs:SI (match_operand:SI 1 "register_operand" "d"))
                   1363:                  (const_int 1)))]
                   1364:   ""
                   1365:   "tzc %1,%0\;le.w #32,%0\;jbrs.f L0%=\;ld.w #-1,%0\\nL0%=:")
                   1366: 
                   1367: (define_expand "ffssi2"
                   1368:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1369:        (minus:SI (ffs:SI (match_operand:SI 1 "register_operand" "d"))
                   1370:                  (const_int 1)))
                   1371:    (set (match_dup 0)
                   1372:        (plus:SI (match_dup 0)
                   1373:                 (const_int 1)))]
                   1374:   ""
                   1375:   "")
                   1376: 
                   1377: (define_insn "abssf2"
                   1378:   [(set (match_operand:SF 0 "register_operand" "=d")
                   1379:        (abs:SF (match_operand:SF 1 "register_operand" "0")))]
                   1380:   ""
                   1381:   "and #0x7fffffff,%0")
                   1382: 
                   1383: (define_expand "absdf2"
                   1384:   [(set (subreg:DI (match_operand:DF 0 "register_operand" "=d") 0)
                   1385:        (and:DI (subreg:DI (match_operand:DF 1 "register_operand" "d") 0)
                   1386:                (match_dup 2)))]
                   1387:   ""
                   1388:   "operands[2] = force_reg (DImode,
                   1389:                             immed_double_const (-1, 0x7fffffff, DImode));")
                   1390: 
                   1391: ;;- Compares
                   1392: 
                   1393: (define_insn "cmpdi"
                   1394:   [(set (cc0)
                   1395:        (compare (match_operand:DI 0 "register_operand" "d")
                   1396:                 (match_operand:DI 1 "register_operand" "d")))]
                   1397:   ""
                   1398:   "* return output_cmp (operands[0], operands[1], 'l');")
                   1399: 
                   1400: (define_insn ""
                   1401:   [(set (cc0) (match_operand:DI 0 "register_operand" "d"))
                   1402:    (clobber (match_scratch:DI 1 "=d"))]
                   1403:   "next_insn_tests_no_inequality (insn)"
                   1404:   "* return output_cmp (operands[0], operands[1], 'L');")
                   1405: 
                   1406: (define_insn "cmpsi"
                   1407:   [(set (cc0)
                   1408:        (compare (match_operand:SI 0 "register_operand" "d,a")
                   1409:                 (match_operand:SI 1 "nonmemory_operand" "di,ai")))]
                   1410:   ""
                   1411:   "* return output_cmp (operands[0], operands[1], 'w');")
                   1412: 
                   1413: (define_insn "cmphi"
                   1414:   [(set (cc0)
                   1415:        (compare (match_operand:HI 0 "register_operand" "d,a")
                   1416:                 (match_operand:HI 1 "nonmemory_operand" "di,ai")))]
                   1417:   ""
                   1418:   "* return output_cmp (operands[0], operands[1], 'h');")
                   1419: 
                   1420: ; cmpqi is intentionally omitted.
                   1421: ;
                   1422: ; gcc will sign-extend or zero-extend the operands to the next
                   1423: ; wider mode, HImode.
                   1424: ;
                   1425: ; For reg .cmp. constant, we just go with the halfword immediate
                   1426: ; instruction.  Perhaps the widening insn can be cse'd or combined away.
                   1427: ; If not, we're still as good as loading a byte constant into a register
                   1428: ; to do a reg-reg byte compare.
                   1429: ;
                   1430: ; The following patterns pick up cases that can use reg .cmp. reg after all.
                   1431: 
                   1432: (define_insn ""
                   1433:   [(set (cc0)
                   1434:        (compare
                   1435:         (sign_extend:HI (match_operand:QI 0 "register_operand" "d"))
                   1436:         (sign_extend:HI (match_operand:QI 1 "register_operand" "d"))))]
                   1437:   ""
                   1438:   "* return output_cmp (operands[0], operands[1], 'b');")
                   1439: 
                   1440: (define_insn ""
                   1441:   [(set (cc0)
                   1442:        (compare
                   1443:         (ashift:HI (subreg:HI (match_operand:QI 0 "register_operand" "d") 0)
                   1444:                    (const_int 8))
                   1445:         (ashift:HI (subreg:HI (match_operand:QI 1 "register_operand" "d") 0)
                   1446:                    (const_int 8))))]
                   1447:   ""
                   1448:   "* return output_cmp (operands[0], operands[1], 'b');")
                   1449: 
                   1450: (define_insn ""
                   1451:   [(set (cc0)
                   1452:        (compare (match_operand:QI 0 "register_operand" "d")
                   1453:                 (match_operand:QI 1 "register_operand" "d")))]
                   1454:   ""
                   1455:   "* return output_cmp (operands[0], operands[1], 'b');")
                   1456: 
                   1457: (define_insn ""
1.1.1.3 ! root     1458:   [(set (cc0) (match_operand:QI 0 "register_operand" "d"))
        !          1459:    (clobber (match_scratch:QI 1 "=d"))]
1.1       root     1460:   "next_insn_tests_no_inequality (insn)"
                   1461:   "* return output_cmp (operands[0], operands[1], 'B');")
                   1462: 
                   1463: (define_insn ""
1.1.1.3 ! root     1464:   [(set (cc0) (subreg (match_operand:QI 0 "register_operand" "d") 0))
        !          1465:    (clobber (match_scratch:QI 1 "=d"))]
1.1       root     1466:   "next_insn_tests_no_inequality (insn)"
                   1467:   "* return output_cmp (operands[0], operands[1], 'B');")
                   1468: 
                   1469: (define_insn ""
                   1470:   [(set (cc0)
1.1.1.3 ! root     1471:        (zero_extend (subreg (match_operand:QI 0 "register_operand" "d") 0)))
        !          1472:    (clobber (match_scratch:QI 1 "=d"))]
1.1       root     1473:   "next_insn_tests_no_inequality (insn)"
                   1474:   "* return output_cmp (operands[0], operands[1], 'B');")
                   1475: 
                   1476: (define_insn "cmpdf"
                   1477:   [(set (cc0)
                   1478:        (compare (match_operand:DF 0 "register_operand" "d")
                   1479:                 (match_operand:DF 1 "register_operand" "d")))]
                   1480:   ""
                   1481:   "* return output_cmp (operands[0], operands[1], 'd');")
                   1482: 
                   1483: (define_insn "cmpsf"
                   1484:   [(set (cc0)
                   1485:        (compare (match_operand:SF 0 "register_operand" "d")
                   1486:                 (match_operand:SF 1 "nonmemory_cmpsf_operand" "dF")))]
                   1487:   ""
                   1488:   "* return output_cmp (operands[0], operands[1], 's');")
                   1489: 
                   1490: ;; decrement-and-set-cc0 insns.
                   1491: ;;
                   1492: ;; The most important case where we can use the carry bit from an
                   1493: ;; arithmetic insn to eliminate a redundant compare is the decrement in
                   1494: ;; constructs like while (n--) and while (--n >= 0).  
                   1495: ;;
                   1496: ;; We do it with combine patterns instead of NOTICE_UPDATE_CC because
                   1497: ;; the decrement needs to be kept at the end of the block during scheduling.
                   1498: ;; 
                   1499: ;; These patterns must have memory alternatives because reload refuses
                   1500: ;; to do output reloads for an insn that sets cc0 (since it does not
                   1501: ;; want to clobber cc0 with its moves).  Convex moves do not clobber
                   1502: ;; cc0, but there is no evident way to get reload to know that.
                   1503: 
                   1504: (define_insn ""
                   1505:   [(set (cc0)
                   1506:        (match_operand:SI 0 "register_operand" "+r,*m"))
                   1507:    (set (match_dup 0)
                   1508:        (plus:SI (match_dup 0)
                   1509:                 (const_int -1)))]
                   1510:   "next_insn_tests_no_inequality (insn)"
                   1511:   "*
                   1512: {
                   1513:   if (which_alternative == 0)
                   1514:     {
                   1515:       output_cmp (operands[0], constm1_rtx, 'W');
                   1516:       return \"add.w #-1,%0\";
                   1517:     }
                   1518:   else
                   1519:     {
                   1520:       output_cmp (gen_rtx (REG, SImode, 7), constm1_rtx, 'W');
                   1521:       return \"psh.w s7\;ld.w %0,s7\;add.w #-1,s7\;st.w s7,%0\;pop.w s7\";
                   1522:     }
                   1523: }")
                   1524:      
                   1525: (define_insn ""
                   1526:   [(set (cc0)
                   1527:        (plus:SI (match_operand:SI 0 "register_operand" "+r,*m")
                   1528:                 (const_int -1)))
                   1529:    (set (match_dup 0)
                   1530:        (plus:SI (match_dup 0)
                   1531:                 (const_int -1)))]
                   1532:   "find_reg_note (next_cc0_user (insn), REG_NONNEG, 0)"
                   1533:   "*
                   1534: {
                   1535:   if (which_alternative == 0)
                   1536:     {
                   1537:       output_cmp (operands[0], const0_rtx, 'W');
                   1538:       return \"add.w #-1,%0\";
                   1539:     }
                   1540:   else
                   1541:     {
                   1542:       output_cmp (gen_rtx (REG, SImode, 7), const0_rtx, 'W');
                   1543:       return \"psh.w s7\;ld.w %0,s7\;add.w #-1,s7\;st.w s7,%0\;pop.w s7\";
                   1544:     }
                   1545: }")
                   1546: 
                   1547: (define_insn ""
                   1548:   [(set (cc0)
                   1549:        (match_operand:HI 0 "register_operand" "+r,*m"))
                   1550:    (set (match_dup 0)
                   1551:        (plus:HI (match_dup 0)
                   1552:                 (const_int -1)))]
                   1553:   "next_insn_tests_no_inequality (insn)"
                   1554:   "*
                   1555: {
                   1556:   if (which_alternative == 0)
                   1557:     {
1.1.1.3 ! root     1558:       output_cmp (operands[0], constm1_rtx, 'H');
        !          1559:       return \"add.h #-1,%0\";
1.1       root     1560:     }
                   1561:   else
                   1562:     {
1.1.1.3 ! root     1563:       output_cmp (gen_rtx (REG, HImode, 7), constm1_rtx, 'H');
1.1       root     1564:       return \"psh.w s7\;ld.h %0,s7\;add.h #-1,s7\;st.h s7,%0\;pop.w s7\";
                   1565:     }
                   1566: }")
                   1567:      
                   1568: (define_insn ""
                   1569:   [(set (cc0)
                   1570:        (plus:HI (match_operand:HI 0 "register_operand" "+r,*m")
                   1571:                 (const_int -1)))
                   1572:    (set (match_dup 0)
                   1573:        (plus:HI (match_dup 0)
                   1574:                 (const_int -1)))]
                   1575:   "find_reg_note (next_cc0_user (insn), REG_NONNEG, 0)"
                   1576:   "*
                   1577: {
                   1578:   if (which_alternative == 0)
                   1579:     {
1.1.1.3 ! root     1580:       output_cmp (operands[0], const0_rtx, 'H');
        !          1581:       return \"add.h #-1,%0\";
1.1       root     1582:     }
                   1583:   else
                   1584:     {
1.1.1.3 ! root     1585:       output_cmp (gen_rtx (REG, HImode, 7), const0_rtx, 'H');
1.1       root     1586:       return \"psh.w s7\;ld.h %0,s7\;add.h #-1,s7\;st.h s7,%0\;pop.w s7\";
                   1587:     }
                   1588: }")
                   1589: 
                   1590: ;;- Jumps
                   1591: 
                   1592: (define_insn "jump"
                   1593:   [(set (pc)
                   1594:        (label_ref (match_operand 0 "" "")))]
                   1595:   ""
                   1596:   "jbr %l0")
                   1597: 
                   1598: (define_insn "beq"
                   1599:   [(set (pc)
                   1600:        (if_then_else (eq (cc0)
                   1601:                          (const_int 0))
                   1602:                      (label_ref (match_operand 0 "" ""))
                   1603:                      (pc)))]
                   1604:   ""
                   1605:   "* return output_condjump (operands[0], \"eq\", 't'); ")
                   1606: 
                   1607: (define_insn "bne"
                   1608:   [(set (pc)
                   1609:        (if_then_else (ne (cc0)
                   1610:                          (const_int 0))
                   1611:                      (label_ref (match_operand 0 "" ""))
                   1612:                      (pc)))]
                   1613:   ""
                   1614:   "* return output_condjump (operands[0], \"eq\", 'f'); ")
                   1615: 
                   1616: (define_insn "bgt"
                   1617:   [(set (pc)
                   1618:        (if_then_else (gt (cc0)
                   1619:                          (const_int 0))
                   1620:                      (label_ref (match_operand 0 "" ""))
                   1621:                      (pc)))]
                   1622:   ""
                   1623:   "* return output_condjump (operands[0], \"le\", 'f'); ")
                   1624: 
                   1625: (define_insn "bgtu"
                   1626:   [(set (pc)
                   1627:        (if_then_else (gtu (cc0)
                   1628:                           (const_int 0))
                   1629:                      (label_ref (match_operand 0 "" ""))
                   1630:                      (pc)))]
                   1631:   ""
                   1632:   "* return output_condjump (operands[0], \"leu\", 'f'); ")
                   1633: 
                   1634: (define_insn "blt"
                   1635:   [(set (pc)
                   1636:        (if_then_else (lt (cc0)
                   1637:                          (const_int 0))
                   1638:                      (label_ref (match_operand 0 "" ""))
                   1639:                      (pc)))]
                   1640:   ""
                   1641:   "* return output_condjump (operands[0], \"lt\", 't'); ")
                   1642: 
                   1643: (define_insn "bltu"
                   1644:   [(set (pc)
                   1645:        (if_then_else (ltu (cc0)
                   1646:                           (const_int 0))
                   1647:                      (label_ref (match_operand 0 "" ""))
                   1648:                      (pc)))]
                   1649:   ""
                   1650:   "* return output_condjump (operands[0], \"ltu\", 't'); ")
                   1651: 
                   1652: (define_insn "bge"
                   1653:   [(set (pc)
                   1654:        (if_then_else (ge (cc0)
                   1655:                          (const_int 0))
                   1656:                      (label_ref (match_operand 0 "" ""))
                   1657:                      (pc)))]
                   1658:   ""
                   1659:   "* return output_condjump (operands[0], \"lt\", 'f'); ")
                   1660: 
                   1661: (define_insn "bgeu"
                   1662:   [(set (pc)
                   1663:        (if_then_else (geu (cc0)
                   1664:                           (const_int 0))
                   1665:                      (label_ref (match_operand 0 "" ""))
                   1666:                      (pc)))]
                   1667:   ""
                   1668:   "* return output_condjump (operands[0], \"ltu\", 'f'); ")
                   1669: 
                   1670: (define_insn "ble"
                   1671:   [(set (pc)
                   1672:        (if_then_else (le (cc0)
                   1673:                          (const_int 0))
                   1674:                      (label_ref (match_operand 0 "" ""))
                   1675:                      (pc)))]
                   1676:   ""
                   1677:   "* return output_condjump (operands[0], \"le\", 't'); ")
                   1678: 
                   1679: (define_insn "bleu"
                   1680:   [(set (pc)
                   1681:        (if_then_else (leu (cc0)
                   1682:                           (const_int 0))
                   1683:                      (label_ref (match_operand 0 "" ""))
                   1684:                      (pc)))]
                   1685:   ""
                   1686:   "* return output_condjump (operands[0], \"leu\", 't'); ")
                   1687: 
                   1688: (define_insn ""
                   1689:   [(set (pc)
                   1690:        (if_then_else (eq (cc0)
                   1691:                          (const_int 0))
                   1692:                      (pc)
                   1693:                      (label_ref (match_operand 0 "" ""))))]
                   1694:   ""
                   1695:   "* return output_condjump (operands[0], \"eq\", 'f'); ")
                   1696: 
                   1697: (define_insn ""
                   1698:   [(set (pc)
                   1699:        (if_then_else (ne (cc0)
                   1700:                          (const_int 0))
                   1701:                      (pc)
                   1702:                      (label_ref (match_operand 0 "" ""))))]
                   1703:   ""
                   1704:   "* return output_condjump (operands[0], \"eq\", 't'); ")
                   1705: 
                   1706: (define_insn ""
                   1707:   [(set (pc)
                   1708:        (if_then_else (gt (cc0)
                   1709:                          (const_int 0))
                   1710:                      (pc)
                   1711:                      (label_ref (match_operand 0 "" ""))))]
                   1712:   ""
                   1713:   "* return output_condjump (operands[0], \"le\", 't'); ")
                   1714: 
                   1715: (define_insn ""
                   1716:   [(set (pc)
                   1717:        (if_then_else (gtu (cc0)
                   1718:                           (const_int 0))
                   1719:                      (pc)
                   1720:                      (label_ref (match_operand 0 "" ""))))]
                   1721:   ""
                   1722:   "* return output_condjump (operands[0], \"leu\", 't'); ")
                   1723: 
                   1724: (define_insn ""
                   1725:   [(set (pc)
                   1726:        (if_then_else (lt (cc0)
                   1727:                          (const_int 0))
                   1728:                      (pc)
                   1729:                      (label_ref (match_operand 0 "" ""))))]
                   1730:   ""
                   1731:   "* return output_condjump (operands[0], \"lt\", 'f'); ")
                   1732: 
                   1733: (define_insn ""
                   1734:   [(set (pc)
                   1735:        (if_then_else (ltu (cc0)
                   1736:                           (const_int 0))
                   1737:                      (pc)
                   1738:                      (label_ref (match_operand 0 "" ""))))]
                   1739:   ""
                   1740:   "* return output_condjump (operands[0], \"ltu\", 'f'); ")
                   1741: 
                   1742: (define_insn ""
                   1743:   [(set (pc)
                   1744:        (if_then_else (ge (cc0)
                   1745:                          (const_int 0))
                   1746:                      (pc)
                   1747:                      (label_ref (match_operand 0 "" ""))))]
                   1748:   ""
                   1749:   "* return output_condjump (operands[0], \"lt\", 't'); ")
                   1750: 
                   1751: (define_insn ""
                   1752:   [(set (pc)
                   1753:        (if_then_else (geu (cc0)
                   1754:                           (const_int 0))
                   1755:                      (pc)
                   1756:                      (label_ref (match_operand 0 "" ""))))]
                   1757:   ""
                   1758:   "* return output_condjump (operands[0], \"ltu\", 't'); ")
                   1759: 
                   1760: (define_insn ""
                   1761:   [(set (pc)
                   1762:        (if_then_else (le (cc0)
                   1763:                          (const_int 0))
                   1764:                      (pc)
                   1765:                      (label_ref (match_operand 0 "" ""))))]
                   1766:   ""
                   1767:   "* return output_condjump (operands[0], \"le\", 'f'); ")
                   1768: 
                   1769: (define_insn ""
                   1770:   [(set (pc)
                   1771:        (if_then_else (leu (cc0)
                   1772:                           (const_int 0))
                   1773:                      (pc)
                   1774:                      (label_ref (match_operand 0 "" ""))))]
                   1775:   ""
                   1776:   "* return output_condjump (operands[0], \"leu\", 'f'); ")
                   1777: 
                   1778: ;;- Calls
                   1779: 
                   1780: (define_expand "call_pop"
                   1781:   [(parallel [(call (match_operand:QI 0 "memory_operand" "m")
                   1782:                    (match_operand:SI 1 "const_int_operand" "i"))
                   1783:              (match_operand:SI 2 "const_int_operand" "i")
                   1784:              (match_operand:SI 3 "const_int_operand" "i")
                   1785:              (reg:SI 8)])]
                   1786:   ""
                   1787:   "")
                   1788: 
                   1789: (define_insn ""
                   1790:   [(call (match_operand:QI 0 "memory_operand" "m")
                   1791:         (match_operand:SI 1 "const_int_operand" "i"))
                   1792:    (match_operand:SI 2 "const_int_operand" "i")
                   1793:    (match_operand:SI 3 "const_int_operand" "i")
                   1794:    (match_operand:SI 4 "" "")]
                   1795:   ""
                   1796:   "* return output_call (insn, &operands[0]);")
                   1797: 
                   1798: (define_expand "call_value_pop"
                   1799:   [(parallel [(set (match_operand 0 "" "=g")
                   1800:                   (call (match_operand:QI 1 "memory_operand" "m")
                   1801:                         (match_operand:SI 2 "const_int_operand" "i")))
                   1802:              (match_operand:SI 3 "const_int_operand" "i")
                   1803:              (match_operand:SI 4 "const_int_operand" "i")
                   1804:              (reg:SI 8)])]
                   1805:   ""
                   1806:   "")
                   1807: 
                   1808: (define_insn ""
                   1809:   [(set (match_operand 0 "" "=g")
                   1810:        (call (match_operand:QI 1 "memory_operand" "m")
                   1811:              (match_operand:SI 2 "const_int_operand" "i")))
                   1812:    (match_operand:SI 3 "const_int_operand" "i")
                   1813:    (match_operand:SI 4 "const_int_operand" "i")
                   1814:    (match_operand:SI 5 "" "")]
                   1815:   ""
                   1816:   "* return output_call (insn, &operands[1]); ")
                   1817: 
1.1.1.2   root     1818: ;; Call subroutine returning any type.
                   1819: 
                   1820: (define_expand "untyped_call"
                   1821:   [(parallel [(call (match_operand 0 "" "")
                   1822:                   (const_int 0))
                   1823:             (match_operand 1 "" "")
                   1824:             (match_operand 2 "" "")])]
                   1825:   ""
                   1826:   "
                   1827: {
                   1828:   int i;
                   1829: 
                   1830:   emit_call_insn (gen_call_pop (operands[0], const0_rtx,
                   1831:                                const0_rtx, const0_rtx));
                   1832: 
                   1833:   for (i = 0; i < XVECLEN (operands[2], 0); i++)
                   1834:     {
                   1835:       rtx set = XVECEXP (operands[2], 0, i);
                   1836:       emit_move_insn (SET_DEST (set), SET_SRC (set));
                   1837:     }
                   1838: 
                   1839:   /* The optimizer does not know that the call sets the function value
                   1840:      registers we stored in the result block.  We avoid problems by
                   1841:      claiming that all hard registers are used and clobbered at this
                   1842:      point.  */
                   1843:   emit_insn (gen_blockage ());
                   1844: 
                   1845:   DONE;
                   1846: }")
                   1847: 
                   1848: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
                   1849: ;; all of memory.  This blocks insns from being moved across this point.
                   1850: 
                   1851: (define_insn "blockage"
                   1852:   [(unspec_volatile [(const_int 0)] 0)]
                   1853:   ""
                   1854:   "")
                   1855: 
1.1       root     1856: (define_expand "return"
                   1857:   [(return)]
                   1858:   ""
                   1859:   " replace_arg_pushes (); ")
                   1860: 
                   1861: (define_insn ""
                   1862:   [(return)]
                   1863:   ""
                   1864:   "rtn")
                   1865: 
                   1866: (define_expand "prologue"
                   1867:   [(const_int 0)]
                   1868:   ""
                   1869:   "
                   1870: {
                   1871:   emit_ap_optimizations ();
                   1872:   DONE; 
                   1873: }")
                   1874: 
                   1875: (define_insn "tablejump"
                   1876:   [(set (pc) (match_operand:SI 0 "address_operand" "p"))
                   1877:    (use (label_ref (match_operand 1 "" "")))]
                   1878:   ""
                   1879:   "jmp %a0")
                   1880: 
                   1881: (define_insn "indirect_jump"
                   1882:   [(set (pc) (match_operand:SI 0 "address_operand" "p"))]
                   1883:   ""
                   1884:   "jmp %a0")

unix.superglobalmegacorp.com

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