|
|
1.1 ! root 1: ;;- Machine description for the Hitachi H8/300 for the GNU C compiler ! 2: ;; Copyright (C) 1992, 1993 Free Software Foundation, Inc. ! 3: ! 4: ;; This file is part of GNU CC. ! 5: ! 6: ;; GNU CC is free software; you can redistribute it and/or modify ! 7: ;; it under the terms of the GNU General Public License as published by ! 8: ;; the Free Software Foundation; either version 2, or (at your option) ! 9: ;; any later version. ! 10: ! 11: ;; GNU CC is distributed in the hope that it will be useful, ! 12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: ;; GNU General Public License for more details. ! 15: ! 16: ;; You should have received a copy of the GNU General Public License ! 17: ;; along with GNU CC; see the file COPYING. If not, write to ! 18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 19: ! 20: ! 21: ;; The original PO technology requires these to be ordered by speed, ! 22: ;; so that assigner will pick the fastest. ! 23: ! 24: ;; See file "rtl.def" for documentation on define_insn, match_*, et. al. ! 25: ! 26: (define_attr "type" "branch,return,call,arith,move,float,multi" ! 27: (const_string "arith")) ! 28: ! 29: ;; The size of instructions in bytes. ! 30: ! 31: (define_attr "length" "" ! 32: (cond [(eq_attr "type" "branch") ! 33: (if_then_else (and (ge (minus (pc) (match_dup 0)) ! 34: (const_int -128)) ! 35: (le (minus (pc) (match_dup 0)) ! 36: (const_int 128))) ! 37: (const_int 2) ! 38: (const_int 6)) ! 39: (eq_attr "type" "move") (const_int 4) ! 40: (eq_attr "type" "return") (const_int 2) ! 41: (eq_attr "type" "float") (const_int 12) ! 42: (eq_attr "type" "call") (const_int 4)] ! 43: (const_int 200))) ! 44: ! 45: ! 46: (define_attr "cc" "none,clobber,none_0hit,set,compare,whoops" ! 47: (const_string "whoops")) ! 48: ! 49: ;; ---------------------------------------------------------------------- ! 50: ;; move instructions ! 51: ;; ---------------------------------------------------------------------- ! 52: ! 53: ;; movhi ! 54: ! 55: (define_insn "" ! 56: [(set (match_operand:HI 0 "push_operand" "=<") ! 57: (match_operand:HI 1 "register_operand" "ra"))] ! 58: "" ! 59: "mov.w %T1,%T0" ! 60: [(set_attr "type" "move") ! 61: (set_attr "length" "2") ! 62: (set_attr "cc" "set")]) ! 63: ! 64: (define_insn "movstricthi" ! 65: [(set (strict_low_part (match_operand:HI 0 "general_operand_dst" "=r,r,r,o,<")) ! 66: (match_operand:HI 1 "general_operand_src" "I,r,io,r,r"))] ! 67: "" ! 68: "@ ! 69: sub.w %T0,%T0 ! 70: mov.w %T1,%T0 ! 71: mov.w %T1,%T0 ! 72: mov.w %T1,%T0 ! 73: mov.w %T1,%T0" ! 74: [(set_attr "type" "move") ! 75: (set_attr "length" "2,2,4,4,2") ! 76: (set_attr "cc" "set")]) ! 77: ! 78: (define_insn "" ! 79: [(set (match_operand:HI 0 "general_operand_dst" "=ra,ra,ra,o,<") ! 80: (match_operand:HI 1 "general_operand_src" "I,ra,ion,ra,ra"))] ! 81: "" ! 82: "@ ! 83: sub.w %T0,%T0 ! 84: mov.w %T1,%T0 ! 85: mov.w %T1,%T0 ! 86: mov.w %T1,%T0 ! 87: mov.w %T1,%T0" ! 88: [(set_attr "type" "move") ! 89: (set_attr "length" "2,2,4,4,2") ! 90: (set_attr "cc" "set")]) ! 91: ! 92: (define_expand "movhi" ! 93: [(set (match_operand:HI 0 "general_operand_dst" "") ! 94: (match_operand:HI 1 "general_operand_src" ""))] ! 95: "" ! 96: " ! 97: { ! 98: /* One of the ops has to be in a register. */ ! 99: if (! register_operand (operand1, HImode) ! 100: && ! register_operand (operand0, HImode)) ! 101: operands[1] = copy_to_mode_reg (HImode, operand1); ! 102: }") ! 103: ! 104: (define_insn "" ! 105: [(set (match_operand:HI 0 "register_operand" "=&ra") ! 106: (plus:HI (match_operand:HI 1 "general_operand_src" "g") ! 107: (match_operand:HI 2 "register_operand" "ra")))] ! 108: "" ! 109: "mov.w %T1,%T0\;add.w %T2,%T0" ! 110: [(set_attr "type" "arith") ! 111: (set_attr "length" "6") ! 112: (set_attr "cc" "set")]) ! 113: ! 114: ;; movqi ! 115: ! 116: (define_insn "" ! 117: [(set (match_operand:QI 0 "push_operand" "=<") ! 118: (match_operand:QI 1 "register_operand" "r"))] ! 119: "" ! 120: "mov.w %T1,%T0" ! 121: [(set_attr "type" "move") ! 122: (set_attr "length" "2") ! 123: (set_attr "cc" "set")]) ! 124: ! 125: (define_insn "movstrictqi" ! 126: [(set (strict_low_part (match_operand:QI 0 "general_operand_dst" "=r,r,r,o,<")) ! 127: (match_operand:QI 1 "general_operand_src" "I,r,io,r,r"))] ! 128: "" ! 129: "@ ! 130: sub.b %X0,%X0 ! 131: mov.b %X1,%X0 ! 132: mov.b %X1,%X0 ! 133: mov.b %X1,%X0 ! 134: mov.b %X1,%X0" ! 135: [(set_attr "type" "move") ! 136: (set_attr "length" "2,2,4,4,2") ! 137: (set_attr "cc" "set")]) ! 138: ! 139: (define_insn "" ! 140: [(set (match_operand:QI 0 "general_operand_dst" "=r,r,r,o,<") ! 141: (match_operand:QI 1 "general_operand_src" "I,r,io,r,r"))] ! 142: "" ! 143: "@ ! 144: sub.b %X0,%X0 ! 145: mov.b %X1,%X0 ! 146: mov.b %X1,%X0 ! 147: mov.b %X1,%X0 ! 148: mov.b %X1,%X0" ! 149: [(set_attr "type" "move") ! 150: (set_attr "length" "2,2,4,4,2") ! 151: (set_attr "cc" "set")]) ! 152: ! 153: (define_expand "movqi" ! 154: [(set (match_operand:QI 0 "general_operand_dst" "") ! 155: (match_operand:QI 1 "general_operand_src" ""))] ! 156: "" ! 157: " ! 158: { ! 159: /* One of the ops has to be in a register. */ ! 160: if (! register_operand (operand0, QImode) ! 161: && ! register_operand (operand1, QImode)) ! 162: operands[1] = copy_to_mode_reg (QImode, operand1); ! 163: }") ! 164: ! 165: ;; movsi ! 166: ! 167: (define_insn "" ! 168: [(set (match_operand:SI 0 "general_operand_dst" "=l,l,l,o,<") ! 169: (match_operand:SI 1 "general_operand_src" "I,l,ion,l,l"))] ! 170: "" ! 171: "* ! 172: { ! 173: int rn = -1; ! 174: switch (which_alternative) ! 175: { ! 176: case 0: ! 177: return \"sub.w %e0,%e0\;sub.w %f0,%f0\"; ! 178: case 1: ! 179: return \"mov.w %e1,%e0\;mov.w %f1,%f0\"; ! 180: case 2: ! 181: /* Make sure we don't trample the register we index with. */ ! 182: ! 183: if (GET_CODE (operands[1]) == MEM) ! 184: { ! 185: rtx inside = XEXP (operands[1], 0); ! 186: if (REG_P (inside)) ! 187: rn = REGNO (inside); ! 188: else if (GET_CODE (inside) == PLUS) ! 189: { ! 190: rtx lhs = XEXP (inside, 0); ! 191: rtx rhs = XEXP (inside, 1); ! 192: if (REG_P (lhs)) ! 193: rn = REGNO (lhs); ! 194: if (REG_P (rhs)) ! 195: rn = REGNO (rhs); ! 196: } ! 197: } ! 198: if (rn == REGNO (operands[0])) ! 199: /* Move the second word first. */ ! 200: return \"mov.w %f1,%f0\;mov.w %e1,%e0\"; ! 201: else ! 202: return \"mov.w %e1,%e0\;mov.w %f1,%f0\"; ! 203: ! 204: case 3: ! 205: return \"mov.w %e1,%e0\;mov.w %f1,%f0\"; ! 206: case 4: ! 207: return \"mov.w %f1,%T0\;mov.w %e1,%T0\"; ! 208: } ! 209: }" ! 210: [(set_attr "type" "move") ! 211: (set_attr "length" "4,4,8,8,4") ! 212: (set_attr "cc" "clobber")]) ! 213: ! 214: (define_insn "" ! 215: [(set (match_operand:SI 0 "push_operand" "=<") ! 216: (match_operand:SI 1 "register_operand" "l"))] ! 217: "" ! 218: "mov.w %f1,%T0\;mov.w %e1,%T0" ! 219: [(set_attr "type" "move") ! 220: (set_attr "length" "4") ! 221: (set_attr "cc" "clobber")]) ! 222: ! 223: (define_expand "movsi" ! 224: [(set (match_operand:SI 0 "general_operand_dst" "") ! 225: (match_operand:SI 1 "general_operand_src" ""))] ! 226: "" ! 227: "if (domovsi (operands)) DONE;") ! 228: ! 229: (define_insn "" ! 230: [(set (match_operand:SF 0 "general_operand_dst" "=l,l,l,o,<") ! 231: (match_operand:SF 1 "general_operand_src" "I,l,ion,l,l"))] ! 232: "" ! 233: "* ! 234: { ! 235: /* This is a copy of the movsi stuff. */ ! 236: int rn = -1; ! 237: switch (which_alternative) ! 238: { ! 239: case 0: ! 240: return \"sub.w %e0,%e0\;sub.w %f0,%f0\"; ! 241: case 1: ! 242: return \"mov.w %e1,%e0\;mov.w %f1,%f0\"; ! 243: case 2: ! 244: /* Make sure we don't trample the register we index with. */ ! 245: ! 246: if (GET_CODE (operands[1]) == MEM) ! 247: { ! 248: rtx inside = XEXP (operands[1], 0); ! 249: if (REG_P (inside)) ! 250: rn = REGNO (inside); ! 251: else if (GET_CODE (inside) == PLUS) ! 252: { ! 253: rtx lhs = XEXP (inside, 0); ! 254: rtx rhs = XEXP (inside, 1); ! 255: if (REG_P (lhs)) ! 256: rn = REGNO (lhs); ! 257: if (REG_P (rhs)) ! 258: rn = REGNO (rhs); ! 259: } ! 260: } ! 261: if (rn == REGNO (operands[0])) ! 262: /* Move the second word first. */ ! 263: return \"mov.w %f1,%f0\;mov.w %e1,%e0\"; ! 264: else ! 265: return \"mov.w %e1,%e0\;mov.w %f1,%f0\"; ! 266: ! 267: case 3: ! 268: return \"mov.w %e1,%e0\;mov.w %f1,%f0\"; ! 269: case 4: ! 270: return \"mov.w %f1,%T0\;mov.w %e1,%T0\"; ! 271: } ! 272: }" ! 273: [(set_attr "type" "move") ! 274: (set_attr "length" "4,4,8,8,4") ! 275: (set_attr "cc" "clobber")]) ! 276: ! 277: (define_insn "" ! 278: [(set (match_operand:SF 0 "push_operand" "=<") ! 279: (match_operand:SF 1 "register_operand" "l"))] ! 280: "" ! 281: "mov.w %f1,%T0\;mov.w %e1,%T0" ! 282: [(set_attr "type" "move") ! 283: (set_attr "length" "4") ! 284: (set_attr "cc" "clobber")]) ! 285: ! 286: (define_expand "movsf" ! 287: [(set (match_operand:SF 0 "general_operand_dst" "") ! 288: (match_operand:SF 1 "general_operand_src" ""))] ! 289: "" ! 290: "if (domovsi (operands)) DONE;") ! 291: ! 292: ;; Block move ! 293: ! 294: (define_expand "movstrhi" ! 295: [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" "")) ! 296: (mem:BLK (match_operand:BLK 1 "general_operand" ""))) ! 297: (use (match_operand:HI 2 "general_operand" "")) ! 298: (use (match_operand:HI 3 "immediate_operand" "")) ! 299: (clobber (match_dup 3)) ! 300: ])] ! 301: "" ! 302: " ! 303: { ! 304: rtx src_ptr = copy_to_mode_reg (Pmode, XEXP (operands[1], 0)); ! 305: rtx dst_ptr = copy_to_mode_reg (Pmode, XEXP (operands[0], 0)); ! 306: ! 307: enum machine_mode mode = INTVAL (operands[3]) >=2 ? HImode : QImode; ! 308: rtx tmpreg = gen_reg_rtx (mode); ! 309: rtx increment = mode == QImode ? const1_rtx : const2_rtx; ! 310: rtx length = operands[2]; ! 311: rtx label = gen_label_rtx (); ! 312: rtx end_src_ptr = gen_reg_rtx (Pmode); ! 313: ! 314: emit_insn (gen_rtx (SET, VOIDmode, end_src_ptr, ! 315: gen_rtx (PLUS, Pmode, src_ptr, length))); ! 316: ! 317: emit_label (label); ! 318: emit_move_insn (tmpreg, gen_rtx (MEM, mode, src_ptr)); ! 319: emit_move_insn (gen_rtx (MEM, mode, dst_ptr), tmpreg); ! 320: emit_insn (gen_rtx (SET, VOIDmode, src_ptr, ! 321: gen_rtx (PLUS, Pmode, src_ptr, increment))); ! 322: emit_insn (gen_rtx (SET, VOIDmode, dst_ptr, ! 323: gen_rtx (PLUS, Pmode, dst_ptr, increment))); ! 324: ! 325: emit_insn (gen_rtx (SET, VOIDmode, cc0_rtx, ! 326: gen_rtx (COMPARE, HImode, src_ptr, end_src_ptr))); ! 327: emit_jump_insn (gen_bne (label)); ! 328: ! 329: DONE; ! 330: } ! 331: ") ! 332: ! 333: ;; ---------------------------------------------------------------------- ! 334: ;; Test instructions ! 335: ;; ---------------------------------------------------------------------- ! 336: ! 337: (define_insn "tstqi" ! 338: [(set (cc0) ! 339: (match_operand:QI 0 "register_operand" "ra"))] ! 340: "" ! 341: "cmp.b #0,%X0" ! 342: [(set_attr "type" "arith") ! 343: (set_attr "length" "2") ! 344: (set_attr "cc" "set")]) ! 345: ! 346: (define_insn "tsthi" ! 347: [(set (cc0) ! 348: (match_operand:HI 0 "register_operand" "ra"))] ! 349: "" ! 350: "mov.w %T0,%T0" ! 351: [(set_attr "type" "arith") ! 352: (set_attr "length" "2") ! 353: (set_attr "cc" "set")]) ! 354: ! 355: (define_insn "cmphi" ! 356: [(set (cc0) ! 357: (compare:HI (match_operand:HI 0 "register_operand" "ra") ! 358: (match_operand:HI 1 "register_operand" "ra")))] ! 359: "" ! 360: "cmp.w %T1,%T0" ! 361: [(set_attr "type" "arith") ! 362: (set_attr "length" "2") ! 363: (set_attr "cc" "compare")]) ! 364: ! 365: (define_insn "cmpqi" ! 366: [(set (cc0) ! 367: (compare:QI (match_operand:QI 0 "register_operand" "ra") ! 368: (match_operand:QI 1 "nonmemory_operand" "rai")))] ! 369: "" ! 370: "cmp.b %X1,%X0" ! 371: [(set_attr "type" "arith") ! 372: (set_attr "length" "2") ! 373: (set_attr "cc" "compare")]) ! 374: ! 375: ;; ---------------------------------------------------------------------- ! 376: ;; Add instructions ! 377: ;; ---------------------------------------------------------------------- ! 378: ! 379: (define_insn "" ! 380: [(set (match_operand:HI 0 "register_operand" "=ra,ra,ra,ra,r,ra") ! 381: (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0") ! 382: (match_operand:HI 2 "nonmemory_operand" "K,M,L,N,n,ra")))] ! 383: "" ! 384: "@ ! 385: adds %T2,%T0 ! 386: adds #2,%T0\;adds %C2,%T0 ! 387: subs %M2,%T0 ! 388: subs #2,%T0\;subs %M2,%T0 ! 389: add.b %s2,%s0\;addx %t2,%t0 ! 390: add.w %T2,%T0" ! 391: [(set_attr "type" "multi,multi,multi,multi,multi,arith") ! 392: (set_attr "length" "2,4,2,4,4,2") ! 393: (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,clobber,set")]) ! 394: ! 395: (define_expand "addhi3" ! 396: [(set (match_operand:HI 0 "register_operand" "") ! 397: (plus:HI (match_operand:HI 1 "register_operand" "") ! 398: (match_operand:HI 2 "nonmemory_operand" "")))] ! 399: "" ! 400: " ! 401: { ! 402: if (operands[0] != operands[1]) ! 403: emit_move_insn (operands[0], operands[1]); ! 404: }") ! 405: ! 406: (define_insn "addqi3" ! 407: [(set (match_operand:QI 0 "register_operand" "=r") ! 408: (plus:QI (match_operand:QI 1 "register_operand" "%0") ! 409: (match_operand:QI 2 "nonmemory_operand" "ri")))] ! 410: "" ! 411: "add.b %X2,%X0" ! 412: [(set_attr "type" "arith") ! 413: (set_attr "length" "2") ! 414: (set_attr "cc" "set")]) ! 415: ! 416: (define_insn "" ! 417: [(set (match_operand:SI 0 "register_operand" "=l,l") ! 418: (plus:SI (match_operand:SI 1 "register_operand" "%0,0") ! 419: (match_operand:SI 2 "nonmemory_operand" "l,n"))) ! 420: (clobber (match_operand:HI 3 "register_operand" "=&l,l"))] ! 421: "" ! 422: "@ ! 423: add %w2,%w0\;addx %x2,%x0\;addx %y2,%y0\;addx %z2,%z0 ! 424: add.w %f2,%f0\;addx %y2,%y0\;addx %z2,%z0" ! 425: [(set_attr "type" "multi") ! 426: (set_attr "length" "8,6") ! 427: (set_attr "cc" "clobber")]) ! 428: ! 429: (define_insn "" ! 430: [(set (match_operand:SI 0 "register_operand" "=l,l") ! 431: (plus:SI (match_operand:SI 1 "register_operand" "%0,0") ! 432: (match_operand:SI 2 "nonmemory_operand" "n,r")))] ! 433: "" ! 434: "@ ! 435: add %w2,%w0\;addx %x2,%x0\;addx %y2,%y0\;addx %z2,%z0 ! 436: add.w %f2,%f0\;addx %y2,%y0\;addx %z2,%z0" ! 437: [(set_attr "type" "arith") ! 438: (set_attr "length" "8,6") ! 439: (set_attr "cc" "clobber")]) ! 440: ! 441: (define_expand "addsi3" ! 442: [(set (match_dup 3) (match_operand:SI 1 "register_operand" "")) ! 443: (set (match_dup 3) ! 444: (plus:SI (match_dup 3) ! 445: (match_operand:SI 2 "nonmemory_operand" ""))) ! 446: (set (match_operand:SI 0 "register_operand" "") (match_dup 3))] ! 447: "" ! 448: " ! 449: { ! 450: operands[3] = gen_rtx (REG, SImode, 0); ! 451: }") ! 452: ! 453: ;; ----------------------------------------------------------------------; ! 454: ;; Subtract instructions ! 455: ;; ---------------------------------------------------------------------- ! 456: ! 457: (define_insn "" ! 458: [(set (match_operand:HI 0 "register_operand" "=ra,ra,ra,r") ! 459: (minus:HI (match_operand:HI 1 "general_operand" "0,0,0,0") ! 460: (match_operand:HI 2 "nonmemory_operand" "K,M,ra,n")))] ! 461: "" ! 462: "@ ! 463: subs %T2,%T0 ! 464: subs #2,%T0\;subs %E2,%T0 ! 465: sub.w %T2,%T0 ! 466: add.b %E2,%s0\;addx %F2,%t0 ; -%0" ! 467: [(set_attr "type" "multi") ! 468: (set_attr "length" "2,4,2,4") ! 469: (set_attr "cc" "none_0hit,none_0hit,set,clobber")]) ! 470: ! 471: (define_insn "subqi3" ! 472: [(set (match_operand:QI 0 "register_operand" "=r,r") ! 473: (minus:QI (match_operand:QI 1 "register_operand" "0,0") ! 474: (match_operand:QI 2 "nonmemory_operand" "r,i")))] ! 475: "" ! 476: "@ ! 477: sub.b %X2,%X0 ! 478: add.b %G2,%X0" ! 479: [(set_attr "type" "arith") ! 480: (set_attr "length" "2") ! 481: (set_attr "cc" "set")]) ! 482: ! 483: (define_expand "subhi3" ! 484: [(set (match_operand:HI 0 "register_operand" "") ! 485: (minus:HI (match_operand:HI 1 "register_operand" "") ! 486: (match_operand:HI 2 "nonmemory_operand" "")))] ! 487: "" ! 488: " ! 489: { ! 490: if (operands[0] != operands[1]) ! 491: emit_move_insn (operands[0], operands[1]); ! 492: }") ! 493: ! 494: (define_insn "" ! 495: [(set (match_operand:SI 0 "register_operand" "=l") ! 496: (minus:SI (match_operand:SI 1 "register_operand" "%0") ! 497: (match_operand:SI 2 "register_operand" "l")))] ! 498: "" ! 499: "sub.w %f2,%f0\;subx %y2,%y0\;subx %z2,%z0" ! 500: [(set_attr "type" "arith") ! 501: (set_attr "length" "6") ! 502: (set_attr "cc" "clobber")]) ! 503: ! 504: (define_expand "subsi3" ! 505: [(set (match_dup 3) (match_operand:SI 1 "register_operand" "")) ! 506: (set (match_dup 3) ! 507: (minus:SI (match_dup 3) ! 508: (match_operand:SI 2 "nonmemory_operand" ""))) ! 509: (set (match_operand:SI 0 "register_operand" "") (match_dup 3))] ! 510: "" ! 511: "operands[3] = gen_rtx (REG, SImode, 0);") ! 512: ! 513: ;; ---------------------------------------------------------------------- ! 514: ;; Multiply instruction ! 515: ;; ---------------------------------------------------------------------- ! 516: ! 517: (define_insn "umulqihi3" ! 518: [(set (match_operand:HI 0 "register_operand" "=r") ! 519: (mult:HI (match_operand:QI 1 "general_operand" "%0") ! 520: (match_operand:QI 2 "register_operand" "r")))] ! 521: "" ! 522: "mulxu %X2,%T0" ! 523: [(set_attr "type" "multi") ! 524: (set_attr "length" "2") ! 525: (set_attr "cc" "none_0hit")]) ! 526: ! 527: ;; ---------------------------------------------------------------------- ! 528: ;; Divide instructions ! 529: ;; ---------------------------------------------------------------------- ! 530: ! 531: (define_insn "udivqi3" ! 532: [(set (match_operand:QI 0 "register_operand" "=r") ! 533: (udiv:QI (match_operand:HI 1 "general_operand" "0") ! 534: (match_operand:QI 2 "register_operand" "r")))] ! 535: "" ! 536: "divxu %X2,%T0" ! 537: [(set_attr "type" "multi") ! 538: (set_attr "length" "2") ! 539: (set_attr "cc" "clobber")]) ! 540: ! 541: (define_insn "divqi3" ! 542: [(set (match_operand:QI 0 "register_operand" "=r") ! 543: (div:QI (match_operand:HI 1 "general_operand" "0") ! 544: (match_operand:QI 2 "register_operand" "r")))] ! 545: "" ! 546: "divxu %X2,%T0" ! 547: [(set_attr "type" "multi") ! 548: (set_attr "length" "2") ! 549: (set_attr "cc" "clobber")]) ! 550: ! 551: ;; ---------------------------------------------------------------------- ! 552: ;; And instructions ! 553: ;; ---------------------------------------------------------------------- ! 554: ! 555: (define_insn "andqi3" ! 556: [(set (match_operand:QI 0 "general_operand" "=r") ! 557: (and:QI (match_operand:QI 1 "general_operand" "%0") ! 558: (match_operand:QI 2 "general_operand" "rn")))] ! 559: "" ! 560: "and %X2,%X0" ! 561: [(set_attr "type" "arith") ! 562: (set_attr "length" "2") ! 563: (set_attr "cc" "set")]) ! 564: ! 565: (define_insn "andhi3" ! 566: [(set (match_operand:HI 0 "register_operand" "=r") ! 567: (and:HI (match_operand:HI 1 "register_operand" "%0") ! 568: (match_operand:HI 2 "general_operand" "ri")))] ! 569: "" ! 570: "and %s2,%s0\;and %t2,%t0" ! 571: [(set_attr "type" "multi") ! 572: (set_attr "length" "4") ! 573: (set_attr "cc" "clobber")]) ! 574: ! 575: ;; ---------------------------------------------------------------------- ! 576: ;; Or instructions ! 577: ;; ---------------------------------------------------------------------- ! 578: ! 579: (define_insn "iorqi3" ! 580: [(set (match_operand:QI 0 "general_operand" "=r,U") ! 581: (ior:QI (match_operand:QI 1 "general_operand" "%0,0") ! 582: (match_operand:QI 2 "general_operand" "rn,P")))] ! 583: "" ! 584: "@ ! 585: or %X2,%X0 ! 586: bset %V2,%X0" ! 587: [(set_attr "type" "arith") ! 588: (set_attr "length" "2,4") ! 589: (set_attr "cc" "set,none_0hit")]) ! 590: ! 591: (define_insn "iorhi3" ! 592: [(set (match_operand:HI 0 "general_operand" "=r,r") ! 593: (ior:HI (match_operand:HI 1 "general_operand" "%0,0") ! 594: (match_operand:HI 2 "general_operand" "J,ri")))] ! 595: "" ! 596: "@ ! 597: or %s2,%s0 ! 598: or %s2,%s0\;or %t2,%t0" ! 599: [(set_attr "type" "multi") ! 600: (set_attr "length" "2,4") ! 601: (set_attr "cc" "clobber,clobber")]) ! 602: ! 603: ;; ---------------------------------------------------------------------- ! 604: ;; Xor instructions ! 605: ;; ---------------------------------------------------------------------- ! 606: ! 607: (define_insn "xorqi3" ! 608: [(set (match_operand:QI 0 "general_operand" "=r") ! 609: (xor:QI (match_operand:QI 1 "general_operand" "%0") ! 610: (match_operand:QI 2 "nonmemory_operand" "ri")))] ! 611: "" ! 612: "xor %X2,%X0" ! 613: [(set_attr "type" "arith") ! 614: (set_attr "length" "2") ! 615: (set_attr "cc" "set")]) ! 616: ! 617: (define_insn "xorhi3" ! 618: [(set (match_operand:HI 0 "general_operand" "=r") ! 619: (xor:HI (match_operand:HI 1 "general_operand" "%0") ! 620: (match_operand:HI 2 "nonmemory_operand" "ri")))] ! 621: "" ! 622: "xor %s2,%s0\;xor %t2,%t0" ! 623: [(set_attr "type" "multi") ! 624: (set_attr "length" "4") ! 625: (set_attr "cc" "clobber")]) ! 626: ! 627: ;; ---------------------------------------------------------------------- ! 628: ;; Negation instructions ! 629: ;; ---------------------------------------------------------------------- ! 630: ! 631: (define_insn "negqi2" ! 632: [(set (match_operand:QI 0 "register_operand" "=r") ! 633: (neg:QI (match_operand:QI 1 "general_operand" "0")))] ! 634: "" ! 635: "neg %X0" ! 636: [(set_attr "type" "arith") ! 637: (set_attr "length" "2") ! 638: (set_attr "cc" "set")]) ! 639: ! 640: (define_expand "neghi2" ! 641: [(set (match_dup 2) ! 642: (not:HI (match_operand:HI 1 "register_operand" "r"))) ! 643: (set (match_dup 2) (plus:HI (match_dup 2) (const_int 1))) ! 644: (set (match_operand:HI 0 "register_operand" "=r") ! 645: (match_dup 2))] ! 646: "" ! 647: "operands[2] = gen_reg_rtx (HImode);") ! 648: ! 649: (define_expand "negsi2" ! 650: [(set (match_dup 2) ! 651: (not:SI (match_operand:SI 1 "register_operand" "r"))) ! 652: (set (match_dup 2) (plus:SI (match_dup 2) (const_int 1))) ! 653: (set (match_operand:SI 0 "register_operand" "=r") ! 654: (match_dup 2))] ! 655: "" ! 656: "operands[2] = gen_reg_rtx (SImode);") ! 657: ! 658: ;; ---------------------------------------------------------------------- ! 659: ;; Not instructions ! 660: ;; ---------------------------------------------------------------------- ! 661: ! 662: (define_insn "one_cmplqi2" ! 663: [(set (match_operand:QI 0 "register_operand" "=r") ! 664: (not:QI (match_operand:QI 1 "general_operand" "0")))] ! 665: "" ! 666: "not %X0" ! 667: [(set_attr "type" "arith") ! 668: (set_attr "length" "2") ! 669: (set_attr "cc" "set")]) ! 670: ! 671: (define_insn "one_cmplhi2" ! 672: [(set (match_operand:HI 0 "register_operand" "=r") ! 673: (not:HI (match_operand:HI 1 "general_operand" "0")))] ! 674: "" ! 675: "not %s0\;not %t0" ! 676: [(set_attr "type" "arith") ! 677: (set_attr "length" "4") ! 678: (set_attr "cc" "clobber")]) ! 679: ! 680: (define_insn "one_cmplsi2" ! 681: [(set (match_operand:SI 0 "register_operand" "=r") ! 682: (not:SI (match_operand:SI 1 "general_operand" "0")))] ! 683: "" ! 684: "not %w0\;not %x0\;not %y0\;not %z0" ! 685: [(set_attr "type" "arith") ! 686: (set_attr "length" "8") ! 687: (set_attr "cc" "clobber")]) ! 688: ! 689: ;; ---------------------------------------------------------------------- ! 690: ;; Conditional branches ! 691: ;; ---------------------------------------------------------------------- ! 692: ! 693: (define_expand "ble" ! 694: [(set (pc) ! 695: (if_then_else (le (cc0) ! 696: (const_int 0)) ! 697: (label_ref (match_operand 0 "" "")) ! 698: (pc)))] ! 699: "" ! 700: "") ! 701: ! 702: (define_expand "bleu" ! 703: [(set (pc) ! 704: (if_then_else (leu (cc0) ! 705: (const_int 0)) ! 706: (label_ref (match_operand 0 "" "")) ! 707: (pc)))] ! 708: "" ! 709: "") ! 710: ! 711: (define_expand "bge" ! 712: [(set (pc) ! 713: (if_then_else (ge (cc0) ! 714: (const_int 0)) ! 715: (label_ref (match_operand 0 "" "")) ! 716: (pc)))] ! 717: "" ! 718: "") ! 719: ! 720: (define_expand "bgeu" ! 721: [(set (pc) ! 722: (if_then_else (geu (cc0) ! 723: (const_int 0)) ! 724: (label_ref (match_operand 0 "" "")) ! 725: (pc)))] ! 726: "" ! 727: "") ! 728: ! 729: (define_expand "blt" ! 730: [(set (pc) ! 731: (if_then_else (lt (cc0) ! 732: (const_int 0)) ! 733: (label_ref (match_operand 0 "" "")) ! 734: (pc)))] ! 735: "" ! 736: "") ! 737: ! 738: (define_expand "bltu" ! 739: [(set (pc) ! 740: (if_then_else (ltu (cc0) ! 741: (const_int 0)) ! 742: (label_ref (match_operand 0 "" "")) ! 743: (pc)))] ! 744: "" ! 745: "") ! 746: ! 747: (define_expand "bgt" ! 748: [(set (pc) ! 749: (if_then_else (gt (cc0) ! 750: (const_int 0)) ! 751: (label_ref (match_operand 0 "" "")) ! 752: (pc)))] ! 753: "" ! 754: "") ! 755: ! 756: (define_expand "bgtu" ! 757: [(set (pc) ! 758: (if_then_else (gtu (cc0) ! 759: (const_int 0)) ! 760: (label_ref (match_operand 0 "" "")) ! 761: (pc)))] ! 762: "" ! 763: "") ! 764: ! 765: (define_expand "beq" ! 766: [(set (pc) ! 767: (if_then_else (eq (cc0) ! 768: (const_int 0)) ! 769: (label_ref (match_operand 0 "" "")) ! 770: (pc)))] ! 771: "" ! 772: "") ! 773: ! 774: (define_expand "bne" ! 775: [(set (pc) ! 776: (if_then_else (ne (cc0) ! 777: (const_int 0)) ! 778: (label_ref (match_operand 0 "" "")) ! 779: (pc)))] ! 780: "" ! 781: "") ! 782: ! 783: (define_insn "" ! 784: [(set (pc) ! 785: (if_then_else ! 786: (match_operator 1 "comparison_operator" [(cc0) (const_int 0)]) ! 787: (label_ref (match_operand 0 "" "")) ! 788: (pc)))] ! 789: "" ! 790: "* ! 791: { ! 792: if (get_attr_length (insn) == 2) ! 793: return \"b%j1 %l0\"; ! 794: else ! 795: return \"b%k1 %L0\;jmp @%l0\;%L0:\"; ! 796: }" ! 797: [(set_attr "type" "branch") ! 798: (set_attr "cc" "none")]) ! 799: ! 800: (define_insn "" ! 801: [(set (pc) ! 802: (if_then_else ! 803: (match_operator 1 "comparison_operator" [(cc0) (const_int 0)]) ! 804: (pc) ! 805: (label_ref (match_operand 0 "" ""))))] ! 806: "" ! 807: "* ! 808: { ! 809: if (get_attr_length (insn) == 2) ! 810: return \"b%k1 %l0\"; ! 811: else ! 812: return \"b%j1 %L0\;jmp @%l0\;%L0:\"; ! 813: }" ! 814: [(set_attr "type" "branch") ! 815: (set_attr "cc" "none")]) ! 816: ! 817: ;; ---------------------------------------------------------------------- ! 818: ;; Unconditional branches ! 819: ;; ---------------------------------------------------------------------- ! 820: ! 821: (define_insn "jump" ! 822: [(set (pc) ! 823: (label_ref (match_operand 0 "" "")))] ! 824: "" ! 825: "* ! 826: { ! 827: if (get_attr_length (insn) == 2) ! 828: return \"bra %l0\"; ! 829: else ! 830: return \"jmp @%l0\"; ! 831: }" ! 832: [(set_attr "type" "branch") ! 833: (set_attr "cc" "none")]) ! 834: ! 835: (define_insn "tablejump" ! 836: [(set (pc) (match_operand:HI 0 "register_operand" "")) ! 837: (use (label_ref (match_operand 1 "" "")))] ! 838: "" ! 839: "jmp @%0" ! 840: [(set_attr "type" "branch") ! 841: (set_attr "cc" "none") ! 842: (set_attr "length" "2")]) ! 843: ! 844: ;; Call subroutine with no return value. ! 845: ! 846: (define_insn "call" ! 847: [(call (match_operand:QI 0 "memory_operand" "o") ! 848: (match_operand:HI 1 "general_operand" "g"))] ! 849: "" ! 850: "jsr %0" ! 851: [(set_attr "type" "call") ! 852: (set_attr "cc" "clobber") ! 853: (set_attr "length" "4")]) ! 854: ! 855: ;; Call subroutine, returning value in operand 0 ! 856: ;; (which must be a hard register). ! 857: ! 858: (define_insn "call_value" ! 859: [(set (match_operand 0 "" "=r") ! 860: (call (match_operand:QI 1 "memory_operand" "o") ! 861: (match_operand:HI 2 "general_operand" "g")))] ! 862: "" ! 863: "jsr %1" ! 864: [(set_attr "type" "call") ! 865: (set_attr "cc" "clobber") ! 866: (set_attr "length" "4")]) ! 867: ! 868: (define_insn "nop" ! 869: [(const_int 0)] ! 870: "" ! 871: "nop" ! 872: [(set_attr "type" "multi") ! 873: (set_attr "cc" "none") ! 874: (set_attr "length" "2")]) ! 875: ! 876: (define_insn "indirect_jump" ! 877: [(set (pc) (match_operand:HI 0 "register_operand" "r"))] ! 878: "" ! 879: "jmp @%0" ! 880: [(set_attr "type" "branch") ! 881: (set_attr "cc" "none") ! 882: (set_attr "length" "2")]) ! 883: ! 884: ;; ----------------------------------------------------------------- ! 885: ;; Shifts ! 886: ;; ----------------------------------------------------------------- ! 887: ! 888: ;; All H8 shifts go one bit at a time, here they are defined with names ! 889: ;; so can use them in the expands.. ! 890: ! 891: ;; QI BIT SHIFTS ! 892: ! 893: (define_insn "ashlqi3_one" ! 894: [(set (match_operand:QI 0 "register_operand" "=r") ! 895: (ashift:QI (match_operand:QI 1 "register_operand" "0") ! 896: (const_int 1)))] ! 897: "" ! 898: "shal %X0" ! 899: [(set_attr "type" "arith") ! 900: (set_attr "length" "2") ! 901: (set_attr "cc" "set")]) ! 902: ! 903: (define_insn "ashrqi3_one" ! 904: [(set (match_operand:QI 0 "register_operand" "=r") ! 905: (ashiftrt:QI (match_operand:QI 1 "register_operand" "0") ! 906: (const_int 1)))] ! 907: "" ! 908: "shar %X0" ! 909: [(set_attr "type" "arith") ! 910: (set_attr "length" "2") ! 911: (set_attr "cc" "set")]) ! 912: ! 913: (define_insn "lshrqi3_one" ! 914: [(set (match_operand:QI 0 "register_operand" "=r") ! 915: (lshiftrt:QI (match_operand:QI 1 "register_operand" "0") ! 916: (const_int 1)))] ! 917: "" ! 918: "shlr %X0" ! 919: [(set_attr "type" "arith") ! 920: (set_attr "length" "2") ! 921: (set_attr "cc" "set")]) ! 922: ! 923: (define_expand "ashlqi3" ! 924: [(set (match_operand:QI 0 "register_operand" "=r") ! 925: (ashift:QI (match_operand:QI 1 "register_operand" "0") ! 926: (match_operand:QI 2 "nonmemory_operand" "rn")))] ! 927: "" ! 928: " ! 929: { ! 930: if (can_shift (ASHIFT, operands, gen_ashlqi3_one, 4, 0)) ! 931: DONE; ! 932: else ! 933: FAIL; ! 934: }") ! 935: ! 936: (define_expand "ashrqi3" ! 937: [(set (match_operand:QI 0 "register_operand" "=r") ! 938: (ashiftrt:QI (match_operand:QI 1 "register_operand" "0") ! 939: (match_operand:QI 2 "nonmemory_operand" "rn")))] ! 940: "" ! 941: " ! 942: { ! 943: if (can_shift (ASHIFTRT, operands, gen_ashrqi3_one, 4, 0)) ! 944: DONE; ! 945: else ! 946: FAIL; ! 947: }") ! 948: ! 949: (define_expand "lshrqi3" ! 950: [(set (match_operand:QI 0 "register_operand" "=r") ! 951: (lshiftrt:QI (match_operand:QI 1 "register_operand" "0") ! 952: (match_operand:QI 2 "nonmemory_operand" "rn")))] ! 953: "" ! 954: " ! 955: { ! 956: if (can_shift (LSHIFTRT, operands, gen_lshrqi3_one, 4, 0)) ! 957: DONE; ! 958: else ! 959: FAIL; ! 960: }") ! 961: ! 962: ;; HI BIT SHIFTS ! 963: ! 964: (define_insn "ashlhi3_one" ! 965: [(set (match_operand:HI 0 "register_operand" "=r") ! 966: (ashift:HI (match_operand:HI 1 "register_operand" "0") ! 967: (const_int 1)))] ! 968: "" ! 969: "add.w %T1,%T0" ! 970: [(set_attr "type" "multi") ! 971: (set_attr "length" "4") ! 972: (set_attr "cc" "set")]) ! 973: ! 974: (define_insn "ashlhi3_eight" ! 975: [(set (match_operand:HI 0 "register_operand" "=r") ! 976: (ashift:HI (match_operand:HI 1 "register_operand" "0") ! 977: (const_int 8)))] ! 978: "" ! 979: "mov.b %s1,%t0\;mov.b #0,%s0" ! 980: [(set_attr "type" "multi") ! 981: (set_attr "length" "4") ! 982: (set_attr "cc" "clobber")]) ! 983: ! 984: (define_expand "ashlhi3" ! 985: [(set (match_operand:HI 0 "register_operand" "") ! 986: (ashift:HI ! 987: (match_operand:HI 1 "general_operand_src" "") ! 988: (match_operand:HI 2 "nonmemory_operand" "")))] ! 989: "" ! 990: " ! 991: { ! 992: if (can_shift (ASHIFT, operands, gen_ashlhi3_one, 4, gen_ashlhi3_eight)) ! 993: DONE; ! 994: else ! 995: FAIL; ! 996: }") ! 997: ! 998: (define_insn "lshrhi3_one" ! 999: [(set (match_operand:HI 0 "register_operand" "=r") ! 1000: (lshiftrt:HI (match_operand:HI 1 "register_operand" "0") ! 1001: (const_int 1)))] ! 1002: "" ! 1003: "shlr %t0\;rotxr %s0" ! 1004: [(set_attr "type" "multi") ! 1005: (set_attr "length" "4") ! 1006: (set_attr "cc" "clobber")]) ! 1007: ! 1008: (define_insn "lshlhi3_eight" ! 1009: [(set (match_operand:HI 0 "register_operand" "=r") ! 1010: (lshiftrt:HI (match_operand:HI 1 "register_operand" "0") ! 1011: (const_int 8)))] ! 1012: "" ! 1013: "mov.b %t1,%s0\;mov.b #0,%t0" ! 1014: [(set_attr "type" "multi") ! 1015: (set_attr "length" "4") ! 1016: (set_attr "cc" "clobber")]) ! 1017: ! 1018: (define_expand "lshrhi3" ! 1019: [(set (match_operand:HI 0 "register_operand" "") ! 1020: (lshiftrt:HI ! 1021: (match_operand:HI 1 "general_operand_src" "") ! 1022: (match_operand:HI 2 "nonmemory_operand" "")))] ! 1023: "" ! 1024: " ! 1025: { ! 1026: if (can_shift (LSHIFTRT, operands, gen_lshrhi3_one, 4, gen_lshlhi3_eight)) ! 1027: DONE; ! 1028: else ! 1029: FAIL; ! 1030: }") ! 1031: ! 1032: (define_insn "ashrhi3_one" ! 1033: [(set (match_operand:HI 0 "register_operand" "=r") ! 1034: (ashiftrt:HI (match_operand:HI 1 "register_operand" "0") ! 1035: (const_int 1)))] ! 1036: "" ! 1037: "shar %t0\;rotxr %s0" ! 1038: [(set_attr "type" "multi") ! 1039: (set_attr "length" "4") ! 1040: (set_attr "cc" "clobber")]) ! 1041: ! 1042: ; signed shift right by 8 bits ! 1043: ; fetch the carry bit from the top, copy the byte right, subtract the ! 1044: ; top byte from itself - carry. ! 1045: ! 1046: (define_insn "ashrhi3_eight" ! 1047: [(set (match_operand:HI 0 "register_operand" "=r") ! 1048: (ashiftrt:HI (match_operand:HI 1 "register_operand" "0") ! 1049: (const_int 8)))] ! 1050: "" ! 1051: "bld #7,%t0\;mov.b %t0,%s0\;subx %t0,%t0" ! 1052: [(set_attr "type" "multi") ! 1053: (set_attr "length" "6") ! 1054: (set_attr "cc" "clobber")]) ! 1055: ! 1056: (define_expand "ashrhi3" ! 1057: [(set (match_operand:HI 0 "register_operand" "") ! 1058: (ashiftrt:HI ! 1059: (match_operand:HI 1 "general_operand_src" "") ! 1060: (match_operand:HI 2 "nonmemory_operand" "")))] ! 1061: "" ! 1062: " ! 1063: { ! 1064: if (can_shift (ASHIFTRT, operands, gen_ashrhi3_one, 4, gen_ashrhi3_eight)) ! 1065: DONE; ! 1066: else ! 1067: FAIL; ! 1068: }") ! 1069: ! 1070: ;; SI BIT SHIFTS ! 1071: ! 1072: (define_insn "ashlsi3_one" ! 1073: [(set (match_operand:SI 0 "register_operand" "=r") ! 1074: (ashift:SI (match_operand:SI 1 "register_operand" "0") ! 1075: (const_int 1)))] ! 1076: "" ! 1077: "add.w %f1,%f0\;addx %y1,%y0\;addx %z1,%z0" ! 1078: [(set_attr "type" "multi") ! 1079: (set_attr "length" "6") ! 1080: (set_attr "cc" "clobber")]) ! 1081: ! 1082: (define_expand "ashlsi3" ! 1083: [(set (match_operand:SI 0 "register_operand" "") ! 1084: (ashift:SI ! 1085: (match_operand:SI 1 "general_operand_src" "") ! 1086: (match_operand:SI 2 "nonmemory_operand" "")))] ! 1087: "" ! 1088: " ! 1089: { ! 1090: if (can_shift (ASHIFT, operands, gen_ashlsi3_one, 1, 0)) ! 1091: DONE; ! 1092: else ! 1093: FAIL; ! 1094: }") ! 1095: ! 1096: (define_insn "lshrsi3_one" ! 1097: [(set (match_operand:SI 0 "register_operand" "=r") ! 1098: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0") ! 1099: (const_int 1)))] ! 1100: "" ! 1101: "shlr %z0\;rotxr %y0\;rotxr %x0\;rotxr %w0" ! 1102: [(set_attr "type" "multi") ! 1103: (set_attr "length" "8") ! 1104: (set_attr "cc" "clobber")]) ! 1105: ! 1106: (define_expand "lshrsi3" ! 1107: [(set (match_operand:SI 0 "register_operand" "") ! 1108: (lshiftrt:SI ! 1109: (match_operand:SI 1 "general_operand_src" "") ! 1110: (match_operand:SI 2 "nonmemory_operand" "")))] ! 1111: "" ! 1112: " ! 1113: { ! 1114: if (can_shift (LSHIFTRT, operands, gen_lshrsi3_one, 1, 0)) ! 1115: DONE; ! 1116: else ! 1117: FAIL; ! 1118: }") ! 1119: ! 1120: (define_insn "ashrsi3_one" ! 1121: [(set (match_operand:SI 0 "register_operand" "=r") ! 1122: (ashiftrt:SI (match_operand:SI 1 "register_operand" "0") ! 1123: (const_int 1)))] ! 1124: "" ! 1125: "shar %z0\;rotxr %y0\;rotxr %x0\;rotxr %w0" ! 1126: [(set_attr "type" "multi") ! 1127: (set_attr "length" "16") ! 1128: (set_attr "cc" "clobber")]) ! 1129: ! 1130: (define_expand "ashrsi3" ! 1131: [(set (match_operand:SI 0 "register_operand" "") ! 1132: (ashiftrt:SI ! 1133: (match_operand:SI 1 "general_operand_src" "") ! 1134: (match_operand:SI 2 "nonmemory_operand" "")))] ! 1135: "" ! 1136: " ! 1137: { ! 1138: if (can_shift (ASHIFTRT, operands, gen_ashrsi3_one, 1, 0)) ! 1139: DONE; ! 1140: else ! 1141: FAIL; ! 1142: }") ! 1143: ! 1144: ;; ---------------------------------------------------------------------- ! 1145: ;; BIT FIELDS ! 1146: ;; ---------------------------------------------------------------------- ! 1147: ! 1148: (define_insn "" ! 1149: [(set (zero_extract:HI (match_operand:HI 0 "register_operand" "+r") ! 1150: (const_int 1) ! 1151: (match_operand:HI 2 "general_operand" "g")) ! 1152: (match_operand:HI 3 "general_operand" "r"))] ! 1153: "" ! 1154: "bld #0,%3l\;bst %Z2,%0%Y1" ! 1155: [(set_attr "type" "multi") ! 1156: (set_attr "length" "4") ! 1157: (set_attr "cc" "clobber")]) ! 1158: ! 1159: (define_expand "insv" ! 1160: [(set (zero_extract:HI (match_operand:HI 0 "register_operand" "+r") ! 1161: (match_operand:HI 1 "general_operand" "g") ! 1162: (match_operand:HI 2 "general_operand" "g")) ! 1163: (match_operand:HI 3 "general_operand" "r"))] ! 1164: "" ! 1165: "if (INTVAL (operands[1]) != 1) FAIL;") ! 1166: ! 1167: (define_insn "" ! 1168: [(set (match_operand:HI 0 "register_operand" "=&r") ! 1169: (zero_extract:HI (match_operand:HI 1 "register_operand" "r") ! 1170: (const_int 1) ! 1171: (match_operand:HI 3 "general_operand" "g")))] ! 1172: "" ! 1173: "sub.w %T0,%T0\;bld %Z3,%T1%Y1\;rotxl %T0l" ! 1174: [(set_attr "type" "multi") ! 1175: (set_attr "length" "6") ! 1176: (set_attr "cc" "clobber")]) ! 1177: ! 1178: (define_insn "" ! 1179: [(set (match_operand:HI 0 "register_operand" "=r") ! 1180: (sign_extract:HI (match_operand:HI 1 "register_operand" "r") ! 1181: (const_int 1) ! 1182: (match_operand:HI 3 "general_operand" "g")))] ! 1183: "" ! 1184: "bld %Z3,%1%Y1\;sub.x %0l,%0l\;mov.b %0l,%0h" ! 1185: [(set_attr "type" "multi") ! 1186: (set_attr "length" "6") ! 1187: (set_attr "cc" "clobber")]) ! 1188: ! 1189: (define_expand "extzv" ! 1190: [(set (match_operand:HI 0 "register_operand" "") ! 1191: (zero_extract:HI (match_operand:HI 1 "register_operand" "") ! 1192: (match_operand:HI 2 "general_operand" "") ! 1193: (match_operand:HI 3 "general_operand" "")))] ! 1194: "" ! 1195: "if (INTVAL (operands[2]) != 1) FAIL;") ! 1196: ! 1197: (define_expand "extv" ! 1198: [(set (match_operand:HI 0 "register_operand" "") ! 1199: (sign_extract:HI (match_operand:HI 1 "register_operand" "") ! 1200: (match_operand:HI 2 "general_operand" "") ! 1201: (match_operand:HI 3 "immediate_operand" "")))] ! 1202: "" ! 1203: "if (INTVAL (operands[2]) != 1) FAIL;") ! 1204: ! 1205: ;; ---------------------------------------------------------------------- ! 1206: ;; Conversions ! 1207: ;; ---------------------------------------------------------------------- ! 1208: ! 1209: (define_insn "zero_extendqihi2" ! 1210: [(set (match_operand:HI 0 "register_operand" "=r") ! 1211: (zero_extend:HI ! 1212: (match_operand:QI 1 "general_operand" "g")))] ! 1213: "" ! 1214: "mov.b %X1,%s0\;mov.b #0,%t0" ! 1215: [(set_attr "type" "multi") ! 1216: (set_attr "length" "4") ! 1217: (set_attr "cc" "clobber")]) ! 1218: ! 1219: (define_insn "extendqihi2" ! 1220: [(set (match_operand:HI 0 "register_operand" "=r") ! 1221: (sign_extend:HI ! 1222: (match_operand:QI 1 "register_operand" "r")))] ! 1223: "" ! 1224: "* ! 1225: { ! 1226: if (REGNO (operands[1]) != REGNO (operands[0])) ! 1227: return \"mov.b %X1,%s0\;bld #7,%s0\;subx %t0,%t0\"; ! 1228: else ! 1229: return \"bld #7,%s0\;subx %t0,%t0\"; ! 1230: }" ! 1231: [(set_attr "type" "multi") ! 1232: (set_attr "length" "6") ! 1233: (set_attr "cc" "clobber")]) ! 1234: ! 1235: (define_insn "extendhisi2_one" ! 1236: [(set (match_operand:SI 0 "register_operand" "=l") ! 1237: (sign_extend:SI (match_operand:HI 1 "register_operand" "0")))] ! 1238: "" ! 1239: "mov.w %T1,%f0\;bld #7,%x0\;subx %y0,%y0\;subx %z0,%z0" ! 1240: [(set_attr "length" "10") ! 1241: (set_attr "cc" "clobber")]) ! 1242: ! 1243: (define_expand "extendhisi2" ! 1244: [(set (reg:HI 1) (match_operand:HI 1 "general_operand" "")) ! 1245: (set (reg:SI 0) (sign_extend:SI (reg:HI 1))) ! 1246: (set (match_operand:SI 0 "general_operand" "" ) (reg:SI 0))] ! 1247: "" ! 1248: "") ! 1249: ! 1250: ;; ---------------------------------------------------------------------- ! 1251: ;; peepholes ! 1252: ;; ---------------------------------------------------------------------- ! 1253: ! 1254: ;; notice a move which could be predecremented ! 1255: ! 1256: (define_peephole ! 1257: [(set (match_operand:HI 1 "register_operand" "") ! 1258: (plus:HI (match_dup 1) (const_int -1))) ! 1259: (set (mem:HI (match_dup 1)) ! 1260: (match_operand:HI 0 "register_operand" ""))] ! 1261: "REGNO (operands[1]) != REGNO (operands[0])" ! 1262: "mov.w %T0,@-%T1" ! 1263: [(set_attr "length" "2") ! 1264: (set_attr "cc" "set")]) ! 1265: ! 1266: (define_peephole ! 1267: [(set (match_operand:HI 1 "register_operand" "") ! 1268: (plus:HI (match_dup 1) (const_int -1))) ! 1269: (set (mem:QI (match_dup 1)) ! 1270: (match_operand:QI 0 "register_operand" ""))] ! 1271: "REGNO (operands[1]) != REGNO (operands[0])" ! 1272: "mov.b %X0,@-%T1" ! 1273: [(set_attr "length" "2") ! 1274: (set_attr "cc" "set")]) ! 1275: ! 1276: ;; notice a move which could be post incremented ! 1277: ! 1278: (define_peephole ! 1279: [(set (match_operand:HI 0 "register_operand" "") ! 1280: (mem:HI (match_operand:HI 1 "register_operand" ""))) ! 1281: (set (match_dup 1) (plus:HI (match_dup 1) (const_int 2)))] ! 1282: "REGNO (operands[1]) != REGNO (operands[0])" ! 1283: "mov.w @%T1+,%T0" ! 1284: [(set_attr "length" "2") ! 1285: (set_attr "cc" "set")]) ! 1286: ! 1287: (define_peephole ! 1288: [(set (match_operand:QI 0 "register_operand" "") ! 1289: (mem:QI (match_operand:HI 1 "register_operand" ""))) ! 1290: (set (match_dup 1) (plus:HI (match_dup 1) (const_int 1)))] ! 1291: "REGNO (operands[1]) != REGNO (operands[0])" ! 1292: "mov.b @%T1+,%X0" ! 1293: [(set_attr "length" "2") ! 1294: (set_attr "cc" "set")]) ! 1295: ! 1296: ;; notice when two byte moves in a row could be a word move ! 1297: ! 1298: (define_peephole ! 1299: [(set (mem:QI (plus:HI (match_operand:HI 1 "register_operand" "ra") ! 1300: (match_operand:HI 2 "immediate_operand" "n"))) ! 1301: (match_operand:QI 0 "register_operand" "r")) ! 1302: (set (mem:QI (plus:HI (match_dup 1) ! 1303: (match_operand:HI 4 "immediate_operand" "n"))) ! 1304: (match_operand:QI 3 "register_operand" "r"))] ! 1305: "(INTVAL (operands[2]) == INTVAL (operands[4]) + 1) ! 1306: && (REGNO (operands[0]) + 1 == REGNO (operands[3]))" ! 1307: "mov.w %T0,@(%u4,%T1)" ! 1308: [(set_attr "length" "6") ! 1309: (set_attr "cc" "set")]) ! 1310: ! 1311: (define_peephole ! 1312: [(set (match_operand:QI 0 "register_operand" "=r") ! 1313: (mem:QI (plus:HI (match_operand:HI 1 "register_operand" "ra") ! 1314: (match_operand:HI 2 "immediate_operand" "n")))) ! 1315: (set (match_operand:QI 3 "register_operand" "=r") ! 1316: (mem:QI (plus:HI (match_dup 1) ! 1317: (match_operand:HI 4 "immediate_operand" "n"))))] ! 1318: "(INTVAL (operands[2]) == INTVAL (operands[4]) + 1) ! 1319: && (REGNO (operands[0]) + 1 == REGNO (operands[3]))" ! 1320: "mov.w @(%u4,%T1),%T0" ! 1321: [(set_attr "length" "6") ! 1322: (set_attr "cc" "set")])
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.