annotate gcc/config/visium/visium.md @ 145:1830386684a0

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