|
|
1.1.1.3 ! root 1: ;;- Machine description for GNU compiler, Motorola 68000 Version ! 2: ;; Copyright (C) 1987, 1988, 1993, 1994 Free Software Foundation, Inc. 1.1 root 3: 4: ;; This file is part of GNU CC. 5: 6: ;; GNU CC is free software; you can redistribute it and/or modify 7: ;; it under the terms of the GNU General Public License as published by 8: ;; the Free Software Foundation; either version 2, or (at your option) 9: ;; any later version. 10: 11: ;; GNU CC is distributed in the hope that it will be useful, 12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14: ;; GNU General Public License for more details. 15: 16: ;; You should have received a copy of the GNU General Public License 17: ;; along with GNU CC; see the file COPYING. If not, write to 18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 19: 20: 21: ;;- instruction definitions 22: 23: ;;- @@The original PO technology requires these to be ordered by speed, 24: ;;- @@ so that assigner will pick the fastest. 25: 26: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al. 27: 28: ;;- When naming insn's (operand 0 of define_insn) be careful about using 29: ;;- names from other targets machine descriptions. 30: 31: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code 32: ;;- updates for most instructions. 33: 34: ;;- Operand classes for the register allocator: 35: ;;- 'a' one of the address registers can be used. 36: ;;- 'd' one of the data registers can be used. 37: ;;- 'f' one of the m68881 registers can be used 38: ;;- 'r' either a data or an address register can be used. 39: ;;- 'x' if one of the Sun FPA registers 40: ;;- 'y' if one of the Low Sun FPA registers (fpa0-fpa15). 41: 42: ;;- Immediate Floating point operator constraints 43: ;;- 'G' a floating point constant that is *NOT* one of the standard 44: ;; 68881 constant values (to force calling output_move_const_double 45: ;; to get it from rom if it is a 68881 constant). 46: ;;- 'H' one of the standard FPA constant values 47: ;; 48: ;; See the functions standard_XXX_constant_p in output-m68k.c for more 49: ;; info. 50: 51: ;;- Immediate integer operand constraints: 52: ;;- 'I' 1 .. 8 53: ;;- 'J' -32768 .. 32767 54: ;;- 'K' all integers EXCEPT -128 .. 127 55: ;;- 'L' -8 .. -1 56: 57: ;;- Assembler specs: 58: ;;- "%." size separator ("." or "") move%.l d0,d1 59: ;;- "%#" immediate separator ("#" or "") move%.l %#0,d0 60: ;;- "%-" push operand "sp@-" move%.l d0,%- 61: ;;- "%+" pop operand "sp@+" move%.l d0,%+ 62: ;;- "%@" top of stack "sp@" move%.l d0,%@ 63: ;;- "%!" fpcr register 64: ;;- "%$" single-precision fp specifier ("s" or "") f%$add.x fp0,fp1 65: ;;- "%&" double-precision fp specifier ("d" or "") f%&add.x fp0,fp1 66: 67: ;;- Information about 68040 port. 68: 69: ;;- The 68040 executes all 68030 and 68881/2 instructions, but some must 70: ;;- be emulated in software by the OS. It is faster to avoid these 71: ;;- instructions and issue a library call rather than trapping into 72: ;;- the kernel. The affected instructions are fintrz and fscale. The 73: ;;- TARGET_68040 flag turns the use of the opcodes off. 74: 75: ;;- The '040 also implements a set of new floating-point instructions 76: ;;- which specify the rounding precision in the opcode. This finally 77: ;;- permit the 68k series to be truly IEEE compliant, and solves all 78: ;;- issues of excess precision accumulating in the extended registers. 79: ;;- By default, GCC does not use these instructions, since such code will 80: ;;- not run on an '030. To use these instructions, use the -m68040-only 81: ;;- switch. By changing TARGET_DEFAULT to include TARGET_68040_ONLY, 82: ;;- you can make these instructions the default. 83: 84: ;;- These new instructions aren't directly in the md. They are brought 85: ;;- into play by defining "%$" and "%&" to expand to "s" and "d" rather 86: ;;- than "". 87: 88: 89: ;;- FPA port explanation: 90: 91: ;;- Usage of the Sun FPA and the 68881 together 92: 93: ;;- The current port of gcc to the sun fpa disallows use of the m68881 94: ;;- instructions completely if code is targeted for the fpa. This is 95: ;;- for the following reasons: 96: 97: ;;- 1) Expressing the preference hierarchy (ie. use the fpa if you 98: ;;- can, the 68881 otherwise, and data registers only if you are 99: ;;- forced to it) is a bitch with the current constraint scheme, 100: ;;- especially since it would have to work for any combination of 101: ;;- -mfpa, -m68881. 102: 103: ;;- 2) There are no instructions to move between the two types of 104: ;;- registers; the stack must be used as an intermediary. 105: 106: ;;- It could indeed be done; I think the best way would be to have 107: ;;- separate patterns for TARGET_FPA (which implies a 68881), 108: ;;- TARGET_68881, and no floating point co-processor. Use 109: ;;- define_expands for all of the named instruction patterns, and 110: ;;- include code in the FPA instruction to deal with the 68881 with 111: ;;- preferences specifically set to favor the fpa. Some of this has 112: ;;- already been done: 113: ;;- 114: ;;- 1) Separation of most of the patterns out into a TARGET_FPA 115: ;;- case and a TARGET_68881 case (the exceptions are the patterns 116: ;;- which would need one define_expand and three define_insn's under 117: ;;- it (with a lot of duplicate code between them) to replace the 118: ;;- current single define_insn. These are mov{[ds]f,[ds]i} and the 119: ;;- first two patterns in the md. 120: ;;- 121: ;;- Some would still have to be done: 122: ;;- 123: ;;- 1) Add code to the fpa patterns which correspond to 68881 124: ;;- patterns to deal with the 68881 case (including preferences!). 125: ;;- What you might actually do here is combine the fpa and 68881 code 126: ;;- back together into one pattern for those instructions where it's 127: ;;- absolutely necessary and save yourself some duplicate code. I'm 128: ;;- not completely sure as to whether you could get away with doing 129: ;;- this only for the mov* insns, or if you'd have to do it for all 130: ;;- named insns. 131: ;;- 2) Add code to the mov{[ds]f,[ds]i} instructions to handle 132: ;;- moving between fpa regs and 68881 regs. 133: 134: ;;- Since the fpa is more powerful than the 68881 and also has more 135: ;;- registers, and since I think the resultant md would be medium ugly 136: ;;- (lot's of duplicate code, ugly constraint strings), I elected not 137: ;;- to do this change. 138: 139: ;;- Another reason why someone *might* want to do the change is to 140: ;;- control which register classes are accessed in a slightly cleaner 141: ;;- way than I have. See the blurb on CONDITIONAL_REGISTER_USAGE in 142: ;;- the internals manual. 143: 144: ;;- Yet another reason why someone might want to do this change is to 145: ;;- allow use of some of the 68881 insns which have no equivalent on 146: ;;- the fpa. The sqrt instruction comes fairly quickly to mind. 147: 148: ;;- If this is ever done, don't forget to change sun3.h so that 149: ;;- it *will* define __HAVE_68881__ when the FPA is in use. 150: 151: ;;- Condition code hack 152: 153: ;;- When a floating point compare is done in the fpa, the resulting 154: ;;- condition codes are left in the fpastatus register. The values in 155: ;;- this register must be moved into the 68000 cc register before any 156: ;;- jump is executed. Once this has been done, regular jump 157: ;;- instructions are fine (ie. floating point jumps are not necessary. 158: ;;- They are only done if the cc is in the 68881). 159: 160: ;;- The instructions that move the fpastatus register to the 68000 161: ;;- register clobber a data register (the move cannot be done direct). 162: ;;- These instructions might be bundled either with the compare 163: ;;- instruction, or the branch instruction. If we were using both the 164: ;;- fpa and the 68881 together, we would wish to only mark the 165: ;;- register clobbered if we were doing the compare in the fpa, but I 166: ;;- think that that decision (whether to clobber the register or not) 167: ;;- must be done before register allocation (makes sense) and hence we 168: ;;- can't know if the floating point compare will be done in the fpa 169: ;;- or the fp. So whenever we are asked for code that uses the fpa, 170: ;;- we will mark a data register as clobbered. This is reasonable, as 171: ;;- almost all floating point compare operations done with fpa code 172: ;;- enabled will be done in the fpa. It's even more reasonable since 173: ;;- we decided to make the 68881 and the fpa mutually exclusive. 174: 175: ;;- We place to code to move the fpastatus register inside of a 176: ;;- define_expand so that we can do it conditionally based on whether 177: ;;- we are targeting an fpa or not. 178: 179: ;;- This still leaves us with the question of where we wish to put the 180: ;;- code to move the fpastatus reg. If we put it in the compare 181: ;;- instruction, we can restrict the clobbering of the register to 182: ;;- floating point compares, but we can't take advantage of floating 183: ;;- point subtracts & etc. that alter the fpastatus register. If we 184: ;;- put it in the branch instruction, all branches compiled with fpa 185: ;;- code enabled will clobber a data register, but we will be able to 186: ;;- take advantage of fpa subtracts. This balance favors putting the 187: ;;- code in with the compare instruction. 188: 189: ;;- Note that if some enterprising hacker should decide to switch 190: ;;- this, he'll need to modify the code in NOTICE_UPDATE_CC. 191: 192: ;;- Usage of the top 16 fpa registers 193: 194: ;;- The only locations which we may transfer fpa registers 16-31 from 195: ;;- or to are the fpa registers 0-15. (68000 registers and memory 196: ;;- locations are impossible). This causes problems in gcc, which 197: ;;- assumes that mov?? instructions require no additional registers 198: ;;- (see section 11.7) and since floating point moves *must* be 199: ;;- supported into general registers (see section 12.3 under 200: ;;- HARD_REGNO_OK_FOR_MODE_P) from anywhere. 201: 202: ;;- My solution was to reserve fpa0 for moves into or out of these top 203: ;;- 16 registers and to disparage the choice to reload into or out of 204: ;;- these registers as much as I could. That alternative is always 205: ;;- last in the list, so it will not be used unless all else fails. I 206: ;;- will note that according to my current information, sun's compiler 207: ;;- doesn't use these top 16 registers at all. 208: 209: ;;- There is another possible way to do it. I *believe* that if you 210: ;;- make absolutely sure that the code will not be executed in the 211: ;;- reload pass, you can support the mov?? names with define_expands 212: ;;- which require new registers. This may be possible by the 213: ;;- appropriate juggling of constraints. I may come back to this later. 214: 215: ;;- Usage of constant RAM 216: 217: ;;- This has been handled correctly (I believe) but the way I've done 218: ;;- it could use a little explanation. The constant RAM can only be 219: ;;- accessed when the instruction is in "command register" mode. 220: ;;- "command register" mode means that no accessing of memory or the 221: ;;- 68000 registers is being done. This can be expressed easily in 222: ;;- constraints, so generally the mode of the instruction is 223: ;;- determined by a branch off of which_alternative. In outputting 224: ;;- instructions, a 'w' means to output an access to the constant ram 225: ;;- (if the arg is CONST_DOUBLE and is one of the available 226: ;;- constants), and 'x' means to output a register pair (if the arg is 227: ;;- a 68000 register) and a 'y' is the combination of the above two 228: ;;- processes. You use a 'y' in two operand DF instructions where you 229: ;;- *know* the other operand is an fpa register, you use an 'x' in DF 230: ;;- instructions where the arg might be a 68000 register and the 231: ;;- instruction is *not* in "command register" mode, and you use a 'w' 232: ;;- in two situations: 1) The instruction *is* in command register 233: ;;- mode (and hence won't be accessing 68000 registers), or 2) The 234: ;;- instruction is a two operand SF instruction where you know the 235: ;;- other operand is an fpa register. 236: 237: ;;- Optimization issues 238: 239: ;;- I actually think that I've included all of the fpa instructions 240: ;;- that should be included. Note that if someone is interested in 241: ;;- doing serious floating point work on the sun fpa, I would advise 242: ;;- the use of the "asm" instruction in gcc to allow you to use the 243: ;;- sin, cos, and exponential functions on the fpa board. 244: 245: ;;- END FPA Explanation Section. 246: 247: 248: ;;- Some of these insn's are composites of several m68000 op codes. 249: ;;- The assembler (or final @@??) insures that the appropriate one is 250: ;;- selected. 251: 252: (define_insn "" 253: [(set (match_operand:DF 0 "push_operand" "=m") 254: (match_operand:DF 1 "general_operand" "ro<>fyE"))] 255: "" 256: "* 257: { 258: if (FP_REG_P (operands[1])) 259: return \"fmove%.d %f1,%0\"; 260: if (FPA_REG_P (operands[1])) 261: return \"fpmove%.d %1, %x0\"; 262: return output_move_double (operands); 263: }") 264: 265: (define_insn "" 266: [(set (match_operand:DI 0 "push_operand" "=m") 267: (match_operand:DI 1 "general_operand" "ro<>Fy"))] 268: "" 269: "* 270: { 271: return output_move_double (operands); 272: }") 273: 274: ;; We don't want to allow a constant operand for test insns because 275: ;; (set (cc0) (const_int foo)) has no mode information. Such insns will 276: ;; be folded while optimizing anyway. 277: (define_insn "tstsi" 278: [(set (cc0) 279: (match_operand:SI 0 "nonimmediate_operand" "rm"))] 280: "" 281: "* 282: { 283: #ifdef ISI_OV 284: /* ISI's assembler fails to handle tstl a0. */ 285: if (! ADDRESS_REG_P (operands[0])) 286: #else 287: if (TARGET_68020 || ! ADDRESS_REG_P (operands[0])) 288: #endif 289: return \"tst%.l %0\"; 290: /* If you think that the 68020 does not support tstl a0, 291: reread page B-167 of the 68020 manual more carefully. */ 292: /* On an address reg, cmpw may replace cmpl. */ 293: #ifdef SGS_CMP_ORDER 294: return \"cmp%.w %0,%#0\"; 295: #else 296: return \"cmp%.w %#0,%0\"; 297: #endif 298: }") 299: 300: ;; This can't use an address register, because comparisons 301: ;; with address registers as second operand always test the whole word. 302: (define_insn "tsthi" 303: [(set (cc0) 304: (match_operand:HI 0 "nonimmediate_operand" "dm"))] 305: "" 306: "tst%.w %0") 307: 308: (define_insn "tstqi" 309: [(set (cc0) 310: (match_operand:QI 0 "nonimmediate_operand" "dm"))] 311: "" 312: "tst%.b %0") 313: 314: (define_expand "tstsf" 315: [(set (cc0) 316: (match_operand:SF 0 "general_operand" ""))] 317: "TARGET_68881 || TARGET_FPA" 318: " 319: { 320: if (TARGET_FPA) 321: { 322: emit_insn (gen_tstsf_fpa (operands[0])); 323: DONE; 324: } 325: }") 326: 327: (define_insn "tstsf_fpa" 328: [(set (cc0) 329: (match_operand:SF 0 "general_operand" "xmdF")) 330: (clobber (match_scratch:SI 1 "=d"))] 331: "TARGET_FPA" 332: "fptst%.s %x0\;fpmove fpastatus,%1\;movw %1,cc") 333: 334: (define_insn "" 335: [(set (cc0) 336: (match_operand:SF 0 "general_operand" "fdm"))] 337: "TARGET_68881" 338: "* 339: { 340: cc_status.flags = CC_IN_68881; 341: if (FP_REG_P (operands[0])) 342: return \"ftst%.x %0\"; 343: return \"ftst%.s %0\"; 344: }") 345: 346: (define_expand "tstdf" 347: [(set (cc0) 348: (match_operand:DF 0 "general_operand" ""))] 349: "TARGET_68881 || TARGET_FPA" 350: " 351: { 352: if (TARGET_FPA) 353: { 354: emit_insn (gen_tstsf_fpa (operands[0])); 355: DONE; 356: } 357: }") 358: 359: (define_insn "tstdf_fpa" 360: [(set (cc0) 361: (match_operand:DF 0 "general_operand" "xrmF")) 362: (clobber (match_scratch:SI 1 "=d"))] 363: "TARGET_FPA" 364: "fptst%.d %x0\;fpmove fpastatus,%1\;movw %1,cc") 365: 366: (define_insn "" 367: [(set (cc0) 368: (match_operand:DF 0 "general_operand" "fm"))] 369: "TARGET_68881" 370: "* 371: { 372: cc_status.flags = CC_IN_68881; 373: if (FP_REG_P (operands[0])) 374: return \"ftst%.x %0\"; 375: return \"ftst%.d %0\"; 376: }") 377: 378: ;; compare instructions. 379: 380: ;; A composite of the cmp, cmpa, & cmpi m68000 op codes. 381: (define_insn "cmpsi" 382: [(set (cc0) 383: (compare (match_operand:SI 0 "nonimmediate_operand" "rKs,mr,>") 384: (match_operand:SI 1 "general_operand" "mr,Ksr,>")))] 385: "" 386: "* 387: { 388: if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM) 1.1.1.2 root 389: #ifdef SGS_CMP_ORDER 390: return \"cmpm%.l %0,%1\"; 391: #else 1.1 root 392: return \"cmpm%.l %1,%0\"; 1.1.1.2 root 393: #endif 1.1 root 394: if (REG_P (operands[1]) 395: || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM)) 396: { cc_status.flags |= CC_REVERSED; 397: #ifdef SGS_CMP_ORDER 398: return \"cmp%.l %d1,%d0\"; 399: #else 400: return \"cmp%.l %d0,%d1\"; 401: #endif 402: } 403: #ifdef SGS_CMP_ORDER 404: return \"cmp%.l %d0,%d1\"; 405: #else 406: return \"cmp%.l %d1,%d0\"; 407: #endif 408: }") 409: 410: (define_insn "cmphi" 411: [(set (cc0) 1.1.1.2 root 412: (compare (match_operand:HI 0 "nonimmediate_operand" "rnm,d,n,m,>") 413: (match_operand:HI 1 "general_operand" "d,rnm,m,n,>")))] 1.1 root 414: "" 415: "* 416: { 417: if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM) 1.1.1.2 root 418: #ifdef SGS_CMP_ORDER 419: return \"cmpm%.w %0,%1\"; 420: #else 1.1 root 421: return \"cmpm%.w %1,%0\"; 1.1.1.2 root 422: #endif 1.1 root 423: if ((REG_P (operands[1]) && !ADDRESS_REG_P (operands[1])) 424: || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM)) 425: { cc_status.flags |= CC_REVERSED; 426: #ifdef SGS_CMP_ORDER 427: return \"cmp%.w %d1,%d0\"; 428: #else 429: return \"cmp%.w %d0,%d1\"; 430: #endif 431: } 432: #ifdef SGS_CMP_ORDER 433: return \"cmp%.w %d0,%d1\"; 434: #else 435: return \"cmp%.w %d1,%d0\"; 436: #endif 437: }") 438: 439: (define_insn "cmpqi" 440: [(set (cc0) 441: (compare (match_operand:QI 0 "nonimmediate_operand" "dn,md,>") 442: (match_operand:QI 1 "general_operand" "dm,nd,>")))] 443: "" 444: "* 445: { 446: if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM) 1.1.1.2 root 447: #ifdef SGS_CMP_ORDER 448: return \"cmpm%.b %0,%1\"; 449: #else 1.1 root 450: return \"cmpm%.b %1,%0\"; 1.1.1.2 root 451: #endif 1.1 root 452: if (REG_P (operands[1]) 453: || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM)) 454: { cc_status.flags |= CC_REVERSED; 455: #ifdef SGS_CMP_ORDER 456: return \"cmp%.b %d1,%d0\"; 457: #else 458: return \"cmp%.b %d0,%d1\"; 459: #endif 460: } 461: #ifdef SGS_CMP_ORDER 462: return \"cmp%.b %d0,%d1\"; 463: #else 464: return \"cmp%.b %d1,%d0\"; 465: #endif 466: }") 467: 468: (define_expand "cmpdf" 469: [(set (cc0) 470: (compare (match_operand:DF 0 "general_operand" "") 471: (match_operand:DF 1 "general_operand" "")))] 472: "TARGET_68881 || TARGET_FPA" 473: " 474: { 475: if (TARGET_FPA) 476: { 477: emit_insn (gen_cmpdf_fpa (operands[0], operands[1])); 478: DONE; 479: } 480: }") 481: 482: (define_insn "cmpdf_fpa" 483: [(set (cc0) 484: (compare (match_operand:DF 0 "general_operand" "x,y") 485: (match_operand:DF 1 "general_operand" "xH,rmF"))) 486: (clobber (match_scratch:SI 2 "=d,d"))] 487: "TARGET_FPA" 488: "fpcmp%.d %y1,%0\;fpmove fpastatus,%2\;movw %2,cc") 489: 490: (define_insn "" 491: [(set (cc0) 492: (compare (match_operand:DF 0 "general_operand" "f,mG") 493: (match_operand:DF 1 "general_operand" "fmG,f")))] 494: "TARGET_68881" 495: "* 496: { 497: cc_status.flags = CC_IN_68881; 498: #ifdef SGS_CMP_ORDER 499: if (REG_P (operands[0])) 500: { 501: if (REG_P (operands[1])) 502: return \"fcmp%.x %0,%1\"; 503: else 504: return \"fcmp%.d %0,%f1\"; 505: } 506: cc_status.flags |= CC_REVERSED; 507: return \"fcmp%.d %1,%f0\"; 508: #else 509: if (REG_P (operands[0])) 510: { 511: if (REG_P (operands[1])) 512: return \"fcmp%.x %1,%0\"; 513: else 514: return \"fcmp%.d %f1,%0\"; 515: } 516: cc_status.flags |= CC_REVERSED; 517: return \"fcmp%.d %f0,%1\"; 518: #endif 519: }") 520: 521: (define_expand "cmpsf" 522: [(set (cc0) 523: (compare (match_operand:SF 0 "general_operand" "") 524: (match_operand:SF 1 "general_operand" "")))] 525: "TARGET_68881 || TARGET_FPA" 526: " 527: { 528: if (TARGET_FPA) 529: { 530: emit_insn (gen_cmpsf_fpa (operands[0], operands[1])); 531: DONE; 532: } 533: }") 534: 535: (define_insn "cmpsf_fpa" 536: [(set (cc0) 537: (compare (match_operand:SF 0 "general_operand" "x,y") 538: (match_operand:SF 1 "general_operand" "xH,rmF"))) 539: (clobber (match_scratch:SI 2 "=d,d"))] 540: "TARGET_FPA" 541: "fpcmp%.s %w1,%x0\;fpmove fpastatus,%2\;movw %2,cc") 542: 543: (define_insn "" 544: [(set (cc0) 545: (compare (match_operand:SF 0 "general_operand" "f,mdG") 546: (match_operand:SF 1 "general_operand" "fmdG,f")))] 547: "TARGET_68881" 548: "* 549: { 550: cc_status.flags = CC_IN_68881; 551: #ifdef SGS_CMP_ORDER 552: if (FP_REG_P (operands[0])) 553: { 554: if (FP_REG_P (operands[1])) 555: return \"fcmp%.x %0,%1\"; 556: else 557: return \"fcmp%.s %0,%f1\"; 558: } 559: cc_status.flags |= CC_REVERSED; 560: return \"fcmp%.s %1,%f0\"; 561: #else 562: if (FP_REG_P (operands[0])) 563: { 564: if (FP_REG_P (operands[1])) 565: return \"fcmp%.x %1,%0\"; 566: else 567: return \"fcmp%.s %f1,%0\"; 568: } 569: cc_status.flags |= CC_REVERSED; 570: return \"fcmp%.s %f0,%1\"; 571: #endif 572: }") 573: 574: ;; Recognizers for btst instructions. 575: 576: (define_insn "" 577: [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do") 578: (const_int 1) 579: (minus:SI (const_int 7) 580: (match_operand:SI 1 "general_operand" "di"))))] 581: "" 582: "* { return output_btst (operands, operands[1], operands[0], insn, 7); }") 583: 584: (define_insn "" 585: [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d") 586: (const_int 1) 587: (minus:SI (const_int 31) 588: (match_operand:SI 1 "general_operand" "di"))))] 589: "" 590: "* { return output_btst (operands, operands[1], operands[0], insn, 31); }") 591: 592: ;; The following two patterns are like the previous two 593: ;; except that they use the fact that bit-number operands 594: ;; are automatically masked to 3 or 5 bits. 595: 596: (define_insn "" 597: [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do") 598: (const_int 1) 599: (minus:SI (const_int 7) 600: (and:SI 1.1.1.3 ! root 601: (match_operand:SI 1 "register_operand" "d") 1.1 root 602: (const_int 7)))))] 603: "" 604: "* { return output_btst (operands, operands[1], operands[0], insn, 7); }") 605: 606: (define_insn "" 607: [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d") 608: (const_int 1) 609: (minus:SI (const_int 31) 610: (and:SI 1.1.1.3 ! root 611: (match_operand:SI 1 "register_operand" "d") 1.1 root 612: (const_int 31)))))] 613: "" 614: "* { return output_btst (operands, operands[1], operands[0], insn, 31); }") 615: 616: ;; Nonoffsettable mem refs are ok in this one pattern 617: ;; since we don't try to adjust them. 618: (define_insn "" 619: [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "md") 620: (const_int 1) 1.1.1.3 ! root 621: (match_operand:SI 1 "const_int_operand" "n")))] ! 622: "(unsigned) INTVAL (operands[1]) < 8" 1.1 root 623: "* 624: { 625: operands[1] = gen_rtx (CONST_INT, VOIDmode, 7 - INTVAL (operands[1])); 626: return output_btst (operands, operands[1], operands[0], insn, 7); 627: }") 628: 629: (define_insn "" 630: [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "do") 631: (const_int 1) 1.1.1.3 ! root 632: (match_operand:SI 1 "const_int_operand" "n")))] ! 633: "" 1.1 root 634: "* 635: { 636: if (GET_CODE (operands[0]) == MEM) 637: { 638: operands[0] = adj_offsettable_operand (operands[0], 639: INTVAL (operands[1]) / 8); 640: operands[1] = gen_rtx (CONST_INT, VOIDmode, 641: 7 - INTVAL (operands[1]) % 8); 642: return output_btst (operands, operands[1], operands[0], insn, 7); 643: } 644: operands[1] = gen_rtx (CONST_INT, VOIDmode, 645: 31 - INTVAL (operands[1])); 646: return output_btst (operands, operands[1], operands[0], insn, 31); 647: }") 648: 649: 650: ;; move instructions 651: 652: ;; A special case in which it is not desirable 653: ;; to reload the constant into a data register. 654: (define_insn "" 655: [(set (match_operand:SI 0 "push_operand" "=m") 1.1.1.3 ! root 656: (match_operand:SI 1 "const_int_operand" "J"))] ! 657: "INTVAL (operands[1]) >= -0x8000 && INTVAL (operands[1]) < 0x8000" 1.1 root 658: "* 659: { 660: if (operands[1] == const0_rtx) 661: return \"clr%.l %0\"; 662: return \"pea %a1\"; 663: }") 664: 665: ;This is never used. 666: ;(define_insn "swapsi" 667: ; [(set (match_operand:SI 0 "general_operand" "+r") 668: ; (match_operand:SI 1 "general_operand" "+r")) 669: ; (set (match_dup 1) (match_dup 0))] 670: ; "" 671: ; "exg %1,%0") 672: 673: ;; Special case of fullword move when source is zero. 674: ;; The reason this is special is to avoid loading a zero 675: ;; into a data reg with moveq in order to store it elsewhere. 676: 677: (define_insn "" 678: [(set (match_operand:SI 0 "general_operand" "=g") 679: (const_int 0))] 680: ;; clr insns on 68000 read before writing. 681: ;; This isn't so on the 68010, but we have no alternative for it. 682: "(TARGET_68020 683: || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))" 684: "* 685: { 686: if (ADDRESS_REG_P (operands[0])) 687: return \"sub%.l %0,%0\"; 688: /* moveq is faster on the 68000. */ 689: if (DATA_REG_P (operands[0]) && !TARGET_68020) 690: #if defined(MOTOROLA) && !defined(CRDS) 691: return \"moveq%.l %#0,%0\"; 692: #else 693: return \"moveq %#0,%0\"; 694: #endif 695: return \"clr%.l %0\"; 696: }") 697: 698: ;; General case of fullword move. 699: ;; 700: ;; This is the main "hook" for PIC code. When generating 701: ;; PIC, movsi is responsible for determining when the source address 702: ;; needs PIC relocation and appropriately calling legitimize_pic_address 703: ;; to perform the actual relocation. 704: ;; 705: ;; In both the PIC and non-PIC cases the patterns generated will 706: ;; matched by the next define_insn. 707: (define_expand "movsi" 708: [(set (match_operand:SI 0 "general_operand" "") 709: (match_operand:SI 1 "general_operand" ""))] 710: "" 711: " 712: { 713: if (flag_pic && symbolic_operand (operands[1], SImode)) 714: { 715: /* The source is an address which requires PIC relocation. 716: Call legitimize_pic_address with the source, mode, and a relocation 717: register (a new pseudo, or the final destination if reload_in_progress 718: is set). Then fall through normally */ 719: extern rtx legitimize_pic_address(); 720: rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode); 721: operands[1] = legitimize_pic_address (operands[1], SImode, temp); 722: } 723: }") 724: 725: ;; General case of fullword move. The register constraints 726: ;; force integer constants in range for a moveq to be reloaded 727: ;; if they are headed for memory. 728: (define_insn "" 729: ;; Notes: make sure no alternative allows g vs g. 730: ;; We don't allow f-regs since fixed point cannot go in them. 731: ;; We do allow y and x regs since fixed point is allowed in them. 732: [(set (match_operand:SI 0 "general_operand" "=g,da,y,!*x*r*m") 733: (match_operand:SI 1 "general_operand" "daymKs,i,g,*x*r*m"))] 734: "" 735: "* 736: { 737: if (which_alternative == 3) 738: return \"fpmove%.l %x1,fpa0\;fpmove%.l fpa0,%x0\"; 739: if (FPA_REG_P (operands[1]) || FPA_REG_P (operands[0])) 740: return \"fpmove%.l %x1,%x0\"; 741: if (GET_CODE (operands[1]) == CONST_INT) 742: { 743: if (operands[1] == const0_rtx 744: && (DATA_REG_P (operands[0]) 745: || GET_CODE (operands[0]) == MEM) 746: /* clr insns on 68000 read before writing. 747: This isn't so on the 68010, but we have no alternative for it. */ 748: && (TARGET_68020 749: || !(GET_CODE (operands[0]) == MEM 750: && MEM_VOLATILE_P (operands[0])))) 751: return \"clr%.l %0\"; 752: else if (DATA_REG_P (operands[0]) 753: && INTVAL (operands[1]) < 128 754: && INTVAL (operands[1]) >= -128) 755: { 756: #if defined(MOTOROLA) && !defined(CRDS) 757: return \"moveq%.l %1,%0\"; 758: #else 759: return \"moveq %1,%0\"; 760: #endif 761: } 762: else if (DATA_REG_P (operands[0]) 1.1.1.3 ! root 763: /* if -256 < N < 256 but N is not in range for a moveq ! 764: N^ff will be, so use moveq #N^ff, dreg; not.b dreg. */ ! 765: && INTVAL (operands[1]) < 256 ! 766: && INTVAL (operands[1]) >= -256) 1.1 root 767: { 1.1.1.3 ! root 768: operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) ^ 0xff); 1.1 root 769: #if defined(MOTOROLA) && !defined(CRDS) 1.1.1.3 ! root 770: return \"moveq%.l %1,%0\;not%.b %0\"; 1.1 root 771: #else 1.1.1.3 ! root 772: return \"moveq %1,%0\;not%.b %0\"; ! 773: #endif 1.1 root 774: } 775: else if (ADDRESS_REG_P (operands[0]) 776: && INTVAL (operands[1]) < 0x8000 777: && INTVAL (operands[1]) >= -0x8000) 778: return \"move%.w %1,%0\"; 779: else if (push_operand (operands[0], SImode) 780: && INTVAL (operands[1]) < 0x8000 781: && INTVAL (operands[1]) >= -0x8000) 782: return \"pea %a1\"; 783: } 784: else if ((GET_CODE (operands[1]) == SYMBOL_REF 785: || GET_CODE (operands[1]) == CONST) 786: && push_operand (operands[0], SImode)) 787: return \"pea %a1\"; 788: else if ((GET_CODE (operands[1]) == SYMBOL_REF 789: || GET_CODE (operands[1]) == CONST) 790: && ADDRESS_REG_P (operands[0])) 791: return \"lea %a1,%0\"; 792: return \"move%.l %1,%0\"; 793: }") 794: 795: (define_insn "movhi" 796: [(set (match_operand:HI 0 "general_operand" "=g") 797: (match_operand:HI 1 "general_operand" "g"))] 798: "" 799: "* 800: { 801: if (GET_CODE (operands[1]) == CONST_INT) 802: { 803: if (operands[1] == const0_rtx 804: && (DATA_REG_P (operands[0]) 805: || GET_CODE (operands[0]) == MEM) 806: /* clr insns on 68000 read before writing. 807: This isn't so on the 68010, but we have no alternative for it. */ 808: && (TARGET_68020 809: || !(GET_CODE (operands[0]) == MEM 810: && MEM_VOLATILE_P (operands[0])))) 811: return \"clr%.w %0\"; 812: else if (DATA_REG_P (operands[0]) 813: && INTVAL (operands[1]) < 128 814: && INTVAL (operands[1]) >= -128) 815: { 816: #if defined(MOTOROLA) && !defined(CRDS) 817: return \"moveq%.l %1,%0\"; 818: #else 819: return \"moveq %1,%0\"; 820: #endif 821: } 822: else if (INTVAL (operands[1]) < 0x8000 823: && INTVAL (operands[1]) >= -0x8000) 824: return \"move%.w %1,%0\"; 825: } 826: else if (CONSTANT_P (operands[1])) 827: return \"move%.l %1,%0\"; 828: #ifndef SGS_NO_LI 829: /* Recognize the insn before a tablejump, one that refers 830: to a table of offsets. Such an insn will need to refer 831: to a label on the insn. So output one. Use the label-number 1.1.1.3 ! root 832: of the table of offsets to generate this label. This code, ! 833: and similar code below, assumes that there will be at most one ! 834: reference to each table. */ 1.1 root 835: if (GET_CODE (operands[1]) == MEM 836: && GET_CODE (XEXP (operands[1], 0)) == PLUS 1.1.1.3 ! root 837: && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == LABEL_REF ! 838: && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) != PLUS) ! 839: { ! 840: rtx labelref = XEXP (XEXP (operands[1], 0), 1); 1.1 root 841: #if defined (MOTOROLA) && !defined (SGS_SWITCH_TABLES) 842: #ifdef SGS 843: asm_fprintf (asm_out_file, \"\\tset %LLI%d,.+2\\n\", 844: CODE_LABEL_NUMBER (XEXP (labelref, 0))); 845: #else /* not SGS */ 846: asm_fprintf (asm_out_file, \"\\t.set %LLI%d,.+2\\n\", 847: CODE_LABEL_NUMBER (XEXP (labelref, 0))); 848: #endif /* not SGS */ 849: #else /* SGS_SWITCH_TABLES or not MOTOROLA */ 850: ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\", 851: CODE_LABEL_NUMBER (XEXP (labelref, 0))); 852: #ifdef SGS_SWITCH_TABLES 853: /* Set flag saying we need to define the symbol 854: LD%n (with value L%n-LI%n) at the end of the switch table. */ 855: switch_table_difference_label_flag = 1; 856: #endif /* SGS_SWITCH_TABLES */ 857: #endif /* SGS_SWITCH_TABLES or not MOTOROLA */ 858: } 859: #endif /* SGS_NO_LI */ 860: return \"move%.w %1,%0\"; 861: }") 862: 863: (define_insn "movstricthi" 864: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm")) 865: (match_operand:HI 1 "general_operand" "rmn"))] 866: "" 867: "* 868: { 869: if (GET_CODE (operands[1]) == CONST_INT) 870: { 871: if (operands[1] == const0_rtx 872: && (DATA_REG_P (operands[0]) 873: || GET_CODE (operands[0]) == MEM) 874: /* clr insns on 68000 read before writing. 875: This isn't so on the 68010, but we have no alternative for it. */ 876: && (TARGET_68020 877: || !(GET_CODE (operands[0]) == MEM 878: && MEM_VOLATILE_P (operands[0])))) 879: return \"clr%.w %0\"; 880: } 881: return \"move%.w %1,%0\"; 882: }") 883: 884: (define_insn "movqi" 885: [(set (match_operand:QI 0 "general_operand" "=d,*a,m,m,?*a") 886: (match_operand:QI 1 "general_operand" "dmi*a,d*a,dmi,?*a,m"))] 887: "" 888: "* 889: { 890: rtx xoperands[4]; 891: 892: /* This is probably useless, since it loses for pushing a struct 893: of several bytes a byte at a time. */ 894: if (GET_CODE (operands[0]) == MEM 895: && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC 1.1.1.3 ! root 896: && XEXP (XEXP (operands[0], 0), 0) == stack_pointer_rtx ! 897: && ! ADDRESS_REG_P (operands[1])) 1.1 root 898: { 899: xoperands[1] = operands[1]; 900: xoperands[2] 901: = gen_rtx (MEM, QImode, 902: gen_rtx (PLUS, VOIDmode, stack_pointer_rtx, const1_rtx)); 903: /* Just pushing a byte puts it in the high byte of the halfword. */ 904: /* We must put it in the low-order, high-numbered byte. */ 905: output_asm_insn (\"move%.b %1,%-\;move%.b %@,%2\", xoperands); 906: return \"\"; 907: } 908: 909: /* Moving a byte into an address register is not possible. */ 910: /* Use d0 as an intermediate, but don't clobber its contents. */ 911: if (ADDRESS_REG_P (operands[0]) && GET_CODE (operands[1]) == MEM) 912: { 913: /* ??? For 2.5, don't allow this choice and use secondary reloads 914: instead. 915: 916: See if the address register is used in the address. If it 917: is, we have to generate a more complex sequence than those below. */ 918: if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1, 919: operands[1], NULL_RTX)) 920: { 921: /* See if the stack pointer is used in the address. If it isn't, 922: we can push d0 or d1 (the insn can't use both of them) on 923: the stack, perform our move into d0/d1, copy the byte from d0/1, 924: and pop d0/1. */ 925: if (! reg_mentioned_p (stack_pointer_rtx, operands[1])) 926: { 1.1.1.3 ! root 927: if (! refers_to_regno_p (0, 1, operands[1], NULL_RTX)) 1.1 root 928: return \"move%.l %/d0,%-\;move%.b %1,%/d0\;move%.l %/d0,%0\;move%.l %+,%/d0\"; 929: else 930: return \"move%.l %/d1,%-\;move%.b %1,%/d1\;move%.l %/d1,%0\;move%.l %+,%/d1\"; 931: } 932: else 933: { 934: /* Otherwise, we know that d0 cannot be used in the address 935: (since sp and one address register is). Assume that sp is 936: being used as a base register and replace the address 937: register that is our operand[0] with d0. */ 938: rtx reg_map[FIRST_PSEUDO_REGISTER]; 939: int i; 940: 941: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 942: reg_map[i] = 0; 943: 944: reg_map[REGNO (operands[0])] = gen_rtx (REG, Pmode, 0); 945: operands[1] = copy_rtx (operands[1]); 946: replace_regs (operands[1], reg_map, FIRST_PSEUDO_REGISTER, 0); 947: return \"exg %/d0,%0\;move%.b %1,%/d0\;exg %/d0,%0\"; 948: } 949: } 950: 951: /* If the address of operand 1 uses d0, choose d1 as intermediate. */ 952: if (refers_to_regno_p (0, 1, operands[1], NULL_RTX)) 953: return \"exg %/d1,%0\;move%.b %1,%/d1\;exg %/d1,%0\"; 954: /* Otherwise d0 is usable. 955: (An effective address on the 68k can't use two d-regs.) */ 956: else 957: return \"exg %/d0,%0\;move%.b %1,%/d0\;exg %/d0,%0\"; 958: } 959: 960: /* Likewise for moving from an address reg. */ 961: if (ADDRESS_REG_P (operands[1]) && GET_CODE (operands[0]) == MEM) 962: { 963: /* ??? For 2.5, don't allow this choice and use secondary reloads 964: instead. 965: 966: See if the address register is used in the address. If it 967: is, we have to generate a more complex sequence than those below. */ 968: if (refers_to_regno_p (REGNO (operands[1]), REGNO (operands[1]) + 1, 969: operands[0], NULL_RTX)) 970: { 971: /* See if the stack pointer is used in the address. If it isn't, 972: we can push d0 or d1 (the insn can't use both of them) on 973: the stack, copy the byte to d0/1, perform our move from d0/d1, 974: and pop d0/1. */ 975: if (! reg_mentioned_p (stack_pointer_rtx, operands[0])) 976: { 1.1.1.3 ! root 977: if (! refers_to_regno_p (0, 1, operands[0], NULL_RTX)) 1.1 root 978: return \"move%.l %/d0,%-\;move%.l %1,%/d0\;move%.b %/d0,%0\;move%.l %+,%/d0\"; 979: else 980: return \"move%.l %/d1,%-\;move%.l %1,%/d1\;move%.b %/d1,%0\;move%.l %+,%/d1\"; 981: } 982: else 983: { 984: /* Otherwise, we know that d0 cannot be used in the address 985: (since sp and one address register is). Assume that sp is 986: being used as a base register and replace the address 987: register that is our operand[1] with d0. */ 988: rtx reg_map[FIRST_PSEUDO_REGISTER]; 989: int i; 990: 991: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 992: reg_map[i] = 0; 993: 994: reg_map[REGNO (operands[1])] = gen_rtx (REG, Pmode, 0); 995: operands[0] = copy_rtx (operands[0]); 996: replace_regs (operands[0], reg_map, FIRST_PSEUDO_REGISTER, 0); 997: return \"exg %/d0,%1\;move%.b %/d0,%0\;exg %/d0,%1\"; 998: } 999: } 1000: 1001: if (refers_to_regno_p (0, 1, operands[0], NULL_RTX)) 1002: return \"exg %/d1,%1\;move%.b %/d1,%0\;exg %/d1,%1\"; 1003: else 1004: return \"exg %/d0,%1\;move%.b %/d0,%0\;exg %/d0,%1\"; 1005: } 1006: 1007: /* clr and st insns on 68000 read before writing. 1008: This isn't so on the 68010, but we have no alternative for it. */ 1009: if (TARGET_68020 1010: || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))) 1011: { 1012: if (operands[1] == const0_rtx) 1013: return \"clr%.b %0\"; 1014: if (GET_CODE (operands[1]) == CONST_INT 1015: && INTVAL (operands[1]) == -1) 1016: { 1017: CC_STATUS_INIT; 1018: return \"st %0\"; 1019: } 1020: } 1021: if (GET_CODE (operands[1]) != CONST_INT && CONSTANT_P (operands[1])) 1022: return \"move%.l %1,%0\"; 1023: if (ADDRESS_REG_P (operands[0]) || ADDRESS_REG_P (operands[1])) 1024: return \"move%.w %1,%0\"; 1025: return \"move%.b %1,%0\"; 1026: }") 1027: 1028: (define_insn "movstrictqi" 1029: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm")) 1030: (match_operand:QI 1 "general_operand" "dmn"))] 1031: "" 1032: "* 1033: { 1034: if (operands[1] == const0_rtx 1035: /* clr insns on 68000 read before writing. 1036: This isn't so on the 68010, but we have no alternative for it. */ 1037: && (TARGET_68020 1038: || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))) 1039: return \"clr%.b %0\"; 1040: return \"move%.b %1,%0\"; 1041: }") 1042: 1043: (define_insn "movsf" 1044: [(set (match_operand:SF 0 "general_operand" "=rmf,x,y,rm,!x,!rm") 1045: (match_operand:SF 1 "general_operand" "rmfF,xH,rmF,y,rm,x"))] 1046: ; [(set (match_operand:SF 0 "general_operand" "=rmf") 1047: ; (match_operand:SF 1 "general_operand" "rmfF"))] 1048: "" 1049: "* 1050: { 1051: if (which_alternative >= 4) 1052: return \"fpmove%.s %1,fpa0\;fpmove%.s fpa0,%0\"; 1053: if (FPA_REG_P (operands[0])) 1054: { 1055: if (FPA_REG_P (operands[1])) 1056: return \"fpmove%.s %x1,%x0\"; 1057: else if (GET_CODE (operands[1]) == CONST_DOUBLE) 1058: return output_move_const_single (operands); 1059: else if (FP_REG_P (operands[1])) 1060: return \"fmove%.s %1,sp@-\;fpmove%.d sp@+, %0\"; 1061: return \"fpmove%.s %x1,%x0\"; 1062: } 1063: if (FPA_REG_P (operands[1])) 1064: { 1065: if (FP_REG_P (operands[0])) 1066: return \"fpmove%.s %x1,sp@-\;fmove%.s sp@+,%0\"; 1067: else 1068: return \"fpmove%.s %x1,%x0\"; 1069: } 1070: if (FP_REG_P (operands[0])) 1071: { 1072: if (FP_REG_P (operands[1])) 1073: return \"f%$move%.x %1,%0\"; 1074: else if (ADDRESS_REG_P (operands[1])) 1075: return \"move%.l %1,%-\;f%$move%.s %+,%0\"; 1076: else if (GET_CODE (operands[1]) == CONST_DOUBLE) 1077: return output_move_const_single (operands); 1078: return \"f%$move%.s %f1,%0\"; 1079: } 1080: if (FP_REG_P (operands[1])) 1081: { 1082: if (ADDRESS_REG_P (operands[0])) 1083: return \"fmove%.s %1,%-\;move%.l %+,%0\"; 1084: return \"fmove%.s %f1,%0\"; 1085: } 1086: return \"move%.l %1,%0\"; 1087: }") 1088: 1089: (define_insn "movdf" 1.1.1.2 root 1090: [(set (match_operand:DF 0 "general_operand" "=rm,rf,rf,&rof<>,y,rm,x,!x,!rm") 1091: (match_operand:DF 1 "general_operand" "rf,m,0,rofE<>,rmE,y,xH,rm,x"))] 1.1 root 1092: ; [(set (match_operand:DF 0 "general_operand" "=rm,&rf,&rof<>") 1093: ; (match_operand:DF 1 "general_operand" "rf,m,rofF<>"))] 1094: "" 1095: "* 1096: { 1.1.1.2 root 1097: if (which_alternative == 7) 1.1 root 1098: return \"fpmove%.d %x1,fpa0\;fpmove%.d fpa0,%x0\"; 1099: if (FPA_REG_P (operands[0])) 1100: { 1101: if (GET_CODE (operands[1]) == CONST_DOUBLE) 1102: return output_move_const_double (operands); 1103: if (FP_REG_P (operands[1])) 1104: return \"fmove%.d %1,sp@-\;fpmove%.d sp@+,%x0\"; 1105: return \"fpmove%.d %x1,%x0\"; 1106: } 1107: else if (FPA_REG_P (operands[1])) 1108: { 1109: if (FP_REG_P(operands[0])) 1110: return \"fpmove%.d %x1,sp@-\;fmoved sp@+,%0\"; 1111: else 1112: return \"fpmove%.d %x1,%x0\"; 1113: } 1114: if (FP_REG_P (operands[0])) 1115: { 1116: if (FP_REG_P (operands[1])) 1117: return \"f%&move%.x %1,%0\"; 1118: if (REG_P (operands[1])) 1119: { 1120: rtx xoperands[2]; 1121: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); 1122: output_asm_insn (\"move%.l %1,%-\", xoperands); 1123: output_asm_insn (\"move%.l %1,%-\", operands); 1124: return \"f%&move%.d %+,%0\"; 1125: } 1126: if (GET_CODE (operands[1]) == CONST_DOUBLE) 1127: return output_move_const_double (operands); 1128: return \"f%&move%.d %f1,%0\"; 1129: } 1130: else if (FP_REG_P (operands[1])) 1131: { 1132: if (REG_P (operands[0])) 1133: { 1134: output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands); 1135: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); 1136: return \"move%.l %+,%0\"; 1137: } 1138: else 1139: return \"fmove%.d %f1,%0\"; 1140: } 1141: return output_move_double (operands); 1142: } 1143: ") 1144: 1145: (define_expand "movxf" 1146: [(set (match_operand:XF 0 "nonimmediate_operand" "") 1147: (match_operand:XF 1 "general_operand" ""))] 1148: "" 1149: " 1150: { 1151: if (CONSTANT_P (operands[1])) 1152: { 1153: operands[1] = force_const_mem (XFmode, operands[1]); 1154: if (! memory_address_p (XFmode, XEXP (operands[1], 0)) 1155: && ! reload_in_progress) 1156: operands[1] = change_address (operands[1], XFmode, 1157: XEXP (operands[1], 0)); 1158: } 1159: }") 1160: 1161: (define_insn "" 1162: [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,!r,!f") 1163: (match_operand:XF 1 "nonimmediate_operand" "m,f,f,f,r"))] 1164: "TARGET_68881" 1165: "* 1166: { 1167: if (FP_REG_P (operands[0])) 1168: { 1169: if (FP_REG_P (operands[1])) 1170: return \"fmove%.x %1,%0\"; 1171: if (REG_P (operands[1])) 1172: { 1173: rtx xoperands[2]; 1174: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2); 1175: output_asm_insn (\"move%.l %1,%-\", xoperands); 1176: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); 1177: output_asm_insn (\"move%.l %1,%-\", xoperands); 1178: output_asm_insn (\"move%.l %1,%-\", operands); 1179: return \"fmove%.x %+,%0\"; 1180: } 1181: if (GET_CODE (operands[1]) == CONST_DOUBLE) 1182: return \"fmove%.x %1,%0\"; 1183: return \"fmove%.x %f1,%0\"; 1184: } 1185: if (REG_P (operands[0])) 1186: { 1187: output_asm_insn (\"fmove%.x %f1,%-\;move%.l %+,%0\", operands); 1188: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); 1189: output_asm_insn (\"move%.l %+,%0\", operands); 1190: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); 1191: return \"move%.l %+,%0\"; 1192: } 1193: return \"fmove%.x %f1,%0\"; 1194: } 1195: ") 1196: 1197: (define_insn "" 1.1.1.2 root 1198: [(set (match_operand:XF 0 "nonimmediate_operand" "=rm,rf,&rof<>") 1.1 root 1199: (match_operand:XF 1 "nonimmediate_operand" "rf,m,rof<>"))] 1200: "! TARGET_68881" 1201: "* 1202: { 1203: if (FP_REG_P (operands[0])) 1204: { 1205: if (FP_REG_P (operands[1])) 1206: return \"fmove%.x %1,%0\"; 1207: if (REG_P (operands[1])) 1208: { 1209: rtx xoperands[2]; 1210: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2); 1211: output_asm_insn (\"move%.l %1,%-\", xoperands); 1212: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); 1213: output_asm_insn (\"move%.l %1,%-\", xoperands); 1214: output_asm_insn (\"move%.l %1,%-\", operands); 1215: return \"fmove%.x %+,%0\"; 1216: } 1217: if (GET_CODE (operands[1]) == CONST_DOUBLE) 1218: return \"fmove%.x %1,%0\"; 1219: return \"fmove%.x %f1,%0\"; 1220: } 1221: if (FP_REG_P (operands[1])) 1222: { 1223: if (REG_P (operands[0])) 1224: { 1225: output_asm_insn (\"fmove%.x %f1,%-\;move%.l %+,%0\", operands); 1226: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); 1227: output_asm_insn (\"move%.l %+,%0\", operands); 1228: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); 1229: return \"move%.l %+,%0\"; 1230: } 1231: else 1232: return \"fmove%.x %f1,%0\"; 1233: } 1234: return output_move_double (operands); 1235: } 1236: ") 1237: 1238: ;; movdi can apply to fp regs in some cases 1239: (define_insn "movdi" 1240: ;; Let's see if it really still needs to handle fp regs, and, if so, why. 1.1.1.2 root 1241: [(set (match_operand:DI 0 "general_operand" "=rm,r,&ro<>,y,rm,!*x,!rm") 1.1 root 1242: (match_operand:DI 1 "general_operand" "rF,m,roi<>F,rmiF,y,rmF,*x"))] 1243: ; [(set (match_operand:DI 0 "general_operand" "=rm,&r,&ro<>,!&rm,!&f,y,rm,x,!x,!rm") 1244: ; (match_operand:DI 1 "general_operand" "r,m,roi<>,fF,rfmF,rmi,y,rm,x"))] 1245: ; [(set (match_operand:DI 0 "general_operand" "=rm,&rf,&ro<>,!&rm,!&f") 1246: ; (match_operand:DI 1 "general_operand" "r,m,roi<>,fF,rfF"))] 1247: "" 1248: "* 1249: { 1250: if (which_alternative == 8) 1251: return \"fpmove%.d %x1,fpa0\;fpmove%.d fpa0,%x0\"; 1252: if (FPA_REG_P (operands[0]) || FPA_REG_P (operands[1])) 1253: return \"fpmove%.d %x1,%x0\"; 1254: if (FP_REG_P (operands[0])) 1255: { 1256: if (FP_REG_P (operands[1])) 1257: return \"fmove%.x %1,%0\"; 1258: if (REG_P (operands[1])) 1259: { 1260: rtx xoperands[2]; 1261: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); 1262: output_asm_insn (\"move%.l %1,%-\", xoperands); 1263: output_asm_insn (\"move%.l %1,%-\", operands); 1264: return \"fmove%.d %+,%0\"; 1265: } 1266: if (GET_CODE (operands[1]) == CONST_DOUBLE) 1267: return output_move_const_double (operands); 1268: return \"fmove%.d %f1,%0\"; 1269: } 1270: else if (FP_REG_P (operands[1])) 1271: { 1272: if (REG_P (operands[0])) 1273: { 1274: output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands); 1275: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); 1276: return \"move%.l %+,%0\"; 1277: } 1278: else 1279: return \"fmove%.d %f1,%0\"; 1280: } 1281: return output_move_double (operands); 1282: } 1283: ") 1284: 1285: ;; Thus goes after the move instructions 1286: ;; because the move instructions are better (require no spilling) 1287: ;; when they can apply. It goes before the add/sub insns 1288: ;; so we will prefer it to them. 1289: 1290: (define_insn "pushasi" 1291: [(set (match_operand:SI 0 "push_operand" "=m") 1292: (match_operand:SI 1 "address_operand" "p"))] 1293: "" 1294: "pea %a1") 1295: 1296: ;; truncation instructions 1297: (define_insn "truncsiqi2" 1298: [(set (match_operand:QI 0 "general_operand" "=dm,d") 1299: (truncate:QI 1300: (match_operand:SI 1 "general_operand" "doJ,i")))] 1301: "" 1302: "* 1303: { 1304: if (GET_CODE (operands[0]) == REG) 1305: { 1306: /* Must clear condition codes, since the move.l bases them on 1307: the entire 32 bits, not just the desired 8 bits. */ 1308: CC_STATUS_INIT; 1309: return \"move%.l %1,%0\"; 1310: } 1311: if (GET_CODE (operands[1]) == MEM) 1312: operands[1] = adj_offsettable_operand (operands[1], 3); 1313: return \"move%.b %1,%0\"; 1314: }") 1315: 1316: (define_insn "trunchiqi2" 1317: [(set (match_operand:QI 0 "general_operand" "=dm,d") 1318: (truncate:QI 1319: (match_operand:HI 1 "general_operand" "doJ,i")))] 1320: "" 1321: "* 1322: { 1323: if (GET_CODE (operands[0]) == REG 1324: && (GET_CODE (operands[1]) == MEM 1325: || GET_CODE (operands[1]) == CONST_INT)) 1326: { 1327: /* Must clear condition codes, since the move.w bases them on 1328: the entire 16 bits, not just the desired 8 bits. */ 1329: CC_STATUS_INIT; 1330: return \"move%.w %1,%0\"; 1331: } 1332: if (GET_CODE (operands[0]) == REG) 1333: { 1334: /* Must clear condition codes, since the move.l bases them on 1335: the entire 32 bits, not just the desired 8 bits. */ 1336: CC_STATUS_INIT; 1337: return \"move%.l %1,%0\"; 1338: } 1339: if (GET_CODE (operands[1]) == MEM) 1340: operands[1] = adj_offsettable_operand (operands[1], 1); 1341: return \"move%.b %1,%0\"; 1342: }") 1343: 1344: (define_insn "truncsihi2" 1345: [(set (match_operand:HI 0 "general_operand" "=dm,d") 1346: (truncate:HI 1347: (match_operand:SI 1 "general_operand" "roJ,i")))] 1348: "" 1349: "* 1350: { 1351: if (GET_CODE (operands[0]) == REG) 1352: { 1353: /* Must clear condition codes, since the move.l bases them on 1354: the entire 32 bits, not just the desired 8 bits. */ 1355: CC_STATUS_INIT; 1356: return \"move%.l %1,%0\"; 1357: } 1358: if (GET_CODE (operands[1]) == MEM) 1359: operands[1] = adj_offsettable_operand (operands[1], 2); 1360: return \"move%.w %1,%0\"; 1361: }") 1362: 1363: ;; zero extension instructions 1364: 1365: (define_expand "zero_extendhisi2" 1366: [(set (match_operand:SI 0 "register_operand" "") 1367: (const_int 0)) 1368: (set (strict_low_part (match_dup 2)) 1369: (match_operand:HI 1 "general_operand" ""))] 1370: "" 1371: " 1372: { 1373: operands[1] = make_safe_from (operands[1], operands[0]); 1374: if (GET_CODE (operands[0]) == SUBREG) 1375: operands[2] = gen_rtx (SUBREG, HImode, SUBREG_REG (operands[0]), 1376: SUBREG_WORD (operands[0])); 1377: else 1378: operands[2] = gen_rtx (SUBREG, HImode, operands[0], 0); 1379: }") 1380: 1381: (define_expand "zero_extendqihi2" 1382: [(set (match_operand:HI 0 "register_operand" "") 1383: (const_int 0)) 1384: (set (strict_low_part (match_dup 2)) 1385: (match_operand:QI 1 "general_operand" ""))] 1386: "" 1387: " 1388: { 1389: operands[1] = make_safe_from (operands[1], operands[0]); 1390: if (GET_CODE (operands[0]) == SUBREG) 1391: operands[2] = gen_rtx (SUBREG, QImode, SUBREG_REG (operands[0]), 1392: SUBREG_WORD (operands[0])); 1393: else 1394: operands[2] = gen_rtx (SUBREG, QImode, operands[0], 0); 1395: }") 1396: 1397: (define_expand "zero_extendqisi2" 1398: [(set (match_operand:SI 0 "register_operand" "") 1399: (const_int 0)) 1400: (set (strict_low_part (match_dup 2)) 1401: (match_operand:QI 1 "general_operand" ""))] 1402: "" 1403: " 1404: { 1405: operands[1] = make_safe_from (operands[1], operands[0]); 1406: if (GET_CODE (operands[0]) == SUBREG) 1407: operands[2] = gen_rtx (SUBREG, QImode, SUBREG_REG (operands[0]), 1408: SUBREG_WORD (operands[0])); 1409: else 1410: operands[2] = gen_rtx (SUBREG, QImode, operands[0], 0); 1411: }") 1412: 1413: ;; Patterns to recognize zero-extend insns produced by the combiner. 1414: ;; We don't allow both operands in memory, because of aliasing problems. 1415: ;; Explicitly disallow two memory operands via the condition since reloading 1416: ;; of this case will result in worse code than the uncombined patterns. 1417: 1418: (define_insn "" 1419: [(set (match_operand:SI 0 "general_operand" "=do<>,d<") 1420: (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))] 1421: "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM" 1422: "* 1423: { 1424: if (DATA_REG_P (operands[0])) 1425: { 1426: if (GET_CODE (operands[1]) == REG 1427: && REGNO (operands[0]) == REGNO (operands[1])) 1428: return \"and%.l %#0xFFFF,%0\"; 1429: if (reg_mentioned_p (operands[0], operands[1])) 1430: return \"move%.w %1,%0\;and%.l %#0xFFFF,%0\"; 1431: return \"clr%.l %0\;move%.w %1,%0\"; 1432: } 1433: else if (GET_CODE (operands[0]) == MEM 1434: && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC) 1435: return \"move%.w %1,%0\;clr%.w %0\"; 1436: else if (GET_CODE (operands[0]) == MEM 1437: && GET_CODE (XEXP (operands[0], 0)) == POST_INC) 1438: return \"clr%.w %0\;move%.w %1,%0\"; 1439: else 1440: { 1441: output_asm_insn (\"clr%.w %0\", operands); 1442: operands[0] = adj_offsettable_operand (operands[0], 2); 1443: return \"move%.w %1,%0\"; 1444: } 1445: }") 1446: 1447: (define_insn "" 1448: [(set (match_operand:HI 0 "general_operand" "=do<>,d") 1449: (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "d,m")))] 1450: "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM" 1451: "* 1452: { 1453: if (DATA_REG_P (operands[0])) 1454: { 1455: if (GET_CODE (operands[1]) == REG 1456: && REGNO (operands[0]) == REGNO (operands[1])) 1457: return \"and%.w %#0xFF,%0\"; 1458: if (reg_mentioned_p (operands[0], operands[1])) 1459: return \"move%.b %1,%0\;and%.w %#0xFF,%0\"; 1460: return \"clr%.w %0\;move%.b %1,%0\"; 1461: } 1462: else if (GET_CODE (operands[0]) == MEM 1463: && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC) 1464: { 1465: if (REGNO (XEXP (XEXP (operands[0], 0), 0)) 1466: == STACK_POINTER_REGNUM) 1467: { 1468: output_asm_insn (\"clr%.w %-\", operands); 1469: operands[0] = gen_rtx (MEM, GET_MODE (operands[0]), 1470: plus_constant (stack_pointer_rtx, 1)); 1471: return \"move%.b %1,%0\"; 1472: } 1473: else 1474: return \"move%.b %1,%0\;clr%.b %0\"; 1475: } 1476: else if (GET_CODE (operands[0]) == MEM 1477: && GET_CODE (XEXP (operands[0], 0)) == POST_INC) 1478: return \"clr%.b %0\;move%.b %1,%0\"; 1479: else 1480: { 1481: output_asm_insn (\"clr%.b %0\", operands); 1482: operands[0] = adj_offsettable_operand (operands[0], 1); 1483: return \"move%.b %1,%0\"; 1484: } 1485: }") 1486: 1487: (define_insn "" 1488: [(set (match_operand:SI 0 "general_operand" "=do<>,d") 1489: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "d,m")))] 1490: "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM" 1491: "* 1492: { 1493: if (DATA_REG_P (operands[0])) 1494: { 1495: if (GET_CODE (operands[1]) == REG 1496: && REGNO (operands[0]) == REGNO (operands[1])) 1497: return \"and%.l %#0xFF,%0\"; 1498: if (reg_mentioned_p (operands[0], operands[1])) 1499: return \"move%.b %1,%0\;and%.l %#0xFF,%0\"; 1500: return \"clr%.l %0\;move%.b %1,%0\"; 1501: } 1502: else if (GET_CODE (operands[0]) == MEM 1503: && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC) 1504: { 1505: operands[0] = XEXP (XEXP (operands[0], 0), 0); 1506: #ifdef MOTOROLA 1507: #ifdef SGS 1508: return \"clr%.l -(%0)\;move%.b %1,3(%0)\"; 1509: #else 1510: return \"clr%.l -(%0)\;move%.b %1,(3,%0)\"; 1511: #endif 1512: #else 1513: return \"clrl %0@-\;moveb %1,%0@(3)\"; 1514: #endif 1515: } 1516: else if (GET_CODE (operands[0]) == MEM 1517: && GET_CODE (XEXP (operands[0], 0)) == POST_INC) 1518: { 1519: operands[0] = XEXP (XEXP (operands[0], 0), 0); 1520: #ifdef MOTOROLA 1521: #ifdef SGS 1522: return \"clr%.l (%0)+\;move%.b %1,-1(%0)\"; 1523: #else 1524: return \"clr%.l (%0)+\;move%.b %1,(-1,%0)\"; 1525: #endif 1526: #else 1527: return \"clrl %0@+\;moveb %1,%0@(-1)\"; 1528: #endif 1529: } 1530: else 1531: { 1532: output_asm_insn (\"clr%.l %0\", operands); 1533: operands[0] = adj_offsettable_operand (operands[0], 3); 1534: return \"move%.b %1,%0\"; 1535: } 1536: }") 1537: 1538: ;; sign extension instructions 1539: 1540: (define_insn "extendhisi2" 1541: [(set (match_operand:SI 0 "general_operand" "=*d,a") 1542: (sign_extend:SI 1543: (match_operand:HI 1 "nonimmediate_operand" "0,rm")))] 1544: "" 1545: "* 1546: { 1547: if (ADDRESS_REG_P (operands[0])) 1548: return \"move%.w %1,%0\"; 1549: return \"ext%.l %0\"; 1550: }") 1551: 1552: (define_insn "extendqihi2" 1553: [(set (match_operand:HI 0 "general_operand" "=d") 1554: (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "0")))] 1555: "" 1556: "ext%.w %0") 1557: 1558: (define_insn "extendqisi2" 1559: [(set (match_operand:SI 0 "general_operand" "=d") 1560: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0")))] 1561: "TARGET_68020" 1562: "extb%.l %0") 1563: 1564: ;; Conversions between float and double. 1565: 1566: (define_expand "extendsfdf2" 1567: [(set (match_operand:DF 0 "general_operand" "") 1568: (float_extend:DF 1569: (match_operand:SF 1 "general_operand" "")))] 1570: "TARGET_68881 || TARGET_FPA" 1571: "") 1572: 1573: (define_insn "" 1574: [(set (match_operand:DF 0 "general_operand" "=x,y") 1575: (float_extend:DF 1576: (match_operand:SF 1 "general_operand" "xH,rmF")))] 1577: "TARGET_FPA" 1578: "fpstod %w1,%0") 1579: 1580: (define_insn "" 1581: [(set (match_operand:DF 0 "general_operand" "=*fdm,f") 1582: (float_extend:DF 1583: (match_operand:SF 1 "general_operand" "f,dmF")))] 1584: "TARGET_68881" 1585: "* 1586: { 1587: if (FP_REG_P (operands[0]) && FP_REG_P (operands[1])) 1588: { 1589: if (REGNO (operands[0]) == REGNO (operands[1])) 1590: { 1591: /* Extending float to double in an fp-reg is a no-op. 1592: NOTICE_UPDATE_CC has already assumed that the 1593: cc will be set. So cancel what it did. */ 1594: cc_status = cc_prev_status; 1595: return \"\"; 1596: } 1597: return \"f%&move%.x %1,%0\"; 1598: } 1599: if (FP_REG_P (operands[0])) 1600: return \"f%&move%.s %f1,%0\"; 1601: if (DATA_REG_P (operands[0]) && FP_REG_P (operands[1])) 1602: { 1603: output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands); 1604: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); 1605: return \"move%.l %+,%0\"; 1606: } 1607: return \"fmove%.d %f1,%0\"; 1608: }") 1609: 1610: ;; This cannot output into an f-reg because there is no way to be 1611: ;; sure of truncating in that case. 1612: ;; But on the Sun FPA, we can be sure. 1613: (define_expand "truncdfsf2" 1614: [(set (match_operand:SF 0 "general_operand" "") 1615: (float_truncate:SF 1616: (match_operand:DF 1 "general_operand" "")))] 1617: "TARGET_68881 || TARGET_FPA" 1618: "") 1619: 1620: (define_insn "" 1621: [(set (match_operand:SF 0 "general_operand" "=x,y") 1622: (float_truncate:SF 1623: (match_operand:DF 1 "general_operand" "xH,rmF")))] 1624: "TARGET_FPA" 1625: "fpdtos %y1,%0") 1626: 1627: ;; On the '040 we can truncate in a register accurately and easily. 1628: (define_insn "" 1629: [(set (match_operand:SF 0 "general_operand" "=f") 1630: (float_truncate:SF 1631: (match_operand:DF 1 "general_operand" "fmG")))] 1632: "TARGET_68040_ONLY" 1633: "* 1634: { 1635: if (FP_REG_P (operands[1])) 1636: return \"f%$move%.x %1,%0\"; 1637: return \"f%$move%.d %f1,%0\"; 1638: }") 1639: 1640: (define_insn "" 1641: [(set (match_operand:SF 0 "general_operand" "=dm") 1642: (float_truncate:SF 1643: (match_operand:DF 1 "general_operand" "f")))] 1644: "TARGET_68881" 1645: "fmove%.s %f1,%0") 1646: 1647: ;; Conversion between fixed point and floating point. 1648: ;; Note that among the fix-to-float insns 1649: ;; the ones that start with SImode come first. 1650: ;; That is so that an operand that is a CONST_INT 1651: ;; (and therefore lacks a specific machine mode). 1652: ;; will be recognized as SImode (which is always valid) 1653: ;; rather than as QImode or HImode. 1654: 1655: (define_expand "floatsisf2" 1656: [(set (match_operand:SF 0 "general_operand" "") 1657: (float:SF (match_operand:SI 1 "general_operand" "")))] 1658: "TARGET_68881 || TARGET_FPA" 1659: "") 1660: 1661: (define_insn "" 1662: [(set (match_operand:SF 0 "general_operand" "=y,x") 1663: (float:SF (match_operand:SI 1 "general_operand" "rmi,x")))] 1664: "TARGET_FPA" 1665: "fpltos %1,%0") 1666: 1667: (define_insn "" 1668: [(set (match_operand:SF 0 "general_operand" "=f") 1669: (float:SF (match_operand:SI 1 "general_operand" "dmi")))] 1670: "TARGET_68881" 1671: "f%$move%.l %1,%0") 1672: 1673: (define_expand "floatsidf2" 1674: [(set (match_operand:DF 0 "general_operand" "") 1675: (float:DF (match_operand:SI 1 "general_operand" "")))] 1676: "TARGET_68881 || TARGET_FPA" 1677: "") 1678: 1679: (define_insn "" 1680: [(set (match_operand:DF 0 "general_operand" "=y,x") 1681: (float:DF (match_operand:SI 1 "general_operand" "rmi,x")))] 1682: "TARGET_FPA" 1683: "fpltod %1,%0") 1684: 1685: (define_insn "" 1686: [(set (match_operand:DF 0 "general_operand" "=f") 1687: (float:DF (match_operand:SI 1 "general_operand" "dmi")))] 1688: "TARGET_68881" 1689: "f%&move%.l %1,%0") 1690: 1691: (define_insn "floathisf2" 1692: [(set (match_operand:SF 0 "general_operand" "=f") 1693: (float:SF (match_operand:HI 1 "general_operand" "dmn")))] 1694: "TARGET_68881" 1695: "f%$move%.w %1,%0") 1696: 1697: (define_insn "floathidf2" 1698: [(set (match_operand:DF 0 "general_operand" "=f") 1699: (float:DF (match_operand:HI 1 "general_operand" "dmn")))] 1700: "TARGET_68881" 1701: "fmove%.w %1,%0") 1702: 1703: (define_insn "floatqisf2" 1704: [(set (match_operand:SF 0 "general_operand" "=f") 1705: (float:SF (match_operand:QI 1 "general_operand" "dmn")))] 1706: "TARGET_68881" 1707: "fmove%.b %1,%0") 1708: 1709: (define_insn "floatqidf2" 1710: [(set (match_operand:DF 0 "general_operand" "=f") 1711: (float:DF (match_operand:QI 1 "general_operand" "dmn")))] 1712: "TARGET_68881" 1713: "f%&move%.b %1,%0") 1714: 1715: ;; New routines to convert floating-point values to integers 1716: ;; to be used on the '040. These should be faster than trapping 1717: ;; into the kernel to emulate fintrz. They should also be faster 1718: ;; than calling the subroutines fixsfsi or fixdfsi. 1719: 1720: (define_insn "fix_truncdfsi2" 1721: [(set (match_operand:SI 0 "general_operand" "=dm") 1722: (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f")))) 1723: (clobber (match_scratch:SI 2 "=d")) 1724: (clobber (match_scratch:SI 3 "=d"))] 1.1.1.2 root 1725: "TARGET_68881 && TARGET_68040" 1.1 root 1726: "* 1727: { 1728: CC_STATUS_INIT; 1729: return \"fmovem%.l %!,%2\;moveq %#16,%3\;or%.l %2,%3\;and%.w %#-33,%3\;fmovem%.l %3,%!\;fmove%.l %1,%0\;fmovem%.l %2,%!\"; 1730: }") 1731: 1732: (define_insn "fix_truncdfhi2" 1733: [(set (match_operand:HI 0 "general_operand" "=dm") 1734: (fix:HI (fix:DF (match_operand:DF 1 "register_operand" "f")))) 1735: (clobber (match_scratch:SI 2 "=d")) 1736: (clobber (match_scratch:SI 3 "=d"))] 1.1.1.2 root 1737: "TARGET_68881 && TARGET_68040" 1.1 root 1738: "* 1739: { 1740: CC_STATUS_INIT; 1741: return \"fmovem%.l %!,%2\;moveq %#16,%3\;or%.l %2,%3\;and%.w %#-33,%3\;fmovem%.l %3,%!\;fmove%.w %1,%0\;fmovem%.l %2,%!\"; 1742: }") 1743: 1744: (define_insn "fix_truncdfqi2" 1745: [(set (match_operand:QI 0 "general_operand" "=dm") 1746: (fix:QI (fix:DF (match_operand:DF 1 "register_operand" "f")))) 1747: (clobber (match_scratch:SI 2 "=d")) 1748: (clobber (match_scratch:SI 3 "=d"))] 1.1.1.2 root 1749: "TARGET_68881 && TARGET_68040" 1.1 root 1750: "* 1751: { 1752: CC_STATUS_INIT; 1753: return \"fmovem%.l %!,%2\;moveq %#16,%3\;or%.l %2,%3\;and%.w %#-33,%3\;fmovem%.l %3,%!\;fmove%.b %1,%0\;fmovem%.l %2,%!\"; 1754: }") 1755: 1756: ;; Convert a float to a float whose value is an integer. 1757: ;; This is the first stage of converting it to an integer type. 1758: 1759: (define_insn "ftruncdf2" 1760: [(set (match_operand:DF 0 "general_operand" "=f") 1761: (fix:DF (match_operand:DF 1 "general_operand" "fFm")))] 1762: "TARGET_68881 && !TARGET_68040" 1763: "* 1764: { 1765: if (FP_REG_P (operands[1])) 1766: return \"fintrz%.x %f1,%0\"; 1767: return \"fintrz%.d %f1,%0\"; 1768: }") 1769: 1770: (define_insn "ftruncsf2" 1771: [(set (match_operand:SF 0 "general_operand" "=f") 1772: (fix:SF (match_operand:SF 1 "general_operand" "dfFm")))] 1773: "TARGET_68881 && !TARGET_68040" 1774: "* 1775: { 1776: if (FP_REG_P (operands[1])) 1777: return \"fintrz%.x %f1,%0\"; 1778: return \"fintrz%.s %f1,%0\"; 1779: }") 1780: 1781: ;; Convert a float whose value is an integer 1782: ;; to an actual integer. Second stage of converting float to integer type. 1783: (define_insn "fixsfqi2" 1784: [(set (match_operand:QI 0 "general_operand" "=dm") 1785: (fix:QI (match_operand:SF 1 "general_operand" "f")))] 1786: "TARGET_68881" 1787: "fmove%.b %1,%0") 1788: 1789: (define_insn "fixsfhi2" 1790: [(set (match_operand:HI 0 "general_operand" "=dm") 1791: (fix:HI (match_operand:SF 1 "general_operand" "f")))] 1792: "TARGET_68881" 1793: "fmove%.w %1,%0") 1794: 1795: (define_insn "fixsfsi2" 1796: [(set (match_operand:SI 0 "general_operand" "=dm") 1797: (fix:SI (match_operand:SF 1 "general_operand" "f")))] 1798: "TARGET_68881" 1799: "fmove%.l %1,%0") 1800: 1801: (define_insn "fixdfqi2" 1802: [(set (match_operand:QI 0 "general_operand" "=dm") 1803: (fix:QI (match_operand:DF 1 "general_operand" "f")))] 1804: "TARGET_68881" 1805: "fmove%.b %1,%0") 1806: 1807: (define_insn "fixdfhi2" 1808: [(set (match_operand:HI 0 "general_operand" "=dm") 1809: (fix:HI (match_operand:DF 1 "general_operand" "f")))] 1810: "TARGET_68881" 1811: "fmove%.w %1,%0") 1812: 1813: (define_insn "fixdfsi2" 1814: [(set (match_operand:SI 0 "general_operand" "=dm") 1815: (fix:SI (match_operand:DF 1 "general_operand" "f")))] 1816: "TARGET_68881" 1817: "fmove%.l %1,%0") 1818: 1819: ;; Convert a float to an integer. 1820: ;; On the Sun FPA, this is done in one step. 1821: 1822: (define_insn "" 1823: [(set (match_operand:SI 0 "general_operand" "=x,y") 1824: (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "xH,rmF"))))] 1825: "TARGET_FPA" 1826: "fpstol %w1,%0") 1827: 1828: (define_insn "" 1829: [(set (match_operand:SI 0 "general_operand" "=x,y") 1830: (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "xH,rmF"))))] 1831: "TARGET_FPA" 1832: "fpdtol %y1,%0") 1833: 1834: ;; add instructions 1835: 1836: ;; Note that the middle two alternatives are near-duplicates 1837: ;; in order to handle insns generated by reload. 1838: ;; This is needed since they are not themselves reloaded, 1839: ;; so commutativity won't apply to them. 1840: (define_insn "addsi3" 1841: [(set (match_operand:SI 0 "general_operand" "=m,?a,?a,r") 1842: (plus:SI (match_operand:SI 1 "general_operand" "%0,a,rJK,0") 1843: (match_operand:SI 2 "general_operand" "dIKLs,rJK,a,mrIKLs")))] 1844: "" 1845: "* 1846: { 1847: if (! operands_match_p (operands[0], operands[1])) 1848: { 1849: if (!ADDRESS_REG_P (operands[1])) 1850: { 1851: rtx tmp = operands[1]; 1852: 1853: operands[1] = operands[2]; 1854: operands[2] = tmp; 1855: } 1856: 1857: /* These insns can result from reloads to access 1858: stack slots over 64k from the frame pointer. */ 1859: if (GET_CODE (operands[2]) == CONST_INT 1860: && INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000) 1861: return \"move%.l %2,%0\;add%.l %1,%0\"; 1862: #ifdef SGS 1863: if (GET_CODE (operands[2]) == REG) 1864: return \"lea 0(%1,%2.l),%0\"; 1865: else 1866: return \"lea %c2(%1),%0\"; 1867: #else /* not SGS */ 1868: #ifdef MOTOROLA 1869: if (GET_CODE (operands[2]) == REG) 1870: return \"lea (%1,%2.l),%0\"; 1871: else 1872: return \"lea (%c2,%1),%0\"; 1873: #else /* not MOTOROLA (MIT syntax) */ 1874: if (GET_CODE (operands[2]) == REG) 1875: return \"lea %1@(0,%2:l),%0\"; 1876: else 1877: return \"lea %1@(%c2),%0\"; 1878: #endif /* not MOTOROLA */ 1879: #endif /* not SGS */ 1880: } 1881: if (GET_CODE (operands[2]) == CONST_INT) 1882: { 1883: #ifndef NO_ADDSUB_Q 1884: if (INTVAL (operands[2]) > 0 1885: && INTVAL (operands[2]) <= 8) 1886: return (ADDRESS_REG_P (operands[0]) 1887: ? \"addq%.w %2,%0\" 1888: : \"addq%.l %2,%0\"); 1889: if (INTVAL (operands[2]) < 0 1890: && INTVAL (operands[2]) >= -8) 1891: { 1892: operands[2] = gen_rtx (CONST_INT, VOIDmode, 1893: - INTVAL (operands[2])); 1894: return (ADDRESS_REG_P (operands[0]) 1895: ? \"subq%.w %2,%0\" 1896: : \"subq%.l %2,%0\"); 1897: } 1898: /* On everything except the 68000 it is faster to use two 1899: addqw instructions to add a small integer (8 < N <= 16) 1900: to an address register. Likewise for subqw.*/ 1901: if (INTVAL (operands[2]) > 8 1902: && INTVAL (operands[2]) <= 16 1903: && ADDRESS_REG_P (operands[0]) 1904: && TARGET_68020) 1905: { 1906: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 8); 1907: return \"addq%.w %#8,%0\;addq%.w %2,%0\"; 1908: } 1909: if (INTVAL (operands[2]) < -8 1910: && INTVAL (operands[2]) >= -16 1911: && ADDRESS_REG_P (operands[0]) 1912: && TARGET_68020) 1913: { 1914: operands[2] = gen_rtx (CONST_INT, VOIDmode, 1915: - INTVAL (operands[2]) - 8); 1916: return \"subq%.w %#8,%0\;subq%.w %2,%0\"; 1917: } 1918: #endif 1919: if (ADDRESS_REG_P (operands[0]) 1920: && INTVAL (operands[2]) >= -0x8000 1921: && INTVAL (operands[2]) < 0x8000) 1922: return \"add%.w %2,%0\"; 1923: } 1924: return \"add%.l %2,%0\"; 1925: }") 1926: 1927: (define_insn "" 1928: [(set (match_operand:SI 0 "general_operand" "=a") 1929: (plus:SI (match_operand:SI 1 "general_operand" "0") 1930: (sign_extend:SI 1931: (match_operand:HI 2 "nonimmediate_operand" "rm"))))] 1932: "" 1933: "add%.w %2,%0") 1934: 1935: (define_insn "addhi3" 1936: [(set (match_operand:HI 0 "general_operand" "=m,r") 1937: (plus:HI (match_operand:HI 1 "general_operand" "%0,0") 1938: (match_operand:HI 2 "general_operand" "dn,rmn")))] 1939: "" 1940: "* 1941: { 1942: #ifndef NO_ADDSUB_Q 1943: if (GET_CODE (operands[2]) == CONST_INT) 1944: { 1945: /* If the constant would be a negative number when interpreted as 1946: HImode, make it negative. This is usually, but not always, done 1947: elsewhere in the compiler. First check for constants out of range, 1948: which could confuse us. */ 1949: 1950: if (INTVAL (operands[2]) >= 32768) 1951: operands[2] = gen_rtx (CONST_INT, VOIDmode, 1952: INTVAL (operands[2]) - 65536); 1953: 1954: if (INTVAL (operands[2]) > 0 1955: && INTVAL (operands[2]) <= 8) 1956: return \"addq%.w %2,%0\"; 1957: if (INTVAL (operands[2]) < 0 1958: && INTVAL (operands[2]) >= -8) 1959: { 1960: operands[2] = gen_rtx (CONST_INT, VOIDmode, 1961: - INTVAL (operands[2])); 1962: return \"subq%.w %2,%0\"; 1963: } 1964: /* On everything except the 68000 it is faster to use two 1965: addqw instructions to add a small integer (8 < N <= 16) 1966: to an address register. Likewise for subqw. */ 1967: if (INTVAL (operands[2]) > 8 1968: && INTVAL (operands[2]) <= 16 1969: && ADDRESS_REG_P (operands[0]) 1970: && TARGET_68020) 1971: { 1972: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 8); 1973: return \"addq%.w %#8,%0\;addq%.w %2,%0\"; 1974: } 1975: if (INTVAL (operands[2]) < -8 1976: && INTVAL (operands[2]) >= -16 1977: && ADDRESS_REG_P (operands[0]) 1978: && TARGET_68020) 1979: { 1980: operands[2] = gen_rtx (CONST_INT, VOIDmode, 1981: - INTVAL (operands[2]) - 8); 1982: return \"subq%.w %#8,%0\;subq%.w %2,%0\"; 1983: } 1984: } 1985: #endif 1986: return \"add%.w %2,%0\"; 1987: }") 1988: 1989: ;; These insns must use MATCH_DUP instead of the more expected 1990: ;; use of a matching constraint because the "output" here is also 1991: ;; an input, so you can't use the matching constraint. That also means 1992: ;; that you can't use the "%", so you need patterns with the matched 1993: ;; operand in both positions. 1994: 1995: (define_insn "" 1996: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d")) 1997: (plus:HI (match_dup 0) 1998: (match_operand:HI 1 "general_operand" "dn,rmn")))] 1999: "" 2000: "* 2001: { 2002: #ifndef NO_ADDSUB_Q 2003: if (GET_CODE (operands[1]) == CONST_INT) 2004: { 2005: /* If the constant would be a negative number when interpreted as 2006: HImode, make it negative. This is usually, but not always, done 2007: elsewhere in the compiler. First check for constants out of range, 2008: which could confuse us. */ 2009: 2010: if (INTVAL (operands[1]) >= 32768) 2011: operands[1] = gen_rtx (CONST_INT, VOIDmode, 2012: INTVAL (operands[1]) - 65536); 2013: 2014: if (INTVAL (operands[1]) > 0 2015: && INTVAL (operands[1]) <= 8) 2016: return \"addq%.w %1,%0\"; 2017: if (INTVAL (operands[1]) < 0 2018: && INTVAL (operands[1]) >= -8) 2019: { 2020: operands[1] = gen_rtx (CONST_INT, VOIDmode, 2021: - INTVAL (operands[1])); 2022: return \"subq%.w %1,%0\"; 2023: } 2024: /* On everything except the 68000 it is faster to use two 2025: addqw instructions to add a small integer (8 < N <= 16) 2026: to an address register. Likewise for subqw. */ 2027: if (INTVAL (operands[1]) > 8 2028: && INTVAL (operands[1]) <= 16 2029: && ADDRESS_REG_P (operands[0]) 2030: && TARGET_68020) 2031: { 2032: operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) - 8); 2033: return \"addq%.w %#8,%0\;addq%.w %1,%0\"; 2034: } 2035: if (INTVAL (operands[1]) < -8 2036: && INTVAL (operands[1]) >= -16 2037: && ADDRESS_REG_P (operands[0]) 2038: && TARGET_68020) 2039: { 2040: operands[1] = gen_rtx (CONST_INT, VOIDmode, 2041: - INTVAL (operands[1]) - 8); 2042: return \"subq%.w %#8,%0\;subq%.w %1,%0\"; 2043: } 2044: } 2045: #endif 2046: return \"add%.w %1,%0\"; 2047: }") 2048: 2049: (define_insn "" 2050: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d")) 2051: (plus:HI (match_operand:HI 1 "general_operand" "dn,rmn") 2052: (match_dup 0)))] 2053: "" 2054: "* 2055: { 2056: #ifndef NO_ADDSUB_Q 2057: if (GET_CODE (operands[1]) == CONST_INT) 2058: { 2059: /* If the constant would be a negative number when interpreted as 2060: HImode, make it negative. This is usually, but not always, done 2061: elsewhere in the compiler. First check for constants out of range, 2062: which could confuse us. */ 2063: 2064: if (INTVAL (operands[1]) >= 32768) 2065: operands[1] = gen_rtx (CONST_INT, VOIDmode, 2066: INTVAL (operands[1]) - 65536); 2067: 2068: if (INTVAL (operands[1]) > 0 2069: && INTVAL (operands[1]) <= 8) 2070: return \"addq%.w %1,%0\"; 2071: if (INTVAL (operands[1]) < 0 2072: && INTVAL (operands[1]) >= -8) 2073: { 2074: operands[1] = gen_rtx (CONST_INT, VOIDmode, 2075: - INTVAL (operands[1])); 2076: return \"subq%.w %1,%0\"; 2077: } 2078: /* On everything except the 68000 it is faster to use two 2079: addqw instructions to add a small integer (8 < N <= 16) 2080: to an address register. Likewise for subqw. */ 2081: if (INTVAL (operands[1]) > 8 2082: && INTVAL (operands[1]) <= 16 2083: && ADDRESS_REG_P (operands[0]) 2084: && TARGET_68020) 2085: { 2086: operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) - 8); 2087: return \"addq%.w %#8,%0\;addq%.w %1,%0\"; 2088: } 2089: if (INTVAL (operands[1]) < -8 2090: && INTVAL (operands[1]) >= -16 2091: && ADDRESS_REG_P (operands[0]) 2092: && TARGET_68020) 2093: { 2094: operands[1] = gen_rtx (CONST_INT, VOIDmode, 2095: - INTVAL (operands[1]) - 8); 2096: return \"subq%.w %#8,%0\;subq%.w %1,%0\"; 2097: } 2098: } 2099: #endif 2100: return \"add%.w %1,%0\"; 2101: }") 2102: 2103: (define_insn "addqi3" 2104: [(set (match_operand:QI 0 "general_operand" "=m,d") 2105: (plus:QI (match_operand:QI 1 "general_operand" "%0,0") 2106: (match_operand:QI 2 "general_operand" "dn,dmn")))] 2107: "" 2108: "* 2109: { 2110: #ifndef NO_ADDSUB_Q 2111: if (GET_CODE (operands[2]) == CONST_INT) 2112: { 2113: if (INTVAL (operands[2]) >= 128) 2114: operands[2] = gen_rtx (CONST_INT, VOIDmode, 2115: INTVAL (operands[2]) - 256); 2116: 2117: if (INTVAL (operands[2]) > 0 2118: && INTVAL (operands[2]) <= 8) 2119: return \"addq%.b %2,%0\"; 2120: if (INTVAL (operands[2]) < 0 && INTVAL (operands[2]) >= -8) 2121: { 2122: operands[2] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[2])); 2123: return \"subq%.b %2,%0\"; 2124: } 2125: } 2126: #endif 2127: return \"add%.b %2,%0\"; 2128: }") 2129: 2130: (define_insn "" 2131: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d")) 2132: (plus:QI (match_dup 0) 2133: (match_operand:QI 1 "general_operand" "dn,dmn")))] 2134: "" 2135: "* 2136: { 2137: #ifndef NO_ADDSUB_Q 2138: if (GET_CODE (operands[1]) == CONST_INT) 2139: { 2140: if (INTVAL (operands[1]) >= 128) 2141: operands[1] = gen_rtx (CONST_INT, VOIDmode, 2142: INTVAL (operands[1]) - 256); 2143: 2144: if (INTVAL (operands[1]) > 0 2145: && INTVAL (operands[1]) <= 8) 2146: return \"addq%.b %1,%0\"; 2147: if (INTVAL (operands[1]) < 0 && INTVAL (operands[1]) >= -8) 2148: { 2149: operands[1] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[1])); 2150: return \"subq%.b %1,%0\"; 2151: } 2152: } 2153: #endif 2154: return \"add%.b %1,%0\"; 2155: }") 2156: 2157: (define_insn "" 2158: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d")) 2159: (plus:QI (match_operand:QI 1 "general_operand" "dn,dmn") 2160: (match_dup 0)))] 2161: "" 2162: "* 2163: { 2164: #ifndef NO_ADDSUB_Q 2165: if (GET_CODE (operands[1]) == CONST_INT) 2166: { 2167: if (INTVAL (operands[1]) >= 128) 2168: operands[1] = gen_rtx (CONST_INT, VOIDmode, 2169: INTVAL (operands[1]) - 256); 2170: 2171: if (INTVAL (operands[1]) > 0 2172: && INTVAL (operands[1]) <= 8) 2173: return \"addq%.b %1,%0\"; 2174: if (INTVAL (operands[1]) < 0 && INTVAL (operands[1]) >= -8) 2175: { 2176: operands[1] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[1])); 2177: return \"subq%.b %1,%0\"; 2178: } 2179: } 2180: #endif 2181: return \"add%.b %1,%0\"; 2182: }") 2183: 2184: (define_expand "adddf3" 2185: [(set (match_operand:DF 0 "general_operand" "") 2186: (plus:DF (match_operand:DF 1 "general_operand" "") 2187: (match_operand:DF 2 "general_operand" "")))] 2188: "TARGET_68881 || TARGET_FPA" 2189: "") 2190: 2191: (define_insn "" 2192: [(set (match_operand:DF 0 "general_operand" "=x,y") 2193: (plus:DF (match_operand:DF 1 "general_operand" "%xH,y") 2194: (match_operand:DF 2 "general_operand" "xH,dmF")))] 2195: "TARGET_FPA" 2196: "* 2197: { 2198: if (rtx_equal_p (operands[0], operands[1])) 2199: return \"fpadd%.d %y2,%0\"; 2200: if (rtx_equal_p (operands[0], operands[2])) 2201: return \"fpadd%.d %y1,%0\"; 2202: if (which_alternative == 0) 2203: return \"fpadd3%.d %w2,%w1,%0\"; 2204: return \"fpadd3%.d %x2,%x1,%0\"; 2205: }") 2206: 2207: (define_insn "" 2208: [(set (match_operand:DF 0 "general_operand" "=f") 2209: (plus:DF (match_operand:DF 1 "general_operand" "%0") 2210: (match_operand:DF 2 "general_operand" "fmG")))] 2211: "TARGET_68881" 2212: "* 2213: { 2214: if (REG_P (operands[2])) 2215: return \"f%&add%.x %2,%0\"; 2216: return \"f%&add%.d %f2,%0\"; 2217: }") 2218: 2219: (define_expand "addsf3" 2220: [(set (match_operand:SF 0 "general_operand" "") 2221: (plus:SF (match_operand:SF 1 "general_operand" "") 2222: (match_operand:SF 2 "general_operand" "")))] 2223: "TARGET_68881 || TARGET_FPA" 2224: "") 2225: 2226: (define_insn "" 2227: [(set (match_operand:SF 0 "general_operand" "=x,y") 2228: (plus:SF (match_operand:SF 1 "general_operand" "%xH,y") 2229: (match_operand:SF 2 "general_operand" "xH,rmF")))] 2230: "TARGET_FPA" 2231: "* 2232: { 2233: if (rtx_equal_p (operands[0], operands[1])) 2234: return \"fpadd%.s %w2,%0\"; 2235: if (rtx_equal_p (operands[0], operands[2])) 2236: return \"fpadd%.s %w1,%0\"; 2237: if (which_alternative == 0) 2238: return \"fpadd3%.s %w2,%w1,%0\"; 2239: return \"fpadd3%.s %2,%1,%0\"; 2240: }") 2241: 2242: (define_insn "" 2243: [(set (match_operand:SF 0 "general_operand" "=f") 2244: (plus:SF (match_operand:SF 1 "general_operand" "%0") 2245: (match_operand:SF 2 "general_operand" "fdmF")))] 2246: "TARGET_68881" 2247: "* 2248: { 2249: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2])) 2250: return \"f%$add%.x %2,%0\"; 2251: return \"f%$add%.s %f2,%0\"; 2252: }") 2253: 2254: ;; subtract instructions 2255: 2256: (define_insn "subsi3" 1.1.1.3 ! root 2257: [(set (match_operand:SI 0 "general_operand" "=m,r") ! 2258: (minus:SI (match_operand:SI 1 "general_operand" "0,0") ! 2259: (match_operand:SI 2 "general_operand" "ds,mrs")))] 1.1 root 2260: "" 1.1.1.3 ! root 2261: "sub%.l %2,%0") 1.1 root 2262: 2263: (define_insn "" 2264: [(set (match_operand:SI 0 "general_operand" "=a") 2265: (minus:SI (match_operand:SI 1 "general_operand" "0") 2266: (sign_extend:SI 2267: (match_operand:HI 2 "nonimmediate_operand" "rm"))))] 2268: "" 2269: "sub%.w %2,%0") 2270: 2271: (define_insn "subhi3" 2272: [(set (match_operand:HI 0 "general_operand" "=m,r") 2273: (minus:HI (match_operand:HI 1 "general_operand" "0,0") 2274: (match_operand:HI 2 "general_operand" "dn,rmn")))] 2275: "" 2276: "sub%.w %2,%0") 2277: 2278: (define_insn "" 2279: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d")) 2280: (minus:HI (match_dup 0) 2281: (match_operand:HI 1 "general_operand" "dn,rmn")))] 2282: "" 2283: "sub%.w %1,%0") 2284: 2285: (define_insn "subqi3" 2286: [(set (match_operand:QI 0 "general_operand" "=m,d") 2287: (minus:QI (match_operand:QI 1 "general_operand" "0,0") 2288: (match_operand:QI 2 "general_operand" "dn,dmn")))] 2289: "" 2290: "sub%.b %2,%0") 2291: 2292: (define_insn "" 2293: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d")) 2294: (minus:QI (match_dup 0) 2295: (match_operand:QI 1 "general_operand" "dn,dmn")))] 2296: "" 2297: "sub%.b %1,%0") 2298: 2299: (define_expand "subdf3" 2300: [(set (match_operand:DF 0 "general_operand" "") 2301: (minus:DF (match_operand:DF 1 "general_operand" "") 2302: (match_operand:DF 2 "general_operand" "")))] 2303: "TARGET_68881 || TARGET_FPA" 2304: "") 2305: 2306: (define_insn "" 2307: [(set (match_operand:DF 0 "general_operand" "=x,y,y") 2308: (minus:DF (match_operand:DF 1 "general_operand" "xH,y,dmF") 2309: (match_operand:DF 2 "general_operand" "xH,dmF,0")))] 2310: "TARGET_FPA" 2311: "* 2312: { 2313: if (rtx_equal_p (operands[0], operands[2])) 2314: return \"fprsub%.d %y1,%0\"; 2315: if (rtx_equal_p (operands[0], operands[1])) 2316: return \"fpsub%.d %y2,%0\"; 2317: if (which_alternative == 0) 2318: return \"fpsub3%.d %w2,%w1,%0\"; 2319: return \"fpsub3%.d %x2,%x1,%0\"; 2320: }") 2321: 2322: (define_insn "" 2323: [(set (match_operand:DF 0 "general_operand" "=f") 2324: (minus:DF (match_operand:DF 1 "general_operand" "0") 2325: (match_operand:DF 2 "general_operand" "fmG")))] 2326: "TARGET_68881" 2327: "* 2328: { 2329: if (REG_P (operands[2])) 2330: return \"f%&sub%.x %2,%0\"; 2331: return \"f%&sub%.d %f2,%0\"; 2332: }") 2333: 2334: (define_expand "subsf3" 2335: [(set (match_operand:SF 0 "general_operand" "") 2336: (minus:SF (match_operand:SF 1 "general_operand" "") 2337: (match_operand:SF 2 "general_operand" "")))] 2338: "TARGET_68881 || TARGET_FPA" 2339: "") 2340: 2341: (define_insn "" 2342: [(set (match_operand:SF 0 "general_operand" "=x,y,y") 2343: (minus:SF (match_operand:SF 1 "general_operand" "xH,y,rmF") 2344: (match_operand:SF 2 "general_operand" "xH,rmF,0")))] 2345: "TARGET_FPA" 2346: "* 2347: { 2348: if (rtx_equal_p (operands[0], operands[2])) 2349: return \"fprsub%.s %w1,%0\"; 2350: if (rtx_equal_p (operands[0], operands[1])) 2351: return \"fpsub%.s %w2,%0\"; 2352: if (which_alternative == 0) 2353: return \"fpsub3%.s %w2,%w1,%0\"; 2354: return \"fpsub3%.s %2,%1,%0\"; 2355: }") 2356: 2357: (define_insn "" 2358: [(set (match_operand:SF 0 "general_operand" "=f") 2359: (minus:SF (match_operand:SF 1 "general_operand" "0") 2360: (match_operand:SF 2 "general_operand" "fdmF")))] 2361: "TARGET_68881" 2362: "* 2363: { 2364: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2])) 2365: return \"f%$sub%.x %2,%0\"; 2366: return \"f%$sub%.s %f2,%0\"; 2367: }") 2368: 2369: ;; multiply instructions 2370: 2371: (define_insn "mulhi3" 2372: [(set (match_operand:HI 0 "general_operand" "=d") 2373: (mult:HI (match_operand:HI 1 "general_operand" "%0") 2374: (match_operand:HI 2 "general_operand" "dmn")))] 2375: "" 2376: "* 2377: { 2378: #if defined(MOTOROLA) && !defined(CRDS) 2379: return \"muls%.w %2,%0\"; 2380: #else 2381: return \"muls %2,%0\"; 2382: #endif 2383: }") 2384: 2385: (define_insn "mulhisi3" 2386: [(set (match_operand:SI 0 "general_operand" "=d") 2387: (mult:SI (sign_extend:SI 2388: (match_operand:HI 1 "nonimmediate_operand" "%0")) 2389: (sign_extend:SI 2390: (match_operand:HI 2 "nonimmediate_operand" "dm"))))] 2391: "" 2392: "* 2393: { 2394: #if defined(MOTOROLA) && !defined(CRDS) 2395: return \"muls%.w %2,%0\"; 2396: #else 2397: return \"muls %2,%0\"; 2398: #endif 2399: }") 2400: 2401: (define_insn "" 2402: [(set (match_operand:SI 0 "general_operand" "=d") 2403: (mult:SI (sign_extend:SI 2404: (match_operand:HI 1 "nonimmediate_operand" "%0")) 2405: (match_operand:SI 2 "const_int_operand" "n")))] 2406: "INTVAL (operands[2]) >= -0x8000 && INTVAL (operands[2]) <= 0x7fff" 2407: "* 2408: { 2409: #if defined(MOTOROLA) && !defined(CRDS) 2410: return \"muls%.w %2,%0\"; 2411: #else 2412: return \"muls %2,%0\"; 2413: #endif 2414: }") 2415: 2416: (define_insn "mulsi3" 2417: [(set (match_operand:SI 0 "general_operand" "=d") 2418: (mult:SI (match_operand:SI 1 "general_operand" "%0") 2419: (match_operand:SI 2 "general_operand" "dmsK")))] 2420: "TARGET_68020" 2421: "muls%.l %2,%0") 2422: 2423: (define_insn "umulhisi3" 2424: [(set (match_operand:SI 0 "general_operand" "=d") 2425: (mult:SI (zero_extend:SI 2426: (match_operand:HI 1 "nonimmediate_operand" "%0")) 2427: (zero_extend:SI 2428: (match_operand:HI 2 "nonimmediate_operand" "dm"))))] 2429: "" 2430: "* 2431: { 2432: #if defined(MOTOROLA) && !defined(CRDS) 2433: return \"mulu%.w %2,%0\"; 2434: #else 2435: return \"mulu %2,%0\"; 2436: #endif 2437: }") 2438: 2439: (define_insn "" 2440: [(set (match_operand:SI 0 "general_operand" "=d") 2441: (mult:SI (zero_extend:SI 2442: (match_operand:HI 1 "nonimmediate_operand" "%0")) 2443: (match_operand:SI 2 "const_int_operand" "n")))] 2444: "INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 0xffff" 2445: "* 2446: { 2447: #if defined(MOTOROLA) && !defined(CRDS) 2448: return \"mulu%.w %2,%0\"; 2449: #else 2450: return \"mulu %2,%0\"; 2451: #endif 2452: }") 2453: 2454: ;; We need a separate DEFINE_EXPAND for u?mulsidi3 to be able to use the 2455: ;; proper matching constraint. This is because the matching is between 2456: ;; the high-numbered word of the DImode operand[0] and operand[1]. 2457: (define_expand "umulsidi3" 2458: [(parallel 2459: [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 1) 2460: (mult:SI (match_operand:SI 1 "register_operand" "") 2461: (match_operand:SI 2 "nonimmediate_operand" ""))) 2462: (set (subreg:SI (match_dup 0) 0) 2463: (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1)) 2464: (zero_extend:DI (match_dup 2))) 2465: (const_int 32))))])] 2466: "TARGET_68020" 2467: "") 2468: 2469: (define_insn "" 2470: [(set (match_operand:SI 0 "register_operand" "=d") 2471: (mult:SI (match_operand:SI 1 "register_operand" "%0") 2472: (match_operand:SI 2 "nonimmediate_operand" "dm"))) 2473: (set (match_operand:SI 3 "register_operand" "=d") 2474: (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1)) 2475: (zero_extend:DI (match_dup 2))) 2476: (const_int 32))))] 2477: "TARGET_68020" 2478: "mulu%.l %2,%3:%0") 2479: 2480: ; Match immediate case. For 2.4 only match things < 2^31. 2481: ; It's tricky with larger values in these patterns since we need to match 2482: ; values between the two parallel multiplies, between a CONST_DOUBLE and 2483: ; a CONST_INT. 2484: (define_insn "" 2485: [(set (match_operand:SI 0 "register_operand" "=d") 2486: (mult:SI (match_operand:SI 1 "register_operand" "%0") 2487: (match_operand:SI 2 "const_int_operand" "n"))) 2488: (set (match_operand:SI 3 "register_operand" "=d") 2489: (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1)) 2490: (match_dup 2)) 2491: (const_int 32))))] 2492: "TARGET_68020 2493: && (unsigned) INTVAL (operands[2]) <= 0x7fffffff" 2494: "mulu%.l %2,%3:%0") 2495: 2496: (define_expand "mulsidi3" 2497: [(parallel 2498: [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 1) 2499: (mult:SI (match_operand:SI 1 "register_operand" "") 2500: (match_operand:SI 2 "nonimmediate_operand" ""))) 2501: (set (subreg:SI (match_dup 0) 0) 1.1.1.2 root 2502: (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1)) 2503: (sign_extend:DI (match_dup 2))) 2504: (const_int 32))))])] 1.1 root 2505: "TARGET_68020" 2506: "") 2507: 2508: (define_insn "" 2509: [(set (match_operand:SI 0 "register_operand" "=d") 2510: (mult:SI (match_operand:SI 1 "register_operand" "%0") 2511: (match_operand:SI 2 "nonimmediate_operand" "dm"))) 2512: (set (match_operand:SI 3 "register_operand" "=d") 1.1.1.2 root 2513: (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1)) 2514: (sign_extend:DI (match_dup 2))) 2515: (const_int 32))))] 1.1 root 2516: "TARGET_68020" 2517: "muls%.l %2,%3:%0") 2518: 2519: (define_insn "" 2520: [(set (match_operand:SI 0 "register_operand" "=d") 2521: (mult:SI (match_operand:SI 1 "register_operand" "%0") 2522: (match_operand:SI 2 "const_int_operand" "n"))) 2523: (set (match_operand:SI 3 "register_operand" "=d") 1.1.1.2 root 2524: (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1)) 2525: (match_dup 2)) 2526: (const_int 32))))] 1.1 root 2527: "TARGET_68020 2528: /* This test is a noop on 32 bit machines, 2529: but important for a cross-compiler hosted on 64-bit machines. */ 2530: && INTVAL (operands[2]) <= 0x7fffffff 2531: && INTVAL (operands[2]) >= -0x80000000" 2532: "muls%.l %2,%3:%0") 2533: 1.1.1.3 ! root 2534: (define_expand "umulsi3_highpart" ! 2535: [(parallel ! 2536: [(set (match_operand:SI 0 "register_operand" "") ! 2537: (truncate:SI ! 2538: (lshiftrt:DI ! 2539: (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "")) ! 2540: (zero_extend:DI (match_operand:SI 2 "general_operand" ""))) ! 2541: (const_int 32)))) ! 2542: (clobber (match_dup 3))])] ! 2543: "TARGET_68020" ! 2544: " ! 2545: { ! 2546: operands[3] = gen_reg_rtx (SImode); ! 2547: if (CONSTANT_P (operands[2])) ! 2548: { ! 2549: /* We have to rearrange the operand order for the matching constraints. */ ! 2550: emit_insn (gen_const_umulsi3_highpart (operands[0], operands[3], ! 2551: operands[1], operands[2])); ! 2552: DONE; ! 2553: } ! 2554: }") ! 2555: ! 2556: (define_insn "" ! 2557: [(set (match_operand:SI 0 "register_operand" "=d") ! 2558: (truncate:SI ! 2559: (lshiftrt:DI ! 2560: (mult:DI (zero_extend:DI (match_operand:SI 2 "register_operand" "%1")) ! 2561: (zero_extend:DI (match_operand:SI 3 "nonimmediate_operand" "dm"))) ! 2562: (const_int 32)))) ! 2563: (clobber (match_operand:SI 1 "register_operand" "=d"))] ! 2564: "TARGET_68020" ! 2565: "mulu%.l %3,%0:%1") ! 2566: ! 2567: (define_insn "const_umulsi3_highpart" ! 2568: [(set (match_operand:SI 0 "register_operand" "=d") ! 2569: (truncate:SI ! 2570: (lshiftrt:DI ! 2571: (mult:DI (zero_extend:DI (match_operand:SI 2 "register_operand" "1")) ! 2572: (match_operand:DI 3 "immediate_operand" "i")) ! 2573: (const_int 32)))) ! 2574: (clobber (match_operand:SI 1 "register_operand" "=d"))] ! 2575: "TARGET_68020" ! 2576: "mulu%.l %3,%0:%1") ! 2577: ! 2578: (define_expand "smulsi3_highpart" ! 2579: [(parallel ! 2580: [(set (match_operand:SI 0 "register_operand" "") ! 2581: (truncate:SI ! 2582: (lshiftrt:DI ! 2583: (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "")) ! 2584: (sign_extend:DI (match_operand:SI 2 "general_operand" ""))) ! 2585: (const_int 32)))) ! 2586: (clobber (match_dup 3))])] ! 2587: "TARGET_68020" ! 2588: " ! 2589: { ! 2590: operands[3] = gen_reg_rtx (SImode); ! 2591: if (CONSTANT_P (operands[2])) ! 2592: { ! 2593: /* We have to rearrange the operand order for the matching constraints. */ ! 2594: emit_insn (gen_const_smulsi3_highpart (operands[0], operands[3], ! 2595: operands[1], operands[2])); ! 2596: DONE; ! 2597: } ! 2598: }") ! 2599: ! 2600: (define_insn "" ! 2601: [(set (match_operand:SI 0 "register_operand" "=d") ! 2602: (truncate:SI ! 2603: (lshiftrt:DI ! 2604: (mult:DI (sign_extend:DI (match_operand:SI 2 "register_operand" "%1")) ! 2605: (sign_extend:DI (match_operand:SI 3 "nonimmediate_operand" "dm"))) ! 2606: (const_int 32)))) ! 2607: (clobber (match_operand:SI 1 "register_operand" "=d"))] ! 2608: "TARGET_68020" ! 2609: "muls%.l %3,%0:%1") ! 2610: ! 2611: (define_insn "const_smulsi3_highpart" ! 2612: [(set (match_operand:SI 0 "register_operand" "=d") ! 2613: (truncate:SI ! 2614: (lshiftrt:DI ! 2615: (mult:DI (sign_extend:DI (match_operand:SI 2 "register_operand" "1")) ! 2616: (match_operand:DI 3 "immediate_operand" "i")) ! 2617: (const_int 32)))) ! 2618: (clobber (match_operand:SI 1 "register_operand" "=d"))] ! 2619: "TARGET_68020" ! 2620: "muls%.l %3,%0:%1") ! 2621: 1.1 root 2622: (define_expand "muldf3" 2623: [(set (match_operand:DF 0 "general_operand" "") 2624: (mult:DF (match_operand:DF 1 "general_operand" "") 2625: (match_operand:DF 2 "general_operand" "")))] 2626: "TARGET_68881 || TARGET_FPA" 2627: "") 2628: 2629: (define_insn "" 2630: [(set (match_operand:DF 0 "general_operand" "=x,y") 2631: (mult:DF (match_operand:DF 1 "general_operand" "%xH,y") 2632: (match_operand:DF 2 "general_operand" "xH,rmF")))] 2633: "TARGET_FPA" 2634: "* 2635: { 2636: if (rtx_equal_p (operands[1], operands[2])) 2637: return \"fpsqr%.d %y1,%0\"; 2638: if (rtx_equal_p (operands[0], operands[1])) 2639: return \"fpmul%.d %y2,%0\"; 2640: if (rtx_equal_p (operands[0], operands[2])) 2641: return \"fpmul%.d %y1,%0\"; 2642: if (which_alternative == 0) 2643: return \"fpmul3%.d %w2,%w1,%0\"; 2644: return \"fpmul3%.d %x2,%x1,%0\"; 2645: }") 2646: 2647: (define_insn "" 2648: [(set (match_operand:DF 0 "general_operand" "=f") 2649: (mult:DF (match_operand:DF 1 "general_operand" "%0") 2650: (match_operand:DF 2 "general_operand" "fmG")))] 2651: "TARGET_68881" 2652: "* 2653: { 2654: if (GET_CODE (operands[2]) == CONST_DOUBLE 2655: && floating_exact_log2 (operands[2]) && !TARGET_68040) 2656: { 2657: int i = floating_exact_log2 (operands[2]); 2658: operands[2] = gen_rtx (CONST_INT, VOIDmode, i); 2659: return \"fscale%.l %2,%0\"; 2660: } 2661: if (REG_P (operands[2])) 2662: return \"f%&mul%.x %2,%0\"; 2663: return \"f%&mul%.d %f2,%0\"; 2664: }") 2665: 2666: (define_expand "mulsf3" 2667: [(set (match_operand:SF 0 "general_operand" "") 2668: (mult:SF (match_operand:SF 1 "general_operand" "") 2669: (match_operand:SF 2 "general_operand" "")))] 2670: "TARGET_68881 || TARGET_FPA" 2671: "") 2672: 2673: (define_insn "" 2674: [(set (match_operand:SF 0 "general_operand" "=x,y") 2675: (mult:SF (match_operand:SF 1 "general_operand" "%xH,y") 2676: (match_operand:SF 2 "general_operand" "xH,rmF")))] 2677: "TARGET_FPA" 2678: "* 2679: { 2680: if (rtx_equal_p (operands[1], operands[2])) 2681: return \"fpsqr%.s %w1,%0\"; 2682: if (rtx_equal_p (operands[0], operands[1])) 2683: return \"fpmul%.s %w2,%0\"; 2684: if (rtx_equal_p (operands[0], operands[2])) 2685: return \"fpmul%.s %w1,%0\"; 2686: if (which_alternative == 0) 2687: return \"fpmul3%.s %w2,%w1,%0\"; 2688: return \"fpmul3%.s %2,%1,%0\"; 2689: }") 2690: 2691: (define_insn "" 2692: [(set (match_operand:SF 0 "general_operand" "=f") 2693: (mult:SF (match_operand:SF 1 "general_operand" "%0") 2694: (match_operand:SF 2 "general_operand" "fdmF")))] 2695: "TARGET_68881" 2696: "* 2697: { 2698: #ifdef FSGLMUL_USE_S 2699: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2])) 2700: return (TARGET_68040_ONLY 2701: ? \"fsmul%.s %2,%0\" 2702: : \"fsglmul%.s %2,%0\"); 2703: #else 2704: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2])) 2705: return (TARGET_68040_ONLY 2706: ? \"fsmul%.x %2,%0\" 2707: : \"fsglmul%.x %2,%0\"); 2708: #endif 2709: return (TARGET_68040_ONLY 2710: ? \"fsmul%.s %f2,%0\" 2711: : \"fsglmul%.s %f2,%0\"); 2712: }") 2713: 2714: ;; divide instructions 2715: 2716: (define_insn "divhi3" 2717: [(set (match_operand:HI 0 "general_operand" "=d") 2718: (div:HI (match_operand:HI 1 "general_operand" "0") 2719: (match_operand:HI 2 "general_operand" "dmn")))] 2720: "" 2721: "* 2722: { 2723: #ifdef MOTOROLA 2724: return \"ext%.l %0\;divs%.w %2,%0\"; 2725: #else 2726: return \"extl %0\;divs %2,%0\"; 2727: #endif 2728: }") 2729: 1.1.1.2 root 2730: ;; These patterns don't work because the divs instruction is undefined if 2731: ;; the quotient is more than 16 bits. This valid C would be miscompiled: 2732: ;; int n; short d; unsigned short q; ... q = (unsigned int) (n / d); 2733: ;; Imagine what happens when n = 100000 and d = 1. 2734: ;;(define_insn "divhisi3" 2735: ;; [(set (match_operand:HI 0 "general_operand" "=d") 2736: ;; (truncate:HI 2737: ;; (div:SI 2738: ;; (match_operand:SI 1 "general_operand" "0") 2739: ;; (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))] 2740: ;; "" 2741: ;; "* 2742: ;;{ 2743: ;;#ifdef MOTOROLA 2744: ;; return \"divs%.w %2,%0\"; 2745: ;;#else 2746: ;; return \"divs %2,%0\"; 2747: ;;#endif 2748: ;;}") 2749: 2750: ;;(define_insn "" 2751: ;; [(set (match_operand:HI 0 "general_operand" "=d") 2752: ;; (truncate:HI (div:SI (match_operand:SI 1 "general_operand" "0") 2753: ;; (match_operand:SI 2 "const_int_operand" "n"))))] 2754: ;; "" 2755: ;; "* 2756: ;;{ 2757: ;;#ifdef MOTOROLA 2758: ;; return \"divs%.w %2,%0\"; 2759: ;;#else 2760: ;; return \"divs %2,%0\"; 2761: ;;#endif 2762: ;;}") 1.1 root 2763: 2764: (define_insn "udivhi3" 2765: [(set (match_operand:HI 0 "general_operand" "=d") 2766: (udiv:HI (match_operand:HI 1 "general_operand" "0") 2767: (match_operand:HI 2 "general_operand" "dmn")))] 2768: "" 2769: "* 2770: { 2771: #ifdef MOTOROLA 2772: return \"and%.l %#0xFFFF,%0\;divu%.w %2,%0\"; 2773: #else 2774: return \"andl %#0xFFFF,%0\;divu %2,%0\"; 2775: #endif 2776: }") 2777: 1.1.1.2 root 2778: ;; See comment before divhisi3 why these are commented out. 2779: ;;(define_insn "udivhisi3" 2780: ;; [(set (match_operand:HI 0 "general_operand" "=d") 2781: ;; (truncate:HI 2782: ;; (udiv:SI 2783: ;; (match_operand:SI 1 "general_operand" "0") 2784: ;; (zero_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))] 2785: ;; "" 2786: ;; "* 2787: ;;{ 2788: ;;#ifdef MOTOROLA 2789: ;; return \"divu%.w %2,%0\"; 2790: ;;#else 2791: ;; return \"divu %2,%0\"; 2792: ;;#endif 2793: ;;}") 2794: 2795: ;;(define_insn "" 2796: ;; [(set (match_operand:HI 0 "general_operand" "=d") 2797: ;; (truncate:HI (udiv:SI (match_operand:SI 1 "general_operand" "0") 2798: ;; (match_operand:SI 2 "const_int_operand" "n"))))] 2799: ;; "" 2800: ;; "* 2801: ;;{ 2802: ;;#ifdef MOTOROLA 2803: ;; return \"divu%.w %2,%0\"; 2804: ;;#else 2805: ;; return \"divu %2,%0\"; 2806: ;;#endif 2807: ;;}") 1.1 root 2808: 2809: (define_expand "divdf3" 2810: [(set (match_operand:DF 0 "general_operand" "") 2811: (div:DF (match_operand:DF 1 "general_operand" "") 2812: (match_operand:DF 2 "general_operand" "")))] 2813: "TARGET_68881 || TARGET_FPA" 2814: "") 2815: 2816: (define_insn "" 2817: [(set (match_operand:DF 0 "general_operand" "=x,y,y") 2818: (div:DF (match_operand:DF 1 "general_operand" "xH,y,rmF") 2819: (match_operand:DF 2 "general_operand" "xH,rmF,0")))] 2820: "TARGET_FPA" 2821: "* 2822: { 2823: if (rtx_equal_p (operands[0], operands[2])) 2824: return \"fprdiv%.d %y1,%0\"; 2825: if (rtx_equal_p (operands[0], operands[1])) 2826: return \"fpdiv%.d %y2,%0\"; 2827: if (which_alternative == 0) 2828: return \"fpdiv3%.d %w2,%w1,%0\"; 2829: return \"fpdiv3%.d %x2,%x1,%x0\"; 2830: }") 2831: 2832: (define_insn "" 2833: [(set (match_operand:DF 0 "general_operand" "=f") 2834: (div:DF (match_operand:DF 1 "general_operand" "0") 2835: (match_operand:DF 2 "general_operand" "fmG")))] 2836: "TARGET_68881" 2837: "* 2838: { 2839: if (REG_P (operands[2])) 2840: return \"f%&div%.x %2,%0\"; 2841: return \"f%&div%.d %f2,%0\"; 2842: }") 2843: 2844: (define_expand "divsf3" 2845: [(set (match_operand:SF 0 "general_operand" "") 2846: (div:SF (match_operand:SF 1 "general_operand" "") 2847: (match_operand:SF 2 "general_operand" "")))] 2848: "TARGET_68881 || TARGET_FPA" 2849: "") 2850: 2851: (define_insn "" 2852: [(set (match_operand:SF 0 "general_operand" "=x,y,y") 2853: (div:SF (match_operand:SF 1 "general_operand" "xH,y,rmF") 2854: (match_operand:SF 2 "general_operand" "xH,rmF,0")))] 2855: "TARGET_FPA" 2856: "* 2857: { 2858: if (rtx_equal_p (operands[0], operands[1])) 2859: return \"fpdiv%.s %w2,%0\"; 2860: if (rtx_equal_p (operands[0], operands[2])) 2861: return \"fprdiv%.s %w1,%0\"; 2862: if (which_alternative == 0) 2863: return \"fpdiv3%.s %w2,%w1,%0\"; 2864: return \"fpdiv3%.s %2,%1,%0\"; 2865: }") 2866: 2867: (define_insn "" 2868: [(set (match_operand:SF 0 "general_operand" "=f") 2869: (div:SF (match_operand:SF 1 "general_operand" "0") 2870: (match_operand:SF 2 "general_operand" "fdmF")))] 2871: "TARGET_68881" 2872: "* 2873: { 2874: #ifdef FSGLDIV_USE_S 2875: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2])) 2876: return (TARGET_68040_ONLY 2877: ? \"fsdiv%.s %2,%0\" 2878: : \"fsgldiv%.s %2,%0\"); 2879: #else 2880: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2])) 2881: return (TARGET_68040_ONLY 2882: ? \"fsdiv%.x %2,%0\" 2883: : \"fsgldiv%.x %2,%0\"); 2884: #endif 2885: return (TARGET_68040_ONLY 2886: ? \"fsdiv%.s %f2,%0\" 2887: : \"fsgldiv%.s %f2,%0\"); 2888: }") 2889: 2890: ;; Remainder instructions. 2891: 2892: (define_insn "modhi3" 2893: [(set (match_operand:HI 0 "general_operand" "=d") 2894: (mod:HI (match_operand:HI 1 "general_operand" "0") 2895: (match_operand:HI 2 "general_operand" "dmn")))] 2896: "" 2897: "* 2898: { 2899: /* The swap insn produces cc's that don't correspond to the result. */ 2900: CC_STATUS_INIT; 2901: #ifdef MOTOROLA 2902: return \"ext%.l %0\;divs%.w %2,%0\;swap %0\"; 2903: #else 2904: return \"extl %0\;divs %2,%0\;swap %0\"; 2905: #endif 2906: }") 2907: 1.1.1.2 root 2908: ;; See comment before divhisi3 why these are commented out. 2909: ;;(define_insn "modhisi3" 2910: ;; [(set (match_operand:HI 0 "general_operand" "=d") 2911: ;; (truncate:HI 2912: ;; (mod:SI 2913: ;; (match_operand:SI 1 "general_operand" "0") 2914: ;; (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))] 2915: ;; "" 2916: ;; "* 2917: ;;{ 2918: ;; /* The swap insn produces cc's that don't correspond to the result. */ 2919: ;; CC_STATUS_INIT; 2920: ;;#ifdef MOTOROLA 2921: ;; return \"divs%.w %2,%0\;swap %0\"; 2922: ;;#else 2923: ;; return \"divs %2,%0\;swap %0\"; 2924: ;;#endif 2925: ;;}") 2926: 2927: ;;(define_insn "" 2928: ;; [(set (match_operand:HI 0 "general_operand" "=d") 2929: ;; (truncate:HI (mod:SI (match_operand:SI 1 "general_operand" "0") 2930: ;; (match_operand:SI 2 "const_int_operand" "n"))))] 2931: ;; "" 2932: ;; "* 2933: ;;{ 2934: ;; /* The swap insn produces cc's that don't correspond to the result. */ 2935: ;; CC_STATUS_INIT; 2936: ;;#ifdef MOTOROLA 2937: ;; return \"divs%.w %2,%0\;swap %0\"; 2938: ;;#else 2939: ;; return \"divs %2,%0\;swap %0\"; 2940: ;;#endif 2941: ;;}") 1.1 root 2942: 2943: (define_insn "umodhi3" 2944: [(set (match_operand:HI 0 "general_operand" "=d") 2945: (umod:HI (match_operand:HI 1 "general_operand" "0") 2946: (match_operand:HI 2 "general_operand" "dmn")))] 2947: "" 2948: "* 2949: { 2950: /* The swap insn produces cc's that don't correspond to the result. */ 2951: CC_STATUS_INIT; 2952: #ifdef MOTOROLA 2953: return \"and%.l %#0xFFFF,%0\;divu%.w %2,%0\;swap %0\"; 2954: #else 2955: return \"andl %#0xFFFF,%0\;divu %2,%0\;swap %0\"; 2956: #endif 2957: }") 2958: 1.1.1.2 root 2959: ;; See comment before divhisi3 why these are commented out. 2960: ;;(define_insn "umodhisi3" 2961: ;; [(set (match_operand:HI 0 "general_operand" "=d") 2962: ;; (truncate:HI 2963: ;; (umod:SI 2964: ;; (match_operand:SI 1 "general_operand" "0") 2965: ;; (zero_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))] 2966: ;; "" 2967: ;; "* 2968: ;;{ 2969: ;; /* The swap insn produces cc's that don't correspond to the result. */ 2970: ;; CC_STATUS_INIT; 2971: ;;#ifdef MOTOROLA 2972: ;; return \"divu%.w %2,%0\;swap %0\"; 2973: ;;#else 2974: ;; return \"divu %2,%0\;swap %0\"; 2975: ;;#endif 2976: ;;}") 2977: 2978: ;;(define_insn "" 2979: ;; [(set (match_operand:HI 0 "general_operand" "=d") 2980: ;; (truncate:HI (umod:SI (match_operand:SI 1 "general_operand" "0") 2981: ;; (match_operand:SI 2 "const_int_operand" "n"))))] 2982: ;; "" 2983: ;; "* 2984: ;;{ 2985: ;; /* The swap insn produces cc's that don't correspond to the result. */ 2986: ;; CC_STATUS_INIT; 2987: ;;#ifdef MOTOROLA 2988: ;; return \"divu%.w %2,%0\;swap %0\"; 2989: ;;#else 2990: ;; return \"divu %2,%0\;swap %0\"; 2991: ;;#endif 2992: ;;}") 1.1 root 2993: 2994: (define_insn "divmodsi4" 2995: [(set (match_operand:SI 0 "general_operand" "=d") 2996: (div:SI (match_operand:SI 1 "general_operand" "0") 2997: (match_operand:SI 2 "general_operand" "dmsK"))) 2998: (set (match_operand:SI 3 "general_operand" "=d") 2999: (mod:SI (match_dup 1) (match_dup 2)))] 3000: "TARGET_68020" 3001: "* 3002: { 3003: if (find_reg_note (insn, REG_UNUSED, operands[3])) 3004: return \"divs%.l %2,%0\"; 3005: else 3006: return \"divsl%.l %2,%3:%0\"; 3007: }") 3008: 3009: (define_insn "udivmodsi4" 3010: [(set (match_operand:SI 0 "general_operand" "=d") 3011: (udiv:SI (match_operand:SI 1 "general_operand" "0") 3012: (match_operand:SI 2 "general_operand" "dmsK"))) 3013: (set (match_operand:SI 3 "general_operand" "=d") 3014: (umod:SI (match_dup 1) (match_dup 2)))] 3015: "TARGET_68020" 3016: "* 3017: { 3018: if (find_reg_note (insn, REG_UNUSED, operands[3])) 3019: return \"divu%.l %2,%0\"; 3020: else 3021: return \"divul%.l %2,%3:%0\"; 3022: }") 3023: 3024: ;; logical-and instructions 3025: 3026: ;; Prevent AND from being made with sp. This doesn't exist in the machine 3027: ;; and reload will cause inefficient code. Since sp is a FIXED_REG, we 3028: ;; can't allocate pseudos into it. 3029: (define_insn "andsi3" 3030: [(set (match_operand:SI 0 "not_sp_operand" "=m,d") 3031: (and:SI (match_operand:SI 1 "general_operand" "%0,0") 3032: (match_operand:SI 2 "general_operand" "dKs,dmKs")))] 3033: "" 3034: "* 3035: { 3036: int logval; 3037: if (GET_CODE (operands[2]) == CONST_INT 3038: && (INTVAL (operands[2]) | 0xffff) == 0xffffffff 3039: && (DATA_REG_P (operands[0]) 3040: || offsettable_memref_p (operands[0]))) 3041: { 3042: if (GET_CODE (operands[0]) != REG) 3043: operands[0] = adj_offsettable_operand (operands[0], 2); 3044: operands[2] = gen_rtx (CONST_INT, VOIDmode, 3045: INTVAL (operands[2]) & 0xffff); 3046: /* Do not delete a following tstl %0 insn; that would be incorrect. */ 3047: CC_STATUS_INIT; 3048: if (operands[2] == const0_rtx) 3049: return \"clr%.w %0\"; 3050: return \"and%.w %2,%0\"; 3051: } 3052: if (GET_CODE (operands[2]) == CONST_INT 3053: && (logval = exact_log2 (~ INTVAL (operands[2]))) >= 0 3054: && (DATA_REG_P (operands[0]) 3055: || offsettable_memref_p (operands[0]))) 3056: { 3057: if (DATA_REG_P (operands[0])) 3058: { 3059: operands[1] = gen_rtx (CONST_INT, VOIDmode, logval); 3060: } 3061: else 3062: { 1.1.1.3 ! root 3063: operands[0] = adj_offsettable_operand (operands[0], 3 - (logval / 8)); ! 3064: operands[1] = gen_rtx (CONST_INT, VOIDmode, logval % 8); 1.1 root 3065: } 3066: /* This does not set condition codes in a standard way. */ 3067: CC_STATUS_INIT; 3068: return \"bclr %1,%0\"; 3069: } 3070: return \"and%.l %2,%0\"; 3071: }") 3072: 3073: (define_insn "andhi3" 3074: [(set (match_operand:HI 0 "general_operand" "=m,d") 3075: (and:HI (match_operand:HI 1 "general_operand" "%0,0") 3076: (match_operand:HI 2 "general_operand" "dn,dmn")))] 3077: "" 3078: "and%.w %2,%0") 3079: 3080: (define_insn "" 3081: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d")) 3082: (and:HI (match_dup 0) 3083: (match_operand:HI 1 "general_operand" "dn,dmn")))] 3084: "" 3085: "and%.w %1,%0") 3086: 3087: (define_insn "" 3088: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d")) 3089: (and:HI (match_operand:HI 1 "general_operand" "dn,dmn") 3090: (match_dup 0)))] 3091: "" 3092: "and%.w %1,%0") 3093: 3094: (define_insn "andqi3" 3095: [(set (match_operand:QI 0 "general_operand" "=m,d") 3096: (and:QI (match_operand:QI 1 "general_operand" "%0,0") 3097: (match_operand:QI 2 "general_operand" "dn,dmn")))] 3098: "" 3099: "and%.b %2,%0") 3100: 3101: (define_insn "" 3102: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d")) 3103: (and:QI (match_dup 0) 3104: (match_operand:QI 1 "general_operand" "dn,dmn")))] 3105: "" 3106: "and%.b %1,%0") 3107: 3108: (define_insn "" 3109: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d")) 3110: (and:QI (match_operand:QI 1 "general_operand" "dn,dmn") 3111: (match_dup 0)))] 3112: "" 3113: "and%.b %1,%0") 3114: 3115: ;; inclusive-or instructions 3116: 3117: (define_insn "iorsi3" 3118: [(set (match_operand:SI 0 "general_operand" "=m,d") 3119: (ior:SI (match_operand:SI 1 "general_operand" "%0,0") 3120: (match_operand:SI 2 "general_operand" "dKs,dmKs")))] 3121: "" 3122: "* 3123: { 3124: register int logval; 3125: if (GET_CODE (operands[2]) == CONST_INT 3126: && INTVAL (operands[2]) >> 16 == 0 3127: && (DATA_REG_P (operands[0]) 3128: || offsettable_memref_p (operands[0]))) 3129: { 3130: if (GET_CODE (operands[0]) != REG) 3131: operands[0] = adj_offsettable_operand (operands[0], 2); 3132: /* Do not delete a following tstl %0 insn; that would be incorrect. */ 3133: CC_STATUS_INIT; 3134: return \"or%.w %2,%0\"; 3135: } 3136: if (GET_CODE (operands[2]) == CONST_INT 3137: && (logval = exact_log2 (INTVAL (operands[2]))) >= 0 3138: && (DATA_REG_P (operands[0]) 3139: || offsettable_memref_p (operands[0]))) 3140: { 3141: if (DATA_REG_P (operands[0])) 3142: { 3143: operands[1] = gen_rtx (CONST_INT, VOIDmode, logval); 3144: } 3145: else 3146: { 3147: operands[0] = adj_offsettable_operand (operands[0], 3 - (logval / 8)); 3148: operands[1] = gen_rtx (CONST_INT, VOIDmode, logval % 8); 3149: } 3150: CC_STATUS_INIT; 3151: return \"bset %1,%0\"; 3152: } 3153: return \"or%.l %2,%0\"; 3154: }") 3155: 3156: (define_insn "iorhi3" 3157: [(set (match_operand:HI 0 "general_operand" "=m,d") 3158: (ior:HI (match_operand:HI 1 "general_operand" "%0,0") 3159: (match_operand:HI 2 "general_operand" "dn,dmn")))] 3160: "" 3161: "or%.w %2,%0") 3162: 3163: (define_insn "" 3164: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d")) 3165: (ior:HI (match_dup 0) 3166: (match_operand:HI 1 "general_operand" "dn,dmn")))] 3167: "" 3168: "or%.w %1,%0") 3169: 3170: (define_insn "" 3171: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d")) 3172: (ior:HI (match_operand:HI 1 "general_operand" "dn,dmn") 3173: (match_dup 0)))] 3174: "" 3175: "or%.w %1,%0") 3176: 3177: (define_insn "iorqi3" 3178: [(set (match_operand:QI 0 "general_operand" "=m,d") 3179: (ior:QI (match_operand:QI 1 "general_operand" "%0,0") 3180: (match_operand:QI 2 "general_operand" "dn,dmn")))] 3181: "" 3182: "or%.b %2,%0") 3183: 3184: (define_insn "" 3185: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d")) 3186: (ior:QI (match_dup 0) 3187: (match_operand:QI 1 "general_operand" "dn,dmn")))] 3188: "" 3189: "or%.b %1,%0") 3190: 3191: (define_insn "" 3192: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d")) 3193: (ior:QI (match_operand:QI 1 "general_operand" "dn,dmn") 3194: (match_dup 0)))] 3195: "" 3196: "or%.b %1,%0") 3197: 3198: ;; xor instructions 3199: 3200: (define_insn "xorsi3" 3201: [(set (match_operand:SI 0 "general_operand" "=do,m") 3202: (xor:SI (match_operand:SI 1 "general_operand" "%0,0") 3203: (match_operand:SI 2 "general_operand" "di,dKs")))] 3204: "" 3205: "* 3206: { 3207: if (GET_CODE (operands[2]) == CONST_INT 3208: && INTVAL (operands[2]) >> 16 == 0 3209: && (offsettable_memref_p (operands[0]) || DATA_REG_P (operands[0]))) 3210: { 3211: if (! DATA_REG_P (operands[0])) 3212: operands[0] = adj_offsettable_operand (operands[0], 2); 3213: /* Do not delete a following tstl %0 insn; that would be incorrect. */ 3214: CC_STATUS_INIT; 3215: return \"eor%.w %2,%0\"; 3216: } 3217: return \"eor%.l %2,%0\"; 3218: }") 3219: 3220: (define_insn "xorhi3" 3221: [(set (match_operand:HI 0 "general_operand" "=dm") 3222: (xor:HI (match_operand:HI 1 "general_operand" "%0") 3223: (match_operand:HI 2 "general_operand" "dn")))] 3224: "" 3225: "eor%.w %2,%0") 3226: 3227: (define_insn "" 3228: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm")) 3229: (xor:HI (match_dup 0) 3230: (match_operand:HI 1 "general_operand" "dn")))] 3231: "" 3232: "eor%.w %1,%0") 3233: 3234: 3235: (define_insn "" 3236: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm")) 3237: (xor:HI (match_operand:HI 1 "general_operand" "dn") 3238: (match_dup 0)))] 3239: "" 3240: "eor%.w %1,%0") 3241: 3242: (define_insn "xorqi3" 3243: [(set (match_operand:QI 0 "general_operand" "=dm") 3244: (xor:QI (match_operand:QI 1 "general_operand" "%0") 3245: (match_operand:QI 2 "general_operand" "dn")))] 3246: "" 3247: "eor%.b %2,%0") 3248: 3249: (define_insn "" 3250: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm")) 3251: (xor:QI (match_dup 0) 3252: (match_operand:QI 1 "general_operand" "dn")))] 3253: "" 3254: "eor%.b %1,%0") 3255: 3256: (define_insn "" 3257: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm")) 3258: (xor:QI (match_operand:QI 1 "general_operand" "dn") 3259: (match_dup 0)))] 3260: "" 3261: "eor%.b %1,%0") 3262: 3263: ;; negation instructions 3264: 3265: (define_insn "negsi2" 3266: [(set (match_operand:SI 0 "general_operand" "=dm") 3267: (neg:SI (match_operand:SI 1 "general_operand" "0")))] 3268: "" 3269: "neg%.l %0") 3270: 3271: (define_insn "neghi2" 3272: [(set (match_operand:HI 0 "general_operand" "=dm") 3273: (neg:HI (match_operand:HI 1 "general_operand" "0")))] 3274: "" 3275: "neg%.w %0") 3276: 3277: (define_insn "" 3278: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm")) 3279: (neg:HI (match_dup 0)))] 3280: "" 3281: "neg%.w %0") 3282: 3283: (define_insn "negqi2" 3284: [(set (match_operand:QI 0 "general_operand" "=dm") 3285: (neg:QI (match_operand:QI 1 "general_operand" "0")))] 3286: "" 3287: "neg%.b %0") 3288: 3289: (define_insn "" 3290: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm")) 3291: (neg:QI (match_dup 0)))] 3292: "" 3293: "neg%.b %0") 3294: 3295: (define_expand "negsf2" 3296: [(set (match_operand:SF 0 "general_operand" "") 3297: (neg:SF (match_operand:SF 1 "general_operand" "")))] 3298: "TARGET_68881 || TARGET_FPA" 3299: "") 3300: 3301: (define_insn "" 3302: [(set (match_operand:SF 0 "general_operand" "=x,y") 3303: (neg:SF (match_operand:SF 1 "general_operand" "xH,rmF")))] 3304: "TARGET_FPA" 3305: "fpneg%.s %w1,%0") 3306: 3307: (define_insn "" 3308: [(set (match_operand:SF 0 "general_operand" "=f,d") 3309: (neg:SF (match_operand:SF 1 "general_operand" "fdmF,0")))] 3310: "TARGET_68881" 3311: "* 3312: { 3313: if (DATA_REG_P (operands[0])) 3314: { 3315: operands[1] = gen_rtx (CONST_INT, VOIDmode, 31); 3316: return \"bchg %1,%0\"; 3317: } 3318: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1])) 3319: return \"f%$neg%.x %1,%0\"; 3320: return \"f%$neg%.s %f1,%0\"; 3321: }") 3322: 3323: (define_expand "negdf2" 3324: [(set (match_operand:DF 0 "general_operand" "") 3325: (neg:DF (match_operand:DF 1 "general_operand" "")))] 3326: "TARGET_68881 || TARGET_FPA" 3327: "") 3328: 3329: (define_insn "" 3330: [(set (match_operand:DF 0 "general_operand" "=x,y") 3331: (neg:DF (match_operand:DF 1 "general_operand" "xH,rmF")))] 3332: "TARGET_FPA" 3333: "fpneg%.d %y1, %0") 3334: 3335: (define_insn "" 3336: [(set (match_operand:DF 0 "general_operand" "=f,d") 3337: (neg:DF (match_operand:DF 1 "general_operand" "fmF,0")))] 3338: "TARGET_68881" 3339: "* 3340: { 3341: if (DATA_REG_P (operands[0])) 3342: { 3343: operands[1] = gen_rtx (CONST_INT, VOIDmode, 31); 3344: return \"bchg %1,%0\"; 3345: } 3346: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1])) 3347: return \"f%&neg%.x %1,%0\"; 3348: return \"f%&neg%.d %f1,%0\"; 3349: }") 3350: 3351: ;; Sqrt instruction for the 68881 3352: 3353: (define_insn "sqrtdf2" 3354: [(set (match_operand:DF 0 "general_operand" "=f") 3355: (sqrt:DF (match_operand:DF 1 "general_operand" "fm")))] 3356: "TARGET_68881" 3357: "* 3358: { 3359: if (FP_REG_P (operands[1])) 3360: return \"fsqrt%.x %1,%0\"; 3361: else 3362: return \"fsqrt%.d %1,%0\"; 3363: }") 3364: 3365: ;; Absolute value instructions 3366: 3367: (define_expand "abssf2" 3368: [(set (match_operand:SF 0 "general_operand" "") 3369: (abs:SF (match_operand:SF 1 "general_operand" "")))] 3370: "TARGET_68881 || TARGET_FPA" 3371: "") 3372: 3373: (define_insn "" 3374: [(set (match_operand:SF 0 "general_operand" "=x,y") 3375: (abs:SF (match_operand:SF 1 "general_operand" "xH,rmF")))] 3376: "TARGET_FPA" 3377: "fpabs%.s %y1,%0") 3378: 3379: (define_insn "" 3380: [(set (match_operand:SF 0 "general_operand" "=f") 3381: (abs:SF (match_operand:SF 1 "general_operand" "fdmF")))] 3382: "TARGET_68881" 3383: "* 3384: { 3385: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1])) 3386: return \"f%$abs%.x %1,%0\"; 3387: return \"f%$abs%.s %f1,%0\"; 3388: }") 3389: 3390: (define_expand "absdf2" 3391: [(set (match_operand:DF 0 "general_operand" "") 3392: (abs:DF (match_operand:DF 1 "general_operand" "")))] 3393: "TARGET_68881 || TARGET_FPA" 3394: "") 3395: 3396: (define_insn "" 3397: [(set (match_operand:DF 0 "general_operand" "=x,y") 3398: (abs:DF (match_operand:DF 1 "general_operand" "xH,rmF")))] 3399: "TARGET_FPA" 3400: "fpabs%.d %y1,%0") 3401: 3402: (define_insn "" 3403: [(set (match_operand:DF 0 "general_operand" "=f") 3404: (abs:DF (match_operand:DF 1 "general_operand" "fmF")))] 3405: "TARGET_68881" 3406: "* 3407: { 3408: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1])) 3409: return \"f%&abs%.x %1,%0\"; 3410: return \"f%&abs%.d %f1,%0\"; 3411: }") 3412: 3413: ;; one complement instructions 3414: 3415: (define_insn "one_cmplsi2" 3416: [(set (match_operand:SI 0 "general_operand" "=dm") 3417: (not:SI (match_operand:SI 1 "general_operand" "0")))] 3418: "" 3419: "not%.l %0") 3420: 3421: (define_insn "one_cmplhi2" 3422: [(set (match_operand:HI 0 "general_operand" "=dm") 3423: (not:HI (match_operand:HI 1 "general_operand" "0")))] 3424: "" 3425: "not%.w %0") 3426: 3427: (define_insn "" 3428: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm")) 3429: (not:HI (match_dup 0)))] 3430: "" 3431: "not%.w %0") 3432: 3433: (define_insn "one_cmplqi2" 3434: [(set (match_operand:QI 0 "general_operand" "=dm") 3435: (not:QI (match_operand:QI 1 "general_operand" "0")))] 3436: "" 3437: "not%.b %0") 3438: 3439: (define_insn "" 3440: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm")) 3441: (not:QI (match_dup 0)))] 3442: "" 3443: "not%.b %0") 3444: 3445: ;; arithmetic shift instructions 3446: ;; We don't need the shift memory by 1 bit instruction 3447: 3448: ;; On all 68k models, this makes faster code in a special case. 3449: 3450: (define_insn "" 3451: [(set (match_operand:SI 0 "register_operand" "=d") 3452: (ashift:SI (match_operand:SI 1 "register_operand" "0") 1.1.1.3 ! root 3453: (const_int 16)))] ! 3454: "" 1.1 root 3455: "* 3456: { 3457: CC_STATUS_INIT; 3458: return \"swap %0\;clr%.w %0\"; 3459: }") 3460: 3461: ;; On the 68000, this makes faster code in a special case. 3462: 3463: (define_insn "" 3464: [(set (match_operand:SI 0 "register_operand" "=d") 3465: (ashift:SI (match_operand:SI 1 "register_operand" "0") 1.1.1.3 ! root 3466: (match_operand:SI 2 "const_int_operand" "n")))] ! 3467: "(! TARGET_68020 1.1 root 3468: && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)" 3469: "* 3470: { 3471: CC_STATUS_INIT; 3472: 3473: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16); 3474: return \"asl%.w %2,%0\;swap %0\;clr%.w %0\"; 3475: }") 3476: 3477: (define_insn "ashlsi3" 3478: [(set (match_operand:SI 0 "register_operand" "=d") 3479: (ashift:SI (match_operand:SI 1 "register_operand" "0") 3480: (match_operand:SI 2 "general_operand" "dI")))] 3481: "" 3482: "* 3483: { 3484: if (operands[2] == const1_rtx) 3485: return \"add%.l %0,%0\"; 3486: return \"asl%.l %2,%0\"; 3487: }") 3488: 3489: (define_insn "ashlhi3" 3490: [(set (match_operand:HI 0 "register_operand" "=d") 3491: (ashift:HI (match_operand:HI 1 "register_operand" "0") 3492: (match_operand:HI 2 "general_operand" "dI")))] 3493: "" 3494: "asl%.w %2,%0") 3495: 3496: (define_insn "" 3497: [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d")) 3498: (ashift:HI (match_dup 0) 3499: (match_operand:HI 1 "general_operand" "dI")))] 3500: "" 3501: "asl%.w %1,%0") 3502: 3503: (define_insn "ashlqi3" 3504: [(set (match_operand:QI 0 "register_operand" "=d") 3505: (ashift:QI (match_operand:QI 1 "register_operand" "0") 3506: (match_operand:QI 2 "general_operand" "dI")))] 3507: "" 3508: "asl%.b %2,%0") 3509: 3510: (define_insn "" 3511: [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d")) 3512: (ashift:QI (match_dup 0) 3513: (match_operand:QI 1 "general_operand" "dI")))] 3514: "" 3515: "asl%.b %1,%0") 3516: 3517: ;; On all 68k models, this makes faster code in a special case. 3518: 3519: (define_insn "" 3520: [(set (match_operand:SI 0 "register_operand" "=d") 3521: (ashiftrt:SI (match_operand:SI 1 "register_operand" "0") 1.1.1.3 ! root 3522: (const_int 16)))] ! 3523: "" 1.1 root 3524: "swap %0\;ext%.l %0") 3525: 3526: ;; On the 68000, this makes faster code in a special case. 3527: 3528: (define_insn "" 3529: [(set (match_operand:SI 0 "register_operand" "=d") 3530: (ashiftrt:SI (match_operand:SI 1 "register_operand" "0") 1.1.1.3 ! root 3531: (match_operand:SI 2 "const_int_operand" "n")))] ! 3532: "(! TARGET_68020 1.1 root 3533: && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)" 3534: "* 3535: { 3536: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16); 3537: return \"swap %0\;asr%.w %2,%0\;ext%.l %0\"; 3538: }") 3539: 3540: (define_insn "ashrsi3" 3541: [(set (match_operand:SI 0 "register_operand" "=d") 3542: (ashiftrt:SI (match_operand:SI 1 "register_operand" "0") 3543: (match_operand:SI 2 "general_operand" "dI")))] 3544: "" 1.1.1.3 ! root 3545: "asr%.l %2,%0") 1.1 root 3546: 3547: (define_insn "ashrhi3" 3548: [(set (match_operand:HI 0 "register_operand" "=d") 3549: (ashiftrt:HI (match_operand:HI 1 "register_operand" "0") 3550: (match_operand:HI 2 "general_operand" "dI")))] 3551: "" 3552: "asr%.w %2,%0") 3553: 3554: (define_insn "" 3555: [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d")) 3556: (ashiftrt:HI (match_dup 0) 3557: (match_operand:HI 1 "general_operand" "dI")))] 3558: "" 3559: "asr%.w %1,%0") 3560: 3561: (define_insn "ashrqi3" 3562: [(set (match_operand:QI 0 "register_operand" "=d") 3563: (ashiftrt:QI (match_operand:QI 1 "register_operand" "0") 3564: (match_operand:QI 2 "general_operand" "dI")))] 3565: "" 3566: "asr%.b %2,%0") 3567: 3568: (define_insn "" 3569: [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d")) 3570: (ashiftrt:QI (match_dup 0) 3571: (match_operand:QI 1 "general_operand" "dI")))] 3572: "" 3573: "asr%.b %1,%0") 3574: 3575: ;; logical shift instructions 3576: 3577: 3578: ;; On all 68k models, this makes faster code in a special case. 3579: 3580: (define_insn "" 3581: [(set (match_operand:SI 0 "register_operand" "=d") 3582: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0") 1.1.1.3 ! root 3583: (const_int 16)))] ! 3584: "" 1.1 root 3585: "* 3586: { 3587: CC_STATUS_INIT; 3588: return \"clr%.w %0\;swap %0\"; 3589: }") 3590: 3591: ;; On the 68000, this makes faster code in a special case. 3592: 3593: (define_insn "" 3594: [(set (match_operand:SI 0 "register_operand" "=d") 3595: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0") 1.1.1.3 ! root 3596: (match_operand:SI 2 "const_int_operand" "n")))] ! 3597: "(! TARGET_68020 1.1 root 3598: && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)" 3599: "* 3600: { 3601: /* I think lsr%.w sets the CC properly. */ 3602: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16); 3603: return \"clr%.w %0\;swap %0\;lsr%.w %2,%0\"; 3604: }") 3605: 3606: (define_insn "lshrsi3" 3607: [(set (match_operand:SI 0 "register_operand" "=d") 3608: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0") 3609: (match_operand:SI 2 "general_operand" "dI")))] 3610: "" 1.1.1.3 ! root 3611: "lsr%.l %2,%0") 1.1 root 3612: 3613: (define_insn "lshrhi3" 3614: [(set (match_operand:HI 0 "register_operand" "=d") 3615: (lshiftrt:HI (match_operand:HI 1 "register_operand" "0") 3616: (match_operand:HI 2 "general_operand" "dI")))] 3617: "" 3618: "lsr%.w %2,%0") 3619: 3620: (define_insn "" 3621: [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d")) 3622: (lshiftrt:HI (match_dup 0) 3623: (match_operand:HI 1 "general_operand" "dI")))] 3624: "" 3625: "lsr%.w %1,%0") 3626: 3627: (define_insn "lshrqi3" 3628: [(set (match_operand:QI 0 "register_operand" "=d") 3629: (lshiftrt:QI (match_operand:QI 1 "register_operand" "0") 3630: (match_operand:QI 2 "general_operand" "dI")))] 3631: "" 3632: "lsr%.b %2,%0") 3633: 3634: (define_insn "" 3635: [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d")) 3636: (lshiftrt:QI (match_dup 0) 3637: (match_operand:QI 1 "general_operand" "dI")))] 3638: "" 3639: "lsr%.b %1,%0") 3640: 3641: ;; rotate instructions 3642: 3643: (define_insn "rotlsi3" 3644: [(set (match_operand:SI 0 "register_operand" "=d") 3645: (rotate:SI (match_operand:SI 1 "register_operand" "0") 3646: (match_operand:SI 2 "general_operand" "dI")))] 3647: "" 3648: "rol%.l %2,%0") 3649: 3650: (define_insn "rotlhi3" 3651: [(set (match_operand:HI 0 "register_operand" "=d") 3652: (rotate:HI (match_operand:HI 1 "register_operand" "0") 3653: (match_operand:HI 2 "general_operand" "dI")))] 3654: "" 3655: "rol%.w %2,%0") 3656: 3657: 3658: (define_insn "" 3659: [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d")) 3660: (rotate:HI (match_dup 0) 3661: (match_operand:HI 1 "general_operand" "dI")))] 3662: "" 3663: "rol%.w %1,%0") 3664: 3665: (define_insn "rotlqi3" 3666: [(set (match_operand:QI 0 "register_operand" "=d") 3667: (rotate:QI (match_operand:QI 1 "register_operand" "0") 3668: (match_operand:QI 2 "general_operand" "dI")))] 3669: "" 3670: "rol%.b %2,%0") 3671: 3672: (define_insn "" 3673: [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d")) 3674: (rotate:QI (match_dup 0) 3675: (match_operand:QI 1 "general_operand" "dI")))] 3676: "" 3677: "rol%.b %1,%0") 3678: 3679: (define_insn "rotrsi3" 3680: [(set (match_operand:SI 0 "register_operand" "=d") 3681: (rotatert:SI (match_operand:SI 1 "register_operand" "0") 3682: (match_operand:SI 2 "general_operand" "dI")))] 3683: "" 3684: "ror%.l %2,%0") 3685: 3686: (define_insn "rotrhi3" 3687: [(set (match_operand:HI 0 "register_operand" "=d") 3688: (rotatert:HI (match_operand:HI 1 "register_operand" "0") 3689: (match_operand:HI 2 "general_operand" "dI")))] 3690: "" 3691: "ror%.w %2,%0") 3692: 3693: (define_insn "" 3694: [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d")) 3695: (rotatert:HI (match_dup 0) 3696: (match_operand:HI 1 "general_operand" "dI")))] 3697: "" 3698: "ror%.w %1,%0") 3699: 3700: (define_insn "rotrqi3" 3701: [(set (match_operand:QI 0 "register_operand" "=d") 3702: (rotatert:QI (match_operand:QI 1 "register_operand" "0") 3703: (match_operand:QI 2 "general_operand" "dI")))] 3704: "" 3705: "ror%.b %2,%0") 3706: 3707: (define_insn "" 3708: [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d")) 3709: (rotatert:QI (match_dup 0) 3710: (match_operand:QI 1 "general_operand" "dI")))] 3711: "" 3712: "ror%.b %1,%0") 3713: 3714: ;; Special cases of bit-field insns which we should 3715: ;; recognize in preference to the general case. 3716: ;; These handle aligned 8-bit and 16-bit fields, 3717: ;; which can usually be done with move instructions. 3718: 3719: ; 3720: ; Special case for 32-bit field in memory. This only occurs when 32-bit 3721: ; alignment of structure members is specified. 3722: ; 3723: ; The move is allowed to be odd byte aligned, because that's still faster 3724: ; than an odd byte aligned bit field instruction. 3725: ; 3726: (define_insn "" 3727: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o") 1.1.1.3 ! root 3728: (const_int 32) ! 3729: (match_operand:SI 2 "const_int_operand" "n")) 1.1 root 3730: (match_operand:SI 3 "general_operand" "rmi"))] 3731: "TARGET_68020 && TARGET_BITFIELD 3732: && (INTVAL (operands[2]) % 8) == 0 3733: && ! mode_dependent_address_p (XEXP (operands[0], 0))" 3734: "* 3735: { 3736: operands[0] 3737: = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8); 3738: 3739: return \"move%.l %3,%0\"; 3740: }") 3741: 3742: (define_insn "" 3743: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+do") 1.1.1.3 ! root 3744: (match_operand:SI 1 "const_int_operand" "n") ! 3745: (match_operand:SI 2 "const_int_operand" "n")) ! 3746: (match_operand:SI 3 "register_operand" "d"))] 1.1 root 3747: "TARGET_68020 && TARGET_BITFIELD 3748: && (INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16) 3749: && INTVAL (operands[2]) % INTVAL (operands[1]) == 0 3750: && (GET_CODE (operands[0]) == REG 3751: || ! mode_dependent_address_p (XEXP (operands[0], 0)))" 3752: "* 3753: { 3754: if (REG_P (operands[0])) 3755: { 3756: if (INTVAL (operands[1]) + INTVAL (operands[2]) != 32) 3757: return \"bfins %3,%0{%b2:%b1}\"; 3758: } 3759: else 3760: operands[0] 3761: = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8); 3762: 3763: if (GET_CODE (operands[3]) == MEM) 3764: operands[3] = adj_offsettable_operand (operands[3], 3765: (32 - INTVAL (operands[1])) / 8); 3766: if (INTVAL (operands[1]) == 8) 3767: return \"move%.b %3,%0\"; 3768: return \"move%.w %3,%0\"; 3769: }") 3770: 3771: 3772: ; 3773: ; Special case for 32-bit field in memory. This only occurs when 32-bit 3774: ; alignment of structure members is specified. 3775: ; 3776: ; The move is allowed to be odd byte aligned, because that's still faster 3777: ; than an odd byte aligned bit field instruction. 3778: ; 3779: (define_insn "" 3780: [(set (match_operand:SI 0 "general_operand" "=rm") 3781: (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o") 1.1.1.3 ! root 3782: (const_int 32) ! 3783: (match_operand:SI 3 "const_int_operand" "n")))] 1.1 root 3784: "TARGET_68020 && TARGET_BITFIELD 3785: && (INTVAL (operands[3]) % 8) == 0 3786: && ! mode_dependent_address_p (XEXP (operands[1], 0))" 3787: "* 3788: { 3789: operands[1] 3790: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8); 3791: 3792: return \"move%.l %1,%0\"; 3793: }") 3794: 3795: (define_insn "" 3796: [(set (match_operand:SI 0 "general_operand" "=&d") 3797: (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do") 1.1.1.3 ! root 3798: (match_operand:SI 2 "const_int_operand" "n") ! 3799: (match_operand:SI 3 "const_int_operand" "n")))] 1.1 root 3800: "TARGET_68020 && TARGET_BITFIELD 3801: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16) 3802: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0 3803: && (GET_CODE (operands[1]) == REG 3804: || ! mode_dependent_address_p (XEXP (operands[1], 0)))" 3805: "* 3806: { 3807: cc_status.flags |= CC_NOT_NEGATIVE; 3808: if (REG_P (operands[1])) 3809: { 3810: if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32) 3811: return \"bfextu %1{%b3:%b2},%0\"; 3812: } 3813: else 3814: operands[1] 3815: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8); 3816: 3817: output_asm_insn (\"clr%.l %0\", operands); 3818: if (GET_CODE (operands[0]) == MEM) 3819: operands[0] = adj_offsettable_operand (operands[0], 3820: (32 - INTVAL (operands[1])) / 8); 3821: if (INTVAL (operands[2]) == 8) 3822: return \"move%.b %1,%0\"; 3823: return \"move%.w %1,%0\"; 3824: }") 3825: 3826: ; 3827: ; Special case for 32-bit field in memory. This only occurs when 32-bit 3828: ; alignment of structure members is specified. 3829: ; 3830: ; The move is allowed to be odd byte aligned, because that's still faster 3831: ; than an odd byte aligned bit field instruction. 3832: ; 3833: (define_insn "" 3834: [(set (match_operand:SI 0 "general_operand" "=rm") 3835: (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o") 1.1.1.3 ! root 3836: (const_int 32) ! 3837: (match_operand:SI 3 "const_int_operand" "n")))] 1.1 root 3838: "TARGET_68020 && TARGET_BITFIELD 3839: && (INTVAL (operands[3]) % 8) == 0 3840: && ! mode_dependent_address_p (XEXP (operands[1], 0))" 3841: "* 3842: { 3843: operands[1] 3844: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8); 3845: 3846: return \"move%.l %1,%0\"; 3847: }") 3848: 3849: (define_insn "" 3850: [(set (match_operand:SI 0 "general_operand" "=d") 3851: (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do") 1.1.1.3 ! root 3852: (match_operand:SI 2 "const_int_operand" "n") ! 3853: (match_operand:SI 3 "const_int_operand" "n")))] 1.1 root 3854: "TARGET_68020 && TARGET_BITFIELD 3855: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16) 3856: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0 3857: && (GET_CODE (operands[1]) == REG 3858: || ! mode_dependent_address_p (XEXP (operands[1], 0)))" 3859: "* 3860: { 3861: if (REG_P (operands[1])) 3862: { 3863: if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32) 3864: return \"bfexts %1{%b3:%b2},%0\"; 3865: } 3866: else 3867: operands[1] 3868: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8); 3869: 3870: if (INTVAL (operands[2]) == 8) 3871: return \"move%.b %1,%0\;extb%.l %0\"; 3872: return \"move%.w %1,%0\;ext%.l %0\"; 3873: }") 3874: 3875: ;; Bit field instructions, general cases. 3876: ;; "o,d" constraint causes a nonoffsettable memref to match the "o" 3877: ;; so that its address is reloaded. 3878: 3879: (define_insn "extv" 3880: [(set (match_operand:SI 0 "general_operand" "=d,d") 3881: (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d") 3882: (match_operand:SI 2 "general_operand" "di,di") 3883: (match_operand:SI 3 "general_operand" "di,di")))] 3884: "TARGET_68020 && TARGET_BITFIELD" 3885: "bfexts %1{%b3:%b2},%0") 3886: 3887: (define_insn "extzv" 3888: [(set (match_operand:SI 0 "general_operand" "=d,d") 3889: (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d") 3890: (match_operand:SI 2 "general_operand" "di,di") 3891: (match_operand:SI 3 "general_operand" "di,di")))] 3892: "TARGET_68020 && TARGET_BITFIELD" 3893: "* 3894: { 1.1.1.2 root 3895: if (GET_CODE (operands[2]) == CONST_INT) 3896: { 3897: if (INTVAL (operands[2]) != 32) 3898: cc_status.flags |= CC_NOT_NEGATIVE; 3899: } 3900: else 3901: { 3902: CC_STATUS_INIT; 3903: } 1.1 root 3904: return \"bfextu %1{%b3:%b2},%0\"; 3905: }") 3906: 3907: (define_insn "" 3908: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d") 3909: (match_operand:SI 1 "general_operand" "di,di") 3910: (match_operand:SI 2 "general_operand" "di,di")) 3911: (xor:SI (zero_extract:SI (match_dup 0) (match_dup 1) (match_dup 2)) 1.1.1.3 ! root 3912: (match_operand 3 "const_int_operand" "n,n")))] 1.1 root 3913: "TARGET_68020 && TARGET_BITFIELD 3914: && (INTVAL (operands[3]) == -1 3915: || (GET_CODE (operands[1]) == CONST_INT 3916: && (~ INTVAL (operands[3]) & ((1 << INTVAL (operands[1]))- 1)) == 0))" 3917: "* 3918: { 3919: CC_STATUS_INIT; 3920: return \"bfchg %0{%b2:%b1}\"; 3921: }") 3922: 3923: (define_insn "" 3924: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d") 3925: (match_operand:SI 1 "general_operand" "di,di") 3926: (match_operand:SI 2 "general_operand" "di,di")) 3927: (const_int 0))] 3928: "TARGET_68020 && TARGET_BITFIELD" 3929: "* 3930: { 3931: CC_STATUS_INIT; 3932: return \"bfclr %0{%b2:%b1}\"; 3933: }") 3934: 3935: (define_insn "" 3936: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d") 3937: (match_operand:SI 1 "general_operand" "di,di") 3938: (match_operand:SI 2 "general_operand" "di,di")) 3939: (const_int -1))] 3940: "TARGET_68020 && TARGET_BITFIELD" 3941: "* 3942: { 3943: CC_STATUS_INIT; 3944: return \"bfset %0{%b2:%b1}\"; 3945: }") 3946: 3947: (define_insn "insv" 3948: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d") 3949: (match_operand:SI 1 "general_operand" "di,di") 3950: (match_operand:SI 2 "general_operand" "di,di")) 1.1.1.3 ! root 3951: (match_operand:SI 3 "register_operand" "d,d"))] 1.1 root 3952: "TARGET_68020 && TARGET_BITFIELD" 3953: "bfins %3,%0{%b2:%b1}") 3954: 3955: ;; Now recognize bit field insns that operate on registers 3956: ;; (or at least were intended to do so). 3957: 3958: (define_insn "" 3959: [(set (match_operand:SI 0 "general_operand" "=d") 3960: (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d") 3961: (match_operand:SI 2 "general_operand" "di") 3962: (match_operand:SI 3 "general_operand" "di")))] 3963: "TARGET_68020 && TARGET_BITFIELD" 3964: "bfexts %1{%b3:%b2},%0") 3965: 3966: (define_insn "" 3967: [(set (match_operand:SI 0 "general_operand" "=d") 3968: (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d") 3969: (match_operand:SI 2 "general_operand" "di") 3970: (match_operand:SI 3 "general_operand" "di")))] 3971: "TARGET_68020 && TARGET_BITFIELD" 3972: "* 3973: { 1.1.1.2 root 3974: if (GET_CODE (operands[2]) == CONST_INT) 3975: { 3976: if (INTVAL (operands[2]) != 32) 3977: cc_status.flags |= CC_NOT_NEGATIVE; 3978: } 3979: else 3980: { 3981: CC_STATUS_INIT; 3982: } 1.1 root 3983: return \"bfextu %1{%b3:%b2},%0\"; 3984: }") 3985: 3986: (define_insn "" 3987: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d") 3988: (match_operand:SI 1 "general_operand" "di") 3989: (match_operand:SI 2 "general_operand" "di")) 3990: (const_int 0))] 3991: "TARGET_68020 && TARGET_BITFIELD" 3992: "* 3993: { 3994: CC_STATUS_INIT; 3995: return \"bfclr %0{%b2:%b1}\"; 3996: }") 3997: 3998: (define_insn "" 3999: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d") 4000: (match_operand:SI 1 "general_operand" "di") 4001: (match_operand:SI 2 "general_operand" "di")) 4002: (const_int -1))] 4003: "TARGET_68020 && TARGET_BITFIELD" 4004: "* 4005: { 4006: CC_STATUS_INIT; 4007: return \"bfset %0{%b2:%b1}\"; 4008: }") 4009: 4010: (define_insn "" 4011: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d") 4012: (match_operand:SI 1 "general_operand" "di") 4013: (match_operand:SI 2 "general_operand" "di")) 1.1.1.3 ! root 4014: (match_operand:SI 3 "register_operand" "d"))] 1.1 root 4015: "TARGET_68020 && TARGET_BITFIELD" 4016: "* 4017: { 4018: #if 0 4019: /* These special cases are now recognized by a specific pattern. */ 4020: if (GET_CODE (operands[1]) == CONST_INT && GET_CODE (operands[2]) == CONST_INT 4021: && INTVAL (operands[1]) == 16 && INTVAL (operands[2]) == 16) 4022: return \"move%.w %3,%0\"; 4023: if (GET_CODE (operands[1]) == CONST_INT && GET_CODE (operands[2]) == CONST_INT 4024: && INTVAL (operands[1]) == 24 && INTVAL (operands[2]) == 8) 4025: return \"move%.b %3,%0\"; 4026: #endif 4027: return \"bfins %3,%0{%b2:%b1}\"; 4028: }") 4029: 4030: ;; Special patterns for optimizing bit-field instructions. 4031: 4032: (define_insn "" 4033: [(set (cc0) 4034: (zero_extract:SI (match_operand:QI 0 "memory_operand" "o") 1.1.1.3 ! root 4035: (match_operand:SI 1 "const_int_operand" "n") 1.1 root 4036: (match_operand:SI 2 "general_operand" "di")))] 1.1.1.3 ! root 4037: "TARGET_68020 && TARGET_BITFIELD" 1.1 root 4038: "* 4039: { 4040: if (operands[1] == const1_rtx 4041: && GET_CODE (operands[2]) == CONST_INT) 4042: { 4043: int width = GET_CODE (operands[0]) == REG ? 31 : 7; 4044: return output_btst (operands, 4045: gen_rtx (CONST_INT, VOIDmode, 4046: width - INTVAL (operands[2])), 4047: operands[0], 4048: insn, 1000); 4049: /* Pass 1000 as SIGNPOS argument so that btst will 4050: not think we are testing the sign bit for an `and' 4051: and assume that nonzero implies a negative result. */ 4052: } 4053: if (INTVAL (operands[1]) != 32) 4054: cc_status.flags = CC_NOT_NEGATIVE; 4055: return \"bftst %0{%b2:%b1}\"; 4056: }") 4057: 4058: 4059: ;;; now handle the register cases 4060: (define_insn "" 4061: [(set (cc0) 4062: (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "d") 1.1.1.3 ! root 4063: (match_operand:SI 1 "const_int_operand" "n") 1.1 root 4064: (match_operand:SI 2 "general_operand" "di")))] 1.1.1.3 ! root 4065: "TARGET_68020 && TARGET_BITFIELD" 1.1 root 4066: "* 4067: { 4068: if (operands[1] == const1_rtx 4069: && GET_CODE (operands[2]) == CONST_INT) 4070: { 4071: int width = GET_CODE (operands[0]) == REG ? 31 : 7; 4072: return output_btst (operands, 4073: gen_rtx (CONST_INT, VOIDmode, 4074: width - INTVAL (operands[2])), 4075: operands[0], 4076: insn, 1000); 4077: /* Pass 1000 as SIGNPOS argument so that btst will 4078: not think we are testing the sign bit for an `and' 4079: and assume that nonzero implies a negative result. */ 4080: } 4081: if (INTVAL (operands[1]) != 32) 4082: cc_status.flags = CC_NOT_NEGATIVE; 4083: return \"bftst %0{%b2:%b1}\"; 4084: }") 4085: 4086: (define_insn "seq" 4087: [(set (match_operand:QI 0 "general_operand" "=d") 4088: (eq:QI (cc0) (const_int 0)))] 4089: "" 4090: "* 4091: cc_status = cc_prev_status; 4092: OUTPUT_JUMP (\"seq %0\", \"fseq %0\", \"seq %0\"); 4093: ") 4094: 4095: (define_insn "sne" 4096: [(set (match_operand:QI 0 "general_operand" "=d") 4097: (ne:QI (cc0) (const_int 0)))] 4098: "" 4099: "* 4100: cc_status = cc_prev_status; 4101: OUTPUT_JUMP (\"sne %0\", \"fsne %0\", \"sne %0\"); 4102: ") 4103: 4104: (define_insn "sgt" 4105: [(set (match_operand:QI 0 "general_operand" "=d") 4106: (gt:QI (cc0) (const_int 0)))] 4107: "" 4108: "* 4109: cc_status = cc_prev_status; 4110: OUTPUT_JUMP (\"sgt %0\", \"fsgt %0\", 0); 4111: ") 4112: 4113: (define_insn "sgtu" 4114: [(set (match_operand:QI 0 "general_operand" "=d") 4115: (gtu:QI (cc0) (const_int 0)))] 4116: "" 4117: "* cc_status = cc_prev_status; 4118: return \"shi %0\"; ") 4119: 4120: (define_insn "slt" 4121: [(set (match_operand:QI 0 "general_operand" "=d") 4122: (lt:QI (cc0) (const_int 0)))] 4123: "" 4124: "* cc_status = cc_prev_status; 4125: OUTPUT_JUMP (\"slt %0\", \"fslt %0\", \"smi %0\"); ") 4126: 4127: (define_insn "sltu" 4128: [(set (match_operand:QI 0 "general_operand" "=d") 4129: (ltu:QI (cc0) (const_int 0)))] 4130: "" 4131: "* cc_status = cc_prev_status; 4132: return \"scs %0\"; ") 4133: 4134: (define_insn "sge" 4135: [(set (match_operand:QI 0 "general_operand" "=d") 4136: (ge:QI (cc0) (const_int 0)))] 4137: "" 4138: "* cc_status = cc_prev_status; 4139: OUTPUT_JUMP (\"sge %0\", \"fsge %0\", \"spl %0\"); ") 4140: 4141: (define_insn "sgeu" 4142: [(set (match_operand:QI 0 "general_operand" "=d") 4143: (geu:QI (cc0) (const_int 0)))] 4144: "" 4145: "* cc_status = cc_prev_status; 4146: return \"scc %0\"; ") 4147: 4148: (define_insn "sle" 4149: [(set (match_operand:QI 0 "general_operand" "=d") 4150: (le:QI (cc0) (const_int 0)))] 4151: "" 4152: "* 4153: cc_status = cc_prev_status; 4154: OUTPUT_JUMP (\"sle %0\", \"fsle %0\", 0); 4155: ") 4156: 4157: (define_insn "sleu" 4158: [(set (match_operand:QI 0 "general_operand" "=d") 4159: (leu:QI (cc0) (const_int 0)))] 4160: "" 4161: "* cc_status = cc_prev_status; 4162: return \"sls %0\"; ") 4163: 4164: ;; Basic conditional jump instructions. 4165: 4166: (define_insn "beq" 4167: [(set (pc) 4168: (if_then_else (eq (cc0) 4169: (const_int 0)) 4170: (label_ref (match_operand 0 "" "")) 4171: (pc)))] 4172: "" 4173: "* 4174: { 4175: #ifdef MOTOROLA 4176: OUTPUT_JUMP (\"jbeq %l0\", \"fbeq %l0\", \"jbeq %l0\"); 4177: #else 4178: OUTPUT_JUMP (\"jeq %l0\", \"fjeq %l0\", \"jeq %l0\"); 4179: #endif 4180: }") 4181: 4182: (define_insn "bne" 4183: [(set (pc) 4184: (if_then_else (ne (cc0) 4185: (const_int 0)) 4186: (label_ref (match_operand 0 "" "")) 4187: (pc)))] 4188: "" 4189: "* 4190: { 4191: #ifdef MOTOROLA 4192: OUTPUT_JUMP (\"jbne %l0\", \"fbne %l0\", \"jbne %l0\"); 4193: #else 4194: OUTPUT_JUMP (\"jne %l0\", \"fjne %l0\", \"jne %l0\"); 4195: #endif 4196: }") 4197: 4198: (define_insn "bgt" 4199: [(set (pc) 4200: (if_then_else (gt (cc0) 4201: (const_int 0)) 4202: (label_ref (match_operand 0 "" "")) 4203: (pc)))] 4204: "" 4205: "* 4206: #ifdef MOTOROLA 4207: OUTPUT_JUMP (\"jbgt %l0\", \"fbgt %l0\", 0); 4208: #else 4209: OUTPUT_JUMP (\"jgt %l0\", \"fjgt %l0\", 0); 4210: #endif 4211: ") 4212: 4213: (define_insn "bgtu" 4214: [(set (pc) 4215: (if_then_else (gtu (cc0) 4216: (const_int 0)) 4217: (label_ref (match_operand 0 "" "")) 4218: (pc)))] 4219: "" 4220: "* 4221: #ifdef MOTOROLA 4222: return \"jbhi %l0\"; 4223: #else 4224: return \"jhi %l0\"; 4225: #endif 4226: ") 4227: 4228: (define_insn "blt" 4229: [(set (pc) 4230: (if_then_else (lt (cc0) 4231: (const_int 0)) 4232: (label_ref (match_operand 0 "" "")) 4233: (pc)))] 4234: "" 4235: "* 4236: #ifdef MOTOROLA 4237: OUTPUT_JUMP (\"jblt %l0\", \"fblt %l0\", \"jbmi %l0\"); 4238: #else 4239: OUTPUT_JUMP (\"jlt %l0\", \"fjlt %l0\", \"jmi %l0\"); 4240: #endif 4241: ") 4242: 4243: (define_insn "bltu" 4244: [(set (pc) 4245: (if_then_else (ltu (cc0) 4246: (const_int 0)) 4247: (label_ref (match_operand 0 "" "")) 4248: (pc)))] 4249: "" 4250: "* 4251: #ifdef MOTOROLA 4252: return \"jbcs %l0\"; 4253: #else 4254: return \"jcs %l0\"; 4255: #endif 4256: ") 4257: 4258: (define_insn "bge" 4259: [(set (pc) 4260: (if_then_else (ge (cc0) 4261: (const_int 0)) 4262: (label_ref (match_operand 0 "" "")) 4263: (pc)))] 4264: "" 4265: "* 4266: #ifdef MOTOROLA 4267: OUTPUT_JUMP (\"jbge %l0\", \"fbge %l0\", \"jbpl %l0\"); 4268: #else 4269: OUTPUT_JUMP (\"jge %l0\", \"fjge %l0\", \"jpl %l0\"); 4270: #endif 4271: ") 4272: 4273: (define_insn "bgeu" 4274: [(set (pc) 4275: (if_then_else (geu (cc0) 4276: (const_int 0)) 4277: (label_ref (match_operand 0 "" "")) 4278: (pc)))] 4279: "" 4280: "* 4281: #ifdef MOTOROLA 4282: return \"jbcc %l0\"; 4283: #else 4284: return \"jcc %l0\"; 4285: #endif 4286: ") 4287: 4288: (define_insn "ble" 4289: [(set (pc) 4290: (if_then_else (le (cc0) 4291: (const_int 0)) 4292: (label_ref (match_operand 0 "" "")) 4293: (pc)))] 4294: "" 4295: "* 4296: #ifdef MOTOROLA 4297: OUTPUT_JUMP (\"jble %l0\", \"fble %l0\", 0); 4298: #else 4299: OUTPUT_JUMP (\"jle %l0\", \"fjle %l0\", 0); 4300: #endif 4301: ") 4302: 4303: (define_insn "bleu" 4304: [(set (pc) 4305: (if_then_else (leu (cc0) 4306: (const_int 0)) 4307: (label_ref (match_operand 0 "" "")) 4308: (pc)))] 4309: "" 4310: "* 4311: #ifdef MOTOROLA 4312: return \"jbls %l0\"; 4313: #else 4314: return \"jls %l0\"; 4315: #endif 4316: ") 4317: 4318: ;; Negated conditional jump instructions. 4319: 4320: (define_insn "" 4321: [(set (pc) 4322: (if_then_else (eq (cc0) 4323: (const_int 0)) 4324: (pc) 4325: (label_ref (match_operand 0 "" ""))))] 4326: "" 4327: "* 4328: { 4329: #ifdef MOTOROLA 4330: OUTPUT_JUMP (\"jbne %l0\", \"fbne %l0\", \"jbne %l0\"); 4331: #else 4332: OUTPUT_JUMP (\"jne %l0\", \"fjne %l0\", \"jne %l0\"); 4333: #endif 4334: }") 4335: 4336: (define_insn "" 4337: [(set (pc) 4338: (if_then_else (ne (cc0) 4339: (const_int 0)) 4340: (pc) 4341: (label_ref (match_operand 0 "" ""))))] 4342: "" 4343: "* 4344: { 4345: #ifdef MOTOROLA 4346: OUTPUT_JUMP (\"jbeq %l0\", \"fbeq %l0\", \"jbeq %l0\"); 4347: #else 4348: OUTPUT_JUMP (\"jeq %l0\", \"fjeq %l0\", \"jeq %l0\"); 4349: #endif 4350: }") 4351: 4352: (define_insn "" 4353: [(set (pc) 4354: (if_then_else (gt (cc0) 4355: (const_int 0)) 4356: (pc) 4357: (label_ref (match_operand 0 "" ""))))] 4358: "" 4359: "* 4360: #ifdef MOTOROLA 4361: OUTPUT_JUMP (\"jble %l0\", \"fbngt %l0\", 0); 4362: #else 4363: OUTPUT_JUMP (\"jle %l0\", \"fjngt %l0\", 0); 4364: #endif 4365: ") 4366: 4367: (define_insn "" 4368: [(set (pc) 4369: (if_then_else (gtu (cc0) 4370: (const_int 0)) 4371: (pc) 4372: (label_ref (match_operand 0 "" ""))))] 4373: "" 4374: "* 4375: #ifdef MOTOROLA 4376: return \"jbls %l0\"; 4377: #else 4378: return \"jls %l0\"; 4379: #endif 4380: ") 4381: 4382: (define_insn "" 4383: [(set (pc) 4384: (if_then_else (lt (cc0) 4385: (const_int 0)) 4386: (pc) 4387: (label_ref (match_operand 0 "" ""))))] 4388: "" 4389: "* 4390: #ifdef MOTOROLA 4391: OUTPUT_JUMP (\"jbge %l0\", \"fbnlt %l0\", \"jbpl %l0\"); 4392: #else 4393: OUTPUT_JUMP (\"jge %l0\", \"fjnlt %l0\", \"jpl %l0\"); 4394: #endif 4395: ") 4396: 4397: (define_insn "" 4398: [(set (pc) 4399: (if_then_else (ltu (cc0) 4400: (const_int 0)) 4401: (pc) 4402: (label_ref (match_operand 0 "" ""))))] 4403: "" 4404: "* 4405: #ifdef MOTOROLA 4406: return \"jbcc %l0\"; 4407: #else 4408: return \"jcc %l0\"; 4409: #endif 4410: ") 4411: 4412: (define_insn "" 4413: [(set (pc) 4414: (if_then_else (ge (cc0) 4415: (const_int 0)) 4416: (pc) 4417: (label_ref (match_operand 0 "" ""))))] 4418: "" 4419: "* 4420: #ifdef MOTOROLA 4421: OUTPUT_JUMP (\"jblt %l0\", \"fbnge %l0\", \"jbmi %l0\"); 4422: #else 4423: OUTPUT_JUMP (\"jlt %l0\", \"fjnge %l0\", \"jmi %l0\"); 4424: #endif 4425: ") 4426: 4427: (define_insn "" 4428: [(set (pc) 4429: (if_then_else (geu (cc0) 4430: (const_int 0)) 4431: (pc) 4432: (label_ref (match_operand 0 "" ""))))] 4433: "" 4434: "* 4435: #ifdef MOTOROLA 4436: return \"jbcs %l0\"; 4437: #else 4438: return \"jcs %l0\"; 4439: #endif 4440: ") 4441: 4442: (define_insn "" 4443: [(set (pc) 4444: (if_then_else (le (cc0) 4445: (const_int 0)) 4446: (pc) 4447: (label_ref (match_operand 0 "" ""))))] 4448: "" 4449: "* 4450: #ifdef MOTOROLA 4451: OUTPUT_JUMP (\"jbgt %l0\", \"fbnle %l0\", 0); 4452: #else 4453: OUTPUT_JUMP (\"jgt %l0\", \"fjnle %l0\", 0); 4454: #endif 4455: ") 4456: 4457: (define_insn "" 4458: [(set (pc) 4459: (if_then_else (leu (cc0) 4460: (const_int 0)) 4461: (pc) 4462: (label_ref (match_operand 0 "" ""))))] 4463: "" 4464: "* 4465: #ifdef MOTOROLA 4466: return \"jbhi %l0\"; 4467: #else 4468: return \"jhi %l0\"; 4469: #endif 4470: ") 4471: 4472: ;; Unconditional and other jump instructions 4473: (define_insn "jump" 4474: [(set (pc) 4475: (label_ref (match_operand 0 "" "")))] 4476: "" 4477: "* 4478: #ifdef MOTOROLA 4479: return \"jbra %l0\"; 4480: #else 4481: return \"jra %l0\"; 4482: #endif 4483: ") 4484: 4485: ;; We support two different ways of handling dispatch tables. 4486: ;; The NeXT uses absolute tables, and other machines use relative. 4487: ;; This define_expand can generate either kind. 4488: (define_expand "tablejump" 4489: [(parallel [(set (pc) (match_operand 0 "" "")) 4490: (use (label_ref (match_operand 1 "" "")))])] 4491: "" 4492: " 4493: { 4494: #ifdef CASE_VECTOR_PC_RELATIVE 1.1.1.3 ! root 4495: operands[0] = gen_rtx (PLUS, SImode, pc_rtx, ! 4496: gen_rtx (SIGN_EXTEND, SImode, operands[0])); 1.1 root 4497: #endif 4498: }") 4499: 4500: ;; Jump to variable address from dispatch table of absolute addresses. 4501: (define_insn "" 4502: [(set (pc) (match_operand:SI 0 "register_operand" "a")) 4503: (use (label_ref (match_operand 1 "" "")))] 4504: "" 4505: "* 4506: #ifdef MOTOROLA 4507: return \"jmp (%0)\"; 4508: #else 4509: return \"jmp %0@\"; 4510: #endif 4511: ") 4512: 4513: ;; Jump to variable address from dispatch table of relative addresses. 4514: (define_insn "" 4515: [(set (pc) 1.1.1.3 ! root 4516: (plus:SI (pc) ! 4517: (sign_extend:SI (match_operand:HI 0 "register_operand" "r")))) 1.1 root 4518: (use (label_ref (match_operand 1 "" "")))] 4519: "" 4520: "* 4521: #ifdef ASM_RETURN_CASE_JUMP 4522: ASM_RETURN_CASE_JUMP; 4523: #else 4524: #ifdef SGS 4525: #ifdef ASM_OUTPUT_CASE_LABEL 4526: return \"jmp 6(%%pc,%0.w)\"; 4527: #else 4528: #ifdef CRDS 4529: return \"jmp 2(pc,%0.w)\"; 4530: #else 4531: return \"jmp 2(%%pc,%0.w)\"; 4532: #endif /* end !CRDS */ 4533: #endif 4534: #else /* not SGS */ 4535: #ifdef MOTOROLA 4536: return \"jmp (2,pc,%0.w)\"; 4537: #else 4538: return \"jmp pc@(2,%0:w)\"; 4539: #endif 4540: #endif 4541: #endif 4542: ") 4543: 4544: ;; Decrement-and-branch insns. 4545: (define_insn "" 4546: [(set (pc) 4547: (if_then_else 4548: (ne (match_operand:HI 0 "general_operand" "+g") 4549: (const_int 0)) 4550: (label_ref (match_operand 1 "" "")) 4551: (pc))) 4552: (set (match_dup 0) 4553: (plus:HI (match_dup 0) 4554: (const_int -1)))] 4555: "" 4556: "* 4557: { 4558: CC_STATUS_INIT; 4559: if (DATA_REG_P (operands[0])) 4560: return \"dbra %0,%l1\"; 4561: if (GET_CODE (operands[0]) == MEM) 4562: { 4563: #ifdef MOTOROLA 4564: #ifdef NO_ADDSUB_Q 4565: return \"sub%.w %#1,%0\;jbcc %l1\"; 4566: #else 4567: return \"subq%.w %#1,%0\;jbcc %l1\"; 4568: #endif 4569: #else /* not MOTOROLA */ 4570: return \"subqw %#1,%0\;jcc %l1\"; 4571: #endif 4572: } 4573: #ifdef MOTOROLA 4574: #ifdef SGS_CMP_ORDER 4575: #ifdef NO_ADDSUB_Q 4576: return \"sub%.w %#1,%0\;cmp%.w %0,%#-1\;jbne %l1\"; 4577: #else 4578: return \"subq%.w %#1,%0\;cmp%.w %0,%#-1\;jbne %l1\"; 4579: #endif 4580: #else /* not SGS_CMP_ORDER */ 4581: return \"subq%.w %#1,%0\;cmp%.w %#-1,%0\;jbne %l1\"; 4582: #endif 4583: #else /* not MOTOROLA */ 4584: return \"subqw %#1,%0\;cmpw %#-1,%0\;jne %l1\"; 4585: #endif 4586: }") 4587: 4588: (define_insn "" 4589: [(set (pc) 4590: (if_then_else 4591: (ne (match_operand:SI 0 "general_operand" "+g") 4592: (const_int 0)) 4593: (label_ref (match_operand 1 "" "")) 4594: (pc))) 4595: (set (match_dup 0) 4596: (plus:SI (match_dup 0) 4597: (const_int -1)))] 4598: "" 4599: "* 4600: { 4601: CC_STATUS_INIT; 4602: #ifdef MOTOROLA 4603: #ifdef NO_ADDSUB_Q 4604: if (DATA_REG_P (operands[0])) 4605: return \"dbra %0,%l1\;clr%.w %0\;sub%.l %#1,%0\;jbcc %l1\"; 4606: if (GET_CODE (operands[0]) == MEM) 4607: return \"sub%.l %#1,%0\;jbcc %l1\"; 4608: #else 4609: if (DATA_REG_P (operands[0])) 4610: return \"dbra %0,%l1\;clr%.w %0\;subq%.l %#1,%0\;jbcc %l1\"; 4611: if (GET_CODE (operands[0]) == MEM) 4612: return \"subq%.l %#1,%0\;jbcc %l1\"; 4613: #endif /* NO_ADDSUB_Q */ 4614: #ifdef SGS_CMP_ORDER 4615: #ifdef NO_ADDSUB_Q 4616: return \"sub.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\"; 4617: #else 4618: return \"subq.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\"; 4619: #endif 4620: #else /* not SGS_CMP_ORDER */ 4621: return \"subq.l %#1,%0\;cmp.l %#-1,%0\;jbne %l1\"; 4622: #endif /* not SGS_CMP_ORDER */ 4623: #else /* not MOTOROLA */ 4624: if (DATA_REG_P (operands[0])) 4625: return \"dbra %0,%l1\;clr%.w %0\;subql %#1,%0\;jcc %l1\"; 4626: if (GET_CODE (operands[0]) == MEM) 4627: return \"subql %#1,%0\;jcc %l1\"; 4628: return \"subql %#1,%0\;cmpl %#-1,%0\;jne %l1\"; 4629: #endif /* not MOTOROLA */ 4630: }") 4631: 4632: ;; Two dbra patterns that use REG_NOTES info generated by strength_reduce. 4633: 4634: (define_insn "" 4635: [(set (pc) 4636: (if_then_else 4637: (ge (plus:HI (match_operand:HI 0 "general_operand" "+g") 4638: (const_int -1)) 4639: (const_int 0)) 4640: (label_ref (match_operand 1 "" "")) 4641: (pc))) 4642: (set (match_dup 0) 4643: (plus:HI (match_dup 0) 4644: (const_int -1)))] 4645: "find_reg_note (insn, REG_NONNEG, 0)" 4646: "* 4647: { 4648: CC_STATUS_INIT; 4649: #ifdef MOTOROLA 4650: #ifdef NO_ADDSUB_Q 4651: if (DATA_REG_P (operands[0])) 4652: return \"dbra %0,%l1\"; 4653: if (GET_CODE (operands[0]) == MEM) 4654: return \"sub%.w %#1,%0\;jbcc %l1\"; 4655: #else 4656: if (DATA_REG_P (operands[0])) 4657: return \"dbra %0,%l1\"; 4658: if (GET_CODE (operands[0]) == MEM) 4659: return \"subq%.w %#1,%0\;jbcc %l1\"; 4660: #endif 4661: #ifdef SGS_CMP_ORDER 4662: #ifdef NO_ADDSUB_Q 4663: return \"sub.w %#1,%0\;cmp.w %0,%#-1\;jbne %l1\"; 4664: #else 4665: return \"subq.w %#1,%0\;cmp.w %0,%#-1\;jbne %l1\"; 4666: #endif 4667: #else /* not SGS_CMP_ORDER */ 4668: return \"subq.w %#1,%0\;cmp.w %#-1,%0\;jbne %l1\"; 4669: #endif /* not SGS_CMP_ORDER */ 4670: #else /* not MOTOROLA */ 4671: if (DATA_REG_P (operands[0])) 4672: return \"dbra %0,%l1\"; 4673: if (GET_CODE (operands[0]) == MEM) 4674: return \"subqw %#1,%0\;jcc %l1\"; 4675: return \"subqw %#1,%0\;cmpw %#-1,%0\;jne %l1\"; 4676: #endif /* not MOTOROLA */ 4677: }") 4678: 4679: (define_insn "decrement_and_branch_until_zero" 4680: [(set (pc) 4681: (if_then_else 4682: (ge (plus:SI (match_operand:SI 0 "general_operand" "+g") 4683: (const_int -1)) 4684: (const_int 0)) 4685: (label_ref (match_operand 1 "" "")) 4686: (pc))) 4687: (set (match_dup 0) 4688: (plus:SI (match_dup 0) 4689: (const_int -1)))] 4690: "find_reg_note (insn, REG_NONNEG, 0)" 4691: "* 4692: { 4693: CC_STATUS_INIT; 4694: #ifdef MOTOROLA 4695: #ifdef NO_ADDSUB_Q 4696: if (DATA_REG_P (operands[0])) 4697: return \"dbra %0,%l1\;clr%.w %0\;sub%.l %#1,%0\;jbcc %l1\"; 4698: if (GET_CODE (operands[0]) == MEM) 4699: return \"sub%.l %#1,%0\;jbcc %l1\"; 4700: #else 4701: if (DATA_REG_P (operands[0])) 4702: return \"dbra %0,%l1\;clr%.w %0\;subq%.l %#1,%0\;jbcc %l1\"; 4703: if (GET_CODE (operands[0]) == MEM) 4704: return \"subq%.l %#1,%0\;jbcc %l1\"; 4705: #endif 4706: #ifdef SGS_CMP_ORDER 4707: #ifdef NO_ADDSUB_Q 4708: return \"sub.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\"; 4709: #else 4710: return \"subq.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\"; 4711: #endif 4712: #else /* not SGS_CMP_ORDER */ 4713: return \"subq.l %#1,%0\;cmp.l %#-1,%0\;jbne %l1\"; 4714: #endif /* not SGS_CMP_ORDER */ 4715: #else /* not MOTOROLA */ 4716: if (DATA_REG_P (operands[0])) 4717: return \"dbra %0,%l1\;clr%.w %0\;subql %#1,%0\;jcc %l1\"; 4718: if (GET_CODE (operands[0]) == MEM) 4719: return \"subql %#1,%0\;jcc %l1\"; 4720: return \"subql %#1,%0\;cmpl %#-1,%0\;jne %l1\"; 4721: #endif /* not MOTOROLA */ 4722: }") 4723: 4724: 4725: ;; PIC calls are handled by loading the address of the function into a 4726: ;; register (via movsi), then emitting a register indirect call using 4727: ;; the "jsr" function call syntax. 4728: ;; 4729: ;; It is important to note that the "jsr" syntax is always used for 4730: ;; PIC calls, even on machines in which GCC normally uses the "jbsr" 4731: ;; syntax for non-PIC calls. This keeps at least 1 assembler (Sun) 4732: ;; from emitting incorrect code for a PIC call. 4733: ;; 4734: ;; We have different patterns for PIC calls and non-PIC calls. The 4735: ;; different patterns are only used to choose the right syntax 4736: ;; ("jsr" vs "jbsr"). 4737: ;; 4738: ;; On svr4 m68k, PIC stuff is done differently. To be able to support 4739: ;; dynamic linker LAZY BINDING, all the procedure calls need to go 4740: ;; through the PLT (Procedure Linkage Table) section in PIC mode. The 4741: ;; svr4 m68k assembler recognizes this syntax: `bsr FUNC@PLTPC' and it 4742: ;; will create the correct relocation entry (R_68K_PLT32) for `FUNC', 4743: ;; that tells the linker editor to create an entry for `FUNC' in PLT 4744: ;; section at link time. However, all global objects reference are still 4745: ;; done by using `OBJ@GOT'. So, the goal here is to output the function 4746: ;; call operand as `FUNC@PLTPC', but output object operand as `OBJ@GOT'. 4747: ;; We need to have a way to differentiate these two different operands. 4748: ;; 4749: ;; The strategy I use here is to use SYMBOL_REF_FLAG to differentiate 4750: ;; these two different operands. The macro LEGITIMATE_PIC_OPERAND_P needs 4751: ;; to be changed to recognize function calls symbol_ref operand as a legal 4752: ;; PIC operand (by checking whether SYMBOL_REF_FLAG is set). This will 4753: ;; avoid the compiler to load this symbol_ref operand into a register. 4754: ;; Remember, the operand "foo@PLTPC" cannot be called via jsr directly 4755: ;; since the value is a PC relative offset, not a real address. 4756: ;; 4757: ;; All global objects are treated in the similar way as in SUN3. The only 4758: ;; difference is: on m68k svr4, the reference of such global object needs 4759: ;; to end with a suffix "@GOT" so the assembler and linker know to create 4760: ;; an entry for it in GOT (Global Offset Table) section. This is done in 4761: ;; m68k.c. 4762: 4763: ;; Call subroutine with no return value. 4764: (define_expand "call" 4765: [(call (match_operand:QI 0 "memory_operand" "") 4766: (match_operand:SI 1 "general_operand" ""))] 4767: ;; Operand 1 not really used on the m68000. 4768: 4769: "" 4770: " 4771: { 4772: if (flag_pic && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF) 4773: #ifdef MOTOROLA 4774: SYMBOL_REF_FLAG (XEXP (operands[0], 0)) = 1; 4775: #else 4776: operands[0] = gen_rtx (MEM, GET_MODE (operands[0]), 4777: force_reg (Pmode, XEXP (operands[0], 0))); 4778: #endif 4779: }") 4780: 4781: ;; This is a normal call sequence. 4782: (define_insn "" 4783: [(call (match_operand:QI 0 "memory_operand" "o") 4784: (match_operand:SI 1 "general_operand" "g"))] 4785: ;; Operand 1 not really used on the m68000. 4786: 4787: "! flag_pic" 4788: "* 4789: #ifdef MOTOROLA 1.1.1.3 ! root 4790: #ifdef MOTOROLA_BSR ! 4791: if (GET_CODE (operands[0]) == MEM ! 4792: && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF) ! 4793: return \"bsr %0\"; ! 4794: #endif 1.1 root 4795: return \"jsr %0\"; 4796: #else 4797: return \"jbsr %0\"; 4798: #endif 4799: ") 4800: 4801: ;; This is a PIC call sequence. 4802: (define_insn "" 4803: [(call (match_operand:QI 0 "memory_operand" "o") 4804: (match_operand:SI 1 "general_operand" "g"))] 4805: ;; Operand 1 not really used on the m68000. 4806: 4807: "flag_pic" 4808: "* 4809: #ifdef MOTOROLA 4810: if (GET_CODE (operands[0]) == MEM 4811: && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF) 1.1.1.3 ! root 4812: #ifdef HPUX_ASM ! 4813: return \"bsr.l %0\"; ! 4814: #else 1.1 root 4815: return \"bsr %0@PLTPC\"; 4816: #endif 1.1.1.2 root 4817: #endif 1.1.1.3 ! root 4818: return \"jsr %0\"; 1.1 root 4819: ") 4820: 4821: ;; Call subroutine, returning value in operand 0 4822: ;; (which must be a hard register). 4823: ;; See comments before "call" regarding PIC calls. 4824: (define_expand "call_value" 4825: [(set (match_operand 0 "" "") 4826: (call (match_operand:QI 1 "memory_operand" "") 4827: (match_operand:SI 2 "general_operand" "")))] 4828: ;; Operand 2 not really used on the m68000. 4829: "" 4830: " 4831: { 4832: if (flag_pic && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF) 4833: #ifdef MOTOROLA 4834: SYMBOL_REF_FLAG (XEXP (operands[1], 0)) = 1; 4835: #else 4836: operands[1] = gen_rtx (MEM, GET_MODE (operands[1]), 4837: force_reg (Pmode, XEXP (operands[1], 0))); 4838: #endif 4839: }") 4840: 4841: ;; This is a normal call_value 4842: (define_insn "" 4843: [(set (match_operand 0 "" "=rf") 4844: (call (match_operand:QI 1 "memory_operand" "o") 4845: (match_operand:SI 2 "general_operand" "g")))] 4846: ;; Operand 2 not really used on the m68000. 4847: "! flag_pic" 4848: "* 4849: #ifdef MOTOROLA 1.1.1.3 ! root 4850: #ifdef MOTOROLA_BSR ! 4851: if (GET_CODE (operands[1]) == MEM ! 4852: && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF) ! 4853: return \"bsr %1\"; ! 4854: #endif 1.1 root 4855: return \"jsr %1\"; 4856: #else 4857: return \"jbsr %1\"; 4858: #endif 4859: ") 4860: 4861: ;; This is a PIC call_value 4862: (define_insn "" 4863: [(set (match_operand 0 "" "=rf") 4864: (call (match_operand:QI 1 "memory_operand" "o") 4865: (match_operand:SI 2 "general_operand" "g")))] 4866: ;; Operand 2 not really used on the m68000. 4867: "flag_pic" 4868: "* 4869: #ifdef MOTOROLA 4870: if (GET_CODE (operands[1]) == MEM 4871: && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF) 1.1.1.3 ! root 4872: #ifdef HPUX_ASM ! 4873: return \"bsr.l %1\"; ! 4874: #else 1.1 root 4875: return \"bsr %1@PLTPC\"; 4876: #endif 1.1.1.2 root 4877: #endif 1.1.1.3 ! root 4878: return \"jsr %1\"; 1.1 root 4879: ") 4880: 4881: ;; Call subroutine returning any type. 4882: 4883: (define_expand "untyped_call" 4884: [(parallel [(call (match_operand 0 "" "") 4885: (const_int 0)) 4886: (match_operand 1 "" "") 4887: (match_operand 2 "" "")])] 4888: "NEEDS_UNTYPED_CALL" 4889: " 4890: { 4891: int i; 4892: 4893: emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx)); 4894: 4895: for (i = 0; i < XVECLEN (operands[2], 0); i++) 4896: { 4897: rtx set = XVECEXP (operands[2], 0, i); 4898: emit_move_insn (SET_DEST (set), SET_SRC (set)); 4899: } 4900: 4901: /* The optimizer does not know that the call sets the function value 4902: registers we stored in the result block. We avoid problems by 4903: claiming that all hard registers are used and clobbered at this 4904: point. */ 4905: emit_insn (gen_blockage ()); 4906: 4907: DONE; 4908: }") 4909: 4910: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and 4911: ;; all of memory. This blocks insns from being moved across this point. 4912: 4913: (define_insn "blockage" 4914: [(unspec_volatile [(const_int 0)] 0)] 4915: "" 4916: "") 4917: 4918: (define_insn "nop" 4919: [(const_int 0)] 4920: "" 4921: "nop") 4922: 4923: (define_insn "probe" 4924: [(reg:SI 15)] 4925: "NEED_PROBE" 4926: "* 4927: { 4928: operands[0] = gen_rtx (PLUS, SImode, stack_pointer_rtx, 4929: gen_rtx (CONST_INT, VOIDmode, NEED_PROBE)); 4930: return \"tstl %a0\"; 4931: }") 4932: 4933: ;; Used for frameless functions which save no regs and allocate no locals. 4934: (define_insn "return" 4935: [(return)] 4936: "USE_RETURN_INSN" 4937: "* 4938: { 4939: if (current_function_pops_args == 0) 4940: return \"rts\"; 4941: operands[0] = gen_rtx (CONST_INT, VOIDmode, current_function_pops_args); 4942: return \"rtd %0\"; 4943: }") 4944: 4945: (define_insn "indirect_jump" 4946: [(set (pc) (match_operand:SI 0 "address_operand" "p"))] 4947: "" 4948: "jmp %a0") 4949: 4950: ;; This should not be used unless the add/sub insns can't be. 4951: 4952: (define_insn "" 4953: [(set (match_operand:SI 0 "general_operand" "=a") 4954: (match_operand:QI 1 "address_operand" "p"))] 4955: "" 1.1.1.3 ! root 4956: "* ! 4957: { ! 4958: #ifndef SGS_NO_LI ! 4959: /* Recognize an insn that refers to a table of offsets. Such an insn will ! 4960: need to refer to a label on the insn. So output one. Use the ! 4961: label-number of the table of offsets to generate this label. This code, ! 4962: and similar code above, assumes that there will be at most one reference ! 4963: to each table. */ ! 4964: if (GET_CODE (operands[1]) == PLUS ! 4965: && GET_CODE (XEXP (operands[1], 1)) == LABEL_REF ! 4966: && GET_CODE (XEXP (operands[1], 0)) != PLUS) ! 4967: { ! 4968: rtx labelref = XEXP (operands[1], 1); ! 4969: #if defined (MOTOROLA) && !defined (SGS_SWITCH_TABLES) ! 4970: #ifdef SGS ! 4971: asm_fprintf (asm_out_file, \"\\tset %LLI%d,.+2\\n\", ! 4972: CODE_LABEL_NUMBER (XEXP (labelref, 0))); ! 4973: #else /* not SGS */ ! 4974: asm_fprintf (asm_out_file, \"\\t.set %LLI%d,.+2\\n\", ! 4975: CODE_LABEL_NUMBER (XEXP (labelref, 0))); ! 4976: #endif /* not SGS */ ! 4977: #else /* SGS_SWITCH_TABLES or not MOTOROLA */ ! 4978: ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\", ! 4979: CODE_LABEL_NUMBER (XEXP (labelref, 0))); ! 4980: #ifdef SGS_SWITCH_TABLES ! 4981: /* Set flag saying we need to define the symbol ! 4982: LD%n (with value L%n-LI%n) at the end of the switch table. */ ! 4983: switch_table_difference_label_flag = 1; ! 4984: #endif /* SGS_SWITCH_TABLES */ ! 4985: #endif /* SGS_SWITCH_TABLES or not MOTOROLA */ ! 4986: } ! 4987: #endif /* SGS_NO_LI */ ! 4988: ! 4989: return \"lea %a1,%0\"; ! 4990: }") 1.1 root 4991: 4992: ;; This is the first machine-dependent peephole optimization. 4993: ;; It is useful when a floating value is returned from a function call 4994: ;; and then is moved into an FP register. 4995: ;; But it is mainly intended to test the support for these optimizations. 4996: 4997: (define_peephole 4998: [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4))) 4999: (set (match_operand:DF 0 "register_operand" "=f") 5000: (match_operand:DF 1 "register_operand" "ad"))] 5001: "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])" 5002: "* 5003: { 5004: rtx xoperands[2]; 5005: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); 5006: output_asm_insn (\"move%.l %1,%@\", xoperands); 5007: output_asm_insn (\"move%.l %1,%-\", operands); 5008: return \"fmove%.d %+,%0\"; 5009: } 5010: ") 5011: 5012: ;; Optimize a stack-adjust followed by a push of an argument. 5013: ;; This is said to happen frequently with -msoft-float 5014: ;; when there are consecutive library calls. 5015: 5016: (define_peephole 5017: [(set (reg:SI 15) (plus:SI (reg:SI 15) 1.1.1.3 ! root 5018: (match_operand:SI 0 "const_int_operand" "n"))) 1.1 root 5019: (set (match_operand:SF 1 "push_operand" "=m") 5020: (match_operand:SF 2 "general_operand" "rmfF"))] 1.1.1.3 ! root 5021: "INTVAL (operands[0]) >= 4 1.1 root 5022: && ! reg_mentioned_p (stack_pointer_rtx, operands[2])" 5023: "* 5024: { 5025: if (INTVAL (operands[0]) > 4) 5026: { 5027: rtx xoperands[2]; 5028: xoperands[0] = stack_pointer_rtx; 5029: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[0]) - 4); 5030: #ifndef NO_ADDSUB_Q 5031: if (INTVAL (xoperands[1]) <= 8) 5032: output_asm_insn (\"addq%.w %1,%0\", xoperands); 5033: else if (INTVAL (xoperands[1]) <= 16 && TARGET_68020) 5034: { 5035: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, 5036: INTVAL (xoperands[1]) - 8); 5037: output_asm_insn (\"addq%.w %#8,%0\;addq%.w %1,%0\", xoperands); 5038: } 5039: else 5040: #endif 5041: if (INTVAL (xoperands[1]) <= 0x7FFF) 5042: output_asm_insn (\"add%.w %1,%0\", xoperands); 5043: else 5044: output_asm_insn (\"add%.l %1,%0\", xoperands); 5045: } 5046: if (FP_REG_P (operands[2])) 5047: return \"fmove%.s %2,%@\"; 5048: return \"move%.l %2,%@\"; 5049: }") 5050: 5051: ;; Speed up stack adjust followed by a fullword fixedpoint push. 5052: 5053: (define_peephole 5054: [(set (reg:SI 15) (plus:SI (reg:SI 15) 1.1.1.3 ! root 5055: (match_operand:SI 0 "const_int_operand" "n"))) 1.1 root 5056: (set (match_operand:SI 1 "push_operand" "=m") 5057: (match_operand:SI 2 "general_operand" "g"))] 1.1.1.3 ! root 5058: "INTVAL (operands[0]) >= 4 1.1 root 5059: && ! reg_mentioned_p (stack_pointer_rtx, operands[2])" 5060: "* 5061: { 5062: if (INTVAL (operands[0]) > 4) 5063: { 5064: rtx xoperands[2]; 5065: xoperands[0] = stack_pointer_rtx; 5066: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[0]) - 4); 5067: #ifndef NO_ADDSUB_Q 5068: if (INTVAL (xoperands[1]) <= 8) 5069: output_asm_insn (\"addq%.w %1,%0\", xoperands); 5070: else if (INTVAL (xoperands[1]) <= 16 && TARGET_68020) 5071: { 5072: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, 5073: INTVAL (xoperands[1]) - 8); 5074: output_asm_insn (\"addq%.w %#8,%0\;addq%.w %1,%0\", xoperands); 5075: } 5076: else 5077: #endif 5078: if (INTVAL (xoperands[1]) <= 0x7FFF) 5079: output_asm_insn (\"add%.w %1,%0\", xoperands); 5080: else 5081: output_asm_insn (\"add%.l %1,%0\", xoperands); 5082: } 5083: if (operands[2] == const0_rtx) 5084: return \"clr%.l %@\"; 5085: return \"move%.l %2,%@\"; 5086: }") 5087: 5088: ;; Speed up pushing a single byte but leaving four bytes of space. 5089: 5090: (define_peephole 5091: [(set (mem:QI (pre_dec:SI (reg:SI 15))) 5092: (match_operand:QI 1 "general_operand" "dami")) 5093: (set (reg:SI 15) (minus:SI (reg:SI 15) (const_int 2)))] 5094: "! reg_mentioned_p (stack_pointer_rtx, operands[1])" 5095: "* 5096: { 5097: rtx xoperands[4]; 5098: 5099: if (GET_CODE (operands[1]) == REG) 5100: return \"move%.l %1,%-\"; 5101: 5102: xoperands[1] = operands[1]; 5103: xoperands[2] 5104: = gen_rtx (MEM, QImode, 5105: gen_rtx (PLUS, VOIDmode, stack_pointer_rtx, 5106: gen_rtx (CONST_INT, VOIDmode, 3))); 5107: xoperands[3] = stack_pointer_rtx; 5108: output_asm_insn (\"subq%.w %#4,%3\;move%.b %1,%2\", xoperands); 5109: return \"\"; 5110: }") 5111: 5112: (define_peephole 5113: [(set (match_operand:SI 0 "register_operand" "=d") 5114: (const_int 0)) 5115: (set (strict_low_part (subreg:HI (match_dup 0) 0)) 5116: (match_operand:HI 1 "general_operand" "rmn"))] 5117: "strict_low_part_peephole_ok (HImode, prev_nonnote_insn (insn), operands[0])" 5118: "* 5119: { 5120: if (GET_CODE (operands[1]) == CONST_INT) 5121: { 5122: if (operands[1] == const0_rtx 5123: && (DATA_REG_P (operands[0]) 5124: || GET_CODE (operands[0]) == MEM) 5125: /* clr insns on 68000 read before writing. 5126: This isn't so on the 68010, but we have no alternative for it. */ 5127: && (TARGET_68020 5128: || !(GET_CODE (operands[0]) == MEM 5129: && MEM_VOLATILE_P (operands[0])))) 5130: return \"clr%.w %0\"; 5131: } 5132: return \"move%.w %1,%0\"; 5133: }") 5134: 5135: ;; dbCC peepholes 5136: ;; 5137: ;; Turns 5138: ;; loop: 5139: ;; [ ... ] 5140: ;; jCC label ; abnormal loop termination 5141: ;; dbra dN, loop ; normal loop termination 5142: ;; 5143: ;; Into 5144: ;; loop: 5145: ;; [ ... ] 5146: ;; dbCC dN, loop 5147: ;; jCC label 5148: ;; 5149: ;; Which moves the jCC condition outside the inner loop for free. 5150: ;; 5151: (define_peephole 5152: [(set (pc) (if_then_else (match_operator 3 "valid_dbcc_comparison_p" 5153: [(cc0) (const_int 0)]) 5154: (label_ref (match_operand 2 "" "")) 5155: (pc))) 5156: (parallel 5157: [(set (pc) 5158: (if_then_else 5159: (ge (plus:HI (match_operand:HI 0 "register_operand" "+d") 5160: (const_int -1)) 5161: (const_int 0)) 5162: (label_ref (match_operand 1 "" "")) 5163: (pc))) 5164: (set (match_dup 0) 5165: (plus:HI (match_dup 0) 5166: (const_int -1)))])] 5167: "DATA_REG_P (operands[0])" 5168: "* 5169: { 5170: CC_STATUS_INIT; 5171: output_dbcc_and_branch (operands); 5172: return \"\"; 5173: }") 5174: 5175: (define_peephole 5176: [(set (pc) (if_then_else (match_operator 3 "valid_dbcc_comparison_p" 5177: [(cc0) (const_int 0)]) 5178: (label_ref (match_operand 2 "" "")) 5179: (pc))) 5180: (parallel 5181: [(set (pc) 5182: (if_then_else 5183: (ge (plus:SI (match_operand:SI 0 "register_operand" "+d") 5184: (const_int -1)) 5185: (const_int 0)) 5186: (label_ref (match_operand 1 "" "")) 5187: (pc))) 5188: (set (match_dup 0) 5189: (plus:SI (match_dup 0) 5190: (const_int -1)))])] 5191: "DATA_REG_P (operands[0])" 5192: "* 5193: { 5194: CC_STATUS_INIT; 5195: output_dbcc_and_branch (operands); 5196: return \"\"; 5197: }") 5198: 5199: 5200: ;; FPA multiply and add. 5201: (define_insn "" 5202: [(set (match_operand:DF 0 "register_operand" "=x,y,y") 5203: (plus:DF (mult:DF (match_operand:DF 1 "general_operand" "%x,dmF,y") 5204: (match_operand:DF 2 "general_operand" "xH,y,y")) 5205: (match_operand:DF 3 "general_operand" "xH,y,dmF")))] 5206: "TARGET_FPA" 5207: "@ 5208: fpma%.d %1,%w2,%w3,%0 5209: fpma%.d %x1,%x2,%x3,%0 5210: fpma%.d %x1,%x2,%x3,%0") 5211: 5212: (define_insn "" 5213: [(set (match_operand:SF 0 "register_operand" "=x,y,y") 5214: (plus:SF (mult:SF (match_operand:SF 1 "general_operand" "%x,ydmF,y") 5215: (match_operand:SF 2 "general_operand" "xH,y,ydmF")) 5216: (match_operand:SF 3 "general_operand" "xH,ydmF,ydmF")))] 5217: "TARGET_FPA" 5218: "@ 5219: fpma%.s %1,%w2,%w3,%0 5220: fpma%.s %1,%2,%3,%0 5221: fpma%.s %1,%2,%3,%0") 5222: 5223: ;; FPA Multiply and subtract 5224: (define_insn "" 5225: [(set (match_operand:DF 0 "register_operand" "=x,y,y") 5226: (minus:DF (match_operand:DF 1 "general_operand" "xH,rmF,y") 5227: (mult:DF (match_operand:DF 2 "general_operand" "%xH,y,y") 5228: (match_operand:DF 3 "general_operand" "x,y,rmF"))))] 5229: "TARGET_FPA" 5230: "@ 5231: fpms%.d %3,%w2,%w1,%0 5232: fpms%.d %x3,%2,%x1,%0 5233: fpms%.d %x3,%2,%x1,%0") 5234: 5235: (define_insn "" 5236: [(set (match_operand:SF 0 "register_operand" "=x,y,y") 5237: (minus:SF (match_operand:SF 1 "general_operand" "xH,rmF,yrmF") 5238: (mult:SF (match_operand:SF 2 "general_operand" "%xH,rmF,y") 5239: (match_operand:SF 3 "general_operand" "x,y,yrmF"))))] 5240: "TARGET_FPA" 5241: "@ 5242: fpms%.s %3,%w2,%w1,%0 5243: fpms%.s %3,%2,%1,%0 5244: fpms%.s %3,%2,%1,%0") 5245: 5246: (define_insn "" 5247: [(set (match_operand:DF 0 "register_operand" "=x,y,y") 5248: (minus:DF (mult:DF (match_operand:DF 1 "general_operand" "%xH,y,y") 5249: (match_operand:DF 2 "general_operand" "x,y,rmF")) 5250: (match_operand:DF 3 "general_operand" "xH,rmF,y")))] 5251: "TARGET_FPA" 5252: "@ 5253: fpmr%.d %2,%w1,%w3,%0 5254: fpmr%.d %x2,%1,%x3,%0 5255: fpmr%.d %x2,%1,%x3,%0") 5256: 5257: (define_insn "" 5258: [(set (match_operand:SF 0 "register_operand" "=x,y,y") 5259: (minus:SF (mult:SF (match_operand:SF 1 "general_operand" "%xH,rmF,y") 5260: (match_operand:SF 2 "general_operand" "x,y,yrmF")) 5261: (match_operand:SF 3 "general_operand" "xH,rmF,yrmF")))] 5262: "TARGET_FPA" 5263: "@ 5264: fpmr%.s %2,%w1,%w3,%0 5265: fpmr%.s %x2,%1,%x3,%0 5266: fpmr%.s %x2,%1,%x3,%0") 5267: 5268: ;; FPA Add and multiply 5269: (define_insn "" 5270: [(set (match_operand:DF 0 "register_operand" "=x,y,y") 5271: (mult:DF (plus:DF (match_operand:DF 1 "general_operand" "%xH,y,y") 5272: (match_operand:DF 2 "general_operand" "x,y,rmF")) 5273: (match_operand:DF 3 "general_operand" "xH,rmF,y")))] 5274: "TARGET_FPA" 5275: "@ 5276: fpam%.d %2,%w1,%w3,%0 5277: fpam%.d %x2,%1,%x3,%0 5278: fpam%.d %x2,%1,%x3,%0") 5279: 5280: (define_insn "" 5281: [(set (match_operand:SF 0 "register_operand" "=x,y,y") 5282: (mult:SF (plus:SF (match_operand:SF 1 "general_operand" "%xH,rmF,y") 5283: (match_operand:SF 2 "general_operand" "x,y,yrmF")) 5284: (match_operand:SF 3 "general_operand" "xH,rmF,yrmF")))] 5285: "TARGET_FPA" 5286: "@ 5287: fpam%.s %2,%w1,%w3,%0 5288: fpam%.s %x2,%1,%x3,%0 5289: fpam%.s %x2,%1,%x3,%0") 5290: 5291: ;;FPA Subtract and multiply 5292: (define_insn "" 5293: [(set (match_operand:DF 0 "register_operand" "=x,y,y") 5294: (mult:DF (minus:DF (match_operand:DF 1 "general_operand" "xH,y,y") 5295: (match_operand:DF 2 "general_operand" "x,y,rmF")) 5296: (match_operand:DF 3 "general_operand" "xH,rmF,y")))] 5297: "TARGET_FPA" 5298: "@ 5299: fpsm%.d %2,%w1,%w3,%0 5300: fpsm%.d %x2,%1,%x3,%0 5301: fpsm%.d %x2,%1,%x3,%0") 5302: 5303: (define_insn "" 5304: [(set (match_operand:DF 0 "register_operand" "=x,y,y") 5305: (mult:DF (match_operand:DF 1 "general_operand" "xH,rmF,y") 5306: (minus:DF (match_operand:DF 2 "general_operand" "xH,y,y") 5307: (match_operand:DF 3 "general_operand" "x,y,rmF"))))] 5308: "TARGET_FPA" 5309: "@ 5310: fpsm%.d %3,%w2,%w1,%0 5311: fpsm%.d %x3,%2,%x1,%0 5312: fpsm%.d %x3,%2,%x1,%0") 5313: 5314: (define_insn "" 5315: [(set (match_operand:SF 0 "register_operand" "=x,y,y") 5316: (mult:SF (minus:SF (match_operand:SF 1 "general_operand" "xH,rmF,y") 5317: (match_operand:SF 2 "general_operand" "x,y,yrmF")) 5318: (match_operand:SF 3 "general_operand" "xH,rmF,yrmF")))] 5319: "TARGET_FPA" 5320: "@ 5321: fpsm%.s %2,%w1,%w3,%0 5322: fpsm%.s %x2,%1,%x3,%0 5323: fpsm%.s %x2,%1,%x3,%0") 5324: 5325: (define_insn "" 5326: [(set (match_operand:SF 0 "register_operand" "=x,y,y") 5327: (mult:SF (match_operand:SF 1 "general_operand" "xH,rmF,yrmF") 5328: (minus:SF (match_operand:SF 2 "general_operand" "xH,rmF,y") 5329: (match_operand:SF 3 "general_operand" "x,y,yrmF"))))] 5330: "TARGET_FPA" 5331: "@ 5332: fpsm%.s %3,%w2,%w1,%0 5333: fpsm%.s %x3,%2,%x1,%0 5334: fpsm%.s %x3,%2,%x1,%0") 5335: 5336: (define_insn "tstxf" 5337: [(set (cc0) 5338: (match_operand:XF 0 "nonimmediate_operand" "fm"))] 5339: "TARGET_68881" 5340: "* 5341: { 5342: cc_status.flags = CC_IN_68881; 5343: return \"ftst%.x %0\"; 5344: }") 5345: 5346: 5347: (define_expand "cmpxf" 5348: [(set (cc0) 5349: (compare (match_operand:XF 0 "general_operand" "f,mG") 5350: (match_operand:XF 1 "general_operand" "fmG,f")))] 5351: "TARGET_68881" 5352: " 5353: { 5354: if (CONSTANT_P (operands[0])) 5355: operands[0] = force_const_mem (XFmode, operands[0]); 5356: if (CONSTANT_P (operands[1])) 5357: operands[1] = force_const_mem (XFmode, operands[1]); 5358: }") 5359: 5360: (define_insn "" 5361: [(set (cc0) 5362: (compare (match_operand:XF 0 "nonimmediate_operand" "f,mG") 5363: (match_operand:XF 1 "nonimmediate_operand" "fmG,f")))] 5364: "TARGET_68881" 5365: "* 5366: { 5367: cc_status.flags = CC_IN_68881; 5368: #ifdef SGS_CMP_ORDER 5369: if (REG_P (operands[0])) 5370: { 5371: if (REG_P (operands[1])) 5372: return \"fcmp%.x %0,%1\"; 5373: else 5374: return \"fcmp%.x %0,%f1\"; 5375: } 5376: cc_status.flags |= CC_REVERSED; 5377: return \"fcmp%.x %1,%f0\"; 5378: #else 5379: if (REG_P (operands[0])) 5380: { 5381: if (REG_P (operands[1])) 5382: return \"fcmp%.x %1,%0\"; 5383: else 5384: return \"fcmp%.x %f1,%0\"; 5385: } 5386: cc_status.flags |= CC_REVERSED; 5387: return \"fcmp%.x %f0,%1\"; 5388: #endif 5389: }") 5390: 5391: (define_insn "extendsfxf2" 5392: [(set (match_operand:XF 0 "general_operand" "=fm,f") 5393: (float_extend:XF (match_operand:SF 1 "general_operand" "f,m")))] 5394: "TARGET_68881" 5395: "* 5396: { 5397: if (FP_REG_P (operands[0]) && FP_REG_P (operands[1])) 5398: { 5399: if (REGNO (operands[0]) == REGNO (operands[1])) 5400: { 5401: /* Extending float to double in an fp-reg is a no-op. 5402: NOTICE_UPDATE_CC has already assumed that the 5403: cc will be set. So cancel what it did. */ 5404: cc_status = cc_prev_status; 5405: return \"\"; 5406: } 5407: return \"f%$move%.x %1,%0\"; 5408: } 5409: if (FP_REG_P (operands[0])) 5410: return \"f%$move%.s %f1,%0\"; 5411: return \"fmove%.x %f1,%0\"; 5412: }") 5413: 5414: 5415: (define_insn "extenddfxf2" 5416: [(set (match_operand:XF 0 "general_operand" "=fm,f") 5417: (float_extend:XF 5418: (match_operand:DF 1 "general_operand" "f,m")))] 5419: "TARGET_68881" 5420: "* 5421: { 5422: if (FP_REG_P (operands[0]) && FP_REG_P (operands[1])) 5423: { 5424: if (REGNO (operands[0]) == REGNO (operands[1])) 5425: { 5426: /* Extending float to double in an fp-reg is a no-op. 5427: NOTICE_UPDATE_CC has already assumed that the 5428: cc will be set. So cancel what it did. */ 5429: cc_status = cc_prev_status; 5430: return \"\"; 5431: } 5432: return \"fmove%.x %1,%0\"; 5433: } 5434: if (FP_REG_P (operands[0])) 5435: return \"f%&move%.d %f1,%0\"; 5436: return \"fmove%.x %f1,%0\"; 5437: }") 5438: 5439: (define_insn "truncxfdf2" 5440: [(set (match_operand:DF 0 "general_operand" "=m,!r") 5441: (float_truncate:DF 5442: (match_operand:XF 1 "general_operand" "f,f")))] 5443: "TARGET_68881" 5444: "* 5445: { 5446: if (REG_P (operands[0])) 5447: { 5448: output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands); 5449: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); 5450: return \"move%.l %+,%0\"; 5451: } 5452: return \"fmove%.d %f1,%0\"; 5453: }") 5454: 5455: (define_insn "truncxfsf2" 5456: [(set (match_operand:SF 0 "general_operand" "=dm") 5457: (float_truncate:SF 5458: (match_operand:XF 1 "general_operand" "f")))] 5459: "TARGET_68881" 5460: "fmove%.s %f1,%0") 5461: 5462: (define_insn "floatsixf2" 5463: [(set (match_operand:XF 0 "general_operand" "=f") 5464: (float:XF (match_operand:SI 1 "general_operand" "dmi")))] 5465: "TARGET_68881" 5466: "fmove%.l %1,%0") 5467: 5468: (define_insn "floathixf2" 5469: [(set (match_operand:XF 0 "general_operand" "=f") 5470: (float:XF (match_operand:HI 1 "general_operand" "dmn")))] 5471: "TARGET_68881" 5472: "fmove%.w %1,%0") 5473: 5474: (define_insn "floatqixf2" 5475: [(set (match_operand:XF 0 "general_operand" "=f") 5476: (float:XF (match_operand:QI 1 "general_operand" "dmn")))] 5477: "TARGET_68881" 5478: "fmove%.b %1,%0") 5479: 5480: (define_insn "ftruncxf2" 5481: [(set (match_operand:XF 0 "general_operand" "=f") 5482: (fix:XF (match_operand:XF 1 "general_operand" "fFm")))] 5483: "TARGET_68881" 5484: "* 5485: { 5486: if (FP_REG_P (operands[1])) 5487: return \"fintrz%.x %f1,%0\"; 5488: return \"fintrz%.x %f1,%0\"; 5489: }") 5490: 5491: (define_insn "fixxfqi2" 5492: [(set (match_operand:QI 0 "general_operand" "=dm") 5493: (fix:QI (match_operand:XF 1 "general_operand" "f")))] 5494: "TARGET_68881" 5495: "fmove%.b %1,%0") 5496: 5497: (define_insn "fixxfhi2" 5498: [(set (match_operand:HI 0 "general_operand" "=dm") 5499: (fix:HI (match_operand:XF 1 "general_operand" "f")))] 5500: "TARGET_68881" 5501: "fmove%.w %1,%0") 5502: 5503: (define_insn "fixxfsi2" 5504: [(set (match_operand:SI 0 "general_operand" "=dm") 5505: (fix:SI (match_operand:XF 1 "general_operand" "f")))] 5506: "TARGET_68881" 5507: "fmove%.l %1,%0") 5508: 5509: (define_expand "addxf3" 5510: [(set (match_operand:XF 0 "general_operand" "") 5511: (plus:XF (match_operand:XF 1 "general_operand" "") 5512: (match_operand:XF 2 "general_operand" "")))] 5513: "TARGET_68881" 5514: " 5515: { 5516: if (CONSTANT_P (operands[1])) 5517: operands[1] = force_const_mem (XFmode, operands[1]); 5518: if (CONSTANT_P (operands[2])) 5519: operands[2] = force_const_mem (XFmode, operands[2]); 5520: }") 5521: 5522: (define_insn "" 5523: [(set (match_operand:XF 0 "general_operand" "=f") 5524: (plus:XF (match_operand:XF 1 "nonimmediate_operand" "%0") 5525: (match_operand:XF 2 "nonimmediate_operand" "fmG")))] 5526: "TARGET_68881" 5527: "* 5528: { 5529: if (REG_P (operands[2])) 5530: return \"fadd%.x %2,%0\"; 5531: return \"fadd%.x %f2,%0\"; 5532: }") 5533: 5534: (define_expand "subxf3" 5535: [(set (match_operand:XF 0 "general_operand" "") 5536: (minus:XF (match_operand:XF 1 "general_operand" "") 5537: (match_operand:XF 2 "general_operand" "")))] 5538: "TARGET_68881" 5539: " 5540: { 5541: if (CONSTANT_P (operands[1])) 5542: operands[1] = force_const_mem (XFmode, operands[1]); 5543: if (CONSTANT_P (operands[2])) 5544: operands[2] = force_const_mem (XFmode, operands[2]); 5545: }") 5546: 5547: (define_insn "" 5548: [(set (match_operand:XF 0 "general_operand" "=f") 5549: (minus:XF (match_operand:XF 1 "nonimmediate_operand" "0") 5550: (match_operand:XF 2 "nonimmediate_operand" "fmG")))] 5551: "TARGET_68881" 5552: "* 5553: { 5554: if (REG_P (operands[2])) 5555: return \"fsub%.x %2,%0\"; 5556: return \"fsub%.x %f2,%0\"; 5557: }") 5558: 5559: (define_expand "mulxf3" 5560: [(set (match_operand:XF 0 "general_operand" "") 5561: (mult:XF (match_operand:XF 1 "general_operand" "") 5562: (match_operand:XF 2 "general_operand" "")))] 5563: "TARGET_68881" 5564: " 5565: { 5566: if (CONSTANT_P (operands[1])) 5567: operands[1] = force_const_mem (XFmode, operands[1]); 5568: if (CONSTANT_P (operands[2])) 5569: operands[2] = force_const_mem (XFmode, operands[2]); 5570: }") 5571: 5572: (define_insn "" 5573: [(set (match_operand:XF 0 "general_operand" "=f") 5574: (mult:XF (match_operand:XF 1 "nonimmediate_operand" "%0") 5575: (match_operand:XF 2 "nonimmediate_operand" "fmG")))] 5576: "TARGET_68881" 5577: "* 5578: { 5579: if (REG_P (operands[2])) 5580: return \"fmul%.x %2,%0\"; 5581: return \"fmul%.x %f2,%0\"; 5582: }") 5583: 5584: (define_expand "divxf3" 5585: [(set (match_operand:XF 0 "general_operand" "") 5586: (div:XF (match_operand:XF 1 "general_operand" "") 5587: (match_operand:XF 2 "general_operand" "")))] 5588: "TARGET_68881" 5589: " 5590: { 5591: if (CONSTANT_P (operands[1])) 5592: operands[1] = force_const_mem (XFmode, operands[1]); 5593: if (CONSTANT_P (operands[2])) 5594: operands[2] = force_const_mem (XFmode, operands[2]); 5595: }") 5596: 5597: (define_insn "" 5598: [(set (match_operand:XF 0 "general_operand" "=f") 5599: (div:XF (match_operand:XF 1 "nonimmediate_operand" "0") 5600: (match_operand:XF 2 "nonimmediate_operand" "fmG")))] 5601: "TARGET_68881" 5602: "* 5603: { 5604: if (REG_P (operands[2])) 5605: return \"fdiv%.x %2,%0\"; 5606: return \"fdiv%.x %f2,%0\"; 5607: }") 5608: 5609: (define_insn "negxf2" 5610: [(set (match_operand:XF 0 "general_operand" "=f") 5611: (neg:XF (match_operand:XF 1 "nonimmediate_operand" "fmF")))] 5612: "TARGET_68881" 5613: "* 5614: { 5615: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1])) 5616: return \"fneg%.x %1,%0\"; 5617: return \"fneg%.x %f1,%0\"; 5618: }") 5619: 5620: (define_insn "absxf2" 5621: [(set (match_operand:XF 0 "general_operand" "=f") 5622: (abs:XF (match_operand:XF 1 "nonimmediate_operand" "fmF")))] 5623: "TARGET_68881" 5624: "* 5625: { 5626: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1])) 5627: return \"fabs%.x %1,%0\"; 5628: return \"fabs%.x %f1,%0\"; 5629: }") 5630: 5631: (define_insn "sqrtxf2" 5632: [(set (match_operand:XF 0 "general_operand" "=f") 5633: (sqrt:XF (match_operand:DF 1 "nonimmediate_operand" "fm")))] 5634: "TARGET_68881" 5635: "* 5636: { 5637: return \"fsqrt%.x %1,%0\"; 5638: }")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.