|
|
1.1 root 1: ;; Mips.md Machine Description for MIPS based processors
2: ;; Contributed by A. Lichnewsky, [email protected]
3: ;; Changes by Michael Meissner, [email protected]
1.1.1.3 root 4: ;; 64 bit r4000 support by Ian Lance Taylor, [email protected], and
5: ;; Brendan Eich, [email protected].
1.1.1.4 ! root 6: ;; Copyright (C) 1989, 90, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
1.1 root 7:
8: ;; This file is part of GNU CC.
9:
10: ;; GNU CC is free software; you can redistribute it and/or modify
11: ;; it under the terms of the GNU General Public License as published by
12: ;; the Free Software Foundation; either version 2, or (at your option)
13: ;; any later version.
14:
15: ;; GNU CC is distributed in the hope that it will be useful,
16: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: ;; GNU General Public License for more details.
19:
20: ;; You should have received a copy of the GNU General Public License
21: ;; along with GNU CC; see the file COPYING. If not, write to
1.1.1.4 ! root 22: ;; the Free Software Foundation, 59 Temple Place - Suite 330,
! 23: ;; Boston, MA 02111-1307, USA.
! 24:
! 25: ;; ??? MIPS4 has 8 floating point condition codes. This is not supported yet.
! 26:
! 27: ;; ??? MIPS4 has floating point doubleword/word load/stores that accept a
! 28: ;; base+index addressing mode. There are no such load/stores for the integer
! 29: ;; registers. This is not supported yet.
! 30:
! 31: ;; ??? Currently does not have define_function_unit support for the R8000.
! 32: ;; Must include new entries for fmadd in addition to existing entries.
1.1 root 33:
34:
35:
36: ;; ....................
37: ;;
38: ;; Attributes
39: ;;
40: ;; ....................
41:
42: ;; Classification of each insn.
43: ;; branch conditional branch
44: ;; jump unconditional jump
45: ;; call unconditional call
46: ;; load load instruction(s)
47: ;; store store instruction(s)
48: ;; move data movement within same register set
49: ;; xfer transfer to/from coprocessor
50: ;; hilo transfer of hi/lo registers
51: ;; arith integer arithmetic instruction
52: ;; darith double precision integer arithmetic instructions
53: ;; imul integer multiply
54: ;; idiv integer divide
55: ;; icmp integer compare
56: ;; fadd floating point add/subtract
57: ;; fmul floating point multiply
1.1.1.4 ! root 58: ;; fmadd floating point multiply-add
1.1 root 59: ;; fdiv floating point divide
60: ;; fabs floating point absolute value
61: ;; fneg floating point negation
62: ;; fcmp floating point compare
63: ;; fcvt floating point convert
64: ;; fsqrt floating point square root
65: ;; multi multiword sequence (or user asm statements)
66: ;; nop no operation
67:
68: (define_attr "type"
1.1.1.4 ! root 69: "unknown,branch,jump,call,load,store,move,xfer,hilo,arith,darith,imul,idiv,icmp,fadd,fmul,fmadd,fdiv,fabs,fneg,fcmp,fcvt,fsqrt,multi,nop"
1.1 root 70: (const_string "unknown"))
71:
72: ;; Main data type used by the insn
73: (define_attr "mode" "unknown,none,QI,HI,SI,DI,SF,DF,FPSW" (const_string "unknown"))
74:
75: ;; # instructions (4 bytes each)
76: (define_attr "length" "" (const_int 1))
77:
78: ;; whether or not an instruction has a mandatory delay slot
79: (define_attr "dslot" "no,yes"
80: (if_then_else (eq_attr "type" "branch,jump,call,load,xfer,hilo,fcmp")
81: (const_string "yes")
82: (const_string "no")))
83:
84: ;; Attribute describing the processor. This attribute must match exactly
85: ;; with the processor_type enumeration in mips.h.
86:
87: ;; Attribute describing the processor
88: ;; (define_attr "cpu" "default,r3000,r6000,r4000"
89: ;; (const
90: ;; (cond [(eq (symbol_ref "mips_cpu") (symbol_ref "PROCESSOR_R3000")) (const_string "r3000")
91: ;; (eq (symbol_ref "mips_cpu") (symbol_ref "PROCESSOR_R4000")) (const_string "r4000")
92: ;; (eq (symbol_ref "mips_cpu") (symbol_ref "PROCESSOR_R6000")) (const_string "r6000")]
93: ;; (const_string "default"))))
94:
1.1.1.4 ! root 95: ;; ??? Fix everything that tests this attribute.
! 96: (define_attr "cpu" "default,r3000,r6000,r4000,r4600,r4650,r8000"
1.1 root 97: (const (symbol_ref "mips_cpu_attr")))
98:
99: ;; Attribute defining whether or not we can use the branch-likely instructions
100: ;; (MIPS ISA level 2)
101:
102: (define_attr "branch_likely" "no,yes"
103: (const
104: (if_then_else (ge (symbol_ref "mips_isa") (const_int 2))
105: (const_string "yes")
106: (const_string "no"))))
107:
108:
109: ;; Describe a user's asm statement.
110: (define_asm_attributes
111: [(set_attr "type" "multi")])
112:
1.1.1.2 root 113: ;; whether or not generating calls to position independent functions
114: (define_attr "abicalls" "no,yes"
115: (const (symbol_ref "mips_abicalls_attr")))
116:
1.1 root 117:
118:
119: ;; .........................
120: ;;
121: ;; Delay slots, can't describe load/fcmp/xfer delay slots here
122: ;;
123: ;; .........................
124:
125: (define_delay (eq_attr "type" "branch")
126: [(and (eq_attr "dslot" "no") (eq_attr "length" "1"))
127: (nil)
128: (and (eq_attr "branch_likely" "yes") (and (eq_attr "dslot" "no") (eq_attr "length" "1")))])
129:
1.1.1.2 root 130: (define_delay (eq_attr "type" "jump")
131: [(and (eq_attr "dslot" "no") (eq_attr "length" "1"))
132: (nil)
133: (nil)])
134:
135: (define_delay (and (eq_attr "type" "call") (eq_attr "abicalls" "no"))
1.1 root 136: [(and (eq_attr "dslot" "no") (eq_attr "length" "1"))
137: (nil)
138: (nil)])
139:
140:
141:
142: ;; .........................
143: ;;
144: ;; Functional units
145: ;;
146: ;; .........................
147:
148: ; (define_function_unit NAME MULTIPLICITY SIMULTANEITY
149: ; TEST READY-DELAY ISSUE-DELAY [CONFLICT-LIST])
150:
151: ;; Make the default case (PROCESSOR_DEFAULT) handle the worst case
152:
153: (define_function_unit "memory" 1 0
1.1.1.4 ! root 154: (and (eq_attr "type" "load") (eq_attr "cpu" "!r3000,r4600,r4650"))
1.1 root 155: 3 0)
156:
157: (define_function_unit "memory" 1 0
1.1.1.4 ! root 158: (and (eq_attr "type" "load") (eq_attr "cpu" "r3000,r4600,r4650"))
1.1 root 159: 2 0)
160:
161: (define_function_unit "memory" 1 0 (eq_attr "type" "store") 1 0)
162:
163: (define_function_unit "memory" 1 0 (eq_attr "type" "xfer") 2 0)
164:
1.1.1.3 root 165: (define_function_unit "imuldiv" 1 0
166: (eq_attr "type" "hilo")
167: 1 3)
168:
169: (define_function_unit "imuldiv" 1 0
1.1.1.4 ! root 170: (and (eq_attr "type" "imul") (eq_attr "cpu" "!r3000,r4000,r4600,r4650"))
1.1.1.3 root 171: 17 17)
1.1 root 172:
1.1.1.3 root 173: (define_function_unit "imuldiv" 1 0
1.1 root 174: (and (eq_attr "type" "imul") (eq_attr "cpu" "r3000"))
1.1.1.3 root 175: 12 12)
1.1 root 176:
1.1.1.3 root 177: (define_function_unit "imuldiv" 1 0
178: (and (eq_attr "type" "imul") (eq_attr "cpu" "r4000,r4600"))
179: 10 10)
1.1 root 180:
1.1.1.3 root 181: (define_function_unit "imuldiv" 1 0
1.1.1.4 ! root 182: (and (eq_attr "type" "imul") (eq_attr "cpu" "r4650"))
! 183: 4 4)
! 184:
! 185: (define_function_unit "imuldiv" 1 0
! 186: (and (eq_attr "type" "idiv") (eq_attr "cpu" "!r3000,r4000,r4600,r4650"))
1.1.1.3 root 187: 38 38)
188:
189: (define_function_unit "imuldiv" 1 0
1.1 root 190: (and (eq_attr "type" "idiv") (eq_attr "cpu" "r3000"))
1.1.1.3 root 191: 35 35)
192:
193: (define_function_unit "imuldiv" 1 0
194: (and (eq_attr "type" "idiv") (eq_attr "cpu" "r4600"))
195: 42 42)
1.1 root 196:
1.1.1.3 root 197: (define_function_unit "imuldiv" 1 0
1.1.1.4 ! root 198: (and (eq_attr "type" "idiv") (eq_attr "cpu" "r4650"))
! 199: 36 36)
! 200:
! 201: (define_function_unit "imuldiv" 1 0
1.1 root 202: (and (eq_attr "type" "idiv") (eq_attr "cpu" "r4000"))
1.1.1.3 root 203: 69 69)
204:
205: (define_function_unit "adder" 1 1
206: (and (eq_attr "type" "fcmp") (eq_attr "cpu" "!r3000,r6000"))
207: 3 0)
208:
209: (define_function_unit "adder" 1 1
210: (and (eq_attr "type" "fcmp") (eq_attr "cpu" "r3000,r6000"))
211: 2 0)
1.1 root 212:
213: (define_function_unit "adder" 1 1
214: (and (eq_attr "type" "fadd") (eq_attr "cpu" "!r3000,r6000"))
215: 4 0)
216:
217: (define_function_unit "adder" 1 1
218: (and (eq_attr "type" "fadd") (eq_attr "cpu" "r3000"))
219: 2 0)
220:
221: (define_function_unit "adder" 1 1
222: (and (eq_attr "type" "fadd") (eq_attr "cpu" "r6000"))
223: 3 0)
224:
225: (define_function_unit "adder" 1 1
1.1.1.4 ! root 226: (and (eq_attr "type" "fabs,fneg") (eq_attr "cpu" "!r3000,r4600,r4650"))
1.1 root 227: 2 0)
228:
229: (define_function_unit "adder" 1 1
1.1.1.4 ! root 230: (and (eq_attr "type" "fabs,fneg") (eq_attr "cpu" "r3000,r4600,r4650"))
1.1 root 231: 1 0)
232:
233: (define_function_unit "mult" 1 1
1.1.1.4 ! root 234: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "SF") (eq_attr "cpu" "!r3000,r6000,r4600,r4650")))
1.1 root 235: 7 0)
236:
237: (define_function_unit "mult" 1 1
238: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r3000")))
239: 4 0)
240:
241: (define_function_unit "mult" 1 1
242: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r6000")))
243: 5 0)
244:
245: (define_function_unit "mult" 1 1
1.1.1.4 ! root 246: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r4600,r4650")))
1.1.1.3 root 247: 8 0)
248:
249: (define_function_unit "mult" 1 1
1.1 root 250: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "DF") (eq_attr "cpu" "!r3000,r6000")))
251: 8 0)
252:
253: (define_function_unit "mult" 1 1
254: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r3000")))
255: 5 0)
256:
257: (define_function_unit "mult" 1 1
258: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r6000")))
259: 6 0)
260:
261: (define_function_unit "divide" 1 1
1.1.1.4 ! root 262: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "SF") (eq_attr "cpu" "!r3000,r6000,r4600,r4650")))
1.1 root 263: 23 0)
264:
265: (define_function_unit "divide" 1 1
266: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r3000")))
267: 12 0)
268:
269: (define_function_unit "divide" 1 1
270: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r6000")))
271: 15 0)
272:
273: (define_function_unit "divide" 1 1
1.1.1.4 ! root 274: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r4600,r4650")))
1.1.1.3 root 275: 32 0)
276:
277: (define_function_unit "divide" 1 1
1.1.1.4 ! root 278: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "DF") (eq_attr "cpu" "!r3000,r6000,r4600,r4650")))
1.1 root 279: 36 0)
280:
281: (define_function_unit "divide" 1 1
282: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r3000")))
283: 19 0)
284:
285: (define_function_unit "divide" 1 1
286: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r6000")))
287: 16 0)
288:
1.1.1.3 root 289: (define_function_unit "divide" 1 1
1.1.1.4 ! root 290: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r4600,r4650")))
1.1.1.3 root 291: 61 0)
292:
293: ;;; ??? Is this number right?
294: (define_function_unit "divide" 1 1
1.1.1.4 ! root 295: (and (eq_attr "type" "fsqrt") (and (eq_attr "mode" "SF") (eq_attr "cpu" "!r4600,r4650")))
1.1.1.3 root 296: 54 0)
297: (define_function_unit "divide" 1 1
1.1.1.4 ! root 298: (and (eq_attr "type" "fsqrt") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r4600,r4650")))
1.1.1.3 root 299: 31 0)
300:
301: ;;; ??? Is this number right?
302: (define_function_unit "divide" 1 1
1.1.1.4 ! root 303: (and (eq_attr "type" "fsqrt") (and (eq_attr "mode" "DF") (eq_attr "cpu" "!r4600,r4650")))
1.1.1.3 root 304: 112 0)
305: (define_function_unit "divide" 1 1
1.1.1.4 ! root 306: (and (eq_attr "type" "fsqrt") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r4600,r4650")))
1.1.1.3 root 307: 60 0)
1.1 root 308:
309:
310: ;; The following functional units do not use the cpu type, and use
311: ;; much less memory in genattrtab.c.
312:
313: ;; (define_function_unit "memory" 1 0 (eq_attr "type" "load") 3 0)
314: ;; (define_function_unit "memory" 1 0 (eq_attr "type" "store") 1 0)
315: ;;
316: ;; (define_function_unit "fp_comp" 1 0 (eq_attr "type" "fcmp") 2 0)
317: ;;
318: ;; (define_function_unit "transfer" 1 0 (eq_attr "type" "xfer") 2 0)
319: ;; (define_function_unit "transfer" 1 0 (eq_attr "type" "hilo") 3 0)
320: ;;
321: ;; (define_function_unit "imuldiv" 1 1 (eq_attr "type" "imul") 17 0)
322: ;; (define_function_unit "imuldiv" 1 1 (eq_attr "type" "idiv") 38 0)
323: ;;
324: ;; (define_function_unit "adder" 1 1 (eq_attr "type" "fadd") 4 0)
325: ;; (define_function_unit "adder" 1 1 (eq_attr "type" "fabs,fneg") 2 0)
326: ;;
327: ;; (define_function_unit "mult" 1 1 (and (eq_attr "type" "fmul") (eq_attr "mode" "SF")) 7 0)
328: ;; (define_function_unit "mult" 1 1 (and (eq_attr "type" "fmul") (eq_attr "mode" "DF")) 8 0)
329: ;;
330: ;; (define_function_unit "divide" 1 1 (and (eq_attr "type" "fdiv") (eq_attr "mode" "SF")) 23 0)
331: ;; (define_function_unit "divide" 1 1 (and (eq_attr "type" "fdiv") (eq_attr "mode" "DF")) 36 0)
332: ;;
333: ;; (define_function_unit "sqrt" 1 1 (and (eq_attr "type" "fsqrt") (eq_attr "mode" "SF")) 54 0)
334: ;; (define_function_unit "sqrt" 1 1 (and (eq_attr "type" "fsqrt") (eq_attr "mode" "DF")) 112 0)
335:
336:
337: ;;
338: ;; ....................
339: ;;
340: ;; ADDITION
341: ;;
342: ;; ....................
343: ;;
344:
345: (define_insn "adddf3"
346: [(set (match_operand:DF 0 "register_operand" "=f")
347: (plus:DF (match_operand:DF 1 "register_operand" "f")
348: (match_operand:DF 2 "register_operand" "f")))]
1.1.1.4 ! root 349: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 350: "add.d\\t%0,%1,%2"
351: [(set_attr "type" "fadd")
352: (set_attr "mode" "DF")
353: (set_attr "length" "1")])
354:
355: (define_insn "addsf3"
356: [(set (match_operand:SF 0 "register_operand" "=f")
357: (plus:SF (match_operand:SF 1 "register_operand" "f")
358: (match_operand:SF 2 "register_operand" "f")))]
359: "TARGET_HARD_FLOAT"
360: "add.s\\t%0,%1,%2"
361: [(set_attr "type" "fadd")
362: (set_attr "mode" "SF")
363: (set_attr "length" "1")])
364:
365: (define_expand "addsi3"
366: [(set (match_operand:SI 0 "register_operand" "=d")
367: (plus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
368: (match_operand:SI 2 "arith_operand" "dI")))]
369: ""
370: "
371: {
372: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == -32768)
373: operands[2] = force_reg (SImode, operands[2]);
374: }")
375:
376: (define_insn "addsi3_internal"
377: [(set (match_operand:SI 0 "register_operand" "=d")
378: (plus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
379: (match_operand:SI 2 "arith_operand" "dI")))]
380: "GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768"
1.1.1.3 root 381: "addu\\t%0,%z1,%2"
1.1 root 382: [(set_attr "type" "arith")
383: (set_attr "mode" "SI")
384: (set_attr "length" "1")])
385:
386: (define_expand "adddi3"
387: [(parallel [(set (match_operand:DI 0 "register_operand" "")
388: (plus:DI (match_operand:DI 1 "register_operand" "")
389: (match_operand:DI 2 "arith_operand" "")))
390: (clobber (match_dup 3))])]
1.1.1.3 root 391: "TARGET_64BIT || !TARGET_DEBUG_G_MODE"
1.1 root 392: "
393: {
394: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == -32768)
1.1.1.2 root 395: operands[2] = force_reg (DImode, operands[2]);
1.1 root 396:
1.1.1.3 root 397: if (TARGET_64BIT)
398: {
399: emit_insn (gen_adddi3_internal_3 (operands[0], operands[1],
400: operands[2]));
401: DONE;
402: }
403:
1.1 root 404: operands[3] = gen_reg_rtx (SImode);
405: }")
406:
407: (define_insn "adddi3_internal_1"
408: [(set (match_operand:DI 0 "register_operand" "=d,&d")
409: (plus:DI (match_operand:DI 1 "register_operand" "0,d")
410: (match_operand:DI 2 "register_operand" "d,d")))
411: (clobber (match_operand:SI 3 "register_operand" "=d,d"))]
1.1.1.3 root 412: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE"
1.1 root 413: "*
414: {
415: return (REGNO (operands[0]) == REGNO (operands[1])
416: && REGNO (operands[0]) == REGNO (operands[2]))
417: ? \"srl\\t%3,%L0,31\;sll\\t%M0,%M0,1\;sll\\t%L0,%L1,1\;addu\\t%M0,%M0,%3\"
418: : \"addu\\t%L0,%L1,%L2\;sltu\\t%3,%L0,%L2\;addu\\t%M0,%M1,%M2\;addu\\t%M0,%M0,%3\";
419: }"
420: [(set_attr "type" "darith")
421: (set_attr "mode" "DI")
422: (set_attr "length" "4")])
423:
424: (define_split
425: [(set (match_operand:DI 0 "register_operand" "")
426: (plus:DI (match_operand:DI 1 "register_operand" "")
427: (match_operand:DI 2 "register_operand" "")))
428: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 429: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 430: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
431: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
432: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))
433: && (REGNO (operands[0]) != REGNO (operands[1])
434: || REGNO (operands[0]) != REGNO (operands[2]))"
435:
436: [(set (subreg:SI (match_dup 0) 0)
437: (plus:SI (subreg:SI (match_dup 1) 0)
438: (subreg:SI (match_dup 2) 0)))
439:
440: (set (match_dup 3)
441: (ltu:SI (subreg:SI (match_dup 0) 0)
442: (subreg:SI (match_dup 2) 0)))
443:
444: (set (subreg:SI (match_dup 0) 1)
445: (plus:SI (subreg:SI (match_dup 1) 1)
446: (subreg:SI (match_dup 2) 1)))
447:
448: (set (subreg:SI (match_dup 0) 1)
449: (plus:SI (subreg:SI (match_dup 0) 1)
450: (match_dup 3)))]
451: "")
452:
453: (define_split
454: [(set (match_operand:DI 0 "register_operand" "")
455: (plus:DI (match_operand:DI 1 "register_operand" "")
456: (match_operand:DI 2 "register_operand" "")))
457: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 458: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 459: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
460: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
461: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))
462: && (REGNO (operands[0]) != REGNO (operands[1])
463: || REGNO (operands[0]) != REGNO (operands[2]))"
464:
465: [(set (subreg:SI (match_dup 0) 1)
466: (plus:SI (subreg:SI (match_dup 1) 1)
467: (subreg:SI (match_dup 2) 1)))
468:
469: (set (match_dup 3)
470: (ltu:SI (subreg:SI (match_dup 0) 1)
471: (subreg:SI (match_dup 2) 1)))
472:
473: (set (subreg:SI (match_dup 0) 0)
474: (plus:SI (subreg:SI (match_dup 1) 0)
475: (subreg:SI (match_dup 2) 0)))
476:
477: (set (subreg:SI (match_dup 0) 0)
478: (plus:SI (subreg:SI (match_dup 0) 0)
479: (match_dup 3)))]
480: "")
481:
482: (define_insn "adddi3_internal_2"
483: [(set (match_operand:DI 0 "register_operand" "=d,d,d")
484: (plus:DI (match_operand:DI 1 "register_operand" "%d,%d,%d")
485: (match_operand:DI 2 "small_int" "P,J,N")))
486: (clobber (match_operand:SI 3 "register_operand" "=d,d,d"))]
1.1.1.3 root 487: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE && INTVAL (operands[2]) != -32768"
1.1 root 488: "@
489: addu\\t%L0,%L1,%2\;sltu\\t%3,%L0,%2\;addu\\t%M0,%M1,%3
490: move\\t%L0,%L1\;move\\t%M0,%M1
491: subu\\t%L0,%L1,%n2\;sltu\\t%3,%L0,%2\;subu\\t%M0,%M1,1\;addu\\t%M0,%M0,%3"
492: [(set_attr "type" "darith")
493: (set_attr "mode" "DI")
494: (set_attr "length" "3,2,4")])
495:
496: (define_split
497: [(set (match_operand:DI 0 "register_operand" "")
498: (plus:DI (match_operand:DI 1 "register_operand" "")
499: (match_operand:DI 2 "small_int" "")))
500: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 501: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 502: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
503: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
504: && INTVAL (operands[2]) > 0"
505:
506: [(set (subreg:SI (match_dup 0) 0)
507: (plus:SI (subreg:SI (match_dup 1) 0)
508: (match_dup 2)))
509:
510: (set (match_dup 3)
511: (ltu:SI (subreg:SI (match_dup 0) 0)
512: (match_dup 2)))
513:
514: (set (subreg:SI (match_dup 0) 1)
515: (plus:SI (subreg:SI (match_dup 1) 1)
516: (match_dup 3)))]
517: "")
518:
519: (define_split
520: [(set (match_operand:DI 0 "register_operand" "")
521: (plus:DI (match_operand:DI 1 "register_operand" "")
522: (match_operand:DI 2 "small_int" "")))
523: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 524: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 525: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
526: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
527: && INTVAL (operands[2]) > 0"
528:
529: [(set (subreg:SI (match_dup 0) 1)
530: (plus:SI (subreg:SI (match_dup 1) 1)
531: (match_dup 2)))
532:
533: (set (match_dup 3)
534: (ltu:SI (subreg:SI (match_dup 0) 1)
535: (match_dup 2)))
536:
537: (set (subreg:SI (match_dup 0) 0)
538: (plus:SI (subreg:SI (match_dup 1) 0)
539: (match_dup 3)))]
540: "")
1.1.1.3 root 541:
542: (define_insn "adddi3_internal_3"
543: [(set (match_operand:DI 0 "register_operand" "=d")
544: (plus:DI (match_operand:DI 1 "reg_or_0_operand" "dJ")
545: (match_operand:DI 2 "arith_operand" "dI")))]
546: "TARGET_64BIT && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"
547: "*
548: {
549: return (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
550: ? \"dsubu\\t%0,%z1,%n2\"
551: : \"daddu\\t%0,%z1,%2\";
552: }"
553: [(set_attr "type" "darith")
554: (set_attr "mode" "DI")
555: (set_attr "length" "1")])
556:
557:
558: (define_insn "addsi3_internal_2"
559: [(set (match_operand:DI 0 "register_operand" "=d")
560: (sign_extend:DI (plus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
561: (match_operand:SI 2 "arith_operand" "dI"))))]
562: "TARGET_64BIT && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"
563: "*
564: {
565: return (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
566: ? \"subu\\t%0,%z1,%n2\"
567: : \"addu\\t%0,%z1,%2\";
568: }"
569: [(set_attr "type" "arith")
570: (set_attr "mode" "SI")
571: (set_attr "length" "1")])
572:
1.1 root 573:
574: ;;
575: ;; ....................
576: ;;
577: ;; SUBTRACTION
578: ;;
579: ;; ....................
580: ;;
581:
582: (define_insn "subdf3"
583: [(set (match_operand:DF 0 "register_operand" "=f")
584: (minus:DF (match_operand:DF 1 "register_operand" "f")
585: (match_operand:DF 2 "register_operand" "f")))]
1.1.1.4 ! root 586: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 587: "sub.d\\t%0,%1,%2"
588: [(set_attr "type" "fadd")
589: (set_attr "mode" "DF")
590: (set_attr "length" "1")])
591:
592: (define_insn "subsf3"
593: [(set (match_operand:SF 0 "register_operand" "=f")
594: (minus:SF (match_operand:SF 1 "register_operand" "f")
595: (match_operand:SF 2 "register_operand" "f")))]
596: "TARGET_HARD_FLOAT"
597: "sub.s\\t%0,%1,%2"
598: [(set_attr "type" "fadd")
599: (set_attr "mode" "SF")
600: (set_attr "length" "1")])
601:
602: (define_expand "subsi3"
603: [(set (match_operand:SI 0 "register_operand" "=d")
604: (minus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
605: (match_operand:SI 2 "arith_operand" "dI")))]
606: ""
607: "
608: {
609: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == -32768)
610: operands[2] = force_reg (SImode, operands[2]);
611: }")
612:
613: (define_insn "subsi3_internal"
614: [(set (match_operand:SI 0 "register_operand" "=d")
615: (minus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
616: (match_operand:SI 2 "arith_operand" "dI")))]
617: "GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768"
1.1.1.3 root 618: "subu\\t%0,%z1,%2"
1.1 root 619: [(set_attr "type" "arith")
620: (set_attr "mode" "SI")
621: (set_attr "length" "1")])
622:
623: (define_expand "subdi3"
624: [(parallel [(set (match_operand:DI 0 "register_operand" "=d")
625: (minus:DI (match_operand:DI 1 "register_operand" "d")
626: (match_operand:DI 2 "register_operand" "d")))
627: (clobber (match_dup 3))])]
1.1.1.3 root 628: "TARGET_64BIT || !TARGET_DEBUG_G_MODE"
629: "
630: {
631: if (TARGET_64BIT)
632: {
633: emit_insn (gen_subdi3_internal_3 (operands[0], operands[1],
634: operands[2]));
635: DONE;
636: }
637:
638: operands[3] = gen_reg_rtx (SImode);
639: }")
1.1 root 640:
641: (define_insn "subdi3_internal"
642: [(set (match_operand:DI 0 "register_operand" "=d")
643: (minus:DI (match_operand:DI 1 "register_operand" "d")
644: (match_operand:DI 2 "register_operand" "d")))
645: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 646: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE"
1.1 root 647: "sltu\\t%3,%L1,%L2\;subu\\t%L0,%L1,%L2\;subu\\t%M0,%M1,%M2\;subu\\t%M0,%M0,%3"
648: [(set_attr "type" "darith")
649: (set_attr "mode" "DI")
650: (set_attr "length" "4")])
651:
652: (define_split
653: [(set (match_operand:DI 0 "register_operand" "")
654: (minus:DI (match_operand:DI 1 "register_operand" "")
655: (match_operand:DI 2 "register_operand" "")))
656: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 657: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 658: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
659: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
660: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
661:
662: [(set (match_dup 3)
663: (ltu:SI (subreg:SI (match_dup 1) 0)
664: (subreg:SI (match_dup 2) 0)))
665:
666: (set (subreg:SI (match_dup 0) 0)
667: (minus:SI (subreg:SI (match_dup 1) 0)
668: (subreg:SI (match_dup 2) 0)))
669:
670: (set (subreg:SI (match_dup 0) 1)
671: (minus:SI (subreg:SI (match_dup 1) 1)
672: (subreg:SI (match_dup 2) 1)))
673:
674: (set (subreg:SI (match_dup 0) 1)
675: (minus:SI (subreg:SI (match_dup 0) 1)
676: (match_dup 3)))]
677: "")
678:
679: (define_split
680: [(set (match_operand:DI 0 "register_operand" "")
681: (minus:DI (match_operand:DI 1 "register_operand" "")
682: (match_operand:DI 2 "register_operand" "")))
683: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 684: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 685: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
686: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
687: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
688:
689: [(set (match_dup 3)
690: (ltu:SI (subreg:SI (match_dup 1) 1)
691: (subreg:SI (match_dup 2) 1)))
692:
693: (set (subreg:SI (match_dup 0) 1)
694: (minus:SI (subreg:SI (match_dup 1) 1)
695: (subreg:SI (match_dup 2) 1)))
696:
697: (set (subreg:SI (match_dup 0) 0)
698: (minus:SI (subreg:SI (match_dup 1) 0)
699: (subreg:SI (match_dup 2) 0)))
700:
701: (set (subreg:SI (match_dup 0) 0)
702: (minus:SI (subreg:SI (match_dup 0) 0)
703: (match_dup 3)))]
704: "")
705:
706: (define_insn "subdi3_internal_2"
707: [(set (match_operand:DI 0 "register_operand" "=d,d,d")
708: (minus:DI (match_operand:DI 1 "register_operand" "d,d,d")
709: (match_operand:DI 2 "small_int" "P,J,N")))
710: (clobber (match_operand:SI 3 "register_operand" "=d,d,d"))]
1.1.1.3 root 711: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE && INTVAL (operands[2]) != -32768"
1.1 root 712: "@
713: sltu\\t%3,%L1,%2\;subu\\t%L0,%L1,%2\;subu\\t%M0,%M1,%3
714: move\\t%L0,%L1\;move\\t%M0,%M1
715: sltu\\t%3,%L1,%2\;subu\\t%L0,%L1,%2\;subu\\t%M0,%M1,1\;subu\\t%M0,%M0,%3"
716: [(set_attr "type" "darith")
717: (set_attr "mode" "DI")
718: (set_attr "length" "3,2,4")])
719:
720: (define_split
721: [(set (match_operand:DI 0 "register_operand" "")
722: (minus:DI (match_operand:DI 1 "register_operand" "")
723: (match_operand:DI 2 "small_int" "")))
724: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 725: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 726: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
727: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
728: && INTVAL (operands[2]) > 0"
729:
730: [(set (match_dup 3)
731: (ltu:SI (subreg:SI (match_dup 1) 0)
732: (match_dup 2)))
733:
734: (set (subreg:SI (match_dup 0) 0)
735: (minus:SI (subreg:SI (match_dup 1) 0)
736: (match_dup 2)))
737:
738: (set (subreg:SI (match_dup 0) 1)
739: (minus:SI (subreg:SI (match_dup 1) 1)
740: (match_dup 3)))]
741: "")
742:
743: (define_split
744: [(set (match_operand:DI 0 "register_operand" "")
745: (minus:DI (match_operand:DI 1 "register_operand" "")
746: (match_operand:DI 2 "small_int" "")))
747: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 748: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 749: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
750: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
751: && INTVAL (operands[2]) > 0"
752:
753: [(set (match_dup 3)
754: (ltu:SI (subreg:SI (match_dup 1) 1)
755: (match_dup 2)))
756:
757: (set (subreg:SI (match_dup 0) 1)
758: (minus:SI (subreg:SI (match_dup 1) 1)
759: (match_dup 2)))
760:
761: (set (subreg:SI (match_dup 0) 0)
762: (minus:SI (subreg:SI (match_dup 1) 0)
763: (match_dup 3)))]
764: "")
765:
1.1.1.3 root 766: (define_insn "subdi3_internal_3"
767: [(set (match_operand:DI 0 "register_operand" "=d")
768: (minus:DI (match_operand:DI 1 "reg_or_0_operand" "dJ")
769: (match_operand:DI 2 "arith_operand" "dI")))]
770: "TARGET_64BIT && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"
771: "*
772: {
773: return (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
774: ? \"daddu\\t%0,%z1,%n2\"
775: : \"dsubu\\t%0,%z1,%2\";
776: }"
777: [(set_attr "type" "darith")
778: (set_attr "mode" "DI")
779: (set_attr "length" "1")])
780:
781:
782: (define_insn "subsi3_internal_2"
783: [(set (match_operand:DI 0 "register_operand" "=d")
784: (sign_extend:DI (minus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
785: (match_operand:SI 2 "arith_operand" "dI"))))]
786: "TARGET_64BIT && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"
787: "*
788: {
789: return (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
790: ? \"addu\\t%0,%z1,%n2\"
791: : \"subu\\t%0,%z1,%2\";
792: }"
793: [(set_attr "type" "arith")
794: (set_attr "mode" "DI")
795: (set_attr "length" "1")])
796:
1.1 root 797:
798: ;;
799: ;; ....................
800: ;;
801: ;; MULTIPLICATION
802: ;;
803: ;; ....................
804: ;;
805:
806: (define_insn "muldf3"
807: [(set (match_operand:DF 0 "register_operand" "=f")
808: (mult:DF (match_operand:DF 1 "register_operand" "f")
809: (match_operand:DF 2 "register_operand" "f")))]
1.1.1.4 ! root 810: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 811: "mul.d\\t%0,%1,%2"
812: [(set_attr "type" "fmul")
813: (set_attr "mode" "DF")
814: (set_attr "length" "1")])
815:
816: (define_insn "mulsf3"
817: [(set (match_operand:SF 0 "register_operand" "=f")
818: (mult:SF (match_operand:SF 1 "register_operand" "f")
819: (match_operand:SF 2 "register_operand" "f")))]
820: "TARGET_HARD_FLOAT"
821: "mul.s\\t%0,%1,%2"
822: [(set_attr "type" "fmul")
823: (set_attr "mode" "SF")
824: (set_attr "length" "1")])
825:
1.1.1.4 ! root 826: ;; ??? The R4000 (only) has a cpu bug. If a double-word shift executes while
! 827: ;; a multiply is in progress, it may give an incorrect result. Avoid
! 828: ;; this by keeping the mflo with the mult on the R4000.
! 829:
! 830: (define_expand "mulsi3"
! 831: [(set (match_operand:SI 0 "register_operand" "=l")
1.1 root 832: (mult:SI (match_operand:SI 1 "register_operand" "d")
833: (match_operand:SI 2 "register_operand" "d")))
1.1.1.4 ! root 834: (clobber (match_scratch:SI 3 "=h"))
! 835: (clobber (match_scratch:SI 4 "=a"))]
1.1 root 836: ""
1.1.1.4 ! root 837: "
! 838: {
! 839: if (TARGET_MAD)
! 840: emit_insn (gen_mulsi3_r4650 (operands[0], operands[1], operands[2]));
! 841: else if (mips_cpu != PROCESSOR_R4000)
! 842: emit_insn (gen_mulsi3_internal (operands[0], operands[1], operands[2]));
! 843: else
! 844: emit_insn (gen_mulsi3_r4000 (operands[0], operands[1], operands[2]));
! 845: DONE;
! 846: }")
! 847:
! 848: (define_insn "mulsi3_internal"
! 849: [(set (match_operand:SI 0 "register_operand" "=l")
! 850: (mult:SI (match_operand:SI 1 "register_operand" "d")
! 851: (match_operand:SI 2 "register_operand" "d")))
! 852: (clobber (match_scratch:SI 3 "=h"))
! 853: (clobber (match_scratch:SI 4 "=a"))]
! 854: "mips_cpu != PROCESSOR_R4000"
! 855: "mult\\t%1,%2"
! 856: [(set_attr "type" "imul")
! 857: (set_attr "mode" "SI")
! 858: (set_attr "length" "1")])
! 859:
! 860: (define_insn "mulsi3_r4000"
! 861: [(set (match_operand:SI 0 "register_operand" "=d")
! 862: (mult:SI (match_operand:SI 1 "register_operand" "d")
! 863: (match_operand:SI 2 "register_operand" "d")))
! 864: (clobber (match_scratch:SI 3 "=h"))
! 865: (clobber (match_scratch:SI 4 "=l"))
! 866: (clobber (match_scratch:SI 5 "=a"))]
! 867: "mips_cpu == PROCESSOR_R4000"
1.1 root 868: "*
869: {
870: rtx xoperands[10];
871:
872: xoperands[0] = operands[0];
873: xoperands[1] = gen_rtx (REG, SImode, LO_REGNUM);
874:
875: output_asm_insn (\"mult\\t%1,%2\", operands);
1.1.1.3 root 876: output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);
1.1 root 877: return \"\";
878: }"
879: [(set_attr "type" "imul")
880: (set_attr "mode" "SI")
881: (set_attr "length" "3")]) ;; mult + mflo + delay
882:
1.1.1.4 ! root 883: (define_insn "mulsi3_r4650"
! 884: [(set (match_operand:SI 0 "register_operand" "=d")
! 885: (mult:SI (match_operand:SI 1 "register_operand" "d")
! 886: (match_operand:SI 2 "register_operand" "d")))
! 887: (clobber (match_scratch:SI 3 "=h"))
! 888: (clobber (match_scratch:SI 4 "=l"))
! 889: (clobber (match_scratch:SI 5 "=a"))]
! 890: "TARGET_MAD"
! 891: "mul\\t%0,%1,%2"
! 892: [(set_attr "type" "imul")
! 893: (set_attr "mode" "SI")
! 894: (set_attr "length" "1")])
1.1.1.3 root 895:
1.1.1.4 ! root 896: (define_expand "muldi3"
! 897: [(set (match_operand:DI 0 "register_operand" "=l")
! 898: (mult:DI (match_operand:DI 1 "register_operand" "d")
! 899: (match_operand:DI 2 "register_operand" "d")))
! 900: (clobber (match_scratch:DI 3 "=h"))
! 901: (clobber (match_scratch:DI 4 "=a"))]
! 902: "TARGET_64BIT"
! 903: "
! 904: {
! 905: if (mips_cpu != PROCESSOR_R4000)
! 906: emit_insn (gen_muldi3_internal (operands[0], operands[1], operands[2]));
! 907: else
! 908: emit_insn (gen_muldi3_r4000 (operands[0], operands[1], operands[2]));
! 909: DONE;
! 910: }")
1.1 root 911:
1.1.1.4 ! root 912: (define_insn "muldi3_internal"
! 913: [(set (match_operand:DI 0 "register_operand" "=l")
! 914: (mult:DI (match_operand:DI 1 "register_operand" "d")
! 915: (match_operand:DI 2 "register_operand" "d")))
! 916: (clobber (match_scratch:DI 3 "=h"))
! 917: (clobber (match_scratch:DI 4 "=a"))]
! 918: "TARGET_64BIT && mips_cpu != PROCESSOR_R4000"
! 919: "dmult\\t%1,%2"
1.1 root 920: [(set_attr "type" "imul")
1.1.1.4 ! root 921: (set_attr "mode" "DI")
1.1 root 922: (set_attr "length" "1")])
923:
1.1.1.4 ! root 924: (define_insn "muldi3_r4000"
1.1.1.3 root 925: [(set (match_operand:DI 0 "register_operand" "=d")
926: (mult:DI (match_operand:DI 1 "register_operand" "d")
927: (match_operand:DI 2 "register_operand" "d")))
1.1.1.4 ! root 928: (clobber (match_scratch:DI 3 "=h"))
! 929: (clobber (match_scratch:DI 4 "=l"))
! 930: (clobber (match_scratch:DI 5 "=a"))]
! 931: "TARGET_64BIT && mips_cpu == PROCESSOR_R4000"
1.1.1.3 root 932: "*
933: {
934: rtx xoperands[10];
935:
936: xoperands[0] = operands[0];
937: xoperands[1] = gen_rtx (REG, DImode, LO_REGNUM);
938:
939: output_asm_insn (\"dmult\\t%1,%2\", operands);
940: output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);
941: return \"\";
942: }"
943: [(set_attr "type" "imul")
944: (set_attr "mode" "DI")
945: (set_attr "length" "3")]) ;; mult + mflo + delay
946:
1.1.1.4 ! root 947: ;; ??? We could define a mulditi3 pattern when TARGET_64BIT.
1.1.1.3 root 948:
1.1.1.4 ! root 949: (define_expand "mulsidi3"
! 950: [(set (match_operand:DI 0 "register_operand" "=x")
! 951: (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))
! 952: (sign_extend:DI (match_operand:SI 2 "register_operand" "d"))))]
! 953: ""
! 954: "
! 955: {
! 956: if (TARGET_64BIT)
! 957: emit_insn (gen_mulsidi3_64bit (operands[0], operands[1], operands[2]));
! 958: else
! 959: emit_insn (gen_mulsidi3_internal (operands[0], operands[1], operands[2]));
! 960: DONE;
! 961: }")
1.1.1.3 root 962:
1.1.1.4 ! root 963: (define_insn "mulsidi3_internal"
! 964: [(set (match_operand:DI 0 "register_operand" "=x")
! 965: (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))
! 966: (sign_extend:DI (match_operand:SI 2 "register_operand" "d"))))
! 967: (clobber (match_scratch:SI 3 "=a"))]
! 968: "!TARGET_64BIT"
! 969: "mult\\t%1,%2"
1.1.1.3 root 970: [(set_attr "type" "imul")
1.1.1.4 ! root 971: (set_attr "mode" "SI")
1.1.1.3 root 972: (set_attr "length" "1")])
973:
1.1.1.4 ! root 974: (define_insn "mulsidi3_64bit"
! 975: [(set (match_operand:DI 0 "register_operand" "=a")
1.1 root 976: (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))
977: (sign_extend:DI (match_operand:SI 2 "register_operand" "d"))))
1.1.1.4 ! root 978: (clobber (match_scratch:DI 3 "=l"))
! 979: (clobber (match_scratch:DI 4 "=h"))]
! 980: "TARGET_64BIT"
! 981: "mult\\t%1,%2"
1.1 root 982: [(set_attr "type" "imul")
983: (set_attr "mode" "SI")
1.1.1.4 ! root 984: (set_attr "length" "1")])
1.1 root 985:
1.1.1.3 root 986: (define_insn "smulsi3_highpart"
1.1.1.4 ! root 987: [(set (match_operand:SI 0 "register_operand" "=h")
1.1.1.3 root 988: (truncate:SI
989: (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))
990: (sign_extend:DI (match_operand:SI 2 "register_operand" "d")))
991: (const_int 32))))
1.1.1.4 ! root 992: (clobber (match_scratch:SI 3 "=l"))
! 993: (clobber (match_scratch:SI 4 "=a"))]
1.1.1.3 root 994: ""
1.1.1.4 ! root 995: "mult\\t%1,%2"
1.1.1.3 root 996: [(set_attr "type" "imul")
997: (set_attr "mode" "SI")
1.1.1.4 ! root 998: (set_attr "length" "1")])
1.1.1.3 root 999:
1.1.1.4 ! root 1000: (define_expand "umulsidi3"
! 1001: [(set (match_operand:DI 0 "register_operand" "=x")
! 1002: (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))
! 1003: (zero_extend:DI (match_operand:SI 2 "register_operand" "d"))))]
1.1.1.3 root 1004: ""
1.1.1.4 ! root 1005: "
! 1006: {
! 1007: if (TARGET_64BIT)
! 1008: emit_insn (gen_umulsidi3_64bit (operands[0], operands[1], operands[2]));
! 1009: else
! 1010: emit_insn (gen_umulsidi3_internal (operands[0], operands[1], operands[2]));
! 1011: DONE;
! 1012: }")
1.1.1.3 root 1013:
1.1.1.4 ! root 1014: (define_insn "umulsidi3_internal"
! 1015: [(set (match_operand:DI 0 "register_operand" "=x")
1.1 root 1016: (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))
1017: (zero_extend:DI (match_operand:SI 2 "register_operand" "d"))))
1.1.1.4 ! root 1018: (clobber (match_scratch:SI 3 "=a"))]
1.1.1.3 root 1019: "!TARGET_64BIT"
1.1.1.4 ! root 1020: "multu\\t%1,%2"
1.1 root 1021: [(set_attr "type" "imul")
1022: (set_attr "mode" "SI")
1.1.1.4 ! root 1023: (set_attr "length" "1")])
1.1.1.3 root 1024:
1.1.1.4 ! root 1025: (define_insn "umulsidi3_64bit"
! 1026: [(set (match_operand:DI 0 "register_operand" "=a")
! 1027: (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))
! 1028: (zero_extend:DI (match_operand:SI 2 "register_operand" "d"))))
! 1029: (clobber (match_scratch:DI 3 "=l"))
! 1030: (clobber (match_scratch:DI 4 "=h"))]
! 1031: "TARGET_64BIT"
! 1032: "multu\\t%1,%2"
1.1.1.3 root 1033: [(set_attr "type" "imul")
1034: (set_attr "mode" "SI")
1.1.1.4 ! root 1035: (set_attr "length" "1")])
1.1.1.3 root 1036:
1.1.1.4 ! root 1037: (define_insn "umulsi3_highpart"
! 1038: [(set (match_operand:SI 0 "register_operand" "=h")
1.1.1.3 root 1039: (truncate:SI
1040: (lshiftrt:DI (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))
1041: (zero_extend:DI (match_operand:SI 2 "register_operand" "d")))
1042: (const_int 32))))
1.1.1.4 ! root 1043: (clobber (match_scratch:SI 3 "=l"))
! 1044: (clobber (match_scratch:SI 4 "=a"))]
1.1.1.3 root 1045: ""
1.1.1.4 ! root 1046: "multu\\t%1,%2"
1.1.1.3 root 1047: [(set_attr "type" "imul")
1048: (set_attr "mode" "SI")
1049: (set_attr "length" "1")])
1050:
1051: (define_insn "smuldi3_highpart"
1.1.1.4 ! root 1052: [(set (match_operand:DI 0 "register_operand" "=h")
1.1.1.3 root 1053: (truncate:DI
1054: (lshiftrt:TI (mult:TI (sign_extend:TI (match_operand:DI 1 "register_operand" "d"))
1055: (sign_extend:TI (match_operand:DI 2 "register_operand" "d")))
1056: (const_int 64))))
1.1.1.4 ! root 1057: (clobber (match_scratch:DI 3 "=l"))
! 1058: (clobber (match_scratch:DI 4 "=a"))]
1.1.1.3 root 1059: "TARGET_64BIT"
1.1.1.4 ! root 1060: "dmult\\t%1,%2"
1.1.1.3 root 1061: [(set_attr "type" "imul")
1062: (set_attr "mode" "DI")
1063: (set_attr "length" "1")])
1064:
1065: (define_insn "umuldi3_highpart"
1.1.1.4 ! root 1066: [(set (match_operand:DI 0 "register_operand" "=h")
1.1.1.3 root 1067: (truncate:DI
1068: (lshiftrt:TI (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "d"))
1069: (zero_extend:TI (match_operand:DI 2 "register_operand" "d")))
1070: (const_int 64))))
1.1.1.4 ! root 1071: (clobber (match_scratch:DI 3 "=l"))
! 1072: (clobber (match_scratch:DI 4 "=a"))]
1.1.1.3 root 1073: "TARGET_64BIT"
1.1.1.4 ! root 1074: "dmultu\\t%1,%2"
! 1075: [(set_attr "type" "imul")
! 1076: (set_attr "mode" "DI")
! 1077: (set_attr "length" "1")])
1.1.1.3 root 1078:
1.1.1.4 ! root 1079: ;; The R4650 supports a 32 bit multiply/ 64 bit accumulate
! 1080: ;; instruction. The HI/LO registers are used as a 64 bit accumulator.
1.1.1.3 root 1081:
1.1.1.4 ! root 1082: (define_insn "madsi"
! 1083: [(set (match_operand:SI 0 "register_operand" "+l")
! 1084: (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "d")
! 1085: (match_operand:SI 2 "register_operand" "d"))
! 1086: (match_dup 0)))
! 1087: (clobber (match_scratch:SI 3 "=h"))
! 1088: (clobber (match_scratch:SI 4 "=a"))]
! 1089: "TARGET_MAD"
! 1090: "mad\\t%1,%2"
1.1.1.3 root 1091: [(set_attr "type" "imul")
1.1.1.4 ! root 1092: (set_attr "mode" "SI")
! 1093: (set_attr "length" "1")])
1.1.1.3 root 1094:
1.1.1.4 ! root 1095: (define_insn "maddi"
! 1096: [(set (match_operand:DI 0 "register_operand" "+x")
! 1097: (plus:DI (mult:DI (sign_extend:DI
! 1098: (match_operand:SI 1 "register_operand" "d"))
! 1099: (sign_extend:DI
! 1100: (match_operand:SI 2 "register_operand" "d")))
! 1101: (match_dup 0)))
! 1102: (clobber (match_scratch:SI 3 "=a"))]
! 1103: "TARGET_MAD && ! TARGET_64BIT"
! 1104: "mad\\t%1,%2"
! 1105: [(set_attr "type" "imul")
! 1106: (set_attr "mode" "SI")
! 1107: (set_attr "length" "1")])
1.1.1.3 root 1108:
1.1.1.4 ! root 1109: (define_insn "maddi_64bit"
! 1110: [(set (match_operand:DI 0 "register_operand" "+a")
! 1111: (plus:DI (mult:DI (sign_extend:DI
! 1112: (match_operand:SI 1 "register_operand" "d"))
! 1113: (sign_extend:DI
! 1114: (match_operand:SI 2 "register_operand" "d")))
! 1115: (match_dup 0)))
! 1116: (clobber (match_scratch:DI 3 "=l"))
! 1117: (clobber (match_scratch:DI 4 "=h"))]
! 1118: "TARGET_MAD && TARGET_64BIT"
! 1119: "mad\\t%1,%2"
1.1.1.3 root 1120: [(set_attr "type" "imul")
1.1.1.4 ! root 1121: (set_attr "mode" "SI")
! 1122: (set_attr "length" "1")])
! 1123:
! 1124: (define_insn "umaddi"
! 1125: [(set (match_operand:DI 0 "register_operand" "+x")
! 1126: (plus:DI (mult:DI (zero_extend:DI
! 1127: (match_operand:SI 1 "register_operand" "d"))
! 1128: (zero_extend:DI
! 1129: (match_operand:SI 2 "register_operand" "d")))
! 1130: (match_dup 0)))
! 1131: (clobber (match_scratch:SI 3 "=a"))]
! 1132: "TARGET_MAD && ! TARGET_64BIT"
! 1133: "madu\\t%1,%2"
! 1134: [(set_attr "type" "imul")
! 1135: (set_attr "mode" "SI")
! 1136: (set_attr "length" "1")])
! 1137:
! 1138: (define_insn "umaddi_64bit"
! 1139: [(set (match_operand:DI 0 "register_operand" "+a")
! 1140: (plus:DI (mult:DI (zero_extend:DI
! 1141: (match_operand:SI 1 "register_operand" "d"))
! 1142: (zero_extend:DI
! 1143: (match_operand:SI 2 "register_operand" "d")))
! 1144: (match_dup 0)))
! 1145: (clobber (match_scratch:DI 3 "=l"))
! 1146: (clobber (match_scratch:DI 4 "=h"))]
! 1147: "TARGET_MAD && TARGET_64BIT"
! 1148: "madu\\t%1,%2"
! 1149: [(set_attr "type" "imul")
! 1150: (set_attr "mode" "SI")
! 1151: (set_attr "length" "1")])
! 1152:
! 1153: ;; Floating point multiply accumulate instructions.
! 1154:
! 1155: (define_insn ""
! 1156: [(set (match_operand:DF 0 "register_operand" "=f")
! 1157: (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
! 1158: (match_operand:DF 2 "register_operand" "f"))
! 1159: (match_operand:DF 3 "register_operand" "f")))]
! 1160: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 1161: "madd.d\\t%0,%3,%1,%2"
! 1162: [(set_attr "type" "fmadd")
! 1163: (set_attr "mode" "DF")
! 1164: (set_attr "length" "1")])
! 1165:
! 1166: (define_insn ""
! 1167: [(set (match_operand:SF 0 "register_operand" "=f")
! 1168: (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
! 1169: (match_operand:SF 2 "register_operand" "f"))
! 1170: (match_operand:SF 3 "register_operand" "f")))]
! 1171: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 1172: "madd.s\\t%0,%3,%1,%2"
! 1173: [(set_attr "type" "fmadd")
! 1174: (set_attr "mode" "SF")
! 1175: (set_attr "length" "1")])
! 1176:
! 1177: (define_insn ""
! 1178: [(set (match_operand:DF 0 "register_operand" "=f")
! 1179: (minus:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
! 1180: (match_operand:DF 2 "register_operand" "f"))
! 1181: (match_operand:DF 3 "register_operand" "f")))]
! 1182: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 1183: "msub.d\\t%0,%3,%1,%2"
! 1184: [(set_attr "type" "fmadd")
! 1185: (set_attr "mode" "DF")
! 1186: (set_attr "length" "1")])
! 1187:
! 1188: (define_insn ""
! 1189: [(set (match_operand:SF 0 "register_operand" "=f")
! 1190: (minus:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
! 1191: (match_operand:SF 2 "register_operand" "f"))
! 1192: (match_operand:SF 3 "register_operand" "f")))]
! 1193:
! 1194: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 1195: "msub.s\\t%0,%3,%1,%2"
! 1196: [(set_attr "type" "fmadd")
! 1197: (set_attr "mode" "SF")
! 1198: (set_attr "length" "1")])
! 1199:
! 1200: (define_insn ""
! 1201: [(set (match_operand:DF 0 "register_operand" "=f")
! 1202: (neg:DF (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "f")
! 1203: (match_operand:DF 2 "register_operand" "f"))
! 1204: (match_operand:DF 3 "register_operand" "f"))))]
! 1205: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 1206: "nmadd.d\\t%0,%3,%1,%2"
! 1207: [(set_attr "type" "fmadd")
! 1208: (set_attr "mode" "DF")
! 1209: (set_attr "length" "1")])
! 1210:
! 1211: (define_insn ""
! 1212: [(set (match_operand:SF 0 "register_operand" "=f")
! 1213: (neg:SF (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "f")
! 1214: (match_operand:SF 2 "register_operand" "f"))
! 1215: (match_operand:SF 3 "register_operand" "f"))))]
! 1216: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 1217: "nmadd.s\\t%0,%3,%1,%2"
! 1218: [(set_attr "type" "fmadd")
! 1219: (set_attr "mode" "SF")
! 1220: (set_attr "length" "1")])
! 1221:
! 1222: (define_insn ""
! 1223: [(set (match_operand:DF 0 "register_operand" "=f")
! 1224: (minus:DF (match_operand:DF 1 "register_operand" "f")
! 1225: (mult:DF (match_operand:DF 2 "register_operand" "f")
! 1226: (match_operand:DF 3 "register_operand" "f"))))]
! 1227: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 1228: "nmsub.d\\t%0,%1,%2,%3"
! 1229: [(set_attr "type" "fmadd")
! 1230: (set_attr "mode" "DF")
! 1231: (set_attr "length" "1")])
! 1232:
! 1233: (define_insn ""
! 1234: [(set (match_operand:SF 0 "register_operand" "=f")
! 1235: (minus:SF (match_operand:SF 1 "register_operand" "f")
! 1236: (mult:SF (match_operand:SF 2 "register_operand" "f")
! 1237: (match_operand:SF 3 "register_operand" "f"))))]
! 1238: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 1239: "nmsub.s\\t%0,%1,%2,%3"
! 1240: [(set_attr "type" "fmadd")
! 1241: (set_attr "mode" "SF")
1.1.1.3 root 1242: (set_attr "length" "1")])
1.1 root 1243:
1244: ;;
1245: ;; ....................
1246: ;;
1247: ;; DIVISION and REMAINDER
1248: ;;
1249: ;; ....................
1250: ;;
1251:
1252: (define_insn "divdf3"
1253: [(set (match_operand:DF 0 "register_operand" "=f")
1254: (div:DF (match_operand:DF 1 "register_operand" "f")
1255: (match_operand:DF 2 "register_operand" "f")))]
1.1.1.4 ! root 1256: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 1257: "div.d\\t%0,%1,%2"
1258: [(set_attr "type" "fdiv")
1259: (set_attr "mode" "DF")
1260: (set_attr "length" "1")])
1261:
1262: (define_insn "divsf3"
1263: [(set (match_operand:SF 0 "register_operand" "=f")
1264: (div:SF (match_operand:SF 1 "register_operand" "f")
1265: (match_operand:SF 2 "register_operand" "f")))]
1266: "TARGET_HARD_FLOAT"
1267: "div.s\\t%0,%1,%2"
1268: [(set_attr "type" "fdiv")
1269: (set_attr "mode" "SF")
1270: (set_attr "length" "1")])
1271:
1272: ;; If optimizing, prefer the divmod functions over separate div and
1273: ;; mod functions, since this will allow using one instruction for both
1274: ;; the quotient and remainder. At present, the divmod is not moved out
1275: ;; of loops if it is constant within the loop, so allow -mdebugc to
1276: ;; use the old method of doing things.
1277:
1278: ;; 64 is the multiply/divide hi register
1279: ;; 65 is the multiply/divide lo register
1280:
1.1.1.3 root 1281: ;; ??? We can't accept constants here, because the MIPS assembler will replace
1282: ;; a divide by power of 2 with a shift, and then the remainder is no longer
1283: ;; available.
1284:
1.1 root 1285: (define_insn "divmodsi4"
1286: [(set (match_operand:SI 0 "register_operand" "=d")
1287: (div:SI (match_operand:SI 1 "register_operand" "d")
1288: (match_operand:SI 2 "register_operand" "d")))
1289: (set (match_operand:SI 3 "register_operand" "=d")
1290: (mod:SI (match_dup 1)
1291: (match_dup 2)))
1.1.1.4 ! root 1292: (clobber (match_scratch:SI 4 "=l"))
! 1293: (clobber (match_scratch:SI 5 "=h"))
! 1294: (clobber (match_scratch:SI 6 "=a"))]
1.1 root 1295: "optimize"
1296: "*
1297: {
1298: if (find_reg_note (insn, REG_UNUSED, operands[3]))
1299: return \"div\\t%0,%1,%2\";
1300:
1301: if (find_reg_note (insn, REG_UNUSED, operands[0]))
1302: return \"rem\\t%3,%1,%2\";
1303:
1304: return \"div\\t%0,%1,%2\;mfhi\\t%3\";
1305: }"
1306: [(set_attr "type" "idiv")
1307: (set_attr "mode" "SI")
1.1.1.3 root 1308: (set_attr "length" "14")]) ;; various tests for dividing by 0 and such
1309:
1310: (define_insn "divmoddi4"
1311: [(set (match_operand:DI 0 "register_operand" "=d")
1312: (div:DI (match_operand:DI 1 "register_operand" "d")
1313: (match_operand:DI 2 "register_operand" "d")))
1314: (set (match_operand:DI 3 "register_operand" "=d")
1315: (mod:DI (match_dup 1)
1316: (match_dup 2)))
1.1.1.4 ! root 1317: (clobber (match_scratch:DI 4 "=l"))
! 1318: (clobber (match_scratch:DI 5 "=h"))
! 1319: (clobber (match_scratch:DI 6 "=a"))]
1.1.1.3 root 1320: "TARGET_64BIT && optimize"
1321: "*
1322: {
1323: if (find_reg_note (insn, REG_UNUSED, operands[3]))
1324: return \"ddiv\\t%0,%1,%2\";
1325:
1326: if (find_reg_note (insn, REG_UNUSED, operands[0]))
1327: return \"drem\\t%3,%1,%2\";
1328:
1329: return \"ddiv\\t%0,%1,%2\;mfhi\\t%3\";
1330: }"
1331: [(set_attr "type" "idiv")
1332: (set_attr "mode" "DI")
1333: (set_attr "length" "15")]) ;; various tests for dividing by 0 and such
1.1 root 1334:
1335: (define_insn "udivmodsi4"
1336: [(set (match_operand:SI 0 "register_operand" "=d")
1337: (udiv:SI (match_operand:SI 1 "register_operand" "d")
1338: (match_operand:SI 2 "register_operand" "d")))
1339: (set (match_operand:SI 3 "register_operand" "=d")
1340: (umod:SI (match_dup 1)
1341: (match_dup 2)))
1.1.1.4 ! root 1342: (clobber (match_scratch:SI 4 "=l"))
! 1343: (clobber (match_scratch:SI 5 "=h"))
! 1344: (clobber (match_scratch:SI 6 "=a"))]
1.1 root 1345: "optimize"
1346: "*
1347: {
1348: if (find_reg_note (insn, REG_UNUSED, operands[3]))
1349: return \"divu\\t%0,%1,%2\";
1350:
1351: if (find_reg_note (insn, REG_UNUSED, operands[0]))
1352: return \"remu\\t%3,%1,%2\";
1353:
1354: return \"divu\\t%0,%1,%2\;mfhi\\t%3\";
1355: }"
1356: [(set_attr "type" "idiv")
1357: (set_attr "mode" "SI")
1.1.1.3 root 1358: (set_attr "length" "8")]) ;; various tests for dividing by 0 and such
1.1 root 1359:
1.1.1.3 root 1360: (define_insn "udivmoddi4"
1361: [(set (match_operand:DI 0 "register_operand" "=d")
1362: (udiv:DI (match_operand:DI 1 "register_operand" "d")
1363: (match_operand:DI 2 "register_operand" "d")))
1364: (set (match_operand:DI 3 "register_operand" "=d")
1365: (umod:DI (match_dup 1)
1366: (match_dup 2)))
1.1.1.4 ! root 1367: (clobber (match_scratch:DI 4 "=l"))
! 1368: (clobber (match_scratch:DI 5 "=h"))
! 1369: (clobber (match_scratch:DI 6 "=a"))]
1.1.1.3 root 1370: "TARGET_64BIT && optimize"
1371: "*
1372: {
1373: if (find_reg_note (insn, REG_UNUSED, operands[3]))
1374: return \"ddivu\\t%0,%1,%2\";
1375:
1376: if (find_reg_note (insn, REG_UNUSED, operands[0]))
1377: return \"dremu\\t%3,%1,%2\";
1378:
1379: return \"ddivu\\t%0,%1,%2\;mfhi\\t%3\";
1380: }"
1381: [(set_attr "type" "idiv")
1382: (set_attr "mode" "DI")
1383: (set_attr "length" "8")]) ;; various tests for dividing by 0 and such
1384:
1385: (define_insn "divsi3"
1386: [(set (match_operand:SI 0 "register_operand" "=d")
1387: (div:SI (match_operand:SI 1 "register_operand" "d")
1388: (match_operand:SI 2 "nonmemory_operand" "di")))
1.1.1.4 ! root 1389: (clobber (match_scratch:SI 3 "=l"))
! 1390: (clobber (match_scratch:SI 4 "=h"))
! 1391: (clobber (match_scratch:SI 6 "=a"))]
1.1.1.3 root 1392: "!optimize"
1.1 root 1393: "div\\t%0,%1,%2"
1394: [(set_attr "type" "idiv")
1395: (set_attr "mode" "SI")
1396: (set_attr "length" "13")]) ;; various tests for dividing by 0 and such
1397:
1.1.1.3 root 1398: (define_insn "divdi3"
1399: [(set (match_operand:DI 0 "register_operand" "=d")
1400: (div:DI (match_operand:DI 1 "register_operand" "d")
1401: (match_operand:DI 2 "nonmemory_operand" "di")))
1.1.1.4 ! root 1402: (clobber (match_scratch:DI 3 "=l"))
! 1403: (clobber (match_scratch:DI 4 "=h"))
! 1404: (clobber (match_scratch:DI 6 "=a"))]
1.1.1.3 root 1405: "TARGET_64BIT && !optimize"
1406: "ddiv\\t%0,%1,%2"
1407: [(set_attr "type" "idiv")
1408: (set_attr "mode" "DI")
1409: (set_attr "length" "14")]) ;; various tests for dividing by 0 and such
1410:
1.1 root 1411: (define_insn "modsi3"
1412: [(set (match_operand:SI 0 "register_operand" "=d")
1413: (mod:SI (match_operand:SI 1 "register_operand" "d")
1.1.1.3 root 1414: (match_operand:SI 2 "nonmemory_operand" "di")))
1.1.1.4 ! root 1415: (clobber (match_scratch:SI 3 "=l"))
! 1416: (clobber (match_scratch:SI 4 "=h"))
! 1417: (clobber (match_scratch:SI 6 "=a"))]
1.1 root 1418: "!optimize"
1419: "rem\\t%0,%1,%2"
1420: [(set_attr "type" "idiv")
1421: (set_attr "mode" "SI")
1.1.1.3 root 1422: (set_attr "length" "13")]) ;; various tests for dividing by 0 and such
1423:
1424: (define_insn "moddi3"
1425: [(set (match_operand:DI 0 "register_operand" "=d")
1426: (mod:DI (match_operand:DI 1 "register_operand" "d")
1427: (match_operand:DI 2 "nonmemory_operand" "di")))
1.1.1.4 ! root 1428: (clobber (match_scratch:DI 3 "=l"))
! 1429: (clobber (match_scratch:DI 4 "=h"))
! 1430: (clobber (match_scratch:DI 6 "=a"))]
1.1.1.3 root 1431: "TARGET_64BIT && !optimize"
1432: "drem\\t%0,%1,%2"
1433: [(set_attr "type" "idiv")
1434: (set_attr "mode" "DI")
1.1 root 1435: (set_attr "length" "14")]) ;; various tests for dividing by 0 and such
1436:
1437: (define_insn "udivsi3"
1438: [(set (match_operand:SI 0 "register_operand" "=d")
1439: (udiv:SI (match_operand:SI 1 "register_operand" "d")
1.1.1.3 root 1440: (match_operand:SI 2 "nonmemory_operand" "di")))
1.1.1.4 ! root 1441: (clobber (match_scratch:SI 3 "=l"))
! 1442: (clobber (match_scratch:SI 4 "=h"))
! 1443: (clobber (match_scratch:SI 6 "=a"))]
1.1 root 1444: "!optimize"
1445: "divu\\t%0,%1,%2"
1446: [(set_attr "type" "idiv")
1447: (set_attr "mode" "SI")
1.1.1.3 root 1448: (set_attr "length" "7")]) ;; various tests for dividing by 0 and such
1449:
1450: (define_insn "udivdi3"
1451: [(set (match_operand:DI 0 "register_operand" "=d")
1452: (udiv:DI (match_operand:DI 1 "register_operand" "d")
1453: (match_operand:DI 2 "nonmemory_operand" "di")))
1.1.1.4 ! root 1454: (clobber (match_scratch:DI 3 "=l"))
! 1455: (clobber (match_scratch:DI 4 "=h"))
! 1456: (clobber (match_scratch:DI 6 "=a"))]
1.1.1.3 root 1457: "TARGET_64BIT && !optimize"
1458: "ddivu\\t%0,%1,%2"
1459: [(set_attr "type" "idiv")
1460: (set_attr "mode" "DI")
1461: (set_attr "length" "7")]) ;; various tests for dividing by 0 and such
1.1 root 1462:
1463: (define_insn "umodsi3"
1464: [(set (match_operand:SI 0 "register_operand" "=d")
1465: (umod:SI (match_operand:SI 1 "register_operand" "d")
1.1.1.3 root 1466: (match_operand:SI 2 "nonmemory_operand" "di")))
1.1.1.4 ! root 1467: (clobber (match_scratch:SI 3 "=l"))
! 1468: (clobber (match_scratch:SI 4 "=h"))
! 1469: (clobber (match_scratch:SI 6 "=a"))]
1.1 root 1470: "!optimize"
1471: "remu\\t%0,%1,%2"
1472: [(set_attr "type" "idiv")
1473: (set_attr "mode" "SI")
1.1.1.3 root 1474: (set_attr "length" "7")]) ;; various tests for dividing by 0 and such
1475:
1476: (define_insn "umoddi3"
1477: [(set (match_operand:DI 0 "register_operand" "=d")
1478: (umod:DI (match_operand:DI 1 "register_operand" "d")
1479: (match_operand:DI 2 "nonmemory_operand" "di")))
1.1.1.4 ! root 1480: (clobber (match_scratch:DI 3 "=l"))
! 1481: (clobber (match_scratch:DI 4 "=h"))
! 1482: (clobber (match_scratch:DI 6 "=a"))]
1.1.1.3 root 1483: "TARGET_64BIT && !optimize"
1484: "dremu\\t%0,%1,%2"
1485: [(set_attr "type" "idiv")
1486: (set_attr "mode" "DI")
1487: (set_attr "length" "7")]) ;; various tests for dividing by 0 and such
1.1 root 1488:
1489:
1490: ;;
1491: ;; ....................
1492: ;;
1493: ;; SQUARE ROOT
1494: ;;
1495: ;; ....................
1496:
1497: (define_insn "sqrtdf2"
1498: [(set (match_operand:DF 0 "register_operand" "=f")
1499: (sqrt:DF (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 1500: "TARGET_HARD_FLOAT && HAVE_SQRT_P() && TARGET_DOUBLE_FLOAT"
1.1 root 1501: "sqrt.d\\t%0,%1"
1.1.1.3 root 1502: [(set_attr "type" "fsqrt")
1.1 root 1503: (set_attr "mode" "DF")
1504: (set_attr "length" "1")])
1505:
1506: (define_insn "sqrtsf2"
1507: [(set (match_operand:SF 0 "register_operand" "=f")
1508: (sqrt:SF (match_operand:SF 1 "register_operand" "f")))]
1509: "TARGET_HARD_FLOAT && HAVE_SQRT_P()"
1510: "sqrt.s\\t%0,%1"
1.1.1.3 root 1511: [(set_attr "type" "fsqrt")
1.1 root 1512: (set_attr "mode" "SF")
1513: (set_attr "length" "1")])
1514:
1515:
1516: ;;
1517: ;; ....................
1518: ;;
1519: ;; ABSOLUTE VALUE
1520: ;;
1521: ;; ....................
1522:
1523: ;; Do not use the integer abs macro instruction, since that signals an
1524: ;; exception on -2147483648 (sigh).
1525:
1526: (define_insn "abssi2"
1527: [(set (match_operand:SI 0 "register_operand" "=d")
1528: (abs:SI (match_operand:SI 1 "register_operand" "d")))]
1529: ""
1530: "*
1531: {
1532: dslots_jump_total++;
1533: dslots_jump_filled++;
1534: operands[2] = const0_rtx;
1535:
1.1.1.3 root 1536: if (REGNO (operands[0]) == REGNO (operands[1]))
1537: {
1538: if (mips_isa >= 2)
1539: return \"%(bltzl\\t%1,1f\\n\\tsubu\\t%0,%z2,%0\\n1:%)\";
1540: else
1541: return \"bgez\\t%1,1f%#\\n\\tsubu\\t%0,%z2,%0\\n1:\";
1542: }
1543: else
1544: return \"%(bgez\\t%1,1f\\n\\tmove\\t%0,%1\\n\\tsubu\\t%0,%z2,%0\\n1:%)\";
1.1 root 1545: }"
1546: [(set_attr "type" "multi")
1547: (set_attr "mode" "SI")
1548: (set_attr "length" "3")])
1549:
1.1.1.3 root 1550: (define_insn "absdi2"
1551: [(set (match_operand:DI 0 "register_operand" "=d")
1552: (abs:DI (match_operand:DI 1 "register_operand" "d")))]
1553: "TARGET_64BIT"
1554: "*
1555: {
1556: dslots_jump_total++;
1557: dslots_jump_filled++;
1558: operands[2] = const0_rtx;
1559:
1560: if (REGNO (operands[0]) == REGNO (operands[1]))
1561: return \"%(bltzl\\t%1,1f\\n\\tdsubu\\t%0,%z2,%0\\n1:%)\";
1562: else
1563: return \"%(bgez\\t%1,1f\\n\\tmove\\t%0,%1\\n\\tdsubu\\t%0,%z2,%0\\n1:%)\";
1564: }"
1565: [(set_attr "type" "multi")
1566: (set_attr "mode" "DI")
1567: (set_attr "length" "3")])
1568:
1.1 root 1569: (define_insn "absdf2"
1570: [(set (match_operand:DF 0 "register_operand" "=f")
1571: (abs:DF (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 1572: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 1573: "abs.d\\t%0,%1"
1574: [(set_attr "type" "fabs")
1575: (set_attr "mode" "DF")
1576: (set_attr "length" "1")])
1577:
1578: (define_insn "abssf2"
1579: [(set (match_operand:SF 0 "register_operand" "=f")
1580: (abs:SF (match_operand:SF 1 "register_operand" "f")))]
1581: "TARGET_HARD_FLOAT"
1582: "abs.s\\t%0,%1"
1583: [(set_attr "type" "fabs")
1584: (set_attr "mode" "SF")
1585: (set_attr "length" "1")])
1586:
1587:
1588: ;;
1589: ;; ....................
1590: ;;
1591: ;; FIND FIRST BIT INSTRUCTION
1592: ;;
1593: ;; ....................
1594: ;;
1595:
1596: (define_insn "ffssi2"
1597: [(set (match_operand:SI 0 "register_operand" "=&d")
1598: (ffs:SI (match_operand:SI 1 "register_operand" "d")))
1599: (clobber (match_scratch:SI 2 "=&d"))
1600: (clobber (match_scratch:SI 3 "=&d"))]
1601: ""
1602: "*
1603: {
1604: dslots_jump_total += 2;
1605: dslots_jump_filled += 2;
1606: operands[4] = const0_rtx;
1607:
1608: if (optimize && find_reg_note (insn, REG_DEAD, operands[1]))
1609: return \"%(\\
1610: move\\t%0,%z4\\n\\
1611: \\tbeq\\t%1,%z4,2f\\n\\
1612: 1:\\tand\\t%2,%1,0x0001\\n\\
1613: \\taddu\\t%0,%0,1\\n\\
1614: \\tbeq\\t%2,%z4,1b\\n\\
1615: \\tsrl\\t%1,%1,1\\n\\
1616: 2:%)\";
1617:
1618: return \"%(\\
1619: move\\t%0,%z4\\n\\
1620: \\tmove\\t%3,%1\\n\\
1621: \\tbeq\\t%3,%z4,2f\\n\\
1622: 1:\\tand\\t%2,%3,0x0001\\n\\
1623: \\taddu\\t%0,%0,1\\n\\
1624: \\tbeq\\t%2,%z4,1b\\n\\
1625: \\tsrl\\t%3,%3,1\\n\\
1626: 2:%)\";
1627: }"
1628: [(set_attr "type" "multi")
1629: (set_attr "mode" "SI")
1630: (set_attr "length" "6")])
1631:
1.1.1.3 root 1632: (define_insn "ffsdi2"
1633: [(set (match_operand:DI 0 "register_operand" "=&d")
1634: (ffs:DI (match_operand:DI 1 "register_operand" "d")))
1635: (clobber (match_scratch:DI 2 "=&d"))
1636: (clobber (match_scratch:DI 3 "=&d"))]
1637: "TARGET_64BIT"
1638: "*
1639: {
1640: dslots_jump_total += 2;
1641: dslots_jump_filled += 2;
1642: operands[4] = const0_rtx;
1643:
1644: if (optimize && find_reg_note (insn, REG_DEAD, operands[1]))
1645: return \"%(\\
1646: move\\t%0,%z4\\n\\
1647: \\tbeq\\t%1,%z4,2f\\n\\
1648: 1:\\tand\\t%2,%1,0x0001\\n\\
1649: \\tdaddu\\t%0,%0,1\\n\\
1650: \\tbeq\\t%2,%z4,1b\\n\\
1651: \\tdsrl\\t%1,%1,1\\n\\
1652: 2:%)\";
1653:
1654: return \"%(\\
1655: move\\t%0,%z4\\n\\
1656: \\tmove\\t%3,%1\\n\\
1657: \\tbeq\\t%3,%z4,2f\\n\\
1658: 1:\\tand\\t%2,%3,0x0001\\n\\
1659: \\tdaddu\\t%0,%0,1\\n\\
1660: \\tbeq\\t%2,%z4,1b\\n\\
1661: \\tdsrl\\t%3,%3,1\\n\\
1662: 2:%)\";
1663: }"
1664: [(set_attr "type" "multi")
1665: (set_attr "mode" "DI")
1666: (set_attr "length" "6")])
1667:
1.1 root 1668:
1669: ;;
1670: ;; ....................
1671: ;;
1672: ;; NEGATION and ONE'S COMPLEMENT
1673: ;;
1674: ;; ....................
1675:
1676: (define_insn "negsi2"
1677: [(set (match_operand:SI 0 "register_operand" "=d")
1678: (neg:SI (match_operand:SI 1 "register_operand" "d")))]
1679: ""
1680: "*
1681: {
1682: operands[2] = const0_rtx;
1683: return \"subu\\t%0,%z2,%1\";
1684: }"
1685: [(set_attr "type" "arith")
1686: (set_attr "mode" "SI")
1687: (set_attr "length" "1")])
1688:
1.1.1.2 root 1689: (define_expand "negdi2"
1.1 root 1690: [(parallel [(set (match_operand:DI 0 "register_operand" "=d")
1691: (neg:DI (match_operand:DI 1 "register_operand" "d")))
1692: (clobber (match_dup 2))])]
1.1.1.3 root 1693: "TARGET_64BIT || !TARGET_DEBUG_G_MODE"
1694: "
1695: {
1696: if (TARGET_64BIT)
1697: {
1698: emit_insn (gen_negdi2_internal_2 (operands[0], operands[1]));
1699: DONE;
1700: }
1701:
1702: operands[2] = gen_reg_rtx (SImode);
1703: }")
1.1 root 1704:
1.1.1.2 root 1705: (define_insn "negdi2_internal"
1.1 root 1706: [(set (match_operand:DI 0 "register_operand" "=d")
1707: (neg:DI (match_operand:DI 1 "register_operand" "d")))
1708: (clobber (match_operand:SI 2 "register_operand" "=d"))]
1.1.1.3 root 1709: "! TARGET_64BIT && !TARGET_DEBUG_G_MODE"
1.1 root 1710: "*
1711: {
1712: operands[3] = const0_rtx;
1713: return \"subu\\t%L0,%z3,%L1\;subu\\t%M0,%z3,%M1\;sltu\\t%2,%z3,%L0\;subu\\t%M0,%M0,%2\";
1714: }"
1715: [(set_attr "type" "darith")
1716: (set_attr "mode" "DI")
1717: (set_attr "length" "4")])
1718:
1.1.1.3 root 1719: (define_insn "negdi2_internal_2"
1720: [(set (match_operand:DI 0 "register_operand" "=d")
1721: (neg:DI (match_operand:DI 1 "register_operand" "d")))]
1722: "TARGET_64BIT"
1723: "*
1724: {
1725: operands[2] = const0_rtx;
1726: return \"dsubu\\t%0,%z2,%1\";
1727: }"
1728: [(set_attr "type" "arith")
1729: (set_attr "mode" "DI")
1730: (set_attr "length" "1")])
1731:
1.1 root 1732: (define_insn "negdf2"
1733: [(set (match_operand:DF 0 "register_operand" "=f")
1734: (neg:DF (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 1735: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 1736: "neg.d\\t%0,%1"
1737: [(set_attr "type" "fneg")
1738: (set_attr "mode" "DF")
1739: (set_attr "length" "1")])
1740:
1741: (define_insn "negsf2"
1742: [(set (match_operand:SF 0 "register_operand" "=f")
1743: (neg:SF (match_operand:SF 1 "register_operand" "f")))]
1744: "TARGET_HARD_FLOAT"
1745: "neg.s\\t%0,%1"
1746: [(set_attr "type" "fneg")
1747: (set_attr "mode" "SF")
1748: (set_attr "length" "1")])
1749:
1750: (define_insn "one_cmplsi2"
1751: [(set (match_operand:SI 0 "register_operand" "=d")
1752: (not:SI (match_operand:SI 1 "register_operand" "d")))]
1753: ""
1754: "*
1755: {
1756: operands[2] = const0_rtx;
1757: return \"nor\\t%0,%z2,%1\";
1758: }"
1759: [(set_attr "type" "arith")
1760: (set_attr "mode" "SI")
1761: (set_attr "length" "1")])
1762:
1763: (define_insn "one_cmpldi2"
1764: [(set (match_operand:DI 0 "register_operand" "=d")
1.1.1.3 root 1765: (not:DI (match_operand:DI 1 "register_operand" "d")))]
1.1 root 1766: ""
1767: "*
1768: {
1769: operands[2] = const0_rtx;
1.1.1.3 root 1770: if (TARGET_64BIT)
1771: return \"nor\\t%0,%z2,%1\";
1.1 root 1772: return \"nor\\t%M0,%z2,%M1\;nor\\t%L0,%z2,%L1\";
1773: }"
1774: [(set_attr "type" "darith")
1775: (set_attr "mode" "DI")
1.1.1.3 root 1776: (set (attr "length")
1777: (if_then_else (ge (symbol_ref "mips_isa") (const_int 3))
1778: (const_int 1)
1779: (const_int 2)))])
1.1 root 1780:
1781: (define_split
1782: [(set (match_operand:DI 0 "register_operand" "")
1783: (not:DI (match_operand:DI 1 "register_operand" "")))]
1.1.1.3 root 1784: "reload_completed && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1785: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1786: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))"
1787:
1788: [(set (subreg:SI (match_dup 0) 0) (not:SI (subreg:SI (match_dup 1) 0)))
1789: (set (subreg:SI (match_dup 0) 1) (not:SI (subreg:SI (match_dup 1) 1)))]
1790: "")
1791:
1792: ;; Simple hack to recognize the "nor" instruction on the MIPS
1793: ;; This must appear before the normal or patterns, so that the
1794: ;; combiner will correctly fold things.
1795:
1796: (define_insn "norsi3"
1797: [(set (match_operand:SI 0 "register_operand" "=d")
1798: (not:SI (ior:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
1799: (match_operand:SI 2 "reg_or_0_operand" "dJ"))))]
1800: ""
1801: "nor\\t%0,%z1,%z2"
1802: [(set_attr "type" "arith")
1803: (set_attr "mode" "SI")
1804: (set_attr "length" "1")])
1805:
1806: (define_insn "nordi3"
1807: [(set (match_operand:DI 0 "register_operand" "=d")
1808: (not:DI (ior:DI (match_operand:DI 1 "register_operand" "d")
1809: (match_operand:DI 2 "register_operand" "d"))))]
1810: ""
1.1.1.3 root 1811: "*
1812: {
1813: if (TARGET_64BIT)
1814: return \"nor\\t%0,%z1,%z2\";
1815: return \"nor\\t%M0,%M1,%M2\;nor\\t%L0,%L1,%L2\";
1816: }"
1.1 root 1817: [(set_attr "type" "darith")
1818: (set_attr "mode" "DI")
1.1.1.3 root 1819: (set (attr "length")
1820: (if_then_else (ge (symbol_ref "mips_isa") (const_int 3))
1821: (const_int 1)
1822: (const_int 2)))])
1.1 root 1823:
1824: (define_split
1825: [(set (match_operand:DI 0 "register_operand" "")
1826: (not:DI (ior:DI (match_operand:DI 1 "register_operand" "")
1827: (match_operand:DI 2 "register_operand" ""))))]
1.1.1.3 root 1828: "reload_completed && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1829: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1830: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
1831: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
1832:
1833: [(set (subreg:SI (match_dup 0) 0) (not:SI (ior:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0))))
1834: (set (subreg:SI (match_dup 0) 1) (not:SI (ior:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1))))]
1835: "")
1836:
1837:
1838: ;;
1839: ;; ....................
1840: ;;
1841: ;; LOGICAL
1842: ;;
1843: ;; ....................
1844: ;;
1845:
1846: (define_insn "andsi3"
1847: [(set (match_operand:SI 0 "register_operand" "=d,d")
1848: (and:SI (match_operand:SI 1 "uns_arith_operand" "%d,d")
1849: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
1850: ""
1851: "@
1852: and\\t%0,%1,%2
1853: andi\\t%0,%1,%x2"
1854: [(set_attr "type" "arith")
1855: (set_attr "mode" "SI")
1856: (set_attr "length" "1")])
1857:
1858: (define_insn "anddi3"
1859: [(set (match_operand:DI 0 "register_operand" "=d")
1860: (and:DI (match_operand:DI 1 "register_operand" "d")
1861: (match_operand:DI 2 "register_operand" "d")))]
1.1.1.3 root 1862: "TARGET_64BIT || !TARGET_DEBUG_G_MODE"
1863: "*
1864: {
1865: if (TARGET_64BIT)
1866: return \"and\\t%0,%1,%2\";
1867: return \"and\\t%M0,%M1,%M2\;and\\t%L0,%L1,%L2\";
1868: }"
1.1 root 1869: [(set_attr "type" "darith")
1870: (set_attr "mode" "DI")
1.1.1.3 root 1871: (set (attr "length")
1872: (if_then_else (ge (symbol_ref "mips_isa") (const_int 3))
1873: (const_int 1)
1874: (const_int 2)))])
1.1 root 1875:
1876: (define_split
1877: [(set (match_operand:DI 0 "register_operand" "")
1878: (and:DI (match_operand:DI 1 "register_operand" "")
1879: (match_operand:DI 2 "register_operand" "")))]
1.1.1.3 root 1880: "reload_completed && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1881: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1882: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
1883: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
1884:
1885: [(set (subreg:SI (match_dup 0) 0) (and:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0)))
1886: (set (subreg:SI (match_dup 0) 1) (and:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1)))]
1887: "")
1888:
1.1.1.3 root 1889: (define_insn "anddi3_internal1"
1890: [(set (match_operand:DI 0 "register_operand" "=d,d")
1891: (and:DI (match_operand:DI 1 "register_operand" "%d,d")
1892: (match_operand:DI 2 "uns_arith_operand" "d,K")))]
1893: "TARGET_64BIT"
1894: "@
1895: and\\t%0,%1,%2
1896: andi\\t%0,%1,%x2"
1897: [(set_attr "type" "arith")
1898: (set_attr "mode" "DI")
1899: (set_attr "length" "1")])
1900:
1.1 root 1901: (define_insn "iorsi3"
1902: [(set (match_operand:SI 0 "register_operand" "=d,d")
1903: (ior:SI (match_operand:SI 1 "uns_arith_operand" "%d,d")
1904: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
1905: ""
1906: "@
1907: or\\t%0,%1,%2
1908: ori\\t%0,%1,%x2"
1909: [(set_attr "type" "arith")
1910: (set_attr "mode" "SI")
1911: (set_attr "length" "1")])
1912:
1.1.1.3 root 1913: ;;; ??? There is no iordi3 pattern which accepts 'K' constants when
1914: ;;; TARGET_64BIT
1915:
1.1 root 1916: (define_insn "iordi3"
1917: [(set (match_operand:DI 0 "register_operand" "=d")
1918: (ior:DI (match_operand:DI 1 "register_operand" "d")
1919: (match_operand:DI 2 "register_operand" "d")))]
1.1.1.3 root 1920: "TARGET_64BIT || !TARGET_DEBUG_G_MODE"
1921: "*
1922: {
1923: if (TARGET_64BIT)
1924: return \"or\\t%0,%1,%2\";
1925: return \"or\\t%M0,%M1,%M2\;or\\t%L0,%L1,%L2\";
1926: }"
1.1 root 1927: [(set_attr "type" "darith")
1928: (set_attr "mode" "DI")
1.1.1.3 root 1929: (set (attr "length")
1930: (if_then_else (ge (symbol_ref "mips_isa") (const_int 3))
1931: (const_int 1)
1932: (const_int 2)))])
1.1 root 1933:
1934: (define_split
1935: [(set (match_operand:DI 0 "register_operand" "")
1936: (ior:DI (match_operand:DI 1 "register_operand" "")
1937: (match_operand:DI 2 "register_operand" "")))]
1.1.1.3 root 1938: "reload_completed && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1939: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1940: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
1941: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
1942:
1943: [(set (subreg:SI (match_dup 0) 0) (ior:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0)))
1944: (set (subreg:SI (match_dup 0) 1) (ior:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1)))]
1945: "")
1946:
1947: (define_insn "xorsi3"
1948: [(set (match_operand:SI 0 "register_operand" "=d,d")
1949: (xor:SI (match_operand:SI 1 "uns_arith_operand" "%d,d")
1950: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
1951: ""
1952: "@
1953: xor\\t%0,%1,%2
1954: xori\\t%0,%1,%x2"
1955: [(set_attr "type" "arith")
1956: (set_attr "mode" "SI")
1957: (set_attr "length" "1")])
1958:
1.1.1.3 root 1959: ;; ??? If delete the 32-bit long long patterns, then could merge this with
1960: ;; the following xordi3_internal pattern.
1.1 root 1961: (define_insn "xordi3"
1962: [(set (match_operand:DI 0 "register_operand" "=d")
1963: (xor:DI (match_operand:DI 1 "register_operand" "d")
1964: (match_operand:DI 2 "register_operand" "d")))]
1.1.1.3 root 1965: "TARGET_64BIT || !TARGET_DEBUG_G_MODE"
1966: "*
1967: {
1968: if (TARGET_64BIT)
1969: return \"xor\\t%0,%1,%2\";
1970: return \"xor\\t%M0,%M1,%M2\;xor\\t%L0,%L1,%L2\";
1971: }"
1.1 root 1972: [(set_attr "type" "darith")
1973: (set_attr "mode" "DI")
1.1.1.3 root 1974: (set (attr "length")
1975: (if_then_else (ge (symbol_ref "mips_isa") (const_int 3))
1976: (const_int 1)
1977: (const_int 2)))])
1.1 root 1978:
1979: (define_split
1980: [(set (match_operand:DI 0 "register_operand" "")
1981: (xor:DI (match_operand:DI 1 "register_operand" "")
1982: (match_operand:DI 2 "register_operand" "")))]
1.1.1.3 root 1983: "reload_completed && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1984: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1985: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
1986: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
1987:
1988: [(set (subreg:SI (match_dup 0) 0) (xor:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0)))
1989: (set (subreg:SI (match_dup 0) 1) (xor:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1)))]
1990: "")
1991:
1.1.1.3 root 1992: (define_insn "xordi3_immed"
1993: [(set (match_operand:DI 0 "register_operand" "d")
1994: (xor:DI (match_operand:DI 1 "register_operand" "d")
1995: (match_operand:DI 2 "uns_arith_operand" "K")))]
1996: "TARGET_64BIT"
1997: "xori\\t%0,%1,%x2"
1998: [(set_attr "type" "arith")
1999: (set_attr "mode" "DI")
2000: (set_attr "length" "1")])
2001:
1.1 root 2002:
2003: ;;
2004: ;; ....................
2005: ;;
2006: ;; TRUNCATION
2007: ;;
2008: ;; ....................
2009:
2010: (define_insn "truncdfsf2"
2011: [(set (match_operand:SF 0 "register_operand" "=f")
2012: (float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 2013: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 2014: "cvt.s.d\\t%0,%1"
2015: [(set_attr "type" "fcvt")
2016: (set_attr "mode" "SF")
2017: (set_attr "length" "1")])
2018:
1.1.1.3 root 2019: (define_insn "truncdisi2"
2020: [(set (match_operand:SI 0 "register_operand" "=d")
2021: (truncate:SI (match_operand:DI 1 "register_operand" "d")))]
2022: "TARGET_64BIT"
2023: "dsll\\t%0,%1,32\;dsra\\t%0,%0,32"
2024: [(set_attr "type" "darith")
2025: (set_attr "mode" "SI")
2026: (set_attr "length" "2")])
2027:
2028: (define_insn "truncdihi2"
2029: [(set (match_operand:HI 0 "register_operand" "=d")
2030: (truncate:HI (match_operand:DI 1 "register_operand" "d")))]
2031: "TARGET_64BIT"
2032: "andi\\t%0,%1,0xffff"
2033: [(set_attr "type" "darith")
2034: (set_attr "mode" "HI")
2035: (set_attr "length" "1")])
2036:
2037: (define_insn "truncdiqi2"
2038: [(set (match_operand:QI 0 "register_operand" "=d")
2039: (truncate:QI (match_operand:DI 1 "register_operand" "d")))]
2040: "TARGET_64BIT"
2041: "andi\\t%0,%1,0x00ff"
2042: [(set_attr "type" "darith")
2043: (set_attr "mode" "QI")
2044: (set_attr "length" "1")])
1.1.1.4 ! root 2045:
! 2046: ;; Combiner patterns to optimize shift/truncate combinations.
! 2047: (define_insn ""
! 2048: [(set (match_operand:SI 0 "register_operand" "=d")
! 2049: (truncate:SI (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
! 2050: (match_operand:DI 2 "small_int" "I"))))]
! 2051: "TARGET_64BIT"
! 2052: "*
! 2053: {
! 2054: int shift_amt = INTVAL (operands[2]) & 0x3f;
! 2055:
! 2056: if (shift_amt < 32)
! 2057: {
! 2058: operands[2] = GEN_INT (32 - shift_amt);
! 2059: return \"dsll\\t%0,%1,%2\;dsra\\t%0,%0,32\";
! 2060: }
! 2061: else
! 2062: {
! 2063: operands[2] = GEN_INT (shift_amt);
! 2064: return \"dsra\\t%0,%1,%2\";
! 2065: }
! 2066: }"
! 2067: [(set_attr "type" "darith")
! 2068: (set_attr "mode" "SI")
! 2069: (set_attr "length" "2")])
! 2070:
! 2071: (define_insn ""
! 2072: [(set (match_operand:SI 0 "register_operand" "=d")
! 2073: (truncate:SI (lshiftrt:DI (match_operand:DI 1 "register_operand" "d")
! 2074: (match_operand:DI 2 "small_int" "I"))))]
! 2075: "TARGET_64BIT"
! 2076: "*
! 2077: {
! 2078: int shift_amt = INTVAL (operands[2]) & 0x3f;
! 2079:
! 2080: if (shift_amt < 32)
! 2081: {
! 2082: operands[2] = GEN_INT (32 - shift_amt);
! 2083: return \"dsll\\t%0,%1,%2\;dsra\\t%0,%0,32\";
! 2084: }
! 2085: else if (shift_amt == 32)
! 2086: return \"dsra\\t%0,%1,32\";
! 2087: else
! 2088: {
! 2089: operands[2] = GEN_INT (shift_amt);
! 2090: return \"dsrl\\t%0,%1,%2\";
! 2091: }
! 2092: }"
! 2093: [(set_attr "type" "darith")
! 2094: (set_attr "mode" "SI")
! 2095: (set_attr "length" "2")])
! 2096:
! 2097: (define_insn ""
! 2098: [(set (match_operand:SI 0 "register_operand" "=d")
! 2099: (truncate:SI (ashift:DI (match_operand:DI 1 "register_operand" "d")
! 2100: (match_operand:DI 2 "small_int" "I"))))]
! 2101: "TARGET_64BIT"
! 2102: "*
! 2103: {
! 2104: int shift_amt = INTVAL (operands[2]) & 0x3f;
! 2105:
! 2106: if (shift_amt < 32)
! 2107: {
! 2108: operands[2] = GEN_INT (32 + shift_amt);
! 2109: return \"dsll\\t%0,%1,%2\;dsra\\t%0,%0,32\";
! 2110: }
! 2111: else
! 2112: return \"move\\t%0,%.\";
! 2113: }"
! 2114: [(set_attr "type" "darith")
! 2115: (set_attr "mode" "SI")
! 2116: (set_attr "length" "2")])
! 2117:
! 2118: ;; Combiner patterns to optimize truncate/zero_extend combinations.
! 2119:
! 2120: (define_insn ""
! 2121: [(set (match_operand:SI 0 "register_operand" "=d")
! 2122: (zero_extend:SI (truncate:HI
! 2123: (match_operand:DI 1 "register_operand" "d"))))]
! 2124: "TARGET_64BIT"
! 2125: "andi\\t%0,%1,0xffff"
! 2126: [(set_attr "type" "darith")
! 2127: (set_attr "mode" "SI")
! 2128: (set_attr "length" "1")])
! 2129:
! 2130: (define_insn ""
! 2131: [(set (match_operand:SI 0 "register_operand" "=d")
! 2132: (zero_extend:SI (truncate:QI
! 2133: (match_operand:DI 1 "register_operand" "d"))))]
! 2134: "TARGET_64BIT"
! 2135: "andi\\t%0,%1,0xff"
! 2136: [(set_attr "type" "darith")
! 2137: (set_attr "mode" "SI")
! 2138: (set_attr "length" "1")])
! 2139:
! 2140: (define_insn ""
! 2141: [(set (match_operand:HI 0 "register_operand" "=d")
! 2142: (zero_extend:HI (truncate:QI
! 2143: (match_operand:DI 1 "register_operand" "d"))))]
! 2144: "TARGET_64BIT"
! 2145: "andi\\t%0,%1,0xff"
! 2146: [(set_attr "type" "darith")
! 2147: (set_attr "mode" "HI")
! 2148: (set_attr "length" "1")])
1.1 root 2149:
2150: ;;
2151: ;; ....................
2152: ;;
2153: ;; ZERO EXTENSION
2154: ;;
2155: ;; ....................
2156:
2157: ;; Extension insns.
1.1.1.3 root 2158: ;; Those for integer source operand are ordered widest source type first.
2159:
2160: (define_expand "zero_extendsidi2"
2161: [(set (match_operand:DI 0 "register_operand" "")
2162: (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
2163: "TARGET_64BIT"
2164: "
2165: {
2166: if (optimize && GET_CODE (operands[1]) == MEM)
2167: operands[1] = force_not_mem (operands[1]);
2168:
2169: if (GET_CODE (operands[1]) != MEM)
2170: {
2171: rtx op1 = gen_lowpart (DImode, operands[1]);
2172: rtx temp = gen_reg_rtx (DImode);
2173: rtx shift = gen_rtx (CONST_INT, VOIDmode, 32);
2174:
2175: emit_insn (gen_ashldi3 (temp, op1, shift));
2176: emit_insn (gen_lshrdi3 (operands[0], temp, shift));
2177: DONE;
2178: }
2179: }")
2180:
2181: (define_insn "zero_extendsidi2_internal"
2182: [(set (match_operand:DI 0 "register_operand" "=d,d")
2183: (zero_extend:DI (match_operand:SI 1 "memory_operand" "R,m")))]
2184: "TARGET_64BIT"
2185: "* return mips_move_1word (operands, insn, TRUE);"
2186: [(set_attr "type" "load")
2187: (set_attr "mode" "DI")
2188: (set_attr "length" "1,2")])
1.1 root 2189:
2190: (define_insn "zero_extendhisi2"
2191: [(set (match_operand:SI 0 "register_operand" "=d,d,d")
2192: (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "d,R,m")))]
2193: ""
2194: "*
2195: {
2196: if (which_alternative == 0)
2197: return \"andi\\t%0,%1,0xffff\";
2198: else
2199: return mips_move_1word (operands, insn, TRUE);
2200: }"
2201: [(set_attr "type" "arith,load,load")
2202: (set_attr "mode" "SI")
2203: (set_attr "length" "1,1,2")])
2204:
1.1.1.3 root 2205: (define_insn "zero_extendhidi2"
2206: [(set (match_operand:DI 0 "register_operand" "=d,d,d")
2207: (zero_extend:DI (match_operand:HI 1 "nonimmediate_operand" "d,R,m")))]
2208: "TARGET_64BIT"
2209: "*
2210: {
2211: if (which_alternative == 0)
2212: return \"andi\\t%0,%1,0xffff\";
2213: else
2214: return mips_move_1word (operands, insn, TRUE);
2215: }"
2216: [(set_attr "type" "arith,load,load")
2217: (set_attr "mode" "DI")
2218: (set_attr "length" "1,1,2")])
2219:
1.1 root 2220: (define_insn "zero_extendqihi2"
2221: [(set (match_operand:HI 0 "register_operand" "=d,d,d")
2222: (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "d,R,m")))]
2223: ""
2224: "*
2225: {
2226: if (which_alternative == 0)
2227: return \"andi\\t%0,%1,0x00ff\";
2228: else
2229: return mips_move_1word (operands, insn, TRUE);
2230: }"
2231: [(set_attr "type" "arith,load,load")
2232: (set_attr "mode" "HI")
2233: (set_attr "length" "1,1,2")])
2234:
2235: (define_insn "zero_extendqisi2"
2236: [(set (match_operand:SI 0 "register_operand" "=d,d,d")
2237: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "d,R,m")))]
2238: ""
2239: "*
2240: {
2241: if (which_alternative == 0)
2242: return \"andi\\t%0,%1,0x00ff\";
2243: else
2244: return mips_move_1word (operands, insn, TRUE);
2245: }"
2246: [(set_attr "type" "arith,load,load")
2247: (set_attr "mode" "SI")
2248: (set_attr "length" "1,1,2")])
2249:
1.1.1.3 root 2250: (define_insn "zero_extendqidi2"
2251: [(set (match_operand:DI 0 "register_operand" "=d,d,d")
2252: (zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "d,R,m")))]
2253: "TARGET_64BIT"
2254: "*
2255: {
2256: if (which_alternative == 0)
2257: return \"andi\\t%0,%1,0x00ff\";
2258: else
2259: return mips_move_1word (operands, insn, TRUE);
2260: }"
2261: [(set_attr "type" "arith,load,load")
2262: (set_attr "mode" "DI")
2263: (set_attr "length" "1,1,2")])
2264:
1.1 root 2265:
2266: ;;
2267: ;; ....................
2268: ;;
2269: ;; SIGN EXTENSION
2270: ;;
2271: ;; ....................
2272:
2273: ;; Extension insns.
1.1.1.3 root 2274: ;; Those for integer source operand are ordered widest source type first.
2275:
2276: (define_expand "extendsidi2"
2277: [(set (match_operand:DI 0 "register_operand" "")
2278: (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
2279: "TARGET_64BIT"
2280: "
2281: {
2282: if (optimize && GET_CODE (operands[1]) == MEM)
2283: operands[1] = force_not_mem (operands[1]);
2284:
2285: if (GET_CODE (operands[1]) != MEM)
2286: {
2287: rtx op1 = gen_lowpart (DImode, operands[1]);
2288: rtx temp = gen_reg_rtx (DImode);
2289: rtx shift = gen_rtx (CONST_INT, VOIDmode, 32);
2290:
2291: emit_insn (gen_ashldi3 (temp, op1, shift));
2292: emit_insn (gen_ashrdi3 (operands[0], temp, shift));
2293: DONE;
2294: }
2295: }")
2296:
2297: (define_insn "extendsidi2_internal"
2298: [(set (match_operand:DI 0 "register_operand" "=d,d")
2299: (sign_extend:DI (match_operand:SI 1 "memory_operand" "R,m")))]
2300: "TARGET_64BIT"
2301: "* return mips_move_1word (operands, insn, FALSE);"
2302: [(set_attr "type" "load")
2303: (set_attr "mode" "DI")
2304: (set_attr "length" "1,2")])
1.1 root 2305:
2306: ;; These patterns originally accepted general_operands, however, slightly
2307: ;; better code is generated by only accepting register_operands, and then
2308: ;; letting combine generate the lh and lb insns.
2309:
1.1.1.3 root 2310: (define_expand "extendhidi2"
2311: [(set (match_operand:DI 0 "register_operand" "")
2312: (sign_extend:DI (match_operand:HI 1 "nonimmediate_operand" "")))]
2313: "TARGET_64BIT"
2314: "
2315: {
2316: if (optimize && GET_CODE (operands[1]) == MEM)
2317: operands[1] = force_not_mem (operands[1]);
2318:
2319: if (GET_CODE (operands[1]) != MEM)
2320: {
2321: rtx op1 = gen_lowpart (DImode, operands[1]);
2322: rtx temp = gen_reg_rtx (DImode);
2323: rtx shift = gen_rtx (CONST_INT, VOIDmode, 48);
2324:
2325: emit_insn (gen_ashldi3 (temp, op1, shift));
2326: emit_insn (gen_ashrdi3 (operands[0], temp, shift));
2327: DONE;
2328: }
2329: }")
2330:
2331: (define_insn "extendhidi2_internal"
2332: [(set (match_operand:DI 0 "register_operand" "=d,d")
2333: (sign_extend:DI (match_operand:HI 1 "memory_operand" "R,m")))]
2334: "TARGET_64BIT"
2335: "* return mips_move_1word (operands, insn, FALSE);"
2336: [(set_attr "type" "load")
2337: (set_attr "mode" "DI")
2338: (set_attr "length" "1,2")])
2339:
1.1 root 2340: (define_expand "extendhisi2"
2341: [(set (match_operand:SI 0 "register_operand" "")
2342: (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
2343: ""
2344: "
2345: {
2346: if (optimize && GET_CODE (operands[1]) == MEM)
2347: operands[1] = force_not_mem (operands[1]);
2348:
2349: if (GET_CODE (operands[1]) != MEM)
2350: {
2351: rtx op1 = gen_lowpart (SImode, operands[1]);
2352: rtx temp = gen_reg_rtx (SImode);
2353: rtx shift = gen_rtx (CONST_INT, VOIDmode, 16);
2354:
2355: emit_insn (gen_ashlsi3 (temp, op1, shift));
2356: emit_insn (gen_ashrsi3 (operands[0], temp, shift));
2357: DONE;
2358: }
2359: }")
2360:
2361: (define_insn "extendhisi2_internal"
2362: [(set (match_operand:SI 0 "register_operand" "=d,d")
2363: (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,m")))]
2364: ""
2365: "* return mips_move_1word (operands, insn, FALSE);"
2366: [(set_attr "type" "load")
2367: (set_attr "mode" "SI")
2368: (set_attr "length" "1,2")])
2369:
2370: (define_expand "extendqihi2"
2371: [(set (match_operand:HI 0 "register_operand" "")
2372: (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))]
2373: ""
2374: "
2375: {
2376: if (optimize && GET_CODE (operands[1]) == MEM)
2377: operands[1] = force_not_mem (operands[1]);
2378:
2379: if (GET_CODE (operands[1]) != MEM)
2380: {
2381: rtx op0 = gen_lowpart (SImode, operands[0]);
2382: rtx op1 = gen_lowpart (SImode, operands[1]);
2383: rtx temp = gen_reg_rtx (SImode);
2384: rtx shift = gen_rtx (CONST_INT, VOIDmode, 24);
2385:
2386: emit_insn (gen_ashlsi3 (temp, op1, shift));
2387: emit_insn (gen_ashrsi3 (op0, temp, shift));
2388: DONE;
2389: }
2390: }")
2391:
2392: (define_insn "extendqihi2_internal"
2393: [(set (match_operand:HI 0 "register_operand" "=d,d")
2394: (sign_extend:HI (match_operand:QI 1 "memory_operand" "R,m")))]
2395: ""
2396: "* return mips_move_1word (operands, insn, FALSE);"
2397: [(set_attr "type" "load")
2398: (set_attr "mode" "SI")
2399: (set_attr "length" "1,2")])
2400:
2401:
2402: (define_expand "extendqisi2"
2403: [(set (match_operand:SI 0 "register_operand" "")
2404: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
2405: ""
2406: "
2407: {
2408: if (optimize && GET_CODE (operands[1]) == MEM)
2409: operands[1] = force_not_mem (operands[1]);
2410:
2411: if (GET_CODE (operands[1]) != MEM)
2412: {
2413: rtx op1 = gen_lowpart (SImode, operands[1]);
2414: rtx temp = gen_reg_rtx (SImode);
2415: rtx shift = gen_rtx (CONST_INT, VOIDmode, 24);
2416:
2417: emit_insn (gen_ashlsi3 (temp, op1, shift));
2418: emit_insn (gen_ashrsi3 (operands[0], temp, shift));
2419: DONE;
2420: }
2421: }")
2422:
2423: (define_insn "extendqisi2_insn"
2424: [(set (match_operand:SI 0 "register_operand" "=d,d")
2425: (sign_extend:SI (match_operand:QI 1 "memory_operand" "R,m")))]
2426: ""
2427: "* return mips_move_1word (operands, insn, FALSE);"
2428: [(set_attr "type" "load")
2429: (set_attr "mode" "SI")
2430: (set_attr "length" "1,2")])
2431:
1.1.1.3 root 2432: (define_expand "extendqidi2"
2433: [(set (match_operand:DI 0 "register_operand" "")
2434: (sign_extend:DI (match_operand:QI 1 "nonimmediate_operand" "")))]
2435: "TARGET_64BIT"
2436: "
2437: {
2438: if (optimize && GET_CODE (operands[1]) == MEM)
2439: operands[1] = force_not_mem (operands[1]);
2440:
2441: if (GET_CODE (operands[1]) != MEM)
2442: {
2443: rtx op1 = gen_lowpart (DImode, operands[1]);
2444: rtx temp = gen_reg_rtx (DImode);
2445: rtx shift = gen_rtx (CONST_INT, VOIDmode, 56);
2446:
2447: emit_insn (gen_ashldi3 (temp, op1, shift));
2448: emit_insn (gen_ashrdi3 (operands[0], temp, shift));
2449: DONE;
2450: }
2451: }")
2452:
2453: (define_insn "extendqidi2_insn"
2454: [(set (match_operand:DI 0 "register_operand" "=d,d")
2455: (sign_extend:DI (match_operand:QI 1 "memory_operand" "R,m")))]
2456: "TARGET_64BIT"
2457: "* return mips_move_1word (operands, insn, FALSE);"
2458: [(set_attr "type" "load")
2459: (set_attr "mode" "DI")
2460: (set_attr "length" "1,2")])
2461:
1.1 root 2462:
2463: (define_insn "extendsfdf2"
2464: [(set (match_operand:DF 0 "register_operand" "=f")
2465: (float_extend:DF (match_operand:SF 1 "register_operand" "f")))]
1.1.1.4 ! root 2466: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 2467: "cvt.d.s\\t%0,%1"
2468: [(set_attr "type" "fcvt")
2469: (set_attr "mode" "DF")
2470: (set_attr "length" "1")])
2471:
2472:
2473:
2474: ;;
2475: ;; ....................
2476: ;;
2477: ;; CONVERSIONS
2478: ;;
2479: ;; ....................
2480:
1.1.1.2 root 2481: ;; The SImode scratch register can not be shared with address regs used for
2482: ;; operand zero, because then the address in the move instruction will be
2483: ;; clobbered. We mark the scratch register as early clobbered to prevent this.
2484:
1.1 root 2485: (define_insn "fix_truncdfsi2"
2486: [(set (match_operand:SI 0 "general_operand" "=d,*f,R,o")
2487: (fix:SI (match_operand:DF 1 "register_operand" "f,*f,f,f")))
1.1.1.2 root 2488: (clobber (match_scratch:SI 2 "=d,*d,&d,&d"))
1.1 root 2489: (clobber (match_scratch:DF 3 "=f,*X,f,f"))]
1.1.1.4 ! root 2490: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 2491: "*
2492: {
2493: rtx xoperands[10];
2494:
2495: if (which_alternative == 1)
2496: return \"trunc.w.d %0,%1,%2\";
2497:
2498: output_asm_insn (\"trunc.w.d %3,%1,%2\", operands);
2499:
2500: xoperands[0] = operands[0];
2501: xoperands[1] = operands[3];
2502: output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);
2503: return \"\";
2504: }"
2505: [(set_attr "type" "fcvt")
2506: (set_attr "mode" "DF")
2507: (set_attr "length" "11,9,10,11")])
2508:
2509:
2510: (define_insn "fix_truncsfsi2"
2511: [(set (match_operand:SI 0 "general_operand" "=d,*f,R,o")
2512: (fix:SI (match_operand:SF 1 "register_operand" "f,*f,f,f")))
1.1.1.2 root 2513: (clobber (match_scratch:SI 2 "=d,*d,&d,&d"))
1.1 root 2514: (clobber (match_scratch:SF 3 "=f,*X,f,f"))]
2515: "TARGET_HARD_FLOAT"
2516: "*
2517: {
2518: rtx xoperands[10];
2519:
2520: if (which_alternative == 1)
2521: return \"trunc.w.s %0,%1,%2\";
2522:
2523: output_asm_insn (\"trunc.w.s %3,%1,%2\", operands);
2524:
2525: xoperands[0] = operands[0];
2526: xoperands[1] = operands[3];
2527: output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);
2528: return \"\";
2529: }"
2530: [(set_attr "type" "fcvt")
2531: (set_attr "mode" "SF")
2532: (set_attr "length" "11,9,10,11")])
2533:
2534:
1.1.1.3 root 2535: ;;; ??? trunc.l.d is mentioned in the appendix of the 1993 r4000/r4600 manuals
2536: ;;; but not in the chapter that describes the FPU. It is not mentioned at all
2537: ;;; in the 1991 manuals. The r4000 at Cygnus does not have this instruction.
2538:
2539: ;;; Deleting this means that we now need two libgcc2.a libraries. One for
2540: ;;; the 32 bit calling convention and one for the 64 bit calling convention.
2541:
2542: ;;; If this is disabled, then fixuns_truncdfdi2 must be disabled also.
2543:
2544: (define_insn "fix_truncdfdi2"
2545: [(set (match_operand:DI 0 "general_operand" "=d,*f,R,o")
2546: (fix:DI (match_operand:DF 1 "register_operand" "f,*f,f,f")))
2547: (clobber (match_scratch:DF 2 "=f,*X,f,f"))]
1.1.1.4 ! root 2548: "TARGET_HARD_FLOAT && TARGET_64BIT && TARGET_DOUBLE_FLOAT"
1.1.1.3 root 2549: "*
2550: {
2551: rtx xoperands[10];
2552:
2553: if (which_alternative == 1)
2554: return \"trunc.l.d %0,%1\";
2555:
2556: output_asm_insn (\"trunc.l.d %2,%1\", operands);
2557:
2558: xoperands[0] = operands[0];
2559: xoperands[1] = operands[2];
2560: output_asm_insn (mips_move_2words (xoperands, insn, FALSE), xoperands);
2561: return \"\";
2562: }"
2563: [(set_attr "type" "fcvt")
2564: (set_attr "mode" "DF")
2565: (set_attr "length" "2,1,2,3")])
2566:
2567:
2568: ;;; ??? trunc.l.s is mentioned in the appendix of the 1993 r4000/r4600 manuals
2569: ;;; but not in the chapter that describes the FPU. It is not mentioned at all
2570: ;;; in the 1991 manuals. The r4000 at Cygnus does not have this instruction.
2571: (define_insn "fix_truncsfdi2"
2572: [(set (match_operand:DI 0 "general_operand" "=d,*f,R,o")
2573: (fix:DI (match_operand:SF 1 "register_operand" "f,*f,f,f")))
2574: (clobber (match_scratch:DF 2 "=f,*X,f,f"))]
1.1.1.4 ! root 2575: "TARGET_HARD_FLOAT && TARGET_64BIT && TARGET_DOUBLE_FLOAT"
1.1.1.3 root 2576: "*
2577: {
2578: rtx xoperands[10];
2579:
2580: if (which_alternative == 1)
2581: return \"trunc.l.s %0,%1\";
2582:
2583: output_asm_insn (\"trunc.l.s %2,%1\", operands);
2584:
2585: xoperands[0] = operands[0];
2586: xoperands[1] = operands[2];
2587: output_asm_insn (mips_move_2words (xoperands, insn, FALSE), xoperands);
2588: return \"\";
2589: }"
2590: [(set_attr "type" "fcvt")
2591: (set_attr "mode" "SF")
2592: (set_attr "length" "2,1,2,3")])
2593:
2594:
1.1 root 2595: (define_insn "floatsidf2"
2596: [(set (match_operand:DF 0 "register_operand" "=f,f,f")
2597: (float:DF (match_operand:SI 1 "nonimmediate_operand" "d,R,m")))]
1.1.1.4 ! root 2598: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 2599: "*
2600: {
2601: dslots_load_total++;
2602: if (GET_CODE (operands[1]) == MEM)
2603: return \"l.s\\t%0,%1%#\;cvt.d.w\\t%0,%0\";
2604:
2605: return \"mtc1\\t%1,%0%#\;cvt.d.w\\t%0,%0\";
2606: }"
2607: [(set_attr "type" "fcvt")
2608: (set_attr "mode" "DF")
2609: (set_attr "length" "3,4,3")])
2610:
2611:
1.1.1.3 root 2612: (define_insn "floatdidf2"
2613: [(set (match_operand:DF 0 "register_operand" "=f,f,f")
2614: (float:DF (match_operand:DI 1 "nonimmediate_operand" "d,R,m")))]
1.1.1.4 ! root 2615: "TARGET_HARD_FLOAT && TARGET_64BIT && TARGET_DOUBLE_FLOAT"
1.1.1.3 root 2616: "*
2617: {
2618: dslots_load_total++;
2619: if (GET_CODE (operands[1]) == MEM)
2620: return \"l.d\\t%0,%1%#\;cvt.d.l\\t%0,%0\";
2621:
2622: return \"dmtc1\\t%1,%0%#\;cvt.d.l\\t%0,%0\";
2623: }"
2624: [(set_attr "type" "fcvt")
2625: (set_attr "mode" "DF")
2626: (set_attr "length" "3,4,3")])
2627:
2628:
1.1 root 2629: (define_insn "floatsisf2"
2630: [(set (match_operand:SF 0 "register_operand" "=f,f,f")
2631: (float:SF (match_operand:SI 1 "nonimmediate_operand" "d,R,m")))]
2632: "TARGET_HARD_FLOAT"
2633: "*
2634: {
2635: dslots_load_total++;
2636: if (GET_CODE (operands[1]) == MEM)
2637: return \"l.s\\t%0,%1%#\;cvt.s.w\\t%0,%0\";
2638:
2639: return \"mtc1\\t%1,%0%#\;cvt.s.w\\t%0,%0\";
2640: }"
2641: [(set_attr "type" "fcvt")
2642: (set_attr "mode" "SF")
2643: (set_attr "length" "3,4,3")])
2644:
2645:
1.1.1.3 root 2646: (define_insn "floatdisf2"
2647: [(set (match_operand:SF 0 "register_operand" "=f,f,f")
2648: (float:SF (match_operand:DI 1 "nonimmediate_operand" "d,R,m")))]
1.1.1.4 ! root 2649: "TARGET_HARD_FLOAT && TARGET_64BIT && TARGET_DOUBLE_FLOAT"
1.1.1.3 root 2650: "*
2651: {
2652: dslots_load_total++;
2653: if (GET_CODE (operands[1]) == MEM)
2654: return \"l.d\\t%0,%1%#\;cvt.s.l\\t%0,%0\";
2655:
2656: return \"dmtc1\\t%1,%0%#\;cvt.s.l\\t%0,%0\";
2657: }"
2658: [(set_attr "type" "fcvt")
2659: (set_attr "mode" "SF")
2660: (set_attr "length" "3,4,3")])
2661:
2662:
1.1 root 2663: (define_expand "fixuns_truncdfsi2"
2664: [(set (match_operand:SI 0 "register_operand" "")
2665: (unsigned_fix:SI (match_operand:DF 1 "register_operand" "")))]
1.1.1.4 ! root 2666: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 2667: "
2668: {
2669: rtx reg1 = gen_reg_rtx (DFmode);
2670: rtx reg2 = gen_reg_rtx (DFmode);
2671: rtx reg3 = gen_reg_rtx (SImode);
2672: rtx label1 = gen_label_rtx ();
2673: rtx label2 = gen_label_rtx ();
2674: REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 31);
2675:
2676: if (reg1) /* turn off complaints about unreached code */
2677: {
2678: emit_move_insn (reg1, immed_real_const_1 (offset, DFmode));
2679: do_pending_stack_adjust ();
2680:
2681: emit_insn (gen_cmpdf (operands[1], reg1));
2682: emit_jump_insn (gen_bge (label1));
2683:
2684: emit_insn (gen_fix_truncdfsi2 (operands[0], operands[1]));
2685: emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx,
2686: gen_rtx (LABEL_REF, VOIDmode, label2)));
2687: emit_barrier ();
2688:
2689: emit_label (label1);
2690: emit_move_insn (reg2, gen_rtx (MINUS, DFmode, operands[1], reg1));
2691: emit_move_insn (reg3, gen_rtx (CONST_INT, VOIDmode, 0x80000000));
2692:
2693: emit_insn (gen_fix_truncdfsi2 (operands[0], reg2));
2694: emit_insn (gen_iorsi3 (operands[0], operands[0], reg3));
2695:
2696: emit_label (label2);
2697:
2698: /* allow REG_NOTES to be set on last insn (labels don't have enough
2699: fields, and can't be used for REG_NOTES anyway). */
2700: emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
2701: DONE;
2702: }
2703: }")
2704:
2705:
1.1.1.3 root 2706: (define_expand "fixuns_truncdfdi2"
2707: [(set (match_operand:DI 0 "register_operand" "")
2708: (unsigned_fix:DI (match_operand:DF 1 "register_operand" "")))]
1.1.1.4 ! root 2709: "TARGET_HARD_FLOAT && TARGET_64BIT && TARGET_DOUBLE_FLOAT"
1.1.1.3 root 2710: "
2711: {
2712: rtx reg1 = gen_reg_rtx (DFmode);
2713: rtx reg2 = gen_reg_rtx (DFmode);
2714: rtx reg3 = gen_reg_rtx (DImode);
2715: rtx label1 = gen_label_rtx ();
2716: rtx label2 = gen_label_rtx ();
2717: REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 63);
2718:
2719: if (reg1) /* turn off complaints about unreached code */
2720: {
2721: emit_move_insn (reg1, immed_real_const_1 (offset, DFmode));
2722: do_pending_stack_adjust ();
2723:
2724: emit_insn (gen_cmpdf (operands[1], reg1));
2725: emit_jump_insn (gen_bge (label1));
2726:
2727: emit_insn (gen_fix_truncdfdi2 (operands[0], operands[1]));
2728: emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx,
2729: gen_rtx (LABEL_REF, VOIDmode, label2)));
2730: emit_barrier ();
2731:
2732: emit_label (label1);
2733: emit_move_insn (reg2, gen_rtx (MINUS, DFmode, operands[1], reg1));
2734: emit_move_insn (reg3, gen_rtx (CONST_INT, VOIDmode, 0x80000000));
2735: emit_insn (gen_ashldi3 (reg3, reg3, GEN_INT (32)));
2736:
2737: emit_insn (gen_fix_truncdfdi2 (operands[0], reg2));
2738: emit_insn (gen_iordi3 (operands[0], operands[0], reg3));
2739:
2740: emit_label (label2);
2741:
2742: /* allow REG_NOTES to be set on last insn (labels don't have enough
2743: fields, and can't be used for REG_NOTES anyway). */
2744: emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
2745: DONE;
2746: }
2747: }")
2748:
2749:
1.1 root 2750: (define_expand "fixuns_truncsfsi2"
2751: [(set (match_operand:SI 0 "register_operand" "")
2752: (unsigned_fix:SI (match_operand:SF 1 "register_operand" "")))]
2753: "TARGET_HARD_FLOAT"
2754: "
2755: {
2756: rtx reg1 = gen_reg_rtx (SFmode);
2757: rtx reg2 = gen_reg_rtx (SFmode);
2758: rtx reg3 = gen_reg_rtx (SImode);
2759: rtx label1 = gen_label_rtx ();
2760: rtx label2 = gen_label_rtx ();
2761: REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 31);
2762:
2763: if (reg1) /* turn off complaints about unreached code */
2764: {
2765: emit_move_insn (reg1, immed_real_const_1 (offset, SFmode));
2766: do_pending_stack_adjust ();
2767:
2768: emit_insn (gen_cmpsf (operands[1], reg1));
2769: emit_jump_insn (gen_bge (label1));
2770:
2771: emit_insn (gen_fix_truncsfsi2 (operands[0], operands[1]));
2772: emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx,
2773: gen_rtx (LABEL_REF, VOIDmode, label2)));
2774: emit_barrier ();
2775:
2776: emit_label (label1);
2777: emit_move_insn (reg2, gen_rtx (MINUS, SFmode, operands[1], reg1));
2778: emit_move_insn (reg3, gen_rtx (CONST_INT, VOIDmode, 0x80000000));
2779:
2780: emit_insn (gen_fix_truncsfsi2 (operands[0], reg2));
2781: emit_insn (gen_iorsi3 (operands[0], operands[0], reg3));
2782:
2783: emit_label (label2);
2784:
2785: /* allow REG_NOTES to be set on last insn (labels don't have enough
2786: fields, and can't be used for REG_NOTES anyway). */
2787: emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
2788: DONE;
2789: }
2790: }")
2791:
1.1.1.3 root 2792:
2793: (define_expand "fixuns_truncsfdi2"
2794: [(set (match_operand:DI 0 "register_operand" "")
2795: (unsigned_fix:DI (match_operand:SF 1 "register_operand" "")))]
1.1.1.4 ! root 2796: "TARGET_HARD_FLOAT && TARGET_64BIT && TARGET_DOUBLE_FLOAT"
1.1.1.3 root 2797: "
2798: {
2799: rtx reg1 = gen_reg_rtx (SFmode);
2800: rtx reg2 = gen_reg_rtx (SFmode);
2801: rtx reg3 = gen_reg_rtx (DImode);
2802: rtx label1 = gen_label_rtx ();
2803: rtx label2 = gen_label_rtx ();
2804: REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 63);
2805:
2806: if (reg1) /* turn off complaints about unreached code */
2807: {
2808: emit_move_insn (reg1, immed_real_const_1 (offset, SFmode));
2809: do_pending_stack_adjust ();
2810:
2811: emit_insn (gen_cmpsf (operands[1], reg1));
2812: emit_jump_insn (gen_bge (label1));
2813:
2814: emit_insn (gen_fix_truncsfdi2 (operands[0], operands[1]));
2815: emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx,
2816: gen_rtx (LABEL_REF, VOIDmode, label2)));
2817: emit_barrier ();
2818:
2819: emit_label (label1);
2820: emit_move_insn (reg2, gen_rtx (MINUS, SFmode, operands[1], reg1));
2821: emit_move_insn (reg3, gen_rtx (CONST_INT, VOIDmode, 0x80000000));
2822: emit_insn (gen_ashldi3 (reg3, reg3, GEN_INT (32)));
2823:
2824: emit_insn (gen_fix_truncsfdi2 (operands[0], reg2));
2825: emit_insn (gen_iordi3 (operands[0], operands[0], reg3));
2826:
2827: emit_label (label2);
2828:
2829: /* allow REG_NOTES to be set on last insn (labels don't have enough
2830: fields, and can't be used for REG_NOTES anyway). */
2831: emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
2832: DONE;
2833: }
2834: }")
2835:
1.1 root 2836:
2837: ;;
2838: ;; ....................
2839: ;;
2840: ;; DATA MOVEMENT
2841: ;;
2842: ;; ....................
2843:
1.1.1.3 root 2844: ;; Bit field extract patterns which use lwl/lwr.
2845:
2846: ;; ??? There should be DImode variants for 64 bit code, but the current
2847: ;; bitfield scheme can't handle that. We would need to add new optabs
2848: ;; in order to make that work.
2849:
2850: ;; ??? There could be HImode variants for the ulh/ulhu/ush macros.
2851: ;; It isn't clear whether this will give better code.
2852:
2853: (define_expand "extv"
2854: [(set (match_operand:SI 0 "register_operand" "")
2855: (sign_extract:SI (match_operand:QI 1 "memory_operand" "")
2856: (match_operand:SI 2 "immediate_operand" "")
2857: (match_operand:SI 3 "immediate_operand" "")))]
2858: ""
2859: "
2860: {
2861: /* If this isn't a 32 bit field, and it doesn't start on a byte boundary
2862: then fail. */
2863: if (INTVAL (operands[2]) != 32 || (INTVAL (operands[3]) % 8) != 0)
2864: FAIL;
2865:
2866: /* This can happen for a 64 bit target, when extracting a value from
2867: a 64 bit union member. extract_bit_field doesn't verify that our
2868: source matches the predicate, so we force it to be a MEM here. */
2869: if (GET_CODE (operands[1]) != MEM)
2870: FAIL;
2871:
2872: /* Otherwise, emit a lwl/lwr pair to load the value. */
2873: emit_insn (gen_movsi_ulw (operands[0], operands[1]));
2874: DONE;
2875: }")
2876:
2877: (define_expand "extzv"
2878: [(set (match_operand:SI 0 "register_operand" "")
2879: (zero_extract:SI (match_operand:QI 1 "memory_operand" "")
2880: (match_operand:SI 2 "immediate_operand" "")
2881: (match_operand:SI 3 "immediate_operand" "")))]
2882: ""
2883: "
2884: {
2885: /* If this isn't a 32 bit field, and it doesn't start on a byte boundary
2886: then fail. */
2887: if (INTVAL (operands[2]) != 32 || (INTVAL (operands[3]) % 8) != 0)
2888: FAIL;
2889:
2890: /* This can happen for a 64 bit target, when extracting a value from
2891: a 64 bit union member. extract_bit_field doesn't verify that our
2892: source matches the predicate, so we force it to be a MEM here. */
2893: if (GET_CODE (operands[1]) != MEM)
2894: FAIL;
2895:
2896: /* Otherwise, emit a lwl/lwr pair to load the value. */
2897: emit_insn (gen_movsi_ulw (operands[0], operands[1]));
2898: DONE;
2899: }")
1.1 root 2900:
1.1.1.3 root 2901: (define_expand "insv"
2902: [(set (zero_extract:SI (match_operand:QI 0 "memory_operand" "")
2903: (match_operand:SI 1 "immediate_operand" "")
2904: (match_operand:SI 2 "immediate_operand" ""))
2905: (match_operand:SI 3 "register_operand" ""))]
1.1 root 2906: ""
2907: "
2908: {
1.1.1.3 root 2909: /* If this isn't a 32 bit field, and it doesn't start on a byte boundary
2910: then fail. */
2911: if (INTVAL (operands[1]) != 32 || (INTVAL (operands[2]) % 8) != 0)
2912: FAIL;
1.1 root 2913:
1.1.1.3 root 2914: /* This can happen for a 64 bit target, when storing into a 32 bit union
2915: member. store_bit_field doesn't verify that our target matches the
2916: predicate, so we force it to be a MEM here. */
2917: if (GET_CODE (operands[0]) != MEM)
2918: FAIL;
1.1 root 2919:
1.1.1.3 root 2920: /* Otherwise, emit a swl/swr pair to load the value. */
2921: emit_insn (gen_movsi_usw (operands[0], operands[3]));
2922: DONE;
1.1 root 2923: }")
2924:
1.1.1.3 root 2925: ;; unaligned word moves generated by the bit field patterns
2926:
1.1 root 2927: (define_insn "movsi_ulw"
1.1.1.3 root 2928: [(set (match_operand:SI 0 "register_operand" "=&d,&d")
2929: (unspec [(match_operand:QI 1 "general_operand" "R,o")] 0))]
1.1 root 2930: ""
2931: "*
2932: {
1.1.1.3 root 2933: rtx offset = const0_rtx;
2934: rtx addr = XEXP (operands[1], 0);
2935: rtx mem_addr = eliminate_constant_term (addr, &offset);
1.1 root 2936: char *ret;
2937:
2938: if (TARGET_STATS)
2939: mips_count_memory_refs (operands[1], 2);
2940:
2941: /* The stack/frame pointers are always aligned, so we can convert
2942: to the faster lw if we are referencing an aligned stack location. */
2943:
1.1.1.3 root 2944: if ((INTVAL (offset) & 3) == 0
1.1 root 2945: && (mem_addr == stack_pointer_rtx || mem_addr == frame_pointer_rtx))
2946: ret = \"lw\\t%0,%1\";
2947: else
1.1.1.3 root 2948: ret = \"ulw\\t%0,%1\";
1.1 root 2949:
2950: return mips_fill_delay_slot (ret, DELAY_LOAD, operands, insn);
2951: }"
1.1.1.3 root 2952: [(set_attr "type" "load,load")
1.1 root 2953: (set_attr "mode" "SI")
1.1.1.3 root 2954: (set_attr "length" "2,4")])
1.1 root 2955:
2956: (define_insn "movsi_usw"
1.1.1.3 root 2957: [(set (match_operand:QI 0 "memory_operand" "=R,o")
2958: (unspec [(match_operand:SI 1 "reg_or_0_operand" "dJ,dJ")] 1))]
1.1 root 2959: ""
2960: "*
2961: {
2962: rtx offset = const0_rtx;
2963: rtx addr = XEXP (operands[0], 0);
2964: rtx mem_addr = eliminate_constant_term (addr, &offset);
2965:
2966: if (TARGET_STATS)
2967: mips_count_memory_refs (operands[0], 2);
2968:
2969: /* The stack/frame pointers are always aligned, so we can convert
2970: to the faster sw if we are referencing an aligned stack location. */
2971:
1.1.1.3 root 2972: if ((INTVAL (offset) & 3) == 0
1.1 root 2973: && (mem_addr == stack_pointer_rtx || mem_addr == frame_pointer_rtx))
2974: return \"sw\\t%1,%0\";
2975:
2976: return \"usw\\t%z1,%0\";
2977: }"
2978: [(set_attr "type" "store")
2979: (set_attr "mode" "SI")
2980: (set_attr "length" "2,4")])
2981:
2982: ;; 64-bit integer moves
2983:
2984: ;; Unlike most other insns, the move insns can't be split with
2985: ;; different predicates, because register spilling and other parts of
2986: ;; the compiler, have memoized the insn number already.
2987:
2988: (define_expand "movdi"
2989: [(set (match_operand:DI 0 "nonimmediate_operand" "")
2990: (match_operand:DI 1 "general_operand" ""))]
2991: ""
2992: "
2993: {
1.1.1.4 ! root 2994: /* If we are generating embedded PIC code, and we are referring to a
! 2995: symbol in the .text section, we must use an offset from the start
! 2996: of the function. */
! 2997: if (TARGET_EMBEDDED_PIC
! 2998: && (GET_CODE (operands[1]) == LABEL_REF
! 2999: || (GET_CODE (operands[1]) == SYMBOL_REF
! 3000: && ! SYMBOL_REF_FLAG (operands[1]))))
! 3001: {
! 3002: rtx temp;
! 3003:
! 3004: temp = embedded_pic_offset (operands[1]);
! 3005: temp = gen_rtx (PLUS, Pmode, embedded_pic_fnaddr_rtx,
! 3006: force_reg (DImode, temp));
! 3007: emit_move_insn (operands[0], force_reg (DImode, temp));
! 3008: DONE;
! 3009: }
! 3010:
! 3011: /* If operands[1] is a constant address illegal for pic, then we need to
! 3012: handle it just like LEGITIMIZE_ADDRESS does. */
! 3013: if (flag_pic && pic_address_needs_scratch (operands[1]))
! 3014: {
! 3015: rtx temp = force_reg (DImode, XEXP (XEXP (operands[1], 0), 0));
! 3016: rtx temp2 = XEXP (XEXP (operands[1], 0), 1);
! 3017:
! 3018: if (! SMALL_INT (temp2))
! 3019: temp2 = force_reg (DImode, temp2);
! 3020:
! 3021: emit_move_insn (operands[0], gen_rtx (PLUS, DImode, temp, temp2));
! 3022: DONE;
! 3023: }
! 3024:
1.1 root 3025: if ((reload_in_progress | reload_completed) == 0
3026: && !register_operand (operands[0], DImode)
3027: && !register_operand (operands[1], DImode)
3028: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)
3029: && operands[1] != CONST0_RTX (DImode))
3030: {
3031: rtx temp = force_reg (DImode, operands[1]);
3032: emit_move_insn (operands[0], temp);
3033: DONE;
3034: }
3035: }")
3036:
3037: (define_insn "movdi_internal"
3038: [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,R,o,*d,*x")
3039: (match_operand:DI 1 "general_operand" "d,iF,R,o,d,d,*x,*d"))]
1.1.1.3 root 3040: "!TARGET_64BIT
3041: && (register_operand (operands[0], DImode)
3042: || register_operand (operands[1], DImode)
3043: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
3044: || operands[1] == CONST0_RTX (DImode))"
1.1 root 3045: "* return mips_move_2words (operands, insn); "
3046: [(set_attr "type" "move,arith,load,load,store,store,hilo,hilo")
3047: (set_attr "mode" "DI")
1.1.1.3 root 3048: (set_attr "length" "2,4,2,4,2,4,2,2")])
1.1 root 3049:
3050: (define_split
3051: [(set (match_operand:DI 0 "register_operand" "")
3052: (match_operand:DI 1 "register_operand" ""))]
1.1.1.3 root 3053: "reload_completed && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 3054: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
3055: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))"
3056:
3057: [(set (subreg:SI (match_dup 0) 0) (subreg:SI (match_dup 1) 0))
3058: (set (subreg:SI (match_dup 0) 1) (subreg:SI (match_dup 1) 1))]
3059: "")
3060:
1.1.1.3 root 3061: (define_insn "movdi_internal2"
1.1.1.4 ! root 3062: [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*d,*x,*a")
! 3063: (match_operand:DI 1 "general_operand" " d,S,IKL,Mnis,R,m,dJ,dJ,*x,*d,*I"))]
1.1.1.3 root 3064: "TARGET_64BIT
3065: && (register_operand (operands[0], DImode)
3066: || register_operand (operands[1], DImode)
3067: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
3068: || operands[1] == CONST0_RTX (DImode))"
3069: "* return mips_move_2words (operands, insn); "
1.1.1.4 ! root 3070: [(set_attr "type" "move,load,arith,arith,load,load,store,store,hilo,hilo,hilo")
1.1.1.3 root 3071: (set_attr "mode" "DI")
1.1.1.4 ! root 3072: (set_attr "length" "1,2,1,2,1,2,1,2,1,1,2")])
1.1.1.3 root 3073:
1.1.1.4 ! root 3074: ;; Handle input reloads in DImode.
! 3075: ;; This is mainly to handle reloading HILO_REGNUM. Note that we may
! 3076: ;; see it as the source or the destination, depending upon which way
! 3077: ;; reload handles the instruction.
! 3078: ;; Making the second operand TImode is a trick. The compiler may
! 3079: ;; reuse the same register for operand 0 and operand 2. Using TImode
! 3080: ;; gives us two registers, so we can always use the one which is not
! 3081: ;; used.
! 3082:
! 3083: (define_expand "reload_indi"
! 3084: [(set (match_operand:DI 0 "register_operand" "=b")
! 3085: (match_operand:DI 1 "general_operand" "b"))
! 3086: (clobber (match_operand:TI 2 "register_operand" "=&d"))]
! 3087: "TARGET_64BIT"
! 3088: "
! 3089: {
! 3090: rtx scratch = gen_rtx (REG, DImode,
! 3091: (REGNO (operands[0]) == REGNO (operands[2])
! 3092: ? REGNO (operands[2]) + 1
! 3093: : REGNO (operands[2])));
! 3094:
! 3095: if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == HILO_REGNUM)
! 3096: {
! 3097: if (GET_CODE (operands[1]) == MEM)
! 3098: {
! 3099: rtx memword, offword, hiword, loword;
! 3100:
! 3101: scratch = gen_rtx (REG, SImode, REGNO (scratch));
! 3102: memword = change_address (operands[1], SImode, NULL_RTX);
! 3103: offword = change_address (adj_offsettable_operand (operands[1], 4),
! 3104: SImode, NULL_RTX);
! 3105: if (BYTES_BIG_ENDIAN)
! 3106: {
! 3107: hiword = memword;
! 3108: loword = offword;
! 3109: }
! 3110: else
! 3111: {
! 3112: hiword = offword;
! 3113: loword = memword;
! 3114: }
! 3115: emit_move_insn (scratch, hiword);
! 3116: emit_move_insn (gen_rtx (REG, SImode, 64), scratch);
! 3117: emit_move_insn (scratch, loword);
! 3118: emit_move_insn (gen_rtx (REG, SImode, 65), scratch);
! 3119: }
! 3120: else
! 3121: {
! 3122: emit_insn (gen_ashrdi3 (scratch, operands[1], GEN_INT (32)));
! 3123: emit_insn (gen_movdi (gen_rtx (REG, DImode, 64), scratch));
! 3124: emit_insn (gen_ashldi3 (scratch, operands[1], GEN_INT (32)));
! 3125: emit_insn (gen_ashrdi3 (scratch, scratch, GEN_INT (32)));
! 3126: emit_insn (gen_movdi (gen_rtx (REG, DImode, 65), scratch));
! 3127: }
! 3128: DONE;
! 3129: }
! 3130: if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == HILO_REGNUM)
! 3131: {
! 3132: emit_insn (gen_movdi (scratch, gen_rtx (REG, DImode, 65)));
! 3133: emit_insn (gen_ashldi3 (scratch, scratch, GEN_INT (32)));
! 3134: emit_insn (gen_lshrdi3 (scratch, scratch, GEN_INT (32)));
! 3135: emit_insn (gen_movdi (operands[0], gen_rtx (REG, DImode, 64)));
! 3136: emit_insn (gen_ashldi3 (operands[0], operands[0], GEN_INT (32)));
! 3137: emit_insn (gen_iordi3 (operands[0], operands[0], scratch));
! 3138: DONE;
! 3139: }
! 3140: /* This handles moves between a float register and HI/LO. */
! 3141: emit_move_insn (scratch, operands[1]);
! 3142: emit_move_insn (operands[0], scratch);
! 3143: DONE;
! 3144: }")
! 3145:
! 3146: ;; Handle output reloads in DImode.
! 3147:
! 3148: (define_expand "reload_outdi"
! 3149: [(set (match_operand:DI 0 "general_operand" "=b")
! 3150: (match_operand:DI 1 "register_operand" "b"))
! 3151: (clobber (match_operand:DI 2 "register_operand" "=&d"))]
! 3152: "TARGET_64BIT"
! 3153: "
! 3154: {
! 3155: if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == HILO_REGNUM)
! 3156: {
! 3157: emit_insn (gen_ashrdi3 (operands[2], operands[1], GEN_INT (32)));
! 3158: emit_insn (gen_movdi (gen_rtx (REG, DImode, 64), operands[2]));
! 3159: emit_insn (gen_ashldi3 (operands[2], operands[1], GEN_INT (32)));
! 3160: emit_insn (gen_ashrdi3 (operands[2], operands[2], GEN_INT (32)));
! 3161: emit_insn (gen_movdi (gen_rtx (REG, DImode, 65), operands[2]));
! 3162: DONE;
! 3163: }
! 3164: if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == HILO_REGNUM)
! 3165: {
! 3166: if (GET_CODE (operands[0]) == MEM)
! 3167: {
! 3168: rtx scratch, memword, offword, hiword, loword;
! 3169:
! 3170: scratch = gen_rtx (REG, SImode, REGNO (operands[2]));
! 3171: memword = change_address (operands[0], SImode, NULL_RTX);
! 3172: offword = change_address (adj_offsettable_operand (operands[0], 4),
! 3173: SImode, NULL_RTX);
! 3174: if (BYTES_BIG_ENDIAN)
! 3175: {
! 3176: hiword = memword;
! 3177: loword = offword;
! 3178: }
! 3179: else
! 3180: {
! 3181: hiword = offword;
! 3182: loword = memword;
! 3183: }
! 3184: emit_move_insn (scratch, gen_rtx (REG, SImode, 64));
! 3185: emit_move_insn (hiword, scratch);
! 3186: emit_move_insn (scratch, gen_rtx (REG, SImode, 65));
! 3187: emit_move_insn (loword, scratch);
! 3188: }
! 3189: else
! 3190: {
! 3191: emit_insn (gen_movdi (operands[2], gen_rtx (REG, DImode, 65)));
! 3192: emit_insn (gen_ashldi3 (operands[2], operands[2], GEN_INT (32)));
! 3193: emit_insn (gen_lshrdi3 (operands[2], operands[2], GEN_INT (32)));
! 3194: emit_insn (gen_movdi (operands[0], gen_rtx (REG, DImode, 64)));
! 3195: emit_insn (gen_ashldi3 (operands[0], operands[0], GEN_INT (32)));
! 3196: emit_insn (gen_iordi3 (operands[0], operands[0], operands[2]));
! 3197: }
! 3198: DONE;
! 3199: }
! 3200: /* This handles moves between a float register and HI/LO. */
! 3201: emit_move_insn (operands[2], operands[1]);
! 3202: emit_move_insn (operands[0], operands[2]);
! 3203: DONE;
! 3204: }")
1.1 root 3205:
3206: ;; 32-bit Integer moves
3207:
3208: (define_split
3209: [(set (match_operand:SI 0 "register_operand" "")
3210: (match_operand:SI 1 "large_int" ""))]
3211: "!TARGET_DEBUG_D_MODE"
3212: [(set (match_dup 0)
3213: (match_dup 2))
3214: (set (match_dup 0)
3215: (ior:SI (match_dup 0)
3216: (match_dup 3)))]
3217: "
3218: {
3219: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & 0xffff0000);
3220: operands[3] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & 0x0000ffff);
3221: }")
3222:
3223: ;; Unlike most other insns, the move insns can't be split with
3224: ;; different predicates, because register spilling and other parts of
3225: ;; the compiler, have memoized the insn number already.
3226:
3227: (define_expand "movsi"
3228: [(set (match_operand:SI 0 "nonimmediate_operand" "")
3229: (match_operand:SI 1 "general_operand" ""))]
3230: ""
3231: "
3232: {
1.1.1.3 root 3233: /* If we are generating embedded PIC code, and we are referring to a
3234: symbol in the .text section, we must use an offset from the start
3235: of the function. */
3236: if (TARGET_EMBEDDED_PIC
3237: && (GET_CODE (operands[1]) == LABEL_REF
3238: || (GET_CODE (operands[1]) == SYMBOL_REF
3239: && ! SYMBOL_REF_FLAG (operands[1]))))
3240: {
3241: rtx temp;
3242:
3243: temp = embedded_pic_offset (operands[1]);
3244: temp = gen_rtx (PLUS, Pmode, embedded_pic_fnaddr_rtx,
3245: force_reg (SImode, temp));
3246: emit_move_insn (operands[0], force_reg (SImode, temp));
3247: DONE;
3248: }
3249:
1.1.1.4 ! root 3250: /* If operands[1] is a constant address invalid for pic, then we need to
1.1.1.3 root 3251: handle it just like LEGITIMIZE_ADDRESS does. */
3252: if (flag_pic && pic_address_needs_scratch (operands[1]))
3253: {
3254: rtx temp = force_reg (SImode, XEXP (XEXP (operands[1], 0), 0));
3255: rtx temp2 = XEXP (XEXP (operands[1], 0), 1);
3256:
3257: if (! SMALL_INT (temp2))
3258: temp2 = force_reg (SImode, temp2);
3259:
3260: emit_move_insn (operands[0], gen_rtx (PLUS, SImode, temp, temp2));
3261: DONE;
3262: }
3263:
1.1 root 3264: if ((reload_in_progress | reload_completed) == 0
3265: && !register_operand (operands[0], SImode)
3266: && !register_operand (operands[1], SImode)
3267: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0))
3268: {
3269: rtx temp = force_reg (SImode, operands[1]);
3270: emit_move_insn (operands[0], temp);
3271: DONE;
3272: }
3273: }")
3274:
3275: ;; The difference between these two is whether or not ints are allowed
3276: ;; in FP registers (off by default, use -mdebugh to enable).
3277:
3278: (define_insn "movsi_internal1"
1.1.1.4 ! root 3279: [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*d,*f*z,*f,*f,*f,*R,*m,*x,*x,*d,*d")
! 3280: (match_operand:SI 1 "general_operand" "d,S,IKL,Mnis,R,m,dJ,dJ,*f*z,*d,*f,*R,*m,*f,*f,I,*d,*x,*a"))]
1.1 root 3281: "TARGET_DEBUG_H_MODE
3282: && (register_operand (operands[0], SImode)
3283: || register_operand (operands[1], SImode)
3284: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
1.1.1.3 root 3285: "* return mips_move_1word (operands, insn, FALSE);"
1.1.1.4 ! root 3286: [(set_attr "type" "move,load,arith,arith,load,load,store,store,xfer,xfer,move,load,load,store,store,hilo,hilo,hilo,hilo")
1.1 root 3287: (set_attr "mode" "SI")
1.1.1.4 ! root 3288: (set_attr "length" "1,2,1,2,1,2,1,2,1,1,1,1,2,1,2,1,1,1,1")])
1.1 root 3289:
3290: (define_insn "movsi_internal2"
1.1.1.4 ! root 3291: [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*d,*z,*x,*d,*x,*d")
! 3292: (match_operand:SI 1 "general_operand" "d,S,IKL,Mnis,R,m,dJ,dJ,*z,*d,I,*x,*d,*a"))]
1.1 root 3293: "!TARGET_DEBUG_H_MODE
3294: && (register_operand (operands[0], SImode)
3295: || register_operand (operands[1], SImode)
3296: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
1.1.1.3 root 3297: "* return mips_move_1word (operands, insn, FALSE);"
1.1.1.4 ! root 3298: [(set_attr "type" "move,load,arith,arith,load,load,store,store,xfer,xfer,hilo,hilo,hilo,hilo")
1.1 root 3299: (set_attr "mode" "SI")
1.1.1.4 ! root 3300: (set_attr "length" "1,2,1,2,1,2,1,2,1,1,1,1,1,1")])
1.1 root 3301:
1.1.1.4 ! root 3302: ;; Reload HILO_REGNUM in SI mode. This needs a scratch register in
! 3303: ;; order to set the sign bit correctly in the HI register.
! 3304:
! 3305: (define_expand "reload_outsi"
! 3306: [(set (match_operand:SI 0 "general_operand" "=b")
! 3307: (match_operand:SI 1 "register_operand" "d"))
! 3308: (clobber (match_operand:SI 2 "register_operand" "=&d"))]
! 3309: "TARGET_64BIT"
! 3310: "
! 3311: {
! 3312: if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == HILO_REGNUM)
! 3313: {
! 3314: emit_insn (gen_movsi (gen_rtx (REG, SImode, 65), operands[1]));
! 3315: emit_insn (gen_ashrsi3 (operands[2], operands[1], GEN_INT (31)));
! 3316: emit_insn (gen_movsi (gen_rtx (REG, SImode, 64), operands[2]));
! 3317: DONE;
! 3318: }
! 3319: /* This handles moves between a float register and HI/LO. */
! 3320: emit_move_insn (operands[2], operands[1]);
! 3321: emit_move_insn (operands[0], operands[2]);
! 3322: DONE;
! 3323: }")
1.1 root 3324:
3325: ;; 16-bit Integer moves
3326:
3327: ;; Unlike most other insns, the move insns can't be split with
3328: ;; different predicates, because register spilling and other parts of
3329: ;; the compiler, have memoized the insn number already.
3330: ;; Unsigned loads are used because BYTE_LOADS_ZERO_EXTEND is defined
3331:
3332: (define_expand "movhi"
3333: [(set (match_operand:HI 0 "nonimmediate_operand" "")
3334: (match_operand:HI 1 "general_operand" ""))]
3335: ""
3336: "
3337: {
3338: if ((reload_in_progress | reload_completed) == 0
3339: && !register_operand (operands[0], HImode)
3340: && !register_operand (operands[1], HImode)
3341: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0))
3342: {
3343: rtx temp = force_reg (HImode, operands[1]);
3344: emit_move_insn (operands[0], temp);
3345: DONE;
3346: }
3347: }")
3348:
3349: ;; The difference between these two is whether or not ints are allowed
3350: ;; in FP registers (off by default, use -mdebugh to enable).
3351:
3352: (define_insn "movhi_internal1"
3353: [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*f,*f*z,*x,*d")
3354: (match_operand:HI 1 "general_operand" "d,IK,R,m,dJ,dJ,*f*z,*d,*f,*d,*x"))]
3355: "TARGET_DEBUG_H_MODE
3356: && (register_operand (operands[0], HImode)
3357: || register_operand (operands[1], HImode)
3358: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
3359: "* return mips_move_1word (operands, insn, TRUE);"
3360: [(set_attr "type" "move,arith,load,load,store,store,xfer,xfer,move,hilo,hilo")
3361: (set_attr "mode" "HI")
3362: (set_attr "length" "1,1,1,2,1,2,1,1,1,1,1")])
3363:
3364: (define_insn "movhi_internal2"
3365: [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*z,*x,*d")
3366: (match_operand:HI 1 "general_operand" "d,IK,R,m,dJ,dJ,*z,*d,*d,*x"))]
3367: "!TARGET_DEBUG_H_MODE
3368: && (register_operand (operands[0], HImode)
3369: || register_operand (operands[1], HImode)
3370: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
3371: "* return mips_move_1word (operands, insn, TRUE);"
3372: [(set_attr "type" "move,arith,load,load,store,store,xfer,xfer,hilo,hilo")
3373: (set_attr "mode" "HI")
3374: (set_attr "length" "1,1,1,2,1,2,1,1,1,1")])
3375:
3376:
3377: ;; 8-bit Integer moves
3378:
3379: ;; Unlike most other insns, the move insns can't be split with
3380: ;; different predicates, because register spilling and other parts of
3381: ;; the compiler, have memoized the insn number already.
3382: ;; Unsigned loads are used because BYTE_LOADS_ZERO_EXTEND is defined
3383:
3384: (define_expand "movqi"
3385: [(set (match_operand:QI 0 "nonimmediate_operand" "")
3386: (match_operand:QI 1 "general_operand" ""))]
3387: ""
3388: "
3389: {
3390: if ((reload_in_progress | reload_completed) == 0
3391: && !register_operand (operands[0], QImode)
3392: && !register_operand (operands[1], QImode)
3393: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0))
3394: {
3395: rtx temp = force_reg (QImode, operands[1]);
3396: emit_move_insn (operands[0], temp);
3397: DONE;
3398: }
3399: }")
3400:
3401: ;; The difference between these two is whether or not ints are allowed
3402: ;; in FP registers (off by default, use -mdebugh to enable).
3403:
3404: (define_insn "movqi_internal1"
3405: [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*f*z,*f,*x,*d")
3406: (match_operand:QI 1 "general_operand" "d,IK,R,m,dJ,dJ,*f*z,*d,*f,*d,*x"))]
3407: "TARGET_DEBUG_H_MODE
3408: && (register_operand (operands[0], QImode)
3409: || register_operand (operands[1], QImode)
3410: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
3411: "* return mips_move_1word (operands, insn, TRUE);"
3412: [(set_attr "type" "move,arith,load,load,store,store,xfer,xfer,move,hilo,hilo")
3413: (set_attr "mode" "QI")
3414: (set_attr "length" "1,1,1,2,1,2,1,1,1,1,1")])
3415:
3416: (define_insn "movqi_internal2"
3417: [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*z,*x,*d")
3418: (match_operand:QI 1 "general_operand" "d,IK,R,m,dJ,dJ,*z,*d,*d,*x"))]
3419: "!TARGET_DEBUG_H_MODE
3420: && (register_operand (operands[0], QImode)
3421: || register_operand (operands[1], QImode)
3422: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
3423: "* return mips_move_1word (operands, insn, TRUE);"
3424: [(set_attr "type" "move,arith,load,load,store,store,xfer,xfer,hilo,hilo")
3425: (set_attr "mode" "QI")
3426: (set_attr "length" "1,1,1,2,1,2,1,1,1,1")])
3427:
3428:
3429: ;; 32-bit floating point moves
3430:
3431: (define_expand "movsf"
3432: [(set (match_operand:SF 0 "nonimmediate_operand" "")
3433: (match_operand:SF 1 "general_operand" ""))]
3434: ""
3435: "
3436: {
3437: if ((reload_in_progress | reload_completed) == 0
3438: && !register_operand (operands[0], SFmode)
3439: && !register_operand (operands[1], SFmode)
3440: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)
3441: && operands[1] != CONST0_RTX (SFmode))
3442: {
3443: rtx temp = force_reg (SFmode, operands[1]);
3444: emit_move_insn (operands[0], temp);
3445: DONE;
3446: }
3447: }")
3448:
3449: (define_insn "movsf_internal1"
3450: [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,f,f,R,m,*f,*d,*d,*d,*d,*R,*m")
1.1.1.3 root 3451: (match_operand:SF 1 "general_operand" "f,G,R,Fm,fG,fG,*d,*f,*G*d,*R,*F*m,*d,*d"))]
1.1 root 3452: "TARGET_HARD_FLOAT
3453: && (register_operand (operands[0], SFmode)
3454: || register_operand (operands[1], SFmode)
3455: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
3456: || operands[1] == CONST0_RTX (SFmode))"
3457: "* return mips_move_1word (operands, insn, FALSE);"
3458: [(set_attr "type" "move,xfer,load,load,store,store,xfer,xfer,move,load,load,store,store")
3459: (set_attr "mode" "SF")
3460: (set_attr "length" "1,1,1,2,1,2,1,1,1,1,2,1,2")])
3461:
3462:
3463: (define_insn "movsf_internal2"
3464: [(set (match_operand:SF 0 "nonimmediate_operand" "=d,d,d,R,m")
1.1.1.3 root 3465: (match_operand:SF 1 "general_operand" " Gd,R,Fm,d,d"))]
1.1 root 3466: "TARGET_SOFT_FLOAT
3467: && (register_operand (operands[0], SFmode)
3468: || register_operand (operands[1], SFmode)
3469: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
3470: || operands[1] == CONST0_RTX (SFmode))"
3471: "* return mips_move_1word (operands, insn, FALSE);"
3472: [(set_attr "type" "move,load,load,store,store")
3473: (set_attr "mode" "SF")
3474: (set_attr "length" "1,1,2,1,2")])
3475:
3476:
3477: ;; 64-bit floating point moves
3478:
3479: (define_expand "movdf"
3480: [(set (match_operand:DF 0 "nonimmediate_operand" "")
3481: (match_operand:DF 1 "general_operand" ""))]
3482: ""
3483: "
3484: {
3485: if ((reload_in_progress | reload_completed) == 0
3486: && !register_operand (operands[0], DFmode)
3487: && !register_operand (operands[1], DFmode)
3488: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)
3489: && operands[1] != CONST0_RTX (DFmode))
3490: {
3491: rtx temp = force_reg (DFmode, operands[1]);
3492: emit_move_insn (operands[0], temp);
3493: DONE;
3494: }
3495: }")
3496:
3497: (define_insn "movdf_internal1"
3498: [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,f,R,o,f,*f,*d,*d,*d,*d,*R,*o")
1.1.1.3 root 3499: (match_operand:DF 1 "general_operand" "f,R,o,fG,fG,F,*d,*f,*d*G,*R,*o*F,*d,*d"))]
3500: "TARGET_HARD_FLOAT && !(TARGET_FLOAT64 && !TARGET_64BIT)
1.1.1.4 ! root 3501: && TARGET_DOUBLE_FLOAT
1.1 root 3502: && (register_operand (operands[0], DFmode)
3503: || register_operand (operands[1], DFmode)
3504: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
3505: || operands[1] == CONST0_RTX (DFmode))"
3506: "* return mips_move_2words (operands, insn); "
3507: [(set_attr "type" "move,load,load,store,store,load,xfer,xfer,move,load,load,store,store")
3508: (set_attr "mode" "DF")
3509: (set_attr "length" "1,2,4,2,4,4,2,2,2,2,4,2,4")])
3510:
1.1.1.3 root 3511: (define_insn "movdf_internal1a"
3512: [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,R,R,o,o,f,*d,*d,*d,*o,*R")
3513: (match_operand:DF 1 "general_operand" " f,o,f,G,f,G,F,*F,*o,*R,*d,*d"))]
3514: "TARGET_HARD_FLOAT && (TARGET_FLOAT64 && !TARGET_64BIT)
1.1.1.4 ! root 3515: && TARGET_DOUBLE_FLOAT
1.1.1.3 root 3516: && (register_operand (operands[0], DFmode)
3517: || register_operand (operands[1], DFmode))
3518: || (GET_CODE (operands [0]) == MEM
3519: && ((GET_CODE (operands[1]) == CONST_INT
3520: && INTVAL (operands[1]) == 0)
3521: || operands[1] == CONST0_RTX (DFmode)))"
3522: "* return mips_move_2words (operands, insn); "
3523: [(set_attr "type" "move,load,store,store,store,store,load,load,load,load,store,store")
3524: (set_attr "mode" "DF")
3525: (set_attr "length" "1,2,1,1,2,2,2,2,2,1,2,1")])
3526:
1.1 root 3527: (define_insn "movdf_internal2"
3528: [(set (match_operand:DF 0 "nonimmediate_operand" "=d,d,d,R,o")
1.1.1.3 root 3529: (match_operand:DF 1 "general_operand" "dG,R,oF,d,d"))]
1.1.1.4 ! root 3530: "(TARGET_SOFT_FLOAT || TARGET_SINGLE_FLOAT)
1.1 root 3531: && (register_operand (operands[0], DFmode)
3532: || register_operand (operands[1], DFmode)
3533: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
3534: || operands[1] == CONST0_RTX (DFmode))"
3535: "* return mips_move_2words (operands, insn); "
3536: [(set_attr "type" "move,load,load,store,store")
3537: (set_attr "mode" "DF")
3538: (set_attr "length" "2,2,4,2,4")])
3539:
3540: (define_split
3541: [(set (match_operand:DF 0 "register_operand" "")
3542: (match_operand:DF 1 "register_operand" ""))]
1.1.1.3 root 3543: "reload_completed && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 3544: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
3545: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))"
3546: [(set (subreg:SI (match_dup 0) 0) (subreg:SI (match_dup 1) 0))
3547: (set (subreg:SI (match_dup 0) 1) (subreg:SI (match_dup 1) 1))]
3548: "")
3549:
1.1.1.4 ! root 3550: ;; Instructions to load the global pointer register.
! 3551: ;; This is volatile to make sure that the scheduler won't move any symbol_ref
! 3552: ;; uses in front of it. All symbol_refs implicitly use the gp reg.
! 3553:
! 3554: (define_insn "loadgp"
! 3555: [(set (reg:DI 28)
! 3556: (unspec_volatile [(match_operand:DI 0 "address_operand" "")] 2))
! 3557: (clobber (reg:DI 1))]
! 3558: ""
! 3559: "%[lui\\t$1,%%hi(%%neg(%%gp_rel(%a0)))\\n\\taddiu\\t$1,$1,%%lo(%%neg(%%gp_rel(%a0)))\\n\\tdaddu\\t$gp,$1,$25%]"
! 3560: [(set_attr "type" "move")
! 3561: (set_attr "mode" "DI")
! 3562: (set_attr "length" "3")])
1.1 root 3563:
3564: ;; Block moves, see mips.c for more details.
3565: ;; Argument 0 is the destination
3566: ;; Argument 1 is the source
3567: ;; Argument 2 is the length
3568: ;; Argument 3 is the alignment
3569:
3570: (define_expand "movstrsi"
3571: [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" ""))
3572: (mem:BLK (match_operand:BLK 1 "general_operand" "")))
3573: (use (match_operand:SI 2 "arith32_operand" ""))
3574: (use (match_operand:SI 3 "immediate_operand" ""))])]
3575: ""
3576: "
3577: {
3578: if (operands[0]) /* avoid unused code messages */
3579: {
3580: expand_block_move (operands);
3581: DONE;
3582: }
3583: }")
3584:
3585: ;; Insn generated by block moves
3586:
3587: (define_insn "movstrsi_internal"
3588: [(set (match_operand:BLK 0 "memory_operand" "=Ro") ;; destination
3589: (match_operand:BLK 1 "memory_operand" "Ro")) ;; source
3590: (clobber (match_scratch:SI 4 "=&d")) ;; temp 1
3591: (clobber (match_scratch:SI 5 "=&d")) ;; temp 2
3592: (clobber (match_scratch:SI 6 "=&d")) ;; temp 3
3593: (clobber (match_scratch:SI 7 "=&d")) ;; temp 4
3594: (use (match_operand:SI 2 "small_int" "I")) ;; # bytes to move
3595: (use (match_operand:SI 3 "small_int" "I")) ;; alignment
3596: (use (const_int 0))] ;; normal block move
3597: ""
3598: "* return output_block_move (insn, operands, 4, BLOCK_MOVE_NORMAL);"
3599: [(set_attr "type" "multi")
3600: (set_attr "mode" "none")
3601: (set_attr "length" "20")])
3602:
3603: ;; Split a block move into 2 parts, the first part is everything
3604: ;; except for the last move, and the second part is just the last
3605: ;; store, which is exactly 1 instruction (ie, not a usw), so it can
3606: ;; fill a delay slot. This also prevents a bug in delayed branches
3607: ;; from showing up, which reuses one of the registers in our clobbers.
3608:
3609: (define_split
3610: [(set (mem:BLK (match_operand:SI 0 "register_operand" ""))
3611: (mem:BLK (match_operand:SI 1 "register_operand" "")))
3612: (clobber (match_operand:SI 4 "register_operand" ""))
3613: (clobber (match_operand:SI 5 "register_operand" ""))
3614: (clobber (match_operand:SI 6 "register_operand" ""))
3615: (clobber (match_operand:SI 7 "register_operand" ""))
3616: (use (match_operand:SI 2 "small_int" ""))
3617: (use (match_operand:SI 3 "small_int" ""))
3618: (use (const_int 0))]
3619:
3620: "reload_completed && !TARGET_DEBUG_D_MODE && INTVAL (operands[2]) > 0"
3621:
3622: ;; All but the last move
3623: [(parallel [(set (mem:BLK (match_dup 0))
3624: (mem:BLK (match_dup 1)))
3625: (clobber (match_dup 4))
3626: (clobber (match_dup 5))
3627: (clobber (match_dup 6))
3628: (clobber (match_dup 7))
3629: (use (match_dup 2))
3630: (use (match_dup 3))
3631: (use (const_int 1))])
3632:
3633: ;; The last store, so it can fill a delay slot
3634: (parallel [(set (mem:BLK (match_dup 0))
3635: (mem:BLK (match_dup 1)))
3636: (clobber (match_dup 4))
3637: (clobber (match_dup 5))
3638: (clobber (match_dup 6))
3639: (clobber (match_dup 7))
3640: (use (match_dup 2))
3641: (use (match_dup 3))
3642: (use (const_int 2))])]
3643:
3644: "")
3645:
3646: (define_insn "movstrsi_internal2"
3647: [(set (match_operand:BLK 0 "memory_operand" "=Ro") ;; destination
3648: (match_operand:BLK 1 "memory_operand" "Ro")) ;; source
3649: (clobber (match_scratch:SI 4 "=&d")) ;; temp 1
3650: (clobber (match_scratch:SI 5 "=&d")) ;; temp 2
3651: (clobber (match_scratch:SI 6 "=&d")) ;; temp 3
3652: (clobber (match_scratch:SI 7 "=&d")) ;; temp 4
3653: (use (match_operand:SI 2 "small_int" "I")) ;; # bytes to move
3654: (use (match_operand:SI 3 "small_int" "I")) ;; alignment
3655: (use (const_int 1))] ;; all but last store
3656: ""
3657: "* return output_block_move (insn, operands, 4, BLOCK_MOVE_NOT_LAST);"
3658: [(set_attr "type" "multi")
3659: (set_attr "mode" "none")
3660: (set_attr "length" "20")])
3661:
3662: (define_insn "movstrsi_internal3"
3663: [(set (match_operand:BLK 0 "memory_operand" "=Ro") ;; destination
3664: (match_operand:BLK 1 "memory_operand" "Ro")) ;; source
3665: (clobber (match_scratch:SI 4 "=&d")) ;; temp 1
3666: (clobber (match_scratch:SI 5 "=&d")) ;; temp 2
3667: (clobber (match_scratch:SI 6 "=&d")) ;; temp 3
3668: (clobber (match_scratch:SI 7 "=&d")) ;; temp 4
3669: (use (match_operand:SI 2 "small_int" "I")) ;; # bytes to move
3670: (use (match_operand:SI 3 "small_int" "I")) ;; alignment
1.1.1.3 root 3671: (use (const_int 2))] ;; just last store of block move
1.1 root 3672: ""
3673: "* return output_block_move (insn, operands, 4, BLOCK_MOVE_LAST);"
3674: [(set_attr "type" "store")
3675: (set_attr "mode" "none")
3676: (set_attr "length" "1")])
3677:
3678:
3679: ;;
3680: ;; ....................
3681: ;;
3682: ;; SHIFTS
3683: ;;
3684: ;; ....................
3685:
3686: (define_insn "ashlsi3"
3687: [(set (match_operand:SI 0 "register_operand" "=d")
3688: (ashift:SI (match_operand:SI 1 "register_operand" "d")
3689: (match_operand:SI 2 "arith_operand" "dI")))]
3690: ""
3691: "*
3692: {
3693: if (GET_CODE (operands[2]) == CONST_INT)
1.1.1.4 ! root 3694: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);
1.1 root 3695:
3696: return \"sll\\t%0,%1,%2\";
3697: }"
3698: [(set_attr "type" "arith")
3699: (set_attr "mode" "SI")
3700: (set_attr "length" "1")])
3701:
3702:
3703: (define_expand "ashldi3"
3704: [(parallel [(set (match_operand:DI 0 "register_operand" "")
3705: (ashift:DI (match_operand:DI 1 "register_operand" "")
3706: (match_operand:SI 2 "arith_operand" "")))
3707: (clobber (match_dup 3))])]
1.1.1.3 root 3708: "TARGET_64BIT || !TARGET_DEBUG_G_MODE"
3709: "
3710: {
3711: if (TARGET_64BIT)
3712: {
3713: emit_insn (gen_ashldi3_internal4 (operands[0], operands[1],
3714: operands[2]));
3715: DONE;
3716: }
3717:
3718: operands[3] = gen_reg_rtx (SImode);
3719: }")
1.1 root 3720:
3721:
3722: (define_insn "ashldi3_internal"
3723: [(set (match_operand:DI 0 "register_operand" "=&d")
3724: (ashift:DI (match_operand:DI 1 "register_operand" "d")
3725: (match_operand:SI 2 "register_operand" "d")))
3726: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 3727: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE"
1.1 root 3728: "*
3729: {
3730: operands[4] = const0_rtx;
3731: dslots_jump_total += 3;
3732: dslots_jump_filled += 2;
3733:
3734: return \"sll\\t%3,%2,26\\n\\
3735: \\tbgez\\t%3,1f\\n\\
3736: \\tsll\\t%M0,%L1,%2\\n\\
3737: \\t%(b\\t3f\\n\\
3738: \\tmove\\t%L0,%z4%)\\n\\
3739: \\n\\
3740: 1:\\n\\
3741: \\t%(beq\\t%3,%z4,2f\\n\\
3742: \\tsll\\t%M0,%M1,%2%)\\n\\
3743: \\n\\
3744: \\tsubu\\t%3,%z4,%2\\n\\
3745: \\tsrl\\t%3,%L1,%3\\n\\
3746: \\tor\\t%M0,%M0,%3\\n\\
3747: 2:\\n\\
3748: \\tsll\\t%L0,%L1,%2\\n\\
3749: 3:\";
3750: }"
3751: [(set_attr "type" "darith")
3752: (set_attr "mode" "SI")
3753: (set_attr "length" "12")])
3754:
3755:
3756: (define_insn "ashldi3_internal2"
3757: [(set (match_operand:DI 0 "register_operand" "=d")
3758: (ashift:DI (match_operand:DI 1 "register_operand" "d")
3759: (match_operand:SI 2 "small_int" "IJK")))
3760: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 3761: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE && (INTVAL (operands[2]) & 32) != 0"
1.1 root 3762: "*
3763: {
1.1.1.4 ! root 3764: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);
1.1 root 3765: operands[4] = const0_rtx;
3766: return \"sll\\t%M0,%L1,%2\;move\\t%L0,%z4\";
3767: }"
3768: [(set_attr "type" "darith")
3769: (set_attr "mode" "DI")
3770: (set_attr "length" "2")])
3771:
3772:
3773: (define_split
3774: [(set (match_operand:DI 0 "register_operand" "")
3775: (ashift:DI (match_operand:DI 1 "register_operand" "")
3776: (match_operand:SI 2 "small_int" "")))
3777: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 3778: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 3779: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
3780: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
3781: && (INTVAL (operands[2]) & 32) != 0"
3782:
3783: [(set (subreg:SI (match_dup 0) 1) (ashift:SI (subreg:SI (match_dup 1) 0) (match_dup 2)))
3784: (set (subreg:SI (match_dup 0) 0) (const_int 0))]
3785:
1.1.1.4 ! root 3786: "operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);")
1.1 root 3787:
3788:
3789: (define_split
3790: [(set (match_operand:DI 0 "register_operand" "")
3791: (ashift:DI (match_operand:DI 1 "register_operand" "")
3792: (match_operand:SI 2 "small_int" "")))
3793: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 3794: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 3795: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
3796: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
3797: && (INTVAL (operands[2]) & 32) != 0"
3798:
3799: [(set (subreg:SI (match_dup 0) 0) (ashift:SI (subreg:SI (match_dup 1) 1) (match_dup 2)))
3800: (set (subreg:SI (match_dup 0) 1) (const_int 0))]
3801:
1.1.1.4 ! root 3802: "operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);")
1.1 root 3803:
3804:
3805: (define_insn "ashldi3_internal3"
3806: [(set (match_operand:DI 0 "register_operand" "=d")
3807: (ashift:DI (match_operand:DI 1 "register_operand" "d")
3808: (match_operand:SI 2 "small_int" "IJK")))
3809: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 3810: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE
1.1 root 3811: && (INTVAL (operands[2]) & 63) < 32
3812: && (INTVAL (operands[2]) & 63) != 0"
3813: "*
3814: {
3815: int amount = INTVAL (operands[2]);
3816:
3817: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
3818: operands[4] = const0_rtx;
3819: operands[5] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
3820:
3821: return \"sll\\t%M0,%M1,%2\;srl\\t%3,%L1,%5\;or\\t%M0,%M0,%3\;sll\\t%L0,%L1,%2\";
3822: }"
3823: [(set_attr "type" "darith")
3824: (set_attr "mode" "DI")
3825: (set_attr "length" "4")])
3826:
3827:
3828: (define_split
3829: [(set (match_operand:DI 0 "register_operand" "")
3830: (ashift:DI (match_operand:DI 1 "register_operand" "")
3831: (match_operand:SI 2 "small_int" "")))
3832: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 3833: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 3834: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
3835: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
3836: && (INTVAL (operands[2]) & 63) < 32
3837: && (INTVAL (operands[2]) & 63) != 0"
3838:
3839: [(set (subreg:SI (match_dup 0) 1)
3840: (ashift:SI (subreg:SI (match_dup 1) 1)
3841: (match_dup 2)))
3842:
3843: (set (match_dup 3)
3844: (lshiftrt:SI (subreg:SI (match_dup 1) 0)
3845: (match_dup 4)))
3846:
3847: (set (subreg:SI (match_dup 0) 1)
3848: (ior:SI (subreg:SI (match_dup 0) 1)
3849: (match_dup 3)))
3850:
3851: (set (subreg:SI (match_dup 0) 0)
3852: (ashift:SI (subreg:SI (match_dup 1) 0)
3853: (match_dup 2)))]
3854: "
3855: {
3856: int amount = INTVAL (operands[2]);
3857: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
3858: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
3859: }")
3860:
3861:
3862: (define_split
3863: [(set (match_operand:DI 0 "register_operand" "")
3864: (ashift:DI (match_operand:DI 1 "register_operand" "")
3865: (match_operand:SI 2 "small_int" "")))
3866: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 3867: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 3868: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
3869: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
3870: && (INTVAL (operands[2]) & 63) < 32
3871: && (INTVAL (operands[2]) & 63) != 0"
3872:
3873: [(set (subreg:SI (match_dup 0) 0)
3874: (ashift:SI (subreg:SI (match_dup 1) 0)
3875: (match_dup 2)))
3876:
3877: (set (match_dup 3)
3878: (lshiftrt:SI (subreg:SI (match_dup 1) 1)
3879: (match_dup 4)))
3880:
3881: (set (subreg:SI (match_dup 0) 0)
3882: (ior:SI (subreg:SI (match_dup 0) 0)
3883: (match_dup 3)))
3884:
3885: (set (subreg:SI (match_dup 0) 1)
3886: (ashift:SI (subreg:SI (match_dup 1) 1)
3887: (match_dup 2)))]
3888: "
3889: {
3890: int amount = INTVAL (operands[2]);
3891: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
3892: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
3893: }")
3894:
3895:
1.1.1.3 root 3896: (define_insn "ashldi3_internal4"
3897: [(set (match_operand:DI 0 "register_operand" "=d")
3898: (ashift:DI (match_operand:DI 1 "register_operand" "d")
3899: (match_operand:SI 2 "arith_operand" "dI")))]
3900: "TARGET_64BIT"
3901: "*
3902: {
3903: if (GET_CODE (operands[2]) == CONST_INT)
3904: operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
3905:
3906: return \"dsll\\t%0,%1,%2\";
3907: }"
3908: [(set_attr "type" "arith")
3909: (set_attr "mode" "DI")
3910: (set_attr "length" "1")])
3911:
3912:
1.1 root 3913: (define_insn "ashrsi3"
3914: [(set (match_operand:SI 0 "register_operand" "=d")
3915: (ashiftrt:SI (match_operand:SI 1 "register_operand" "d")
3916: (match_operand:SI 2 "arith_operand" "dI")))]
3917: ""
3918: "*
3919: {
3920: if (GET_CODE (operands[2]) == CONST_INT)
1.1.1.4 ! root 3921: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);
1.1 root 3922:
3923: return \"sra\\t%0,%1,%2\";
3924: }"
3925: [(set_attr "type" "arith")
3926: (set_attr "mode" "SI")
3927: (set_attr "length" "1")])
3928:
3929:
3930: (define_expand "ashrdi3"
3931: [(parallel [(set (match_operand:DI 0 "register_operand" "")
3932: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
3933: (match_operand:SI 2 "arith_operand" "")))
3934: (clobber (match_dup 3))])]
1.1.1.3 root 3935: "TARGET_64BIT || !TARGET_DEBUG_G_MODE"
3936: "
3937: {
3938: if (TARGET_64BIT)
3939: {
3940: emit_insn (gen_ashrdi3_internal4 (operands[0], operands[1],
3941: operands[2]));
3942: DONE;
3943: }
3944:
3945: operands[3] = gen_reg_rtx (SImode);
3946: }")
1.1 root 3947:
3948:
3949: (define_insn "ashrdi3_internal"
3950: [(set (match_operand:DI 0 "register_operand" "=&d")
3951: (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
3952: (match_operand:SI 2 "register_operand" "d")))
3953: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 3954: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE"
1.1 root 3955: "*
3956: {
3957: operands[4] = const0_rtx;
3958: dslots_jump_total += 3;
3959: dslots_jump_filled += 2;
3960:
3961: return \"sll\\t%3,%2,26\\n\\
3962: \\tbgez\\t%3,1f\\n\\
3963: \\tsra\\t%L0,%M1,%2\\n\\
3964: \\t%(b\\t3f\\n\\
3965: \\tsra\\t%M0,%M1,31%)\\n\\
3966: \\n\\
3967: 1:\\n\\
3968: \\t%(beq\\t%3,%z4,2f\\n\\
3969: \\tsrl\\t%L0,%L1,%2%)\\n\\
3970: \\n\\
3971: \\tsubu\\t%3,%z4,%2\\n\\
3972: \\tsll\\t%3,%M1,%3\\n\\
3973: \\tor\\t%L0,%L0,%3\\n\\
3974: 2:\\n\\
3975: \\tsra\\t%M0,%M1,%2\\n\\
3976: 3:\";
3977: }"
3978: [(set_attr "type" "darith")
3979: (set_attr "mode" "DI")
3980: (set_attr "length" "12")])
3981:
3982:
3983: (define_insn "ashrdi3_internal2"
3984: [(set (match_operand:DI 0 "register_operand" "=d")
3985: (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
3986: (match_operand:SI 2 "small_int" "IJK")))
3987: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 3988: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE && (INTVAL (operands[2]) & 32) != 0"
1.1 root 3989: "*
3990: {
1.1.1.4 ! root 3991: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);
1.1 root 3992: return \"sra\\t%L0,%M1,%2\;sra\\t%M0,%M1,31\";
3993: }"
3994: [(set_attr "type" "darith")
3995: (set_attr "mode" "DI")
3996: (set_attr "length" "2")])
3997:
3998:
3999: (define_split
4000: [(set (match_operand:DI 0 "register_operand" "")
4001: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
4002: (match_operand:SI 2 "small_int" "")))
4003: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 4004: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 4005: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
4006: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
4007: && (INTVAL (operands[2]) & 32) != 0"
4008:
4009: [(set (subreg:SI (match_dup 0) 0) (ashiftrt:SI (subreg:SI (match_dup 1) 1) (match_dup 2)))
4010: (set (subreg:SI (match_dup 0) 1) (ashiftrt:SI (subreg:SI (match_dup 1) 1) (const_int 31)))]
4011:
1.1.1.4 ! root 4012: "operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);")
1.1 root 4013:
4014:
4015: (define_split
4016: [(set (match_operand:DI 0 "register_operand" "")
4017: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
4018: (match_operand:SI 2 "small_int" "")))
4019: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 4020: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 4021: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
4022: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
4023: && (INTVAL (operands[2]) & 32) != 0"
4024:
4025: [(set (subreg:SI (match_dup 0) 1) (ashiftrt:SI (subreg:SI (match_dup 1) 0) (match_dup 2)))
4026: (set (subreg:SI (match_dup 0) 0) (ashiftrt:SI (subreg:SI (match_dup 1) 0) (const_int 31)))]
4027:
1.1.1.4 ! root 4028: "operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);")
1.1 root 4029:
4030:
4031: (define_insn "ashrdi3_internal3"
4032: [(set (match_operand:DI 0 "register_operand" "=d")
4033: (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
4034: (match_operand:SI 2 "small_int" "IJK")))
4035: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 4036: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE
1.1 root 4037: && (INTVAL (operands[2]) & 63) < 32
4038: && (INTVAL (operands[2]) & 63) != 0"
4039: "*
4040: {
4041: int amount = INTVAL (operands[2]);
4042:
4043: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
4044: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
4045:
4046: return \"srl\\t%L0,%L1,%2\;sll\\t%3,%M1,%4\;or\\t%L0,%L0,%3\;sra\\t%M0,%M1,%2\";
4047: }"
4048: [(set_attr "type" "darith")
4049: (set_attr "mode" "DI")
4050: (set_attr "length" "4")])
4051:
4052:
4053: (define_split
4054: [(set (match_operand:DI 0 "register_operand" "")
4055: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
4056: (match_operand:SI 2 "small_int" "")))
4057: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 4058: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 4059: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
4060: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
4061: && (INTVAL (operands[2]) & 63) < 32
4062: && (INTVAL (operands[2]) & 63) != 0"
4063:
4064: [(set (subreg:SI (match_dup 0) 0)
4065: (lshiftrt:SI (subreg:SI (match_dup 1) 0)
4066: (match_dup 2)))
4067:
4068: (set (match_dup 3)
4069: (ashift:SI (subreg:SI (match_dup 1) 1)
4070: (match_dup 4)))
4071:
4072: (set (subreg:SI (match_dup 0) 0)
4073: (ior:SI (subreg:SI (match_dup 0) 0)
4074: (match_dup 3)))
4075:
4076: (set (subreg:SI (match_dup 0) 1)
4077: (ashiftrt:SI (subreg:SI (match_dup 1) 1)
4078: (match_dup 2)))]
4079: "
4080: {
4081: int amount = INTVAL (operands[2]);
4082: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
4083: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
4084: }")
4085:
4086:
4087: (define_split
4088: [(set (match_operand:DI 0 "register_operand" "")
4089: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
4090: (match_operand:SI 2 "small_int" "")))
4091: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 4092: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 4093: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
4094: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
4095: && (INTVAL (operands[2]) & 63) < 32
4096: && (INTVAL (operands[2]) & 63) != 0"
4097:
4098: [(set (subreg:SI (match_dup 0) 1)
4099: (lshiftrt:SI (subreg:SI (match_dup 1) 1)
4100: (match_dup 2)))
4101:
4102: (set (match_dup 3)
4103: (ashift:SI (subreg:SI (match_dup 1) 0)
4104: (match_dup 4)))
4105:
4106: (set (subreg:SI (match_dup 0) 1)
4107: (ior:SI (subreg:SI (match_dup 0) 1)
4108: (match_dup 3)))
4109:
4110: (set (subreg:SI (match_dup 0) 0)
4111: (ashiftrt:SI (subreg:SI (match_dup 1) 0)
4112: (match_dup 2)))]
4113: "
4114: {
4115: int amount = INTVAL (operands[2]);
4116: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
4117: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
4118: }")
4119:
4120:
1.1.1.3 root 4121: (define_insn "ashrdi3_internal4"
4122: [(set (match_operand:DI 0 "register_operand" "=d")
4123: (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
4124: (match_operand:SI 2 "arith_operand" "dI")))]
4125: "TARGET_64BIT"
4126: "*
4127: {
4128: if (GET_CODE (operands[2]) == CONST_INT)
4129: operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
4130:
4131: return \"dsra\\t%0,%1,%2\";
4132: }"
4133: [(set_attr "type" "arith")
4134: (set_attr "mode" "DI")
4135: (set_attr "length" "1")])
4136:
4137:
1.1 root 4138: (define_insn "lshrsi3"
4139: [(set (match_operand:SI 0 "register_operand" "=d")
4140: (lshiftrt:SI (match_operand:SI 1 "register_operand" "d")
4141: (match_operand:SI 2 "arith_operand" "dI")))]
4142: ""
4143: "*
4144: {
4145: if (GET_CODE (operands[2]) == CONST_INT)
1.1.1.4 ! root 4146: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);
1.1 root 4147:
4148: return \"srl\\t%0,%1,%2\";
4149: }"
4150: [(set_attr "type" "arith")
4151: (set_attr "mode" "SI")
4152: (set_attr "length" "1")])
4153:
4154:
4155: (define_expand "lshrdi3"
4156: [(parallel [(set (match_operand:DI 0 "register_operand" "")
4157: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
4158: (match_operand:SI 2 "arith_operand" "")))
4159: (clobber (match_dup 3))])]
1.1.1.3 root 4160: "TARGET_64BIT || !TARGET_DEBUG_G_MODE"
4161: "
4162: {
4163: if (TARGET_64BIT)
4164: {
4165: emit_insn (gen_lshrdi3_internal4 (operands[0], operands[1],
4166: operands[2]));
4167: DONE;
4168: }
4169:
4170: operands[3] = gen_reg_rtx (SImode);
4171: }")
1.1 root 4172:
4173:
4174: (define_insn "lshrdi3_internal"
4175: [(set (match_operand:DI 0 "register_operand" "=&d")
4176: (lshiftrt:DI (match_operand:DI 1 "register_operand" "d")
4177: (match_operand:SI 2 "register_operand" "d")))
4178: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 4179: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE"
1.1 root 4180: "*
4181: {
4182: operands[4] = const0_rtx;
4183: dslots_jump_total += 3;
4184: dslots_jump_filled += 2;
4185:
4186: return \"sll\\t%3,%2,26\\n\\
4187: \\tbgez\\t%3,1f\\n\\
4188: \\tsrl\\t%L0,%M1,%2\\n\\
4189: \\t%(b\\t3f\\n\\
4190: \\tmove\\t%M0,%z4%)\\n\\
4191: \\n\\
4192: 1:\\n\\
4193: \\t%(beq\\t%3,%z4,2f\\n\\
4194: \\tsrl\\t%L0,%L1,%2%)\\n\\
4195: \\n\\
4196: \\tsubu\\t%3,%z4,%2\\n\\
4197: \\tsll\\t%3,%M1,%3\\n\\
4198: \\tor\\t%L0,%L0,%3\\n\\
4199: 2:\\n\\
4200: \\tsrl\\t%M0,%M1,%2\\n\\
4201: 3:\";
4202: }"
4203: [(set_attr "type" "darith")
4204: (set_attr "mode" "DI")
4205: (set_attr "length" "12")])
4206:
4207:
4208: (define_insn "lshrdi3_internal2"
4209: [(set (match_operand:DI 0 "register_operand" "=d")
4210: (lshiftrt:DI (match_operand:DI 1 "register_operand" "d")
4211: (match_operand:SI 2 "small_int" "IJK")))
4212: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 4213: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE && (INTVAL (operands[2]) & 32) != 0"
1.1 root 4214: "*
4215: {
1.1.1.4 ! root 4216: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);
1.1 root 4217: operands[4] = const0_rtx;
4218: return \"srl\\t%L0,%M1,%2\;move\\t%M0,%z4\";
4219: }"
4220: [(set_attr "type" "darith")
4221: (set_attr "mode" "DI")
4222: (set_attr "length" "2")])
4223:
4224:
4225: (define_split
4226: [(set (match_operand:DI 0 "register_operand" "")
4227: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
4228: (match_operand:SI 2 "small_int" "")))
4229: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 4230: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 4231: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
4232: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
4233: && (INTVAL (operands[2]) & 32) != 0"
4234:
4235: [(set (subreg:SI (match_dup 0) 0) (lshiftrt:SI (subreg:SI (match_dup 1) 1) (match_dup 2)))
4236: (set (subreg:SI (match_dup 0) 1) (const_int 0))]
4237:
1.1.1.4 ! root 4238: "operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);")
1.1 root 4239:
4240:
4241: (define_split
4242: [(set (match_operand:DI 0 "register_operand" "")
4243: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
4244: (match_operand:SI 2 "small_int" "")))
4245: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 4246: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 4247: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
4248: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
4249: && (INTVAL (operands[2]) & 32) != 0"
4250:
4251: [(set (subreg:SI (match_dup 0) 1) (lshiftrt:SI (subreg:SI (match_dup 1) 0) (match_dup 2)))
4252: (set (subreg:SI (match_dup 0) 0) (const_int 0))]
4253:
1.1.1.4 ! root 4254: "operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) & 0x1f);")
1.1 root 4255:
4256:
4257: (define_insn "lshrdi3_internal3"
4258: [(set (match_operand:DI 0 "register_operand" "=d")
4259: (lshiftrt:DI (match_operand:DI 1 "register_operand" "d")
4260: (match_operand:SI 2 "small_int" "IJK")))
4261: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 4262: "!TARGET_64BIT && !TARGET_DEBUG_G_MODE
1.1 root 4263: && (INTVAL (operands[2]) & 63) < 32
4264: && (INTVAL (operands[2]) & 63) != 0"
4265: "*
4266: {
4267: int amount = INTVAL (operands[2]);
4268:
4269: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
4270: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
4271:
4272: return \"srl\\t%L0,%L1,%2\;sll\\t%3,%M1,%4\;or\\t%L0,%L0,%3\;srl\\t%M0,%M1,%2\";
4273: }"
4274: [(set_attr "type" "darith")
4275: (set_attr "mode" "DI")
4276: (set_attr "length" "4")])
4277:
4278:
4279: (define_split
4280: [(set (match_operand:DI 0 "register_operand" "")
4281: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
4282: (match_operand:SI 2 "small_int" "")))
4283: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 4284: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 4285: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
4286: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
4287: && (INTVAL (operands[2]) & 63) < 32
4288: && (INTVAL (operands[2]) & 63) != 0"
4289:
4290: [(set (subreg:SI (match_dup 0) 0)
4291: (lshiftrt:SI (subreg:SI (match_dup 1) 0)
4292: (match_dup 2)))
4293:
4294: (set (match_dup 3)
4295: (ashift:SI (subreg:SI (match_dup 1) 1)
4296: (match_dup 4)))
4297:
4298: (set (subreg:SI (match_dup 0) 0)
4299: (ior:SI (subreg:SI (match_dup 0) 0)
4300: (match_dup 3)))
4301:
4302: (set (subreg:SI (match_dup 0) 1)
4303: (lshiftrt:SI (subreg:SI (match_dup 1) 1)
4304: (match_dup 2)))]
4305: "
4306: {
4307: int amount = INTVAL (operands[2]);
4308: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
4309: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
4310: }")
4311:
4312:
4313: (define_split
4314: [(set (match_operand:DI 0 "register_operand" "")
4315: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
4316: (match_operand:SI 2 "small_int" "")))
4317: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 4318: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 4319: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
4320: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
4321: && (INTVAL (operands[2]) & 63) < 32
4322: && (INTVAL (operands[2]) & 63) != 0"
4323:
4324: [(set (subreg:SI (match_dup 0) 1)
4325: (lshiftrt:SI (subreg:SI (match_dup 1) 1)
4326: (match_dup 2)))
4327:
4328: (set (match_dup 3)
4329: (ashift:SI (subreg:SI (match_dup 1) 0)
4330: (match_dup 4)))
4331:
4332: (set (subreg:SI (match_dup 0) 1)
4333: (ior:SI (subreg:SI (match_dup 0) 1)
4334: (match_dup 3)))
4335:
4336: (set (subreg:SI (match_dup 0) 0)
4337: (lshiftrt:SI (subreg:SI (match_dup 1) 0)
4338: (match_dup 2)))]
4339: "
4340: {
4341: int amount = INTVAL (operands[2]);
4342: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
4343: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
4344: }")
4345:
1.1.1.3 root 4346:
4347: (define_insn "lshrdi3_internal4"
4348: [(set (match_operand:DI 0 "register_operand" "=d")
4349: (lshiftrt:DI (match_operand:DI 1 "register_operand" "d")
4350: (match_operand:SI 2 "arith_operand" "dI")))]
4351: "TARGET_64BIT"
4352: "*
4353: {
4354: if (GET_CODE (operands[2]) == CONST_INT)
4355: operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
4356:
4357: return \"dsrl\\t%0,%1,%2\";
4358: }"
4359: [(set_attr "type" "arith")
4360: (set_attr "mode" "DI")
4361: (set_attr "length" "1")])
4362:
1.1 root 4363:
4364: ;;
4365: ;; ....................
4366: ;;
4367: ;; COMPARISONS
4368: ;;
4369: ;; ....................
4370:
4371: ;; Flow here is rather complex:
4372: ;;
1.1.1.3 root 4373: ;; 1) The cmp{si,di,sf,df} routine is called. It deposits the
1.1 root 4374: ;; arguments into the branch_cmp array, and the type into
4375: ;; branch_type. No RTL is generated.
4376: ;;
4377: ;; 2) The appropriate branch define_expand is called, which then
4378: ;; creates the appropriate RTL for the comparison and branch.
4379: ;; Different CC modes are used, based on what type of branch is
4380: ;; done, so that we can constrain things appropriately. There
4381: ;; are assumptions in the rest of GCC that break if we fold the
4382: ;; operands into the branchs for integer operations, and use cc0
4383: ;; for floating point, so we use the fp status register instead.
4384: ;; If needed, an appropriate temporary is created to hold the
4385: ;; of the integer compare.
4386:
4387: (define_expand "cmpsi"
4388: [(set (cc0)
4389: (compare:CC (match_operand:SI 0 "register_operand" "")
4390: (match_operand:SI 1 "arith_operand" "")))]
4391: ""
4392: "
4393: {
4394: if (operands[0]) /* avoid unused code message */
4395: {
4396: branch_cmp[0] = operands[0];
4397: branch_cmp[1] = operands[1];
4398: branch_type = CMP_SI;
4399: DONE;
4400: }
4401: }")
4402:
4403: (define_expand "tstsi"
4404: [(set (cc0)
4405: (match_operand:SI 0 "register_operand" ""))]
4406: ""
4407: "
4408: {
4409: if (operands[0]) /* avoid unused code message */
4410: {
4411: branch_cmp[0] = operands[0];
4412: branch_cmp[1] = const0_rtx;
4413: branch_type = CMP_SI;
4414: DONE;
4415: }
4416: }")
4417:
1.1.1.3 root 4418: (define_expand "cmpdi"
4419: [(set (cc0)
4420: (compare:CC (match_operand:DI 0 "register_operand" "")
4421: (match_operand:DI 1 "arith_operand" "")))]
4422: "TARGET_64BIT"
4423: "
4424: {
4425: if (operands[0]) /* avoid unused code message */
4426: {
4427: branch_cmp[0] = operands[0];
4428: branch_cmp[1] = operands[1];
4429: branch_type = CMP_DI;
4430: DONE;
4431: }
4432: }")
4433:
4434: (define_expand "tstdi"
4435: [(set (cc0)
4436: (match_operand:DI 0 "register_operand" ""))]
4437: "TARGET_64BIT"
4438: "
4439: {
4440: if (operands[0]) /* avoid unused code message */
4441: {
4442: branch_cmp[0] = operands[0];
4443: branch_cmp[1] = const0_rtx;
4444: branch_type = CMP_DI;
4445: DONE;
4446: }
4447: }")
4448:
1.1 root 4449: (define_expand "cmpdf"
4450: [(set (cc0)
4451: (compare:CC_FP (match_operand:DF 0 "register_operand" "")
4452: (match_operand:DF 1 "register_operand" "")))]
1.1.1.4 ! root 4453: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 4454: "
4455: {
4456: if (operands[0]) /* avoid unused code message */
4457: {
4458: branch_cmp[0] = operands[0];
4459: branch_cmp[1] = operands[1];
4460: branch_type = CMP_DF;
4461: DONE;
4462: }
4463: }")
4464:
4465: (define_expand "cmpsf"
4466: [(set (cc0)
4467: (compare:CC_FP (match_operand:SF 0 "register_operand" "")
4468: (match_operand:SF 1 "register_operand" "")))]
4469: "TARGET_HARD_FLOAT"
4470: "
4471: {
4472: if (operands[0]) /* avoid unused code message */
4473: {
4474: branch_cmp[0] = operands[0];
4475: branch_cmp[1] = operands[1];
4476: branch_type = CMP_SF;
4477: DONE;
4478: }
4479: }")
4480:
4481:
4482: ;;
4483: ;; ....................
4484: ;;
4485: ;; CONDITIONAL BRANCHES
4486: ;;
4487: ;; ....................
4488:
4489: (define_insn "branch_fp_ne"
4490: [(set (pc)
1.1.1.4 ! root 4491: (if_then_else (ne:CC_FP (reg:CC_FP 67)
1.1 root 4492: (const_int 0))
4493: (match_operand 0 "pc_or_label_operand" "")
4494: (match_operand 1 "pc_or_label_operand" "")))]
1.1.1.3 root 4495: "TARGET_HARD_FLOAT"
1.1 root 4496: "*
4497: {
4498: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
4499: return (operands[0] != pc_rtx) ? \"%*bc1t%?\\t%0\" : \"%*bc1f%?\\t%1\";
4500: }"
4501: [(set_attr "type" "branch")
4502: (set_attr "mode" "none")
4503: (set_attr "length" "1")])
4504:
4505: (define_insn "branch_fp_ne_rev"
4506: [(set (pc)
1.1.1.4 ! root 4507: (if_then_else (ne:CC_REV_FP (reg:CC_REV_FP 67)
1.1 root 4508: (const_int 0))
4509: (match_operand 0 "pc_or_label_operand" "")
4510: (match_operand 1 "pc_or_label_operand" "")))]
1.1.1.3 root 4511: "TARGET_HARD_FLOAT"
1.1 root 4512: "*
4513: {
4514: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
4515: return (operands[0] != pc_rtx) ? \"%*bc1f%?\\t%0\" : \"%*bc1t%?\\t%1\";
4516: }"
4517: [(set_attr "type" "branch")
4518: (set_attr "mode" "none")
4519: (set_attr "length" "1")])
4520:
4521: (define_insn "branch_fp_eq"
4522: [(set (pc)
1.1.1.4 ! root 4523: (if_then_else (eq:CC_FP (reg:CC_FP 67)
1.1 root 4524: (const_int 0))
4525: (match_operand 0 "pc_or_label_operand" "")
4526: (match_operand 1 "pc_or_label_operand" "")))]
1.1.1.3 root 4527: "TARGET_HARD_FLOAT"
1.1 root 4528: "*
4529: {
4530: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
4531: return (operands[0] != pc_rtx) ? \"%*bc1f%?\\t%0\" : \"%*bc1t%?\\t%1\";
4532: }"
4533: [(set_attr "type" "branch")
4534: (set_attr "mode" "none")
4535: (set_attr "length" "1")])
4536:
4537: (define_insn "branch_fp_eq_rev"
4538: [(set (pc)
1.1.1.4 ! root 4539: (if_then_else (eq:CC_REV_FP (reg:CC_REV_FP 67)
1.1 root 4540: (const_int 0))
4541: (match_operand 0 "pc_or_label_operand" "")
4542: (match_operand 1 "pc_or_label_operand" "")))]
1.1.1.3 root 4543: "TARGET_HARD_FLOAT"
1.1 root 4544: "*
4545: {
4546: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
4547: return (operands[0] != pc_rtx) ? \"%*bc1t%?\\t%0\" : \"%*bc1f%?\\t%1\";
4548: }"
4549: [(set_attr "type" "branch")
4550: (set_attr "mode" "none")
4551: (set_attr "length" "1")])
4552:
4553:
4554: (define_insn "branch_zero"
4555: [(set (pc)
4556: (if_then_else (match_operator:SI 0 "cmp_op"
4557: [(match_operand:SI 1 "register_operand" "d")
4558: (const_int 0)])
4559: (match_operand 2 "pc_or_label_operand" "")
4560: (match_operand 3 "pc_or_label_operand" "")))]
4561: ""
4562: "*
4563: {
4564: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
4565: if (operands[2] != pc_rtx)
4566: { /* normal jump */
4567: switch (GET_CODE (operands[0]))
4568: {
4569: case EQ: return \"%*beq%?\\t%z1,%.,%2\";
4570: case NE: return \"%*bne%?\\t%z1,%.,%2\";
4571: case GTU: return \"%*bne%?\\t%z1,%.,%2\";
4572: case LEU: return \"%*beq%?\\t%z1,%.,%2\";
4573: case GEU: return \"%*j\\t%2\";
4574: case LTU: return \"%*bne%?\\t%.,%.,%2\";
4575: }
4576:
4577: return \"%*b%C0z%?\\t%z1,%2\";
4578: }
4579: else
4580: { /* inverted jump */
4581: switch (GET_CODE (operands[0]))
4582: {
4583: case EQ: return \"%*bne%?\\t%z1,%.,%3\";
4584: case NE: return \"%*beq%?\\t%z1,%.,%3\";
4585: case GTU: return \"%*beq%?\\t%z1,%.,%3\";
4586: case LEU: return \"%*bne%?\\t%z1,%.,%3\";
4587: case GEU: return \"%*beq%?\\t%.,%.,%3\";
4588: case LTU: return \"%*j\\t%3\";
4589: }
4590:
4591: return \"%*b%N0z%?\\t%z1,%3\";
4592: }
4593: }"
4594: [(set_attr "type" "branch")
4595: (set_attr "mode" "none")
4596: (set_attr "length" "1")])
4597:
4598:
1.1.1.3 root 4599: (define_insn "branch_zero_di"
4600: [(set (pc)
4601: (if_then_else (match_operator:DI 0 "cmp_op"
4602: [(match_operand:DI 1 "register_operand" "d")
4603: (const_int 0)])
4604: (match_operand 2 "pc_or_label_operand" "")
4605: (match_operand 3 "pc_or_label_operand" "")))]
4606: ""
4607: "*
4608: {
4609: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
4610: if (operands[2] != pc_rtx)
4611: { /* normal jump */
4612: switch (GET_CODE (operands[0]))
4613: {
4614: case EQ: return \"%*beq%?\\t%z1,%.,%2\";
4615: case NE: return \"%*bne%?\\t%z1,%.,%2\";
4616: case GTU: return \"%*bne%?\\t%z1,%.,%2\";
4617: case LEU: return \"%*beq%?\\t%z1,%.,%2\";
4618: case GEU: return \"%*j\\t%2\";
4619: case LTU: return \"%*bne%?\\t%.,%.,%2\";
4620: }
4621:
4622: return \"%*b%C0z%?\\t%z1,%2\";
4623: }
4624: else
4625: { /* inverted jump */
4626: switch (GET_CODE (operands[0]))
4627: {
4628: case EQ: return \"%*bne%?\\t%z1,%.,%3\";
4629: case NE: return \"%*beq%?\\t%z1,%.,%3\";
4630: case GTU: return \"%*beq%?\\t%z1,%.,%3\";
4631: case LEU: return \"%*bne%?\\t%z1,%.,%3\";
4632: case GEU: return \"%*beq%?\\t%.,%.,%3\";
4633: case LTU: return \"%*j\\t%3\";
4634: }
4635:
4636: return \"%*b%N0z%?\\t%z1,%3\";
4637: }
4638: }"
4639: [(set_attr "type" "branch")
4640: (set_attr "mode" "none")
4641: (set_attr "length" "1")])
4642:
4643:
1.1 root 4644: (define_insn "branch_equality"
4645: [(set (pc)
4646: (if_then_else (match_operator:SI 0 "equality_op"
4647: [(match_operand:SI 1 "register_operand" "d")
4648: (match_operand:SI 2 "register_operand" "d")])
4649: (match_operand 3 "pc_or_label_operand" "")
4650: (match_operand 4 "pc_or_label_operand" "")))]
4651: ""
4652: "*
4653: {
4654: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
4655: return (operands[3] != pc_rtx)
4656: ? \"%*b%C0%?\\t%z1,%z2,%3\"
4657: : \"%*b%N0%?\\t%z1,%z2,%4\";
4658: }"
4659: [(set_attr "type" "branch")
4660: (set_attr "mode" "none")
4661: (set_attr "length" "1")])
4662:
4663:
1.1.1.3 root 4664: (define_insn "branch_equality_di"
4665: [(set (pc)
4666: (if_then_else (match_operator:DI 0 "equality_op"
4667: [(match_operand:DI 1 "register_operand" "d")
4668: (match_operand:DI 2 "register_operand" "d")])
4669: (match_operand 3 "pc_or_label_operand" "")
4670: (match_operand 4 "pc_or_label_operand" "")))]
4671: ""
4672: "*
4673: {
4674: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
4675: return (operands[3] != pc_rtx)
4676: ? \"%*b%C0%?\\t%z1,%z2,%3\"
4677: : \"%*b%N0%?\\t%z1,%z2,%4\";
4678: }"
4679: [(set_attr "type" "branch")
4680: (set_attr "mode" "none")
4681: (set_attr "length" "1")])
4682:
4683:
1.1 root 4684: (define_expand "beq"
4685: [(set (pc)
4686: (if_then_else (eq:CC_EQ (cc0)
4687: (const_int 0))
4688: (label_ref (match_operand 0 "" ""))
4689: (pc)))]
4690: ""
4691: "
4692: {
4693: if (operands[0]) /* avoid unused code warning */
4694: {
4695: gen_conditional_branch (operands, EQ);
4696: DONE;
4697: }
4698: }")
4699:
4700: (define_expand "bne"
4701: [(set (pc)
4702: (if_then_else (ne:CC_EQ (cc0)
4703: (const_int 0))
4704: (label_ref (match_operand 0 "" ""))
4705: (pc)))]
4706: ""
4707: "
4708: {
4709: if (operands[0]) /* avoid unused code warning */
4710: {
4711: gen_conditional_branch (operands, NE);
4712: DONE;
4713: }
4714: }")
4715:
4716: (define_expand "bgt"
4717: [(set (pc)
4718: (if_then_else (gt:CC (cc0)
4719: (const_int 0))
4720: (label_ref (match_operand 0 "" ""))
4721: (pc)))]
4722: ""
4723: "
4724: {
4725: if (operands[0]) /* avoid unused code warning */
4726: {
4727: gen_conditional_branch (operands, GT);
4728: DONE;
4729: }
4730: }")
4731:
4732: (define_expand "bge"
4733: [(set (pc)
4734: (if_then_else (ge:CC (cc0)
4735: (const_int 0))
4736: (label_ref (match_operand 0 "" ""))
4737: (pc)))]
4738: ""
4739: "
4740: {
4741: if (operands[0]) /* avoid unused code warning */
4742: {
4743: gen_conditional_branch (operands, GE);
4744: DONE;
4745: }
4746: }")
4747:
4748: (define_expand "blt"
4749: [(set (pc)
4750: (if_then_else (lt:CC (cc0)
4751: (const_int 0))
4752: (label_ref (match_operand 0 "" ""))
4753: (pc)))]
4754: ""
4755: "
4756: {
4757: if (operands[0]) /* avoid unused code warning */
4758: {
4759: gen_conditional_branch (operands, LT);
4760: DONE;
4761: }
4762: }")
4763:
4764: (define_expand "ble"
4765: [(set (pc)
4766: (if_then_else (le:CC (cc0)
4767: (const_int 0))
4768: (label_ref (match_operand 0 "" ""))
4769: (pc)))]
4770: ""
4771: "
4772: {
4773: if (operands[0]) /* avoid unused code warning */
4774: {
4775: gen_conditional_branch (operands, LE);
4776: DONE;
4777: }
4778: }")
4779:
4780: (define_expand "bgtu"
4781: [(set (pc)
4782: (if_then_else (gtu:CC (cc0)
4783: (const_int 0))
4784: (label_ref (match_operand 0 "" ""))
4785: (pc)))]
4786: ""
4787: "
4788: {
4789: if (operands[0]) /* avoid unused code warning */
4790: {
4791: gen_conditional_branch (operands, GTU);
4792: DONE;
4793: }
4794: }")
4795:
4796: (define_expand "bgeu"
4797: [(set (pc)
4798: (if_then_else (geu:CC (cc0)
4799: (const_int 0))
4800: (label_ref (match_operand 0 "" ""))
4801: (pc)))]
4802: ""
4803: "
4804: {
4805: if (operands[0]) /* avoid unused code warning */
4806: {
4807: gen_conditional_branch (operands, GEU);
4808: DONE;
4809: }
4810: }")
4811:
4812:
4813: (define_expand "bltu"
4814: [(set (pc)
4815: (if_then_else (ltu:CC (cc0)
4816: (const_int 0))
4817: (label_ref (match_operand 0 "" ""))
4818: (pc)))]
4819: ""
4820: "
4821: {
4822: if (operands[0]) /* avoid unused code warning */
4823: {
4824: gen_conditional_branch (operands, LTU);
4825: DONE;
4826: }
4827: }")
4828:
4829: (define_expand "bleu"
4830: [(set (pc)
4831: (if_then_else (leu:CC (cc0)
4832: (const_int 0))
4833: (label_ref (match_operand 0 "" ""))
4834: (pc)))]
4835: ""
4836: "
4837: {
4838: if (operands[0]) /* avoid unused code warning */
4839: {
4840: gen_conditional_branch (operands, LEU);
4841: DONE;
4842: }
4843: }")
4844:
4845:
4846: ;;
4847: ;; ....................
4848: ;;
4849: ;; SETTING A REGISTER FROM A COMPARISON
4850: ;;
4851: ;; ....................
4852:
4853: (define_expand "seq"
4854: [(set (match_operand:SI 0 "register_operand" "=d")
4855: (eq:SI (match_dup 1)
4856: (match_dup 2)))]
4857: ""
4858: "
4859: {
1.1.1.3 root 4860: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 4861: FAIL;
4862:
4863: /* set up operands from compare. */
4864: operands[1] = branch_cmp[0];
4865: operands[2] = branch_cmp[1];
4866:
1.1.1.3 root 4867: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 4868: {
4869: gen_int_relational (EQ, operands[0], operands[1], operands[2], (int *)0);
4870: DONE;
4871: }
4872:
4873: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
4874: operands[2] = force_reg (SImode, operands[2]);
4875:
4876: /* fall through and generate default code */
4877: }")
4878:
4879:
4880: (define_insn "seq_si_zero"
4881: [(set (match_operand:SI 0 "register_operand" "=d")
4882: (eq:SI (match_operand:SI 1 "register_operand" "d")
4883: (const_int 0)))]
4884: ""
4885: "sltu\\t%0,%1,1"
1.1.1.3 root 4886: [(set_attr "type" "arith")
1.1 root 4887: (set_attr "mode" "SI")
4888: (set_attr "length" "1")])
4889:
1.1.1.3 root 4890: (define_insn "seq_di_zero"
4891: [(set (match_operand:DI 0 "register_operand" "=d")
4892: (eq:DI (match_operand:DI 1 "register_operand" "d")
4893: (const_int 0)))]
4894: "TARGET_64BIT"
4895: "sltu\\t%0,%1,1"
4896: [(set_attr "type" "arith")
4897: (set_attr "mode" "DI")
4898: (set_attr "length" "1")])
4899:
1.1 root 4900: (define_insn "seq_si"
4901: [(set (match_operand:SI 0 "register_operand" "=d,d")
4902: (eq:SI (match_operand:SI 1 "register_operand" "%d,d")
4903: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
4904: "TARGET_DEBUG_C_MODE"
4905: "@
4906: xor\\t%0,%1,%2\;sltu\\t%0,%0,1
4907: xori\\t%0,%1,%2\;sltu\\t%0,%0,1"
1.1.1.3 root 4908: [(set_attr "type" "arith")
1.1 root 4909: (set_attr "mode" "SI")
4910: (set_attr "length" "2")])
4911:
4912: (define_split
4913: [(set (match_operand:SI 0 "register_operand" "")
4914: (eq:SI (match_operand:SI 1 "register_operand" "")
4915: (match_operand:SI 2 "uns_arith_operand" "")))]
4916: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE
4917: && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)"
4918: [(set (match_dup 0)
4919: (xor:SI (match_dup 1)
4920: (match_dup 2)))
4921: (set (match_dup 0)
4922: (ltu:SI (match_dup 0)
4923: (const_int 1)))]
4924: "")
4925:
1.1.1.3 root 4926: (define_insn "seq_di"
4927: [(set (match_operand:DI 0 "register_operand" "=d,d")
4928: (eq:DI (match_operand:DI 1 "register_operand" "%d,d")
4929: (match_operand:DI 2 "uns_arith_operand" "d,K")))]
4930: "TARGET_64BIT && TARGET_DEBUG_C_MODE"
4931: "@
4932: xor\\t%0,%1,%2\;sltu\\t%0,%0,1
4933: xori\\t%0,%1,%2\;sltu\\t%0,%0,1"
4934: [(set_attr "type" "arith")
4935: (set_attr "mode" "DI")
4936: (set_attr "length" "2")])
4937:
4938: (define_split
4939: [(set (match_operand:DI 0 "register_operand" "")
4940: (eq:DI (match_operand:DI 1 "register_operand" "")
4941: (match_operand:DI 2 "uns_arith_operand" "")))]
4942: "TARGET_64BIT && TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE
4943: && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)"
4944: [(set (match_dup 0)
4945: (xor:DI (match_dup 1)
4946: (match_dup 2)))
4947: (set (match_dup 0)
4948: (ltu:DI (match_dup 0)
4949: (const_int 1)))]
4950: "")
4951:
1.1 root 4952: (define_expand "sne"
4953: [(set (match_operand:SI 0 "register_operand" "=d")
4954: (ne:SI (match_dup 1)
4955: (match_dup 2)))]
4956: ""
4957: "
4958: {
1.1.1.3 root 4959: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 4960: FAIL;
4961:
4962: /* set up operands from compare. */
4963: operands[1] = branch_cmp[0];
4964: operands[2] = branch_cmp[1];
4965:
1.1.1.3 root 4966: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 4967: {
4968: gen_int_relational (NE, operands[0], operands[1], operands[2], (int *)0);
4969: DONE;
4970: }
4971:
4972: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
4973: operands[2] = force_reg (SImode, operands[2]);
4974:
4975: /* fall through and generate default code */
4976: }")
4977:
4978: (define_insn "sne_si_zero"
4979: [(set (match_operand:SI 0 "register_operand" "=d")
4980: (ne:SI (match_operand:SI 1 "register_operand" "d")
4981: (const_int 0)))]
4982: ""
4983: "sltu\\t%0,%.,%1"
1.1.1.3 root 4984: [(set_attr "type" "arith")
1.1 root 4985: (set_attr "mode" "SI")
4986: (set_attr "length" "1")])
4987:
1.1.1.3 root 4988: (define_insn "sne_di_zero"
4989: [(set (match_operand:DI 0 "register_operand" "=d")
4990: (ne:DI (match_operand:DI 1 "register_operand" "d")
4991: (const_int 0)))]
4992: "TARGET_64BIT"
4993: "sltu\\t%0,%.,%1"
4994: [(set_attr "type" "arith")
4995: (set_attr "mode" "DI")
4996: (set_attr "length" "1")])
4997:
1.1 root 4998: (define_insn "sne_si"
4999: [(set (match_operand:SI 0 "register_operand" "=d,d")
5000: (ne:SI (match_operand:SI 1 "register_operand" "%d,d")
5001: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
5002: "TARGET_DEBUG_C_MODE"
5003: "@
5004: xor\\t%0,%1,%2\;sltu\\t%0,%.,%0
5005: xori\\t%0,%1,%x2\;sltu\\t%0,%.,%0"
1.1.1.3 root 5006: [(set_attr "type" "arith")
1.1 root 5007: (set_attr "mode" "SI")
5008: (set_attr "length" "2")])
5009:
5010: (define_split
5011: [(set (match_operand:SI 0 "register_operand" "")
5012: (ne:SI (match_operand:SI 1 "register_operand" "")
5013: (match_operand:SI 2 "uns_arith_operand" "")))]
5014: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE
5015: && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)"
5016: [(set (match_dup 0)
1.1.1.3 root 5017: (xor:SI (match_dup 1)
5018: (match_dup 2)))
5019: (set (match_dup 0)
5020: (gtu:SI (match_dup 0)
5021: (const_int 0)))]
5022: "")
5023:
5024: (define_insn "sne_di"
5025: [(set (match_operand:DI 0 "register_operand" "=d,d")
5026: (ne:DI (match_operand:DI 1 "register_operand" "%d,d")
5027: (match_operand:DI 2 "uns_arith_operand" "d,K")))]
5028: "TARGET_64BIT && TARGET_DEBUG_C_MODE"
5029: "@
5030: xor\\t%0,%1,%2\;sltu\\t%0,%.,%0
5031: xori\\t%0,%1,%x2\;sltu\\t%0,%.,%0"
5032: [(set_attr "type" "arith")
5033: (set_attr "mode" "DI")
5034: (set_attr "length" "2")])
5035:
5036: (define_split
5037: [(set (match_operand:DI 0 "register_operand" "")
5038: (ne:DI (match_operand:DI 1 "register_operand" "")
5039: (match_operand:DI 2 "uns_arith_operand" "")))]
5040: "TARGET_64BIT && TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE
5041: && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)"
5042: [(set (match_dup 0)
5043: (xor:DI (match_dup 1)
1.1 root 5044: (match_dup 2)))
5045: (set (match_dup 0)
1.1.1.3 root 5046: (gtu:DI (match_dup 0)
1.1 root 5047: (const_int 0)))]
5048: "")
5049:
5050: (define_expand "sgt"
5051: [(set (match_operand:SI 0 "register_operand" "=d")
5052: (gt:SI (match_dup 1)
5053: (match_dup 2)))]
5054: ""
5055: "
5056: {
1.1.1.3 root 5057: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 5058: FAIL;
5059:
5060: /* set up operands from compare. */
5061: operands[1] = branch_cmp[0];
5062: operands[2] = branch_cmp[1];
5063:
1.1.1.3 root 5064: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 5065: {
5066: gen_int_relational (GT, operands[0], operands[1], operands[2], (int *)0);
5067: DONE;
5068: }
5069:
5070: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) != 0)
5071: operands[2] = force_reg (SImode, operands[2]);
5072:
5073: /* fall through and generate default code */
5074: }")
5075:
5076: (define_insn "sgt_si"
5077: [(set (match_operand:SI 0 "register_operand" "=d")
5078: (gt:SI (match_operand:SI 1 "register_operand" "d")
5079: (match_operand:SI 2 "reg_or_0_operand" "dJ")))]
5080: ""
5081: "slt\\t%0,%z2,%1"
1.1.1.3 root 5082: [(set_attr "type" "arith")
1.1 root 5083: (set_attr "mode" "SI")
5084: (set_attr "length" "1")])
5085:
1.1.1.3 root 5086: (define_insn "sgt_di"
5087: [(set (match_operand:DI 0 "register_operand" "=d")
5088: (gt:DI (match_operand:DI 1 "register_operand" "d")
5089: (match_operand:DI 2 "reg_or_0_operand" "dJ")))]
5090: "TARGET_64BIT"
5091: "slt\\t%0,%z2,%1"
5092: [(set_attr "type" "arith")
5093: (set_attr "mode" "DI")
5094: (set_attr "length" "1")])
5095:
1.1 root 5096: (define_expand "sge"
5097: [(set (match_operand:SI 0 "register_operand" "=d")
5098: (ge:SI (match_dup 1)
5099: (match_dup 2)))]
5100: ""
5101: "
5102: {
1.1.1.3 root 5103: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 5104: FAIL;
5105:
5106: /* set up operands from compare. */
5107: operands[1] = branch_cmp[0];
5108: operands[2] = branch_cmp[1];
5109:
1.1.1.3 root 5110: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 5111: {
5112: gen_int_relational (GE, operands[0], operands[1], operands[2], (int *)0);
5113: DONE;
5114: }
5115:
5116: /* fall through and generate default code */
5117: }")
5118:
5119: (define_insn "sge_si"
5120: [(set (match_operand:SI 0 "register_operand" "=d")
5121: (ge:SI (match_operand:SI 1 "register_operand" "d")
5122: (match_operand:SI 2 "arith_operand" "dI")))]
5123: "TARGET_DEBUG_C_MODE"
5124: "slt\\t%0,%1,%2\;xori\\t%0,%0,0x0001"
1.1.1.3 root 5125: [(set_attr "type" "arith")
1.1 root 5126: (set_attr "mode" "SI")
5127: (set_attr "length" "2")])
5128:
5129: (define_split
5130: [(set (match_operand:SI 0 "register_operand" "")
5131: (ge:SI (match_operand:SI 1 "register_operand" "")
5132: (match_operand:SI 2 "arith_operand" "")))]
5133: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
5134: [(set (match_dup 0)
5135: (lt:SI (match_dup 1)
5136: (match_dup 2)))
5137: (set (match_dup 0)
5138: (xor:SI (match_dup 0)
5139: (const_int 1)))]
5140: "")
5141:
1.1.1.3 root 5142: (define_insn "sge_di"
5143: [(set (match_operand:DI 0 "register_operand" "=d")
5144: (ge:DI (match_operand:DI 1 "register_operand" "d")
5145: (match_operand:DI 2 "arith_operand" "dI")))]
5146: "TARGET_64BIT && TARGET_DEBUG_C_MODE"
5147: "slt\\t%0,%1,%2\;xori\\t%0,%0,0x0001"
5148: [(set_attr "type" "arith")
5149: (set_attr "mode" "DI")
5150: (set_attr "length" "2")])
5151:
5152: (define_split
5153: [(set (match_operand:DI 0 "register_operand" "")
5154: (ge:DI (match_operand:DI 1 "register_operand" "")
5155: (match_operand:DI 2 "arith_operand" "")))]
5156: "TARGET_64BIT && TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
5157: [(set (match_dup 0)
5158: (lt:DI (match_dup 1)
5159: (match_dup 2)))
5160: (set (match_dup 0)
5161: (xor:DI (match_dup 0)
5162: (const_int 1)))]
5163: "")
5164:
1.1 root 5165: (define_expand "slt"
5166: [(set (match_operand:SI 0 "register_operand" "=d")
5167: (lt:SI (match_dup 1)
5168: (match_dup 2)))]
5169: ""
5170: "
5171: {
1.1.1.3 root 5172: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 5173: FAIL;
5174:
5175: /* set up operands from compare. */
5176: operands[1] = branch_cmp[0];
5177: operands[2] = branch_cmp[1];
5178:
1.1.1.3 root 5179: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 5180: {
5181: gen_int_relational (LT, operands[0], operands[1], operands[2], (int *)0);
5182: DONE;
5183: }
5184:
5185: /* fall through and generate default code */
5186: }")
5187:
5188: (define_insn "slt_si"
5189: [(set (match_operand:SI 0 "register_operand" "=d")
5190: (lt:SI (match_operand:SI 1 "register_operand" "d")
5191: (match_operand:SI 2 "arith_operand" "dI")))]
5192: ""
5193: "slt\\t%0,%1,%2"
1.1.1.3 root 5194: [(set_attr "type" "arith")
1.1 root 5195: (set_attr "mode" "SI")
5196: (set_attr "length" "1")])
5197:
1.1.1.3 root 5198: (define_insn "slt_di"
5199: [(set (match_operand:DI 0 "register_operand" "=d")
5200: (lt:DI (match_operand:DI 1 "register_operand" "d")
5201: (match_operand:DI 2 "arith_operand" "dI")))]
5202: "TARGET_64BIT"
5203: "slt\\t%0,%1,%2"
5204: [(set_attr "type" "arith")
5205: (set_attr "mode" "DI")
5206: (set_attr "length" "1")])
5207:
1.1 root 5208: (define_expand "sle"
5209: [(set (match_operand:SI 0 "register_operand" "=d")
5210: (le:SI (match_dup 1)
5211: (match_dup 2)))]
5212: ""
5213: "
5214: {
1.1.1.3 root 5215: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 5216: FAIL;
5217:
5218: /* set up operands from compare. */
5219: operands[1] = branch_cmp[0];
5220: operands[2] = branch_cmp[1];
5221:
1.1.1.3 root 5222: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 5223: {
5224: gen_int_relational (LE, operands[0], operands[1], operands[2], (int *)0);
5225: DONE;
5226: }
5227:
5228: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 32767)
5229: operands[2] = force_reg (SImode, operands[2]);
5230:
5231: /* fall through and generate default code */
5232: }")
5233:
5234: (define_insn "sle_si_const"
5235: [(set (match_operand:SI 0 "register_operand" "=d")
5236: (le:SI (match_operand:SI 1 "register_operand" "d")
5237: (match_operand:SI 2 "small_int" "I")))]
5238: "INTVAL (operands[2]) < 32767"
5239: "*
5240: {
5241: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2])+1);
5242: return \"slt\\t%0,%1,%2\";
5243: }"
1.1.1.3 root 5244: [(set_attr "type" "arith")
1.1 root 5245: (set_attr "mode" "SI")
5246: (set_attr "length" "1")])
5247:
1.1.1.3 root 5248: (define_insn "sle_di_const"
5249: [(set (match_operand:DI 0 "register_operand" "=d")
5250: (le:DI (match_operand:DI 1 "register_operand" "d")
5251: (match_operand:DI 2 "small_int" "I")))]
5252: "TARGET_64BIT && INTVAL (operands[2]) < 32767"
5253: "*
5254: {
5255: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2])+1);
5256: return \"slt\\t%0,%1,%2\";
5257: }"
5258: [(set_attr "type" "arith")
5259: (set_attr "mode" "DI")
5260: (set_attr "length" "1")])
5261:
1.1 root 5262: (define_insn "sle_si_reg"
5263: [(set (match_operand:SI 0 "register_operand" "=d")
5264: (le:SI (match_operand:SI 1 "register_operand" "d")
5265: (match_operand:SI 2 "register_operand" "d")))]
5266: "TARGET_DEBUG_C_MODE"
5267: "slt\\t%0,%z2,%1\;xori\\t%0,%0,0x0001"
1.1.1.3 root 5268: [(set_attr "type" "arith")
1.1 root 5269: (set_attr "mode" "SI")
5270: (set_attr "length" "2")])
5271:
5272: (define_split
5273: [(set (match_operand:SI 0 "register_operand" "")
5274: (le:SI (match_operand:SI 1 "register_operand" "")
5275: (match_operand:SI 2 "register_operand" "")))]
5276: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
5277: [(set (match_dup 0)
5278: (lt:SI (match_dup 2)
5279: (match_dup 1)))
5280: (set (match_dup 0)
5281: (xor:SI (match_dup 0)
5282: (const_int 1)))]
5283: "")
5284:
1.1.1.3 root 5285: (define_insn "sle_di_reg"
5286: [(set (match_operand:DI 0 "register_operand" "=d")
5287: (le:DI (match_operand:DI 1 "register_operand" "d")
5288: (match_operand:DI 2 "register_operand" "d")))]
5289: "TARGET_64BIT && TARGET_DEBUG_C_MODE"
5290: "slt\\t%0,%z2,%1\;xori\\t%0,%0,0x0001"
5291: [(set_attr "type" "arith")
5292: (set_attr "mode" "DI")
5293: (set_attr "length" "2")])
5294:
5295: (define_split
5296: [(set (match_operand:DI 0 "register_operand" "")
5297: (le:DI (match_operand:DI 1 "register_operand" "")
5298: (match_operand:DI 2 "register_operand" "")))]
5299: "TARGET_64BIT && TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
5300: [(set (match_dup 0)
5301: (lt:DI (match_dup 2)
5302: (match_dup 1)))
5303: (set (match_dup 0)
5304: (xor:DI (match_dup 0)
5305: (const_int 1)))]
5306: "")
5307:
1.1 root 5308: (define_expand "sgtu"
5309: [(set (match_operand:SI 0 "register_operand" "=d")
5310: (gtu:SI (match_dup 1)
5311: (match_dup 2)))]
5312: ""
5313: "
5314: {
1.1.1.3 root 5315: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 5316: FAIL;
5317:
5318: /* set up operands from compare. */
5319: operands[1] = branch_cmp[0];
5320: operands[2] = branch_cmp[1];
5321:
1.1.1.3 root 5322: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 5323: {
5324: gen_int_relational (GTU, operands[0], operands[1], operands[2], (int *)0);
5325: DONE;
5326: }
5327:
5328: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) != 0)
5329: operands[2] = force_reg (SImode, operands[2]);
5330:
5331: /* fall through and generate default code */
5332: }")
5333:
5334: (define_insn "sgtu_si"
5335: [(set (match_operand:SI 0 "register_operand" "=d")
5336: (gtu:SI (match_operand:SI 1 "register_operand" "d")
5337: (match_operand:SI 2 "reg_or_0_operand" "dJ")))]
5338: ""
5339: "sltu\\t%0,%z2,%1"
1.1.1.3 root 5340: [(set_attr "type" "arith")
1.1 root 5341: (set_attr "mode" "SI")
5342: (set_attr "length" "1")])
5343:
1.1.1.3 root 5344: (define_insn "sgtu_di"
5345: [(set (match_operand:DI 0 "register_operand" "=d")
5346: (gtu:DI (match_operand:DI 1 "register_operand" "d")
5347: (match_operand:DI 2 "reg_or_0_operand" "dJ")))]
5348: "TARGET_64BIT"
5349: "sltu\\t%0,%z2,%1"
5350: [(set_attr "type" "arith")
5351: (set_attr "mode" "DI")
5352: (set_attr "length" "1")])
5353:
1.1 root 5354: (define_expand "sgeu"
5355: [(set (match_operand:SI 0 "register_operand" "=d")
5356: (geu:SI (match_dup 1)
5357: (match_dup 2)))]
5358: ""
5359: "
5360: {
1.1.1.3 root 5361: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 5362: FAIL;
5363:
5364: /* set up operands from compare. */
5365: operands[1] = branch_cmp[0];
5366: operands[2] = branch_cmp[1];
5367:
1.1.1.3 root 5368: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 5369: {
5370: gen_int_relational (GEU, operands[0], operands[1], operands[2], (int *)0);
5371: DONE;
5372: }
5373:
5374: /* fall through and generate default code */
5375: }")
5376:
5377: (define_insn "sgeu_si"
5378: [(set (match_operand:SI 0 "register_operand" "=d")
5379: (geu:SI (match_operand:SI 1 "register_operand" "d")
5380: (match_operand:SI 2 "arith_operand" "dI")))]
5381: "TARGET_DEBUG_C_MODE"
5382: "sltu\\t%0,%1,%2\;xori\\t%0,%0,0x0001"
1.1.1.3 root 5383: [(set_attr "type" "arith")
1.1 root 5384: (set_attr "mode" "SI")
5385: (set_attr "length" "2")])
5386:
5387: (define_split
5388: [(set (match_operand:SI 0 "register_operand" "")
5389: (geu:SI (match_operand:SI 1 "register_operand" "")
5390: (match_operand:SI 2 "arith_operand" "")))]
5391: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
5392: [(set (match_dup 0)
5393: (ltu:SI (match_dup 1)
5394: (match_dup 2)))
5395: (set (match_dup 0)
5396: (xor:SI (match_dup 0)
5397: (const_int 1)))]
5398: "")
5399:
1.1.1.3 root 5400: (define_insn "sgeu_di"
5401: [(set (match_operand:DI 0 "register_operand" "=d")
5402: (geu:DI (match_operand:DI 1 "register_operand" "d")
5403: (match_operand:DI 2 "arith_operand" "dI")))]
5404: "TARGET_64BIT && TARGET_DEBUG_C_MODE"
5405: "sltu\\t%0,%1,%2\;xori\\t%0,%0,0x0001"
5406: [(set_attr "type" "arith")
5407: (set_attr "mode" "DI")
5408: (set_attr "length" "2")])
5409:
5410: (define_split
5411: [(set (match_operand:DI 0 "register_operand" "")
5412: (geu:DI (match_operand:DI 1 "register_operand" "")
5413: (match_operand:DI 2 "arith_operand" "")))]
5414: "TARGET_64BIT && TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
5415: [(set (match_dup 0)
5416: (ltu:DI (match_dup 1)
5417: (match_dup 2)))
5418: (set (match_dup 0)
5419: (xor:DI (match_dup 0)
5420: (const_int 1)))]
5421: "")
5422:
1.1 root 5423: (define_expand "sltu"
5424: [(set (match_operand:SI 0 "register_operand" "=d")
5425: (ltu:SI (match_dup 1)
5426: (match_dup 2)))]
5427: ""
5428: "
5429: {
1.1.1.3 root 5430: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 5431: FAIL;
5432:
5433: /* set up operands from compare. */
5434: operands[1] = branch_cmp[0];
5435: operands[2] = branch_cmp[1];
5436:
1.1.1.3 root 5437: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 5438: {
5439: gen_int_relational (LTU, operands[0], operands[1], operands[2], (int *)0);
5440: DONE;
5441: }
5442:
5443: /* fall through and generate default code */
5444: }")
5445:
5446: (define_insn "sltu_si"
5447: [(set (match_operand:SI 0 "register_operand" "=d")
5448: (ltu:SI (match_operand:SI 1 "register_operand" "d")
5449: (match_operand:SI 2 "arith_operand" "dI")))]
5450: ""
5451: "sltu\\t%0,%1,%2"
1.1.1.3 root 5452: [(set_attr "type" "arith")
1.1 root 5453: (set_attr "mode" "SI")
5454: (set_attr "length" "1")])
5455:
1.1.1.3 root 5456: (define_insn "sltu_di"
5457: [(set (match_operand:DI 0 "register_operand" "=d")
5458: (ltu:DI (match_operand:DI 1 "register_operand" "d")
5459: (match_operand:DI 2 "arith_operand" "dI")))]
5460: "TARGET_64BIT"
5461: "sltu\\t%0,%1,%2"
5462: [(set_attr "type" "arith")
5463: (set_attr "mode" "DI")
5464: (set_attr "length" "1")])
5465:
1.1 root 5466: (define_expand "sleu"
5467: [(set (match_operand:SI 0 "register_operand" "=d")
5468: (leu:SI (match_dup 1)
5469: (match_dup 2)))]
5470: ""
5471: "
5472: {
1.1.1.3 root 5473: if (branch_type != CMP_SI && (!TARGET_64BIT || branch_type != CMP_DI))
1.1 root 5474: FAIL;
5475:
5476: /* set up operands from compare. */
5477: operands[1] = branch_cmp[0];
5478: operands[2] = branch_cmp[1];
5479:
1.1.1.3 root 5480: if (TARGET_64BIT || !TARGET_DEBUG_C_MODE)
1.1 root 5481: {
5482: gen_int_relational (LEU, operands[0], operands[1], operands[2], (int *)0);
5483: DONE;
5484: }
5485:
5486: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 32767)
5487: operands[2] = force_reg (SImode, operands[2]);
5488:
5489: /* fall through and generate default code */
5490: }")
5491:
5492: (define_insn "sleu_si_const"
5493: [(set (match_operand:SI 0 "register_operand" "=d")
5494: (leu:SI (match_operand:SI 1 "register_operand" "d")
5495: (match_operand:SI 2 "small_int" "I")))]
5496: "INTVAL (operands[2]) < 32767"
5497: "*
5498: {
5499: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2])+1);
5500: return \"sltu\\t%0,%1,%2\";
5501: }"
1.1.1.3 root 5502: [(set_attr "type" "arith")
1.1 root 5503: (set_attr "mode" "SI")
5504: (set_attr "length" "1")])
5505:
1.1.1.3 root 5506: (define_insn "sleu_di_const"
5507: [(set (match_operand:DI 0 "register_operand" "=d")
5508: (leu:DI (match_operand:DI 1 "register_operand" "d")
5509: (match_operand:DI 2 "small_int" "I")))]
5510: "TARGET_64BIT && INTVAL (operands[2]) < 32767"
5511: "*
5512: {
5513: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2])+1);
5514: return \"sltu\\t%0,%1,%2\";
5515: }"
5516: [(set_attr "type" "arith")
5517: (set_attr "mode" "DI")
5518: (set_attr "length" "1")])
5519:
1.1 root 5520: (define_insn "sleu_si_reg"
5521: [(set (match_operand:SI 0 "register_operand" "=d")
5522: (leu:SI (match_operand:SI 1 "register_operand" "d")
5523: (match_operand:SI 2 "register_operand" "d")))]
5524: "TARGET_DEBUG_C_MODE"
5525: "sltu\\t%0,%z2,%1\;xori\\t%0,%0,0x0001"
1.1.1.3 root 5526: [(set_attr "type" "arith")
1.1 root 5527: (set_attr "mode" "SI")
5528: (set_attr "length" "2")])
5529:
5530: (define_split
5531: [(set (match_operand:SI 0 "register_operand" "")
5532: (leu:SI (match_operand:SI 1 "register_operand" "")
5533: (match_operand:SI 2 "register_operand" "")))]
5534: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
5535: [(set (match_dup 0)
5536: (ltu:SI (match_dup 2)
5537: (match_dup 1)))
5538: (set (match_dup 0)
5539: (xor:SI (match_dup 0)
5540: (const_int 1)))]
5541: "")
5542:
1.1.1.3 root 5543: (define_insn "sleu_di_reg"
5544: [(set (match_operand:DI 0 "register_operand" "=d")
5545: (leu:DI (match_operand:DI 1 "register_operand" "d")
5546: (match_operand:DI 2 "register_operand" "d")))]
5547: "TARGET_64BIT && TARGET_DEBUG_C_MODE"
5548: "sltu\\t%0,%z2,%1\;xori\\t%0,%0,0x0001"
5549: [(set_attr "type" "arith")
5550: (set_attr "mode" "DI")
5551: (set_attr "length" "2")])
5552:
5553: (define_split
5554: [(set (match_operand:DI 0 "register_operand" "")
5555: (leu:DI (match_operand:DI 1 "register_operand" "")
5556: (match_operand:DI 2 "register_operand" "")))]
5557: "TARGET_64BIT && TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
5558: [(set (match_dup 0)
5559: (ltu:DI (match_dup 2)
5560: (match_dup 1)))
5561: (set (match_dup 0)
5562: (xor:DI (match_dup 0)
5563: (const_int 1)))]
5564: "")
5565:
1.1 root 5566:
5567: ;;
5568: ;; ....................
5569: ;;
5570: ;; FLOATING POINT COMPARISONS
5571: ;;
5572: ;; ....................
5573:
5574: (define_insn "seq_df"
1.1.1.4 ! root 5575: [(set (reg:CC_FP 67)
1.1 root 5576: (eq:CC_FP (match_operand:DF 0 "register_operand" "f")
5577: (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 5578: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 5579: "*
5580: {
5581: rtx xoperands[10];
5582: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5583: xoperands[1] = operands[0];
5584: xoperands[2] = operands[1];
5585:
5586: return mips_fill_delay_slot (\"c.eq.d\\t%0,%1\", DELAY_FCMP, xoperands, insn);
5587: }"
5588: [(set_attr "type" "fcmp")
5589: (set_attr "mode" "FPSW")
5590: (set_attr "length" "1")])
5591:
5592: (define_insn "sne_df"
1.1.1.4 ! root 5593: [(set (reg:CC_REV_FP 67)
1.1 root 5594: (ne:CC_REV_FP (match_operand:DF 0 "register_operand" "f")
5595: (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 5596: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 5597: "*
5598: {
5599: rtx xoperands[10];
5600: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5601: xoperands[1] = operands[0];
5602: xoperands[2] = operands[1];
5603:
5604: return mips_fill_delay_slot (\"c.eq.d\\t%0,%1\", DELAY_FCMP, xoperands, insn);
5605: }"
5606: [(set_attr "type" "fcmp")
5607: (set_attr "mode" "FPSW")
5608: (set_attr "length" "1")])
5609:
5610: (define_insn "slt_df"
1.1.1.4 ! root 5611: [(set (reg:CC_FP 67)
1.1 root 5612: (lt:CC_FP (match_operand:DF 0 "register_operand" "f")
5613: (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 5614: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 5615: "*
5616: {
5617: rtx xoperands[10];
5618: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5619: xoperands[1] = operands[0];
5620: xoperands[2] = operands[1];
5621:
5622: return mips_fill_delay_slot (\"c.lt.d\\t%0,%1\", DELAY_FCMP, xoperands, insn);
5623: }"
5624: [(set_attr "type" "fcmp")
5625: (set_attr "mode" "FPSW")
5626: (set_attr "length" "1")])
5627:
5628: (define_insn "sle_df"
1.1.1.4 ! root 5629: [(set (reg:CC_FP 67)
1.1 root 5630: (le:CC_FP (match_operand:DF 0 "register_operand" "f")
5631: (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 5632: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 5633: "*
5634: {
5635: rtx xoperands[10];
5636: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5637: xoperands[1] = operands[0];
5638: xoperands[2] = operands[1];
5639:
5640: return mips_fill_delay_slot (\"c.le.d\\t%0,%1\", DELAY_FCMP, xoperands, insn);
5641: }"
5642: [(set_attr "type" "fcmp")
5643: (set_attr "mode" "FPSW")
5644: (set_attr "length" "1")])
5645:
5646: (define_insn "sgt_df"
1.1.1.4 ! root 5647: [(set (reg:CC_FP 67)
1.1 root 5648: (gt:CC_FP (match_operand:DF 0 "register_operand" "f")
5649: (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 5650: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 5651: "*
5652: {
5653: rtx xoperands[10];
5654: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5655: xoperands[1] = operands[0];
5656: xoperands[2] = operands[1];
5657:
5658: return mips_fill_delay_slot (\"c.lt.d\\t%1,%0\", DELAY_FCMP, xoperands, insn);
5659: }"
5660: [(set_attr "type" "fcmp")
5661: (set_attr "mode" "FPSW")
5662: (set_attr "length" "1")])
5663:
5664: (define_insn "sge_df"
1.1.1.4 ! root 5665: [(set (reg:CC_FP 67)
1.1 root 5666: (ge:CC_FP (match_operand:DF 0 "register_operand" "f")
5667: (match_operand:DF 1 "register_operand" "f")))]
1.1.1.4 ! root 5668: "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
1.1 root 5669: "*
5670: {
5671: rtx xoperands[10];
5672: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5673: xoperands[1] = operands[0];
5674: xoperands[2] = operands[1];
5675:
5676: return mips_fill_delay_slot (\"c.le.d\\t%1,%0\", DELAY_FCMP, xoperands, insn);
5677: }"
5678: [(set_attr "type" "fcmp")
5679: (set_attr "mode" "FPSW")
5680: (set_attr "length" "1")])
5681:
5682: (define_insn "seq_sf"
1.1.1.4 ! root 5683: [(set (reg:CC_FP 67)
1.1 root 5684: (eq:CC_FP (match_operand:SF 0 "register_operand" "f")
5685: (match_operand:SF 1 "register_operand" "f")))]
1.1.1.3 root 5686: "TARGET_HARD_FLOAT"
1.1 root 5687: "*
5688: {
5689: rtx xoperands[10];
5690: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5691: xoperands[1] = operands[0];
5692: xoperands[2] = operands[1];
5693:
5694: return mips_fill_delay_slot (\"c.eq.s\\t%0,%1\", DELAY_FCMP, xoperands, insn);
5695: }"
5696: [(set_attr "type" "fcmp")
5697: (set_attr "mode" "FPSW")
5698: (set_attr "length" "1")])
5699:
5700: (define_insn "sne_sf"
1.1.1.4 ! root 5701: [(set (reg:CC_REV_FP 67)
1.1 root 5702: (ne:CC_REV_FP (match_operand:SF 0 "register_operand" "f")
5703: (match_operand:SF 1 "register_operand" "f")))]
1.1.1.3 root 5704: "TARGET_HARD_FLOAT"
1.1 root 5705: "*
5706: {
5707: rtx xoperands[10];
5708: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5709: xoperands[1] = operands[0];
5710: xoperands[2] = operands[1];
5711:
5712: return mips_fill_delay_slot (\"c.eq.s\\t%0,%1\", DELAY_FCMP, xoperands, insn);
5713: }"
5714: [(set_attr "type" "fcmp")
5715: (set_attr "mode" "FPSW")
5716: (set_attr "length" "1")])
5717:
5718: (define_insn "slt_sf"
1.1.1.4 ! root 5719: [(set (reg:CC_FP 67)
1.1 root 5720: (lt:CC_FP (match_operand:SF 0 "register_operand" "f")
5721: (match_operand:SF 1 "register_operand" "f")))]
1.1.1.3 root 5722: "TARGET_HARD_FLOAT"
1.1 root 5723: "*
5724: {
5725: rtx xoperands[10];
5726: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5727: xoperands[1] = operands[0];
5728: xoperands[2] = operands[1];
5729:
5730: return mips_fill_delay_slot (\"c.lt.s\\t%0,%1\", DELAY_FCMP, xoperands, insn);
5731: }"
5732: [(set_attr "type" "fcmp")
5733: (set_attr "mode" "FPSW")
5734: (set_attr "length" "1")])
5735:
5736: (define_insn "sle_sf"
1.1.1.4 ! root 5737: [(set (reg:CC_FP 67)
1.1 root 5738: (le:CC_FP (match_operand:SF 0 "register_operand" "f")
5739: (match_operand:SF 1 "register_operand" "f")))]
1.1.1.3 root 5740: "TARGET_HARD_FLOAT"
1.1 root 5741: "*
5742: {
5743: rtx xoperands[10];
5744: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5745: xoperands[1] = operands[0];
5746: xoperands[2] = operands[1];
5747:
5748: return mips_fill_delay_slot (\"c.le.s\\t%0,%1\", DELAY_FCMP, xoperands, insn);
5749: }"
5750: [(set_attr "type" "fcmp")
5751: (set_attr "mode" "FPSW")
5752: (set_attr "length" "1")])
5753:
5754: (define_insn "sgt_sf"
1.1.1.4 ! root 5755: [(set (reg:CC_FP 67)
1.1 root 5756: (gt:CC_FP (match_operand:SF 0 "register_operand" "f")
5757: (match_operand:SF 1 "register_operand" "f")))]
1.1.1.3 root 5758: "TARGET_HARD_FLOAT"
1.1 root 5759: "*
5760: {
5761: rtx xoperands[10];
5762: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5763: xoperands[1] = operands[0];
5764: xoperands[2] = operands[1];
5765:
5766: return mips_fill_delay_slot (\"c.lt.s\\t%1,%0\", DELAY_FCMP, xoperands, insn);
5767: }"
5768: [(set_attr "type" "fcmp")
5769: (set_attr "mode" "FPSW")
5770: (set_attr "length" "1")])
5771:
5772: (define_insn "sge_sf"
1.1.1.4 ! root 5773: [(set (reg:CC_FP 67)
1.1 root 5774: (ge:CC_FP (match_operand:SF 0 "register_operand" "f")
5775: (match_operand:SF 1 "register_operand" "f")))]
1.1.1.3 root 5776: "TARGET_HARD_FLOAT"
1.1 root 5777: "*
5778: {
5779: rtx xoperands[10];
5780: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
5781: xoperands[1] = operands[0];
5782: xoperands[2] = operands[1];
5783:
5784: return mips_fill_delay_slot (\"c.le.s\\t%1,%0\", DELAY_FCMP, xoperands, insn);
5785: }"
5786: [(set_attr "type" "fcmp")
5787: (set_attr "mode" "FPSW")
5788: (set_attr "length" "1")])
5789:
5790:
5791: ;;
5792: ;; ....................
5793: ;;
5794: ;; UNCONDITIONAL BRANCHES
5795: ;;
5796: ;; ....................
5797:
5798: ;; Unconditional branches.
5799:
5800: (define_insn "jump"
5801: [(set (pc)
5802: (label_ref (match_operand 0 "" "")))]
5803: ""
5804: "*
5805: {
5806: if (GET_CODE (operands[0]) == REG)
5807: return \"%*j\\t%0\";
1.1.1.4 ! root 5808: /* ??? I don't know why this is necessary. This works around an
! 5809: assembler problem that appears when a label is defined, then referenced
! 5810: in a switch table, then used in a `j' instruction. */
! 5811: else if (ABI_64BIT && mips_isa >= 3)
! 5812: return \"%*b\\t%l0\";
! 5813: else
1.1 root 5814: return \"%*j\\t%l0\";
5815: }"
5816: [(set_attr "type" "jump")
5817: (set_attr "mode" "none")
5818: (set_attr "length" "1")])
5819:
1.1.1.3 root 5820: (define_expand "indirect_jump"
5821: [(set (pc) (match_operand 0 "register_operand" "d"))]
1.1 root 5822: ""
1.1.1.3 root 5823: "
5824: {
5825: rtx dest;
5826:
5827: if (operands[0]) /* eliminate unused code warnings */
5828: {
5829: dest = operands[0];
5830: if (GET_CODE (dest) != REG || GET_MODE (dest) != Pmode)
5831: operands[0] = copy_to_mode_reg (Pmode, dest);
5832:
5833: if (!TARGET_LONG64)
5834: emit_jump_insn (gen_indirect_jump_internal1 (operands[0]));
5835: else
5836: emit_jump_insn (gen_indirect_jump_internal2 (operands[0]));
5837:
5838: DONE;
5839: }
5840: }")
5841:
5842: (define_insn "indirect_jump_internal1"
5843: [(set (pc) (match_operand:SI 0 "register_operand" "d"))]
5844: "!TARGET_LONG64"
5845: "%*j\\t%0"
5846: [(set_attr "type" "jump")
5847: (set_attr "mode" "none")
5848: (set_attr "length" "1")])
5849:
5850: (define_insn "indirect_jump_internal2"
5851: [(set (pc) (match_operand:DI 0 "register_operand" "d"))]
5852: "TARGET_LONG64"
1.1 root 5853: "%*j\\t%0"
5854: [(set_attr "type" "jump")
5855: (set_attr "mode" "none")
5856: (set_attr "length" "1")])
5857:
1.1.1.3 root 5858: (define_expand "tablejump"
1.1 root 5859: [(set (pc)
1.1.1.3 root 5860: (match_operand 0 "register_operand" "d"))
1.1 root 5861: (use (label_ref (match_operand 1 "" "")))]
5862: ""
1.1.1.3 root 5863: "
5864: {
5865: rtx dest;
5866:
5867: if (operands[0]) /* eliminate unused code warnings */
5868: {
5869: if (GET_MODE (operands[0]) != Pmode)
5870: abort ();
5871:
5872: if (!TARGET_LONG64)
5873: emit_jump_insn (gen_tablejump_internal1 (operands[0], operands[1]));
5874: else
5875: emit_jump_insn (gen_tablejump_internal2 (operands[0], operands[1]));
5876:
5877: DONE;
5878: }
5879: }")
5880:
5881: (define_insn "tablejump_internal1"
5882: [(set (pc)
5883: (match_operand:SI 0 "register_operand" "d"))
5884: (use (label_ref (match_operand 1 "" "")))]
5885: "!TARGET_LONG64"
5886: "*
5887: {
5888: /* .cpadd expands to add REG,REG,$gp when pic, and nothing when not pic. */
1.1.1.4 ! root 5889: if (TARGET_ABICALLS && (! ABI_64BIT || mips_isa < 3))
1.1.1.3 root 5890: output_asm_insn (\".cpadd\\t%0\", operands);
5891: return \"%*j\\t%0\";
5892: }"
1.1 root 5893: [(set_attr "type" "jump")
5894: (set_attr "mode" "none")
1.1.1.3 root 5895: (set (attr "length")
5896: (if_then_else (eq_attr "abicalls" "yes")
5897: (const_int 2)
5898: (const_int 1)))])
5899:
5900: (define_insn "tablejump_internal2"
5901: [(set (pc)
5902: (match_operand:DI 0 "register_operand" "d"))
5903: (use (label_ref (match_operand 1 "" "")))]
5904: "TARGET_LONG64"
5905: "*
5906: {
5907: /* .cpdadd expands to dadd REG,REG,$gp when pic, and nothing when not pic. */
1.1.1.4 ! root 5908: /* ??? SGI as does not have a .cpdadd. */
! 5909: if (TARGET_ABICALLS && (! ABI_64BIT || mips_isa < 3))
! 5910: output_asm_insn (\".cpadd\\t%0\", operands);
1.1.1.3 root 5911: return \"%*j\\t%0\";
5912: }"
5913: [(set_attr "type" "jump")
5914: (set_attr "mode" "none")
5915: (set (attr "length")
5916: (if_then_else (eq_attr "abicalls" "yes")
5917: (const_int 2)
5918: (const_int 1)))])
1.1 root 5919:
5920: ;; Function return, only allow after optimization, so that we can
5921: ;; eliminate jumps to jumps if no stack space is used.
5922:
5923: ;; (define_expand "return"
5924: ;; [(set (pc) (reg:SI 31))]
5925: ;; "simple_epilogue_p ()"
5926: ;; "")
5927:
5928: (define_expand "return"
5929: [(parallel [(return)
5930: (use (reg:SI 31))])]
5931: "simple_epilogue_p ()"
5932: "")
5933:
5934: (define_insn "return_internal"
5935: [(parallel [(return)
5936: (use (match_operand:SI 0 "register_operand" "d"))])]
5937: ""
5938: "%*j\\t%0"
5939: [(set_attr "type" "jump")
5940: (set_attr "mode" "none")
5941: (set_attr "length" "1")])
5942:
1.1.1.3 root 5943: ;; Implement a switch statement when generating embedded PIC code.
5944: ;; Switches are implemented by `tablejump' when not using -membedded-pic.
5945:
5946: (define_expand "casesi"
5947: [(set (match_dup 5)
5948: (minus:SI (match_operand:SI 0 "register_operand" "d")
5949: (match_operand:SI 1 "arith_operand" "dI")))
5950: (set (cc0)
5951: (compare:CC (match_dup 5)
5952: (match_operand:SI 2 "arith_operand" "")))
5953: (set (pc)
5954: (if_then_else (gtu (cc0)
5955: (const_int 0))
5956: (label_ref (match_operand 4 "" ""))
5957: (pc)))
5958: (parallel
5959: [(set (pc)
5960: (mem:SI (plus:SI (mult:SI (match_dup 5)
5961: (const_int 4))
5962: (label_ref (match_operand 3 "" "")))))
5963: (clobber (match_scratch:SI 6 ""))
5964: (clobber (reg:SI 31))])]
5965: "TARGET_EMBEDDED_PIC"
5966: "
5967: {
5968: /* We need slightly different code for eight byte table entries. */
5969: if (TARGET_LONG64)
5970: abort ();
5971:
5972: if (operands[0])
5973: {
5974: rtx reg = gen_reg_rtx (SImode);
5975:
5976: /* If the index is too large, go to the default label. */
5977: emit_insn (gen_subsi3 (reg, operands[0], operands[1]));
5978: emit_insn (gen_cmpsi (reg, operands[2]));
5979: emit_insn (gen_bgtu (operands[4]));
5980:
5981: /* Do the PIC jump. */
5982: emit_insn (gen_casesi_internal (reg, operands[3], gen_reg_rtx (SImode)));
5983:
5984: DONE;
5985: }
5986: }")
5987:
5988: ;; An embedded PIC switch statement looks like this:
5989: ;; bal $LS1
5990: ;; sll $reg,$index,2
5991: ;; $LS1:
5992: ;; addu $reg,$reg,$31
5993: ;; lw $reg,$L1-$LS1($reg)
5994: ;; addu $reg,$reg,$31
5995: ;; j $reg
5996: ;; $L1:
5997: ;; .word case1-$LS1
5998: ;; .word case2-$LS1
5999: ;; ...
6000:
6001: (define_insn "casesi_internal"
6002: [(set (pc)
6003: (mem:SI (plus:SI (mult:SI (match_operand:SI 0 "register_operand" "d")
6004: (const_int 4))
6005: (label_ref (match_operand 1 "" "")))))
6006: (clobber (match_operand:SI 2 "register_operand" "d"))
6007: (clobber (reg:SI 31))]
6008: "TARGET_EMBEDDED_PIC"
6009: "*
6010: {
6011: output_asm_insn (\"%(bal\\t%S1\;sll\\t%0,2\\n%S1:\", operands);
6012: output_asm_insn (\"addu\\t%0,%0,$31%)\", operands);
6013: output_asm_insn (\"lw\\t%0,%1-%S1(%0)\;addu\\t%0,%0,$31\", operands);
6014: return \"j\\t%0\";
6015: }"
6016: [(set_attr "type" "jump")
6017: (set_attr "mode" "none")
6018: (set_attr "length" "6")])
6019:
1.1 root 6020:
6021: ;;
6022: ;; ....................
6023: ;;
6024: ;; Function prologue/epilogue
6025: ;;
6026: ;; ....................
6027: ;;
6028:
6029: (define_expand "prologue"
6030: [(const_int 1)]
6031: ""
6032: "
6033: {
6034: if (mips_isa >= 0) /* avoid unused code warnings */
6035: {
6036: mips_expand_prologue ();
6037: DONE;
6038: }
6039: }")
6040:
6041: ;; Block any insns from being moved before this point, since the
6042: ;; profiling call to mcount can use various registers that aren't
6043: ;; saved or used to pass arguments.
6044:
6045: (define_insn "blockage"
6046: [(unspec_volatile [(const_int 0)] 0)]
6047: ""
6048: ""
6049: [(set_attr "type" "unknown")
6050: (set_attr "mode" "none")
6051: (set_attr "length" "0")])
6052:
6053: ;; At present, don't expand the epilogue, reorg.c will clobber the
6054: ;; return register in compiling gen_lowpart (emit-rtl.c).
6055: ;;
6056: ;; (define_expand "epilogue"
6057: ;; [(const_int 2)]
6058: ;; ""
6059: ;; "
6060: ;; {
6061: ;; if (mips_isa >= 0) /* avoid unused code warnings */
6062: ;; {
6063: ;; mips_expand_epilogue ();
6064: ;; DONE;
6065: ;; }
6066: ;; }")
6067:
1.1.1.3 root 6068: ;; When generating embedded PIC code we need to get the address of the
6069: ;; current function. This specialized instruction does just that.
6070:
6071: (define_insn "get_fnaddr"
1.1.1.4 ! root 6072: [(set (match_operand 0 "register_operand" "=d")
1.1.1.3 root 6073: (unspec [(match_operand 1 "" "")] 1))
6074: (clobber (reg:SI 31))]
6075: "TARGET_EMBEDDED_PIC
6076: && GET_CODE (operands[1]) == SYMBOL_REF"
6077: "%($LF%= = . + 8\;bal\\t$LF%=\;la\\t%0,%1-$LF%=%)\;addu\\t%0,%0,$31"
6078: [(set_attr "type" "call")
6079: (set_attr "mode" "none")
6080: (set_attr "length" "4")])
6081:
1.1 root 6082:
6083: ;;
6084: ;; ....................
6085: ;;
6086: ;; FUNCTION CALLS
6087: ;;
6088: ;; ....................
6089:
6090: ;; calls.c now passes a third argument, make saber happy
6091:
6092: (define_expand "call"
6093: [(parallel [(call (match_operand 0 "memory_operand" "m")
6094: (match_operand 1 "" "i"))
6095: (clobber (reg:SI 31))
6096: (use (match_operand 2 "" "")) ;; next_arg_reg
6097: (use (match_operand 3 "" ""))])] ;; struct_value_size_rtx
6098: ""
6099: "
6100: {
6101: rtx addr;
6102:
6103: if (operands[0]) /* eliminate unused code warnings */
6104: {
6105: addr = XEXP (operands[0], 0);
6106: if ((GET_CODE (addr) != REG && (!CONSTANT_ADDRESS_P (addr) || TARGET_LONG_CALLS))
6107: || ! call_insn_operand (operands[0], VOIDmode))
6108: XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, addr);
6109:
6110: /* In order to pass small structures by value in registers
6111: compatibly with the MIPS compiler, we need to shift the value
6112: into the high part of the register. Function_arg has encoded
6113: a PARALLEL rtx, holding a vector of adjustments to be made
6114: as the next_arg_reg variable, so we split up the insns,
6115: and emit them separately. */
6116:
6117: if (operands[2] != (rtx)0 && GET_CODE (operands[2]) == PARALLEL)
6118: {
6119: rtvec adjust = XVEC (operands[2], 0);
6120: int num = GET_NUM_ELEM (adjust);
6121: int i;
6122:
6123: for (i = 0; i < num; i++)
6124: emit_insn (RTVEC_ELT (adjust, i));
6125: }
6126:
6127: emit_call_insn (gen_call_internal1 (operands[0], operands[1],
1.1.1.3 root 6128: gen_rtx (REG, SImode, GP_REG_FIRST + 31)));
1.1 root 6129: DONE;
6130: }
6131: }")
6132:
6133: (define_insn "call_internal1"
6134: [(call (match_operand 0 "call_insn_operand" "m")
6135: (match_operand 1 "" "i"))
6136: (clobber (match_operand:SI 2 "register_operand" "=d"))]
1.1.1.2 root 6137: "!TARGET_ABICALLS && !TARGET_LONG_CALLS"
1.1 root 6138: "*
6139: {
6140: register rtx target = XEXP (operands[0], 0);
6141:
6142: if (GET_CODE (target) == SYMBOL_REF)
6143: return \"%*jal\\t%0\";
6144:
6145: else if (GET_CODE (target) == CONST_INT)
6146: {
6147: operands[0] = target;
1.1.1.4 ! root 6148: return \"%[li\\t%@,%0\\n\\t%*jal\\t%2,%@%]\";
1.1 root 6149: }
6150:
6151: else
6152: {
6153: operands[0] = target;
6154: return \"%*jal\\t%2,%0\";
6155: }
6156: }"
6157: [(set_attr "type" "call")
6158: (set_attr "mode" "none")
6159: (set_attr "length" "1")])
6160:
6161: (define_insn "call_internal2"
1.1.1.2 root 6162: [(call (match_operand 0 "call_insn_operand" "m")
6163: (match_operand 1 "" "i"))
6164: (clobber (match_operand:SI 2 "register_operand" "=d"))]
6165: "TARGET_ABICALLS && !TARGET_LONG_CALLS"
6166: "*
6167: {
6168: register rtx target = XEXP (operands[0], 0);
6169:
6170: if (GET_CODE (target) == SYMBOL_REF)
6171: return \"jal\\t%0\";
6172:
6173: else if (GET_CODE (target) == CONST_INT)
6174: {
6175: operands[0] = target;
6176: return \"li\\t%^,%0\\n\\tjal\\t%2,%^\";
6177: }
6178:
6179: else
6180: {
6181: operands[0] = target;
6182: if (REGNO (target) != PIC_FUNCTION_ADDR_REGNUM)
6183: return \"move\\t%^,%0\\n\\tjal\\t%2,%^\";
6184: else
6185: return \"jal\\t%2,%0\";
6186: }
6187: }"
6188: [(set_attr "type" "call")
6189: (set_attr "mode" "none")
6190: (set_attr "length" "2")])
6191:
1.1.1.3 root 6192: (define_insn "call_internal3a"
1.1 root 6193: [(call (mem:SI (match_operand:SI 0 "register_operand" "r"))
6194: (match_operand 1 "" "i"))
6195: (clobber (match_operand:SI 2 "register_operand" "=d"))]
1.1.1.3 root 6196: "!TARGET_LONG64 && !TARGET_ABICALLS && TARGET_LONG_CALLS"
6197: "%*jal\\t%2,%0"
6198: [(set_attr "type" "call")
6199: (set_attr "mode" "none")
6200: (set_attr "length" "1")])
6201:
6202: (define_insn "call_internal3b"
6203: [(call (mem:DI (match_operand:DI 0 "register_operand" "r"))
6204: (match_operand 1 "" "i"))
6205: (clobber (match_operand:SI 2 "register_operand" "=d"))]
6206: "TARGET_LONG64 && !TARGET_ABICALLS && TARGET_LONG_CALLS"
1.1 root 6207: "%*jal\\t%2,%0"
6208: [(set_attr "type" "call")
6209: (set_attr "mode" "none")
6210: (set_attr "length" "1")])
6211:
1.1.1.3 root 6212: (define_insn "call_internal4a"
1.1.1.2 root 6213: [(call (mem:SI (match_operand:SI 0 "register_operand" "r"))
6214: (match_operand 1 "" "i"))
6215: (clobber (match_operand:SI 2 "register_operand" "=d"))]
1.1.1.3 root 6216: "!TARGET_LONG64 && TARGET_ABICALLS && TARGET_LONG_CALLS"
1.1.1.2 root 6217: "*
6218: {
6219: if (REGNO (operands[0]) != PIC_FUNCTION_ADDR_REGNUM)
6220: return \"move\\t%^,%0\\n\\tjal\\t%2,%^\";
6221: else
6222: return \"jal\\t%2,%0\";
6223: }"
6224: [(set_attr "type" "call")
6225: (set_attr "mode" "none")
6226: (set_attr "length" "2")])
6227:
1.1.1.3 root 6228: (define_insn "call_internal4b"
6229: [(call (mem:DI (match_operand:DI 0 "register_operand" "r"))
6230: (match_operand 1 "" "i"))
6231: (clobber (match_operand:SI 2 "register_operand" "=d"))]
6232: "TARGET_LONG64 && TARGET_ABICALLS && TARGET_LONG_CALLS"
6233: "*
6234: {
6235: if (REGNO (operands[0]) != PIC_FUNCTION_ADDR_REGNUM)
6236: return \"move\\t%^,%0\\n\\tjal\\t%2,%^\";
6237: else
6238: return \"jal\\t%2,%0\";
6239: }"
6240: [(set_attr "type" "call")
6241: (set_attr "mode" "none")
6242: (set_attr "length" "2")])
1.1 root 6243:
6244: ;; calls.c now passes a fourth argument, make saber happy
6245:
6246: (define_expand "call_value"
6247: [(parallel [(set (match_operand 0 "register_operand" "=df")
6248: (call (match_operand 1 "memory_operand" "m")
6249: (match_operand 2 "" "i")))
6250: (clobber (reg:SI 31))
6251: (use (match_operand 3 "" ""))])] ;; next_arg_reg
6252: ""
6253: "
6254: {
6255: rtx addr;
6256:
6257: if (operands[0]) /* eliminate unused code warning */
6258: {
6259: addr = XEXP (operands[1], 0);
6260: if ((GET_CODE (addr) != REG && (!CONSTANT_ADDRESS_P (addr) || TARGET_LONG_CALLS))
6261: || ! call_insn_operand (operands[1], VOIDmode))
6262: XEXP (operands[1], 0) = copy_to_mode_reg (Pmode, addr);
6263:
6264: /* In order to pass small structures by value in registers
6265: compatibly with the MIPS compiler, we need to shift the value
6266: into the high part of the register. Function_arg has encoded
6267: a PARALLEL rtx, holding a vector of adjustments to be made
6268: as the next_arg_reg variable, so we split up the insns,
6269: and emit them separately. */
6270:
6271: if (operands[3] != (rtx)0 && GET_CODE (operands[3]) == PARALLEL)
6272: {
6273: rtvec adjust = XVEC (operands[3], 0);
6274: int num = GET_NUM_ELEM (adjust);
6275: int i;
6276:
6277: for (i = 0; i < num; i++)
6278: emit_insn (RTVEC_ELT (adjust, i));
6279: }
6280:
6281: emit_call_insn (gen_call_value_internal1 (operands[0], operands[1], operands[2],
1.1.1.3 root 6282: gen_rtx (REG, SImode, GP_REG_FIRST + 31)));
1.1 root 6283:
6284: DONE;
6285: }
6286:
6287: }")
6288:
6289: (define_insn "call_value_internal1"
6290: [(set (match_operand 0 "register_operand" "=df")
6291: (call (match_operand 1 "call_insn_operand" "m")
6292: (match_operand 2 "" "i")))
6293: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.2 root 6294: "!TARGET_ABICALLS && !TARGET_LONG_CALLS"
1.1 root 6295: "*
6296: {
6297: register rtx target = XEXP (operands[1], 0);
6298:
6299: if (GET_CODE (target) == SYMBOL_REF)
6300: return \"%*jal\\t%1\";
6301:
6302: else if (GET_CODE (target) == CONST_INT)
6303: {
6304: operands[1] = target;
1.1.1.4 ! root 6305: return \"%[li\\t%@,%1\\n\\t%*jal\\t%3,%@%]\";
1.1 root 6306: }
6307:
6308: else
6309: {
6310: operands[1] = target;
6311: return \"%*jal\\t%3,%1\";
6312: }
6313: }"
6314: [(set_attr "type" "call")
6315: (set_attr "mode" "none")
6316: (set_attr "length" "1")])
6317:
6318: (define_insn "call_value_internal2"
6319: [(set (match_operand 0 "register_operand" "=df")
1.1.1.2 root 6320: (call (match_operand 1 "call_insn_operand" "m")
6321: (match_operand 2 "" "i")))
6322: (clobber (match_operand:SI 3 "register_operand" "=d"))]
6323: "TARGET_ABICALLS && !TARGET_LONG_CALLS"
6324: "*
6325: {
6326: register rtx target = XEXP (operands[1], 0);
6327:
6328: if (GET_CODE (target) == SYMBOL_REF)
6329: return \"jal\\t%1\";
6330:
6331: else if (GET_CODE (target) == CONST_INT)
6332: {
6333: operands[1] = target;
6334: return \"li\\t%^,%1\\n\\tjal\\t%3,%^\";
6335: }
6336:
6337: else
6338: {
6339: operands[1] = target;
6340: if (REGNO (target) != PIC_FUNCTION_ADDR_REGNUM)
6341: return \"move\\t%^,%1\\n\\tjal\\t%3,%^\";
6342: else
6343: return \"jal\\t%3,%1\";
6344: }
6345: }"
6346: [(set_attr "type" "call")
6347: (set_attr "mode" "none")
6348: (set_attr "length" "2")])
6349:
1.1.1.3 root 6350: (define_insn "call_value_internal3a"
1.1.1.2 root 6351: [(set (match_operand 0 "register_operand" "=df")
1.1 root 6352: (call (mem:SI (match_operand:SI 1 "register_operand" "r"))
6353: (match_operand 2 "" "i")))
6354: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 6355: "!TARGET_LONG64 && !TARGET_ABICALLS && TARGET_LONG_CALLS"
6356: "%*jal\\t%3,%1"
6357: [(set_attr "type" "call")
6358: (set_attr "mode" "none")
6359: (set_attr "length" "1")])
6360:
6361: (define_insn "call_value_internal3b"
6362: [(set (match_operand 0 "register_operand" "=df")
6363: (call (mem:DI (match_operand:DI 1 "register_operand" "r"))
6364: (match_operand 2 "" "i")))
6365: (clobber (match_operand:SI 3 "register_operand" "=d"))]
6366: "TARGET_LONG64 && !TARGET_ABICALLS && TARGET_LONG_CALLS"
1.1 root 6367: "%*jal\\t%3,%1"
6368: [(set_attr "type" "call")
6369: (set_attr "mode" "none")
6370: (set_attr "length" "1")])
6371:
1.1.1.3 root 6372: (define_insn "call_value_internal4a"
1.1.1.2 root 6373: [(set (match_operand 0 "register_operand" "=df")
6374: (call (mem:SI (match_operand:SI 1 "register_operand" "r"))
6375: (match_operand 2 "" "i")))
6376: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 6377: "!TARGET_LONG64 && TARGET_ABICALLS && TARGET_LONG_CALLS"
6378: "*
6379: {
6380: if (REGNO (operands[1]) != PIC_FUNCTION_ADDR_REGNUM)
6381: return \"move\\t%^,%1\\n\\tjal\\t%3,%^\";
6382: else
6383: return \"jal\\t%3,%1\";
6384: }"
6385: [(set_attr "type" "call")
6386: (set_attr "mode" "none")
6387: (set_attr "length" "2")])
6388:
6389: (define_insn "call_value_internal4b"
6390: [(set (match_operand 0 "register_operand" "=df")
6391: (call (mem:DI (match_operand:DI 1 "register_operand" "r"))
6392: (match_operand 2 "" "i")))
6393: (clobber (match_operand:SI 3 "register_operand" "=d"))]
6394: "TARGET_LONG64 && TARGET_ABICALLS && TARGET_LONG_CALLS"
1.1.1.2 root 6395: "*
6396: {
6397: if (REGNO (operands[1]) != PIC_FUNCTION_ADDR_REGNUM)
6398: return \"move\\t%^,%1\\n\\tjal\\t%3,%^\";
6399: else
6400: return \"jal\\t%3,%1\";
6401: }"
6402: [(set_attr "type" "call")
6403: (set_attr "mode" "none")
6404: (set_attr "length" "2")])
6405:
1.1 root 6406: ;; Call subroutine returning any type.
6407:
6408: (define_expand "untyped_call"
6409: [(parallel [(call (match_operand 0 "" "")
6410: (const_int 0))
6411: (match_operand 1 "" "")
6412: (match_operand 2 "" "")])]
6413: ""
6414: "
6415: {
6416: if (operands[0]) /* silence statement not reached warnings */
6417: {
6418: int i;
6419:
6420: emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
6421:
6422: for (i = 0; i < XVECLEN (operands[2], 0); i++)
6423: {
6424: rtx set = XVECEXP (operands[2], 0, i);
6425: emit_move_insn (SET_DEST (set), SET_SRC (set));
6426: }
6427:
6428: emit_insn (gen_blockage ());
6429: DONE;
6430: }
6431: }")
6432:
6433: ;;
6434: ;; ....................
6435: ;;
6436: ;; MISC.
6437: ;;
6438: ;; ....................
6439: ;;
6440:
6441: (define_insn "nop"
6442: [(const_int 0)]
6443: ""
6444: "%(nop%)"
6445: [(set_attr "type" "nop")
6446: (set_attr "mode" "none")
6447: (set_attr "length" "1")])
6448:
6449: (define_expand "probe"
6450: [(set (match_dup 0)
6451: (match_dup 1))]
6452: ""
6453: "
6454: {
6455: operands[0] = gen_reg_rtx (SImode);
6456: operands[1] = gen_rtx (MEM, SImode, stack_pointer_rtx);
6457: MEM_VOLATILE_P (operands[1]) = TRUE;
6458:
6459: /* fall through and generate default code */
6460: }")
1.1.1.4 ! root 6461:
! 6462: ;;
! 6463: ;; MIPS4 Conditional move instructions.
! 6464:
! 6465: (define_insn ""
! 6466: [(set (match_operand:SI 0 "register_operand" "=d,d")
! 6467: (if_then_else:SI
! 6468: (match_operator 4 "equality_op"
! 6469: [(match_operand:SI 1 "register_operand" "d,d")
! 6470: (const_int 0)])
! 6471: (match_operand:SI 2 "reg_or_0_operand" "dJ,0")
! 6472: (match_operand:SI 3 "reg_or_0_operand" "0,dJ")))]
! 6473: "mips_isa >= 4"
! 6474: "@
! 6475: mov%B4\\t%0,%z2,%1
! 6476: mov%b4\\t%0,%z3,%1"
! 6477: [(set_attr "type" "move")
! 6478: (set_attr "mode" "SI")])
! 6479:
! 6480: (define_insn ""
! 6481: [(set (match_operand:SI 0 "register_operand" "=d,d")
! 6482: (if_then_else:SI
! 6483: (match_operator 3 "equality_op" [(reg:CC_FP 67) (const_int 0)])
! 6484: (match_operand:SI 1 "reg_or_0_operand" "dJ,0")
! 6485: (match_operand:SI 2 "reg_or_0_operand" "0,dJ")))]
! 6486: "mips_isa >= 4"
! 6487: "@
! 6488: mov%T3\\t%0,%z1,$fcc0
! 6489: mov%t3\\t%0,%z2,$fcc0"
! 6490: [(set_attr "type" "move")
! 6491: (set_attr "mode" "SI")])
! 6492:
! 6493: (define_insn ""
! 6494: [(set (match_operand:DI 0 "register_operand" "=d,d")
! 6495: (if_then_else:DI
! 6496: (match_operator 4 "equality_op"
! 6497: [(match_operand:DI 1 "register_operand" "d,d")
! 6498: (const_int 0)])
! 6499: (match_operand:DI 2 "reg_or_0_operand" "dJ,0")
! 6500: (match_operand:DI 3 "reg_or_0_operand" "0,dJ")))]
! 6501: "mips_isa >= 4"
! 6502: "@
! 6503: mov%B4\\t%0,%z2,%1
! 6504: mov%b4\\t%0,%z3,%1"
! 6505: [(set_attr "type" "move")
! 6506: (set_attr "mode" "DI")])
! 6507:
! 6508: (define_insn ""
! 6509: [(set (match_operand:DI 0 "register_operand" "=d,d")
! 6510: (if_then_else:DI
! 6511: (match_operator 3 "equality_op" [(reg:CC_FP 67) (const_int 0)])
! 6512: (match_operand:DI 1 "reg_or_0_operand" "dJ,0")
! 6513: (match_operand:DI 2 "reg_or_0_operand" "0,dJ")))]
! 6514: "mips_isa >= 4"
! 6515: "@
! 6516: mov%T3\\t%0,%z1,$fcc0
! 6517: mov%t3\\t%0,%z2,$fcc0"
! 6518: [(set_attr "type" "move")
! 6519: (set_attr "mode" "DI")])
! 6520:
! 6521: (define_insn ""
! 6522: [(set (match_operand:SF 0 "register_operand" "=f,f")
! 6523: (if_then_else:SF
! 6524: (match_operator 4 "equality_op"
! 6525: [(match_operand:SI 1 "register_operand" "d,d")
! 6526: (const_int 0)])
! 6527: (match_operand:SF 2 "register_operand" "f,0")
! 6528: (match_operand:SF 3 "register_operand" "0,f")))]
! 6529: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 6530: "@
! 6531: mov%B4.s\\t%0,%2,%1
! 6532: mov%b4.s\\t%0,%3,%1"
! 6533: [(set_attr "type" "move")
! 6534: (set_attr "mode" "SF")])
! 6535:
! 6536: (define_insn ""
! 6537: [(set (match_operand:SF 0 "register_operand" "=f,f")
! 6538: (if_then_else:SF
! 6539: (match_operator 3 "equality_op" [(reg:CC_FP 67) (const_int 0)])
! 6540: (match_operand:SF 1 "register_operand" "f,0")
! 6541: (match_operand:SF 2 "register_operand" "0,f")))]
! 6542: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 6543: "@
! 6544: mov%T3.s\\t%0,%1,$fcc0
! 6545: mov%t3.s\\t%0,%2,$fcc0"
! 6546: [(set_attr "type" "move")
! 6547: (set_attr "mode" "SF")])
! 6548:
! 6549: (define_insn ""
! 6550: [(set (match_operand:DF 0 "register_operand" "=f,f")
! 6551: (if_then_else:DF
! 6552: (match_operator 4 "equality_op"
! 6553: [(match_operand:SI 1 "register_operand" "d,d")
! 6554: (const_int 0)])
! 6555: (match_operand:DF 2 "register_operand" "f,0")
! 6556: (match_operand:DF 3 "register_operand" "0,f")))]
! 6557: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 6558: "@
! 6559: mov%B4.d\\t%0,%2,%1
! 6560: mov%b4.d\\t%0,%3,%1"
! 6561: [(set_attr "type" "move")
! 6562: (set_attr "mode" "DF")])
! 6563:
! 6564: (define_insn ""
! 6565: [(set (match_operand:DF 0 "register_operand" "=f,f")
! 6566: (if_then_else:DF
! 6567: (match_operator 3 "equality_op" [(reg:CC_FP 67) (const_int 0)])
! 6568: (match_operand:DF 1 "register_operand" "f,0")
! 6569: (match_operand:DF 2 "register_operand" "0,f")))]
! 6570: "mips_isa >= 4 && TARGET_HARD_FLOAT"
! 6571: "@
! 6572: mov%T3.d\\t%0,%1,$fcc0
! 6573: mov%t3.d\\t%0,%2,$fcc0"
! 6574: [(set_attr "type" "move")
! 6575: (set_attr "mode" "DF")])
! 6576:
! 6577: ;; These are the main define_expand's used to make conditional moves.
! 6578:
! 6579: (define_expand "movsicc"
! 6580: [(set (match_dup 4) (match_operand 1 "comparison_operator" ""))
! 6581: (set (match_operand:SI 0 "register_operand" "")
! 6582: (if_then_else:SI (match_dup 5)
! 6583: (match_operand:SI 2 "reg_or_0_operand" "")
! 6584: (match_operand:SI 3 "reg_or_0_operand" "")))]
! 6585: "mips_isa >= 4"
! 6586: "
! 6587: {
! 6588: rtx op0 = branch_cmp[0];
! 6589: rtx op1 = branch_cmp[1];
! 6590: enum machine_mode mode = GET_MODE (branch_cmp[0]);
! 6591: enum rtx_code compare_code = GET_CODE (operands[1]);
! 6592: enum rtx_code move_code = NE;
! 6593:
! 6594: if (GET_MODE_CLASS (mode) != MODE_FLOAT)
! 6595: {
! 6596: switch (compare_code)
! 6597: {
! 6598: case EQ:
! 6599: compare_code = XOR;
! 6600: move_code = EQ;
! 6601: break;
! 6602: case NE:
! 6603: compare_code = XOR;
! 6604: break;
! 6605: case LT:
! 6606: break;
! 6607: case GE:
! 6608: compare_code = LT;
! 6609: move_code = EQ;
! 6610: break;
! 6611: case GT:
! 6612: compare_code = LT;
! 6613: op0 = force_reg (mode, branch_cmp[1]);
! 6614: op1 = branch_cmp[0];
! 6615: break;
! 6616: case LE:
! 6617: compare_code = LT;
! 6618: op0 = force_reg (mode, branch_cmp[1]);
! 6619: op1 = branch_cmp[0];
! 6620: move_code = EQ;
! 6621: break;
! 6622: case LTU:
! 6623: break;
! 6624: case GEU:
! 6625: compare_code = LTU;
! 6626: move_code = EQ;
! 6627: break;
! 6628: case GTU:
! 6629: compare_code = LTU;
! 6630: op0 = force_reg (mode, branch_cmp[1]);
! 6631: op1 = branch_cmp[0];
! 6632: break;
! 6633: case LEU:
! 6634: compare_code = LTU;
! 6635: op0 = force_reg (mode, branch_cmp[1]);
! 6636: op1 = branch_cmp[0];
! 6637: move_code = EQ;
! 6638: break;
! 6639: default:
! 6640: abort ();
! 6641: }
! 6642: }
! 6643: else
! 6644: {
! 6645: if (compare_code == NE)
! 6646: {
! 6647: /* ??? Perhaps we need to use CC_FP_REVmode here? */
! 6648: compare_code = EQ;
! 6649: move_code = EQ;
! 6650: }
! 6651: }
! 6652:
! 6653: if (mode == SImode || mode == DImode)
! 6654: {
! 6655: operands[1] = gen_rtx (compare_code, mode, op0, op1);
! 6656: operands[4] = gen_reg_rtx (mode);
! 6657: }
! 6658: else if (mode == SFmode || mode == DFmode)
! 6659: {
! 6660: operands[1] = gen_rtx (compare_code, CC_FPmode, op0, op1);
! 6661: operands[4] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
! 6662: }
! 6663:
! 6664: if (mode == DImode)
! 6665: operands[5] = gen_rtx (move_code, VOIDmode,
! 6666: gen_lowpart (SImode, operands[4]),
! 6667: CONST0_RTX (SImode));
! 6668: else
! 6669: operands[5] = gen_rtx (move_code, VOIDmode, operands[4],
! 6670: CONST0_RTX (SImode));
! 6671: }")
! 6672:
! 6673: ;; ??? Need movdicc, movsfcc, and movdfcc patterns. They should be
! 6674: ;; very similar to the above movsicc pattern.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.