|
|
1.1 root 1: ;;- Machine description for the AT&T DSP1600 for GNU C compiler 1.1.1.2 ! root 2: ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc. 1.1 root 3: ;; Contributed by Michael Collison ([email protected]). 4: 5: ;; This file is part of GNU CC. 6: 7: ;; GNU CC is free software; you can redistribute it and/or modify 8: ;; it under the terms of the GNU General Public License as published by 9: ;; the Free Software Foundation; either version 2, or (at your option) 10: ;; any later version. 11: 12: ;; GNU CC is distributed in the hope that it will be useful, 13: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 14: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15: ;; GNU General Public License for more details. 16: 17: ;; You should have received a copy of the GNU General Public License 18: ;; along with GNU CC; see the file COPYING. If not, write to 1.1.1.2 ! root 19: ;; the Free Software Foundation, 59 Temple Place - Suite 330, ! 20: ;; Boston, MA 02111-1307, USA. 1.1 root 21: 22: 23: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al. 24: 25: ;; Attribute specifications 26: 27: ; Type of each instruction. Default is arithmetic. 28: ; I'd like to write the list as this, but genattrtab won't accept it. 29: ; 30: ; "jump,cond_jump,call, ; flow-control instructions 31: ; load_i,load, store, move ; Y space address arithmetic instructions 32: ; malu,special,f3_alu,f3_alu_i ; data arithmetic unit instructions 33: ; shift_i,shift, bfield_i, bfield ; bit manipulation unit instructions 34: ; arith, ; integer unit instructions 35: ; nop 36: 37: ; Classification of each insn. Some insns of TYPE_BRANCH are multi-word. 38: (define_attr "type" 39: "jump,cond_jump,call,load_i,load,move,store,malu,malu_mul,special,f3_alu,f3_alu_i,shift_i,shift,bfield_i,bfield,nop,ld_short_i" 40: (const_string "malu")) 41: 42: ; Length in # of instructions of each insn. The values are not exact, but 43: ; are safe. 44: (define_attr "length" "" 45: (cond [(eq_attr "type" "cond_jump,f3_alu_i,shift_i,bfield_i,load_i") 46: (const_int 2)] 47: (const_int 1))) 48: 49: 50: ;; .................... 51: ;; 52: ;; Test against 0 instructions 53: ;; 54: ;; .................... 55: 56: (define_expand "tsthi" 57: [(set (cc0) 58: (match_operand:HI 0 "register_operand" ""))] 59: "" 60: " 61: { 62: dsp16xx_compare_gen = gen_tst_reg; 63: dsp16xx_compare_op0 = operands[0]; 64: dsp16xx_compare_op1 = const0_rtx; 65: DONE; 66: }") 67: 68: (define_insn "tsthi_1" 69: [(set (cc0) 70: (match_operand:HI 0 "register_operand" "A"))] 71: "" 72: "%0=%0" 73: [(set_attr "type" "malu")]) 74: 75: (define_expand "tstqi" 76: [(set (cc0) 77: (match_operand:QI 0 "register_operand" ""))] 78: "" 79: " 80: { 81: dsp16xx_compare_gen = gen_tst_reg; 82: dsp16xx_compare_op0 = operands[0]; 83: dsp16xx_compare_op1 = const0_rtx; 84: DONE; 85: }") 86: 87: (define_insn "tstqi_1" 88: [(set (cc0) 89: (match_operand:QI 0 "register_operand" "j,q")) 90: (clobber (match_scratch:QI 1 "=k,u"))] 91: "" 92: "@ 93: %1=0\;%b0-0 94: %1=0\;%b0-0" 95: [(set_attr "type" "malu,malu")]) 96: 97: 98: ;; 99: ;; .................... 100: ;; 101: ;; Bit test instructions 102: ;; 103: ;; .................... 104: 105: (define_insn "" 106: [(set (cc0) 107: (and:HI (match_operand:HI 0 "register_operand" "A,!A,A") 108: (match_operand:HI 1 "nonmemory_operand" "Z,A,I")))] 109: "" 110: "* 111: { 112: switch (which_alternative) 113: { 114: case 0: 115: case 1: 116: return \"%0&%1\"; 117: 118: case 2: 119: return \"%0&%H1\"; 120: } 121: }" 122: [(set_attr "type" "f3_alu,malu,f3_alu_i")]) 123: 124: 125: ;;(define_insn "" 126: ;; [(set (cc0) 127: ;; (and:QI (match_operand:QI 0 "register_operand" "h") 128: ;; (match_operand:QI 1 "const_int_operand" "I")))] 129: ;; "" 130: ;; "%b0&%H1" 131: ;; [(set_attr "type" "f3_alu_i")]) 132: 133: ;; 134: ;; 135: ;; Compare Instructions 136: ;; 137: 138: (define_expand "cmphi" 139: [(parallel [(set (cc0) 140: (compare (match_operand:HI 0 "general_operand" "") 141: (match_operand:HI 1 "general_operand" ""))) 142: (clobber (match_scratch:QI 2 "")) 143: (clobber (match_scratch:QI 3 "")) 144: (clobber (match_scratch:QI 4 "")) 145: (clobber (match_scratch:QI 5 ""))])] 146: "" 147: " 148: { 149: if (GET_CODE (operands[1]) == CONST_INT) 150: operands[1] = force_reg (HImode, operands[1]); 151: 152: if (operands[0]) /* Avoid unused code warning */ 153: { 154: dsp16xx_compare_gen = gen_compare_reg; 155: dsp16xx_compare_op0 = operands[0]; 156: dsp16xx_compare_op1 = operands[1]; 157: DONE; 158: } 159: 160: }") 161: 162: (define_insn "" 163: [(set (cc0) 164: (compare (match_operand:HI 0 "general_operand" "Z*r*m*i") 165: (match_operand:HI 1 "general_operand" "Z*r*m*i"))) 166: (clobber (match_scratch:QI 2 "=&A")) 167: (clobber (match_scratch:QI 3 "=&A")) 168: (clobber (match_scratch:QI 4 "=&A")) 169: (clobber (match_scratch:QI 5 "=&A"))] 170: "(save_next_cc_user_code = next_cc_user_code (insn)) == GTU \ 171: || save_next_cc_user_code == GEU \ 172: || save_next_cc_user_code == LTU \ 173: || save_next_cc_user_code == LEU" 174: "* 175: { 176: if (GET_CODE(operands[0]) == REG) 177: { 178: if (REGNO (operands[0]) == REG_Y || 179: REGNO (operands[0]) == REG_PROD) 180: { 181: output_asm_insn (\"a0=%0\", operands); 182: } 183: else if (IS_YBASE_REGISTER_WINDOW (REGNO(operands[0]))) 184: { 185: output_asm_insn (\"a0=%u0\;a0l=%w0\", operands); 186: } 187: else 1.1.1.2 ! root 188: fatal (\"Invalid register for compare\"); 1.1 root 189: } 190: else if (GET_CODE(operands[0]) == CONST_INT) 191: { 192: output_asm_insn (\"a0=%U0\;a0l=%H0\", operands); 193: } 194: else if (GET_CODE (operands[0]) == MEM) 195: { 196: rtx xoperands[2]; 197: 198: xoperands[0] = gen_rtx (REG, HImode, REG_A0); 199: xoperands[1] = operands[0]; 200: double_reg_from_memory (xoperands); 201: } 202: 203: if (GET_CODE(operands[1]) == REG) 204: { 205: if (REGNO (operands[1]) == REG_Y || 206: REGNO (operands[1]) == REG_PROD) 207: { 208: output_asm_insn (\"a1=%1\", operands); 209: } 210: else if (IS_YBASE_REGISTER_WINDOW (REGNO(operands[1]))) 211: { 212: output_asm_insn (\"a1=%u1\;a1l=%w1\", operands); 213: } 214: else 1.1.1.2 ! root 215: fatal (\"Invalid register for compare\"); 1.1 root 216: } 217: else if (GET_CODE (operands[1]) == MEM) 218: { 219: rtx xoperands[2]; 220: 221: xoperands[0] = gen_rtx (REG, HImode, REG_A1); 222: xoperands[1] = operands[1]; 223: double_reg_from_memory (xoperands); 224: } 225: else if (GET_CODE(operands[1]) == CONST_INT) 226: { 227: output_asm_insn (\"a1=%U1\;a1l=%H1\", operands); 228: } 229: 230: return \"psw = 0\;a0 - a1\"; 231: }") 232: 233: (define_insn "" 234: [(set (cc0) (compare (match_operand:HI 0 "register_operand" "A,!A") 235: (match_operand:HI 1 "register_operand" "Z,*A")))] 236: "" 237: "@ 238: %0-%1 239: %0-%1" 240: [(set_attr "type" "malu,f3_alu")]) 241: 242: (define_expand "cmpqi" 243: [(parallel [(set (cc0) 244: (compare (match_operand:QI 0 "register_operand" "") 245: (match_operand:QI 1 "nonmemory_operand" ""))) 246: (clobber (match_operand:QI 2 "register_operand" "")) 247: (clobber (match_operand:QI 3 "register_operand" ""))])] 248: "" 249: " 250: { 251: if (operands[0]) /* Avoid unused code warning */ 252: { 253: dsp16xx_compare_gen = gen_compare_reg; 254: dsp16xx_compare_op0 = operands[0]; 255: dsp16xx_compare_op1 = operands[1]; 256: DONE; 257: } 258: }") 259: 260: (define_insn "" 261: [(set (cc0) (compare (match_operand:QI 0 "register_operand" "k,k,!k,k,u,u,!u,u") 262: (match_operand:QI 1 "nonmemory_operand" "w,z,u,i,w,z,k,i"))) 263: (clobber (match_scratch:QI 2 "=j,j,j,j,q,q,q,q")) 264: (clobber (match_scratch:QI 3 "=v,y,q,X,v,y,j,X"))] 265: "(save_next_cc_user_code = next_cc_user_code (insn)) == GTU \ 266: || save_next_cc_user_code == GEU \ 267: || save_next_cc_user_code == LTU \ 268: || save_next_cc_user_code == LEU" 269: "@ 270: %2=0\;%3=0\;%2-%3 271: %2=0\;%3=0\;%2-%3 272: %2=0\;%3=0\;%2-%3 273: %2=0\;%0-%H1 274: %2=0\;%3=0\;%2-%3 275: %2=0\;%3=0\;%2-%3 276: %2=0\;%3=0\;%2-%3 277: %2=0\;%0-%H1") 278: 279: 280: (define_insn "" 281: [(set (cc0) (compare (match_operand:QI 0 "register_operand" "j,j,!j,j,q,q,!q,q") 282: (match_operand:QI 1 "nonmemory_operand" "v,y,q,i,v,y,j,i"))) 283: (clobber (match_scratch:QI 2 "=k,k,k,k,u,u,u,u")) 284: (clobber (match_scratch:QI 3 "=w,z,u,X,w,z,k,X"))] 285: "" 286: "@ 287: %2=0\;%3=0\;%0-%1 288: %2=0\;%3=0\;%0-%1 289: %2=0\;%3=0\;%0-%1 290: %2=0\;%b0-%H1 291: %2=0\;%3=0\;%0-%1 292: %2=0\;%3=0\;%0-%1 293: %2=0\;%3=0\;%0-%1 294: %2=0\;%b0-%H1") 295: 296: 297: (define_expand "cmphf" 298: [(set (cc0) 299: (compare (match_operand:HF 0 "register_operand" "") 300: (match_operand:HF 1 "nonmemory_operand" "")))] 301: "" 302: " 303: { 304: if (!dsp16xx_cmphf3_libcall) 305: dsp16xx_cmphf3_libcall = gen_rtx (SYMBOL_REF, Pmode, CMPHF3_LIBCALL); 306: 307: dsp16xx_compare_gen = gen_compare_reg; 308: dsp16xx_compare_op0 = operands[0]; 309: dsp16xx_compare_op1 = operands[1]; 310: emit_library_call (dsp16xx_cmphf3_libcall, 1, HImode, 2, 311: operands[0], HFmode, 312: operands[1], HFmode); 313: emit_insn (gen_tsthi_1 (copy_to_reg(hard_libcall_value (HImode)))); 314: DONE; 315: }") 316: 317: 318: ;; .................... 319: ;; 320: ;; Add instructions 321: ;; 322: ;; .................... 323: 324: 325: (define_insn "addhi3" 326: [(set (match_operand:HI 0 "register_operand" "=A,A,A") 327: (plus:HI (match_operand:HI 1 "register_operand" "%A,A,A") 328: (match_operand:HI 2 "nonmemory_operand" "Z,d,i")))] 329: "" 330: "@ 331: %0=%1+%2 332: %0=%1+%2 333: %0=%w1+%H2\;%0=%b0+%U2" 334: [(set_attr "type" "malu,malu,f3_alu_i")]) 335: 336: (define_insn "" 337: [(set (match_operand:QI 0 "register_operand" "=k,u,!k,!u") 338: (plus:QI (plus:QI (match_operand:QI 1 "register_operand" "uk,uk,uk,uk") 339: (match_operand:QI 2 "register_operand" "wz,wz,uk,uk")) 340: (match_operand:QI 3 "immediate_operand" "i,i,i,i"))) 341: (clobber (match_scratch:QI 4 "=j,q,j,q"))] 342: "" 343: "@ 344: %m0=%m1+%m2\;%m0=%0+%H3 345: %m0=%m1+%m2\;%m0=%0+%H3 346: %m0=%m1+%m2\;%m0=%0+%H3 347: %m0=%m1+%m2\;%m0=%0+%H3") 348: 349: (define_expand "addqi3" 350: [(parallel [(set (match_operand:QI 0 "register_operand" "") 351: (plus:QI (match_operand:QI 1 "register_operand" "") 352: (match_operand:QI 2 "nonmemory_operand" ""))) 353: (clobber (match_scratch:QI 3 ""))])] 354: "" 355: " 356: { 357: if (reload_in_progress) 358: { 359: if (REG_P (operands[1]) && 360: (REGNO(operands[1]) == STACK_POINTER_REGNUM || 361: REGNO(operands[1]) == FRAME_POINTER_REGNUM) && 362: GET_CODE (operands[2]) == CONST_INT) 363: { 364: if (REG_P (operands[0]) && IS_ACCUM_REG(REGNO(operands[0]))) 365: emit_move_insn (operands[0], operands[1]); 366: 367: operands[1] = operands[0]; 368: } 369: } 370: }") 371: 372: 373: (define_insn "match_addqi3" 374: [(set (match_operand:QI 0 "register_operand" "=!a,!a,k,u,!k,!u,h,!a") 375: (plus:QI (match_operand:QI 1 "register_operand" "0,0,uk,uk,uk,uk,h,0") 376: (match_operand:QI 2 "nonmemory_operand" "W,N,wzi,wzi,uk,uk,i,n"))) 377: (clobber (match_scratch:QI 3 "=X,X,j,q,j,q,X,W"))] 378: "" 379: "* 380: { 381: switch (which_alternative) 382: { 383: case 0: 384: return \"*%0++%2\"; 385: 386: case 1: 387: switch (INTVAL (operands[2])) 388: { 389: case -1: 390: return \"*%0--\"; 391: 392: case 1: 393: return \"*%0++\"; 394: 395: case -2: 396: return \"*%0--\;*%0--\"; 397: 398: case 2: 399: return \"*%0++\;*%0++\"; 400: } 401: 402: case 2: 403: case 3: 404: if (!CONSTANT_P(operands[2])) 405: return \"%m0=%m1+%m2\"; 406: else 407: return \"%m0=%1+%H2\"; 408: 409: case 4: 410: case 5: 411: return \"%m0=%m1+%m2\"; 412: 413: case 6: 414: return \"%0=%b1+%H2\"; 415: 416: case 7: 417: return \"%3=%2\;*%0++%3\"; 418: } 419: }") 420: 421: (define_expand "addhf3" 422: [(set (match_operand:HF 0 "register_operand" "") 423: (plus:HF (match_operand:HF 1 "register_operand" "") 424: (match_operand:HF 2 "nonmemory_operand" "")))] 425: "" 426: " 427: { 428: if (!dsp16xx_addhf3_libcall) 429: dsp16xx_addhf3_libcall = gen_rtx (SYMBOL_REF, Pmode, ADDHF3_LIBCALL); 430: 431: emit_library_call (dsp16xx_addhf3_libcall, 1, HFmode, 2, 432: operands[1], HFmode, 433: operands[2], HFmode); 434: emit_move_insn (operands[0], hard_libcall_value(HFmode)); 435: DONE; 436: }") 437: 438: 439: ;; 440: ;; .................... 441: ;; 442: ;; Subtract instructions 443: ;; 444: ;; .................... 445: 446: (define_insn "subhi3" 447: [(set (match_operand:HI 0 "register_operand" "=A,A,A") 448: (minus:HI (match_operand:HI 1 "register_operand" "A,A,A") 449: (match_operand:HI 2 "nonmemory_operand" "Z,d,i")))] 450: "" 451: "@ 452: %0=%1-%2 453: %0=%1-%2 454: %0=%w1-%H2\;%0=%b0-%U2" 455: [(set_attr "type" "malu,malu,f3_alu_i")]) 456: 457: (define_insn "subqi3" 458: [(set (match_operand:QI 0 "register_operand" "=?*a,k,u,!k,!u") 459: (minus:QI (match_operand:QI 1 "register_operand" "0,uk,uk,uk,uk") 460: (match_operand:QI 2 "nonmemory_operand" "n,wzi,wzi,uk,uk"))) 461: (clobber (match_scratch:QI 3 "=W,j,q,j,q"))] 462: "" 463: "* 464: { 465: switch (which_alternative) 466: { 467: case 0: 468: switch (INTVAL (operands[2])) 469: { 470: case 0: 471: return \"\"; 472: 473: case 1: 474: return \"*%0--\"; 475: 476: case -1: 477: return \"*%0++\"; 478: 479: default: 480: operands[2] = GEN_INT (-INTVAL (operands[2])); 481: 482: if (SHORT_IMMEDIATE(operands[2])) 483: return \"set %3=%H2\;*%0++%3\"; 484: else 485: return \"%3=%H2\;*%0++%3\"; 486: } 487: 488: case 1: 489: case 2: 490: if (!CONSTANT_P(operands[2])) 491: return \"%m0=%m1-%m2\"; 492: else 493: return \"%m0=%1-%H2\"; 494: 495: case 3: 496: case 4: 497: return \"%m0=%m1-%m2\"; 498: } 499: }") 500: 501: (define_expand "subhf3" 502: [(set (match_operand:HF 0 "register_operand" "") 503: (minus:HF (match_operand:HF 1 "register_operand" "") 504: (match_operand:HF 2 "nonmemory_operand" "")))] 505: "" 506: " 507: { 508: if (!dsp16xx_subhf3_libcall) 509: dsp16xx_subhf3_libcall = gen_rtx (SYMBOL_REF, Pmode, SUBHF3_LIBCALL); 510: 511: emit_library_call (dsp16xx_subhf3_libcall, 1, HFmode, 2, 512: operands[1], HFmode, 513: operands[2], HFmode); 514: emit_move_insn (operands[0], hard_libcall_value(HFmode)); 515: DONE; 516: }") 517: 518: (define_insn "neghi2" 519: [(set (match_operand:HI 0 "register_operand" "=A") 520: (neg:HI (match_operand:HI 1 "register_operand" "A")))] 521: "" 522: "%0=-%1" 523: [(set_attr "type" "special")]) 524: 525: (define_expand "neghf2" 526: [(set (match_operand:HF 0 "general_operand" "") 527: (neg:HF (match_operand:HF 1 "general_operand" "")))] 528: "" 529: " 530: { 531: if (!dsp16xx_neghf2_libcall) 532: dsp16xx_neghf2_libcall = gen_rtx (SYMBOL_REF, Pmode, NEGHF2_LIBCALL); 533: 534: emit_library_call (dsp16xx_neghf2_libcall, 1, HFmode, 1, 535: operands[1], HFmode); 536: emit_move_insn (operands[0], hard_libcall_value(HFmode)); 537: DONE; 538: }") 539: 540: 541: 542: ;; 543: ;; .................... 544: ;; 545: ;; Multiply instructions 546: ;; 547: 548: (define_expand "mulhi3" 549: [(set (match_operand:HI 0 "register_operand" "") 550: (mult:HI (match_operand:HI 1 "register_operand" "") 551: (match_operand:HI 2 "nonmemory_operand" "")))] 552: "" 553: " 554: { 555: if (!dsp16xx_mulhi3_libcall) 556: dsp16xx_mulhi3_libcall = gen_rtx (SYMBOL_REF, Pmode, MULHI3_LIBCALL); 557: 558: emit_library_call (dsp16xx_mulhi3_libcall, 1, HImode, 2, 559: operands[1], HImode, 560: operands[2], HImode); 561: emit_move_insn (operands[0], hard_libcall_value(HImode)); 562: DONE; 563: }") 564: 565: (define_insn "mulqi3" 566: [(set (match_operand:QI 0 "register_operand" "=w") 567: (mult:QI (match_operand:QI 1 "register_operand" "%x") 568: (match_operand:QI 2 "register_operand" "y"))) 569: (clobber (match_scratch:QI 3 "=v"))] 570: "" 571: "%m0=%1*%2" 572: [(set_attr "type" "malu_mul")]) 573: 574: (define_insn "mulqihi3" 575: [(set (match_operand:HI 0 "register_operand" "=t") 576: (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "%x")) 577: (sign_extend:HI (match_operand:QI 2 "register_operand" "y"))))] 578: "" 579: "%0=%1*%2" 580: [(set_attr "type" "malu_mul")]) 581: 582: (define_insn "umulqihi3" 583: [(set (match_operand:HI 0 "register_operand" "=t") 584: (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "%x")) 585: (zero_extend:HI (match_operand:QI 2 "register_operand" "y"))))] 586: "" 587: "%0=%1*%2" 588: [(set_attr "type" "malu_mul")]) 589: 590: (define_expand "mulhf3" 591: [(set (match_operand:HF 0 "register_operand" "") 592: (mult:HF (match_operand:HF 1 "register_operand" "") 593: (match_operand:HF 2 "nonmemory_operand" "")))] 594: "" 595: " 596: { 597: if (!dsp16xx_mulhf3_libcall) 598: dsp16xx_mulhf3_libcall = gen_rtx (SYMBOL_REF, Pmode, MULHF3_LIBCALL); 599: 600: emit_library_call (dsp16xx_mulhf3_libcall, 1, HFmode, 2, 601: operands[1], HFmode, 602: operands[2], HFmode); 603: emit_move_insn (operands[0], hard_libcall_value(HFmode)); 604: DONE; 605: }") 606: 607: 608: 609: ;; 610: ;; ******************* 611: ;; 612: ;; Divide Instructions 613: ;; 614: 615: (define_expand "divhi3" 616: [(set (match_operand:HI 0 "register_operand" "") 617: (div:HI (match_operand:HI 1 "register_operand" "") 618: (match_operand:HI 2 "nonmemory_operand" "")))] 619: "" 620: " 621: { 622: if (!dsp16xx_divhi3_libcall) 623: dsp16xx_divhi3_libcall = gen_rtx (SYMBOL_REF, Pmode, DIVHI3_LIBCALL); 624: 625: emit_library_call (dsp16xx_divhi3_libcall, 1, HImode, 2, 626: operands[1], HImode, 627: operands[2], HImode); 628: emit_move_insn (operands[0], hard_libcall_value(HImode)); 629: DONE; 630: }") 631: 632: (define_expand "udivhi3" 633: [(set (match_operand:HI 0 "register_operand" "") 634: (udiv:HI (match_operand:HI 1 "register_operand" "") 635: (match_operand:HI 2 "nonmemory_operand" "")))] 636: "" 637: " 638: { 639: if (!dsp16xx_udivhi3_libcall) 640: dsp16xx_udivhi3_libcall = gen_rtx (SYMBOL_REF, Pmode, UDIVHI3_LIBCALL); 641: 642: emit_library_call (dsp16xx_udivhi3_libcall, 1, HImode, 2, 643: operands[1], HImode, 644: operands[2], HImode); 645: emit_move_insn (operands[0], hard_libcall_value(HImode)); 646: DONE; 647: }") 648: 649: (define_expand "divqi3" 650: [(set (match_operand:QI 0 "register_operand" "") 651: (div:QI (match_operand:QI 1 "register_operand" "") 652: (match_operand:QI 2 "nonmemory_operand" "")))] 653: "" 654: " 655: { 656: if (!dsp16xx_divqi3_libcall) 657: dsp16xx_divqi3_libcall = gen_rtx (SYMBOL_REF, Pmode, DIVQI3_LIBCALL); 658: 659: emit_library_call (dsp16xx_divqi3_libcall, 1, QImode, 2, 660: operands[1], QImode, 661: operands[2], QImode); 662: emit_move_insn (operands[0], hard_libcall_value(QImode)); 663: DONE; 664: }") 665: 666: (define_expand "udivqi3" 667: [(set (match_operand:QI 0 "register_operand" "") 668: (udiv:QI (match_operand:QI 1 "register_operand" "") 669: (match_operand:QI 2 "nonmemory_operand" "")))] 670: "" 671: " 672: { 673: if (!dsp16xx_udivqi3_libcall) 674: dsp16xx_udivqi3_libcall = gen_rtx (SYMBOL_REF, Pmode, UDIVQI3_LIBCALL); 675: 676: emit_library_call (dsp16xx_udivqi3_libcall, 1, QImode, 2, 677: operands[1], QImode, 678: operands[2], QImode); 679: emit_move_insn (operands[0], hard_libcall_value(QImode)); 680: DONE; 681: }") 682: 683: ;; 684: ;; .................... 685: ;; 686: ;; Modulo instructions 687: ;; 688: ;; .................... 689: 690: (define_expand "modhi3" 691: [(set (match_operand:HI 0 "register_operand" "") 692: (mod:HI (match_operand:HI 1 "register_operand" "") 693: (match_operand:HI 2 "nonmemory_operand" "")))] 694: "" 695: " 696: { 697: if (!dsp16xx_modhi3_libcall) 698: dsp16xx_modhi3_libcall = gen_rtx (SYMBOL_REF, Pmode, MODHI3_LIBCALL); 699: 700: emit_library_call (dsp16xx_modhi3_libcall, 1, HImode, 2, 701: operands[1], HImode, 702: operands[2], HImode); 703: emit_move_insn (operands[0], hard_libcall_value(HImode)); 704: DONE; 705: }") 706: 707: (define_expand "umodhi3" 708: [(set (match_operand:HI 0 "register_operand" "") 709: (umod:HI (match_operand:HI 1 "register_operand" "") 710: (match_operand:HI 2 "nonmemory_operand" "")))] 711: "" 712: " 713: { 714: if (!dsp16xx_umodhi3_libcall) 715: dsp16xx_umodhi3_libcall = gen_rtx (SYMBOL_REF, Pmode, UMODHI3_LIBCALL); 716: 717: emit_library_call (dsp16xx_umodhi3_libcall, 1, HImode, 2, 718: operands[1], HImode, 719: operands[2], HImode); 720: emit_move_insn (operands[0], hard_libcall_value(HImode)); 721: DONE; 722: }") 723: 724: (define_expand "modqi3" 725: [(set (match_operand:QI 0 "register_operand" "") 726: (mod:QI (match_operand:QI 1 "register_operand" "") 727: (match_operand:QI 2 "nonmemory_operand" "")))] 728: "" 729: " 730: { 731: if (!dsp16xx_modqi3_libcall) 732: dsp16xx_modqi3_libcall = gen_rtx (SYMBOL_REF, Pmode, MODQI3_LIBCALL); 733: 734: emit_library_call (dsp16xx_modqi3_libcall, 1, QImode, 2, 735: operands[1], QImode, 736: operands[2], QImode); 737: emit_move_insn (operands[0], hard_libcall_value(QImode)); 738: DONE; 739: }") 740: 741: (define_expand "umodqi3" 742: [(set (match_operand:QI 0 "register_operand" "") 743: (umod:QI (match_operand:QI 1 "register_operand" "") 744: (match_operand:QI 2 "nonmemory_operand" "")))] 745: "" 746: " 747: { 748: if (!dsp16xx_umodqi3_libcall) 749: dsp16xx_umodqi3_libcall = gen_rtx (SYMBOL_REF, Pmode, UMODQI3_LIBCALL); 750: 751: emit_library_call (dsp16xx_umodqi3_libcall, 1, QImode, 2, 752: operands[1], QImode, 753: operands[2], QImode); 754: emit_move_insn (operands[0], hard_libcall_value(QImode)); 755: DONE; 756: }") 757: 758: (define_expand "divhf3" 759: [(set (match_operand:HF 0 "register_operand" "") 760: (div:HF (match_operand:HF 1 "register_operand" "") 761: (match_operand:HF 2 "nonmemory_operand" "")))] 762: "" 763: " 764: { 765: if (!dsp16xx_divhf3_libcall) 766: dsp16xx_divhf3_libcall = gen_rtx (SYMBOL_REF, Pmode, DIVHF3_LIBCALL); 767: 768: emit_library_call (dsp16xx_divhf3_libcall, 1, HFmode, 2, 769: operands[1], HFmode, 770: operands[2], HFmode); 771: emit_move_insn (operands[0], hard_libcall_value(HFmode)); 772: DONE; 773: }") 774: 775: 776: 777: ;; 778: ;; ******************** 779: ;; 780: ;; Logical Instructions 781: ;; 782: 783: (define_insn "andhi3" 784: [(set (match_operand:HI 0 "register_operand" "=A,A,?A") 785: (and:HI (match_operand:HI 1 "register_operand" "%A,!A,A") 786: (match_operand:HI 2 "nonmemory_operand" "Z,A,i")))] 787: "" 788: "@ 789: %0=%1&%2 790: %0=%1&%2 791: %0=%w1&%H2\;%0=%b0&%U2" 792: [(set_attr "type" "f3_alu,f3_alu,f3_alu_i")]) 793: 794: (define_insn "andqi3" 795: [(set (match_operand:QI 0 "register_operand" "=k,u,uk,!k,!u,j,q,jq,!j,!q") 796: (and:QI (match_operand:QI 1 "register_operand" "uk,uk,uk,uk,uk,jq,jq,jq,jq,jq") 797: (match_operand:QI 2 "nonmemory_operand" "wz,wz,i,uk,uk,yv,yv,i,jq,jq"))) 798: (clobber (match_scratch:QI 3 "=j,q,X,j,q,k,u,X,k,u"))] 799: "" 800: "@ 801: %m0=%m1&%m2 802: %m0=%m1&%m2 803: %m0=%1&%H2 804: %m0=%m1&%m2 805: %m0=%m1&%m2 806: %m0=%m1&%m2 807: %m0=%m1&%m2 808: %m0=%b1&%H2 809: %m0=%m1&%m2 810: %m0=%m1&%m2") 811: 812: (define_insn "iorhi3" 813: [(set (match_operand:HI 0 "register_operand" "=A,A,A,?A") 814: (ior:HI (match_operand:HI 1 "register_operand" "%A,!A,A,A") 815: (match_operand:HI 2 "nonmemory_operand" "Z,A,I,i")))] 816: "" 817: "@ 818: %0=%u1|%u2 819: %0=%u1|%u2 820: %0=%w1|%H2 821: %0=%w1|%H2\;%0=%b0|%U2" 822: [(set_attr "type" "f3_alu,f3_alu,f3_alu_i,f3_alu_i")]) 823: 824: (define_insn "iorqi3" 825: [(set (match_operand:QI 0 "register_operand" "=k,u,uk,!k,!u,j,q,jq,!j,!q") 826: (ior:QI (match_operand:QI 1 "register_operand" "uk,uk,uk,uk,uk,jq,jq,jq,jq,jq") 827: (match_operand:QI 2 "nonmemory_operand" "wz,wz,i,uk,uk,yv,yv,i,jq,jq"))) 828: (clobber (match_scratch:QI 3 "=j,q,X,j,q,k,u,X,k,u"))] 829: "" 830: "@ 831: %m0=%m1|%m2 832: %m0=%m1|%m2 833: %m0=%1|%H2 834: %m0=%m1|%m2 835: %m0=%m1|%m2 836: %m0=%m1|%m2 837: %m0=%m1|%m2 838: %m0=%b1|%H2 839: %m0=%m1|%m2 840: %m0=%m1|%m2") 841: 842: (define_insn "xorhi3" 843: [(set (match_operand:HI 0 "register_operand" "=A,A,A,?A") 844: (xor:HI (match_operand:HI 1 "register_operand" "%A,!A,A,A") 845: (match_operand:HI 2 "nonmemory_operand" "Z,A,I,i")))] 846: "" 847: "@ 848: %0=%1^%2 849: %0=%1^%2 850: %0=%w1^%H2 851: %0=%w1^%H2\;%0=%b0^%U2" 852: [(set_attr "type" "f3_alu,f3_alu,f3_alu_i,f3_alu_i")]) 853: 854: (define_insn "xorqi3" 855: [(set (match_operand:QI 0 "register_operand" "=k,u,uk,!k,!u,j,q,jq,!j,!q") 856: (xor:QI (match_operand:QI 1 "register_operand" "uk,uk,uk,uk,uk,jq,jq,jq,jq,jq") 857: (match_operand:QI 2 "nonmemory_operand" "wz,wz,i,uk,uk,yv,yv,i,jq,jq"))) 858: (clobber (match_scratch:QI 3 "=j,q,X,j,q,k,u,X,k,u"))] 859: "" 860: "@ 861: %m0=%m1^%m2 862: %m0=%m1^%m2 863: %m0=%1^%H2 864: %m0=%m1^%m2 865: %m0=%m1^%m2 866: %m0=%m1^%m2 867: %m0=%m1^%m2 868: %m0=%b1^%H2 869: %m0=%m1^%m2 870: %m0=%m1^%m2") 871: 872: (define_insn "one_cmplhi2" 873: [(set (match_operand:HI 0 "register_operand" "=A") 874: (not:HI (match_operand:HI 1 "register_operand" "A")))] 875: "" 876: "%0= ~%1" 877: [(set_attr "type" "special")]) 878: 879: (define_insn "one_cmplqi2" 880: [(set (match_operand:QI 0 "register_operand" "=ku,jq") 881: (not:QI (match_operand:QI 1 "register_operand" "ku,jq")))] 882: "" 883: "@ 884: %m0= %1 ^ 0xffff 885: %m0= %b1 ^ 0xffff" 886: [(set_attr "type" "special")]) 887: 888: 889: ;; 890: ;; MOVE INSTRUCTIONS 891: ;; 892: 893: (define_expand "movhi" 894: [(set (match_operand:HI 0 "general_operand" "") 895: (match_operand:HI 1 "general_operand" ""))] 896: "" 897: " 898: { 899: if (emit_move_sequence (operands, HImode)) 900: DONE; 901: }") 902: 903: 904: (define_insn "match_movhi1" 905: [(set (match_operand:HI 0 "nonimmediate_operand" "=A,Z,A,d,d,m,?d,*Y,t,f") 906: (match_operand:HI 1 "general_operand" "d,A,K,i,m,d,*Y,?d,t,f"))] 907: "register_operand(operands[0], HImode) 908: || register_operand(operands[1], HImode)" 909: "* 910: { 911: switch (which_alternative) 912: { 913: /* register to accumulator */ 914: case 0: 915: return \"%0=%1\"; 916: case 1: 917: return \"%u0=%u1\;%w0=%w1\"; 918: case 2: 919: return \"%0=%0^%0\"; 920: case 3: 921: return \"%u0=%U1\;%w0=%H1\"; 922: case 4: 923: double_reg_from_memory(operands); 924: return \"\"; 925: case 5: 926: double_reg_to_memory(operands); 927: return \"\"; 928: case 6: 929: case 7: 930: return \"%u0=%u1\;%w0=%w1\"; 931: case 8: 932: case 9: 933: return \"\"; 934: } 935: }" 936: [(set_attr "type" "move,move,load_i,load_i,load,store,load,store,move,move")]) 937: 938: 939: ;; NOTE: It is cheaper to do 'y = *r0', than 'r0 = *r0'. 940: 941: (define_expand "movqi" 942: [(set (match_operand:QI 0 "nonimmediate_operand" "") 943: (match_operand:QI 1 "general_operand" ""))] 944: "" 945: " 946: { 947: if (emit_move_sequence (operands, QImode)) 948: DONE; 949: }") 950: 951: ;; The movqi pattern with the parallel is used for addqi insns (which have a parallel) 952: ;; that are turned into moveqi insns by the flow phase. This happens when a auto-increment 953: ;; is detected. 954: 955: (define_insn "match_movqi1" 956: [(parallel [(set (match_operand:QI 0 "nonimmediate_operand" "=A,r,aW,c,?D,m<>,e,Y,r,xyz,m<>") 957: (match_operand:QI 1 "general_operand" "r,A,J,i,m<>,D,Y,e,0,m<>,xyz")) 958: (clobber (match_scratch:QI 2 "=X,X,X,X,X,X,X,X,X,X,X"))])] 959: "register_operand(operands[0], QImode) 960: || register_operand(operands[1], QImode)" 961: "* 962: { 963: switch (which_alternative) 964: { 965: case 0: 1.1.1.2 ! root 966: /* We have to use the move mnemonic otherwise the 1610 will ! 967: attempt to transfer all 32-bits of 'y', 'p' or an accumulator 1.1 root 968: , which we don't want */ 969: if (REGNO(operands[1]) == REG_Y || REGNO(operands[1]) == REG_PROD 970: || IS_ACCUM_REG(REGNO(operands[1]))) 971: return \"move %0=%1\"; 972: else 973: return \"%0=%1\"; 974: 975: case 1: 976: return \"%0=%1\"; 977: 978: case 2: 979: return \"set %0=%H1\"; 980: 981: case 3: 982: return \"%0=%H1\"; 983: 984: case 4: 985: return \"%0=%1\"; 986: 987: case 5: 988: case 6: 989: return \"%0=%1\"; 990: 991: case 7: 992: return \"%0=%1\"; 993: 994: case 8: 995: return \"\"; 996: 997: case 9: case 10: 998: return \"%0=%1\"; 999: } 1000: }") 1001: 1002: (define_insn "match_movqi2" 1003: [(set (match_operand:QI 0 "nonimmediate_operand" "=A,r,aW,c,?D,m<>,e,Y,r,xyz,m<>") 1004: (match_operand:QI 1 "general_operand" "r,A,J,i,m<>,D,Y,e,0,m<>,xyz"))] 1005: "register_operand(operands[0], QImode) 1006: || register_operand(operands[1], QImode)" 1007: "* 1008: { 1009: switch (which_alternative) 1010: { 1011: case 0: 1.1.1.2 ! root 1012: /* We have to use the move mnemonic otherwise the 1610 will ! 1013: attempt to transfer all 32-bits of 'y', 'p' or an accumulator 1.1 root 1014: , which we don't want */ 1015: if (REGNO(operands[1]) == REG_Y || REGNO(operands[1]) == REG_PROD 1016: || IS_ACCUM_REG(REGNO(operands[1]))) 1017: return \"move %0=%1\"; 1018: else 1019: return \"%0=%1\"; 1020: 1021: case 1: 1022: return \"%0=%1\"; 1023: 1024: case 2: 1025: return \"set %0=%H1\"; 1026: 1027: case 3: 1028: return \"%0=%H1\"; 1029: 1030: case 4: 1031: return \"%0=%1\"; 1032: 1033: case 5: 1034: case 6: 1035: return \"%0=%1\"; 1036: 1037: case 7: 1038: return \"%0=%1\"; 1039: 1040: case 8: 1041: return \"\"; 1042: 1043: case 9: case 10: 1044: return \"%0=%1\"; 1045: } 1046: }") 1047: 1048: (define_expand "reload_inqi" 1049: [(set (match_operand:QI 0 "register_operand" "=u") 1050: (match_operand:QI 1 "sp_operand" "")) 1051: (clobber (match_operand:QI 2 "register_operand" "=&q"))] 1052: "" 1053: " 1054: { 1055: rtx addr_reg = XEXP (operands[1], 0); 1056: rtx offset = XEXP (operands[1], 1); 1057: 1058: /* First, move the frame or stack pointer to the accumulator */ 1059: emit_move_insn (operands[0], addr_reg); 1060: 1061: /* Then generate the add insn */ 1062: emit_insn (gen_rtx (PARALLEL, VOIDmode, 1063: gen_rtvec (2, 1064: gen_rtx (SET, VOIDmode, operands[0], 1065: gen_rtx (PLUS, QImode, operands[0], offset)), 1066: gen_rtx (CLOBBER, VOIDmode, operands[2])))); 1067: DONE; 1068: }") 1069: 1070: (define_expand "reload_inhi" 1071: [(set (match_operand:HI 0 "register_operand" "=r") 1072: (match_operand:HI 1 "register_operand" "r")) 1073: (clobber (match_operand:QI 2 "register_operand" "=&h"))] 1074: "" 1075: " 1076: { 1077: /* Check for an overlap of operand 2 (an accumulator) with 1078: the msw of operand 0. If we have an overlap we must reverse 1079: the order of the moves. */ 1080: 1081: if (REGNO(operands[2]) == REGNO(operands[0])) 1082: { 1083: emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HImode)); 1084: emit_move_insn (operand_subword (operands[0], 1, 0, HImode), operands[2]); 1085: emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HImode)); 1086: emit_move_insn (operand_subword (operands[0], 0, 0, HImode), operands[2]); 1087: } 1088: else 1089: { 1090: emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HImode)); 1091: emit_move_insn (operand_subword (operands[0], 0, 0, HImode), operands[2]); 1092: emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HImode)); 1093: emit_move_insn (operand_subword (operands[0], 1, 0, HImode), operands[2]); 1094: } 1095: 1096: DONE; 1097: }") 1098: 1099: 1100: (define_expand "reload_outhi" 1101: [(set (match_operand:HI 0 "register_operand" "=r") 1102: (match_operand:HI 1 "register_operand" "r")) 1103: (clobber (match_operand:QI 2 "register_operand" "=&h"))] 1104: "" 1105: " 1106: { 1107: emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HImode)); 1108: emit_move_insn (operand_subword (operands[0], 0, 0, HImode), operands[2]); 1109: emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HImode)); 1110: emit_move_insn (operand_subword (operands[0], 1, 0, HImode), operands[2]); 1111: DONE; 1112: }") 1113: 1114: (define_expand "movstrqi" 1115: [(parallel [(set (match_operand:BLK 0 "memory_operand" "") 1116: (match_operand:BLK 1 "memory_operand" "")) 1117: (use (match_operand:QI 2 "const_int_operand" "")) 1118: (use (match_operand:QI 3 "const_int_operand" "")) 1119: (clobber (match_scratch:QI 4 "")) 1120: (clobber (match_dup 5)) 1121: (clobber (match_dup 6))])] 1122: "" 1123: " 1124: { 1125: rtx addr0, addr1; 1126: 1127: if (GET_CODE (operands[2]) != CONST_INT) 1128: FAIL; 1129: 1130: if (INTVAL(operands[2]) > 127) 1131: FAIL; 1132: 1133: addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0)); 1134: addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0)); 1135: 1136: operands[5] = addr0; 1137: operands[6] = addr1; 1138: 1139: operands[0] = gen_rtx (MEM, BLKmode, addr0); 1140: operands[1] = gen_rtx (MEM, BLKmode, addr1); 1141: }") 1142: 1143: (define_insn "" 1144: [(set (mem:BLK (match_operand:QI 0 "register_operand" "a")) 1145: (mem:BLK (match_operand:QI 1 "register_operand" "a"))) 1146: (use (match_operand:QI 2 "const_int_operand" "n")) 1147: (use (match_operand:QI 3 "immediate_operand" "i")) 1148: (clobber (match_scratch:QI 4 "=x")) 1149: (clobber (match_dup 0)) 1150: (clobber (match_dup 1))] 1151: "" 1152: "* 1153: { return output_block_move (operands); }") 1154: 1155: 1156: ;; Floating point move insns 1157: 1158: 1159: (define_expand "movhf" 1160: [(set (match_operand:HF 0 "general_operand" "") 1161: (match_operand:HF 1 "general_operand" ""))] 1162: "" 1163: " 1164: { 1165: if (emit_move_sequence (operands, HFmode)) 1166: DONE; 1167: }") 1168: 1169: (define_insn "match_movhf" 1170: [(set (match_operand:HF 0 "nonimmediate_operand" "=A,Z,d,d,m,d,Y") 1171: (match_operand:HF 1 "general_operand" "d,A,F,m,d,Y,d"))] 1172: "" 1173: "* 1174: { 1175: /* NOTE: When loading the register 16 bits at a time we 1176: MUST load the high half FIRST (because the 1610 zeros 1177: the low half) and then load the low half */ 1178: 1179: switch (which_alternative) 1180: { 1181: /* register to accumulator */ 1182: case 0: 1183: return \"%0=%1\"; 1184: case 1: 1185: return \"%u0=%u1\;%w0=%w1\"; 1186: case 2: 1187: output_dsp16xx_float_const(operands); 1188: return \"\"; 1189: case 3: 1190: double_reg_from_memory(operands); 1191: return \"\"; 1192: case 4: 1193: double_reg_to_memory(operands); 1194: return \"\"; 1195: case 5: 1196: case 6: 1197: return \"%u0=%u1\;%w0=%w1\"; 1198: } 1199: }" 1200: [(set_attr "type" "move,move,load_i,load,store,load,store")]) 1201: 1202: 1203: 1204: (define_expand "reload_inhf" 1205: [(set (match_operand:HF 0 "register_operand" "=r") 1206: (match_operand:HF 1 "register_operand" "r")) 1207: (clobber (match_operand:QI 2 "register_operand" "=&h"))] 1208: "" 1209: " 1210: { 1211: /* Check for an overlap of operand 2 (an accumulator) with 1212: the msw of operand 0. If we have an overlap we must reverse 1213: the order of the moves. */ 1214: 1215: if (REGNO(operands[2]) == REGNO(operands[0])) 1216: { 1217: emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HFmode)); 1218: emit_move_insn (operand_subword (operands[0], 1, 0, HFmode), operands[2]); 1219: emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HFmode)); 1220: emit_move_insn (operand_subword (operands[0], 0, 0, HFmode), operands[2]); 1221: } 1222: else 1223: { 1224: emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HFmode)); 1225: emit_move_insn (operand_subword (operands[0], 0, 0, HFmode), operands[2]); 1226: emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HFmode)); 1227: emit_move_insn (operand_subword (operands[0], 1, 0, HFmode), operands[2]); 1228: } 1229: 1230: DONE; 1231: }") 1232: 1233: (define_expand "reload_outhf" 1234: [(set (match_operand:HF 0 "register_operand" "=r") 1235: (match_operand:HF 1 "register_operand" "r")) 1236: (clobber (match_operand:QI 2 "register_operand" "=&h"))] 1237: "" 1238: " 1239: { 1240: emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HFmode)); 1241: emit_move_insn (operand_subword (operands[0], 0, 0, HFmode), operands[2]); 1242: emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HFmode)); 1243: emit_move_insn (operand_subword (operands[0], 1, 0, HFmode), operands[2]); 1244: DONE; 1245: }") 1246: 1247: 1248: ;; 1249: ;; CONVERSION INSTRUCTIONS 1250: ;; 1251: 1252: (define_expand "extendqihi2" 1253: [(clobber (match_dup 2)) 1254: (set (match_dup 3) (match_operand:QI 1 "register_operand" "")) 1255: (set (match_operand:HI 0 "register_operand" "") 1256: (ashift:HI (match_dup 2) 1257: (const_int 16))) 1258: (set (match_dup 0) 1259: (ashiftrt:HI (match_dup 0) (const_int 16)))] 1260: "" 1261: " 1262: { 1263: operands[2] = gen_reg_rtx (HImode); 1264: operands[3] = gen_rtx (SUBREG, QImode, operands[2], 1); 1265: }") 1266: 1267: ;;(define_insn "extendqihi2" 1268: ;; [(set (match_operand:HI 0 "register_operand" "=A") 1269: ;; (sign_extend:HI (match_operand:QI 1 "register_operand" "h")))] 1270: ;; "" 1271: ;; "%0 = %1 >> 16") 1272: 1273: ;;(define_insn "zero_extendqihi2" 1274: ;; [(set (match_operand:HI 0 "register_operand" "=t,f,A,?d,?A") 1275: ;; (zero_extend:HI (match_operand:QI 1 "register_operand" "w,z,ku,A,r")))] 1276: ;; "" 1277: ;; "* 1278: ;; { 1279: ;; switch (which_alternative) 1280: ;; { 1281: ;; case 0: 1282: ;; case 1: 1283: ;; return \"%0=0\"; 1284: ;; 1285: ;; case 2: 1286: ;; if (REGNO(operands[1]) == (REGNO(operands[0]) + 1)) 1287: ;; return \"%0=0\"; 1288: ;; else 1289: ;; return \"%w0=%1\;%0=0\"; 1290: ;; case 3: 1291: ;; return \"%w0=%1\;%0=0\"; 1292: ;; 1293: ;; case 4: 1294: ;; if (REGNO(operands[1]) == REG_Y || REGNO(operands[1]) == REG_PROD 1295: ;; || IS_ACCUM_REG(REGNO(operands[1]))) 1296: ;; return \"move %w0=%1\;%0=0\"; 1297: ;; else 1298: ;; return \"%w0=%1\;%0=0\"; 1299: ;; } 1300: ;; }") 1301: 1302: (define_expand "zero_extendqihi2" 1303: [(clobber (match_dup 2)) 1304: (set (match_dup 3) (match_operand:QI 1 "register_operand" "")) 1305: (set (match_operand:HI 0 "register_operand" "") 1306: (ashift:HI (match_dup 2) 1307: (const_int 16))) 1308: (set (match_dup 0) 1309: (lshiftrt:HI (match_dup 0) (const_int 16)))] 1310: "" 1311: " 1312: { 1313: operands[2] = gen_reg_rtx (HImode); 1314: operands[3] = gen_rtx (SUBREG, QImode, operands[2], 1); 1315: }") 1316: 1317: 1318: (define_expand "floathihf2" 1319: [(set (match_operand:HF 0 "register_operand" "") 1320: (float:HF (match_operand:HI 1 "register_operand" "")))] 1321: "" 1322: " 1323: { 1324: if (!dsp16xx_floathihf2_libcall) 1325: dsp16xx_floathihf2_libcall = gen_rtx (SYMBOL_REF, Pmode, FLOATHIHF2_LIBCALL); 1326: 1327: emit_library_call (dsp16xx_floathihf2_libcall, 1, HFmode, 1, 1328: operands[1], HImode); 1329: emit_move_insn (operands[0], hard_libcall_value(HFmode)); 1330: DONE; 1331: }") 1332: 1333: (define_expand "fix_trunchfhi2" 1334: [(set (match_operand:HI 0 "register_operand" "") 1335: (fix:HI (match_operand:HF 1 "register_operand" "")))] 1336: "" 1337: " 1338: { 1339: if (!dsp16xx_fixhfhi2_libcall) 1340: dsp16xx_fixhfhi2_libcall = gen_rtx (SYMBOL_REF, Pmode, FIXHFHI2_LIBCALL); 1341: 1342: emit_library_call (dsp16xx_fixhfhi2_libcall, 1, HImode, 1, 1343: operands[1], HFmode); 1344: emit_move_insn (operands[0], hard_libcall_value(HImode)); 1345: DONE; 1346: }") 1347: 1348: (define_expand "fixuns_trunchfhi2" 1349: [(set (match_operand:HI 0 "register_operand" "") 1350: (unsigned_fix:HI (match_operand:HF 1 "register_operand" "")))] 1351: "" 1352: " 1353: { 1354: rtx reg1 = gen_reg_rtx (HFmode); 1355: rtx reg2 = gen_reg_rtx (HFmode); 1356: rtx reg3 = gen_reg_rtx (HImode); 1357: rtx label1 = gen_label_rtx (); 1358: rtx label2 = gen_label_rtx (); 1359: REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 31); 1360: 1361: if (reg1) /* turn off complaints about unreached code */ 1362: { 1363: emit_move_insn (reg1, immed_real_const_1 (offset, HFmode)); 1364: do_pending_stack_adjust (); 1365: 1366: emit_insn (gen_cmphf (operands[1], reg1)); 1367: emit_jump_insn (gen_bge (label1)); 1368: 1369: emit_insn (gen_fix_trunchfhi2 (operands[0], operands[1])); 1370: emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx, 1371: gen_rtx (LABEL_REF, VOIDmode, label2))); 1372: emit_barrier (); 1373: 1374: emit_label (label1); 1375: emit_insn (gen_subhf3 (reg2, operands[1], reg1)); 1376: emit_move_insn (reg3, GEN_INT (0x80000000));; 1377: 1378: emit_insn (gen_fix_trunchfhi2 (operands[0], reg2)); 1379: emit_insn (gen_iorhi3 (operands[0], operands[0], reg3)); 1380: 1381: emit_label (label2); 1382: 1383: /* allow REG_NOTES to be set on last insn (labels don't have enough 1384: fields, and can't be used for REG_NOTES anyway). */ 1385: emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx)); 1386: DONE; 1387: } 1388: }") 1389: 1390: ;; 1391: ;; SHIFT INSTRUCTIONS 1392: ;; 1393: 1394: (define_insn "" 1395: [(set (match_operand:HI 0 "register_operand" "=A") 1396: (ashiftrt:HI (match_operand:HI 1 "register_operand" "A") 1397: (const_int 1)))] 1398: "" 1399: "%0=%1>>1" 1400: [(set_attr "type" "special")]) 1401: 1402: (define_insn "" 1403: [(set (match_operand:HI 0 "register_operand" "=A") 1404: (ashiftrt:HI (match_operand:HI 1 "register_operand" "A") 1405: (const_int 4)))] 1406: "" 1407: "%0=%1>>4" 1408: [(set_attr "type" "special")]) 1409: 1410: (define_insn "" 1411: [(set (match_operand:HI 0 "register_operand" "=A") 1412: (ashiftrt:HI (match_operand:HI 1 "register_operand" "A") 1413: (const_int 8)))] 1414: "" 1415: "%0=%1>>8" 1416: [(set_attr "type" "special")]) 1417: 1418: (define_insn "" 1419: [(set (match_operand:HI 0 "register_operand" "=A") 1420: (ashiftrt:HI (match_operand:HI 1 "register_operand" "A") 1421: (const_int 16)))] 1422: "" 1423: "%0=%1>>16" 1424: [(set_attr "type" "special")]) 1425: 1426: ;; 1427: ;; Arithmetic Right shift 1428: 1429: (define_expand "ashrhi3" 1430: [(set (match_operand:HI 0 "register_operand" "") 1431: (ashiftrt:HI (match_operand:HI 1 "register_operand" "") 1432: (match_operand:QI 2 "nonmemory_operand" "")))] 1433: "" 1434: " 1435: { 1436: if (!TARGET_BMU) 1437: { 1438: /* If we are shifting by a constant we can do it in 1 or more 1439: 1600 core shift instructions. The core instructions can 1440: shift by 1, 4, 8, or 16. */ 1441: 1442: if (GET_CODE(operands[2]) == CONST_INT) 1443: ; 1444: else 1445: { 1446: rtx label1 = gen_label_rtx (); 1447: rtx label2 = gen_label_rtx (); 1448: 1449: #if 0 1450: if (!dsp16xx_ashrhi3_libcall) 1451: dsp16xx_ashrhi3_libcall = gen_rtx (SYMBOL_REF, Pmode, ASHRHI3_LIBCALL); 1452: 1453: emit_library_call (dsp16xx_ashrhi3_libcall, 1, HImode, 2, 1454: operands[1], HImode, 1455: operands[2], QImode); 1456: emit_move_insn (operands[0], hard_libcall_value(HImode)); 1457: DONE; 1458: #else 1459: do_pending_stack_adjust (); 1460: emit_insn (gen_tstqi (operands[2])); 1461: emit_jump_insn (gen_bne (label1)); 1462: emit_move_insn (operands[0], operands[1]); 1463: emit_jump_insn (gen_jump (label2)); 1464: emit_barrier (); 1465: emit_label (label1); 1466: 1467: if (GET_CODE(operands[2]) != MEM) 1468: { 1469: rtx stack_slot; 1470: 1471: stack_slot = assign_stack_temp (QImode, GET_MODE_SIZE(QImode), 0); 1472: stack_slot = change_address (stack_slot, VOIDmode, XEXP (stack_slot, 0)); 1473: emit_move_insn (stack_slot, operands[2]); 1474: operands[2] = stack_slot; 1475: } 1476: 1477: emit_insn (gen_match_ashrhi3_nobmu (operands[0], operands[1], operands[2])); 1478: emit_label (label2); 1479: DONE; 1480: #endif 1481: } 1482: } 1483: }") 1484: 1485: (define_insn "match_ashrhi3_bmu" 1486: [(set (match_operand:HI 0 "register_operand" "=A,A,A") 1487: (ashiftrt:HI (match_operand:HI 1 "register_operand" "A,A,!A") 1488: (match_operand:QI 2 "nonmemory_operand" "B,I,h")))] 1489: "TARGET_BMU" 1490: "@ 1491: %0=%1>>%2 1492: %0=%1>>%H2 1493: %0=%1>>%2" 1494: [(set_attr "type" "shift,shift_i,shift")]) 1495: 1496: (define_insn "match_ashrhi3_nobmu" 1497: [(set (match_operand:HI 0 "register_operand" "=A,A") 1498: (ashiftrt:HI (match_operand:HI 1 "register_operand" "A,0") 1499: (match_operand:QI 2 "general_operand" "n,m")))] 1500: "!TARGET_BMU" 1501: "* 1502: { 1503: if (which_alternative == 0) 1504: { 1505: emit_1600_core_shift (ASHIFTRT, operands, INTVAL(operands[2])); 1506: return \"\"; 1507: } 1508: else 1509: { 1510: output_asm_insn (\"cloop=%2\", operands); 1511: output_asm_insn (\"do 0 \{\", operands); 1512: output_asm_insn (\"%0=%0>>1\", operands); 1513: return \"\}\"; 1514: } 1515: }") 1516: 1517: 1518: 1519: ;; 1520: ;; Logical Right Shift 1521: 1522: (define_insn "" 1523: [(set (match_operand:HI 0 "register_operand" "=A") 1524: (lshiftrt:HI (match_operand:HI 1 "register_operand" "A") 1525: (const_int 1)))] 1526: "" 1527: "%0=%1>>1\;%0=%b0&0x7fff" 1528: [(set_attr "type" "special")]) 1529: 1530: (define_insn "" 1531: [(set (match_operand:HI 0 "register_operand" "=A") 1532: (lshiftrt:HI (match_operand:HI 1 "register_operand" "A") 1533: (const_int 4)))] 1534: "" 1535: "%0=%1>>4\;%0=%b0&0x0fff" 1536: [(set_attr "type" "special")]) 1537: 1538: (define_insn "" 1539: [(set (match_operand:HI 0 "register_operand" "=A") 1540: (lshiftrt:HI (match_operand:HI 1 "register_operand" "A") 1541: (const_int 8)))] 1542: "" 1543: "%0=%1>>8\;%0=%b0&0x00ff" 1544: [(set_attr "type" "special")]) 1545: 1546: (define_insn "" 1547: [(set (match_operand:HI 0 "register_operand" "=A") 1548: (lshiftrt:HI (match_operand:HI 1 "register_operand" "A") 1549: (const_int 16)))] 1550: "" 1551: "%0=%1>>16\;%0=%b0&0x0000" 1552: [(set_attr "type" "special")]) 1553: 1554: (define_expand "lshrhi3" 1555: [(set (match_operand:HI 0 "register_operand" "") 1556: (lshiftrt:HI (match_operand:HI 1 "register_operand" "") 1557: (match_operand:QI 2 "nonmemory_operand" "")))] 1558: "" 1559: " 1560: { 1561: if (!TARGET_BMU) 1562: { 1563: /* If we are shifting by a constant we can do it in 1 or more 1564: 1600 core shift instructions. The core instructions can 1565: shift by 1, 4, 8, or 16. */ 1566: 1567: if (GET_CODE(operands[2]) == CONST_INT) 1568: emit_insn (gen_match_lshrhi3_nobmu (operands[0], operands[1], operands[2])); 1569: else 1570: { 1571: rtx label1 = gen_label_rtx (); 1572: rtx label2 = gen_label_rtx (); 1573: #if 0 1574: if (!dsp16xx_lshrhi3_libcall) 1575: dsp16xx_lshrhi3_libcall = gen_rtx (SYMBOL_REF, Pmode, LSHRHI3_LIBCALL); 1576: 1577: emit_library_call (dsp16xx_lshrhi3_libcall, 1, HImode, 2, 1578: operands[1], HImode, 1579: operands[2], QImode); 1580: emit_move_insn (operands[0], hard_libcall_value(HImode)); 1581: DONE; 1582: #else 1583: do_pending_stack_adjust (); 1584: emit_insn (gen_tstqi (operands[2])); 1585: emit_jump_insn (gen_bne (label1)); 1586: emit_move_insn (operands[0], operands[1]); 1587: emit_jump_insn (gen_jump (label2)); 1588: emit_barrier (); 1589: emit_label (label1); 1590: 1591: if (GET_CODE(operands[2]) != MEM) 1592: { 1593: rtx stack_slot; 1594: 1595: stack_slot = assign_stack_temp (QImode, GET_MODE_SIZE(QImode), 0); 1596: stack_slot = change_address (stack_slot, VOIDmode, XEXP (stack_slot, 0)); 1597: emit_move_insn (stack_slot, operands[2]); 1598: operands[2] = stack_slot; 1599: } 1600: 1601: emit_insn (gen_match_lshrhi3_nobmu (operands[0], operands[1], operands[2])); 1602: emit_label (label2); 1603: DONE; 1604: #endif 1605: } 1606: } 1607: }") 1608: 1609: (define_insn "match_lshrhi3" 1610: [(set (match_operand:HI 0 "register_operand" "=A,A,A") 1611: (lshiftrt:HI (match_operand:HI 1 "register_operand" "A,A,!A") 1612: (match_operand:QI 2 "nonmemory_operand" "B,I,h")))] 1613: "TARGET_BMU" 1614: "@ 1615: %0=%1>>>%2 1616: %0=%1>>>%H2 1617: %0=%1>>>%2" 1618: [(set_attr "type" "shift,shift_i,shift")]) 1619: 1620: (define_insn "match_lshrhi3_nobmu" 1621: [(set (match_operand:HI 0 "register_operand" "=A,A") 1622: (lshiftrt:HI (match_operand:HI 1 "register_operand" "A,0") 1623: (match_operand:QI 2 "general_operand" "n,m"))) 1624: (clobber (match_scratch:QI 3 "=X,Y"))] 1625: "!TARGET_BMU" 1626: "* 1627: { 1628: if (which_alternative == 0) 1629: { 1630: emit_1600_core_shift (LSHIFTRT, operands, INTVAL(operands[2])); 1631: return \"\"; 1632: } 1633: else 1634: { 1635: output_asm_insn (\"%3=psw\;psw=0\",operands); 1636: output_asm_insn (\"cloop=%2\", operands); 1637: output_asm_insn (\"do 0 \{\", operands); 1638: output_asm_insn (\"%0=%0>>1\", operands); 1639: output_asm_insn (\"\}\", operands); 1640: return \"psw=%3\"; 1641: } 1642: }") 1643: 1644: 1645: ;; 1646: ;; Arithmetic Left shift 1647: 1648: ;; Start off with special case arithmetic left shift by 1,4,8 or 16. 1649: 1650: 1651: (define_insn "" 1652: [(set (match_operand:HI 0 "register_operand" "=A") 1653: (ashift:HI (match_operand:HI 1 "register_operand" "A") 1654: (const_int 1)))] 1655: "" 1656: "%0=%1<<1" 1657: [(set_attr "type" "special")]) 1658: 1659: (define_insn "" 1660: [(set (match_operand:HI 0 "register_operand" "=A") 1661: (ashift:HI (match_operand:HI 1 "register_operand" "A") 1662: (const_int 4)))] 1663: "" 1664: "%0=%1<<4" 1665: [(set_attr "type" "special")]) 1666: 1667: (define_insn "" 1668: [(set (match_operand:HI 0 "register_operand" "=A") 1669: (ashift:HI (match_operand:HI 1 "register_operand" "A") 1670: (const_int 8)))] 1671: "" 1672: "%0=%1<<8" 1673: [(set_attr "type" "special")]) 1674: 1675: (define_insn "" 1676: [(set (match_operand:HI 0 "register_operand" "=A") 1677: (ashift:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "A")) 1678: (const_int 16)))] 1679: "" 1680: "%0=%1<<16" 1681: [(set_attr "type" "special")]) 1682: 1683: (define_insn "" 1684: [(set (match_operand:HI 0 "register_operand" "=A") 1685: (ashift:HI (match_operand:HI 1 "general_operand" "A") 1686: (const_int 16)))] 1687: "" 1688: "%0=%1<<16" 1689: [(set_attr "type" "special")]) 1690: 1691: 1692: 1693: ;; Normal Arithmetic Shift Left 1694: 1695: 1696: (define_expand "ashlhi3" 1697: [(set (match_operand:HI 0 "register_operand" "") 1698: (ashift:HI (match_operand:HI 1 "register_operand" "") 1699: (match_operand:QI 2 "nonmemory_operand" "")))] 1700: "" 1701: " 1702: { 1703: if (!TARGET_BMU) 1704: { 1705: /* If we are shifting by a constant we can do it in 1 or more 1706: 1600 core shift instructions. The core instructions can 1707: shift by 1, 4, 8, or 16. */ 1708: 1709: if (GET_CODE(operands[2]) == CONST_INT) 1710: ; 1711: else 1712: { 1713: rtx label1 = gen_label_rtx (); 1714: rtx label2 = gen_label_rtx (); 1715: #if 0 1716: if (!dsp16xx_ashlhi3_libcall) 1717: dsp16xx_ashlhi3_libcall = gen_rtx (SYMBOL_REF, Pmode, ASHLHI3_LIBCALL); 1718: 1719: emit_library_call (dsp16xx_ashlhi3_libcall, 1, HImode, 2, 1720: operands[1], HImode, 1721: operands[2], QImode); 1722: emit_move_insn (operands[0], hard_libcall_value(HImode)); 1723: DONE; 1724: #else 1725: do_pending_stack_adjust (); 1726: emit_insn (gen_tstqi (operands[2])); 1727: emit_jump_insn (gen_bne (label1)); 1728: emit_move_insn (operands[0], operands[1]); 1729: emit_jump_insn (gen_jump (label2)); 1730: emit_barrier (); 1731: emit_label (label1); 1732: 1733: if (GET_CODE(operands[2]) != MEM) 1734: { 1735: rtx stack_slot; 1736: 1737: stack_slot = assign_stack_temp (QImode, GET_MODE_SIZE(QImode), 0); 1738: stack_slot = change_address (stack_slot, VOIDmode, XEXP (stack_slot, 0)); 1739: emit_move_insn (stack_slot, operands[2]); 1740: operands[2] = stack_slot; 1741: } 1742: emit_insn (gen_match_ashlhi3_nobmu (operands[0], operands[1], operands[2])); 1743: emit_label (label2); 1744: DONE; 1745: #endif 1746: } 1747: } 1748: }") 1749: 1750: (define_insn "match_ashlhi3" 1751: [(set (match_operand:HI 0 "register_operand" "=A,A,A") 1752: (ashift:HI (match_operand:HI 1 "register_operand" "A,A,A") 1753: (match_operand:QI 2 "nonmemory_operand" "B,I,!h")))] 1754: "TARGET_BMU" 1755: "@ 1756: %0=%1<<%2\;move %u0=%u0 1757: %0=%1<<%H2\;move %u0=%u0 1758: %0=%1<<%2\;move %u0=%u0" 1759: [(set_attr "type" "shift,shift_i,shift")]) 1760: 1761: (define_insn "match_ashlhi3_nobmu" 1762: [(set (match_operand:HI 0 "register_operand" "=A,A") 1763: (ashift:HI (match_operand:HI 1 "register_operand" "A,0") 1764: (match_operand:QI 2 "general_operand" "n,m")))] 1765: "!TARGET_BMU" 1766: "* 1767: { 1768: if (which_alternative == 0) 1769: { 1770: emit_1600_core_shift (ASHIFT, operands, INTVAL(operands[2])); 1771: return \"\"; 1772: } 1773: else 1774: { 1775: output_asm_insn (\"cloop=%2\", operands); 1776: output_asm_insn (\"do 0 \{\", operands); 1777: output_asm_insn (\"%0=%0<<1\", operands); 1778: return \"\}\"; 1779: } 1780: }") 1781: 1782: 1783: 1784: ;; 1785: ;; Jump Instructions 1786: ;; 1787: 1788: (define_expand "beq" 1789: [(set (pc) 1790: (if_then_else (eq (match_dup 1) 1791: (const_int 0)) 1792: (label_ref (match_operand 0 "" "")) 1793: (pc)))] 1794: "" 1795: " 1796: { 1797: if (dsp16xx_compare_gen == gen_compare_reg) 1798: operands[1] = (*dsp16xx_compare_gen)(EQ, dsp16xx_compare_op0, dsp16xx_compare_op1); 1799: else 1800: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1801: }") 1802: 1803: (define_expand "bne" 1804: [(set (pc) 1805: (if_then_else (ne (match_dup 1) 1806: (const_int 0)) 1807: (label_ref (match_operand 0 "" "")) 1808: (pc)))] 1809: "" 1810: " 1811: { 1812: if (dsp16xx_compare_gen == gen_compare_reg) 1813: operands[1] = (*dsp16xx_compare_gen)(NE, dsp16xx_compare_op0, dsp16xx_compare_op1); 1814: else 1815: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1816: }") 1817: 1818: 1819: (define_expand "bgt" 1820: [(set (pc) 1821: (if_then_else (gt (match_dup 1) 1822: (const_int 0)) 1823: (label_ref (match_operand 0 "" "")) 1824: (pc)))] 1825: "" 1826: " 1827: { 1828: if (dsp16xx_compare_gen == gen_compare_reg) 1829: operands[1] = (*dsp16xx_compare_gen)(GT, dsp16xx_compare_op0, dsp16xx_compare_op1); 1830: else 1831: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1832: }") 1833: 1834: 1835: (define_expand "bge" 1836: [(set (pc) 1837: (if_then_else (ge (match_dup 1) 1838: (const_int 0)) 1839: (label_ref (match_operand 0 "" "")) 1840: (pc)))] 1841: "" 1842: " 1843: { 1844: if (dsp16xx_compare_gen == gen_compare_reg) 1845: operands[1] = (*dsp16xx_compare_gen)(GE, dsp16xx_compare_op0, dsp16xx_compare_op1); 1846: else 1847: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1848: }") 1849: 1850: 1851: (define_expand "blt" 1852: [(set (pc) 1853: (if_then_else (lt (match_dup 1) 1854: (const_int 0)) 1855: (label_ref (match_operand 0 "" "")) 1856: (pc)))] 1857: "" 1858: " 1859: { 1860: if (dsp16xx_compare_gen == gen_compare_reg) 1861: operands[1] = (*dsp16xx_compare_gen)(LT, dsp16xx_compare_op0, dsp16xx_compare_op1); 1862: else 1863: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1864: }") 1865: 1866: 1867: (define_expand "ble" 1868: [(set (pc) 1869: (if_then_else (le (match_dup 1) 1870: (const_int 0)) 1871: (label_ref (match_operand 0 "" "")) 1872: (pc)))] 1873: "" 1874: " 1875: { 1876: if (dsp16xx_compare_gen == gen_compare_reg) 1877: operands[1] = (*dsp16xx_compare_gen)(LE, dsp16xx_compare_op0, dsp16xx_compare_op1); 1878: else 1879: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1880: }") 1881: 1882: 1883: (define_expand "bgtu" 1884: [(set (pc) 1885: (if_then_else (gtu (match_dup 1) 1886: (const_int 0)) 1887: (label_ref (match_operand 0 "" "")) 1888: (pc)))] 1889: "" 1890: " 1891: { 1892: if (dsp16xx_compare_gen == gen_compare_reg) 1893: operands[1] = (*dsp16xx_compare_gen)(GTU, dsp16xx_compare_op0, dsp16xx_compare_op1); 1894: else 1895: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1896: }") 1897: 1898: 1899: (define_expand "bgeu" 1900: [(set (pc) 1901: (if_then_else (geu (match_dup 1) 1902: (const_int 0)) 1903: (label_ref (match_operand 0 "" "")) 1904: (pc)))] 1905: "" 1906: " 1907: { 1908: if (dsp16xx_compare_gen == gen_compare_reg) 1909: operands[1] = (*dsp16xx_compare_gen)(GEU, dsp16xx_compare_op0, dsp16xx_compare_op1); 1910: else 1911: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1912: }") 1913: 1914: 1915: (define_expand "bltu" 1916: [(set (pc) 1917: (if_then_else (ltu (match_dup 1) 1918: (const_int 0)) 1919: (label_ref (match_operand 0 "" "")) 1920: (pc)))] 1921: "" 1922: " 1923: { 1924: if (dsp16xx_compare_gen == gen_compare_reg) 1925: operands[1] = (*dsp16xx_compare_gen)(LTU, dsp16xx_compare_op0, dsp16xx_compare_op1); 1926: else 1927: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1928: }") 1929: 1930: 1931: (define_expand "bleu" 1932: [(set (pc) 1933: (if_then_else (leu (match_dup 1) 1934: (const_int 0)) 1935: (label_ref (match_operand 0 "" "")) 1936: (pc)))] 1937: "" 1938: " 1939: { 1940: if (dsp16xx_compare_gen == gen_compare_reg) 1941: operands[1] = (*dsp16xx_compare_gen)(LEU, dsp16xx_compare_op0, dsp16xx_compare_op1); 1942: else 1943: operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0); 1944: }") 1945: 1946: 1947: (define_insn "" 1948: [(set (pc) 1949: (if_then_else (match_operator 1 "comparison_operator" 1950: [(cc0) (const_int 0)]) 1951: (label_ref (match_operand 0 "" "")) 1952: (pc)))] 1953: "!TARGET_NEAR_JUMP" 1954: "pt=%l0\;if %C1 goto pt" 1955: [(set_attr "type" "cond_jump")]) 1956: 1957: (define_insn "" 1958: [(set (pc) 1959: (if_then_else (match_operator 1 "comparison_operator" 1960: [(cc0) (const_int 0)]) 1961: (label_ref (match_operand 0 "" "")) 1962: (pc)))] 1963: "TARGET_NEAR_JUMP" 1964: "if %C1 goto %l0" 1965: [(set_attr "type" "cond_jump")]) 1966: 1967: ;; 1968: ;; Negated conditional jump instructions. 1969: ;; These are necessary because jump optimization can turn 1970: ;; direct-conditional branches into reverse-conditional 1971: ;; branches. 1972: 1973: (define_insn "" 1974: [(set (pc) 1975: (if_then_else (match_operator 1 "comparison_operator" 1976: [(cc0) (const_int 0)]) 1977: (pc) 1978: (label_ref (match_operand 0 "" ""))))] 1979: "!TARGET_NEAR_JUMP" 1980: "pt=%l0\;if %I1 goto pt" 1981: [(set_attr "type" "cond_jump")]) 1982: 1983: (define_insn "" 1984: [(set (pc) 1985: (if_then_else (match_operator 1 "comparison_operator" 1986: [(cc0) (const_int 0)]) 1987: (pc) 1988: (label_ref (match_operand 0 "" ""))))] 1989: "TARGET_NEAR_JUMP" 1990: "if %I1 goto %l0" 1991: [(set_attr "type" "cond_jump")]) 1992: 1993: 1994: ;; 1995: ;; JUMPS 1996: ;; 1997: 1998: (define_insn "jump" 1999: [(set (pc) 2000: (label_ref (match_operand 0 "" "")))] 2001: "" 2002: "* 2003: { 2004: if (TARGET_NEAR_JUMP) 2005: return \"goto %l0\"; 2006: else 2007: return \"pt=%l0\;goto pt\"; 2008: }" 2009: [(set_attr "type" "jump")]) 2010: 2011: 2012: (define_insn "indirect_jump" 2013: [(set (pc) (match_operand:QI 0 "register_operand" "A"))] 2014: "" 2015: "pt=%0\;goto pt" 2016: [(set_attr "type" "jump")]) 2017: 2018: (define_insn "tablejump" 2019: [(set (pc) (match_operand:QI 0 "register_operand" "A")) 2020: (use (label_ref (match_operand 1 "" "")))] 2021: "" 2022: "pt=%0\;goto pt" 2023: [(set_attr "type" "jump")]) 2024: 2025: ;; 2026: ;; FUNCTION CALLS 2027: ;; 2028: 2029: ;; Call subroutine with no return value. 2030: 2031: 2032: (define_expand "call" 2033: [(parallel [(call (match_operand:QI 0 "" "") 2034: (match_operand 1 "" "")) 2035: (clobber (reg:QI 24))])] 2036: "" 2037: " 2038: { 2039: if (GET_CODE (operands[0]) == MEM 2040: && ! call_address_operand (XEXP (operands[0], 0), QImode)) 2041: operands[0] = gen_rtx (MEM, GET_MODE (operands[0]), 2042: force_reg (Pmode, XEXP (operands[0], 0))); 2043: }") 2044: 2045: (define_insn "" 2046: [(parallel [(call (mem:QI (match_operand:QI 0 "call_address_operand" "hR")) 2047: (match_operand 1 "" "")) 2048: (clobber (reg:QI 24))])] 2049: "" 2050: "* 2051: { 2052: if (GET_CODE (operands[0]) == REG || 2053: (GET_CODE(operands[0]) == SYMBOL_REF && !TARGET_NEAR_CALL)) 2054: return \"pt=%0\;call pt\"; 2055: else 2056: return \"call %0\"; 2057: }" 2058: [(set_attr "type" "call")]) 2059: 2060: ;; Call subroutine with return value. 2061: 2062: (define_expand "call_value" 2063: [(parallel [(set (match_operand 0 "register_operand" "=f") 2064: (call (match_operand:QI 1 "call_address_operand" "hR") 2065: (match_operand:QI 2 "" ""))) 2066: (clobber (reg:QI 24))])] 2067: "" 2068: " 2069: { 2070: if (GET_CODE (operands[1]) == MEM 2071: && ! call_address_operand (XEXP (operands[1], 0), QImode)) 2072: operands[1] = gen_rtx (MEM, GET_MODE (operands[1]), 2073: force_reg (Pmode, XEXP (operands[1], 0))); 2074: }") 2075: 2076: (define_insn "" 2077: [(parallel [(set (match_operand 0 "register_operand" "=f") 2078: (call (mem:QI (match_operand:QI 1 "call_address_operand" "hR")) 2079: (match_operand:QI 2 "" ""))) 2080: (clobber (reg:QI 24))])] 2081: "" 2082: "* 2083: { 2084: if (GET_CODE (operands[1]) == REG || 2085: (GET_CODE(operands[1]) == SYMBOL_REF && !TARGET_NEAR_CALL)) 2086: return \"pt=%1\;call pt\"; 2087: else 2088: return \"call %1\"; 2089: }" 2090: [(set_attr "type" "call")]) 2091: 2092: 2093: (define_expand "untyped_call" 2094: [(parallel [(call (match_operand 0 "" "") 2095: (const_int 0)) 2096: (match_operand 1 "" "") 2097: (match_operand 2 "" "")])] 2098: "" 2099: " 2100: { 2101: int i; 2102: 2103: emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx)); 2104: 2105: for (i = 0; i < XVECLEN (operands[2], 0); i++) 2106: { 2107: rtx set = XVECEXP (operands[2], 0, i); 2108: emit_move_insn (SET_DEST (set), SET_SRC (set)); 2109: } 2110: 2111: /* The optimizer does not know that the call sets the function value 2112: registers we stored in the result block. We avoid problems by 2113: claiming that all hard registers are used and clobbered at this 2114: point. */ 2115: emit_insn (gen_blockage ()); 2116: 2117: DONE; 2118: }") 2119: 2120: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and 2121: ;; all of memory. This blocks insns from being moved across this point. 2122: 2123: (define_insn "blockage" 2124: [(unspec_volatile [(const_int 0)] 0)] 2125: "" 2126: "") 2127: 2128: (define_insn "nop" 2129: [(const_int 0)] 2130: "" 2131: "nop" 2132: [(set_attr "type" "nop")]) 2133: 2134: ;; 2135: ;; PEEPHOLE PATTERNS 2136: ;; 2137: 2138: 2139: (define_peephole 2140: [(set (match_operand:QI 0 "register_operand" "=A") 2141: (reg:QI 16)) 2142: (call (mem:QI (match_dup 0)) 2143: (match_operand 1 "" "i"))] 2144: "" 2145: "call pt") 2146: 2147: 2148: (define_peephole 2149: [(set (match_operand:QI 0 "register_operand" "=A") 2150: (reg:QI 16)) 2151: (set (match_operand 1 "" "") 2152: (call (mem:QI (match_dup 0)) 2153: (match_operand 2 "" "i")))] 2154: "" 2155: "call pt") 2156: 2157: (define_peephole 2158: [(set (match_operand:HI 0 "register_operand" "=A") 2159: (ashift:HI (match_operand:HI 1 "register_operand" "A") 2160: (const_int 16))) 2161: (set (match_operand:HI 2 "register_operand" "") 2162: (match_dup 0)) 2163: (set (match_dup 0) 2164: (ashiftrt:HI (match_dup 0) (const_int 16))) 2165: (set (match_dup 2) 2166: (match_dup 0))] 2167: "" 2168: "%0=%1<<16\;%0=%0>>16\;%u2=%u0\;%w2=%w0") 2169: 2170: (define_peephole 2171: [(set (match_operand:HI 0 "register_operand" "=A") 2172: (ashift:HI (match_operand:HI 1 "register_operand" "A") 2173: (const_int 16))) 2174: (set (match_operand:HI 2 "register_operand" "") 2175: (match_dup 0)) 2176: (set (match_dup 0) 2177: (lshiftrt:HI (match_dup 0) (const_int 16))) 2178: (set (match_dup 2) 2179: (match_dup 0))] 2180: "" 2181: "%0=%1<<16\;%0=%0>>16\;%0=%b0&0x0000\;%u2=%u0\;%w2=%w0")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.