annotate gcc/config/visium/visium.md @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ;; Machine description for Visium.
kono
parents:
diff changeset
2 ;; Copyright (C) 2002-2017 Free Software Foundation, Inc.
kono
parents:
diff changeset
3 ;; Contributed by C.Nettleton, J.P.Parkes and P.Garbett.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 ;; This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 ;; GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
8 ;; under the terms of the GNU General Public License as published
kono
parents:
diff changeset
9 ;; by the Free Software Foundation; either version 3, or (at your
kono
parents:
diff changeset
10 ;; option) any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
kono
parents:
diff changeset
13 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
kono
parents:
diff changeset
14 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
kono
parents:
diff changeset
15 ;; License for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 ;; You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 ;; along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 ;; <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 ;;
kono
parents:
diff changeset
22 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
23 ;;
kono
parents:
diff changeset
24 ;; Extra register constraints are:
kono
parents:
diff changeset
25 ;; 'b' EAM register mdb
kono
parents:
diff changeset
26 ;; 'c' EAM register mdc
kono
parents:
diff changeset
27 ;; 'f' Floating-point register
kono
parents:
diff changeset
28 ;; 'k' Register that can be used as the target of a sibcall, i.e. call-used
kono
parents:
diff changeset
29 ;; general register not clobbered in the epilogue: r1-r8 and r10
kono
parents:
diff changeset
30 ;; 'l' Low general register, i.e. general register accessible in user mode
kono
parents:
diff changeset
31 ;; on the GR6 and, consequently, that can be used as the target of a
kono
parents:
diff changeset
32 ;; branch with prediction: r1-r28
kono
parents:
diff changeset
33 ;; 't' Register r1
kono
parents:
diff changeset
34 ;; 'u' Register r2
kono
parents:
diff changeset
35 ;; 'v' Register r3
kono
parents:
diff changeset
36 ;;
kono
parents:
diff changeset
37 ;; Immediate integer operand constraints are:
kono
parents:
diff changeset
38 ;; 'J' 0 .. 65535 (16-bit immediate)
kono
parents:
diff changeset
39 ;; 'K' 1 .. 31 (5-bit immediate)
kono
parents:
diff changeset
40 ;; 'L' -1 .. -65535 (16-bit negative immediate)
kono
parents:
diff changeset
41 ;; 'M' -1 (minus one)
kono
parents:
diff changeset
42 ;; 'O' 0 (integer zero)
kono
parents:
diff changeset
43 ;; 'P' 32 (thirty two)
kono
parents:
diff changeset
44 ;;
kono
parents:
diff changeset
45 ;; Immediate FP operand constraints are:
kono
parents:
diff changeset
46 ;; 'G' 0.0 (floating-point zero)
kono
parents:
diff changeset
47 ;;
kono
parents:
diff changeset
48 ;; Operand substitution characters are:
kono
parents:
diff changeset
49 ;; %# delay slot follows, if empty, fill with NOP
kono
parents:
diff changeset
50 ;; %b LS 8 bits of immediate operand
kono
parents:
diff changeset
51 ;; %w LS 16 bits of immediate operand
kono
parents:
diff changeset
52 ;; %u MS 16 bits of immediate operand
kono
parents:
diff changeset
53 ;; %r register or zero (r0)
kono
parents:
diff changeset
54 ;; %f FP register or zero (f0)
kono
parents:
diff changeset
55 ;; %d second register in a pair
kono
parents:
diff changeset
56 ;;
kono
parents:
diff changeset
57 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
58 ;;
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 ;; Registers by name.
kono
parents:
diff changeset
61 (define_constants [
kono
parents:
diff changeset
62 (R_R1 1)
kono
parents:
diff changeset
63 (R_R2 2)
kono
parents:
diff changeset
64 (R_R3 3)
kono
parents:
diff changeset
65 (R_R4 4)
kono
parents:
diff changeset
66 (R_R5 5)
kono
parents:
diff changeset
67 (R_R6 6)
kono
parents:
diff changeset
68 (R_LINK 21)
kono
parents:
diff changeset
69 (R_FP 22)
kono
parents:
diff changeset
70 (R_SP 23)
kono
parents:
diff changeset
71 (R_MDB 32)
kono
parents:
diff changeset
72 (R_MDC 33)
kono
parents:
diff changeset
73 (R_FLAGS 50)
kono
parents:
diff changeset
74 ])
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 ;; UNSPEC usage.
kono
parents:
diff changeset
77 (define_c_enum "unspec" [
kono
parents:
diff changeset
78 UNSPEC_MDBHI
kono
parents:
diff changeset
79 UNSPEC_FLOAD
kono
parents:
diff changeset
80 UNSPEC_FSTORE
kono
parents:
diff changeset
81 UNSPEC_ITOF
kono
parents:
diff changeset
82 UNSPEC_FTOI
kono
parents:
diff changeset
83 UNSPEC_NOP
kono
parents:
diff changeset
84 UNSPEC_ADDV
kono
parents:
diff changeset
85 UNSPEC_SUBV
kono
parents:
diff changeset
86 UNSPEC_NEGV
kono
parents:
diff changeset
87 ])
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 ;; UNSPEC_VOLATILE usage.
kono
parents:
diff changeset
90 (define_c_enum "unspecv" [
kono
parents:
diff changeset
91 UNSPECV_BLOCKAGE
kono
parents:
diff changeset
92 UNSPECV_DSI
kono
parents:
diff changeset
93 ])
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 (include "predicates.md")
kono
parents:
diff changeset
96 (include "constraints.md")
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 ;;
kono
parents:
diff changeset
99 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
100 ;;
kono
parents:
diff changeset
101 ;; Attributes.
kono
parents:
diff changeset
102 ;;
kono
parents:
diff changeset
103 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
104 ;;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 ; Instruction type.
kono
parents:
diff changeset
107 ;
kono
parents:
diff changeset
108 ;imm_reg Move of immediate value to register.
kono
parents:
diff changeset
109 ;mem_reg Move from memory to register.
kono
parents:
diff changeset
110 ;eam_reg Move from EAM to register.
kono
parents:
diff changeset
111 ;fp_reg Move from FPU to register.
kono
parents:
diff changeset
112 ;reg_mem Move from register to memory.
kono
parents:
diff changeset
113 ;reg_eam Move from register to EAM.
kono
parents:
diff changeset
114 ;reg_fp Move from register to FPU.
kono
parents:
diff changeset
115 ;arith Arithmetic operation, result in register, sets overflow.
kono
parents:
diff changeset
116 ;arith2 Two successive arithmetic operations.
kono
parents:
diff changeset
117 ;logic Logical operation, result in register, does not set overflow.
kono
parents:
diff changeset
118 ;abs_branch Absolute branch.
kono
parents:
diff changeset
119 ;branch Branch.
kono
parents:
diff changeset
120 ;bmi Block move.
kono
parents:
diff changeset
121 ;call Call to subprogram.
kono
parents:
diff changeset
122 ;ret Return from subprogram.
kono
parents:
diff changeset
123 ;rfi Return from interrupt.
kono
parents:
diff changeset
124 ;dsi Disable interrupts.
kono
parents:
diff changeset
125 ;cmp Compare or test.
kono
parents:
diff changeset
126 ;div EAM 32/32 division.
kono
parents:
diff changeset
127 ;divd EAM 64/32 division.
kono
parents:
diff changeset
128 ;mul EAM 32 * 32 -> 64 multiplication.
kono
parents:
diff changeset
129 ;shiftdi EAM 64 bit shift.
kono
parents:
diff changeset
130 ;fdiv Floating point divide.
kono
parents:
diff changeset
131 ;fsqrt Floating point square root.
kono
parents:
diff changeset
132 ;ftoi Fix float to integer.
kono
parents:
diff changeset
133 ;itof Float integer.
kono
parents:
diff changeset
134 ;fmove Floating point move w/ or w/o change of sign: fmove, fabs, fneg.
kono
parents:
diff changeset
135 ;fcmp Floating point compare or test.
kono
parents:
diff changeset
136 ;fp Other floating point operations.
kono
parents:
diff changeset
137 ;nop No operation.
kono
parents:
diff changeset
138 ;multi Multiple instructions which split.
kono
parents:
diff changeset
139 ;asm User asm instructions.
kono
parents:
diff changeset
140 ;trap Trap instructions.
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 (define_attr "type"
kono
parents:
diff changeset
143 "imm_reg,mem_reg,eam_reg,fp_reg,reg_mem,reg_eam,reg_fp,arith,arith2,logic,abs_branch,branch,bmi,call,ret,rfi,dsi,cmp,div,divd,mul,shiftdi,fdiv,fsqrt,ftoi,itof,fmove,fcmp,fp,nop,multi,asm,trap" (const_string "logic"))
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 ; Those insns that occupy 4 bytes.
kono
parents:
diff changeset
146 (define_attr "single_insn" "no,yes"
kono
parents:
diff changeset
147 (if_then_else (eq_attr "type" "arith2,rfi,multi")
kono
parents:
diff changeset
148 (const_string "no")
kono
parents:
diff changeset
149 (const_string "yes")))
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 ; True if branch or call will be emitting a nop into its delay slot.
kono
parents:
diff changeset
152 (define_attr "empty_delay_slot" "false,true"
kono
parents:
diff changeset
153 (symbol_ref "(empty_delay_slot (insn)
kono
parents:
diff changeset
154 ? EMPTY_DELAY_SLOT_TRUE : EMPTY_DELAY_SLOT_FALSE)"))
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 ; Length in bytes.
kono
parents:
diff changeset
157 ; The allowed range for the offset of short branches is [-131072;131068]
kono
parents:
diff changeset
158 ; and it is counted from the address of the insn so we need to subtract
kono
parents:
diff changeset
159 ; 8 for forward branches because (pc) points to the next insn for them.
kono
parents:
diff changeset
160 (define_attr "length" ""
kono
parents:
diff changeset
161 (cond [(eq_attr "type" "abs_branch,call,ret")
kono
parents:
diff changeset
162 (if_then_else (eq_attr "empty_delay_slot" "true")
kono
parents:
diff changeset
163 (const_int 8)
kono
parents:
diff changeset
164 (const_int 4))
kono
parents:
diff changeset
165 (eq_attr "type" "branch")
kono
parents:
diff changeset
166 (if_then_else (leu (plus (minus (match_dup 0) (pc))
kono
parents:
diff changeset
167 (const_int 131060))
kono
parents:
diff changeset
168 (const_int 262120))
kono
parents:
diff changeset
169 (if_then_else (eq_attr "empty_delay_slot" "true")
kono
parents:
diff changeset
170 (const_int 8)
kono
parents:
diff changeset
171 (const_int 4))
kono
parents:
diff changeset
172 (const_int 20))
kono
parents:
diff changeset
173 (eq_attr "single_insn" "no")
kono
parents:
diff changeset
174 (const_int 8)] (const_int 4)))
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 (define_asm_attributes [(set_attr "type" "asm")])
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 ; Delay slots.
kono
parents:
diff changeset
179 (define_delay (eq_attr "type" "abs_branch,branch,call,ret")
kono
parents:
diff changeset
180 [(and (eq_attr "type" "!abs_branch,branch,call,ret,rfi,bmi,mul,div,divd,fdiv,fsqrt,asm")
kono
parents:
diff changeset
181 (eq_attr "single_insn" "yes"))
kono
parents:
diff changeset
182 (nil) (nil)])
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 ;;
kono
parents:
diff changeset
185 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
186 ;;
kono
parents:
diff changeset
187 ;; Processor pipeline description.
kono
parents:
diff changeset
188 ;;
kono
parents:
diff changeset
189 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
190 ;;
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 ; Attribute for cpu type.
kono
parents:
diff changeset
193 ; These must match the values for enum processor_type in visium-opts.h.
kono
parents:
diff changeset
194 (define_attr "cpu" "gr5,gr6" (const (symbol_ref "visium_cpu_attr")))
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 (include "gr5.md")
kono
parents:
diff changeset
197 (include "gr6.md")
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 ;;
kono
parents:
diff changeset
200 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
201 ;;
kono
parents:
diff changeset
202 ;; Iterators.
kono
parents:
diff changeset
203 ;;
kono
parents:
diff changeset
204 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
205 ;;
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 (define_mode_iterator QHI [QI HI])
kono
parents:
diff changeset
208 (define_mode_iterator I [QI HI SI])
kono
parents:
diff changeset
209 (define_mode_attr b [(QI "8") (HI "16") (SI "32")])
kono
parents:
diff changeset
210 (define_mode_attr s [(QI ".b") (HI ".w") (SI ".l")])
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 ; This code iterator allows signed and unsigned widening multiplications
kono
parents:
diff changeset
213 ; to use the same template.
kono
parents:
diff changeset
214 (define_code_iterator any_extend [sign_extend zero_extend])
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 ; <u> expands to an empty string when doing a signed operation and
kono
parents:
diff changeset
217 ; "u" when doing an unsigned operation.
kono
parents:
diff changeset
218 (define_code_attr u [(sign_extend "") (zero_extend "u")])
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 ; <su> is like <u>, but the signed form expands to "s" rather than "".
kono
parents:
diff changeset
221 (define_code_attr su [(sign_extend "s") (zero_extend "u")])
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 ; This code iterator allows returns and simple returns to use the same template.
kono
parents:
diff changeset
224 (define_code_iterator any_return [return simple_return])
kono
parents:
diff changeset
225 (define_code_attr return_pred [(return "visium_can_use_return_insn_p ()")
kono
parents:
diff changeset
226 (simple_return "!visium_interrupt_function_p ()")])
kono
parents:
diff changeset
227 (define_code_attr return_str [(return "") (simple_return "simple_")])
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 ; This code iterator allows integer and FP cstores to use the same template.
kono
parents:
diff changeset
230 (define_code_iterator any_scc [ltu lt])
kono
parents:
diff changeset
231 (define_code_attr scc_str [(ltu "sltu") (lt "slt")])
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 ;This code iterator allows cstore splitters to use the same template.
kono
parents:
diff changeset
234 (define_code_iterator any_add [plus minus])
kono
parents:
diff changeset
235 (define_code_attr add_op [(plus "PLUS") (minus "MINUS")])
kono
parents:
diff changeset
236 (define_code_attr add_str [(plus "plus") (minus "minus")])
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 ;;
kono
parents:
diff changeset
239 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
240 ;;
kono
parents:
diff changeset
241 ;; Substitutions.
kono
parents:
diff changeset
242 ;;
kono
parents:
diff changeset
243 ;; They are used to define the first instruction of the pairs required by
kono
parents:
diff changeset
244 ;; the postreload compare elimination pass, with a first variant for the
kono
parents:
diff changeset
245 ;; logical insns and a second variant for the arithmetic insns.
kono
parents:
diff changeset
246 ;;
kono
parents:
diff changeset
247 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
248 ;;
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 (define_subst "flags_subst_logic"
kono
parents:
diff changeset
251 [(set (match_operand 0 "") (match_operand 1 ""))
kono
parents:
diff changeset
252 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
253 ""
kono
parents:
diff changeset
254 [(set (reg:CC R_FLAGS)
kono
parents:
diff changeset
255 (compare:CC (match_dup 1) (const_int 0)))
kono
parents:
diff changeset
256 (set (match_dup 0) (match_dup 1))])
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 (define_subst_attr "subst_logic" "flags_subst_logic" "_flags" "_set_flags")
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 (define_subst "flags_subst_arith"
kono
parents:
diff changeset
261 [(set (match_operand 0 "") (match_operand 1 ""))
kono
parents:
diff changeset
262 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
263 ""
kono
parents:
diff changeset
264 [(set (reg:CCNZ R_FLAGS)
kono
parents:
diff changeset
265 (compare:CCNZ (match_dup 1) (const_int 0)))
kono
parents:
diff changeset
266 (set (match_dup 0) (match_dup 1))])
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 (define_subst_attr "subst_arith" "flags_subst_arith" "_flags" "_set_flags")
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 ;;
kono
parents:
diff changeset
271 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
272 ;;
kono
parents:
diff changeset
273 ;; QImode moves
kono
parents:
diff changeset
274 ;;
kono
parents:
diff changeset
275 ;; For moving among registers we use the move.b instruction. This is
kono
parents:
diff changeset
276 ;; actually an OR instruction using an alias. For moving between register
kono
parents:
diff changeset
277 ;; and memory we need the address of the memory location in a register.
kono
parents:
diff changeset
278 ;; However, we can accept an expression (reg + offset) where offset is in
kono
parents:
diff changeset
279 ;; the range 0 .. 31.
kono
parents:
diff changeset
280 ;;
kono
parents:
diff changeset
281 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
282 ;;
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 (define_expand "movqi"
kono
parents:
diff changeset
285 [(set (match_operand:QI 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
286 (match_operand:QI 1 "general_operand" ""))]
kono
parents:
diff changeset
287 ""
kono
parents:
diff changeset
288 {
kono
parents:
diff changeset
289 prepare_move_operands (operands, QImode);
kono
parents:
diff changeset
290 })
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 (define_insn "*movqi_insn"
kono
parents:
diff changeset
293 [(set (match_operand:QI 0 "nonimmediate_operand" "=r, m,?b,?c, r, r,r,r")
kono
parents:
diff changeset
294 (match_operand:QI 1 "general_operand" " r,rO, r, r,?b,?c,i,m"))]
kono
parents:
diff changeset
295 "ok_for_simple_move_operands (operands, QImode)"
kono
parents:
diff changeset
296 "@
kono
parents:
diff changeset
297 #
kono
parents:
diff changeset
298 write.b %0,%r1
kono
parents:
diff changeset
299 writemd %1,r0 ;movqi ?b r
kono
parents:
diff changeset
300 writemdc %1 ;movqi ?c r
kono
parents:
diff changeset
301 readmda %0 ;movqi r ?b
kono
parents:
diff changeset
302 readmdc %0 ;movqi r ?c
kono
parents:
diff changeset
303 moviq %0,%b1 ;movqi r i
kono
parents:
diff changeset
304 read.b %0,%1"
kono
parents:
diff changeset
305 [(set_attr "type" "logic,reg_mem,reg_eam,reg_eam,eam_reg,eam_reg,imm_reg,mem_reg")])
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 (define_insn "*movqi_insn<subst_logic>"
kono
parents:
diff changeset
308 [(set (match_operand:QI 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
309 (match_operand:QI 1 "gpc_reg_operand" "r"))
kono
parents:
diff changeset
310 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
311 "reload_completed"
kono
parents:
diff changeset
312 "move.b %0,%1"
kono
parents:
diff changeset
313 [(set_attr "type" "logic")])
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 (define_split
kono
parents:
diff changeset
316 [(set (match_operand:QI 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
317 (match_operand:QI 1 "gpc_reg_operand" ""))]
kono
parents:
diff changeset
318 "reload_completed"
kono
parents:
diff changeset
319 [(parallel [(set (match_dup 0) (match_dup 1))
kono
parents:
diff changeset
320 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
321 "")
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 (define_expand "movstrictqi"
kono
parents:
diff changeset
324 [(set (strict_low_part (match_operand:QI 0 "register_operand" ""))
kono
parents:
diff changeset
325 (match_operand:QI 1 "general_operand" ""))]
kono
parents:
diff changeset
326 "")
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 (define_insn "*movstrictqi_insn"
kono
parents:
diff changeset
329 [(set (strict_low_part (match_operand:QI 0 "register_operand" "+r,r"))
kono
parents:
diff changeset
330 (match_operand:QI 1 "general_operand" "rO,m"))]
kono
parents:
diff changeset
331 "ok_for_simple_move_strict_operands (operands, QImode)"
kono
parents:
diff changeset
332 "@
kono
parents:
diff changeset
333 #
kono
parents:
diff changeset
334 read.b %0,%1"
kono
parents:
diff changeset
335 [(set_attr "type" "logic,mem_reg")])
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 (define_insn "*movstrictqi_insn<subst_logic>"
kono
parents:
diff changeset
338 [(set (strict_low_part (match_operand:QI 0 "register_operand" "+r"))
kono
parents:
diff changeset
339 (match_operand:QI 1 "reg_or_0_operand" "rO"))
kono
parents:
diff changeset
340 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
341 "reload_completed"
kono
parents:
diff changeset
342 "move.b %0,%r1"
kono
parents:
diff changeset
343 [(set_attr "type" "logic")])
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 (define_split
kono
parents:
diff changeset
346 [(set (strict_low_part (match_operand:QI 0 "register_operand" ""))
kono
parents:
diff changeset
347 (match_operand:QI 1 "reg_or_0_operand" ""))]
kono
parents:
diff changeset
348 "reload_completed"
kono
parents:
diff changeset
349 [(parallel [(set (strict_low_part (match_dup 0)) (match_dup 1))
kono
parents:
diff changeset
350 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
351 "")
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 ;;
kono
parents:
diff changeset
354 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
355 ;;
kono
parents:
diff changeset
356 ;; HImode moves
kono
parents:
diff changeset
357 ;;
kono
parents:
diff changeset
358 ;; For moving among registers we use the move.w instruction. This is
kono
parents:
diff changeset
359 ;; actually an OR instruction using an alias. For moving between register
kono
parents:
diff changeset
360 ;; and memory we need the address of the memory location in a register.
kono
parents:
diff changeset
361 ;; However, we can accept an expression (reg + offset) where offset is in
kono
parents:
diff changeset
362 ;; the range 0 .. 62 and is shifted right one place in the assembled
kono
parents:
diff changeset
363 ;; instruction.
kono
parents:
diff changeset
364 ;;
kono
parents:
diff changeset
365 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
366 ;;
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 (define_expand "movhi"
kono
parents:
diff changeset
369 [(set (match_operand:HI 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
370 (match_operand:HI 1 "general_operand" ""))]
kono
parents:
diff changeset
371 ""
kono
parents:
diff changeset
372 {
kono
parents:
diff changeset
373 prepare_move_operands (operands, HImode);
kono
parents:
diff changeset
374 })
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 (define_insn "*movhi_insn"
kono
parents:
diff changeset
377 [(set (match_operand:HI 0 "nonimmediate_operand" "=r, m,?b,?c, r, r,r,r")
kono
parents:
diff changeset
378 (match_operand:HI 1 "general_operand" " r,rO, r, r,?b,?c,i,m"))]
kono
parents:
diff changeset
379 "ok_for_simple_move_operands (operands, HImode)"
kono
parents:
diff changeset
380 "@
kono
parents:
diff changeset
381 #
kono
parents:
diff changeset
382 write.w %0,%r1
kono
parents:
diff changeset
383 writemd %1,r0 ;movhi ?b r
kono
parents:
diff changeset
384 writemdc %1 ;movhi ?c r
kono
parents:
diff changeset
385 readmda %0 ;movhi r ?b
kono
parents:
diff changeset
386 readmdc %0 ;movhi r ?c
kono
parents:
diff changeset
387 moviq %0,%w1 ;movhi r i
kono
parents:
diff changeset
388 read.w %0,%1"
kono
parents:
diff changeset
389 [(set_attr "type" "logic,reg_mem,reg_eam,reg_eam,eam_reg,eam_reg,imm_reg,mem_reg")])
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 (define_insn "*movhi_insn<subst_logic>"
kono
parents:
diff changeset
392 [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
393 (match_operand:HI 1 "gpc_reg_operand" "r"))
kono
parents:
diff changeset
394 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
395 "reload_completed"
kono
parents:
diff changeset
396 "move.w %0,%1"
kono
parents:
diff changeset
397 [(set_attr "type" "logic")])
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 (define_split
kono
parents:
diff changeset
400 [(set (match_operand:HI 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
401 (match_operand:HI 1 "gpc_reg_operand" ""))]
kono
parents:
diff changeset
402 "reload_completed"
kono
parents:
diff changeset
403 [(parallel [(set (match_dup 0) (match_dup 1))
kono
parents:
diff changeset
404 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
405 "")
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 (define_expand "movstricthi"
kono
parents:
diff changeset
408 [(set (strict_low_part (match_operand:HI 0 "register_operand" ""))
kono
parents:
diff changeset
409 (match_operand:HI 1 "general_operand" ""))]
kono
parents:
diff changeset
410 "")
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 (define_insn "*movstricthi_insn"
kono
parents:
diff changeset
413 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+r,r,r"))
kono
parents:
diff changeset
414 (match_operand:HI 1 "general_operand" " r,i,m"))]
kono
parents:
diff changeset
415 "ok_for_simple_move_strict_operands (operands, HImode)"
kono
parents:
diff changeset
416 "@
kono
parents:
diff changeset
417 #
kono
parents:
diff changeset
418 movil %0,%w1
kono
parents:
diff changeset
419 read.w %0,%1"
kono
parents:
diff changeset
420 [(set_attr "type" "logic,imm_reg,mem_reg")])
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 (define_insn "*movstricthi_insn<subst_logic>"
kono
parents:
diff changeset
423 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+r"))
kono
parents:
diff changeset
424 (match_operand:HI 1 "register_operand" "r"))
kono
parents:
diff changeset
425 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
426 "reload_completed"
kono
parents:
diff changeset
427 "move.w %0,%1"
kono
parents:
diff changeset
428 [(set_attr "type" "logic")])
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 (define_split
kono
parents:
diff changeset
431 [(set (strict_low_part (match_operand:HI 0 "register_operand" ""))
kono
parents:
diff changeset
432 (match_operand:HI 1 "register_operand" ""))]
kono
parents:
diff changeset
433 "reload_completed"
kono
parents:
diff changeset
434 [(parallel [(set (strict_low_part (match_dup 0)) (match_dup 1))
kono
parents:
diff changeset
435 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
436 "")
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 ;;
kono
parents:
diff changeset
439 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
440 ;;
kono
parents:
diff changeset
441 ;; SImode moves
kono
parents:
diff changeset
442 ;;
kono
parents:
diff changeset
443 ;; For moving among registers we use the move.l instruction. This is
kono
parents:
diff changeset
444 ;; actually an OR instruction using an alias. For moving between register
kono
parents:
diff changeset
445 ;; and memory we need the address of the memory location in a register.
kono
parents:
diff changeset
446 ;; However, we can accept an expression (reg + offset) where offset is in
kono
parents:
diff changeset
447 ;; the range 0 .. 124 and is shifted right two places in the assembled
kono
parents:
diff changeset
448 ;; instruction.
kono
parents:
diff changeset
449 ;;
kono
parents:
diff changeset
450 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
451 ;;
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 (define_expand "movsi"
kono
parents:
diff changeset
454 [(set (match_operand:SI 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
455 (match_operand:SI 1 "general_operand" ""))]
kono
parents:
diff changeset
456 ""
kono
parents:
diff changeset
457 {
kono
parents:
diff changeset
458 prepare_move_operands (operands, SImode);
kono
parents:
diff changeset
459 })
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 (define_insn "*movsi_high"
kono
parents:
diff changeset
462 [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
kono
parents:
diff changeset
463 (high:SI (match_operand:SI 1 "immediate_operand" "n,i")) )]
kono
parents:
diff changeset
464 ""
kono
parents:
diff changeset
465 "@
kono
parents:
diff changeset
466 moviu %0,%u1
kono
parents:
diff changeset
467 moviu %0,%%u %a1"
kono
parents:
diff changeset
468 [(set_attr "type" "imm_reg")])
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 ; We only care about the lower 16 bits of the constant
kono
parents:
diff changeset
471 ; being inserted into the upper 16 bits of the register.
kono
parents:
diff changeset
472 (define_insn "*moviu"
kono
parents:
diff changeset
473 [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
kono
parents:
diff changeset
474 (const_int 16)
kono
parents:
diff changeset
475 (const_int 0))
kono
parents:
diff changeset
476 (match_operand:SI 1 "const_int_operand" "n"))]
kono
parents:
diff changeset
477 ""
kono
parents:
diff changeset
478 "moviu %0,%w1"
kono
parents:
diff changeset
479 [(set_attr "type" "imm_reg")])
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 (define_insn "*movsi_losum"
kono
parents:
diff changeset
482 [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
kono
parents:
diff changeset
483 (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
kono
parents:
diff changeset
484 (match_operand:SI 2 "immediate_operand" "n,i")))]
kono
parents:
diff changeset
485 ""
kono
parents:
diff changeset
486 "@
kono
parents:
diff changeset
487 movil %0,%w2
kono
parents:
diff changeset
488 movil %0,%%l %a2"
kono
parents:
diff changeset
489 [(set_attr "type" "imm_reg")])
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 (define_insn "*movil"
kono
parents:
diff changeset
492 [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
kono
parents:
diff changeset
493 (const_int 16)
kono
parents:
diff changeset
494 (const_int 16))
kono
parents:
diff changeset
495 (match_operand:SI 1 "const_int_operand" "n"))]
kono
parents:
diff changeset
496 ""
kono
parents:
diff changeset
497 "movil %0,%w1"
kono
parents:
diff changeset
498 [(set_attr "type" "imm_reg")])
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 (define_insn "*movsi_insn_no_ieee"
kono
parents:
diff changeset
501 [(set (match_operand:SI 0 "nonimmediate_operand" "=r, m,?b,?c, r, r,r,r,r,r, r,!f")
kono
parents:
diff changeset
502 (match_operand:SI 1 "general_operand" " r,rO, r, r,?b,?c,J,M,i,m,!f, r"))]
kono
parents:
diff changeset
503 "!TARGET_FPU_IEEE && ok_for_simple_move_operands (operands, SImode)"
kono
parents:
diff changeset
504 "@
kono
parents:
diff changeset
505 #
kono
parents:
diff changeset
506 write.l %0,%r1
kono
parents:
diff changeset
507 writemd %1,r0 ;movsi ?b r
kono
parents:
diff changeset
508 writemdc %1 ;movsi ?c r
kono
parents:
diff changeset
509 readmda %0 ;movsi r ?b
kono
parents:
diff changeset
510 readmdc %0 ;movsi r ?c
kono
parents:
diff changeset
511 moviq %0,%1 ;movsi r J
kono
parents:
diff changeset
512 #
kono
parents:
diff changeset
513 # ;movsi r i
kono
parents:
diff changeset
514 read.l %0,%1
kono
parents:
diff changeset
515 fstore %0,%1
kono
parents:
diff changeset
516 fload %0,%1"
kono
parents:
diff changeset
517 [(set_attr "type" "logic,reg_mem,reg_eam,reg_eam,eam_reg,eam_reg,imm_reg,logic,multi,mem_reg,fp_reg,reg_fp")])
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 (define_insn "*movsi_insn"
kono
parents:
diff changeset
520 [(set (match_operand:SI 0 "nonimmediate_operand" "=r, m,?b,?c, r, r,r,r,r,r, r,?f,f")
kono
parents:
diff changeset
521 (match_operand:SI 1 "general_operand" " r,rO, r, r,?b,?c,J,M,i,m,?f, r,f"))]
kono
parents:
diff changeset
522 "TARGET_FPU_IEEE && ok_for_simple_move_operands (operands, SImode)"
kono
parents:
diff changeset
523 "@
kono
parents:
diff changeset
524 #
kono
parents:
diff changeset
525 write.l %0,%r1
kono
parents:
diff changeset
526 writemd %1,r0 ;movsi ?b r
kono
parents:
diff changeset
527 writemdc %1 ;movsi ?c r
kono
parents:
diff changeset
528 readmda %0 ;movsi r ?b
kono
parents:
diff changeset
529 readmdc %0 ;movsi r ?c
kono
parents:
diff changeset
530 moviq %0,%1 ;movsi r J
kono
parents:
diff changeset
531 #
kono
parents:
diff changeset
532 # ;movsi r i
kono
parents:
diff changeset
533 read.l %0,%1
kono
parents:
diff changeset
534 fstore %0,%1
kono
parents:
diff changeset
535 fload %0,%1
kono
parents:
diff changeset
536 fmove %0,%1"
kono
parents:
diff changeset
537 [(set_attr "type" "logic,reg_mem,reg_eam,reg_eam,eam_reg,eam_reg,imm_reg,logic,multi,mem_reg,fp_reg,reg_fp,fmove")])
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 (define_insn "*movsi_insn<subst_logic>"
kono
parents:
diff changeset
540 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
541 (match_operand:SI 1 "gpc_reg_operand" "r"))
kono
parents:
diff changeset
542 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
543 "reload_completed"
kono
parents:
diff changeset
544 "move.l %0,%1"
kono
parents:
diff changeset
545 [(set_attr "type" "logic")])
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547 (define_insn "*movsi_insn_m1<subst_logic>"
kono
parents:
diff changeset
548 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
549 (const_int -1))
kono
parents:
diff changeset
550 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
551 "reload_completed"
kono
parents:
diff changeset
552 "not.l %0,r0"
kono
parents:
diff changeset
553 [(set_attr "type" "logic")])
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 (define_split
kono
parents:
diff changeset
556 [(set (match_operand:SI 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
557 (match_operand:SI 1 "gpc_reg_operand" ""))]
kono
parents:
diff changeset
558 "reload_completed"
kono
parents:
diff changeset
559 [(parallel [(set (match_dup 0) (match_dup 1))
kono
parents:
diff changeset
560 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
561 "")
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 (define_split
kono
parents:
diff changeset
564 [(set (match_operand:SI 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
565 (const_int -1))]
kono
parents:
diff changeset
566 "reload_completed"
kono
parents:
diff changeset
567 [(parallel [(set (match_dup 0) (const_int -1))
kono
parents:
diff changeset
568 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
569 "")
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 (define_insn "*movsi_mdbhi"
kono
parents:
diff changeset
572 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
573 (unspec:SI [(reg:DI R_MDB)] UNSPEC_MDBHI))]
kono
parents:
diff changeset
574 ""
kono
parents:
diff changeset
575 "readmdb %0"
kono
parents:
diff changeset
576 [(set_attr "type" "eam_reg")])
kono
parents:
diff changeset
577
kono
parents:
diff changeset
578 (define_split
kono
parents:
diff changeset
579 [(set (match_operand:SI 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
580 (match_operand:SI 1 "large_immediate_operand" ""))]
kono
parents:
diff changeset
581 "reload_completed"
kono
parents:
diff changeset
582 [(set (match_dup 0)
kono
parents:
diff changeset
583 (high:SI (match_dup 1)) )
kono
parents:
diff changeset
584 (set (match_dup 0)
kono
parents:
diff changeset
585 (lo_sum:SI (match_dup 0) (match_dup 1)))]
kono
parents:
diff changeset
586 "")
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 ;;
kono
parents:
diff changeset
589 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
590 ;;
kono
parents:
diff changeset
591 ;; DImode moves
kono
parents:
diff changeset
592 ;;
kono
parents:
diff changeset
593 ;; When the destination is the EAM register MDB, then we use the writemd
kono
parents:
diff changeset
594 ;; instruction. In all other cases we split the move into two 32-bit moves.
kono
parents:
diff changeset
595 ;;
kono
parents:
diff changeset
596 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
597 ;;
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 (define_expand "movdi"
kono
parents:
diff changeset
600 [(set (match_operand:DI 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
601 (match_operand:DI 1 "general_operand" ""))]
kono
parents:
diff changeset
602 ""
kono
parents:
diff changeset
603 {
kono
parents:
diff changeset
604 prepare_move_operands (operands, DImode);
kono
parents:
diff changeset
605 })
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 (define_insn "*movdi_insn"
kono
parents:
diff changeset
608 [(set (match_operand:DI 0 "nonimmediate_operand" "= r, m, r,??b")
kono
parents:
diff changeset
609 (match_operand:DI 1 "general_operand" "rim,rO,?b, r"))]
kono
parents:
diff changeset
610 "ok_for_simple_move_operands (operands, DImode)"
kono
parents:
diff changeset
611 "@
kono
parents:
diff changeset
612 #
kono
parents:
diff changeset
613 #
kono
parents:
diff changeset
614 #
kono
parents:
diff changeset
615 writemd %d1,%1 ;movdi ?b r"
kono
parents:
diff changeset
616 [(set_attr "type" "multi,multi,multi,reg_eam")])
kono
parents:
diff changeset
617
kono
parents:
diff changeset
618 (define_split
kono
parents:
diff changeset
619 [(set (match_operand:DI 0 "gpc_reg_operand" "") (reg:DI R_MDB))]
kono
parents:
diff changeset
620 "reload_completed"
kono
parents:
diff changeset
621 [(set (match_dup 1) (unspec:SI [(reg:DI R_MDB)] UNSPEC_MDBHI))
kono
parents:
diff changeset
622 (set (match_dup 2) (reg:SI R_MDB))]
kono
parents:
diff changeset
623 {
kono
parents:
diff changeset
624 operands[1] = operand_subword (operands[0], 0, 1, DImode);
kono
parents:
diff changeset
625 operands[2] = operand_subword (operands[0], 1, 1, DImode);
kono
parents:
diff changeset
626 })
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 (define_split
kono
parents:
diff changeset
629 [(set (match_operand:DI 0 "non_eam_dst_operand" "")
kono
parents:
diff changeset
630 (match_operand:DI 1 "non_eam_src_operand" ""))]
kono
parents:
diff changeset
631 "reload_completed"
kono
parents:
diff changeset
632 [(set (match_dup 2) (match_dup 3))
kono
parents:
diff changeset
633 (set (match_dup 4) (match_dup 5))]
kono
parents:
diff changeset
634 {
kono
parents:
diff changeset
635 visium_split_double_move (operands, DImode);
kono
parents:
diff changeset
636 })
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 ;;
kono
parents:
diff changeset
639 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
640 ;;
kono
parents:
diff changeset
641 ;; SFmode moves
kono
parents:
diff changeset
642 ;;
kono
parents:
diff changeset
643 ;; Constants are constructed in a GP register and moved to the FP register.
kono
parents:
diff changeset
644 ;;
kono
parents:
diff changeset
645 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
646 ;;
kono
parents:
diff changeset
647
kono
parents:
diff changeset
648 (define_expand "movsf"
kono
parents:
diff changeset
649 [(set (match_operand:SF 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
650 (match_operand:SF 1 "general_operand" ""))]
kono
parents:
diff changeset
651 ""
kono
parents:
diff changeset
652 {
kono
parents:
diff changeset
653 prepare_move_operands (operands, SFmode);
kono
parents:
diff changeset
654 })
kono
parents:
diff changeset
655
kono
parents:
diff changeset
656 (define_insn "*movsf_insn"
kono
parents:
diff changeset
657 [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,f,r,r, m,r,r,r")
kono
parents:
diff changeset
658 (match_operand:SF 1 "general_operand" " f,G,r,f,r,rG,G,F,m"))]
kono
parents:
diff changeset
659 "ok_for_simple_move_operands (operands, SFmode)"
kono
parents:
diff changeset
660 "@
kono
parents:
diff changeset
661 fmove %0,%1
kono
parents:
diff changeset
662 fmove %0,f0
kono
parents:
diff changeset
663 fload %0,%1
kono
parents:
diff changeset
664 fstore %0,%1
kono
parents:
diff changeset
665 #
kono
parents:
diff changeset
666 write.l %0,%r1
kono
parents:
diff changeset
667 moviq %0,0
kono
parents:
diff changeset
668 #
kono
parents:
diff changeset
669 read.l %0,%1"
kono
parents:
diff changeset
670 [(set_attr "type" "fmove,fmove,reg_fp,fp_reg,logic,reg_mem,imm_reg,multi,mem_reg")])
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 (define_insn "*movsf_insn"
kono
parents:
diff changeset
673 [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
674 (match_operand:SF 1 "gpc_reg_operand" "r"))
kono
parents:
diff changeset
675 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
676 "reload_completed"
kono
parents:
diff changeset
677 "move.l %0,%1"
kono
parents:
diff changeset
678 [(set_attr "type" "logic")])
kono
parents:
diff changeset
679
kono
parents:
diff changeset
680 (define_split
kono
parents:
diff changeset
681 [(set (match_operand:SF 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
682 (match_operand:SF 1 "gpc_reg_operand" ""))]
kono
parents:
diff changeset
683 "reload_completed"
kono
parents:
diff changeset
684 [(parallel [(set (match_dup 0) (match_dup 1))
kono
parents:
diff changeset
685 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
686 "")
kono
parents:
diff changeset
687
kono
parents:
diff changeset
688 (define_split
kono
parents:
diff changeset
689 [(set (match_operand:SF 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
690 (match_operand:SF 1 "const_double_operand" ""))]
kono
parents:
diff changeset
691 "reload_completed"
kono
parents:
diff changeset
692 [(set (match_dup 2) (match_dup 3))]
kono
parents:
diff changeset
693 {
kono
parents:
diff changeset
694 long l;
kono
parents:
diff changeset
695
kono
parents:
diff changeset
696 REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (operands[1]), l);
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 operands[2] = operand_subword (operands[0], 0, 0, SFmode);
kono
parents:
diff changeset
699 operands[3] = GEN_INT (trunc_int_for_mode (l, SImode));
kono
parents:
diff changeset
700 })
kono
parents:
diff changeset
701
kono
parents:
diff changeset
702 ;;
kono
parents:
diff changeset
703 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
704 ;;
kono
parents:
diff changeset
705 ;; DFmode moves
kono
parents:
diff changeset
706 ;;
kono
parents:
diff changeset
707 ;; We always split a DFmode move into two SImode moves.
kono
parents:
diff changeset
708 ;;
kono
parents:
diff changeset
709 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
710 ;;
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 (define_expand "movdf"
kono
parents:
diff changeset
713 [(set (match_operand:DF 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
714 (match_operand:DF 1 "general_operand" ""))]
kono
parents:
diff changeset
715 ""
kono
parents:
diff changeset
716 {
kono
parents:
diff changeset
717 prepare_move_operands (operands, DFmode);
kono
parents:
diff changeset
718 })
kono
parents:
diff changeset
719
kono
parents:
diff changeset
720 (define_insn "*movdf_insn"
kono
parents:
diff changeset
721 [(set (match_operand:DF 0 "nonimmediate_operand" "= r, m")
kono
parents:
diff changeset
722 (match_operand:DF 1 "general_operand" "rFm,rG"))]
kono
parents:
diff changeset
723 "ok_for_simple_move_operands (operands, DFmode)"
kono
parents:
diff changeset
724 "#"
kono
parents:
diff changeset
725 [(set_attr "type" "multi")])
kono
parents:
diff changeset
726
kono
parents:
diff changeset
727 (define_split
kono
parents:
diff changeset
728 [(set (match_operand:DF 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
729 (match_operand:DF 1 "general_operand" ""))]
kono
parents:
diff changeset
730 "reload_completed"
kono
parents:
diff changeset
731 [(set (match_dup 2) (match_dup 3))
kono
parents:
diff changeset
732 (set (match_dup 4) (match_dup 5))]
kono
parents:
diff changeset
733 {
kono
parents:
diff changeset
734 visium_split_double_move (operands, DFmode);
kono
parents:
diff changeset
735 })
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 ;;
kono
parents:
diff changeset
738 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
739 ;;
kono
parents:
diff changeset
740 ;; Integer Add
kono
parents:
diff changeset
741 ;;
kono
parents:
diff changeset
742 ;; Modes QI, HI, SI and DI are supported directly.
kono
parents:
diff changeset
743 ;;
kono
parents:
diff changeset
744 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
745 ;;
kono
parents:
diff changeset
746
kono
parents:
diff changeset
747 (define_expand "add<mode>3"
kono
parents:
diff changeset
748 [(set (match_operand:QHI 0 "register_operand" "")
kono
parents:
diff changeset
749 (plus:QHI (match_operand:QHI 1 "register_operand" "")
kono
parents:
diff changeset
750 (match_operand:QHI 2 "register_operand" "")))]
kono
parents:
diff changeset
751 "")
kono
parents:
diff changeset
752
kono
parents:
diff changeset
753 (define_expand "uaddv<mode>4"
kono
parents:
diff changeset
754 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
755 (plus:I (match_operand:I 1 "register_operand" "")
kono
parents:
diff changeset
756 (match_operand:I 2 "register_operand" "")))
kono
parents:
diff changeset
757 (set (pc)
kono
parents:
diff changeset
758 (if_then_else (ltu (match_dup 0) (match_dup 1))
kono
parents:
diff changeset
759 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
760 (pc)))]
kono
parents:
diff changeset
761 "")
kono
parents:
diff changeset
762
kono
parents:
diff changeset
763 (define_expand "addv<mode>4"
kono
parents:
diff changeset
764 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
765 (plus:I (match_operand:I 1 "register_operand" "")
kono
parents:
diff changeset
766 (match_operand:I 2 "register_operand" "")))
kono
parents:
diff changeset
767 (set (pc)
kono
parents:
diff changeset
768 (if_then_else (ne (match_dup 0)
kono
parents:
diff changeset
769 (unspec:I [(match_dup 1) (match_dup 2)] UNSPEC_ADDV))
kono
parents:
diff changeset
770 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
771 (pc)))]
kono
parents:
diff changeset
772 "")
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774 (define_insn_and_split "*add<mode>3_insn"
kono
parents:
diff changeset
775 [(set (match_operand:QHI 0 "register_operand" "=r")
kono
parents:
diff changeset
776 (plus:QHI (match_operand:QHI 1 "register_operand" "%r")
kono
parents:
diff changeset
777 (match_operand:QHI 2 "register_operand" "r")))]
kono
parents:
diff changeset
778 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
779 "#"
kono
parents:
diff changeset
780 "reload_completed"
kono
parents:
diff changeset
781 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
782 (plus:QHI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
783 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
784 ""
kono
parents:
diff changeset
785 [(set_attr "type" "arith")])
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 (define_insn "*add<mode>3_insn<subst_arith>"
kono
parents:
diff changeset
788 [(set (match_operand:QHI 0 "register_operand" "=r")
kono
parents:
diff changeset
789 (plus:QHI (match_operand:QHI 1 "register_operand" "%r")
kono
parents:
diff changeset
790 (match_operand:QHI 2 "register_operand" "r")))
kono
parents:
diff changeset
791 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
792 "reload_completed"
kono
parents:
diff changeset
793 "add<s> %0,%1,%2"
kono
parents:
diff changeset
794 [(set_attr "type" "arith")])
kono
parents:
diff changeset
795
kono
parents:
diff changeset
796 (define_insn "*add<mode>3_insn_set_carry"
kono
parents:
diff changeset
797 [(set (reg:CCC R_FLAGS)
kono
parents:
diff changeset
798 (compare:CCC (plus:QHI (match_operand:QHI 1 "register_operand" "%r")
kono
parents:
diff changeset
799 (match_operand:QHI 2 "register_operand" "r"))
kono
parents:
diff changeset
800 (match_dup 1)))
kono
parents:
diff changeset
801 (set (match_operand:QHI 0 "register_operand" "=r")
kono
parents:
diff changeset
802 (plus:QHI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
803 "reload_completed"
kono
parents:
diff changeset
804 "add<s> %0,%1,%2"
kono
parents:
diff changeset
805 [(set_attr "type" "arith")])
kono
parents:
diff changeset
806
kono
parents:
diff changeset
807 (define_insn "*add<mode>3_insn_set_overflow"
kono
parents:
diff changeset
808 [(set (reg:CCV R_FLAGS)
kono
parents:
diff changeset
809 (compare:CCV (plus:QHI (match_operand:QHI 1 "register_operand" "%r")
kono
parents:
diff changeset
810 (match_operand:QHI 2 "register_operand" "r"))
kono
parents:
diff changeset
811 (unspec:QHI [(match_dup 1) (match_dup 2)] UNSPEC_ADDV)))
kono
parents:
diff changeset
812 (set (match_operand:QHI 0 "register_operand" "=r")
kono
parents:
diff changeset
813 (plus:QHI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
814 "reload_completed"
kono
parents:
diff changeset
815 "add<s> %0,%1,%2"
kono
parents:
diff changeset
816 [(set_attr "type" "arith")])
kono
parents:
diff changeset
817
kono
parents:
diff changeset
818 (define_expand "addsi3"
kono
parents:
diff changeset
819 [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
820 (plus:SI (match_operand:SI 1 "register_operand" "")
kono
parents:
diff changeset
821 (match_operand:SI 2 "add_operand" "")))]
kono
parents:
diff changeset
822 "")
kono
parents:
diff changeset
823
kono
parents:
diff changeset
824 (define_expand "addsi3_flags"
kono
parents:
diff changeset
825 [(parallel [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
826 (plus:SI (match_operand:SI 1 "register_operand" "")
kono
parents:
diff changeset
827 (match_operand:SI 2 "add_operand" "")))
kono
parents:
diff changeset
828 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
829 "reload_completed"
kono
parents:
diff changeset
830 "")
kono
parents:
diff changeset
831
kono
parents:
diff changeset
832 (define_insn_and_split "*addsi3_insn"
kono
parents:
diff changeset
833 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
kono
parents:
diff changeset
834 (plus:SI (match_operand:SI 1 "register_operand" "%0,r,0")
kono
parents:
diff changeset
835 (match_operand:SI 2 "add_operand" " L,r,J")))]
kono
parents:
diff changeset
836 "ok_for_simple_arith_logic_operands (operands, SImode)"
kono
parents:
diff changeset
837 "#"
kono
parents:
diff changeset
838 "reload_completed"
kono
parents:
diff changeset
839 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
840 (plus:SI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
841 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
842 ""
kono
parents:
diff changeset
843 [(set_attr "type" "arith")])
kono
parents:
diff changeset
844
kono
parents:
diff changeset
845 ; Favour the addition of small negative constants, since they are
kono
parents:
diff changeset
846 ; expensive to load into a register.
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 (define_insn "*addsi3_insn<subst_arith>"
kono
parents:
diff changeset
849 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
kono
parents:
diff changeset
850 (plus:SI (match_operand:SI 1 "register_operand" "%0,r,0")
kono
parents:
diff changeset
851 (match_operand:SI 2 "add_operand" " L,r,J")))
kono
parents:
diff changeset
852 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
853 "reload_completed"
kono
parents:
diff changeset
854 "@
kono
parents:
diff changeset
855 subi %0,%n2
kono
parents:
diff changeset
856 add.l %0,%1,%2
kono
parents:
diff changeset
857 addi %0,%2"
kono
parents:
diff changeset
858 [(set_attr "type" "arith")])
kono
parents:
diff changeset
859
kono
parents:
diff changeset
860 (define_insn "addsi3_insn_set_carry"
kono
parents:
diff changeset
861 [(set (reg:CCC R_FLAGS)
kono
parents:
diff changeset
862 (compare:CCC (plus:SI (match_operand:SI 1 "register_operand" "%r,0")
kono
parents:
diff changeset
863 (match_operand:SI 2 "real_add_operand" " r,J"))
kono
parents:
diff changeset
864 (match_dup 1)))
kono
parents:
diff changeset
865 (set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
866 (plus:SI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
867 "reload_completed"
kono
parents:
diff changeset
868 "@
kono
parents:
diff changeset
869 add.l %0,%1,%2
kono
parents:
diff changeset
870 addi %0,%2"
kono
parents:
diff changeset
871 [(set_attr "type" "arith")])
kono
parents:
diff changeset
872
kono
parents:
diff changeset
873 (define_insn "*addsi3_insn_set_overflow"
kono
parents:
diff changeset
874 [(set (reg:CCV R_FLAGS)
kono
parents:
diff changeset
875 (compare:CCV (plus:SI (match_operand:SI 1 "register_operand" "%r,0")
kono
parents:
diff changeset
876 (match_operand:SI 2 "real_add_operand" " r,J"))
kono
parents:
diff changeset
877 (unspec:SI [(match_dup 1) (match_dup 2)] UNSPEC_ADDV)))
kono
parents:
diff changeset
878 (set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
879 (plus:SI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
880 "reload_completed"
kono
parents:
diff changeset
881 "@
kono
parents:
diff changeset
882 add.l %0,%1,%2
kono
parents:
diff changeset
883 addi %0,%2"
kono
parents:
diff changeset
884 [(set_attr "type" "arith")])
kono
parents:
diff changeset
885
kono
parents:
diff changeset
886 (define_expand "adddi3"
kono
parents:
diff changeset
887 [(set (match_operand:DI 0 "register_operand" "")
kono
parents:
diff changeset
888 (plus:DI (match_operand:DI 1 "register_operand" "")
kono
parents:
diff changeset
889 (match_operand:DI 2 "add_operand" "")))]
kono
parents:
diff changeset
890 "")
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 ; Disfavour the use of add.l because of the early clobber.
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 (define_insn_and_split "*addi3_insn"
kono
parents:
diff changeset
895 [(set (match_operand:DI 0 "register_operand" "=r,r,&r")
kono
parents:
diff changeset
896 (plus:DI (match_operand:DI 1 "register_operand" "%0,0, r")
kono
parents:
diff changeset
897 (match_operand:DI 2 "add_operand" " L,J, r")))]
kono
parents:
diff changeset
898 "ok_for_simple_arith_logic_operands (operands, DImode)"
kono
parents:
diff changeset
899 "#"
kono
parents:
diff changeset
900 "reload_completed"
kono
parents:
diff changeset
901 [(const_int 0)]
kono
parents:
diff changeset
902 {
kono
parents:
diff changeset
903 visium_split_double_add (PLUS, operands[0], operands[1], operands[2]);
kono
parents:
diff changeset
904 DONE;
kono
parents:
diff changeset
905 }
kono
parents:
diff changeset
906 [(set_attr "type" "arith2")])
kono
parents:
diff changeset
907
kono
parents:
diff changeset
908 ;;
kono
parents:
diff changeset
909 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
910 ;;
kono
parents:
diff changeset
911 ;; Integer Add with Carry
kono
parents:
diff changeset
912 ;;
kono
parents:
diff changeset
913 ;; Only SI mode is supported.
kono
parents:
diff changeset
914 ;;
kono
parents:
diff changeset
915 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
916 ;;
kono
parents:
diff changeset
917
kono
parents:
diff changeset
918 (define_insn "*<scc_str><subst_arith>"
kono
parents:
diff changeset
919 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
920 (any_scc:SI (reg R_FLAGS) (const_int 0)))
kono
parents:
diff changeset
921 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
922 "reload_completed"
kono
parents:
diff changeset
923 "adc.l %0,r0,r0"
kono
parents:
diff changeset
924 [(set_attr "type" "arith")])
kono
parents:
diff changeset
925
kono
parents:
diff changeset
926 (define_insn "*plus_<scc_str><subst_arith>"
kono
parents:
diff changeset
927 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
928 (plus:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
929 (any_scc:SI (reg R_FLAGS) (const_int 0))))
kono
parents:
diff changeset
930 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
931 "reload_completed"
kono
parents:
diff changeset
932 "adc.l %0,%1,r0"
kono
parents:
diff changeset
933 [(set_attr "type" "arith")])
kono
parents:
diff changeset
934
kono
parents:
diff changeset
935 (define_insn "*plus_plus_sltu<subst_arith>"
kono
parents:
diff changeset
936 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
937 (plus:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
938 (match_operand:SI 2 "register_operand" "r"))
kono
parents:
diff changeset
939 (ltu:SI (reg R_FLAGS) (const_int 0))))
kono
parents:
diff changeset
940 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
941 "reload_completed"
kono
parents:
diff changeset
942 "adc.l %0,%1,%2"
kono
parents:
diff changeset
943 [(set_attr "type" "arith")])
kono
parents:
diff changeset
944
kono
parents:
diff changeset
945 ;;
kono
parents:
diff changeset
946 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
947 ;;
kono
parents:
diff changeset
948 ;; Integer Subtract
kono
parents:
diff changeset
949 ;;
kono
parents:
diff changeset
950 ;; Modes QI, HI, SI and DI are supported directly.
kono
parents:
diff changeset
951 ;;
kono
parents:
diff changeset
952 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
953 ;;
kono
parents:
diff changeset
954
kono
parents:
diff changeset
955 (define_expand "sub<mode>3"
kono
parents:
diff changeset
956 [(set (match_operand:QHI 0 "register_operand" "")
kono
parents:
diff changeset
957 (minus:QHI (match_operand:QHI 1 "reg_or_0_operand" "")
kono
parents:
diff changeset
958 (match_operand:QHI 2 "register_operand" "")))]
kono
parents:
diff changeset
959 "")
kono
parents:
diff changeset
960
kono
parents:
diff changeset
961 (define_expand "usubv<mode>4"
kono
parents:
diff changeset
962 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
963 (minus:I (match_operand:I 1 "reg_or_0_operand" "")
kono
parents:
diff changeset
964 (match_operand:I 2 "register_operand" "")))
kono
parents:
diff changeset
965 (set (pc)
kono
parents:
diff changeset
966 (if_then_else (ltu (match_dup 1) (match_dup 2))
kono
parents:
diff changeset
967 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
968 (pc)))]
kono
parents:
diff changeset
969 ""
kono
parents:
diff changeset
970 {
kono
parents:
diff changeset
971 if (operands[1] == const0_rtx)
kono
parents:
diff changeset
972 {
kono
parents:
diff changeset
973 emit_insn (gen_unegv<mode>3 (operands[0], operands[2], operands[3]));
kono
parents:
diff changeset
974 DONE;
kono
parents:
diff changeset
975 }
kono
parents:
diff changeset
976 })
kono
parents:
diff changeset
977
kono
parents:
diff changeset
978 (define_expand "subv<mode>4"
kono
parents:
diff changeset
979 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
980 (minus:I (match_operand:I 1 "register_operand" "")
kono
parents:
diff changeset
981 (match_operand:I 2 "register_operand" "")))
kono
parents:
diff changeset
982 (set (pc)
kono
parents:
diff changeset
983 (if_then_else (ne (match_dup 0)
kono
parents:
diff changeset
984 (unspec:I [(match_dup 1) (match_dup 2)] UNSPEC_SUBV))
kono
parents:
diff changeset
985 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
986 (pc)))]
kono
parents:
diff changeset
987 "")
kono
parents:
diff changeset
988
kono
parents:
diff changeset
989 (define_insn_and_split "*sub<mode>3_insn"
kono
parents:
diff changeset
990 [(set (match_operand:QHI 0 "register_operand" "=r")
kono
parents:
diff changeset
991 (minus:QHI (match_operand:QHI 1 "reg_or_0_operand" "rO")
kono
parents:
diff changeset
992 (match_operand:QHI 2 "register_operand" "r")))]
kono
parents:
diff changeset
993 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
994 "#"
kono
parents:
diff changeset
995 "reload_completed"
kono
parents:
diff changeset
996 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
997 (minus:QHI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
998 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
999 ""
kono
parents:
diff changeset
1000 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1001
kono
parents:
diff changeset
1002 (define_insn "*sub<mode>3_insn<subst_arith>"
kono
parents:
diff changeset
1003 [(set (match_operand:QHI 0 "register_operand" "=r")
kono
parents:
diff changeset
1004 (minus:QHI (match_operand:QHI 1 "reg_or_0_operand" "rO")
kono
parents:
diff changeset
1005 (match_operand:QHI 2 "register_operand" "r")))
kono
parents:
diff changeset
1006 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1007 "reload_completed"
kono
parents:
diff changeset
1008 "sub<s> %0,%r1,%2"
kono
parents:
diff changeset
1009 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1010
kono
parents:
diff changeset
1011 (define_insn "*sub<mode>3_insn_set_carry"
kono
parents:
diff changeset
1012 [(set (reg:CC R_FLAGS)
kono
parents:
diff changeset
1013 (compare:CC (match_operand:QHI 1 "reg_or_0_operand" "r0")
kono
parents:
diff changeset
1014 (match_operand:QHI 2 "register_operand" "r")))
kono
parents:
diff changeset
1015 (set (match_operand:QHI 0 "register_operand" "=r")
kono
parents:
diff changeset
1016 (minus:QHI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
1017 "reload_completed"
kono
parents:
diff changeset
1018 "sub<s> %0,%r1,%2"
kono
parents:
diff changeset
1019 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1020
kono
parents:
diff changeset
1021 (define_insn "*sub<mode>3_insn_set_overflow"
kono
parents:
diff changeset
1022 [(set (reg:CCV R_FLAGS)
kono
parents:
diff changeset
1023 (compare:CCV (minus:QHI (match_operand:QHI 1 "reg_or_0_operand" "r0")
kono
parents:
diff changeset
1024 (match_operand:QHI 2 "register_operand" "r"))
kono
parents:
diff changeset
1025 (unspec:QHI [(match_dup 1) (match_dup 2)] UNSPEC_SUBV)))
kono
parents:
diff changeset
1026 (set (match_operand:QHI 0 "register_operand" "=r")
kono
parents:
diff changeset
1027 (minus:QHI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
1028 "reload_completed"
kono
parents:
diff changeset
1029 "sub<s> %0,%r1,%2"
kono
parents:
diff changeset
1030 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1031
kono
parents:
diff changeset
1032 (define_expand "subsi3"
kono
parents:
diff changeset
1033 [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
1034 (minus:SI (match_operand:SI 1 "reg_or_0_operand" "")
kono
parents:
diff changeset
1035 (match_operand:SI 2 "add_operand" "")))]
kono
parents:
diff changeset
1036 "")
kono
parents:
diff changeset
1037
kono
parents:
diff changeset
1038 (define_expand "subsi3_flags"
kono
parents:
diff changeset
1039 [(parallel [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
1040 (minus:SI (match_operand:SI 1 "reg_or_0_operand" "")
kono
parents:
diff changeset
1041 (match_operand:SI 2 "add_operand" "")))
kono
parents:
diff changeset
1042 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1043 "reload_completed"
kono
parents:
diff changeset
1044 "")
kono
parents:
diff changeset
1045
kono
parents:
diff changeset
1046 (define_insn_and_split "*subsi3_insn"
kono
parents:
diff changeset
1047 [(set (match_operand:SI 0 "register_operand" "=r,r, r")
kono
parents:
diff changeset
1048 (minus:SI (match_operand:SI 1 "reg_or_0_operand" " 0,rO,0")
kono
parents:
diff changeset
1049 (match_operand:SI 2 "add_operand" " L,r, J")))]
kono
parents:
diff changeset
1050 "ok_for_simple_arith_logic_operands (operands, SImode)"
kono
parents:
diff changeset
1051 "#"
kono
parents:
diff changeset
1052 "reload_completed"
kono
parents:
diff changeset
1053 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
1054 (minus:SI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1055 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1056 ""
kono
parents:
diff changeset
1057 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1058
kono
parents:
diff changeset
1059 ; Favour the subtraction of small negative constants, since they are
kono
parents:
diff changeset
1060 ; expensive to load into a register.
kono
parents:
diff changeset
1061
kono
parents:
diff changeset
1062 (define_insn "*subsi3_insn<subst_arith>"
kono
parents:
diff changeset
1063 [(set (match_operand:SI 0 "register_operand" "=r,r, r")
kono
parents:
diff changeset
1064 (minus:SI (match_operand:SI 1 "reg_or_0_operand" " 0,rO,0")
kono
parents:
diff changeset
1065 (match_operand:SI 2 "add_operand" " L,r, J")))
kono
parents:
diff changeset
1066 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1067 "reload_completed"
kono
parents:
diff changeset
1068 "@
kono
parents:
diff changeset
1069 addi %0,%n2
kono
parents:
diff changeset
1070 sub.l %0,%r1,%2
kono
parents:
diff changeset
1071 subi %0,%2"
kono
parents:
diff changeset
1072 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1073
kono
parents:
diff changeset
1074 (define_insn "subsi3_insn_set_carry"
kono
parents:
diff changeset
1075 [(set (reg:CC R_FLAGS)
kono
parents:
diff changeset
1076 (compare:CC (match_operand:SI 1 "register_operand" "r,0")
kono
parents:
diff changeset
1077 (match_operand:SI 2 "real_add_operand" "r,J")))
kono
parents:
diff changeset
1078 (set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
1079 (minus:SI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
1080 "reload_completed"
kono
parents:
diff changeset
1081 "@
kono
parents:
diff changeset
1082 sub.l %0,%r1,%2
kono
parents:
diff changeset
1083 subi %0,%2"
kono
parents:
diff changeset
1084 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1085
kono
parents:
diff changeset
1086 (define_insn "*subsi3_insn_set_overflow"
kono
parents:
diff changeset
1087 [(set (reg:CCV R_FLAGS)
kono
parents:
diff changeset
1088 (compare:CCV (minus:SI (match_operand:SI 1 "register_operand" "r,0")
kono
parents:
diff changeset
1089 (match_operand:SI 2 "real_add_operand" "r,J"))
kono
parents:
diff changeset
1090 (unspec:SI [(match_dup 1) (match_dup 2)] UNSPEC_SUBV)))
kono
parents:
diff changeset
1091 (set (match_operand:SI 0 "register_operand" "=r,r")
kono
parents:
diff changeset
1092 (minus:SI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
1093 "reload_completed"
kono
parents:
diff changeset
1094 "@
kono
parents:
diff changeset
1095 sub.l %0,%1,%2
kono
parents:
diff changeset
1096 subi %0,%2"
kono
parents:
diff changeset
1097 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1098
kono
parents:
diff changeset
1099 (define_expand "subdi3"
kono
parents:
diff changeset
1100 [(set (match_operand:DI 0 "register_operand" "")
kono
parents:
diff changeset
1101 (minus:DI (match_operand:DI 1 "register_operand" "")
kono
parents:
diff changeset
1102 (match_operand:DI 2 "add_operand" "")))]
kono
parents:
diff changeset
1103 "")
kono
parents:
diff changeset
1104
kono
parents:
diff changeset
1105 ; Disfavour the use of the sub.l because of the early clobber.
kono
parents:
diff changeset
1106
kono
parents:
diff changeset
1107 (define_insn_and_split "*subdi3_insn"
kono
parents:
diff changeset
1108 [(set (match_operand:DI 0 "register_operand" "=r,r,&r")
kono
parents:
diff changeset
1109 (minus:DI (match_operand:DI 1 "register_operand" " 0,0, r")
kono
parents:
diff changeset
1110 (match_operand:DI 2 "add_operand" " L,J, r")))]
kono
parents:
diff changeset
1111 "ok_for_simple_arith_logic_operands (operands, DImode)"
kono
parents:
diff changeset
1112 "#"
kono
parents:
diff changeset
1113 "reload_completed"
kono
parents:
diff changeset
1114 [(const_int 0)]
kono
parents:
diff changeset
1115 {
kono
parents:
diff changeset
1116 visium_split_double_add (MINUS, operands[0], operands[1], operands[2]);
kono
parents:
diff changeset
1117 DONE;
kono
parents:
diff changeset
1118 }
kono
parents:
diff changeset
1119 [(set_attr "type" "arith2")])
kono
parents:
diff changeset
1120
kono
parents:
diff changeset
1121 ;;
kono
parents:
diff changeset
1122 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1123 ;;
kono
parents:
diff changeset
1124 ;; Integer Subtract with Carry
kono
parents:
diff changeset
1125 ;;
kono
parents:
diff changeset
1126 ;; Only SI mode is supported.
kono
parents:
diff changeset
1127 ;;
kono
parents:
diff changeset
1128 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1129 ;;
kono
parents:
diff changeset
1130
kono
parents:
diff changeset
1131 (define_insn "*neg_<scc_str><subst_arith>"
kono
parents:
diff changeset
1132 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1133 (neg:SI (any_scc:SI (reg R_FLAGS) (const_int 0))))
kono
parents:
diff changeset
1134 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1135 "reload_completed"
kono
parents:
diff changeset
1136 "subc.l %0,r0,r0"
kono
parents:
diff changeset
1137 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1138
kono
parents:
diff changeset
1139 (define_insn "*minus_<scc_str><subst_arith>"
kono
parents:
diff changeset
1140 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1141 (minus:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
1142 (any_scc:SI (reg R_FLAGS) (const_int 0))))
kono
parents:
diff changeset
1143 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1144 "reload_completed"
kono
parents:
diff changeset
1145 "subc.l %0,%1,r0"
kono
parents:
diff changeset
1146 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1147
kono
parents:
diff changeset
1148 (define_insn "*minus_minus_sltu<subst_arith>"
kono
parents:
diff changeset
1149 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1150 (minus:SI (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
kono
parents:
diff changeset
1151 (match_operand:SI 2 "register_operand" "r"))
kono
parents:
diff changeset
1152 (ltu:SI (reg R_FLAGS) (const_int 0))))
kono
parents:
diff changeset
1153 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1154 "reload_completed"
kono
parents:
diff changeset
1155 "subc.l %0,%r1,%2"
kono
parents:
diff changeset
1156 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1157
kono
parents:
diff changeset
1158 ;;
kono
parents:
diff changeset
1159 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1160 ;;
kono
parents:
diff changeset
1161 ;; Integer Negate
kono
parents:
diff changeset
1162 ;;
kono
parents:
diff changeset
1163 ;; Modes QI, HI, SI and DI are supported directly.
kono
parents:
diff changeset
1164 ;;
kono
parents:
diff changeset
1165 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1166 ;;
kono
parents:
diff changeset
1167
kono
parents:
diff changeset
1168 (define_expand "neg<mode>2"
kono
parents:
diff changeset
1169 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1170 (neg:I (match_operand:I 1 "register_operand" "")))]
kono
parents:
diff changeset
1171 "")
kono
parents:
diff changeset
1172
kono
parents:
diff changeset
1173 (define_expand "unegv<mode>3"
kono
parents:
diff changeset
1174 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1175 (neg:I (match_operand:I 1 "register_operand" "")))
kono
parents:
diff changeset
1176 (set (pc)
kono
parents:
diff changeset
1177 (if_then_else (ne (match_dup 0) (const_int 0))
kono
parents:
diff changeset
1178 (label_ref (match_operand 2 ""))
kono
parents:
diff changeset
1179 (pc)))]
kono
parents:
diff changeset
1180 "")
kono
parents:
diff changeset
1181
kono
parents:
diff changeset
1182 (define_expand "negv<mode>3"
kono
parents:
diff changeset
1183 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1184 (neg:I (match_operand:I 1 "register_operand" "")))
kono
parents:
diff changeset
1185 (set (pc)
kono
parents:
diff changeset
1186 (if_then_else (ne (match_dup 0)
kono
parents:
diff changeset
1187 (unspec:I [(match_dup 1)] UNSPEC_NEGV))
kono
parents:
diff changeset
1188 (label_ref (match_operand 2 ""))
kono
parents:
diff changeset
1189 (pc)))]
kono
parents:
diff changeset
1190 "")
kono
parents:
diff changeset
1191
kono
parents:
diff changeset
1192 (define_insn_and_split "*neg<mode>2_insn"
kono
parents:
diff changeset
1193 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1194 (neg:I (match_operand:I 1 "register_operand" "r")))]
kono
parents:
diff changeset
1195 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
1196 "#"
kono
parents:
diff changeset
1197 "reload_completed"
kono
parents:
diff changeset
1198 [(parallel [(set (match_dup 0) (neg:I (match_dup 1)))
kono
parents:
diff changeset
1199 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1200 ""
kono
parents:
diff changeset
1201 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1202
kono
parents:
diff changeset
1203 (define_insn "*neg<mode>2_insn<subst_arith>"
kono
parents:
diff changeset
1204 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1205 (neg:I (match_operand:I 1 "register_operand" "r")))
kono
parents:
diff changeset
1206 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1207 "reload_completed"
kono
parents:
diff changeset
1208 "sub<s> %0,r0,%1"
kono
parents:
diff changeset
1209 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1210
kono
parents:
diff changeset
1211 (define_insn "negsi2_insn_set_carry"
kono
parents:
diff changeset
1212 [(set (reg:CCC R_FLAGS)
kono
parents:
diff changeset
1213 (compare:CCC (not:SI (match_operand:SI 1 "register_operand" "r"))
kono
parents:
diff changeset
1214 (const_int -1)))
kono
parents:
diff changeset
1215 (set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1216 (neg:SI (match_dup 1)))]
kono
parents:
diff changeset
1217 "reload_completed"
kono
parents:
diff changeset
1218 "sub.l %0,r0,%1"
kono
parents:
diff changeset
1219 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1220
kono
parents:
diff changeset
1221 (define_insn "*neg<mode>2_insn_set_overflow"
kono
parents:
diff changeset
1222 [(set (reg:CCV R_FLAGS)
kono
parents:
diff changeset
1223 (compare:CCV (neg:I (match_operand:I 1 "register_operand" "r"))
kono
parents:
diff changeset
1224 (unspec:I [(match_dup 1)] UNSPEC_NEGV)))
kono
parents:
diff changeset
1225 (set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1226 (neg:I (match_dup 1)))]
kono
parents:
diff changeset
1227 "reload_completed"
kono
parents:
diff changeset
1228 "sub<s> %0,r0,%1"
kono
parents:
diff changeset
1229 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1230
kono
parents:
diff changeset
1231 (define_expand "negdi2"
kono
parents:
diff changeset
1232 [(set (match_operand:DI 0 "register_operand" "")
kono
parents:
diff changeset
1233 (neg:DI (match_operand:DI 1 "register_operand" "")))]
kono
parents:
diff changeset
1234 "")
kono
parents:
diff changeset
1235
kono
parents:
diff changeset
1236 (define_insn_and_split "*negdi2_insn"
kono
parents:
diff changeset
1237 [(set (match_operand:DI 0 "register_operand" "=&r")
kono
parents:
diff changeset
1238 (neg:DI (match_operand:DI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1239 "ok_for_simple_arith_logic_operands (operands, DImode)"
kono
parents:
diff changeset
1240 "#"
kono
parents:
diff changeset
1241 "reload_completed"
kono
parents:
diff changeset
1242 [(const_int 0)]
kono
parents:
diff changeset
1243 {
kono
parents:
diff changeset
1244 visium_split_double_add (MINUS, operands[0], const0_rtx, operands[1]);
kono
parents:
diff changeset
1245 DONE;
kono
parents:
diff changeset
1246 }
kono
parents:
diff changeset
1247 [(set_attr "type" "arith2")])
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249 ;;
kono
parents:
diff changeset
1250 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1251 ;;
kono
parents:
diff changeset
1252 ;; Integer Multiply (non-widening and widening, signed and unsigned)
kono
parents:
diff changeset
1253 ;;
kono
parents:
diff changeset
1254 ;; Only SI mode is supported.
kono
parents:
diff changeset
1255 ;;
kono
parents:
diff changeset
1256 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1257 ;;
kono
parents:
diff changeset
1258
kono
parents:
diff changeset
1259 ; The mults and multu instructions clear MDC but we only pretend that they
kono
parents:
diff changeset
1260 ; clobber it to keep things relatively simple.
kono
parents:
diff changeset
1261
kono
parents:
diff changeset
1262 (define_insn "mulsi3"
kono
parents:
diff changeset
1263 [(set (match_operand:SI 0 "register_operand" "=b")
kono
parents:
diff changeset
1264 (mult:SI (match_operand:SI 1 "register_operand" "%r")
kono
parents:
diff changeset
1265 (match_operand:SI 2 "register_operand" "r")))
kono
parents:
diff changeset
1266 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1267 ""
kono
parents:
diff changeset
1268 "mults %1,%2"
kono
parents:
diff changeset
1269 [(set_attr "type" "mul")])
kono
parents:
diff changeset
1270
kono
parents:
diff changeset
1271 ; The names are mulsidi3 and umulsidi3 here.
kono
parents:
diff changeset
1272
kono
parents:
diff changeset
1273 (define_insn "<u>mulsidi3"
kono
parents:
diff changeset
1274 [(set (match_operand:DI 0 "register_operand" "=b")
kono
parents:
diff changeset
1275 (mult:DI (any_extend:DI (match_operand:SI 1 "register_operand" "%r"))
kono
parents:
diff changeset
1276 (any_extend:DI (match_operand:SI 2 "register_operand" "r"))))
kono
parents:
diff changeset
1277 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1278 ""
kono
parents:
diff changeset
1279 "mult<su> %1,%2"
kono
parents:
diff changeset
1280 [(set_attr "type" "mul")])
kono
parents:
diff changeset
1281
kono
parents:
diff changeset
1282 ; But they are smulsi3_highpart and umulsi3_highpart here.
kono
parents:
diff changeset
1283
kono
parents:
diff changeset
1284 (define_insn_and_split "<su>mulsi3_highpart"
kono
parents:
diff changeset
1285 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1286 (truncate:SI
kono
parents:
diff changeset
1287 (ashiftrt:DI
kono
parents:
diff changeset
1288 (mult:DI (any_extend:DI (match_operand:SI 1 "register_operand" "%r"))
kono
parents:
diff changeset
1289 (any_extend:DI (match_operand:SI 2 "register_operand" "r")))
kono
parents:
diff changeset
1290 (const_int 32))))
kono
parents:
diff changeset
1291 (clobber (reg:DI R_MDB))
kono
parents:
diff changeset
1292 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1293 ""
kono
parents:
diff changeset
1294 "#"
kono
parents:
diff changeset
1295 "reload_completed"
kono
parents:
diff changeset
1296 [(parallel [(set (reg:DI R_MDB)
kono
parents:
diff changeset
1297 (mult:DI (any_extend:DI (match_dup 1))
kono
parents:
diff changeset
1298 (any_extend:DI (match_dup 2))))
kono
parents:
diff changeset
1299 (clobber (reg:SI R_MDC))])
kono
parents:
diff changeset
1300 (set (match_dup 0) (unspec:SI [(reg:DI R_MDB)] UNSPEC_MDBHI))]
kono
parents:
diff changeset
1301 ""
kono
parents:
diff changeset
1302 [(set_attr "type" "multi")])
kono
parents:
diff changeset
1303
kono
parents:
diff changeset
1304 ;;
kono
parents:
diff changeset
1305 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1306 ;;
kono
parents:
diff changeset
1307 ;; Integer divide and modulus (signed and unsigned)
kono
parents:
diff changeset
1308 ;;
kono
parents:
diff changeset
1309 ;; Only SI mode is supported.
kono
parents:
diff changeset
1310 ;;
kono
parents:
diff changeset
1311 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1312 ;;
kono
parents:
diff changeset
1313
kono
parents:
diff changeset
1314 (define_insn "*divmodsi4_insn"
kono
parents:
diff changeset
1315 [(set (match_operand:SI 0 "register_operand" "=b")
kono
parents:
diff changeset
1316 (div:SI (match_operand:SI 1 "register_operand" "0")
kono
parents:
diff changeset
1317 (match_operand:SI 2 "register_operand" "r")))
kono
parents:
diff changeset
1318 (set (reg:SI R_MDC) (mod:SI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
1319 ""
kono
parents:
diff changeset
1320 "divs %2"
kono
parents:
diff changeset
1321 [(set_attr "type" "div")])
kono
parents:
diff changeset
1322
kono
parents:
diff changeset
1323 (define_insn_and_split "divmodsi4"
kono
parents:
diff changeset
1324 [(set (match_operand:SI 0 "register_operand" "=b")
kono
parents:
diff changeset
1325 (div:SI (match_operand:SI 1 "register_operand" "0")
kono
parents:
diff changeset
1326 (match_operand:SI 2 "register_operand" "r")))
kono
parents:
diff changeset
1327 (set (match_operand:SI 3 "register_operand" "=r")
kono
parents:
diff changeset
1328 (mod:SI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1329 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1330 ""
kono
parents:
diff changeset
1331 "#"
kono
parents:
diff changeset
1332 "reload_completed"
kono
parents:
diff changeset
1333 [(parallel [(set (match_dup 0) (div:SI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1334 (set (reg:SI R_MDC) (mod:SI (match_dup 1) (match_dup 2)))])
kono
parents:
diff changeset
1335 (set (match_dup 3) (reg:SI R_MDC))]
kono
parents:
diff changeset
1336 ""
kono
parents:
diff changeset
1337 [(set_attr "type" "multi")])
kono
parents:
diff changeset
1338
kono
parents:
diff changeset
1339 (define_insn "*udivmodsi4_insn"
kono
parents:
diff changeset
1340 [(set (match_operand:SI 0 "register_operand" "=b")
kono
parents:
diff changeset
1341 (udiv:SI (match_operand:SI 1 "register_operand" "0")
kono
parents:
diff changeset
1342 (match_operand:SI 2 "register_operand" "r")))
kono
parents:
diff changeset
1343 (set (reg:SI R_MDC) (umod:SI (match_dup 1) (match_dup 2)))]
kono
parents:
diff changeset
1344 ""
kono
parents:
diff changeset
1345 "divu %2"
kono
parents:
diff changeset
1346 [(set_attr "type" "div")])
kono
parents:
diff changeset
1347
kono
parents:
diff changeset
1348 (define_insn_and_split "udivmodsi4"
kono
parents:
diff changeset
1349 [(set (match_operand:SI 0 "register_operand" "=b")
kono
parents:
diff changeset
1350 (udiv:SI (match_operand:SI 1 "register_operand" "0")
kono
parents:
diff changeset
1351 (match_operand:SI 2 "register_operand" "r")))
kono
parents:
diff changeset
1352 (set (match_operand:SI 3 "register_operand" "=r")
kono
parents:
diff changeset
1353 (umod:SI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1354 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1355 ""
kono
parents:
diff changeset
1356 "#"
kono
parents:
diff changeset
1357 "reload_completed"
kono
parents:
diff changeset
1358 [(parallel [(set (match_dup 0) (udiv:SI (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1359 (set (reg:SI R_MDC) (umod:SI (match_dup 1) (match_dup 2)))])
kono
parents:
diff changeset
1360 (set (match_dup 3) (reg:SI R_MDC))]
kono
parents:
diff changeset
1361 ""
kono
parents:
diff changeset
1362 [(set_attr "type" "multi")])
kono
parents:
diff changeset
1363
kono
parents:
diff changeset
1364 ; FIXME. How do we persuade the compiler to use 64/32 bit divides directly ?
kono
parents:
diff changeset
1365
kono
parents:
diff changeset
1366 (define_insn "*divds"
kono
parents:
diff changeset
1367 [(set (reg:DI R_MDB)
kono
parents:
diff changeset
1368 (div:DI (reg:DI R_MDB) (sign_extend:DI (match_operand:SI 0 "register_operand" "r"))))
kono
parents:
diff changeset
1369 (set (reg:SI R_MDC) (truncate:SI (mod:DI (reg:DI R_MDB) (sign_extend:DI (match_dup 0)))))]
kono
parents:
diff changeset
1370 ""
kono
parents:
diff changeset
1371 "divds %0"
kono
parents:
diff changeset
1372 [(set_attr "type" "divd")])
kono
parents:
diff changeset
1373
kono
parents:
diff changeset
1374 (define_insn "*divdu"
kono
parents:
diff changeset
1375 [(set (reg:DI R_MDB)
kono
parents:
diff changeset
1376 (udiv:DI (reg:DI R_MDB) (zero_extend:DI (match_operand:SI 0 "register_operand" "r"))))
kono
parents:
diff changeset
1377 (set (reg:SI R_MDC) (truncate:SI (umod:DI (reg:DI R_MDB) (zero_extend:DI (match_dup 0)))))]
kono
parents:
diff changeset
1378 ""
kono
parents:
diff changeset
1379 "divdu %0"
kono
parents:
diff changeset
1380 [(set_attr "type" "divd")])
kono
parents:
diff changeset
1381
kono
parents:
diff changeset
1382 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1383 ;;
kono
parents:
diff changeset
1384 ;; Bitwise Logical AND
kono
parents:
diff changeset
1385 ;;
kono
parents:
diff changeset
1386 ;; Modes QI, HI and SI are supported directly.
kono
parents:
diff changeset
1387 ;;
kono
parents:
diff changeset
1388 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1389 ;;
kono
parents:
diff changeset
1390
kono
parents:
diff changeset
1391 (define_expand "and<mode>3"
kono
parents:
diff changeset
1392 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1393 (and:I (match_operand:I 1 "register_operand" "")
kono
parents:
diff changeset
1394 (match_operand:I 2 "register_operand" "")))]
kono
parents:
diff changeset
1395 "")
kono
parents:
diff changeset
1396
kono
parents:
diff changeset
1397 (define_insn_and_split "*and<mode>3_insn"
kono
parents:
diff changeset
1398 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1399 (and:I (match_operand:I 1 "register_operand" "%r")
kono
parents:
diff changeset
1400 (match_operand:I 2 "register_operand" "r")))]
kono
parents:
diff changeset
1401 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
1402 "#"
kono
parents:
diff changeset
1403 "reload_completed"
kono
parents:
diff changeset
1404 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
1405 (and:I (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1406 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1407 ""
kono
parents:
diff changeset
1408 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1409
kono
parents:
diff changeset
1410 (define_insn "*and<mode>3_insn<subst_logic>"
kono
parents:
diff changeset
1411 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1412 (and:I (match_operand:I 1 "register_operand" "%r")
kono
parents:
diff changeset
1413 (match_operand:I 2 "register_operand" "r")))
kono
parents:
diff changeset
1414 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1415 "reload_completed"
kono
parents:
diff changeset
1416 "and<s> %0,%1,%2"
kono
parents:
diff changeset
1417 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1418
kono
parents:
diff changeset
1419 ;;
kono
parents:
diff changeset
1420 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1421 ;;
kono
parents:
diff changeset
1422 ;; Bitwise Inclusive Logical OR
kono
parents:
diff changeset
1423 ;;
kono
parents:
diff changeset
1424 ;; Modes QI, HI and SI are supported directly.
kono
parents:
diff changeset
1425 ;;
kono
parents:
diff changeset
1426 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1427 ;;
kono
parents:
diff changeset
1428
kono
parents:
diff changeset
1429 (define_expand "ior<mode>3"
kono
parents:
diff changeset
1430 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1431 (ior:I (match_operand:I 1 "register_operand" "")
kono
parents:
diff changeset
1432 (match_operand:I 2 "register_operand" "")))]
kono
parents:
diff changeset
1433 "")
kono
parents:
diff changeset
1434
kono
parents:
diff changeset
1435 (define_insn_and_split "*ior<mode>3_insn"
kono
parents:
diff changeset
1436 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1437 (ior:I (match_operand:I 1 "register_operand" "%r")
kono
parents:
diff changeset
1438 (match_operand:I 2 "register_operand" "r")))]
kono
parents:
diff changeset
1439 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
1440 "#"
kono
parents:
diff changeset
1441 "reload_completed"
kono
parents:
diff changeset
1442 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
1443 (ior:I (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1444 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1445 ""
kono
parents:
diff changeset
1446 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1447
kono
parents:
diff changeset
1448 (define_insn "*ior<mode>3_insn<subst_logic>"
kono
parents:
diff changeset
1449 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1450 (ior:I (match_operand:I 1 "register_operand" "%r")
kono
parents:
diff changeset
1451 (match_operand:I 2 "register_operand" "r")))
kono
parents:
diff changeset
1452 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1453 "reload_completed"
kono
parents:
diff changeset
1454 "or<s> %0,%1,%2"
kono
parents:
diff changeset
1455 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1456
kono
parents:
diff changeset
1457 ;;
kono
parents:
diff changeset
1458 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1459 ;;
kono
parents:
diff changeset
1460 ;; Bitwise Exclusive Logical OR
kono
parents:
diff changeset
1461 ;;
kono
parents:
diff changeset
1462 ;; Modes QI, HI and SI are supported directly.
kono
parents:
diff changeset
1463 ;;
kono
parents:
diff changeset
1464 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1465 ;;
kono
parents:
diff changeset
1466
kono
parents:
diff changeset
1467 (define_expand "xor<mode>3"
kono
parents:
diff changeset
1468 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1469 (xor:I (match_operand:I 1 "register_operand" "")
kono
parents:
diff changeset
1470 (match_operand:I 2 "register_operand" "")))]
kono
parents:
diff changeset
1471 "")
kono
parents:
diff changeset
1472
kono
parents:
diff changeset
1473 (define_insn_and_split "*xor<mode>3_insn"
kono
parents:
diff changeset
1474 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1475 (xor:I (match_operand:I 1 "register_operand" "%r")
kono
parents:
diff changeset
1476 (match_operand:I 2 "register_operand" "r")))]
kono
parents:
diff changeset
1477 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
1478 "#"
kono
parents:
diff changeset
1479 "reload_completed"
kono
parents:
diff changeset
1480 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
1481 (xor:I (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1482 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1483 ""
kono
parents:
diff changeset
1484 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1485
kono
parents:
diff changeset
1486 (define_insn "*xor<mode>3_insn<subst_logic>"
kono
parents:
diff changeset
1487 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1488 (xor:I (match_operand:I 1 "register_operand" "%r")
kono
parents:
diff changeset
1489 (match_operand:I 2 "register_operand" "r")))
kono
parents:
diff changeset
1490 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1491 "reload_completed"
kono
parents:
diff changeset
1492 "xor<s> %0,%1,%2"
kono
parents:
diff changeset
1493 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1494
kono
parents:
diff changeset
1495 ;;
kono
parents:
diff changeset
1496 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1497 ;;
kono
parents:
diff changeset
1498 ;; Bitwise Logical NOT
kono
parents:
diff changeset
1499 ;;
kono
parents:
diff changeset
1500 ;; Modes QI, HI and SI are supported directly.
kono
parents:
diff changeset
1501 ;;
kono
parents:
diff changeset
1502 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1503 ;;
kono
parents:
diff changeset
1504
kono
parents:
diff changeset
1505 (define_expand "one_cmpl<mode>2"
kono
parents:
diff changeset
1506 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1507 (not:I (match_operand:I 1 "reg_or_0_operand" "")))]
kono
parents:
diff changeset
1508 "")
kono
parents:
diff changeset
1509
kono
parents:
diff changeset
1510 (define_insn_and_split "*one_cmpl<mode>2_insn"
kono
parents:
diff changeset
1511 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1512 (not:I (match_operand:I 1 "reg_or_0_operand" "rO")))]
kono
parents:
diff changeset
1513 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
1514 "#"
kono
parents:
diff changeset
1515 "reload_completed"
kono
parents:
diff changeset
1516 [(parallel [(set (match_dup 0) (not:I (match_dup 1)))
kono
parents:
diff changeset
1517 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1518 ""
kono
parents:
diff changeset
1519 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1520
kono
parents:
diff changeset
1521 (define_insn "*one_cmpl<mode>2_insn<subst_logic>"
kono
parents:
diff changeset
1522 [(set (match_operand:I 0 "register_operand" "=r")
kono
parents:
diff changeset
1523 (not:I (match_operand:I 1 "reg_or_0_operand" "rO")))
kono
parents:
diff changeset
1524 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1525 "reload_completed"
kono
parents:
diff changeset
1526 "not<s> %0,%r1"
kono
parents:
diff changeset
1527 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1528
kono
parents:
diff changeset
1529 ;;
kono
parents:
diff changeset
1530 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1531 ;;
kono
parents:
diff changeset
1532 ;; Arithmetic Shift Left
kono
parents:
diff changeset
1533 ;;
kono
parents:
diff changeset
1534 ;; Modes QI, HI, SI and DI are supported directly.
kono
parents:
diff changeset
1535 ;;
kono
parents:
diff changeset
1536 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1537 ;;
kono
parents:
diff changeset
1538
kono
parents:
diff changeset
1539 (define_expand "ashl<mode>3"
kono
parents:
diff changeset
1540 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1541 (ashift:I (match_operand:I 1 "register_operand" "")
kono
parents:
diff changeset
1542 (match_operand:QI 2 "reg_or_shift_operand" "")))]
kono
parents:
diff changeset
1543 "")
kono
parents:
diff changeset
1544
kono
parents:
diff changeset
1545 (define_insn_and_split "*ashl<mode>3_insn"
kono
parents:
diff changeset
1546 [(set (match_operand:I 0 "register_operand" "=r,r")
kono
parents:
diff changeset
1547 (ashift:I (match_operand:I 1 "register_operand" "r,r")
kono
parents:
diff changeset
1548 (match_operand:QI 2 "reg_or_shift_operand" "r,K")))]
kono
parents:
diff changeset
1549 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
1550 "#"
kono
parents:
diff changeset
1551 "reload_completed"
kono
parents:
diff changeset
1552 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
1553 (ashift:I (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1554 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1555 ""
kono
parents:
diff changeset
1556 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1557
kono
parents:
diff changeset
1558 (define_insn "*ashl<mode>3_insn<subst_arith>"
kono
parents:
diff changeset
1559 [(set (match_operand:I 0 "register_operand" "=r,r")
kono
parents:
diff changeset
1560 (ashift:I (match_operand:I 1 "register_operand" "r,r")
kono
parents:
diff changeset
1561 (match_operand:QI 2 "reg_or_shift_operand" "r,K")))
kono
parents:
diff changeset
1562 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1563 "reload_completed"
kono
parents:
diff changeset
1564 "asl<s> %0,%1,%2"
kono
parents:
diff changeset
1565 [(set_attr "type" "arith")])
kono
parents:
diff changeset
1566
kono
parents:
diff changeset
1567 (define_insn "ashldi3"
kono
parents:
diff changeset
1568 [(set (match_operand:DI 0 "register_operand" "=b,r")
kono
parents:
diff changeset
1569 (ashift:DI (match_operand:DI 1 "register_operand" "0,r")
kono
parents:
diff changeset
1570 (match_operand:QI 2 "reg_or_32_operand" "r,P")))
kono
parents:
diff changeset
1571 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1572 ""
kono
parents:
diff changeset
1573 "@
kono
parents:
diff changeset
1574 asld %2
kono
parents:
diff changeset
1575 #"
kono
parents:
diff changeset
1576 [(set_attr "type" "shiftdi,multi")])
kono
parents:
diff changeset
1577
kono
parents:
diff changeset
1578 (define_split
kono
parents:
diff changeset
1579 [(set (match_operand:DI 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
1580 (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
kono
parents:
diff changeset
1581 (const_int 32)))
kono
parents:
diff changeset
1582 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1583 "reload_completed"
kono
parents:
diff changeset
1584 [(set (subreg:SI (match_dup 0) 0) (subreg:SI (match_dup 1) 4))
kono
parents:
diff changeset
1585 (set (subreg:SI (match_dup 0) 4) (const_int 0))]
kono
parents:
diff changeset
1586 "")
kono
parents:
diff changeset
1587
kono
parents:
diff changeset
1588 ;;
kono
parents:
diff changeset
1589 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1590 ;;
kono
parents:
diff changeset
1591 ;; Arithmetic Shift Right
kono
parents:
diff changeset
1592 ;;
kono
parents:
diff changeset
1593 ;; Modes QI, HI, SI and DI are supported directly.
kono
parents:
diff changeset
1594 ;;
kono
parents:
diff changeset
1595 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1596 ;;
kono
parents:
diff changeset
1597
kono
parents:
diff changeset
1598 (define_expand "ashr<mode>3"
kono
parents:
diff changeset
1599 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1600 (ashiftrt:I (match_operand:I 1 "register_operand" "")
kono
parents:
diff changeset
1601 (match_operand:QI 2 "reg_or_shift_operand" "")))]
kono
parents:
diff changeset
1602 "")
kono
parents:
diff changeset
1603
kono
parents:
diff changeset
1604 (define_insn_and_split "*ashr<mode>3_insn"
kono
parents:
diff changeset
1605 [(set (match_operand:I 0 "register_operand" "=r,r")
kono
parents:
diff changeset
1606 (ashiftrt:I (match_operand:I 1 "register_operand" "r,r")
kono
parents:
diff changeset
1607 (match_operand:QI 2 "reg_or_shift_operand" "r,K")))]
kono
parents:
diff changeset
1608 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
1609 "#"
kono
parents:
diff changeset
1610 "reload_completed"
kono
parents:
diff changeset
1611 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
1612 (ashiftrt:I (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1613 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1614 ""
kono
parents:
diff changeset
1615 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1616
kono
parents:
diff changeset
1617 (define_insn "*ashr<mode>3_insn<subst_logic>"
kono
parents:
diff changeset
1618 [(set (match_operand:I 0 "register_operand" "=r,r")
kono
parents:
diff changeset
1619 (ashiftrt:I (match_operand:I 1 "register_operand" "r,r")
kono
parents:
diff changeset
1620 (match_operand:QI 2 "reg_or_shift_operand" "r,K")))
kono
parents:
diff changeset
1621 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1622 "reload_completed"
kono
parents:
diff changeset
1623 "asr<s> %0,%1,%2"
kono
parents:
diff changeset
1624 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1625
kono
parents:
diff changeset
1626 (define_insn "ashrdi3"
kono
parents:
diff changeset
1627 [(set (match_operand:DI 0 "register_operand" "=b,r")
kono
parents:
diff changeset
1628 (ashiftrt:DI (match_operand:DI 1 "register_operand" "0,r")
kono
parents:
diff changeset
1629 (match_operand:QI 2 "reg_or_32_operand" "r,P")))
kono
parents:
diff changeset
1630 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1631 ""
kono
parents:
diff changeset
1632 "@
kono
parents:
diff changeset
1633 asrd %2
kono
parents:
diff changeset
1634 #"
kono
parents:
diff changeset
1635 [(set_attr "type" "shiftdi,multi")])
kono
parents:
diff changeset
1636
kono
parents:
diff changeset
1637 (define_split
kono
parents:
diff changeset
1638 [(set (match_operand:DI 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
1639 (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
kono
parents:
diff changeset
1640 (const_int 32)))
kono
parents:
diff changeset
1641 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1642 "reload_completed"
kono
parents:
diff changeset
1643 [(set (subreg:SI (match_dup 0) 4) (subreg:SI (match_dup 1) 0))
kono
parents:
diff changeset
1644 (parallel [(set (subreg:SI (match_dup 0) 0)
kono
parents:
diff changeset
1645 (ashiftrt:SI (subreg:SI (match_dup 1) 0) (const_int 31)))
kono
parents:
diff changeset
1646 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1647 "")
kono
parents:
diff changeset
1648
kono
parents:
diff changeset
1649 ;;
kono
parents:
diff changeset
1650 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1651 ;;
kono
parents:
diff changeset
1652 ;; Logical Shift Right
kono
parents:
diff changeset
1653 ;;
kono
parents:
diff changeset
1654 ;; Modes QI, HI, SI and DI are supported directly.
kono
parents:
diff changeset
1655 ;;
kono
parents:
diff changeset
1656 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1657 ;;
kono
parents:
diff changeset
1658
kono
parents:
diff changeset
1659 (define_expand "lshr<mode>3"
kono
parents:
diff changeset
1660 [(set (match_operand:I 0 "register_operand" "")
kono
parents:
diff changeset
1661 (lshiftrt:I (match_operand:I 1 "register_operand" "")
kono
parents:
diff changeset
1662 (match_operand:QI 2 "reg_or_shift_operand" "")))]
kono
parents:
diff changeset
1663 "")
kono
parents:
diff changeset
1664
kono
parents:
diff changeset
1665 (define_insn_and_split "*lshr<mode>3_insn"
kono
parents:
diff changeset
1666 [(set (match_operand:I 0 "register_operand" "=r,r")
kono
parents:
diff changeset
1667 (lshiftrt:I (match_operand:I 1 "register_operand" "r,r")
kono
parents:
diff changeset
1668 (match_operand:QI 2 "reg_or_shift_operand" "r,K")))]
kono
parents:
diff changeset
1669 "ok_for_simple_arith_logic_operands (operands, <MODE>mode)"
kono
parents:
diff changeset
1670 "#"
kono
parents:
diff changeset
1671 "reload_completed"
kono
parents:
diff changeset
1672 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
1673 (lshiftrt:I (match_dup 1) (match_dup 2)))
kono
parents:
diff changeset
1674 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1675 ""
kono
parents:
diff changeset
1676 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1677
kono
parents:
diff changeset
1678 (define_insn "*lshr<mode>3_insn<subst_logic>"
kono
parents:
diff changeset
1679 [(set (match_operand:I 0 "register_operand" "=r,r")
kono
parents:
diff changeset
1680 (lshiftrt:I (match_operand:I 1 "register_operand" "r,r")
kono
parents:
diff changeset
1681 (match_operand:QI 2 "reg_or_shift_operand" "r,K")))
kono
parents:
diff changeset
1682 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1683 "reload_completed"
kono
parents:
diff changeset
1684 "lsr<s> %0,%1,%2"
kono
parents:
diff changeset
1685 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1686
kono
parents:
diff changeset
1687 (define_insn "lshrdi3"
kono
parents:
diff changeset
1688 [(set (match_operand:DI 0 "register_operand" "=b,r")
kono
parents:
diff changeset
1689 (lshiftrt:DI (match_operand:DI 1 "register_operand" "0,r")
kono
parents:
diff changeset
1690 (match_operand:QI 2 "reg_or_32_operand" "r,P")))
kono
parents:
diff changeset
1691 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1692 ""
kono
parents:
diff changeset
1693 "@
kono
parents:
diff changeset
1694 lsrd %2
kono
parents:
diff changeset
1695 #"
kono
parents:
diff changeset
1696 [(set_attr "type" "shiftdi,multi")])
kono
parents:
diff changeset
1697
kono
parents:
diff changeset
1698 (define_split
kono
parents:
diff changeset
1699 [(set (match_operand:DI 0 "gpc_reg_operand" "")
kono
parents:
diff changeset
1700 (lshiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
kono
parents:
diff changeset
1701 (const_int 32)))
kono
parents:
diff changeset
1702 (clobber (reg:SI R_MDC))]
kono
parents:
diff changeset
1703 "reload_completed"
kono
parents:
diff changeset
1704 [(set (subreg:SI (match_dup 0) 4) (subreg:SI (match_dup 1) 0))
kono
parents:
diff changeset
1705 (set (subreg:SI (match_dup 0) 0) (const_int 0))]
kono
parents:
diff changeset
1706 "")
kono
parents:
diff changeset
1707
kono
parents:
diff changeset
1708 ;;
kono
parents:
diff changeset
1709 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1710 ;;
kono
parents:
diff changeset
1711 ;; Truncate
kono
parents:
diff changeset
1712 ;;
kono
parents:
diff changeset
1713 ;; Truncations among modes QI, HI, SI and DI are supported directly.
kono
parents:
diff changeset
1714 ;;
kono
parents:
diff changeset
1715 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1716 ;;
kono
parents:
diff changeset
1717
kono
parents:
diff changeset
1718 (define_expand "trunchiqi2"
kono
parents:
diff changeset
1719 [(set (match_operand:QI 0 "register_operand" "")
kono
parents:
diff changeset
1720 (truncate:QI (match_operand:HI 1 "register_operand" "")))]
kono
parents:
diff changeset
1721 "")
kono
parents:
diff changeset
1722
kono
parents:
diff changeset
1723 (define_insn_and_split "*trunchiqi2_insn"
kono
parents:
diff changeset
1724 [(set (match_operand:QI 0 "register_operand" "=r")
kono
parents:
diff changeset
1725 (truncate:QI (match_operand:HI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1726 "ok_for_simple_arith_logic_operands (operands, QImode)"
kono
parents:
diff changeset
1727 "#"
kono
parents:
diff changeset
1728 "reload_completed"
kono
parents:
diff changeset
1729 [(parallel [(set (match_dup 0) (truncate:QI (match_dup 1)))
kono
parents:
diff changeset
1730 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1731 ""
kono
parents:
diff changeset
1732 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1733
kono
parents:
diff changeset
1734 (define_insn "*trunchiqi2_insn<subst_logic>"
kono
parents:
diff changeset
1735 [(set (match_operand:QI 0 "register_operand" "=r")
kono
parents:
diff changeset
1736 (truncate:QI (match_operand:HI 1 "register_operand" "r")))
kono
parents:
diff changeset
1737 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1738 "reload_completed"
kono
parents:
diff changeset
1739 "move.b %0,%1"
kono
parents:
diff changeset
1740 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1741
kono
parents:
diff changeset
1742 (define_expand "truncsihi2"
kono
parents:
diff changeset
1743 [(set (match_operand:HI 0 "register_operand" "")
kono
parents:
diff changeset
1744 (truncate:HI (match_operand:SI 1 "register_operand" "")))]
kono
parents:
diff changeset
1745 "")
kono
parents:
diff changeset
1746
kono
parents:
diff changeset
1747 (define_insn_and_split "*truncsihi2_insn"
kono
parents:
diff changeset
1748 [(set (match_operand:HI 0 "register_operand" "=r")
kono
parents:
diff changeset
1749 (truncate:HI (match_operand:SI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1750 "ok_for_simple_arith_logic_operands (operands, HImode)"
kono
parents:
diff changeset
1751 "#"
kono
parents:
diff changeset
1752 "reload_completed"
kono
parents:
diff changeset
1753 [(parallel [(set (match_dup 0) (truncate:HI (match_dup 1)))
kono
parents:
diff changeset
1754 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1755 ""
kono
parents:
diff changeset
1756 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1757
kono
parents:
diff changeset
1758 (define_insn "*truncsihi2_insn<subst_logic>"
kono
parents:
diff changeset
1759 [(set (match_operand:HI 0 "register_operand" "=r")
kono
parents:
diff changeset
1760 (truncate:HI (match_operand:SI 1 "register_operand" "r")))
kono
parents:
diff changeset
1761 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1762 "reload_completed"
kono
parents:
diff changeset
1763 "move.w %0,%1"
kono
parents:
diff changeset
1764 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1765
kono
parents:
diff changeset
1766 (define_expand "truncdisi2"
kono
parents:
diff changeset
1767 [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
1768 (truncate:SI (match_operand:DI 1 "register_operand" "")))]
kono
parents:
diff changeset
1769 "")
kono
parents:
diff changeset
1770
kono
parents:
diff changeset
1771 (define_insn_and_split "*truncdisi2_insn"
kono
parents:
diff changeset
1772 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1773 (truncate:SI (match_operand:DI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1774 "ok_for_simple_arith_logic_operands (operands, SImode)"
kono
parents:
diff changeset
1775 "#"
kono
parents:
diff changeset
1776 "reload_completed"
kono
parents:
diff changeset
1777 [(parallel [(set (match_dup 0) (truncate:SI (match_dup 1)))
kono
parents:
diff changeset
1778 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1779 ""
kono
parents:
diff changeset
1780 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1781
kono
parents:
diff changeset
1782 (define_insn "*truncdisi2_insn<subst_logic>"
kono
parents:
diff changeset
1783 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1784 (truncate:SI (match_operand:DI 1 "register_operand" "r")))
kono
parents:
diff changeset
1785 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1786 "reload_completed"
kono
parents:
diff changeset
1787 "move.l %0,%d1"
kono
parents:
diff changeset
1788 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1789
kono
parents:
diff changeset
1790 ;;
kono
parents:
diff changeset
1791 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1792 ;;
kono
parents:
diff changeset
1793 ;; Sign-extend
kono
parents:
diff changeset
1794 ;;
kono
parents:
diff changeset
1795 ;; Sign-extensions among modes QI, HI, SI and DI are supported directly.
kono
parents:
diff changeset
1796 ;;
kono
parents:
diff changeset
1797 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1798 ;;
kono
parents:
diff changeset
1799
kono
parents:
diff changeset
1800 (define_expand "extendqihi2"
kono
parents:
diff changeset
1801 [(set (match_operand:HI 0 "register_operand" "")
kono
parents:
diff changeset
1802 (sign_extend:HI (match_operand:QI 1 "register_operand" "")))]
kono
parents:
diff changeset
1803 "")
kono
parents:
diff changeset
1804
kono
parents:
diff changeset
1805 (define_insn_and_split "*extendqihi2_insn"
kono
parents:
diff changeset
1806 [(set (match_operand:HI 0 "register_operand" "=r")
kono
parents:
diff changeset
1807 (sign_extend:HI (match_operand:QI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1808 "ok_for_simple_arith_logic_operands (operands, HImode)"
kono
parents:
diff changeset
1809 "#"
kono
parents:
diff changeset
1810 "reload_completed"
kono
parents:
diff changeset
1811 [(parallel [(set (match_dup 0) (sign_extend:HI (match_dup 1)))
kono
parents:
diff changeset
1812 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1813 ""
kono
parents:
diff changeset
1814 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1815
kono
parents:
diff changeset
1816 (define_insn "*extendqihi2_insn<subst_logic>"
kono
parents:
diff changeset
1817 [(set (match_operand:HI 0 "register_operand" "=r")
kono
parents:
diff changeset
1818 (sign_extend:HI (match_operand:QI 1 "register_operand" "r")))
kono
parents:
diff changeset
1819 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1820 "reload_completed"
kono
parents:
diff changeset
1821 "extb.w %0,%1"
kono
parents:
diff changeset
1822 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1823
kono
parents:
diff changeset
1824 (define_expand "extendqisi2"
kono
parents:
diff changeset
1825 [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
1826 (sign_extend:SI (match_operand:QI 1 "register_operand" "")))]
kono
parents:
diff changeset
1827 "")
kono
parents:
diff changeset
1828
kono
parents:
diff changeset
1829 (define_insn_and_split "*extendqisi2_insn"
kono
parents:
diff changeset
1830 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1831 (sign_extend:SI (match_operand:QI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1832 "ok_for_simple_arith_logic_operands (operands, SImode)"
kono
parents:
diff changeset
1833 "#"
kono
parents:
diff changeset
1834 "reload_completed"
kono
parents:
diff changeset
1835 [(parallel [(set (match_dup 0) (sign_extend:SI (match_dup 1)))
kono
parents:
diff changeset
1836 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1837 ""
kono
parents:
diff changeset
1838 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1839
kono
parents:
diff changeset
1840 (define_insn "*extendqisi2_insn<subst_logic>"
kono
parents:
diff changeset
1841 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1842 (sign_extend:SI (match_operand:QI 1 "register_operand" "r")))
kono
parents:
diff changeset
1843 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1844 "reload_completed"
kono
parents:
diff changeset
1845 "extb.l %0,%1"
kono
parents:
diff changeset
1846 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1847
kono
parents:
diff changeset
1848 (define_expand "extendhisi2"
kono
parents:
diff changeset
1849 [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
1850 (sign_extend:SI (match_operand:HI 1 "register_operand" "")))]
kono
parents:
diff changeset
1851 "")
kono
parents:
diff changeset
1852
kono
parents:
diff changeset
1853 (define_insn_and_split "*extendhisi2_insn"
kono
parents:
diff changeset
1854 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1855 (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1856 "ok_for_simple_arith_logic_operands (operands, SImode)"
kono
parents:
diff changeset
1857 "#"
kono
parents:
diff changeset
1858 "reload_completed"
kono
parents:
diff changeset
1859 [(parallel [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
1860 (sign_extend:SI (match_operand:HI 1 "register_operand" "")))
kono
parents:
diff changeset
1861 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1862 ""
kono
parents:
diff changeset
1863 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1864
kono
parents:
diff changeset
1865 (define_insn "*extendhisi2_insn<subst_logic>"
kono
parents:
diff changeset
1866 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1867 (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))
kono
parents:
diff changeset
1868 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
1869 "reload_completed"
kono
parents:
diff changeset
1870 "extw.l %0,%1"
kono
parents:
diff changeset
1871 [(set_attr "type" "logic")])
kono
parents:
diff changeset
1872
kono
parents:
diff changeset
1873 (define_expand "extendsidi2"
kono
parents:
diff changeset
1874 [(set (match_operand:DI 0 "register_operand" "")
kono
parents:
diff changeset
1875 (sign_extend:DI (match_operand:SI 1 "register_operand" "")))]
kono
parents:
diff changeset
1876 "")
kono
parents:
diff changeset
1877
kono
parents:
diff changeset
1878 (define_insn_and_split "*extendsidi2_insn"
kono
parents:
diff changeset
1879 [(set (match_operand:DI 0 "register_operand" "=r")
kono
parents:
diff changeset
1880 (sign_extend:DI (match_operand:SI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1881 "ok_for_simple_arith_logic_operands (operands, DImode)"
kono
parents:
diff changeset
1882 "#"
kono
parents:
diff changeset
1883 "reload_completed"
kono
parents:
diff changeset
1884 [(parallel [(set (match_dup 3) (match_dup 1))
kono
parents:
diff changeset
1885 (clobber (reg:CC R_FLAGS))])
kono
parents:
diff changeset
1886 (parallel [(set (match_dup 2)
kono
parents:
diff changeset
1887 (ashiftrt:SI (match_dup 1) (const_int 31)))
kono
parents:
diff changeset
1888 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1889 {
kono
parents:
diff changeset
1890 operands[2] = operand_subword (operands[0], 0, 0, DImode);
kono
parents:
diff changeset
1891 operands[3] = operand_subword (operands[0], 1, 0, DImode);
kono
parents:
diff changeset
1892 }
kono
parents:
diff changeset
1893 [(set_attr "type" "multi")])
kono
parents:
diff changeset
1894
kono
parents:
diff changeset
1895 ;;
kono
parents:
diff changeset
1896 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1897 ;;
kono
parents:
diff changeset
1898 ;; Zero-extend
kono
parents:
diff changeset
1899 ;;
kono
parents:
diff changeset
1900 ;; Zero-extensions among modes QI, HI, SI and DI are supported directly.
kono
parents:
diff changeset
1901 ;;
kono
parents:
diff changeset
1902 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1903 ;;
kono
parents:
diff changeset
1904
kono
parents:
diff changeset
1905 ; QI is zero-extended to wider modes by shifting left and then performing
kono
parents:
diff changeset
1906 ; a logical shift right to insert the zeroes. This avoids the need to use
kono
parents:
diff changeset
1907 ; another register.
kono
parents:
diff changeset
1908
kono
parents:
diff changeset
1909 (define_expand "zero_extendqihi2"
kono
parents:
diff changeset
1910 [(set (match_operand:HI 0 "register_operand" "")
kono
parents:
diff changeset
1911 (zero_extend:HI (match_operand:QI 1 "register_operand" "")))]
kono
parents:
diff changeset
1912 "")
kono
parents:
diff changeset
1913
kono
parents:
diff changeset
1914 (define_insn_and_split "*zero_extendqihi2_insn"
kono
parents:
diff changeset
1915 [(set (match_operand:HI 0 "register_operand" "=r")
kono
parents:
diff changeset
1916 (zero_extend:HI (match_operand:QI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1917 "ok_for_simple_arith_logic_operands (operands, HImode)"
kono
parents:
diff changeset
1918 "#"
kono
parents:
diff changeset
1919 "reload_completed"
kono
parents:
diff changeset
1920 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
1921 (ashift:HI (match_dup 2) (const_int 8)))
kono
parents:
diff changeset
1922 (clobber (reg:CC R_FLAGS))])
kono
parents:
diff changeset
1923 (parallel [(set (match_dup 0)
kono
parents:
diff changeset
1924 (lshiftrt:HI (match_dup 0) (const_int 8)))
kono
parents:
diff changeset
1925 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1926 {
kono
parents:
diff changeset
1927 operands[2] = gen_rtx_SUBREG (HImode, operands[1], 0);
kono
parents:
diff changeset
1928 }
kono
parents:
diff changeset
1929 [(set_attr "type" "multi")])
kono
parents:
diff changeset
1930
kono
parents:
diff changeset
1931 (define_expand "zero_extendqisi2"
kono
parents:
diff changeset
1932 [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
1933 (zero_extend:SI (match_operand:QI 1 "register_operand" "")))]
kono
parents:
diff changeset
1934 "")
kono
parents:
diff changeset
1935
kono
parents:
diff changeset
1936 (define_insn_and_split "*zero_extendqisi2_insn"
kono
parents:
diff changeset
1937 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1938 (zero_extend:SI (match_operand:QI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1939 "ok_for_simple_arith_logic_operands (operands, SImode)"
kono
parents:
diff changeset
1940 "#"
kono
parents:
diff changeset
1941 "reload_completed"
kono
parents:
diff changeset
1942 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
1943 (ashift:SI (match_dup 2) (const_int 24)))
kono
parents:
diff changeset
1944 (clobber (reg:CC R_FLAGS))])
kono
parents:
diff changeset
1945 (parallel [(set (match_dup 0)
kono
parents:
diff changeset
1946 (lshiftrt:SI (match_dup 0) (const_int 24)))
kono
parents:
diff changeset
1947 (clobber (reg:CC R_FLAGS))])]
kono
parents:
diff changeset
1948 {
kono
parents:
diff changeset
1949 operands[2] = gen_rtx_SUBREG (SImode, operands[1], 0);
kono
parents:
diff changeset
1950 }
kono
parents:
diff changeset
1951 [(set_attr "type" "multi")])
kono
parents:
diff changeset
1952
kono
parents:
diff changeset
1953 (define_insn "zero_extendhisi2"
kono
parents:
diff changeset
1954 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
1955 (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))]
kono
parents:
diff changeset
1956 ""
kono
parents:
diff changeset
1957 "moviu %0,0"
kono
parents:
diff changeset
1958 [(set_attr "type" "imm_reg")])
kono
parents:
diff changeset
1959
kono
parents:
diff changeset
1960 (define_expand "zero_extendsidi2"
kono
parents:
diff changeset
1961 [(set (match_operand:DI 0 "register_operand" "")
kono
parents:
diff changeset
1962 (zero_extend:DI (match_operand:SI 1 "register_operand" "")))]
kono
parents:
diff changeset
1963 "")
kono
parents:
diff changeset
1964
kono
parents:
diff changeset
1965 (define_insn_and_split "*zero_extendsidi2_insn"
kono
parents:
diff changeset
1966 [(set (match_operand:DI 0 "register_operand" "=r")
kono
parents:
diff changeset
1967 (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
kono
parents:
diff changeset
1968 "ok_for_simple_arith_logic_operands (operands, DImode)"
kono
parents:
diff changeset
1969 "#"
kono
parents:
diff changeset
1970 "reload_completed"
kono
parents:
diff changeset
1971 [(parallel [(set (match_dup 3) (match_dup 1))
kono
parents:
diff changeset
1972 (clobber (reg:CC R_FLAGS))])
kono
parents:
diff changeset
1973 (set (match_dup 2) (const_int 0))]
kono
parents:
diff changeset
1974 {
kono
parents:
diff changeset
1975 operands[2] = operand_subword (operands[0], 0, 0, DImode);
kono
parents:
diff changeset
1976 operands[3] = operand_subword (operands[0], 1, 0, DImode);
kono
parents:
diff changeset
1977 }
kono
parents:
diff changeset
1978 [(set_attr "type" "multi")])
kono
parents:
diff changeset
1979
kono
parents:
diff changeset
1980 ;;
kono
parents:
diff changeset
1981 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1982 ;;
kono
parents:
diff changeset
1983 ;; Bit Test
kono
parents:
diff changeset
1984 ;;
kono
parents:
diff changeset
1985 ;; Only SI mode is supported directly.
kono
parents:
diff changeset
1986 ;;
kono
parents:
diff changeset
1987 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
1988 ;;
kono
parents:
diff changeset
1989
kono
parents:
diff changeset
1990 ; BITS_BIG_ENDIAN is defined to 1 so operand #1 counts from the MSB.
kono
parents:
diff changeset
1991
kono
parents:
diff changeset
1992 (define_insn "*btst<mode>"
kono
parents:
diff changeset
1993 [(set (reg:CCC R_FLAGS)
kono
parents:
diff changeset
1994 (compare:CCC (zero_extract:I
kono
parents:
diff changeset
1995 (match_operand:I 0 "register_operand" "r")
kono
parents:
diff changeset
1996 (const_int 1)
kono
parents:
diff changeset
1997 (match_operand:QI 1 "const_shift_operand" "K"))
kono
parents:
diff changeset
1998 (const_int 0)))]
kono
parents:
diff changeset
1999 "reload_completed"
kono
parents:
diff changeset
2000 "lsr<s> r0,%0,<b>-%1"
kono
parents:
diff changeset
2001 [(set_attr "type" "logic")])
kono
parents:
diff changeset
2002
kono
parents:
diff changeset
2003 ;;
kono
parents:
diff changeset
2004 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2005 ;;
kono
parents:
diff changeset
2006 ;; Integer overflow tests
kono
parents:
diff changeset
2007 ;;
kono
parents:
diff changeset
2008 ;; Modes QI, HI and SI are supported directly.
kono
parents:
diff changeset
2009 ;;
kono
parents:
diff changeset
2010 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2011 ;;
kono
parents:
diff changeset
2012
kono
parents:
diff changeset
2013 (define_insn "*addv_tst<mode>"
kono
parents:
diff changeset
2014 [(set (reg:CCV R_FLAGS)
kono
parents:
diff changeset
2015 (compare:CCV (match_operand:I 0 "register_operand" "r")
kono
parents:
diff changeset
2016 (unspec:I [(match_operand:I 1 "register_operand" "%r")
kono
parents:
diff changeset
2017 (match_operand:I 2 "register_operand" "r")]
kono
parents:
diff changeset
2018 UNSPEC_ADDV)))]
kono
parents:
diff changeset
2019 "reload_completed"
kono
parents:
diff changeset
2020 "add<s> r0,%1,%2"
kono
parents:
diff changeset
2021 [(set_attr "type" "arith")])
kono
parents:
diff changeset
2022
kono
parents:
diff changeset
2023 (define_insn "*subv_tst<mode>"
kono
parents:
diff changeset
2024 [(set (reg:CCV R_FLAGS)
kono
parents:
diff changeset
2025 (compare:CCV (match_operand:I 0 "register_operand" "r")
kono
parents:
diff changeset
2026 (unspec:I [(match_operand:I 1 "reg_or_0_operand" "rO")
kono
parents:
diff changeset
2027 (match_operand:I 2 "register_operand" "r")]
kono
parents:
diff changeset
2028 UNSPEC_SUBV)))]
kono
parents:
diff changeset
2029 "reload_completed"
kono
parents:
diff changeset
2030 "sub<s> r0,%r1,%2"
kono
parents:
diff changeset
2031 [(set_attr "type" "arith")])
kono
parents:
diff changeset
2032
kono
parents:
diff changeset
2033 (define_insn "*negv_tst<mode>"
kono
parents:
diff changeset
2034 [(set (reg:CCV R_FLAGS)
kono
parents:
diff changeset
2035 (compare:CCV (match_operand:I 0 "register_operand" "r")
kono
parents:
diff changeset
2036 (unspec:I [(match_operand:I 1 "register_operand" "r")]
kono
parents:
diff changeset
2037 UNSPEC_NEGV)))]
kono
parents:
diff changeset
2038 "reload_completed"
kono
parents:
diff changeset
2039 "sub<s> r0,r0,%1"
kono
parents:
diff changeset
2040 [(set_attr "type" "arith")])
kono
parents:
diff changeset
2041
kono
parents:
diff changeset
2042 ;;
kono
parents:
diff changeset
2043 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2044 ;;
kono
parents:
diff changeset
2045 ;; Integer comparisons
kono
parents:
diff changeset
2046 ;;
kono
parents:
diff changeset
2047 ;; Modes QI, HI and SI are supported directly.
kono
parents:
diff changeset
2048 ;;
kono
parents:
diff changeset
2049 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2050 ;;
kono
parents:
diff changeset
2051
kono
parents:
diff changeset
2052 (define_insn "*cmp<mode>"
kono
parents:
diff changeset
2053 [(set (reg:CC R_FLAGS)
kono
parents:
diff changeset
2054 (compare:CC (match_operand:I 0 "register_operand" "r")
kono
parents:
diff changeset
2055 (match_operand:I 1 "reg_or_0_operand" "rO")))]
kono
parents:
diff changeset
2056 "reload_completed"
kono
parents:
diff changeset
2057 "cmp<s> %0,%r1"
kono
parents:
diff changeset
2058 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2059
kono
parents:
diff changeset
2060 (define_insn "*cmp<mode>_sne"
kono
parents:
diff changeset
2061 [(set (reg:CCC R_FLAGS)
kono
parents:
diff changeset
2062 (compare:CCC (not:I (match_operand:I 0 "register_operand" "r"))
kono
parents:
diff changeset
2063 (const_int -1)))]
kono
parents:
diff changeset
2064 "reload_completed"
kono
parents:
diff changeset
2065 "cmp<s> r0,%0"
kono
parents:
diff changeset
2066 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2067
kono
parents:
diff changeset
2068 ;;
kono
parents:
diff changeset
2069 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2070 ;;
kono
parents:
diff changeset
2071 ;; Single float operations
kono
parents:
diff changeset
2072 ;;
kono
parents:
diff changeset
2073 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2074 ;;
kono
parents:
diff changeset
2075
kono
parents:
diff changeset
2076 (define_insn "addsf3"
kono
parents:
diff changeset
2077 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2078 (plus:SF (match_operand:SF 1 "fp_reg_operand" "%f")
kono
parents:
diff changeset
2079 (match_operand:SF 2 "fp_reg_operand" "f")))]
kono
parents:
diff changeset
2080 "TARGET_FPU"
kono
parents:
diff changeset
2081 "fadd %0,%1,%2"
kono
parents:
diff changeset
2082 [(set_attr "type" "fp")])
kono
parents:
diff changeset
2083
kono
parents:
diff changeset
2084 (define_insn "subsf3"
kono
parents:
diff changeset
2085 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2086 (minus:SF (match_operand:SF 1 "fp_reg_operand" "f")
kono
parents:
diff changeset
2087 (match_operand:SF 2 "fp_reg_operand" "f")))]
kono
parents:
diff changeset
2088 "TARGET_FPU"
kono
parents:
diff changeset
2089 "fsub %0,%1,%2"
kono
parents:
diff changeset
2090 [(set_attr "type" "fp")])
kono
parents:
diff changeset
2091
kono
parents:
diff changeset
2092 (define_insn "mulsf3"
kono
parents:
diff changeset
2093 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2094 (mult:SF (match_operand:SF 1 "fp_reg_operand" "%f")
kono
parents:
diff changeset
2095 (match_operand:SF 2 "fp_reg_operand" "f")))]
kono
parents:
diff changeset
2096 "TARGET_FPU"
kono
parents:
diff changeset
2097 "fmult %0,%1,%2"
kono
parents:
diff changeset
2098 [(set_attr "type" "fp")])
kono
parents:
diff changeset
2099
kono
parents:
diff changeset
2100 (define_insn "divsf3"
kono
parents:
diff changeset
2101 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2102 (div:SF (match_operand:SF 1 "fp_reg_operand" "f")
kono
parents:
diff changeset
2103 (match_operand:SF 2 "fp_reg_operand" "f")))]
kono
parents:
diff changeset
2104 "TARGET_FPU"
kono
parents:
diff changeset
2105 "fdiv %0,%1,%2"
kono
parents:
diff changeset
2106 [(set_attr "type" "fdiv")])
kono
parents:
diff changeset
2107
kono
parents:
diff changeset
2108 (define_insn "sqrtsf2"
kono
parents:
diff changeset
2109 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2110 (sqrt:SF (match_operand:SF 1 "fp_reg_operand" "f")))]
kono
parents:
diff changeset
2111 "TARGET_FPU"
kono
parents:
diff changeset
2112 "fsqrt %0,%1"
kono
parents:
diff changeset
2113 [(set_attr "type" "fsqrt")])
kono
parents:
diff changeset
2114
kono
parents:
diff changeset
2115 (define_insn "negsf2"
kono
parents:
diff changeset
2116 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2117 (neg:SF (match_operand:SF 1 "fp_reg_operand" "f")))]
kono
parents:
diff changeset
2118 "TARGET_FPU"
kono
parents:
diff changeset
2119 "fneg %0,%1"
kono
parents:
diff changeset
2120 [(set_attr "type" "fmove")])
kono
parents:
diff changeset
2121
kono
parents:
diff changeset
2122 (define_insn "abssf2"
kono
parents:
diff changeset
2123 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2124 (abs:SF (match_operand:SF 1 "fp_reg_operand" "f")))]
kono
parents:
diff changeset
2125 "TARGET_FPU"
kono
parents:
diff changeset
2126 "fabs %0,%1"
kono
parents:
diff changeset
2127 [(set_attr "type" "fmove")])
kono
parents:
diff changeset
2128
kono
parents:
diff changeset
2129 (define_expand "copysignsf3"
kono
parents:
diff changeset
2130 [(match_operand:SF 0 "register_operand" "")
kono
parents:
diff changeset
2131 (match_operand:SF 1 "nonmemory_operand" "")
kono
parents:
diff changeset
2132 (match_operand:SF 2 "register_operand" "")]
kono
parents:
diff changeset
2133 "TARGET_FPU && !TARGET_FPU_IEEE"
kono
parents:
diff changeset
2134 {
kono
parents:
diff changeset
2135 visium_expand_copysign (operands, SFmode);
kono
parents:
diff changeset
2136 DONE;
kono
parents:
diff changeset
2137 })
kono
parents:
diff changeset
2138
kono
parents:
diff changeset
2139 ;;
kono
parents:
diff changeset
2140 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2141 ;;
kono
parents:
diff changeset
2142 ;; Single float <-> single integer conversions for !TARGET_FPU_IEEE
kono
parents:
diff changeset
2143 ;;
kono
parents:
diff changeset
2144 ;; An FMOVE instruction converts a signalling NaN (zero high order bit of the
kono
parents:
diff changeset
2145 ;; mantissa) to a quiet NaN (-1). This is acceptable when the data to be
kono
parents:
diff changeset
2146 ;; moved is in fact a floating-point number, but to avoid nasty surprises
kono
parents:
diff changeset
2147 ;; integers must in general be kept out of the floating-point registers.
kono
parents:
diff changeset
2148 ;; TARGET_HARD_REGNO_MODE_OK thus only allows SFmode in these registers.
kono
parents:
diff changeset
2149 ;; However, since FTOI and ITOF use floating-point registers for both their
kono
parents:
diff changeset
2150 ;; inputs and outputs, to use these instructions integers must transiently
kono
parents:
diff changeset
2151 ;; occupy such registers. To disguise this from the compiler, UNSPECs are
kono
parents:
diff changeset
2152 ;; used for floating-point operations on integers and floating from general
kono
parents:
diff changeset
2153 ;; register to floating-point register and fixing in the reverse direction
kono
parents:
diff changeset
2154 ;; are only split into the individual UNSPEC operations after reload.
kono
parents:
diff changeset
2155 ;;
kono
parents:
diff changeset
2156 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2157 ;;
kono
parents:
diff changeset
2158
kono
parents:
diff changeset
2159 (define_insn "*fload_no_ieee"
kono
parents:
diff changeset
2160 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2161 (unspec:SF [(match_operand:SI 1 "register_operand" "r")] UNSPEC_FLOAD))]
kono
parents:
diff changeset
2162 "TARGET_FPU && !TARGET_FPU_IEEE"
kono
parents:
diff changeset
2163 "fload %0,%1"
kono
parents:
diff changeset
2164 [(set_attr "type" "reg_fp")])
kono
parents:
diff changeset
2165
kono
parents:
diff changeset
2166 (define_insn "*itof_no_ieee"
kono
parents:
diff changeset
2167 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2168 (unspec:SF [(match_operand:SF 1 "fp_reg_operand" "f")] UNSPEC_ITOF))]
kono
parents:
diff changeset
2169 "TARGET_FPU && !TARGET_FPU_IEEE"
kono
parents:
diff changeset
2170 "itof %0,%1"
kono
parents:
diff changeset
2171 [(set_attr "type" "itof")])
kono
parents:
diff changeset
2172
kono
parents:
diff changeset
2173 (define_insn_and_split "*floatsisf2_no_ieee"
kono
parents:
diff changeset
2174 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2175 (float:SF (match_operand:SI 1 "register_operand" "r")))]
kono
parents:
diff changeset
2176 "TARGET_FPU && !TARGET_FPU_IEEE"
kono
parents:
diff changeset
2177 "#"
kono
parents:
diff changeset
2178 "&& reload_completed"
kono
parents:
diff changeset
2179 [(set (match_dup 0)
kono
parents:
diff changeset
2180 (unspec:SF [(match_dup 1)] UNSPEC_FLOAD))
kono
parents:
diff changeset
2181 (set (match_dup 0)
kono
parents:
diff changeset
2182 (unspec:SF [(match_dup 0)] UNSPEC_ITOF))]
kono
parents:
diff changeset
2183 ""
kono
parents:
diff changeset
2184 [(set_attr "type" "multi")])
kono
parents:
diff changeset
2185
kono
parents:
diff changeset
2186 (define_insn "*ftoi_no_ieee"
kono
parents:
diff changeset
2187 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2188 (unspec:SF [(match_operand:SF 1 "fp_reg_operand" "f")] UNSPEC_FTOI))]
kono
parents:
diff changeset
2189 "TARGET_FPU && !TARGET_FPU_IEEE"
kono
parents:
diff changeset
2190 "ftoi %0,%1"
kono
parents:
diff changeset
2191 [(set_attr "type" "ftoi")])
kono
parents:
diff changeset
2192
kono
parents:
diff changeset
2193 (define_insn "*fstore_no_ieee"
kono
parents:
diff changeset
2194 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2195 (unspec:SI [(match_operand:SF 1 "fp_reg_operand" "f")] UNSPEC_FSTORE))]
kono
parents:
diff changeset
2196 "TARGET_FPU && !TARGET_FPU_IEEE"
kono
parents:
diff changeset
2197 "fstore %0,%1"
kono
parents:
diff changeset
2198 [(set_attr "type" "fp_reg")])
kono
parents:
diff changeset
2199
kono
parents:
diff changeset
2200 (define_insn_and_split "fix_truncsfsi2_no_ieee"
kono
parents:
diff changeset
2201 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2202 (fix:SI (fix:SF (match_operand:SF 1 "fp_reg_operand" "f"))))
kono
parents:
diff changeset
2203 (clobber (match_scratch:SF 2 "=1"))]
kono
parents:
diff changeset
2204 "TARGET_FPU && !TARGET_FPU_IEEE"
kono
parents:
diff changeset
2205 "#"
kono
parents:
diff changeset
2206 "&& reload_completed"
kono
parents:
diff changeset
2207 [(set (match_dup 1)
kono
parents:
diff changeset
2208 (unspec:SF [(match_dup 1)] UNSPEC_FTOI))
kono
parents:
diff changeset
2209 (set (match_dup 0)
kono
parents:
diff changeset
2210 (unspec:SI [(match_dup 1)] UNSPEC_FSTORE))]
kono
parents:
diff changeset
2211 ""
kono
parents:
diff changeset
2212 [(set_attr "type" "multi")])
kono
parents:
diff changeset
2213
kono
parents:
diff changeset
2214 ;;
kono
parents:
diff changeset
2215 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2216 ;;
kono
parents:
diff changeset
2217 ;; Single float <-> single integer conversions
kono
parents:
diff changeset
2218 ;;
kono
parents:
diff changeset
2219 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2220 ;;
kono
parents:
diff changeset
2221
kono
parents:
diff changeset
2222 (define_insn "*itof"
kono
parents:
diff changeset
2223 [(set (match_operand:SF 0 "fp_reg_operand" "=f")
kono
parents:
diff changeset
2224 (float:SF (match_operand:SI 1 "register_operand" "f")))]
kono
parents:
diff changeset
2225 "TARGET_FPU_IEEE"
kono
parents:
diff changeset
2226 "itof %0,%1"
kono
parents:
diff changeset
2227 [(set_attr "type" "itof")])
kono
parents:
diff changeset
2228
kono
parents:
diff changeset
2229 (define_expand "floatsisf2"
kono
parents:
diff changeset
2230 [(set (match_operand:SF 0 "fp_reg_operand" "")
kono
parents:
diff changeset
2231 (float:SF (match_operand:SI 1 "register_operand" "")))]
kono
parents:
diff changeset
2232 "TARGET_FPU"
kono
parents:
diff changeset
2233 "")
kono
parents:
diff changeset
2234
kono
parents:
diff changeset
2235 (define_insn "*ftoi"
kono
parents:
diff changeset
2236 [(set (match_operand:SI 0 "register_operand" "=f")
kono
parents:
diff changeset
2237 (fix:SI (fix:SF (match_operand:SF 1 "fp_reg_operand" "f"))))]
kono
parents:
diff changeset
2238 "TARGET_FPU_IEEE"
kono
parents:
diff changeset
2239 "ftoi %0,%1"
kono
parents:
diff changeset
2240 [(set_attr "type" "ftoi")])
kono
parents:
diff changeset
2241
kono
parents:
diff changeset
2242 (define_expand "fix_truncsfsi2"
kono
parents:
diff changeset
2243 [(set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
2244 (fix:SI (fix:SF (match_operand:SF 1 "fp_reg_operand" ""))))]
kono
parents:
diff changeset
2245 "TARGET_FPU"
kono
parents:
diff changeset
2246 {
kono
parents:
diff changeset
2247 if (!TARGET_FPU_IEEE)
kono
parents:
diff changeset
2248 {
kono
parents:
diff changeset
2249 emit_insn (gen_fix_truncsfsi2_no_ieee (operands[0], operands[1]));
kono
parents:
diff changeset
2250 DONE;
kono
parents:
diff changeset
2251 }
kono
parents:
diff changeset
2252 })
kono
parents:
diff changeset
2253
kono
parents:
diff changeset
2254 ;;
kono
parents:
diff changeset
2255 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2256 ;;
kono
parents:
diff changeset
2257 ;; Single float comparisons
kono
parents:
diff changeset
2258 ;;
kono
parents:
diff changeset
2259 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2260 ;;
kono
parents:
diff changeset
2261
kono
parents:
diff changeset
2262 (define_insn "*cmpsf_fp"
kono
parents:
diff changeset
2263 [(set (reg:CCFP R_FLAGS)
kono
parents:
diff changeset
2264 (compare:CCFP (match_operand:SF 0 "fp_reg_or_0_operand" "fG")
kono
parents:
diff changeset
2265 (match_operand:SF 1 "fp_reg_or_0_operand" "fG")))]
kono
parents:
diff changeset
2266 "TARGET_FPU && reload_completed"
kono
parents:
diff changeset
2267 "fcmp r0,%f0,%f1"
kono
parents:
diff changeset
2268 [(set_attr "type" "fcmp")])
kono
parents:
diff changeset
2269
kono
parents:
diff changeset
2270 (define_insn "*cmpsf_fpe"
kono
parents:
diff changeset
2271 [(set (reg:CCFPE R_FLAGS)
kono
parents:
diff changeset
2272 (compare:CCFPE (match_operand:SF 0 "fp_reg_or_0_operand" "fG")
kono
parents:
diff changeset
2273 (match_operand:SF 1 "fp_reg_or_0_operand" "fG")))]
kono
parents:
diff changeset
2274 "TARGET_FPU && reload_completed"
kono
parents:
diff changeset
2275 "fcmpe r0,%f0,%f1"
kono
parents:
diff changeset
2276 [(set_attr "type" "fcmp")])
kono
parents:
diff changeset
2277
kono
parents:
diff changeset
2278 ;;
kono
parents:
diff changeset
2279 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2280 ;;
kono
parents:
diff changeset
2281 ;; Conditional branch instructions
kono
parents:
diff changeset
2282 ;;
kono
parents:
diff changeset
2283 ;; Note - we do not specify the two instructions necessary to perform
kono
parents:
diff changeset
2284 ;; a compare-and-branch in the cbranch<mode>4 pattern because that would
kono
parents:
diff changeset
2285 ;; allow the comparison to be moved away from the jump before the reload
kono
parents:
diff changeset
2286 ;; pass has completed. That would be problematical because reload can
kono
parents:
diff changeset
2287 ;; generate instructions in between which would clobber the CC register.
kono
parents:
diff changeset
2288 ;;
kono
parents:
diff changeset
2289 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2290 ;;
kono
parents:
diff changeset
2291
kono
parents:
diff changeset
2292 (define_expand "cbranch<mode>4"
kono
parents:
diff changeset
2293 [(set (pc)
kono
parents:
diff changeset
2294 (if_then_else (match_operator 0 "ordered_comparison_operator"
kono
parents:
diff changeset
2295 [(match_operand:I 1 "register_operand")
kono
parents:
diff changeset
2296 (match_operand:I 2 "reg_or_0_operand")])
kono
parents:
diff changeset
2297 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
2298 (pc)))]
kono
parents:
diff changeset
2299 ""
kono
parents:
diff changeset
2300 )
kono
parents:
diff changeset
2301
kono
parents:
diff changeset
2302 (define_insn_and_split "*cbranch<mode>4_insn"
kono
parents:
diff changeset
2303 [(set (pc)
kono
parents:
diff changeset
2304 (if_then_else (match_operator 0 "ordered_comparison_operator"
kono
parents:
diff changeset
2305 [(match_operand:I 1 "register_operand" "r")
kono
parents:
diff changeset
2306 (match_operand:I 2 "reg_or_0_operand" "rO")])
kono
parents:
diff changeset
2307 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
2308 (pc)))]
kono
parents:
diff changeset
2309 ""
kono
parents:
diff changeset
2310 "#"
kono
parents:
diff changeset
2311 "reload_completed"
kono
parents:
diff changeset
2312 [(const_int 0)]
kono
parents:
diff changeset
2313 {
kono
parents:
diff changeset
2314 visium_split_cbranch (GET_CODE (operands[0]), operands[1], operands[2],
kono
parents:
diff changeset
2315 operands[3]);
kono
parents:
diff changeset
2316 DONE;
kono
parents:
diff changeset
2317 }
kono
parents:
diff changeset
2318 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2319
kono
parents:
diff changeset
2320 (define_insn_and_split "*cbranch<mode>4_addv_insn"
kono
parents:
diff changeset
2321 [(set (pc)
kono
parents:
diff changeset
2322 (if_then_else (match_operator 0 "visium_equality_comparison_operator"
kono
parents:
diff changeset
2323 [(match_operand:I 1 "register_operand" "r")
kono
parents:
diff changeset
2324 (unspec:I [(match_operand:I 2 "register_operand" "%r")
kono
parents:
diff changeset
2325 (match_operand:I 3 "register_operand" "r")]
kono
parents:
diff changeset
2326 UNSPEC_ADDV)])
kono
parents:
diff changeset
2327 (label_ref (match_operand 4 ""))
kono
parents:
diff changeset
2328 (pc)))]
kono
parents:
diff changeset
2329 ""
kono
parents:
diff changeset
2330 "#"
kono
parents:
diff changeset
2331 "reload_completed"
kono
parents:
diff changeset
2332 [(const_int 0)]
kono
parents:
diff changeset
2333 {
kono
parents:
diff changeset
2334 visium_split_cbranch (GET_CODE (operands[0]), XEXP (operands[0], 0),
kono
parents:
diff changeset
2335 XEXP (operands[0], 1), operands[4]);
kono
parents:
diff changeset
2336 DONE;
kono
parents:
diff changeset
2337 }
kono
parents:
diff changeset
2338 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2339
kono
parents:
diff changeset
2340 (define_insn_and_split "*cbranch<mode>4_subv_insn"
kono
parents:
diff changeset
2341 [(set (pc)
kono
parents:
diff changeset
2342 (if_then_else (match_operator 0 "visium_equality_comparison_operator"
kono
parents:
diff changeset
2343 [(match_operand:I 1 "register_operand" "r")
kono
parents:
diff changeset
2344 (unspec:I [(match_operand:I 2 "reg_or_0_operand" "rO")
kono
parents:
diff changeset
2345 (match_operand:I 3 "register_operand" "r")]
kono
parents:
diff changeset
2346 UNSPEC_SUBV)])
kono
parents:
diff changeset
2347 (label_ref (match_operand 4 ""))
kono
parents:
diff changeset
2348 (pc)))]
kono
parents:
diff changeset
2349 ""
kono
parents:
diff changeset
2350 "#"
kono
parents:
diff changeset
2351 "reload_completed"
kono
parents:
diff changeset
2352 [(const_int 0)]
kono
parents:
diff changeset
2353 {
kono
parents:
diff changeset
2354 visium_split_cbranch (GET_CODE (operands[0]), XEXP (operands[0], 0),
kono
parents:
diff changeset
2355 XEXP (operands[0], 1), operands[4]);
kono
parents:
diff changeset
2356 DONE;
kono
parents:
diff changeset
2357 }
kono
parents:
diff changeset
2358 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2359
kono
parents:
diff changeset
2360 (define_insn_and_split "*cbranch<mode>4_negv_insn"
kono
parents:
diff changeset
2361 [(set (pc)
kono
parents:
diff changeset
2362 (if_then_else (match_operator 0 "visium_equality_comparison_operator"
kono
parents:
diff changeset
2363 [(match_operand:I 1 "register_operand" "r")
kono
parents:
diff changeset
2364 (unspec:I [(match_operand:I 2 "register_operand" "r")]
kono
parents:
diff changeset
2365 UNSPEC_NEGV)])
kono
parents:
diff changeset
2366 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
2367 (pc)))]
kono
parents:
diff changeset
2368 ""
kono
parents:
diff changeset
2369 "#"
kono
parents:
diff changeset
2370 "reload_completed"
kono
parents:
diff changeset
2371 [(const_int 0)]
kono
parents:
diff changeset
2372 {
kono
parents:
diff changeset
2373 visium_split_cbranch (GET_CODE (operands[0]), XEXP (operands[0], 0),
kono
parents:
diff changeset
2374 XEXP (operands[0], 1), operands[3]);
kono
parents:
diff changeset
2375 DONE;
kono
parents:
diff changeset
2376 }
kono
parents:
diff changeset
2377 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2378
kono
parents:
diff changeset
2379 (define_insn_and_split "*cbranch<mode>4_btst_insn"
kono
parents:
diff changeset
2380 [(set (pc)
kono
parents:
diff changeset
2381 (if_then_else (match_operator 0 "visium_equality_comparison_operator"
kono
parents:
diff changeset
2382 [(zero_extract:I
kono
parents:
diff changeset
2383 (match_operand:I 1 "register_operand" "r")
kono
parents:
diff changeset
2384 (const_int 1)
kono
parents:
diff changeset
2385 (match_operand:QI 2 "const_shift_operand" "K"))
kono
parents:
diff changeset
2386 (const_int 0)])
kono
parents:
diff changeset
2387 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
2388 (pc)))]
kono
parents:
diff changeset
2389 ""
kono
parents:
diff changeset
2390 "#"
kono
parents:
diff changeset
2391 "reload_completed"
kono
parents:
diff changeset
2392 [(const_int 0)]
kono
parents:
diff changeset
2393 {
kono
parents:
diff changeset
2394 visium_split_cbranch (GET_CODE (operands[0]), XEXP (operands[0], 0),
kono
parents:
diff changeset
2395 XEXP (operands[0], 1), operands[3]);
kono
parents:
diff changeset
2396 DONE;
kono
parents:
diff changeset
2397 }
kono
parents:
diff changeset
2398 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2399
kono
parents:
diff changeset
2400 (define_expand "cbranchsf4"
kono
parents:
diff changeset
2401 [(set (pc)
kono
parents:
diff changeset
2402 (if_then_else (match_operator 0 "visium_fp_comparison_operator"
kono
parents:
diff changeset
2403 [(match_operand:SF 1 "fp_reg_operand")
kono
parents:
diff changeset
2404 (match_operand:SF 2 "fp_reg_or_0_operand")])
kono
parents:
diff changeset
2405 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
2406 (pc)))]
kono
parents:
diff changeset
2407 "TARGET_FPU"
kono
parents:
diff changeset
2408 )
kono
parents:
diff changeset
2409
kono
parents:
diff changeset
2410 (define_insn_and_split "*cbranchsf4_insn"
kono
parents:
diff changeset
2411 [(set (pc)
kono
parents:
diff changeset
2412 (if_then_else (match_operator 0 "visium_fp_comparison_operator"
kono
parents:
diff changeset
2413 [(match_operand:SF 1 "fp_reg_operand" "f")
kono
parents:
diff changeset
2414 (match_operand:SF 2 "fp_reg_or_0_operand" "fG")])
kono
parents:
diff changeset
2415 (label_ref (match_operand 3 ""))
kono
parents:
diff changeset
2416 (pc)))]
kono
parents:
diff changeset
2417 "TARGET_FPU"
kono
parents:
diff changeset
2418 "#"
kono
parents:
diff changeset
2419 "&& reload_completed"
kono
parents:
diff changeset
2420 [(const_int 0)]
kono
parents:
diff changeset
2421 {
kono
parents:
diff changeset
2422 visium_split_cbranch (GET_CODE (operands[0]), operands[1], operands[2],
kono
parents:
diff changeset
2423 operands[3]);
kono
parents:
diff changeset
2424 DONE;
kono
parents:
diff changeset
2425 }
kono
parents:
diff changeset
2426 [(set_attr "type" "fcmp")])
kono
parents:
diff changeset
2427
kono
parents:
diff changeset
2428 ; Now match both normal and inverted branches.
kono
parents:
diff changeset
2429
kono
parents:
diff changeset
2430 (define_insn "*normal_branch"
kono
parents:
diff changeset
2431 [(set (pc)
kono
parents:
diff changeset
2432 (if_then_else (match_operator 1 "visium_branch_operator"
kono
parents:
diff changeset
2433 [(reg R_FLAGS) (const_int 0)])
kono
parents:
diff changeset
2434 (label_ref (match_operand 0 ""))
kono
parents:
diff changeset
2435 (pc)))]
kono
parents:
diff changeset
2436 "reload_completed"
kono
parents:
diff changeset
2437 {
kono
parents:
diff changeset
2438 return output_cbranch (operands[0], GET_CODE (operands[1]),
kono
parents:
diff changeset
2439 GET_MODE (XEXP (operands[1], 0)), 0, insn);
kono
parents:
diff changeset
2440 }
kono
parents:
diff changeset
2441 [(set_attr "type" "branch")])
kono
parents:
diff changeset
2442
kono
parents:
diff changeset
2443 (define_insn "*inverted_branch"
kono
parents:
diff changeset
2444 [(set (pc)
kono
parents:
diff changeset
2445 (if_then_else (match_operator 1 "visium_branch_operator"
kono
parents:
diff changeset
2446 [(reg R_FLAGS) (const_int 0)])
kono
parents:
diff changeset
2447 (pc)
kono
parents:
diff changeset
2448 (label_ref (match_operand 0 ""))))]
kono
parents:
diff changeset
2449 "reload_completed"
kono
parents:
diff changeset
2450 {
kono
parents:
diff changeset
2451 return output_cbranch (operands[0], GET_CODE (operands[1]),
kono
parents:
diff changeset
2452 GET_MODE (XEXP (operands[1], 0)), 1, insn);
kono
parents:
diff changeset
2453 }
kono
parents:
diff changeset
2454 [(set_attr "type" "branch")])
kono
parents:
diff changeset
2455
kono
parents:
diff changeset
2456 ; And then match both normal and inverted returns.
kono
parents:
diff changeset
2457
kono
parents:
diff changeset
2458 (define_insn "*cond_<return_str>return"
kono
parents:
diff changeset
2459 [(set (pc)
kono
parents:
diff changeset
2460 (if_then_else (match_operator 0 "visium_branch_operator"
kono
parents:
diff changeset
2461 [(reg R_FLAGS) (const_int 0)])
kono
parents:
diff changeset
2462 (any_return)
kono
parents:
diff changeset
2463 (pc)))]
kono
parents:
diff changeset
2464 "<return_pred> && reload_completed"
kono
parents:
diff changeset
2465 {
kono
parents:
diff changeset
2466 return output_cbranch (pc_rtx, GET_CODE (operands[0]),
kono
parents:
diff changeset
2467 GET_MODE (XEXP (operands[0], 0)), 0, insn);
kono
parents:
diff changeset
2468 }
kono
parents:
diff changeset
2469 [(set_attr "type" "ret")])
kono
parents:
diff changeset
2470
kono
parents:
diff changeset
2471 (define_insn "*inverted_cond_<return_str>return"
kono
parents:
diff changeset
2472 [(set (pc)
kono
parents:
diff changeset
2473 (if_then_else (match_operator 0 "visium_branch_operator"
kono
parents:
diff changeset
2474 [(reg R_FLAGS) (const_int 0)])
kono
parents:
diff changeset
2475 (pc)
kono
parents:
diff changeset
2476 (any_return)))]
kono
parents:
diff changeset
2477 "<return_pred> && reload_completed"
kono
parents:
diff changeset
2478 {
kono
parents:
diff changeset
2479 return output_cbranch (pc_rtx, GET_CODE (operands[0]),
kono
parents:
diff changeset
2480 GET_MODE (XEXP (operands[0], 0)), 1, insn);
kono
parents:
diff changeset
2481 }
kono
parents:
diff changeset
2482 [(set_attr "type" "ret")])
kono
parents:
diff changeset
2483
kono
parents:
diff changeset
2484 ;;
kono
parents:
diff changeset
2485 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2486 ;;
kono
parents:
diff changeset
2487 ;; Unconditional branch instructions
kono
parents:
diff changeset
2488 ;;
kono
parents:
diff changeset
2489 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2490 ;;
kono
parents:
diff changeset
2491
kono
parents:
diff changeset
2492 (define_insn "jump"
kono
parents:
diff changeset
2493 [(set (pc)
kono
parents:
diff changeset
2494 (label_ref (match_operand 0 "" "")))]
kono
parents:
diff changeset
2495 ""
kono
parents:
diff changeset
2496 {
kono
parents:
diff changeset
2497 return output_ubranch (operands[0], insn);
kono
parents:
diff changeset
2498 }
kono
parents:
diff changeset
2499 [(set_attr "type" "branch")])
kono
parents:
diff changeset
2500
kono
parents:
diff changeset
2501 (define_insn "indirect_jump"
kono
parents:
diff changeset
2502 [(set (pc)
kono
parents:
diff changeset
2503 (match_operand:SI 0 "register_operand" "r"))]
kono
parents:
diff changeset
2504 ""
kono
parents:
diff changeset
2505 "bra tr,%0,r0%# ;indirect jump"
kono
parents:
diff changeset
2506 [(set_attr "type" "abs_branch")])
kono
parents:
diff changeset
2507
kono
parents:
diff changeset
2508 (define_insn "tablejump"
kono
parents:
diff changeset
2509 [(set (pc)
kono
parents:
diff changeset
2510 (match_operand:SI 0 "register_operand" "r"))
kono
parents:
diff changeset
2511 (use (label_ref (match_operand 1 "" "")))]
kono
parents:
diff changeset
2512 ""
kono
parents:
diff changeset
2513 "bra tr,%0,r0%# ;tablejump"
kono
parents:
diff changeset
2514 [(set_attr "type" "abs_branch")])
kono
parents:
diff changeset
2515
kono
parents:
diff changeset
2516 ;;
kono
parents:
diff changeset
2517 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2518 ;;
kono
parents:
diff changeset
2519 ;; trap instructions
kono
parents:
diff changeset
2520 ;;
kono
parents:
diff changeset
2521 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2522 ;;
kono
parents:
diff changeset
2523
kono
parents:
diff changeset
2524 (define_insn "trap"
kono
parents:
diff changeset
2525 [(trap_if (const_int 1) (const_int 0))]
kono
parents:
diff changeset
2526 ""
kono
parents:
diff changeset
2527 "stop 0,r0"
kono
parents:
diff changeset
2528 [(set_attr "type" "trap")])
kono
parents:
diff changeset
2529
kono
parents:
diff changeset
2530 ;;
kono
parents:
diff changeset
2531 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2532 ;;
kono
parents:
diff changeset
2533 ;; Subprogram call instructions
kono
parents:
diff changeset
2534 ;;
kono
parents:
diff changeset
2535 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2536 ;;
kono
parents:
diff changeset
2537
kono
parents:
diff changeset
2538 ; Subroutine call instruction returning no value. Operand 0 is the function
kono
parents:
diff changeset
2539 ; to call; operand 1 is the number of bytes of arguments pushed (in mode
kono
parents:
diff changeset
2540 ; 'SImode', except it is normally a 'const_int'); operand 2 is the number of
kono
parents:
diff changeset
2541 ; registers used as operands.
kono
parents:
diff changeset
2542
kono
parents:
diff changeset
2543 (define_expand "call"
kono
parents:
diff changeset
2544 [(parallel [(call (match_operand 0 "" "")
kono
parents:
diff changeset
2545 (match_operand 1 "" ""))
kono
parents:
diff changeset
2546 (use (match_operand 2 "" ""))
kono
parents:
diff changeset
2547 (clobber (match_dup 3))])]
kono
parents:
diff changeset
2548 ""
kono
parents:
diff changeset
2549 {
kono
parents:
diff changeset
2550 if (GET_CODE (XEXP (operands[0], 0)) != REG)
kono
parents:
diff changeset
2551 XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
kono
parents:
diff changeset
2552
kono
parents:
diff changeset
2553 if (!operands[2])
kono
parents:
diff changeset
2554 operands[2] = const0_rtx;
kono
parents:
diff changeset
2555
kono
parents:
diff changeset
2556 operands[3] = gen_rtx_REG (Pmode, R_LINK);
kono
parents:
diff changeset
2557 })
kono
parents:
diff changeset
2558
kono
parents:
diff changeset
2559 (define_insn "*call_internal"
kono
parents:
diff changeset
2560 [(call (mem:SI (match_operand:SI 0 "register_operand" "l,!r"))
kono
parents:
diff changeset
2561 (match_operand 1 "" ""))
kono
parents:
diff changeset
2562 (use (match_operand 2 "" ""))
kono
parents:
diff changeset
2563 (clobber (match_operand 3 "" ""))]
kono
parents:
diff changeset
2564 "!SIBLING_CALL_P (insn)"
kono
parents:
diff changeset
2565 "bra tr,%0,%3%# ;call"
kono
parents:
diff changeset
2566 [(set_attr "type" "call")])
kono
parents:
diff changeset
2567
kono
parents:
diff changeset
2568 ; Subroutine call instruction returning a value. Operand 0 is the hard
kono
parents:
diff changeset
2569 ; register in which the value is returned. There are three more operands, the
kono
parents:
diff changeset
2570 ; same as the three operands of the 'call' instruction (but with numbers
kono
parents:
diff changeset
2571 ; increased by one).
kono
parents:
diff changeset
2572
kono
parents:
diff changeset
2573 (define_expand "call_value"
kono
parents:
diff changeset
2574 [(parallel [(set (match_operand 0 "register_operand" "")
kono
parents:
diff changeset
2575 (call (match_operand 1 "" "")
kono
parents:
diff changeset
2576 (match_operand 2 "" "")))
kono
parents:
diff changeset
2577 (use (match_operand 3 "" ""))
kono
parents:
diff changeset
2578 (clobber (match_dup 4))])]
kono
parents:
diff changeset
2579 ""
kono
parents:
diff changeset
2580 {
kono
parents:
diff changeset
2581 if (GET_CODE (XEXP (operands[1], 0)) != REG)
kono
parents:
diff changeset
2582 XEXP (operands[1], 0) = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
kono
parents:
diff changeset
2583
kono
parents:
diff changeset
2584 if (!operands[3])
kono
parents:
diff changeset
2585 operands[3] = const0_rtx;
kono
parents:
diff changeset
2586
kono
parents:
diff changeset
2587 operands[4] = gen_rtx_REG (Pmode, R_LINK);
kono
parents:
diff changeset
2588 })
kono
parents:
diff changeset
2589
kono
parents:
diff changeset
2590 (define_insn "*call_value_internal"
kono
parents:
diff changeset
2591 [(set (match_operand 0 "register_operand" "")
kono
parents:
diff changeset
2592 (call (mem:SI (match_operand:SI 1 "register_operand" "l,!r"))
kono
parents:
diff changeset
2593 (match_operand 2 "" "")))
kono
parents:
diff changeset
2594 (use (match_operand 3 "" ""))
kono
parents:
diff changeset
2595 (clobber (match_operand 4 "" ""))]
kono
parents:
diff changeset
2596 "!SIBLING_CALL_P (insn)"
kono
parents:
diff changeset
2597 "bra tr,%1,%4%# ;call value"
kono
parents:
diff changeset
2598 [(set_attr "type" "call")])
kono
parents:
diff changeset
2599
kono
parents:
diff changeset
2600 ; Tail calls are similar, except that the link register is not used. But
kono
parents:
diff changeset
2601 ; we don't use r0 as the destination register of the branch because we want
kono
parents:
diff changeset
2602 ; the Branch Pre-decode Logic of the GR6 to use the Address Load Array to
kono
parents:
diff changeset
2603 ; predict the branch target.
kono
parents:
diff changeset
2604
kono
parents:
diff changeset
2605 (define_expand "sibcall"
kono
parents:
diff changeset
2606 [(parallel [(call (match_operand 0 "" "")
kono
parents:
diff changeset
2607 (match_operand 1 "" ""))
kono
parents:
diff changeset
2608 (use (match_operand 2 "" ""))
kono
parents:
diff changeset
2609 (clobber (match_dup 3))])]
kono
parents:
diff changeset
2610 ""
kono
parents:
diff changeset
2611 {
kono
parents:
diff changeset
2612 if (GET_CODE (XEXP (operands[0], 0)) != REG)
kono
parents:
diff changeset
2613 XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
kono
parents:
diff changeset
2614
kono
parents:
diff changeset
2615 if (!operands[2])
kono
parents:
diff changeset
2616 operands[2] = const0_rtx;
kono
parents:
diff changeset
2617
kono
parents:
diff changeset
2618 operands[3] = gen_rtx_SCRATCH (SImode);
kono
parents:
diff changeset
2619 })
kono
parents:
diff changeset
2620
kono
parents:
diff changeset
2621 (define_insn "*sibcall_internal"
kono
parents:
diff changeset
2622 [(call (mem:SI (match_operand:SI 0 "register_operand" "k"))
kono
parents:
diff changeset
2623 (match_operand 1 "" ""))
kono
parents:
diff changeset
2624 (use (match_operand 2 "" ""))
kono
parents:
diff changeset
2625 (clobber (match_scratch:SI 3 "=0"))]
kono
parents:
diff changeset
2626 "SIBLING_CALL_P (insn)"
kono
parents:
diff changeset
2627 "bra tr,%0,%0%# ;sibcall"
kono
parents:
diff changeset
2628 [(set_attr "type" "call")])
kono
parents:
diff changeset
2629
kono
parents:
diff changeset
2630 (define_expand "sibcall_value"
kono
parents:
diff changeset
2631 [(parallel [(set (match_operand 0 "register_operand" "")
kono
parents:
diff changeset
2632 (call (match_operand 1 "" "")
kono
parents:
diff changeset
2633 (match_operand 2 "" "")))
kono
parents:
diff changeset
2634 (use (match_operand 3 "" ""))
kono
parents:
diff changeset
2635 (clobber (match_dup 4))])]
kono
parents:
diff changeset
2636 ""
kono
parents:
diff changeset
2637 {
kono
parents:
diff changeset
2638 if (GET_CODE (XEXP (operands[1], 0)) != REG)
kono
parents:
diff changeset
2639 XEXP (operands[1], 0) = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
kono
parents:
diff changeset
2640
kono
parents:
diff changeset
2641 if (!operands[3])
kono
parents:
diff changeset
2642 operands[3] = const0_rtx;
kono
parents:
diff changeset
2643
kono
parents:
diff changeset
2644 operands[4] = gen_rtx_SCRATCH (SImode);
kono
parents:
diff changeset
2645 })
kono
parents:
diff changeset
2646
kono
parents:
diff changeset
2647 (define_insn "*sibcall_value_internal"
kono
parents:
diff changeset
2648 [(set (match_operand 0 "register_operand" "")
kono
parents:
diff changeset
2649 (call (mem:SI (match_operand:SI 1 "register_operand" "k"))
kono
parents:
diff changeset
2650 (match_operand 2 "" "")))
kono
parents:
diff changeset
2651 (use (match_operand 3 "" ""))
kono
parents:
diff changeset
2652 (clobber (match_scratch:SI 4 "=1"))]
kono
parents:
diff changeset
2653 "SIBLING_CALL_P (insn)"
kono
parents:
diff changeset
2654 "bra tr,%1,%1%# ;sibcall value"
kono
parents:
diff changeset
2655 [(set_attr "type" "call")])
kono
parents:
diff changeset
2656
kono
parents:
diff changeset
2657 ; Call subroutine returning any type.
kono
parents:
diff changeset
2658 (define_expand "untyped_call"
kono
parents:
diff changeset
2659 [(parallel [(call (match_operand 0 "" "")
kono
parents:
diff changeset
2660 (const_int 0))
kono
parents:
diff changeset
2661 (match_operand 1 "" "")
kono
parents:
diff changeset
2662 (match_operand 2 "" "")])]
kono
parents:
diff changeset
2663 ""
kono
parents:
diff changeset
2664 {
kono
parents:
diff changeset
2665 int i;
kono
parents:
diff changeset
2666
kono
parents:
diff changeset
2667 emit_call_insn (gen_call (operands[0], const0_rtx, NULL));
kono
parents:
diff changeset
2668
kono
parents:
diff changeset
2669 for (i = 0; i < XVECLEN (operands[2], 0); i++)
kono
parents:
diff changeset
2670 {
kono
parents:
diff changeset
2671 rtx set = XVECEXP (operands[2], 0, i);
kono
parents:
diff changeset
2672 emit_move_insn (SET_DEST (set), SET_SRC (set));
kono
parents:
diff changeset
2673 }
kono
parents:
diff changeset
2674
kono
parents:
diff changeset
2675 /* The optimizer does not know that the call sets the function value
kono
parents:
diff changeset
2676 registers we stored in the result block. We avoid problems by
kono
parents:
diff changeset
2677 claiming that all hard registers are used and clobbered at this
kono
parents:
diff changeset
2678 point. */
kono
parents:
diff changeset
2679 emit_insn (gen_blockage ());
kono
parents:
diff changeset
2680
kono
parents:
diff changeset
2681 DONE;
kono
parents:
diff changeset
2682 })
kono
parents:
diff changeset
2683
kono
parents:
diff changeset
2684 ;;
kono
parents:
diff changeset
2685 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2686 ;;
kono
parents:
diff changeset
2687 ;; Compare-and-store instructions
kono
parents:
diff changeset
2688 ;;
kono
parents:
diff changeset
2689 ;; Modes QI, HI, SI and SF are supported directly.
kono
parents:
diff changeset
2690 ;;
kono
parents:
diff changeset
2691 ;; Note - we do not specify the two instructions necessary to perform
kono
parents:
diff changeset
2692 ;; a compare-and-store in the cstore<mode>4 pattern because that would
kono
parents:
diff changeset
2693 ;; allow the comparison to be moved away from the store before the reload
kono
parents:
diff changeset
2694 ;; pass has completed. That would be problematical because reload can
kono
parents:
diff changeset
2695 ;; generate instructions in between which would clobber the CC register.
kono
parents:
diff changeset
2696 ;;
kono
parents:
diff changeset
2697 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2698 ;;
kono
parents:
diff changeset
2699
kono
parents:
diff changeset
2700 (define_expand "cstore<mode>4"
kono
parents:
diff changeset
2701 [(set (match_operand:SI 0)
kono
parents:
diff changeset
2702 (match_operator:SI 1 "visium_int_cstore_operator"
kono
parents:
diff changeset
2703 [(match_operand:I 2 "register_operand")
kono
parents:
diff changeset
2704 (match_operand:I 3 "reg_or_0_operand")]))]
kono
parents:
diff changeset
2705 ""
kono
parents:
diff changeset
2706 {
kono
parents:
diff changeset
2707 visium_expand_int_cstore (operands, <MODE>mode);
kono
parents:
diff changeset
2708 DONE;
kono
parents:
diff changeset
2709 })
kono
parents:
diff changeset
2710
kono
parents:
diff changeset
2711 (define_insn_and_split "*cstore<mode>4_insn"
kono
parents:
diff changeset
2712 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2713 (ltu:SI (match_operand:I 1 "register_operand" "r")
kono
parents:
diff changeset
2714 (match_operand:I 2 "reg_or_0_operand" "rO")))]
kono
parents:
diff changeset
2715 ""
kono
parents:
diff changeset
2716 "#"
kono
parents:
diff changeset
2717 "reload_completed"
kono
parents:
diff changeset
2718 [(const_int 0)]
kono
parents:
diff changeset
2719 {
kono
parents:
diff changeset
2720 visium_split_cstore (SET, operands[0], NULL_RTX,
kono
parents:
diff changeset
2721 LTU, operands[1], operands[2]);
kono
parents:
diff changeset
2722 DONE;
kono
parents:
diff changeset
2723 }
kono
parents:
diff changeset
2724 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2725
kono
parents:
diff changeset
2726 (define_insn_and_split "*neg_cstore<mode>4_insn"
kono
parents:
diff changeset
2727 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2728 (neg:SI (ltu:SI (match_operand:I 1 "register_operand" "r")
kono
parents:
diff changeset
2729 (match_operand:I 2 "reg_or_0_operand" "rO"))))]
kono
parents:
diff changeset
2730 ""
kono
parents:
diff changeset
2731 "#"
kono
parents:
diff changeset
2732 "reload_completed"
kono
parents:
diff changeset
2733 [(const_int 0)]
kono
parents:
diff changeset
2734 {
kono
parents:
diff changeset
2735 visium_split_cstore (NEG, operands[0], NULL_RTX,
kono
parents:
diff changeset
2736 LTU, operands[1], operands[2]);
kono
parents:
diff changeset
2737 DONE;
kono
parents:
diff changeset
2738 }
kono
parents:
diff changeset
2739 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2740
kono
parents:
diff changeset
2741 (define_insn_and_split "*<add_str>_cstore<mode>4_insn"
kono
parents:
diff changeset
2742 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2743 (any_add:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
2744 (ltu:SI (match_operand:I 2 "register_operand" "r")
kono
parents:
diff changeset
2745 (match_operand:I 3 "reg_or_0_operand" "rO"))))]
kono
parents:
diff changeset
2746 ""
kono
parents:
diff changeset
2747 "#"
kono
parents:
diff changeset
2748 "reload_completed"
kono
parents:
diff changeset
2749 [(const_int 0)]
kono
parents:
diff changeset
2750 {
kono
parents:
diff changeset
2751 visium_split_cstore (<add_op>, operands[0], operands[1],
kono
parents:
diff changeset
2752 LTU, operands[2], operands[3]);
kono
parents:
diff changeset
2753 DONE;
kono
parents:
diff changeset
2754 }
kono
parents:
diff changeset
2755 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2756
kono
parents:
diff changeset
2757 (define_insn_and_split "*cstore<mode>4_sne_insn"
kono
parents:
diff changeset
2758 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2759 (ltu:SI (not:I (match_operand:I 1 "register_operand" "r"))
kono
parents:
diff changeset
2760 (const_int -1)))]
kono
parents:
diff changeset
2761 ""
kono
parents:
diff changeset
2762 "#"
kono
parents:
diff changeset
2763 "reload_completed"
kono
parents:
diff changeset
2764 [(const_int 0)]
kono
parents:
diff changeset
2765 {
kono
parents:
diff changeset
2766 visium_split_cstore (SET, operands[0], NULL_RTX,
kono
parents:
diff changeset
2767 LTU, gen_rtx_NOT (<MODE>mode, operands[1]), constm1_rtx);
kono
parents:
diff changeset
2768 DONE;
kono
parents:
diff changeset
2769 }
kono
parents:
diff changeset
2770 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2771
kono
parents:
diff changeset
2772 (define_insn_and_split "*neg_cstore<mode>4_sne_insn"
kono
parents:
diff changeset
2773 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2774 (neg:SI (ltu:SI (not:I (match_operand:I 1 "register_operand" "r"))
kono
parents:
diff changeset
2775 (const_int -1))))]
kono
parents:
diff changeset
2776 ""
kono
parents:
diff changeset
2777 "#"
kono
parents:
diff changeset
2778 "reload_completed"
kono
parents:
diff changeset
2779 [(const_int 0)]
kono
parents:
diff changeset
2780 {
kono
parents:
diff changeset
2781 visium_split_cstore (NEG, operands[0], NULL_RTX,
kono
parents:
diff changeset
2782 LTU, gen_rtx_NOT (<MODE>mode, operands[1]), constm1_rtx);
kono
parents:
diff changeset
2783 DONE;
kono
parents:
diff changeset
2784 }
kono
parents:
diff changeset
2785 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2786
kono
parents:
diff changeset
2787 (define_insn_and_split "*<add_str>_cstore<mode>4_sne_insn"
kono
parents:
diff changeset
2788 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2789 (any_add:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
2790 (ltu:SI (not:I (match_operand:I 2 "register_operand" "r"))
kono
parents:
diff changeset
2791 (const_int -1))))]
kono
parents:
diff changeset
2792 ""
kono
parents:
diff changeset
2793 "#"
kono
parents:
diff changeset
2794 "reload_completed"
kono
parents:
diff changeset
2795 [(const_int 0)]
kono
parents:
diff changeset
2796 {
kono
parents:
diff changeset
2797 visium_split_cstore (<add_op>, operands[0], operands[1],
kono
parents:
diff changeset
2798 LTU, gen_rtx_NOT (<MODE>mode, operands[2]), constm1_rtx);
kono
parents:
diff changeset
2799 DONE;
kono
parents:
diff changeset
2800 }
kono
parents:
diff changeset
2801 [(set_attr "type" "cmp")])
kono
parents:
diff changeset
2802
kono
parents:
diff changeset
2803 (define_expand "cstoresf4"
kono
parents:
diff changeset
2804 [(set (match_operand:SI 0)
kono
parents:
diff changeset
2805 (match_operator:SI 1 "visium_fp_cstore_operator"
kono
parents:
diff changeset
2806 [(match_operand:SF 2 "fp_reg_operand")
kono
parents:
diff changeset
2807 (match_operand:SF 3 "fp_reg_or_0_operand")]))]
kono
parents:
diff changeset
2808 "TARGET_FPU"
kono
parents:
diff changeset
2809 {
kono
parents:
diff changeset
2810 visium_expand_fp_cstore (operands, SFmode);
kono
parents:
diff changeset
2811 DONE;
kono
parents:
diff changeset
2812 })
kono
parents:
diff changeset
2813
kono
parents:
diff changeset
2814 (define_insn_and_split "*cstoresf4_insn"
kono
parents:
diff changeset
2815 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2816 (lt:SI (match_operand:SF 1 "fp_reg_or_0_operand" "fG")
kono
parents:
diff changeset
2817 (match_operand:SF 2 "fp_reg_or_0_operand" "fG")))]
kono
parents:
diff changeset
2818 "TARGET_FPU"
kono
parents:
diff changeset
2819 "#"
kono
parents:
diff changeset
2820 "&& reload_completed"
kono
parents:
diff changeset
2821 [(const_int 0)]
kono
parents:
diff changeset
2822 {
kono
parents:
diff changeset
2823 visium_split_cstore (SET, operands [0], NULL_RTX,
kono
parents:
diff changeset
2824 LT, operands[1], operands[2]);
kono
parents:
diff changeset
2825 DONE;
kono
parents:
diff changeset
2826 }
kono
parents:
diff changeset
2827 [(set_attr "type" "fcmp")])
kono
parents:
diff changeset
2828
kono
parents:
diff changeset
2829 (define_insn_and_split "*neg_cstoresf4_insn"
kono
parents:
diff changeset
2830 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2831 (neg:SI (lt:SI (match_operand:SF 1 "fp_reg_or_0_operand" "fG")
kono
parents:
diff changeset
2832 (match_operand:SF 2 "fp_reg_or_0_operand" "fG"))))]
kono
parents:
diff changeset
2833 "TARGET_FPU"
kono
parents:
diff changeset
2834 "#"
kono
parents:
diff changeset
2835 "&& reload_completed"
kono
parents:
diff changeset
2836 [(const_int 0)]
kono
parents:
diff changeset
2837 {
kono
parents:
diff changeset
2838 visium_split_cstore (NEG, operands [0], NULL_RTX,
kono
parents:
diff changeset
2839 LT, operands[1], operands[2]);
kono
parents:
diff changeset
2840 DONE;
kono
parents:
diff changeset
2841 }
kono
parents:
diff changeset
2842 [(set_attr "type" "fcmp")])
kono
parents:
diff changeset
2843
kono
parents:
diff changeset
2844 (define_insn_and_split "*<add_str>_cstoresf4_insn"
kono
parents:
diff changeset
2845 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
2846 (any_add:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
2847 (lt:SI (match_operand:SF 2 "fp_reg_or_0_operand" "fG")
kono
parents:
diff changeset
2848 (match_operand:SF 3 "fp_reg_or_0_operand" "fG"))))]
kono
parents:
diff changeset
2849 "TARGET_FPU"
kono
parents:
diff changeset
2850 "#"
kono
parents:
diff changeset
2851 "&& reload_completed"
kono
parents:
diff changeset
2852 [(const_int 0)]
kono
parents:
diff changeset
2853 {
kono
parents:
diff changeset
2854 visium_split_cstore (<add_op>, operands [0], operands[1],
kono
parents:
diff changeset
2855 LT, operands[2], operands[3]);
kono
parents:
diff changeset
2856 DONE;
kono
parents:
diff changeset
2857 }
kono
parents:
diff changeset
2858 [(set_attr "type" "fcmp")])
kono
parents:
diff changeset
2859
kono
parents:
diff changeset
2860 ;;
kono
parents:
diff changeset
2861 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2862 ;;
kono
parents:
diff changeset
2863 ;; RTL pro/epilogue support
kono
parents:
diff changeset
2864 ;;
kono
parents:
diff changeset
2865 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2866 ;;
kono
parents:
diff changeset
2867
kono
parents:
diff changeset
2868 ; Expand prologue in RTL
kono
parents:
diff changeset
2869 (define_expand "prologue"
kono
parents:
diff changeset
2870 [(const_int 0)]
kono
parents:
diff changeset
2871 ""
kono
parents:
diff changeset
2872 {
kono
parents:
diff changeset
2873 visium_expand_prologue ();
kono
parents:
diff changeset
2874 DONE;
kono
parents:
diff changeset
2875 })
kono
parents:
diff changeset
2876
kono
parents:
diff changeset
2877 ; Expand epilogue in RTL
kono
parents:
diff changeset
2878 (define_expand "epilogue"
kono
parents:
diff changeset
2879 [(return)]
kono
parents:
diff changeset
2880 ""
kono
parents:
diff changeset
2881 {
kono
parents:
diff changeset
2882 visium_expand_epilogue ();
kono
parents:
diff changeset
2883 })
kono
parents:
diff changeset
2884
kono
parents:
diff changeset
2885 ; Expand epilogue without a final jump in RTL
kono
parents:
diff changeset
2886 (define_expand "sibcall_epilogue"
kono
parents:
diff changeset
2887 [(return)]
kono
parents:
diff changeset
2888 ""
kono
parents:
diff changeset
2889 {
kono
parents:
diff changeset
2890 visium_expand_epilogue ();
kono
parents:
diff changeset
2891 DONE;
kono
parents:
diff changeset
2892 })
kono
parents:
diff changeset
2893
kono
parents:
diff changeset
2894 ; The artificial dependency on the link register is to prevent the
kono
parents:
diff changeset
2895 ; frame instruction from being put in a call delay slot, which can
kono
parents:
diff changeset
2896 ; confuse the CFI machinery.
kono
parents:
diff changeset
2897
kono
parents:
diff changeset
2898 (define_insn "stack_save"
kono
parents:
diff changeset
2899 [(set (reg:SI R_FP) (reg:SI R_SP))
kono
parents:
diff changeset
2900 (use (reg:SI R_LINK))
kono
parents:
diff changeset
2901 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
2902 "reload_completed"
kono
parents:
diff changeset
2903 "move.l fp,sp ;stack_save"
kono
parents:
diff changeset
2904 [(set_attr "type" "logic")])
kono
parents:
diff changeset
2905
kono
parents:
diff changeset
2906 ; The construct (mem:BLK (scratch)) is considered to alias all other
kono
parents:
diff changeset
2907 ; memory accesses. Thus it can be used as a memory barrier in stack
kono
parents:
diff changeset
2908 ; deallocation patterns.
kono
parents:
diff changeset
2909
kono
parents:
diff changeset
2910 (define_insn "stack_restore"
kono
parents:
diff changeset
2911 [(set (reg:SI R_SP) (reg:SI R_FP))
kono
parents:
diff changeset
2912 (clobber (mem:BLK (scratch)))
kono
parents:
diff changeset
2913 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
2914 "reload_completed"
kono
parents:
diff changeset
2915 "move.l sp,fp ;stack_restore"
kono
parents:
diff changeset
2916 [(set_attr "type" "logic")])
kono
parents:
diff changeset
2917
kono
parents:
diff changeset
2918 (define_insn "stack_pop"
kono
parents:
diff changeset
2919 [(set (reg:SI R_SP)
kono
parents:
diff changeset
2920 (plus:SI (reg:SI R_SP) (match_operand:SI 0 "add_operand" "J,r")))
kono
parents:
diff changeset
2921 (clobber (mem:BLK (scratch)))
kono
parents:
diff changeset
2922 (clobber (reg:CC R_FLAGS))]
kono
parents:
diff changeset
2923 "reload_completed"
kono
parents:
diff changeset
2924 "@
kono
parents:
diff changeset
2925 addi sp,%0 ;stack pop
kono
parents:
diff changeset
2926 add.l sp,sp,%0 ;stack pop"
kono
parents:
diff changeset
2927 [(set_attr "type" "arith")])
kono
parents:
diff changeset
2928
kono
parents:
diff changeset
2929 (define_expand "<return_str>return"
kono
parents:
diff changeset
2930 [(any_return)]
kono
parents:
diff changeset
2931 "<return_pred>"
kono
parents:
diff changeset
2932 "")
kono
parents:
diff changeset
2933
kono
parents:
diff changeset
2934 (define_insn "*<return_str>return_internal"
kono
parents:
diff changeset
2935 [(any_return)]
kono
parents:
diff changeset
2936 "!visium_interrupt_function_p ()"
kono
parents:
diff changeset
2937 {
kono
parents:
diff changeset
2938 return output_ubranch (pc_rtx, insn);
kono
parents:
diff changeset
2939 }
kono
parents:
diff changeset
2940 [(set_attr "type" "ret")])
kono
parents:
diff changeset
2941
kono
parents:
diff changeset
2942 (define_insn "*return_internal_interrupt"
kono
parents:
diff changeset
2943 [(return)]
kono
parents:
diff changeset
2944 "visium_interrupt_function_p ()"
kono
parents:
diff changeset
2945 "rfi\n\t nop ;return from interrupt"
kono
parents:
diff changeset
2946 [(set_attr "type" "rfi")])
kono
parents:
diff changeset
2947
kono
parents:
diff changeset
2948 (define_insn "dsi"
kono
parents:
diff changeset
2949 [(unspec_volatile [(const_int 0)] UNSPECV_DSI)]
kono
parents:
diff changeset
2950 ""
kono
parents:
diff changeset
2951 "dsi"
kono
parents:
diff changeset
2952 [(set_attr "type" "dsi")])
kono
parents:
diff changeset
2953
kono
parents:
diff changeset
2954 ;;
kono
parents:
diff changeset
2955 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2956 ;;
kono
parents:
diff changeset
2957 ;; NOP (no-op instruction)
kono
parents:
diff changeset
2958 ;;
kono
parents:
diff changeset
2959 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2960 ;;
kono
parents:
diff changeset
2961
kono
parents:
diff changeset
2962 (define_insn "nop"
kono
parents:
diff changeset
2963 [(const_int 0)]
kono
parents:
diff changeset
2964 ""
kono
parents:
diff changeset
2965 "nop ;generated nop"
kono
parents:
diff changeset
2966 [(set_attr "type" "nop")])
kono
parents:
diff changeset
2967
kono
parents:
diff changeset
2968 (define_insn "hazard_nop"
kono
parents:
diff changeset
2969 [(unspec_volatile [(const_int 0)] UNSPEC_NOP)]
kono
parents:
diff changeset
2970 ""
kono
parents:
diff changeset
2971 "nop ;hazard avoidance nop"
kono
parents:
diff changeset
2972 [(set_attr "type" "nop")])
kono
parents:
diff changeset
2973
kono
parents:
diff changeset
2974 (define_insn "blockage"
kono
parents:
diff changeset
2975 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
kono
parents:
diff changeset
2976 ""
kono
parents:
diff changeset
2977 ""
kono
parents:
diff changeset
2978 [(set_attr "type" "nop")])
kono
parents:
diff changeset
2979
kono
parents:
diff changeset
2980 ;;
kono
parents:
diff changeset
2981 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2982 ;;
kono
parents:
diff changeset
2983 ;; String/block operations
kono
parents:
diff changeset
2984 ;;
kono
parents:
diff changeset
2985 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kono
parents:
diff changeset
2986 ;;
kono
parents:
diff changeset
2987
kono
parents:
diff changeset
2988 ;; String/block move insn.
kono
parents:
diff changeset
2989 ;; Argument 0 is the destination
kono
parents:
diff changeset
2990 ;; Argument 1 is the source
kono
parents:
diff changeset
2991 ;; Argument 2 is the length
kono
parents:
diff changeset
2992 ;; Argument 3 is the alignment
kono
parents:
diff changeset
2993
kono
parents:
diff changeset
2994 (define_expand "movmemsi"
kono
parents:
diff changeset
2995 [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
kono
parents:
diff changeset
2996 (match_operand:BLK 1 "memory_operand" ""))
kono
parents:
diff changeset
2997 (use (match_operand:SI 2 "general_operand" ""))
kono
parents:
diff changeset
2998 (use (match_operand:SI 3 "const_int_operand" ""))])]
kono
parents:
diff changeset
2999 ""
kono
parents:
diff changeset
3000 {
kono
parents:
diff changeset
3001 if (visium_expand_block_move (operands))
kono
parents:
diff changeset
3002 DONE;
kono
parents:
diff changeset
3003 else
kono
parents:
diff changeset
3004 FAIL;
kono
parents:
diff changeset
3005 })
kono
parents:
diff changeset
3006
kono
parents:
diff changeset
3007 (define_insn "*bmd"
kono
parents:
diff changeset
3008 [(set (mem:BLK (reg:SI R_R1))
kono
parents:
diff changeset
3009 (mem:BLK (reg:SI R_R2)))
kono
parents:
diff changeset
3010 (use (reg:SI R_R3))
kono
parents:
diff changeset
3011 (clobber (reg:SI R_R1))
kono
parents:
diff changeset
3012 (clobber (reg:SI R_R2))
kono
parents:
diff changeset
3013 (clobber (reg:SI R_R3))
kono
parents:
diff changeset
3014 (clobber (reg:SI R_R4))
kono
parents:
diff changeset
3015 (clobber (reg:SI R_R5))
kono
parents:
diff changeset
3016 (clobber (reg:SI R_R6))]
kono
parents:
diff changeset
3017 "TARGET_BMI"
kono
parents:
diff changeset
3018 "bmd r1,r2,r3"
kono
parents:
diff changeset
3019 [(set_attr "type" "bmi")])
kono
parents:
diff changeset
3020
kono
parents:
diff changeset
3021 ;; String/block set insn.
kono
parents:
diff changeset
3022 ;; Argument 0 is the destination
kono
parents:
diff changeset
3023 ;; Argument 1 is the length
kono
parents:
diff changeset
3024 ;; Argument 2 is the value
kono
parents:
diff changeset
3025 ;; Argument 3 is the alignment
kono
parents:
diff changeset
3026
kono
parents:
diff changeset
3027 (define_expand "setmemsi"
kono
parents:
diff changeset
3028 [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
kono
parents:
diff changeset
3029 (match_operand 2 "nonmemory_operand" ""))
kono
parents:
diff changeset
3030 (use (match_operand:SI 1 "general_operand" ""))
kono
parents:
diff changeset
3031 (use (match_operand:SI 3 "const_int_operand" ""))])]
kono
parents:
diff changeset
3032 ""
kono
parents:
diff changeset
3033 {
kono
parents:
diff changeset
3034 if (visium_expand_block_set (operands))
kono
parents:
diff changeset
3035 DONE;
kono
parents:
diff changeset
3036 else
kono
parents:
diff changeset
3037 FAIL;
kono
parents:
diff changeset
3038 })