|
|
1.1 ! root 1: ;;- Machine description for GNU C compiler for Alliant FX systems ! 2: ;; Copyright (C) 1989 Free Software Foundation, Inc. ! 3: ;; Adapted from m68k.md by Paul Petersen ([email protected]) ! 4: ;; and Joe Weening ([email protected]). ! 5: ! 6: ;; This file is part of GNU CC. ! 7: ! 8: ;; GNU CC is free software; you can redistribute it and/or modify ! 9: ;; it under the terms of the GNU General Public License as published by ! 10: ;; the Free Software Foundation; either version 1, or (at your option) ! 11: ;; any later version. ! 12: ! 13: ;; GNU CC is distributed in the hope that it will be useful, ! 14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 16: ;; GNU General Public License for more details. ! 17: ! 18: ;; You should have received a copy of the GNU General Public License ! 19: ;; along with GNU CC; see the file COPYING. If not, write to ! 20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: ! 22: ! 23: ;;- instruction definitions ! 24: ! 25: ;;- @@The original PO technology requires these to be ordered by speed, ! 26: ;;- @@ so that assigner will pick the fastest. ! 27: ! 28: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al. ! 29: ! 30: ;;- When naming insn's (operand 0 of define_insn) be careful about using ! 31: ;;- names from other targets machine descriptions. ! 32: ! 33: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code ! 34: ;;- updates for most instructions. ! 35: ! 36: ;;- Operand classes for the register allocator: ! 37: ;;- 'a' one of the address registers can be used. ! 38: ;;- 'd' one of the data registers can be used. ! 39: ;;- 'f' one of the CE floating point registers can be used ! 40: ;;- 'r' either a data or an address register can be used. ! 41: ! 42: ;;- Immediate integer operand constraints: ! 43: ;;- 'I' 1 .. 8 ! 44: ;;- 'J' -32768 .. 32767 ! 45: ;;- 'K' -128 .. 127 ! 46: ;;- 'L' -8 .. -1 ! 47: ! 48: ;;- Some remnants of constraint codes for the m68k ('x','y','G','H') ! 49: ;;- may remain in the insn definitions. ! 50: ! 51: ;;- Some of these insn's are composites of several Alliant op codes. ! 52: ;;- The assembler (or final @@??) insures that the appropriate one is ! 53: ;;- selected. ! 54: ! 55: ;; Put tstsi first among test insns so it matches a CONST_INT operand. ! 56: ! 57: (define_insn "tstsi" ! 58: [(set (cc0) ! 59: (match_operand:SI 0 "general_operand" "rm"))] ! 60: "" ! 61: "* ! 62: { ! 63: if (TARGET_68020 || ! ADDRESS_REG_P (operands[0])) ! 64: return \"tst%.l %0\"; ! 65: /* If you think that the 68020 does not support tstl a0, ! 66: reread page B-167 of the 68020 manual more carefully. */ ! 67: /* On an address reg, cmpw may replace cmpl. */ ! 68: return \"cmp%.w %#0,%0\"; ! 69: }") ! 70: ! 71: (define_insn "tsthi" ! 72: [(set (cc0) ! 73: (match_operand:HI 0 "general_operand" "rm"))] ! 74: "" ! 75: "* ! 76: { ! 77: if (TARGET_68020 || ! ADDRESS_REG_P (operands[0])) ! 78: return \"tst%.w %0\"; ! 79: return \"cmp%.w %#0,%0\"; ! 80: }") ! 81: ! 82: (define_insn "tstqi" ! 83: [(set (cc0) ! 84: (match_operand:QI 0 "general_operand" "dm"))] ! 85: "" ! 86: "tst%.b %0") ! 87: ! 88: (define_insn "tstsf" ! 89: [(set (cc0) ! 90: (match_operand:SF 0 "nonimmediate_operand" "fm"))] ! 91: "TARGET_CE" ! 92: "* ! 93: { ! 94: cc_status.flags = CC_IN_FP; ! 95: return \"ftest%.s %0\"; ! 96: }") ! 97: ! 98: (define_insn "tstdf" ! 99: [(set (cc0) ! 100: (match_operand:DF 0 "nonimmediate_operand" "fm"))] ! 101: "TARGET_CE" ! 102: "* ! 103: { ! 104: cc_status.flags = CC_IN_FP; ! 105: return \"ftest%.d %0\"; ! 106: }") ! 107: ! 108: ;; compare instructions. ! 109: ! 110: ;; Put cmpsi first among compare insns so it matches two CONST_INT operands. ! 111: ! 112: ;; A composite of the cmp, cmpa, & cmpi m68000 op codes. ! 113: (define_insn "cmpsi" ! 114: [(set (cc0) ! 115: (compare (match_operand:SI 0 "general_operand" "rKs,mr,>") ! 116: (match_operand:SI 1 "general_operand" "mr,Ksr,>")))] ! 117: "" ! 118: "* ! 119: { ! 120: if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM) ! 121: return \"cmpm%.l %1,%0\"; ! 122: if (REG_P (operands[1]) ! 123: || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM)) ! 124: { ! 125: cc_status.flags |= CC_REVERSED; ! 126: return \"cmp%.l %d0,%d1\"; ! 127: } ! 128: return \"cmp%.l %d1,%d0\"; ! 129: }") ! 130: ! 131: (define_insn "cmphi" ! 132: [(set (cc0) ! 133: (compare (match_operand:HI 0 "general_operand" "rnm,d,n,m") ! 134: (match_operand:HI 1 "general_operand" "d,rnm,m,n")))] ! 135: "" ! 136: "* ! 137: { ! 138: if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM) ! 139: return \"cmpm%.w %1,%0\"; ! 140: if ((REG_P (operands[1]) && !ADDRESS_REG_P (operands[1])) ! 141: || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM)) ! 142: { cc_status.flags |= CC_REVERSED; ! 143: return \"cmp%.w %d0,%d1\"; ! 144: } ! 145: return \"cmp%.w %d1,%d0\"; ! 146: }") ! 147: ! 148: (define_insn "cmpqi" ! 149: [(set (cc0) ! 150: (compare (match_operand:QI 0 "general_operand" "dn,md,>") ! 151: (match_operand:QI 1 "general_operand" "dm,nd,>")))] ! 152: "" ! 153: "* ! 154: { ! 155: if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM) ! 156: return \"cmpm%.b %1,%0\"; ! 157: if (REG_P (operands[1]) ! 158: || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM)) ! 159: { ! 160: cc_status.flags |= CC_REVERSED; ! 161: return \"cmp%.b %d0,%d1\"; ! 162: } ! 163: return \"cmp%.b %d1,%d0\"; ! 164: }") ! 165: ! 166: (define_insn "cmpdf" ! 167: [(set (cc0) ! 168: (compare (match_operand:DF 0 "nonimmediate_operand" "f,m") ! 169: (match_operand:DF 1 "nonimmediate_operand" "fm,f")))] ! 170: "TARGET_CE" ! 171: "* ! 172: { ! 173: cc_status.flags = CC_IN_FP; ! 174: if (FP_REG_P (operands[0])) ! 175: return \"fcmp%.d %1,%0\"; ! 176: cc_status.flags |= CC_REVERSED; ! 177: return \"fcmp%.d %0,%1\"; ! 178: }") ! 179: ! 180: (define_insn "cmpsf" ! 181: [(set (cc0) ! 182: (compare (match_operand:SF 0 "nonimmediate_operand" "f,m") ! 183: (match_operand:SF 1 "nonimmediate_operand" "fm,f")))] ! 184: "TARGET_CE" ! 185: "* ! 186: { ! 187: cc_status.flags = CC_IN_FP; ! 188: if (FP_REG_P (operands[0])) ! 189: return \"fcmp%.s %1,%0\"; ! 190: cc_status.flags |= CC_REVERSED; ! 191: return \"fcmp%.s %0,%1\"; ! 192: }") ! 193: ! 194: ;; Recognizers for btst instructions. ! 195: ! 196: (define_insn "" ! 197: [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do") ! 198: (const_int 1) ! 199: (minus:SI (const_int 7) ! 200: (match_operand:SI 1 "general_operand" "di"))))] ! 201: "" ! 202: "* { return output_btst (operands, operands[1], operands[0], insn, 7); }") ! 203: ! 204: (define_insn "" ! 205: [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d") ! 206: (const_int 1) ! 207: (minus:SI (const_int 31) ! 208: (match_operand:SI 1 "general_operand" "di"))))] ! 209: "" ! 210: "* { return output_btst (operands, operands[1], operands[0], insn, 31); }") ! 211: ! 212: ;; The following two patterns are like the previous two ! 213: ;; except that they use the fact that bit-number operands ! 214: ;; are automatically masked to 3 or 5 bits. ! 215: ! 216: (define_insn "" ! 217: [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do") ! 218: (const_int 1) ! 219: (minus:SI (const_int 7) ! 220: (and:SI ! 221: (match_operand:SI 1 "general_operand" "d") ! 222: (const_int 7)))))] ! 223: "" ! 224: "* { return output_btst (operands, operands[1], operands[0], insn, 7); }") ! 225: ! 226: (define_insn "" ! 227: [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d") ! 228: (const_int 1) ! 229: (minus:SI (const_int 31) ! 230: (and:SI ! 231: (match_operand:SI 1 "general_operand" "d") ! 232: (const_int 31)))))] ! 233: "" ! 234: "* { return output_btst (operands, operands[1], operands[0], insn, 31); }") ! 235: ! 236: ;; Nonoffsettable mem refs are ok in this one pattern ! 237: ;; since we don't try to adjust them. ! 238: (define_insn "" ! 239: [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "md") ! 240: (const_int 1) ! 241: (match_operand:SI 1 "general_operand" "i")))] ! 242: "GET_CODE (operands[1]) == CONST_INT ! 243: && (unsigned) INTVAL (operands[1]) < 8" ! 244: "* ! 245: { ! 246: operands[1] = gen_rtx (CONST_INT, VOIDmode, 7 - INTVAL (operands[1])); ! 247: return output_btst (operands, operands[1], operands[0], insn, 7); ! 248: }") ! 249: ! 250: (define_insn "" ! 251: ;; The constraint "o,d" here means that a nonoffsettable memref ! 252: ;; will match the first alternative, and its address will be reloaded. ! 253: ;; Copying the memory contents into a reg would be incorrect if the ! 254: ;; bit position is over 7. ! 255: [(set (cc0) (zero_extract (match_operand:HI 0 "nonimmediate_operand" "o,d") ! 256: (const_int 1) ! 257: (match_operand:SI 1 "general_operand" "i,i")))] ! 258: "GET_CODE (operands[1]) == CONST_INT" ! 259: "* ! 260: { ! 261: if (GET_CODE (operands[0]) == MEM) ! 262: { ! 263: operands[0] = adj_offsettable_operand (operands[0], ! 264: INTVAL (operands[1]) / 8); ! 265: operands[1] = gen_rtx (CONST_INT, VOIDmode, ! 266: 7 - INTVAL (operands[1]) % 8); ! 267: return output_btst (operands, operands[1], operands[0], insn, 7); ! 268: } ! 269: operands[1] = gen_rtx (CONST_INT, VOIDmode, ! 270: 15 - INTVAL (operands[1])); ! 271: return output_btst (operands, operands[1], operands[0], insn, 15); ! 272: }") ! 273: ! 274: (define_insn "" ! 275: [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "do") ! 276: (const_int 1) ! 277: (match_operand:SI 1 "general_operand" "i")))] ! 278: "GET_CODE (operands[1]) == CONST_INT" ! 279: "* ! 280: { ! 281: if (GET_CODE (operands[0]) == MEM) ! 282: { ! 283: operands[0] = adj_offsettable_operand (operands[0], ! 284: INTVAL (operands[1]) / 8); ! 285: operands[1] = gen_rtx (CONST_INT, VOIDmode, ! 286: 7 - INTVAL (operands[1]) % 8); ! 287: return output_btst (operands, operands[1], operands[0], insn, 7); ! 288: } ! 289: operands[1] = gen_rtx (CONST_INT, VOIDmode, ! 290: 31 - INTVAL (operands[1])); ! 291: return output_btst (operands, operands[1], operands[0], insn, 31); ! 292: }") ! 293: ! 294: (define_insn "" ! 295: [(set (cc0) (subreg:SI (lshiftrt:QI (match_operand:QI 0 "nonimmediate_operand" "dm") ! 296: (const_int 7)) ! 297: 0))] ! 298: "" ! 299: "* ! 300: { ! 301: cc_status.flags = CC_Z_IN_NOT_N | CC_NOT_NEGATIVE; ! 302: return \"tst%.b %0\"; ! 303: }") ! 304: ! 305: (define_insn "" ! 306: [(set (cc0) (and:SI (sign_extend:SI (sign_extend:HI (match_operand:QI 0 "nonimmediate_operand" "dm"))) ! 307: (match_operand:SI 1 "general_operand" "i")))] ! 308: "(GET_CODE (operands[1]) == CONST_INT ! 309: && (unsigned) INTVAL (operands[1]) < 0x100 ! 310: && exact_log2 (INTVAL (operands[1])) >= 0)" ! 311: "* ! 312: { register int log = exact_log2 (INTVAL (operands[1])); ! 313: operands[1] = gen_rtx (CONST_INT, VOIDmode, log); ! 314: return output_btst (operands, operands[1], operands[0], insn, 7); ! 315: }") ! 316: ! 317: ;; move instructions ! 318: ! 319: ;; A special case in which it is not desirable ! 320: ;; to reload the constant into a data register. ! 321: (define_insn "" ! 322: [(set (match_operand:SI 0 "push_operand" "=m") ! 323: (match_operand:SI 1 "general_operand" "J"))] ! 324: "GET_CODE (operands[1]) == CONST_INT ! 325: && INTVAL (operands[1]) >= -0x8000 ! 326: && INTVAL (operands[1]) < 0x8000" ! 327: "* ! 328: { ! 329: if (operands[1] == const0_rtx) ! 330: return \"clr%.l %0\"; ! 331: return \"pea %a1\"; ! 332: }") ! 333: ! 334: ;This is never used. ! 335: ;(define_insn "swapsi" ! 336: ; [(set (match_operand:SI 0 "general_operand" "r") ! 337: ; (match_operand:SI 1 "general_operand" "r")) ! 338: ; (set (match_dup 1) (match_dup 0))] ! 339: ; "" ! 340: ; "exg %1,%0") ! 341: ! 342: ;; Special case of fullword move when source is zero. ! 343: ;; The reason this is special is to avoid loading a zero ! 344: ;; into a data reg with moveq in order to store it elsewhere. ! 345: ! 346: (define_insn "" ! 347: [(set (match_operand:SI 0 "general_operand" "=g") ! 348: (const_int 0))] ! 349: "" ! 350: "* ! 351: { ! 352: if (ADDRESS_REG_P (operands[0])) ! 353: return \"sub%.l %0,%0\"; ! 354: return \"clr%.l %0\"; ! 355: }") ! 356: ! 357: ;; General case of fullword move. The register constraints ! 358: ;; force integer constants in range for a moveq to be reloaded ! 359: ;; if they are headed for memory. ! 360: (define_insn "movsi" ! 361: ;; Notes: make sure no alternative allows g vs g. ! 362: ;; We don't allow f-regs since fixed point cannot go in them. ! 363: ;; We do allow y and x regs since fixed point is allowed in them. ! 364: [(set (match_operand:SI 0 "general_operand" "=g,da,y,!*x*r*m") ! 365: (match_operand:SI 1 "general_operand" "daymKs,i,g,*x*r*m"))] ! 366: "" ! 367: "* ! 368: { ! 369: if (GET_CODE (operands[1]) == CONST_INT) ! 370: { ! 371: if (operands[1] == const0_rtx ! 372: && (DATA_REG_P (operands[0]) ! 373: || GET_CODE (operands[0]) == MEM)) ! 374: return \"clr%.l %0\"; ! 375: else if (DATA_REG_P (operands[0]) ! 376: && INTVAL (operands[1]) < 128 ! 377: && INTVAL (operands[1]) >= -128) ! 378: return \"moveq %1,%0\"; ! 379: else if (ADDRESS_REG_P (operands[0]) ! 380: && INTVAL (operands[1]) < 0x8000 ! 381: && INTVAL (operands[1]) >= -0x8000) ! 382: return \"mov%.w %1,%0\"; ! 383: else if (push_operand (operands[0], SImode) ! 384: && INTVAL (operands[1]) < 0x8000 ! 385: && INTVAL (operands[1]) >= -0x8000) ! 386: return \"pea %a1\"; ! 387: } ! 388: else if ((GET_CODE (operands[1]) == SYMBOL_REF ! 389: || GET_CODE (operands[1]) == CONST) ! 390: && push_operand (operands[0], SImode)) ! 391: return \"pea %a1\"; ! 392: else if ((GET_CODE (operands[1]) == SYMBOL_REF ! 393: || GET_CODE (operands[1]) == CONST) ! 394: && ADDRESS_REG_P (operands[0])) ! 395: return \"lea %a1,%0\"; ! 396: return \"mov%.l %1,%0\"; ! 397: }") ! 398: ! 399: (define_insn "movhi" ! 400: [(set (match_operand:HI 0 "general_operand" "=g") ! 401: (match_operand:HI 1 "general_operand" "g"))] ! 402: "" ! 403: "* ! 404: { ! 405: if (GET_CODE (operands[1]) == CONST_INT) ! 406: { ! 407: if (operands[1] == const0_rtx ! 408: && (DATA_REG_P (operands[0]) ! 409: || GET_CODE (operands[0]) == MEM)) ! 410: return \"clr%.w %0\"; ! 411: else if (DATA_REG_P (operands[0]) ! 412: && INTVAL (operands[1]) < 128 ! 413: && INTVAL (operands[1]) >= -128) ! 414: { ! 415: return \"moveq %1,%0\"; ! 416: } ! 417: else if (INTVAL (operands[1]) < 0x8000 ! 418: && INTVAL (operands[1]) >= -0x8000) ! 419: return \"mov%.w %1,%0\"; ! 420: } ! 421: else if (CONSTANT_P (operands[1])) ! 422: return \"mov%.l %1,%0\"; ! 423: /* Recognize the insn before a tablejump, one that refers ! 424: to a table of offsets. Such an insn will need to refer ! 425: to a label on the insn. So output one. Use the label-number ! 426: of the table of offsets to generate this label. */ ! 427: if (GET_CODE (operands[1]) == MEM ! 428: && GET_CODE (XEXP (operands[1], 0)) == PLUS ! 429: && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF ! 430: || GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == LABEL_REF) ! 431: && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) != PLUS ! 432: && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) != PLUS) ! 433: { ! 434: rtx labelref; ! 435: if (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF) ! 436: labelref = XEXP (XEXP (operands[1], 0), 0); ! 437: else ! 438: labelref = XEXP (XEXP (operands[1], 0), 1); ! 439: ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\", ! 440: CODE_LABEL_NUMBER (XEXP (labelref, 0))); ! 441: } ! 442: return \"mov%.w %1,%0\"; ! 443: }") ! 444: ! 445: (define_insn "movstricthi" ! 446: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm")) ! 447: (match_operand:HI 1 "general_operand" "rmn"))] ! 448: "" ! 449: "* ! 450: { ! 451: if (GET_CODE (operands[1]) == CONST_INT) ! 452: { ! 453: if (operands[1] == const0_rtx ! 454: && (DATA_REG_P (operands[0]) ! 455: || GET_CODE (operands[0]) == MEM)) ! 456: return \"clr%.w %0\"; ! 457: } ! 458: return \"mov%.w %1,%0\"; ! 459: }") ! 460: ! 461: (define_insn "movqi" ! 462: [(set (match_operand:QI 0 "general_operand" "=d,*a,m,m,?*a") ! 463: (match_operand:QI 1 "general_operand" "dmi*a,d*a,dmi,?*a,m"))] ! 464: "" ! 465: "* ! 466: { ! 467: rtx xoperands[4]; ! 468: if (ADDRESS_REG_P (operands[0]) && GET_CODE (operands[1]) == MEM) ! 469: { ! 470: xoperands[1] = operands[1]; ! 471: xoperands[2] ! 472: = gen_rtx (MEM, QImode, ! 473: gen_rtx (PLUS, VOIDmode, stack_pointer_rtx, const1_rtx)); ! 474: xoperands[3] = stack_pointer_rtx; ! 475: /* Just pushing a byte puts it in the high byte of the halfword. */ ! 476: /* We must put it in the low half, the second byte. */ ! 477: output_asm_insn (\"subq%.w %#2,%3\;mov%.b %1,%2\", xoperands); ! 478: return \"mov%.w %+,%0\"; ! 479: } ! 480: if (ADDRESS_REG_P (operands[1]) && GET_CODE (operands[0]) == MEM) ! 481: { ! 482: xoperands[0] = operands[0]; ! 483: xoperands[1] = operands[1]; ! 484: xoperands[2] ! 485: = gen_rtx (MEM, QImode, ! 486: gen_rtx (PLUS, VOIDmode, stack_pointer_rtx, const1_rtx)); ! 487: xoperands[3] = stack_pointer_rtx; ! 488: output_asm_insn (\"mov%.w %1,%-\;mov%.b %2,%0\;addq%.w %#2,%3\", xoperands); ! 489: return \"\"; ! 490: } ! 491: if (operands[1] == const0_rtx) ! 492: return \"clr%.b %0\"; ! 493: if (GET_CODE (operands[1]) == CONST_INT ! 494: && INTVAL (operands[1]) == -1) ! 495: return \"st %0\"; ! 496: if (GET_CODE (operands[1]) != CONST_INT && CONSTANT_P (operands[1])) ! 497: return \"mov%.l %1,%0\"; ! 498: if (ADDRESS_REG_P (operands[0]) || ADDRESS_REG_P (operands[1])) ! 499: return \"mov%.w %1,%0\"; ! 500: return \"mov%.b %1,%0\"; ! 501: }") ! 502: ! 503: (define_insn "movstrictqi" ! 504: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm")) ! 505: (match_operand:QI 1 "general_operand" "dmn"))] ! 506: "" ! 507: "* ! 508: { ! 509: if (operands[1] == const0_rtx) ! 510: return \"clr%.b %0\"; ! 511: return \"mov%.b %1,%0\"; ! 512: }") ! 513: ! 514: ;; Floating-point moves on a CE are faster using an FP register than ! 515: ;; with movl instructions. (Especially for double floats, but also ! 516: ;; for single floats, even though it takes an extra instruction.) But ! 517: ;; on an IP, the FP registers are simulated and so should be avoided. ! 518: ;; We do this by using define_expand for movsf and movdf, and using ! 519: ;; different constraints for each target type. The constraints for ! 520: ;; TARGET_CE allow general registers because they sometimes need to ! 521: ;; hold floats, but they are not preferable. ! 522: ! 523: (define_expand "movsf" ! 524: [(set (match_operand:SF 0 "general_operand" "") ! 525: (match_operand:SF 1 "nonimmediate_operand" ""))] ! 526: "" ! 527: "") ! 528: ! 529: (define_insn "" ! 530: [(set (match_operand:SF 0 "general_operand" "=f,m,!*r,!f*m") ! 531: (match_operand:SF 1 "nonimmediate_operand" "fm,f,f*r*m,*r"))] ! 532: "TARGET_CE" ! 533: "* ! 534: { ! 535: if (FP_REG_P (operands[0])) ! 536: { ! 537: if (FP_REG_P (operands[1])) ! 538: return \"fmove%.s %1,%0\"; ! 539: if (REG_P (operands[1])) ! 540: return \"mov%.l %1,%-\;fmove%.s %+,%0\"; ! 541: return \"fmove%.s %1,%0\"; ! 542: } ! 543: if (FP_REG_P (operands[1])) ! 544: { ! 545: if (REG_P (operands[0])) ! 546: return \"fmove%.s %1,%-\;mov%.l %+,%0\"; ! 547: return \"fmove%.s %1,%0\"; ! 548: } ! 549: return \"mov%.l %1,%0\"; ! 550: }") ! 551: ! 552: (define_insn "" ! 553: [(set (match_operand:SF 0 "general_operand" "=frm") ! 554: (match_operand:SF 1 "nonimmediate_operand" "frm"))] ! 555: "!TARGET_CE" ! 556: "* ! 557: { ! 558: if (FP_REG_P (operands[0])) ! 559: { ! 560: if (FP_REG_P (operands[1])) ! 561: return \"fmove%.s %1,%0\"; ! 562: if (REG_P (operands[1])) ! 563: return \"mov%.l %1,%-\;fmove%.s %+,%0\"; ! 564: return \"fmove%.s %1,%0\"; ! 565: } ! 566: if (FP_REG_P (operands[1])) ! 567: { ! 568: if (REG_P (operands[0])) ! 569: return \"fmove%.s %1,%-\;mov%.l %+,%0\"; ! 570: return \"fmove%.s %1,%0\"; ! 571: } ! 572: return \"mov%.l %1,%0\"; ! 573: }") ! 574: ! 575: (define_expand "movdf" ! 576: [(set (match_operand:DF 0 "general_operand" "") ! 577: (match_operand:DF 1 "nonimmediate_operand" ""))] ! 578: "" ! 579: "") ! 580: ! 581: (define_insn "" ! 582: [(set (match_operand:DF 0 "general_operand" "=f,m,!*r,!f*m") ! 583: (match_operand:DF 1 "nonimmediate_operand" "fm,f,f*r*m,*r"))] ! 584: "TARGET_CE" ! 585: "* ! 586: { ! 587: if (FP_REG_P (operands[0])) ! 588: { ! 589: if (FP_REG_P (operands[1])) ! 590: return \"fmove%.d %1,%0\"; ! 591: if (REG_P (operands[1])) ! 592: { ! 593: rtx xoperands[2]; ! 594: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); ! 595: output_asm_insn (\"mov%.l %1,%-\", xoperands); ! 596: output_asm_insn (\"mov%.l %1,%-\", operands); ! 597: return \"fmove%.d %+,%0\"; ! 598: } ! 599: return \"fmove%.d %1,%0\"; ! 600: } ! 601: else if (FP_REG_P (operands[1])) ! 602: { ! 603: if (REG_P (operands[0])) ! 604: { ! 605: output_asm_insn (\"fmove%.d %1,%-\;mov%.l %+,%0\", operands); ! 606: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 607: return \"mov%.l %+,%0\"; ! 608: } ! 609: return \"fmove%.d %1,%0\"; ! 610: } ! 611: return output_move_double (operands); ! 612: }") ! 613: ! 614: (define_insn "" ! 615: [(set (match_operand:DF 0 "general_operand" "=frm") ! 616: (match_operand:DF 1 "nonimmediate_operand" "frm"))] ! 617: "!TARGET_CE" ! 618: "* ! 619: { ! 620: if (FP_REG_P (operands[0])) ! 621: { ! 622: if (FP_REG_P (operands[1])) ! 623: return \"fmove%.d %1,%0\"; ! 624: if (REG_P (operands[1])) ! 625: { ! 626: rtx xoperands[2]; ! 627: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); ! 628: output_asm_insn (\"mov%.l %1,%-\", xoperands); ! 629: output_asm_insn (\"mov%.l %1,%-\", operands); ! 630: return \"fmove%.d %+,%0\"; ! 631: } ! 632: return \"fmove%.d %1,%0\"; ! 633: } ! 634: else if (FP_REG_P (operands[1])) ! 635: { ! 636: if (REG_P (operands[0])) ! 637: { ! 638: output_asm_insn (\"fmove%.d %1,%-\;mov%.l %+,%0\", operands); ! 639: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 640: return \"mov%.l %+,%0\"; ! 641: } ! 642: return \"fmove%.d %1,%0\"; ! 643: } ! 644: return output_move_double (operands); ! 645: }") ! 646: ! 647: (define_insn "movdi" ! 648: [(set (match_operand:DI 0 "general_operand" "=rm,&r,&ro<>") ! 649: (match_operand:DI 1 "general_operand" "r,m,roi<>"))] ! 650: "" ! 651: "* ! 652: { ! 653: return output_move_double (operands); ! 654: } ! 655: ") ! 656: ! 657: ;; This goes after the move instructions ! 658: ;; because the move instructions are better (require no spilling) ! 659: ;; when they can apply. It goes before the add/sub insns ! 660: ;; so we will prefer it to them. ! 661: ! 662: (define_insn "pushasi" ! 663: [(set (match_operand:SI 0 "push_operand" "=m") ! 664: (match_operand:SI 1 "address_operand" "p"))] ! 665: "" ! 666: "pea %a1") ! 667: ! 668: ;; truncation instructions ! 669: (define_insn "truncsiqi2" ! 670: [(set (match_operand:QI 0 "general_operand" "=dm,d") ! 671: (truncate:QI ! 672: (match_operand:SI 1 "general_operand" "doJ,i")))] ! 673: "" ! 674: "* ! 675: { ! 676: if (GET_CODE (operands[0]) == REG) ! 677: return \"mov%.l %1,%0\"; ! 678: if (GET_CODE (operands[1]) == MEM) ! 679: operands[1] = adj_offsettable_operand (operands[1], 3); ! 680: return \"mov%.b %1,%0\"; ! 681: }") ! 682: ! 683: (define_insn "trunchiqi2" ! 684: [(set (match_operand:QI 0 "general_operand" "=dm,d") ! 685: (truncate:QI ! 686: (match_operand:HI 1 "general_operand" "doJ,i")))] ! 687: "" ! 688: "* ! 689: { ! 690: if (GET_CODE (operands[0]) == REG ! 691: && (GET_CODE (operands[1]) == MEM ! 692: || GET_CODE (operands[1]) == CONST_INT)) ! 693: return \"mov%.w %1,%0\"; ! 694: if (GET_CODE (operands[0]) == REG) ! 695: return \"mov%.l %1,%0\"; ! 696: if (GET_CODE (operands[1]) == MEM) ! 697: operands[1] = adj_offsettable_operand (operands[1], 1); ! 698: return \"mov%.b %1,%0\"; ! 699: }") ! 700: ! 701: (define_insn "truncsihi2" ! 702: [(set (match_operand:HI 0 "general_operand" "=dm,d") ! 703: (truncate:HI ! 704: (match_operand:SI 1 "general_operand" "roJ,i")))] ! 705: "" ! 706: "* ! 707: { ! 708: if (GET_CODE (operands[0]) == REG) ! 709: return \"mov%.l %1,%0\"; ! 710: if (GET_CODE (operands[1]) == MEM) ! 711: operands[1] = adj_offsettable_operand (operands[1], 2); ! 712: return \"mov%.w %1,%0\"; ! 713: }") ! 714: ! 715: ;; zero extension instructions ! 716: ! 717: (define_expand "zero_extendhisi2" ! 718: [(set (match_operand:SI 0 "register_operand" "") ! 719: (const_int 0)) ! 720: (set (strict_low_part (subreg:HI (match_dup 0) 0)) ! 721: (match_operand:HI 1 "general_operand" ""))] ! 722: "" ! 723: "operands[1] = make_safe_from (operands[1], operands[0]);") ! 724: ! 725: (define_expand "zero_extendqihi2" ! 726: [(set (match_operand:HI 0 "register_operand" "") ! 727: (const_int 0)) ! 728: (set (strict_low_part (subreg:QI (match_dup 0) 0)) ! 729: (match_operand:QI 1 "general_operand" ""))] ! 730: "" ! 731: "operands[1] = make_safe_from (operands[1], operands[0]);") ! 732: ! 733: (define_expand "zero_extendqisi2" ! 734: [(set (match_operand:SI 0 "register_operand" "") ! 735: (const_int 0)) ! 736: (set (strict_low_part (subreg:QI (match_dup 0) 0)) ! 737: (match_operand:QI 1 "general_operand" ""))] ! 738: "" ! 739: " operands[1] = make_safe_from (operands[1], operands[0]); ") ! 740: ! 741: ;; Patterns to recognize zero-extend insns produced by the combiner. ! 742: ! 743: ;; Note that the one starting from HImode comes before those for QImode ! 744: ;; so that a constant operand will match HImode, not QImode. ! 745: (define_insn "" ! 746: [(set (match_operand:SI 0 "general_operand" "=do<>") ! 747: (zero_extend:SI ! 748: (match_operand:HI 1 "general_operand" "rmn")))] ! 749: "" ! 750: "* ! 751: { ! 752: if (DATA_REG_P (operands[0])) ! 753: { ! 754: if (GET_CODE (operands[1]) == REG ! 755: && REGNO (operands[0]) == REGNO (operands[1])) ! 756: return \"and%.l %#0xFFFF,%0\"; ! 757: if (reg_mentioned_p (operands[0], operands[1])) ! 758: return \"mov%.w %1,%0\;and%.l %#0xFFFF,%0\"; ! 759: return \"clr%.l %0\;mov%.w %1,%0\"; ! 760: } ! 761: else if (GET_CODE (operands[0]) == MEM ! 762: && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC) ! 763: return \"mov%.w %1,%0\;clr%.w %0\"; ! 764: else if (GET_CODE (operands[0]) == MEM ! 765: && GET_CODE (XEXP (operands[0], 0)) == POST_INC) ! 766: return \"clr%.w %0\;mov%.w %1,%0\"; ! 767: else ! 768: { ! 769: output_asm_insn (\"clr%.w %0\", operands); ! 770: operands[0] = adj_offsettable_operand (operands[0], 2); ! 771: return \"mov%.w %1,%0\"; ! 772: } ! 773: }") ! 774: ! 775: (define_insn "" ! 776: [(set (match_operand:HI 0 "general_operand" "=do<>") ! 777: (zero_extend:HI ! 778: (match_operand:QI 1 "general_operand" "dmn")))] ! 779: "" ! 780: "* ! 781: { ! 782: if (DATA_REG_P (operands[0])) ! 783: { ! 784: if (GET_CODE (operands[1]) == REG ! 785: && REGNO (operands[0]) == REGNO (operands[1])) ! 786: return \"and%.w %#0xFF,%0\"; ! 787: if (reg_mentioned_p (operands[0], operands[1])) ! 788: return \"mov%.b %1,%0\;and%.w %#0xFF,%0\"; ! 789: return \"clr%.w %0\;mov%.b %1,%0\"; ! 790: } ! 791: else if (GET_CODE (operands[0]) == MEM ! 792: && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC) ! 793: { ! 794: if (REGNO (XEXP (XEXP (operands[0], 0), 0)) ! 795: == STACK_POINTER_REGNUM) ! 796: return \"clr%.w %-\;mov%.b %1,%0\"; ! 797: else ! 798: return \"mov%.b %1,%0\;clr%.b %0\"; ! 799: } ! 800: else if (GET_CODE (operands[0]) == MEM ! 801: && GET_CODE (XEXP (operands[0], 0)) == POST_INC) ! 802: return \"clr%.b %0\;mov%.b %1,%0\"; ! 803: else ! 804: { ! 805: output_asm_insn (\"clr%.b %0\", operands); ! 806: operands[0] = adj_offsettable_operand (operands[0], 1); ! 807: return \"mov%.b %1,%0\"; ! 808: } ! 809: }") ! 810: ! 811: (define_insn "" ! 812: [(set (match_operand:SI 0 "general_operand" "=do<>") ! 813: (zero_extend:SI ! 814: (match_operand:QI 1 "general_operand" "dmn")))] ! 815: "" ! 816: "* ! 817: { ! 818: if (DATA_REG_P (operands[0])) ! 819: { ! 820: if (GET_CODE (operands[1]) == REG ! 821: && REGNO (operands[0]) == REGNO (operands[1])) ! 822: return \"and%.l %#0xFF,%0\"; ! 823: if (reg_mentioned_p (operands[0], operands[1])) ! 824: return \"mov%.b %1,%0\;and%.l %#0xFF,%0\"; ! 825: return \"clr%.l %0\;mov%.b %1,%0\"; ! 826: } ! 827: else if (GET_CODE (operands[0]) == MEM ! 828: && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC) ! 829: { ! 830: operands[0] = XEXP (XEXP (operands[0], 0), 0); ! 831: return \"clr%.l %0@-\;mov%.b %1,%0@(3)\"; ! 832: } ! 833: else if (GET_CODE (operands[0]) == MEM ! 834: && GET_CODE (XEXP (operands[0], 0)) == POST_INC) ! 835: { ! 836: operands[0] = XEXP (XEXP (operands[0], 0), 0); ! 837: return \"clr%.l %0@+\;mov%.b %1,%0@(-1)\"; ! 838: } ! 839: else ! 840: { ! 841: output_asm_insn (\"clr%.l %0\", operands); ! 842: operands[0] = adj_offsettable_operand (operands[0], 3); ! 843: return \"mov%.b %1,%0\"; ! 844: } ! 845: }") ! 846: ! 847: ;; sign extension instructions ! 848: ;; Note that the one starting from HImode comes before those for QImode ! 849: ;; so that a constant operand will match HImode, not QImode. ! 850: ! 851: (define_insn "extendhisi2" ! 852: [(set (match_operand:SI 0 "general_operand" "=*d,a") ! 853: (sign_extend:SI ! 854: (match_operand:HI 1 "general_operand" "0,rmn")))] ! 855: "" ! 856: "* ! 857: { ! 858: if (ADDRESS_REG_P (operands[0])) ! 859: return \"mov%.w %1,%0\"; ! 860: return \"ext%.l %0\"; ! 861: }") ! 862: ! 863: (define_insn "extendqihi2" ! 864: [(set (match_operand:HI 0 "general_operand" "=d") ! 865: (sign_extend:HI ! 866: (match_operand:QI 1 "general_operand" "0")))] ! 867: "" ! 868: "ext%.w %0") ! 869: ! 870: (define_insn "extendqisi2" ! 871: [(set (match_operand:SI 0 "general_operand" "=d") ! 872: (sign_extend:SI ! 873: (match_operand:QI 1 "general_operand" "0")))] ! 874: "TARGET_68020" ! 875: "extb%.l %0") ! 876: ! 877: ;; Conversions between float and double. ! 878: ! 879: (define_insn "extendsfdf2" ! 880: [(set (match_operand:DF 0 "general_operand" "=f,m") ! 881: (float_extend:DF ! 882: (match_operand:SF 1 "nonimmediate_operand" "fm,f")))] ! 883: "TARGET_CE" ! 884: "fmovesd %1,%0") ! 885: ! 886: (define_insn "truncdfsf2" ! 887: [(set (match_operand:SF 0 "general_operand" "=f,m") ! 888: (float_truncate:SF ! 889: (match_operand:DF 1 "nonimmediate_operand" "fm,f")))] ! 890: "TARGET_CE" ! 891: "fmoveds %1,%0") ! 892: ! 893: ;; Conversion between fixed point and floating point. ! 894: ;; Note that among the fix-to-float insns ! 895: ;; the ones that start with SImode come first. ! 896: ;; That is so that an operand that is a CONST_INT ! 897: ;; (and therefore lacks a specific machine mode). ! 898: ;; will be recognized as SImode (which is always valid) ! 899: ;; rather than as QImode or HImode. ! 900: ! 901: (define_insn "floatsisf2" ! 902: [(set (match_operand:SF 0 "register_operand" "=f") ! 903: (float:SF (match_operand:SI 1 "nonimmediate_operand" "dm")))] ! 904: "TARGET_CE" ! 905: "fmovels %1,%0") ! 906: ! 907: (define_insn "floatsidf2" ! 908: [(set (match_operand:DF 0 "register_operand" "=f") ! 909: (float:DF (match_operand:SI 1 "nonimmediate_operand" "dm")))] ! 910: "TARGET_CE" ! 911: "fmoveld %1,%0") ! 912: ! 913: (define_insn "floathisf2" ! 914: [(set (match_operand:SF 0 "register_operand" "=f") ! 915: (float:SF (match_operand:HI 1 "nonimmediate_operand" "dm")))] ! 916: "TARGET_CE" ! 917: "fmovews %1,%0") ! 918: ! 919: (define_insn "floathidf2" ! 920: [(set (match_operand:DF 0 "register_operand" "=f") ! 921: (float:DF (match_operand:HI 1 "nonimmediate_operand" "dm")))] ! 922: "TARGET_CE" ! 923: "fmovewd %1,%0") ! 924: ! 925: (define_insn "floatqisf2" ! 926: [(set (match_operand:SF 0 "register_operand" "=f") ! 927: (float:SF (match_operand:QI 1 "nonimmediate_operand" "dm")))] ! 928: "TARGET_CE" ! 929: "fmovebs %1,%0") ! 930: ! 931: (define_insn "floatqidf2" ! 932: [(set (match_operand:DF 0 "register_operand" "=f") ! 933: (float:DF (match_operand:QI 1 "nonimmediate_operand" "dm")))] ! 934: "TARGET_CE" ! 935: "fmovebd %1,%0") ! 936: ! 937: ;; Float-to-fix conversion insns. ! 938: ! 939: (define_insn "fix_truncsfqi2" ! 940: [(set (match_operand:QI 0 "general_operand" "=dm") ! 941: (fix:QI (fix:SF (match_operand:SF 1 "register_operand" "f"))))] ! 942: "TARGET_CE" ! 943: "fmovesb %1,%0") ! 944: ! 945: (define_insn "fix_truncsfhi2" ! 946: [(set (match_operand:HI 0 "general_operand" "=dm") ! 947: (fix:HI (fix:SF (match_operand:SF 1 "register_operand" "f"))))] ! 948: "TARGET_CE" ! 949: "fmovesw %1,%0") ! 950: ! 951: (define_insn "fix_truncsfsi2" ! 952: [(set (match_operand:SI 0 "general_operand" "=dm") ! 953: (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "f"))))] ! 954: "TARGET_CE" ! 955: "fmovesl %1,%0") ! 956: ! 957: (define_insn "fix_truncdfqi2" ! 958: [(set (match_operand:QI 0 "general_operand" "=dm") ! 959: (fix:QI (fix:DF (match_operand:DF 1 "register_operand" "f"))))] ! 960: "TARGET_CE" ! 961: "fmovedb %1,%0") ! 962: ! 963: (define_insn "fix_truncdfhi2" ! 964: [(set (match_operand:HI 0 "general_operand" "=dm") ! 965: (fix:HI (fix:DF (match_operand:DF 1 "register_operand" "f"))))] ! 966: "TARGET_CE" ! 967: "fmovedw %1,%0") ! 968: ! 969: (define_insn "fix_truncdfsi2" ! 970: [(set (match_operand:SI 0 "general_operand" "=dm") ! 971: (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))] ! 972: "TARGET_CE" ! 973: "fmovedl %1,%0") ! 974: ! 975: ;; add instructions ! 976: ! 977: (define_insn "addsi3" ! 978: [(set (match_operand:SI 0 "general_operand" "=m,r,!a,!a") ! 979: (plus:SI (match_operand:SI 1 "general_operand" "%0,0,a,rJK") ! 980: (match_operand:SI 2 "general_operand" "dIKLs,mrIKLs,rJK,a")))] ! 981: "" ! 982: "* ! 983: { ! 984: if (! operands_match_p (operands[0], operands[1])) ! 985: { ! 986: if (!ADDRESS_REG_P (operands[1])) ! 987: { ! 988: rtx tmp = operands[1]; ! 989: ! 990: operands[1] = operands[2]; ! 991: operands[2] = tmp; ! 992: } ! 993: ! 994: /* These insns can result from reloads to access ! 995: stack slots over 64k from the frame pointer. */ ! 996: if (GET_CODE (operands[2]) == CONST_INT ! 997: && INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000) ! 998: return \"mov%.l %2,%0\;add%.l %1,%0\"; ! 999: if (GET_CODE (operands[2]) == REG) ! 1000: return \"lea %1@[%2:L:B],%0\"; ! 1001: else ! 1002: return \"lea %1@(%c2),%0\"; ! 1003: } ! 1004: if (GET_CODE (operands[2]) == CONST_INT) ! 1005: { ! 1006: if (INTVAL (operands[2]) > 0 ! 1007: && INTVAL (operands[2]) <= 8) ! 1008: return (ADDRESS_REG_P (operands[0]) ! 1009: ? \"addq%.w %2,%0\" ! 1010: : \"addq%.l %2,%0\"); ! 1011: if (INTVAL (operands[2]) < 0 ! 1012: && INTVAL (operands[2]) >= -8) ! 1013: { ! 1014: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1015: - INTVAL (operands[2])); ! 1016: return (ADDRESS_REG_P (operands[0]) ! 1017: ? \"subq%.w %2,%0\" ! 1018: : \"subq%.l %2,%0\"); ! 1019: } ! 1020: if (ADDRESS_REG_P (operands[0]) ! 1021: && INTVAL (operands[2]) >= -0x8000 ! 1022: && INTVAL (operands[2]) < 0x8000) ! 1023: return \"add%.w %2,%0\"; ! 1024: } ! 1025: return \"add%.l %2,%0\"; ! 1026: }") ! 1027: ! 1028: (define_insn "" ! 1029: [(set (match_operand:SI 0 "general_operand" "=a") ! 1030: (plus:SI (match_operand:SI 1 "general_operand" "0") ! 1031: (sign_extend:SI (match_operand:HI 2 "general_operand" "rmn"))))] ! 1032: "" ! 1033: "add%.w %2,%0") ! 1034: ! 1035: (define_insn "addhi3" ! 1036: [(set (match_operand:HI 0 "general_operand" "=m,r") ! 1037: (plus:HI (match_operand:HI 1 "general_operand" "%0,0") ! 1038: (match_operand:HI 2 "general_operand" "dn,rmn")))] ! 1039: "" ! 1040: "* ! 1041: { ! 1042: if (GET_CODE (operands[2]) == CONST_INT) ! 1043: { ! 1044: if (INTVAL (operands[2]) > 0 ! 1045: && INTVAL (operands[2]) <= 8) ! 1046: return \"addq%.w %2,%0\"; ! 1047: } ! 1048: if (GET_CODE (operands[2]) == CONST_INT) ! 1049: { ! 1050: if (INTVAL (operands[2]) < 0 ! 1051: && INTVAL (operands[2]) >= -8) ! 1052: { ! 1053: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1054: - INTVAL (operands[2])); ! 1055: return \"subq%.w %2,%0\"; ! 1056: } ! 1057: } ! 1058: return \"add%.w %2,%0\"; ! 1059: }") ! 1060: ! 1061: (define_insn "" ! 1062: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d")) ! 1063: (plus:HI (match_dup 0) ! 1064: (match_operand:HI 1 "general_operand" "dn,rmn")))] ! 1065: "" ! 1066: "add%.w %1,%0") ! 1067: ! 1068: (define_insn "addqi3" ! 1069: [(set (match_operand:QI 0 "general_operand" "=m,d") ! 1070: (plus:QI (match_operand:QI 1 "general_operand" "%0,0") ! 1071: (match_operand:QI 2 "general_operand" "dn,dmn")))] ! 1072: "" ! 1073: "* ! 1074: { ! 1075: if (GET_CODE (operands[2]) == CONST_INT) ! 1076: { ! 1077: if (INTVAL (operands[2]) > 0 ! 1078: && INTVAL (operands[2]) <= 8) ! 1079: return \"addq%.b %2,%0\"; ! 1080: } ! 1081: if (GET_CODE (operands[2]) == CONST_INT) ! 1082: { ! 1083: if (INTVAL (operands[2]) < 0 && INTVAL (operands[2]) >= -8) ! 1084: { ! 1085: operands[2] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[2])); ! 1086: return \"subq%.b %2,%0\"; ! 1087: } ! 1088: } ! 1089: return \"add%.b %2,%0\"; ! 1090: }") ! 1091: ! 1092: (define_insn "" ! 1093: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d")) ! 1094: (plus:QI (match_dup 0) ! 1095: (match_operand:QI 1 "general_operand" "dn,dmn")))] ! 1096: "" ! 1097: "add%.b %1,%0") ! 1098: ! 1099: (define_insn "adddf3" ! 1100: [(set (match_operand:DF 0 "register_operand" "=f") ! 1101: (plus:DF (match_operand:DF 1 "nonimmediate_operand" "%f") ! 1102: (match_operand:DF 2 "nonimmediate_operand" "fm")))] ! 1103: "TARGET_CE" ! 1104: "fadd%.d %2,%1,%0") ! 1105: ! 1106: (define_insn "addsf3" ! 1107: [(set (match_operand:SF 0 "register_operand" "=f") ! 1108: (plus:SF (match_operand:SF 1 "nonimmediate_operand" "%f") ! 1109: (match_operand:SF 2 "nonimmediate_operand" "fm")))] ! 1110: "TARGET_CE" ! 1111: "fadd%.s %2,%1,%0") ! 1112: ! 1113: ;; subtract instructions ! 1114: ! 1115: (define_insn "subsi3" ! 1116: [(set (match_operand:SI 0 "general_operand" "=m,r,!a,?d") ! 1117: (minus:SI (match_operand:SI 1 "general_operand" "0,0,a,mrIKs") ! 1118: (match_operand:SI 2 "general_operand" "dIKs,mrIKs,J,0")))] ! 1119: "" ! 1120: "* ! 1121: { ! 1122: if (! operands_match_p (operands[0], operands[1])) ! 1123: { ! 1124: if (operands_match_p (operands[0], operands[2])) ! 1125: { ! 1126: if (GET_CODE (operands[1]) == CONST_INT) ! 1127: { ! 1128: if (INTVAL (operands[1]) > 0 ! 1129: && INTVAL (operands[1]) <= 8) ! 1130: return \"subq%.l %1,%0\;neg%.l %0\"; ! 1131: } ! 1132: return \"sub%.l %1,%0\;neg%.l %0\"; ! 1133: } ! 1134: /* This case is matched by J, but negating -0x8000 ! 1135: in an lea would give an invalid displacement. ! 1136: So do this specially. */ ! 1137: if (INTVAL (operands[2]) == -0x8000) ! 1138: return \"mov%.l %1,%0\;sub%.l %2,%0\"; ! 1139: return \"lea %1@(%n2),%0\"; ! 1140: } ! 1141: if (GET_CODE (operands[2]) == CONST_INT) ! 1142: { ! 1143: if (INTVAL (operands[2]) > 0 ! 1144: && INTVAL (operands[2]) <= 8) ! 1145: return \"subq%.l %2,%0\"; ! 1146: if (ADDRESS_REG_P (operands[0]) ! 1147: && INTVAL (operands[2]) >= -0x8000 ! 1148: && INTVAL (operands[2]) < 0x8000) ! 1149: return \"sub%.w %2,%0\"; ! 1150: } ! 1151: return \"sub%.l %2,%0\"; ! 1152: }") ! 1153: ! 1154: (define_insn "" ! 1155: [(set (match_operand:SI 0 "general_operand" "=a") ! 1156: (minus:SI (match_operand:SI 1 "general_operand" "0") ! 1157: (sign_extend:SI (match_operand:HI 2 "general_operand" "rmn"))))] ! 1158: "" ! 1159: "sub%.w %2,%0") ! 1160: ! 1161: (define_insn "subhi3" ! 1162: [(set (match_operand:HI 0 "general_operand" "=m,r") ! 1163: (minus:HI (match_operand:HI 1 "general_operand" "0,0") ! 1164: (match_operand:HI 2 "general_operand" "dn,rmn")))] ! 1165: "" ! 1166: "sub%.w %2,%0") ! 1167: ! 1168: (define_insn "" ! 1169: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d")) ! 1170: (minus:HI (match_dup 0) ! 1171: (match_operand:HI 1 "general_operand" "dn,rmn")))] ! 1172: "" ! 1173: "sub%.w %1,%0") ! 1174: ! 1175: (define_insn "subqi3" ! 1176: [(set (match_operand:QI 0 "general_operand" "=m,d") ! 1177: (minus:QI (match_operand:QI 1 "general_operand" "0,0") ! 1178: (match_operand:QI 2 "general_operand" "dn,dmn")))] ! 1179: "" ! 1180: "sub%.b %2,%0") ! 1181: ! 1182: (define_insn "" ! 1183: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d")) ! 1184: (minus:QI (match_dup 0) ! 1185: (match_operand:QI 1 "general_operand" "dn,dmn")))] ! 1186: "" ! 1187: "sub%.b %1,%0") ! 1188: ! 1189: (define_insn "subdf3" ! 1190: [(set (match_operand:DF 0 "register_operand" "=f,f") ! 1191: (minus:DF (match_operand:DF 1 "nonimmediate_operand" "f,fm") ! 1192: (match_operand:DF 2 "nonimmediate_operand" "fm,f")))] ! 1193: "TARGET_CE" ! 1194: "* ! 1195: { ! 1196: if (FP_REG_P (operands[1])) ! 1197: return \"fsub%.d %2,%1,%0\"; ! 1198: return \"frsub%.d %1,%2,%0\"; ! 1199: }") ! 1200: ! 1201: (define_insn "subsf3" ! 1202: [(set (match_operand:SF 0 "register_operand" "=f,f") ! 1203: (minus:SF (match_operand:SF 1 "nonimmediate_operand" "f,fm") ! 1204: (match_operand:SF 2 "nonimmediate_operand" "fm,f")))] ! 1205: "TARGET_CE" ! 1206: "* ! 1207: { ! 1208: if (FP_REG_P (operands[1])) ! 1209: return \"fsub%.s %2,%1,%0\"; ! 1210: return \"frsub%.s %1,%2,%0\"; ! 1211: }") ! 1212: ! 1213: ;; multiply instructions ! 1214: ! 1215: (define_insn "mulhi3" ! 1216: [(set (match_operand:HI 0 "general_operand" "=d") ! 1217: (mult:HI (match_operand:HI 1 "general_operand" "%0") ! 1218: (match_operand:HI 2 "general_operand" "dmn")))] ! 1219: "" ! 1220: "muls %2,%0") ! 1221: ! 1222: (define_insn "mulhisi3" ! 1223: [(set (match_operand:SI 0 "general_operand" "=d") ! 1224: (mult:SI (match_operand:HI 1 "general_operand" "%0") ! 1225: (match_operand:HI 2 "general_operand" "dmn")))] ! 1226: "" ! 1227: "muls %2,%0") ! 1228: ! 1229: (define_insn "mulsi3" ! 1230: [(set (match_operand:SI 0 "general_operand" "=d") ! 1231: (mult:SI (match_operand:SI 1 "general_operand" "%0") ! 1232: (match_operand:SI 2 "general_operand" "dmsK")))] ! 1233: "TARGET_68020" ! 1234: "muls%.l %2,%0") ! 1235: ! 1236: (define_insn "umulhi3" ! 1237: [(set (match_operand:HI 0 "general_operand" "=d") ! 1238: (umult:HI (match_operand:HI 1 "general_operand" "%0") ! 1239: (match_operand:HI 2 "general_operand" "dmn")))] ! 1240: "" ! 1241: "mulu %2,%0") ! 1242: ! 1243: (define_insn "umulhisi3" ! 1244: [(set (match_operand:SI 0 "general_operand" "=d") ! 1245: (umult:SI (match_operand:HI 1 "general_operand" "%0") ! 1246: (match_operand:HI 2 "general_operand" "dmn")))] ! 1247: "" ! 1248: "mulu %2,%0") ! 1249: ! 1250: (define_insn "umulsi3" ! 1251: [(set (match_operand:SI 0 "general_operand" "=d") ! 1252: (umult:SI (match_operand:SI 1 "general_operand" "%0") ! 1253: (match_operand:SI 2 "general_operand" "dmsK")))] ! 1254: "TARGET_68020" ! 1255: "mulu%.l %2,%0") ! 1256: ! 1257: (define_insn "muldf3" ! 1258: [(set (match_operand:DF 0 "register_operand" "=f") ! 1259: (mult:DF (match_operand:DF 1 "nonimmediate_operand" "%f") ! 1260: (match_operand:DF 2 "nonimmediate_operand" "fm")))] ! 1261: "TARGET_CE" ! 1262: "fmul%.d %2,%1,%0") ! 1263: ! 1264: (define_insn "mulsf3" ! 1265: [(set (match_operand:SF 0 "register_operand" "=f") ! 1266: (mult:SF (match_operand:SF 1 "nonimmediate_operand" "%f") ! 1267: (match_operand:SF 2 "nonimmediate_operand" "fm")))] ! 1268: "TARGET_CE" ! 1269: "fmul%.s %2,%1,%0") ! 1270: ! 1271: ;; divide instructions ! 1272: ! 1273: (define_insn "divhi3" ! 1274: [(set (match_operand:HI 0 "general_operand" "=d") ! 1275: (div:HI (match_operand:HI 1 "general_operand" "0") ! 1276: (match_operand:HI 2 "general_operand" "dmn")))] ! 1277: "" ! 1278: "extl %0\;divs %2,%0") ! 1279: ! 1280: (define_insn "divhisi3" ! 1281: [(set (match_operand:HI 0 "general_operand" "=d") ! 1282: (div:HI (match_operand:SI 1 "general_operand" "0") ! 1283: (match_operand:HI 2 "general_operand" "dmn")))] ! 1284: "" ! 1285: "divs %2,%0") ! 1286: ! 1287: (define_insn "divsi3" ! 1288: [(set (match_operand:SI 0 "general_operand" "=d") ! 1289: (div:SI (match_operand:SI 1 "general_operand" "0") ! 1290: (match_operand:SI 2 "general_operand" "dmsK")))] ! 1291: "TARGET_68020" ! 1292: "divs%.l %2,%0,%0") ! 1293: ! 1294: (define_insn "udivhi3" ! 1295: [(set (match_operand:HI 0 "general_operand" "=d") ! 1296: (udiv:HI (match_operand:HI 1 "general_operand" "0") ! 1297: (match_operand:HI 2 "general_operand" "dmn")))] ! 1298: "" ! 1299: "and%.l %#0xFFFF,%0\;divu %2,%0") ! 1300: ! 1301: (define_insn "udivhisi3" ! 1302: [(set (match_operand:HI 0 "general_operand" "=d") ! 1303: (udiv:HI (match_operand:SI 1 "general_operand" "0") ! 1304: (match_operand:HI 2 "general_operand" "dmn")))] ! 1305: "" ! 1306: "divu %2,%0") ! 1307: ! 1308: (define_insn "udivsi3" ! 1309: [(set (match_operand:SI 0 "general_operand" "=d") ! 1310: (udiv:SI (match_operand:SI 1 "general_operand" "0") ! 1311: (match_operand:SI 2 "general_operand" "dmsK")))] ! 1312: "TARGET_68020" ! 1313: "divu%.l %2,%0,%0") ! 1314: ! 1315: (define_insn "divdf3" ! 1316: [(set (match_operand:DF 0 "register_operand" "=f,f") ! 1317: (div:DF (match_operand:DF 1 "nonimmediate_operand" "f,fm") ! 1318: (match_operand:DF 2 "nonimmediate_operand" "fm,f")))] ! 1319: "TARGET_CE" ! 1320: "* ! 1321: { ! 1322: if (FP_REG_P (operands[1])) ! 1323: return \"fdiv%.d %2,%1,%0\"; ! 1324: return \"frdiv%.d %1,%2,%0\"; ! 1325: }") ! 1326: ! 1327: (define_insn "divsf3" ! 1328: [(set (match_operand:SF 0 "register_operand" "=f,f") ! 1329: (div:SF (match_operand:SF 1 "nonimmediate_operand" "f,fm") ! 1330: (match_operand:SF 2 "nonimmediate_operand" "fm,f")))] ! 1331: "TARGET_CE" ! 1332: "* ! 1333: { ! 1334: if (FP_REG_P (operands[1])) ! 1335: return \"fdiv%.s %2,%1,%0\"; ! 1336: return \"frdiv%.s %1,%2,%0\"; ! 1337: }") ! 1338: ! 1339: ;; Remainder instructions. ! 1340: ! 1341: (define_insn "modhi3" ! 1342: [(set (match_operand:HI 0 "general_operand" "=d") ! 1343: (mod:HI (match_operand:HI 1 "general_operand" "0") ! 1344: (match_operand:HI 2 "general_operand" "dmn")))] ! 1345: "" ! 1346: "* ! 1347: { ! 1348: /* The swap insn produces cc's that don't correspond to the result. */ ! 1349: CC_STATUS_INIT; ! 1350: return \"extl %0\;divs %2,%0\;swap %0\"; ! 1351: }") ! 1352: ! 1353: (define_insn "modhisi3" ! 1354: [(set (match_operand:HI 0 "general_operand" "=d") ! 1355: (mod:HI (match_operand:SI 1 "general_operand" "0") ! 1356: (match_operand:HI 2 "general_operand" "dmn")))] ! 1357: "" ! 1358: "* ! 1359: { ! 1360: /* The swap insn produces cc's that don't correspond to the result. */ ! 1361: CC_STATUS_INIT; ! 1362: return \"divs %2,%0\;swap %0\"; ! 1363: }") ! 1364: ! 1365: (define_insn "umodhi3" ! 1366: [(set (match_operand:HI 0 "general_operand" "=d") ! 1367: (umod:HI (match_operand:HI 1 "general_operand" "0") ! 1368: (match_operand:HI 2 "general_operand" "dmn")))] ! 1369: "" ! 1370: "* ! 1371: { ! 1372: /* The swap insn produces cc's that don't correspond to the result. */ ! 1373: CC_STATUS_INIT; ! 1374: return \"and%.l %#0xFFFF,%0\;divu %2,%0\;swap %0\"; ! 1375: }") ! 1376: ! 1377: (define_insn "umodhisi3" ! 1378: [(set (match_operand:HI 0 "general_operand" "=d") ! 1379: (umod:HI (match_operand:SI 1 "general_operand" "0") ! 1380: (match_operand:HI 2 "general_operand" "dmn")))] ! 1381: "" ! 1382: "* ! 1383: { ! 1384: /* The swap insn produces cc's that don't correspond to the result. */ ! 1385: CC_STATUS_INIT; ! 1386: return \"divu %2,%0\;swap %0\"; ! 1387: }") ! 1388: ! 1389: (define_insn "divmodsi4" ! 1390: [(set (match_operand:SI 0 "general_operand" "=d") ! 1391: (div:SI (match_operand:SI 1 "general_operand" "0") ! 1392: (match_operand:SI 2 "general_operand" "dmsK"))) ! 1393: (set (match_operand:SI 3 "general_operand" "=d") ! 1394: (mod:SI (match_dup 1) (match_dup 2)))] ! 1395: "TARGET_68020" ! 1396: "divs%.l %2,%0,%3") ! 1397: ! 1398: (define_insn "udivmodsi4" ! 1399: [(set (match_operand:SI 0 "general_operand" "=d") ! 1400: (udiv:SI (match_operand:SI 1 "general_operand" "0") ! 1401: (match_operand:SI 2 "general_operand" "dmsK"))) ! 1402: (set (match_operand:SI 3 "general_operand" "=d") ! 1403: (umod:SI (match_dup 1) (match_dup 2)))] ! 1404: "TARGET_68020" ! 1405: "divu%.l %2,%0,%3") ! 1406: ! 1407: ;; logical-and instructions ! 1408: ! 1409: (define_insn "andsi3" ! 1410: [(set (match_operand:SI 0 "general_operand" "=m,d") ! 1411: (and:SI (match_operand:SI 1 "general_operand" "%0,0") ! 1412: (match_operand:SI 2 "general_operand" "dKs,dmKs")))] ! 1413: "" ! 1414: "* ! 1415: { ! 1416: if (GET_CODE (operands[2]) == CONST_INT ! 1417: && (INTVAL (operands[2]) | 0xffff) == 0xffffffff ! 1418: && (DATA_REG_P (operands[0]) ! 1419: || offsettable_memref_p (operands[0]))) ! 1420: { ! 1421: if (GET_CODE (operands[0]) != REG) ! 1422: operands[0] = adj_offsettable_operand (operands[0], 2); ! 1423: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1424: INTVAL (operands[2]) & 0xffff); ! 1425: /* Do not delete a following tstl %0 insn; that would be incorrect. */ ! 1426: CC_STATUS_INIT; ! 1427: if (operands[2] == const0_rtx) ! 1428: return \"clr%.w %0\"; ! 1429: return \"and%.w %2,%0\"; ! 1430: } ! 1431: return \"and%.l %2,%0\"; ! 1432: }") ! 1433: ! 1434: (define_insn "andhi3" ! 1435: [(set (match_operand:HI 0 "general_operand" "=m,d") ! 1436: (and:HI (match_operand:HI 1 "general_operand" "%0,0") ! 1437: (match_operand:HI 2 "general_operand" "dn,dmn")))] ! 1438: "" ! 1439: "and%.w %2,%0") ! 1440: ! 1441: (define_insn "andqi3" ! 1442: [(set (match_operand:QI 0 "general_operand" "=m,d") ! 1443: (and:QI (match_operand:QI 1 "general_operand" "%0,0") ! 1444: (match_operand:QI 2 "general_operand" "dn,dmn")))] ! 1445: "" ! 1446: "and%.b %2,%0") ! 1447: ! 1448: (define_insn "" ! 1449: [(set (match_operand:SI 0 "general_operand" "=d") ! 1450: (and:SI (zero_extend:SI (match_operand:HI 1 "general_operand" "dm")) ! 1451: (match_operand:SI 2 "general_operand" "0")))] ! 1452: "GET_CODE (operands[2]) == CONST_INT ! 1453: && (unsigned int) INTVAL (operands[2]) < (1 << GET_MODE_BITSIZE (HImode))" ! 1454: "and%.w %1,%0") ! 1455: ! 1456: (define_insn "" ! 1457: [(set (match_operand:SI 0 "general_operand" "=d") ! 1458: (and:SI (zero_extend:SI (match_operand:QI 1 "general_operand" "dm")) ! 1459: (match_operand:SI 2 "general_operand" "0")))] ! 1460: "GET_CODE (operands[2]) == CONST_INT ! 1461: && (unsigned int) INTVAL (operands[2]) < (1 << GET_MODE_BITSIZE (QImode))" ! 1462: "and%.b %1,%0") ! 1463: ! 1464: ;; inclusive-or instructions ! 1465: ! 1466: (define_insn "iorsi3" ! 1467: [(set (match_operand:SI 0 "general_operand" "=m,d") ! 1468: (ior:SI (match_operand:SI 1 "general_operand" "%0,0") ! 1469: (match_operand:SI 2 "general_operand" "dKs,dmKs")))] ! 1470: "" ! 1471: "* ! 1472: { ! 1473: register int logval; ! 1474: if (GET_CODE (operands[2]) == CONST_INT ! 1475: && INTVAL (operands[2]) >> 16 == 0 ! 1476: && (DATA_REG_P (operands[0]) ! 1477: || offsettable_memref_p (operands[0]))) ! 1478: { ! 1479: if (GET_CODE (operands[0]) != REG) ! 1480: operands[0] = adj_offsettable_operand (operands[0], 2); ! 1481: /* Do not delete a following tstl %0 insn; that would be incorrect. */ ! 1482: CC_STATUS_INIT; ! 1483: return \"or%.w %2,%0\"; ! 1484: } ! 1485: if (GET_CODE (operands[2]) == CONST_INT ! 1486: && (logval = exact_log2 (INTVAL (operands[2]))) >= 0 ! 1487: && (DATA_REG_P (operands[0]) ! 1488: || offsettable_memref_p (operands[0]))) ! 1489: { ! 1490: if (DATA_REG_P (operands[0])) ! 1491: operands[1] = gen_rtx (CONST_INT, VOIDmode, logval); ! 1492: else ! 1493: { ! 1494: operands[0] = adj_offsettable_operand (operands[0], 3 - (logval / 8)); ! 1495: operands[1] = gen_rtx (CONST_INT, VOIDmode, logval % 8); ! 1496: } ! 1497: return \"bset %1,%0\"; ! 1498: } ! 1499: return \"or%.l %2,%0\"; ! 1500: }") ! 1501: ! 1502: (define_insn "iorhi3" ! 1503: [(set (match_operand:HI 0 "general_operand" "=m,d") ! 1504: (ior:HI (match_operand:HI 1 "general_operand" "%0,0") ! 1505: (match_operand:HI 2 "general_operand" "dn,dmn")))] ! 1506: "" ! 1507: "or%.w %2,%0") ! 1508: ! 1509: (define_insn "iorqi3" ! 1510: [(set (match_operand:QI 0 "general_operand" "=m,d") ! 1511: (ior:QI (match_operand:QI 1 "general_operand" "%0,0") ! 1512: (match_operand:QI 2 "general_operand" "dn,dmn")))] ! 1513: "" ! 1514: "or%.b %2,%0") ! 1515: ! 1516: ;; xor instructions ! 1517: ! 1518: (define_insn "xorsi3" ! 1519: [(set (match_operand:SI 0 "general_operand" "=do,m") ! 1520: (xor:SI (match_operand:SI 1 "general_operand" "%0,0") ! 1521: (match_operand:SI 2 "general_operand" "di,dKs")))] ! 1522: "" ! 1523: "* ! 1524: { ! 1525: if (GET_CODE (operands[2]) == CONST_INT ! 1526: && INTVAL (operands[2]) >> 16 == 0 ! 1527: && (offsettable_memref_p (operands[0]) || DATA_REG_P (operands[0]))) ! 1528: { ! 1529: if (! DATA_REG_P (operands[0])) ! 1530: operands[0] = adj_offsettable_operand (operands[0], 2); ! 1531: /* Do not delete a following tstl %0 insn; that would be incorrect. */ ! 1532: CC_STATUS_INIT; ! 1533: return \"eor%.w %2,%0\"; ! 1534: } ! 1535: return \"eor%.l %2,%0\"; ! 1536: }") ! 1537: ! 1538: (define_insn "xorhi3" ! 1539: [(set (match_operand:HI 0 "general_operand" "=dm") ! 1540: (xor:HI (match_operand:HI 1 "general_operand" "%0") ! 1541: (match_operand:HI 2 "general_operand" "dn")))] ! 1542: "" ! 1543: "eor%.w %2,%0") ! 1544: ! 1545: (define_insn "xorqi3" ! 1546: [(set (match_operand:QI 0 "general_operand" "=dm") ! 1547: (xor:QI (match_operand:QI 1 "general_operand" "%0") ! 1548: (match_operand:QI 2 "general_operand" "dn")))] ! 1549: "" ! 1550: "eor%.b %2,%0") ! 1551: ! 1552: ;; negation instructions ! 1553: ! 1554: (define_insn "negsi2" ! 1555: [(set (match_operand:SI 0 "general_operand" "=dm") ! 1556: (neg:SI (match_operand:SI 1 "general_operand" "0")))] ! 1557: "" ! 1558: "neg%.l %0") ! 1559: ! 1560: (define_insn "neghi2" ! 1561: [(set (match_operand:HI 0 "general_operand" "=dm") ! 1562: (neg:HI (match_operand:HI 1 "general_operand" "0")))] ! 1563: "" ! 1564: "neg%.w %0") ! 1565: ! 1566: (define_insn "negqi2" ! 1567: [(set (match_operand:QI 0 "general_operand" "=dm") ! 1568: (neg:QI (match_operand:QI 1 "general_operand" "0")))] ! 1569: "" ! 1570: "neg%.b %0") ! 1571: ! 1572: (define_insn "negsf2" ! 1573: [(set (match_operand:SF 0 "register_operand" "=f") ! 1574: (neg:SF (match_operand:SF 1 "nonimmediate_operand" "fm")))] ! 1575: "TARGET_CE" ! 1576: "fneg%.s %1,%0") ! 1577: ! 1578: (define_insn "negdf2" ! 1579: [(set (match_operand:DF 0 "register_operand" "=f") ! 1580: (neg:DF (match_operand:DF 1 "nonimmediate_operand" "fm")))] ! 1581: "TARGET_CE" ! 1582: "fneg%.d %1,%0") ! 1583: ! 1584: ;; Absolute value instructions ! 1585: ! 1586: (define_insn "abssf2" ! 1587: [(set (match_operand:SF 0 "register_operand" "=f") ! 1588: (abs:SF (match_operand:SF 1 "nonimmediate_operand" "fm")))] ! 1589: "TARGET_CE" ! 1590: "fabs%.s %1,%0") ! 1591: ! 1592: (define_insn "absdf2" ! 1593: [(set (match_operand:DF 0 "register_operand" "=f") ! 1594: (abs:DF (match_operand:DF 1 "nonimmediate_operand" "fm")))] ! 1595: "TARGET_CE" ! 1596: "fabs%.d %1,%0") ! 1597: ! 1598: ;; Square root instructions ! 1599: ! 1600: (define_insn "sqrtsf2" ! 1601: [(set (match_operand:SF 0 "register_operand" "=f") ! 1602: (sqrt:SF (match_operand:SF 1 "nonimmediate_operand" "fm")))] ! 1603: "TARGET_CE" ! 1604: "fsqrt%.s %1,%0") ! 1605: ! 1606: (define_insn "sqrtdf2" ! 1607: [(set (match_operand:DF 0 "register_operand" "=f") ! 1608: (sqrt:DF (match_operand:DF 1 "nonimmediate_operand" "fm")))] ! 1609: "TARGET_CE" ! 1610: "fsqrt%.d %1,%0") ! 1611: ! 1612: ;; one complement instructions ! 1613: ! 1614: (define_insn "one_cmplsi2" ! 1615: [(set (match_operand:SI 0 "general_operand" "=dm") ! 1616: (not:SI (match_operand:SI 1 "general_operand" "0")))] ! 1617: "" ! 1618: "not%.l %0") ! 1619: ! 1620: (define_insn "one_cmplhi2" ! 1621: [(set (match_operand:HI 0 "general_operand" "=dm") ! 1622: (not:HI (match_operand:HI 1 "general_operand" "0")))] ! 1623: "" ! 1624: "not%.w %0") ! 1625: ! 1626: (define_insn "one_cmplqi2" ! 1627: [(set (match_operand:QI 0 "general_operand" "=dm") ! 1628: (not:QI (match_operand:QI 1 "general_operand" "0")))] ! 1629: "" ! 1630: "not%.b %0") ! 1631: ! 1632: ;; Optimized special case of shifting. ! 1633: ;; Must precede the general case. ! 1634: ! 1635: (define_insn "" ! 1636: [(set (match_operand:SI 0 "general_operand" "=d") ! 1637: (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m") ! 1638: (const_int 24)))] ! 1639: "GET_CODE (XEXP (operands[1], 0)) != POST_INC ! 1640: && GET_CODE (XEXP (operands[1], 0)) != PRE_DEC" ! 1641: "* ! 1642: { ! 1643: if (TARGET_68020) ! 1644: return \"mov%.b %1,%0\;extb%.l %0\"; ! 1645: return \"mov%.b %1,%0\;ext%.w %0\;ext%.l %0\"; ! 1646: }") ! 1647: ! 1648: (define_insn "" ! 1649: [(set (match_operand:SI 0 "general_operand" "=d") ! 1650: (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m") ! 1651: (const_int 24)))] ! 1652: "GET_CODE (XEXP (operands[1], 0)) != POST_INC ! 1653: && GET_CODE (XEXP (operands[1], 0)) != PRE_DEC" ! 1654: "* ! 1655: { ! 1656: if (reg_mentioned_p (operands[0], operands[1])) ! 1657: return \"mov%.b %1,%0\;and%.l %#0xFF,%0\"; ! 1658: return \"clr%.l %0\;mov%.b %1,%0\"; ! 1659: }") ! 1660: ! 1661: (define_insn "" ! 1662: [(set (cc0) (compare (match_operand:QI 0 "general_operand" "i") ! 1663: (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m") ! 1664: (const_int 24))))] ! 1665: "(GET_CODE (operands[0]) == CONST_INT ! 1666: && (INTVAL (operands[0]) & ~0xff) == 0)" ! 1667: "* cc_status.flags |= CC_REVERSED; ! 1668: return \"cmp%.b %0,%1\"; ! 1669: ") ! 1670: ! 1671: (define_insn "" ! 1672: [(set (cc0) (compare (lshiftrt:SI (match_operand:SI 0 "memory_operand" "m") ! 1673: (const_int 24)) ! 1674: (match_operand:QI 1 "general_operand" "i")))] ! 1675: "(GET_CODE (operands[1]) == CONST_INT ! 1676: && (INTVAL (operands[1]) & ~0xff) == 0)" ! 1677: "* ! 1678: return \"cmp%.b %1,%0\"; ! 1679: ") ! 1680: ! 1681: (define_insn "" ! 1682: [(set (cc0) (compare (match_operand:QI 0 "general_operand" "i") ! 1683: (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m") ! 1684: (const_int 24))))] ! 1685: "(GET_CODE (operands[0]) == CONST_INT ! 1686: && ((INTVAL (operands[0]) + 0x80) & ~0xff) == 0)" ! 1687: "* cc_status.flags |= CC_REVERSED; ! 1688: return \"cmp%.b %0,%1\"; ! 1689: ") ! 1690: ! 1691: (define_insn "" ! 1692: [(set (cc0) (compare (ashiftrt:SI (match_operand:SI 0 "memory_operand" "m") ! 1693: (const_int 24)) ! 1694: (match_operand:QI 1 "general_operand" "i")))] ! 1695: "(GET_CODE (operands[1]) == CONST_INT ! 1696: && ((INTVAL (operands[1]) + 0x80) & ~0xff) == 0)" ! 1697: "* ! 1698: return \"cmp%.b %1,%0\"; ! 1699: ") ! 1700: ! 1701: ;; arithmetic shift instructions ! 1702: ;; We don't need the shift memory by 1 bit instruction ! 1703: ! 1704: (define_insn "ashlsi3" ! 1705: [(set (match_operand:SI 0 "general_operand" "=d") ! 1706: (ashift:SI (match_operand:SI 1 "general_operand" "0") ! 1707: (match_operand:SI 2 "general_operand" "dI")))] ! 1708: "" ! 1709: "asl%.l %2,%0") ! 1710: ! 1711: (define_insn "ashlhi3" ! 1712: [(set (match_operand:HI 0 "general_operand" "=d") ! 1713: (ashift:HI (match_operand:HI 1 "general_operand" "0") ! 1714: (match_operand:HI 2 "general_operand" "dI")))] ! 1715: "" ! 1716: "asl%.w %2,%0") ! 1717: ! 1718: (define_insn "ashlqi3" ! 1719: [(set (match_operand:QI 0 "general_operand" "=d") ! 1720: (ashift:QI (match_operand:QI 1 "general_operand" "0") ! 1721: (match_operand:QI 2 "general_operand" "dI")))] ! 1722: "" ! 1723: "asl%.b %2,%0") ! 1724: ! 1725: (define_insn "ashrsi3" ! 1726: [(set (match_operand:SI 0 "general_operand" "=d") ! 1727: (ashiftrt:SI (match_operand:SI 1 "general_operand" "0") ! 1728: (match_operand:SI 2 "general_operand" "dI")))] ! 1729: "" ! 1730: "asr%.l %2,%0") ! 1731: ! 1732: (define_insn "ashrhi3" ! 1733: [(set (match_operand:HI 0 "general_operand" "=d") ! 1734: (ashiftrt:HI (match_operand:HI 1 "general_operand" "0") ! 1735: (match_operand:HI 2 "general_operand" "dI")))] ! 1736: "" ! 1737: "asr%.w %2,%0") ! 1738: ! 1739: (define_insn "ashrqi3" ! 1740: [(set (match_operand:QI 0 "general_operand" "=d") ! 1741: (ashiftrt:QI (match_operand:QI 1 "general_operand" "0") ! 1742: (match_operand:QI 2 "general_operand" "dI")))] ! 1743: "" ! 1744: "asr%.b %2,%0") ! 1745: ! 1746: ;; logical shift instructions ! 1747: ! 1748: (define_insn "lshlsi3" ! 1749: [(set (match_operand:SI 0 "general_operand" "=d") ! 1750: (lshift:SI (match_operand:SI 1 "general_operand" "0") ! 1751: (match_operand:SI 2 "general_operand" "dI")))] ! 1752: "" ! 1753: "lsl%.l %2,%0") ! 1754: ! 1755: (define_insn "lshlhi3" ! 1756: [(set (match_operand:HI 0 "general_operand" "=d") ! 1757: (lshift:HI (match_operand:HI 1 "general_operand" "0") ! 1758: (match_operand:HI 2 "general_operand" "dI")))] ! 1759: "" ! 1760: "lsl%.w %2,%0") ! 1761: ! 1762: (define_insn "lshlqi3" ! 1763: [(set (match_operand:QI 0 "general_operand" "=d") ! 1764: (lshift:QI (match_operand:QI 1 "general_operand" "0") ! 1765: (match_operand:QI 2 "general_operand" "dI")))] ! 1766: "" ! 1767: "lsl%.b %2,%0") ! 1768: ! 1769: (define_insn "lshrsi3" ! 1770: [(set (match_operand:SI 0 "general_operand" "=d") ! 1771: (lshiftrt:SI (match_operand:SI 1 "general_operand" "0") ! 1772: (match_operand:SI 2 "general_operand" "dI")))] ! 1773: "" ! 1774: "lsr%.l %2,%0") ! 1775: ! 1776: (define_insn "lshrhi3" ! 1777: [(set (match_operand:HI 0 "general_operand" "=d") ! 1778: (lshiftrt:HI (match_operand:HI 1 "general_operand" "0") ! 1779: (match_operand:HI 2 "general_operand" "dI")))] ! 1780: "" ! 1781: "lsr%.w %2,%0") ! 1782: ! 1783: (define_insn "lshrqi3" ! 1784: [(set (match_operand:QI 0 "general_operand" "=d") ! 1785: (lshiftrt:QI (match_operand:QI 1 "general_operand" "0") ! 1786: (match_operand:QI 2 "general_operand" "dI")))] ! 1787: "" ! 1788: "lsr%.b %2,%0") ! 1789: ! 1790: ;; rotate instructions ! 1791: ! 1792: (define_insn "rotlsi3" ! 1793: [(set (match_operand:SI 0 "general_operand" "=d") ! 1794: (rotate:SI (match_operand:SI 1 "general_operand" "0") ! 1795: (match_operand:SI 2 "general_operand" "dI")))] ! 1796: "" ! 1797: "rol%.l %2,%0") ! 1798: ! 1799: (define_insn "rotlhi3" ! 1800: [(set (match_operand:HI 0 "general_operand" "=d") ! 1801: (rotate:HI (match_operand:HI 1 "general_operand" "0") ! 1802: (match_operand:HI 2 "general_operand" "dI")))] ! 1803: "" ! 1804: "rol%.w %2,%0") ! 1805: ! 1806: (define_insn "rotlqi3" ! 1807: [(set (match_operand:QI 0 "general_operand" "=d") ! 1808: (rotate:QI (match_operand:QI 1 "general_operand" "0") ! 1809: (match_operand:QI 2 "general_operand" "dI")))] ! 1810: "" ! 1811: "rol%.b %2,%0") ! 1812: ! 1813: (define_insn "rotrsi3" ! 1814: [(set (match_operand:SI 0 "general_operand" "=d") ! 1815: (rotatert:SI (match_operand:SI 1 "general_operand" "0") ! 1816: (match_operand:SI 2 "general_operand" "dI")))] ! 1817: "" ! 1818: "ror%.l %2,%0") ! 1819: ! 1820: (define_insn "rotrhi3" ! 1821: [(set (match_operand:HI 0 "general_operand" "=d") ! 1822: (rotatert:HI (match_operand:HI 1 "general_operand" "0") ! 1823: (match_operand:HI 2 "general_operand" "dI")))] ! 1824: "" ! 1825: "ror%.w %2,%0") ! 1826: ! 1827: (define_insn "rotrqi3" ! 1828: [(set (match_operand:QI 0 "general_operand" "=d") ! 1829: (rotatert:QI (match_operand:QI 1 "general_operand" "0") ! 1830: (match_operand:QI 2 "general_operand" "dI")))] ! 1831: "" ! 1832: "ror%.b %2,%0") ! 1833: ! 1834: ;; Special cases of bit-field insns which we should ! 1835: ;; recognize in preference to the general case. ! 1836: ;; These handle aligned 8-bit and 16-bit fields, ! 1837: ;; which can usually be done with move instructions. ! 1838: ! 1839: (define_insn "" ! 1840: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+do") ! 1841: (match_operand:SI 1 "immediate_operand" "i") ! 1842: (match_operand:SI 2 "immediate_operand" "i")) ! 1843: (match_operand:SI 3 "general_operand" "d"))] ! 1844: "TARGET_68020 && TARGET_BITFIELD ! 1845: && GET_CODE (operands[1]) == CONST_INT ! 1846: && (INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16) ! 1847: && GET_CODE (operands[2]) == CONST_INT ! 1848: && INTVAL (operands[2]) % INTVAL (operands[1]) == 0 ! 1849: && (GET_CODE (operands[0]) == REG ! 1850: || ! mode_dependent_address_p (XEXP (operands[0], 0)))" ! 1851: "* ! 1852: { ! 1853: if (REG_P (operands[0])) ! 1854: { ! 1855: if (INTVAL (operands[1]) + INTVAL (operands[2]) != 32) ! 1856: return \"bfins %3,[%c2,%c1]%0\"; ! 1857: } ! 1858: else ! 1859: operands[0] ! 1860: = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8); ! 1861: ! 1862: if (GET_CODE (operands[3]) == MEM) ! 1863: operands[3] = adj_offsettable_operand (operands[3], ! 1864: (32 - INTVAL (operands[1])) / 8); ! 1865: if (INTVAL (operands[1]) == 8) ! 1866: return \"mov%.b %3,%0\"; ! 1867: return \"mov%.w %3,%0\"; ! 1868: }") ! 1869: ! 1870: (define_insn "" ! 1871: [(set (match_operand:SI 0 "general_operand" "=&d") ! 1872: (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do") ! 1873: (match_operand:SI 2 "immediate_operand" "i") ! 1874: (match_operand:SI 3 "immediate_operand" "i")))] ! 1875: "TARGET_68020 && TARGET_BITFIELD ! 1876: && GET_CODE (operands[2]) == CONST_INT ! 1877: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16) ! 1878: && GET_CODE (operands[3]) == CONST_INT ! 1879: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0 ! 1880: && (GET_CODE (operands[1]) == REG ! 1881: || ! mode_dependent_address_p (XEXP (operands[1], 0)))" ! 1882: "* ! 1883: { ! 1884: if (REG_P (operands[1])) ! 1885: { ! 1886: if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32) ! 1887: return \"bfextu [%c3,%c2]%1,%0\"; ! 1888: } ! 1889: else ! 1890: operands[1] ! 1891: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8); ! 1892: ! 1893: output_asm_insn (\"clrl %0\", operands); ! 1894: if (GET_CODE (operands[0]) == MEM) ! 1895: operands[0] = adj_offsettable_operand (operands[0], ! 1896: (32 - INTVAL (operands[1])) / 8); ! 1897: if (INTVAL (operands[2]) == 8) ! 1898: return \"mov%.b %1,%0\"; ! 1899: return \"mov%.w %1,%0\"; ! 1900: }") ! 1901: ! 1902: (define_insn "" ! 1903: [(set (match_operand:SI 0 "general_operand" "=d") ! 1904: (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do") ! 1905: (match_operand:SI 2 "immediate_operand" "i") ! 1906: (match_operand:SI 3 "immediate_operand" "i")))] ! 1907: "TARGET_68020 && TARGET_BITFIELD ! 1908: && GET_CODE (operands[2]) == CONST_INT ! 1909: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16) ! 1910: && GET_CODE (operands[3]) == CONST_INT ! 1911: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0 ! 1912: && (GET_CODE (operands[1]) == REG ! 1913: || ! mode_dependent_address_p (XEXP (operands[1], 0)))" ! 1914: "* ! 1915: { ! 1916: if (REG_P (operands[1])) ! 1917: { ! 1918: if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32) ! 1919: return \"bfexts [%c3,%c2]%1,%0\"; ! 1920: } ! 1921: else ! 1922: operands[1] ! 1923: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8); ! 1924: ! 1925: if (INTVAL (operands[2]) == 8) ! 1926: return \"mov%.b %1,%0\;extb%.l %0\"; ! 1927: return \"mov%.w %1,%0\;ext%.l %0\"; ! 1928: }") ! 1929: ! 1930: ;; Bit field instructions, general cases. ! 1931: ;; "o,d" constraint causes a nonoffsettable memref to match the "o" ! 1932: ;; so that its address is reloaded. ! 1933: ! 1934: (define_insn "extv" ! 1935: [(set (match_operand:SI 0 "general_operand" "=d,d") ! 1936: (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d") ! 1937: (match_operand:SI 2 "general_operand" "di,di") ! 1938: (match_operand:SI 3 "general_operand" "di,di")))] ! 1939: "TARGET_68020 && TARGET_BITFIELD" ! 1940: "bfexts [%c3,%c2]%1,%0") ! 1941: ! 1942: (define_insn "extzv" ! 1943: [(set (match_operand:SI 0 "general_operand" "=d,d") ! 1944: (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d") ! 1945: (match_operand:SI 2 "general_operand" "di,di") ! 1946: (match_operand:SI 3 "general_operand" "di,di")))] ! 1947: "TARGET_68020 && TARGET_BITFIELD" ! 1948: "bfextu [%c3,%c2]%1,%0") ! 1949: ! 1950: (define_insn "" ! 1951: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d") ! 1952: (match_operand:SI 1 "general_operand" "di,di") ! 1953: (match_operand:SI 2 "general_operand" "di,di")) ! 1954: (xor:SI (zero_extract:SI (match_dup 0) (match_dup 1) (match_dup 2)) ! 1955: (match_operand 3 "immediate_operand" "i,i")))] ! 1956: "TARGET_68020 && TARGET_BITFIELD ! 1957: && GET_CODE (operands[3]) == CONST_INT ! 1958: && (INTVAL (operands[3]) == -1 ! 1959: || (GET_CODE (operands[1]) == CONST_INT ! 1960: && (~ INTVAL (operands[3]) & ((1 << INTVAL (operands[1]))- 1)) == 0))" ! 1961: "* ! 1962: { ! 1963: CC_STATUS_INIT; ! 1964: return \"bfchg [%c2,%c1]%0\"; ! 1965: }") ! 1966: ! 1967: (define_insn "" ! 1968: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d") ! 1969: (match_operand:SI 1 "general_operand" "di,di") ! 1970: (match_operand:SI 2 "general_operand" "di,di")) ! 1971: (const_int 0))] ! 1972: "TARGET_68020 && TARGET_BITFIELD" ! 1973: "* ! 1974: { ! 1975: CC_STATUS_INIT; ! 1976: return \"bfclr [%c2,%c1]%0\"; ! 1977: }") ! 1978: ! 1979: (define_insn "" ! 1980: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d") ! 1981: (match_operand:SI 1 "general_operand" "di,di") ! 1982: (match_operand:SI 2 "general_operand" "di,di")) ! 1983: (const_int -1))] ! 1984: "TARGET_68020 && TARGET_BITFIELD" ! 1985: "* ! 1986: { ! 1987: CC_STATUS_INIT; ! 1988: return \"bfset [%c2,%c1]%0\"; ! 1989: }") ! 1990: ! 1991: (define_insn "insv" ! 1992: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d") ! 1993: (match_operand:SI 1 "general_operand" "di,di") ! 1994: (match_operand:SI 2 "general_operand" "di,di")) ! 1995: (match_operand:SI 3 "general_operand" "d,d"))] ! 1996: "TARGET_68020 && TARGET_BITFIELD" ! 1997: "bfins %3,[%c2,%c1]%0") ! 1998: ! 1999: ;; Now recognize bit field insns that operate on registers ! 2000: ;; (or at least were intended to do so). ! 2001: ! 2002: (define_insn "" ! 2003: [(set (match_operand:SI 0 "general_operand" "=d") ! 2004: (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d") ! 2005: (match_operand:SI 2 "general_operand" "di") ! 2006: (match_operand:SI 3 "general_operand" "di")))] ! 2007: "TARGET_68020 && TARGET_BITFIELD" ! 2008: "bfexts [%c3,%c2]%1,%0") ! 2009: ! 2010: (define_insn "" ! 2011: [(set (match_operand:SI 0 "general_operand" "=d") ! 2012: (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d") ! 2013: (match_operand:SI 2 "general_operand" "di") ! 2014: (match_operand:SI 3 "general_operand" "di")))] ! 2015: "TARGET_68020 && TARGET_BITFIELD" ! 2016: "bfextu [%c3,%c2]%1,%0") ! 2017: ! 2018: (define_insn "" ! 2019: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d") ! 2020: (match_operand:SI 1 "general_operand" "di") ! 2021: (match_operand:SI 2 "general_operand" "di")) ! 2022: (const_int 0))] ! 2023: "TARGET_68020 && TARGET_BITFIELD" ! 2024: "* ! 2025: { ! 2026: CC_STATUS_INIT; ! 2027: return \"bfclr [%c2,%c1]%0\"; ! 2028: }") ! 2029: ! 2030: (define_insn "" ! 2031: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d") ! 2032: (match_operand:SI 1 "general_operand" "di") ! 2033: (match_operand:SI 2 "general_operand" "di")) ! 2034: (const_int -1))] ! 2035: "TARGET_68020 && TARGET_BITFIELD" ! 2036: "* ! 2037: { ! 2038: CC_STATUS_INIT; ! 2039: return \"bfset [%c2,%c1]%0\"; ! 2040: }") ! 2041: ! 2042: (define_insn "" ! 2043: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d") ! 2044: (match_operand:SI 1 "general_operand" "di") ! 2045: (match_operand:SI 2 "general_operand" "di")) ! 2046: (match_operand:SI 3 "general_operand" "d"))] ! 2047: "TARGET_68020 && TARGET_BITFIELD" ! 2048: "* ! 2049: { ! 2050: return \"bfins %3,[%c2,%c1]%0\"; ! 2051: }") ! 2052: ! 2053: ;; Special patterns for optimizing bit-field instructions. ! 2054: ! 2055: (define_insn "" ! 2056: [(set (cc0) ! 2057: (zero_extract:SI (match_operand:QI 0 "memory_operand" "o") ! 2058: (match_operand:SI 1 "general_operand" "di") ! 2059: (match_operand:SI 2 "general_operand" "di")))] ! 2060: "TARGET_68020 && TARGET_BITFIELD ! 2061: && GET_CODE (operands[1]) == CONST_INT" ! 2062: "* ! 2063: { ! 2064: if (operands[1] == const1_rtx ! 2065: && GET_CODE (operands[2]) == CONST_INT) ! 2066: { ! 2067: int width = GET_CODE (operands[0]) == REG ? 31 : 7; ! 2068: return output_btst (operands, ! 2069: gen_rtx (CONST_INT, VOIDmode, ! 2070: width - INTVAL (operands[2])), ! 2071: operands[0], ! 2072: insn, 1000); ! 2073: /* Pass 1000 as SIGNPOS argument so that btst will ! 2074: not think we are testing the sign bit for an `and' ! 2075: and assume that nonzero implies a negative result. */ ! 2076: } ! 2077: if (INTVAL (operands[1]) != 32) ! 2078: cc_status.flags = CC_NOT_NEGATIVE; ! 2079: return \"bftst [%c2,%c1]%0\"; ! 2080: }") ! 2081: ! 2082: (define_insn "" ! 2083: [(set (cc0) ! 2084: (subreg:QI ! 2085: (zero_extract:SI (match_operand:QI 0 "memory_operand" "o") ! 2086: (match_operand:SI 1 "general_operand" "di") ! 2087: (match_operand:SI 2 "general_operand" "di")) ! 2088: 0))] ! 2089: "TARGET_68020 && TARGET_BITFIELD ! 2090: && GET_CODE (operands[1]) == CONST_INT" ! 2091: "* ! 2092: { ! 2093: if (operands[1] == const1_rtx ! 2094: && GET_CODE (operands[2]) == CONST_INT) ! 2095: { ! 2096: int width = GET_CODE (operands[0]) == REG ? 31 : 7; ! 2097: return output_btst (operands, ! 2098: gen_rtx (CONST_INT, VOIDmode, ! 2099: width - INTVAL (operands[2])), ! 2100: operands[0], ! 2101: insn, 1000); ! 2102: /* Pass 1000 as SIGNPOS argument so that btst will ! 2103: not think we are testing the sign bit for an `and' ! 2104: and assume that nonzero implies a negative result. */ ! 2105: } ! 2106: if (INTVAL (operands[1]) != 32) ! 2107: cc_status.flags = CC_NOT_NEGATIVE; ! 2108: return \"bftst [%c2,%c1]%0\"; ! 2109: }") ! 2110: ! 2111: (define_insn "" ! 2112: [(set (cc0) ! 2113: (subreg:HI ! 2114: (zero_extract:SI (match_operand:QI 0 "memory_operand" "o") ! 2115: (match_operand:SI 1 "general_operand" "di") ! 2116: (match_operand:SI 2 "general_operand" "di")) ! 2117: 0))] ! 2118: "TARGET_68020 && TARGET_BITFIELD ! 2119: && GET_CODE (operands[1]) == CONST_INT" ! 2120: "* ! 2121: { ! 2122: if (operands[1] == const1_rtx ! 2123: && GET_CODE (operands[2]) == CONST_INT) ! 2124: { ! 2125: int width = GET_CODE (operands[0]) == REG ? 31 : 7; ! 2126: return output_btst (operands, ! 2127: gen_rtx (CONST_INT, VOIDmode, ! 2128: width - INTVAL (operands[2])), ! 2129: operands[0], ! 2130: insn, 1000); ! 2131: /* Pass 1000 as SIGNPOS argument so that btst will ! 2132: not think we are testing the sign bit for an `and' ! 2133: and assume that nonzero implies a negative result. */ ! 2134: } ! 2135: if (INTVAL (operands[1]) != 32) ! 2136: cc_status.flags = CC_NOT_NEGATIVE; ! 2137: return \"bftst [%c2,%c1]%0\"; ! 2138: }") ! 2139: ! 2140: ;;; now handle the register cases ! 2141: (define_insn "" ! 2142: [(set (cc0) ! 2143: (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "d") ! 2144: (match_operand:SI 1 "general_operand" "di") ! 2145: (match_operand:SI 2 "general_operand" "di")))] ! 2146: "TARGET_68020 && TARGET_BITFIELD ! 2147: && GET_CODE (operands[1]) == CONST_INT" ! 2148: "* ! 2149: { ! 2150: if (operands[1] == const1_rtx ! 2151: && GET_CODE (operands[2]) == CONST_INT) ! 2152: { ! 2153: int width = GET_CODE (operands[0]) == REG ? 31 : 7; ! 2154: return output_btst (operands, ! 2155: gen_rtx (CONST_INT, VOIDmode, ! 2156: width - INTVAL (operands[2])), ! 2157: operands[0], ! 2158: insn, 1000); ! 2159: /* Pass 1000 as SIGNPOS argument so that btst will ! 2160: not think we are testing the sign bit for an `and' ! 2161: and assume that nonzero implies a negative result. */ ! 2162: } ! 2163: if (INTVAL (operands[1]) != 32) ! 2164: cc_status.flags = CC_NOT_NEGATIVE; ! 2165: return \"bftst [%c2,%c1]%0\"; ! 2166: }") ! 2167: ! 2168: (define_insn "" ! 2169: [(set (cc0) ! 2170: (subreg:QI ! 2171: (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "d") ! 2172: (match_operand:SI 1 "general_operand" "di") ! 2173: (match_operand:SI 2 "general_operand" "di")) ! 2174: 0))] ! 2175: "TARGET_68020 && TARGET_BITFIELD ! 2176: && GET_CODE (operands[1]) == CONST_INT" ! 2177: "* ! 2178: { ! 2179: if (operands[1] == const1_rtx ! 2180: && GET_CODE (operands[2]) == CONST_INT) ! 2181: { ! 2182: int width = GET_CODE (operands[0]) == REG ? 31 : 7; ! 2183: return output_btst (operands, ! 2184: gen_rtx (CONST_INT, VOIDmode, ! 2185: width - INTVAL (operands[2])), ! 2186: operands[0], ! 2187: insn, 1000); ! 2188: /* Pass 1000 as SIGNPOS argument so that btst will ! 2189: not think we are testing the sign bit for an `and' ! 2190: and assume that nonzero implies a negative result. */ ! 2191: } ! 2192: if (INTVAL (operands[1]) != 32) ! 2193: cc_status.flags = CC_NOT_NEGATIVE; ! 2194: return \"bftst [%c2,%c1]%0\"; ! 2195: }") ! 2196: ! 2197: (define_insn "" ! 2198: [(set (cc0) ! 2199: (subreg:HI ! 2200: (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "d") ! 2201: (match_operand:SI 1 "general_operand" "di") ! 2202: (match_operand:SI 2 "general_operand" "di")) ! 2203: 0))] ! 2204: "TARGET_68020 && TARGET_BITFIELD ! 2205: && GET_CODE (operands[1]) == CONST_INT" ! 2206: "* ! 2207: { ! 2208: if (operands[1] == const1_rtx ! 2209: && GET_CODE (operands[2]) == CONST_INT) ! 2210: { ! 2211: int width = GET_CODE (operands[0]) == REG ? 31 : 7; ! 2212: return output_btst (operands, ! 2213: gen_rtx (CONST_INT, VOIDmode, ! 2214: width - INTVAL (operands[2])), ! 2215: operands[0], ! 2216: insn, 1000); ! 2217: /* Pass 1000 as SIGNPOS argument so that btst will ! 2218: not think we are testing the sign bit for an `and' ! 2219: and assume that nonzero implies a negative result. */ ! 2220: } ! 2221: if (INTVAL (operands[1]) != 32) ! 2222: cc_status.flags = CC_NOT_NEGATIVE; ! 2223: return \"bftst [%c2,%c1]%0\"; ! 2224: }") ! 2225: ! 2226: (define_insn "seq" ! 2227: [(set (match_operand:QI 0 "general_operand" "=d") ! 2228: (eq (cc0) (const_int 0)))] ! 2229: "" ! 2230: "* ! 2231: cc_status = cc_prev_status; ! 2232: OUTPUT_JUMP (\"seq %0\", \"fseq %0\", \"seq %0\"); ! 2233: ") ! 2234: ! 2235: (define_insn "sne" ! 2236: [(set (match_operand:QI 0 "general_operand" "=d") ! 2237: (ne (cc0) (const_int 0)))] ! 2238: "" ! 2239: "* ! 2240: cc_status = cc_prev_status; ! 2241: OUTPUT_JUMP (\"sne %0\", \"fsneq %0\", \"sne %0\"); ! 2242: ") ! 2243: ! 2244: (define_insn "sgt" ! 2245: [(set (match_operand:QI 0 "general_operand" "=d") ! 2246: (gt (cc0) (const_int 0)))] ! 2247: "" ! 2248: "* ! 2249: cc_status = cc_prev_status; ! 2250: OUTPUT_JUMP (\"sgt %0\", \"fsgt %0\", \"and%.b %#0xc,%!\;sgt %0\"); ! 2251: ") ! 2252: ! 2253: (define_insn "sgtu" ! 2254: [(set (match_operand:QI 0 "general_operand" "=d") ! 2255: (gtu (cc0) (const_int 0)))] ! 2256: "" ! 2257: "* cc_status = cc_prev_status; ! 2258: return \"shi %0\"; ") ! 2259: ! 2260: (define_insn "slt" ! 2261: [(set (match_operand:QI 0 "general_operand" "=d") ! 2262: (lt (cc0) (const_int 0)))] ! 2263: "" ! 2264: "* cc_status = cc_prev_status; ! 2265: OUTPUT_JUMP (\"slt %0\", \"fslt %0\", \"smi %0\"); ") ! 2266: ! 2267: (define_insn "sltu" ! 2268: [(set (match_operand:QI 0 "general_operand" "=d") ! 2269: (ltu (cc0) (const_int 0)))] ! 2270: "" ! 2271: "* cc_status = cc_prev_status; ! 2272: return \"scs %0\"; ") ! 2273: ! 2274: (define_insn "sge" ! 2275: [(set (match_operand:QI 0 "general_operand" "=d") ! 2276: (ge (cc0) (const_int 0)))] ! 2277: "" ! 2278: "* cc_status = cc_prev_status; ! 2279: OUTPUT_JUMP (\"sge %0\", \"fsge %0\", \"spl %0\"); ") ! 2280: ! 2281: (define_insn "sgeu" ! 2282: [(set (match_operand:QI 0 "general_operand" "=d") ! 2283: (geu (cc0) (const_int 0)))] ! 2284: "" ! 2285: "* cc_status = cc_prev_status; ! 2286: return \"scc %0\"; ") ! 2287: ! 2288: (define_insn "sle" ! 2289: [(set (match_operand:QI 0 "general_operand" "=d") ! 2290: (le (cc0) (const_int 0)))] ! 2291: "" ! 2292: "* ! 2293: cc_status = cc_prev_status; ! 2294: OUTPUT_JUMP (\"sle %0\", \"fsle %0\", \"and%.b %#0xc,%!\;sle %0\"); ! 2295: ") ! 2296: ! 2297: (define_insn "sleu" ! 2298: [(set (match_operand:QI 0 "general_operand" "=d") ! 2299: (leu (cc0) (const_int 0)))] ! 2300: "" ! 2301: "* cc_status = cc_prev_status; ! 2302: return \"sls %0\"; ") ! 2303: ! 2304: ;; Basic conditional jump instructions. ! 2305: ! 2306: (define_insn "beq" ! 2307: [(set (pc) ! 2308: (if_then_else (eq (cc0) ! 2309: (const_int 0)) ! 2310: (label_ref (match_operand 0 "" "")) ! 2311: (pc)))] ! 2312: "" ! 2313: "* ! 2314: { ! 2315: OUTPUT_JUMP (\"jeq %l0\", \"fbeq %l0\", \"jeq %l0\"); ! 2316: }") ! 2317: ! 2318: (define_insn "bne" ! 2319: [(set (pc) ! 2320: (if_then_else (ne (cc0) ! 2321: (const_int 0)) ! 2322: (label_ref (match_operand 0 "" "")) ! 2323: (pc)))] ! 2324: "" ! 2325: "* ! 2326: { ! 2327: OUTPUT_JUMP (\"jne %l0\", \"fbneq %l0\", \"jne %l0\"); ! 2328: }") ! 2329: ! 2330: (define_insn "bgt" ! 2331: [(set (pc) ! 2332: (if_then_else (gt (cc0) ! 2333: (const_int 0)) ! 2334: (label_ref (match_operand 0 "" "")) ! 2335: (pc)))] ! 2336: "" ! 2337: "* ! 2338: OUTPUT_JUMP (\"jgt %l0\", \"fbgt %l0\", \"and%.b %#0xc,%!\;jgt %l0\"); ! 2339: ") ! 2340: ! 2341: (define_insn "bgtu" ! 2342: [(set (pc) ! 2343: (if_then_else (gtu (cc0) ! 2344: (const_int 0)) ! 2345: (label_ref (match_operand 0 "" "")) ! 2346: (pc)))] ! 2347: "" ! 2348: "* ! 2349: return \"jhi %l0\"; ! 2350: ") ! 2351: ! 2352: (define_insn "blt" ! 2353: [(set (pc) ! 2354: (if_then_else (lt (cc0) ! 2355: (const_int 0)) ! 2356: (label_ref (match_operand 0 "" "")) ! 2357: (pc)))] ! 2358: "" ! 2359: "* ! 2360: OUTPUT_JUMP (\"jlt %l0\", \"fblt %l0\", \"jmi %l0\"); ! 2361: ") ! 2362: ! 2363: (define_insn "bltu" ! 2364: [(set (pc) ! 2365: (if_then_else (ltu (cc0) ! 2366: (const_int 0)) ! 2367: (label_ref (match_operand 0 "" "")) ! 2368: (pc)))] ! 2369: "" ! 2370: "* ! 2371: return \"jcs %l0\"; ! 2372: ") ! 2373: ! 2374: (define_insn "bge" ! 2375: [(set (pc) ! 2376: (if_then_else (ge (cc0) ! 2377: (const_int 0)) ! 2378: (label_ref (match_operand 0 "" "")) ! 2379: (pc)))] ! 2380: "" ! 2381: "* ! 2382: OUTPUT_JUMP (\"jge %l0\", \"fbge %l0\", \"jpl %l0\"); ! 2383: ") ! 2384: ! 2385: (define_insn "bgeu" ! 2386: [(set (pc) ! 2387: (if_then_else (geu (cc0) ! 2388: (const_int 0)) ! 2389: (label_ref (match_operand 0 "" "")) ! 2390: (pc)))] ! 2391: "" ! 2392: "* ! 2393: return \"jcc %l0\"; ! 2394: ") ! 2395: ! 2396: (define_insn "ble" ! 2397: [(set (pc) ! 2398: (if_then_else (le (cc0) ! 2399: (const_int 0)) ! 2400: (label_ref (match_operand 0 "" "")) ! 2401: (pc)))] ! 2402: "" ! 2403: "* ! 2404: OUTPUT_JUMP (\"jle %l0\", \"fble %l0\", \"and%.b %#0xc,%!\;jle %l0\"); ! 2405: ") ! 2406: ! 2407: (define_insn "bleu" ! 2408: [(set (pc) ! 2409: (if_then_else (leu (cc0) ! 2410: (const_int 0)) ! 2411: (label_ref (match_operand 0 "" "")) ! 2412: (pc)))] ! 2413: "" ! 2414: "* ! 2415: return \"jls %l0\"; ! 2416: ") ! 2417: ! 2418: ;; Negated conditional jump instructions. ! 2419: ! 2420: (define_insn "" ! 2421: [(set (pc) ! 2422: (if_then_else (eq (cc0) ! 2423: (const_int 0)) ! 2424: (pc) ! 2425: (label_ref (match_operand 0 "" ""))))] ! 2426: "" ! 2427: "* ! 2428: { ! 2429: OUTPUT_JUMP (\"jne %l0\", \"fbneq %l0\", \"jne %l0\"); ! 2430: }") ! 2431: ! 2432: (define_insn "" ! 2433: [(set (pc) ! 2434: (if_then_else (ne (cc0) ! 2435: (const_int 0)) ! 2436: (pc) ! 2437: (label_ref (match_operand 0 "" ""))))] ! 2438: "" ! 2439: "* ! 2440: { ! 2441: OUTPUT_JUMP (\"jeq %l0\", \"fbeq %l0\", \"jeq %l0\"); ! 2442: }") ! 2443: ! 2444: (define_insn "" ! 2445: [(set (pc) ! 2446: (if_then_else (gt (cc0) ! 2447: (const_int 0)) ! 2448: (pc) ! 2449: (label_ref (match_operand 0 "" ""))))] ! 2450: "" ! 2451: "* ! 2452: OUTPUT_JUMP (\"jle %l0\", \"fbngt %l0\", \"and%.b %#0xc,%!\;jle %l0\"); ! 2453: ") ! 2454: ! 2455: (define_insn "" ! 2456: [(set (pc) ! 2457: (if_then_else (gtu (cc0) ! 2458: (const_int 0)) ! 2459: (pc) ! 2460: (label_ref (match_operand 0 "" ""))))] ! 2461: "" ! 2462: "* ! 2463: return \"jls %l0\"; ! 2464: ") ! 2465: ! 2466: (define_insn "" ! 2467: [(set (pc) ! 2468: (if_then_else (lt (cc0) ! 2469: (const_int 0)) ! 2470: (pc) ! 2471: (label_ref (match_operand 0 "" ""))))] ! 2472: "" ! 2473: "* ! 2474: OUTPUT_JUMP (\"jge %l0\", \"fbnlt %l0\", \"jpl %l0\"); ! 2475: ") ! 2476: ! 2477: (define_insn "" ! 2478: [(set (pc) ! 2479: (if_then_else (ltu (cc0) ! 2480: (const_int 0)) ! 2481: (pc) ! 2482: (label_ref (match_operand 0 "" ""))))] ! 2483: "" ! 2484: "* ! 2485: return \"jcc %l0\"; ! 2486: ") ! 2487: ! 2488: (define_insn "" ! 2489: [(set (pc) ! 2490: (if_then_else (ge (cc0) ! 2491: (const_int 0)) ! 2492: (pc) ! 2493: (label_ref (match_operand 0 "" ""))))] ! 2494: "" ! 2495: "* ! 2496: OUTPUT_JUMP (\"jlt %l0\", \"fbnge %l0\", \"jmi %l0\"); ! 2497: ") ! 2498: ! 2499: (define_insn "" ! 2500: [(set (pc) ! 2501: (if_then_else (geu (cc0) ! 2502: (const_int 0)) ! 2503: (pc) ! 2504: (label_ref (match_operand 0 "" ""))))] ! 2505: "" ! 2506: "* ! 2507: return \"jcs %l0\"; ! 2508: ") ! 2509: ! 2510: (define_insn "" ! 2511: [(set (pc) ! 2512: (if_then_else (le (cc0) ! 2513: (const_int 0)) ! 2514: (pc) ! 2515: (label_ref (match_operand 0 "" ""))))] ! 2516: "" ! 2517: "* ! 2518: OUTPUT_JUMP (\"jgt %l0\", \"fbnle %l0\", \"and%.b %#0xc,%!\;jgt %l0\"); ! 2519: ") ! 2520: ! 2521: (define_insn "" ! 2522: [(set (pc) ! 2523: (if_then_else (leu (cc0) ! 2524: (const_int 0)) ! 2525: (pc) ! 2526: (label_ref (match_operand 0 "" ""))))] ! 2527: "" ! 2528: "* ! 2529: return \"jhi %l0\"; ! 2530: ") ! 2531: ! 2532: ;; Subroutines of "casesi". ! 2533: ! 2534: (define_expand "casesi_1" ! 2535: [(set (match_operand:SI 3 "general_operand" "") ! 2536: (plus:SI (match_operand:SI 0 "general_operand" "") ! 2537: ;; Note operand 1 has been negated! ! 2538: (match_operand:SI 1 "immediate_operand" ""))) ! 2539: (set (cc0) (compare (match_operand:SI 2 "general_operand" "") ! 2540: (match_dup 3))) ! 2541: (set (pc) (if_then_else (ltu (cc0) (const_int 0)) ! 2542: (label_ref (match_operand 4 "" "")) (pc)))] ! 2543: "" ! 2544: "") ! 2545: ! 2546: (define_expand "casesi_2" ! 2547: [(set (match_operand:SI 0 "" "") (mem:HI (match_operand:SI 1 "" ""))) ! 2548: ;; The USE here is so that at least one jump-insn will refer to the label, ! 2549: ;; to keep it alive in jump_optimize. ! 2550: (parallel [(set (pc) ! 2551: (plus:SI (pc) (match_dup 0))) ! 2552: (use (label_ref (match_operand 2 "" "")))])] ! 2553: "" ! 2554: "") ! 2555: ! 2556: ;; Operand 0 is index (in bytes); operand 1 is minimum, operand 2 the maximum; ! 2557: ;; operand 3 is CODE_LABEL for the table; ! 2558: ;; operand 4 is the CODE_LABEL to go to if index out of range. ! 2559: (define_expand "casesi" ! 2560: ;; We don't use these for generating the RTL, but we must describe ! 2561: ;; the operands here. ! 2562: [(match_operand:SI 0 "general_operand" "") ! 2563: (match_operand:SI 1 "immediate_operand" "") ! 2564: (match_operand:SI 2 "general_operand" "") ! 2565: (match_operand 3 "" "") ! 2566: (match_operand 4 "" "")] ! 2567: "" ! 2568: " ! 2569: { ! 2570: rtx table_elt_addr; ! 2571: rtx index_diff; ! 2572: ! 2573: operands[1] = negate_rtx (SImode, operands[1]); ! 2574: index_diff = gen_reg_rtx (SImode); ! 2575: /* Emit the first few insns. */ ! 2576: emit_insn (gen_casesi_1 (operands[0], operands[1], operands[2], ! 2577: index_diff, operands[4])); ! 2578: /* Construct a memory address. This may emit some insns. */ ! 2579: table_elt_addr ! 2580: = memory_address_noforce ! 2581: (HImode, ! 2582: gen_rtx (PLUS, Pmode, ! 2583: gen_rtx (MULT, Pmode, index_diff, ! 2584: gen_rtx (CONST_INT, VOIDmode, 2)), ! 2585: gen_rtx (LABEL_REF, VOIDmode, operands[3]))); ! 2586: /* Emit the last few insns. */ ! 2587: emit_insn (gen_casesi_2 (gen_reg_rtx (HImode), table_elt_addr, operands[3])); ! 2588: DONE; ! 2589: }") ! 2590: ! 2591: ;; Recognize one of the insns resulting from casesi_2. ! 2592: (define_insn "" ! 2593: [(set (pc) ! 2594: (plus:SI (pc) (match_operand:HI 0 "general_operand" "r"))) ! 2595: (use (label_ref (match_operand 1 "" "")))] ! 2596: "" ! 2597: "* ! 2598: return \"jmp pc@(2:B)[%0:W:B]\"; ! 2599: ") ! 2600: ! 2601: ;; Unconditional and other jump instructions ! 2602: (define_insn "jump" ! 2603: [(set (pc) ! 2604: (label_ref (match_operand 0 "" "")))] ! 2605: "" ! 2606: "* ! 2607: return \"jra %l0\"; ! 2608: ") ! 2609: ! 2610: (define_insn "" ! 2611: [(set (pc) ! 2612: (if_then_else ! 2613: (ne (compare (plus:HI (match_operand:HI 0 "general_operand" "g") ! 2614: (const_int -1)) ! 2615: (const_int -1)) ! 2616: (const_int 0)) ! 2617: (label_ref (match_operand 1 "" "")) ! 2618: (pc))) ! 2619: (set (match_dup 0) ! 2620: (plus:HI (match_dup 0) ! 2621: (const_int -1)))] ! 2622: "" ! 2623: "* ! 2624: { ! 2625: if (DATA_REG_P (operands[0])) ! 2626: return \"dbra %0,%l1\"; ! 2627: if (GET_CODE (operands[0]) == MEM) ! 2628: { ! 2629: return \"subq%.w %#1,%0\;jcc %l1\"; ! 2630: } ! 2631: return \"subq%.w %#1,%0\;cmp%.w %#-1,%0\;jne %l1\"; ! 2632: }") ! 2633: ! 2634: (define_insn "" ! 2635: [(set (pc) ! 2636: (if_then_else ! 2637: (ne (compare (plus:SI (match_operand:SI 0 "general_operand" "g") ! 2638: (const_int -1)) ! 2639: (const_int -1)) ! 2640: (const_int 0)) ! 2641: (label_ref (match_operand 1 "" "")) ! 2642: (pc))) ! 2643: (set (match_dup 0) ! 2644: (plus:SI (match_dup 0) ! 2645: (const_int -1)))] ! 2646: "" ! 2647: "* ! 2648: { ! 2649: if (DATA_REG_P (operands[0])) ! 2650: return \"dbra %0,%l1\;clr%.w %0\;subq%.l %#1,%0\;jcc %l1\"; ! 2651: if (GET_CODE (operands[0]) == MEM) ! 2652: return \"subq%.l %#1,%0\;jcc %l1\"; ! 2653: return \"subq%.l %#1,%0\;cmp%.l %#-1,%0\;jne %l1\"; ! 2654: }") ! 2655: ! 2656: ;; dbra patterns that use REG_NOTES info generated by strength_reduce. ! 2657: ! 2658: (define_insn "" ! 2659: [(set (pc) ! 2660: (if_then_else ! 2661: (ge (plus:SI (match_operand:SI 0 "general_operand" "g") ! 2662: (const_int -1)) ! 2663: (const_int 0)) ! 2664: (label_ref (match_operand 1 "" "")) ! 2665: (pc))) ! 2666: (set (match_dup 0) ! 2667: (plus:SI (match_dup 0) ! 2668: (const_int -1)))] ! 2669: "find_reg_note (insn, REG_NONNEG, 0)" ! 2670: "* ! 2671: { ! 2672: if (DATA_REG_P (operands[0])) ! 2673: return \"dbra %0,%l1\;clrw %0\;subql %#1,%0\;jcc %l1\"; ! 2674: if (GET_CODE (operands[0]) == MEM) ! 2675: return \"subq%.l %#1,%0\;jcc %l1\"; ! 2676: return \"subq%.l %#1,%0\;cmp%.l %#-1,%0\;jne %l1\"; ! 2677: }") ! 2678: ! 2679: ;; Call subroutine with no return value. ! 2680: (define_insn "call" ! 2681: [(call (match_operand:QI 0 "general_operand" "o") ! 2682: (match_operand:SI 1 "general_operand" "g"))] ! 2683: "" ! 2684: "* ! 2685: { ! 2686: rtx xoperands[2]; ! 2687: int size = XINT(operands[1],0); ! 2688: ! 2689: if (size == 0) ! 2690: output_asm_insn (\"sub%.l a0,a0\;jbsr %0\", operands); ! 2691: else ! 2692: { ! 2693: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, size/4); ! 2694: output_asm_insn (\"mov%.l sp,a0\;pea %a1\", xoperands); ! 2695: output_asm_insn (\"jbsr %0\", operands); ! 2696: size = size + 4; ! 2697: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, size); ! 2698: if (size <= 8) ! 2699: output_asm_insn (\"addq%.l %1,sp\", xoperands); ! 2700: else if (size < 0x8000) ! 2701: output_asm_insn (\"add%.w %1,sp\", xoperands); ! 2702: else ! 2703: output_asm_insn (\"add%.l %1,sp\", xoperands); ! 2704: } ! 2705: return \"mov%.l a6@(-4),a0\"; ! 2706: }") ! 2707: ! 2708: ;; Call subroutine, returning value in operand 0 ! 2709: ;; (which must be a hard register). ! 2710: (define_insn "call_value" ! 2711: [(set (match_operand 0 "" "=rf") ! 2712: (call (match_operand:QI 1 "general_operand" "o") ! 2713: (match_operand:SI 2 "general_operand" "g")))] ! 2714: "" ! 2715: "* ! 2716: { ! 2717: rtx xoperands[3]; ! 2718: int size = XINT(operands[2],0); ! 2719: ! 2720: if (size == 0) ! 2721: output_asm_insn(\"sub%.l a0,a0\;jbsr %1\", operands); ! 2722: else ! 2723: { ! 2724: xoperands[2] = gen_rtx (CONST_INT, VOIDmode, size/4); ! 2725: output_asm_insn (\"mov%.l sp,a0\;pea %a2\", xoperands); ! 2726: output_asm_insn (\"jbsr %1\", operands); ! 2727: size = size + 4; ! 2728: xoperands[2] = gen_rtx (CONST_INT, VOIDmode, size); ! 2729: if (size <= 8) ! 2730: output_asm_insn (\"addq%.l %2,sp\", xoperands); ! 2731: else if (size < 0x8000) ! 2732: output_asm_insn (\"add%.w %2,sp\", xoperands); ! 2733: else ! 2734: output_asm_insn (\"add%.l %2,sp\", xoperands); ! 2735: } ! 2736: return \"mov%.l a6@(-4),a0\"; ! 2737: }") ! 2738: ! 2739: (define_insn "nop" ! 2740: [(const_int 0)] ! 2741: "" ! 2742: "nop") ! 2743: ! 2744: ;; This should not be used unless the add/sub insns can't be. ! 2745: ! 2746: (define_insn "" ! 2747: [(set (match_operand:SI 0 "general_operand" "=a") ! 2748: (match_operand:QI 1 "address_operand" "p"))] ! 2749: "" ! 2750: "lea %a1,%0") ! 2751: ! 2752: ;; This is the first machine-dependent peephole optimization. ! 2753: ;; It is useful when a floating value is returned from a function call ! 2754: ;; and then is moved into an FP register. ! 2755: ;; But it is mainly intended to test the support for these optimizations. ! 2756: ! 2757: ;Not applicable to Alliant -- floating results are returned in fp0 ! 2758: ;(define_peephole ! 2759: ; [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4))) ! 2760: ; (set (match_operand:DF 0 "register_operand" "f") ! 2761: ; (match_operand:DF 1 "register_operand" "ad"))] ! 2762: ; "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])" ! 2763: ; "* ! 2764: ;{ ! 2765: ; rtx xoperands[2]; ! 2766: ; xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); ! 2767: ; output_asm_insn (\"mov%.l %1,%@\", xoperands); ! 2768: ; output_asm_insn (\"mov%.l %1,%-\", operands); ! 2769: ; return \"fmove%.d %+,%0\"; ! 2770: ;} ! 2771: ;") ! 2772: ! 2773: ! 2774: ;;- Local variables: ! 2775: ;;- mode:emacs-lisp ! 2776: ;;- comment-start: ";;- " ! 2777: ;;- comment-start-skip: ";+- *" ! 2778: ;;- eval: (set-syntax-table (copy-sequence (syntax-table))) ! 2779: ;;- eval: (modify-syntax-entry ?[ "(]") ! 2780: ;;- eval: (modify-syntax-entry ?] ")[") ! 2781: ;;- eval: (modify-syntax-entry ?{ "(}") ! 2782: ;;- eval: (modify-syntax-entry ?} "){") ! 2783: ;;- End: ! 2784:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.