Line data Source code
1 : ;; GCC machine description for MMX and 3dNOW! instructions
2 : ;; Copyright (C) 2005-2026 Free Software Foundation, Inc.
3 : ;;
4 : ;; This file is part of GCC.
5 : ;;
6 : ;; GCC is free software; you can redistribute it and/or modify
7 : ;; it under the terms of the GNU General Public License as published by
8 : ;; the Free Software Foundation; either version 3, or (at your option)
9 : ;; any later version.
10 : ;;
11 : ;; GCC is distributed in the hope that it will be useful,
12 : ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : ;; GNU General Public License for more details.
15 : ;;
16 : ;; You should have received a copy of the GNU General Public License
17 : ;; along with GCC; see the file COPYING3. If not see
18 : ;; <http://www.gnu.org/licenses/>.
19 :
20 : ;; The MMX and 3dNOW! patterns are in the same file because they use
21 : ;; the same register file, and 3dNOW! adds a number of extensions to
22 : ;; the base integer MMX isa.
23 :
24 : ;; Note! Except for the basic move instructions, *all* of these
25 : ;; patterns are outside the normal optabs namespace. This is because
26 : ;; use of these registers requires the insertion of emms or femms
27 : ;; instructions to return to normal fpu mode. The compiler doesn't
28 : ;; know how to do that itself, which means it's up to the user. Which
29 : ;; means that we should never use any of these patterns except at the
30 : ;; direction of the user via a builtin.
31 :
32 : (define_c_enum "unspec" [
33 : UNSPEC_3DNOW
34 :
35 : UNSPEC_MOVNTQ
36 : UNSPEC_PFRCP
37 : UNSPEC_PFRCPIT1
38 : UNSPEC_PFRCPIT2
39 : UNSPEC_PFRSQRT
40 : UNSPEC_PFRSQIT1
41 : ])
42 :
43 : (define_c_enum "unspecv" [
44 : UNSPECV_EMMS
45 : UNSPECV_FEMMS
46 : ])
47 :
48 : ;; 8 byte integral modes handled by MMX (and by extension, SSE)
49 : (define_mode_iterator MMXMODEI [V8QI V4HI V2SI])
50 568 : (define_mode_iterator MMXMODEI8 [V8QI V4HI V2SI (V1DI "TARGET_SSE2")])
51 :
52 : ;; All 8-byte vector modes handled by MMX
53 : (define_mode_iterator MMXMODE [V8QI V4HI V2SI V1DI V2SF V4HF V4BF])
54 3338 : (define_mode_iterator MMXMODE124 [V8QI V4HI V2SI V2SF])
55 :
56 : ;; Mix-n-match
57 3338 : (define_mode_iterator MMXMODE12 [V8QI V4HI])
58 : (define_mode_iterator MMXMODE14 [V8QI V2SI])
59 : (define_mode_iterator MMXMODE24 [V4HI V2SI])
60 : (define_mode_iterator MMXMODE248 [V4HI V2SI V1DI])
61 :
62 : ;; All 4-byte integer/float16 vector modes
63 : (define_mode_iterator V_32 [V4QI V2HI V1SI V2HF V2BF])
64 :
65 : (define_mode_iterator V2FI_32 [V2HF V2BF V2HI])
66 : (define_mode_iterator V4FI_64 [V4HF V4BF V4HI])
67 : (define_mode_iterator V4F_64 [V4HF V4BF])
68 : (define_mode_iterator V2F_32 [V2HF V2BF])
69 : ;; 4-byte integer vector modes
70 : (define_mode_iterator VI_32 [V4QI V2HI])
71 :
72 : ;; 8-byte and 4-byte HImode vector modes
73 105 : (define_mode_iterator VI2_32_64 [(V4HI "TARGET_MMX_WITH_SSE") V2HI])
74 :
75 : ;; 8-byte, 4-byte and 2-byte QImode vector modes
76 10 : (define_mode_iterator VI1_16_32_64 [(V8QI "TARGET_MMX_WITH_SSE") V4QI V2QI])
77 70 :
78 : ;; 4-byte and 2-byte integer vector modes
79 : (define_mode_iterator VI_16_32 [V4QI V2QI V2HI])
80 85 :
81 : ;; 4-byte and 2-byte QImode vector modes
82 : (define_mode_iterator VI1_16_32 [V4QI V2QI])
83 15 :
84 : ;; All 2-byte, 4-byte and 8-byte vector modes.
85 : (define_mode_iterator V_16_32_64
86 : [V2QI V4QI V2HI V1SI V2HF V2BF
87 20546 : (V8QI "TARGET_64BIT") (V4HI "TARGET_64BIT")
88 0 : (V4HF "TARGET_64BIT") (V4BF "TARGET_64BIT")
89 51907 : (V2SI "TARGET_64BIT") (V2SF "TARGET_64BIT")
90 48 : (V1DI "TARGET_64BIT")])
91 1914 :
92 13075 : ;; V2S* modes
93 0 : (define_mode_iterator V2FI [V2SF V2SI])
94 2265 :
95 13075 : (define_mode_iterator V24FI [V2SF V2SI V4HF V4HI])
96 0 :
97 351 : (define_mode_iterator V248FI [V2SF V2SI V4HF V4BF V4HI V8QI])
98 :
99 : (define_mode_iterator V24FI_32 [V2HF V2BF V2HI V4QI])
100 :
101 : ;; Mapping from integer vector mode to mnemonic suffix
102 : (define_mode_attr mmxvecsize
103 : [(V8QI "b") (V4QI "b") (V2QI "b")
104 : (V4HI "w") (V2HI "w") (V2SI "d") (V1DI "q")])
105 :
106 : ;; Mapping to same size integral mode.
107 : (define_mode_attr mmxinsnmode
108 : [(V8QI "DI") (V4QI "SI") (V2QI "HI")
109 : (V4HI "DI") (V2HI "SI")
110 : (V2SI "DI")
111 : (V1DI "DI") (V1SI "SI")
112 : (V4HF "DI") (V2HF "SI")
113 : (V4BF "DI") (V2BF "SI")
114 : (V2SF "DI")])
115 :
116 : (define_mode_attr mmxdoublemode
117 : [(V8QI "V8HI") (V4HI "V4SI")])
118 :
119 : (define_mode_attr mmxhalfmode
120 : [(V4HI "V4QI") (V2HI "V2QI")])
121 :
122 : (define_mode_attr mmxbytemode
123 : [(V4HI "V8QI") (V2HI "V4QI")])
124 :
125 : (define_mode_attr mmxhalfmodelower
126 : [(V4HI "v4qi") (V2HI "v2qi")])
127 :
128 : ;; Mapping of vector float modes to an integer mode of the same size
129 : (define_mode_attr mmxintvecmode
130 : [(V2SF "V2SI") (V2SI "V2SI") (V4HI "V4HI") (V8QI "V8QI")
131 : (V4HF "V4HI") (V2HF "V2HI") (V4BF "V4HI") (V2BF "V2HI")])
132 :
133 : (define_mode_attr mmxintvecmodelower
134 : [(V2SF "v2si") (V2SI "v2si") (V4HI "v4hi") (V8QI "v8qi")
135 : (V4HF "v4hi") (V2HF "v2hi")])
136 :
137 : ;; Mapping of vector modes to a vector mode of double size
138 : (define_mode_attr mmxdoublevecmode
139 : [(V2SF "V4SF") (V2SI "V4SI") (V4HF "V8HF") (V4HI "V8HI")
140 : (V2HI "V4HI") (V2HF "V4HF") (V2BF "V4BF")])
141 :
142 : ;; Mapping of vector modes back to the scalar modes
143 : (define_mode_attr mmxscalarmode
144 : [(V2SI "SI") (V2SF "SF")
145 : (V4HF "HF") (V4BF "BF")
146 : (V2HF "HF") (V2BF "BF")
147 : (V4HI "HI") (V2HI "HI")
148 : (V8QI "QI")])
149 :
150 : (define_mode_attr mmxscalarmodelower
151 : [(V2SI "si") (V2SF "sf")
152 : (V4HF "hf") (V4BF "bf")
153 : (V2HF "hf") (V2BF "bf")
154 : (V4HI "hi") (V2HI "hi")
155 : (V8QI "qi")])
156 :
157 : (define_mode_attr mmxscalarsize
158 : [(V1DI "64")
159 : (V2SI "32") (V2SF "32")
160 : (V4HF "16") (V4BF "16")
161 : (V2HF "16") (V2BF "16")
162 : (V4HI "16") (V2HI "16")
163 : (V8QI "8")])
164 :
165 : (define_mode_attr Yv_Yw
166 : [(V8QI "Yw") (V4HI "Yw") (V2SI "Yv") (V1DI "Yv") (V2SF "Yv")])
167 :
168 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
169 : ;;
170 : ;; Move patterns
171 : ;;
172 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
173 :
174 : ;; All of these patterns are enabled for MMX as well as 3dNOW.
175 : ;; This is essential for maintaining stable calling conventions.
176 :
177 : (define_expand "mov<mode>"
178 : [(set (match_operand:MMXMODE 0 "nonimmediate_operand")
179 : (match_operand:MMXMODE 1 "nonimm_or_0_operand"))]
180 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
181 488337 : {
182 487551 : ix86_expand_vector_move (<MODE>mode, operands);
183 488337 : DONE;
184 : })
185 :
186 : (define_insn "*mov<mode>_internal"
187 : [(set (match_operand:MMXMODE 0 "nonimmediate_operand"
188 : "=r ,o ,r,r ,m ,?!y,!y,?!y,m ,r ,?!y,v,v,v,m,r,v,!y,*x")
189 : (match_operand:MMXMODE 1 "nonimm_or_0_operand"
190 : "rCo,rC,C,rm,rC,C ,!y,m ,?!y,?!y,r ,C,v,m,v,v,r,*x,!y"))]
191 750463 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
192 74020245 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))
193 148086904 : && ix86_hardreg_mov_ok (operands[0], operands[1])"
194 229002 : {
195 229002 : switch (get_attr_type (insn))
196 786 : {
197 60539 : case TYPE_MULTI:
198 786 : return "#";
199 61150 :
200 120963 : case TYPE_IMOV:
201 59638 : if (get_attr_mode (insn) == MODE_SI)
202 : return "mov{l}\t{%1, %k0|%k0, %1}";
203 : else
204 59560 : return "mov{q}\t{%1, %0|%0, %1}";
205 :
206 0 : case TYPE_MMX:
207 0 : return "pxor\t%0, %0";
208 :
209 550 : case TYPE_MMXMOV:
210 : /* Handle broken assemblers that require movd instead of movq. */
211 550 : if (!HAVE_AS_IX86_INTERUNIT_MOVQ
212 : && (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1])))
213 : return "movd\t{%1, %0|%0, %1}";
214 550 : return "movq\t{%1, %0|%0, %1}";
215 :
216 146 : case TYPE_SSECVT:
217 146 : if (SSE_REG_P (operands[0]))
218 105 : return "movq2dq\t{%1, %0|%0, %1}";
219 : else
220 : return "movdq2q\t{%1, %0|%0, %1}";
221 :
222 1801 : case TYPE_SSELOG1:
223 1801 : return standard_sse_constant_opcode (insn, operands);
224 :
225 166867 : case TYPE_SSEMOV:
226 166867 : return ix86_output_ssemov (insn, operands);
227 :
228 0 : default:
229 0 : gcc_unreachable ();
230 : }
231 : }
232 : [(set (attr "isa")
233 : (cond [(eq_attr "alternative" "0,1")
234 : (const_string "nox64")
235 17248 : (eq_attr "alternative" "2,3,4,9,10")
236 : (const_string "x64")
237 : (eq_attr "alternative" "15,16")
238 : (const_string "x64_sse2")
239 : (eq_attr "alternative" "17,18")
240 : (const_string "sse2")
241 : ]
242 : (const_string "*")))
243 : (set (attr "type")
244 : (cond [(eq_attr "alternative" "0,1")
245 : (const_string "multi")
246 : (eq_attr "alternative" "2,3,4")
247 : (const_string "imov")
248 : (eq_attr "alternative" "5")
249 : (const_string "mmx")
250 : (eq_attr "alternative" "6,7,8,9,10")
251 : (const_string "mmxmov")
252 : (eq_attr "alternative" "11")
253 : (const_string "sselog1")
254 : (eq_attr "alternative" "17,18")
255 : (const_string "ssecvt")
256 : ]
257 : (const_string "ssemov")))
258 : (set (attr "prefix_rex")
259 : (if_then_else (eq_attr "alternative" "9,10,15,16")
260 : (const_string "1")
261 : (const_string "*")))
262 : (set (attr "prefix")
263 : (if_then_else (eq_attr "type" "sselog1,ssemov")
264 : (const_string "maybe_vex")
265 : (const_string "orig")))
266 : (set (attr "prefix_data16")
267 : (if_then_else
268 : (and (eq_attr "type" "ssemov") (eq_attr "mode" "DI"))
269 : (const_string "1")
270 : (const_string "*")))
271 : (set (attr "mode")
272 : (cond [(eq_attr "alternative" "2")
273 : (const_string "SI")
274 : (eq_attr "alternative" "11,12")
275 : (cond [(match_test "<MODE>mode == V2SFmode
276 : || <MODE>mode == V4HFmode
277 : || <MODE>mode == V4BFmode")
278 : (const_string "V4SF")
279 : (ior (not (match_test "TARGET_SSE2"))
280 : (match_test "optimize_function_for_size_p (cfun)"))
281 52234 : (const_string "V4SF")
282 : ]
283 : (const_string "TI"))
284 :
285 : (and (eq_attr "alternative" "13")
286 1836340 : (ior (ior (and (match_test "<MODE>mode == V2SFmode")
287 : (not (match_test "TARGET_MMX_WITH_SSE")))
288 : (not (match_test "TARGET_SSE2")))
289 : (match_test "<MODE>mode == V4HFmode
290 : || <MODE>mode == V4BFmode")))
291 : (const_string "V2SF")
292 :
293 : (and (eq_attr "alternative" "14")
294 5997194 : (ior (ior (match_test "<MODE>mode == V2SFmode")
295 : (not (match_test "TARGET_SSE2")))
296 : (match_test "<MODE>mode == V4HFmode
297 : || <MODE>mode == V4BFmode")))
298 : (const_string "V2SF")
299 6382167 : ]
300 6382167 : (const_string "DI")))
301 6382167 : (set (attr "preferred_for_speed")
302 : (cond [(eq_attr "alternative" "9,15")
303 19335 : (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
304 : (eq_attr "alternative" "10,16")
305 6244314 : (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
306 : ]
307 424767 : (symbol_ref "true")))])
308 :
309 : (define_split
310 : [(set (match_operand:MMXMODE 0 "nonimmediate_gr_operand")
311 : (match_operand:MMXMODE 1 "nonimmediate_gr_operand"))]
312 : "!TARGET_64BIT && reload_completed"
313 : [(const_int 0)]
314 60364 : "ix86_split_long_move (operands); DONE;")
315 :
316 : (define_split
317 : [(set (match_operand:MMXMODE 0 "nonimmediate_gr_operand")
318 : (match_operand:MMXMODE 1 "const0_operand"))]
319 : "!TARGET_64BIT && reload_completed"
320 : [(const_int 0)]
321 17131 : "ix86_split_long_move (operands); DONE;")
322 :
323 : (define_expand "movmisalign<mode>"
324 : [(set (match_operand:MMXMODE 0 "nonimmediate_operand")
325 : (match_operand:MMXMODE 1 "nonimmediate_operand"))]
326 17131 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
327 123832 : {
328 129190 : ix86_expand_vector_move (<MODE>mode, operands);
329 140963 : DONE;
330 : })
331 :
332 123822 : (define_expand "mov<mode>"
333 0 : [(set (match_operand:V_32 0 "nonimmediate_operand")
334 123822 : (match_operand:V_32 1 "nonimm_or_0_operand"))]
335 123822 : ""
336 123822 : {
337 45713 : ix86_expand_vector_move (<MODE>mode, operands);
338 45713 : DONE;
339 : })
340 :
341 : (define_insn "*mov<mode>_internal"
342 45723 : [(set (match_operand:V_32 0 "nonimmediate_operand"
343 0 : "=r ,m ,v,v,v,m,r,v")
344 45723 : (match_operand:V_32 1 "nonimm_or_0_operand"
345 45723 : "rmC,rC,C,v,m,v,v,r"))]
346 45723 : "!(MEM_P (operands[0]) && MEM_P (operands[1]))
347 : && ix86_hardreg_mov_ok (operands[0], operands[1])"
348 17248 : {
349 17248 : switch (get_attr_type (insn))
350 : {
351 : case TYPE_IMOV:
352 0 : return "mov{l}\t{%1, %0|%0, %1}";
353 :
354 211 : case TYPE_SSELOG1:
355 211 : return standard_sse_constant_opcode (insn, operands);
356 :
357 7425 : case TYPE_SSEMOV:
358 7425 : return ix86_output_ssemov (insn, operands);
359 :
360 0 : default:
361 0 : gcc_unreachable ();
362 : }
363 : }
364 : [(set (attr "isa")
365 : (cond [(eq_attr "alternative" "6,7")
366 : (const_string "sse2")
367 : ]
368 : (const_string "*")))
369 : (set (attr "type")
370 : (cond [(eq_attr "alternative" "2")
371 : (const_string "sselog1")
372 22415 : (eq_attr "alternative" "3,4,5,6,7")
373 : (const_string "ssemov")
374 : ]
375 : (const_string "imov")))
376 : (set (attr "prefix")
377 : (if_then_else (eq_attr "type" "sselog1,ssemov")
378 : (const_string "maybe_vex")
379 : (const_string "orig")))
380 : (set (attr "prefix_data16")
381 : (if_then_else (and (eq_attr "type" "ssemov") (eq_attr "mode" "SI"))
382 : (const_string "1")
383 : (const_string "*")))
384 : (set (attr "mode")
385 : (cond [(eq_attr "alternative" "2,3")
386 : (cond [(match_test "<MODE>mode == V2HFmode
387 128335 : || <MODE>mode == V2BFmode")
388 : (const_string "V4SF")
389 : (match_test "TARGET_AVX")
390 : (const_string "TI")
391 28441 : (ior (not (match_test "TARGET_SSE2"))
392 : (match_test "optimize_function_for_size_p (cfun)"))
393 : (const_string "V4SF")
394 : ]
395 : (const_string "TI"))
396 :
397 : (and (eq_attr "alternative" "4,5")
398 : (ior (match_test "<MODE>mode == V2HFmode
399 : || <MODE>mode == V2BFmode")
400 : (not (match_test "TARGET_SSE2"))))
401 : (const_string "SF")
402 : ]
403 : (const_string "SI")))
404 : (set (attr "preferred_for_speed")
405 : (cond [(eq_attr "alternative" "6")
406 : (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
407 : (eq_attr "alternative" "7")
408 : (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
409 : ]
410 : (symbol_ref "true")))])
411 :
412 : ;; For TARGET_64BIT we always round up to 8 bytes.
413 : (define_insn "*push<mode>2_rex64"
414 : [(set (match_operand:V_32 0 "push_operand" "=X,X")
415 : (match_operand:V_32 1 "nonmemory_no_elim_operand" "rC,*v"))]
416 : "TARGET_64BIT"
417 : "@
418 : push{q}\t%q1
419 : #"
420 : [(set_attr "type" "push,multi")
421 : (set_attr "mode" "DI")])
422 :
423 : (define_split
424 : [(set (match_operand:V_32 0 "push_operand")
425 : (match_operand:V_32 1 "sse_reg_operand"))]
426 0 : "TARGET_64BIT && TARGET_SSE && reload_completed"
427 : [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
428 : (set (match_dup 0) (match_dup 1))]
429 0 : {
430 0 : operands[2] = GEN_INT (-PUSH_ROUNDING (GET_MODE_SIZE (<V_32:MODE>mode)));
431 : /* Preserve memory attributes. */
432 0 : operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx);
433 : })
434 :
435 : (define_expand "movmisalign<mode>"
436 0 : [(set (match_operand:V_32 0 "nonimmediate_operand")
437 : (match_operand:V_32 1 "nonimmediate_operand"))]
438 : ""
439 8517 : {
440 8517 : ix86_expand_vector_move (<MODE>mode, operands);
441 8517 : DONE;
442 : })
443 :
444 : (define_expand "movv2qi"
445 : [(set (match_operand:V2QI 0 "nonimmediate_operand")
446 8495 : (match_operand:V2QI 1 "nonimm_or_0_operand"))]
447 83 : ""
448 54453 : {
449 8578 : ix86_expand_vector_move (V2QImode, operands);
450 54536 : DONE;
451 : })
452 :
453 : (define_insn "*movv2qi_internal"
454 45980 : [(set (match_operand:V2QI 0 "nonimmediate_operand"
455 41 : "=r,r,r,m ,v,v,v,jm,m,r,v")
456 45980 : (match_operand:V2QI 1 "nonimm_or_0_operand"
457 46021 : "r ,C,m,rC,C,v,m,x,v,v,r"))]
458 46021 : "!(MEM_P (operands[0]) && MEM_P (operands[1]))
459 : && ix86_hardreg_mov_ok (operands[0], operands[1])"
460 22415 : {
461 22415 : switch (get_attr_type (insn))
462 : {
463 17611 : case TYPE_IMOV:
464 17611 : if (get_attr_mode (insn) == MODE_SI)
465 : return "mov{l}\t{%k1, %k0|%k0, %k1}";
466 0 : else
467 17376 : return "mov{w}\t{%1, %0|%0, %1}";
468 :
469 : case TYPE_IMOVX:
470 : /* movzwl is faster than movw on p2 due to partial word stalls,
471 : though not as fast as an aligned movl. */
472 : return "movz{wl|x}\t{%1, %k0|%k0, %1}";
473 :
474 551 : case TYPE_SSELOG1:
475 551 : if (satisfies_constraint_C (operands[1]))
476 46 : return standard_sse_constant_opcode (insn, operands);
477 :
478 505 : if (SSE_REG_P (operands[0]))
479 480 : return "%vpinsrw\t{$0, %1, %d0|%d0, %1, 0}";
480 : else
481 : return "%vpextrw\t{$0, %1, %0|%0, %1, 0}";
482 :
483 550 : case TYPE_SSEMOV:
484 550 : return ix86_output_ssemov (insn, operands);
485 :
486 0 : default:
487 0 : gcc_unreachable ();
488 : }
489 : }
490 : [(set (attr "isa")
491 : (cond [(eq_attr "alternative" "6,9,10")
492 : (const_string "sse2")
493 0 : (eq_attr "alternative" "7")
494 : (const_string "sse4_noavx")
495 : (eq_attr "alternative" "8")
496 : (const_string "avx")
497 : ]
498 : (const_string "*")))
499 : (set (attr "addr")
500 : (if_then_else (eq_attr "alternative" "7")
501 : (const_string "gpr16")
502 : (const_string "*")))
503 : (set (attr "type")
504 : (cond [(eq_attr "alternative" "6,7,8")
505 : (if_then_else (match_test "TARGET_AVX512FP16")
506 : (const_string "ssemov")
507 : (const_string "sselog1"))
508 : (eq_attr "alternative" "4")
509 : (const_string "sselog1")
510 : (eq_attr "alternative" "5,9,10")
511 : (const_string "ssemov")
512 : (match_test "optimize_function_for_size_p (cfun)")
513 : (const_string "imov")
514 : (and (eq_attr "alternative" "0")
515 : (ior (not (match_test "TARGET_PARTIAL_REG_STALL"))
516 0 : (not (match_test "TARGET_HIMODE_MATH"))))
517 : (const_string "imov")
518 : (and (eq_attr "alternative" "1,2")
519 : (match_operand:V2QI 1 "aligned_operand"))
520 24576921 : (const_string "imov")
521 108793729 : (and (match_test "TARGET_MOVX")
522 : (eq_attr "alternative" "0,2"))
523 : (const_string "imovx")
524 20617081 : ]
525 26784398 : (const_string "imov")))
526 26784398 : (set (attr "prefix")
527 26784398 : (cond [(eq_attr "alternative" "4,5,6,7,8,9,10")
528 : (const_string "maybe_evex")
529 0 : ]
530 133448957 : (const_string "orig")))
531 121484662 : (set (attr "mode")
532 94783005 : (cond [(eq_attr "alternative" "6,7,8")
533 79263 : (if_then_else (match_test "TARGET_AVX512FP16")
534 61885 : (const_string "HI")
535 8950722 : (const_string "TI"))
536 94188444 : (eq_attr "alternative" "9,10")
537 17378 : (if_then_else (match_test "TARGET_AVX512FP16")
538 38604067 : (const_string "HI")
539 38604067 : (const_string "SI"))
540 94171669 : (eq_attr "alternative" "4")
541 38604067 : (cond [(match_test "TARGET_AVX")
542 72607 : (const_string "TI")
543 38604067 : (ior (not (match_test "TARGET_SSE2"))
544 128986328 : (match_test "optimize_function_for_size_p (cfun)"))
545 : (const_string "V4SF")
546 5061518 : ]
547 5061518 : (const_string "TI"))
548 5061518 : (eq_attr "alternative" "5")
549 : (cond [(match_test "TARGET_AVX512FP16")
550 : (const_string "HF")
551 : (match_test "TARGET_AVX")
552 : (const_string "TI")
553 76 : (ior (not (match_test "TARGET_SSE2"))
554 76 : (match_test "optimize_function_for_size_p (cfun)"))
555 76 : (const_string "V4SF")
556 : ]
557 27368064 : (const_string "TI"))
558 27368064 : (eq_attr "type" "imovx")
559 27368064 : (const_string "SI")
560 : (and (eq_attr "alternative" "1,2")
561 : (match_operand:V2QI 1 "aligned_operand"))
562 : (const_string "SI")
563 26790688 : (and (eq_attr "alternative" "0")
564 32620 : (ior (not (match_test "TARGET_PARTIAL_REG_STALL"))
565 32620 : (not (match_test "TARGET_HIMODE_MATH"))))
566 32620 : (const_string "SI")
567 26823308 : ]
568 : (const_string "HI")))
569 : (set (attr "preferred_for_speed")
570 : (cond [(eq_attr "alternative" "9")
571 25734737 : (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
572 : (eq_attr "alternative" "10")
573 : (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
574 : ]
575 : (symbol_ref "true")))])
576 11727 :
577 11727 : (define_split
578 11727 : [(set (match_operand:V_16_32_64 0 "general_reg_operand")
579 : (match_operand:V_16_32_64 1 "memory_operand"))]
580 26747275 : "reload_completed
581 26747275 : && SYMBOL_REF_P (XEXP (operands[1], 0))
582 26761827 : && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0))"
583 : [(set (match_dup 0) (match_dup 1))]
584 319 : {
585 319 : rtx op1 = avoid_constant_pool_reference (operands[1]);
586 26453255 :
587 319 : if (!CONST_VECTOR_P (op1))
588 0 : FAIL;
589 0 :
590 24851288 : HOST_WIDE_INT val = ix86_convert_const_vector_to_integer (op1, <MODE>mode);
591 41380 :
592 41699 : operands[0] = lowpart_subreg (<mmxinsnmode>mode, operands[0], <MODE>mode);
593 41699 : operands[1] = GEN_INT (val);
594 21028929 : })
595 :
596 : ;; 16-bit, 32-bit and 64-bit constant vector stores. After reload,
597 319 : ;; convert them to immediate integer stores.
598 : (define_insn_and_split "*mov<mode>_imm"
599 : [(set (match_operand:V_16_32_64 0 "memory_operand" "=m")
600 319 : (match_operand:V_16_32_64 1 "x86_64_const_vector_operand" "i"))]
601 16034 : "!TARGET_LCP_STALL || <MODE>mode != V2QImode"
602 : "#"
603 1948999 : "&& reload_completed"
604 1923499 : [(set (match_dup 0) (match_dup 1))]
605 2151355 : {
606 1953685 : rtx op1 = operands[1];
607 70791 : HOST_WIDE_INT val = ix86_convert_const_vector_to_integer (op1, <MODE>mode);
608 215418 :
609 30186 : operands[0] = adjust_address (operands[0], <mmxinsnmode>mode, 0);
610 1974708 : operands[1] = GEN_INT (val);
611 : })
612 :
613 : ;; We always round up to UNITS_PER_WORD bytes.
614 1509017 : (define_insn "*pushv2qi2"
615 : [(set (match_operand:V2QI 0 "push_operand" "=X,X")
616 874609 : (match_operand:V2QI 1 "nonmemory_no_elim_operand" "rC,v"))]
617 21312 : ""
618 0 : "* return TARGET_64BIT ? \"push{q}\t%q1\" : \"push{l}\t%k1\";
619 : #"
620 : [(set_attr "isa" "*,sse4")
621 : (set_attr "type" "push,multi")
622 66859 : (set (attr "mode")
623 56576 : (cond [(eq_attr "alternative" "0")
624 66859 : (if_then_else (match_test "TARGET_64BIT")
625 79492 : (const_string "DI")
626 56576 : (const_string "SI"))
627 43943 : (eq_attr "alternative" "1")
628 43943 : (if_then_else (match_test "TARGET_AVX512FP16")
629 43943 : (const_string "HI")
630 43943 : (const_string "TI"))
631 43943 : ]
632 43943 : (const_string "HI")))])
633 458 :
634 : (define_split
635 : [(set (match_operand:V2QI 0 "push_operand")
636 : (match_operand:V2QI 1 "sse_reg_operand"))]
637 0 : "TARGET_SSE4_1 && reload_completed"
638 : [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
639 : (set (match_dup 0) (match_dup 1))]
640 0 : {
641 0 : operands[2] = GEN_INT (-PUSH_ROUNDING (GET_MODE_SIZE (V2QImode)));
642 0 : /* Preserve memory attributes. */
643 0 : operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx);
644 0 : })
645 :
646 : (define_expand "movmisalignv2qi"
647 0 : [(set (match_operand:V2QI 0 "nonimmediate_operand")
648 : (match_operand:V2QI 1 "nonimmediate_operand"))]
649 : ""
650 5738 : {
651 5738 : ix86_expand_vector_move (V2QImode, operands);
652 5738 : DONE;
653 53545 : })
654 53545 :
655 53545 : (define_insn "sse_movntq"
656 : [(set (match_operand:DI 0 "memory_operand" "=m,m")
657 82 : (unspec:DI [(match_operand:DI 1 "register_operand" "y,r")]
658 : UNSPEC_MOVNTQ))]
659 53575 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
660 82 : && (TARGET_SSE || TARGET_3DNOW_A)"
661 82 : "@
662 : movntq\t{%1, %0|%0, %1}
663 53493 : movnti\t{%1, %0|%0, %1}"
664 : [(set_attr "isa" "*,x64")
665 4 : (set_attr "mmx_isa" "native,*")
666 : (set_attr "type" "mmxmov,ssemov")
667 4 : (set_attr "c86_attr" "movnt")
668 4 : (set_attr "mode" "DI")])
669 4 :
670 : (define_expand "movq_<mode>_to_sse"
671 : [(set (match_operand:<mmxdoublevecmode> 0 "register_operand")
672 52578 : (vec_concat:<mmxdoublevecmode>
673 52578 : (match_operand:V24FI 1 "nonimmediate_operand")
674 52578 : (match_dup 2)))]
675 : "TARGET_SSE2"
676 17182 : {
677 17182 : if (<MODE>mode != V2SImode
678 17248 : && !flag_trapping_math)
679 : {
680 10420 : rtx op1 = force_reg (<MODE>mode, operands[1]);
681 10420 : emit_move_insn (operands[0], lowpart_subreg (<mmxdoublevecmode>mode,
682 0 : op1, <MODE>mode));
683 10420 : DONE;
684 : }
685 :
686 6762 : operands[2] = CONST0_RTX (<MODE>mode);
687 : })
688 :
689 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
690 : ;;
691 3271600 : ;; Parallel single-precision floating point arithmetic
692 3264838 : ;;
693 3264838 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
694 3264838 :
695 6762 : (define_expand "<code>v2sf2"
696 : [(set (match_operand:V2SF 0 "register_operand")
697 : (absneg:V2SF
698 3213935 : (match_operand:V2SF 1 "register_operand")))]
699 : "TARGET_MMX_WITH_SSE"
700 2382 : "ix86_expand_fp_absneg_operator (<CODE>, V2SFmode, operands); DONE;")
701 82 :
702 3216235 : (define_insn_and_split "*mmx_<code>v2sf2"
703 2382 : [(set (match_operand:V2SF 0 "register_operand" "=x,x,x")
704 2382 : (absneg:V2SF
705 : (match_operand:V2SF 1 "register_operand" "0,x,x")))
706 3213935 : (use (match_operand:V2SF 2 "nonimmediate_operand" "x,0,x"))]
707 964 : "TARGET_MMX_WITH_SSE"
708 : "#"
709 964 : "&& reload_completed"
710 : [(set (match_dup 0)
711 : (<absneg_op>:V2SF (match_dup 1) (match_dup 2)))]
712 3913 : {
713 92 : if (!TARGET_AVX && operands_match_p (operands[0], operands[2]))
714 3864 : std::swap (operands[1], operands[2]);
715 9046 : }
716 9056 : [(set_attr "isa" "noavx,noavx,avx")])
717 5215 :
718 5297 : (define_insn_and_split "*mmx_nabsv2sf2"
719 5215 : [(set (match_operand:V2SF 0 "register_operand" "=x,x,x")
720 : (neg:V2SF
721 : (abs:V2SF
722 82 : (match_operand:V2SF 1 "register_operand" "0,x,x"))))
723 : (use (match_operand:V2SF 2 "nonimmediate_operand" "x,0,x"))]
724 : "TARGET_MMX_WITH_SSE"
725 : "#"
726 : "&& reload_completed"
727 32 : [(set (match_dup 0)
728 2578 : (ior:V2SF (match_dup 1) (match_dup 2)))]
729 2610 : {
730 2610 : if (!TARGET_AVX && operands_match_p (operands[0], operands[2]))
731 2595 : std::swap (operands[1], operands[2]);
732 2578 : }
733 2578 : [(set_attr "isa" "noavx,noavx,avx")])
734 2578 :
735 2593 : (define_expand "<insn>v2sf3"
736 2578 : [(set (match_operand:V2SF 0 "register_operand")
737 2578 : (plusminusmult:V2SF
738 : (match_operand:V2SF 1 "nonimmediate_operand")
739 0 : (match_operand:V2SF 2 "nonimmediate_operand")))]
740 76 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
741 6131 : {
742 6207 : rtx op2 = gen_reg_rtx (V4SFmode);
743 6207 : rtx op1 = gen_reg_rtx (V4SFmode);
744 6221 : rtx op0 = gen_reg_rtx (V4SFmode);
745 :
746 195060 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
747 195060 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
748 188915 :
749 195046 : emit_insn (gen_<insn>v4sf3 (op0, op1, op2));
750 188915 :
751 195046 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
752 195060 : DONE;
753 188915 : })
754 :
755 : (define_expand "mmx_addv2sf3"
756 : [(parallel
757 14 : [(set (match_operand:V2SF 0 "register_operand")
758 : (plus:V2SF
759 14 : (match_operand:V2SF 1 "nonimmediate_operand")
760 14 : (match_operand:V2SF 2 "nonimmediate_operand")))
761 14 : (unspec [(const_int 0)] UNSPEC_3DNOW)])]
762 1104 : "TARGET_3DNOW"
763 1121 : "ix86_fixup_binary_operands_no_copy (PLUS, V2SFmode, operands);")
764 1104 :
765 : (define_insn "*mmx_addv2sf3"
766 257 : [(set (match_operand:V2SF 0 "register_operand" "=y")
767 17 : (plus:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0")
768 1344 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")))
769 257 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
770 349 : "TARGET_3DNOW && ix86_binary_operator_ok (PLUS, V2SFmode, operands)"
771 : "pfadd\t{%2, %0|%0, %2}"
772 1104 : [(set_attr "type" "mmxadd")
773 : (set_attr "prefix_extra" "1")
774 676 : (set_attr "mode" "V2SF")])
775 :
776 1087 : (define_expand "mmx_subv2sf3"
777 735 : [(parallel
778 : [(set (match_operand:V2SF 0 "register_operand")
779 59 : (minus:V2SF (match_operand:V2SF 1 "register_operand")
780 59 : (match_operand:V2SF 2 "nonimmediate_operand")))
781 59 : (unspec [(const_int 0)] UNSPEC_3DNOW)])]
782 : "TARGET_3DNOW")
783 :
784 : (define_expand "mmx_subrv2sf3"
785 151340 : [(parallel
786 151340 : [(set (match_operand:V2SF 0 "register_operand")
787 151340 : (minus:V2SF (match_operand:V2SF 2 "register_operand")
788 151340 : (match_operand:V2SF 1 "nonimmediate_operand")))
789 : (unspec [(const_int 0)] UNSPEC_3DNOW)])]
790 : "TARGET_3DNOW")
791 :
792 : (define_insn "*mmx_subv2sf3"
793 : [(set (match_operand:V2SF 0 "register_operand" "=y,y")
794 : (minus:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "0,ym")
795 : (match_operand:V2SF 2 "nonimmediate_operand" "ym,0")))
796 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
797 280678 : "TARGET_3DNOW && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
798 280533 : "@
799 280533 : pfsub\t{%2, %0|%0, %2}
800 : pfsubr\t{%1, %0|%0, %1}"
801 3865 : [(set_attr "type" "mmxadd")
802 : (set_attr "prefix_extra" "1")
803 : (set_attr "mode" "V2SF")])
804 3865 :
805 : (define_expand "mmx_mulv2sf3"
806 : [(parallel
807 : [(set (match_operand:V2SF 0 "register_operand")
808 256869 : (mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand")
809 256869 : (match_operand:V2SF 2 "nonimmediate_operand")))
810 256869 : (unspec [(const_int 0)] UNSPEC_3DNOW)])]
811 : "TARGET_3DNOW"
812 15 : "ix86_fixup_binary_operands_no_copy (MULT, V2SFmode, operands);")
813 :
814 89472 : (define_insn "*mmx_mulv2sf3"
815 : [(set (match_operand:V2SF 0 "register_operand" "=y")
816 15 : (mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0")
817 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")))
818 51712 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
819 78 : "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V2SFmode, operands)"
820 : "pfmul\t{%2, %0|%0, %2}"
821 15 : [(set_attr "type" "mmxmul")
822 : (set_attr "prefix_extra" "1")
823 114406 : (set_attr "mode" "V2SF")])
824 :
825 : (define_expand "divv2sf3"
826 114414 : [(set (match_operand:V2SF 0 "register_operand")
827 10657 : (div:V2SF (match_operand:V2SF 1 "register_operand")
828 10665 : (match_operand:V2SF 2 "register_operand")))]
829 10665 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
830 236 : {
831 228 : rtx op2 = gen_reg_rtx (V4SFmode);
832 228 : rtx op1 = gen_reg_rtx (V4SFmode);
833 6595 : rtx op0 = gen_reg_rtx (V4SFmode);
834 :
835 228 : rtx tmp = gen_rtx_VEC_CONCAT (V4SFmode, operands[2],
836 : force_reg (V2SFmode, CONST1_RTX (V2SFmode)));
837 6595 : emit_insn (gen_rtx_SET (op2, tmp));
838 228 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
839 :
840 228 : emit_insn (gen_divv4sf3 (op0, op1, op2));
841 :
842 228 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
843 228 : DONE;
844 : })
845 :
846 345993 : (define_expand "<code>v2sf3"
847 345993 : [(set (match_operand:V2SF 0 "register_operand")
848 345993 : (smaxmin:V2SF
849 : (match_operand:V2SF 1 "register_operand")
850 : (match_operand:V2SF 2 "register_operand")))]
851 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
852 135 : {
853 135 : rtx op2 = gen_reg_rtx (V4SFmode);
854 135 : rtx op1 = gen_reg_rtx (V4SFmode);
855 135 : rtx op0 = gen_reg_rtx (V4SFmode);
856 :
857 149 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
858 135 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
859 14 :
860 149 : emit_insn (gen_<code>v4sf3 (op0, op1, op2));
861 :
862 135 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
863 135 : DONE;
864 : })
865 :
866 : (define_expand "mmx_<code>v2sf3"
867 : [(parallel
868 : [(set (match_operand:V2SF 0 "register_operand")
869 14 : (smaxmin:V2SF (match_operand:V2SF 1 "nonimmediate_operand")
870 : (match_operand:V2SF 2 "nonimmediate_operand")))
871 : (unspec [(const_int 0)] UNSPEC_3DNOW)])]
872 : "TARGET_3DNOW"
873 1761130 : {
874 1761144 : if (!flag_finite_math_only || flag_signed_zeros)
875 1761102 : {
876 42 : operands[1] = force_reg (V2SFmode, operands[1]);
877 56 : emit_insn (gen_mmx_ieee_<maxmin_float>v2sf3
878 199 : (operands[0], operands[1], operands[2]));
879 42 : DONE;
880 199 : }
881 185 : else
882 0 : ix86_fixup_binary_operands_no_copy (<CODE>, V2SFmode, operands);
883 : })
884 299326 :
885 299326 : ;; These versions of the min/max patterns are intentionally ignorant of
886 299326 : ;; their behavior wrt -0.0 and NaN (via the commutative operand mark).
887 0 : ;; Since both the tree-level MAX_EXPR and the rtl-level SMAX operator
888 : ;; are undefined in this condition, we're certain this is correct.
889 14 :
890 : (define_insn "*mmx_<code>v2sf3"
891 : [(set (match_operand:V2SF 0 "register_operand" "=y")
892 0 : (smaxmin:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0")
893 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")))
894 4 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
895 0 : "TARGET_3DNOW && ix86_binary_operator_ok (<CODE>, V2SFmode, operands)"
896 4 : "pf<maxmin_float>\t{%2, %0|%0, %2}"
897 250 : [(set_attr "type" "mmxadd")
898 5 : (set_attr "prefix_extra" "1")
899 254 : (set_attr "mode" "V2SF")])
900 247 :
901 247 : ;; These versions of the min/max patterns implement exactly the operations
902 8 : ;; min = (op1 < op2 ? op1 : op2)
903 : ;; max = (!(op1 < op2) ? op1 : op2)
904 : ;; Their operands are not commutative, and thus they may be used in the
905 : ;; presence of -0.0 and NaN.
906 :
907 : (define_insn "mmx_ieee_<ieee_maxmin>v2sf3"
908 : [(set (match_operand:V2SF 0 "register_operand" "=y")
909 : (unspec:V2SF
910 : [(match_operand:V2SF 1 "register_operand" "0")
911 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")]
912 : IEEE_MAXMIN))
913 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
914 : "TARGET_3DNOW"
915 : "pf<ieee_maxmin>\t{%2, %0|%0, %2}"
916 : [(set_attr "type" "mmxadd")
917 : (set_attr "prefix_extra" "1")
918 : (set_attr "mode" "V2SF")])
919 :
920 : (define_insn "mmx_rcpv2sf2"
921 : [(set (match_operand:V2SF 0 "register_operand" "=y")
922 : (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")]
923 : UNSPEC_PFRCP))]
924 : "TARGET_3DNOW"
925 : "pfrcp\t{%1, %0|%0, %1}"
926 : [(set_attr "type" "mmx")
927 : (set_attr "prefix_extra" "1")
928 : (set_attr "mode" "V2SF")])
929 :
930 : (define_insn "mmx_rcpit1v2sf3"
931 : [(set (match_operand:V2SF 0 "register_operand" "=y")
932 : (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0")
933 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")]
934 : UNSPEC_PFRCPIT1))]
935 783 : "TARGET_3DNOW"
936 : "pfrcpit1\t{%2, %0|%0, %2}"
937 : [(set_attr "type" "mmx")
938 : (set_attr "prefix_extra" "1")
939 156225 : (set_attr "mode" "V2SF")])
940 :
941 : (define_insn "mmx_rcpit2v2sf3"
942 156225 : [(set (match_operand:V2SF 0 "register_operand" "=y")
943 : (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0")
944 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")]
945 : UNSPEC_PFRCPIT2))]
946 : "TARGET_3DNOW"
947 : "pfrcpit2\t{%2, %0|%0, %2}"
948 : [(set_attr "type" "mmx")
949 : (set_attr "prefix_extra" "1")
950 : (set_attr "mode" "V2SF")])
951 :
952 : (define_expand "sqrtv2sf2"
953 : [(set (match_operand:V2SF 0 "register_operand")
954 : (sqrt:V2SF (match_operand:V2SF 1 "nonimmediate_operand")))]
955 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
956 8 : {
957 8 : rtx op1 = gen_reg_rtx (V4SFmode);
958 8 : rtx op0 = gen_reg_rtx (V4SFmode);
959 :
960 8 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
961 :
962 8 : emit_insn (gen_sqrtv4sf2 (op0, op1));
963 :
964 8 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
965 8 : DONE;
966 : })
967 :
968 : (define_insn "mmx_rsqrtv2sf2"
969 : [(set (match_operand:V2SF 0 "register_operand" "=y")
970 : (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")]
971 : UNSPEC_PFRSQRT))]
972 : "TARGET_3DNOW"
973 : "pfrsqrt\t{%1, %0|%0, %1}"
974 : [(set_attr "type" "mmx")
975 : (set_attr "prefix_extra" "1")
976 : (set_attr "mode" "V2SF")])
977 :
978 5 : (define_insn "mmx_rsqit1v2sf3"
979 : [(set (match_operand:V2SF 0 "register_operand" "=y")
980 5 : (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0")
981 5 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")]
982 5 : UNSPEC_PFRSQIT1))]
983 : "TARGET_3DNOW"
984 : "pfrsqit1\t{%2, %0|%0, %2}"
985 : [(set_attr "type" "mmx")
986 : (set_attr "prefix_extra" "1")
987 : (set_attr "mode" "V2SF")])
988 :
989 : (define_expand "mmx_haddv2sf3"
990 : [(set (match_operand:V2SF 0 "register_operand")
991 : (vec_concat:V2SF
992 : (plus:SF
993 : (vec_select:SF
994 : (match_operand:V2SF 1 "register_operand")
995 : (parallel [(const_int 0)]))
996 : (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
997 : (plus:SF
998 : (vec_select:SF
999 : (match_operand:V2SF 2 "nonimmediate_operand")
1000 : (parallel [(const_int 0)]))
1001 : (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))]
1002 : "TARGET_3DNOW")
1003 :
1004 : (define_insn "*mmx_haddv2sf3"
1005 : [(set (match_operand:V2SF 0 "register_operand" "=y")
1006 : (vec_concat:V2SF
1007 : (plus:SF
1008 : (vec_select:SF
1009 : (match_operand:V2SF 1 "register_operand" "0")
1010 : (parallel [(match_operand:SI 3 "const_0_to_1_operand")]))
1011 : (vec_select:SF (match_dup 1)
1012 : (parallel [(match_operand:SI 4 "const_0_to_1_operand")])))
1013 : (plus:SF
1014 : (vec_select:SF
1015 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")
1016 : (parallel [(match_operand:SI 5 "const_0_to_1_operand")]))
1017 : (vec_select:SF (match_dup 2)
1018 : (parallel [(match_operand:SI 6 "const_0_to_1_operand")])))))]
1019 79 : "TARGET_3DNOW
1020 79 : && INTVAL (operands[3]) != INTVAL (operands[4])
1021 158 : && INTVAL (operands[5]) != INTVAL (operands[6])"
1022 : "pfacc\t{%2, %0|%0, %2}"
1023 : [(set_attr "type" "mmxadd")
1024 : (set_attr "prefix_extra" "1")
1025 79 : (set_attr "mode" "V2SF")])
1026 :
1027 : (define_insn_and_split "*mmx_haddv2sf3_low"
1028 79 : [(set (match_operand:SF 0 "register_operand")
1029 : (plus:SF
1030 : (vec_select:SF
1031 : (match_operand:V2SF 1 "nonimmediate_operand")
1032 : (parallel [(match_operand:SI 2 "const_0_to_1_operand")]))
1033 : (vec_select:SF
1034 : (match_dup 1)
1035 : (parallel [(match_operand:SI 3 "const_0_to_1_operand")]))))]
1036 372 : "TARGET_SSE3 && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math
1037 372 : && INTVAL (operands[2]) != INTVAL (operands[3])
1038 1203 : && ix86_pre_reload_split ()"
1039 : "#"
1040 405 : "&& 1"
1041 : [(const_int 0)]
1042 295 : {
1043 185 : rtx op1 = gen_reg_rtx (V4SFmode);
1044 406 : rtx op0 = gen_reg_rtx (V4SFmode);
1045 110 :
1046 185 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1047 221 :
1048 185 : emit_insn (gen_sse3_haddv4sf3 (op0, op1, op1));
1049 :
1050 185 : emit_move_insn (operands[0], lowpart_subreg (SFmode, op0, V4SFmode));
1051 185 : DONE;
1052 : })
1053 :
1054 : (define_insn "mmx_hsubv2sf3"
1055 : [(set (match_operand:V2SF 0 "register_operand" "=y")
1056 : (vec_concat:V2SF
1057 : (minus:SF
1058 : (vec_select:SF
1059 : (match_operand:V2SF 1 "register_operand" "0")
1060 : (parallel [(const_int 0)]))
1061 : (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1062 : (minus:SF
1063 163 : (vec_select:SF
1064 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")
1065 163 : (parallel [(const_int 0)]))
1066 163 : (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))]
1067 163 : "TARGET_3DNOW_A"
1068 : "pfnacc\t{%2, %0|%0, %2}"
1069 : [(set_attr "type" "mmxadd")
1070 : (set_attr "prefix_extra" "1")
1071 : (set_attr "mode" "V2SF")])
1072 :
1073 : (define_insn_and_split "*mmx_hsubv2sf3_low"
1074 : [(set (match_operand:SF 0 "register_operand")
1075 : (minus:SF
1076 : (vec_select:SF
1077 : (match_operand:V2SF 1 "register_operand")
1078 : (parallel [(const_int 0)]))
1079 : (vec_select:SF
1080 : (match_dup 1)
1081 : (parallel [(const_int 1)]))))]
1082 3 : "TARGET_SSE3 && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math
1083 102 : && ix86_pre_reload_split ()"
1084 : "#"
1085 49 : "&& 1"
1086 : [(const_int 0)]
1087 18 : {
1088 1 : rtx op1 = gen_reg_rtx (V4SFmode);
1089 7120 : rtx op0 = gen_reg_rtx (V4SFmode);
1090 17 :
1091 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1092 7119 :
1093 1 : emit_insn (gen_sse3_hsubv4sf3 (op0, op1, op1));
1094 :
1095 1 : emit_move_insn (operands[0], lowpart_subreg (SFmode, op0, V4SFmode));
1096 1 : DONE;
1097 : })
1098 :
1099 : (define_expand "mmx_haddsubv2sf3"
1100 : [(set (match_operand:V2SF 0 "register_operand")
1101 : (vec_concat:V2SF
1102 : (minus:SF
1103 : (vec_select:SF
1104 : (match_operand:V2SF 1 "register_operand")
1105 : (parallel [(const_int 0)]))
1106 : (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1107 : (plus:SF
1108 11 : (vec_select:SF
1109 : (match_operand:V2SF 2 "nonimmediate_operand")
1110 11 : (parallel [(const_int 0)]))
1111 11 : (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))]
1112 11 : "TARGET_3DNOW_A")
1113 :
1114 : (define_insn "*mmx_haddsubv2sf3"
1115 : [(set (match_operand:V2SF 0 "register_operand" "=y")
1116 : (vec_concat:V2SF
1117 : (minus:SF
1118 : (vec_select:SF
1119 : (match_operand:V2SF 1 "register_operand" "0")
1120 : (parallel [(const_int 0)]))
1121 : (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1122 : (plus:SF
1123 : (vec_select:SF
1124 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")
1125 : (parallel [(match_operand:SI 3 "const_0_to_1_operand")]))
1126 : (vec_select:SF
1127 : (match_dup 2)
1128 : (parallel [(match_operand:SI 4 "const_0_to_1_operand")])))))]
1129 79 : "TARGET_3DNOW_A
1130 79 : && INTVAL (operands[3]) != INTVAL (operands[4])"
1131 : "pfpnacc\t{%2, %0|%0, %2}"
1132 : [(set_attr "type" "mmxadd")
1133 : (set_attr "prefix_extra" "1")
1134 310699 : (set_attr "mode" "V2SF")])
1135 :
1136 : (define_expand "vec_addsubv2sf3"
1137 310699 : [(set (match_operand:V2SF 0 "register_operand")
1138 : (vec_merge:V2SF
1139 : (minus:V2SF
1140 : (match_operand:V2SF 1 "nonimmediate_operand")
1141 : (match_operand:V2SF 2 "nonimmediate_operand"))
1142 : (plus:V2SF (match_dup 1) (match_dup 2))
1143 : (const_int 1)))]
1144 : "TARGET_SSE3 && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1145 246 : {
1146 246 : rtx op2 = gen_reg_rtx (V4SFmode);
1147 246 : rtx op1 = gen_reg_rtx (V4SFmode);
1148 246 : rtx op0 = gen_reg_rtx (V4SFmode);
1149 :
1150 246 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
1151 246 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1152 :
1153 246 : emit_insn (gen_vec_addsubv4sf3 (op0, op1, op2));
1154 :
1155 246 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1156 246 : DONE;
1157 : })
1158 :
1159 : (define_expand "vec_fmaddsubv2sf4"
1160 : [(match_operand:V2SF 0 "register_operand")
1161 : (match_operand:V2SF 1 "nonimmediate_operand")
1162 : (match_operand:V2SF 2 "nonimmediate_operand")
1163 : (match_operand:V2SF 3 "nonimmediate_operand")]
1164 : "(TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL)
1165 : && TARGET_MMX_WITH_SSE
1166 : && ix86_partial_vec_fp_math"
1167 5 : {
1168 5 : rtx op3 = gen_reg_rtx (V4SFmode);
1169 5 : rtx op2 = gen_reg_rtx (V4SFmode);
1170 5 : rtx op1 = gen_reg_rtx (V4SFmode);
1171 6 : rtx op0 = gen_reg_rtx (V4SFmode);
1172 :
1173 6 : emit_insn (gen_movq_v2sf_to_sse (op3, operands[3]));
1174 6 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
1175 6 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1176 :
1177 5 : emit_insn (gen_vec_fmaddsubv4sf4 (op0, op1, op2, op3));
1178 :
1179 5 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1180 5 : DONE;
1181 : })
1182 :
1183 : (define_expand "vec_fmsubaddv2sf4"
1184 : [(match_operand:V2SF 0 "register_operand")
1185 : (match_operand:V2SF 1 "nonimmediate_operand")
1186 : (match_operand:V2SF 2 "nonimmediate_operand")
1187 : (match_operand:V2SF 3 "nonimmediate_operand")]
1188 : "(TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL)
1189 : && TARGET_MMX_WITH_SSE
1190 : && ix86_partial_vec_fp_math"
1191 4 : {
1192 4 : rtx op3 = gen_reg_rtx (V4SFmode);
1193 4 : rtx op2 = gen_reg_rtx (V4SFmode);
1194 751 : rtx op1 = gen_reg_rtx (V4SFmode);
1195 4 : rtx op0 = gen_reg_rtx (V4SFmode);
1196 747 :
1197 751 : emit_insn (gen_movq_v2sf_to_sse (op3, operands[3]));
1198 751 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
1199 4 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1200 :
1201 4 : emit_insn (gen_vec_fmsubaddv4sf4 (op0, op1, op2, op3));
1202 :
1203 4 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1204 4 : DONE;
1205 : })
1206 :
1207 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1208 : ;;
1209 : ;; Parallel single-precision floating point comparisons
1210 : ;;
1211 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1212 :
1213 : (define_expand "mmx_eqv2sf3"
1214 : [(parallel
1215 : [(set (match_operand:V2SI 0 "register_operand")
1216 : (eq:V2SI (match_operand:V2SF 1 "nonimmediate_operand")
1217 : (match_operand:V2SF 2 "nonimmediate_operand")))
1218 13 : (unspec [(const_int 0)] UNSPEC_3DNOW)])]
1219 : "TARGET_3DNOW"
1220 27 : "ix86_fixup_binary_operands_no_copy (EQ, V2SFmode, operands);")
1221 13 :
1222 13 : (define_insn "*mmx_eqv2sf3"
1223 : [(set (match_operand:V2SI 0 "register_operand" "=y")
1224 14 : (eq:V2SI (match_operand:V2SF 1 "nonimmediate_operand" "%0")
1225 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")))
1226 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
1227 70 : "TARGET_3DNOW && ix86_binary_operator_ok (EQ, V2SFmode, operands)"
1228 : "pfcmpeq\t{%2, %0|%0, %2}"
1229 14 : [(set_attr "type" "mmxcmp")
1230 : (set_attr "prefix_extra" "1")
1231 145 : (set_attr "mode" "V2SF")])
1232 :
1233 : (define_insn "mmx_gtv2sf3"
1234 146 : [(set (match_operand:V2SI 0 "register_operand" "=y")
1235 : (gt:V2SI (match_operand:V2SF 1 "register_operand" "0")
1236 1 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")))
1237 1 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
1238 1 : "TARGET_3DNOW"
1239 : "pfcmpgt\t{%2, %0|%0, %2}"
1240 : [(set_attr "type" "mmxcmp")
1241 : (set_attr "prefix_extra" "1")
1242 : (set_attr "mode" "V2SF")])
1243 :
1244 : (define_insn "mmx_gev2sf3"
1245 : [(set (match_operand:V2SI 0 "register_operand" "=y")
1246 : (ge:V2SI (match_operand:V2SF 1 "register_operand" "0")
1247 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")))
1248 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
1249 : "TARGET_3DNOW"
1250 : "pfcmpge\t{%2, %0|%0, %2}"
1251 : [(set_attr "type" "mmxcmp")
1252 : (set_attr "prefix_extra" "1")
1253 : (set_attr "mode" "V2SF")])
1254 :
1255 : (define_expand "vec_cmpv2sfv2si"
1256 : [(set (match_operand:V2SI 0 "register_operand")
1257 : (match_operator:V2SI 1 "ix86_fp_vec_cmp_operator"
1258 : [(match_operand:V2SF 2 "nonimmediate_operand")
1259 : (match_operand:V2SF 3 "nonimmediate_operand")]))]
1260 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1261 163 : {
1262 163 : rtx ops[4];
1263 163 : ops[3] = gen_reg_rtx (V4SFmode);
1264 163 : ops[2] = gen_reg_rtx (V4SFmode);
1265 163 : ops[1] = gen_rtx_fmt_ee (GET_CODE (operands[1]), V4SImode, ops[2], ops[3]);
1266 163 : ops[0] = gen_reg_rtx (V4SImode);
1267 :
1268 163 : emit_insn (gen_movq_v2sf_to_sse (ops[3], operands[3]));
1269 163 : emit_insn (gen_movq_v2sf_to_sse (ops[2], operands[2]));
1270 :
1271 163 : bool ok = ix86_expand_fp_vec_cmp (ops);
1272 163 : gcc_assert (ok);
1273 :
1274 163 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, ops[0], V4SImode));
1275 163 : DONE;
1276 : })
1277 :
1278 : (define_insn "@sse4_1_insertps_<mode>"
1279 : [(set (match_operand:V2FI 0 "register_operand" "=Yr,*x,v")
1280 : (unspec:V2FI
1281 : [(match_operand:V2FI 2 "nonimmediate_operand" "Yrjm,*xjm,vm")
1282 : (match_operand:V2FI 1 "register_operand" "0,0,v")
1283 : (match_operand:SI 3 "const_0_to_255_operand")]
1284 : UNSPEC_INSERTPS))]
1285 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
1286 458 : {
1287 458 : if (MEM_P (operands[2]))
1288 : {
1289 103 : unsigned count_s = INTVAL (operands[3]) >> 6;
1290 21 : if (count_s)
1291 93 : operands[3] = GEN_INT (INTVAL (operands[3]) & 0x3f);
1292 103 : operands[2] = adjust_address_nv (operands[2],
1293 82 : <mmxscalarmode>mode, count_s * 4);
1294 : }
1295 458 : switch (which_alternative)
1296 : {
1297 : case 0:
1298 : case 1:
1299 : return "insertps\t{%3, %2, %0|%0, %2, %3}";
1300 458 : case 2:
1301 458 : return "vinsertps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
1302 0 : default:
1303 0 : gcc_unreachable ();
1304 : }
1305 : }
1306 : [(set_attr "isa" "noavx,noavx,avx")
1307 : (set_attr "addr" "gpr16,gpr16,*")
1308 : (set_attr "type" "sselog")
1309 0 : (set_attr "prefix_data16" "1,1,*")
1310 : (set_attr "prefix_extra" "1")
1311 : (set_attr "length_immediate" "1")
1312 : (set_attr "prefix" "orig,orig,maybe_evex")
1313 : (set_attr "mode" "V4SF")])
1314 :
1315 : (define_insn "*mmx_blendps"
1316 : [(set (match_operand:V2SF 0 "register_operand" "=Yr,*x,x")
1317 : (vec_merge:V2SF
1318 : (match_operand:V2SF 2 "register_operand" "Yr,*x,x")
1319 : (match_operand:V2SF 1 "register_operand" "0,0,x")
1320 : (match_operand:SI 3 "const_0_to_3_operand")))]
1321 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
1322 : "@
1323 : blendps\t{%3, %2, %0|%0, %2, %3}
1324 : blendps\t{%3, %2, %0|%0, %2, %3}
1325 : vblendps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1326 : [(set_attr "isa" "noavx,noavx,avx")
1327 : (set_attr "type" "ssemov")
1328 : (set_attr "c86_attr" "blend")
1329 : (set_attr "length_immediate" "1")
1330 : (set_attr "prefix_data16" "1,1,*")
1331 : (set_attr "prefix_extra" "1")
1332 : (set_attr "prefix" "orig,orig,vex")
1333 : (set_attr "mode" "V4SF")])
1334 :
1335 : (define_insn "mmx_blendvps"
1336 : [(set (match_operand:V2SF 0 "register_operand" "=Yr,*x,x")
1337 : (unspec:V2SF
1338 : [(match_operand:V2SF 1 "register_operand" "0,0,x")
1339 : (match_operand:V2SF 2 "register_operand" "Yr,*x,x")
1340 : (match_operand:V2SF 3 "register_operand" "Yz,Yz,x")]
1341 : UNSPEC_BLENDV))]
1342 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
1343 : "@
1344 : blendvps\t{%3, %2, %0|%0, %2, %3}
1345 : blendvps\t{%3, %2, %0|%0, %2, %3}
1346 : vblendvps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1347 : [(set_attr "isa" "noavx,noavx,avx")
1348 : (set_attr "type" "ssemov")
1349 : (set_attr "c86_attr" "blendv")
1350 : (set_attr "length_immediate" "1")
1351 : (set_attr "prefix_data16" "1,1,*")
1352 : (set_attr "prefix_extra" "1")
1353 : (set_attr "prefix" "orig,orig,vex")
1354 : (set_attr "btver2_decode" "vector")
1355 : (set_attr "mode" "V4SF")])
1356 :
1357 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1358 : ;;
1359 : ;; Parallel single-precision floating point logical operations
1360 : ;;
1361 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1362 :
1363 : (define_insn "*mmx_andnotv2sf3"
1364 : [(set (match_operand:V2SF 0 "register_operand" "=x,x")
1365 : (and:V2SF
1366 : (not:V2SF
1367 : (match_operand:V2SF 1 "register_operand" "0,x"))
1368 : (match_operand:V2SF 2 "register_operand" "x,x")))]
1369 : "TARGET_MMX_WITH_SSE"
1370 : "@
1371 : andnps\t{%2, %0|%0, %2}
1372 : vandnps\t{%2, %1, %0|%0, %1, %2}"
1373 : [(set_attr "isa" "noavx,avx")
1374 : (set_attr "type" "sselog")
1375 : (set_attr "prefix" "orig,vex")
1376 : (set_attr "mode" "V4SF")])
1377 :
1378 : (define_insn "<code>v2sf3"
1379 : [(set (match_operand:V2SF 0 "register_operand" "=x,x")
1380 : (any_logic:V2SF
1381 : (match_operand:V2SF 1 "register_operand" "%0,x")
1382 : (match_operand:V2SF 2 "register_operand" "x,x")))]
1383 47863 : "TARGET_MMX_WITH_SSE"
1384 : "@
1385 : <logic>ps\t{%2, %0|%0, %2}
1386 : v<logic>ps\t{%2, %1, %0|%0, %1, %2}"
1387 59 : [(set_attr "isa" "noavx,avx")
1388 : (set_attr "type" "sselog")
1389 : (set_attr "prefix" "orig,vex")
1390 59 : (set_attr "mode" "V4SF")])
1391 :
1392 : (define_expand "copysignv2sf3"
1393 : [(set (match_dup 4)
1394 : (and:V2SF
1395 : (not:V2SF (match_dup 3))
1396 : (match_operand:V2SF 1 "register_operand")))
1397 : (set (match_dup 5)
1398 : (and:V2SF (match_dup 3)
1399 : (match_operand:V2SF 2 "register_operand")))
1400 : (set (match_operand:V2SF 0 "register_operand")
1401 : (ior:V2SF (match_dup 4) (match_dup 5)))]
1402 : "TARGET_MMX_WITH_SSE"
1403 11 : {
1404 11 : operands[3] = ix86_build_signbit_mask (V2SFmode, true, false);
1405 :
1406 11 : operands[4] = gen_reg_rtx (V2SFmode);
1407 11 : operands[5] = gen_reg_rtx (V2SFmode);
1408 : })
1409 :
1410 : (define_expand "xorsignv2sf3"
1411 : [(set (match_dup 4)
1412 11 : (and:V2SF (match_dup 3)
1413 : (match_operand:V2SF 2 "register_operand")))
1414 : (set (match_operand:V2SF 0 "register_operand")
1415 : (xor:V2SF (match_dup 4)
1416 : (match_operand:V2SF 1 "register_operand")))]
1417 : "TARGET_MMX_WITH_SSE"
1418 12 : {
1419 1 : operands[3] = ix86_build_signbit_mask (V2SFmode, true, false);
1420 :
1421 1 : operands[4] = gen_reg_rtx (V2SFmode);
1422 : })
1423 156 :
1424 : (define_expand "signbitv2sf2"
1425 156 : [(set (match_operand:V2SI 0 "register_operand")
1426 157 : (lshiftrt:V2SI
1427 156 : (subreg:V2SI
1428 : (match_operand:V2SF 1 "register_operand") 0)
1429 : (match_dup 2)))]
1430 : "TARGET_MMX_WITH_SSE"
1431 2 : {
1432 1 : operands[1] = force_reg (V2SFmode, operands[1]);
1433 1 : operands[2] = GEN_INT (GET_MODE_UNIT_BITSIZE (V2SFmode)-1);
1434 : })
1435 :
1436 2 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1437 : ;;
1438 3 : ;; Parallel single-precision FMA multiply/accumulate instructions.
1439 2 : ;;
1440 2 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1441 :
1442 1 : (define_expand "fmav2sf4"
1443 : [(set (match_operand:V2SF 0 "register_operand")
1444 : (fma:V2SF
1445 : (match_operand:V2SF 1 "nonimmediate_operand")
1446 : (match_operand:V2SF 2 "nonimmediate_operand")
1447 1 : (match_operand:V2SF 3 "nonimmediate_operand")))]
1448 : "(TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL)
1449 1 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1450 748 : {
1451 748 : rtx op3 = gen_reg_rtx (V4SFmode);
1452 747 : rtx op2 = gen_reg_rtx (V4SFmode);
1453 747 : rtx op1 = gen_reg_rtx (V4SFmode);
1454 747 : rtx op0 = gen_reg_rtx (V4SFmode);
1455 :
1456 747 : emit_insn (gen_movq_v2sf_to_sse (op3, operands[3]));
1457 747 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
1458 747 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1459 :
1460 747 : emit_insn (gen_fmav4sf4 (op0, op1, op2, op3));
1461 :
1462 747 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1463 747 : DONE;
1464 : })
1465 :
1466 : (define_expand "fmsv2sf4"
1467 : [(set (match_operand:V2SF 0 "register_operand")
1468 : (fma:V2SF
1469 : (match_operand:V2SF 1 "nonimmediate_operand")
1470 : (match_operand:V2SF 2 "nonimmediate_operand")
1471 : (neg:V2SF
1472 : (match_operand:V2SF 3 "nonimmediate_operand"))))]
1473 : "(TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL)
1474 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1475 13 : {
1476 13 : rtx op3 = gen_reg_rtx (V4SFmode);
1477 426 : rtx op2 = gen_reg_rtx (V4SFmode);
1478 13 : rtx op1 = gen_reg_rtx (V4SFmode);
1479 426 : rtx op0 = gen_reg_rtx (V4SFmode);
1480 413 :
1481 426 : emit_insn (gen_movq_v2sf_to_sse (op3, operands[3]));
1482 13 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
1483 13 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1484 :
1485 13 : emit_insn (gen_fmsv4sf4 (op0, op1, op2, op3));
1486 :
1487 13 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1488 13 : DONE;
1489 : })
1490 :
1491 : (define_expand "fnmav2sf4"
1492 : [(set (match_operand:V2SF 0 "register_operand")
1493 : (fma:V2SF
1494 : (neg:V2SF
1495 : (match_operand:V2SF 1 "nonimmediate_operand"))
1496 : (match_operand:V2SF 2 "nonimmediate_operand")
1497 : (match_operand:V2SF 3 "nonimmediate_operand")))]
1498 : "(TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL)
1499 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1500 156 : {
1501 156 : rtx op3 = gen_reg_rtx (V4SFmode);
1502 156 : rtx op2 = gen_reg_rtx (V4SFmode);
1503 444 : rtx op1 = gen_reg_rtx (V4SFmode);
1504 156 : rtx op0 = gen_reg_rtx (V4SFmode);
1505 288 :
1506 444 : emit_insn (gen_movq_v2sf_to_sse (op3, operands[3]));
1507 156 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
1508 156 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1509 :
1510 156 : emit_insn (gen_fnmav4sf4 (op0, op1, op2, op3));
1511 :
1512 156 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1513 156 : DONE;
1514 : })
1515 :
1516 : (define_expand "fnmsv2sf4"
1517 : [(set (match_operand:V2SF 0 "register_operand" "=v,v,x")
1518 : (fma:V2SF
1519 : (neg:V2SF
1520 : (match_operand:V2SF 1 "nonimmediate_operand"))
1521 : (match_operand:V2SF 2 "nonimmediate_operand")
1522 : (neg:V2SF
1523 : (match_operand:V2SF 3 "nonimmediate_operand"))))]
1524 : "(TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL)
1525 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1526 2 : {
1527 2 : rtx op3 = gen_reg_rtx (V4SFmode);
1528 114 : rtx op2 = gen_reg_rtx (V4SFmode);
1529 2 : rtx op1 = gen_reg_rtx (V4SFmode);
1530 114 : rtx op0 = gen_reg_rtx (V4SFmode);
1531 112 :
1532 2 : emit_insn (gen_movq_v2sf_to_sse (op3, operands[3]));
1533 2 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
1534 2 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1535 :
1536 2 : emit_insn (gen_fnmsv4sf4 (op0, op1, op2, op3));
1537 :
1538 2 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1539 2 : DONE;
1540 : })
1541 :
1542 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1543 : ;;
1544 : ;; Parallel single-precision floating point conversion operations
1545 : ;;
1546 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1547 :
1548 : (define_expand "fix_truncv2sfv2si2"
1549 : [(set (match_operand:V2SI 0 "register_operand")
1550 : (fix:V2SI (match_operand:V2SF 1 "nonimmediate_operand")))]
1551 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1552 82 : {
1553 82 : rtx op1 = gen_reg_rtx (V4SFmode);
1554 82 : rtx op0 = gen_reg_rtx (V4SImode);
1555 1100 :
1556 82 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1557 1100 :
1558 1182 : emit_insn (gen_fix_truncv4sfv4si2 (op0, op1));
1559 :
1560 82 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
1561 82 : DONE;
1562 : })
1563 :
1564 : (define_expand "fixuns_truncv2sfv2si2"
1565 : [(set (match_operand:V2SI 0 "register_operand")
1566 : (unsigned_fix:V2SI (match_operand:V2SF 1 "nonimmediate_operand")))]
1567 : "TARGET_AVX512VL && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1568 1 : {
1569 1 : rtx op1 = gen_reg_rtx (V4SFmode);
1570 1 : rtx op0 = gen_reg_rtx (V4SImode);
1571 :
1572 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1573 :
1574 6 : emit_insn (gen_fixuns_truncv4sfv4si2 (op0, op1));
1575 :
1576 6 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
1577 6 : DONE;
1578 5 : })
1579 :
1580 : (define_insn "mmx_fix_truncv2sfv2si2"
1581 : [(set (match_operand:V2SI 0 "register_operand" "=y")
1582 : (fix:V2SI (match_operand:V2SF 1 "nonimmediate_operand" "ym")))
1583 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
1584 : "TARGET_3DNOW"
1585 : "pf2id\t{%1, %0|%0, %1}"
1586 : [(set_attr "type" "mmxcvt")
1587 : (set_attr "prefix_extra" "1")
1588 : (set_attr "mode" "V2SF")])
1589 :
1590 21 : (define_expand "floatv2siv2sf2"
1591 : [(set (match_operand:V2SF 0 "register_operand")
1592 21 : (float:V2SF (match_operand:V2SI 1 "nonimmediate_operand")))]
1593 21 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1594 434 : {
1595 413 : rtx op1 = gen_reg_rtx (V4SImode);
1596 413 : rtx op0 = gen_reg_rtx (V4SFmode);
1597 :
1598 413 : emit_insn (gen_movq_v2si_to_sse (op1, operands[1]));
1599 :
1600 413 : emit_insn (gen_floatv4siv4sf2 (op0, op1));
1601 :
1602 413 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1603 413 : DONE;
1604 : })
1605 :
1606 : (define_expand "floatunsv2siv2sf2"
1607 : [(set (match_operand:V2SF 0 "register_operand")
1608 : (unsigned_float:V2SF (match_operand:V2SI 1 "nonimmediate_operand")))]
1609 : "TARGET_AVX512VL && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1610 5 : {
1611 5 : rtx op1 = gen_reg_rtx (V4SImode);
1612 5 : rtx op0 = gen_reg_rtx (V4SFmode);
1613 :
1614 5 : emit_insn (gen_movq_v2si_to_sse (op1, operands[1]));
1615 :
1616 2633 : emit_insn (gen_floatunsv4siv4sf2 (op0, op1));
1617 :
1618 2633 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1619 2633 : DONE;
1620 2628 : })
1621 :
1622 : (define_insn "mmx_floatv2siv2sf2"
1623 : [(set (match_operand:V2SF 0 "register_operand" "=y")
1624 : (float:V2SF (match_operand:V2SI 1 "nonimmediate_operand" "ym")))
1625 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
1626 : "TARGET_3DNOW"
1627 : "pi2fd\t{%1, %0|%0, %1}"
1628 : [(set_attr "type" "mmxcvt")
1629 : (set_attr "prefix_extra" "1")
1630 : (set_attr "mode" "V2SF")])
1631 :
1632 1 : (define_insn "mmx_pf2iw"
1633 : [(set (match_operand:V2SI 0 "register_operand" "=y")
1634 1 : (sign_extend:V2SI
1635 1 : (ss_truncate:V2HI
1636 1 : (fix:V2SI
1637 : (match_operand:V2SF 1 "nonimmediate_operand" "ym")))))]
1638 216 : "TARGET_3DNOW_A"
1639 : "pf2iw\t{%1, %0|%0, %1}"
1640 : [(set_attr "type" "mmxcvt")
1641 : (set_attr "prefix_extra" "1")
1642 847288 : (set_attr "mode" "V2SF")])
1643 :
1644 : (define_insn "mmx_pi2fw"
1645 847288 : [(set (match_operand:V2SF 0 "register_operand" "=y")
1646 : (float:V2SF
1647 : (sign_extend:V2SI
1648 : (truncate:V2HI
1649 : (match_operand:V2SI 1 "nonimmediate_operand" "ym")))))]
1650 : "TARGET_3DNOW_A"
1651 : "pi2fw\t{%1, %0|%0, %1}"
1652 : [(set_attr "type" "mmxcvt")
1653 : (set_attr "prefix_extra" "1")
1654 : (set_attr "mode" "V2SF")])
1655 :
1656 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1657 : ;;
1658 : ;; Parallel single-precision floating point element swizzling
1659 : ;;
1660 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1661 :
1662 : (define_insn "mmx_pswapdv2sf2"
1663 : [(set (match_operand:V2SF 0 "register_operand" "=y,x,Yv")
1664 : (vec_select:V2SF
1665 : (match_operand:V2SF 1 "register_mmxmem_operand" "ym,0,Yv")
1666 : (parallel [(const_int 1) (const_int 0)])))]
1667 7224 : "TARGET_3DNOW_A || TARGET_MMX_WITH_SSE"
1668 : "@
1669 : pswapd\t{%1, %0|%0, %1}
1670 : shufps\t{$0xe1, %1, %0|%0, %1, 0xe1}
1671 477087 : vshufps\t{$0xe1, %1, %1, %0|%0, %1, %1, 0xe1}"
1672 : [(set_attr "isa" "*,sse_noavx,avx")
1673 : (set_attr "mmx_isa" "native,*,*")
1674 477087 : (set_attr "type" "mmxcvt,ssemov,ssemov")
1675 : (set_attr "prefix_extra" "1,*,*")
1676 : (set_attr "mode" "V2SF,V4SF,V4SF")])
1677 :
1678 : (define_insn "*mmx_movshdup"
1679 : [(set (match_operand:V2SF 0 "register_operand" "=v,x")
1680 : (vec_select:V2SF
1681 : (match_operand:V2SF 1 "register_operand" "v,0")
1682 : (parallel [(const_int 1) (const_int 1)])))]
1683 : "TARGET_MMX_WITH_SSE"
1684 : "@
1685 : %vmovshdup\t{%1, %0|%0, %1}
1686 : shufps\t{$0xe5, %0, %0|%0, %0, 0xe5}"
1687 : [(set_attr "isa" "sse3,*")
1688 : (set_attr "type" "sse,sseshuf1")
1689 : (set_attr "length_immediate" "*,1")
1690 : (set_attr "prefix_rep" "1,*")
1691 : (set_attr "prefix" "maybe_vex,orig")
1692 : (set_attr "mode" "V4SF")])
1693 :
1694 : (define_insn "*mmx_movsldup"
1695 : [(set (match_operand:V2SF 0 "register_operand" "=v,x")
1696 : (vec_select:V2SF
1697 : (match_operand:V2SF 1 "register_operand" "v,0")
1698 : (parallel [(const_int 0) (const_int 0)])))]
1699 : "TARGET_MMX_WITH_SSE"
1700 : "@
1701 : %vmovsldup\t{%1, %0|%0, %1}
1702 : shufps\t{$0xe0, %0, %0|%0, %0, 0xe0}"
1703 : [(set_attr "isa" "sse3,*")
1704 : (set_attr "type" "sse,sseshuf1")
1705 : (set_attr "length_immediate" "*,1")
1706 : (set_attr "prefix_rep" "1,*")
1707 : (set_attr "prefix" "maybe_vex,orig")
1708 : (set_attr "mode" "V4SF")])
1709 :
1710 : (define_insn_and_split "*vec_interleave_lowv2sf"
1711 : [(set (match_operand:V2SF 0 "register_operand" "=x,v")
1712 : (vec_select:V2SF
1713 : (vec_concat:V4SF
1714 : (match_operand:V2SF 1 "register_operand" "0,v")
1715 : (match_operand:V2SF 2 "register_operand" "x,v"))
1716 : (parallel [(const_int 0) (const_int 2)])))]
1717 : "TARGET_MMX_WITH_SSE"
1718 : "#"
1719 : "&& reload_completed"
1720 : [(const_int 0)]
1721 288 : "ix86_split_mmx_punpck (operands, false); DONE;"
1722 : [(set_attr "isa" "noavx,avx")
1723 : (set_attr "type" "sselog")
1724 : (set_attr "prefix" "orig,maybe_evex")
1725 : (set_attr "mode" "V4SF")])
1726 :
1727 : (define_insn_and_split "*vec_interleave_highv2sf"
1728 : [(set (match_operand:V2SF 0 "register_operand" "=x,v")
1729 : (vec_select:V2SF
1730 : (vec_concat:V4SF
1731 : (match_operand:V2SF 1 "register_operand" "0,v")
1732 : (match_operand:V2SF 2 "register_operand" "x,v"))
1733 83 : (parallel [(const_int 1) (const_int 3)])))]
1734 : "TARGET_MMX_WITH_SSE"
1735 83 : "#"
1736 83 : "&& reload_completed"
1737 : [(const_int 0)]
1738 112 : "ix86_split_mmx_punpck (operands, true); DONE;"
1739 : [(set_attr "isa" "noavx,avx")
1740 : (set_attr "type" "sselog")
1741 : (set_attr "prefix" "orig,vex")
1742 : (set_attr "mode" "V4SF")])
1743 :
1744 : (define_insn "*vec_dupv2sf"
1745 : [(set (match_operand:V2SF 0 "register_operand" "=y,Yv,x")
1746 : (vec_duplicate:V2SF
1747 : (match_operand:SF 1 "register_operand" "0,Yv,0")))]
1748 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
1749 3221 : "@
1750 : punpckldq\t%0, %0
1751 3221 : %vmovsldup\t{%1, %0|%0, %1}
1752 3221 : shufps\t{$0xe0, %0, %0|%0, %0, 0xe0}"
1753 3221 : [(set_attr "isa" "*,sse3,sse_noavx")
1754 : (set_attr "mmx_isa" "native,*,*")
1755 : (set_attr "type" "mmxcvt,sse,sseshuf1")
1756 : (set_attr "length_immediate" "*,*,1")
1757 : (set_attr "prefix_rep" "*,1,*")
1758 : (set_attr "prefix" "*,maybe_vex,orig")
1759 : (set_attr "mode" "DI,V4SF,V4SF")])
1760 :
1761 : (define_insn "*mmx_movss_<mode>"
1762 : [(set (match_operand:V2FI 0 "register_operand" "=x,v")
1763 : (vec_merge:V2FI
1764 : (match_operand:V2FI 2 "register_operand" " x,v")
1765 : (match_operand:V2FI 1 "register_operand" " 0,v")
1766 : (const_int 1)))]
1767 : "TARGET_MMX_WITH_SSE"
1768 : "@
1769 : movss\t{%2, %0|%0, %2}
1770 : vmovss\t{%2, %1, %0|%0, %1, %2}"
1771 : [(set_attr "isa" "noavx,avx")
1772 : (set_attr "type" "ssemov")
1773 : (set_attr "prefix" "orig,maybe_evex")
1774 : (set_attr "mode" "SF")])
1775 :
1776 : (define_insn "*mmx_concatv2sf"
1777 : [(set (match_operand:V2SF 0 "register_operand" "=y,y")
1778 : (vec_concat:V2SF
1779 : (match_operand:SF 1 "nonimmediate_operand" " 0,rm")
1780 : (match_operand:SF 2 "nonimm_or_0_operand" "ym,C")))]
1781 310699 : "TARGET_MMX && !TARGET_SSE"
1782 : "@
1783 : punpckldq\t{%2, %0|%0, %2}
1784 : movd\t{%1, %0|%0, %1}"
1785 48488 : [(set_attr "type" "mmxcvt,mmxmov")
1786 : (set_attr "mode" "DI")])
1787 :
1788 48488 : (define_expand "vec_setv2sf"
1789 : [(match_operand:V2SF 0 "register_operand")
1790 : (match_operand:SF 1 "register_operand")
1791 : (match_operand 2 "vec_setm_mmx_operand")]
1792 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
1793 21 : {
1794 21 : if (CONST_INT_P (operands[2]))
1795 19 : ix86_expand_vector_set (TARGET_MMX_WITH_SSE, operands[0], operands[1],
1796 19 : INTVAL (operands[2]));
1797 : else
1798 2 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
1799 21 : DONE;
1800 : })
1801 :
1802 : ;; Avoid combining registers from different units in a single alternative,
1803 : ;; see comment above inline_secondary_memory_needed function in i386.cc
1804 : (define_insn_and_split "*vec_extractv2sf_0"
1805 : [(set (match_operand:SF 0 "nonimmediate_operand" "=x, m,y ,m,f,r")
1806 : (vec_select:SF
1807 : (match_operand:V2SF 1 "nonimmediate_operand" " xm,x,ym,y,m,m")
1808 : (parallel [(const_int 0)])))]
1809 230 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
1810 84973 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1811 : "#"
1812 7120 : "&& reload_completed"
1813 : [(set (match_dup 0) (match_dup 1))]
1814 14409 : "operands[1] = gen_lowpart (SFmode, operands[1]);"
1815 1 : [(set_attr "mmx_isa" "*,*,native,native,*,*")])
1816 13704 :
1817 14408 : ;; Avoid combining registers from different units in a single alternative,
1818 : ;; see comment above inline_secondary_memory_needed function in i386.cc
1819 13703 : (define_insn "*vec_extractv2sf_1"
1820 1100 : [(set (match_operand:SF 0 "nonimmediate_operand" "=y,x,x,y,x,f,r")
1821 : (vec_select:SF
1822 : (match_operand:V2SF 1 "nonimmediate_operand" " 0,x,0,o,o,o,o")
1823 : (parallel [(const_int 1)])))]
1824 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
1825 1 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1826 : "@
1827 1 : punpckhdq\t%0, %0
1828 1 : %vmovshdup\t{%1, %0|%0, %1}
1829 1 : shufps\t{$0xe5, %0, %0|%0, %0, 0xe5}
1830 : #
1831 : #
1832 : #
1833 : #"
1834 : [(set_attr "isa" "*,sse3,noavx,*,*,*,*")
1835 : (set_attr "mmx_isa" "native,*,*,native,*,*,*")
1836 : (set_attr "type" "mmxcvt,sse,sseshuf1,mmxmov,ssemov,fmov,imov")
1837 : (set (attr "length_immediate")
1838 : (if_then_else (eq_attr "alternative" "2")
1839 : (const_string "1")
1840 : (const_string "*")))
1841 : (set (attr "prefix_rep")
1842 : (if_then_else (eq_attr "alternative" "1")
1843 : (const_string "1")
1844 : (const_string "*")))
1845 : (set_attr "prefix" "orig,maybe_vex,orig,orig,orig,orig,orig")
1846 : (set_attr "mode" "DI,V4SF,V4SF,SF,SF,SF,SF")])
1847 :
1848 : (define_split
1849 : [(set (match_operand:SF 0 "register_operand")
1850 : (vec_select:SF
1851 : (match_operand:V2SF 1 "memory_operand")
1852 : (parallel [(const_int 1)])))]
1853 137 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && reload_completed"
1854 : [(set (match_dup 0) (match_dup 1))]
1855 83 : "operands[1] = adjust_address (operands[1], SFmode, 4);")
1856 :
1857 10114 : (define_expand "vec_extractv2sfsf"
1858 83 : [(match_operand:SF 0 "register_operand")
1859 : (match_operand:V2SF 1 "register_operand")
1860 10114 : (match_operand 2 "const_int_operand")]
1861 83 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
1862 3221 : {
1863 3221 : ix86_expand_vector_extract (TARGET_MMX_WITH_SSE, operands[0],
1864 3221 : operands[1], INTVAL (operands[2]));
1865 3221 : DONE;
1866 1 : })
1867 :
1868 1 : (define_expand "vec_initv2sfsf"
1869 1 : [(match_operand:V2SF 0 "register_operand")
1870 1 : (match_operand 1)]
1871 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE"
1872 2628 : {
1873 2628 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
1874 : operands[1]);
1875 2628 : DONE;
1876 : })
1877 :
1878 2 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1879 : ;;
1880 2 : ;; Parallel single-precision floating point rounding operations.
1881 2 : ;;
1882 2 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1883 :
1884 : (define_expand "nearbyintv2sf2"
1885 : [(match_operand:V2SF 0 "register_operand")
1886 : (match_operand:V2SF 1 "nonimmediate_operand")]
1887 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1888 2 : {
1889 1 : rtx op1 = gen_reg_rtx (V4SFmode);
1890 2 : rtx op0 = gen_reg_rtx (V4SFmode);
1891 1 :
1892 2 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1893 :
1894 1 : emit_insn (gen_nearbyintv4sf2 (op0, op1));
1895 :
1896 1 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1897 1 : DONE;
1898 : })
1899 :
1900 : (define_expand "rintv2sf2"
1901 : [(match_operand:V2SF 0 "register_operand")
1902 : (match_operand:V2SF 1 "nonimmediate_operand")]
1903 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1904 1 : {
1905 1 : rtx op1 = gen_reg_rtx (V4SFmode);
1906 1 : rtx op0 = gen_reg_rtx (V4SFmode);
1907 :
1908 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1909 :
1910 2 : emit_insn (gen_rintv4sf2 (op0, op1));
1911 :
1912 2 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1913 2 : DONE;
1914 1 : })
1915 :
1916 : (define_expand "lrintv2sfv2si2"
1917 : [(match_operand:V2SI 0 "register_operand")
1918 : (match_operand:V2SF 1 "nonimmediate_operand")]
1919 : "TARGET_SSE4_1 && !flag_trapping_math
1920 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1921 1 : {
1922 1 : rtx op1 = gen_reg_rtx (V4SFmode);
1923 1 : rtx op0 = gen_reg_rtx (V4SImode);
1924 :
1925 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1926 1 :
1927 1 : emit_insn (gen_lrintv4sfv4si2 (op0, op1));
1928 1 :
1929 2 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
1930 2 : DONE;
1931 : })
1932 :
1933 : (define_expand "ceilv2sf2"
1934 : [(match_operand:V2SF 0 "register_operand")
1935 : (match_operand:V2SF 1 "nonimmediate_operand")]
1936 : "TARGET_SSE4_1 && !flag_trapping_math
1937 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1938 1 : {
1939 1 : rtx op1 = gen_reg_rtx (V4SFmode);
1940 1 : rtx op0 = gen_reg_rtx (V4SFmode);
1941 :
1942 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1943 1 :
1944 1 : emit_insn (gen_ceilv4sf2 (op0, op1));
1945 1 :
1946 2 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1947 2 : DONE;
1948 : })
1949 :
1950 : (define_expand "lceilv2sfv2si2"
1951 : [(match_operand:V2SI 0 "register_operand")
1952 : (match_operand:V2SF 1 "nonimmediate_operand")]
1953 : "TARGET_SSE4_1 && !flag_trapping_math
1954 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1955 1 : {
1956 1 : rtx op1 = gen_reg_rtx (V4SFmode);
1957 1 : rtx op0 = gen_reg_rtx (V4SImode);
1958 :
1959 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1960 1 :
1961 1 : emit_insn (gen_lceilv4sfv4si2 (op0, op1));
1962 1 :
1963 2 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
1964 28 : DONE;
1965 : })
1966 :
1967 : (define_expand "floorv2sf2"
1968 : [(match_operand:V2SF 0 "register_operand")
1969 : (match_operand:V2SF 1 "nonimmediate_operand")]
1970 : "TARGET_SSE4_1 && !flag_trapping_math
1971 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1972 2 : {
1973 2 : rtx op1 = gen_reg_rtx (V4SFmode);
1974 2 : rtx op0 = gen_reg_rtx (V4SFmode);
1975 :
1976 2 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1977 8 :
1978 2 : emit_insn (gen_floorv4sf2 (op0, op1));
1979 8 :
1980 10 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1981 10 : DONE;
1982 : })
1983 :
1984 : (define_expand "lfloorv2sfv2si2"
1985 : [(match_operand:V2SI 0 "register_operand")
1986 : (match_operand:V2SF 1 "nonimmediate_operand")]
1987 : "TARGET_SSE4_1 && !flag_trapping_math
1988 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1989 1 : {
1990 1 : rtx op1 = gen_reg_rtx (V4SFmode);
1991 1 : rtx op0 = gen_reg_rtx (V4SImode);
1992 :
1993 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1994 122 :
1995 1 : emit_insn (gen_lfloorv4sfv4si2 (op0, op1));
1996 122 :
1997 123 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
1998 123 : DONE;
1999 : })
2000 :
2001 : (define_expand "btruncv2sf2"
2002 : [(match_operand:V2SF 0 "register_operand")
2003 : (match_operand:V2SF 1 "nonimmediate_operand")]
2004 : "TARGET_SSE4_1 && !flag_trapping_math
2005 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
2006 1 : {
2007 1 : rtx op1 = gen_reg_rtx (V4SFmode);
2008 1 : rtx op0 = gen_reg_rtx (V4SFmode);
2009 :
2010 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
2011 0 :
2012 1 : emit_insn (gen_btruncv4sf2 (op0, op1));
2013 0 :
2014 1 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
2015 1 : DONE;
2016 : })
2017 :
2018 : (define_expand "roundv2sf2"
2019 : [(match_operand:V2SF 0 "register_operand")
2020 : (match_operand:V2SF 1 "nonimmediate_operand")]
2021 : "TARGET_SSE4_1 && !flag_trapping_math
2022 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
2023 1 : {
2024 1 : rtx op1 = gen_reg_rtx (V4SFmode);
2025 1 : rtx op0 = gen_reg_rtx (V4SFmode);
2026 :
2027 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
2028 4 :
2029 1 : emit_insn (gen_roundv4sf2 (op0, op1));
2030 4 :
2031 5 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
2032 5 : DONE;
2033 : })
2034 :
2035 : (define_expand "lroundv2sfv2si2"
2036 : [(match_operand:V2SI 0 "register_operand")
2037 : (match_operand:V2SF 1 "nonimmediate_operand")]
2038 : "TARGET_SSE4_1 && !flag_trapping_math
2039 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
2040 1 : {
2041 1 : rtx op1 = gen_reg_rtx (V4SFmode);
2042 1 : rtx op0 = gen_reg_rtx (V4SImode);
2043 :
2044 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
2045 5 :
2046 1 : emit_insn (gen_lroundv4sfv4si2 (op0, op1));
2047 5 :
2048 6 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
2049 1 : DONE;
2050 : })
2051 :
2052 5 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2053 : ;;
2054 : ;; Parallel half-precision floating point arithmetic
2055 : ;;
2056 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2057 12 :
2058 : (define_mode_iterator VHF_32_64 [V2HF (V4HF "TARGET_MMX_WITH_SSE")])
2059 12 :
2060 12 : (define_mode_iterator VBF_32_64 [V2BF (V4BF "TARGET_MMX_WITH_SSE")])
2061 12 :
2062 0 : (define_expand "divv4hf3"
2063 : [(set (match_operand:V4HF 0 "register_operand")
2064 0 : (div:V4HF
2065 0 : (match_operand:V4HF 1 "nonimmediate_operand")
2066 : (match_operand:V4HF 2 "register_operand")))]
2067 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math
2068 : && TARGET_MMX_WITH_SSE"
2069 8 : {
2070 8 : rtx op2 = gen_reg_rtx (V8HFmode);
2071 8 : rtx op1 = gen_reg_rtx (V8HFmode);
2072 8 : rtx op0 = gen_reg_rtx (V8HFmode);
2073 :
2074 12 : emit_insn (gen_movq_v4hf_to_sse (op1, operands[1]));
2075 8 : rtx tmp = gen_rtx_VEC_CONCAT (V8HFmode, operands[2],
2076 4 : force_reg (V4HFmode, CONST1_RTX (V4HFmode)));
2077 12 : emit_insn (gen_rtx_SET (op2, tmp));
2078 12 : emit_insn (gen_divv8hf3 (op0, op1, op2));
2079 8 : emit_move_insn (operands[0], lowpart_subreg (V4HFmode, op0, V8HFmode));
2080 8 : DONE;
2081 : })
2082 :
2083 : (define_mode_attr mov_to_sse_suffix
2084 : [(V2HF "d") (V4HF "q") (V2HI "d") (V4HI "q")])
2085 :
2086 : (define_mode_attr mmxxmmmode
2087 : [(V2HF "V8HF") (V2HI "V8HI") (V2BF "V8BF")
2088 : (V4HF "V8HF") (V4HI "V8HI") (V4BF "V8BF")
2089 : (V2SF "V4SF") (V2SI "V4SI")])
2090 :
2091 : (define_mode_attr mmxxmmmodelower
2092 : [(V2HF "v8hf") (V2HI "v8hi") (V2BF "v8bf")
2093 : (V4HF "v8hf") (V4HI "v8hi") (V4BF "v8bf")
2094 4 : (V2SF "v4sf") (V2SI "v4si")])
2095 :
2096 4 : (define_expand "movd_<mode>_to_sse"
2097 4 : [(set (match_operand:<mmxxmmmode> 0 "register_operand")
2098 4 : (vec_merge:<mmxxmmmode>
2099 : (vec_duplicate:<mmxxmmmode>
2100 : (match_operand:V2FI_32 1 "nonimmediate_operand"))
2101 : (match_dup 2)
2102 : (const_int 3)))]
2103 : "TARGET_SSE"
2104 126 : {
2105 126 : if (!flag_trapping_math)
2106 : {
2107 13 : rtx op1 = force_reg (<MODE>mode, operands[1]);
2108 13 : emit_move_insn (operands[0],
2109 : lowpart_subreg (<mmxxmmmode>mode, op1, <MODE>mode));
2110 13 : DONE;
2111 : }
2112 113 : operands[2] = CONST0_RTX (<mmxxmmmode>mode);
2113 : })
2114 :
2115 : (define_expand "movd_<mode>_to_sse_reg"
2116 : [(set (match_operand:<mmxxmmmode> 0 "register_operand")
2117 113 : (vec_merge:<mmxxmmmode>
2118 : (vec_duplicate:<mmxxmmmode>
2119 : (match_operand:V2FI_32 1 "nonimmediate_operand"))
2120 : (match_operand:<mmxxmmmode> 2 "register_operand")
2121 113 : (const_int 3)))]
2122 : "TARGET_SSE")
2123 :
2124 : (define_expand "<insn><mode>3"
2125 : [(set (match_operand:VHF_32_64 0 "register_operand")
2126 13 : (plusminusmult:VHF_32_64
2127 : (match_operand:VHF_32_64 1 "nonimmediate_operand")
2128 13 : (match_operand:VHF_32_64 2 "nonimmediate_operand")))]
2129 13 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2130 37 : {
2131 41 : rtx op2 = gen_reg_rtx (V8HFmode);
2132 37 : rtx op1 = gen_reg_rtx (V8HFmode);
2133 37 : rtx op0 = gen_reg_rtx (V8HFmode);
2134 :
2135 37 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op2, operands[2]));
2136 37 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2137 37 : emit_insn (gen_<insn>v8hf3 (op0, op1, op2));
2138 4 :
2139 37 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2140 37 : DONE;
2141 4 : })
2142 4 :
2143 : ;; VDIVNEPBF16 does not generate floating point exceptions.
2144 : (define_expand "<insn><mode>3"
2145 : [(set (match_operand:VBF_32_64 0 "register_operand")
2146 : (plusminusmultdiv:VBF_32_64
2147 : (match_operand:VBF_32_64 1 "nonimmediate_operand")
2148 : (match_operand:VBF_32_64 2 "nonimmediate_operand")))]
2149 : "TARGET_AVX10_2"
2150 10 : {
2151 20 : rtx op0 = gen_reg_rtx (V8BFmode);
2152 10 : rtx op1 = lowpart_subreg (V8BFmode,
2153 : force_reg (<MODE>mode, operands[1]), <MODE>mode);
2154 10 : rtx op2 = lowpart_subreg (V8BFmode,
2155 : force_reg (<MODE>mode, operands[2]), <MODE>mode);
2156 7 :
2157 17 : emit_insn (gen_<insn>v8bf3 (op0, op1, op2));
2158 7 :
2159 10 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8BFmode));
2160 10 : DONE;
2161 : })
2162 :
2163 : (define_expand "divv2hf3"
2164 : [(set (match_operand:V2HF 0 "register_operand")
2165 : (div:V2HF
2166 : (match_operand:V2HF 1 "nonimmediate_operand")
2167 : (match_operand:V2HF 2 "nonimmediate_operand")))]
2168 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2169 5 : {
2170 10 : rtx op2 = gen_reg_rtx (V8HFmode);
2171 5 : rtx op1 = gen_reg_rtx (V8HFmode);
2172 5 : rtx op0 = gen_reg_rtx (V8HFmode);
2173 :
2174 13 : emit_insn (gen_movd_v2hf_to_sse_reg (op2, operands[2],
2175 : force_reg (V8HFmode, CONST1_RTX (V8HFmode))));
2176 13 : emit_insn (gen_movd_v2hf_to_sse (op1, operands[1]));
2177 18 : emit_insn (gen_divv8hf3 (op0, op1, op2));
2178 11 :
2179 5 : emit_move_insn (operands[0], lowpart_subreg (V2HFmode, op0, V8HFmode));
2180 5 : DONE;
2181 : })
2182 :
2183 : (define_expand "<code><mode>3"
2184 : [(set (match_operand:VHF_32_64 0 "register_operand")
2185 : (smaxmin:VHF_32_64
2186 : (match_operand:VHF_32_64 1 "nonimmediate_operand")
2187 : (match_operand:VHF_32_64 2 "nonimmediate_operand")))]
2188 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2189 4 : {
2190 4 : rtx op2 = gen_reg_rtx (V8HFmode);
2191 4 : rtx op1 = gen_reg_rtx (V8HFmode);
2192 4 : rtx op0 = gen_reg_rtx (V8HFmode);
2193 :
2194 5 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op2, operands[2]));
2195 4 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2196 1 :
2197 5 : emit_insn (gen_<code>v8hf3 (op0, op1, op2));
2198 1 :
2199 4 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2200 4 : DONE;
2201 : })
2202 :
2203 : (define_expand "<code><mode>3"
2204 : [(set (match_operand:VBF_32_64 0 "register_operand")
2205 : (smaxmin:VBF_32_64
2206 : (match_operand:VBF_32_64 1 "nonimmediate_operand")
2207 : (match_operand:VBF_32_64 2 "nonimmediate_operand")))]
2208 : "TARGET_AVX10_2"
2209 4 : {
2210 6 : rtx op0 = gen_reg_rtx (V8BFmode);
2211 4 : rtx op1 = lowpart_subreg (V8BFmode,
2212 : force_reg (<MODE>mode, operands[1]), <MODE>mode);
2213 4 : rtx op2 = lowpart_subreg (V8BFmode,
2214 4 : force_reg (<MODE>mode, operands[2]), <MODE>mode);
2215 :
2216 6 : emit_insn (gen_<code>v8bf3 (op0, op1, op2));
2217 4 :
2218 8 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8BFmode));
2219 4 : DONE;
2220 : })
2221 :
2222 : (define_expand "sqrt<mode>2"
2223 : [(set (match_operand:VHF_32_64 0 "register_operand")
2224 : (sqrt:VHF_32_64
2225 : (match_operand:VHF_32_64 1 "nonimmediate_operand")))]
2226 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2227 2 : {
2228 2 : rtx op1 = gen_reg_rtx (V8HFmode);
2229 2 : rtx op0 = gen_reg_rtx (V8HFmode);
2230 :
2231 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2232 2 : emit_insn (gen_sqrtv8hf2 (op0, op1));
2233 4 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2234 2 : DONE;
2235 2 : })
2236 2 :
2237 2 : (define_expand "sqrt<mode>2"
2238 : [(set (match_operand:VBF_32_64 0 "register_operand")
2239 : (sqrt:VBF_32_64 (match_operand:VBF_32_64 1 "vector_operand")))]
2240 : "TARGET_AVX10_2"
2241 0 : {
2242 0 : rtx op0 = gen_reg_rtx (V8BFmode);
2243 0 : rtx op1 = lowpart_subreg (V8BFmode,
2244 : force_reg (<MODE>mode, operands[1]), <MODE>mode);
2245 :
2246 0 : emit_insn (gen_sqrtv8bf2 (op0, op1));
2247 2 :
2248 0 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8BFmode));
2249 2 : DONE;
2250 2 : })
2251 2 :
2252 : (define_mode_iterator VHBF_32_64
2253 69 : [V2BF (V4BF "TARGET_MMX_WITH_SSE")
2254 : V2HF (V4HF "TARGET_MMX_WITH_SSE")])
2255 :
2256 : (define_expand "<code><mode>2"
2257 1236 : [(set (match_operand:VHBF_32_64 0 "register_operand")
2258 : (absneg:VHBF_32_64
2259 : (match_operand:VHBF_32_64 1 "register_operand")))]
2260 1236 : "TARGET_SSE"
2261 11 : "ix86_expand_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
2262 2 :
2263 1 : (define_insn_and_split "*mmx_<code><mode>"
2264 2 : [(set (match_operand:VHBF_32_64 0 "register_operand" "=x,x,x")
2265 3 : (absneg:VHBF_32_64
2266 3 : (match_operand:VHBF_32_64 1 "register_operand" "0,x,x")))
2267 : (use (match_operand:VHBF_32_64 2 "register_operand" "x,0,x"))]
2268 10 : "TARGET_SSE"
2269 : "#"
2270 10 : "&& reload_completed"
2271 : [(set (match_dup 0)
2272 : (<absneg_op>:<MODE> (match_dup 1) (match_dup 2)))]
2273 16 : {
2274 137 : if (!TARGET_AVX && operands_match_p (operands[0], operands[2]))
2275 6 : std::swap (operands[1], operands[2]);
2276 12 : }
2277 138 : [(set_attr "isa" "noavx,noavx,avx")])
2278 :
2279 11 : (define_insn_and_split "*mmx_nabs<mode>2"
2280 : [(set (match_operand:VHBF_32_64 0 "register_operand" "=x,x,x")
2281 : (neg:VHBF_32_64
2282 : (abs:VHBF_32_64
2283 11 : (match_operand:VHBF_32_64 1 "register_operand" "0,x,x"))))
2284 : (use (match_operand:VHBF_32_64 2 "register_operand" "x,0,x"))]
2285 : "TARGET_SSE"
2286 : "#"
2287 : "&& reload_completed"
2288 39 : [(set (match_dup 0)
2289 3 : (ior:<MODE> (match_dup 1) (match_dup 2)))])
2290 39 :
2291 42 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2292 3 : ;;
2293 0 : ;; Parallel half-precision floating point comparisons
2294 : ;;
2295 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2296 :
2297 0 : (define_expand "vec_cmpv4hfqi"
2298 : [(set (match_operand:QI 0 "register_operand")
2299 : (match_operator:QI 1 ""
2300 : [(match_operand:V4HF 2 "nonimmediate_operand")
2301 : (match_operand:V4HF 3 "nonimmediate_operand")]))]
2302 18 : "TARGET_MMX_WITH_SSE && TARGET_AVX512FP16 && TARGET_AVX512VL
2303 : && ix86_partial_vec_fp_math"
2304 35 : {
2305 35 : rtx ops[4];
2306 35 : ops[3] = gen_reg_rtx (V8HFmode);
2307 17 : ops[2] = gen_reg_rtx (V8HFmode);
2308 :
2309 17 : emit_insn (gen_movq_v4hf_to_sse (ops[3], operands[3]));
2310 17 : emit_insn (gen_movq_v4hf_to_sse (ops[2], operands[2]));
2311 17 : emit_insn (gen_vec_cmpv8hfqi (operands[0], operands[1], ops[2], ops[3]));
2312 17 : DONE;
2313 : })
2314 :
2315 : (define_expand "vcond_mask_<mode>v4hi"
2316 : [(set (match_operand:V4F_64 0 "register_operand")
2317 : (vec_merge:V4F_64
2318 : (match_operand:V4F_64 1 "vector_or_const_vector_operand")
2319 : (match_operand:V4F_64 2 "vector_or_const_vector_operand")
2320 : (match_operand:V4HI 3 "register_operand")))]
2321 : "TARGET_MMX_WITH_SSE && TARGET_SSE4_1"
2322 18 : {
2323 18 : ix86_expand_sse_movcc (operands[0], operands[3],
2324 : operands[1], operands[2]);
2325 18 : DONE;
2326 0 : })
2327 :
2328 0 : (define_expand "vcond_mask_<mode>qi"
2329 0 : [(set (match_operand:V4FI_64 0 "register_operand")
2330 0 : (vec_merge:V4FI_64
2331 : (match_operand:V4FI_64 1 "register_operand")
2332 : (match_operand:V4FI_64 2 "register_operand")
2333 : (match_operand:QI 3 "register_operand")))]
2334 : "TARGET_MMX_WITH_SSE && TARGET_AVX512BW && TARGET_AVX512VL"
2335 22 : {
2336 22 : rtx op0 = gen_reg_rtx (<mmxxmmmode>mode);
2337 22 : operands[1] = lowpart_subreg (<mmxxmmmode>mode, operands[1], <MODE>mode);
2338 22 : operands[2] = lowpart_subreg (<mmxxmmmode>mode, operands[2], <MODE>mode);
2339 40 : emit_insn (gen_vcond_mask_<mmxxmmmodelower>qi (op0, operands[1],
2340 : operands[2], operands[3]));
2341 40 : emit_move_insn (operands[0],
2342 18 : lowpart_subreg (<MODE>mode, op0, <mmxxmmmode>mode));
2343 40 : DONE;
2344 : })
2345 :
2346 : (define_expand "vcond_mask_<mode>qi"
2347 : [(set (match_operand:V2FI 0 "register_operand")
2348 : (vec_merge:V2FI
2349 : (match_operand:V2FI 1 "register_operand")
2350 : (match_operand:V2FI 2 "register_operand")
2351 : (match_operand:QI 3 "register_operand")))]
2352 : "TARGET_MMX_WITH_SSE && TARGET_AVX512VL"
2353 1 : {
2354 1 : rtx op0 = gen_reg_rtx (<mmxxmmmode>mode);
2355 1 : operands[1] = lowpart_subreg (<mmxxmmmode>mode, operands[1], <MODE>mode);
2356 1 : operands[2] = lowpart_subreg (<mmxxmmmode>mode, operands[2], <MODE>mode);
2357 19 : emit_insn (gen_vcond_mask_<mmxxmmmodelower>qi (op0, operands[1],
2358 : operands[2], operands[3]));
2359 19 : emit_move_insn (operands[0],
2360 18 : lowpart_subreg (<MODE>mode, op0, <mmxxmmmode>mode));
2361 19 : DONE;
2362 : })
2363 :
2364 : (define_expand "vec_cmpv2hfqi"
2365 : [(set (match_operand:QI 0 "register_operand")
2366 : (match_operator:QI 1 ""
2367 : [(match_operand:V2HF 2 "nonimmediate_operand")
2368 : (match_operand:V2HF 3 "nonimmediate_operand")]))]
2369 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2370 : && ix86_partial_vec_fp_math"
2371 17 : {
2372 17 : rtx ops[4];
2373 17 : ops[3] = gen_reg_rtx (V8HFmode);
2374 17 : ops[2] = gen_reg_rtx (V8HFmode);
2375 27 :
2376 17 : emit_insn (gen_movd_v2hf_to_sse (ops[3], operands[3]));
2377 44 : emit_insn (gen_movd_v2hf_to_sse (ops[2], operands[2]));
2378 44 : emit_insn (gen_vec_cmpv8hfqi (operands[0], operands[1], ops[2], ops[3]));
2379 44 : DONE;
2380 : })
2381 :
2382 : (define_expand "vcond_mask_<mode>v2hi"
2383 : [(set (match_operand:V2F_32 0 "register_operand")
2384 : (vec_merge:V2F_32
2385 : (match_operand:V2F_32 1 "vector_or_const_vector_operand")
2386 : (match_operand:V2F_32 2 "vector_or_const_vector_operand")
2387 : (match_operand:V2HI 3 "register_operand")))]
2388 : "TARGET_SSE4_1"
2389 18 : {
2390 18 : ix86_expand_sse_movcc (operands[0], operands[3],
2391 : operands[1], operands[2]);
2392 18 : DONE;
2393 0 : })
2394 :
2395 0 : (define_expand "vcond_mask_<mode>qi"
2396 0 : [(set (match_operand:V2FI_32 0 "register_operand")
2397 0 : (vec_merge:V2FI_32
2398 : (match_operand:V2FI_32 1 "register_operand")
2399 : (match_operand:V2FI_32 2 "register_operand")
2400 : (match_operand:QI 3 "register_operand")))]
2401 : "TARGET_AVX512BW && TARGET_AVX512VL"
2402 22 : {
2403 22 : rtx op0 = gen_reg_rtx (<mmxxmmmode>mode);
2404 22 : operands[1] = lowpart_subreg (<mmxxmmmode>mode, operands[1], <MODE>mode);
2405 22 : operands[2] = lowpart_subreg (<mmxxmmmode>mode, operands[2], <MODE>mode);
2406 28 : emit_insn (gen_vcond_mask_<mmxxmmmodelower>qi (op0, operands[1],
2407 : operands[2], operands[3]));
2408 28 : emit_move_insn (operands[0],
2409 6 : lowpart_subreg (<MODE>mode, op0, <mmxxmmmode>mode));
2410 28 : DONE;
2411 : })
2412 :
2413 : ;;This instruction does not generate floating point exceptions
2414 : (define_expand "vec_cmp<mode>qi"
2415 : [(set (match_operand:QI 0 "register_operand")
2416 : (match_operator:QI 1 ""
2417 : [(match_operand:VBF_32_64 2 "register_operand")
2418 : (match_operand:VBF_32_64 3 "nonimmediate_operand")]))]
2419 : "TARGET_AVX10_2"
2420 10 : {
2421 10 : rtx op2 = lowpart_subreg (V8BFmode,
2422 : force_reg (<MODE>mode, operands[2]), <MODE>mode);
2423 10 : rtx op3 = lowpart_subreg (V8BFmode,
2424 2 : force_reg (<MODE>mode, operands[3]), <MODE>mode);
2425 :
2426 12 : emit_insn (gen_vec_cmpv8bfqi (operands[0], operands[1], op2, op3));
2427 12 : DONE;
2428 2 : })
2429 :
2430 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2431 : ;;
2432 : ;; Parallel half-precision floating point rounding operations.
2433 : ;;
2434 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2435 :
2436 : (define_expand "btrunc<mode>2"
2437 : [(match_operand:VHF_32_64 0 "register_operand")
2438 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2439 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2440 : && ix86_partial_vec_fp_math
2441 2 : && !flag_trapping_math"
2442 2 : {
2443 4 : rtx op1 = gen_reg_rtx (V8HFmode);
2444 4 : rtx op0 = gen_reg_rtx (V8HFmode);
2445 2 :
2446 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2447 2 : emit_insn (gen_btruncv8hf2 (op0, op1));
2448 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2449 :
2450 2 : DONE;
2451 : })
2452 :
2453 : (define_expand "nearbyint<mode>2"
2454 : [(match_operand:VHF_32_64 0 "register_operand")
2455 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2456 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2457 : && ix86_partial_vec_fp_math"
2458 2 : {
2459 3 : rtx op1 = gen_reg_rtx (V8HFmode);
2460 2 : rtx op0 = gen_reg_rtx (V8HFmode);
2461 :
2462 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2463 2 : emit_insn (gen_nearbyintv8hf2 (op0, op1));
2464 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2465 1 :
2466 3 : DONE;
2467 1 : })
2468 :
2469 : (define_expand "rint<mode>2"
2470 : [(match_operand:VHF_32_64 0 "register_operand")
2471 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2472 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2473 : && ix86_partial_vec_fp_math"
2474 2 : {
2475 2 : rtx op1 = gen_reg_rtx (V8HFmode);
2476 2 : rtx op0 = gen_reg_rtx (V8HFmode);
2477 :
2478 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2479 4 : emit_insn (gen_rintv8hf2 (op0, op1));
2480 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2481 2 :
2482 4 : DONE;
2483 2 : })
2484 :
2485 : (define_expand "lrint<mode><mmxintvecmodelower>2"
2486 : [(match_operand:<mmxintvecmode> 0 "register_operand")
2487 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2488 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2489 : && ix86_partial_vec_fp_math"
2490 0 : {
2491 0 : rtx op1 = gen_reg_rtx (V8HFmode);
2492 0 : rtx op0 = gen_reg_rtx (V8HFmode);
2493 :
2494 0 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2495 0 : emit_insn (gen_lrintv8hfv8hi2 (op0, op1));
2496 0 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2497 0 :
2498 0 : DONE;
2499 0 : })
2500 :
2501 : (define_expand "floor<mode>2"
2502 : [(match_operand:VHF_32_64 0 "register_operand")
2503 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2504 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2505 : && ix86_partial_vec_fp_math
2506 : && !flag_trapping_math"
2507 2 : {
2508 2 : rtx op1 = gen_reg_rtx (V8HFmode);
2509 2 : rtx op0 = gen_reg_rtx (V8HFmode);
2510 :
2511 4 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2512 2 : emit_insn (gen_floorv8hf2 (op0, op1));
2513 4 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2514 2 :
2515 4 : DONE;
2516 : })
2517 :
2518 : (define_expand "lfloor<mode><mmxintvecmodelower>2"
2519 : [(match_operand:<mmxintvecmode> 0 "register_operand")
2520 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2521 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2522 : && ix86_partial_vec_fp_math
2523 : && !flag_trapping_math"
2524 0 : {
2525 0 : rtx op1 = gen_reg_rtx (V8HFmode);
2526 0 : rtx op0 = gen_reg_rtx (V8HFmode);
2527 :
2528 0 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2529 0 : emit_insn (gen_lfloorv8hfv8hi2 (op0, op1));
2530 0 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2531 0 :
2532 0 : DONE;
2533 : })
2534 :
2535 : (define_expand "ceil<mode>2"
2536 : [(match_operand:VHF_32_64 0 "register_operand")
2537 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2538 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2539 : && ix86_partial_vec_fp_math
2540 : && !flag_trapping_math"
2541 2 : {
2542 2 : rtx op1 = gen_reg_rtx (V8HFmode);
2543 2 : rtx op0 = gen_reg_rtx (V8HFmode);
2544 :
2545 4 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2546 2 : emit_insn (gen_ceilv8hf2 (op0, op1));
2547 4 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2548 2 :
2549 4 : DONE;
2550 : })
2551 :
2552 : (define_expand "lceil<mode><mmxintvecmodelower>2"
2553 : [(match_operand:<mmxintvecmode> 0 "register_operand")
2554 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2555 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2556 : && ix86_partial_vec_fp_math
2557 : && !flag_trapping_math"
2558 0 : {
2559 0 : rtx op1 = gen_reg_rtx (V8HFmode);
2560 0 : rtx op0 = gen_reg_rtx (V8HFmode);
2561 :
2562 0 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2563 0 : emit_insn (gen_lceilv8hfv8hi2 (op0, op1));
2564 0 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2565 0 :
2566 0 : DONE;
2567 : })
2568 :
2569 : (define_expand "round<mode>2"
2570 : [(match_operand:VHF_32_64 0 "register_operand")
2571 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2572 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2573 : && ix86_partial_vec_fp_math
2574 : && !flag_trapping_math"
2575 2 : {
2576 2 : rtx op1 = gen_reg_rtx (V8HFmode);
2577 2 : rtx op0 = gen_reg_rtx (V8HFmode);
2578 :
2579 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2580 2 : emit_insn (gen_roundv8hf2 (op0, op1));
2581 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2582 0 :
2583 2 : DONE;
2584 : })
2585 :
2586 : (define_expand "lround<mode><mmxintvecmodelower>2"
2587 : [(match_operand:<mmxintvecmode> 0 "register_operand")
2588 : (match_operand:VHF_32_64 1 "nonimmediate_operand")]
2589 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2590 : && ix86_partial_vec_fp_math
2591 : && !flag_trapping_math"
2592 0 : {
2593 0 : rtx op1 = gen_reg_rtx (V8HFmode);
2594 0 : rtx op0 = gen_reg_rtx (V8HFmode);
2595 :
2596 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2597 0 : emit_insn (gen_lroundv8hfv8hi2 (op0, op1));
2598 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2599 2 :
2600 2 : DONE;
2601 : })
2602 :
2603 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2604 : ;;
2605 : ;; Parallel half-precision floating point logical operations
2606 : ;;
2607 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2608 :
2609 : (define_insn "*mmx_andnot<mode>3"
2610 : [(set (match_operand:VHBF_32_64 0 "register_operand" "=x,x")
2611 : (and:VHBF_32_64
2612 : (not:VHBF_32_64
2613 0 : (match_operand:VHBF_32_64 1 "register_operand" "0,x"))
2614 : (match_operand:VHBF_32_64 2 "register_operand" "x,x")))]
2615 0 : "TARGET_SSE"
2616 0 : "@
2617 0 : andnps\t{%2, %0|%0, %2}
2618 : vandnps\t{%2, %1, %0|%0, %1, %2}"
2619 : [(set_attr "isa" "noavx,avx")
2620 : (set_attr "type" "sselog")
2621 : (set_attr "prefix" "orig,vex")
2622 : (set_attr "mode" "V4SF")])
2623 :
2624 : (define_insn "<code><mode>3"
2625 : [(set (match_operand:VHBF_32_64 0 "register_operand" "=x,x")
2626 : (any_logic:VHBF_32_64
2627 : (match_operand:VHBF_32_64 1 "register_operand" "%0,x")
2628 : (match_operand:VHBF_32_64 2 "register_operand" " x,x")))]
2629 59 : "TARGET_SSE"
2630 : "@
2631 : <logic>ps\t{%2, %0|%0, %2}
2632 : v<logic>ps\t{%2, %1, %0|%0, %1, %2}"
2633 : [(set_attr "isa" "noavx,avx")
2634 : (set_attr "type" "sselog,sselog")
2635 : (set_attr "prefix" "orig,vex")
2636 : (set_attr "mode" "V4SF")])
2637 :
2638 : (define_expand "copysign<mode>3"
2639 : [(set (match_dup 4)
2640 : (and:VHBF_32_64
2641 : (not:VHBF_32_64 (match_dup 3))
2642 : (match_operand:VHBF_32_64 1 "register_operand")))
2643 : (set (match_dup 5)
2644 : (and:VHBF_32_64 (match_dup 3)
2645 : (match_operand:VHBF_32_64 2 "register_operand")))
2646 : (set (match_operand:VHBF_32_64 0 "register_operand")
2647 : (ior:VHBF_32_64 (match_dup 4) (match_dup 5)))]
2648 : "TARGET_SSE"
2649 2 : {
2650 2 : operands[3] = ix86_build_signbit_mask (<MODE>mode, true, false);
2651 :
2652 2 : operands[4] = gen_reg_rtx (<MODE>mode);
2653 2 : operands[5] = gen_reg_rtx (<MODE>mode);
2654 : })
2655 :
2656 : (define_expand "xorsign<mode>3"
2657 : [(set (match_dup 4)
2658 2 : (and:VHBF_32_64 (match_dup 3)
2659 : (match_operand:VHBF_32_64 2 "register_operand")))
2660 : (set (match_operand:VHBF_32_64 0 "register_operand")
2661 : (xor:VHBF_32_64 (match_dup 4)
2662 : (match_operand:VHBF_32_64 1 "register_operand")))]
2663 : "TARGET_SSE"
2664 3 : {
2665 2 : operands[3] = ix86_build_signbit_mask (<MODE>mode, true, false);
2666 :
2667 2 : operands[4] = gen_reg_rtx (<MODE>mode);
2668 : })
2669 1 :
2670 : (define_expand "signbit<mode>2"
2671 1 : [(set (match_operand:<mmxintvecmode> 0 "register_operand")
2672 2 : (lshiftrt:<mmxintvecmode>
2673 1 : (subreg:<mmxintvecmode>
2674 : (match_operand:VHBF_32_64 1 "register_operand") 0)
2675 : (match_dup 2)))]
2676 : "TARGET_SSE2"
2677 2 : {
2678 0 : operands[1] = force_reg (<MODE>mode, operands[1]);
2679 0 : operands[2] = GEN_INT (GET_MODE_UNIT_BITSIZE (<MODE>mode)-1);
2680 : })
2681 :
2682 3 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2683 : ;;
2684 3 : ;; Parallel half-precision FMA multiply/accumulate instructions.
2685 3 : ;;
2686 2 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2687 :
2688 0 : (define_expand "fma<mode>4"
2689 : [(set (match_operand:VHF_32_64 0 "register_operand")
2690 : (fma:VHF_32_64
2691 : (match_operand:VHF_32_64 1 "nonimmediate_operand")
2692 : (match_operand:VHF_32_64 2 "nonimmediate_operand")
2693 5 : (match_operand:VHF_32_64 3 "nonimmediate_operand")))]
2694 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2695 8 : {
2696 5 : rtx op3 = gen_reg_rtx (V8HFmode);
2697 5 : rtx op2 = gen_reg_rtx (V8HFmode);
2698 3 : rtx op1 = gen_reg_rtx (V8HFmode);
2699 3 : rtx op0 = gen_reg_rtx (V8HFmode);
2700 :
2701 3 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op3, operands[3]));
2702 3 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op2, operands[2]));
2703 3 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2704 :
2705 3 : emit_insn (gen_fmav8hf4 (op0, op1, op2, op3));
2706 :
2707 3 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2708 3 : DONE;
2709 : })
2710 :
2711 : (define_expand "fms<mode>4"
2712 : [(set (match_operand:VHF_32_64 0 "register_operand")
2713 : (fma:VHF_32_64
2714 : (match_operand:VHF_32_64 1 "nonimmediate_operand")
2715 : (match_operand:VHF_32_64 2 "nonimmediate_operand")
2716 : (neg:VHF_32_64
2717 : (match_operand:VHF_32_64 3 "nonimmediate_operand"))))]
2718 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2719 2 : {
2720 2 : rtx op3 = gen_reg_rtx (V8HFmode);
2721 2 : rtx op2 = gen_reg_rtx (V8HFmode);
2722 4 : rtx op1 = gen_reg_rtx (V8HFmode);
2723 2 : rtx op0 = gen_reg_rtx (V8HFmode);
2724 2 :
2725 4 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op3, operands[3]));
2726 4 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op2, operands[2]));
2727 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2728 :
2729 2 : emit_insn (gen_fmsv8hf4 (op0, op1, op2, op3));
2730 :
2731 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2732 2 : DONE;
2733 : })
2734 :
2735 : (define_expand "fnma<mode>4"
2736 : [(set (match_operand:VHF_32_64 0 "register_operand")
2737 : (fma:VHF_32_64
2738 : (neg:VHF_32_64
2739 : (match_operand:VHF_32_64 1 "nonimmediate_operand"))
2740 : (match_operand:VHF_32_64 2 "nonimmediate_operand")
2741 : (match_operand:VHF_32_64 3 "nonimmediate_operand")))]
2742 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2743 2 : {
2744 2 : rtx op3 = gen_reg_rtx (V8HFmode);
2745 2 : rtx op2 = gen_reg_rtx (V8HFmode);
2746 4 : rtx op1 = gen_reg_rtx (V8HFmode);
2747 2 : rtx op0 = gen_reg_rtx (V8HFmode);
2748 2 :
2749 4 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op3, operands[3]));
2750 4 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op2, operands[2]));
2751 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2752 :
2753 2 : emit_insn (gen_fnmav8hf4 (op0, op1, op2, op3));
2754 :
2755 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2756 2 : DONE;
2757 : })
2758 :
2759 : (define_expand "fnms<mode>4"
2760 : [(set (match_operand:VHF_32_64 0 "register_operand" "=v,v,x")
2761 : (fma:VHF_32_64
2762 : (neg:VHF_32_64
2763 : (match_operand:VHF_32_64 1 "nonimmediate_operand"))
2764 : (match_operand:VHF_32_64 2 "nonimmediate_operand")
2765 : (neg:VHF_32_64
2766 : (match_operand:VHF_32_64 3 "nonimmediate_operand"))))]
2767 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2768 2 : {
2769 2 : rtx op3 = gen_reg_rtx (V8HFmode);
2770 4 : rtx op2 = gen_reg_rtx (V8HFmode);
2771 2 : rtx op1 = gen_reg_rtx (V8HFmode);
2772 4 : rtx op0 = gen_reg_rtx (V8HFmode);
2773 2 :
2774 4 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op3, operands[3]));
2775 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op2, operands[2]));
2776 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2777 :
2778 2 : emit_insn (gen_fnmsv8hf4 (op0, op1, op2, op3));
2779 :
2780 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2781 2 : DONE;
2782 : })
2783 :
2784 : (define_expand "vec_fmaddsubv4hf4"
2785 : [(match_operand:V4HF 0 "register_operand")
2786 : (match_operand:V4HF 1 "nonimmediate_operand")
2787 : (match_operand:V4HF 2 "nonimmediate_operand")
2788 : (match_operand:V4HF 3 "nonimmediate_operand")]
2789 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2790 : && TARGET_MMX_WITH_SSE
2791 : && ix86_partial_vec_fp_math"
2792 1 : {
2793 1 : rtx op3 = gen_reg_rtx (V8HFmode);
2794 1 : rtx op2 = gen_reg_rtx (V8HFmode);
2795 1 : rtx op1 = gen_reg_rtx (V8HFmode);
2796 3 : rtx op0 = gen_reg_rtx (V8HFmode);
2797 :
2798 3 : emit_insn (gen_movq_v4hf_to_sse (op3, operands[3]));
2799 3 : emit_insn (gen_movq_v4hf_to_sse (op2, operands[2]));
2800 3 : emit_insn (gen_movq_v4hf_to_sse (op1, operands[1]));
2801 :
2802 1 : emit_insn (gen_vec_fmaddsubv8hf4 (op0, op1, op2, op3));
2803 :
2804 1 : emit_move_insn (operands[0], lowpart_subreg (V4HFmode, op0, V8HFmode));
2805 1 : DONE;
2806 : })
2807 :
2808 : (define_expand "vec_fmsubaddv4hf4"
2809 : [(match_operand:V4HF 0 "register_operand")
2810 : (match_operand:V4HF 1 "nonimmediate_operand")
2811 : (match_operand:V4HF 2 "nonimmediate_operand")
2812 : (match_operand:V4HF 3 "nonimmediate_operand")]
2813 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2814 : && ix86_partial_vec_fp_math
2815 : && TARGET_MMX_WITH_SSE"
2816 1 : {
2817 1 : rtx op3 = gen_reg_rtx (V8HFmode);
2818 1 : rtx op2 = gen_reg_rtx (V8HFmode);
2819 2 : rtx op1 = gen_reg_rtx (V8HFmode);
2820 1 : rtx op0 = gen_reg_rtx (V8HFmode);
2821 1 :
2822 2 : emit_insn (gen_movq_v4hf_to_sse (op3, operands[3]));
2823 2 : emit_insn (gen_movq_v4hf_to_sse (op2, operands[2]));
2824 1 : emit_insn (gen_movq_v4hf_to_sse (op1, operands[1]));
2825 :
2826 1 : emit_insn (gen_vec_fmsubaddv8hf4 (op0, op1, op2, op3));
2827 :
2828 1 : emit_move_insn (operands[0], lowpart_subreg (V4HFmode, op0, V8HFmode));
2829 1 : DONE;
2830 : })
2831 :
2832 : (define_expand "fma<mode>4"
2833 : [(set (match_operand:VBF_32_64 0 "register_operand")
2834 : (fma:VBF_32_64
2835 : (match_operand:VBF_32_64 1 "nonimmediate_operand")
2836 : (match_operand:VBF_32_64 2 "nonimmediate_operand")
2837 : (match_operand:VBF_32_64 3 "nonimmediate_operand")))]
2838 : "TARGET_AVX10_2"
2839 2 : {
2840 2 : rtx op0 = gen_reg_rtx (V8BFmode);
2841 2 : rtx op1 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[1]), <MODE>mode);
2842 2 : rtx op2 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[2]), <MODE>mode);
2843 3 : rtx op3 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[3]), <MODE>mode);
2844 :
2845 3 : emit_insn (gen_fmav8bf4 (op0, op1, op2, op3));
2846 1 :
2847 3 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8BFmode));
2848 2 : DONE;
2849 : })
2850 :
2851 : (define_expand "fms<mode>4"
2852 : [(set (match_operand:VBF_32_64 0 "register_operand")
2853 : (fma:VBF_32_64
2854 : (match_operand:VBF_32_64 1 "nonimmediate_operand")
2855 : (match_operand:VBF_32_64 2 "nonimmediate_operand")
2856 : (neg:VBF_32_64
2857 : (match_operand:VBF_32_64 3 "nonimmediate_operand"))))]
2858 : "TARGET_AVX10_2"
2859 2 : {
2860 3 : rtx op0 = gen_reg_rtx (V8BFmode);
2861 2 : rtx op1 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[1]), <MODE>mode);
2862 3 : rtx op2 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[2]), <MODE>mode);
2863 2 : rtx op3 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[3]), <MODE>mode);
2864 2 :
2865 4 : emit_insn (gen_fmsv8bf4 (op0, op1, op2, op3));
2866 2 :
2867 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8BFmode));
2868 2 : DONE;
2869 : })
2870 :
2871 : (define_expand "fnma<mode>4"
2872 : [(set (match_operand:VBF_32_64 0 "register_operand")
2873 : (fma:VBF_32_64
2874 : (neg:VBF_32_64
2875 : (match_operand:VBF_32_64 1 "nonimmediate_operand"))
2876 : (match_operand:VBF_32_64 2 "nonimmediate_operand")
2877 : (match_operand:VBF_32_64 3 "nonimmediate_operand")))]
2878 : "TARGET_AVX10_2"
2879 2 : {
2880 2 : rtx op0 = gen_reg_rtx (V8BFmode);
2881 2 : rtx op1 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[1]), <MODE>mode);
2882 4 : rtx op2 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[2]), <MODE>mode);
2883 2 : rtx op3 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[3]), <MODE>mode);
2884 2 :
2885 4 : emit_insn (gen_fnmav8bf4 (op0, op1, op2, op3));
2886 2 :
2887 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8BFmode));
2888 2 : DONE;
2889 : })
2890 :
2891 : (define_expand "fnms<mode>4"
2892 : [(set (match_operand:VBF_32_64 0 "register_operand")
2893 : (fma:VBF_32_64
2894 : (neg:VBF_32_64
2895 : (match_operand:VBF_32_64 1 "nonimmediate_operand"))
2896 : (match_operand:VBF_32_64 2 "nonimmediate_operand")
2897 : (neg:VBF_32_64
2898 : (match_operand:VBF_32_64 3 "nonimmediate_operand"))))]
2899 : "TARGET_AVX10_2"
2900 2 : {
2901 2 : rtx op0 = gen_reg_rtx (V8BFmode);
2902 4 : rtx op1 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[1]), <MODE>mode);
2903 2 : rtx op2 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[2]), <MODE>mode);
2904 4 : rtx op3 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[3]), <MODE>mode);
2905 2 :
2906 4 : emit_insn (gen_fnmsv8bf4 (op0, op1, op2, op3));
2907 :
2908 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8BFmode));
2909 2 : DONE;
2910 : })
2911 :
2912 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2913 : ;;
2914 : ;; Parallel half-precision floating point complex type operations
2915 : ;;
2916 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2917 :
2918 : (define_expand "cmlav4hf4"
2919 : [(match_operand:V4HF 0 "register_operand")
2920 : (match_operand:V4HF 1 "vector_operand")
2921 : (match_operand:V4HF 2 "vector_operand")
2922 : (match_operand:V4HF 3 "vector_operand")]
2923 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2924 4 : && TARGET_MMX_WITH_SSE"
2925 1 : {
2926 5 : rtx op3 = gen_reg_rtx (V8HFmode);
2927 5 : rtx op2 = gen_reg_rtx (V8HFmode);
2928 5 : rtx op1 = gen_reg_rtx (V8HFmode);
2929 1 : rtx op0 = gen_reg_rtx (V8HFmode);
2930 :
2931 1 : emit_insn (gen_movq_v4hf_to_sse (op3, operands[3]));
2932 1 : emit_insn (gen_movq_v4hf_to_sse (op2, operands[2]));
2933 1 : emit_insn (gen_movq_v4hf_to_sse (op1, operands[1]));
2934 :
2935 1 : emit_insn (gen_cmlav8hf4 (op0, op1, op2, op3));
2936 :
2937 1 : emit_move_insn (operands[0], lowpart_subreg (V4HFmode, op0, V8HFmode));
2938 1 : DONE;
2939 : })
2940 :
2941 : (define_expand "cmla_conjv4hf4"
2942 : [(match_operand:V4HF 0 "register_operand")
2943 : (match_operand:V4HF 1 "vector_operand")
2944 : (match_operand:V4HF 2 "vector_operand")
2945 : (match_operand:V4HF 3 "vector_operand")]
2946 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2947 : && TARGET_MMX_WITH_SSE"
2948 1 : {
2949 1 : rtx op3 = gen_reg_rtx (V8HFmode);
2950 1 : rtx op2 = gen_reg_rtx (V8HFmode);
2951 1 : rtx op1 = gen_reg_rtx (V8HFmode);
2952 4 : rtx op0 = gen_reg_rtx (V8HFmode);
2953 :
2954 4 : emit_insn (gen_movq_v4hf_to_sse (op3, operands[3]));
2955 4 : emit_insn (gen_movq_v4hf_to_sse (op2, operands[2]));
2956 4 : emit_insn (gen_movq_v4hf_to_sse (op1, operands[1]));
2957 :
2958 1 : emit_insn (gen_cmla_conjv8hf4 (op0, op1, op2, op3));
2959 :
2960 1 : emit_move_insn (operands[0], lowpart_subreg (V4HFmode, op0, V8HFmode));
2961 1 : DONE;
2962 : })
2963 :
2964 : (define_expand "cmulv4hf3"
2965 : [(match_operand:V4HF 0 "register_operand")
2966 : (match_operand:V4HF 1 "vector_operand")
2967 : (match_operand:V4HF 2 "vector_operand")]
2968 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2969 : && TARGET_MMX_WITH_SSE"
2970 1 : {
2971 1 : rtx op2 = gen_reg_rtx (V8HFmode);
2972 1 : rtx op1 = gen_reg_rtx (V8HFmode);
2973 1 : rtx op0 = gen_reg_rtx (V8HFmode);
2974 :
2975 2 : emit_insn (gen_movq_v4hf_to_sse (op2, operands[2]));
2976 1 : emit_insn (gen_movq_v4hf_to_sse (op1, operands[1]));
2977 1 :
2978 2 : emit_insn (gen_cmulv8hf3 (op0, op1, op2));
2979 2 : emit_move_insn (operands[0], lowpart_subreg (V4HFmode, op0, V8HFmode));
2980 1 : DONE;
2981 : })
2982 :
2983 : (define_expand "cmul_conjv4hf3"
2984 : [(match_operand:V4HF 0 "register_operand")
2985 : (match_operand:V4HF 1 "vector_operand")
2986 : (match_operand:V4HF 2 "vector_operand")]
2987 : "TARGET_AVX512FP16 && TARGET_AVX512VL
2988 : && TARGET_MMX_WITH_SSE"
2989 1 : {
2990 1 : rtx op2 = gen_reg_rtx (V8HFmode);
2991 1 : rtx op1 = gen_reg_rtx (V8HFmode);
2992 1 : rtx op0 = gen_reg_rtx (V8HFmode);
2993 1 :
2994 1 : emit_insn (gen_movq_v4hf_to_sse (op2, operands[2]));
2995 2 : emit_insn (gen_movq_v4hf_to_sse (op1, operands[1]));
2996 1 :
2997 2 : emit_insn (gen_cmul_conjv8hf3 (op0, op1, op2));
2998 1 : emit_move_insn (operands[0], lowpart_subreg (V4HFmode, op0, V8HFmode));
2999 1 : DONE;
3000 : })
3001 :
3002 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3003 : ;;
3004 : ;; Parallel half-precision floating point conversion operations
3005 : ;;
3006 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3007 :
3008 : (define_expand "fix<fixunssuffix>_trunc<mode><mmxintvecmodelower>2"
3009 : [(set (match_operand:<mmxintvecmode> 0 "register_operand")
3010 : (any_fix:<mmxintvecmode>
3011 : (match_operand:VHF_32_64 1 "nonimmediate_operand")))]
3012 1 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
3013 8 : {
3014 6 : rtx op1 = gen_reg_rtx (V8HFmode);
3015 9 : rtx op0 = gen_reg_rtx (V8HImode);
3016 1 :
3017 8 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
3018 :
3019 8 : emit_insn (gen_fix<fixunssuffix>_truncv8hfv8hi2 (op0, op1));
3020 :
3021 8 : emit_move_insn (operands[0],
3022 : lowpart_subreg (<mmxintvecmode>mode, op0, V8HImode));
3023 8 : DONE;
3024 : })
3025 :
3026 : (define_expand "fix<fixunssuffix>_truncv2hfv2si2"
3027 : [(set (match_operand:V2SI 0 "register_operand")
3028 : (any_fix:V2SI
3029 : (match_operand:V2HF 1 "nonimmediate_operand")))]
3030 : "TARGET_AVX512FP16 && TARGET_AVX512VL
3031 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
3032 2 : {
3033 3 : rtx op1 = gen_reg_rtx (V8HFmode);
3034 2 : rtx op0 = gen_reg_rtx (V4SImode);
3035 :
3036 9 : emit_insn (gen_movd_v2hf_to_sse (op1, operands[1]));
3037 :
3038 9 : emit_insn (gen_avx512fp16_fix<fixunssuffix>_truncv4si2 (op0, op1));
3039 8 :
3040 7 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
3041 2 : DONE;
3042 : })
3043 :
3044 : (define_expand "float<floatunssuffix><mmxintvecmodelower><mode>2"
3045 : [(set (match_operand:VHF_32_64 0 "register_operand")
3046 : (any_float:VHF_32_64
3047 : (match_operand:<mmxintvecmode> 1 "nonimmediate_operand")))]
3048 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
3049 8 : {
3050 8 : rtx op1 = gen_reg_rtx (V8HImode);
3051 8 : rtx op0 = gen_reg_rtx (V8HFmode);
3052 :
3053 8 : rtx (*gen_movd_sse) (rtx, rtx)
3054 2 : = gen_mov<mov_to_sse_suffix>_<mmxintvecmodelower>_to_sse;
3055 8 : emit_insn (gen_movd_sse (op1, operands[1]));
3056 2 :
3057 10 : emit_insn (gen_float<floatunssuffix>v8hiv8hf2 (op0, op1));
3058 2 :
3059 8 : emit_move_insn (operands[0],
3060 : lowpart_subreg (<MODE>mode, op0, V8HFmode));
3061 8 : DONE;
3062 : })
3063 :
3064 : (define_expand "float<floatunssuffix>v2siv2hf2"
3065 : [(set (match_operand:V2HF 0 "register_operand")
3066 : (any_float:V2HF
3067 : (match_operand:V2SI 1 "nonimmediate_operand")))]
3068 : "TARGET_AVX512FP16 && TARGET_AVX512VL
3069 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
3070 2 : {
3071 2 : rtx op1 = gen_reg_rtx (V4SImode);
3072 2 : rtx op0 = gen_reg_rtx (V8HFmode);
3073 :
3074 11 : emit_insn (gen_movq_v2si_to_sse (op1, operands[1]));
3075 :
3076 11 : emit_insn (gen_avx512fp16_float<floatunssuffix>v4siv4hf2 (op0, op1));
3077 9 :
3078 11 : emit_move_insn (operands[0], lowpart_subreg (V2HFmode, op0, V8HFmode));
3079 2 : DONE;
3080 : })
3081 :
3082 : (define_expand "extendv2hfv2sf2"
3083 : [(set (match_operand:V2SF 0 "register_operand")
3084 : (float_extend:V2SF
3085 : (match_operand:V2HF 1 "nonimmediate_operand")))]
3086 : "TARGET_AVX512FP16 && TARGET_AVX512VL
3087 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
3088 1 : {
3089 1 : rtx op1 = gen_reg_rtx (V8HFmode);
3090 1 : rtx op0 = gen_reg_rtx (V4SFmode);
3091 :
3092 12 : emit_insn (gen_movd_v2hf_to_sse (op1, operands[1]));
3093 :
3094 12 : emit_insn (gen_avx512fp16_float_extend_phv4sf2 (op0, op1));
3095 11 :
3096 12 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
3097 1 : DONE;
3098 : })
3099 :
3100 : (define_expand "truncv2sfv2hf2"
3101 : [(set (match_operand:V2HF 0 "register_operand")
3102 : (float_truncate:V2HF
3103 : (match_operand:V2SF 1 "nonimmediate_operand")))]
3104 : "TARGET_AVX512FP16 && TARGET_AVX512VL
3105 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
3106 1 : {
3107 1 : rtx op1 = gen_reg_rtx (V4SFmode);
3108 1 : rtx op0 = gen_reg_rtx (V8HFmode);
3109 :
3110 90 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
3111 :
3112 90 : emit_insn (gen_avx512fp16_truncv4sfv4hf2 (op0, op1));
3113 89 :
3114 90 : emit_move_insn (operands[0], lowpart_subreg (V2HFmode, op0, V8HFmode));
3115 1 : DONE;
3116 : })
3117 :
3118 : (define_expand "truncv2sfv2bf2"
3119 : [(set (match_operand:V2BF 0 "register_operand")
3120 : (float_truncate:V2BF
3121 : (match_operand:V2SF 1 "nonimmediate_operand")))]
3122 : "TARGET_SSSE3 && TARGET_MMX_WITH_SSE
3123 : && !HONOR_NANS (BFmode) && !flag_rounding_math
3124 : && (flag_unsafe_math_optimizations
3125 : || TARGET_AVXNECONVERT
3126 : || (TARGET_AVX512BF16 && TARGET_AVX512VL))"
3127 2 : {
3128 7 : rtx op1 = gen_reg_rtx (V4SFmode);
3129 2 : rtx op0 = gen_reg_rtx (V4BFmode);
3130 5 :
3131 7 : emit_move_insn (op1, lowpart_subreg (V4SFmode,
3132 5 : force_reg (V2SFmode, operands[1]),
3133 : V2SFmode));
3134 2 : emit_insn (gen_truncv4sfv4bf2 (op0, op1));
3135 :
3136 2 : emit_move_insn (operands[0], lowpart_subreg (V2BFmode, op0, V4BFmode));
3137 2 : DONE;
3138 : })
3139 :
3140 : (define_expand "extendv2bfv2sf2"
3141 : [(set (match_operand:V2SF 0 "register_operand")
3142 : (float_extend:V2SF
3143 : (match_operand:V2BF 1 "nonimmediate_operand")))]
3144 : "TARGET_SSE2 && TARGET_MMX_WITH_SSE && !HONOR_NANS (BFmode)"
3145 2 : {
3146 2 : rtx op0 = gen_reg_rtx (V4SFmode);
3147 2 : rtx op1 = gen_reg_rtx (V4BFmode);
3148 :
3149 2 : emit_move_insn (op1, lowpart_subreg (V4BFmode,
3150 33 : force_reg (V2BFmode, operands[1]),
3151 : V2BFmode));
3152 35 : emit_insn (gen_extendv4bfv4sf2 (op0, op1));
3153 33 :
3154 35 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
3155 2 : DONE;
3156 : })
3157 :
3158 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3159 : ;;
3160 : ;; Parallel integral arithmetic
3161 : ;;
3162 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3163 :
3164 : (define_expand "neg<mode>2"
3165 : [(set (match_operand:MMXMODEI 0 "register_operand")
3166 : (minus:MMXMODEI
3167 : (match_dup 2)
3168 36 : (match_operand:MMXMODEI 1 "register_operand")))]
3169 : "TARGET_MMX_WITH_SSE"
3170 139 : "operands[2] = force_reg (<MODE>mode, CONST0_RTX (<MODE>mode));")
3171 36 :
3172 36 : (define_expand "neg<mode>2"
3173 : [(set (match_operand:VI_32 0 "register_operand")
3174 103 : (minus:VI_32
3175 : (match_dup 2)
3176 : (match_operand:VI_32 1 "register_operand")))]
3177 : "TARGET_SSE2"
3178 108 : "operands[2] = force_reg (<MODE>mode, CONST0_RTX (<MODE>mode));")
3179 :
3180 : (define_insn "negv2qi2"
3181 : [(set (match_operand:V2QI 0 "register_operand" "=?Q,&Yw")
3182 14 : (neg:V2QI
3183 9 : (match_operand:V2QI 1 "register_operand" "0,Yw")))
3184 9 : (clobber (reg:CC FLAGS_REG))]
3185 2733 : "!TARGET_PARTIAL_REG_STALL || optimize_size || TARGET_SSE2"
3186 32 : "#"
3187 18 : [(set_attr "isa" "*,sse2")
3188 : (set_attr "type" "multi")
3189 2676 : (set_attr "mode" "QI,TI")
3190 : (set (attr "enabled")
3191 66 : (cond [(and (eq_attr "alternative" "0")
3192 2676 : (and (match_test "TARGET_PARTIAL_REG_STALL")
3193 66 : (not (match_test "optimize_size"))))
3194 66 : (symbol_ref "false")
3195 66 : ]
3196 : (const_string "*")))])
3197 :
3198 : (define_split
3199 : [(set (match_operand:V2QI 0 "general_reg_operand")
3200 : (neg:V2QI
3201 : (match_operand:V2QI 1 "general_reg_operand")))
3202 : (clobber (reg:CC FLAGS_REG))]
3203 : "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
3204 : && reload_completed"
3205 : [(parallel
3206 : [(set (strict_low_part (match_dup 0))
3207 : (neg:QI (match_dup 1)))
3208 : (clobber (reg:CC FLAGS_REG))])
3209 : (parallel
3210 : [(set (zero_extract:HI (match_dup 2) (const_int 8) (const_int 8))
3211 : (subreg:HI
3212 : (neg:QI
3213 : (subreg:QI
3214 : (zero_extract:HI (match_dup 3)
3215 : (const_int 8)
3216 : (const_int 8)) 0)) 0))
3217 : (clobber (reg:CC FLAGS_REG))])]
3218 9 : {
3219 9 : operands[3] = lowpart_subreg (HImode, operands[1], V2QImode);
3220 9 : operands[2] = lowpart_subreg (HImode, operands[0], V2QImode);
3221 9 : operands[1] = lowpart_subreg (QImode, operands[1], V2QImode);
3222 9 : operands[0] = lowpart_subreg (QImode, operands[0], V2QImode);
3223 : })
3224 :
3225 : (define_split
3226 9 : [(set (match_operand:V2QI 0 "sse_reg_operand")
3227 : (neg:V2QI
3228 : (match_operand:V2QI 1 "sse_reg_operand")))
3229 : (clobber (reg:CC FLAGS_REG))]
3230 : "TARGET_SSE2 && reload_completed"
3231 : [(set (match_dup 0) (match_dup 2))
3232 : (set (match_dup 0)
3233 : (minus:V16QI (match_dup 0) (match_dup 1)))]
3234 0 : {
3235 9 : operands[2] = CONST0_RTX (V16QImode);
3236 0 : operands[1] = lowpart_subreg (V16QImode, operands[1], V2QImode);
3237 0 : operands[0] = lowpart_subreg (V16QImode, operands[0], V2QImode);
3238 : })
3239 :
3240 993 : (define_expand "mmx_<insn><mode>3"
3241 0 : [(set (match_operand:MMXMODEI8 0 "register_operand")
3242 993 : (plusminus:MMXMODEI8
3243 993 : (match_operand:MMXMODEI8 1 "register_mmxmem_operand")
3244 : (match_operand:MMXMODEI8 2 "register_mmxmem_operand")))]
3245 0 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3246 155 : "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
3247 993 :
3248 : (define_expand "<insn><mode>3"
3249 : [(set (match_operand:MMXMODEI 0 "register_operand")
3250 274 : (plusminus:MMXMODEI
3251 : (match_operand:MMXMODEI 1 "register_operand")
3252 1326 : (match_operand:MMXMODEI 2 "register_operand")))]
3253 20 : "TARGET_MMX_WITH_SSE")
3254 1560 :
3255 1306 : (define_insn "*mmx_<insn><mode>3"
3256 : [(set (match_operand:MMXMODEI8 0 "register_operand" "=y,x,<Yv_Yw>")
3257 : (plusminus:MMXMODEI8
3258 : (match_operand:MMXMODEI8 1 "register_mmxmem_operand"
3259 9986 : "<comm>0,0,<Yv_Yw>")
3260 166 : (match_operand:MMXMODEI8 2 "register_mmxmem_operand"
3261 8680 : "ym,x,<Yv_Yw>")))]
3262 9142 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3263 127078 : && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
3264 36 : "@
3265 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3266 8617 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3267 115865 : vp<plusminus_mnemonic><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3268 36 : [(set_attr "isa" "*,sse2_noavx,avx")
3269 : (set_attr "mmx_isa" "native,*,*")
3270 115829 : (set_attr "type" "mmxadd,sseadd,sseadd")
3271 36 : (set_attr "mode" "DI,TI,TI")])
3272 85 :
3273 36 : (define_insn "<insn><mode>3"
3274 121 : [(set (match_operand:VI_32 0 "register_operand" "=x,Yw")
3275 121 : (plusminus:VI_32
3276 : (match_operand:VI_32 1 "register_operand" "<comm>0,Yw")
3277 : (match_operand:VI_32 2 "register_operand" "x,Yw")))]
3278 : "TARGET_SSE2"
3279 : "@
3280 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3281 : vp<plusminus_mnemonic><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3282 : [(set_attr "isa" "noavx,avx")
3283 : (set_attr "type" "sseadd")
3284 : (set_attr "mode" "TI")])
3285 :
3286 : (define_insn "<insn>v2qi3"
3287 : [(set (match_operand:V2QI 0 "register_operand" "=?Q,x,Yw")
3288 : (plusminus:V2QI
3289 : (match_operand:V2QI 1 "register_operand" "<comm>0,0,Yw")
3290 : (match_operand:V2QI 2 "register_operand" "Q,x,Yw")))
3291 : (clobber (reg:CC FLAGS_REG))]
3292 : "!TARGET_PARTIAL_REG_STALL || optimize_size || TARGET_SSE2"
3293 : "#"
3294 : [(set_attr "isa" "*,sse2_noavx,avx")
3295 : (set_attr "type" "multi,sseadd,sseadd")
3296 : (set_attr "mode" "QI,TI,TI")
3297 : (set (attr "enabled")
3298 : (cond [(and (eq_attr "alternative" "0")
3299 8107188 : (and (match_test "TARGET_PARTIAL_REG_STALL")
3300 0 : (not (match_test "optimize_size"))))
3301 : (symbol_ref "false")
3302 : ]
3303 112924 : (const_string "*")))])
3304 :
3305 : (define_split
3306 : [(set (match_operand:V2QI 0 "general_reg_operand")
3307 : (plusminus:V2QI
3308 : (match_operand:V2QI 1 "general_reg_operand")
3309 : (match_operand:V2QI 2 "general_reg_operand")))
3310 : (clobber (reg:CC FLAGS_REG))]
3311 : "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
3312 : && reload_completed"
3313 : [(parallel
3314 : [(set (strict_low_part (match_dup 0))
3315 : (plusminus:QI (match_dup 1) (match_dup 2)))
3316 : (clobber (reg:CC FLAGS_REG))])
3317 : (parallel
3318 : [(set (zero_extract:HI (match_dup 3) (const_int 8) (const_int 8))
3319 : (subreg:HI
3320 : (plusminus:QI
3321 : (subreg:QI
3322 : (zero_extract:HI (match_dup 4)
3323 : (const_int 8)
3324 : (const_int 8)) 0)
3325 : (subreg:QI
3326 : (zero_extract:HI (match_dup 5)
3327 : (const_int 8)
3328 : (const_int 8)) 0)) 0))
3329 : (clobber (reg:CC FLAGS_REG))])]
3330 194 : {
3331 194 : operands[5] = lowpart_subreg (HImode, operands[2], V2QImode);
3332 194 : operands[4] = lowpart_subreg (HImode, operands[1], V2QImode);
3333 194 : operands[3] = lowpart_subreg (HImode, operands[0], V2QImode);
3334 194 : operands[2] = lowpart_subreg (QImode, operands[2], V2QImode);
3335 194 : operands[1] = lowpart_subreg (QImode, operands[1], V2QImode);
3336 194 : operands[0] = lowpart_subreg (QImode, operands[0], V2QImode);
3337 : })
3338 :
3339 : (define_split
3340 194 : [(set (match_operand:V2QI 0 "sse_reg_operand")
3341 : (plusminus:V2QI
3342 : (match_operand:V2QI 1 "sse_reg_operand")
3343 : (match_operand:V2QI 2 "sse_reg_operand")))
3344 : (clobber (reg:CC FLAGS_REG))]
3345 39405 : "TARGET_SSE2 && reload_completed"
3346 : [(set (match_dup 0)
3347 : (plusminus:V16QI (match_dup 1) (match_dup 2)))]
3348 57 : {
3349 567 : operands[2] = lowpart_subreg (V16QImode, operands[2], V2QImode);
3350 251 : operands[1] = lowpart_subreg (V16QImode, operands[1], V2QImode);
3351 57 : operands[0] = lowpart_subreg (V16QImode, operands[0], V2QImode);
3352 510 : })
3353 :
3354 : (define_expand "mmx_<insn><mode>3"
3355 125 : [(set (match_operand:MMXMODE12 0 "register_operand")
3356 : (sat_plusminus:MMXMODE12
3357 68 : (match_operand:MMXMODE12 1 "register_mmxmem_operand")
3358 68 : (match_operand:MMXMODE12 2 "register_mmxmem_operand")))]
3359 125 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3360 206 : "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
3361 :
3362 : (define_expand "<insn><mode>3"
3363 : [(set (match_operand:MMXMODE12 0 "register_operand")
3364 342 : (sat_plusminus:MMXMODE12
3365 : (match_operand:MMXMODE12 1 "register_operand")
3366 66 : (match_operand:MMXMODE12 2 "register_operand")))]
3367 66 : "TARGET_MMX_WITH_SSE")
3368 276 :
3369 : (define_insn "*mmx_<insn><mode>3"
3370 : [(set (match_operand:MMXMODE12 0 "register_operand" "=y,x,Yw")
3371 : (sat_plusminus:MMXMODE12
3372 : (match_operand:MMXMODE12 1 "register_mmxmem_operand" "<comm>0,0,Yw")
3373 98 : (match_operand:MMXMODE12 2 "register_mmxmem_operand" "ym,x,Yw")))]
3374 86 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3375 2147 : && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
3376 98 : "@
3377 70 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3378 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3379 320749 : vp<plusminus_mnemonic><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3380 28 : [(set_attr "isa" "*,sse2_noavx,avx")
3381 : (set_attr "mmx_isa" "native,*,*")
3382 320502 : (set_attr "type" "mmxadd,sseadd,sseadd")
3383 : (set_attr "mode" "DI,TI,TI")])
3384 :
3385 805 : (define_insn "<insn><mode>3"
3386 : [(set (match_operand:VI_16_32 0 "register_operand" "=x,Yw")
3387 805 : (sat_plusminus:VI_16_32
3388 805 : (match_operand:VI_16_32 1 "register_operand" "<comm>0,Yw")
3389 424 : (match_operand:VI_16_32 2 "register_operand" "x,Yw")))]
3390 : "TARGET_SSE2"
3391 : "@
3392 381 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3393 : vp<plusminus_mnemonic><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3394 : [(set_attr "isa" "noavx,avx")
3395 : (set_attr "type" "sseadd")
3396 : (set_attr "mode" "TI")])
3397 961 :
3398 : (define_insn "mulv2si3"
3399 961 : [(set (match_operand:V2SI 0 "register_operand" "=Yr,*x,v")
3400 961 : (mult:V2SI
3401 960 : (match_operand:V2SI 1 "register_operand" "%0,0,v")
3402 : (match_operand:V2SI 2 "register_operand" "Yr,*x,v")))]
3403 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
3404 : "@
3405 1 : pmulld\t{%2, %0|%0, %2}
3406 : pmulld\t{%2, %0|%0, %2}
3407 : vpmulld\t{%2, %1, %0|%0, %1, %2}"
3408 : [(set_attr "isa" "noavx,noavx,avx")
3409 : (set_attr "type" "sseimul")
3410 34 : (set_attr "prefix_extra" "1")
3411 : (set_attr "prefix" "orig,orig,vex")
3412 34 : (set_attr "btver2_decode" "vector")
3413 34 : (set_attr "mode" "TI")])
3414 34 :
3415 : (define_expand "mmx_mulv4hi3"
3416 : [(set (match_operand:V4HI 0 "register_operand")
3417 : (mult:V4HI (match_operand:V4HI 1 "register_mmxmem_operand")
3418 : (match_operand:V4HI 2 "register_mmxmem_operand")))]
3419 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3420 33 : "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
3421 :
3422 : (define_expand "mulv4hi3"
3423 : [(set (match_operand:V4HI 0 "register_operand")
3424 33 : (mult:V4HI (match_operand:V4HI 1 "register_operand")
3425 : (match_operand:V4HI 2 "register_operand")))]
3426 : "TARGET_MMX_WITH_SSE")
3427 :
3428 33 : (define_insn "*mmx_mulv4hi3"
3429 : [(set (match_operand:V4HI 0 "register_operand" "=y,x,Yw")
3430 : (mult:V4HI (match_operand:V4HI 1 "register_mmxmem_operand" "%0,0,Yw")
3431 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw")))]
3432 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3433 25 : && ix86_binary_operator_ok (MULT, V4HImode, operands)"
3434 : "@
3435 25 : pmullw\t{%2, %0|%0, %2}
3436 25 : pmullw\t{%2, %0|%0, %2}
3437 : vpmullw\t{%2, %1, %0|%0, %1, %2}"
3438 : [(set_attr "isa" "*,sse2_noavx,avx")
3439 : (set_attr "mmx_isa" "native,*,*")
3440 : (set_attr "type" "mmxmul,ssemul,ssemul")
3441 25 : (set_attr "mode" "DI,TI,TI")])
3442 :
3443 : (define_insn "mulv2hi3"
3444 : [(set (match_operand:V2HI 0 "register_operand" "=x,Yw")
3445 : (mult:V2HI (match_operand:V2HI 1 "register_operand" "%0,Yw")
3446 15 : (match_operand:V2HI 2 "register_operand" "x,Yw")))]
3447 : "TARGET_SSE2"
3448 15 : "@
3449 15 : pmullw\t{%2, %0|%0, %2}
3450 : vpmullw\t{%2, %1, %0|%0, %1, %2}"
3451 : [(set_attr "isa" "noavx,avx")
3452 : (set_attr "type" "ssemul")
3453 15 : (set_attr "mode" "TI")])
3454 :
3455 : (define_expand "mulv8qi3"
3456 : [(set (match_operand:V8QI 0 "register_operand")
3457 : (mult:V8QI (match_operand:V8QI 1 "register_operand")
3458 11 : (match_operand:V8QI 2 "register_operand")))]
3459 : "TARGET_MMX_WITH_SSE"
3460 368 : {
3461 368 : ix86_expand_vecop_qihi_partial (MULT, operands[0], operands[1], operands[2]);
3462 357 : DONE;
3463 : })
3464 :
3465 11 : (define_expand "mulv4qi3"
3466 : [(set (match_operand:V4QI 0 "register_operand")
3467 : (mult:V4QI (match_operand:V4QI 1 "register_operand")
3468 : (match_operand:V4QI 2 "register_operand")))]
3469 : "TARGET_SSE2"
3470 962 : {
3471 938 : ix86_expand_vecop_qihi_partial (MULT, operands[0], operands[1], operands[2]);
3472 962 : DONE;
3473 24 : })
3474 :
3475 : (define_expand "mmx_smulv4hi3_highpart"
3476 38 : [(set (match_operand:V4HI 0 "register_operand")
3477 : (truncate:V4HI
3478 14 : (lshiftrt:V4SI
3479 14 : (mult:V4SI
3480 14 : (sign_extend:V4SI
3481 : (match_operand:V4HI 1 "register_mmxmem_operand"))
3482 294 : (sign_extend:V4SI
3483 : (match_operand:V4HI 2 "register_mmxmem_operand")))
3484 294 : (const_int 16))))]
3485 294 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3486 46 : "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
3487 :
3488 12 : (define_insn "*mmx_smulv4hi3_highpart"
3489 12 : [(set (match_operand:V4HI 0 "register_operand" "=y,x,Yw")
3490 46 : (truncate:V4HI
3491 : (lshiftrt:V4SI
3492 : (mult:V4SI
3493 : (sign_extend:V4SI
3494 : (match_operand:V4HI 1 "register_mmxmem_operand" "%0,0,Yw"))
3495 34 : (sign_extend:V4SI
3496 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw")))
3497 : (const_int 16))))]
3498 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3499 : && ix86_binary_operator_ok (MULT, V4HImode, operands)"
3500 22 : "@
3501 : pmulhw\t{%2, %0|%0, %2}
3502 22 : pmulhw\t{%2, %0|%0, %2}
3503 22 : vpmulhw\t{%2, %1, %0|%0, %1, %2}"
3504 22 : [(set_attr "isa" "*,sse2_noavx,avx")
3505 : (set_attr "mmx_isa" "native,*,*")
3506 : (set_attr "type" "mmxmul,ssemul,ssemul")
3507 : (set_attr "mode" "DI,TI,TI")])
3508 :
3509 : (define_expand "mmx_umulv4hi3_highpart"
3510 : [(set (match_operand:V4HI 0 "register_operand")
3511 : (truncate:V4HI
3512 : (lshiftrt:V4SI
3513 : (mult:V4SI
3514 : (zero_extend:V4SI
3515 : (match_operand:V4HI 1 "register_mmxmem_operand"))
3516 : (zero_extend:V4SI
3517 : (match_operand:V4HI 2 "register_mmxmem_operand")))
3518 : (const_int 16))))]
3519 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3520 : && (TARGET_SSE || TARGET_3DNOW_A)"
3521 22 : "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
3522 :
3523 : (define_insn "*mmx_umulv4hi3_highpart"
3524 : [(set (match_operand:V4HI 0 "register_operand" "=y,x,Yw")
3525 22 : (truncate:V4HI
3526 : (lshiftrt:V4SI
3527 : (mult:V4SI
3528 : (zero_extend:V4SI
3529 : (match_operand:V4HI 1 "register_mmxmem_operand" "%0,0,Yw"))
3530 22 : (zero_extend:V4SI
3531 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw")))
3532 : (const_int 16))))]
3533 17 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3534 247 : && (TARGET_SSE || TARGET_3DNOW_A)
3535 516 : && ix86_binary_operator_ok (MULT, V4HImode, operands)"
3536 : "@
3537 22 : pmulhuw\t{%2, %0|%0, %2}
3538 22 : pmulhuw\t{%2, %0|%0, %2}
3539 109 : vpmulhuw\t{%2, %1, %0|%0, %1, %2}"
3540 : [(set_attr "isa" "*,sse2_noavx,avx")
3541 : (set_attr "mmx_isa" "native,*,*")
3542 87 : (set_attr "type" "mmxmul,ssemul,ssemul")
3543 : (set_attr "mode" "DI,TI,TI")])
3544 :
3545 : (define_expand "<s>mulv4hi3_highpart"
3546 : [(set (match_operand:V4HI 0 "register_operand")
3547 : (truncate:V4HI
3548 : (lshiftrt:V4SI
3549 : (mult:V4SI
3550 : (any_extend:V4SI
3551 : (match_operand:V4HI 1 "register_operand"))
3552 : (any_extend:V4SI
3553 : (match_operand:V4HI 2 "register_operand")))
3554 : (const_int 16))))]
3555 : "TARGET_MMX_WITH_SSE")
3556 :
3557 : (define_insn "<s>mulv2hi3_highpart"
3558 : [(set (match_operand:V2HI 0 "register_operand" "=x,Yw")
3559 : (truncate:V2HI
3560 : (lshiftrt:V2SI
3561 : (mult:V2SI
3562 : (any_extend:V2SI
3563 : (match_operand:V2HI 1 "register_operand" "%0,Yw"))
3564 : (any_extend:V2SI
3565 : (match_operand:V2HI 2 "register_operand" "x,Yw")))
3566 : (const_int 16))))]
3567 : "TARGET_SSE2"
3568 : "@
3569 : pmulh<u>w\t{%2, %0|%0, %2}
3570 : vpmulh<u>w\t{%2, %1, %0|%0, %1, %2}"
3571 : [(set_attr "isa" "noavx,avx")
3572 : (set_attr "type" "ssemul")
3573 : (set_attr "mode" "TI")])
3574 :
3575 : (define_expand "mmx_pmaddwd"
3576 : [(set (match_operand:V2SI 0 "register_operand")
3577 : (plus:V2SI
3578 : (mult:V2SI
3579 : (sign_extend:V2SI
3580 : (vec_select:V2HI
3581 : (match_operand:V4HI 1 "register_mmxmem_operand")
3582 : (parallel [(const_int 0) (const_int 2)])))
3583 : (sign_extend:V2SI
3584 : (vec_select:V2HI
3585 : (match_operand:V4HI 2 "register_mmxmem_operand")
3586 : (parallel [(const_int 0) (const_int 2)]))))
3587 : (mult:V2SI
3588 : (sign_extend:V2SI
3589 : (vec_select:V2HI (match_dup 1)
3590 : (parallel [(const_int 1) (const_int 3)])))
3591 : (sign_extend:V2SI
3592 : (vec_select:V2HI (match_dup 2)
3593 : (parallel [(const_int 1) (const_int 3)]))))))]
3594 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3595 34 : "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
3596 :
3597 : (define_insn "*mmx_pmaddwd"
3598 : [(set (match_operand:V2SI 0 "register_operand" "=y,x,Yw")
3599 34 : (plus:V2SI
3600 : (mult:V2SI
3601 : (sign_extend:V2SI
3602 : (vec_select:V2HI
3603 : (match_operand:V4HI 1 "register_mmxmem_operand" "%0,0,Yw")
3604 : (parallel [(const_int 0) (const_int 2)])))
3605 : (sign_extend:V2SI
3606 : (vec_select:V2HI
3607 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw")
3608 : (parallel [(const_int 0) (const_int 2)]))))
3609 : (mult:V2SI
3610 34 : (sign_extend:V2SI
3611 : (vec_select:V2HI (match_dup 1)
3612 : (parallel [(const_int 1) (const_int 3)])))
3613 : (sign_extend:V2SI
3614 : (vec_select:V2HI (match_dup 2)
3615 16 : (parallel [(const_int 1) (const_int 3)]))))))]
3616 38 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3617 4518 : && ix86_binary_operator_ok (MULT, V4HImode, operands)"
3618 16 : "@
3619 : pmaddwd\t{%2, %0|%0, %2}
3620 : pmaddwd\t{%2, %0|%0, %2}
3621 22472 : vpmaddwd\t{%2, %1, %0|%0, %1, %2}"
3622 : [(set_attr "isa" "*,sse2_noavx,avx")
3623 : (set_attr "mmx_isa" "native,*,*")
3624 22456 : (set_attr "type" "mmxmul,sseiadd,sseiadd")
3625 : (set_attr "c86_attr" "madd")
3626 : (set_attr "mode" "DI,TI,TI")])
3627 370 :
3628 : (define_expand "mmx_pmulhrwv4hi3"
3629 370 : [(set (match_operand:V4HI 0 "register_operand")
3630 370 : (truncate:V4HI
3631 : (lshiftrt:V4SI
3632 : (plus:V4SI
3633 : (mult:V4SI
3634 : (sign_extend:V4SI
3635 : (match_operand:V4HI 1 "nonimmediate_operand"))
3636 : (sign_extend:V4SI
3637 : (match_operand:V4HI 2 "nonimmediate_operand")))
3638 : (const_vector:V4SI [(const_int 32768) (const_int 32768)
3639 : (const_int 32768) (const_int 32768)]))
3640 : (const_int 16))))]
3641 : "TARGET_3DNOW"
3642 14 : "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
3643 :
3644 : (define_insn "*mmx_pmulhrwv4hi3"
3645 : [(set (match_operand:V4HI 0 "register_operand" "=y")
3646 14 : (truncate:V4HI
3647 : (lshiftrt:V4SI
3648 : (plus:V4SI
3649 : (mult:V4SI
3650 : (sign_extend:V4SI
3651 : (match_operand:V4HI 1 "nonimmediate_operand" "%0"))
3652 : (sign_extend:V4SI
3653 : (match_operand:V4HI 2 "nonimmediate_operand" "ym")))
3654 14 : (const_vector:V4SI [(const_int 32768) (const_int 32768)
3655 : (const_int 32768) (const_int 32768)]))
3656 : (const_int 16))))]
3657 87 : "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V4HImode, operands)"
3658 : "pmulhrw\t{%2, %0|%0, %2}"
3659 3 : [(set_attr "type" "mmxmul")
3660 : (set_attr "prefix_extra" "1")
3661 233 : (set_attr "mode" "DI")])
3662 3 :
3663 : (define_expand "sse2_umulv1siv1di3"
3664 230 : [(set (match_operand:V1DI 0 "register_operand")
3665 : (mult:V1DI
3666 3 : (zero_extend:V1DI
3667 : (vec_select:V1SI
3668 : (match_operand:V2SI 1 "register_mmxmem_operand")
3669 : (parallel [(const_int 0)])))
3670 : (zero_extend:V1DI
3671 89 : (vec_select:V1SI
3672 : (match_operand:V2SI 2 "register_mmxmem_operand")
3673 89 : (parallel [(const_int 0)])))))]
3674 89 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE2"
3675 12 : "ix86_fixup_binary_operands_no_copy (MULT, V2SImode, operands);")
3676 :
3677 : (define_insn "*sse2_umulv1siv1di3"
3678 89 : [(set (match_operand:V1DI 0 "register_operand" "=y,x,Yv")
3679 12 : (mult:V1DI
3680 : (zero_extend:V1DI
3681 : (vec_select:V1SI
3682 : (match_operand:V2SI 1 "register_mmxmem_operand" "%0,0,Yv")
3683 : (parallel [(const_int 0)])))
3684 0 : (zero_extend:V1DI
3685 12 : (vec_select:V1SI
3686 0 : (match_operand:V2SI 2 "register_mmxmem_operand" "ym,x,Yv")
3687 0 : (parallel [(const_int 0)])))))]
3688 7 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3689 65 : && TARGET_SSE2
3690 131 : && ix86_binary_operator_ok (MULT, V2SImode, operands)"
3691 : "@
3692 1 : pmuludq\t{%2, %0|%0, %2}
3693 1 : pmuludq\t{%2, %0|%0, %2}
3694 299332 : vpmuludq\t{%2, %1, %0|%0, %1, %2}"
3695 : [(set_attr "isa" "*,sse2_noavx,avx")
3696 : (set_attr "mmx_isa" "native,*,*")
3697 299333 : (set_attr "type" "mmxmul,ssemul,ssemul")
3698 : (set_attr "mode" "DI,TI,TI")])
3699 :
3700 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3701 : ;;
3702 17 : ;; Parallel integral shifts
3703 : ;;
3704 17 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3705 17 :
3706 : (define_insn "<code><mode>3"
3707 : [(set (match_operand:MMXMODE14 0 "register_operand" "=Yr,*x,Yv")
3708 17 : (smaxmin:MMXMODE14
3709 : (match_operand:MMXMODE14 1 "register_operand" "%0,0,Yv")
3710 : (match_operand:MMXMODE14 2 "register_operand" "Yr,*x,Yv")))]
3711 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
3712 : "@
3713 : p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
3714 0 : p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
3715 : vp<maxmin_int><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3716 0 : [(set_attr "isa" "noavx,noavx,avx")
3717 0 : (set_attr "type" "sseiadd")
3718 : (set_attr "prefix_extra" "1")
3719 : (set_attr "prefix" "orig,orig,vex")
3720 : (set_attr "mode" "TI")])
3721 :
3722 : (define_expand "mmx_<code>v4hi3"
3723 : [(set (match_operand:V4HI 0 "register_operand")
3724 : (smaxmin:V4HI
3725 : (match_operand:V4HI 1 "register_mmxmem_operand")
3726 : (match_operand:V4HI 2 "register_mmxmem_operand")))]
3727 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3728 : && (TARGET_SSE || TARGET_3DNOW_A)"
3729 44 : "ix86_fixup_binary_operands_no_copy (<CODE>, V4HImode, operands);")
3730 :
3731 : (define_insn "*mmx_<code>v4hi3"
3732 : [(set (match_operand:V4HI 0 "register_operand" "=y,x,Yw")
3733 44 : (smaxmin:V4HI
3734 : (match_operand:V4HI 1 "register_mmxmem_operand" "%0,0,Yw")
3735 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw")))]
3736 80 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3737 514 : && (TARGET_SSE || TARGET_3DNOW_A)
3738 729 : && ix86_binary_operator_ok (<CODE>, V4HImode, operands)"
3739 : "@
3740 : p<maxmin_int>w\t{%2, %0|%0, %2}
3741 : p<maxmin_int>w\t{%2, %0|%0, %2}
3742 706 : vp<maxmin_int>w\t{%2, %1, %0|%0, %1, %2}"
3743 : [(set_attr "isa" "*,sse2_noavx,avx")
3744 44 : (set_attr "mmx_isa" "native,*,*")
3745 706 : (set_attr "type" "mmxadd,sseiadd,sseiadd")
3746 44 : (set_attr "mode" "DI,TI,TI")])
3747 :
3748 : (define_expand "<code>v4hi3"
3749 : [(set (match_operand:V4HI 0 "register_operand")
3750 : (smaxmin:V4HI
3751 : (match_operand:V4HI 1 "register_operand")
3752 : (match_operand:V4HI 2 "register_operand")))]
3753 : "TARGET_MMX_WITH_SSE")
3754 :
3755 : (define_insn "<code><mode>3"
3756 : [(set (match_operand:VI1_16_32 0 "register_operand" "=Yr,*x,Yv")
3757 : (smaxmin:VI1_16_32
3758 : (match_operand:VI1_16_32 1 "register_operand" "%0,0,Yv")
3759 : (match_operand:VI1_16_32 2 "register_operand" "Yr,*x,Yv")))]
3760 : "TARGET_SSE4_1"
3761 : "@
3762 : p<maxmin_int>b\t{%2, %0|%0, %2}
3763 : p<maxmin_int>b\t{%2, %0|%0, %2}
3764 : vp<maxmin_int>b\t{%2, %1, %0|%0, %1, %2}"
3765 : [(set_attr "isa" "noavx,noavx,avx")
3766 : (set_attr "type" "sseiadd")
3767 : (set_attr "prefix_extra" "1")
3768 : (set_attr "prefix" "orig,orig,vex")
3769 : (set_attr "mode" "TI")])
3770 :
3771 : (define_insn "<code>v2hi3"
3772 : [(set (match_operand:V2HI 0 "register_operand" "=x,Yw")
3773 : (smaxmin:V2HI
3774 : (match_operand:V2HI 1 "register_operand" "%0,Yw")
3775 : (match_operand:V2HI 2 "register_operand" "x,Yw")))]
3776 : "TARGET_SSE2"
3777 : "@
3778 : p<maxmin_int>w\t{%2, %0|%0, %2}
3779 : vp<maxmin_int>w\t{%2, %1, %0|%0, %1, %2}"
3780 : [(set_attr "isa" "noavx,avx")
3781 : (set_attr "type" "sseiadd")
3782 : (set_attr "mode" "TI")])
3783 :
3784 : (define_insn "<code><mode>3"
3785 : [(set (match_operand:MMXMODE24 0 "register_operand" "=Yr,*x,Yv")
3786 : (umaxmin:MMXMODE24
3787 : (match_operand:MMXMODE24 1 "register_operand" "%0,0,Yv")
3788 : (match_operand:MMXMODE24 2 "register_operand" "Yr,*x,Yv")))]
3789 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
3790 : "@
3791 : p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
3792 : p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
3793 : vp<maxmin_int><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3794 : [(set_attr "isa" "noavx,noavx,avx")
3795 : (set_attr "type" "sseiadd")
3796 : (set_attr "prefix_extra" "1")
3797 : (set_attr "prefix" "orig,orig,vex")
3798 : (set_attr "mode" "TI")])
3799 :
3800 : (define_expand "mmx_<code>v8qi3"
3801 : [(set (match_operand:V8QI 0 "register_operand")
3802 : (umaxmin:V8QI
3803 : (match_operand:V8QI 1 "register_mmxmem_operand")
3804 : (match_operand:V8QI 2 "register_mmxmem_operand")))]
3805 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3806 : && (TARGET_SSE || TARGET_3DNOW_A)"
3807 44 : "ix86_fixup_binary_operands_no_copy (<CODE>, V8QImode, operands);")
3808 :
3809 : (define_insn "*mmx_<code>v8qi3"
3810 : [(set (match_operand:V8QI 0 "register_operand" "=y,x,Yw")
3811 44 : (umaxmin:V8QI
3812 : (match_operand:V8QI 1 "register_mmxmem_operand" "%0,0,Yw")
3813 : (match_operand:V8QI 2 "register_mmxmem_operand" "ym,x,Yw")))]
3814 34 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3815 324 : && (TARGET_SSE || TARGET_3DNOW_A)
3816 560 : && ix86_binary_operator_ok (<CODE>, V8QImode, operands)"
3817 : "@
3818 : p<maxmin_int>b\t{%2, %0|%0, %2}
3819 : p<maxmin_int>b\t{%2, %0|%0, %2}
3820 510 : vp<maxmin_int>b\t{%2, %1, %0|%0, %1, %2}"
3821 0 : [(set_attr "isa" "*,sse2_noavx,avx")
3822 287 : (set_attr "mmx_isa" "native,*,*")
3823 510 : (set_attr "type" "mmxadd,sseiadd,sseiadd")
3824 0 : (set_attr "mode" "DI,TI,TI")])
3825 :
3826 : (define_expand "<code>v8qi3"
3827 287 : [(set (match_operand:V8QI 0 "register_operand")
3828 : (umaxmin:V8QI
3829 : (match_operand:V8QI 1 "register_operand")
3830 : (match_operand:V8QI 2 "register_operand")))]
3831 : "TARGET_MMX_WITH_SSE")
3832 82 :
3833 : (define_insn "<code><mode>3"
3834 82 : [(set (match_operand:VI1_16_32 0 "register_operand" "=x,Yw")
3835 82 : (umaxmin:VI1_16_32
3836 : (match_operand:VI1_16_32 1 "register_operand" "%0,Yw")
3837 : (match_operand:VI1_16_32 2 "register_operand" "x,Yw")))]
3838 : "TARGET_SSE2"
3839 82 : "@
3840 : p<maxmin_int>b\t{%2, %0|%0, %2}
3841 : vp<maxmin_int>b\t{%2, %1, %0|%0, %1, %2}"
3842 : [(set_attr "isa" "noavx,avx")
3843 : (set_attr "type" "sseiadd")
3844 : (set_attr "mode" "TI")])
3845 75 :
3846 : (define_insn "<code>v2hi3"
3847 75 : [(set (match_operand:V2HI 0 "register_operand" "=Yr,*x,Yv")
3848 75 : (umaxmin:V2HI
3849 : (match_operand:V2HI 1 "register_operand" "%0,0,Yv")
3850 : (match_operand:V2HI 2 "register_operand" "Yr,*x,Yv")))]
3851 : "TARGET_SSE4_1"
3852 : "@
3853 : p<maxmin_int>w\t{%2, %0|%0, %2}
3854 : p<maxmin_int>w\t{%2, %0|%0, %2}
3855 : vp<maxmin_int>w\t{%2, %1, %0|%0, %1, %2}"
3856 : [(set_attr "isa" "noavx,noavx,avx")
3857 : (set_attr "type" "sseiadd")
3858 : (set_attr "prefix_extra" "1")
3859 : (set_attr "prefix" "orig,orig,vex")
3860 : (set_attr "mode" "TI")])
3861 :
3862 : (define_insn "ssse3_abs<mode>2"
3863 : [(set (match_operand:MMXMODEI 0 "register_operand" "=y,Yv")
3864 : (abs:MMXMODEI
3865 : (match_operand:MMXMODEI 1 "register_mmxmem_operand" "ym,Yv")))]
3866 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSSE3"
3867 : "@
3868 : pabs<mmxvecsize>\t{%1, %0|%0, %1}
3869 : %vpabs<mmxvecsize>\t{%1, %0|%0, %1}"
3870 : [(set_attr "mmx_isa" "native,*")
3871 : (set_attr "type" "sselog1")
3872 : (set_attr "prefix_rep" "0")
3873 : (set_attr "prefix_extra" "1")
3874 : (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
3875 : (set_attr "mode" "DI,TI")])
3876 :
3877 : (define_expand "abs<mode>2"
3878 : [(set (match_operand:MMXMODEI 0 "register_operand")
3879 : (abs:MMXMODEI
3880 : (match_operand:MMXMODEI 1 "register_operand")))]
3881 : "TARGET_SSSE3 && TARGET_MMX_WITH_SSE")
3882 :
3883 : (define_insn "abs<mode>2"
3884 : [(set (match_operand:VI_16_32 0 "register_operand" "=Yv")
3885 : (abs:VI_16_32
3886 : (match_operand:VI_16_32 1 "register_operand" "Yv")))]
3887 : "TARGET_SSSE3"
3888 : "%vpabs<mmxvecsize>\t{%1, %0|%0, %1}"
3889 : [(set_attr "type" "sselog1")
3890 : (set_attr "prefix_rep" "0")
3891 : (set_attr "prefix_extra" "1")
3892 : (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
3893 : (set_attr "mode" "TI")])
3894 :
3895 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3896 : ;;
3897 : ;; Parallel integral shifts
3898 : ;;
3899 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3900 :
3901 : (define_insn "mmx_ashr<mode>3"
3902 : [(set (match_operand:MMXMODE24 0 "register_operand" "=y,x,<Yv_Yw>")
3903 : (ashiftrt:MMXMODE24
3904 : (match_operand:MMXMODE24 1 "register_operand" "0,0,<Yv_Yw>")
3905 : (match_operand:DI 2 "nonmemory_operand" "yN,xN,<Yv_Yw>N")))]
3906 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3907 : "@
3908 : psra<mmxvecsize>\t{%2, %0|%0, %2}
3909 : psra<mmxvecsize>\t{%2, %0|%0, %2}
3910 : vpsra<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3911 : [(set_attr "isa" "*,sse2_noavx,avx")
3912 : (set_attr "mmx_isa" "native,*,*")
3913 : (set_attr "type" "mmxshft,sseishft,sseishft")
3914 : (set (attr "length_immediate")
3915 : (if_then_else (match_operand 2 "const_int_operand")
3916 : (const_string "1")
3917 : (const_string "0")))
3918 : (set_attr "mode" "DI,TI,TI")])
3919 :
3920 : (define_insn_and_split "*mmx_ashr<mode>3_1"
3921 : [(set (match_operand:MMXMODE24 0 "register_operand")
3922 : (lt:MMXMODE24
3923 : (match_operand:MMXMODE24 1 "register_operand")
3924 : (match_operand:MMXMODE24 2 "const0_operand")))]
3925 : "TARGET_MMX_WITH_SSE && ix86_pre_reload_split ()"
3926 : "#"
3927 : "&& 1"
3928 : [(set (match_dup 0) (ashiftrt:MMXMODE24 (match_dup 1) (match_dup 3)))]
3929 664 : "operands[3] = gen_int_mode (<mmxscalarsize> - 1, DImode);")
3930 :
3931 : (define_expand "ashr<mode>3"
3932 664 : [(set (match_operand:MMXMODE24 0 "register_operand")
3933 : (ashiftrt:MMXMODE24
3934 : (match_operand:MMXMODE24 1 "register_operand")
3935 : (match_operand:DI 2 "nonmemory_operand")))]
3936 664 : "TARGET_MMX_WITH_SSE")
3937 :
3938 : (define_insn "mmx_<insn><mode>3"
3939 : [(set (match_operand:MMXMODE248 0 "register_operand" "=y,x,<Yv_Yw>")
3940 : (any_lshift:MMXMODE248
3941 1509 : (match_operand:MMXMODE248 1 "register_operand" "0,0,<Yv_Yw>")
3942 : (match_operand:DI 2 "nonmemory_operand" "yN,xN,<Yv_Yw>N")))]
3943 1509 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3944 1509 : "@
3945 : p<vshift><mmxvecsize>\t{%2, %0|%0, %2}
3946 : p<vshift><mmxvecsize>\t{%2, %0|%0, %2}
3947 : vp<vshift><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3948 1509 : [(set_attr "isa" "*,sse2_noavx,avx")
3949 : (set_attr "mmx_isa" "native,*,*")
3950 : (set_attr "type" "mmxshft,sseishft,sseishft")
3951 : (set (attr "length_immediate")
3952 : (if_then_else (match_operand 2 "const_int_operand")
3953 79 : (const_string "1")
3954 : (const_string "0")))
3955 79 : (set_attr "mode" "DI,TI,TI")])
3956 79 :
3957 79 : (define_split
3958 : [(set (match_operand:MMXMODE248 0 "register_operand")
3959 : (and:MMXMODE248
3960 : (lt:MMXMODE248
3961 : (match_operand:MMXMODE248 1 "register_operand")
3962 : (match_operand:MMXMODE248 2 "const0_operand"))
3963 : (match_operand:MMXMODE248 3 "const1_operand")))]
3964 : "TARGET_MMX_WITH_SSE && ix86_pre_reload_split ()"
3965 : [(set (match_dup 0) (lshiftrt:MMXMODE248 (match_dup 1) (match_dup 4)))]
3966 0 : "operands[4] = gen_int_mode (<mmxscalarsize> - 1, DImode);")
3967 :
3968 : (define_expand "<insn><mode>3"
3969 0 : [(set (match_operand:MMXMODE24 0 "register_operand")
3970 : (any_lshift:MMXMODE24
3971 : (match_operand:MMXMODE24 1 "register_operand")
3972 : (match_operand:DI 2 "nonmemory_operand")))]
3973 0 : "TARGET_MMX_WITH_SSE")
3974 :
3975 : (define_insn "mmx_<insn>v1si3"
3976 : [(set (match_operand:V1SI 0 "register_operand" "=x,Yw")
3977 : (any_lshift:V1SI
3978 333 : (match_operand:V1SI 1 "register_operand" "0,Yw")
3979 0 : (match_operand:DI 2 "nonmemory_operand" "xN,YwN")))]
3980 333 : "TARGET_SSE2"
3981 333 : "@
3982 22 : p<vshift>d\t{%2, %0|%0, %2}
3983 : vp<vshift>d\t{%2, %1, %0|%0, %1, %2}"
3984 : [(set_attr "isa" "noavx,avx")
3985 311 : (set_attr "type" "sseishft")
3986 : (set (attr "length_immediate")
3987 : (if_then_else (match_operand 2 "const_int_operand")
3988 : (const_string "1")
3989 : (const_string "0")))
3990 4 : (set_attr "mode" "TI")])
3991 :
3992 4 : (define_insn "<insn>v2hi3"
3993 4 : [(set (match_operand:V2HI 0 "register_operand" "=x,Yw")
3994 4 : (any_shift:V2HI
3995 : (match_operand:V2HI 1 "register_operand" "0,Yw")
3996 : (match_operand:DI 2 "nonmemory_operand" "xN,YwN")))]
3997 : "TARGET_SSE2"
3998 : "@
3999 : p<vshift>w\t{%2, %0|%0, %2}
4000 : vp<vshift>w\t{%2, %1, %0|%0, %1, %2}"
4001 : [(set_attr "isa" "noavx,avx")
4002 : (set_attr "type" "sseishft")
4003 : (set (attr "length_immediate")
4004 : (if_then_else (match_operand 2 "const_int_operand")
4005 : (const_string "1")
4006 : (const_string "0")))
4007 : (set_attr "mode" "TI")])
4008 :
4009 : (define_insn_and_split "*mmx_ashrv2hi3_1"
4010 : [(set (match_operand:V2HI 0 "register_operand")
4011 : (lt:V2HI
4012 : (match_operand:V2HI 1 "register_operand")
4013 : (match_operand:V2HI 2 "const0_operand")))]
4014 : "TARGET_SSE2 && ix86_pre_reload_split ()"
4015 : "#"
4016 : "&& 1"
4017 : [(set (match_dup 0) (ashiftrt:V2HI (match_dup 1) (match_dup 3)))]
4018 75 : "operands[3] = gen_int_mode (15, DImode);")
4019 :
4020 : (define_split
4021 75 : [(set (match_operand:V2HI 0 "register_operand")
4022 : (and:V2HI
4023 : (lt:V2HI
4024 : (match_operand:V2HI 1 "register_operand")
4025 75 : (match_operand:V2HI 2 "const0_operand"))
4026 : (match_operand:V2HI 3 "const1_operand")))]
4027 : "TARGET_SSE2 && ix86_pre_reload_split ()"
4028 : [(set (match_dup 0) (lshiftrt:V2HI (match_dup 1) (match_dup 4)))]
4029 0 : "operands[4] = gen_int_mode (15, DImode);")
4030 18 :
4031 : (define_expand "<insn>v8qi3"
4032 18 : [(set (match_operand:V8QI 0 "register_operand")
4033 18 : (any_shift:V8QI (match_operand:V8QI 1 "register_operand")
4034 18 : (match_operand:DI 2 "nonmemory_operand")))]
4035 : "TARGET_MMX_WITH_SSE"
4036 101 : {
4037 101 : ix86_expand_vecop_qihi_partial (<CODE>, operands[0],
4038 : operands[1], operands[2]);
4039 101 : DONE;
4040 : })
4041 11 :
4042 : (define_expand "<insn>v4qi3"
4043 11 : [(set (match_operand:V4QI 0 "register_operand")
4044 11 : (any_shift:V4QI (match_operand:V4QI 1 "register_operand")
4045 11 : (match_operand:DI 2 "nonmemory_operand")))]
4046 : "TARGET_SSE2"
4047 33 : {
4048 33 : ix86_expand_vecop_qihi_partial (<CODE>, operands[0],
4049 : operands[1], operands[2]);
4050 33 : DONE;
4051 : })
4052 :
4053 : (define_insn_and_split "<insn>v2qi3"
4054 83 : [(set (match_operand:V2QI 0 "register_operand" "=Q")
4055 : (any_shift:V2QI
4056 83 : (match_operand:V2QI 1 "register_operand" "0")
4057 83 : (match_operand:QI 2 "nonmemory_operand" "cI")))
4058 : (clobber (reg:CC FLAGS_REG))]
4059 1120 : "!TARGET_PARTIAL_REG_STALL || optimize_size"
4060 : "#"
4061 : "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
4062 : && reload_completed"
4063 8550 : [(parallel
4064 9 : [(set (zero_extract:HI (match_dup 3) (const_int 8) (const_int 8))
4065 : (subreg:HI
4066 8559 : (any_shift:QI
4067 9 : (subreg:QI
4068 9 : (zero_extract:HI (match_dup 4)
4069 : (const_int 8)
4070 : (const_int 8)) 0)
4071 : (match_dup 2)) 0))
4072 : (clobber (reg:CC FLAGS_REG))])
4073 : (parallel
4074 : [(set (strict_low_part (match_dup 0))
4075 : (any_shift:QI (match_dup 1) (match_dup 2)))
4076 : (clobber (reg:CC FLAGS_REG))])]
4077 83 : {
4078 83 : operands[4] = lowpart_subreg (HImode, operands[1], V2QImode);
4079 83 : operands[3] = lowpart_subreg (HImode, operands[0], V2QImode);
4080 83 : operands[1] = lowpart_subreg (QImode, operands[1], V2QImode);
4081 83 : operands[0] = lowpart_subreg (QImode, operands[0], V2QImode);
4082 : }
4083 : [(set_attr "type" "multi")
4084 : (set_attr "mode" "QI")])
4085 83 :
4086 : (define_expand "v<insn>v8qi3"
4087 : [(set (match_operand:V8QI 0 "register_operand")
4088 : (any_shift:V8QI
4089 : (match_operand:V8QI 1 "register_operand")
4090 : (match_operand:V8QI 2 "register_operand")))]
4091 : "TARGET_AVX512BW && TARGET_AVX512VL && TARGET_MMX_WITH_SSE"
4092 9 : {
4093 9 : ix86_expand_vecop_qihi_partial (<CODE>, operands[0],
4094 83 : operands[1], operands[2]);
4095 9 : DONE;
4096 : })
4097 :
4098 : (define_expand "v<insn>v4qi3"
4099 3 : [(set (match_operand:V4QI 0 "register_operand")
4100 : (any_shift:V4QI
4101 3 : (match_operand:V4QI 1 "register_operand")
4102 3 : (match_operand:V4QI 2 "register_operand")))]
4103 3 : "TARGET_AVX512BW && TARGET_AVX512VL"
4104 4 : {
4105 4 : ix86_expand_vecop_qihi_partial (<CODE>, operands[0],
4106 : operands[1], operands[2]);
4107 4 : DONE;
4108 : })
4109 5 :
4110 : (define_expand "vec_shl_<mode>"
4111 5 : [(set (match_operand:V248FI 0 "register_operand")
4112 5 : (ashift:V1DI
4113 5 : (match_operand:V248FI 1 "nonimmediate_operand")
4114 : (match_operand:DI 2 "nonmemory_operand")))]
4115 : "TARGET_MMX_WITH_SSE"
4116 9 : {
4117 14 : rtx op0 = gen_reg_rtx (V1DImode);
4118 9 : rtx op1 = force_reg (<MODE>mode, operands[1]);
4119 :
4120 9 : emit_insn (gen_mmx_ashlv1di3
4121 9 : (op0, gen_lowpart (V1DImode, op1), operands[2]));
4122 9 : emit_move_insn (operands[0], gen_lowpart (<MODE>mode, op0));
4123 9 : DONE;
4124 5 : })
4125 5 :
4126 : (define_expand "vec_shl_<mode>"
4127 : [(set (match_operand:V24FI_32 0 "register_operand")
4128 : (ashift:V1SI
4129 : (match_operand:V24FI_32 1 "nonimmediate_operand")
4130 : (match_operand:DI 2 "nonmemory_operand")))]
4131 : "TARGET_SSE2"
4132 4 : {
4133 8 : rtx op0 = gen_reg_rtx (V1SImode);
4134 4 : rtx op1 = force_reg (<MODE>mode, operands[1]);
4135 :
4136 4 : emit_insn (gen_mmx_ashlv1si3
4137 1069 : (op0, gen_lowpart (V1SImode, op1), operands[2]));
4138 4 : emit_move_insn (operands[0], gen_lowpart (<MODE>mode, op0));
4139 1069 : DONE;
4140 1069 : })
4141 1069 :
4142 : (define_expand "vec_shr_<mode>"
4143 : [(set (match_operand:V248FI 0 "register_operand")
4144 : (lshiftrt:V1DI
4145 : (match_operand:V248FI 1 "nonimmediate_operand")
4146 : (match_operand:DI 2 "nonmemory_operand")))]
4147 : "TARGET_MMX_WITH_SSE"
4148 1093 : {
4149 1121 : rtx op0 = gen_reg_rtx (V1DImode);
4150 1093 : rtx op1 = force_reg (<MODE>mode, operands[1]);
4151 :
4152 1093 : emit_insn (gen_mmx_lshrv1di3
4153 1093 : (op0, gen_lowpart (V1DImode, op1), operands[2]));
4154 1093 : emit_move_insn (operands[0], gen_lowpart (<MODE>mode, op0));
4155 1093 : DONE;
4156 28 : })
4157 28 :
4158 : (define_expand "vec_shr_<mode>"
4159 : [(set (match_operand:V24FI_32 0 "register_operand")
4160 : (lshiftrt:V1SI
4161 : (match_operand:V24FI_32 1 "nonimmediate_operand")
4162 : (match_operand:DI 2 "nonmemory_operand")))]
4163 : "TARGET_SSE2"
4164 241 : {
4165 482 : rtx op0 = gen_reg_rtx (V1SImode);
4166 241 : rtx op1 = force_reg (<MODE>mode, operands[1]);
4167 :
4168 241 : emit_insn (gen_mmx_lshrv1si3
4169 313 : (op0, gen_lowpart (V1SImode, op1), operands[2]));
4170 241 : emit_move_insn (operands[0], gen_lowpart (<MODE>mode, op0));
4171 313 : DONE;
4172 313 : })
4173 313 :
4174 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4175 : ;;
4176 : ;; Parallel integral comparisons
4177 : ;;
4178 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4179 :
4180 : (define_expand "mmx_eq<mode>3"
4181 : [(set (match_operand:MMXMODEI 0 "register_operand")
4182 : (eq:MMXMODEI
4183 : (match_operand:MMXMODEI 1 "register_mmxmem_operand")
4184 : (match_operand:MMXMODEI 2 "register_mmxmem_operand")))]
4185 813 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4186 105 : "ix86_fixup_binary_operands_no_copy (EQ, <MODE>mode, operands);")
4187 813 :
4188 813 : (define_insn "*mmx_eq<mode>3"
4189 813 : [(set (match_operand:MMXMODEI 0 "register_operand" "=y,x,x")
4190 105 : (eq:MMXMODEI
4191 : (match_operand:MMXMODEI 1 "register_mmxmem_operand" "%0,0,x")
4192 : (match_operand:MMXMODEI 2 "register_mmxmem_operand" "ym,x,x")))]
4193 52 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
4194 11699 : && ix86_binary_operator_ok (EQ, <MODE>mode, operands)"
4195 : "@
4196 : pcmpeq<mmxvecsize>\t{%2, %0|%0, %2}
4197 : pcmpeq<mmxvecsize>\t{%2, %0|%0, %2}
4198 13794 : vpcmpeq<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
4199 184 : [(set_attr "isa" "*,sse2_noavx,avx")
4200 : (set_attr "mmx_isa" "native,*,*")
4201 13978 : (set_attr "type" "mmxcmp,ssecmp,ssecmp")
4202 184 : (set_attr "mode" "DI,TI,TI")])
4203 184 :
4204 : (define_insn "*eq<mode>3"
4205 : [(set (match_operand:VI_16_32 0 "register_operand" "=x,x")
4206 : (eq:VI_16_32
4207 : (match_operand:VI_16_32 1 "register_operand" "%0,x")
4208 : (match_operand:VI_16_32 2 "register_operand" "x,x")))]
4209 : "TARGET_SSE2"
4210 : "@
4211 : pcmpeq<mmxvecsize>\t{%2, %0|%0, %2}
4212 : vpcmpeq<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
4213 : [(set_attr "isa" "noavx,avx")
4214 : (set_attr "type" "ssecmp")
4215 : (set_attr "mode" "TI")])
4216 :
4217 : (define_insn "mmx_gt<mode>3"
4218 : [(set (match_operand:MMXMODEI 0 "register_operand" "=y,x,x")
4219 : (gt:MMXMODEI
4220 : (match_operand:MMXMODEI 1 "register_operand" "0,0,x")
4221 : (match_operand:MMXMODEI 2 "register_mmxmem_operand" "ym,x,x")))]
4222 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4223 : "@
4224 : pcmpgt<mmxvecsize>\t{%2, %0|%0, %2}
4225 : pcmpgt<mmxvecsize>\t{%2, %0|%0, %2}
4226 : vpcmpgt<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
4227 : [(set_attr "isa" "*,sse2_noavx,avx")
4228 : (set_attr "mmx_isa" "native,*,*")
4229 : (set_attr "type" "mmxcmp,ssecmp,ssecmp")
4230 : (set_attr "mode" "DI,TI,TI")])
4231 :
4232 : (define_insn "*gt<mode>3"
4233 : [(set (match_operand:VI_16_32 0 "register_operand" "=x,x")
4234 : (gt:VI_16_32
4235 : (match_operand:VI_16_32 1 "register_operand" "0,x")
4236 : (match_operand:VI_16_32 2 "register_operand" "x,x")))]
4237 : "TARGET_SSE2"
4238 : "@
4239 : pcmpgt<mmxvecsize>\t{%2, %0|%0, %2}
4240 : vpcmpgt<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
4241 : [(set_attr "isa" "noavx,avx")
4242 : (set_attr "type" "ssecmp")
4243 : (set_attr "mode" "TI")])
4244 :
4245 : (define_insn "*xop_maskcmp<mode>3"
4246 : [(set (match_operand:MMXMODEI 0 "register_operand" "=x")
4247 : (match_operator:MMXMODEI 1 "ix86_comparison_int_operator"
4248 : [(match_operand:MMXMODEI 2 "register_operand" "x")
4249 : (match_operand:MMXMODEI 3 "register_operand" "x")]))]
4250 : "TARGET_XOP"
4251 : "vpcom%Y1<mmxvecsize>\t{%3, %2, %0|%0, %2, %3}"
4252 : [(set_attr "type" "sse4arg")
4253 : (set_attr "mode" "TI")])
4254 :
4255 : (define_insn "*xop_maskcmp<mode>3"
4256 : [(set (match_operand:VI_16_32 0 "register_operand" "=x")
4257 : (match_operator:VI_16_32 1 "ix86_comparison_int_operator"
4258 : [(match_operand:VI_16_32 2 "register_operand" "x")
4259 : (match_operand:VI_16_32 3 "register_operand" "x")]))]
4260 : "TARGET_XOP"
4261 : "vpcom%Y1<mmxvecsize>\t{%3, %2, %0|%0, %2, %3}"
4262 : [(set_attr "type" "sse4arg")
4263 : (set_attr "mode" "TI")])
4264 :
4265 : (define_insn "*xop_maskcmp_uns<mode>3"
4266 : [(set (match_operand:MMXMODEI 0 "register_operand" "=x")
4267 : (match_operator:MMXMODEI 1 "ix86_comparison_uns_operator"
4268 : [(match_operand:MMXMODEI 2 "register_operand" "x")
4269 : (match_operand:MMXMODEI 3 "register_operand" "x")]))]
4270 : "TARGET_XOP"
4271 : "vpcom%Y1u<mmxvecsize>\t{%3, %2, %0|%0, %2, %3}"
4272 : [(set_attr "type" "sse4arg")
4273 : (set_attr "mode" "TI")])
4274 :
4275 : (define_insn "*xop_maskcmp_uns<mode>3"
4276 : [(set (match_operand:VI_16_32 0 "register_operand" "=x")
4277 : (match_operator:VI_16_32 1 "ix86_comparison_uns_operator"
4278 : [(match_operand:VI_16_32 2 "register_operand" "x")
4279 : (match_operand:VI_16_32 3 "register_operand" "x")]))]
4280 : "TARGET_XOP"
4281 : "vpcom%Y1u<mmxvecsize>\t{%3, %2, %0|%0, %2, %3}"
4282 : [(set_attr "type" "sse4arg")
4283 : (set_attr "mode" "TI")])
4284 :
4285 : (define_expand "vec_cmp<mode><mode>"
4286 : [(set (match_operand:MMXMODEI 0 "register_operand")
4287 : (match_operator:MMXMODEI 1 ""
4288 : [(match_operand:MMXMODEI 2 "register_operand")
4289 : (match_operand:MMXMODEI 3 "register_operand")]))]
4290 : "TARGET_MMX_WITH_SSE"
4291 840 : {
4292 840 : bool ok = ix86_expand_int_vec_cmp (operands);
4293 840 : gcc_assert (ok);
4294 840 : DONE;
4295 : })
4296 :
4297 : (define_expand "vec_cmp<mode><mode>"
4298 : [(set (match_operand:VI_16_32 0 "register_operand")
4299 : (match_operator:VI_16_32 1 ""
4300 : [(match_operand:VI_16_32 2 "register_operand")
4301 : (match_operand:VI_16_32 3 "register_operand")]))]
4302 : "TARGET_SSE2"
4303 124 : {
4304 124 : bool ok = ix86_expand_int_vec_cmp (operands);
4305 124 : gcc_assert (ok);
4306 124 : DONE;
4307 : })
4308 251 :
4309 : (define_expand "vec_cmpu<mode><mode>"
4310 251 : [(set (match_operand:MMXMODEI 0 "register_operand")
4311 251 : (match_operator:MMXMODEI 1 ""
4312 251 : [(match_operand:MMXMODEI 2 "register_operand")
4313 : (match_operand:MMXMODEI 3 "register_operand")]))]
4314 : "TARGET_MMX_WITH_SSE"
4315 251 : {
4316 251 : bool ok = ix86_expand_int_vec_cmp (operands);
4317 251 : gcc_assert (ok);
4318 251 : DONE;
4319 : })
4320 111 :
4321 : (define_expand "vec_cmpu<mode><mode>"
4322 111 : [(set (match_operand:VI_16_32 0 "register_operand")
4323 111 : (match_operator:VI_16_32 1 ""
4324 111 : [(match_operand:VI_16_32 2 "register_operand")
4325 : (match_operand:VI_16_32 3 "register_operand")]))]
4326 : "TARGET_SSE2"
4327 111 : {
4328 111 : bool ok = ix86_expand_int_vec_cmp (operands);
4329 111 : gcc_assert (ok);
4330 111 : DONE;
4331 : })
4332 266 :
4333 : (define_expand "vcond_mask_<mode><mmxintvecmodelower>"
4334 266 : [(set (match_operand:MMXMODE124 0 "register_operand")
4335 266 : (vec_merge:MMXMODE124
4336 266 : (match_operand:MMXMODE124 1 "vector_or_const_vector_operand")
4337 : (match_operand:MMXMODE124 2 "vector_or_const_vector_operand")
4338 : (match_operand:<mmxintvecmode> 3 "register_operand")))]
4339 : "TARGET_MMX_WITH_SSE"
4340 334 : {
4341 334 : ix86_expand_sse_movcc (operands[0], operands[3],
4342 : operands[1], operands[2]);
4343 334 : DONE;
4344 158 : })
4345 :
4346 158 : (define_expand "vcond_mask_<mode><mode>"
4347 158 : [(set (match_operand:VI_16_32 0 "register_operand")
4348 158 : (vec_merge:VI_16_32
4349 : (match_operand:VI_16_32 1 "vector_or_const_vector_operand")
4350 : (match_operand:VI_16_32 2 "vector_or_const_vector_operand")
4351 : (match_operand:VI_16_32 3 "register_operand")))]
4352 : "TARGET_SSE2"
4353 126 : {
4354 126 : ix86_expand_sse_movcc (operands[0], operands[3],
4355 : operands[1], operands[2]);
4356 126 : DONE;
4357 36 : })
4358 3 :
4359 36 : (define_insn "mmx_pblendvb_v8qi"
4360 39 : [(set (match_operand:V8QI 0 "register_operand" "=Yr,*x,x")
4361 39 : (unspec:V8QI
4362 : [(match_operand:V8QI 1 "register_operand" "0,0,x")
4363 : (match_operand:V8QI 2 "register_operand" "Yr,*x,x")
4364 : (match_operand:V8QI 3 "register_operand" "Yz,Yz,x")]
4365 : UNSPEC_BLENDV))]
4366 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
4367 : "@
4368 : pblendvb\t{%3, %2, %0|%0, %2, %3}
4369 : pblendvb\t{%3, %2, %0|%0, %2, %3}
4370 : vpblendvb\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4371 18 : [(set_attr "isa" "noavx,noavx,avx")
4372 : (set_attr "type" "ssemov")
4373 18 : (set_attr "c86_attr" "blendv")
4374 18 : (set_attr "prefix_extra" "1")
4375 : (set_attr "length_immediate" "1")
4376 : (set_attr "prefix" "orig,orig,vex")
4377 : (set_attr "btver2_decode" "vector")
4378 : (set_attr "mode" "TI")])
4379 :
4380 : (define_insn_and_split "*mmx_pblendvb_v8qi_1"
4381 : [(set (match_operand:V8QI 0 "register_operand")
4382 : (unspec:V8QI
4383 : [(match_operand:V8QI 1 "register_operand")
4384 : (match_operand:V8QI 2 "register_operand")
4385 : (eq:V8QI
4386 : (eq:V8QI
4387 : (match_operand:V8QI 3 "register_operand")
4388 : (match_operand:V8QI 4 "nonmemory_operand"))
4389 : (match_operand:V8QI 5 "const0_operand"))]
4390 : UNSPEC_BLENDV))]
4391 667 : "TARGET_MMX_WITH_SSE && ix86_pre_reload_split ()"
4392 : "#"
4393 667 : "&& 1"
4394 : [(set (match_dup 6)
4395 : (eq:V8QI (match_dup 3) (match_dup 7)))
4396 : (set (match_dup 0)
4397 3842 : (unspec:V8QI
4398 : [(match_dup 2)
4399 : (match_dup 1)
4400 3842 : (match_dup 6)]
4401 : UNSPEC_BLENDV))]
4402 0 : {
4403 0 : operands[6] = gen_reg_rtx (V8QImode);
4404 0 : operands[7] = force_reg (V8QImode, operands[4]);
4405 : })
4406 :
4407 : (define_insn_and_split "*mmx_pblendvb_v8qi_2"
4408 0 : [(set (match_operand:V8QI 0 "register_operand")
4409 : (unspec:V8QI
4410 : [(match_operand:V8QI 1 "register_operand")
4411 : (match_operand:V8QI 2 "register_operand")
4412 : (subreg:V8QI
4413 0 : (eq:MMXMODE24
4414 : (eq:MMXMODE24
4415 : (match_operand:MMXMODE24 3 "register_operand")
4416 : (match_operand:MMXMODE24 4 "nonmemory_operand"))
4417 : (match_operand:MMXMODE24 5 "const0_operand")) 0)]
4418 : UNSPEC_BLENDV))]
4419 6972 : "TARGET_MMX_WITH_SSE && ix86_pre_reload_split ()"
4420 : "#"
4421 15 : "&& 1"
4422 15 : [(set (match_dup 6)
4423 42924 : (eq:MMXMODE24 (match_dup 3) (match_dup 8)))
4424 : (set (match_dup 0)
4425 : (unspec:V8QI
4426 42924 : [(match_dup 2)
4427 : (match_dup 1)
4428 : (match_dup 7)]
4429 : UNSPEC_BLENDV))]
4430 3 : {
4431 3 : operands[6] = gen_reg_rtx (<MODE>mode);
4432 3 : operands[7] = lowpart_subreg (V8QImode, operands[6], <MODE>mode);
4433 3 : operands[8] = force_reg (<MODE>mode, operands[4]);
4434 : })
4435 :
4436 : (define_insn "mmx_pblendvb_<mode>"
4437 3 : [(set (match_operand:VI_16_32 0 "register_operand" "=Yr,*x,x")
4438 : (unspec:VI_16_32
4439 : [(match_operand:VI_16_32 1 "register_operand" "0,0,x")
4440 : (match_operand:VI_16_32 2 "register_operand" "Yr,*x,x")
4441 : (match_operand:VI_16_32 3 "register_operand" "Yz,Yz,x")]
4442 3 : UNSPEC_BLENDV))]
4443 : "TARGET_SSE4_1"
4444 : "@
4445 : pblendvb\t{%3, %2, %0|%0, %2, %3}
4446 : pblendvb\t{%3, %2, %0|%0, %2, %3}
4447 40 : vpblendvb\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4448 : [(set_attr "isa" "noavx,noavx,avx")
4449 40 : (set_attr "type" "ssemov")
4450 40 : (set_attr "c86_attr" "blendv")
4451 40 : (set_attr "prefix_extra" "1")
4452 : (set_attr "length_immediate" "1")
4453 : (set_attr "prefix" "orig,orig,vex")
4454 : (set_attr "btver2_decode" "vector")
4455 : (set_attr "mode" "TI")])
4456 :
4457 : (define_insn_and_split "*mmx_pblendvb_<mode>_1"
4458 : [(set (match_operand:VI_16_32 0 "register_operand")
4459 : (unspec:VI_16_32
4460 : [(match_operand:VI_16_32 1 "register_operand")
4461 : (match_operand:VI_16_32 2 "register_operand")
4462 : (eq:VI_16_32
4463 : (eq:VI_16_32
4464 : (match_operand:VI_16_32 3 "register_operand")
4465 : (match_operand:VI_16_32 4 "nonmemory_operand"))
4466 : (match_operand:VI_16_32 5 "const0_operand"))]
4467 : UNSPEC_BLENDV))]
4468 3842 : "TARGET_SSE2 && ix86_pre_reload_split ()"
4469 : "#"
4470 3842 : "&& 1"
4471 : [(set (match_dup 6)
4472 : (eq:VI_16_32 (match_dup 3) (match_dup 7)))
4473 : (set (match_dup 0)
4474 2406 : (unspec:VI_16_32
4475 : [(match_dup 2)
4476 : (match_dup 1)
4477 2406 : (match_dup 6)]
4478 : UNSPEC_BLENDV))]
4479 18 : {
4480 18 : operands[6] = gen_reg_rtx (<MODE>mode);
4481 18 : operands[7] = force_reg (<MODE>mode, operands[4]);
4482 : })
4483 :
4484 : (define_insn_and_split "*mmx_pblendvb_v4qi_2"
4485 18 : [(set (match_operand:V4QI 0 "register_operand")
4486 : (unspec:V4QI
4487 : [(match_operand:V4QI 1 "register_operand")
4488 : (match_operand:V4QI 2 "register_operand")
4489 : (subreg:V4QI
4490 18 : (eq:V2HI
4491 : (eq:V2HI
4492 : (match_operand:V2HI 3 "register_operand")
4493 : (match_operand:V2HI 4 "nonmemory_operand"))
4494 : (match_operand:V2HI 5 "const0_operand")) 0)]
4495 27 : UNSPEC_BLENDV))]
4496 42938 : "TARGET_SSE2 && ix86_pre_reload_split ()"
4497 27 : "#"
4498 41 : "&& 1"
4499 41 : [(set (match_dup 6)
4500 0 : (eq:V2HI (match_dup 3) (match_dup 8)))
4501 : (set (match_dup 0)
4502 : (unspec:V4QI
4503 0 : [(match_dup 2)
4504 : (match_dup 1)
4505 : (match_dup 7)]
4506 : UNSPEC_BLENDV))]
4507 15 : {
4508 15 : operands[6] = gen_reg_rtx (V2HImode);
4509 15 : operands[7] = lowpart_subreg (V4QImode, operands[6], V2HImode);
4510 15 : operands[8] = force_reg (V2HImode, operands[4]);
4511 : })
4512 :
4513 : ;; XOP parallel XMM conditional moves
4514 15 : (define_insn "*xop_pcmov_<mode>"
4515 : [(set (match_operand:MMXMODE124 0 "register_operand" "=x")
4516 : (if_then_else:MMXMODE124
4517 : (match_operand:MMXMODE124 3 "register_operand" "x")
4518 : (match_operand:MMXMODE124 1 "register_operand" "x")
4519 15 : (match_operand:MMXMODE124 2 "register_operand" "x")))]
4520 453 : "TARGET_XOP && TARGET_MMX_WITH_SSE"
4521 : "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4522 : [(set_attr "type" "sse4arg")
4523 : (set_attr "mode" "TI")])
4524 8210 :
4525 8 : (define_insn "*xop_pcmov_<mode>"
4526 : [(set (match_operand:V4F_64 0 "register_operand" "=x")
4527 8218 : (if_then_else:V4F_64
4528 8 : (match_operand:V4F_64 3 "register_operand" "x")
4529 : (match_operand:V4F_64 1 "register_operand" "x")
4530 : (match_operand:V4F_64 2 "register_operand" "x")))]
4531 : "TARGET_XOP && TARGET_MMX_WITH_SSE"
4532 : "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4533 : [(set_attr "type" "sse4arg")
4534 : (set_attr "mode" "TI")])
4535 :
4536 : (define_insn "*xop_pcmov_<mode>"
4537 : [(set (match_operand:VI_16_32 0 "register_operand" "=x")
4538 : (if_then_else:VI_16_32
4539 : (match_operand:VI_16_32 3 "register_operand" "x")
4540 : (match_operand:VI_16_32 1 "register_operand" "x")
4541 : (match_operand:VI_16_32 2 "register_operand" "x")))]
4542 : "TARGET_XOP"
4543 : "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4544 : [(set_attr "type" "sse4arg")
4545 : (set_attr "mode" "TI")])
4546 :
4547 : (define_insn "*xop_pcmov_<mode>"
4548 : [(set (match_operand:V2F_32 0 "register_operand" "=x")
4549 : (if_then_else:V2F_32
4550 : (match_operand:V2F_32 3 "register_operand" "x")
4551 : (match_operand:V2F_32 1 "register_operand" "x")
4552 : (match_operand:V2F_32 2 "register_operand" "x")))]
4553 : "TARGET_XOP"
4554 : "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4555 : [(set_attr "type" "sse4arg")
4556 : (set_attr "mode" "TI")])
4557 :
4558 : ;; XOP permute instructions
4559 : (define_insn "mmx_ppermv64"
4560 : [(set (match_operand:V8QI 0 "register_operand" "=x")
4561 : (unspec:V8QI
4562 : [(match_operand:V8QI 1 "register_operand" "x")
4563 : (match_operand:V8QI 2 "register_operand" "x")
4564 : (match_operand:V16QI 3 "nonimmediate_operand" "xm")]
4565 : UNSPEC_XOP_PERMUTE))]
4566 : "TARGET_XOP && TARGET_MMX_WITH_SSE"
4567 : "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4568 : [(set_attr "type" "sse4arg")
4569 : (set_attr "mode" "TI")])
4570 :
4571 : (define_insn "mmx_ppermv32"
4572 : [(set (match_operand:V4QI 0 "register_operand" "=x")
4573 : (unspec:V4QI
4574 : [(match_operand:V4QI 1 "register_operand" "x")
4575 : (match_operand:V4QI 2 "register_operand" "x")
4576 : (match_operand:V16QI 3 "nonimmediate_operand" "xm")]
4577 : UNSPEC_XOP_PERMUTE))]
4578 : "TARGET_XOP"
4579 : "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4580 : [(set_attr "type" "sse4arg")
4581 : (set_attr "mode" "TI")])
4582 :
4583 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4584 : ;;
4585 : ;; Parallel integral logical operations
4586 : ;;
4587 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4588 :
4589 : (define_expand "one_cmpl<mode>2"
4590 : [(set (match_operand:MMXMODEI 0 "register_operand")
4591 : (xor:MMXMODEI
4592 : (match_operand:MMXMODEI 1 "register_operand")
4593 : (match_dup 2)))]
4594 : "TARGET_MMX_WITH_SSE"
4595 67 : "operands[2] = force_reg (<MODE>mode, CONSTM1_RTX (<MODE>mode));")
4596 :
4597 : (define_insn "one_cmpl<mode>2"
4598 : [(set (match_operand:VI_16_32 0 "register_operand" "=?r,&x,&v")
4599 67 : (not:VI_16_32
4600 : (match_operand:VI_16_32 1 "register_operand" "0,x,v")))]
4601 : ""
4602 : "#"
4603 67 : [(set_attr "isa" "*,sse2,avx512vl")
4604 : (set_attr "type" "negnot,sselog1,sselog1")
4605 : (set_attr "mode" "SI,TI,TI")])
4606 :
4607 : (define_split
4608 : [(set (match_operand:VI_16_32 0 "general_reg_operand")
4609 11 : (not:VI_16_32
4610 : (match_operand:VI_16_32 1 "general_reg_operand")))]
4611 11 : "reload_completed"
4612 11 : [(set (match_dup 0)
4613 : (not:SI (match_dup 1)))]
4614 15 : {
4615 15 : operands[1] = lowpart_subreg (SImode, operands[1], <MODE>mode);
4616 15 : operands[0] = lowpart_subreg (SImode, operands[0], <MODE>mode);
4617 : })
4618 :
4619 : (define_split
4620 15 : [(set (match_operand:VI_16_32 0 "sse_reg_operand")
4621 : (not:VI_16_32
4622 : (match_operand:VI_16_32 1 "sse_reg_operand")))]
4623 15 : "TARGET_SSE2 && reload_completed"
4624 : [(set (match_dup 0) (match_dup 2))
4625 : (set (match_dup 0)
4626 : (xor:V16QI
4627 : (match_dup 0) (match_dup 1)))]
4628 44 : {
4629 18 : operands[2] = CONSTM1_RTX (V16QImode);
4630 44 : operands[1] = lowpart_subreg (V16QImode, operands[1], <MODE>mode);
4631 44 : operands[0] = lowpart_subreg (V16QImode, operands[0], <MODE>mode);
4632 : })
4633 :
4634 : (define_expand "andn<mode>3"
4635 44 : [(set (match_operand:MMXMODEI 0 "register_operand")
4636 : (and:MMXMODEI
4637 : (not:MMXMODEI (match_operand:MMXMODEI 2 "register_operand"))
4638 : (match_operand:MMXMODEI 1 "register_operand")))]
4639 18 : "TARGET_MMX_WITH_SSE")
4640 :
4641 2 : (define_insn "mmx_andnot<mode>3"
4642 : [(set (match_operand:MMXMODEI 0 "register_operand" "=y,x,x,v")
4643 2 : (and:MMXMODEI
4644 2 : (not:MMXMODEI (match_operand:MMXMODEI 1 "register_operand" "0,0,x,v"))
4645 1 : (match_operand:MMXMODEI 2 "register_mmxmem_operand" "ym,x,x,v")))]
4646 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4647 1 : "@
4648 1 : pandn\t{%2, %0|%0, %2}
4649 : pandn\t{%2, %0|%0, %2}
4650 : vpandn\t{%2, %1, %0|%0, %1, %2}
4651 : vpandnd\t{%2, %1, %0|%0, %1, %2}"
4652 : [(set_attr "isa" "*,sse2_noavx,avx,avx512vl")
4653 : (set_attr "mmx_isa" "native,*,*,*")
4654 : (set_attr "type" "mmxadd,sselog,sselog,sselog")
4655 : (set_attr "mode" "DI,TI,TI,TI")])
4656 :
4657 : (define_insn "*andnot<mode>3"
4658 : [(set (match_operand:VI_16_32 0 "register_operand" "=?&r,?r,x,x,v")
4659 : (and:VI_16_32
4660 : (not:VI_16_32
4661 : (match_operand:VI_16_32 1 "register_operand" "0,r,0,x,v"))
4662 : (match_operand:VI_16_32 2 "register_operand" "r,r,x,x,v")))
4663 : (clobber (reg:CC FLAGS_REG))]
4664 : ""
4665 : "#"
4666 : [(set_attr "isa" "*,bmi,sse2_noavx,avx,avx512vl")
4667 : (set_attr "type" "alu,bitmanip,sselog,sselog,sselog")
4668 : (set_attr "mode" "SI,SI,TI,TI,TI")])
4669 :
4670 : (define_split
4671 : [(set (match_operand:VI_16_32 0 "general_reg_operand")
4672 : (and:VI_16_32
4673 : (not:VI_16_32 (match_operand:VI_16_32 1 "general_reg_operand"))
4674 : (match_operand:VI_16_32 2 "general_reg_operand")))
4675 : (clobber (reg:CC FLAGS_REG))]
4676 3 : "TARGET_BMI && reload_completed"
4677 : [(parallel
4678 : [(set (match_dup 0)
4679 : (and:SI (not:SI (match_dup 1)) (match_dup 2)))
4680 3 : (clobber (reg:CC FLAGS_REG))])]
4681 0 : {
4682 0 : operands[2] = lowpart_subreg (SImode, operands[2], <MODE>mode);
4683 3 : operands[1] = lowpart_subreg (SImode, operands[1], <MODE>mode);
4684 0 : operands[0] = lowpart_subreg (SImode, operands[0], <MODE>mode);
4685 : })
4686 :
4687 : (define_split
4688 0 : [(set (match_operand:VI_16_32 0 "general_reg_operand")
4689 : (and:VI_16_32
4690 : (not:VI_16_32 (match_operand:VI_16_32 1 "general_reg_operand"))
4691 : (match_operand:VI_16_32 2 "general_reg_operand")))
4692 : (clobber (reg:CC FLAGS_REG))]
4693 3 : "!TARGET_BMI && reload_completed"
4694 : [(set (match_dup 0)
4695 : (not:SI (match_dup 1)))
4696 : (parallel
4697 1 : [(set (match_dup 0)
4698 : (and:SI (match_dup 0) (match_dup 2)))
4699 58 : (clobber (reg:CC FLAGS_REG))])]
4700 4 : {
4701 61 : operands[2] = lowpart_subreg (SImode, operands[2], <MODE>mode);
4702 61 : operands[1] = lowpart_subreg (SImode, operands[1], <MODE>mode);
4703 3 : operands[0] = lowpart_subreg (SImode, operands[0], <MODE>mode);
4704 : })
4705 :
4706 : (define_split
4707 3 : [(set (match_operand:VI_16_32 0 "sse_reg_operand")
4708 : (and:VI_16_32
4709 : (not:VI_16_32 (match_operand:VI_16_32 1 "sse_reg_operand"))
4710 : (match_operand:VI_16_32 2 "sse_reg_operand")))
4711 : (clobber (reg:CC FLAGS_REG))]
4712 3 : "TARGET_SSE2 && reload_completed"
4713 : [(set (match_dup 0)
4714 : (and:V16QI (not:V16QI (match_dup 1)) (match_dup 2)))]
4715 58 : {
4716 58 : operands[2] = lowpart_subreg (V16QImode, operands[2], <MODE>mode);
4717 58 : operands[1] = lowpart_subreg (V16QImode, operands[1], <MODE>mode);
4718 58 : operands[0] = lowpart_subreg (V16QImode, operands[0], <MODE>mode);
4719 0 : })
4720 0 :
4721 0 : (define_expand "mmx_<code><mode>3"
4722 58 : [(set (match_operand:MMXMODEI 0 "register_operand")
4723 : (any_logic:MMXMODEI
4724 : (match_operand:MMXMODEI 1 "register_mmxmem_operand")
4725 : (match_operand:MMXMODEI 2 "register_mmxmem_operand")))]
4726 58 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4727 74 : "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
4728 :
4729 : (define_expand "<code><mode>3"
4730 : [(set (match_operand:MMXMODEI 0 "register_operand")
4731 183 : (any_logic:MMXMODEI
4732 : (match_operand:MMXMODEI 1 "register_operand")
4733 74 : (match_operand:MMXMODEI 2 "register_operand")))]
4734 74 : "TARGET_MMX_WITH_SSE")
4735 109 :
4736 : (define_insn "*mmx_<code><mode>3"
4737 : [(set (match_operand:MMXMODEI 0 "register_operand" "=y,x,x,v")
4738 : (any_logic:MMXMODEI
4739 : (match_operand:MMXMODEI 1 "register_mmxmem_operand" "%0,0,x,v")
4740 1838 : (match_operand:MMXMODEI 2 "register_mmxmem_operand" "ym,x,x,v")))]
4741 248 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
4742 33144 : && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
4743 1838 : "@
4744 35 : p<logic>\t{%2, %0|%0, %2}
4745 : p<logic>\t{%2, %0|%0, %2}
4746 29505 : vp<logic>\t{%2, %1, %0|%0, %1, %2}
4747 1803 : vp<logic>d\t{%2, %1, %0|%0, %1, %2}"
4748 : [(set_attr "isa" "*,sse2_noavx,avx,avx512vl")
4749 28817 : (set_attr "mmx_isa" "native,*,*,*")
4750 : (set_attr "type" "mmxadd,sselog,sselog,sselog")
4751 : (set_attr "mode" "DI,TI,TI,TI")])
4752 1520 :
4753 : (define_expand "<code><mode>3"
4754 1520 : [(set (match_operand:VI_16_32 0 "nonimmediate_operand")
4755 1520 : (any_logic:VI_16_32
4756 166 : (match_operand:VI_16_32 1 "nonimmediate_operand")
4757 : (match_operand:VI_16_32 2 "nonimmediate_or_x86_64_const_vector_operand")))]
4758 : ""
4759 1804 : "ix86_expand_binary_operator (<CODE>, <MODE>mode, operands); DONE;")
4760 :
4761 : (define_insn "*<code><mode>3"
4762 : [(set (match_operand:VI_16_32 0 "nonimmediate_operand" "=?r,m,x,x,v")
4763 : (any_logic:VI_16_32
4764 155 : (match_operand:VI_16_32 1 "nonimmediate_operand" "%0,0,0,x,v")
4765 : (match_operand:VI_16_32 2 "nonimmediate_or_x86_64_const_vector_operand" "r,i,x,x,v")))
4766 155 : (clobber (reg:CC FLAGS_REG))]
4767 2683 : "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
4768 155 : "#"
4769 : [(set_attr "isa" "*,*,sse2_noavx,avx,avx512vl")
4770 : (set_attr "type" "alu,alu,sselog,sselog,sselog")
4771 88838 : (set_attr "mode" "SI,SI,TI,TI,TI")])
4772 129 :
4773 69 : (define_split
4774 88967 : [(set (match_operand:VI_16_32 0 "nonimmediate_gr_operand")
4775 198 : (any_logic:VI_16_32
4776 198 : (match_operand:VI_16_32 1 "nonimmediate_gr_operand")
4777 : (match_operand:VI_16_32 2 "reg_or_const_vector_operand")))
4778 : (clobber (reg:CC FLAGS_REG))]
4779 : "reload_completed"
4780 : [(parallel
4781 : [(set (match_dup 0)
4782 : (any_logic:<mmxinsnmode> (match_dup 1) (match_dup 2)))
4783 : (clobber (reg:CC FLAGS_REG))])]
4784 80 : {
4785 80 : if (!register_operand (operands[2], <MODE>mode))
4786 : {
4787 23 : HOST_WIDE_INT val = ix86_convert_const_vector_to_integer (operands[2],
4788 : <MODE>mode);
4789 23 : operands[2] = GEN_INT (val);
4790 : }
4791 : else
4792 57 : operands[2] = lowpart_subreg (<mmxinsnmode>mode, operands[2], <MODE>mode);
4793 80 : operands[1] = lowpart_subreg (<mmxinsnmode>mode, operands[1], <MODE>mode);
4794 80 : operands[0] = lowpart_subreg (<mmxinsnmode>mode, operands[0], <MODE>mode);
4795 : })
4796 :
4797 : (define_split
4798 80 : [(set (match_operand:VI_16_32 0 "sse_reg_operand")
4799 : (any_logic:VI_16_32
4800 : (match_operand:VI_16_32 1 "sse_reg_operand")
4801 : (match_operand:VI_16_32 2 "sse_reg_operand")))
4802 80 : (clobber (reg:CC FLAGS_REG))]
4803 : "TARGET_SSE2 && reload_completed"
4804 : [(set (match_dup 0)
4805 : (any_logic:V16QI (match_dup 1) (match_dup 2)))]
4806 394 : {
4807 394 : operands[2] = lowpart_subreg (V16QImode, operands[2], <MODE>mode);
4808 405 : operands[1] = lowpart_subreg (V16QImode, operands[1], <MODE>mode);
4809 394 : operands[0] = lowpart_subreg (V16QImode, operands[0], <MODE>mode);
4810 300 : })
4811 300 :
4812 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4813 394 : ;;
4814 : ;; Parallel integral element swizzling
4815 : ;;
4816 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4817 394 :
4818 : (define_insn_and_split "mmx_packsswb"
4819 : [(set (match_operand:V8QI 0 "register_operand" "=y,x,Yw")
4820 : (vec_concat:V8QI
4821 : (ss_truncate:V4QI
4822 : (match_operand:V4HI 1 "register_operand" "0,0,Yw"))
4823 1673 : (ss_truncate:V4QI
4824 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw"))))]
4825 1673 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4826 1673 : "@
4827 : packsswb\t{%2, %0|%0, %2}
4828 : #
4829 : #"
4830 : "&& reload_completed
4831 : && SSE_REGNO_P (REGNO (operands[0]))"
4832 : [(const_int 0)]
4833 46 : "ix86_split_mmx_pack (operands, SS_TRUNCATE); DONE;"
4834 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4835 : (set_attr "type" "mmxshft,sselog,sselog")
4836 : (set_attr "mode" "DI,TI,TI")])
4837 :
4838 : ;; This instruction does unsigned saturation of signed source
4839 : ;; and is different from generic us_truncate RTX.
4840 : (define_insn_and_split "mmx_packuswb"
4841 : [(set (match_operand:V8QI 0 "register_operand" "=y,x,Yw")
4842 : (unspec:V8QI
4843 : [(match_operand:V4HI 1 "register_operand" "0,0,Yw")
4844 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw")]
4845 495 : UNSPEC_US_TRUNCATE))]
4846 167691 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4847 495 : "@
4848 495 : packuswb\t{%2, %0|%0, %2}
4849 : #
4850 28566 : #"
4851 11466 : "&& reload_completed
4852 5733 : && SSE_REGNO_P (REGNO (operands[0]))"
4853 28566 : [(const_int 0)]
4854 688 : "ix86_split_mmx_pack (operands, US_TRUNCATE); DONE;"
4855 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4856 184 : (set_attr "type" "mmxshft,sselog,sselog")
4857 : (set_attr "mode" "DI,TI,TI")])
4858 :
4859 184 : (define_insn_and_split "mmx_packssdw"
4860 : [(set (match_operand:V4HI 0 "register_operand" "=y,x,Yw")
4861 : (vec_concat:V4HI
4862 : (ss_truncate:V2HI
4863 : (match_operand:V2SI 1 "register_operand" "0,0,Yw"))
4864 : (ss_truncate:V2HI
4865 : (match_operand:V2SI 2 "register_mmxmem_operand" "ym,x,Yw"))))]
4866 372 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4867 : "@
4868 372 : packssdw\t{%2, %0|%0, %2}
4869 372 : #
4870 : #"
4871 : "&& reload_completed
4872 : && SSE_REGNO_P (REGNO (operands[0]))"
4873 : [(const_int 0)]
4874 56 : "ix86_split_mmx_pack (operands, SS_TRUNCATE); DONE;"
4875 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4876 : (set_attr "type" "mmxshft,sselog,sselog")
4877 : (set_attr "mode" "DI,TI,TI")])
4878 :
4879 : (define_insn_and_split "mmx_packusdw"
4880 : [(set (match_operand:V4HI 0 "register_operand" "=Yr,*x,Yw")
4881 : (unspec:V4HI
4882 : [(match_operand:V2SI 1 "register_operand" "0,0,Yw")
4883 : (match_operand:V2SI 2 "register_operand" "Yr,*x,Yw")]
4884 : UNSPEC_US_TRUNCATE))]
4885 28750 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
4886 1435 : "#"
4887 184 : "&& reload_completed"
4888 1435 : [(const_int 0)]
4889 2854 : "ix86_split_mmx_pack (operands, US_TRUNCATE); DONE;"
4890 : [(set_attr "isa" "noavx,noavx,avx")
4891 9 : (set_attr "type" "sselog")
4892 1327 : (set_attr "mode" "TI")])
4893 :
4894 9 : (define_insn_and_split "mmx_punpckhbw"
4895 : [(set (match_operand:V8QI 0 "register_operand" "=y,x,Yw")
4896 : (vec_select:V8QI
4897 : (vec_concat:V16QI
4898 : (match_operand:V8QI 1 "register_operand" "0,0,Yw")
4899 : (match_operand:V8QI 2 "register_mmxmem_operand" "ym,x,Yw"))
4900 : (parallel [(const_int 4) (const_int 12)
4901 1913 : (const_int 5) (const_int 13)
4902 : (const_int 6) (const_int 14)
4903 1913 : (const_int 7) (const_int 15)])))]
4904 1913 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4905 : "@
4906 : punpckhbw\t{%2, %0|%0, %2}
4907 : #
4908 : #"
4909 : "&& reload_completed
4910 : && SSE_REGNO_P (REGNO (operands[0]))"
4911 : [(const_int 0)]
4912 443 : "ix86_split_mmx_punpck (operands, true); DONE;"
4913 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4914 : (set_attr "type" "mmxcvt,sselog,sselog")
4915 : (set_attr "mode" "DI,TI,TI")])
4916 :
4917 : (define_insn_and_split "mmx_punpckhbw_low"
4918 : [(set (match_operand:V4QI 0 "register_operand" "=x,Yw")
4919 : (vec_select:V4QI
4920 : (vec_concat:V8QI
4921 : (match_operand:V4QI 1 "register_operand" "0,Yw")
4922 : (match_operand:V4QI 2 "register_operand" "x,Yw"))
4923 : (parallel [(const_int 2) (const_int 6)
4924 281 : (const_int 3) (const_int 7)])))]
4925 : "TARGET_SSE2"
4926 281 : "#"
4927 281 : "&& reload_completed"
4928 : [(const_int 0)]
4929 243 : "ix86_split_mmx_punpck (operands, true); DONE;"
4930 : [(set_attr "isa" "noavx,avx")
4931 : (set_attr "type" "sselog")
4932 : (set_attr "mode" "TI")])
4933 :
4934 : (define_insn_and_split "mmx_punpcklbw"
4935 : [(set (match_operand:V8QI 0 "register_operand" "=y,x,Yw")
4936 : (vec_select:V8QI
4937 : (vec_concat:V16QI
4938 : (match_operand:V8QI 1 "register_operand" "0,0,Yw")
4939 : (match_operand:V8QI 2 "register_mmxmem_operand" "ym,x,Yw"))
4940 : (parallel [(const_int 0) (const_int 8)
4941 376 : (const_int 1) (const_int 9)
4942 : (const_int 2) (const_int 10)
4943 376 : (const_int 3) (const_int 11)])))]
4944 376 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4945 : "@
4946 : punpcklbw\t{%2, %0|%0, %k2}
4947 : #
4948 : #"
4949 : "&& reload_completed
4950 : && SSE_REGNO_P (REGNO (operands[0]))"
4951 : [(const_int 0)]
4952 495 : "ix86_split_mmx_punpck (operands, false); DONE;"
4953 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4954 : (set_attr "type" "mmxcvt,sselog,sselog")
4955 : (set_attr "mode" "DI,TI,TI")])
4956 :
4957 : (define_insn_and_split "mmx_punpcklbw_low"
4958 : [(set (match_operand:V4QI 0 "register_operand" "=x,Yw")
4959 : (vec_select:V4QI
4960 : (vec_concat:V8QI
4961 : (match_operand:V4QI 1 "register_operand" "0,Yw")
4962 : (match_operand:V4QI 2 "register_operand" "x,Yw"))
4963 18 : (parallel [(const_int 0) (const_int 4)
4964 : (const_int 1) (const_int 5)])))]
4965 18 : "TARGET_SSE2"
4966 18 : "#"
4967 18 : "&& reload_completed"
4968 : [(const_int 0)]
4969 372 : "ix86_split_mmx_punpck (operands, false); DONE;"
4970 : [(set_attr "isa" "noavx,avx")
4971 : (set_attr "type" "sselog")
4972 : (set_attr "mode" "TI")])
4973 :
4974 : (define_insn_and_split "mmx_punpckhwd"
4975 : [(set (match_operand:V4HI 0 "register_operand" "=y,x,Yw")
4976 : (vec_select:V4HI
4977 : (vec_concat:V8HI
4978 : (match_operand:V4HI 1 "register_operand" "0,0,Yw")
4979 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw"))
4980 28 : (parallel [(const_int 2) (const_int 6)
4981 : (const_int 3) (const_int 7)])))]
4982 28 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4983 28 : "@
4984 28 : punpckhwd\t{%2, %0|%0, %2}
4985 : #
4986 : #"
4987 : "&& reload_completed
4988 : && SSE_REGNO_P (REGNO (operands[0]))"
4989 : [(const_int 0)]
4990 1435 : "ix86_split_mmx_punpck (operands, true); DONE;"
4991 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4992 : (set_attr "type" "mmxcvt,sselog,sselog")
4993 : (set_attr "mode" "DI,TI,TI")])
4994 :
4995 : (define_insn_and_split "mmx_punpcklwd"
4996 : [(set (match_operand:V4HI 0 "register_operand" "=y,x,Yw")
4997 : (vec_select:V4HI
4998 : (vec_concat:V8HI
4999 : (match_operand:V4HI 1 "register_operand" "0,0,Yw")
5000 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw"))
5001 84 : (parallel [(const_int 0) (const_int 4)
5002 : (const_int 1) (const_int 5)])))]
5003 84 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5004 84 : "@
5005 84 : punpcklwd\t{%2, %0|%0, %k2}
5006 : #
5007 : #"
5008 : "&& reload_completed
5009 : && SSE_REGNO_P (REGNO (operands[0]))"
5010 : [(const_int 0)]
5011 1913 : "ix86_split_mmx_punpck (operands, false); DONE;"
5012 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
5013 : (set_attr "type" "mmxcvt,sselog,sselog")
5014 : (set_attr "mode" "DI,TI,TI")])
5015 :
5016 : (define_insn_and_split "mmx_punpckhdq"
5017 : [(set (match_operand:V2SI 0 "register_operand" "=y,x,Yv")
5018 : (vec_select:V2SI
5019 : (vec_concat:V4SI
5020 : (match_operand:V2SI 1 "register_operand" "0,0,Yv")
5021 : (match_operand:V2SI 2 "register_mmxmem_operand" "ym,x,Yv"))
5022 33 : (parallel [(const_int 1)
5023 : (const_int 3)])))]
5024 33 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5025 33 : "@
5026 33 : punpckhdq\t{%2, %0|%0, %2}
5027 : #
5028 : #"
5029 : "&& reload_completed
5030 : && SSE_REGNO_P (REGNO (operands[0]))"
5031 : [(const_int 0)]
5032 281 : "ix86_split_mmx_punpck (operands, true); DONE;"
5033 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
5034 : (set_attr "type" "mmxcvt,sselog,sselog")
5035 : (set_attr "mode" "DI,TI,TI")])
5036 :
5037 : (define_insn_and_split "mmx_punpckldq"
5038 : [(set (match_operand:V2SI 0 "register_operand" "=y,x,Yv")
5039 : (vec_select:V2SI
5040 : (vec_concat:V4SI
5041 : (match_operand:V2SI 1 "register_operand" "0,0,Yv")
5042 : (match_operand:V2SI 2 "register_mmxmem_operand" "ym,x,Yv"))
5043 98 : (parallel [(const_int 0)
5044 : (const_int 2)])))]
5045 98 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5046 98 : "@
5047 98 : punpckldq\t{%2, %0|%0, %k2}
5048 : #
5049 : #"
5050 : "&& reload_completed
5051 : && SSE_REGNO_P (REGNO (operands[0]))"
5052 : [(const_int 0)]
5053 376 : "ix86_split_mmx_punpck (operands, false); DONE;"
5054 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
5055 : (set_attr "type" "mmxcvt,sselog,sselog")
5056 : (set_attr "mode" "DI,TI,TI")])
5057 :
5058 : (define_insn "sse4_1_<code>v4qiv4hi2"
5059 : [(set (match_operand:V4HI 0 "register_operand" "=Yr,*x,Yw")
5060 : (any_extend:V4HI
5061 : (vec_select:V4QI
5062 : (match_operand:V8QI 1 "register_operand" "Yr,*x,Yw")
5063 : (parallel [(const_int 0) (const_int 1)
5064 5 : (const_int 2) (const_int 3)]))))]
5065 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5066 5 : "%vpmov<extsuffix>bw\t{%1, %0|%0, %1}"
5067 5 : [(set_attr "isa" "noavx,noavx,avx")
5068 5 : (set_attr "type" "ssemov")
5069 : (set_attr "c86_attr" "vpmovx")
5070 : (set_attr "prefix_extra" "1")
5071 : (set_attr "prefix" "orig,orig,maybe_evex")
5072 : (set_attr "mode" "TI")])
5073 :
5074 : (define_expand "<insn>v4qiv4hi2"
5075 : [(set (match_operand:V4HI 0 "register_operand")
5076 : (any_extend:V4HI
5077 : (match_operand:V4QI 1 "register_operand")))]
5078 : "TARGET_MMX_WITH_SSE"
5079 46 : {
5080 46 : if (!TARGET_SSE4_1)
5081 : {
5082 40 : ix86_expand_sse_extend (operands[0], operands[1], <u_bool>);
5083 40 : DONE;
5084 : }
5085 :
5086 6 : rtx op1 = force_reg (V4QImode, operands[1]);
5087 6 : op1 = lowpart_subreg (V8QImode, op1, V4QImode);
5088 6 : emit_insn (gen_sse4_1_<code>v4qiv4hi2 (operands[0], op1));
5089 6 : DONE;
5090 : })
5091 :
5092 : (define_insn "sse4_1_<code>v2hiv2si2"
5093 : [(set (match_operand:V2SI 0 "register_operand" "=Yr,*x,v")
5094 : (any_extend:V2SI
5095 : (vec_select:V2HI
5096 : (match_operand:V4HI 1 "register_operand" "Yr,*x,v")
5097 : (parallel [(const_int 0) (const_int 1)]))))]
5098 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5099 : "%vpmov<extsuffix>wd\t{%1, %0|%0, %1}"
5100 : [(set_attr "isa" "noavx,noavx,avx")
5101 : (set_attr "type" "ssemov")
5102 112 : (set_attr "c86_attr" "vpmovx")
5103 : (set_attr "prefix_extra" "1")
5104 112 : (set_attr "prefix" "orig,orig,maybe_evex")
5105 112 : (set_attr "mode" "TI")])
5106 112 :
5107 : (define_expand "<insn>v2hiv2si2"
5108 : [(set (match_operand:V2SI 0 "register_operand")
5109 : (any_extend:V2SI
5110 : (match_operand:V2HI 1 "register_operand")))]
5111 : "TARGET_MMX_WITH_SSE"
5112 182 : {
5113 182 : if (!TARGET_SSE4_1)
5114 : {
5115 166 : ix86_expand_sse_extend (operands[0], operands[1], <u_bool>);
5116 166 : DONE;
5117 : }
5118 :
5119 16 : rtx op1 = force_reg (V2HImode, operands[1]);
5120 16 : op1 = lowpart_subreg (V4HImode, op1, V2HImode);
5121 16 : emit_insn (gen_sse4_1_<code>v2hiv2si2 (operands[0], op1));
5122 16 : DONE;
5123 : })
5124 :
5125 : (define_insn "sse4_1_<code>v2qiv2si2"
5126 : [(set (match_operand:V2SI 0 "register_operand" "=Yr,*x,v")
5127 : (any_extend:V2SI
5128 : (vec_select:V2QI
5129 : (match_operand:V4QI 1 "register_operand" "Yr,*x,v")
5130 : (parallel [(const_int 0) (const_int 1)]))))]
5131 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5132 : "%vpmov<extsuffix>bd\t{%1, %0|%0, %1}"
5133 : [(set_attr "isa" "noavx,noavx,avx")
5134 : (set_attr "type" "ssemov")
5135 47 : (set_attr "c86_attr" "vpmovx")
5136 : (set_attr "prefix_extra" "1")
5137 47 : (set_attr "prefix" "orig,orig,maybe_evex")
5138 47 : (set_attr "mode" "TI")])
5139 47 :
5140 : (define_expand "<insn>v2qiv2si2"
5141 : [(set (match_operand:V2SI 0 "register_operand")
5142 : (any_extend:V2SI
5143 : (match_operand:V2QI 1 "register_operand")))]
5144 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5145 38 : {
5146 38 : rtx op1 = force_reg (V2QImode, operands[1]);
5147 38 : op1 = lowpart_subreg (V4QImode, op1, V2QImode);
5148 38 : emit_insn (gen_sse4_1_<code>v2qiv2si2 (operands[0], op1));
5149 38 : DONE;
5150 : })
5151 :
5152 : (define_insn "sse4_1_<code>v2qiv2hi2"
5153 : [(set (match_operand:V2HI 0 "register_operand" "=Yr,*x,Yw")
5154 : (any_extend:V2HI
5155 : (vec_select:V2QI
5156 : (match_operand:V4QI 1 "register_operand" "Yr,*x,Yw")
5157 : (parallel [(const_int 0) (const_int 1)]))))]
5158 : "TARGET_SSE4_1"
5159 : "%vpmov<extsuffix>bw\t{%1, %0|%0, %1}"
5160 : [(set_attr "isa" "noavx,noavx,avx")
5161 : (set_attr "type" "ssemov")
5162 103 : (set_attr "c86_attr" "vpmovx")
5163 : (set_attr "prefix_extra" "1")
5164 103 : (set_attr "prefix" "orig,orig,maybe_evex")
5165 103 : (set_attr "mode" "TI")])
5166 103 :
5167 : (define_expand "<insn>v2qiv2hi2"
5168 : [(set (match_operand:V2HI 0 "register_operand")
5169 : (any_extend:V2HI
5170 : (match_operand:V2QI 1 "register_operand")))]
5171 : "TARGET_SSE2"
5172 192 : {
5173 192 : if (!TARGET_SSE4_1)
5174 : {
5175 180 : ix86_expand_sse_extend (operands[0], operands[1], <u_bool>);
5176 180 : DONE;
5177 : }
5178 :
5179 12 : rtx op1 = force_reg (V2QImode, operands[1]);
5180 12 : op1 = lowpart_subreg (V4QImode, op1, V2QImode);
5181 12 : emit_insn (gen_sse4_1_<code>v2qiv2hi2 (operands[0], op1));
5182 12 : DONE;
5183 : })
5184 :
5185 : (define_expand "trunc<mode><mmxhalfmodelower>2"
5186 : [(set (match_operand:<mmxhalfmode> 0 "register_operand")
5187 : (truncate:<mmxhalfmode>
5188 : (match_operand:VI2_32_64 1 "register_operand")))]
5189 : "TARGET_AVX2"
5190 23 : {
5191 23 : if (TARGET_AVX512VL && TARGET_AVX512BW)
5192 21 : emit_insn (gen_avx512vl_trunc<mode><mmxhalfmodelower>2 (operands[0], operands[1]));
5193 : else
5194 2 : ix86_expand_trunc_with_avx2_noavx512f (operands[0], operands[1], <mmxbytemode>mode);
5195 636 : DONE;
5196 : })
5197 613 :
5198 613 : (define_insn "avx512vl_trunc<mode><mmxhalfmodelower>2"
5199 613 : [(set (match_operand:<mmxhalfmode> 0 "register_operand" "=v")
5200 : (truncate:<mmxhalfmode>
5201 : (match_operand:VI2_32_64 1 "register_operand" "v")))]
5202 175 : "TARGET_AVX512VL && TARGET_AVX512BW"
5203 : "vpmovwb\t{%1, %0|%0, %1}"
5204 : [(set_attr "type" "ssemov")
5205 : (set_attr "prefix" "evex")
5206 115 : (set_attr "mode" "TI")])
5207 :
5208 569 : (define_mode_iterator V2QI_V2HI [V2QI V2HI])
5209 115 : (define_mode_attr v2qi_quad_v2hi_double
5210 569 : [(V2QI "V8QI") (V2HI "V4HI")])
5211 569 : (define_expand "truncv2si<mode>2"
5212 569 : [(set (match_operand:V2QI_V2HI 0 "register_operand")
5213 : (truncate:V2QI_V2HI
5214 : (match_operand:V2SI 1 "register_operand")))]
5215 : "TARGET_AVX2 && TARGET_MMX_WITH_SSE"
5216 47 : {
5217 47 : if (TARGET_AVX512VL)
5218 15 : emit_insn (gen_avx512vl_truncv2si<mode>2 (operands[0], operands[1]));
5219 : else
5220 32 : ix86_expand_trunc_with_avx2_noavx512f (operands[0], operands[1], <v2qi_quad_v2hi_double>mode);
5221 47 : DONE;
5222 : })
5223 :
5224 : (define_insn "avx512vl_truncv2si<mode>2"
5225 : [(set (match_operand:V2QI_V2HI 0 "register_operand" "=v")
5226 : (truncate:V2QI_V2HI
5227 : (match_operand:V2SI 1 "register_operand" "v")))]
5228 115 : "TARGET_AVX512VL && TARGET_MMX_WITH_SSE"
5229 : "vpmovd<mmxvecsize>\t{%1, %0|%0, %1}"
5230 : [(set_attr "type" "ssemov")
5231 : (set_attr "prefix" "evex")
5232 231040 : (set_attr "mode" "TI")])
5233 :
5234 450 : ;; Pack/unpack vector modes
5235 231040 : (define_mode_attr mmxpackmode
5236 450 : [(V4HI "V8QI") (V2SI "V4HI")])
5237 450 :
5238 450 : (define_expand "vec_pack_trunc_<mode>"
5239 : [(match_operand:<mmxpackmode> 0 "register_operand")
5240 : (match_operand:MMXMODE24 1 "register_operand")
5241 : (match_operand:MMXMODE24 2 "register_operand")]
5242 : "TARGET_MMX_WITH_SSE"
5243 810 : {
5244 810 : rtx op1 = gen_lowpart (<mmxpackmode>mode, operands[1]);
5245 810 : rtx op2 = gen_lowpart (<mmxpackmode>mode, operands[2]);
5246 810 : ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
5247 810 : DONE;
5248 : })
5249 :
5250 : (define_expand "vec_pack_trunc_v2hi"
5251 : [(match_operand:V4QI 0 "register_operand")
5252 : (match_operand:V2HI 1 "register_operand")
5253 : (match_operand:V2HI 2 "register_operand")]
5254 : "TARGET_SSE2"
5255 26 : {
5256 26 : rtx op1 = gen_lowpart (V4QImode, operands[1]);
5257 26 : rtx op2 = gen_lowpart (V4QImode, operands[2]);
5258 26 : ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
5259 26 : DONE;
5260 473 : })
5261 :
5262 473 : (define_mode_attr mmxunpackmode
5263 473 : [(V8QI "V4HI") (V4HI "V2SI")])
5264 473 :
5265 : (define_expand "vec_unpacks_lo_<mode>"
5266 : [(match_operand:<mmxunpackmode> 0 "register_operand")
5267 : (match_operand:MMXMODE12 1 "register_operand")]
5268 : "TARGET_MMX_WITH_SSE"
5269 613 : "ix86_expand_sse_unpack (operands[0], operands[1], false, false); DONE;")
5270 :
5271 : (define_expand "vec_unpacks_hi_<mode>"
5272 0 : [(match_operand:<mmxunpackmode> 0 "register_operand")
5273 : (match_operand:MMXMODE12 1 "register_operand")]
5274 0 : "TARGET_MMX_WITH_SSE"
5275 617 : "ix86_expand_sse_unpack (operands[0], operands[1], false, true); DONE;")
5276 0 :
5277 : (define_expand "vec_unpacku_lo_<mode>"
5278 : [(match_operand:<mmxunpackmode> 0 "register_operand")
5279 : (match_operand:MMXMODE12 1 "register_operand")]
5280 : "TARGET_MMX_WITH_SSE"
5281 913 : "ix86_expand_sse_unpack (operands[0], operands[1], true, false); DONE;")
5282 :
5283 620 : (define_expand "vec_unpacku_hi_<mode>"
5284 620 : [(match_operand:<mmxunpackmode> 0 "register_operand")
5285 620 : (match_operand:MMXMODE12 1 "register_operand")]
5286 : "TARGET_MMX_WITH_SSE"
5287 766 : "ix86_expand_sse_unpack (operands[0], operands[1], true, true); DONE;")
5288 :
5289 293 : (define_expand "vec_unpacks_lo_v4qi"
5290 293 : [(match_operand:V2HI 0 "register_operand")
5291 293 : (match_operand:V4QI 1 "register_operand")]
5292 : "TARGET_SSE2"
5293 24 : "ix86_expand_sse_unpack (operands[0], operands[1], false, false); DONE;")
5294 :
5295 24 : (define_expand "vec_unpacks_hi_v4qi"
5296 24 : [(match_operand:V2HI 0 "register_operand")
5297 24 : (match_operand:V4QI 1 "register_operand")]
5298 : "TARGET_SSE2"
5299 0 : "ix86_expand_sse_unpack (operands[0], operands[1], false, true); DONE;")
5300 3 :
5301 : (define_expand "vec_unpacku_lo_v4qi"
5302 3 : [(match_operand:V2HI 0 "register_operand")
5303 3 : (match_operand:V4QI 1 "register_operand")]
5304 : "TARGET_SSE2"
5305 12 : "ix86_expand_sse_unpack (operands[0], operands[1], true, false); DONE;")
5306 0 :
5307 : (define_expand "vec_unpacku_hi_v4qi"
5308 0 : [(match_operand:V2HI 0 "register_operand")
5309 0 : (match_operand:V4QI 1 "register_operand")]
5310 : "TARGET_SSE2"
5311 87 : "ix86_expand_sse_unpack (operands[0], operands[1], true, true); DONE;")
5312 :
5313 75 : (define_insn "*mmx_pinsrd"
5314 75 : [(set (match_operand:V2SI 0 "register_operand" "=x,Yv")
5315 75 : (vec_merge:V2SI
5316 : (vec_duplicate:V2SI
5317 : (match_operand:SI 2 "nonimmediate_operand" "jrjm,rm"))
5318 78 : (match_operand:V2SI 1 "register_operand" "0,Yv")
5319 : (match_operand:SI 3 "const_int_operand")))]
5320 286 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE
5321 494 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
5322 208 : < GET_MODE_NUNITS (V2SImode))"
5323 217 : {
5324 52 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
5325 217 : switch (which_alternative)
5326 597 : {
5327 191 : case 1:
5328 : return "vpinsrd\t{%3, %2, %1, %0|%0, %1, %2, %3}";
5329 406 : case 0:
5330 0 : return "pinsrd\t{%3, %2, %0|%0, %2, %3}";
5331 0 : default:
5332 0 : gcc_unreachable ();
5333 : }
5334 : }
5335 : [(set_attr "isa" "noavx,avx")
5336 : (set_attr "addr" "gpr16,*")
5337 : (set_attr "prefix_extra" "1")
5338 41 : (set_attr "type" "sselog")
5339 : (set_attr "c86_attr" "insr")
5340 : (set_attr "length_immediate" "1")
5341 : (set_attr "prefix" "orig,vex")
5342 : (set_attr "mode" "TI")])
5343 :
5344 : (define_insn "*mmx_pinsrw"
5345 : [(set (match_operand:V4FI_64 0 "register_operand" "=y,x,YW,&x")
5346 : (vec_merge:V4FI_64
5347 : (vec_duplicate:V4FI_64
5348 : (match_operand:<mmxscalarmode> 2 "nonimmediate_operand" "rm,rm,rm,x"))
5349 : (match_operand:V4FI_64 1 "register_operand" "0,0,YW,x")
5350 : (match_operand:SI 3 "const_int_operand")))]
5351 48 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5352 406 : && (TARGET_SSE || TARGET_3DNOW_A)
5353 812 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
5354 406 : < GET_MODE_NUNITS (V4HImode))"
5355 41 : {
5356 82 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
5357 41 : switch (which_alternative)
5358 10 : {
5359 : case 3:
5360 : return "#";
5361 26 : case 2:
5362 16 : if (MEM_P (operands[2]))
5363 : return "vpinsrw\t{%3, %2, %1, %0|%0, %1, %2, %3}";
5364 : else
5365 16 : return "vpinsrw\t{%3, %k2, %1, %0|%0, %1, %k2, %3}";
5366 25 : case 1:
5367 25 : case 0:
5368 25 : if (MEM_P (operands[2]))
5369 : return "pinsrw\t{%3, %2, %0|%0, %2, %3}";
5370 : else
5371 15 : return "pinsrw\t{%3, %k2, %0|%0, %k2, %3}";
5372 0 : default:
5373 0 : gcc_unreachable ();
5374 : }
5375 : }
5376 : [(set_attr "isa" "*,sse2_noavx,avx,sse4")
5377 : (set_attr "mmx_isa" "native,*,*,*")
5378 : (set_attr "type" "mmxcvt,sselog,sselog,sselog")
5379 1 : (set_attr "c86_attr" "insr")
5380 : (set_attr "length_immediate" "1")
5381 : (set_attr "mode" "DI,TI,TI,TI")])
5382 :
5383 : ;; For TARGET_SSE2, implement insert from XMM reg with PSHULFW + PBLENDW.
5384 : (define_split
5385 : [(set (match_operand:V4FI_64 0 "sse_reg_operand")
5386 : (vec_merge:V4FI_64
5387 : (vec_duplicate:V4FI_64
5388 : (match_operand:<mmxscalarmode> 2 "sse_reg_operand"))
5389 : (match_operand:V4FI_64 1 "sse_reg_operand")
5390 : (match_operand:SI 3 "const_int_operand")))]
5391 3 : "TARGET_MMX_WITH_SSE && TARGET_SSE4_1 && reload_completed
5392 6 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
5393 3 : < GET_MODE_NUNITS (<MODE>mode))"
5394 : [(set (match_dup 0)
5395 : (vec_duplicate:V4FI_64 (match_dup 2)))
5396 : (set (match_dup 0)
5397 1 : (vec_merge:V4FI_64 (match_dup 1) (match_dup 0) (match_dup 3)))]
5398 3 : "operands[3] = GEN_INT (~INTVAL (operands[3]) & 0xf);")
5399 :
5400 0 : (define_insn "*mmx_pinsrb"
5401 3 : [(set (match_operand:V8QI 0 "register_operand" "=x,YW")
5402 : (vec_merge:V8QI
5403 : (vec_duplicate:V8QI
5404 : (match_operand:QI 2 "nonimmediate_operand" "jrjm,rm"))
5405 : (match_operand:V8QI 1 "register_operand" "0,YW")
5406 3 : (match_operand:SI 3 "const_int_operand")))]
5407 10 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE
5408 20 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
5409 10 : < GET_MODE_NUNITS (V8QImode))"
5410 1 : {
5411 2 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
5412 2306 : switch (which_alternative)
5413 676 : {
5414 2306 : case 1:
5415 2306 : if (MEM_P (operands[2]))
5416 676 : return "vpinsrb\t{%3, %2, %1, %0|%0, %1, %2, %3}";
5417 : else
5418 1 : return "vpinsrb\t{%3, %k2, %1, %0|%0, %1, %k2, %3}";
5419 0 : case 0:
5420 0 : if (MEM_P (operands[2]))
5421 : return "pinsrb\t{%3, %2, %0|%0, %2, %3}";
5422 : else
5423 0 : return "pinsrb\t{%3, %k2, %0|%0, %k2, %3}";
5424 0 : default:
5425 0 : gcc_unreachable ();
5426 : }
5427 : }
5428 : [(set_attr "isa" "noavx,avx")
5429 : (set_attr "type" "sselog")
5430 : (set_attr "c86_attr" "insr")
5431 : (set_attr "addr" "gpr16,*")
5432 : (set_attr "prefix_extra" "1")
5433 : (set_attr "length_immediate" "1")
5434 : (set_attr "prefix" "orig,vex")
5435 : (set_attr "mode" "TI")])
5436 :
5437 : (define_insn "*mmx_pextrw"
5438 8 : [(set (match_operand:HI 0 "register_sse4nonimm_operand" "=r,r,jm,m")
5439 : (vec_select:HI
5440 : (match_operand:V4HI 1 "register_operand" "y,YW,YW,YW")
5441 : (parallel [(match_operand:SI 2 "const_0_to_3_operand")])))]
5442 862 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5443 17322 : && (TARGET_SSE || TARGET_3DNOW_A)"
5444 : "@
5445 : pextrw\t{%2, %1, %k0|%k0, %1, %2}
5446 : %vpextrw\t{%2, %1, %k0|%k0, %1, %2}
5447 16965 : pextrw\t{%2, %1, %0|%0, %1, %2}
5448 : vpextrw\t{%2, %1, %0|%0, %1, %2}"
5449 : [(set_attr "isa" "*,sse2,sse4_noavx,avx")
5450 16965 : (set_attr "addr" "*,*,gpr16,*")
5451 : (set_attr "mmx_isa" "native,*,*,*")
5452 : (set_attr "type" "mmxcvt,sselog1,sselog1,sselog1")
5453 : (set_attr "c86_attr" "extr")
5454 : (set_attr "length_immediate" "1")
5455 : (set_attr "prefix" "orig,maybe_vex,maybe_vex,maybe_evex")
5456 : (set_attr "mode" "DI,TI,TI,TI")])
5457 :
5458 : (define_insn "*mmx_pextrw<mode>"
5459 : [(set (match_operand:<mmxscalarmode> 0 "register_sse4nonimm_operand" "=?r,?r,jm,m,x,Yw")
5460 : (vec_select:<mmxscalarmode>
5461 : (match_operand:V4F_64 1 "register_operand" "y,YW,YW,YW,0,YW")
5462 : (parallel [(match_operand:SI 2 "const_0_to_3_operand")])))]
5463 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5464 : && (TARGET_SSE || TARGET_3DNOW_A)"
5465 8 : {
5466 8 : switch (which_alternative)
5467 : {
5468 : case 0:
5469 : case 1:
5470 : return "%vpextrw\t{%2, %1, %k0|%k0, %1, %2}";
5471 4 : case 2:
5472 4 : case 3:
5473 4 : return "%vpextrw\t{%2, %1, %0|%0, %1, %2}";
5474 4 : case 4:
5475 4 : operands[2] = GEN_INT (INTVAL (operands[2]) * 2);
5476 4 : return "psrldq\t{%2, %0|%0, %2}";
5477 0 : case 5:
5478 0 : operands[2] = GEN_INT (INTVAL (operands[2]) * 2);
5479 0 : return "vpsrldq\t{%2, %1, %0|%0, %1, %2}";
5480 :
5481 0 : default:
5482 0 : gcc_unreachable ();
5483 : }
5484 : }
5485 : [(set_attr "isa" "*,sse2,sse4_noavx,avx,noavx,avx")
5486 : (set_attr "addr" "*,*,gpr16,*,*,*")
5487 : (set_attr "mmx_isa" "native,*,*,*,*,*")
5488 : (set_attr "type" "mmxcvt,sselog1,sselog1,sselog1,sseishft1,sseishft1")
5489 : (set_attr "c86_attr" "extr,extr,extr,extr,*,*")
5490 : (set_attr "length_immediate" "1")
5491 : (set_attr "prefix" "orig,maybe_vex,maybe_vex,maybe_evex,orig,maybe_evex")
5492 : (set_attr "mode" "DI,TI,TI,TI,TI,TI")])
5493 :
5494 : (define_insn "*mmx_pextrw_zext"
5495 : [(set (match_operand:SWI48 0 "register_operand" "=r,r")
5496 : (zero_extend:SWI48
5497 : (vec_select:HI
5498 : (match_operand:V4HI 1 "register_operand" "y,YW")
5499 : (parallel [(match_operand:SI 2 "const_0_to_3_operand")]))))]
5500 0 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5501 182 : && (TARGET_SSE || TARGET_3DNOW_A)"
5502 : "@
5503 : pextrw\t{%2, %1, %k0|%k0, %1, %2}
5504 : %vpextrw\t{%2, %1, %k0|%k0, %1, %2}"
5505 : [(set_attr "isa" "*,sse2")
5506 : (set_attr "mmx_isa" "native,*")
5507 : (set_attr "type" "mmxcvt,sselog1")
5508 : (set_attr "c86_attr" "extr")
5509 : (set_attr "length_immediate" "1")
5510 1164 : (set_attr "prefix" "orig,maybe_vex")
5511 : (set_attr "mode" "DI,TI")])
5512 :
5513 : (define_insn "*mmx_pextrb"
5514 : [(set (match_operand:QI 0 "nonimmediate_operand" "=jr,jm,r,m")
5515 : (vec_select:QI
5516 : (match_operand:V8QI 1 "register_operand" "YW,YW,YW,YW")
5517 : (parallel [(match_operand:SI 2 "const_0_to_7_operand")])))]
5518 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5519 : "@
5520 : pextrb\t{%2, %1, %k0|%k0, %1, %2}
5521 : pextrb\t{%2, %1, %0|%0, %1, %2}
5522 : vpextrb\t{%2, %1, %k0|%k0, %1, %2}
5523 : vpextrb\t{%2, %1, %0|%0, %1, %2}"
5524 : [(set_attr "isa" "noavx,noavx,avx,avx")
5525 : (set_attr "addr" "*,gpr16,*,*")
5526 : (set_attr "type" "sselog1")
5527 : (set_attr "c86_attr" "extr")
5528 : (set_attr "prefix_extra" "1")
5529 : (set_attr "length_immediate" "1")
5530 : (set_attr "prefix" "maybe_vex")
5531 : (set_attr "mode" "TI")])
5532 :
5533 : (define_insn "*mmx_pextrb_zext"
5534 : [(set (match_operand:SWI248 0 "register_operand" "=jr,r")
5535 : (zero_extend:SWI248
5536 : (vec_select:QI
5537 : (match_operand:V8QI 1 "register_operand" "YW,YW")
5538 : (parallel [(match_operand:SI 2 "const_0_to_7_operand")]))))]
5539 0 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5540 : "%vpextrb\t{%2, %1, %k0|%k0, %1, %2}"
5541 : [(set_attr "isa" "noavx,avx")
5542 : (set_attr "type" "sselog1")
5543 : (set_attr "c86_attr" "extr")
5544 : (set_attr "prefix_extra" "1")
5545 : (set_attr "length_immediate" "1")
5546 : (set_attr "prefix" "maybe_vex")
5547 : (set_attr "mode" "TI")])
5548 :
5549 : (define_insn "mmx_pshufbv8qi3"
5550 : [(set (match_operand:V8QI 0 "register_operand" "=x,Yw")
5551 : (unspec:V8QI
5552 : [(match_operand:V8QI 1 "register_operand" "0,Yw")
5553 : (match_operand:V16QI 2 "vector_operand" "xja,Ywm")]
5554 : UNSPEC_PSHUFB))]
5555 1327 : "TARGET_SSSE3 && TARGET_MMX_WITH_SSE"
5556 : "@
5557 : pshufb\t{%2, %0|%0, %2}
5558 : vpshufb\t{%2, %1, %0|%0, %1, %2}"
5559 25660 : [(set_attr "isa" "noavx,avx")
5560 : (set_attr "addr" "gpr16,*")
5561 : (set_attr "type" "sselog1")
5562 25660 : (set_attr "prefix_extra" "1")
5563 : (set_attr "prefix" "orig,maybe_evex")
5564 : (set_attr "btver2_decode" "vector")
5565 : (set_attr "mode" "TI")])
5566 :
5567 : (define_insn "mmx_pshufbv4qi3"
5568 : [(set (match_operand:V4QI 0 "register_operand" "=x,Yw")
5569 : (unspec:V4QI
5570 : [(match_operand:V4QI 1 "register_operand" "0,Yw")
5571 : (match_operand:V16QI 2 "vector_operand" "xja,Ywm")]
5572 : UNSPEC_PSHUFB))]
5573 25660 : "TARGET_SSSE3"
5574 : "@
5575 : pshufb\t{%2, %0|%0, %2}
5576 : vpshufb\t{%2, %1, %0|%0, %1, %2}"
5577 5354 : [(set_attr "isa" "noavx,avx")
5578 : (set_attr "addr" "gpr16,*")
5579 : (set_attr "type" "sselog1")
5580 5354 : (set_attr "prefix_extra" "1")
5581 : (set_attr "prefix" "orig,maybe_evex")
5582 : (set_attr "btver2_decode" "vector")
5583 : (set_attr "mode" "TI")])
5584 :
5585 : (define_expand "mmx_pshufw"
5586 : [(match_operand:V4HI 0 "register_operand")
5587 : (match_operand:V4HI 1 "register_mmxmem_operand")
5588 : (match_operand:SI 2 "const_int_operand")]
5589 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5590 : && (TARGET_SSE || TARGET_3DNOW_A)"
5591 75 : {
5592 75 : int mask = INTVAL (operands[2]);
5593 75 : emit_insn (gen_mmx_pshufwv4hi_1 (operands[0], operands[1],
5594 : GEN_INT ((mask >> 0) & 3),
5595 75 : GEN_INT ((mask >> 2) & 3),
5596 75 : GEN_INT ((mask >> 4) & 3),
5597 75 : GEN_INT ((mask >> 6) & 3)));
5598 75 : DONE;
5599 : })
5600 :
5601 : (define_insn "mmx_pshufw<mode>_1"
5602 : [(set (match_operand:V4FI_64 0 "register_operand" "=y,Yw")
5603 : (vec_select:V4FI_64
5604 : (match_operand:V4FI_64 1 "register_mmxmem_operand" "ym,Yw")
5605 : (parallel [(match_operand 2 "const_0_to_3_operand")
5606 : (match_operand 3 "const_0_to_3_operand")
5607 : (match_operand 4 "const_0_to_3_operand")
5608 : (match_operand 5 "const_0_to_3_operand")])))]
5609 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5610 : && (TARGET_SSE || TARGET_3DNOW_A)"
5611 6455 : {
5612 1164 : int mask = 0;
5613 6455 : mask |= INTVAL (operands[2]) << 0;
5614 6455 : mask |= INTVAL (operands[3]) << 2;
5615 6455 : mask |= INTVAL (operands[4]) << 4;
5616 1164 : mask |= INTVAL (operands[5]) << 6;
5617 1164 : operands[2] = GEN_INT (mask);
5618 :
5619 1164 : switch (which_alternative)
5620 : {
5621 : case 0:
5622 : return "pshufw\t{%2, %1, %0|%0, %1, %2}";
5623 1164 : case 1:
5624 1164 : return "%vpshuflw\t{%2, %1, %0|%0, %1, %2}";
5625 0 : default:
5626 0 : gcc_unreachable ();
5627 : }
5628 : }
5629 : [(set_attr "isa" "*,sse2")
5630 : (set_attr "mmx_isa" "native,*")
5631 : (set_attr "type" "mmxcvt,sselog1")
5632 770 : (set_attr "length_immediate" "1")
5633 : (set_attr "mode" "DI,TI")])
5634 :
5635 : (define_insn "*mmx_pshufd_1"
5636 : [(set (match_operand:V2SI 0 "register_operand" "=Yv")
5637 : (vec_select:V2SI
5638 : (match_operand:V2SI 1 "register_operand" "Yv")
5639 : (parallel [(match_operand 2 "const_0_to_1_operand")
5640 : (match_operand 3 "const_0_to_1_operand")])))]
5641 : "TARGET_MMX_WITH_SSE"
5642 770 : {
5643 770 : int mask = 0;
5644 770 : mask |= INTVAL (operands[2]) << 0;
5645 770 : mask |= INTVAL (operands[3]) << 2;
5646 770 : mask |= 2 << 4;
5647 770 : mask |= 3 << 6;
5648 770 : operands[2] = GEN_INT (mask);
5649 :
5650 770 : return "%vpshufd\t{%2, %1, %0|%0, %1, %2}";
5651 : }
5652 : [(set_attr "type" "sselog1")
5653 : (set_attr "prefix_data16" "1")
5654 : (set_attr "length_immediate" "1")
5655 : (set_attr "mode" "TI")])
5656 :
5657 : (define_insn "*mmx_pblendw64"
5658 : [(set (match_operand:V4FI_64 0 "register_operand" "=Yr,*x,x")
5659 : (vec_merge:V4FI_64
5660 : (match_operand:V4FI_64 2 "register_operand" "Yr,*x,x")
5661 : (match_operand:V4FI_64 1 "register_operand" "0,0,x")
5662 : (match_operand:SI 3 "const_0_to_15_operand")))]
5663 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5664 : "@
5665 : pblendw\t{%3, %2, %0|%0, %2, %3}
5666 : pblendw\t{%3, %2, %0|%0, %2, %3}
5667 : vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
5668 : [(set_attr "isa" "noavx,noavx,avx")
5669 : (set_attr "type" "ssemov")
5670 : (set_attr "c86_attr" "blend")
5671 : (set_attr "prefix_extra" "1")
5672 : (set_attr "length_immediate" "1")
5673 : (set_attr "prefix" "orig,orig,vex")
5674 : (set_attr "mode" "TI")])
5675 :
5676 : (define_insn "*mmx_pblendw32"
5677 : [(set (match_operand:V2FI_32 0 "register_operand" "=Yr,*x,x")
5678 : (vec_merge:V2FI_32
5679 : (match_operand:V2FI_32 2 "register_operand" "Yr,*x,x")
5680 : (match_operand:V2FI_32 1 "register_operand" "0,0,x")
5681 : (match_operand:SI 3 "const_0_to_7_operand")))]
5682 : "TARGET_SSE4_1"
5683 : "@
5684 : pblendw\t{%3, %2, %0|%0, %2, %3}
5685 : pblendw\t{%3, %2, %0|%0, %2, %3}
5686 : vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
5687 : [(set_attr "isa" "noavx,noavx,avx")
5688 : (set_attr "type" "ssemov")
5689 : (set_attr "c86_attr" "blend")
5690 : (set_attr "prefix_extra" "1")
5691 : (set_attr "length_immediate" "1")
5692 : (set_attr "prefix" "orig,orig,vex")
5693 : (set_attr "mode" "TI")])
5694 :
5695 : ;; Optimize V2SImode load from memory, swapping the elements and
5696 : ;; storing back into the memory into DImode rotate of the memory by 32.
5697 : (define_split
5698 61 : [(set (match_operand:V2SI 0 "memory_operand")
5699 : (vec_select:V2SI (match_dup 0)
5700 : (parallel [(const_int 1) (const_int 0)])))]
5701 78 : "TARGET_64BIT && (TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())"
5702 : [(set (match_dup 0)
5703 : (rotate:DI (match_dup 0) (const_int 32)))]
5704 78 : "operands[0] = adjust_address (operands[0], DImode, 0);")
5705 3 :
5706 : (define_insn "mmx_pswapdv2si2"
5707 78 : [(set (match_operand:V2SI 0 "register_operand" "=y,Yv")
5708 3 : (vec_select:V2SI
5709 : (match_operand:V2SI 1 "register_mmxmem_operand" "ym,Yv")
5710 : (parallel [(const_int 1) (const_int 0)])))]
5711 78 : "TARGET_3DNOW_A"
5712 : "@
5713 : pswapd\t{%1, %0|%0, %1}
5714 : %vpshufd\t{$0xe1, %1, %0|%0, %1, 0xe1}";
5715 : [(set_attr "isa" "*,sse2")
5716 : (set_attr "mmx_isa" "native,*")
5717 0 : (set_attr "type" "mmxcvt,sselog1")
5718 : (set_attr "prefix_extra" "1,*")
5719 0 : (set_attr "length_immediate" "*,1")
5720 0 : (set_attr "mode" "DI,TI")])
5721 :
5722 : (define_insn "*vec_dupv4hi"
5723 : [(set (match_operand:V4HI 0 "register_operand" "=y,Yw")
5724 : (vec_duplicate:V4HI
5725 : (truncate:HI
5726 : (match_operand:SI 1 "register_operand" "0,Yw"))))]
5727 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5728 : && (TARGET_SSE || TARGET_3DNOW_A)"
5729 : "@
5730 : pshufw\t{$0, %0, %0|%0, %0, 0}
5731 : %vpshuflw\t{$0, %1, %0|%0, %1, 0}"
5732 : [(set_attr "isa" "*,sse2")
5733 : (set_attr "mmx_isa" "native,*")
5734 : (set_attr "type" "mmxcvt,sselog1")
5735 : (set_attr "length_immediate" "1")
5736 : (set_attr "mode" "DI,TI")])
5737 :
5738 : (define_insn "*vec_dup<mode>"
5739 : [(set (match_operand:V4FI_64 0 "register_operand" "=Yw")
5740 : (vec_duplicate:V4FI_64
5741 : (match_operand:<mmxscalarmode> 1 "register_operand" "Yw")))]
5742 : "TARGET_MMX_WITH_SSE"
5743 : "%vpshuflw\t{$0, %1, %0|%0, %1, 0}"
5744 : [(set_attr "isa" "sse2")
5745 : (set_attr "type" "sselog1")
5746 : (set_attr "length_immediate" "1")
5747 : (set_attr "mode" "TI")])
5748 :
5749 : (define_insn "*vec_dupv2si"
5750 : [(set (match_operand:V2SI 0 "register_operand" "=y,Yv")
5751 : (vec_duplicate:V2SI
5752 : (match_operand:SI 1 "register_operand" "0,Yv")))]
5753 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5754 : "@
5755 : punpckldq\t%0, %0
5756 : %vpshufd\t{$0xe0, %1, %0|%0, %1, 0xe0}"
5757 : [(set_attr "isa" "*,sse2")
5758 : (set_attr "mmx_isa" "native,*")
5759 : (set_attr "type" "mmxcvt,sselog1")
5760 : (set_attr "prefix_data16" "*,1")
5761 : (set_attr "length_immediate" "*,1")
5762 : (set_attr "mode" "DI,TI")])
5763 :
5764 : (define_insn "*mmx_concatv2si"
5765 : [(set (match_operand:V2SI 0 "register_operand" "=y,y")
5766 : (vec_concat:V2SI
5767 : (match_operand:SI 1 "nonimmediate_operand" " 0,rm")
5768 : (match_operand:SI 2 "nonimm_or_0_operand" "ym,C")))]
5769 : "TARGET_MMX && !TARGET_SSE"
5770 : "@
5771 : punpckldq\t{%2, %0|%0, %2}
5772 : movd\t{%1, %0|%0, %1}"
5773 : [(set_attr "type" "mmxcvt,mmxmov")
5774 : (set_attr "mode" "DI")])
5775 :
5776 : (define_expand "vec_setv2si"
5777 : [(match_operand:V2SI 0 "register_operand")
5778 : (match_operand:SI 1 "register_operand")
5779 : (match_operand 2 "vec_setm_mmx_operand")]
5780 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5781 191 : {
5782 191 : if (CONST_INT_P (operands[2]))
5783 189 : ix86_expand_vector_set (TARGET_MMX_WITH_SSE, operands[0], operands[1],
5784 189 : INTVAL (operands[2]));
5785 : else
5786 2 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
5787 191 : DONE;
5788 : })
5789 :
5790 : ;; Avoid combining registers from different units in a single alternative,
5791 : ;; see comment above inline_secondary_memory_needed function in i386.cc
5792 : (define_insn_and_split "*vec_extractv2si_0"
5793 : [(set (match_operand:SI 0 "nonimmediate_operand" "=x,m,y, m,r,r")
5794 : (vec_select:SI
5795 : (match_operand:V2SI 1 "nonimmediate_operand" "xm,x,ym,y,m,x")
5796 : (parallel [(const_int 0)])))]
5797 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5798 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
5799 : "#"
5800 18310 : "&& reload_completed"
5801 : [(set (match_dup 0) (match_dup 1))]
5802 20384 : "operands[1] = gen_lowpart (SImode, operands[1]);"
5803 18310 : [(set_attr "isa" "*,*,*,*,*,sse2")
5804 18310 : (set_attr "mmx_isa" "*,*,native,native,*,*")
5805 2074 : (set (attr "preferred_for_speed")
5806 : (cond [(eq_attr "alternative" "5")
5807 : (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
5808 2074 : ]
5809 : (symbol_ref "true")))])
5810 :
5811 : (define_insn "*vec_extractv2si_0_zext_sse4"
5812 : [(set (match_operand:DI 0 "register_operand" "=r,x")
5813 2 : (zero_extend:DI
5814 : (vec_select:SI
5815 2 : (match_operand:V2SI 1 "register_operand" "x,x")
5816 2 : (parallel [(const_int 0)]))))]
5817 841 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE4_1"
5818 : "#"
5819 : [(set_attr "isa" "x64,*")
5820 : (set (attr "preferred_for_speed")
5821 839 : (cond [(eq_attr "alternative" "0")
5822 : (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
5823 : ]
5824 839 : (symbol_ref "true")))])
5825 :
5826 : (define_insn "*vec_extractv2si_0_zext"
5827 : [(set (match_operand:DI 0 "register_operand" "=r")
5828 : (zero_extend:DI
5829 : (vec_select:SI
5830 : (match_operand:V2SI 1 "register_operand" "x")
5831 : (parallel [(const_int 0)]))))]
5832 0 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5833 839 : && TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_FROM_VEC"
5834 : "#")
5835 :
5836 : (define_split
5837 4610 : [(set (match_operand:DI 0 "register_operand")
5838 : (zero_extend:DI
5839 : (vec_select:SI
5840 4610 : (match_operand:V2SI 1 "register_operand")
5841 : (parallel [(const_int 0)]))))]
5842 0 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5843 392 : && TARGET_SSE2 && reload_completed"
5844 : [(set (match_dup 0) (zero_extend:DI (match_dup 1)))]
5845 196 : "operands[1] = gen_lowpart (SImode, operands[1]);")
5846 :
5847 0 : ;; Avoid combining registers from different units in a single alternative,
5848 196 : ;; see comment above inline_secondary_memory_needed function in i386.cc
5849 : (define_insn "*vec_extractv2si_1"
5850 0 : [(set (match_operand:SI 0 "nonimmediate_operand" "=y,jrjm,rm,x,x,y,x,r")
5851 196 : (vec_select:SI
5852 : (match_operand:V2SI 1 "nonimmediate_operand" " 0,x, x ,x,0,o,o,o")
5853 : (parallel [(const_int 1)])))]
5854 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5855 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
5856 9 : "@
5857 : punpckhdq\t%0, %0
5858 9 : pextrd\t{$1, %1, %0|%0, %1, 1}
5859 9 : vpextrd\t{$1, %1, %0|%0, %1, 1}
5860 9 : %vpshufd\t{$0xe5, %1, %0|%0, %1, 0xe5}
5861 : shufps\t{$0xe5, %0, %0|%0, %0, 0xe5}
5862 : #
5863 : #
5864 : #"
5865 : [(set_attr "isa" "*,sse4_noavx,avx,sse2,noavx,*,*,*")
5866 : (set (attr "addr")
5867 : (if_then_else (eq_attr "alternative" "1")
5868 : (const_string "gpr16")
5869 : (const_string "*")))
5870 : (set_attr "mmx_isa" "native,*,*,*,*,native,*,*")
5871 : (set_attr "type" "mmxcvt,ssemov,ssemov,sseshuf1,sseshuf1,mmxmov,ssemov,imov")
5872 : (set_attr "c86_attr" "*,extr,extr,*,*,*,*,*")
5873 : (set (attr "length_immediate")
5874 : (if_then_else (eq_attr "alternative" "1,2,3,4")
5875 : (const_string "1")
5876 : (const_string "*")))
5877 : (set_attr "prefix" "orig,orig,maybe_evex,maybe_vex,orig,orig,orig,orig")
5878 : (set_attr "mode" "DI,TI,TI,TI,V4SF,SI,SI,SI")])
5879 :
5880 : (define_split
5881 : [(set (match_operand:SI 0 "register_operand")
5882 : (vec_select:SI
5883 : (match_operand:V2SI 1 "memory_operand")
5884 : (parallel [(const_int 1)])))]
5885 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && reload_completed"
5886 : [(set (match_dup 0) (match_dup 1))]
5887 35 : "operands[1] = adjust_address (operands[1], SImode, 4);")
5888 :
5889 : (define_insn "*vec_extractv2si_1_zext"
5890 35 : [(set (match_operand:DI 0 "register_operand" "=jr,r")
5891 : (zero_extend:DI
5892 : (vec_select:SI
5893 35 : (match_operand:V2SI 1 "register_operand" "x,x")
5894 : (parallel [(const_int 1)]))))]
5895 0 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5896 962 : && TARGET_64BIT && TARGET_SSE4_1"
5897 : "%vpextrd\t{$1, %1, %k0|%k0, %1, 1}"
5898 0 : [(set_attr "isa" "noavx,avx")
5899 : (set_attr "type" "sselog1")
5900 0 : (set_attr "c86_attr" "extr")
5901 0 : (set_attr "prefix_extra" "1")
5902 0 : (set_attr "length_immediate" "1")
5903 0 : (set_attr "prefix" "maybe_vex")
5904 : (set_attr "mode" "TI")])
5905 :
5906 : (define_insn_and_split "*vec_extractv2si_zext_mem"
5907 : [(set (match_operand:DI 0 "register_operand" "=y,x,r")
5908 : (zero_extend:DI
5909 : (vec_select:SI
5910 : (match_operand:V2SI 1 "memory_operand" "o,o,o")
5911 : (parallel [(match_operand:SI 2 "const_0_to_1_operand")]))))]
5912 0 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_64BIT"
5913 : "#"
5914 0 : "&& reload_completed"
5915 : [(set (match_dup 0) (zero_extend:DI (match_dup 1)))]
5916 1207 : {
5917 0 : operands[1] = adjust_address (operands[1], SImode, INTVAL (operands[2]) * 4);
5918 0 : }
5919 1207 : [(set_attr "isa" "*,sse2,*")
5920 : (set_attr "mmx_isa" "native,*,*")])
5921 0 :
5922 : (define_expand "vec_extractv2sisi"
5923 : [(match_operand:SI 0 "register_operand")
5924 0 : (match_operand:V2SI 1 "register_operand")
5925 : (match_operand 2 "const_int_operand")]
5926 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5927 5291 : {
5928 5291 : ix86_expand_vector_extract (TARGET_MMX_WITH_SSE, operands[0],
5929 5300 : operands[1], INTVAL (operands[2]));
5930 5291 : DONE;
5931 9 : })
5932 9 :
5933 9 : (define_expand "vec_initv2sisi"
5934 : [(match_operand:V2SI 0 "register_operand")
5935 : (match_operand 1)]
5936 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE"
5937 18310 : {
5938 33810 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
5939 : operands[1]);
5940 18310 : DONE;
5941 : })
5942 :
5943 828 : (define_expand "vec_set<mode>"
5944 : [(match_operand:V4FI_64 0 "register_operand")
5945 828 : (match_operand:<mmxscalarmode> 1 "register_operand")
5946 828 : (match_operand 2 "vec_setm_mmx_operand")]
5947 828 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5948 11 : {
5949 11 : if (CONST_INT_P (operands[2]))
5950 12 : ix86_expand_vector_set (TARGET_MMX_WITH_SSE, operands[0], operands[1],
5951 8 : INTVAL (operands[2]));
5952 : else
5953 3 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
5954 11 : DONE;
5955 0 : })
5956 0 :
5957 0 : (define_expand "vec_extract<mode><mmxscalarmodelower>"
5958 : [(match_operand:<mmxscalarmode> 0 "register_operand")
5959 : (match_operand:V4FI_64 1 "register_operand")
5960 : (match_operand 2 "const_int_operand")]
5961 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5962 837 : {
5963 865 : ix86_expand_vector_extract (TARGET_MMX_WITH_SSE, operands[0],
5964 837 : operands[1], INTVAL (operands[2]));
5965 837 : DONE;
5966 : })
5967 3499 :
5968 : (define_expand "vec_initv4hihi"
5969 3499 : [(match_operand:V4HI 0 "register_operand")
5970 3499 : (match_operand 1)]
5971 3499 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE"
5972 3472 : {
5973 3477 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
5974 : operands[1]);
5975 3472 : DONE;
5976 : })
5977 :
5978 988 : (define_expand "vec_init<mode><mmxscalarmodelower>"
5979 : [(match_operand:V4F_64 0 "register_operand")
5980 988 : (match_operand 1)]
5981 988 : "TARGET_MMX_WITH_SSE"
5982 1015 : {
5983 27 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
5984 : operands[1]);
5985 27 : DONE;
5986 : })
5987 :
5988 : (define_expand "vec_setv8qi"
5989 1 : [(match_operand:V8QI 0 "register_operand")
5990 : (match_operand:QI 1 "register_operand")
5991 1 : (match_operand 2 "vec_setm_mmx_operand")]
5992 1 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5993 2 : {
5994 2 : if (CONST_INT_P (operands[2]))
5995 0 : ix86_expand_vector_set (TARGET_MMX_WITH_SSE, operands[0], operands[1],
5996 0 : INTVAL (operands[2]));
5997 : else
5998 2 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
5999 2 : DONE;
6000 : })
6001 0 :
6002 0 : (define_expand "vec_extractv8qiqi"
6003 : [(match_operand:QI 0 "register_operand")
6004 : (match_operand:V8QI 1 "register_operand")
6005 : (match_operand 2 "const_int_operand")]
6006 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
6007 630 : {
6008 630 : ix86_expand_vector_extract (TARGET_MMX_WITH_SSE, operands[0],
6009 630 : operands[1], INTVAL (operands[2]));
6010 630 : DONE;
6011 : })
6012 0 :
6013 : (define_expand "vec_initv8qiqi"
6014 0 : [(match_operand:V8QI 0 "register_operand")
6015 0 : (match_operand 1)]
6016 0 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE"
6017 356 : {
6018 360 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
6019 : operands[1]);
6020 356 : DONE;
6021 : })
6022 :
6023 27 : (define_insn "*pinsrw"
6024 : [(set (match_operand:V2FI_32 0 "register_operand" "=x,YW,&x")
6025 27 : (vec_merge:V2FI_32
6026 27 : (vec_duplicate:V2FI_32
6027 27 : (match_operand:<mmxscalarmode> 2 "nonimmediate_operand" "rm,rm,x"))
6028 : (match_operand:V2FI_32 1 "register_operand" "0,YW,x")
6029 : (match_operand:SI 3 "const_int_operand")))]
6030 676 : "TARGET_SSE2
6031 676 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
6032 676 : < GET_MODE_NUNITS (V2HImode))"
6033 63 : {
6034 122 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6035 63 : switch (which_alternative)
6036 2 : {
6037 2 : case 2:
6038 : return "#";
6039 1 : case 1:
6040 1 : if (MEM_P (operands[2]))
6041 : return "vpinsrw\t{%3, %2, %1, %0|%0, %1, %2, %3}";
6042 : else
6043 0 : return "vpinsrw\t{%3, %k2, %1, %0|%0, %1, %k2, %3}";
6044 60 : case 0:
6045 60 : if (MEM_P (operands[2]))
6046 : return "pinsrw\t{%3, %2, %0|%0, %2, %3}";
6047 : else
6048 41 : return "pinsrw\t{%3, %k2, %0|%0, %k2, %3}";
6049 0 : default:
6050 0 : gcc_unreachable ();
6051 : }
6052 : }
6053 : [(set_attr "isa" "noavx,avx,sse4")
6054 : (set_attr "type" "sselog")
6055 : (set_attr "c86_attr" "insr")
6056 0 : (set_attr "length_immediate" "1")
6057 : (set_attr "mode" "TI")])
6058 :
6059 : ;; For TARGET_SSE2, implement insert from XMM reg with PSHULFW + PBLENDW.
6060 : (define_split
6061 : [(set (match_operand:V2FI_32 0 "sse_reg_operand")
6062 : (vec_merge:V2FI_32
6063 : (vec_duplicate:V2FI_32
6064 : (match_operand:<mmxscalarmode> 2 "sse_reg_operand"))
6065 : (match_operand:V2FI_32 1 "sse_reg_operand")
6066 : (match_operand:SI 3 "const_int_operand")))]
6067 1 : "TARGET_SSE4_1 && reload_completed
6068 2 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
6069 1 : < GET_MODE_NUNITS (<MODE>mode))"
6070 : [(set (match_dup 0)
6071 : (vec_duplicate:V2FI_32 (match_dup 2)))
6072 : (set (match_dup 0)
6073 392 : (vec_merge:V2FI_32 (match_dup 1) (match_dup 0) (match_dup 3)))]
6074 1 : "operands[3] = GEN_INT (~INTVAL (operands[3]) & 0x3);")
6075 :
6076 392 :
6077 1 : (define_insn "*pinsrb"
6078 : [(set (match_operand:V4QI 0 "register_operand" "=x,YW")
6079 : (vec_merge:V4QI
6080 : (vec_duplicate:V4QI
6081 : (match_operand:QI 2 "nonimmediate_operand" "jrjm,rm"))
6082 1 : (match_operand:V4QI 1 "register_operand" "0,YW")
6083 : (match_operand:SI 3 "const_int_operand")))]
6084 0 : "TARGET_SSE4_1
6085 0 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
6086 0 : < GET_MODE_NUNITS (V4QImode))"
6087 491 : {
6088 0 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6089 491 : switch (which_alternative)
6090 352234 : {
6091 491 : case 1:
6092 0 : if (MEM_P (operands[2]))
6093 351743 : return "vpinsrb\t{%3, %2, %1, %0|%0, %1, %2, %3}";
6094 : else
6095 0 : return "vpinsrb\t{%3, %k2, %1, %0|%0, %1, %k2, %3}";
6096 0 : case 0:
6097 0 : if (MEM_P (operands[2]))
6098 : return "pinsrb\t{%3, %2, %0|%0, %2, %3}";
6099 : else
6100 0 : return "pinsrb\t{%3, %k2, %0|%0, %k2, %3}";
6101 0 : default:
6102 0 : gcc_unreachable ();
6103 : }
6104 : }
6105 : [(set_attr "isa" "noavx,avx")
6106 : (set_attr "addr" "gpr16,*")
6107 : (set_attr "type" "sselog")
6108 : (set_attr "c86_attr" "insr")
6109 : (set_attr "prefix_extra" "1")
6110 : (set_attr "length_immediate" "1")
6111 : (set_attr "prefix" "orig,vex")
6112 : (set_attr "mode" "TI")])
6113 :
6114 85 : (define_insn "*pextrw"
6115 : [(set (match_operand:HI 0 "register_sse4nonimm_operand" "=r,jm,m")
6116 : (vec_select:HI
6117 : (match_operand:V2HI 1 "register_operand" "YW,YW,YW")
6118 : (parallel [(match_operand:SI 2 "const_0_to_1_operand")])))]
6119 : "TARGET_SSE2"
6120 : "@
6121 : %vpextrw\t{%2, %1, %k0|%k0, %1, %2}
6122 : pextrw\t{%2, %1, %0|%0, %1, %2}
6123 : vpextrw\t{%2, %1, %0|%0, %1, %2}"
6124 : [(set_attr "isa" "*,sse4_noavx,avx")
6125 : (set_attr "addr" "*,gpr16,*")
6126 : (set_attr "type" "sselog1")
6127 : (set_attr "c86_attr" "extr")
6128 : (set_attr "length_immediate" "1")
6129 : (set_attr "prefix" "maybe_vex")
6130 : (set_attr "mode" "TI")])
6131 :
6132 : (define_insn "*pextrw<mode>"
6133 : [(set (match_operand:<mmxscalarmode> 0 "register_sse4nonimm_operand" "=?r,jm,m,x,Yw")
6134 : (vec_select:<mmxscalarmode>
6135 : (match_operand:V2F_32 1 "register_operand" "YW,YW,YW,0,YW")
6136 : (parallel [(match_operand:SI 2 "const_0_to_1_operand")])))]
6137 : "TARGET_SSE2"
6138 85 : {
6139 85 : switch (which_alternative)
6140 : {
6141 : case 0:
6142 : return "%vpextrw\t{%2, %1, %k0|%k0, %1, %2}";
6143 0 : case 1:
6144 0 : return "pextrw\t{%2, %1, %0|%0, %1, %2}";
6145 0 : case 2:
6146 0 : return "vpextrw\t{%2, %1, %0|%0, %1, %2}";
6147 11 : case 3:
6148 11 : operands[2] = GEN_INT (INTVAL (operands[2]) * 2);
6149 11 : return "psrldq\t{%2, %0|%0, %2}";
6150 14 : case 4:
6151 14 : operands[2] = GEN_INT (INTVAL (operands[2]) * 2);
6152 14 : return "vpsrldq\t{%2, %1, %0|%0, %1, %2}";
6153 :
6154 0 : default:
6155 0 : gcc_unreachable ();
6156 : }
6157 : }
6158 : [(set_attr "isa" "*,sse4_noavx,avx,noavx,avx")
6159 : (set_attr "addr" "*,gpr16,*,*,*")
6160 : (set_attr "type" "sselog1,sselog1,sselog1,sseishft1,sseishft1")
6161 : (set_attr "c86_attr" "extr,extr,extr,*,*")
6162 : (set_attr "length_immediate" "1")
6163 : (set_attr "prefix" "maybe_vex,orig,maybe_evex,orig,maybe_evex")
6164 : (set_attr "mode" "TI")])
6165 :
6166 : (define_insn "*pextrw_zext"
6167 : [(set (match_operand:SWI48 0 "register_operand" "=r")
6168 84 : (zero_extend:SWI48
6169 : (vec_select:HI
6170 : (match_operand:V2HI 1 "register_operand" "YW")
6171 : (parallel [(match_operand:SI 2 "const_0_to_1_operand")]))))]
6172 1845 : "TARGET_SSE2"
6173 : "%vpextrw\t{%2, %1, %k0|%k0, %1, %2}"
6174 : [(set_attr "type" "sselog1")
6175 : (set_attr "c86_attr" "extr")
6176 : (set_attr "length_immediate" "1")
6177 : (set_attr "prefix" "maybe_vex")
6178 : (set_attr "mode" "TI")])
6179 :
6180 : (define_insn "*pextrb"
6181 : [(set (match_operand:QI 0 "nonimmediate_operand" "=jr,jm,r,m")
6182 : (vec_select:QI
6183 : (match_operand:V4QI 1 "register_operand" "YW,YW,YW,YW")
6184 : (parallel [(match_operand:SI 2 "const_0_to_3_operand")])))]
6185 : "TARGET_SSE4_1"
6186 : "@
6187 : pextrb\t{%2, %1, %k0|%k0, %1, %2}
6188 : pextrb\t{%2, %1, %0|%0, %1, %2}
6189 : vpextrb\t{%2, %1, %k0|%k0, %1, %2}
6190 : vpextrb\t{%2, %1, %0|%0, %1, %2}"
6191 : [(set_attr "isa" "noavx,noavx,avx,avx")
6192 : (set_attr "addr" "*,gpr16,*,*")
6193 : (set_attr "type" "sselog1")
6194 : (set_attr "c86_attr" "extr")
6195 : (set_attr "prefix_extra" "1")
6196 : (set_attr "length_immediate" "1")
6197 : (set_attr "prefix" "maybe_vex")
6198 : (set_attr "mode" "TI")])
6199 :
6200 : (define_insn "*pextrb_zext"
6201 : [(set (match_operand:SWI248 0 "register_operand" "=jr,r")
6202 : (zero_extend:SWI248
6203 : (vec_select:QI
6204 : (match_operand:V4QI 1 "register_operand" "YW,YW")
6205 : (parallel [(match_operand:SI 2 "const_0_to_3_operand")]))))]
6206 0 : "TARGET_SSE4_1"
6207 : "%vpextrb\t{%2, %1, %k0|%k0, %1, %2}"
6208 : [(set_attr "isa" "noavx,avx")
6209 : (set_attr "type" "sselog1")
6210 : (set_attr "c86_attr" "extr")
6211 : (set_attr "prefix_extra" "1")
6212 : (set_attr "length_immediate" "1")
6213 : (set_attr "prefix" "maybe_vex")
6214 : (set_attr "mode" "TI")])
6215 :
6216 : (define_expand "vec_set<mode>"
6217 : [(match_operand:V2FI_32 0 "register_operand")
6218 : (match_operand:<mmxscalarmode> 1 "register_operand")
6219 : (match_operand 2 "vec_setm_sse41_operand")]
6220 : "TARGET_SSE2"
6221 29 : {
6222 29 : if (CONST_INT_P (operands[2]))
6223 26 : ix86_expand_vector_set (false, operands[0], operands[1],
6224 26 : INTVAL (operands[2]));
6225 : else
6226 3 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
6227 29 : DONE;
6228 : })
6229 :
6230 : (define_expand "vec_extract<mode><mmxscalarmodelower>"
6231 : [(match_operand:<mmxscalarmode> 0 "register_operand")
6232 : (match_operand:V2FI_32 1 "register_operand")
6233 : (match_operand 2 "const_int_operand")]
6234 : "TARGET_SSE2"
6235 491 : {
6236 491 : ix86_expand_vector_extract (false, operands[0],
6237 491 : operands[1], INTVAL (operands[2]));
6238 491 : DONE;
6239 : })
6240 81 :
6241 0 : (define_expand "vec_setv4qi"
6242 81 : [(match_operand:V4QI 0 "register_operand")
6243 81 : (match_operand:QI 1 "register_operand")
6244 81 : (match_operand 2 "vec_setm_mmx_operand")]
6245 : "TARGET_SSE4_1"
6246 2 : {
6247 2 : if (CONST_INT_P (operands[2]))
6248 0 : ix86_expand_vector_set (false, operands[0], operands[1],
6249 0 : INTVAL (operands[2]));
6250 : else
6251 103 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
6252 190 : DONE;
6253 101 : })
6254 289 :
6255 289 : (define_expand "vec_extractv4qiqi"
6256 : [(match_operand:QI 0 "register_operand")
6257 : (match_operand:V4QI 1 "register_operand")
6258 : (match_operand 2 "const_int_operand")]
6259 : "TARGET_SSE4_1"
6260 79 : {
6261 79 : ix86_expand_vector_extract (false, operands[0],
6262 79 : operands[1], INTVAL (operands[2]));
6263 79 : DONE;
6264 : })
6265 4312 :
6266 : (define_insn_and_split "*punpckwd"
6267 4312 : [(set (match_operand:V2FI_32 0 "register_operand" "=x,Yw")
6268 4312 : (vec_select:V2FI_32
6269 4312 : (vec_concat:<mmxdoublevecmode>
6270 : (match_operand:V2FI_32 1 "register_operand" "0,Yw")
6271 : (match_operand:V2FI_32 2 "register_operand" "x,Yw"))
6272 : (parallel [(match_operand 3 "const_0_to_3_operand")
6273 : (match_operand 4 "const_0_to_3_operand")])))]
6274 1606 : "TARGET_SSE2"
6275 : "#"
6276 1981 : "&& reload_completed"
6277 : [(set (match_dup 5)
6278 375 : (vec_select:<mmxxmmmode>
6279 375 : (match_dup 5)
6280 453 : (parallel [(match_dup 3) (match_dup 4)
6281 : (const_int 2) (const_int 3)
6282 : (const_int 4) (const_int 5)
6283 78 : (const_int 6) (const_int 7)])))]
6284 188 : {
6285 188 : rtx dest = lowpart_subreg (<mmxxmmmode>mode, operands[0], <MODE>mode);
6286 188 : rtx op1 = lowpart_subreg (<mmxxmmmode>mode, operands[1], <MODE>mode);
6287 188 : rtx op2 = lowpart_subreg (<mmxxmmmode>mode, operands[2], <MODE>mode);
6288 :
6289 188 : emit_insn (gen_vec_interleave_low<mmxxmmmodelower> (dest, op1, op2));
6290 :
6291 188 : static const int map[4] = { 0, 2, 1, 3 };
6292 :
6293 188 : int sel0 = map[INTVAL (operands[3])];
6294 188 : int sel1 = map[INTVAL (operands[4])];
6295 :
6296 188 : if (sel0 == 0 && sel1 == 1)
6297 69 : DONE;
6298 :
6299 119 : operands[3] = GEN_INT (sel0);
6300 119 : operands[4] = GEN_INT (sel1);
6301 119 : operands[5] = dest;
6302 : }
6303 : [(set_attr "isa" "noavx,avx")
6304 : (set_attr "type" "sselog")
6305 119 : (set_attr "mode" "TI")])
6306 :
6307 : (define_insn "*pshufw<mode>_1"
6308 : [(set (match_operand:V2FI_32 0 "register_operand" "=Yw")
6309 : (vec_select:V2FI_32
6310 : (match_operand:V2FI_32 1 "register_operand" "Yw")
6311 119 : (parallel [(match_operand 2 "const_0_to_1_operand")
6312 : (match_operand 3 "const_0_to_1_operand")])))]
6313 : "TARGET_SSE2"
6314 84 : {
6315 84 : int mask = 0;
6316 126 : mask |= INTVAL (operands[2]) << 0;
6317 84 : mask |= INTVAL (operands[3]) << 2;
6318 126 : mask |= 2 << 4;
6319 126 : mask |= 3 << 6;
6320 126 : operands[2] = GEN_INT (mask);
6321 :
6322 84 : return "%vpshuflw\t{%2, %1, %0|%0, %1, %2}";
6323 : }
6324 : [(set_attr "type" "sselog1")
6325 : (set_attr "length_immediate" "1")
6326 : (set_attr "mode" "TI")])
6327 42 :
6328 : (define_insn "*vec_dupv2hi"
6329 : [(set (match_operand:V2HI 0 "register_operand" "=Yw")
6330 : (vec_duplicate:V2HI
6331 : (truncate:HI
6332 : (match_operand:SI 1 "register_operand" "Yw"))))]
6333 : "TARGET_SSE2"
6334 : "%vpshuflw\t{$0, %1, %0|%0, %1, 0}"
6335 : [(set_attr "type" "sselog1")
6336 : (set_attr "length_immediate" "1")
6337 : (set_attr "mode" "TI")])
6338 :
6339 : (define_insn "*vec_dup<mode>"
6340 : [(set (match_operand:V2FI_32 0 "register_operand" "=Yw")
6341 : (vec_duplicate:V2FI_32
6342 : (match_operand:<mmxscalarmode> 1 "register_operand" "Yw")))]
6343 : "TARGET_SSE2"
6344 : "%vpshuflw\t{$0, %1, %0|%0, %1, 0}"
6345 : [(set_attr "type" "sselog1")
6346 : (set_attr "length_immediate" "1")
6347 : (set_attr "mode" "TI")])
6348 :
6349 : (define_expand "vec_init<mode><mmxscalarmodelower>"
6350 : [(match_operand:V2FI_32 0 "register_operand")
6351 : (match_operand 1)]
6352 : "TARGET_SSE2"
6353 492 : {
6354 549 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
6355 : operands[1]);
6356 492 : DONE;
6357 : })
6358 :
6359 : (define_expand "vec_initv4qiqi"
6360 : [(match_operand:V2HI 0 "register_operand")
6361 : (match_operand 1)]
6362 : "TARGET_SSE2"
6363 4312 : {
6364 4324 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
6365 : operands[1]);
6366 4312 : DONE;
6367 : })
6368 :
6369 405 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6370 : ;;
6371 405 : ;; Miscellaneous
6372 405 : ;;
6373 382 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6374 :
6375 : (define_expand "mmx_uavg<mode>3"
6376 : [(set (match_operand:MMXMODE12 0 "register_operand")
6377 : (truncate:MMXMODE12
6378 : (lshiftrt:<mmxdoublemode>
6379 6 : (plus:<mmxdoublemode>
6380 : (plus:<mmxdoublemode>
6381 6 : (zero_extend:<mmxdoublemode>
6382 6 : (match_operand:MMXMODE12 1 "register_mmxmem_operand"))
6383 6 : (zero_extend:<mmxdoublemode>
6384 : (match_operand:MMXMODE12 2 "register_mmxmem_operand")))
6385 : (match_dup 3))
6386 : (const_int 1))))]
6387 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
6388 : && (TARGET_SSE || TARGET_3DNOW)"
6389 0 : {
6390 0 : operands[3] = CONST1_RTX(<mmxdoublemode>mode);
6391 0 : ix86_fixup_binary_operands_no_copy (PLUS, <MODE>mode, operands);
6392 : })
6393 :
6394 : (define_insn "*mmx_uavgv8qi3"
6395 : [(set (match_operand:V8QI 0 "register_operand" "=y,x,Yw")
6396 0 : (truncate:V8QI
6397 : (lshiftrt:V8HI
6398 : (plus:V8HI
6399 : (plus:V8HI
6400 : (zero_extend:V8HI
6401 0 : (match_operand:V8QI 1 "register_mmxmem_operand" "%0,0,Yw"))
6402 : (zero_extend:V8HI
6403 : (match_operand:V8QI 2 "register_mmxmem_operand" "ym,x,Yw")))
6404 : (const_vector:V8HI [(const_int 1) (const_int 1)
6405 : (const_int 1) (const_int 1)
6406 11 : (const_int 1) (const_int 1)
6407 : (const_int 1) (const_int 1)]))
6408 11 : (const_int 1))))]
6409 27 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
6410 241 : && (TARGET_SSE || TARGET_3DNOW)
6411 460 : && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
6412 42 : {
6413 42 : switch (which_alternative)
6414 : {
6415 120 : case 2:
6416 : return "vpavgb\t{%2, %1, %0|%0, %1, %2}";
6417 18 : case 1:
6418 138 : case 0:
6419 : /* These two instructions have the same operation, but their encoding
6420 : is different. Prefer the one that is de facto standard. */
6421 18 : if (TARGET_SSE || TARGET_3DNOW_A)
6422 : return "pavgb\t{%2, %0|%0, %2}";
6423 : else
6424 0 : return "pavgusb\t{%2, %0|%0, %2}";
6425 0 : default:
6426 0 : gcc_unreachable ();
6427 : }
6428 : }
6429 : [(set_attr "isa" "*,sse2_noavx,avx")
6430 : (set_attr "mmx_isa" "native,*,*")
6431 : (set_attr "type" "mmxshft,sseiadd,sseiadd")
6432 : (set (attr "prefix_extra")
6433 : (if_then_else
6434 77 : (not (ior (match_test "TARGET_SSE")
6435 : (match_test "TARGET_3DNOW_A")))
6436 : (const_string "1")
6437 0 : (const_string "*")))
6438 : (set_attr "mode" "DI,TI,TI")])
6439 :
6440 : (define_insn "*mmx_uavgv4hi3"
6441 : [(set (match_operand:V4HI 0 "register_operand" "=y,x,Yw")
6442 : (truncate:V4HI
6443 : (lshiftrt:V4SI
6444 42226 : (plus:V4SI
6445 42226 : (plus:V4SI
6446 42226 : (zero_extend:V4SI
6447 42226 : (match_operand:V4HI 1 "register_mmxmem_operand" "%0,0,Yw"))
6448 42226 : (zero_extend:V4SI
6449 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw")))
6450 : (const_vector:V4SI [(const_int 1) (const_int 1)
6451 : (const_int 1) (const_int 1)]))
6452 : (const_int 1))))]
6453 16 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
6454 120 : && (TARGET_SSE || TARGET_3DNOW_A)
6455 240 : && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
6456 : "@
6457 152 : pavgw\t{%2, %0|%0, %2}
6458 152 : pavgw\t{%2, %0|%0, %2}
6459 272 : vpavgw\t{%2, %1, %0|%0, %1, %2}"
6460 152 : [(set_attr "isa" "*,sse2_noavx,avx")
6461 152 : (set_attr "mmx_isa" "native,*,*")
6462 272 : (set_attr "type" "mmxshft,sseiadd,sseiadd")
6463 : (set_attr "mode" "DI,TI,TI")])
6464 :
6465 3752080 : (define_expand "uavg<mode>3_ceil"
6466 : [(set (match_operand:MMXMODE12 0 "register_operand")
6467 : (truncate:MMXMODE12
6468 : (lshiftrt:<mmxdoublemode>
6469 : (plus:<mmxdoublemode>
6470 : (plus:<mmxdoublemode>
6471 0 : (zero_extend:<mmxdoublemode>
6472 0 : (match_operand:MMXMODE12 1 "register_operand"))
6473 0 : (zero_extend:<mmxdoublemode>
6474 : (match_operand:MMXMODE12 2 "register_operand")))
6475 : (match_dup 3))
6476 : (const_int 1))))]
6477 : "TARGET_MMX_WITH_SSE"
6478 65 : "operands[3] = CONST1_RTX(<mmxdoublemode>mode);")
6479 :
6480 : (define_insn "uavgv4qi3_ceil"
6481 : [(set (match_operand:V4QI 0 "register_operand" "=x,Yw")
6482 119 : (truncate:V4QI
6483 54 : (lshiftrt:V4HI
6484 54 : (plus:V4HI
6485 54 : (plus:V4HI
6486 : (zero_extend:V4HI
6487 65 : (match_operand:V4QI 1 "register_operand" "%0,Yw"))
6488 : (zero_extend:V4HI
6489 : (match_operand:V4QI 2 "register_operand" "x,Yw")))
6490 : (const_vector:V4HI [(const_int 1) (const_int 1)
6491 : (const_int 1) (const_int 1)]))
6492 14 : (const_int 1))))]
6493 : "TARGET_SSE2"
6494 709779 : "@
6495 709779 : pavgb\t{%2, %0|%0, %2}
6496 709779 : vpavgb\t{%2, %1, %0|%0, %1, %2}"
6497 : [(set_attr "isa" "noavx,avx")
6498 : (set_attr "type" "sseiadd")
6499 : (set_attr "mode" "TI")])
6500 :
6501 : (define_insn "uavgv2qi3_ceil"
6502 : [(set (match_operand:V2QI 0 "register_operand" "=x,Yw")
6503 : (truncate:V2QI
6504 : (lshiftrt:V2HI
6505 : (plus:V2HI
6506 : (plus:V2HI
6507 : (zero_extend:V2HI
6508 : (match_operand:V2QI 1 "register_operand" "%0,Yw"))
6509 : (zero_extend:V2HI
6510 : (match_operand:V2QI 2 "register_operand" "x,Yw")))
6511 : (const_vector:V2HI [(const_int 1) (const_int 1)]))
6512 : (const_int 1))))]
6513 : "TARGET_SSE2"
6514 : "@
6515 : pavgb\t{%2, %0|%0, %2}
6516 : vpavgb\t{%2, %1, %0|%0, %1, %2}"
6517 : [(set_attr "isa" "noavx,avx")
6518 : (set_attr "type" "sseiadd")
6519 : (set_attr "mode" "TI")])
6520 :
6521 : (define_insn "uavgv2hi3_ceil"
6522 : [(set (match_operand:V2HI 0 "register_operand" "=x,Yw")
6523 : (truncate:V2HI
6524 : (lshiftrt:V2SI
6525 : (plus:V2SI
6526 : (plus:V2SI
6527 : (zero_extend:V2SI
6528 : (match_operand:V2HI 1 "register_operand" "%0,Yw"))
6529 : (zero_extend:V2SI
6530 : (match_operand:V2HI 2 "register_operand" "x,Yw")))
6531 : (const_vector:V2SI [(const_int 1) (const_int 1)]))
6532 : (const_int 1))))]
6533 : "TARGET_SSE2"
6534 : "@
6535 : pavgw\t{%2, %0|%0, %2}
6536 : vpavgw\t{%2, %1, %0|%0, %1, %2}"
6537 : [(set_attr "isa" "noavx,avx")
6538 : (set_attr "type" "sseiadd")
6539 : (set_attr "mode" "TI")])
6540 :
6541 : (define_expand "mmx_psadbw"
6542 : [(set (match_operand:V1DI 0 "register_operand")
6543 : (unspec:V1DI [(match_operand:V8QI 1 "register_mmxmem_operand")
6544 : (match_operand:V8QI 2 "register_mmxmem_operand")]
6545 : UNSPEC_PSADBW))]
6546 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && (TARGET_SSE || TARGET_3DNOW_A)"
6547 366 : "ix86_fixup_binary_operands_no_copy (PLUS, V8QImode, operands);")
6548 :
6549 : (define_insn "*mmx_psadbw"
6550 : [(set (match_operand:V1DI 0 "register_operand" "=y,x,Yw")
6551 366 : (unspec:V1DI [(match_operand:V8QI 1 "register_mmxmem_operand" "%0,0,Yw")
6552 : (match_operand:V8QI 2 "register_mmxmem_operand" "ym,x,Yw")]
6553 : UNSPEC_PSADBW))]
6554 5354 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && (TARGET_SSE || TARGET_3DNOW_A)
6555 11074 : && ix86_binary_operator_ok (PLUS, V8QImode, operands)"
6556 : "@
6557 : psadbw\t{%2, %0|%0, %2}
6558 : psadbw\t{%2, %0|%0, %2}
6559 4934 : vpsadbw\t{%2, %1, %0|%0, %1, %2}"
6560 16 : [(set_attr "isa" "*,sse2_noavx,avx")
6561 : (set_attr "mmx_isa" "native,*,*")
6562 4950 : (set_attr "type" "mmxshft,sseiadd,sseiadd")
6563 16 : (set_attr "c86_attr" "sadbw")
6564 16 : (set_attr "mode" "DI,TI,TI")])
6565 :
6566 : (define_expand "reduc_<code>_scal_<mode>"
6567 : [(any_logic:MMXMODE12
6568 : (match_operand:<mmxscalarmode> 0 "register_operand")
6569 : (match_operand:MMXMODE12 1 "register_operand"))]
6570 : "TARGET_MMX_WITH_SSE"
6571 47 : {
6572 47 : rtx tmp = gen_reg_rtx (<MODE>mode);
6573 47 : ix86_expand_reduc (gen_<code><mode>3, tmp, operands[1]);
6574 47 : emit_insn (gen_vec_extract<mode><mmxscalarmodelower> (operands[0],
6575 : tmp, const0_rtx));
6576 47 : DONE;
6577 : })
6578 :
6579 : (define_expand "reduc_<code>_scal_v4qi"
6580 : [(any_logic:V4QI
6581 : (match_operand:QI 0 "register_operand")
6582 : (match_operand:V4QI 1 "register_operand"))]
6583 : "TARGET_SSE2"
6584 31 : {
6585 62 : rtx tmp = gen_reg_rtx (V4QImode);
6586 31 : ix86_expand_reduc (gen_<code>v4qi3, tmp, operands[1]);
6587 31 : emit_insn (gen_vec_extractv4qiqi (operands[0], tmp, const0_rtx));
6588 31 : DONE;
6589 597 : })
6590 :
6591 597 : (define_expand "reduc_plus_scal_v8qi"
6592 597 : [(plus:V8QI
6593 597 : (match_operand:QI 0 "register_operand")
6594 : (match_operand:V8QI 1 "register_operand"))]
6595 : "TARGET_MMX_WITH_SSE"
6596 335 : {
6597 335 : rtx tmp = gen_reg_rtx (V8QImode);
6598 335 : emit_move_insn (tmp, CONST0_RTX (V8QImode));
6599 335 : rtx tmp2 = gen_reg_rtx (V1DImode);
6600 335 : emit_insn (gen_mmx_psadbw (tmp2, operands[1], tmp));
6601 341 : tmp2 = gen_lowpart (V8QImode, tmp2);
6602 335 : emit_insn (gen_vec_extractv8qiqi (operands[0], tmp2, const0_rtx));
6603 341 : DONE;
6604 6 : })
6605 6 :
6606 : (define_expand "reduc_plus_scal_v4hi"
6607 : [(plus:V4HI
6608 : (match_operand:HI 0 "register_operand")
6609 : (match_operand:V4HI 1 "register_operand"))]
6610 : "TARGET_MMX_WITH_SSE"
6611 229 : {
6612 229 : rtx tmp = gen_reg_rtx (V4HImode);
6613 229 : ix86_expand_reduc (gen_addv4hi3, tmp, operands[1]);
6614 229 : emit_insn (gen_vec_extractv4hihi (operands[0], tmp, const0_rtx));
6615 229 : DONE;
6616 2 : })
6617 :
6618 2 : (define_expand "reduc_<code>_scal_v4hi"
6619 2 : [(smaxmin:V4HI
6620 2 : (match_operand:HI 0 "register_operand")
6621 : (match_operand:V4HI 1 "register_operand"))]
6622 : "TARGET_MMX_WITH_SSE"
6623 4 : {
6624 4 : rtx tmp = gen_reg_rtx (V4HImode);
6625 4 : ix86_expand_reduc (gen_<code>v4hi3, tmp, operands[1]);
6626 4 : emit_insn (gen_vec_extractv4hihi (operands[0], tmp, const0_rtx));
6627 4 : DONE;
6628 2 : })
6629 :
6630 2 : (define_expand "reduc_<code>_scal_v4qi"
6631 2 : [(smaxmin:V4QI
6632 2 : (match_operand:QI 0 "register_operand")
6633 : (match_operand:V4QI 1 "register_operand"))]
6634 : "TARGET_SSE4_1"
6635 4 : {
6636 4 : rtx tmp = gen_reg_rtx (V4QImode);
6637 4 : ix86_expand_reduc (gen_<code>v4qi3, tmp, operands[1]);
6638 4 : emit_insn (gen_vec_extractv4qiqi (operands[0], tmp, const0_rtx));
6639 4 : DONE;
6640 6 : })
6641 :
6642 6 : (define_expand "reduc_<code>_scal_v4hi"
6643 6 : [(umaxmin:V4HI
6644 6 : (match_operand:HI 0 "register_operand")
6645 : (match_operand:V4HI 1 "register_operand"))]
6646 : "TARGET_MMX_WITH_SSE && TARGET_SSE4_1"
6647 6 : {
6648 6 : rtx tmp = gen_reg_rtx (V4HImode);
6649 6 : ix86_expand_reduc (gen_<code>v4hi3, tmp, operands[1]);
6650 6 : emit_insn (gen_vec_extractv4hihi (operands[0], tmp, const0_rtx));
6651 6 : DONE;
6652 322 : })
6653 :
6654 322 : (define_expand "reduc_<code>_scal_v4qi"
6655 322 : [(umaxmin:V4QI
6656 322 : (match_operand:QI 0 "register_operand")
6657 : (match_operand:V4QI 1 "register_operand"))]
6658 : "TARGET_SSE4_1"
6659 4 : {
6660 4 : rtx tmp = gen_reg_rtx (V4QImode);
6661 4 : ix86_expand_reduc (gen_<code>v4qi3, tmp, operands[1]);
6662 4 : emit_insn (gen_vec_extractv4qiqi (operands[0], tmp, const0_rtx));
6663 4 : DONE;
6664 19 : })
6665 :
6666 19 : (define_expand "reduc_plus_scal_v4qi"
6667 19 : [(plus:V4QI
6668 19 : (match_operand:QI 0 "register_operand")
6669 : (match_operand:V4QI 1 "register_operand"))]
6670 : "TARGET_SSE2"
6671 314 : {
6672 314 : rtx op1 = gen_reg_rtx (V16QImode);
6673 314 : emit_insn (gen_vec_setv4si_0 (lowpart_subreg (V4SImode, op1, V16QImode),
6674 : CONST0_RTX (V4SImode),
6675 : lowpart_subreg (SImode,
6676 12 : operands[1],
6677 : V4QImode)));
6678 326 : rtx tmp = gen_reg_rtx (V16QImode);
6679 326 : emit_move_insn (tmp, CONST0_RTX (V16QImode));
6680 326 : rtx tmp2 = gen_reg_rtx (V2DImode);
6681 314 : emit_insn (gen_sse2_psadbw (tmp2, op1, tmp));
6682 314 : tmp2 = gen_lowpart (V16QImode, tmp2);
6683 314 : emit_insn (gen_vec_extractv16qiqi (operands[0], tmp2, const0_rtx));
6684 314 : DONE;
6685 : })
6686 :
6687 : (define_expand "usadv8qi"
6688 : [(match_operand:V2SI 0 "register_operand")
6689 : (match_operand:V8QI 1 "register_operand")
6690 : (match_operand:V8QI 2 "register_operand")
6691 : (match_operand:V2SI 3 "register_operand")]
6692 : "TARGET_MMX_WITH_SSE"
6693 8 : {
6694 8 : rtx t1 = gen_reg_rtx (V1DImode);
6695 8 : rtx t2 = gen_reg_rtx (V2SImode);
6696 8 : emit_insn (gen_mmx_psadbw (t1, operands[1], operands[2]));
6697 50 : convert_move (t2, t1, 0);
6698 8 : emit_insn (gen_addv2si3 (operands[0], t2, operands[3]));
6699 50 : DONE;
6700 42 : })
6701 42 :
6702 : (define_expand "usdot_prodv2siv8qi"
6703 : [(match_operand:V2SI 0 "register_operand")
6704 : (match_operand:V8QI 1 "register_operand")
6705 : (match_operand:V8QI 2 "register_operand")
6706 : (match_operand:V2SI 3 "register_operand")]
6707 : "TARGET_MMX_WITH_SSE && TARGET_SSE4_1"
6708 7 : {
6709 7 : operands[1] = force_reg (V8QImode, operands[1]);
6710 7 : operands[2] = force_reg (V8QImode, operands[2]);
6711 7 : operands[3] = force_reg (V2SImode, operands[3]);
6712 :
6713 10 : if ((TARGET_AVX512VNNI && TARGET_AVX512VL)
6714 5 : || TARGET_AVXVNNI)
6715 3 : {
6716 8 : rtx op1 = lowpart_subreg (V16QImode, operands[1], V8QImode);
6717 8 : rtx op2 = lowpart_subreg (V16QImode, operands[2], V8QImode);
6718 5 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6719 5 : rtx op0 = gen_reg_rtx (V4SImode);
6720 :
6721 5 : emit_insn (gen_usdot_prodv4siv16qi (op0, op1, op2, op3));
6722 5 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
6723 5 : }
6724 : else
6725 : {
6726 2 : rtx op1 = gen_reg_rtx (V8HImode);
6727 2 : rtx op2 = gen_reg_rtx (V8HImode);
6728 2 : rtx op3 = gen_reg_rtx (V4SImode);
6729 2 : rtx op0 = gen_reg_rtx (V4SImode);
6730 2 : rtx op0_1 = gen_reg_rtx (V4SImode);
6731 :
6732 2 : emit_move_insn (op3, CONST0_RTX (V4SImode));
6733 2 : emit_insn (gen_zero_extendv8qiv8hi2 (op1, operands[1]));
6734 2 : emit_insn (gen_extendv8qiv8hi2 (op2, operands[2]));
6735 2 : emit_insn (gen_sdot_prodv4siv8hi (op0, op1, op2, op3));
6736 :
6737 : /* vec_perm (op0, 2, 3, 0, 1); */
6738 2 : emit_insn (gen_sse2_pshufd (op0_1, op0, GEN_INT (78)));
6739 2 : emit_insn (gen_addv4si3 (op0, op0, op0_1));
6740 2 : emit_insn (gen_addv2si3 (operands[0], operands[3],
6741 : lowpart_subreg (V2SImode, op0, V4SImode)));
6742 : }
6743 7 : DONE;
6744 : })
6745 :
6746 : (define_expand "sdot_prodv2siv8qi"
6747 : [(match_operand:V2SI 0 "register_operand")
6748 : (match_operand:V8QI 1 "register_operand")
6749 : (match_operand:V8QI 2 "register_operand")
6750 : (match_operand:V2SI 3 "register_operand")]
6751 : "TARGET_MMX_WITH_SSE && TARGET_SSE4_1"
6752 12 : {
6753 12 : operands[1] = force_reg (V8QImode, operands[1]);
6754 12 : operands[2] = force_reg (V8QImode, operands[2]);
6755 12 : operands[3] = force_reg (V2SImode, operands[3]);
6756 :
6757 117 : if (TARGET_AVXVNNIINT8)
6758 : {
6759 110 : rtx op1 = lowpart_subreg (V16QImode, operands[1], V8QImode);
6760 110 : rtx op2 = lowpart_subreg (V16QImode, operands[2], V8QImode);
6761 5 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6762 5 : rtx op0 = gen_reg_rtx (V4SImode);
6763 :
6764 5 : emit_insn (gen_sdot_prodv4siv16qi (op0, op1, op2, op3));
6765 5 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
6766 : }
6767 : else
6768 : {
6769 7 : rtx op1 = gen_reg_rtx (V8HImode);
6770 7 : rtx op2 = gen_reg_rtx (V8HImode);
6771 7 : rtx op3 = gen_reg_rtx (V4SImode);
6772 7 : rtx op0 = gen_reg_rtx (V4SImode);
6773 7 : rtx op0_1 = gen_reg_rtx (V4SImode);
6774 :
6775 7 : emit_move_insn (op3, CONST0_RTX (V4SImode));
6776 7 : emit_insn (gen_extendv8qiv8hi2 (op1, operands[1]));
6777 7 : emit_insn (gen_extendv8qiv8hi2 (op2, operands[2]));
6778 7 : emit_insn (gen_sdot_prodv4siv8hi (op0, op1, op2, op3));
6779 :
6780 : /* vec_perm (op0, 2, 3, 0, 1); */
6781 7 : emit_insn (gen_sse2_pshufd (op0_1, op0, GEN_INT (78)));
6782 7 : emit_insn (gen_addv4si3 (op0, op0, op0_1));
6783 7 : emit_insn (gen_addv2si3 (operands[0], operands[3],
6784 : lowpart_subreg (V2SImode, op0, V4SImode)));
6785 : }
6786 12 : DONE;
6787 :
6788 : })
6789 :
6790 : (define_expand "udot_prodv2siv8qi"
6791 : [(match_operand:V2SI 0 "register_operand")
6792 : (match_operand:V8QI 1 "register_operand")
6793 : (match_operand:V8QI 2 "register_operand")
6794 : (match_operand:V2SI 3 "register_operand")]
6795 : "TARGET_MMX_WITH_SSE && TARGET_SSE4_1"
6796 9 : {
6797 9 : operands[1] = force_reg (V8QImode, operands[1]);
6798 9 : operands[2] = force_reg (V8QImode, operands[2]);
6799 9 : operands[3] = force_reg (V2SImode, operands[3]);
6800 :
6801 10 : if (TARGET_AVXVNNIINT8)
6802 : {
6803 6 : rtx op1 = lowpart_subreg (V16QImode, operands[1], V8QImode);
6804 6 : rtx op2 = lowpart_subreg (V16QImode, operands[2], V8QImode);
6805 5 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6806 5 : rtx op0 = gen_reg_rtx (V4SImode);
6807 :
6808 6 : emit_insn (gen_udot_prodv4siv16qi (op0, op1, op2, op3));
6809 5 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
6810 : }
6811 : else
6812 : {
6813 9252 : rtx op1 = gen_reg_rtx (V8HImode);
6814 4 : rtx op2 = gen_reg_rtx (V8HImode);
6815 9252 : rtx op3 = gen_reg_rtx (V4SImode);
6816 9252 : rtx op0 = gen_reg_rtx (V4SImode);
6817 9252 : rtx op0_1 = gen_reg_rtx (V4SImode);
6818 :
6819 4 : emit_move_insn (op3, CONST0_RTX (V4SImode));
6820 4 : emit_insn (gen_zero_extendv8qiv8hi2 (op1, operands[1]));
6821 4 : emit_insn (gen_zero_extendv8qiv8hi2 (op2, operands[2]));
6822 4 : emit_insn (gen_sdot_prodv4siv8hi (op0, op1, op2, op3));
6823 :
6824 : /* vec_perm (op0, 2, 3, 0, 1); */
6825 4 : emit_insn (gen_sse2_pshufd (op0_1, op0, GEN_INT (78)));
6826 4 : emit_insn (gen_addv4si3 (op0, op0, op0_1));
6827 4 : emit_insn (gen_addv2si3 (operands[0], operands[3],
6828 : lowpart_subreg (V2SImode, op0, V4SImode)));
6829 : }
6830 9 : DONE;
6831 :
6832 : })
6833 :
6834 : (define_expand "usdot_prodv2siv4hi"
6835 : [(match_operand:V2SI 0 "register_operand")
6836 : (match_operand:V4HI 1 "register_operand")
6837 : (match_operand:V4HI 2 "register_operand")
6838 : (match_operand:V2SI 3 "register_operand")]
6839 : "TARGET_AVXVNNIINT16 && TARGET_MMX_WITH_SSE"
6840 3 : {
6841 3 : operands[1] = force_reg (V4HImode, operands[1]);
6842 3 : operands[2] = force_reg (V4HImode, operands[2]);
6843 3 : operands[3] = force_reg (V2SImode, operands[3]);
6844 :
6845 20359 : rtx op1 = lowpart_subreg (V8HImode, operands[1], V4HImode);
6846 3 : rtx op2 = lowpart_subreg (V8HImode, operands[2], V4HImode);
6847 20359 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6848 20359 : rtx op0 = gen_reg_rtx (V4SImode);
6849 20356 :
6850 3 : emit_insn (gen_usdot_prodv4siv8hi (op0, op1, op2, op3));
6851 3 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
6852 3 : DONE;
6853 : })
6854 :
6855 : (define_expand "udot_prodv2siv4hi"
6856 : [(match_operand:V2SI 0 "register_operand")
6857 : (match_operand:V4HI 1 "register_operand")
6858 : (match_operand:V4HI 2 "register_operand")
6859 : (match_operand:V2SI 3 "register_operand")]
6860 : "TARGET_AVXVNNIINT16 && TARGET_MMX_WITH_SSE"
6861 3 : {
6862 3 : operands[1] = force_reg (V4HImode, operands[1]);
6863 3 : operands[2] = force_reg (V4HImode, operands[2]);
6864 3 : operands[3] = force_reg (V2SImode, operands[3]);
6865 :
6866 3 : rtx op1 = lowpart_subreg (V8HImode, operands[1], V4HImode);
6867 25 : rtx op2 = lowpart_subreg (V8HImode, operands[2], V4HImode);
6868 3 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6869 25 : rtx op0 = gen_reg_rtx (V4SImode);
6870 22 :
6871 3 : emit_insn (gen_udot_prodv4siv8hi (op0, op1, op2, op3));
6872 3 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
6873 3 : DONE;
6874 : })
6875 :
6876 : (define_expand "sdot_prodv2siv4hi"
6877 : [(match_operand:V2SI 0 "register_operand")
6878 : (match_operand:V4HI 1 "register_operand")
6879 : (match_operand:V4HI 2 "register_operand")
6880 : (match_operand:V2SI 3 "register_operand")]
6881 : "TARGET_MMX_WITH_SSE"
6882 42 : {
6883 42 : operands[1] = force_reg (V4HImode, operands[1]);
6884 42 : operands[2] = force_reg (V4HImode, operands[2]);
6885 42 : operands[3] = force_reg (V2SImode, operands[3]);
6886 :
6887 57 : rtx op1 = lowpart_subreg (V8HImode, operands[1], V4HImode);
6888 42 : rtx op2 = lowpart_subreg (V8HImode, operands[2], V4HImode);
6889 57 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6890 57 : rtx op0 = gen_reg_rtx (V4SImode);
6891 :
6892 42 : emit_insn (gen_sdot_prodv4siv8hi (op0, op1, op2, op3));
6893 42 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
6894 42 : DONE;
6895 : })
6896 :
6897 : (define_insn_and_split "mmx_pmovmskb"
6898 : [(set (match_operand:SI 0 "register_operand" "=r,r,jr")
6899 : (unspec:SI [(match_operand:V8QI 1 "register_operand" "y,x,x")]
6900 : UNSPEC_MOVMSK))]
6901 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
6902 : && (TARGET_SSE || TARGET_3DNOW_A)"
6903 : "@
6904 : pmovmskb\t{%1, %0|%0, %1}
6905 : #
6906 : #"
6907 44 : "TARGET_SSE2 && reload_completed
6908 404954 : && SSE_REGNO_P (REGNO (operands[1]))"
6909 : [(set (match_dup 0)
6910 404888 : (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK))
6911 404888 : (set (match_dup 0)
6912 404890 : (zero_extend:SI (match_dup 2)))]
6913 22 : {
6914 : /* Generate SSE pmovmskb and zero-extend from QImode to SImode. */
6915 46 : operands[1] = lowpart_subreg (V16QImode, operands[1],
6916 22 : GET_MODE (operands[1]));
6917 44 : operands[2] = lowpart_subreg (QImode, operands[0],
6918 22 : GET_MODE (operands[0]));
6919 : }
6920 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
6921 : (set_attr "type" "mmxcvt,ssemov,ssemov")
6922 22 : (set_attr "mode" "DI,TI,TI")])
6923 :
6924 : (define_expand "mmx_maskmovq"
6925 : [(set (match_operand:V8QI 0 "memory_operand")
6926 : (unspec:V8QI [(match_operand:V8QI 1 "register_operand")
6927 22 : (match_operand:V8QI 2 "register_operand")
6928 : (match_dup 0)]
6929 : UNSPEC_MASKMOV))]
6930 : "TARGET_SSE || TARGET_3DNOW_A")
6931 :
6932 17414 : (define_insn "*mmx_maskmovq"
6933 : [(set (mem:V8QI (match_operand:P 0 "register_operand" "D"))
6934 17414 : (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "y")
6935 17414 : (match_operand:V8QI 2 "register_operand" "y")
6936 17414 : (mem:V8QI (match_dup 0))]
6937 : UNSPEC_MASKMOV))]
6938 18 : "TARGET_SSE || TARGET_3DNOW_A"
6939 : ;; @@@ check ordering of operands in intel/nonintel syntax
6940 : "maskmovq\t{%2, %1|%1, %2}"
6941 : [(set_attr "type" "mmxcvt")
6942 : (set_attr "znver1_decode" "vector")
6943 : (set_attr "c86_decode" "vector")
6944 : (set_attr "mode" "DI")])
6945 :
6946 : (define_int_iterator EMMS
6947 104 : [(UNSPECV_EMMS "TARGET_MMX")
6948 : (UNSPECV_FEMMS "TARGET_3DNOW")])
6949 :
6950 : (define_int_attr emms
6951 0 : [(UNSPECV_EMMS "emms")
6952 : (UNSPECV_FEMMS "femms")])
6953 :
6954 0 : (define_expand "mmx_<emms>"
6955 : [(parallel
6956 : [(unspec_volatile [(const_int 0)] EMMS)
6957 : (clobber (reg:XF ST0_REG))
6958 : (clobber (reg:XF ST1_REG))
6959 : (clobber (reg:XF ST2_REG))
6960 : (clobber (reg:XF ST3_REG))
6961 : (clobber (reg:XF ST4_REG))
6962 : (clobber (reg:XF ST5_REG))
6963 : (clobber (reg:XF ST6_REG))
6964 : (clobber (reg:XF ST7_REG))
6965 : (clobber (reg:DI MM0_REG))
6966 : (clobber (reg:DI MM1_REG))
6967 : (clobber (reg:DI MM2_REG))
6968 : (clobber (reg:DI MM3_REG))
6969 : (clobber (reg:DI MM4_REG))
6970 : (clobber (reg:DI MM5_REG))
6971 : (clobber (reg:DI MM6_REG))
6972 : (clobber (reg:DI MM7_REG))])]
6973 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
6974 120 : {
6975 120 : if (!TARGET_MMX)
6976 : {
6977 1 : emit_insn (gen_nop ());
6978 1 : DONE;
6979 : }
6980 : })
6981 :
6982 : (define_insn "*mmx_<emms>"
6983 : [(unspec_volatile [(const_int 0)] EMMS)
6984 119 : (clobber (reg:XF ST0_REG))
6985 : (clobber (reg:XF ST1_REG))
6986 : (clobber (reg:XF ST2_REG))
6987 : (clobber (reg:XF ST3_REG))
6988 : (clobber (reg:XF ST4_REG))
6989 : (clobber (reg:XF ST5_REG))
6990 : (clobber (reg:XF ST6_REG))
6991 : (clobber (reg:XF ST7_REG))
6992 : (clobber (reg:DI MM0_REG))
6993 : (clobber (reg:DI MM1_REG))
6994 119 : (clobber (reg:DI MM2_REG))
6995 : (clobber (reg:DI MM3_REG))
6996 : (clobber (reg:DI MM4_REG))
6997 : (clobber (reg:DI MM5_REG))
6998 : (clobber (reg:DI MM6_REG))
6999 586078 : (clobber (reg:DI MM7_REG))]
7000 : ""
7001 586078 : "<emms>"
7002 586078 : [(set_attr "type" "mmx")
7003 586078 : (set_attr "modrm" "0")
7004 : (set_attr "memory" "none")])
7005 :
7006 : (define_insn "popcount<mode>2"
7007 : [(set (match_operand:VI1_16_32_64 0 "register_operand" "=v")
7008 : (popcount:VI1_16_32_64
7009 : (match_operand:VI1_16_32_64 1 "register_operand" "v")))]
7010 25 : "TARGET_AVX512VL && TARGET_AVX512BITALG"
7011 : "vpopcntb\t{%1, %0|%0, %1}")
7012 :
7013 : (define_insn "popcount<mode>2"
7014 5 : [(set (match_operand:VI2_32_64 0 "register_operand" "=v")
7015 : (popcount:VI2_32_64
7016 : (match_operand:VI2_32_64 1 "register_operand" "v")))]
7017 5 : "TARGET_AVX512VL && TARGET_AVX512BITALG"
7018 : "vpopcntw\t{%1, %0|%0, %1}")
7019 :
7020 : (define_insn "popcountv2si2"
7021 : [(set (match_operand:V2SI 0 "register_operand" "=v")
7022 : (popcount:V2SI
7023 : (match_operand:V2SI 1 "register_operand" "v")))]
7024 5 : "TARGET_AVX512VPOPCNTDQ && TARGET_AVX512VL && TARGET_MMX_WITH_SSE"
7025 : "vpopcntd\t{%1, %0|%0, %1}")
7026 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7027 : /* (content generated from coverage data) */
7028 6544 : /* END: function "_ZL18insn_condition_430PP7rtx_defP8rtx_insn" */
7029 : /* ... */
7030 : /* ... */
7031 6544 : /* ... */
7032 : /* ... */
7033 : /* ... */
7034 : /* ... */
7035 : /* ... */
7036 : /* ... */
7037 : /* ... */
7038 : /* ... */
7039 : /* ... */
7040 : /* ... */
7041 : /* ... */
7042 : /* ... */
7043 : /* ... */
7044 : /* ... */
7045 : /* ... */
7046 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7047 : /* (content generated from coverage data) */
7048 : /* ... */
7049 : /* ... */
7050 : /* ... */
7051 : /* ... */
7052 : /* ... */
7053 : /* ... */
7054 : /* ... */
7055 : /* ... */
7056 : /* ... */
7057 : /* ... */
7058 : /* ... */
7059 : /* ... */
7060 : /* ... */
7061 : /* ... */
7062 : /* ... */
7063 : /* ... */
7064 : /* ... */
7065 : /* ... */
7066 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7067 : /* (content generated from coverage data) */
7068 : /* ... */
7069 : /* ... */
7070 : /* ... */
7071 : /* ... */
7072 : /* ... */
7073 : /* ... */
7074 : /* ... */
7075 : /* ... */
7076 : /* ... */
7077 : /* ... */
7078 : /* ... */
7079 : /* ... */
7080 : /* ... */
7081 : /* ... */
7082 : /* ... */
7083 : /* ... */
7084 : /* ... */
7085 : /* ... */
7086 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7087 : /* (content generated from coverage data) */
7088 : /* ... */
7089 : /* ... */
7090 : /* ... */
7091 : /* ... */
7092 : /* ... */
7093 : /* ... */
7094 : /* ... */
7095 : /* ... */
7096 : /* ... */
7097 : /* ... */
7098 : /* ... */
7099 : /* ... */
7100 : /* ... */
7101 : /* ... */
7102 : /* ... */
7103 : /* ... */
7104 : /* ... */
7105 : /* ... */
7106 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7107 : /* (content generated from coverage data) */
7108 : /* ... */
7109 : /* ... */
7110 : /* ... */
7111 : /* ... */
7112 : /* ... */
7113 : /* ... */
7114 : /* ... */
7115 : /* ... */
7116 : /* ... */
7117 : /* ... */
7118 : /* ... */
7119 : /* ... */
7120 : /* ... */
7121 : /* ... */
7122 : /* ... */
7123 : /* ... */
7124 : /* ... */
7125 : /* ... */
7126 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7127 : /* (content generated from coverage data) */
7128 : /* ... */
7129 : /* ... */
7130 : /* ... */
7131 : /* ... */
7132 : /* ... */
7133 : /* ... */
7134 : /* ... */
7135 : /* ... */
7136 : /* ... */
7137 : /* ... */
7138 : /* ... */
7139 : /* ... */
7140 : /* ... */
7141 : /* ... */
7142 : /* ... */
7143 : /* ... */
7144 : /* ... */
7145 : /* ... */
7146 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7147 : /* (content generated from coverage data) */
7148 : /* ... */
7149 : /* ... */
7150 : /* ... */
7151 : /* ... */
7152 : /* ... */
7153 : /* ... */
7154 : /* ... */
7155 : /* ... */
7156 : /* ... */
7157 : /* ... */
7158 : /* ... */
7159 : /* ... */
7160 : /* ... */
7161 : /* ... */
7162 : /* ... */
7163 : /* ... */
7164 : /* ... */
7165 : /* ... */
7166 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7167 : /* (content generated from coverage data) */
7168 : /* ... */
7169 : /* ... */
7170 : /* ... */
7171 : /* ... */
7172 : /* ... */
7173 : /* ... */
7174 : /* ... */
7175 : /* ... */
7176 : /* ... */
7177 : /* ... */
7178 : /* ... */
7179 : /* ... */
7180 : /* ... */
7181 : /* ... */
7182 : /* ... */
7183 : /* ... */
7184 : /* ... */
7185 : /* ... */
7186 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7187 : /* (content generated from coverage data) */
7188 : /* ... */
7189 : /* ... */
7190 : /* ... */
7191 : /* ... */
7192 : /* ... */
7193 : /* ... */
7194 : /* ... */
7195 : /* ... */
7196 : /* ... */
7197 : /* ... */
7198 : /* ... */
7199 : /* ... */
7200 : /* ... */
7201 : /* ... */
7202 : /* ... */
7203 : /* ... */
7204 : /* ... */
7205 : /* ... */
7206 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7207 : /* (content generated from coverage data) */
7208 : /* ... */
7209 : /* ... */
7210 : /* ... */
7211 : /* ... */
7212 : /* ... */
7213 : /* ... */
7214 : /* ... */
7215 : /* ... */
7216 : /* ... */
7217 : /* ... */
7218 : /* ... */
7219 : /* ... */
7220 : /* ... */
7221 : /* ... */
7222 : /* ... */
7223 : /* ... */
7224 : /* ... */
7225 : /* ... */
7226 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7227 : /* (content generated from coverage data) */
7228 : /* ... */
7229 : /* ... */
7230 : /* ... */
7231 : /* ... */
7232 : /* ... */
7233 : /* ... */
7234 : /* ... */
7235 : /* ... */
7236 : /* ... */
7237 : /* ... */
7238 : /* ... */
7239 : /* ... */
7240 : /* ... */
7241 : /* ... */
7242 : /* ... */
7243 : /* ... */
7244 : /* ... */
7245 : /* ... */
7246 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7247 : /* (content generated from coverage data) */
7248 : /* ... */
7249 : /* ... */
7250 : /* ... */
7251 : /* ... */
7252 : /* ... */
7253 : /* ... */
7254 : /* ... */
7255 : /* ... */
7256 : /* ... */
7257 : /* ... */
7258 : /* ... */
7259 : /* ... */
7260 : /* ... */
7261 : /* ... */
7262 : /* ... */
7263 : /* ... */
7264 : /* ... */
7265 : /* ... */
7266 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7267 : /* (content generated from coverage data) */
7268 : /* ... */
7269 : /* ... */
7270 : /* ... */
7271 : /* ... */
7272 : /* ... */
7273 : /* ... */
7274 : /* ... */
7275 : /* ... */
7276 : /* ... */
7277 : /* ... */
7278 : /* ... */
7279 : /* ... */
7280 : /* ... */
7281 : /* ... */
7282 : /* ... */
7283 : /* ... */
7284 : /* ... */
7285 : /* ... */
7286 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7287 : /* (content generated from coverage data) */
7288 : /* ... */
7289 : /* ... */
7290 : /* ... */
7291 : /* ... */
7292 : /* ... */
7293 : /* ... */
7294 : /* ... */
7295 : /* ... */
7296 : /* ... */
7297 : /* ... */
7298 : /* ... */
7299 : /* ... */
7300 : /* ... */
7301 : /* ... */
7302 : /* ... */
7303 : /* ... */
7304 : /* ... */
7305 : /* ... */
7306 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7307 : /* (content generated from coverage data) */
7308 : /* ... */
7309 : /* ... */
7310 : /* ... */
7311 : /* ... */
7312 : /* ... */
7313 : /* ... */
7314 : /* ... */
7315 : /* ... */
7316 : /* ... */
7317 : /* ... */
7318 : /* ... */
7319 : /* ... */
7320 : /* ... */
7321 : /* ... */
7322 : /* ... */
7323 : /* ... */
7324 : /* ... */
7325 : /* ... */
7326 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7327 : /* (content generated from coverage data) */
7328 : /* ... */
7329 : /* ... */
7330 : /* ... */
7331 : /* ... */
7332 : /* ... */
7333 : /* ... */
7334 : /* ... */
7335 : /* ... */
7336 : /* ... */
7337 : /* ... */
7338 : /* ... */
7339 : /* ... */
7340 : /* ... */
7341 : /* ... */
7342 : /* ... */
7343 : /* ... */
7344 : /* ... */
7345 : /* ... */
7346 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7347 : /* (content generated from coverage data) */
7348 : /* ... */
7349 : /* ... */
7350 : /* ... */
7351 : /* ... */
7352 : /* ... */
7353 : /* ... */
7354 : /* ... */
7355 : /* ... */
7356 : /* ... */
7357 : /* ... */
7358 : /* ... */
7359 : /* ... */
7360 : /* ... */
7361 : /* ... */
7362 : /* ... */
7363 : /* ... */
7364 : /* ... */
7365 : /* ... */
7366 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7367 : /* (content generated from coverage data) */
7368 : /* ... */
7369 : /* ... */
7370 : /* ... */
7371 : /* ... */
7372 : /* ... */
7373 : /* ... */
7374 : /* ... */
7375 : /* ... */
7376 : /* ... */
7377 : /* ... */
7378 : /* ... */
7379 : /* ... */
7380 : /* ... */
7381 : /* ... */
7382 : /* ... */
7383 : /* ... */
7384 : /* ... */
7385 : /* ... */
7386 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7387 : /* (content generated from coverage data) */
7388 : /* ... */
7389 : /* ... */
7390 : /* ... */
7391 : /* ... */
7392 : /* ... */
7393 : /* ... */
7394 : /* ... */
7395 : /* ... */
7396 : /* ... */
7397 : /* ... */
7398 : /* ... */
7399 : /* ... */
7400 : /* ... */
7401 : /* ... */
7402 : /* ... */
7403 : /* ... */
7404 : /* ... */
7405 : /* ... */
7406 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7407 : /* (content generated from coverage data) */
7408 : /* ... */
7409 : /* ... */
7410 : /* ... */
7411 : /* ... */
7412 : /* ... */
7413 : /* ... */
7414 : /* ... */
7415 : /* ... */
7416 : /* ... */
7417 : /* ... */
7418 : /* ... */
7419 : /* ... */
7420 : /* ... */
7421 : /* ... */
7422 : /* ... */
7423 : /* ... */
7424 : /* ... */
7425 : /* ... */
7426 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7427 : /* (content generated from coverage data) */
7428 : /* ... */
7429 : /* ... */
7430 : /* ... */
7431 : /* ... */
7432 : /* ... */
7433 : /* ... */
7434 : /* ... */
7435 : /* ... */
7436 : /* ... */
7437 : /* ... */
7438 : /* ... */
7439 : /* ... */
7440 : /* ... */
7441 : /* ... */
7442 : /* ... */
7443 : /* ... */
7444 : /* ... */
7445 : /* ... */
7446 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7447 : /* (content generated from coverage data) */
7448 : /* ... */
7449 : /* ... */
7450 : /* ... */
7451 : /* ... */
7452 : /* ... */
7453 : /* ... */
7454 : /* ... */
7455 : /* ... */
7456 : /* ... */
7457 : /* ... */
7458 : /* ... */
7459 : /* ... */
7460 : /* ... */
7461 : /* ... */
7462 : /* ... */
7463 : /* ... */
7464 : /* ... */
7465 : /* ... */
7466 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7467 : /* (content generated from coverage data) */
7468 : /* ... */
7469 : /* ... */
7470 : /* ... */
7471 : /* ... */
7472 : /* ... */
7473 : /* ... */
7474 : /* ... */
7475 : /* ... */
7476 : /* ... */
7477 : /* ... */
7478 : /* ... */
7479 : /* ... */
7480 : /* ... */
7481 : /* ... */
7482 : /* ... */
7483 : /* ... */
7484 : /* ... */
7485 : /* ... */
7486 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7487 : /* (content generated from coverage data) */
7488 : /* ... */
7489 : /* ... */
7490 : /* ... */
7491 : /* ... */
7492 : /* ... */
7493 : /* ... */
7494 : /* ... */
7495 : /* ... */
7496 : /* ... */
7497 : /* ... */
7498 : /* ... */
7499 : /* ... */
7500 : /* ... */
7501 : /* ... */
7502 : /* ... */
7503 : /* ... */
7504 : /* ... */
7505 : /* ... */
7506 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7507 : /* (content generated from coverage data) */
7508 : /* ... */
7509 : /* ... */
7510 : /* ... */
7511 : /* ... */
7512 : /* ... */
7513 : /* ... */
7514 : /* ... */
7515 : /* ... */
7516 : /* ... */
7517 : /* ... */
7518 : /* ... */
7519 : /* ... */
7520 : /* ... */
7521 : /* ... */
7522 : /* ... */
7523 : /* ... */
7524 : /* ... */
7525 : /* ... */
7526 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7527 : /* (content generated from coverage data) */
7528 : /* ... */
7529 : /* ... */
7530 : /* ... */
7531 : /* ... */
7532 : /* ... */
7533 : /* ... */
7534 : /* ... */
7535 : /* ... */
7536 : /* ... */
7537 : /* ... */
7538 : /* ... */
7539 : /* ... */
7540 : /* ... */
7541 : /* ... */
7542 : /* ... */
7543 : /* ... */
7544 : /* ... */
7545 : /* ... */
7546 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7547 : /* (content generated from coverage data) */
7548 : /* ... */
7549 : /* ... */
7550 : /* ... */
7551 : /* ... */
7552 : /* ... */
7553 : /* ... */
7554 : /* ... */
7555 : /* ... */
7556 : /* ... */
7557 : /* ... */
7558 : /* ... */
7559 : /* ... */
7560 : /* ... */
7561 : /* ... */
7562 : /* ... */
7563 : /* ... */
7564 : /* ... */
7565 : /* ... */
7566 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7567 : /* (content generated from coverage data) */
7568 : /* ... */
7569 : /* ... */
7570 : /* ... */
7571 : /* ... */
7572 : /* ... */
7573 : /* ... */
7574 : /* ... */
7575 : /* ... */
7576 : /* ... */
7577 : /* ... */
7578 : /* ... */
7579 : /* ... */
7580 : /* ... */
7581 : /* ... */
7582 : /* ... */
7583 : /* ... */
7584 : /* ... */
7585 : /* ... */
7586 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7587 : /* (content generated from coverage data) */
7588 : /* ... */
7589 : /* ... */
7590 : /* ... */
7591 : /* ... */
7592 : /* ... */
7593 : /* ... */
7594 : /* ... */
7595 : /* ... */
7596 : /* ... */
7597 : /* ... */
7598 : /* ... */
7599 : /* ... */
7600 : /* ... */
7601 : /* ... */
7602 : /* ... */
7603 : /* ... */
7604 : /* ... */
7605 : /* ... */
7606 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7607 : /* (content generated from coverage data) */
7608 : /* ... */
7609 : /* ... */
7610 : /* ... */
7611 : /* ... */
7612 : /* ... */
7613 : /* ... */
7614 : /* ... */
7615 : /* ... */
7616 : /* ... */
7617 : /* ... */
7618 : /* ... */
7619 : /* ... */
7620 : /* ... */
7621 : /* ... */
7622 : /* ... */
7623 : /* ... */
7624 : /* ... */
7625 : /* ... */
7626 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7627 : /* (content generated from coverage data) */
7628 : /* ... */
7629 : /* ... */
7630 : /* ... */
7631 : /* ... */
7632 : /* ... */
7633 : /* ... */
7634 : /* ... */
7635 : /* ... */
7636 : /* ... */
7637 : /* ... */
7638 : /* ... */
7639 : /* ... */
7640 : /* ... */
7641 : /* ... */
7642 : /* ... */
7643 : /* ... */
7644 : /* ... */
7645 : /* ... */
7646 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7647 : /* (content generated from coverage data) */
7648 : /* ... */
7649 : /* ... */
7650 : /* ... */
7651 : /* ... */
7652 : /* ... */
7653 : /* ... */
7654 : /* ... */
7655 : /* ... */
7656 : /* ... */
7657 : /* ... */
7658 : /* ... */
7659 : /* ... */
7660 : /* ... */
7661 : /* ... */
7662 : /* ... */
7663 : /* ... */
7664 : /* ... */
7665 : /* ... */
7666 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7667 : /* (content generated from coverage data) */
7668 : /* ... */
7669 : /* ... */
7670 : /* ... */
7671 : /* ... */
7672 : /* ... */
7673 : /* ... */
7674 : /* ... */
7675 : /* ... */
7676 : /* ... */
7677 : /* ... */
7678 : /* ... */
7679 : /* ... */
7680 : /* ... */
7681 : /* ... */
7682 : /* ... */
7683 : /* ... */
7684 : /* ... */
7685 : /* ... */
7686 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7687 : /* (content generated from coverage data) */
7688 : /* ... */
7689 : /* ... */
7690 : /* ... */
7691 : /* ... */
7692 : /* ... */
7693 : /* ... */
7694 : /* ... */
7695 : /* ... */
7696 : /* ... */
7697 : /* ... */
7698 : /* ... */
7699 : /* ... */
7700 : /* ... */
7701 : /* ... */
7702 : /* ... */
7703 : /* ... */
7704 : /* ... */
7705 : /* ... */
7706 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7707 : /* (content generated from coverage data) */
7708 : /* ... */
7709 : /* ... */
7710 : /* ... */
7711 : /* ... */
7712 : /* ... */
7713 : /* ... */
7714 : /* ... */
7715 : /* ... */
7716 : /* ... */
7717 : /* ... */
7718 : /* ... */
7719 : /* ... */
7720 : /* ... */
7721 : /* ... */
7722 : /* ... */
7723 : /* ... */
7724 : /* ... */
7725 : /* ... */
7726 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7727 : /* (content generated from coverage data) */
7728 : /* ... */
7729 : /* ... */
7730 : /* ... */
7731 : /* ... */
7732 : /* ... */
7733 : /* ... */
7734 : /* ... */
7735 : /* ... */
7736 : /* ... */
7737 : /* ... */
7738 : /* ... */
7739 : /* ... */
7740 : /* ... */
7741 : /* ... */
7742 : /* ... */
7743 : /* ... */
7744 : /* ... */
7745 : /* ... */
7746 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7747 : /* (content generated from coverage data) */
7748 : /* ... */
7749 : /* ... */
7750 : /* ... */
7751 : /* ... */
7752 : /* ... */
7753 : /* ... */
7754 : /* ... */
7755 : /* ... */
7756 : /* ... */
7757 : /* ... */
7758 : /* ... */
7759 : /* ... */
7760 : /* ... */
7761 : /* ... */
7762 : /* ... */
7763 : /* ... */
7764 : /* ... */
7765 : /* ... */
7766 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7767 : /* (content generated from coverage data) */
7768 : /* ... */
7769 : /* ... */
7770 : /* ... */
7771 : /* ... */
7772 : /* ... */
7773 : /* ... */
7774 : /* ... */
7775 : /* ... */
7776 : /* ... */
7777 : /* ... */
7778 : /* ... */
7779 : /* ... */
7780 : /* ... */
7781 : /* ... */
7782 : /* ... */
7783 0 : /* ... */
7784 0 : /* ... */
7785 0 : /* ... */
7786 0 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7787 : /* (content generated from coverage data) */
7788 0 : /* ... */
7789 : /* ... */
7790 : /* ... */
7791 : /* ... */
7792 : /* ... */
7793 : /* ... */
7794 : /* ... */
7795 : /* ... */
7796 : /* ... */
7797 : /* ... */
7798 : /* ... */
7799 : /* ... */
7800 : /* ... */
7801 : /* ... */
7802 : /* ... */
7803 : /* ... */
7804 54947199 : /* END: function "_Z8bypass_pP8rtx_insn" */
7805 : /* ... */
7806 54947199 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7807 54947199 : /* (content generated from coverage data) */
7808 54947199 : /* ... */
7809 54947199 : /* ... */
7810 54947199 : /* ... */
7811 : /* ... */
7812 54947199 : /* ... */
7813 : /* ... */
7814 164 : /* ... */
7815 164 : /* ... */
7816 164 : /* ... */
|