|
|
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]
4: ;; Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
5:
6: ;; This file is part of GNU CC.
7:
8: ;; GNU CC is free software; you can redistribute it and/or modify
9: ;; it under the terms of the GNU General Public License as published by
10: ;; the Free Software Foundation; either version 2, or (at your option)
11: ;; any later version.
12:
13: ;; GNU CC is distributed in the hope that it will be useful,
14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16: ;; GNU General Public License for more details.
17:
18: ;; You should have received a copy of the GNU General Public License
19: ;; along with GNU CC; see the file COPYING. If not, write to
20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
21:
22:
23:
24: ;; ....................
25: ;;
26: ;; Attributes
27: ;;
28: ;; ....................
29:
30: ;; Classification of each insn.
31: ;; branch conditional branch
32: ;; jump unconditional jump
33: ;; call unconditional call
34: ;; load load instruction(s)
35: ;; store store instruction(s)
36: ;; move data movement within same register set
37: ;; xfer transfer to/from coprocessor
38: ;; hilo transfer of hi/lo registers
39: ;; arith integer arithmetic instruction
40: ;; darith double precision integer arithmetic instructions
41: ;; imul integer multiply
42: ;; idiv integer divide
43: ;; icmp integer compare
44: ;; fadd floating point add/subtract
45: ;; fmul floating point multiply
46: ;; fdiv floating point divide
47: ;; fabs floating point absolute value
48: ;; fneg floating point negation
49: ;; fcmp floating point compare
50: ;; fcvt floating point convert
51: ;; fsqrt floating point square root
52: ;; multi multiword sequence (or user asm statements)
53: ;; nop no operation
54:
55: (define_attr "type"
1.1.1.4 ! root 56: "unknown,branch,jump,call,load,store,move,xfer,hilo,arith,darith,imul,idiv,icmp,fadd,fmul,fdiv,fabs,fneg,fcmp,fcvt,fsqrt,multi,nop"
1.1 root 57: (const_string "unknown"))
58:
59: ;; Main data type used by the insn
1.1.1.3 root 60: (define_attr "mode" "unknown,none,QI,HI,SI,DI,SF,DF,FPSW" (const_string "unknown"))
1.1 root 61:
62: ;; # instructions (4 bytes each)
63: (define_attr "length" "" (const_int 1))
64:
1.1.1.2 root 65: ;; whether or not an instruction has a mandatory delay slot
1.1 root 66: (define_attr "dslot" "no,yes"
1.1.1.4 ! root 67: (if_then_else (eq_attr "type" "branch,jump,call,load,xfer,hilo,fcmp")
1.1 root 68: (const_string "yes")
69: (const_string "no")))
70:
1.1.1.3 root 71: ;; Attribute describing the processor. This attribute must match exactly
72: ;; with the processor_type enumeration in mips.h.
73:
1.1 root 74: ;; Attribute describing the processor
1.1.1.3 root 75: ;; (define_attr "cpu" "default,r3000,r6000,r4000"
76: ;; (const
77: ;; (cond [(eq (symbol_ref "mips_cpu") (symbol_ref "PROCESSOR_R3000")) (const_string "r3000")
78: ;; (eq (symbol_ref "mips_cpu") (symbol_ref "PROCESSOR_R4000")) (const_string "r4000")
79: ;; (eq (symbol_ref "mips_cpu") (symbol_ref "PROCESSOR_R6000")) (const_string "r6000")]
80: ;; (const_string "default"))))
81:
82: (define_attr "cpu" "default,r3000,r6000,r4000"
83: (const (symbol_ref "mips_cpu_attr")))
1.1 root 84:
85: ;; Attribute defining whether or not we can use the branch-likely instructions
86: ;; (MIPS ISA level 2)
87:
88: (define_attr "branch_likely" "no,yes"
1.1.1.2 root 89: (const
1.1 root 90: (if_then_else (ge (symbol_ref "mips_isa") (const_int 2))
91: (const_string "yes")
1.1.1.2 root 92: (const_string "no"))))
1.1 root 93:
94:
95: ;; Describe a user's asm statement.
96: (define_asm_attributes
97: [(set_attr "type" "multi")])
98:
99:
100:
101: ;; .........................
102: ;;
103: ;; Delay slots, can't describe load/fcmp/xfer delay slots here
104: ;;
105: ;; .........................
106:
107: (define_delay (eq_attr "type" "branch")
108: [(and (eq_attr "dslot" "no") (eq_attr "length" "1"))
109: (nil)
1.1.1.3 root 110: (and (eq_attr "branch_likely" "yes") (and (eq_attr "dslot" "no") (eq_attr "length" "1")))])
1.1 root 111:
112: (define_delay (eq_attr "type" "call,jump")
113: [(and (eq_attr "dslot" "no") (eq_attr "length" "1"))
114: (nil)
115: (nil)])
116:
117:
118:
119: ;; .........................
120: ;;
121: ;; Functional units
122: ;;
123: ;; .........................
124:
125: ; (define_function_unit NAME MULTIPLICITY SIMULTANEITY
1.1.1.4 ! root 126: ; TEST READY-DELAY ISSUE-DELAY [CONFLICT-LIST])
1.1 root 127:
128: ;; Make the default case (PROCESSOR_DEFAULT) handle the worst case
1.1.1.2 root 129:
130: (define_function_unit "memory" 1 0
1.1.1.4 ! root 131: (and (eq_attr "type" "load") (eq_attr "cpu" "!r3000"))
1.1.1.2 root 132: 3 0)
133:
134: (define_function_unit "memory" 1 0
1.1.1.4 ! root 135: (and (eq_attr "type" "load") (eq_attr "cpu" "r3000"))
1.1.1.2 root 136: 2 0)
137:
1.1.1.3 root 138: (define_function_unit "memory" 1 0 (eq_attr "type" "store") 1 0)
1.1.1.2 root 139:
1.1.1.3 root 140: (define_function_unit "addr" 1 0 (eq_attr "type" "fcmp") 2 0)
141:
142: (define_function_unit "memory" 1 0 (eq_attr "type" "xfer") 2 0)
143: (define_function_unit "memory" 1 0 (eq_attr "type" "hilo") 3 0)
1.1.1.2 root 144:
145: (define_function_unit "imuldiv" 1 1
146: (and (eq_attr "type" "imul") (eq_attr "cpu" "!r3000,r4000"))
1.1.1.4 ! root 147: 17 0)
1.1.1.2 root 148:
149: (define_function_unit "imuldiv" 1 1
150: (and (eq_attr "type" "imul") (eq_attr "cpu" "r3000"))
1.1.1.4 ! root 151: 12 0)
1.1.1.2 root 152:
153: (define_function_unit "imuldiv" 1 1
154: (and (eq_attr "type" "imul") (eq_attr "cpu" "r4000"))
1.1.1.4 ! root 155: 10 0)
1.1.1.2 root 156:
157: (define_function_unit "imuldiv" 1 1
158: (and (eq_attr "type" "idiv") (eq_attr "cpu" "!r3000,r4000"))
1.1.1.4 ! root 159: 38 0)
1.1.1.2 root 160:
161: (define_function_unit "imuldiv" 1 1
162: (and (eq_attr "type" "idiv") (eq_attr "cpu" "r3000"))
1.1.1.4 ! root 163: 35 0)
1.1.1.2 root 164:
165: (define_function_unit "imuldiv" 1 1
166: (and (eq_attr "type" "idiv") (eq_attr "cpu" "r4000"))
1.1.1.4 ! root 167: 69 0)
1.1.1.2 root 168:
169: (define_function_unit "adder" 1 1
170: (and (eq_attr "type" "fadd") (eq_attr "cpu" "!r3000,r6000"))
1.1.1.4 ! root 171: 4 0)
1.1.1.2 root 172:
173: (define_function_unit "adder" 1 1
174: (and (eq_attr "type" "fadd") (eq_attr "cpu" "r3000"))
1.1.1.4 ! root 175: 2 0)
1.1.1.2 root 176:
177: (define_function_unit "adder" 1 1
178: (and (eq_attr "type" "fadd") (eq_attr "cpu" "r6000"))
1.1.1.4 ! root 179: 3 0)
1.1.1.2 root 180:
1.1.1.3 root 181: (define_function_unit "adder" 1 1
1.1.1.2 root 182: (and (eq_attr "type" "fabs,fneg") (eq_attr "cpu" "!r3000"))
1.1.1.4 ! root 183: 2 0)
1.1.1.2 root 184:
1.1.1.3 root 185: (define_function_unit "adder" 1 1
1.1.1.2 root 186: (and (eq_attr "type" "fabs,fneg") (eq_attr "cpu" "r3000"))
1.1.1.4 ! root 187: 1 0)
1.1.1.2 root 188:
189: (define_function_unit "mult" 1 1
190: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "SF") (eq_attr "cpu" "!r3000,r6000")))
1.1.1.4 ! root 191: 7 0)
1.1.1.2 root 192:
193: (define_function_unit "mult" 1 1
194: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r3000")))
1.1.1.4 ! root 195: 4 0)
1.1.1.2 root 196:
197: (define_function_unit "mult" 1 1
198: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r6000")))
1.1.1.4 ! root 199: 5 0)
1.1.1.2 root 200:
201: (define_function_unit "mult" 1 1
202: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "DF") (eq_attr "cpu" "!r3000,r6000")))
1.1.1.4 ! root 203: 8 0)
1.1.1.2 root 204:
205: (define_function_unit "mult" 1 1
206: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r3000")))
1.1.1.4 ! root 207: 5 0)
1.1.1.2 root 208:
209: (define_function_unit "mult" 1 1
210: (and (eq_attr "type" "fmul") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r6000")))
1.1.1.4 ! root 211: 6 0)
1.1.1.2 root 212:
213: (define_function_unit "divide" 1 1
214: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "SF") (eq_attr "cpu" "!r3000,r6000")))
1.1.1.4 ! root 215: 23 0)
1.1.1.2 root 216:
217: (define_function_unit "divide" 1 1
218: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r3000")))
1.1.1.4 ! root 219: 12 0)
1.1.1.2 root 220:
221: (define_function_unit "divide" 1 1
222: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r6000")))
1.1.1.4 ! root 223: 15 0)
1.1.1.2 root 224:
225: (define_function_unit "divide" 1 1
226: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "DF") (eq_attr "cpu" "!r3000,r6000")))
1.1.1.4 ! root 227: 36 0)
1.1.1.2 root 228:
229: (define_function_unit "divide" 1 1
230: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r3000")))
1.1.1.4 ! root 231: 19 0)
1.1.1.2 root 232:
233: (define_function_unit "divide" 1 1
234: (and (eq_attr "type" "fdiv") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r6000")))
1.1.1.4 ! root 235: 16 0)
1.1.1.2 root 236:
1.1.1.4 ! root 237: (define_function_unit "divide" 1 1 (and (eq_attr "type" "fsqrt") (eq_attr "mode" "SF")) 54 0)
! 238: (define_function_unit "divide" 1 1 (and (eq_attr "type" "fsqrt") (eq_attr "mode" "DF")) 112 0)
1.1.1.3 root 239:
240:
241: ;; The following functional units do not use the cpu type, and use
242: ;; much less memory in genattrtab.c.
243:
1.1.1.4 ! root 244: ;; (define_function_unit "memory" 1 0 (eq_attr "type" "load") 3 0)
! 245: ;; (define_function_unit "memory" 1 0 (eq_attr "type" "store") 1 0)
1.1.1.3 root 246: ;;
1.1.1.4 ! root 247: ;; (define_function_unit "fp_comp" 1 0 (eq_attr "type" "fcmp") 2 0)
1.1.1.3 root 248: ;;
1.1.1.4 ! root 249: ;; (define_function_unit "transfer" 1 0 (eq_attr "type" "xfer") 2 0)
! 250: ;; (define_function_unit "transfer" 1 0 (eq_attr "type" "hilo") 3 0)
1.1.1.3 root 251: ;;
1.1.1.4 ! root 252: ;; (define_function_unit "imuldiv" 1 1 (eq_attr "type" "imul") 17 0)
! 253: ;; (define_function_unit "imuldiv" 1 1 (eq_attr "type" "idiv") 38 0)
1.1.1.3 root 254: ;;
1.1.1.4 ! root 255: ;; (define_function_unit "adder" 1 1 (eq_attr "type" "fadd") 4 0)
! 256: ;; (define_function_unit "adder" 1 1 (eq_attr "type" "fabs,fneg") 2 0)
1.1.1.3 root 257: ;;
1.1.1.4 ! root 258: ;; (define_function_unit "mult" 1 1 (and (eq_attr "type" "fmul") (eq_attr "mode" "SF")) 7 0)
! 259: ;; (define_function_unit "mult" 1 1 (and (eq_attr "type" "fmul") (eq_attr "mode" "DF")) 8 0)
1.1.1.3 root 260: ;;
1.1.1.4 ! root 261: ;; (define_function_unit "divide" 1 1 (and (eq_attr "type" "fdiv") (eq_attr "mode" "SF")) 23 0)
! 262: ;; (define_function_unit "divide" 1 1 (and (eq_attr "type" "fdiv") (eq_attr "mode" "DF")) 36 0)
1.1.1.3 root 263: ;;
1.1.1.4 ! root 264: ;; (define_function_unit "sqrt" 1 1 (and (eq_attr "type" "fsqrt") (eq_attr "mode" "SF")) 54 0)
! 265: ;; (define_function_unit "sqrt" 1 1 (and (eq_attr "type" "fsqrt") (eq_attr "mode" "DF")) 112 0)
1.1 root 266:
267:
268: ;;
269: ;; ....................
270: ;;
271: ;; ADDITION
272: ;;
273: ;; ....................
274: ;;
275:
276: (define_insn "adddf3"
277: [(set (match_operand:DF 0 "register_operand" "=f")
278: (plus:DF (match_operand:DF 1 "register_operand" "f")
279: (match_operand:DF 2 "register_operand" "f")))]
280: "TARGET_HARD_FLOAT"
281: "add.d\\t%0,%1,%2"
282: [(set_attr "type" "fadd")
283: (set_attr "mode" "DF")
284: (set_attr "length" "1")])
285:
286: (define_insn "addsf3"
287: [(set (match_operand:SF 0 "register_operand" "=f")
288: (plus:SF (match_operand:SF 1 "register_operand" "f")
289: (match_operand:SF 2 "register_operand" "f")))]
290: "TARGET_HARD_FLOAT"
291: "add.s\\t%0,%1,%2"
292: [(set_attr "type" "fadd")
293: (set_attr "mode" "SF")
294: (set_attr "length" "1")])
295:
1.1.1.4 ! root 296: (define_expand "addsi3"
1.1 root 297: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.4 ! root 298: (plus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
1.1 root 299: (match_operand:SI 2 "arith_operand" "dI")))]
300: ""
1.1.1.4 ! root 301: "
! 302: {
! 303: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == -32768)
! 304: operands[2] = force_reg (SImode, operands[2]);
! 305: }")
! 306:
! 307: (define_insn "addsi3_internal"
! 308: [(set (match_operand:SI 0 "register_operand" "=d")
! 309: (plus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
! 310: (match_operand:SI 2 "arith_operand" "dI")))]
! 311: "GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768"
1.1 root 312: "*
313: {
314: return (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
1.1.1.4 ! root 315: ? \"subu\\t%0,%z1,%n2\"
! 316: : \"addu\\t%0,%z1,%2\";
1.1 root 317: }"
318: [(set_attr "type" "arith")
319: (set_attr "mode" "SI")
320: (set_attr "length" "1")])
321:
322: (define_expand "adddi3"
323: [(parallel [(set (match_operand:DI 0 "register_operand" "")
324: (plus:DI (match_operand:DI 1 "register_operand" "")
325: (match_operand:DI 2 "arith_operand" "")))
326: (clobber (match_dup 3))])]
327: "!TARGET_DEBUG_G_MODE"
1.1.1.3 root 328: "
329: {
330: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == -32768)
331: operands[2] = force_reg (SImode, operands[2]);
332:
333: operands[3] = gen_reg_rtx (SImode);
334: }")
1.1 root 335:
336: (define_insn "adddi3_internal_1"
337: [(set (match_operand:DI 0 "register_operand" "=d,&d")
338: (plus:DI (match_operand:DI 1 "register_operand" "0,d")
339: (match_operand:DI 2 "register_operand" "d,d")))
340: (clobber (match_operand:SI 3 "register_operand" "=d,d"))]
341: "!TARGET_DEBUG_G_MODE"
342: "*
343: {
344: return (REGNO (operands[0]) == REGNO (operands[1])
345: && REGNO (operands[0]) == REGNO (operands[2]))
346: ? \"srl\\t%3,%L0,31\;sll\\t%M0,%M0,1\;sll\\t%L0,%L1,1\;addu\\t%M0,%M0,%3\"
347: : \"addu\\t%L0,%L1,%L2\;sltu\\t%3,%L0,%L2\;addu\\t%M0,%M1,%M2\;addu\\t%M0,%M0,%3\";
348: }"
1.1.1.3 root 349: [(set_attr "type" "darith")
350: (set_attr "mode" "DI")
351: (set_attr "length" "4")])
1.1 root 352:
353: (define_split
354: [(set (match_operand:DI 0 "register_operand" "")
355: (plus:DI (match_operand:DI 1 "register_operand" "")
356: (match_operand:DI 2 "register_operand" "")))
357: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 358: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 359: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
360: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
361: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))
362: && (REGNO (operands[0]) != REGNO (operands[1])
363: || REGNO (operands[0]) != REGNO (operands[2]))"
364:
365: [(set (subreg:SI (match_dup 0) 0)
366: (plus:SI (subreg:SI (match_dup 1) 0)
367: (subreg:SI (match_dup 2) 0)))
368:
369: (set (match_dup 3)
1.1.1.3 root 370: (ltu:SI (subreg:SI (match_dup 0) 0)
1.1 root 371: (subreg:SI (match_dup 2) 0)))
372:
373: (set (subreg:SI (match_dup 0) 1)
374: (plus:SI (subreg:SI (match_dup 1) 1)
375: (subreg:SI (match_dup 2) 1)))
376:
377: (set (subreg:SI (match_dup 0) 1)
378: (plus:SI (subreg:SI (match_dup 0) 1)
379: (match_dup 3)))]
380: "")
381:
382: (define_split
383: [(set (match_operand:DI 0 "register_operand" "")
384: (plus:DI (match_operand:DI 1 "register_operand" "")
385: (match_operand:DI 2 "register_operand" "")))
386: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 387: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 388: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
389: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
390: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))
391: && (REGNO (operands[0]) != REGNO (operands[1])
392: || REGNO (operands[0]) != REGNO (operands[2]))"
393:
394: [(set (subreg:SI (match_dup 0) 1)
395: (plus:SI (subreg:SI (match_dup 1) 1)
396: (subreg:SI (match_dup 2) 1)))
397:
398: (set (match_dup 3)
1.1.1.3 root 399: (ltu:SI (subreg:SI (match_dup 0) 1)
1.1 root 400: (subreg:SI (match_dup 2) 1)))
401:
402: (set (subreg:SI (match_dup 0) 0)
403: (plus:SI (subreg:SI (match_dup 1) 0)
404: (subreg:SI (match_dup 2) 0)))
405:
406: (set (subreg:SI (match_dup 0) 0)
407: (plus:SI (subreg:SI (match_dup 0) 0)
408: (match_dup 3)))]
409: "")
410:
411: (define_insn "adddi3_internal_2"
412: [(set (match_operand:DI 0 "register_operand" "=d,d,d")
413: (plus:DI (match_operand:DI 1 "register_operand" "%d,%d,%d")
414: (match_operand:DI 2 "small_int" "P,J,N")))
415: (clobber (match_operand:SI 3 "register_operand" "=d,d,d"))]
416: "!TARGET_DEBUG_G_MODE && INTVAL (operands[2]) != -32768"
417: "@
418: addu\\t%L0,%L1,%2\;sltu\\t%3,%L0,%2\;addu\\t%M0,%M1,%3
419: move\\t%L0,%L1\;move\\t%M0,%M1
420: subu\\t%L0,%L1,%n2\;sltu\\t%3,%L0,%2\;subu\\t%M0,%M1,1\;addu\\t%M0,%M0,%3"
1.1.1.3 root 421: [(set_attr "type" "darith")
422: (set_attr "mode" "DI")
1.1 root 423: (set_attr "length" "3,2,4")])
424:
425: (define_split
426: [(set (match_operand:DI 0 "register_operand" "")
427: (plus:DI (match_operand:DI 1 "register_operand" "")
428: (match_operand:DI 2 "small_int" "")))
429: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 430: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 431: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
432: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
433: && INTVAL (operands[2]) > 0"
434:
435: [(set (subreg:SI (match_dup 0) 0)
436: (plus:SI (subreg:SI (match_dup 1) 0)
437: (match_dup 2)))
438:
439: (set (match_dup 3)
1.1.1.3 root 440: (ltu:SI (subreg:SI (match_dup 0) 0)
1.1 root 441: (match_dup 2)))
442:
443: (set (subreg:SI (match_dup 0) 1)
444: (plus:SI (subreg:SI (match_dup 1) 1)
445: (match_dup 3)))]
446: "")
447:
448: (define_split
449: [(set (match_operand:DI 0 "register_operand" "")
450: (plus:DI (match_operand:DI 1 "register_operand" "")
451: (match_operand:DI 2 "small_int" "")))
452: (clobber (match_operand:SI 3 "register_operand" "=d"))]
1.1.1.3 root 453: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 454: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
455: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
456: && INTVAL (operands[2]) > 0"
457:
458: [(set (subreg:SI (match_dup 0) 1)
459: (plus:SI (subreg:SI (match_dup 1) 1)
460: (match_dup 2)))
461:
462: (set (match_dup 3)
1.1.1.3 root 463: (ltu:SI (subreg:SI (match_dup 0) 1)
1.1 root 464: (match_dup 2)))
465:
466: (set (subreg:SI (match_dup 0) 0)
467: (plus:SI (subreg:SI (match_dup 1) 0)
468: (match_dup 3)))]
469: "")
470:
471: ;;
472: ;; ....................
473: ;;
474: ;; SUBTRACTION
475: ;;
476: ;; ....................
477: ;;
478:
479: (define_insn "subdf3"
480: [(set (match_operand:DF 0 "register_operand" "=f")
481: (minus:DF (match_operand:DF 1 "register_operand" "f")
482: (match_operand:DF 2 "register_operand" "f")))]
483: "TARGET_HARD_FLOAT"
484: "sub.d\\t%0,%1,%2"
485: [(set_attr "type" "fadd")
486: (set_attr "mode" "DF")
487: (set_attr "length" "1")])
488:
489: (define_insn "subsf3"
490: [(set (match_operand:SF 0 "register_operand" "=f")
491: (minus:SF (match_operand:SF 1 "register_operand" "f")
492: (match_operand:SF 2 "register_operand" "f")))]
493: "TARGET_HARD_FLOAT"
494: "sub.s\\t%0,%1,%2"
495: [(set_attr "type" "fadd")
496: (set_attr "mode" "SF")
497: (set_attr "length" "1")])
498:
1.1.1.4 ! root 499: (define_expand "subsi3"
1.1 root 500: [(set (match_operand:SI 0 "register_operand" "=d")
501: (minus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
502: (match_operand:SI 2 "arith_operand" "dI")))]
503: ""
1.1.1.4 ! root 504: "
! 505: {
! 506: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == -32768)
! 507: operands[2] = force_reg (SImode, operands[2]);
! 508: }")
! 509:
! 510: (define_insn "subsi3_internal"
! 511: [(set (match_operand:SI 0 "register_operand" "=d")
! 512: (minus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
! 513: (match_operand:SI 2 "arith_operand" "dI")))]
! 514: "GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768"
1.1 root 515: "*
516: {
517: return (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
518: ? \"addu\\t%0,%z1,%n2\"
519: : \"subu\\t%0,%z1,%2\";
520: }"
521: [(set_attr "type" "arith")
522: (set_attr "mode" "SI")
523: (set_attr "length" "1")])
524:
525: (define_expand "subdi3"
526: [(parallel [(set (match_operand:DI 0 "register_operand" "=d")
527: (minus:DI (match_operand:DI 1 "register_operand" "d")
528: (match_operand:DI 2 "register_operand" "d")))
529: (clobber (match_dup 3))])]
530: "!TARGET_DEBUG_G_MODE"
531: "operands[3] = gen_reg_rtx (SImode);")
532:
533: (define_insn "subdi3_internal"
534: [(set (match_operand:DI 0 "register_operand" "=d")
535: (minus:DI (match_operand:DI 1 "register_operand" "d")
536: (match_operand:DI 2 "register_operand" "d")))
537: (clobber (match_operand:SI 3 "register_operand" "=d"))]
538: "!TARGET_DEBUG_G_MODE"
539: "sltu\\t%3,%L1,%L2\;subu\\t%L0,%L1,%L2\;subu\\t%M0,%M1,%M2\;subu\\t%M0,%M0,%3"
540: [(set_attr "type" "darith")
541: (set_attr "mode" "DI")
542: (set_attr "length" "4")])
543:
544: (define_split
545: [(set (match_operand:DI 0 "register_operand" "")
546: (minus:DI (match_operand:DI 1 "register_operand" "")
547: (match_operand:DI 2 "register_operand" "")))
548: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 549: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 550: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
551: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
552: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
553:
554: [(set (match_dup 3)
1.1.1.3 root 555: (ltu:SI (subreg:SI (match_dup 1) 0)
1.1.1.2 root 556: (subreg:SI (match_dup 2) 0)))
1.1 root 557:
558: (set (subreg:SI (match_dup 0) 0)
559: (minus:SI (subreg:SI (match_dup 1) 0)
560: (subreg:SI (match_dup 2) 0)))
561:
562: (set (subreg:SI (match_dup 0) 1)
563: (minus:SI (subreg:SI (match_dup 1) 1)
564: (subreg:SI (match_dup 2) 1)))
565:
566: (set (subreg:SI (match_dup 0) 1)
567: (minus:SI (subreg:SI (match_dup 0) 1)
568: (match_dup 3)))]
569: "")
570:
571: (define_split
572: [(set (match_operand:DI 0 "register_operand" "")
573: (minus:DI (match_operand:DI 1 "register_operand" "")
574: (match_operand:DI 2 "register_operand" "")))
575: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 576: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 577: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
578: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
579: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
580:
581: [(set (match_dup 3)
1.1.1.3 root 582: (ltu:SI (subreg:SI (match_dup 1) 1)
1.1.1.2 root 583: (subreg:SI (match_dup 2) 1)))
1.1 root 584:
585: (set (subreg:SI (match_dup 0) 1)
586: (minus:SI (subreg:SI (match_dup 1) 1)
587: (subreg:SI (match_dup 2) 1)))
588:
589: (set (subreg:SI (match_dup 0) 0)
590: (minus:SI (subreg:SI (match_dup 1) 0)
591: (subreg:SI (match_dup 2) 0)))
592:
593: (set (subreg:SI (match_dup 0) 0)
594: (minus:SI (subreg:SI (match_dup 0) 0)
595: (match_dup 3)))]
596: "")
597:
598: (define_insn "subdi3_internal_2"
599: [(set (match_operand:DI 0 "register_operand" "=d,d,d")
600: (minus:DI (match_operand:DI 1 "register_operand" "d,d,d")
601: (match_operand:DI 2 "small_int" "P,J,N")))
602: (clobber (match_operand:SI 3 "register_operand" "=d,d,d"))]
603: "!TARGET_DEBUG_G_MODE && INTVAL (operands[2]) != -32768"
604: "@
605: sltu\\t%3,%L1,%2\;subu\\t%L0,%L1,%2\;subu\\t%M0,%M1,%3
606: move\\t%L0,%L1\;move\\t%M0,%M1
607: sltu\\t%3,%L1,%2\;subu\\t%L0,%L1,%2\;subu\\t%M0,%M1,1\;subu\\t%M0,%M0,%3"
1.1.1.3 root 608: [(set_attr "type" "darith")
609: (set_attr "mode" "DI")
1.1 root 610: (set_attr "length" "3,2,4")])
611:
612: (define_split
613: [(set (match_operand:DI 0 "register_operand" "")
614: (minus:DI (match_operand:DI 1 "register_operand" "")
615: (match_operand:DI 2 "small_int" "")))
616: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 617: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 618: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
619: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
620: && INTVAL (operands[2]) > 0"
621:
622: [(set (match_dup 3)
1.1.1.3 root 623: (ltu:SI (subreg:SI (match_dup 1) 0)
1.1 root 624: (match_dup 2)))
625:
626: (set (subreg:SI (match_dup 0) 0)
627: (minus:SI (subreg:SI (match_dup 1) 0)
628: (match_dup 2)))
629:
630: (set (subreg:SI (match_dup 0) 1)
631: (minus:SI (subreg:SI (match_dup 1) 1)
632: (match_dup 3)))]
633: "")
634:
635: (define_split
636: [(set (match_operand:DI 0 "register_operand" "")
637: (minus:DI (match_operand:DI 1 "register_operand" "")
638: (match_operand:DI 2 "small_int" "")))
639: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 640: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 641: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
642: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
643: && INTVAL (operands[2]) > 0"
644:
645: [(set (match_dup 3)
1.1.1.3 root 646: (ltu:SI (subreg:SI (match_dup 1) 1)
1.1 root 647: (match_dup 2)))
648:
649: (set (subreg:SI (match_dup 0) 1)
650: (minus:SI (subreg:SI (match_dup 1) 1)
651: (match_dup 2)))
652:
653: (set (subreg:SI (match_dup 0) 0)
654: (minus:SI (subreg:SI (match_dup 1) 0)
655: (match_dup 3)))]
656: "")
657:
658:
659: ;;
660: ;; ....................
661: ;;
662: ;; MULTIPLICATION
663: ;;
664: ;; ....................
665: ;;
666:
667: (define_insn "muldf3"
668: [(set (match_operand:DF 0 "register_operand" "=f")
669: (mult:DF (match_operand:DF 1 "register_operand" "f")
670: (match_operand:DF 2 "register_operand" "f")))]
671: "TARGET_HARD_FLOAT"
672: "mul.d\\t%0,%1,%2"
673: [(set_attr "type" "fmul")
674: (set_attr "mode" "DF")
675: (set_attr "length" "1")])
676:
677: (define_insn "mulsf3"
678: [(set (match_operand:SF 0 "register_operand" "=f")
679: (mult:SF (match_operand:SF 1 "register_operand" "f")
680: (match_operand:SF 2 "register_operand" "f")))]
681: "TARGET_HARD_FLOAT"
682: "mul.s\\t%0,%1,%2"
683: [(set_attr "type" "fmul")
684: (set_attr "mode" "SF")
685: (set_attr "length" "1")])
686:
687: (define_insn "mulsi3"
688: [(set (match_operand:SI 0 "register_operand" "=d")
689: (mult:SI (match_operand:SI 1 "register_operand" "d")
690: (match_operand:SI 2 "register_operand" "d")))
691: (clobber (reg:SI 64))
692: (clobber (reg:SI 65))]
693: ""
694: "*
695: {
696: rtx xoperands[10];
697:
698: xoperands[0] = operands[0];
699: xoperands[1] = gen_rtx (REG, SImode, LO_REGNUM);
700:
701: output_asm_insn (\"mult\\t%1,%2\", operands);
702: output_asm_insn (mips_move_1word (xoperands, insn), xoperands);
703: return \"\";
704: }"
705: [(set_attr "type" "imul")
706: (set_attr "mode" "SI")
707: (set_attr "length" "3")]) ;; mult + mflo + delay
708:
709: (define_split
710: [(set (match_operand:SI 0 "register_operand" "")
711: (mult:SI (match_operand:SI 1 "register_operand" "")
712: (match_operand:SI 2 "register_operand" "")))
713: (clobber (reg:SI 64))
714: (clobber (reg:SI 65))]
1.1.1.3 root 715: "!TARGET_DEBUG_D_MODE"
1.1 root 716: [(parallel [(set (reg:SI 65) ;; low register
717: (mult:SI (match_dup 1)
718: (match_dup 2)))
719: (clobber (reg:SI 64))])
720: (set (match_dup 0)
721: (reg:SI 65))]
722: "")
723:
724: (define_insn "mulsi3_internal"
725: [(set (reg:SI 65) ;; low register
726: (mult:SI (match_operand:SI 0 "register_operand" "d")
727: (match_operand:SI 1 "register_operand" "d")))
728: (clobber (reg:SI 64))]
729: ""
730: "mult\\t%0,%1"
731: [(set_attr "type" "imul")
732: (set_attr "mode" "SI")
733: (set_attr "length" "1")])
734:
735: (define_insn "mulsidi3"
736: [(set (match_operand:DI 0 "register_operand" "=d")
737: (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))
738: (sign_extend:DI (match_operand:SI 2 "register_operand" "d"))))
739: (clobber (reg:DI 64))]
740: ""
741: "*
742: {
743: rtx xoperands[10];
744:
745: xoperands[0] = operands[0];
746: xoperands[1] = gen_rtx (REG, DImode, MD_REG_FIRST);
747:
748: output_asm_insn (\"mult\\t%1,%2\", operands);
749: output_asm_insn (mips_move_2words (xoperands, insn), xoperands);
750: return \"\";
751: }"
752: [(set_attr "type" "imul")
753: (set_attr "mode" "SI")
754: (set_attr "length" "4")]) ;; mult + mflo + mfhi + delay
755:
756: (define_insn "umulsidi3"
757: [(set (match_operand:DI 0 "register_operand" "=d")
758: (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))
759: (zero_extend:DI (match_operand:SI 2 "register_operand" "d"))))
760: (clobber (reg:DI 64))]
761: ""
762: "*
763: {
764: rtx xoperands[10];
765:
766: xoperands[0] = operands[0];
767: xoperands[1] = gen_rtx (REG, DImode, MD_REG_FIRST);
768:
769: output_asm_insn (\"multu\\t%1,%2\", operands);
770: output_asm_insn (mips_move_2words (xoperands, insn), xoperands);
771: return \"\";
772: }"
773: [(set_attr "type" "imul")
774: (set_attr "mode" "SI")
775: (set_attr "length" "4")]) ;; mult + mflo + mfhi + delay
776:
777:
778: ;;
779: ;; ....................
780: ;;
781: ;; DIVISION and REMAINDER
782: ;;
783: ;; ....................
784: ;;
785:
786: (define_insn "divdf3"
787: [(set (match_operand:DF 0 "register_operand" "=f")
788: (div:DF (match_operand:DF 1 "register_operand" "f")
789: (match_operand:DF 2 "register_operand" "f")))]
790: "TARGET_HARD_FLOAT"
791: "div.d\\t%0,%1,%2"
792: [(set_attr "type" "fdiv")
793: (set_attr "mode" "DF")
794: (set_attr "length" "1")])
795:
796: (define_insn "divsf3"
797: [(set (match_operand:SF 0 "register_operand" "=f")
798: (div:SF (match_operand:SF 1 "register_operand" "f")
799: (match_operand:SF 2 "register_operand" "f")))]
800: "TARGET_HARD_FLOAT"
801: "div.s\\t%0,%1,%2"
802: [(set_attr "type" "fdiv")
803: (set_attr "mode" "SF")
804: (set_attr "length" "1")])
805:
806: ;; If optimizing, prefer the divmod functions over separate div and
807: ;; mod functions, since this will allow using one instruction for both
808: ;; the quotient and remainder. At present, the divmod is not moved out
809: ;; of loops if it is constant within the loop, so allow -mdebugc to
810: ;; use the old method of doing things.
811:
812: ;; 64 is the multiply/divide hi register
813: ;; 65 is the multiply/divide lo register
814:
815: (define_insn "divmodsi4"
1.1.1.3 root 816: [(set (match_operand:SI 0 "register_operand" "=d")
817: (div:SI (match_operand:SI 1 "register_operand" "d")
818: (match_operand:SI 2 "register_operand" "d")))
819: (set (match_operand:SI 3 "register_operand" "=d")
820: (mod:SI (match_dup 1)
821: (match_dup 2)))
822: (clobber (reg:SI 64))
823: (clobber (reg:SI 65))]
824: "optimize"
1.1 root 825: "*
826: {
827: if (find_reg_note (insn, REG_UNUSED, operands[3]))
828: return \"div\\t%0,%1,%2\";
829:
830: if (find_reg_note (insn, REG_UNUSED, operands[0]))
831: return \"rem\\t%3,%1,%2\";
832:
833: return \"div\\t%0,%1,%2\;mfhi\\t%3\";
834: }"
835: [(set_attr "type" "idiv")
836: (set_attr "mode" "SI")
837: (set_attr "length" "13")]) ;; various tests for dividing by 0 and such
838:
839: (define_insn "udivmodsi4"
1.1.1.3 root 840: [(set (match_operand:SI 0 "register_operand" "=d")
841: (udiv:SI (match_operand:SI 1 "register_operand" "d")
842: (match_operand:SI 2 "register_operand" "d")))
843: (set (match_operand:SI 3 "register_operand" "=d")
844: (umod:SI (match_dup 1)
845: (match_dup 2)))
846: (clobber (reg:SI 64))
847: (clobber (reg:SI 65))]
848: "optimize"
1.1 root 849: "*
850: {
851: if (find_reg_note (insn, REG_UNUSED, operands[3]))
852: return \"divu\\t%0,%1,%2\";
853:
854: if (find_reg_note (insn, REG_UNUSED, operands[0]))
855: return \"remu\\t%3,%1,%2\";
856:
857: return \"divu\\t%0,%1,%2\;mfhi\\t%3\";
858: }"
859: [(set_attr "type" "idiv")
860: (set_attr "mode" "SI")
861: (set_attr "length" "13")]) ;; various tests for dividing by 0 and such
862:
863: (define_insn "divsi3"
864: [(set (match_operand:SI 0 "register_operand" "=d")
865: (div:SI (match_operand:SI 1 "register_operand" "d")
866: (match_operand:SI 2 "register_operand" "d")))
867: (clobber (reg:SI 64))
868: (clobber (reg:SI 65))]
1.1.1.3 root 869: "!optimize"
1.1 root 870: "div\\t%0,%1,%2"
871: [(set_attr "type" "idiv")
872: (set_attr "mode" "SI")
873: (set_attr "length" "13")]) ;; various tests for dividing by 0 and such
874:
875: (define_insn "modsi3"
876: [(set (match_operand:SI 0 "register_operand" "=d")
877: (mod:SI (match_operand:SI 1 "register_operand" "d")
878: (match_operand:SI 2 "register_operand" "d")))
879: (clobber (reg:SI 64))
880: (clobber (reg:SI 65))]
1.1.1.3 root 881: "!optimize"
1.1 root 882: "rem\\t%0,%1,%2"
883: [(set_attr "type" "idiv")
884: (set_attr "mode" "SI")
885: (set_attr "length" "14")]) ;; various tests for dividing by 0 and such
886:
887: (define_insn "udivsi3"
888: [(set (match_operand:SI 0 "register_operand" "=d")
889: (udiv:SI (match_operand:SI 1 "register_operand" "d")
890: (match_operand:SI 2 "register_operand" "d")))
891: (clobber (reg:SI 64))
892: (clobber (reg:SI 65))]
1.1.1.3 root 893: "!optimize"
1.1 root 894: "divu\\t%0,%1,%2"
895: [(set_attr "type" "idiv")
896: (set_attr "mode" "SI")
897: (set_attr "length" "14")]) ;; various tests for dividing by 0 and such
898:
899: (define_insn "umodsi3"
900: [(set (match_operand:SI 0 "register_operand" "=d")
901: (umod:SI (match_operand:SI 1 "register_operand" "d")
902: (match_operand:SI 2 "register_operand" "d")))
903: (clobber (reg:SI 64))
904: (clobber (reg:SI 65))]
1.1.1.3 root 905: "!optimize"
1.1 root 906: "remu\\t%0,%1,%2"
907: [(set_attr "type" "idiv")
908: (set_attr "mode" "SI")
909: (set_attr "length" "14")]) ;; various tests for dividing by 0 and such
910:
911:
912: ;;
913: ;; ....................
914: ;;
915: ;; SQUARE ROOT
916: ;;
917: ;; ....................
918:
919: (define_insn "sqrtdf2"
920: [(set (match_operand:DF 0 "register_operand" "=f")
921: (sqrt:DF (match_operand:DF 1 "register_operand" "f")))]
922: "TARGET_HARD_FLOAT && HAVE_SQRT_P()"
923: "sqrt.d\\t%0,%1"
924: [(set_attr "type" "fabs")
925: (set_attr "mode" "DF")
926: (set_attr "length" "1")])
927:
928: (define_insn "sqrtsf2"
929: [(set (match_operand:SF 0 "register_operand" "=f")
930: (sqrt:SF (match_operand:SF 1 "register_operand" "f")))]
931: "TARGET_HARD_FLOAT && HAVE_SQRT_P()"
932: "sqrt.s\\t%0,%1"
933: [(set_attr "type" "fabs")
934: (set_attr "mode" "SF")
935: (set_attr "length" "1")])
936:
937:
938: ;;
939: ;; ....................
940: ;;
941: ;; ABSOLUTE VALUE
942: ;;
943: ;; ....................
944:
945: ;; Do not use the integer abs macro instruction, since that signals an
946: ;; exception on -2147483648 (sigh).
947:
948: (define_insn "abssi2"
949: [(set (match_operand:SI 0 "register_operand" "=d")
950: (abs:SI (match_operand:SI 1 "register_operand" "d")))]
951: ""
952: "*
953: {
954: dslots_jump_total++;
955: dslots_jump_filled++;
956: operands[2] = const0_rtx;
957:
958: return (REGNO (operands[0]) == REGNO (operands[1]))
959: ? \"bgez\\t%1,1f%#\\n\\tsubu\\t%0,%z2,%0\\n1:\"
960: : \"%(bgez\\t%1,1f\\n\\tmove\\t%0,%1\\n\\tsubu\\t%0,%z2,%0\\n1:%)\";
961: }"
962: [(set_attr "type" "multi")
963: (set_attr "mode" "SI")
964: (set_attr "length" "3")])
965:
966: (define_insn "absdf2"
967: [(set (match_operand:DF 0 "register_operand" "=f")
968: (abs:DF (match_operand:DF 1 "register_operand" "f")))]
969: "TARGET_HARD_FLOAT"
970: "abs.d\\t%0,%1"
971: [(set_attr "type" "fabs")
972: (set_attr "mode" "DF")
973: (set_attr "length" "1")])
974:
975: (define_insn "abssf2"
976: [(set (match_operand:SF 0 "register_operand" "=f")
977: (abs:SF (match_operand:SF 1 "register_operand" "f")))]
978: "TARGET_HARD_FLOAT"
979: "abs.s\\t%0,%1"
980: [(set_attr "type" "fabs")
981: (set_attr "mode" "SF")
982: (set_attr "length" "1")])
983:
984:
985: ;;
986: ;; ....................
987: ;;
988: ;; FIND FIRST BIT INSTRUCTION
989: ;;
990: ;; ....................
991: ;;
992:
993: (define_insn "ffssi2"
994: [(set (match_operand:SI 0 "register_operand" "=&d")
995: (ffs:SI (match_operand:SI 1 "register_operand" "d")))
1.1.1.4 ! root 996: (clobber (match_scratch:SI 2 "=&d"))
! 997: (clobber (match_scratch:SI 3 "=&d"))]
1.1 root 998: ""
999: "*
1000: {
1001: dslots_jump_total += 2;
1002: dslots_jump_filled += 2;
1003: operands[4] = const0_rtx;
1004:
1005: if (optimize && find_reg_note (insn, REG_DEAD, operands[1]))
1006: return \"%(\\
1007: move\\t%0,%z4\\n\\
1008: \\tbeq\\t%1,%z4,2f\\n\\
1009: 1:\\tand\\t%2,%1,0x0001\\n\\
1010: \\taddu\\t%0,%0,1\\n\\
1011: \\tbeq\\t%2,%z4,1b\\n\\
1012: \\tsrl\\t%1,%1,1\\n\\
1013: 2:%)\";
1014:
1015: return \"%(\\
1016: move\\t%0,%z4\\n\\
1017: \\tmove\\t%3,%1\\n\\
1018: \\tbeq\\t%3,%z4,2f\\n\\
1019: 1:\\tand\\t%2,%3,0x0001\\n\\
1020: \\taddu\\t%0,%0,1\\n\\
1021: \\tbeq\\t%2,%z4,1b\\n\\
1022: \\tsrl\\t%3,%3,1\\n\\
1023: 2:%)\";
1024: }"
1025: [(set_attr "type" "multi")
1026: (set_attr "mode" "SI")
1027: (set_attr "length" "6")])
1028:
1029:
1030: ;;
1031: ;; ....................
1032: ;;
1033: ;; NEGATION and ONE'S COMPLEMENT
1034: ;;
1035: ;; ....................
1036:
1037: (define_insn "negsi2"
1038: [(set (match_operand:SI 0 "register_operand" "=d")
1039: (neg:SI (match_operand:SI 1 "register_operand" "d")))]
1040: ""
1041: "*
1042: {
1043: operands[2] = const0_rtx;
1044: return \"subu\\t%0,%z2,%1\";
1045: }"
1046: [(set_attr "type" "arith")
1047: (set_attr "mode" "SI")
1048: (set_attr "length" "1")])
1049:
1050: (define_expand "negdi3"
1051: [(parallel [(set (match_operand:DI 0 "register_operand" "=d")
1052: (neg:DI (match_operand:DI 1 "register_operand" "d")))
1053: (clobber (match_dup 2))])]
1054: "!TARGET_DEBUG_G_MODE"
1055: "operands[2] = gen_reg_rtx (SImode);")
1056:
1057: (define_insn "negdi3_internal"
1058: [(set (match_operand:DI 0 "register_operand" "=d")
1059: (neg:DI (match_operand:DI 1 "register_operand" "d")))
1060: (clobber (match_operand:SI 2 "register_operand" "=d"))]
1061: "!TARGET_DEBUG_G_MODE"
1062: "*
1063: {
1064: operands[3] = const0_rtx;
1065: return \"subu\\t%L0,%z3,%L1\;subu\\t%M0,%z3,%M1\;sltu\\t%2,%z3,%L0\;subu\\t%M0,%M0,%2\";
1066: }"
1067: [(set_attr "type" "darith")
1068: (set_attr "mode" "DI")
1069: (set_attr "length" "4")])
1070:
1071: (define_insn "negdf2"
1072: [(set (match_operand:DF 0 "register_operand" "=f")
1073: (neg:DF (match_operand:DF 1 "register_operand" "f")))]
1074: "TARGET_HARD_FLOAT"
1075: "neg.d\\t%0,%1"
1076: [(set_attr "type" "fneg")
1077: (set_attr "mode" "DF")
1078: (set_attr "length" "1")])
1079:
1080: (define_insn "negsf2"
1081: [(set (match_operand:SF 0 "register_operand" "=f")
1082: (neg:SF (match_operand:SF 1 "register_operand" "f")))]
1083: "TARGET_HARD_FLOAT"
1084: "neg.s\\t%0,%1"
1085: [(set_attr "type" "fneg")
1086: (set_attr "mode" "SF")
1087: (set_attr "length" "1")])
1088:
1089: (define_insn "one_cmplsi2"
1090: [(set (match_operand:SI 0 "register_operand" "=d")
1091: (not:SI (match_operand:SI 1 "register_operand" "d")))]
1092: ""
1093: "*
1094: {
1095: operands[2] = const0_rtx;
1096: return \"nor\\t%0,%z2,%1\";
1097: }"
1098: [(set_attr "type" "arith")
1099: (set_attr "mode" "SI")
1100: (set_attr "length" "1")])
1101:
1102: (define_insn "one_cmpldi2"
1103: [(set (match_operand:DI 0 "register_operand" "=d")
1104: (not:SI (match_operand:DI 1 "register_operand" "d")))]
1105: ""
1106: "*
1107: {
1108: operands[2] = const0_rtx;
1109: return \"nor\\t%M0,%z2,%M1\;nor\\t%L0,%z2,%L1\";
1110: }"
1111: [(set_attr "type" "darith")
1112: (set_attr "mode" "DI")
1113: (set_attr "length" "2")])
1114:
1115: (define_split
1116: [(set (match_operand:DI 0 "register_operand" "")
1117: (not:DI (match_operand:DI 1 "register_operand" "")))]
1.1.1.3 root 1118: "reload_completed && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1119: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1120: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))"
1121:
1122: [(set (subreg:SI (match_dup 0) 0) (not:SI (subreg:SI (match_dup 1) 0)))
1123: (set (subreg:SI (match_dup 0) 1) (not:SI (subreg:SI (match_dup 1) 1)))]
1124: "")
1125:
1126: ;; Simple hack to recognize the "nor" instruction on the MIPS
1127: ;; This must appear before the normal or patterns, so that the
1128: ;; combiner will correctly fold things.
1129:
1130: (define_insn "norsi3"
1131: [(set (match_operand:SI 0 "register_operand" "=d")
1132: (not:SI (ior:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")
1133: (match_operand:SI 2 "reg_or_0_operand" "dJ"))))]
1134: ""
1135: "nor\\t%0,%z1,%z2"
1136: [(set_attr "type" "arith")
1137: (set_attr "mode" "SI")
1138: (set_attr "length" "1")])
1139:
1140: (define_insn "nordi3"
1141: [(set (match_operand:DI 0 "register_operand" "=d")
1142: (not:DI (ior:DI (match_operand:DI 1 "register_operand" "d")
1143: (match_operand:DI 2 "register_operand" "d"))))]
1144: ""
1145: "nor\\t%M0,%M1,%M2\;nor\\t%L0,%L1,%L2"
1146: [(set_attr "type" "darith")
1147: (set_attr "mode" "DI")
1148: (set_attr "length" "2")])
1149:
1150: (define_split
1151: [(set (match_operand:DI 0 "register_operand" "")
1152: (not:DI (ior:DI (match_operand:DI 1 "register_operand" "")
1153: (match_operand:DI 2 "register_operand" ""))))]
1.1.1.3 root 1154: "reload_completed && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1155: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1156: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
1157: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
1158:
1159: [(set (subreg:SI (match_dup 0) 0) (not:SI (ior:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0))))
1160: (set (subreg:SI (match_dup 0) 1) (not:SI (ior:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1))))]
1161: "")
1162:
1163:
1164: ;;
1165: ;; ....................
1166: ;;
1167: ;; LOGICAL
1168: ;;
1169: ;; ....................
1170: ;;
1171:
1172: (define_insn "andsi3"
1.1.1.4 ! root 1173: [(set (match_operand:SI 0 "register_operand" "=d,d")
! 1174: (and:SI (match_operand:SI 1 "uns_arith_operand" "%d,d")
! 1175: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
1.1 root 1176: ""
1177: "@
1178: and\\t%0,%1,%2
1.1.1.4 ! root 1179: andi\\t%0,%1,%x2"
! 1180: [(set_attr "type" "arith")
1.1.1.3 root 1181: (set_attr "mode" "SI")
1.1.1.4 ! root 1182: (set_attr "length" "1")])
1.1 root 1183:
1184: (define_insn "anddi3"
1185: [(set (match_operand:DI 0 "register_operand" "=d")
1186: (and:DI (match_operand:DI 1 "register_operand" "d")
1187: (match_operand:DI 2 "register_operand" "d")))]
1188: "!TARGET_DEBUG_G_MODE"
1189: "and\\t%M0,%M1,%M2\;and\\t%L0,%L1,%L2"
1190: [(set_attr "type" "darith")
1191: (set_attr "mode" "DI")
1192: (set_attr "length" "2")])
1193:
1194: (define_split
1195: [(set (match_operand:DI 0 "register_operand" "")
1196: (and:DI (match_operand:DI 1 "register_operand" "")
1197: (match_operand:DI 2 "register_operand" "")))]
1.1.1.3 root 1198: "reload_completed && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1199: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1200: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
1201: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
1202:
1203: [(set (subreg:SI (match_dup 0) 0) (and:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0)))
1204: (set (subreg:SI (match_dup 0) 1) (and:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1)))]
1205: "")
1206:
1207: (define_insn "iorsi3"
1.1.1.4 ! root 1208: [(set (match_operand:SI 0 "register_operand" "=d,d")
! 1209: (ior:SI (match_operand:SI 1 "uns_arith_operand" "%d,d")
! 1210: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
1.1 root 1211: ""
1212: "@
1213: or\\t%0,%1,%2
1.1.1.4 ! root 1214: ori\\t%0,%1,%x2"
! 1215: [(set_attr "type" "arith")
1.1.1.3 root 1216: (set_attr "mode" "SI")
1.1.1.4 ! root 1217: (set_attr "length" "1")])
1.1 root 1218:
1219: (define_insn "iordi3"
1220: [(set (match_operand:DI 0 "register_operand" "=d")
1221: (ior:DI (match_operand:DI 1 "register_operand" "d")
1222: (match_operand:DI 2 "register_operand" "d")))]
1223: "!TARGET_DEBUG_G_MODE"
1224: "or\\t%M0,%M1,%M2\;or\\t%L0,%L1,%L2"
1225: [(set_attr "type" "darith")
1226: (set_attr "mode" "DI")
1227: (set_attr "length" "2")])
1228:
1229: (define_split
1230: [(set (match_operand:DI 0 "register_operand" "")
1231: (ior:DI (match_operand:DI 1 "register_operand" "")
1232: (match_operand:DI 2 "register_operand" "")))]
1.1.1.3 root 1233: "reload_completed && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1234: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1235: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
1236: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
1237:
1238: [(set (subreg:SI (match_dup 0) 0) (ior:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0)))
1239: (set (subreg:SI (match_dup 0) 1) (ior:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1)))]
1240: "")
1241:
1242: (define_insn "xorsi3"
1.1.1.4 ! root 1243: [(set (match_operand:SI 0 "register_operand" "=d,d")
! 1244: (xor:SI (match_operand:SI 1 "uns_arith_operand" "%d,d")
! 1245: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
1.1 root 1246: ""
1247: "@
1248: xor\\t%0,%1,%2
1.1.1.4 ! root 1249: xori\\t%0,%1,%x2"
! 1250: [(set_attr "type" "arith")
1.1.1.3 root 1251: (set_attr "mode" "SI")
1.1.1.4 ! root 1252: (set_attr "length" "1")])
1.1 root 1253:
1254: (define_insn "xordi3"
1255: [(set (match_operand:DI 0 "register_operand" "=d")
1256: (xor:DI (match_operand:DI 1 "register_operand" "d")
1257: (match_operand:DI 2 "register_operand" "d")))]
1258: "!TARGET_DEBUG_G_MODE"
1259: "xor\\t%M0,%M1,%M2\;xor\\t%L0,%L1,%L2"
1260: [(set_attr "type" "darith")
1261: (set_attr "mode" "DI")
1262: (set_attr "length" "2")])
1263:
1264: (define_split
1265: [(set (match_operand:DI 0 "register_operand" "")
1266: (xor:DI (match_operand:DI 1 "register_operand" "")
1267: (match_operand:DI 2 "register_operand" "")))]
1.1.1.3 root 1268: "reload_completed && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1269: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1270: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))
1271: && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"
1272:
1273: [(set (subreg:SI (match_dup 0) 0) (xor:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0)))
1274: (set (subreg:SI (match_dup 0) 1) (xor:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1)))]
1275: "")
1276:
1277:
1278: ;;
1279: ;; ....................
1280: ;;
1281: ;; TRUNCATION
1282: ;;
1283: ;; ....................
1284:
1285: (define_insn "truncdfsf2"
1286: [(set (match_operand:SF 0 "register_operand" "=f")
1287: (float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]
1288: "TARGET_HARD_FLOAT"
1289: "cvt.s.d\\t%0,%1"
1290: [(set_attr "type" "fcvt")
1291: (set_attr "mode" "SF")
1292: (set_attr "length" "1")])
1293:
1294:
1295: ;;
1296: ;; ....................
1297: ;;
1298: ;; ZERO EXTENSION
1299: ;;
1300: ;; ....................
1301:
1302: ;; Extension insns.
1303: ;; Those for integer source operand
1304: ;; are ordered widest source type first.
1305:
1306: (define_insn "zero_extendhisi2"
1307: [(set (match_operand:SI 0 "register_operand" "=d,d,d")
1308: (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "d,R,m")))]
1309: ""
1310: "*
1311: {
1312: if (which_alternative == 0)
1313: return \"andi\\t%0,%1,0xffff\";
1314: else
1315: return mips_move_1word (operands, insn, TRUE);
1316: }"
1317: [(set_attr "type" "arith,load,load")
1.1.1.3 root 1318: (set_attr "mode" "SI")
1.1 root 1319: (set_attr "length" "1,1,2")])
1320:
1321: (define_insn "zero_extendqihi2"
1322: [(set (match_operand:HI 0 "register_operand" "=d,d,d")
1323: (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "d,R,m")))]
1324: ""
1325: "*
1326: {
1327: if (which_alternative == 0)
1328: return \"andi\\t%0,%1,0x00ff\";
1329: else
1330: return mips_move_1word (operands, insn, TRUE);
1331: }"
1332: [(set_attr "type" "arith,load,load")
1.1.1.3 root 1333: (set_attr "mode" "HI")
1.1 root 1334: (set_attr "length" "1,1,2")])
1335:
1336: (define_insn "zero_extendqisi2"
1337: [(set (match_operand:SI 0 "register_operand" "=d,d,d")
1338: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "d,R,m")))]
1339: ""
1340: "*
1341: {
1342: if (which_alternative == 0)
1343: return \"andi\\t%0,%1,0x00ff\";
1344: else
1345: return mips_move_1word (operands, insn, TRUE);
1346: }"
1347: [(set_attr "type" "arith,load,load")
1.1.1.3 root 1348: (set_attr "mode" "SI")
1.1 root 1349: (set_attr "length" "1,1,2")])
1350:
1351:
1352: ;;
1353: ;; ....................
1354: ;;
1355: ;; SIGN EXTENSION
1356: ;;
1357: ;; ....................
1358:
1359: ;; Extension insns.
1360: ;; Those for integer source operand
1361: ;; are ordered widest source type first.
1362:
1363: ;; These patterns originally accepted general_operands, however, slightly
1364: ;; better code is generated by only accepting register_operands, and then
1365: ;; letting combine generate the lh and lb insns.
1366:
1367: (define_expand "extendhisi2"
1368: [(set (match_operand:SI 0 "register_operand" "")
1369: (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
1370: ""
1371: "
1372: {
1373: if (optimize && GET_CODE (operands[1]) == MEM)
1374: operands[1] = force_not_mem (operands[1]);
1375:
1376: if (GET_CODE (operands[1]) != MEM)
1377: {
1378: rtx op1 = gen_lowpart (SImode, operands[1]);
1379: rtx temp = gen_reg_rtx (SImode);
1380: rtx shift = gen_rtx (CONST_INT, VOIDmode, 16);
1381:
1382: emit_insn (gen_ashlsi3 (temp, op1, shift));
1383: emit_insn (gen_ashrsi3 (operands[0], temp, shift));
1384: DONE;
1385: }
1386: }")
1387:
1388: (define_insn "extendhisi2_internal"
1389: [(set (match_operand:SI 0 "register_operand" "=d,d")
1390: (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,m")))]
1391: ""
1392: "* return mips_move_1word (operands, insn, FALSE);"
1.1.1.3 root 1393: [(set_attr "type" "load")
1394: (set_attr "mode" "SI")
1.1 root 1395: (set_attr "length" "1,2")])
1396:
1397: (define_expand "extendqihi2"
1398: [(set (match_operand:HI 0 "register_operand" "")
1399: (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))]
1400: ""
1401: "
1402: {
1403: if (optimize && GET_CODE (operands[1]) == MEM)
1404: operands[1] = force_not_mem (operands[1]);
1405:
1406: if (GET_CODE (operands[1]) != MEM)
1407: {
1408: rtx op0 = gen_lowpart (SImode, operands[0]);
1409: rtx op1 = gen_lowpart (SImode, operands[1]);
1410: rtx temp = gen_reg_rtx (SImode);
1411: rtx shift = gen_rtx (CONST_INT, VOIDmode, 24);
1412:
1413: emit_insn (gen_ashlsi3 (temp, op1, shift));
1414: emit_insn (gen_ashrsi3 (op0, temp, shift));
1415: DONE;
1416: }
1417: }")
1418:
1419: (define_insn "extendqihi2_internal"
1420: [(set (match_operand:HI 0 "register_operand" "=d,d")
1421: (sign_extend:HI (match_operand:QI 1 "memory_operand" "R,m")))]
1422: ""
1423: "* return mips_move_1word (operands, insn, FALSE);"
1.1.1.3 root 1424: [(set_attr "type" "load")
1425: (set_attr "mode" "SI")
1.1 root 1426: (set_attr "length" "1,2")])
1427:
1428:
1429: (define_expand "extendqisi2"
1430: [(set (match_operand:SI 0 "register_operand" "")
1431: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
1432: ""
1433: "
1434: {
1435: if (optimize && GET_CODE (operands[1]) == MEM)
1436: operands[1] = force_not_mem (operands[1]);
1437:
1438: if (GET_CODE (operands[1]) != MEM)
1439: {
1440: rtx op1 = gen_lowpart (SImode, operands[1]);
1441: rtx temp = gen_reg_rtx (SImode);
1442: rtx shift = gen_rtx (CONST_INT, VOIDmode, 24);
1443:
1444: emit_insn (gen_ashlsi3 (temp, op1, shift));
1445: emit_insn (gen_ashrsi3 (operands[0], temp, shift));
1446: DONE;
1447: }
1448: }")
1449:
1450: (define_insn "extendqisi2_insn"
1451: [(set (match_operand:SI 0 "register_operand" "=d,d")
1452: (sign_extend:SI (match_operand:QI 1 "memory_operand" "R,m")))]
1453: ""
1454: "* return mips_move_1word (operands, insn, FALSE);"
1.1.1.3 root 1455: [(set_attr "type" "load")
1456: (set_attr "mode" "SI")
1.1 root 1457: (set_attr "length" "1,2")])
1458:
1459:
1460: (define_insn "extendsfdf2"
1461: [(set (match_operand:DF 0 "register_operand" "=f")
1462: (float_extend:DF (match_operand:SF 1 "register_operand" "f")))]
1463: "TARGET_HARD_FLOAT"
1464: "cvt.d.s\\t%0,%1"
1465: [(set_attr "type" "fcvt")
1466: (set_attr "mode" "DF")
1467: (set_attr "length" "1")])
1468:
1469:
1470:
1471: ;;
1472: ;; ....................
1473: ;;
1474: ;; CONVERSIONS
1475: ;;
1476: ;; ....................
1477:
1.1.1.4 ! root 1478: (define_insn "fix_truncdfsi2"
1.1 root 1479: [(set (match_operand:SI 0 "general_operand" "=d,*f,R,o")
1480: (fix:SI (match_operand:DF 1 "register_operand" "f,*f,f,f")))
1.1.1.4 ! root 1481: (clobber (match_scratch:SI 2 "=d,*d,d,d"))
! 1482: (clobber (match_scratch:DF 3 "=f,*X,f,f"))]
1.1 root 1483: "TARGET_HARD_FLOAT"
1484: "*
1485: {
1486: rtx xoperands[10];
1487:
1488: if (which_alternative == 1)
1489: return \"trunc.w.d %0,%1,%2\";
1490:
1491: output_asm_insn (\"trunc.w.d %3,%1,%2\", operands);
1492:
1493: xoperands[0] = operands[0];
1494: xoperands[1] = operands[3];
1495: output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);
1496: return \"\";
1497: }"
1.1.1.3 root 1498: [(set_attr "type" "fcvt")
1499: (set_attr "mode" "DF")
1.1.1.4 ! root 1500: (set_attr "length" "11,9,10,11")])
1.1 root 1501:
1502:
1.1.1.4 ! root 1503: (define_insn "fix_truncsfsi2"
1.1 root 1504: [(set (match_operand:SI 0 "general_operand" "=d,*f,R,o")
1505: (fix:SI (match_operand:SF 1 "register_operand" "f,*f,f,f")))
1.1.1.4 ! root 1506: (clobber (match_scratch:SI 2 "=d,*d,d,d"))
! 1507: (clobber (match_scratch:SF 3 "=f,*X,f,f"))]
1.1 root 1508: "TARGET_HARD_FLOAT"
1509: "*
1510: {
1511: rtx xoperands[10];
1512:
1513: if (which_alternative == 1)
1514: return \"trunc.w.s %0,%1,%2\";
1515:
1516: output_asm_insn (\"trunc.w.s %3,%1,%2\", operands);
1517:
1518: xoperands[0] = operands[0];
1519: xoperands[1] = operands[3];
1520: output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);
1521: return \"\";
1522: }"
1.1.1.3 root 1523: [(set_attr "type" "fcvt")
1524: (set_attr "mode" "SF")
1.1.1.4 ! root 1525: (set_attr "length" "11,9,10,11")])
1.1 root 1526:
1527:
1528: (define_insn "floatsidf2"
1.1.1.3 root 1529: [(set (match_operand:DF 0 "register_operand" "=f,f,f")
1530: (float:DF (match_operand:SI 1 "nonimmediate_operand" "d,R,m")))]
1.1 root 1531: "TARGET_HARD_FLOAT"
1.1.1.3 root 1532: "*
1533: {
1534: dslots_load_total++;
1535: if (GET_CODE (operands[1]) == MEM)
1536: return \"l.s\\t%0,%1%#\;cvt.d.w\\t%0,%0\";
1537:
1538: return \"mtc1\\t%1,%0%#\;cvt.d.w\\t%0,%0\";
1539: }"
1.1 root 1540: [(set_attr "type" "fcvt")
1541: (set_attr "mode" "DF")
1.1.1.3 root 1542: (set_attr "length" "3,4,3")])
1.1 root 1543:
1.1.1.4 ! root 1544:
1.1 root 1545: (define_insn "floatsisf2"
1.1.1.3 root 1546: [(set (match_operand:SF 0 "register_operand" "=f,f,f")
1547: (float:SF (match_operand:SI 1 "nonimmediate_operand" "d,R,m")))]
1.1 root 1548: "TARGET_HARD_FLOAT"
1.1.1.3 root 1549: "*
1550: {
1551: dslots_load_total++;
1552: if (GET_CODE (operands[1]) == MEM)
1553: return \"l.s\\t%0,%1%#\;cvt.s.w\\t%0,%0\";
1554:
1555: return \"mtc1\\t%1,%0%#\;cvt.s.w\\t%0,%0\";
1556: }"
1.1 root 1557: [(set_attr "type" "fcvt")
1558: (set_attr "mode" "SF")
1.1.1.3 root 1559: (set_attr "length" "3,4,3")])
1560:
1.1 root 1561:
1562: (define_expand "fixuns_truncdfsi2"
1563: [(set (match_operand:SI 0 "register_operand" "")
1564: (unsigned_fix:SI (match_operand:DF 1 "register_operand" "")))]
1565: "TARGET_HARD_FLOAT"
1566: "
1567: {
1568: rtx reg1 = gen_reg_rtx (DFmode);
1569: rtx reg2 = gen_reg_rtx (DFmode);
1570: rtx reg3 = gen_reg_rtx (SImode);
1571: rtx label1 = gen_label_rtx ();
1572: rtx label2 = gen_label_rtx ();
1573: REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 31);
1574:
1575: if (reg1) /* turn off complaints about unreached code */
1576: {
1577: emit_move_insn (reg1, immed_real_const_1 (offset, DFmode));
1578: do_pending_stack_adjust ();
1579:
1580: emit_insn (gen_cmpdf (operands[1], reg1));
1581: emit_jump_insn (gen_bge (label1));
1582:
1583: emit_insn (gen_fix_truncdfsi2 (operands[0], operands[1]));
1584: emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx,
1585: gen_rtx (LABEL_REF, VOIDmode, label2)));
1586: emit_barrier ();
1587:
1588: emit_label (label1);
1589: emit_move_insn (reg2, gen_rtx (MINUS, DFmode, operands[1], reg1));
1590: emit_move_insn (reg3, gen_rtx (CONST_INT, VOIDmode, 0x80000000));
1591:
1592: emit_insn (gen_fix_truncdfsi2 (operands[0], reg2));
1593: emit_insn (gen_iorsi3 (operands[0], operands[0], reg3));
1594:
1595: emit_label (label2);
1596:
1597: /* allow REG_NOTES to be set on last insn (labels don't have enough
1598: fields, and can't be used for REG_NOTES anyway). */
1599: emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
1600: DONE;
1601: }
1602: }")
1603:
1.1.1.4 ! root 1604:
1.1 root 1605: (define_expand "fixuns_truncsfsi2"
1606: [(set (match_operand:SI 0 "register_operand" "")
1607: (unsigned_fix:SI (match_operand:SF 1 "register_operand" "")))]
1608: "TARGET_HARD_FLOAT"
1609: "
1610: {
1611: rtx reg1 = gen_reg_rtx (SFmode);
1612: rtx reg2 = gen_reg_rtx (SFmode);
1613: rtx reg3 = gen_reg_rtx (SImode);
1614: rtx label1 = gen_label_rtx ();
1615: rtx label2 = gen_label_rtx ();
1616: REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 31);
1617:
1618: if (reg1) /* turn off complaints about unreached code */
1619: {
1620: emit_move_insn (reg1, immed_real_const_1 (offset, SFmode));
1621: do_pending_stack_adjust ();
1622:
1623: emit_insn (gen_cmpsf (operands[1], reg1));
1624: emit_jump_insn (gen_bge (label1));
1625:
1626: emit_insn (gen_fix_truncsfsi2 (operands[0], operands[1]));
1627: emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx,
1628: gen_rtx (LABEL_REF, VOIDmode, label2)));
1629: emit_barrier ();
1630:
1631: emit_label (label1);
1632: emit_move_insn (reg2, gen_rtx (MINUS, SFmode, operands[1], reg1));
1633: emit_move_insn (reg3, gen_rtx (CONST_INT, VOIDmode, 0x80000000));
1634:
1635: emit_insn (gen_fix_truncsfsi2 (operands[0], reg2));
1636: emit_insn (gen_iorsi3 (operands[0], operands[0], reg3));
1637:
1638: emit_label (label2);
1639:
1640: /* allow REG_NOTES to be set on last insn (labels don't have enough
1641: fields, and can't be used for REG_NOTES anyway). */
1642: emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
1643: DONE;
1644: }
1645: }")
1646:
1647:
1648: ;;
1649: ;; ....................
1650: ;;
1651: ;; DATA MOVEMENT
1652: ;;
1653: ;; ....................
1654:
1655: ;; unaligned word moves generated by the block moves.
1656:
1657: (define_expand "movsi_unaligned"
1.1.1.2 root 1658: [(set (match_operand:SI 0 "general_operand" "")
1659: (unspec [(match_operand:SI 1 "general_operand" "")] 0))]
1.1 root 1660: ""
1661: "
1662: {
1.1.1.3 root 1663: /* Handle loads. */
1664: if (GET_CODE (operands[0]) == MEM)
1.1 root 1665: {
1666: rtx reg = gen_reg_rtx (SImode);
1.1.1.3 root 1667: rtx insn = emit_insn (gen_movsi_ulw (reg, operands[1]));
1668: rtx addr = XEXP (operands[0], 0);
1669: if (CONSTANT_P (addr))
1670: REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUIV, addr, REG_NOTES (insn));
1671:
1672: if (reg_or_0_operand (operands[1], SImode))
1673: DONE;
1.1 root 1674:
1675: operands[1] = reg;
1676: }
1677:
1678: /* Generate appropriate load, store. If not a load or store,
1679: do a normal movsi. */
1680: if (GET_CODE (operands[0]) != MEM && GET_CODE (operands[1]) != MEM)
1681: {
1682: emit_insn (gen_movsi (operands[0], operands[1]));
1683: DONE;
1684: }
1685:
1686: /* Fall through and generate normal code. */
1687: }")
1688:
1689: (define_insn "movsi_ulw"
1690: [(set (match_operand:SI 0 "register_operand" "=&d,&d,d,d")
1.1.1.2 root 1691: (unspec [(match_operand:SI 1 "general_operand" "R,o,dIKL,M")] 0))]
1.1 root 1692: ""
1693: "*
1694: {
1695: enum rtx_code code;
1696: char *ret;
1.1.1.2 root 1697: rtx offset;
1.1 root 1698: rtx addr;
1699: rtx mem_addr;
1700:
1701: if (which_alternative != 0)
1702: return mips_move_1word (operands, insn, FALSE);
1703:
1704: if (TARGET_STATS)
1705: mips_count_memory_refs (operands[1], 2);
1706:
1707: /* The stack/frame pointers are always aligned, so we can convert
1708: to the faster lw if we are referencing an aligned stack location. */
1709:
1.1.1.2 root 1710: offset = const0_rtx;
1.1 root 1711: addr = XEXP (operands[1], 0);
1712: mem_addr = eliminate_constant_term (addr, &offset);
1713:
1.1.1.2 root 1714: if ((INTVAL (offset) & (UNITS_PER_WORD-1)) == 0
1.1 root 1715: && (mem_addr == stack_pointer_rtx || mem_addr == frame_pointer_rtx))
1716: ret = \"lw\\t%0,%1\";
1717:
1718: else
1719: {
1720: ret = \"ulw\\t%0,%1\";
1721: if (TARGET_GAS)
1722: {
1723: enum rtx_code code = GET_CODE (addr);
1724:
1725: if (code == CONST || code == SYMBOL_REF || code == LABEL_REF)
1726: {
1727: operands[2] = gen_rtx (REG, SImode, GP_REG_FIRST + 1);
1728: ret = \"%[la\\t%2,%1\;ulw\\t%0,0(%2)%]\";
1729: }
1730: }
1731: }
1732:
1733: return mips_fill_delay_slot (ret, DELAY_LOAD, operands, insn);
1734: }"
1735: [(set_attr "type" "load,load,move,arith")
1.1.1.3 root 1736: (set_attr "mode" "SI")
1.1 root 1737: (set_attr "length" "2,4,1,2")])
1738:
1739: (define_insn "movsi_usw"
1740: [(set (match_operand:SI 0 "memory_operand" "=R,o")
1.1.1.2 root 1741: (unspec [(match_operand:SI 1 "reg_or_0_operand" "dJ,dJ")] 0))]
1.1 root 1742: ""
1743: "*
1744: {
1.1.1.2 root 1745: rtx offset = const0_rtx;
1.1 root 1746: rtx addr = XEXP (operands[0], 0);
1747: rtx mem_addr = eliminate_constant_term (addr, &offset);
1748:
1749: if (TARGET_STATS)
1750: mips_count_memory_refs (operands[0], 2);
1751:
1752: /* The stack/frame pointers are always aligned, so we can convert
1753: to the faster sw if we are referencing an aligned stack location. */
1754:
1.1.1.2 root 1755: if ((INTVAL (offset) & (UNITS_PER_WORD-1)) == 0
1.1 root 1756: && (mem_addr == stack_pointer_rtx || mem_addr == frame_pointer_rtx))
1757: return \"sw\\t%1,%0\";
1758:
1759:
1760: if (TARGET_GAS)
1761: {
1762: enum rtx_code code = GET_CODE (XEXP (operands[0], 0));
1763:
1764: if (code == CONST || code == SYMBOL_REF || code == LABEL_REF)
1765: {
1766: operands[2] = gen_rtx (REG, SImode, GP_REG_FIRST + 1);
1767: return \"%[la\\t%2,%0\;usw\\t%z1,0(%2)%]\";
1768: }
1769: }
1770:
1771: return \"usw\\t%z1,%0\";
1772: }"
1.1.1.3 root 1773: [(set_attr "type" "store")
1774: (set_attr "mode" "SI")
1.1 root 1775: (set_attr "length" "2,4")])
1776:
1.1.1.4 ! root 1777:
1.1 root 1778: ;; 64-bit integer moves
1779:
1780: ;; Unlike most other insns, the move insns can't be split with
1781: ;; different predicates, because register spilling and other parts of
1782: ;; the compiler, have memoized the insn number already.
1783:
1.1.1.4 ! root 1784: (define_expand "movdi"
! 1785: [(set (match_operand:DI 0 "nonimmediate_operand" "")
! 1786: (match_operand:DI 1 "general_operand" ""))]
! 1787: ""
! 1788: "
! 1789: {
! 1790: if ((reload_in_progress | reload_completed) == 0
! 1791: && !register_operand (operands[0], DImode)
! 1792: && !register_operand (operands[1], DImode)
! 1793: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)
! 1794: && operands[1] != CONST0_RTX (DImode))
! 1795: {
! 1796: rtx temp = force_reg (DImode, operands[1]);
! 1797: emit_move_insn (operands[0], temp);
! 1798: DONE;
! 1799: }
! 1800: }")
! 1801:
! 1802: (define_insn "movdi_internal"
1.1.1.2 root 1803: [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,R,o,*d,*x")
1804: (match_operand:DI 1 "general_operand" "d,iF,R,o,d,d,*x,*d"))]
1.1.1.4 ! root 1805: "register_operand (operands[0], DImode)
! 1806: || register_operand (operands[1], DImode)
! 1807: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
! 1808: || operands[1] == CONST0_RTX (DImode)"
1.1 root 1809: "* return mips_move_2words (operands, insn); "
1.1.1.2 root 1810: [(set_attr "type" "move,arith,load,load,store,store,hilo,hilo")
1.1.1.3 root 1811: (set_attr "mode" "DI")
1.1.1.2 root 1812: (set_attr "length" "2,4,2,4,2,4,2,2")])
1.1 root 1813:
1814: (define_split
1815: [(set (match_operand:DI 0 "register_operand" "")
1816: (match_operand:DI 1 "register_operand" ""))]
1.1.1.3 root 1817: "reload_completed && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 1818: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
1819: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))"
1820:
1821: [(set (subreg:SI (match_dup 0) 0) (subreg:SI (match_dup 1) 0))
1822: (set (subreg:SI (match_dup 0) 1) (subreg:SI (match_dup 1) 1))]
1823: "")
1824:
1825:
1826: ;; 32-bit Integer moves
1827:
1828: (define_split
1829: [(set (match_operand:SI 0 "register_operand" "")
1830: (match_operand:SI 1 "large_int" ""))]
1.1.1.3 root 1831: "!TARGET_DEBUG_D_MODE"
1.1 root 1832: [(set (match_dup 0)
1833: (match_dup 2))
1834: (set (match_dup 0)
1835: (ior:SI (match_dup 0)
1836: (match_dup 3)))]
1837: "
1838: {
1839: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & 0xffff0000);
1840: operands[3] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & 0x0000ffff);
1841: }")
1842:
1843: ;; Unlike most other insns, the move insns can't be split with
1844: ;; different predicates, because register spilling and other parts of
1845: ;; the compiler, have memoized the insn number already.
1846:
1.1.1.3 root 1847: (define_expand "movsi"
1848: [(set (match_operand:SI 0 "nonimmediate_operand" "")
1849: (match_operand:SI 1 "general_operand" ""))]
1850: ""
1851: "
1852: {
1.1.1.4 ! root 1853: if ((reload_in_progress | reload_completed) == 0
! 1854: && !register_operand (operands[0], SImode)
! 1855: && !register_operand (operands[1], SImode)
! 1856: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0))
1.1.1.3 root 1857: {
1.1.1.4 ! root 1858: rtx temp = force_reg (SImode, operands[1]);
! 1859: emit_move_insn (operands[0], temp);
! 1860: DONE;
1.1.1.3 root 1861: }
1862: }")
1863:
1.1.1.4 ! root 1864: ;; The difference between these two is whether or not ints are allowed
! 1865: ;; in FP registers (off by default, use -mdebugh to enable).
! 1866:
! 1867: (define_insn "movsi_internal1"
! 1868: [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*d,*f*z,*f,*f,*f,*R,*m,*x,*d")
! 1869: (match_operand:SI 1 "general_operand" "d,S,IKL,Mnis,R,m,dJ,dJ,*f*z,*d,*f,*R,*m,*f,*f,*d,*x"))]
! 1870: "TARGET_DEBUG_H_MODE
! 1871: && (register_operand (operands[0], SImode)
! 1872: || register_operand (operands[1], SImode)
! 1873: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
! 1874: "* return mips_move_1word (operands, insn, TRUE);"
! 1875: [(set_attr "type" "move,load,arith,arith,load,load,store,store,xfer,xfer,move,load,load,store,store,hilo,hilo")
! 1876: (set_attr "mode" "SI")
! 1877: (set_attr "length" "1,2,1,2,1,2,1,2,1,1,1,1,2,1,2,1,1")])
! 1878:
! 1879: (define_insn "movsi_internal2"
! 1880: [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*d,*z,*d,*x")
! 1881: (match_operand:SI 1 "general_operand" "d,S,IKL,Mnis,R,m,dJ,dJ,*z,*d,*x,*d"))]
! 1882: "!TARGET_DEBUG_H_MODE
! 1883: && (register_operand (operands[0], SImode)
! 1884: || register_operand (operands[1], SImode)
! 1885: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
1.1 root 1886: "* return mips_move_1word (operands, insn, TRUE);"
1.1.1.4 ! root 1887: [(set_attr "type" "move,load,arith,arith,load,load,store,store,xfer,xfer,hilo,hilo")
1.1.1.3 root 1888: (set_attr "mode" "SI")
1.1.1.4 ! root 1889: (set_attr "length" "1,2,1,2,1,2,1,2,1,1,1,1")])
! 1890:
1.1 root 1891:
1892: ;; 16-bit Integer moves
1893:
1894: ;; Unlike most other insns, the move insns can't be split with
1895: ;; different predicates, because register spilling and other parts of
1896: ;; the compiler, have memoized the insn number already.
1897: ;; Unsigned loads are used because BYTE_LOADS_ZERO_EXTEND is defined
1898:
1.1.1.4 ! root 1899: (define_expand "movhi"
! 1900: [(set (match_operand:HI 0 "nonimmediate_operand" "")
! 1901: (match_operand:HI 1 "general_operand" ""))]
1.1 root 1902: ""
1.1.1.4 ! root 1903: "
! 1904: {
! 1905: if ((reload_in_progress | reload_completed) == 0
! 1906: && !register_operand (operands[0], HImode)
! 1907: && !register_operand (operands[1], HImode)
! 1908: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0))
! 1909: {
! 1910: rtx temp = force_reg (HImode, operands[1]);
! 1911: emit_move_insn (operands[0], temp);
! 1912: DONE;
! 1913: }
! 1914: }")
! 1915:
! 1916: ;; The difference between these two is whether or not ints are allowed
! 1917: ;; in FP registers (off by default, use -mdebugh to enable).
! 1918:
! 1919: (define_insn "movhi_internal1"
! 1920: [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*f,*f*z,*x,*d")
! 1921: (match_operand:HI 1 "general_operand" "d,IK,R,m,dJ,dJ,*f*z,*d,*f,*d,*x"))]
! 1922: "TARGET_DEBUG_H_MODE
! 1923: && (register_operand (operands[0], HImode)
! 1924: || register_operand (operands[1], HImode)
! 1925: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
1.1 root 1926: "* return mips_move_1word (operands, insn, TRUE);"
1927: [(set_attr "type" "move,arith,load,load,store,store,xfer,xfer,move,hilo,hilo")
1.1.1.3 root 1928: (set_attr "mode" "HI")
1.1 root 1929: (set_attr "length" "1,1,1,2,1,2,1,1,1,1,1")])
1930:
1.1.1.4 ! root 1931: (define_insn "movhi_internal2"
! 1932: [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*z,*x,*d")
! 1933: (match_operand:HI 1 "general_operand" "d,IK,R,m,dJ,dJ,*z,*d,*d,*x"))]
! 1934: "!TARGET_DEBUG_H_MODE
! 1935: && (register_operand (operands[0], HImode)
! 1936: || register_operand (operands[1], HImode)
! 1937: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
! 1938: "* return mips_move_1word (operands, insn, TRUE);"
! 1939: [(set_attr "type" "move,arith,load,load,store,store,xfer,xfer,hilo,hilo")
! 1940: (set_attr "mode" "HI")
! 1941: (set_attr "length" "1,1,1,2,1,2,1,1,1,1")])
! 1942:
! 1943:
1.1 root 1944: ;; 8-bit Integer moves
1945:
1946: ;; Unlike most other insns, the move insns can't be split with
1947: ;; different predicates, because register spilling and other parts of
1948: ;; the compiler, have memoized the insn number already.
1949: ;; Unsigned loads are used because BYTE_LOADS_ZERO_EXTEND is defined
1950:
1.1.1.4 ! root 1951: (define_expand "movqi"
! 1952: [(set (match_operand:QI 0 "nonimmediate_operand" "")
! 1953: (match_operand:QI 1 "general_operand" ""))]
1.1 root 1954: ""
1.1.1.4 ! root 1955: "
! 1956: {
! 1957: if ((reload_in_progress | reload_completed) == 0
! 1958: && !register_operand (operands[0], QImode)
! 1959: && !register_operand (operands[1], QImode)
! 1960: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0))
! 1961: {
! 1962: rtx temp = force_reg (QImode, operands[1]);
! 1963: emit_move_insn (operands[0], temp);
! 1964: DONE;
! 1965: }
! 1966: }")
! 1967:
! 1968: ;; The difference between these two is whether or not ints are allowed
! 1969: ;; in FP registers (off by default, use -mdebugh to enable).
! 1970:
! 1971: (define_insn "movqi_internal1"
! 1972: [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*f*z,*f,*x,*d")
! 1973: (match_operand:QI 1 "general_operand" "d,IK,R,m,dJ,dJ,*f*z,*d,*f,*d,*x"))]
! 1974: "TARGET_DEBUG_H_MODE
! 1975: && (register_operand (operands[0], QImode)
! 1976: || register_operand (operands[1], QImode)
! 1977: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
1.1 root 1978: "* return mips_move_1word (operands, insn, TRUE);"
1979: [(set_attr "type" "move,arith,load,load,store,store,xfer,xfer,move,hilo,hilo")
1.1.1.3 root 1980: (set_attr "mode" "QI")
1.1 root 1981: (set_attr "length" "1,1,1,2,1,2,1,1,1,1,1")])
1982:
1.1.1.4 ! root 1983: (define_insn "movqi_internal2"
! 1984: [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*z,*x,*d")
! 1985: (match_operand:QI 1 "general_operand" "d,IK,R,m,dJ,dJ,*z,*d,*d,*x"))]
! 1986: "!TARGET_DEBUG_H_MODE
! 1987: && (register_operand (operands[0], QImode)
! 1988: || register_operand (operands[1], QImode)
! 1989: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
! 1990: "* return mips_move_1word (operands, insn, TRUE);"
! 1991: [(set_attr "type" "move,arith,load,load,store,store,xfer,xfer,hilo,hilo")
! 1992: (set_attr "mode" "QI")
! 1993: (set_attr "length" "1,1,1,2,1,2,1,1,1,1")])
! 1994:
1.1 root 1995:
1996: ;; 32-bit floating point moves
1997:
1.1.1.4 ! root 1998: (define_expand "movsf"
! 1999: [(set (match_operand:SF 0 "nonimmediate_operand" "")
! 2000: (match_operand:SF 1 "general_operand" ""))]
1.1 root 2001: ""
1.1.1.4 ! root 2002: "
! 2003: {
! 2004: if ((reload_in_progress | reload_completed) == 0
! 2005: && !register_operand (operands[0], SFmode)
! 2006: && !register_operand (operands[1], SFmode)
! 2007: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)
! 2008: && operands[1] != CONST0_RTX (SFmode))
! 2009: {
! 2010: rtx temp = force_reg (SFmode, operands[1]);
! 2011: emit_move_insn (operands[0], temp);
! 2012: DONE;
! 2013: }
! 2014: }")
! 2015:
! 2016: (define_insn "movsf_internal1"
! 2017: [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,f,f,R,m,*f,*d,*d,*d,*d,*R,*m")
! 2018: (match_operand:SF 1 "general_operand" "f,G,R,Em,fG,fG,*d,*f,*G*d,*R,*E*m,*d,*d"))]
! 2019: "TARGET_HARD_FLOAT
! 2020: && (register_operand (operands[0], SFmode)
! 2021: || register_operand (operands[1], SFmode)
! 2022: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
! 2023: || operands[1] == CONST0_RTX (SFmode))"
1.1 root 2024: "* return mips_move_1word (operands, insn, FALSE);"
2025: [(set_attr "type" "move,xfer,load,load,store,store,xfer,xfer,move,load,load,store,store")
1.1.1.3 root 2026: (set_attr "mode" "SF")
1.1 root 2027: (set_attr "length" "1,1,1,2,1,2,1,1,1,1,2,1,2")])
2028:
1.1.1.4 ! root 2029:
! 2030: (define_insn "movsf_internal2"
! 2031: [(set (match_operand:SF 0 "nonimmediate_operand" "=d,d,d,R,m")
! 2032: (match_operand:SF 1 "general_operand" " Gd,R,Em,d,d"))]
! 2033: "TARGET_SOFT_FLOAT
! 2034: && (register_operand (operands[0], SFmode)
! 2035: || register_operand (operands[1], SFmode)
! 2036: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
! 2037: || operands[1] == CONST0_RTX (SFmode))"
! 2038: "* return mips_move_1word (operands, insn, FALSE);"
! 2039: [(set_attr "type" "move,load,load,store,store")
! 2040: (set_attr "mode" "SF")
! 2041: (set_attr "length" "1,1,2,1,2")])
! 2042:
! 2043:
1.1 root 2044: ;; 64-bit floating point moves
2045:
1.1.1.4 ! root 2046: (define_expand "movdf"
! 2047: [(set (match_operand:DF 0 "nonimmediate_operand" "")
! 2048: (match_operand:DF 1 "general_operand" ""))]
1.1 root 2049: ""
1.1.1.4 ! root 2050: "
! 2051: {
! 2052: if ((reload_in_progress | reload_completed) == 0
! 2053: && !register_operand (operands[0], DFmode)
! 2054: && !register_operand (operands[1], DFmode)
! 2055: && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)
! 2056: && operands[1] != CONST0_RTX (DFmode))
! 2057: {
! 2058: rtx temp = force_reg (DFmode, operands[1]);
! 2059: emit_move_insn (operands[0], temp);
! 2060: DONE;
! 2061: }
! 2062: }")
! 2063:
! 2064: (define_insn "movdf_internal1"
! 2065: [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,f,R,o,f,*f,*d,*d,*d,*d,*R,*o")
! 2066: (match_operand:DF 1 "general_operand" "f,R,o,fG,fG,E,*d,*f,*d*G,*R,*o*E,*d,*d"))]
! 2067: "TARGET_HARD_FLOAT
! 2068: && (register_operand (operands[0], DFmode)
! 2069: || register_operand (operands[1], DFmode)
! 2070: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
! 2071: || operands[1] == CONST0_RTX (DFmode))"
1.1 root 2072: "* return mips_move_2words (operands, insn); "
2073: [(set_attr "type" "move,load,load,store,store,load,xfer,xfer,move,load,load,store,store")
1.1.1.3 root 2074: (set_attr "mode" "DF")
1.1 root 2075: (set_attr "length" "1,2,4,2,4,4,2,2,2,2,4,2,4")])
2076:
1.1.1.4 ! root 2077: (define_insn "movdf_internal2"
! 2078: [(set (match_operand:DF 0 "nonimmediate_operand" "=d,d,d,R,o")
! 2079: (match_operand:DF 1 "general_operand" "dG,R,oE,d,d"))]
! 2080: "TARGET_SOFT_FLOAT
! 2081: && (register_operand (operands[0], DFmode)
! 2082: || register_operand (operands[1], DFmode)
! 2083: || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
! 2084: || operands[1] == CONST0_RTX (DFmode))"
! 2085: "* return mips_move_2words (operands, insn); "
! 2086: [(set_attr "type" "move,load,load,store,store")
! 2087: (set_attr "mode" "DF")
! 2088: (set_attr "length" "2,2,4,2,4")])
! 2089:
1.1 root 2090: (define_split
2091: [(set (match_operand:DF 0 "register_operand" "")
2092: (match_operand:DF 1 "register_operand" ""))]
1.1.1.3 root 2093: "reload_completed && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2094: && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))
2095: && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))"
2096:
2097: [(set (subreg:SI (match_dup 0) 0) (subreg:SI (match_dup 1) 0))
2098: (set (subreg:SI (match_dup 0) 1) (subreg:SI (match_dup 1) 1))]
2099: "")
2100:
1.1.1.3 root 2101:
1.1 root 2102: ;; Block moves, see mips.c for more details.
2103: ;; Argument 0 is the destination
2104: ;; Argument 1 is the source
2105: ;; Argument 2 is the length
2106: ;; Argument 3 is the alignment
2107:
2108: (define_expand "movstrsi"
2109: [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" ""))
2110: (mem:BLK (match_operand:BLK 1 "general_operand" "")))
2111: (use (match_operand:SI 2 "arith32_operand" ""))
2112: (use (match_operand:SI 3 "immediate_operand" ""))])]
2113: ""
2114: "
2115: {
2116: if (operands[0]) /* avoid unused code messages */
2117: {
2118: expand_block_move (operands);
2119: DONE;
2120: }
2121: }")
2122:
1.1.1.3 root 2123: ;; Insn generated by block moves
2124:
2125: (define_insn "movstrsi_internal"
2126: [(set (match_operand:BLK 0 "memory_operand" "=Ro") ;; destination
2127: (match_operand:BLK 1 "memory_operand" "Ro")) ;; source
2128: (clobber (match_scratch:SI 4 "=&d")) ;; temp 1
2129: (clobber (match_scratch:SI 5 "=&d")) ;; temp 2
2130: (clobber (match_scratch:SI 6 "=&d")) ;; temp 3
2131: (clobber (match_scratch:SI 7 "=&d")) ;; temp 4
2132: (use (match_operand:SI 2 "small_int" "I")) ;; # bytes to move
2133: (use (match_operand:SI 3 "small_int" "I")) ;; alignment
2134: (use (const_int 0))] ;; normal block move
2135: ""
2136: "* return output_block_move (insn, operands, 4, BLOCK_MOVE_NORMAL);"
2137: [(set_attr "type" "multi")
2138: (set_attr "mode" "none")
2139: (set_attr "length" "20")])
2140:
2141: ;; Split a block move into 2 parts, the first part is everything
2142: ;; except for the last move, and the second part is just the last
2143: ;; store, which is exactly 1 instruction (ie, not a usw), so it can
2144: ;; fill a delay slot. This also prevents a bug in delayed branches
2145: ;; from showing up, which reuses one of the registers in our clobbers.
2146:
2147: (define_split
2148: [(set (mem:BLK (match_operand:SI 0 "register_operand" ""))
2149: (mem:BLK (match_operand:SI 1 "register_operand" "")))
2150: (clobber (match_operand:SI 4 "register_operand" ""))
2151: (clobber (match_operand:SI 5 "register_operand" ""))
2152: (clobber (match_operand:SI 6 "register_operand" ""))
2153: (clobber (match_operand:SI 7 "register_operand" ""))
2154: (use (match_operand:SI 2 "small_int" ""))
2155: (use (match_operand:SI 3 "small_int" ""))
2156: (use (const_int 0))]
2157:
2158: "reload_completed && !TARGET_DEBUG_D_MODE && INTVAL (operands[2]) > 0"
2159:
2160: ;; All but the last move
2161: [(parallel [(set (mem:BLK (match_dup 0))
2162: (mem:BLK (match_dup 1)))
2163: (clobber (match_dup 4))
2164: (clobber (match_dup 5))
2165: (clobber (match_dup 6))
2166: (clobber (match_dup 7))
2167: (use (match_dup 2))
2168: (use (match_dup 3))
2169: (use (const_int 1))])
2170:
2171: ;; The last store, so it can fill a delay slot
2172: (parallel [(set (mem:BLK (match_dup 0))
2173: (mem:BLK (match_dup 1)))
2174: (clobber (match_dup 4))
2175: (clobber (match_dup 5))
2176: (clobber (match_dup 6))
2177: (clobber (match_dup 7))
2178: (use (match_dup 2))
2179: (use (match_dup 3))
2180: (use (const_int 2))])]
2181:
2182: "")
2183:
2184: (define_insn "movstrsi_internal2"
2185: [(set (match_operand:BLK 0 "memory_operand" "=Ro") ;; destination
2186: (match_operand:BLK 1 "memory_operand" "Ro")) ;; source
2187: (clobber (match_scratch:SI 4 "=&d")) ;; temp 1
2188: (clobber (match_scratch:SI 5 "=&d")) ;; temp 2
2189: (clobber (match_scratch:SI 6 "=&d")) ;; temp 3
2190: (clobber (match_scratch:SI 7 "=&d")) ;; temp 4
2191: (use (match_operand:SI 2 "small_int" "I")) ;; # bytes to move
2192: (use (match_operand:SI 3 "small_int" "I")) ;; alignment
2193: (use (const_int 1))] ;; all but last store
2194: ""
2195: "* return output_block_move (insn, operands, 4, BLOCK_MOVE_NOT_LAST);"
2196: [(set_attr "type" "multi")
2197: (set_attr "mode" "none")
2198: (set_attr "length" "20")])
2199:
2200: (define_insn "movstrsi_internal3"
2201: [(set (match_operand:BLK 0 "memory_operand" "=Ro") ;; destination
2202: (match_operand:BLK 1 "memory_operand" "Ro")) ;; source
2203: (clobber (match_scratch:SI 4 "=&d")) ;; temp 1
2204: (clobber (match_scratch:SI 5 "=&d")) ;; temp 2
2205: (clobber (match_scratch:SI 6 "=&d")) ;; temp 3
2206: (clobber (match_scratch:SI 7 "=&d")) ;; temp 4
2207: (use (match_operand:SI 2 "small_int" "I")) ;; # bytes to move
2208: (use (match_operand:SI 3 "small_int" "I")) ;; alignment
2209: (use (const_int 2))] ;; just last store of block mvoe
2210: ""
2211: "* return output_block_move (insn, operands, 4, BLOCK_MOVE_LAST);"
2212: [(set_attr "type" "store")
2213: (set_attr "mode" "none")
2214: (set_attr "length" "1")])
2215:
1.1 root 2216:
2217: ;;
2218: ;; ....................
2219: ;;
2220: ;; SHIFTS
2221: ;;
2222: ;; ....................
2223:
2224: (define_insn "ashlsi3"
2225: [(set (match_operand:SI 0 "register_operand" "=d")
2226: (ashift:SI (match_operand:SI 1 "register_operand" "d")
2227: (match_operand:SI 2 "arith_operand" "dI")))]
2228: ""
2229: "*
2230: {
2231: if (GET_CODE (operands[2]) == CONST_INT)
2232: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
2233:
2234: return \"sll\\t%0,%1,%2\";
2235: }"
2236: [(set_attr "type" "arith")
2237: (set_attr "mode" "SI")
2238: (set_attr "length" "1")])
2239:
2240:
2241: (define_expand "ashldi3"
2242: [(parallel [(set (match_operand:DI 0 "register_operand" "")
2243: (ashift:DI (match_operand:DI 1 "register_operand" "")
2244: (match_operand:SI 2 "arith_operand" "")))
2245: (clobber (match_dup 3))])]
2246: "!TARGET_DEBUG_G_MODE"
2247: "operands[3] = gen_reg_rtx (SImode);")
2248:
2249:
2250: (define_insn "ashldi3_internal"
1.1.1.4 ! root 2251: [(set (match_operand:DI 0 "register_operand" "=&d")
1.1 root 2252: (ashift:DI (match_operand:DI 1 "register_operand" "d")
2253: (match_operand:SI 2 "register_operand" "d")))
2254: (clobber (match_operand:SI 3 "register_operand" "=d"))]
2255: "!TARGET_DEBUG_G_MODE"
2256: "*
2257: {
2258: operands[4] = const0_rtx;
2259: dslots_jump_total += 3;
2260: dslots_jump_filled += 2;
2261:
2262: return \"sll\\t%3,%2,26\\n\\
2263: \\tbgez\\t%3,1f\\n\\
2264: \\tsll\\t%M0,%L1,%2\\n\\
2265: \\t%(b\\t3f\\n\\
2266: \\tmove\\t%L0,%z4%)\\n\\
2267: \\n\\
2268: 1:\\n\\
2269: \\t%(beq\\t%3,%z4,2f\\n\\
2270: \\tsll\\t%M0,%M1,%2%)\\n\\
2271: \\n\\
2272: \\tsubu\\t%3,%z4,%2\\n\\
2273: \\tsrl\\t%3,%L1,%3\\n\\
2274: \\tor\\t%M0,%M0,%3\\n\\
2275: 2:\\n\\
2276: \\tsll\\t%L0,%L1,%2\\n\\
2277: 3:\";
2278: }"
2279: [(set_attr "type" "darith")
2280: (set_attr "mode" "SI")
2281: (set_attr "length" "12")])
2282:
2283:
2284: (define_insn "ashldi3_internal2"
2285: [(set (match_operand:DI 0 "register_operand" "=d")
2286: (ashift:DI (match_operand:DI 1 "register_operand" "d")
2287: (match_operand:SI 2 "small_int" "IJK")))
2288: (clobber (match_operand:SI 3 "register_operand" "=d"))]
2289: "!TARGET_DEBUG_G_MODE && (INTVAL (operands[2]) & 32) != 0"
2290: "*
2291: {
2292: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
2293: operands[4] = const0_rtx;
2294: return \"sll\\t%M0,%L1,%2\;move\\t%L0,%z4\";
2295: }"
2296: [(set_attr "type" "darith")
2297: (set_attr "mode" "DI")
2298: (set_attr "length" "2")])
2299:
2300:
2301: (define_split
2302: [(set (match_operand:DI 0 "register_operand" "")
2303: (ashift:DI (match_operand:DI 1 "register_operand" "")
2304: (match_operand:SI 2 "small_int" "")))
2305: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2306: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2307: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2308: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2309: && (INTVAL (operands[2]) & 32) != 0"
2310:
2311: [(set (subreg:SI (match_dup 0) 1) (ashift:SI (subreg:SI (match_dup 1) 0) (match_dup 2)))
2312: (set (subreg:SI (match_dup 0) 0) (const_int 0))]
2313:
2314: "operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);")
2315:
2316:
2317: (define_split
2318: [(set (match_operand:DI 0 "register_operand" "")
2319: (ashift:DI (match_operand:DI 1 "register_operand" "")
2320: (match_operand:SI 2 "small_int" "")))
2321: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2322: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2323: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2324: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2325: && (INTVAL (operands[2]) & 32) != 0"
2326:
2327: [(set (subreg:SI (match_dup 0) 0) (ashift:SI (subreg:SI (match_dup 1) 1) (match_dup 2)))
2328: (set (subreg:SI (match_dup 0) 1) (const_int 0))]
2329:
2330: "operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);")
2331:
2332:
2333: (define_insn "ashldi3_internal3"
2334: [(set (match_operand:DI 0 "register_operand" "=d")
2335: (ashift:DI (match_operand:DI 1 "register_operand" "d")
2336: (match_operand:SI 2 "small_int" "IJK")))
2337: (clobber (match_operand:SI 3 "register_operand" "=d"))]
2338: "!TARGET_DEBUG_G_MODE
2339: && (INTVAL (operands[2]) & 63) < 32
2340: && (INTVAL (operands[2]) & 63) != 0"
2341: "*
2342: {
2343: int amount = INTVAL (operands[2]);
2344:
2345: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
2346: operands[4] = const0_rtx;
2347: operands[5] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
2348:
2349: return \"sll\\t%M0,%M1,%2\;srl\\t%3,%L1,%5\;or\\t%M0,%M0,%3\;sll\\t%L0,%L1,%2\";
2350: }"
2351: [(set_attr "type" "darith")
2352: (set_attr "mode" "DI")
2353: (set_attr "length" "4")])
2354:
2355:
2356: (define_split
2357: [(set (match_operand:DI 0 "register_operand" "")
2358: (ashift:DI (match_operand:DI 1 "register_operand" "")
2359: (match_operand:SI 2 "small_int" "")))
2360: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2361: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2362: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2363: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2364: && (INTVAL (operands[2]) & 63) < 32
2365: && (INTVAL (operands[2]) & 63) != 0"
2366:
2367: [(set (subreg:SI (match_dup 0) 1)
2368: (ashift:SI (subreg:SI (match_dup 1) 1)
2369: (match_dup 2)))
2370:
2371: (set (match_dup 3)
2372: (lshiftrt:SI (subreg:SI (match_dup 1) 0)
2373: (match_dup 4)))
2374:
2375: (set (subreg:SI (match_dup 0) 1)
2376: (ior:SI (subreg:SI (match_dup 0) 1)
2377: (match_dup 3)))
2378:
2379: (set (subreg:SI (match_dup 0) 0)
2380: (ashift:SI (subreg:SI (match_dup 1) 0)
2381: (match_dup 2)))]
2382: "
2383: {
2384: int amount = INTVAL (operands[2]);
2385: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
2386: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
2387: }")
2388:
2389:
2390: (define_split
2391: [(set (match_operand:DI 0 "register_operand" "")
2392: (ashift:DI (match_operand:DI 1 "register_operand" "")
2393: (match_operand:SI 2 "small_int" "")))
2394: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2395: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2396: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2397: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2398: && (INTVAL (operands[2]) & 63) < 32
2399: && (INTVAL (operands[2]) & 63) != 0"
2400:
2401: [(set (subreg:SI (match_dup 0) 0)
2402: (ashift:SI (subreg:SI (match_dup 1) 0)
2403: (match_dup 2)))
2404:
2405: (set (match_dup 3)
2406: (lshiftrt:SI (subreg:SI (match_dup 1) 1)
2407: (match_dup 4)))
2408:
2409: (set (subreg:SI (match_dup 0) 0)
2410: (ior:SI (subreg:SI (match_dup 0) 0)
2411: (match_dup 3)))
2412:
2413: (set (subreg:SI (match_dup 0) 1)
2414: (ashift:SI (subreg:SI (match_dup 1) 1)
2415: (match_dup 2)))]
2416: "
2417: {
2418: int amount = INTVAL (operands[2]);
2419: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
2420: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
2421: }")
2422:
2423:
2424: (define_insn "ashrsi3"
2425: [(set (match_operand:SI 0 "register_operand" "=d")
2426: (ashiftrt:SI (match_operand:SI 1 "register_operand" "d")
2427: (match_operand:SI 2 "arith_operand" "dI")))]
2428: ""
2429: "*
2430: {
2431: if (GET_CODE (operands[2]) == CONST_INT)
2432: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
2433:
2434: return \"sra\\t%0,%1,%2\";
2435: }"
2436: [(set_attr "type" "arith")
2437: (set_attr "mode" "SI")
2438: (set_attr "length" "1")])
2439:
2440:
2441: (define_expand "ashrdi3"
2442: [(parallel [(set (match_operand:DI 0 "register_operand" "")
2443: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
2444: (match_operand:SI 2 "arith_operand" "")))
2445: (clobber (match_dup 3))])]
2446: "!TARGET_DEBUG_G_MODE"
2447: "operands[3] = gen_reg_rtx (SImode);")
2448:
2449:
2450: (define_insn "ashrdi3_internal"
1.1.1.4 ! root 2451: [(set (match_operand:DI 0 "register_operand" "=&d")
1.1 root 2452: (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
2453: (match_operand:SI 2 "register_operand" "d")))
2454: (clobber (match_operand:SI 3 "register_operand" "=d"))]
2455: "!TARGET_DEBUG_G_MODE"
2456: "*
2457: {
2458: operands[4] = const0_rtx;
2459: dslots_jump_total += 3;
2460: dslots_jump_filled += 2;
2461:
2462: return \"sll\\t%3,%2,26\\n\\
2463: \\tbgez\\t%3,1f\\n\\
2464: \\tsra\\t%L0,%M1,%2\\n\\
2465: \\t%(b\\t3f\\n\\
2466: \\tsra\\t%M0,%M1,31%)\\n\\
2467: \\n\\
2468: 1:\\n\\
2469: \\t%(beq\\t%3,%z4,2f\\n\\
2470: \\tsrl\\t%L0,%L1,%2%)\\n\\
2471: \\n\\
2472: \\tsubu\\t%3,%z4,%2\\n\\
2473: \\tsll\\t%3,%M1,%3\\n\\
2474: \\tor\\t%L0,%L0,%3\\n\\
2475: 2:\\n\\
2476: \\tsra\\t%M0,%M1,%2\\n\\
2477: 3:\";
2478: }"
2479: [(set_attr "type" "darith")
2480: (set_attr "mode" "DI")
2481: (set_attr "length" "12")])
2482:
2483:
2484: (define_insn "ashrdi3_internal2"
2485: [(set (match_operand:DI 0 "register_operand" "=d")
2486: (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
2487: (match_operand:SI 2 "small_int" "IJK")))
2488: (clobber (match_operand:SI 3 "register_operand" "=d"))]
2489: "!TARGET_DEBUG_G_MODE && (INTVAL (operands[2]) & 32) != 0"
2490: "*
2491: {
2492: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
2493: return \"sra\\t%L0,%M1,%2\;sra\\t%M0,%M1,31\";
2494: }"
2495: [(set_attr "type" "darith")
2496: (set_attr "mode" "DI")
2497: (set_attr "length" "2")])
2498:
2499:
2500: (define_split
2501: [(set (match_operand:DI 0 "register_operand" "")
2502: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
2503: (match_operand:SI 2 "small_int" "")))
2504: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2505: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2506: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2507: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2508: && (INTVAL (operands[2]) & 32) != 0"
2509:
2510: [(set (subreg:SI (match_dup 0) 0) (ashiftrt:SI (subreg:SI (match_dup 1) 1) (match_dup 2)))
2511: (set (subreg:SI (match_dup 0) 1) (ashiftrt:SI (subreg:SI (match_dup 1) 1) (const_int 31)))]
2512:
2513: "operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);")
2514:
2515:
2516: (define_split
2517: [(set (match_operand:DI 0 "register_operand" "")
2518: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
2519: (match_operand:SI 2 "small_int" "")))
2520: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2521: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2522: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2523: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2524: && (INTVAL (operands[2]) & 32) != 0"
2525:
2526: [(set (subreg:SI (match_dup 0) 1) (ashiftrt:SI (subreg:SI (match_dup 1) 0) (match_dup 2)))
2527: (set (subreg:SI (match_dup 0) 0) (ashiftrt:SI (subreg:SI (match_dup 1) 0) (const_int 31)))]
2528:
2529: "operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);")
2530:
2531:
2532: (define_insn "ashrdi3_internal3"
2533: [(set (match_operand:DI 0 "register_operand" "=d")
2534: (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
2535: (match_operand:SI 2 "small_int" "IJK")))
2536: (clobber (match_operand:SI 3 "register_operand" "=d"))]
2537: "!TARGET_DEBUG_G_MODE
2538: && (INTVAL (operands[2]) & 63) < 32
2539: && (INTVAL (operands[2]) & 63) != 0"
2540: "*
2541: {
2542: int amount = INTVAL (operands[2]);
2543:
2544: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
2545: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
2546:
2547: return \"srl\\t%L0,%L1,%2\;sll\\t%3,%M1,%4\;or\\t%L0,%L0,%3\;sra\\t%M0,%M1,%2\";
2548: }"
2549: [(set_attr "type" "darith")
2550: (set_attr "mode" "DI")
2551: (set_attr "length" "4")])
2552:
2553:
2554: (define_split
2555: [(set (match_operand:DI 0 "register_operand" "")
2556: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
2557: (match_operand:SI 2 "small_int" "")))
2558: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2559: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2560: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2561: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2562: && (INTVAL (operands[2]) & 63) < 32
2563: && (INTVAL (operands[2]) & 63) != 0"
2564:
2565: [(set (subreg:SI (match_dup 0) 0)
2566: (lshiftrt:SI (subreg:SI (match_dup 1) 0)
2567: (match_dup 2)))
2568:
2569: (set (match_dup 3)
2570: (ashift:SI (subreg:SI (match_dup 1) 1)
2571: (match_dup 4)))
2572:
2573: (set (subreg:SI (match_dup 0) 0)
2574: (ior:SI (subreg:SI (match_dup 0) 0)
2575: (match_dup 3)))
2576:
2577: (set (subreg:SI (match_dup 0) 1)
2578: (ashiftrt:SI (subreg:SI (match_dup 1) 1)
2579: (match_dup 2)))]
2580: "
2581: {
2582: int amount = INTVAL (operands[2]);
2583: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
2584: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
2585: }")
2586:
2587:
2588: (define_split
2589: [(set (match_operand:DI 0 "register_operand" "")
2590: (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
2591: (match_operand:SI 2 "small_int" "")))
2592: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2593: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2594: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2595: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2596: && (INTVAL (operands[2]) & 63) < 32
2597: && (INTVAL (operands[2]) & 63) != 0"
2598:
2599: [(set (subreg:SI (match_dup 0) 1)
2600: (lshiftrt:SI (subreg:SI (match_dup 1) 1)
2601: (match_dup 2)))
2602:
2603: (set (match_dup 3)
2604: (ashift:SI (subreg:SI (match_dup 1) 0)
2605: (match_dup 4)))
2606:
2607: (set (subreg:SI (match_dup 0) 1)
2608: (ior:SI (subreg:SI (match_dup 0) 1)
2609: (match_dup 3)))
2610:
2611: (set (subreg:SI (match_dup 0) 0)
2612: (ashiftrt:SI (subreg:SI (match_dup 1) 0)
2613: (match_dup 2)))]
2614: "
2615: {
2616: int amount = INTVAL (operands[2]);
2617: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
2618: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
2619: }")
2620:
2621:
2622: (define_insn "lshrsi3"
2623: [(set (match_operand:SI 0 "register_operand" "=d")
2624: (lshiftrt:SI (match_operand:SI 1 "register_operand" "d")
2625: (match_operand:SI 2 "arith_operand" "dI")))]
2626: ""
2627: "*
2628: {
2629: if (GET_CODE (operands[2]) == CONST_INT)
2630: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
2631:
2632: return \"srl\\t%0,%1,%2\";
2633: }"
2634: [(set_attr "type" "arith")
2635: (set_attr "mode" "SI")
2636: (set_attr "length" "1")])
2637:
2638:
2639: (define_expand "lshrdi3"
2640: [(parallel [(set (match_operand:DI 0 "register_operand" "")
2641: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
2642: (match_operand:SI 2 "arith_operand" "")))
2643: (clobber (match_dup 3))])]
2644: "!TARGET_DEBUG_G_MODE"
2645: "operands[3] = gen_reg_rtx (SImode);")
2646:
2647:
2648: (define_insn "lshrdi3_internal"
2649: [(set (match_operand:DI 0 "register_operand" "=&d")
2650: (lshiftrt:DI (match_operand:DI 1 "register_operand" "d")
2651: (match_operand:SI 2 "register_operand" "d")))
2652: (clobber (match_operand:SI 3 "register_operand" "=d"))]
2653: "!TARGET_DEBUG_G_MODE"
2654: "*
2655: {
2656: operands[4] = const0_rtx;
2657: dslots_jump_total += 3;
2658: dslots_jump_filled += 2;
2659:
2660: return \"sll\\t%3,%2,26\\n\\
2661: \\tbgez\\t%3,1f\\n\\
2662: \\tsrl\\t%L0,%M1,%2\\n\\
2663: \\t%(b\\t3f\\n\\
2664: \\tmove\\t%M0,%z4%)\\n\\
2665: \\n\\
2666: 1:\\n\\
2667: \\t%(beq\\t%3,%z4,2f\\n\\
2668: \\tsrl\\t%L0,%L1,%2%)\\n\\
2669: \\n\\
2670: \\tsubu\\t%3,%z4,%2\\n\\
2671: \\tsll\\t%3,%M1,%3\\n\\
2672: \\tor\\t%L0,%L0,%3\\n\\
2673: 2:\\n\\
2674: \\tsrl\\t%M0,%M1,%2\\n\\
2675: 3:\";
2676: }"
2677: [(set_attr "type" "darith")
2678: (set_attr "mode" "DI")
2679: (set_attr "length" "12")])
2680:
2681:
2682: (define_insn "lshrdi3_internal2"
2683: [(set (match_operand:DI 0 "register_operand" "=d")
2684: (lshiftrt:DI (match_operand:DI 1 "register_operand" "d")
2685: (match_operand:SI 2 "small_int" "IJK")))
2686: (clobber (match_operand:SI 3 "register_operand" "=d"))]
2687: "!TARGET_DEBUG_G_MODE && (INTVAL (operands[2]) & 32) != 0"
2688: "*
2689: {
2690: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
2691: operands[4] = const0_rtx;
2692: return \"srl\\t%L0,%M1,%2\;move\\t%M0,%z4\";
2693: }"
2694: [(set_attr "type" "darith")
2695: (set_attr "mode" "DI")
2696: (set_attr "length" "2")])
2697:
2698:
2699: (define_split
2700: [(set (match_operand:DI 0 "register_operand" "")
2701: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
2702: (match_operand:SI 2 "small_int" "")))
2703: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2704: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2705: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2706: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2707: && (INTVAL (operands[2]) & 32) != 0"
2708:
2709: [(set (subreg:SI (match_dup 0) 0) (lshiftrt:SI (subreg:SI (match_dup 1) 1) (match_dup 2)))
2710: (set (subreg:SI (match_dup 0) 1) (const_int 0))]
2711:
2712: "operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);")
2713:
2714:
2715: (define_split
2716: [(set (match_operand:DI 0 "register_operand" "")
2717: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
2718: (match_operand:SI 2 "small_int" "")))
2719: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2720: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2721: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2722: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2723: && (INTVAL (operands[2]) & 32) != 0"
2724:
2725: [(set (subreg:SI (match_dup 0) 1) (lshiftrt:SI (subreg:SI (match_dup 1) 0) (match_dup 2)))
2726: (set (subreg:SI (match_dup 0) 0) (const_int 0))]
2727:
2728: "operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);")
2729:
2730:
2731: (define_insn "lshrdi3_internal3"
2732: [(set (match_operand:DI 0 "register_operand" "=d")
2733: (lshiftrt:DI (match_operand:DI 1 "register_operand" "d")
2734: (match_operand:SI 2 "small_int" "IJK")))
2735: (clobber (match_operand:SI 3 "register_operand" "=d"))]
2736: "!TARGET_DEBUG_G_MODE
2737: && (INTVAL (operands[2]) & 63) < 32
2738: && (INTVAL (operands[2]) & 63) != 0"
2739: "*
2740: {
2741: int amount = INTVAL (operands[2]);
2742:
2743: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
2744: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
2745:
2746: return \"srl\\t%L0,%L1,%2\;sll\\t%3,%M1,%4\;or\\t%L0,%L0,%3\;srl\\t%M0,%M1,%2\";
2747: }"
2748: [(set_attr "type" "darith")
2749: (set_attr "mode" "DI")
2750: (set_attr "length" "4")])
2751:
2752:
2753: (define_split
2754: [(set (match_operand:DI 0 "register_operand" "")
2755: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
2756: (match_operand:SI 2 "small_int" "")))
2757: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2758: "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2759: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2760: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2761: && (INTVAL (operands[2]) & 63) < 32
2762: && (INTVAL (operands[2]) & 63) != 0"
2763:
2764: [(set (subreg:SI (match_dup 0) 0)
2765: (lshiftrt:SI (subreg:SI (match_dup 1) 0)
2766: (match_dup 2)))
2767:
2768: (set (match_dup 3)
2769: (ashift:SI (subreg:SI (match_dup 1) 1)
2770: (match_dup 4)))
2771:
2772: (set (subreg:SI (match_dup 0) 0)
2773: (ior:SI (subreg:SI (match_dup 0) 0)
2774: (match_dup 3)))
2775:
2776: (set (subreg:SI (match_dup 0) 1)
2777: (lshiftrt:SI (subreg:SI (match_dup 1) 1)
2778: (match_dup 2)))]
2779: "
2780: {
2781: int amount = INTVAL (operands[2]);
2782: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
2783: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
2784: }")
2785:
2786:
2787: (define_split
2788: [(set (match_operand:DI 0 "register_operand" "")
2789: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
2790: (match_operand:SI 2 "small_int" "")))
2791: (clobber (match_operand:SI 3 "register_operand" ""))]
1.1.1.3 root 2792: "reload_completed && WORDS_BIG_ENDIAN && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE
1.1 root 2793: && GET_CODE (operands[0]) == REG && REGNO (operands[0]) < FIRST_PSEUDO_REGISTER
2794: && GET_CODE (operands[1]) == REG && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
2795: && (INTVAL (operands[2]) & 63) < 32
2796: && (INTVAL (operands[2]) & 63) != 0"
2797:
2798: [(set (subreg:SI (match_dup 0) 1)
2799: (lshiftrt:SI (subreg:SI (match_dup 1) 1)
2800: (match_dup 2)))
2801:
2802: (set (match_dup 3)
2803: (ashift:SI (subreg:SI (match_dup 1) 0)
2804: (match_dup 4)))
2805:
2806: (set (subreg:SI (match_dup 0) 1)
2807: (ior:SI (subreg:SI (match_dup 0) 1)
2808: (match_dup 3)))
2809:
2810: (set (subreg:SI (match_dup 0) 0)
2811: (lshiftrt:SI (subreg:SI (match_dup 1) 0)
2812: (match_dup 2)))]
2813: "
2814: {
2815: int amount = INTVAL (operands[2]);
2816: operands[2] = gen_rtx (CONST_INT, VOIDmode, (amount & 31));
2817: operands[4] = gen_rtx (CONST_INT, VOIDmode, ((-amount) & 31));
2818: }")
2819:
2820:
2821: ;;
2822: ;; ....................
2823: ;;
2824: ;; COMPARISONS
2825: ;;
2826: ;; ....................
2827:
2828: ;; Flow here is rather complex:
2829: ;;
2830: ;; 1) The cmp{si,sf,df} routine is called. It deposits the
2831: ;; arguments into the branch_cmp array, and the type into
2832: ;; branch_type. No RTL is generated.
2833: ;;
2834: ;; 2) The appropriate branch define_expand is called, which then
2835: ;; creates the appropriate RTL for the comparison and branch.
2836: ;; Different CC modes are used, based on what type of branch is
2837: ;; done, so that we can constrain things appropriately. There
2838: ;; are assumptions in the rest of GCC that break if we fold the
2839: ;; operands into the branchs for integer operations, and use cc0
1.1.1.3 root 2840: ;; for floating point, so we use the fp status register instead.
2841: ;; If needed, an appropriate temporary is created to hold the
2842: ;; of the integer compare.
1.1 root 2843:
2844: (define_expand "cmpsi"
2845: [(set (cc0)
2846: (compare:CC (match_operand:SI 0 "register_operand" "")
2847: (match_operand:SI 1 "arith_operand" "")))]
2848: ""
2849: "
2850: {
2851: if (operands[0]) /* avoid unused code message */
2852: {
2853: branch_cmp[0] = operands[0];
2854: branch_cmp[1] = operands[1];
2855: branch_type = CMP_SI;
2856: DONE;
2857: }
2858: }")
2859:
2860: (define_expand "tstsi"
2861: [(set (cc0)
2862: (match_operand:SI 0 "register_operand" ""))]
2863: ""
2864: "
2865: {
2866: if (operands[0]) /* avoid unused code message */
2867: {
2868: branch_cmp[0] = operands[0];
2869: branch_cmp[1] = const0_rtx;
2870: branch_type = CMP_SI;
2871: DONE;
2872: }
2873: }")
2874:
2875: (define_expand "cmpdf"
2876: [(set (cc0)
2877: (compare:CC_FP (match_operand:DF 0 "register_operand" "")
2878: (match_operand:DF 1 "register_operand" "")))]
2879: "TARGET_HARD_FLOAT"
2880: "
2881: {
2882: if (operands[0]) /* avoid unused code message */
2883: {
2884: branch_cmp[0] = operands[0];
2885: branch_cmp[1] = operands[1];
2886: branch_type = CMP_DF;
2887: DONE;
2888: }
2889: }")
2890:
2891: (define_expand "cmpsf"
2892: [(set (cc0)
2893: (compare:CC_FP (match_operand:SF 0 "register_operand" "")
2894: (match_operand:SF 1 "register_operand" "")))]
2895: "TARGET_HARD_FLOAT"
2896: "
2897: {
2898: if (operands[0]) /* avoid unused code message */
2899: {
2900: branch_cmp[0] = operands[0];
2901: branch_cmp[1] = operands[1];
2902: branch_type = CMP_SF;
2903: DONE;
2904: }
2905: }")
2906:
2907:
2908: ;;
2909: ;; ....................
2910: ;;
2911: ;; CONDITIONAL BRANCHES
2912: ;;
2913: ;; ....................
2914:
1.1.1.3 root 2915: (define_insn "branch_fp_ne"
1.1 root 2916: [(set (pc)
1.1.1.3 root 2917: (if_then_else (ne:CC_FP (reg:CC_FP 66)
2918: (const_int 0))
2919: (match_operand 0 "pc_or_label_operand" "")
2920: (match_operand 1 "pc_or_label_operand" "")))]
1.1 root 2921: ""
2922: "*
2923: {
2924: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
1.1.1.3 root 2925: return (operands[0] != pc_rtx) ? \"%*bc1t%?\\t%0\" : \"%*bc1f%?\\t%1\";
1.1 root 2926: }"
2927: [(set_attr "type" "branch")
2928: (set_attr "mode" "none")
1.1.1.3 root 2929: (set_attr "length" "1")])
1.1 root 2930:
1.1.1.3 root 2931: (define_insn "branch_fp_ne_rev"
1.1 root 2932: [(set (pc)
1.1.1.3 root 2933: (if_then_else (ne:CC_REV_FP (reg:CC_REV_FP 66)
2934: (const_int 0))
2935: (match_operand 0 "pc_or_label_operand" "")
2936: (match_operand 1 "pc_or_label_operand" "")))]
1.1 root 2937: ""
2938: "*
2939: {
2940: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
1.1.1.3 root 2941: return (operands[0] != pc_rtx) ? \"%*bc1f%?\\t%0\" : \"%*bc1t%?\\t%1\";
1.1 root 2942: }"
2943: [(set_attr "type" "branch")
2944: (set_attr "mode" "none")
1.1.1.3 root 2945: (set_attr "length" "1")])
1.1 root 2946:
1.1.1.3 root 2947: (define_insn "branch_fp_eq"
1.1 root 2948: [(set (pc)
1.1.1.3 root 2949: (if_then_else (eq:CC_FP (reg:CC_FP 66)
2950: (const_int 0))
2951: (match_operand 0 "pc_or_label_operand" "")
2952: (match_operand 1 "pc_or_label_operand" "")))]
1.1 root 2953: ""
2954: "*
2955: {
2956: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
1.1.1.3 root 2957: return (operands[0] != pc_rtx) ? \"%*bc1f%?\\t%0\" : \"%*bc1t%?\\t%1\";
1.1 root 2958: }"
2959: [(set_attr "type" "branch")
2960: (set_attr "mode" "none")
2961: (set_attr "length" "1")])
2962:
1.1.1.3 root 2963: (define_insn "branch_fp_eq_rev"
1.1 root 2964: [(set (pc)
1.1.1.3 root 2965: (if_then_else (eq:CC_REV_FP (reg:CC_REV_FP 66)
2966: (const_int 0))
2967: (match_operand 0 "pc_or_label_operand" "")
2968: (match_operand 1 "pc_or_label_operand" "")))]
1.1 root 2969: ""
2970: "*
2971: {
2972: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
1.1.1.3 root 2973: return (operands[0] != pc_rtx) ? \"%*bc1t%?\\t%0\" : \"%*bc1f%?\\t%1\";
1.1 root 2974: }"
2975: [(set_attr "type" "branch")
2976: (set_attr "mode" "none")
2977: (set_attr "length" "1")])
2978:
1.1.1.3 root 2979:
2980: (define_insn "branch_zero"
1.1 root 2981: [(set (pc)
1.1.1.3 root 2982: (if_then_else (match_operator:SI 0 "cmp_op"
1.1.1.4 ! root 2983: [(match_operand:SI 1 "register_operand" "d")
1.1.1.3 root 2984: (const_int 0)])
2985: (match_operand 2 "pc_or_label_operand" "")
2986: (match_operand 3 "pc_or_label_operand" "")))]
1.1 root 2987: ""
2988: "*
2989: {
2990: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
1.1.1.3 root 2991: if (operands[2] != pc_rtx)
2992: { /* normal jump */
2993: switch (GET_CODE (operands[0]))
2994: {
2995: case EQ: return \"%*beq%?\\t%z1,%.,%2\";
2996: case NE: return \"%*bne%?\\t%z1,%.,%2\";
2997: case GTU: return \"%*bne%?\\t%z1,%.,%2\";
2998: case LEU: return \"%*beq%?\\t%z1,%.,%2\";
2999: case GEU: return \"%*j\\t%2\";
1.1.1.4 ! root 3000: case LTU: return \"%*bne%?\\t%.,%.,%2\";
1.1.1.3 root 3001: }
1.1 root 3002:
1.1.1.3 root 3003: return \"%*b%C0z%?\\t%z1,%2\";
1.1 root 3004: }
1.1.1.3 root 3005: else
3006: { /* inverted jump */
3007: switch (GET_CODE (operands[0]))
3008: {
3009: case EQ: return \"%*bne%?\\t%z1,%.,%3\";
3010: case NE: return \"%*beq%?\\t%z1,%.,%3\";
3011: case GTU: return \"%*beq%?\\t%z1,%.,%3\";
3012: case LEU: return \"%*bne%?\\t%z1,%.,%3\";
1.1.1.4 ! root 3013: case GEU: return \"%*beq%?\\t%.,%.,%3\";
1.1.1.3 root 3014: case LTU: return \"%*j\\t%3\";
3015: }
1.1 root 3016:
1.1.1.3 root 3017: return \"%*b%N0z%?\\t%z1,%3\";
3018: }
1.1 root 3019: }"
3020: [(set_attr "type" "branch")
3021: (set_attr "mode" "none")
3022: (set_attr "length" "1")])
3023:
3024:
1.1.1.3 root 3025: (define_insn "branch_equality"
1.1 root 3026: [(set (pc)
1.1.1.3 root 3027: (if_then_else (match_operator:SI 0 "equality_op"
3028: [(match_operand:SI 1 "register_operand" "d")
3029: (match_operand:SI 2 "register_operand" "d")])
3030: (match_operand 3 "pc_or_label_operand" "")
3031: (match_operand 4 "pc_or_label_operand" "")))]
1.1 root 3032: ""
3033: "*
3034: {
3035: mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
1.1.1.3 root 3036: return (operands[3] != pc_rtx)
3037: ? \"%*b%C0%?\\t%z1,%z2,%3\"
3038: : \"%*b%N0%?\\t%z1,%z2,%4\";
1.1 root 3039: }"
3040: [(set_attr "type" "branch")
3041: (set_attr "mode" "none")
1.1.1.3 root 3042: (set_attr "length" "1")])
3043:
1.1 root 3044:
3045: (define_expand "beq"
3046: [(set (pc)
3047: (if_then_else (eq:CC_EQ (cc0)
3048: (const_int 0))
3049: (label_ref (match_operand 0 "" ""))
3050: (pc)))]
3051: ""
3052: "
3053: {
3054: if (operands[0]) /* avoid unused code warning */
3055: {
3056: gen_conditional_branch (operands, EQ);
3057: DONE;
3058: }
3059: }")
3060:
3061: (define_expand "bne"
3062: [(set (pc)
3063: (if_then_else (ne:CC_EQ (cc0)
3064: (const_int 0))
3065: (label_ref (match_operand 0 "" ""))
3066: (pc)))]
3067: ""
3068: "
3069: {
3070: if (operands[0]) /* avoid unused code warning */
3071: {
3072: gen_conditional_branch (operands, NE);
3073: DONE;
3074: }
3075: }")
3076:
3077: (define_expand "bgt"
3078: [(set (pc)
3079: (if_then_else (gt:CC (cc0)
3080: (const_int 0))
3081: (label_ref (match_operand 0 "" ""))
3082: (pc)))]
3083: ""
3084: "
3085: {
3086: if (operands[0]) /* avoid unused code warning */
3087: {
3088: gen_conditional_branch (operands, GT);
3089: DONE;
3090: }
3091: }")
3092:
3093: (define_expand "bge"
3094: [(set (pc)
3095: (if_then_else (ge:CC (cc0)
3096: (const_int 0))
3097: (label_ref (match_operand 0 "" ""))
3098: (pc)))]
3099: ""
3100: "
3101: {
3102: if (operands[0]) /* avoid unused code warning */
3103: {
3104: gen_conditional_branch (operands, GE);
3105: DONE;
3106: }
3107: }")
3108:
3109: (define_expand "blt"
3110: [(set (pc)
3111: (if_then_else (lt:CC (cc0)
3112: (const_int 0))
3113: (label_ref (match_operand 0 "" ""))
3114: (pc)))]
3115: ""
3116: "
3117: {
3118: if (operands[0]) /* avoid unused code warning */
3119: {
3120: gen_conditional_branch (operands, LT);
3121: DONE;
3122: }
3123: }")
3124:
3125: (define_expand "ble"
3126: [(set (pc)
3127: (if_then_else (le:CC (cc0)
3128: (const_int 0))
3129: (label_ref (match_operand 0 "" ""))
3130: (pc)))]
3131: ""
3132: "
3133: {
3134: if (operands[0]) /* avoid unused code warning */
3135: {
3136: gen_conditional_branch (operands, LE);
3137: DONE;
3138: }
3139: }")
3140:
3141: (define_expand "bgtu"
3142: [(set (pc)
3143: (if_then_else (gtu:CC (cc0)
3144: (const_int 0))
3145: (label_ref (match_operand 0 "" ""))
3146: (pc)))]
3147: ""
3148: "
3149: {
3150: if (operands[0]) /* avoid unused code warning */
3151: {
3152: gen_conditional_branch (operands, GTU);
3153: DONE;
3154: }
3155: }")
3156:
3157: (define_expand "bgeu"
3158: [(set (pc)
3159: (if_then_else (geu:CC (cc0)
3160: (const_int 0))
3161: (label_ref (match_operand 0 "" ""))
3162: (pc)))]
3163: ""
3164: "
3165: {
3166: if (operands[0]) /* avoid unused code warning */
3167: {
3168: gen_conditional_branch (operands, GEU);
3169: DONE;
3170: }
3171: }")
3172:
3173:
3174: (define_expand "bltu"
3175: [(set (pc)
3176: (if_then_else (ltu:CC (cc0)
3177: (const_int 0))
3178: (label_ref (match_operand 0 "" ""))
3179: (pc)))]
3180: ""
3181: "
3182: {
3183: if (operands[0]) /* avoid unused code warning */
3184: {
3185: gen_conditional_branch (operands, LTU);
3186: DONE;
3187: }
3188: }")
3189:
3190: (define_expand "bleu"
3191: [(set (pc)
3192: (if_then_else (leu:CC (cc0)
3193: (const_int 0))
3194: (label_ref (match_operand 0 "" ""))
3195: (pc)))]
3196: ""
3197: "
3198: {
3199: if (operands[0]) /* avoid unused code warning */
3200: {
3201: gen_conditional_branch (operands, LEU);
3202: DONE;
3203: }
3204: }")
3205:
3206:
3207: ;;
3208: ;; ....................
3209: ;;
3210: ;; SETTING A REGISTER FROM A COMPARISON
3211: ;;
3212: ;; ....................
3213:
3214: (define_expand "seq"
3215: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3216: (eq:SI (match_dup 1)
3217: (match_dup 2)))]
1.1 root 3218: ""
3219: "
3220: {
3221: if (branch_type != CMP_SI)
3222: FAIL;
3223:
3224: /* set up operands from compare. */
3225: operands[1] = branch_cmp[0];
3226: operands[2] = branch_cmp[1];
3227:
1.1.1.3 root 3228: if (!TARGET_DEBUG_C_MODE)
3229: {
3230: gen_int_relational (EQ, operands[0], operands[1], operands[2], (int *)0);
3231: DONE;
3232: }
3233:
1.1 root 3234: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
3235: operands[2] = force_reg (SImode, operands[2]);
3236:
3237: /* fall through and generate default code */
3238: }")
3239:
1.1.1.3 root 3240:
3241: (define_insn "seq_si_zero"
3242: [(set (match_operand:SI 0 "register_operand" "=d")
3243: (eq:SI (match_operand:SI 1 "register_operand" "d")
3244: (const_int 0)))]
1.1 root 3245: ""
1.1.1.3 root 3246: "sltu\\t%0,%1,1"
3247: [(set_attr "type" "arith")
3248: (set_attr "mode" "SI")
3249: (set_attr "length" "1")])
3250:
3251: (define_insn "seq_si"
3252: [(set (match_operand:SI 0 "register_operand" "=d,d")
3253: (eq:SI (match_operand:SI 1 "register_operand" "%d,d")
3254: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
3255: "TARGET_DEBUG_C_MODE"
1.1 root 3256: "@
3257: xor\\t%0,%1,%2\;sltu\\t%0,%0,1
1.1.1.3 root 3258: xori\\t%0,%1,%2\;sltu\\t%0,%0,1"
3259: [(set_attr "type" "arith")
3260: (set_attr "mode" "SI")
3261: (set_attr "length" "2")])
1.1 root 3262:
3263: (define_split
3264: [(set (match_operand:SI 0 "register_operand" "")
1.1.1.3 root 3265: (eq:SI (match_operand:SI 1 "register_operand" "")
3266: (match_operand:SI 2 "uns_arith_operand" "")))]
3267: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE
3268: && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)"
1.1 root 3269: [(set (match_dup 0)
3270: (xor:SI (match_dup 1)
3271: (match_dup 2)))
3272: (set (match_dup 0)
1.1.1.3 root 3273: (ltu:SI (match_dup 0)
1.1 root 3274: (const_int 1)))]
3275: "")
3276:
3277: (define_expand "sne"
3278: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3279: (ne:SI (match_dup 1)
3280: (match_dup 2)))]
1.1 root 3281: ""
3282: "
3283: {
3284: if (branch_type != CMP_SI)
3285: FAIL;
3286:
3287: /* set up operands from compare. */
3288: operands[1] = branch_cmp[0];
3289: operands[2] = branch_cmp[1];
3290:
1.1.1.3 root 3291: if (!TARGET_DEBUG_C_MODE)
3292: {
3293: gen_int_relational (NE, operands[0], operands[1], operands[2], (int *)0);
3294: DONE;
3295: }
3296:
1.1 root 3297: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
3298: operands[2] = force_reg (SImode, operands[2]);
3299:
3300: /* fall through and generate default code */
3301: }")
3302:
1.1.1.3 root 3303: (define_insn "sne_si_zero"
3304: [(set (match_operand:SI 0 "register_operand" "=d")
3305: (ne:SI (match_operand:SI 1 "register_operand" "d")
3306: (const_int 0)))]
1.1 root 3307: ""
1.1.1.3 root 3308: "sltu\\t%0,%.,%1"
3309: [(set_attr "type" "arith")
3310: (set_attr "mode" "SI")
3311: (set_attr "length" "1")])
1.1 root 3312:
1.1.1.3 root 3313: (define_insn "sne_si"
3314: [(set (match_operand:SI 0 "register_operand" "=d,d")
3315: (ne:SI (match_operand:SI 1 "register_operand" "%d,d")
3316: (match_operand:SI 2 "uns_arith_operand" "d,K")))]
3317: "TARGET_DEBUG_C_MODE"
3318: "@
3319: xor\\t%0,%1,%2\;sltu\\t%0,%.,%0
3320: xori\\t%0,%1,%x2\;sltu\\t%0,%.,%0"
3321: [(set_attr "type" "arith")
3322: (set_attr "mode" "SI")
3323: (set_attr "length" "2")])
1.1 root 3324:
3325: (define_split
3326: [(set (match_operand:SI 0 "register_operand" "")
1.1.1.3 root 3327: (ne:SI (match_operand:SI 1 "register_operand" "")
3328: (match_operand:SI 2 "uns_arith_operand" "")))]
3329: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE
3330: && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)"
1.1 root 3331: [(set (match_dup 0)
3332: (xor:SI (match_dup 1)
3333: (match_dup 2)))
3334: (set (match_dup 0)
1.1.1.3 root 3335: (gtu:SI (match_dup 0)
1.1 root 3336: (const_int 0)))]
3337: "")
3338:
3339: (define_expand "sgt"
3340: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3341: (gt:SI (match_dup 1)
1.1 root 3342: (match_dup 2)))]
3343: ""
3344: "
3345: {
3346: if (branch_type != CMP_SI)
3347: FAIL;
3348:
3349: /* set up operands from compare. */
3350: operands[1] = branch_cmp[0];
3351: operands[2] = branch_cmp[1];
3352:
1.1.1.3 root 3353: if (!TARGET_DEBUG_C_MODE)
3354: {
3355: gen_int_relational (GT, operands[0], operands[1], operands[2], (int *)0);
3356: DONE;
3357: }
3358:
1.1 root 3359: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) != 0)
3360: operands[2] = force_reg (SImode, operands[2]);
3361:
3362: /* fall through and generate default code */
3363: }")
3364:
3365: (define_insn "sgt_si"
3366: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3367: (gt:SI (match_operand:SI 1 "register_operand" "d")
1.1 root 3368: (match_operand:SI 2 "reg_or_0_operand" "dJ")))]
3369: ""
3370: "slt\\t%0,%z2,%1"
3371: [(set_attr "type" "arith")
3372: (set_attr "mode" "SI")
3373: (set_attr "length" "1")])
3374:
3375: (define_expand "sge"
3376: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3377: (ge:SI (match_dup 1)
1.1 root 3378: (match_dup 2)))]
3379: ""
3380: "
3381: {
3382: if (branch_type != CMP_SI)
3383: FAIL;
3384:
3385: /* set up operands from compare. */
3386: operands[1] = branch_cmp[0];
3387: operands[2] = branch_cmp[1];
3388:
1.1.1.3 root 3389: if (!TARGET_DEBUG_C_MODE)
3390: {
3391: gen_int_relational (GE, operands[0], operands[1], operands[2], (int *)0);
3392: DONE;
3393: }
3394:
1.1 root 3395: /* fall through and generate default code */
3396: }")
3397:
3398: (define_insn "sge_si"
3399: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3400: (ge:SI (match_operand:SI 1 "register_operand" "d")
1.1 root 3401: (match_operand:SI 2 "arith_operand" "dI")))]
1.1.1.3 root 3402: "TARGET_DEBUG_C_MODE"
1.1 root 3403: "slt\\t%0,%1,%2\;xori\\t%0,%0,0x0001"
3404: [(set_attr "type" "arith")
3405: (set_attr "mode" "SI")
3406: (set_attr "length" "2")])
3407:
3408: (define_split
3409: [(set (match_operand:SI 0 "register_operand" "")
1.1.1.3 root 3410: (ge:SI (match_operand:SI 1 "register_operand" "")
1.1 root 3411: (match_operand:SI 2 "arith_operand" "")))]
1.1.1.3 root 3412: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
1.1 root 3413: [(set (match_dup 0)
1.1.1.3 root 3414: (lt:SI (match_dup 1)
1.1 root 3415: (match_dup 2)))
3416: (set (match_dup 0)
3417: (xor:SI (match_dup 0)
3418: (const_int 1)))]
3419: "")
3420:
3421: (define_expand "slt"
3422: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3423: (lt:SI (match_dup 1)
1.1 root 3424: (match_dup 2)))]
3425: ""
3426: "
3427: {
3428: if (branch_type != CMP_SI)
3429: FAIL;
3430:
3431: /* set up operands from compare. */
3432: operands[1] = branch_cmp[0];
3433: operands[2] = branch_cmp[1];
3434:
1.1.1.3 root 3435: if (!TARGET_DEBUG_C_MODE)
3436: {
3437: gen_int_relational (LT, operands[0], operands[1], operands[2], (int *)0);
3438: DONE;
3439: }
3440:
1.1 root 3441: /* fall through and generate default code */
3442: }")
3443:
3444: (define_insn "slt_si"
3445: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3446: (lt:SI (match_operand:SI 1 "register_operand" "d")
1.1 root 3447: (match_operand:SI 2 "arith_operand" "dI")))]
3448: ""
3449: "slt\\t%0,%1,%2"
3450: [(set_attr "type" "arith")
3451: (set_attr "mode" "SI")
3452: (set_attr "length" "1")])
3453:
3454: (define_expand "sle"
3455: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3456: (le:SI (match_dup 1)
1.1 root 3457: (match_dup 2)))]
3458: ""
3459: "
3460: {
3461: if (branch_type != CMP_SI)
3462: FAIL;
3463:
3464: /* set up operands from compare. */
3465: operands[1] = branch_cmp[0];
3466: operands[2] = branch_cmp[1];
3467:
1.1.1.3 root 3468: if (!TARGET_DEBUG_C_MODE)
3469: {
3470: gen_int_relational (LE, operands[0], operands[1], operands[2], (int *)0);
3471: DONE;
3472: }
3473:
1.1 root 3474: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 32767)
3475: operands[2] = force_reg (SImode, operands[2]);
3476:
3477: /* fall through and generate default code */
3478: }")
3479:
1.1.1.3 root 3480: (define_insn "sle_si_const"
3481: [(set (match_operand:SI 0 "register_operand" "=d")
3482: (le:SI (match_operand:SI 1 "register_operand" "d")
3483: (match_operand:SI 2 "small_int" "I")))]
3484: "INTVAL (operands[2]) < 32767"
3485: "*
3486: {
3487: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2])+1);
3488: return \"slt\\t%0,%1,%2\";
3489: }"
3490: [(set_attr "type" "arith")
3491: (set_attr "mode" "SI")
3492: (set_attr "length" "1")])
3493:
3494: (define_insn "sle_si_reg"
3495: [(set (match_operand:SI 0 "register_operand" "=d")
3496: (le:SI (match_operand:SI 1 "register_operand" "d")
3497: (match_operand:SI 2 "register_operand" "d")))]
3498: "TARGET_DEBUG_C_MODE"
3499: "slt\\t%0,%z2,%1\;xori\\t%0,%0,0x0001"
3500: [(set_attr "type" "arith")
3501: (set_attr "mode" "SI")
3502: (set_attr "length" "2")])
1.1 root 3503:
3504: (define_split
3505: [(set (match_operand:SI 0 "register_operand" "")
1.1.1.3 root 3506: (le:SI (match_operand:SI 1 "register_operand" "")
1.1 root 3507: (match_operand:SI 2 "register_operand" "")))]
1.1.1.3 root 3508: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
1.1 root 3509: [(set (match_dup 0)
1.1.1.3 root 3510: (lt:SI (match_dup 2)
1.1 root 3511: (match_dup 1)))
3512: (set (match_dup 0)
3513: (xor:SI (match_dup 0)
3514: (const_int 1)))]
3515: "")
3516:
3517: (define_expand "sgtu"
3518: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3519: (gtu:SI (match_dup 1)
1.1 root 3520: (match_dup 2)))]
3521: ""
3522: "
3523: {
3524: if (branch_type != CMP_SI)
3525: FAIL;
3526:
3527: /* set up operands from compare. */
3528: operands[1] = branch_cmp[0];
3529: operands[2] = branch_cmp[1];
3530:
1.1.1.3 root 3531: if (!TARGET_DEBUG_C_MODE)
3532: {
3533: gen_int_relational (GTU, operands[0], operands[1], operands[2], (int *)0);
3534: DONE;
3535: }
3536:
1.1 root 3537: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) != 0)
3538: operands[2] = force_reg (SImode, operands[2]);
3539:
3540: /* fall through and generate default code */
3541: }")
3542:
3543: (define_insn "sgtu_si"
3544: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3545: (gtu:SI (match_operand:SI 1 "register_operand" "d")
1.1 root 3546: (match_operand:SI 2 "reg_or_0_operand" "dJ")))]
3547: ""
3548: "sltu\\t%0,%z2,%1"
3549: [(set_attr "type" "arith")
3550: (set_attr "mode" "SI")
3551: (set_attr "length" "1")])
3552:
3553: (define_expand "sgeu"
3554: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3555: (geu:SI (match_dup 1)
1.1 root 3556: (match_dup 2)))]
3557: ""
3558: "
3559: {
3560: if (branch_type != CMP_SI)
3561: FAIL;
3562:
3563: /* set up operands from compare. */
3564: operands[1] = branch_cmp[0];
3565: operands[2] = branch_cmp[1];
3566:
1.1.1.3 root 3567: if (!TARGET_DEBUG_C_MODE)
3568: {
3569: gen_int_relational (GEU, operands[0], operands[1], operands[2], (int *)0);
3570: DONE;
3571: }
3572:
1.1 root 3573: /* fall through and generate default code */
3574: }")
3575:
3576: (define_insn "sgeu_si"
3577: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3578: (geu:SI (match_operand:SI 1 "register_operand" "d")
1.1 root 3579: (match_operand:SI 2 "arith_operand" "dI")))]
1.1.1.3 root 3580: "TARGET_DEBUG_C_MODE"
1.1 root 3581: "sltu\\t%0,%1,%2\;xori\\t%0,%0,0x0001"
3582: [(set_attr "type" "arith")
3583: (set_attr "mode" "SI")
3584: (set_attr "length" "2")])
3585:
3586: (define_split
3587: [(set (match_operand:SI 0 "register_operand" "")
1.1.1.3 root 3588: (geu:SI (match_operand:SI 1 "register_operand" "")
1.1 root 3589: (match_operand:SI 2 "arith_operand" "")))]
1.1.1.3 root 3590: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
1.1 root 3591: [(set (match_dup 0)
1.1.1.3 root 3592: (ltu:SI (match_dup 1)
1.1 root 3593: (match_dup 2)))
3594: (set (match_dup 0)
3595: (xor:SI (match_dup 0)
3596: (const_int 1)))]
3597: "")
3598:
3599: (define_expand "sltu"
3600: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3601: (ltu:SI (match_dup 1)
1.1 root 3602: (match_dup 2)))]
3603: ""
3604: "
3605: {
3606: if (branch_type != CMP_SI)
3607: FAIL;
3608:
3609: /* set up operands from compare. */
3610: operands[1] = branch_cmp[0];
3611: operands[2] = branch_cmp[1];
3612:
1.1.1.3 root 3613: if (!TARGET_DEBUG_C_MODE)
3614: {
3615: gen_int_relational (LTU, operands[0], operands[1], operands[2], (int *)0);
3616: DONE;
3617: }
3618:
1.1 root 3619: /* fall through and generate default code */
3620: }")
3621:
3622: (define_insn "sltu_si"
3623: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3624: (ltu:SI (match_operand:SI 1 "register_operand" "d")
1.1 root 3625: (match_operand:SI 2 "arith_operand" "dI")))]
3626: ""
3627: "sltu\\t%0,%1,%2"
3628: [(set_attr "type" "arith")
3629: (set_attr "mode" "SI")
3630: (set_attr "length" "1")])
3631:
3632: (define_expand "sleu"
3633: [(set (match_operand:SI 0 "register_operand" "=d")
1.1.1.3 root 3634: (leu:SI (match_dup 1)
1.1 root 3635: (match_dup 2)))]
3636: ""
3637: "
3638: {
3639: if (branch_type != CMP_SI)
3640: FAIL;
3641:
3642: /* set up operands from compare. */
3643: operands[1] = branch_cmp[0];
3644: operands[2] = branch_cmp[1];
3645:
1.1.1.3 root 3646: if (!TARGET_DEBUG_C_MODE)
3647: {
3648: gen_int_relational (LEU, operands[0], operands[1], operands[2], (int *)0);
3649: DONE;
3650: }
3651:
1.1 root 3652: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 32767)
3653: operands[2] = force_reg (SImode, operands[2]);
3654:
3655: /* fall through and generate default code */
3656: }")
3657:
1.1.1.3 root 3658: (define_insn "sleu_si_const"
3659: [(set (match_operand:SI 0 "register_operand" "=d")
3660: (leu:SI (match_operand:SI 1 "register_operand" "d")
3661: (match_operand:SI 2 "small_int" "I")))]
3662: "INTVAL (operands[2]) < 32767"
3663: "*
3664: {
3665: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2])+1);
3666: return \"sltu\\t%0,%1,%2\";
3667: }"
3668: [(set_attr "type" "arith")
3669: (set_attr "mode" "SI")
3670: (set_attr "length" "1")])
3671:
3672: (define_insn "sleu_si_reg"
3673: [(set (match_operand:SI 0 "register_operand" "=d")
3674: (leu:SI (match_operand:SI 1 "register_operand" "d")
3675: (match_operand:SI 2 "register_operand" "d")))]
3676: "TARGET_DEBUG_C_MODE"
3677: "sltu\\t%0,%z2,%1\;xori\\t%0,%0,0x0001"
3678: [(set_attr "type" "arith")
3679: (set_attr "mode" "SI")
3680: (set_attr "length" "2")])
1.1 root 3681:
3682: (define_split
3683: [(set (match_operand:SI 0 "register_operand" "")
1.1.1.3 root 3684: (leu:SI (match_operand:SI 1 "register_operand" "")
1.1 root 3685: (match_operand:SI 2 "register_operand" "")))]
1.1.1.3 root 3686: "TARGET_DEBUG_C_MODE && !TARGET_DEBUG_D_MODE"
1.1 root 3687: [(set (match_dup 0)
1.1.1.3 root 3688: (ltu:SI (match_dup 2)
1.1 root 3689: (match_dup 1)))
3690: (set (match_dup 0)
3691: (xor:SI (match_dup 0)
3692: (const_int 1)))]
3693: "")
3694:
3695:
3696: ;;
3697: ;; ....................
3698: ;;
1.1.1.3 root 3699: ;; FLOATING POINT COMPARISONS
3700: ;;
3701: ;; ....................
3702:
3703: (define_insn "seq_df"
3704: [(set (reg:CC_FP 66)
3705: (eq:CC_FP (match_operand:DF 0 "register_operand" "f")
3706: (match_operand:DF 1 "register_operand" "f")))]
3707: ""
3708: "*
3709: {
3710: rtx xoperands[10];
3711: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3712: xoperands[1] = operands[0];
3713: xoperands[2] = operands[1];
3714:
3715: return mips_fill_delay_slot (\"c.eq.d\\t%0,%1\", DELAY_FCMP, xoperands, insn);
3716: }"
3717: [(set_attr "type" "fcmp")
3718: (set_attr "mode" "FPSW")
3719: (set_attr "length" "1")])
3720:
3721: (define_insn "sne_df"
3722: [(set (reg:CC_REV_FP 66)
3723: (ne:CC_REV_FP (match_operand:DF 0 "register_operand" "f")
3724: (match_operand:DF 1 "register_operand" "f")))]
3725: ""
3726: "*
3727: {
3728: rtx xoperands[10];
3729: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3730: xoperands[1] = operands[0];
3731: xoperands[2] = operands[1];
3732:
3733: return mips_fill_delay_slot (\"c.eq.d\\t%0,%1\", DELAY_FCMP, xoperands, insn);
3734: }"
3735: [(set_attr "type" "fcmp")
3736: (set_attr "mode" "FPSW")
3737: (set_attr "length" "1")])
3738:
3739: (define_insn "slt_df"
3740: [(set (reg:CC_FP 66)
3741: (lt:CC_FP (match_operand:DF 0 "register_operand" "f")
3742: (match_operand:DF 1 "register_operand" "f")))]
3743: ""
3744: "*
3745: {
3746: rtx xoperands[10];
3747: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3748: xoperands[1] = operands[0];
3749: xoperands[2] = operands[1];
3750:
3751: return mips_fill_delay_slot (\"c.lt.d\\t%0,%1\", DELAY_FCMP, xoperands, insn);
3752: }"
3753: [(set_attr "type" "fcmp")
3754: (set_attr "mode" "FPSW")
3755: (set_attr "length" "1")])
3756:
3757: (define_insn "sle_df"
3758: [(set (reg:CC_FP 66)
3759: (le:CC_FP (match_operand:DF 0 "register_operand" "f")
3760: (match_operand:DF 1 "register_operand" "f")))]
3761: ""
3762: "*
3763: {
3764: rtx xoperands[10];
3765: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3766: xoperands[1] = operands[0];
3767: xoperands[2] = operands[1];
3768:
3769: return mips_fill_delay_slot (\"c.le.d\\t%0,%1\", DELAY_FCMP, xoperands, insn);
3770: }"
3771: [(set_attr "type" "fcmp")
3772: (set_attr "mode" "FPSW")
3773: (set_attr "length" "1")])
3774:
3775: (define_insn "sgt_df"
3776: [(set (reg:CC_FP 66)
3777: (gt:CC_FP (match_operand:DF 0 "register_operand" "f")
3778: (match_operand:DF 1 "register_operand" "f")))]
3779: ""
3780: "*
3781: {
3782: rtx xoperands[10];
3783: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3784: xoperands[1] = operands[0];
3785: xoperands[2] = operands[1];
3786:
3787: return mips_fill_delay_slot (\"c.lt.d\\t%1,%0\", DELAY_FCMP, xoperands, insn);
3788: }"
3789: [(set_attr "type" "fcmp")
3790: (set_attr "mode" "FPSW")
3791: (set_attr "length" "1")])
3792:
3793: (define_insn "sge_df"
3794: [(set (reg:CC_FP 66)
3795: (ge:CC_FP (match_operand:DF 0 "register_operand" "f")
3796: (match_operand:DF 1 "register_operand" "f")))]
3797: ""
3798: "*
3799: {
3800: rtx xoperands[10];
3801: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3802: xoperands[1] = operands[0];
3803: xoperands[2] = operands[1];
3804:
3805: return mips_fill_delay_slot (\"c.le.d\\t%1,%0\", DELAY_FCMP, xoperands, insn);
3806: }"
3807: [(set_attr "type" "fcmp")
3808: (set_attr "mode" "FPSW")
3809: (set_attr "length" "1")])
3810:
3811: (define_insn "seq_sf"
3812: [(set (reg:CC_FP 66)
3813: (eq:CC_FP (match_operand:SF 0 "register_operand" "f")
3814: (match_operand:SF 1 "register_operand" "f")))]
3815: ""
3816: "*
3817: {
3818: rtx xoperands[10];
3819: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3820: xoperands[1] = operands[0];
3821: xoperands[2] = operands[1];
3822:
3823: return mips_fill_delay_slot (\"c.eq.s\\t%0,%1\", DELAY_FCMP, xoperands, insn);
3824: }"
3825: [(set_attr "type" "fcmp")
3826: (set_attr "mode" "FPSW")
3827: (set_attr "length" "1")])
3828:
3829: (define_insn "sne_sf"
3830: [(set (reg:CC_REV_FP 66)
3831: (ne:CC_REV_FP (match_operand:SF 0 "register_operand" "f")
3832: (match_operand:SF 1 "register_operand" "f")))]
3833: ""
3834: "*
3835: {
3836: rtx xoperands[10];
3837: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3838: xoperands[1] = operands[0];
3839: xoperands[2] = operands[1];
3840:
3841: return mips_fill_delay_slot (\"c.eq.s\\t%0,%1\", DELAY_FCMP, xoperands, insn);
3842: }"
3843: [(set_attr "type" "fcmp")
3844: (set_attr "mode" "FPSW")
3845: (set_attr "length" "1")])
3846:
3847: (define_insn "slt_sf"
3848: [(set (reg:CC_FP 66)
3849: (lt:CC_FP (match_operand:SF 0 "register_operand" "f")
3850: (match_operand:SF 1 "register_operand" "f")))]
3851: ""
3852: "*
3853: {
3854: rtx xoperands[10];
3855: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3856: xoperands[1] = operands[0];
3857: xoperands[2] = operands[1];
3858:
3859: return mips_fill_delay_slot (\"c.lt.s\\t%0,%1\", DELAY_FCMP, xoperands, insn);
3860: }"
3861: [(set_attr "type" "fcmp")
3862: (set_attr "mode" "FPSW")
3863: (set_attr "length" "1")])
3864:
3865: (define_insn "sle_sf"
3866: [(set (reg:CC_FP 66)
3867: (le:CC_FP (match_operand:SF 0 "register_operand" "f")
3868: (match_operand:SF 1 "register_operand" "f")))]
3869: ""
3870: "*
3871: {
3872: rtx xoperands[10];
3873: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3874: xoperands[1] = operands[0];
3875: xoperands[2] = operands[1];
3876:
3877: return mips_fill_delay_slot (\"c.le.s\\t%0,%1\", DELAY_FCMP, xoperands, insn);
3878: }"
3879: [(set_attr "type" "fcmp")
3880: (set_attr "mode" "FPSW")
3881: (set_attr "length" "1")])
3882:
3883: (define_insn "sgt_sf"
3884: [(set (reg:CC_FP 66)
3885: (gt:CC_FP (match_operand:SF 0 "register_operand" "f")
3886: (match_operand:SF 1 "register_operand" "f")))]
3887: ""
3888: "*
3889: {
3890: rtx xoperands[10];
3891: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3892: xoperands[1] = operands[0];
3893: xoperands[2] = operands[1];
3894:
3895: return mips_fill_delay_slot (\"c.lt.s\\t%1,%0\", DELAY_FCMP, xoperands, insn);
3896: }"
3897: [(set_attr "type" "fcmp")
3898: (set_attr "mode" "FPSW")
3899: (set_attr "length" "1")])
3900:
3901: (define_insn "sge_sf"
3902: [(set (reg:CC_FP 66)
3903: (ge:CC_FP (match_operand:SF 0 "register_operand" "f")
3904: (match_operand:SF 1 "register_operand" "f")))]
3905: ""
3906: "*
3907: {
3908: rtx xoperands[10];
3909: xoperands[0] = gen_rtx (REG, CC_FPmode, FPSW_REGNUM);
3910: xoperands[1] = operands[0];
3911: xoperands[2] = operands[1];
3912:
3913: return mips_fill_delay_slot (\"c.le.s\\t%1,%0\", DELAY_FCMP, xoperands, insn);
3914: }"
3915: [(set_attr "type" "fcmp")
3916: (set_attr "mode" "FPSW")
3917: (set_attr "length" "1")])
3918:
3919:
3920: ;;
3921: ;; ....................
3922: ;;
1.1 root 3923: ;; UNCONDITIONAL BRANCHES
3924: ;;
3925: ;; ....................
3926:
3927: ;; Unconditional branches.
3928:
3929: (define_insn "jump"
3930: [(set (pc)
3931: (label_ref (match_operand 0 "" "")))]
3932: ""
3933: "*
3934: {
3935: if (GET_CODE (operands[0]) == REG)
3936: return \"%*j\\t%0\";
3937: else
3938: return \"%*j\\t%l0\";
3939: }"
3940: [(set_attr "type" "jump")
3941: (set_attr "mode" "none")
3942: (set_attr "length" "1")])
3943:
3944: (define_insn "indirect_jump"
3945: [(set (pc) (match_operand:SI 0 "register_operand" "d"))]
3946: ""
3947: "%*j\\t%0"
3948: [(set_attr "type" "jump")
3949: (set_attr "mode" "none")
3950: (set_attr "length" "1")])
3951:
3952: (define_insn "tablejump"
3953: [(set (pc)
3954: (match_operand:SI 0 "register_operand" "d"))
3955: (use (label_ref (match_operand 1 "" "")))]
3956: ""
3957: "%*j\\t%0"
3958: [(set_attr "type" "jump")
3959: (set_attr "mode" "none")
3960: (set_attr "length" "1")])
3961:
3962: ;; Function return, only allow after optimization, so that we can
3963: ;; eliminate jumps to jumps if no stack space is used.
3964:
1.1.1.4 ! root 3965: ;; (define_expand "return"
! 3966: ;; [(set (pc) (reg:SI 31))]
! 3967: ;; "simple_epilogue_p ()"
! 3968: ;; "")
! 3969:
! 3970: (define_expand "return"
! 3971: [(parallel [(return)
! 3972: (use (reg:SI 31))])]
! 3973: "simple_epilogue_p ()"
! 3974: "")
! 3975:
! 3976: (define_insn "return_internal"
! 3977: [(parallel [(return)
! 3978: (use (match_operand:SI 0 "register_operand" "d"))])]
! 3979: ""
! 3980: "%*j\\t%0"
1.1 root 3981: [(set_attr "type" "jump")
3982: (set_attr "mode" "none")
3983: (set_attr "length" "1")])
3984:
3985:
3986: ;;
3987: ;; ....................
3988: ;;
1.1.1.4 ! root 3989: ;; Function prologue/epilogue
! 3990: ;;
! 3991: ;; ....................
! 3992: ;;
! 3993:
! 3994: (define_expand "prologue"
! 3995: [(const_int 1)]
! 3996: ""
! 3997: "
! 3998: {
! 3999: if (mips_isa >= 0) /* avoid unused code warnings */
! 4000: {
! 4001: mips_expand_prologue ();
! 4002: DONE;
! 4003: }
! 4004: }")
! 4005:
! 4006: ;; Block any insns from being moved before this point, since the
! 4007: ;; profiling call to mcount can use various registers that aren't
! 4008: ;; saved or used to pass arguments.
! 4009:
! 4010: (define_insn "blockage"
! 4011: [(unspec_volatile [(const_int 0)] 0)]
! 4012: ""
! 4013: ""
! 4014: [(set_attr "type" "unknown")
! 4015: (set_attr "mode" "none")
! 4016: (set_attr "length" "0")])
! 4017:
! 4018: ;; At present, don't expand the epilogue, reorg.c will clobber the
! 4019: ;; return register in compiling gen_lowpart (emit-rtl.c).
! 4020: ;;
! 4021: ;; (define_expand "epilogue"
! 4022: ;; [(const_int 2)]
! 4023: ;; ""
! 4024: ;; "
! 4025: ;; {
! 4026: ;; if (mips_isa >= 0) /* avoid unused code warnings */
! 4027: ;; {
! 4028: ;; mips_expand_epilogue ();
! 4029: ;; DONE;
! 4030: ;; }
! 4031: ;; }")
! 4032:
! 4033:
! 4034: ;;
! 4035: ;; ....................
! 4036: ;;
1.1 root 4037: ;; FUNCTION CALLS
4038: ;;
4039: ;; ....................
4040:
4041: ;; calls.c now passes a third argument, make saber happy
4042:
4043: (define_expand "call"
1.1.1.3 root 4044: [(parallel [(call (match_operand 0 "memory_operand" "m")
1.1 root 4045: (match_operand 1 "" "i"))
1.1.1.4 ! root 4046: (clobber (reg:SI 31))
! 4047: (use (match_operand 2 "" "")) ;; next_arg_reg
! 4048: (use (match_operand 3 "" ""))])] ;; struct_value_size_rtx
1.1 root 4049: ""
4050: "
4051: {
4052: rtx addr;
4053:
1.1.1.4 ! root 4054: if (operands[0]) /* eliminate unused code warnings */
! 4055: {
! 4056: addr = XEXP (operands[0], 0);
! 4057: if (GET_CODE (addr) != REG && !CONSTANT_ADDRESS_P (addr))
! 4058: XEXP (operands[0], 0) = force_reg (FUNCTION_MODE, addr);
! 4059:
! 4060: /* In order to pass small structures by value in registers
! 4061: compatibly with the MIPS compiler, we need to shift the value
! 4062: into the high part of the register. Function_arg has encoded
! 4063: a PARALLEL rtx, holding a vector of adjustments to be made
! 4064: as the next_arg_reg variable, so we split up the insns,
! 4065: and emit them separately. */
! 4066:
! 4067: if (operands[2] != (rtx)0 && GET_CODE (operands[2]) == PARALLEL)
! 4068: {
! 4069: rtvec adjust = XVEC (operands[2], 0);
! 4070: int num = GET_NUM_ELEM (adjust);
! 4071: int i;
! 4072:
! 4073: for (i = 0; i < num; i++)
! 4074: emit_insn (RTVEC_ELT (adjust, i));
! 4075: }
1.1 root 4076:
1.1.1.4 ! root 4077: emit_call_insn (gen_call_internal (operands[0], operands[1],
! 4078: gen_rtx (REG, Pmode, GP_REG_FIRST + 31)));
! 4079: DONE;
! 4080: }
1.1 root 4081: }")
4082:
4083: (define_insn "call_internal"
1.1.1.3 root 4084: [(call (match_operand 0 "memory_operand" "m")
1.1 root 4085: (match_operand 1 "" "i"))
4086: (clobber (match_operand:SI 2 "register_operand" "=d"))]
4087: ""
4088: "*
4089: {
4090: register rtx target = XEXP (operands[0], 0);
4091:
4092: if (GET_CODE (target) == SYMBOL_REF)
4093: return \"%*jal\\t%0\";
4094:
1.1.1.4 ! root 4095: else if (GET_CODE (target) == CONST_INT)
! 4096: {
! 4097: operands[0] = target;
! 4098: return \"%*%[li\\t%@,%0\\n\\tjal\\t%2,%@%]\";
! 4099: }
! 4100:
1.1 root 4101: else
4102: {
4103: operands[0] = target;
1.1.1.4 ! root 4104: return \"%*jal\\t%2,%0\";
1.1 root 4105: }
4106: }"
4107: [(set_attr "type" "call")
4108: (set_attr "mode" "none")
4109: (set_attr "length" "1")])
4110:
4111: ;; calls.c now passes a fourth argument, make saber happy
4112:
4113: (define_expand "call_value"
4114: [(parallel [(set (match_operand 0 "register_operand" "=df")
1.1.1.3 root 4115: (call (match_operand 1 "memory_operand" "m")
1.1 root 4116: (match_operand 2 "" "i")))
1.1.1.4 ! root 4117: (clobber (reg:SI 31))
! 4118: (use (match_operand 3 "" ""))])] ;; next_arg_reg
1.1 root 4119: ""
4120: "
4121: {
4122: rtx addr;
4123:
1.1.1.4 ! root 4124: if (operands[0]) /* eliminate unused code warning */
! 4125: {
! 4126: addr = XEXP (operands[1], 0);
! 4127: if (GET_CODE (addr) != REG && !CONSTANT_ADDRESS_P (addr))
! 4128: XEXP (operands[1], 0) = force_reg (FUNCTION_MODE, addr);
! 4129:
! 4130: /* In order to pass small structures by value in registers
! 4131: compatibly with the MIPS compiler, we need to shift the value
! 4132: into the high part of the register. Function_arg has encoded
! 4133: a PARALLEL rtx, holding a vector of adjustments to be made
! 4134: as the next_arg_reg variable, so we split up the insns,
! 4135: and emit them separately. */
! 4136:
! 4137: if (operands[3] != (rtx)0 && GET_CODE (operands[3]) == PARALLEL)
! 4138: {
! 4139: rtvec adjust = XVEC (operands[3], 0);
! 4140: int num = GET_NUM_ELEM (adjust);
! 4141: int i;
! 4142:
! 4143: for (i = 0; i < num; i++)
! 4144: emit_insn (RTVEC_ELT (adjust, i));
! 4145: }
! 4146:
! 4147: emit_call_insn (gen_call_value_internal (operands[0], operands[1], operands[2],
! 4148: gen_rtx (REG, Pmode, GP_REG_FIRST + 31)));
! 4149:
! 4150: DONE;
! 4151: }
1.1 root 4152:
4153: }")
4154:
4155: (define_insn "call_value_internal"
4156: [(set (match_operand 0 "register_operand" "=df")
1.1.1.3 root 4157: (call (match_operand 1 "memory_operand" "m")
1.1 root 4158: (match_operand 2 "" "i")))
4159: (clobber (match_operand:SI 3 "register_operand" "=d"))]
4160: ""
4161: "*
4162: {
4163: register rtx target = XEXP (operands[1], 0);
4164:
4165: if (GET_CODE (target) == SYMBOL_REF)
4166: return \"%*jal\\t%1\";
4167:
1.1.1.4 ! root 4168: else if (GET_CODE (target) == CONST_INT)
! 4169: {
! 4170: operands[1] = target;
! 4171: return \"%*%[li\\t%@,%1\\n\\tjal\\t%3,%@%]\";
! 4172: }
! 4173:
1.1 root 4174: else
4175: {
4176: operands[1] = target;
1.1.1.4 ! root 4177: return \"%*jal\\t%3,%1\";
1.1 root 4178: }
4179: }"
4180: [(set_attr "type" "call")
4181: (set_attr "mode" "none")
4182: (set_attr "length" "1")])
4183:
4184:
4185: ;;
4186: ;; ....................
4187: ;;
4188: ;; MISC.
4189: ;;
4190: ;; ....................
4191: ;;
4192:
4193: (define_insn "nop"
4194: [(const_int 0)]
4195: ""
4196: "%(nop%)"
4197: [(set_attr "type" "nop")
4198: (set_attr "mode" "none")
4199: (set_attr "length" "1")])
4200:
4201: (define_expand "probe"
4202: [(set (match_dup 0)
4203: (match_dup 1))]
4204: ""
4205: "
4206: {
4207: operands[0] = gen_reg_rtx (SImode);
4208: operands[1] = gen_rtx (MEM, SImode, stack_pointer_rtx);
4209: MEM_VOLATILE_P (operands[1]) = TRUE;
4210:
4211: /* fall through and generate default code */
4212: }")
4213:
4214:
4215: ;;
4216: ;; Local variables:
4217: ;; mode:emacs-lisp
4218: ;; comment-start: ";; "
4219: ;; eval: (set-syntax-table (copy-sequence (syntax-table)))
4220: ;; eval: (modify-syntax-entry ?[ "(]")
4221: ;; eval: (modify-syntax-entry ?] ")[")
4222: ;; eval: (modify-syntax-entry ?{ "(}")
4223: ;; eval: (modify-syntax-entry ?} "){")
4224: ;; End:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.