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 284 : (define_mode_iterator MMXMODEI8 [V8QI V4HI V2SI (V1DI "TARGET_SSE2")])
51 56 :
52 : ;; All 8-byte vector modes handled by MMX
53 : (define_mode_iterator MMXMODE [V8QI V4HI V2SI V1DI V2SF V4HF V4BF])
54 14777 : (define_mode_iterator MMXMODE124 [V8QI V4HI V2SI V2SF])
55 14777 :
56 14777 : ;; Mix-n-match
57 : (define_mode_iterator MMXMODE12 [V8QI V4HI])
58 14777 : (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 110 : (define_mode_iterator VI2_32_64 [(V4HI "TARGET_MMX_WITH_SSE") V2HI])
74 7 :
75 74 : ;; 8-byte, 4-byte and 2-byte QImode vector modes
76 5 : (define_mode_iterator VI1_16_32_64 [(V8QI "TARGET_MMX_WITH_SSE") V4QI V2QI])
77 15 :
78 12 : ;; 4-byte and 2-byte integer vector modes
79 14 : (define_mode_iterator VI_16_32 [V4QI V2QI V2HI])
80 14 :
81 37 : ;; 4-byte and 2-byte QImode vector modes
82 6 : (define_mode_iterator VI1_16_32 [V4QI V2QI])
83 6 :
84 17 : ;; 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 1483 : (V8QI "TARGET_64BIT") (V4HI "TARGET_64BIT")
88 18 : (V4HF "TARGET_64BIT") (V4BF "TARGET_64BIT")
89 51718 : (V2SI "TARGET_64BIT") (V2SF "TARGET_64BIT")
90 157 : (V1DI "TARGET_64BIT")])
91 32136998 :
92 32852624 : ;; V2S* modes
93 51130944 : (define_mode_iterator V2FI [V2SF V2SI])
94 79285754 :
95 60556153 : (define_mode_iterator V24FI [V2SF V2SI V4HF V4HI])
96 38176729 :
97 14219807 : (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 498516 : {
182 498516 : ix86_expand_vector_move (<MODE>mode, operands);
183 498516 : 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 74178948 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
192 73842934 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))
193 73551597 : && ix86_hardreg_mov_ok (operands[0], operands[1])"
194 232236 : {
195 28833234 : switch (get_attr_type (insn))
196 826391 : {
197 28601381 : case TYPE_MULTI:
198 : return "#";
199 383 :
200 58988 : case TYPE_IMOV:
201 59371 : if (get_attr_mode (insn) == MODE_SI)
202 : return "mov{l}\t{%1, %k0|%k0, %1}";
203 : else
204 58910 : 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 1783 : case TYPE_SSELOG1:
223 1783 : return standard_sse_constant_opcode (insn, operands);
224 :
225 170769 : case TYPE_SSEMOV:
226 170769 : 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 235053 : (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 50987 : (const_string "V4SF")
282 : ]
283 : (const_string "TI"))
284 :
285 : (and (eq_attr "alternative" "13")
286 1886221 : (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 6049533 : (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 6422744 : ]
300 6422744 : (const_string "DI")))
301 6422744 : (set (attr "preferred_for_speed")
302 : (cond [(eq_attr "alternative" "9,15")
303 18763 : (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
304 : (eq_attr "alternative" "10,16")
305 6282421 : (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
306 : ]
307 405638 : (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 189554 : "!TARGET_64BIT && reload_completed"
313 66979 : [(const_int 0)]
314 792385 : "ix86_split_long_move (operands); DONE;")
315 21627 :
316 725406 : (define_split
317 : [(set (match_operand:MMXMODE 0 "nonimmediate_gr_operand")
318 : (match_operand:MMXMODE 1 "const0_operand"))]
319 34006 : "!TARGET_64BIT && reload_completed"
320 17312 : [(const_int 0)]
321 64407 : "ix86_split_long_move (operands); DONE;")
322 41677 :
323 47095 : (define_expand "movmisalign<mode>"
324 : [(set (match_operand:MMXMODE 0 "nonimmediate_operand")
325 5487 : (match_operand:MMXMODE 1 "nonimmediate_operand"))]
326 17212 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
327 131473 : {
328 137282 : ix86_expand_vector_move (<MODE>mode, operands);
329 125986 : DONE;
330 17212 : })
331 :
332 149805 : (define_expand "mov<mode>"
333 : [(set (match_operand:V_32 0 "nonimmediate_operand")
334 149805 : (match_operand:V_32 1 "nonimm_or_0_operand"))]
335 149805 : ""
336 166297 : {
337 45798 : ix86_expand_vector_move (<MODE>mode, operands);
338 45798 : DONE;
339 : })
340 :
341 : (define_insn "*mov<mode>_internal"
342 16321 : [(set (match_operand:V_32 0 "nonimmediate_operand"
343 0 : "=r ,m ,v,v,v,m,r,v")
344 16321 : (match_operand:V_32 1 "nonimm_or_0_operand"
345 16321 : "rmC,rC,C,v,m,v,v,r"))]
346 10271444 : "!(MEM_P (operands[0]) && MEM_P (operands[1]))
347 41453179 : && ix86_hardreg_mov_ok (operands[0], operands[1])"
348 17412 : {
349 19211941 : switch (get_attr_type (insn))
350 3 : {
351 19194529 : case TYPE_IMOV:
352 0 : return "mov{l}\t{%1, %0|%0, %1}";
353 :
354 208 : case TYPE_SSELOG1:
355 208 : return standard_sse_constant_opcode (insn, operands);
356 0 :
357 7598 : case TYPE_SSEMOV:
358 7598 : 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 5610 : ]
368 : (const_string "*")))
369 : (set (attr "type")
370 : (cond [(eq_attr "alternative" "2")
371 : (const_string "sselog1")
372 : (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 133033 : || <MODE>mode == V2BFmode")
388 : (const_string "V4SF")
389 : (match_test "TARGET_AVX")
390 : (const_string "TI")
391 27966 : (ior (not (match_test "TARGET_SSE2"))
392 21969 : (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 3 : "TARGET_64BIT"
417 : "@
418 19194526 : push{q}\t%q1
419 19194526 : #"
420 : [(set_attr "type" "push,multi")
421 : (set_attr "mode" "DI")])
422 :
423 60783946 : (define_split
424 60783946 : [(set (match_operand:V_32 0 "push_operand")
425 41685367 : (match_operand:V_32 1 "sse_reg_operand"))]
426 93807209 : "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 8668 : {
440 8668 : ix86_expand_vector_move (<MODE>mode, operands);
441 8668 : DONE;
442 : })
443 :
444 : (define_expand "movv2qi"
445 : [(set (match_operand:V2QI 0 "nonimmediate_operand")
446 52847 : (match_operand:V2QI 1 "nonimm_or_0_operand"))]
447 111 : ""
448 97026 : {
449 52958 : ix86_expand_vector_move (V2QImode, operands);
450 52847 : DONE;
451 111 : })
452 :
453 : (define_insn "*movv2qi_internal"
454 : [(set (match_operand:V2QI 0 "nonimmediate_operand"
455 18 : "=r,r,r,m ,v,v,v,jm,m,r,v")
456 : (match_operand:V2QI 1 "nonimm_or_0_operand"
457 18 : "r ,C,m,rC,C,v,m,x,v,v,r"))]
458 8564994 : "!(MEM_P (operands[0]) && MEM_P (operands[1]))
459 8536061 : && ix86_hardreg_mov_ok (operands[0], operands[1])"
460 21969 : {
461 3942370 : switch (get_attr_type (insn))
462 44511 : {
463 3937514 : case TYPE_IMOV:
464 17113 : if (get_attr_mode (insn) == MODE_SI)
465 : return "mov{l}\t{%k1, %k0|%k0, %k1}";
466 0 : else
467 16911 : return "mov{w}\t{%1, %0|%0, %1}";
468 0 :
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 590 : case TYPE_SSELOG1:
475 590 : if (satisfies_constraint_C (operands[1]))
476 56 : return standard_sse_constant_opcode (insn, operands);
477 :
478 534 : if (SSE_REG_P (operands[0]))
479 509 : return "%vpinsrw\t{$0, %1, %d0|%d0, %1, 0}";
480 : else
481 : return "%vpextrw\t{$0, %1, %0|%0, %1, 0}";
482 :
483 499 : case TYPE_SSEMOV:
484 499 : 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 24236672 : (const_string "imov")
521 107417021 : (and (match_test "TARGET_MOVX")
522 : (eq_attr "alternative" "0,2"))
523 : (const_string "imovx")
524 20445309 : ]
525 26410587 : (const_string "imov")))
526 26410587 : (set (attr "prefix")
527 26410587 : (cond [(eq_attr "alternative" "4,5,6,7,8,9,10")
528 : (const_string "maybe_evex")
529 0 : ]
530 132065965 : (const_string "orig")))
531 119845909 : (set (attr "mode")
532 93518002 : (cond [(eq_attr "alternative" "6,7,8")
533 77118 : (if_then_else (match_test "TARGET_AVX512FP16")
534 59666 : (const_string "HI")
535 8875581 : (const_string "TI"))
536 92923994 : (eq_attr "alternative" "9,10")
537 17452 : (if_then_else (match_test "TARGET_AVX512FP16")
538 38488297 : (const_string "HI")
539 38488297 : (const_string "SI"))
540 92907219 : (eq_attr "alternative" "4")
541 38488297 : (cond [(match_test "TARGET_AVX")
542 72311 : (const_string "TI")
543 38488297 : (ior (not (match_test "TARGET_SSE2"))
544 127655449 : (match_test "optimize_function_for_size_p (cfun)"))
545 : (const_string "V4SF")
546 5050876 : ]
547 5050876 : (const_string "TI"))
548 5050876 : (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 26854946 : (const_string "TI"))
558 26854946 : (eq_attr "type" "imovx")
559 26854946 : (const_string "SI")
560 : (and (eq_attr "alternative" "1,2")
561 : (match_operand:V2QI 1 "aligned_operand"))
562 : (const_string "SI")
563 26278872 : (and (eq_attr "alternative" "0")
564 33267 : (ior (not (match_test "TARGET_PARTIAL_REG_STALL"))
565 33267 : (not (match_test "TARGET_HIMODE_MATH"))))
566 33267 : (const_string "SI")
567 26312139 : ]
568 : (const_string "HI")))
569 : (set (attr "preferred_for_speed")
570 : (cond [(eq_attr "alternative" "9")
571 25268654 : (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 11830 :
577 11830 : (define_split
578 11830 : [(set (match_operand:V_16_32_64 0 "general_reg_operand")
579 : (match_operand:V_16_32_64 1 "memory_operand"))]
580 26530204 : "reload_completed
581 26537834 : && SYMBOL_REF_P (XEXP (operands[1], 0))
582 26522459 : && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0))"
583 111 : [(set (match_dup 0) (match_dup 1))]
584 61172 : {
585 61172 : rtx op1 = avoid_constant_pool_reference (operands[1]);
586 26317818 :
587 77608 : if (!CONST_VECTOR_P (op1))
588 24881 : FAIL;
589 68546 :
590 24615067 : HOST_WIDE_INT val = ix86_convert_const_vector_to_integer (op1, <MODE>mode);
591 42386 :
592 42689 : operands[0] = lowpart_subreg (<mmxinsnmode>mode, operands[0], <MODE>mode);
593 42689 : operands[1] = GEN_INT (val);
594 20792877 : })
595 :
596 : ;; 16-bit, 32-bit and 64-bit constant vector stores. After reload,
597 303 : ;; 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 303 : (match_operand:V_16_32_64 1 "x86_64_const_vector_operand" "i"))]
601 41608 : "!TARGET_LCP_STALL || <MODE>mode != V2QImode"
602 : "#"
603 5904891 : "&& reload_completed"
604 5885442 : [(set (match_dup 0) (match_dup 1))]
605 1965041 : {
606 1985742 : rtx op1 = operands[1];
607 110545 : HOST_WIDE_INT val = ix86_convert_const_vector_to_integer (op1, <MODE>mode);
608 4507394 :
609 4502481 : operands[0] = adjust_address (operands[0], <mmxinsnmode>mode, 0);
610 3944301 : operands[1] = GEN_INT (val);
611 4500368 : })
612 9577062 :
613 9577062 : ;; We always round up to UNITS_PER_WORD bytes.
614 11100556 : (define_insn "*pushv2qi2"
615 : [(set (match_operand:V2QI 0 "push_operand" "=X,X")
616 889390 : (match_operand:V2QI 1 "nonmemory_no_elim_operand" "rC,v"))]
617 21362 : ""
618 454861 : "* return TARGET_64BIT ? \"push{q}\t%q1\" : \"push{l}\t%k1\";
619 454861 : #"
620 454861 : [(set_attr "isa" "*,sse4")
621 : (set_attr "type" "push,multi")
622 69843 : (set (attr "mode")
623 47758 : (cond [(eq_attr "alternative" "0")
624 1257549 : (if_then_else (match_test "TARGET_64BIT")
625 1258440 : (const_string "DI")
626 1257518 : (const_string "SI"))
627 47758 : (eq_attr "alternative" "1")
628 46867 : (if_then_else (match_test "TARGET_AVX512FP16")
629 46867 : (const_string "HI")
630 101826 : (const_string "TI"))
631 101826 : ]
632 101826 : (const_string "HI")))])
633 55417 :
634 : (define_split
635 354 : [(set (match_operand:V2QI 0 "push_operand")
636 354 : (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 5698 : {
651 5698 : ix86_expand_vector_move (V2QImode, operands);
652 5698 : DONE;
653 19591 : })
654 19591 :
655 19591 : (define_insn "sse_movntq"
656 : [(set (match_operand:DI 0 "memory_operand" "=m,m")
657 3431 : (unspec:DI [(match_operand:DI 1 "register_operand" "y,r")]
658 0 : UNSPEC_MOVNTQ))]
659 23084 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
660 3431 : && (TARGET_SSE || TARGET_3DNOW_A)"
661 3437 : "@
662 0 : movntq\t{%1, %0|%0, %1}
663 19591 : movnti\t{%1, %0|%0, %1}"
664 1023 : [(set_attr "isa" "*,x64")
665 1023 : (set_attr "mmx_isa" "native,*")
666 27 : (set_attr "type" "mmxmov,ssemov")
667 291 : (set_attr "c86_attr" "movnt")
668 318 : (set_attr "mode" "DI")])
669 0 :
670 27 : (define_expand "movq_<mode>_to_sse"
671 : [(set (match_operand:<mmxdoublevecmode> 0 "register_operand")
672 40491 : (vec_concat:<mmxdoublevecmode>
673 40491 : (match_operand:V24FI 1 "nonimmediate_operand")
674 40491 : (match_dup 2)))]
675 : "TARGET_SSE2"
676 17195 : {
677 17195 : if (<MODE>mode != V2SImode
678 17216 : && !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 6775 : operands[2] = CONST0_RTX (<MODE>mode);
687 : })
688 :
689 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
690 : ;;
691 3478770 : ;; Parallel single-precision floating point arithmetic
692 3471995 : ;;
693 3471995 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
694 3471995 :
695 6775 : (define_expand "<code>v2sf2"
696 : [(set (match_operand:V2SF 0 "register_operand")
697 : (absneg:V2SF
698 3381346 : (match_operand:V2SF 1 "register_operand")))]
699 : "TARGET_MMX_WITH_SSE"
700 519 : "ix86_expand_fp_absneg_operator (<CODE>, V2SFmode, operands); DONE;")
701 :
702 3381782 : (define_insn_and_split "*mmx_<code>v2sf2"
703 436 : [(set (match_operand:V2SF 0 "register_operand" "=x,x,x")
704 407 : (absneg:V2SF
705 : (match_operand:V2SF 1 "register_operand" "0,x,x")))
706 3381346 : (use (match_operand:V2SF 2 "nonimmediate_operand" "x,0,x"))]
707 1204 : "TARGET_MMX_WITH_SSE"
708 29 : "#"
709 166 : "&& reload_completed"
710 : [(set (match_dup 0)
711 95 : (<absneg_op>:V2SF (match_dup 1) (match_dup 2)))]
712 2414 : {
713 115 : if (!TARGET_AVX && operands_match_p (operands[0], operands[2]))
714 2362 : std::swap (operands[1], operands[2]);
715 7562 : }
716 7562 : [(set_attr "isa" "noavx,noavx,avx")])
717 5243 :
718 5298 : (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 83 : (match_operand:V2SF 1 "register_operand" "0,x,x"))))
723 : (use (match_operand:V2SF 2 "nonimmediate_operand" "x,0,x"))]
724 0 : "TARGET_MMX_WITH_SSE"
725 0 : "#"
726 0 : "&& reload_completed"
727 304 : [(set (match_dup 0)
728 2578 : (ior:V2SF (match_dup 1) (match_dup 2)))]
729 2882 : {
730 2882 : if (!TARGET_AVX && operands_match_p (operands[0], operands[2]))
731 2882 : std::swap (operands[1], operands[2]);
732 2578 : }
733 2578 : [(set_attr "isa" "noavx,noavx,avx")])
734 2578 :
735 2578 : (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 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
741 6125 : {
742 6125 : rtx op2 = gen_reg_rtx (V4SFmode);
743 6125 : rtx op1 = gen_reg_rtx (V4SFmode);
744 6184 : rtx op0 = gen_reg_rtx (V4SFmode);
745 :
746 193892 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
747 193892 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
748 187767 :
749 193833 : emit_insn (gen_<insn>v4sf3 (op0, op1, op2));
750 187708 :
751 193833 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
752 193833 : DONE;
753 187708 : })
754 :
755 : (define_expand "mmx_addv2sf3"
756 : [(parallel
757 : [(set (match_operand:V2SF 0 "register_operand")
758 : (plus:V2SF
759 : (match_operand:V2SF 1 "nonimmediate_operand")
760 : (match_operand:V2SF 2 "nonimmediate_operand")))
761 : (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 36 : [(set (match_operand:V2SF 0 "register_operand" "=y")
767 17 : (plus:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0")
768 1123 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")))
769 36 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
770 100 : "TARGET_3DNOW && ix86_binary_operator_ok (PLUS, V2SFmode, operands)"
771 12 : "pfadd\t{%2, %0|%0, %2}"
772 1104 : [(set_attr "type" "mmxadd")
773 : (set_attr "prefix_extra" "1")
774 296 : (set_attr "mode" "V2SF")])
775 296 :
776 1087 : (define_expand "mmx_subv2sf3"
777 74 : [(parallel
778 287 : [(set (match_operand:V2SF 0 "register_operand")
779 74 : (minus:V2SF (match_operand:V2SF 1 "register_operand")
780 259 : (match_operand:V2SF 2 "nonimmediate_operand")))
781 0 : (unspec [(const_int 0)] UNSPEC_3DNOW)])]
782 259 : "TARGET_3DNOW")
783 15 :
784 : (define_expand "mmx_subrv2sf3"
785 152279 : [(parallel
786 152279 : [(set (match_operand:V2SF 0 "register_operand")
787 152279 : (minus:V2SF (match_operand:V2SF 2 "register_operand")
788 152264 : (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 285269 : "TARGET_3DNOW && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
798 285271 : "@
799 285269 : pfsub\t{%2, %0|%0, %2}
800 : pfsubr\t{%1, %0|%0, %1}"
801 : [(set_attr "type" "mmxadd")
802 : (set_attr "prefix_extra" "1")
803 : (set_attr "mode" "V2SF")])
804 :
805 51 : (define_expand "mmx_mulv2sf3"
806 51 : [(parallel
807 51 : [(set (match_operand:V2SF 0 "register_operand")
808 793991 : (mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand")
809 793991 : (match_operand:V2SF 2 "nonimmediate_operand")))
810 793991 : (unspec [(const_int 0)] UNSPEC_3DNOW)])]
811 51 : "TARGET_3DNOW"
812 15 : "ix86_fixup_binary_operands_no_copy (MULT, V2SFmode, operands);")
813 42 :
814 97705 : (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 54219 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
819 78 : "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V2SFmode, operands)"
820 9 : "pfmul\t{%2, %0|%0, %2}"
821 15 : [(set_attr "type" "mmxmul")
822 : (set_attr "prefix_extra" "1")
823 : (set_attr "mode" "V2SF")])
824 :
825 : (define_expand "divv2sf3"
826 : [(set (match_operand:V2SF 0 "register_operand")
827 424217 : (div:V2SF (match_operand:V2SF 1 "register_operand")
828 424216 : (match_operand:V2SF 2 "register_operand")))]
829 10351 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
830 228 : {
831 136454 : rtx op2 = gen_reg_rtx (V4SFmode);
832 136453 : rtx op1 = gen_reg_rtx (V4SFmode);
833 6304 : 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 6304 : 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 356255 : (define_expand "<code>v2sf3"
847 356255 : [(set (match_operand:V2SF 0 "register_operand")
848 356255 : (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 140 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
858 135 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
859 5 :
860 140 : emit_insn (gen_<code>v4sf3 (op0, op1, op2));
861 5 :
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 : (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 1803562 : {
874 1803562 : if (!flag_finite_math_only || flag_signed_zeros)
875 1803534 : {
876 28 : operands[1] = force_reg (V2SFmode, operands[1]);
877 278 : emit_insn (gen_mmx_ieee_<maxmin_float>v2sf3
878 : (operands[0], operands[1], operands[2]));
879 278 : DONE;
880 250 : }
881 250 : else
882 0 : ix86_fixup_binary_operands_no_copy (<CODE>, V2SFmode, operands);
883 : })
884 355261 :
885 355261 : ;; These versions of the min/max patterns are intentionally ignorant of
886 355261 : ;; 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 :
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 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
895 0 : "TARGET_3DNOW && ix86_binary_operator_ok (<CODE>, V2SFmode, operands)"
896 : "pf<maxmin_float>\t{%2, %0|%0, %2}"
897 12 : [(set_attr "type" "mmxadd")
898 : (set_attr "prefix_extra" "1")
899 12 : (set_attr "mode" "V2SF")])
900 12 :
901 12 : ;; These versions of the min/max patterns implement exactly the operations
902 : ;; min = (op1 < op2 ? op1 : op2)
903 : ;; max = (!(op1 < op2) ? op1 : op2)
904 479352 : ;; Their operands are not commutative, and thus they may be used in the
905 479352 : ;; presence of -0.0 and NaN.
906 :
907 276059 : (define_insn "mmx_ieee_<ieee_maxmin>v2sf3"
908 276059 : [(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 63 : "TARGET_3DNOW"
915 : "pf<ieee_maxmin>\t{%2, %0|%0, %2}"
916 : [(set_attr "type" "mmxadd")
917 : (set_attr "prefix_extra" "1")
918 7805 : (set_attr "mode" "V2SF")])
919 326 :
920 7805 : (define_insn "mmx_rcpv2sf2"
921 : [(set (match_operand:V2SF 0 "register_operand" "=y")
922 7479 : (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")]
923 7479 : UNSPEC_PFRCP))]
924 7550 : "TARGET_3DNOW"
925 7479 : "pfrcp\t{%1, %0|%0, %1}"
926 7479 : [(set_attr "type" "mmx")
927 : (set_attr "prefix_extra" "1")
928 7557 : (set_attr "mode" "V2SF")])
929 7557 :
930 : (define_insn "mmx_rcpit1v2sf3"
931 7352 : [(set (match_operand:V2SF 0 "register_operand" "=y")
932 7352 : (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0")
933 7352 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")]
934 7274 : UNSPEC_PFRCPIT1))]
935 7425 : "TARGET_3DNOW"
936 7359 : "pfrcpit1\t{%2, %0|%0, %2}"
937 7345 : [(set_attr "type" "mmx")
938 71 : (set_attr "prefix_extra" "1")
939 7368 : (set_attr "mode" "V2SF")])
940 7368 :
941 7274 : (define_insn "mmx_rcpit2v2sf3"
942 7368 : [(set (match_operand:V2SF 0 "register_operand" "=y")
943 7274 : (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0")
944 7274 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")]
945 7274 : UNSPEC_PFRCPIT2))]
946 7354 : "TARGET_3DNOW"
947 14 : "pfrcpit2\t{%2, %0|%0, %2}"
948 6477 : [(set_attr "type" "mmx")
949 : (set_attr "prefix_extra" "1")
950 872 : (set_attr "mode" "V2SF")])
951 872 :
952 778 : (define_expand "sqrtv2sf2"
953 94 : [(set (match_operand:V2SF 0 "register_operand")
954 778 : (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 0 :
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 71 : "TARGET_3DNOW"
973 0 : "pfrsqrt\t{%1, %0|%0, %1}"
974 : [(set_attr "type" "mmx")
975 : (set_attr "prefix_extra" "1")
976 2044 : (set_attr "mode" "V2SF")])
977 2044 :
978 175 : (define_insn "mmx_rsqit1v2sf3"
979 210 : [(set (match_operand:V2SF 0 "register_operand" "=y")
980 385 : (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0")
981 385 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")]
982 175 : UNSPEC_PFRSQIT1))]
983 289 : "TARGET_3DNOW"
984 223 : "pfrsqit1\t{%2, %0|%0, %2}"
985 209 : [(set_attr "type" "mmx")
986 : (set_attr "prefix_extra" "1")
987 118998 : (set_attr "mode" "V2SF")])
988 118998 :
989 146 : (define_expand "mmx_haddv2sf3"
990 4739 : [(set (match_operand:V2SF 0 "register_operand")
991 28 : (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 79 : && INTVAL (operands[5]) != INTVAL (operands[6])"
1022 0 : "pfacc\t{%2, %0|%0, %2}"
1023 : [(set_attr "type" "mmxadd")
1024 : (set_attr "prefix_extra" "1")
1025 787 : (set_attr "mode" "V2SF")])
1026 787 :
1027 : (define_insn_and_split "*mmx_haddv2sf3_low"
1028 173 : [(set (match_operand:SF 0 "register_operand")
1029 960 : (plus:SF
1030 : (vec_select:SF
1031 173 : (match_operand:V2SF 1 "nonimmediate_operand")
1032 173 : (parallel [(match_operand:SI 2 "const_0_to_1_operand")]))
1033 173 : (vec_select:SF
1034 173 : (match_dup 1)
1035 : (parallel [(match_operand:SI 3 "const_0_to_1_operand")]))))]
1036 986 : "TARGET_SSE3 && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math
1037 531 : && INTVAL (operands[2]) != INTVAL (operands[3])
1038 372 : && ix86_pre_reload_split ()"
1039 604 : "#"
1040 159 : "&& 1"
1041 159 : [(const_int 0)]
1042 370 : {
1043 456 : rtx op1 = gen_reg_rtx (V4SFmode);
1044 936 : rtx op0 = gen_reg_rtx (V4SFmode);
1045 831 :
1046 397 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1047 30 :
1048 230 : emit_insn (gen_sse3_haddv4sf3 (op0, op1, op1));
1049 80 :
1050 265 : emit_move_insn (operands[0], lowpart_subreg (SFmode, op0, V4SFmode));
1051 265 : DONE;
1052 80 : })
1053 :
1054 80 : (define_insn "mmx_hsubv2sf3"
1055 80 : [(set (match_operand:V2SF 0 "register_operand" "=y")
1056 80 : (vec_concat:V2SF
1057 80 : (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 747 : (vec_select:SF
1064 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")
1065 747 : (parallel [(const_int 0)]))
1066 747 : (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))]
1067 827 : "TARGET_3DNOW_A"
1068 0 : "pfnacc\t{%2, %0|%0, %2}"
1069 : [(set_attr "type" "mmxadd")
1070 : (set_attr "prefix_extra" "1")
1071 79 : (set_attr "mode" "V2SF")])
1072 79 :
1073 79 : (define_insn_and_split "*mmx_hsubv2sf3_low"
1074 79 : [(set (match_operand:SF 0 "register_operand")
1075 : (minus:SF
1076 79 : (vec_select:SF
1077 79 : (match_operand:V2SF 1 "register_operand")
1078 79 : (parallel [(const_int 0)]))
1079 : (vec_select:SF
1080 79 : (match_dup 1)
1081 79 : (parallel [(const_int 1)]))))]
1082 178 : "TARGET_SSE3 && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math
1083 3 : && ix86_pre_reload_split ()"
1084 127 : "#"
1085 79 : "&& 1"
1086 79 : [(const_int 0)]
1087 19 : {
1088 97 : rtx op1 = gen_reg_rtx (V4SFmode);
1089 412 : rtx op0 = gen_reg_rtx (V4SFmode);
1090 411 :
1091 18 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1092 109 :
1093 125 : emit_insn (gen_sse3_hsubv4sf3 (op0, op1, op1));
1094 79 :
1095 1 : emit_move_insn (operands[0], lowpart_subreg (SFmode, op0, V4SFmode));
1096 80 : DONE;
1097 79 : })
1098 79 :
1099 : (define_expand "mmx_haddsubv2sf3"
1100 79 : [(set (match_operand:V2SF 0 "register_operand")
1101 79 : (vec_concat:V2SF
1102 79 : (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 13 : (vec_select:SF
1109 : (match_operand:V2SF 2 "nonimmediate_operand")
1110 13 : (parallel [(const_int 0)]))
1111 13 : (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))]
1112 13 : "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 0 : "pfpnacc\t{%2, %0|%0, %2}"
1132 : [(set_attr "type" "mmxadd")
1133 : (set_attr "prefix_extra" "1")
1134 : (set_attr "mode" "V2SF")])
1135 :
1136 : (define_expand "vec_addsubv2sf3"
1137 : [(set (match_operand:V2SF 0 "register_operand")
1138 2853239 : (vec_merge:V2SF
1139 2853239 : (minus:V2SF
1140 2853239 : (match_operand:V2SF 1 "nonimmediate_operand")
1141 2853239 : (match_operand:V2SF 2 "nonimmediate_operand"))
1142 2853239 : (plus:V2SF (match_dup 1) (match_dup 2))
1143 2853239 : (const_int 1)))]
1144 2853239 : "TARGET_SSE3 && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1145 246 : {
1146 39818 : rtx op2 = gen_reg_rtx (V4SFmode);
1147 39818 : rtx op1 = gen_reg_rtx (V4SFmode);
1148 35128 : rtx op0 = gen_reg_rtx (V4SFmode);
1149 74454 :
1150 246 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
1151 33023 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1152 :
1153 29027 : 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 7 : rtx op0 = gen_reg_rtx (V4SFmode);
1172 :
1173 7 : emit_insn (gen_movq_v2sf_to_sse (op3, operands[3]));
1174 7 : emit_insn (gen_movq_v2sf_to_sse (op2, operands[2]));
1175 7 : 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 418 : rtx op1 = gen_reg_rtx (V4SFmode);
1195 4 : rtx op0 = gen_reg_rtx (V4SFmode);
1196 414 :
1197 418 : emit_insn (gen_movq_v2sf_to_sse (op3, operands[3]));
1198 418 : 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 : (unspec [(const_int 0)] UNSPEC_3DNOW)])]
1219 286 : "TARGET_3DNOW"
1220 14 : "ix86_fixup_binary_operands_no_copy (EQ, V2SFmode, operands);")
1221 286 :
1222 0 : (define_insn "*mmx_eqv2sf3"
1223 286 : [(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 0 : "pfcmpeq\t{%2, %0|%0, %2}"
1229 14 : [(set_attr "type" "mmxcmp")
1230 : (set_attr "prefix_extra" "1")
1231 : (set_attr "mode" "V2SF")])
1232 :
1233 : (define_insn "mmx_gtv2sf3"
1234 156 : [(set (match_operand:V2SI 0 "register_operand" "=y")
1235 : (gt:V2SI (match_operand:V2SF 1 "register_operand" "0")
1236 156 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")))
1237 52084 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
1238 226 : "TARGET_3DNOW"
1239 : "pfcmpgt\t{%2, %0|%0, %2}"
1240 : [(set_attr "type" "mmxcmp")
1241 51928 : (set_attr "prefix_extra" "1")
1242 100008 : (set_attr "mode" "V2SF")])
1243 100008 :
1244 100008 : (define_insn "mmx_gev2sf3"
1245 51928 : [(set (match_operand:V2SI 0 "register_operand" "=y")
1246 51928 : (ge:V2SI (match_operand:V2SF 1 "register_operand" "0")
1247 51928 : (match_operand:V2SF 2 "nonimmediate_operand" "ym")))
1248 : (unspec [(const_int 0)] UNSPEC_3DNOW)]
1249 27374 : "TARGET_3DNOW"
1250 27304 : "pfcmpge\t{%2, %0|%0, %2}"
1251 27304 : [(set_attr "type" "mmxcmp")
1252 27304 : (set_attr "prefix_extra" "1")
1253 27304 : (set_attr "mode" "V2SF")])
1254 27304 :
1255 : (define_expand "vec_cmpv2sfv2si"
1256 656337 : [(set (match_operand:V2SI 0 "register_operand")
1257 656337 : (match_operator:V2SI 1 ""
1258 : [(match_operand:V2SF 2 "nonimmediate_operand")
1259 25 : (match_operand:V2SF 3 "nonimmediate_operand")]))]
1260 25 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1261 186 : {
1262 186 : rtx ops[4];
1263 186 : ops[3] = gen_reg_rtx (V4SFmode);
1264 175 : ops[2] = gen_reg_rtx (V4SFmode);
1265 186 : ops[1] = gen_rtx_fmt_ee (GET_CODE (operands[1]), V4SImode, ops[2], ops[3]);
1266 186 : ops[0] = gen_reg_rtx (V4SImode);
1267 11 :
1268 197 : emit_insn (gen_movq_v2sf_to_sse (ops[3], operands[3]));
1269 175 : emit_insn (gen_movq_v2sf_to_sse (ops[2], operands[2]));
1270 11 :
1271 186 : bool ok = ix86_expand_fp_vec_cmp (ops);
1272 186 : gcc_assert (ok);
1273 11 :
1274 186 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, ops[0], V4SImode));
1275 175 : 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 6160 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
1286 761 : {
1287 458 : if (MEM_P (operands[2]))
1288 : {
1289 22 : unsigned count_s = INTVAL (operands[3]) >> 6;
1290 132 : if (count_s)
1291 11 : operands[3] = GEN_INT (INTVAL (operands[3]) & 0x3f);
1292 132 : operands[2] = adjust_address_nv (operands[2],
1293 43215 : <mmxscalarmode>mode, count_s * 4);
1294 43325 : }
1295 43673 : switch (which_alternative)
1296 43215 : {
1297 43215 : case 0:
1298 43215 : case 1:
1299 43215 : return "insertps\t{%3, %2, %0|%0, %2, %3}";
1300 43673 : case 2:
1301 43673 : return "vinsertps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
1302 43215 : default:
1303 0 : gcc_unreachable ();
1304 40164 : }
1305 : }
1306 321 : [(set_attr "isa" "noavx,noavx,avx")
1307 321 : (set_attr "addr" "gpr16,gpr16,*")
1308 : (set_attr "type" "sselog")
1309 594 : (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 1784 : "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 3 : vblendps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1326 3 : [(set_attr "isa" "noavx,noavx,avx")
1327 : (set_attr "type" "ssemov")
1328 3 : (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 181 : "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 3465 : vblendvps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1347 3465 : [(set_attr "isa" "noavx,noavx,avx")
1348 : (set_attr "type" "ssemov")
1349 3465 : (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 304 : "TARGET_MMX_WITH_SSE"
1370 152 : "@
1371 : andnps\t{%2, %0|%0, %2}
1372 : vandnps\t{%2, %1, %0|%0, %1, %2}"
1373 0 : [(set_attr "isa" "noavx,avx")
1374 0 : (set_attr "type" "sselog")
1375 : (set_attr "prefix" "orig,vex")
1376 0 : (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 852 : "TARGET_MMX_WITH_SSE"
1384 275 : "@
1385 : <logic>ps\t{%2, %0|%0, %2}
1386 : v<logic>ps\t{%2, %1, %0|%0, %1, %2}"
1387 2 : [(set_attr "isa" "noavx,avx")
1388 2 : (set_attr "type" "sselog")
1389 1 : (set_attr "prefix" "orig,vex")
1390 : (set_attr "mode" "V4SF")])
1391 1 :
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 5 :
1424 : (define_expand "signbitv2sf2"
1425 5 : [(set (match_operand:V2SI 0 "register_operand")
1426 6 : (lshiftrt:V2SI
1427 5 : (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 1 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1437 : ;;
1438 2 : ;; Parallel single-precision FMA multiply/accumulate instructions.
1439 1 : ;;
1440 1 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 82 : (match_operand:V2SF 3 "nonimmediate_operand")))]
1448 : "(TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL)
1449 82 : && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1450 829 : {
1451 829 : 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 32 : rtx op2 = gen_reg_rtx (V4SFmode);
1478 13 : rtx op1 = gen_reg_rtx (V4SFmode);
1479 32 : rtx op0 = gen_reg_rtx (V4SFmode);
1480 19 :
1481 32 : 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 1239 : rtx op1 = gen_reg_rtx (V4SFmode);
1504 156 : rtx op0 = gen_reg_rtx (V4SFmode);
1505 1083 :
1506 156 : emit_insn (gen_movq_v2sf_to_sse (op3, operands[3]));
1507 1239 : 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 3 : rtx op3 = gen_reg_rtx (V4SFmode);
1528 2 : rtx op2 = gen_reg_rtx (V4SFmode);
1529 3 : rtx op1 = gen_reg_rtx (V4SFmode);
1530 3 : rtx op0 = gen_reg_rtx (V4SFmode);
1531 1 :
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 83 : rtx op0 = gen_reg_rtx (V4SImode);
1555 :
1556 83 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1557 1 :
1558 83 : 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 1 : emit_insn (gen_fixuns_truncv4sfv4si2 (op0, op1));
1575 87 :
1576 1 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
1577 88 : DONE;
1578 0 : })
1579 87 :
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 54 : "TARGET_3DNOW"
1585 0 : "pf2id\t{%1, %0|%0, %1}"
1586 : [(set_attr "type" "mmxcvt")
1587 : (set_attr "prefix_extra" "1")
1588 : (set_attr "mode" "V2SF")])
1589 :
1590 2607 : (define_expand "floatv2siv2sf2"
1591 : [(set (match_operand:V2SF 0 "register_operand")
1592 2607 : (float:V2SF (match_operand:V2SI 1 "nonimmediate_operand")))]
1593 2607 : "TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1594 63585557 : {
1595 414 : rtx op1 = gen_reg_rtx (V4SImode);
1596 414 : rtx op0 = gen_reg_rtx (V4SFmode);
1597 :
1598 63582950 : emit_insn (gen_movq_v2si_to_sse (op1, operands[1]));
1599 63582536 :
1600 63582950 : emit_insn (gen_floatv4siv4sf2 (op0, op1));
1601 63582536 :
1602 414 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1603 62454120 : DONE;
1604 62453706 : })
1605 62453706 :
1606 62453706 : (define_expand "floatunsv2siv2sf2"
1607 : [(set (match_operand:V2SF 0 "register_operand")
1608 62446014 : (unsigned_float:V2SF (match_operand:V2SI 1 "nonimmediate_operand")))]
1609 62446014 : "TARGET_AVX512VL && TARGET_MMX_WITH_SSE && ix86_partial_vec_fp_math"
1610 62446019 : {
1611 5 : rtx op1 = gen_reg_rtx (V4SImode);
1612 62446019 : rtx op0 = gen_reg_rtx (V4SFmode);
1613 :
1614 39512652 : emit_insn (gen_movq_v2si_to_sse (op1, operands[1]));
1615 39512647 :
1616 6 : emit_insn (gen_floatunsv4siv4sf2 (op0, op1));
1617 39510156 :
1618 39510162 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1619 39510162 : DONE;
1620 39510157 : })
1621 :
1622 39500245 : (define_insn "mmx_floatv2siv2sf2"
1623 78666961 : [(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 66 : "TARGET_3DNOW"
1627 0 : "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 72 : (fix:V2SI
1637 : (match_operand:V2SF 1 "nonimmediate_operand" "ym")))))]
1638 70 : "TARGET_3DNOW_A"
1639 : "pf2iw\t{%1, %0|%0, %1}"
1640 71 : [(set_attr "type" "mmxcvt")
1641 71 : (set_attr "prefix_extra" "1")
1642 34716 : (set_attr "mode" "V2SF")])
1643 34716 :
1644 34645 : (define_insn "mmx_pi2fw"
1645 70 : [(set (match_operand:V2SF 0 "register_operand" "=y")
1646 34715 : (float:V2SF
1647 34645 : (sign_extend:V2SI
1648 34695 : (truncate:V2HI
1649 50 : (match_operand:V2SI 1 "nonimmediate_operand" "ym")))))]
1650 11201 : "TARGET_3DNOW_A"
1651 11135 : "pi2fw\t{%1, %0|%0, %1}"
1652 12002 : [(set_attr "type" "mmxcvt")
1653 50 : (set_attr "prefix_extra" "1")
1654 50 : (set_attr "mode" "V2SF")])
1655 :
1656 28 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1657 : ;;
1658 0 : ;; Parallel single-precision floating point element swizzling
1659 0 : ;;
1660 268313 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1661 :
1662 : (define_insn "mmx_pswapdv2sf2"
1663 : [(set (match_operand:V2SF 0 "register_operand" "=y,x,Yv")
1664 268313 : (vec_select:V2SF
1665 268313 : (match_operand:V2SF 1 "register_mmxmem_operand" "ym,0,Yv")
1666 268313 : (parallel [(const_int 1) (const_int 0)])))]
1667 7179 : "TARGET_3DNOW_A || TARGET_MMX_WITH_SSE"
1668 268313 : "@
1669 268313 : pswapd\t{%1, %0|%0, %1}
1670 : shufps\t{$0xe1, %1, %0|%0, %1, 0xe1}
1671 190707 : vshufps\t{$0xe1, %1, %1, %0|%0, %1, %1, 0xe1}"
1672 4108 : [(set_attr "isa" "*,sse_noavx,avx")
1673 4108 : (set_attr "mmx_isa" "native,*,*")
1674 186599 : (set_attr "type" "mmxcvt,ssemov,ssemov")
1675 186599 : (set_attr "prefix_extra" "1,*,*")
1676 186599 : (set_attr "mode" "V2SF,V4SF,V4SF")])
1677 :
1678 186598 : (define_insn "*mmx_movshdup"
1679 186598 : [(set (match_operand:V2SF 0 "register_operand" "=v,x")
1680 186598 : (vec_select:V2SF
1681 186598 : (match_operand:V2SF 1 "register_operand" "v,0")
1682 186598 : (parallel [(const_int 1) (const_int 1)])))]
1683 3910 : "TARGET_MMX_WITH_SSE"
1684 3379 : "@
1685 3379 : %vmovshdup\t{%1, %0|%0, %1}
1686 3379 : shufps\t{$0xe5, %0, %0|%0, %0, 0xe5}"
1687 3379 : [(set_attr "isa" "sse3,*")
1688 3379 : (set_attr "type" "sse,sseshuf1")
1689 6758 : (set_attr "length_immediate" "*,1")
1690 : (set_attr "prefix_rep" "1,*")
1691 : (set_attr "prefix" "maybe_vex,orig")
1692 : (set_attr "mode" "V4SF")])
1693 4608 :
1694 4608 : (define_insn "*mmx_movsldup"
1695 : [(set (match_operand:V2SF 0 "register_operand" "=v,x")
1696 4177 : (vec_select:V2SF
1697 4177 : (match_operand:V2SF 1 "register_operand" "v,0")
1698 4144 : (parallel [(const_int 0) (const_int 0)])))]
1699 8117 : "TARGET_MMX_WITH_SSE"
1700 : "@
1701 : %vmovsldup\t{%1, %0|%0, %1}
1702 : shufps\t{$0xe0, %0, %0|%0, %0, 0xe0}"
1703 423 : [(set_attr "isa" "sse3,*")
1704 423 : (set_attr "type" "sse,sseshuf1")
1705 423 : (set_attr "length_immediate" "*,1")
1706 843 : (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 6995 : "TARGET_MMX_WITH_SSE"
1718 : "#"
1719 572 : "&& reload_completed"
1720 286 : [(const_int 0)]
1721 14507 : "ix86_split_mmx_punpck (operands, false); DONE;"
1722 14221 : [(set_attr "isa" "noavx,avx")
1723 724 : (set_attr "type" "sselog")
1724 724 : (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 3190 : (match_operand:V2SF 2 "register_operand" "x,v"))
1733 : (parallel [(const_int 1) (const_int 3)])))]
1734 6042 : "TARGET_MMX_WITH_SSE"
1735 3190 : "#"
1736 3410 : "&& reload_completed"
1737 110 : [(const_int 0)]
1738 7561 : "ix86_split_mmx_punpck (operands, true); DONE;"
1739 7451 : [(set_attr "isa" "noavx,avx")
1740 552 : (set_attr "type" "sselog")
1741 552 : (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 6882 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
1749 422 : "@
1750 : punpckldq\t%0, %0
1751 1 : %vmovsldup\t{%1, %0|%0, %1}
1752 38 : shufps\t{$0xe0, %0, %0|%0, %0, 0xe0}"
1753 38 : [(set_attr "isa" "*,sse3,sse_noavx")
1754 32 : (set_attr "mmx_isa" "native,*,*")
1755 32 : (set_attr "type" "mmxcvt,sse,sseshuf1")
1756 69 : (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 4192 : "TARGET_MMX_WITH_SSE"
1768 1504 : "@
1769 : movss\t{%2, %0|%0, %2}
1770 : vmovss\t{%2, %1, %0|%0, %1, %2}"
1771 3377 : [(set_attr "isa" "noavx,avx")
1772 3377 : (set_attr "type" "ssemov")
1773 : (set_attr "prefix" "orig,maybe_evex")
1774 3377 : (set_attr "mode" "SF")])
1775 714505 :
1776 714505 : (define_insn "*mmx_concatv2sf"
1777 714505 : [(set (match_operand:V2SF 0 "register_operand" "=y,y")
1778 714505 : (vec_concat:V2SF
1779 714505 : (match_operand:SF 1 "nonimmediate_operand" " 0,rm")
1780 714505 : (match_operand:SF 2 "nonimm_or_0_operand" "ym,C")))]
1781 743286 : "TARGET_MMX && !TARGET_SSE"
1782 714505 : "@
1783 28781 : punpckldq\t{%2, %0|%0, %2}
1784 703349 : movd\t{%1, %0|%0, %1}"
1785 : [(set_attr "type" "mmxcvt,mmxmov")
1786 270 : (set_attr "mode" "DI")])
1787 270 :
1788 : (define_expand "vec_setv2sf"
1789 : [(match_operand:V2SF 0 "register_operand")
1790 270 : (match_operand:SF 1 "register_operand")
1791 : (match_operand 2 "vec_setm_mmx_operand")]
1792 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
1793 19 : {
1794 19 : if (CONST_INT_P (operands[2]))
1795 17 : ix86_expand_vector_set (TARGET_MMX_WITH_SSE, operands[0], operands[1],
1796 17 : INTVAL (operands[2]));
1797 : else
1798 2 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
1799 19 : 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 2959 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
1810 23330 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1811 : "#"
1812 2909 : "&& reload_completed"
1813 1083 : [(set (match_dup 0) (match_dup 1))]
1814 82865 : "operands[1] = gen_lowpart (SFmode, operands[1]);"
1815 81782 : [(set_attr "mmx_isa" "*,*,native,native,*,*")])
1816 13740 :
1817 14822 : ;; Avoid combining registers from different units in a single alternative,
1818 : ;; see comment above inline_secondary_memory_needed function in i386.cc
1819 : (define_insn "*vec_extractv2sf_1"
1820 1083 : [(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 16782 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
1825 16784 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1826 : "@
1827 2 : punpckhdq\t%0, %0
1828 2 : %vmovshdup\t{%1, %0|%0, %1}
1829 18620 : shufps\t{$0xe5, %0, %0|%0, %0, 0xe5}
1830 18618 : #
1831 18454 : #
1832 37072 : #
1833 : #"
1834 18321 : [(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 105 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && reload_completed"
1854 87 : [(set (match_dup 0) (match_dup 1))]
1855 87 : "operands[1] = adjust_address (operands[1], SFmode, 4);")
1856 :
1857 6675 : (define_expand "vec_extractv2sfsf"
1858 6762 : [(match_operand:SF 0 "register_operand")
1859 5312 : (match_operand:V2SF 1 "register_operand")
1860 5312 : (match_operand 2 "const_int_operand")]
1861 6762 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
1862 3190 : {
1863 3190 : ix86_expand_vector_extract (TARGET_MMX_WITH_SSE, operands[0],
1864 3190 : operands[1], INTVAL (operands[2]));
1865 3190 : 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 2607 : {
1873 2607 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
1874 : operands[1]);
1875 2607 : DONE;
1876 : })
1877 :
1878 1 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1879 : ;;
1880 1 : ;; Parallel single-precision floating point rounding operations.
1881 1 : ;;
1882 1 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 123 : emit_insn (gen_rintv4sf2 (op0, op1));
1911 :
1912 123 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1913 123 : DONE;
1914 122 : })
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 8 :
1927 1 : emit_insn (gen_lrintv4sfv4si2 (op0, op1));
1928 8 :
1929 9 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
1930 9 : 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 4 :
1944 1 : emit_insn (gen_ceilv4sf2 (op0, op1));
1945 4 :
1946 5 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1947 5 : 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 0 :
1961 1 : emit_insn (gen_lceilv4sfv4si2 (op0, op1));
1962 0 :
1963 1 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
1964 1 : 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 5 :
1978 2 : emit_insn (gen_floorv4sf2 (op0, op1));
1979 5 :
1980 7 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
1981 2 : DONE;
1982 : })
1983 :
1984 5 : (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 10 : {
1990 1 : rtx op1 = gen_reg_rtx (V4SFmode);
1991 10 : rtx op0 = gen_reg_rtx (V4SImode);
1992 9 :
1993 10 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
1994 0 :
1995 1 : emit_insn (gen_lfloorv4sfv4si2 (op0, op1));
1996 0 :
1997 1 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
1998 1 : DONE;
1999 : })
2000 :
2001 0 : (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 5 : {
2007 1 : rtx op1 = gen_reg_rtx (V4SFmode);
2008 5 : rtx op0 = gen_reg_rtx (V4SFmode);
2009 4 :
2010 5 : 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 0 : (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 2 : {
2024 1 : rtx op1 = gen_reg_rtx (V4SFmode);
2025 2 : rtx op0 = gen_reg_rtx (V4SFmode);
2026 1 :
2027 2 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
2028 12 :
2029 1 : emit_insn (gen_roundv4sf2 (op0, op1));
2030 12 :
2031 13 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
2032 13 : 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 4 :
2046 1 : emit_insn (gen_lroundv4sfv4si2 (op0, op1));
2047 4 :
2048 5 : emit_move_insn (operands[0], lowpart_subreg (V2SImode, op0, V4SImode));
2049 5 : DONE;
2050 : })
2051 :
2052 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2053 : ;;
2054 : ;; Parallel half-precision floating point arithmetic
2055 : ;;
2056 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2057 :
2058 : (define_mode_iterator VHF_32_64 [V2HF (V4HF "TARGET_MMX_WITH_SSE")])
2059 :
2060 : (define_mode_iterator VBF_32_64 [V2BF (V4BF "TARGET_MMX_WITH_SSE")])
2061 :
2062 4 : (define_expand "divv4hf3"
2063 : [(set (match_operand:V4HF 0 "register_operand")
2064 4 : (div:V4HF
2065 4 : (match_operand:V4HF 1 "nonimmediate_operand")
2066 4 : (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 8 : emit_insn (gen_movq_v4hf_to_sse (op1, operands[1]));
2075 8 : rtx tmp = gen_rtx_VEC_CONCAT (V8HFmode, operands[2],
2076 : force_reg (V4HFmode, CONST1_RTX (V4HFmode)));
2077 8 : emit_insn (gen_rtx_SET (op2, tmp));
2078 8 : 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 2 : (V2SF "v4sf") (V2SI "v4si")])
2095 :
2096 2 : (define_expand "movd_<mode>_to_sse"
2097 2 : [(set (match_operand:<mmxxmmmode> 0 "register_operand")
2098 2 : (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 6 : (plusminusmult:VHF_32_64
2127 : (match_operand:VHF_32_64 1 "nonimmediate_operand")
2128 6 : (match_operand:VHF_32_64 2 "nonimmediate_operand")))]
2129 6 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2130 39 : {
2131 37 : 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 :
2139 37 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2140 37 : DONE;
2141 : })
2142 :
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 26 : "TARGET_AVX10_2"
2150 10 : {
2151 15 : rtx op0 = gen_reg_rtx (V8BFmode);
2152 10 : rtx op1 = lowpart_subreg (V8BFmode,
2153 : force_reg (<MODE>mode, operands[1]), <MODE>mode);
2154 16 : rtx op2 = lowpart_subreg (V8BFmode,
2155 : force_reg (<MODE>mode, operands[2]), <MODE>mode);
2156 11 :
2157 21 : emit_insn (gen_<insn>v8bf3 (op0, op1, op2));
2158 11 :
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 5 : 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 13 : emit_insn (gen_divv8hf3 (op0, op1, op2));
2178 8 :
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 4 : 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 2 : force_reg (<MODE>mode, operands[2]), <MODE>mode);
2215 :
2216 6 : emit_insn (gen_<code>v8bf3 (op0, op1, op2));
2217 2 :
2218 6 : 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 6 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2234 3 : DONE;
2235 4 : })
2236 5 :
2237 4 : (define_expand "sqrt<mode>2"
2238 1 : [(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 3 :
2248 1 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8BFmode));
2249 3 : DONE;
2250 4 : })
2251 3 :
2252 1 : (define_mode_iterator VHBF_32_64
2253 18 : [V2BF (V4BF "TARGET_MMX_WITH_SSE")
2254 51 : V2HF (V4HF "TARGET_MMX_WITH_SSE")])
2255 24 :
2256 : (define_expand "<code><mode>2"
2257 95 : [(set (match_operand:VHBF_32_64 0 "register_operand")
2258 4844 : (absneg:VHBF_32_64
2259 2514 : (match_operand:VHBF_32_64 1 "register_operand")))]
2260 2698 : "TARGET_SSE"
2261 434 : "ix86_expand_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
2262 4504 :
2263 2 : (define_insn_and_split "*mmx_<code><mode>"
2264 : [(set (match_operand:VHBF_32_64 0 "register_operand" "=x,x,x")
2265 2 : (absneg:VHBF_32_64
2266 0 : (match_operand:VHBF_32_64 1 "register_operand" "0,x,x")))
2267 2 : (use (match_operand:VHBF_32_64 2 "register_operand" "x,0,x"))]
2268 64 : "TARGET_SSE"
2269 0 : "#"
2270 4 : "&& reload_completed"
2271 : [(set (match_dup 0)
2272 36 : (<absneg_op>:<MODE> (match_dup 1) (match_dup 2)))]
2273 38 : {
2274 33 : if (!TARGET_AVX && operands_match_p (operands[0], operands[2]))
2275 42 : std::swap (operands[1], operands[2]);
2276 9 : }
2277 2 : [(set_attr "isa" "noavx,noavx,avx")])
2278 7 :
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 0 : "TARGET_SSE"
2286 0 : "#"
2287 0 : "&& reload_completed"
2288 53 : [(set (match_dup 0)
2289 0 : (ior:<MODE> (match_dup 1) (match_dup 2)))])
2290 53 :
2291 53 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2292 53 : ;;
2293 0 : ;; Parallel half-precision floating point comparisons
2294 0 : ;;
2295 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2296 :
2297 : (define_expand "vec_cmpv4hfqi"
2298 0 : [(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 : "TARGET_MMX_WITH_SSE && TARGET_AVX512FP16 && TARGET_AVX512VL
2303 37 : && ix86_partial_vec_fp_math"
2304 17 : {
2305 54 : rtx ops[4];
2306 54 : ops[3] = gen_reg_rtx (V8HFmode);
2307 54 : 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 25 : emit_insn (gen_vcond_mask_<mmxxmmmodelower>qi (op0, operands[1],
2340 : operands[2], operands[3]));
2341 25 : emit_move_insn (operands[0],
2342 3 : lowpart_subreg (<MODE>mode, op0, <mmxxmmmode>mode));
2343 25 : 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 29 : emit_insn (gen_vcond_mask_<mmxxmmmodelower>qi (op0, operands[1],
2358 : operands[2], operands[3]));
2359 29 : emit_move_insn (operands[0],
2360 28 : lowpart_subreg (<MODE>mode, op0, <mmxxmmmode>mode));
2361 29 : 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 2 :
2376 17 : emit_insn (gen_movd_v2hf_to_sse (ops[3], operands[3]));
2377 19 : emit_insn (gen_movd_v2hf_to_sse (ops[2], operands[2]));
2378 19 : emit_insn (gen_vec_cmpv8hfqi (operands[0], operands[1], ops[2], ops[3]));
2379 19 : 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 1 : })
2394 :
2395 1 : (define_expand "vcond_mask_<mode>qi"
2396 1 : [(set (match_operand:V2FI_32 0 "register_operand")
2397 1 : (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 1 : force_reg (<MODE>mode, operands[3]), <MODE>mode);
2425 :
2426 11 : emit_insn (gen_vec_cmpv8bfqi (operands[0], operands[1], op2, op3));
2427 11 : DONE;
2428 1 : })
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 1 : && !flag_trapping_math"
2442 2 : {
2443 3 : rtx op1 = gen_reg_rtx (V8HFmode);
2444 3 : rtx op0 = gen_reg_rtx (V8HFmode);
2445 1 :
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 2 : 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 3 : 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 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2546 2 : emit_insn (gen_ceilv8hf2 (op0, op1));
2547 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2548 0 :
2549 2 : 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 2 : emit_insn (gen_mov<mov_to_sse_suffix>_<mode>_to_sse (op1, operands[1]));
2563 0 : emit_insn (gen_lceilv8hfv8hi2 (op0, op1));
2564 2 : emit_move_insn (operands[0], lowpart_subreg (<MODE>mode, op0, V8HFmode));
2565 2 :
2566 2 : 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 2 : "TARGET_SSE"
2616 0 : "@
2617 0 : andnps\t{%2, %0|%0, %2}
2618 : vandnps\t{%2, %1, %0|%0, %1, %2}"
2619 2 : [(set_attr "isa" "noavx,avx")
2620 2 : (set_attr "type" "sselog")
2621 : (set_attr "prefix" "orig,vex")
2622 2 : (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 47 : "TARGET_SSE"
2630 24 : "@
2631 : <logic>ps\t{%2, %0|%0, %2}
2632 : v<logic>ps\t{%2, %1, %0|%0, %1, %2}"
2633 56 : [(set_attr "isa" "noavx,avx")
2634 56 : (set_attr "type" "sselog,sselog")
2635 42 : (set_attr "prefix" "orig,vex")
2636 : (set_attr "mode" "V4SF")])
2637 42 :
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 4 : {
2665 2 : operands[3] = ix86_build_signbit_mask (<MODE>mode, true, false);
2666 :
2667 2 : operands[4] = gen_reg_rtx (<MODE>mode);
2668 : })
2669 2 :
2670 : (define_expand "signbit<mode>2"
2671 2 : [(set (match_operand:<mmxintvecmode> 0 "register_operand")
2672 4 : (lshiftrt:<mmxintvecmode>
2673 2 : (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 5 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2683 : ;;
2684 5 : ;; Parallel half-precision FMA multiply/accumulate instructions.
2685 5 : ;;
2686 5 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 4 : (match_operand:VHF_32_64 3 "nonimmediate_operand")))]
2694 : "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
2695 7 : {
2696 7 : rtx op3 = gen_reg_rtx (V8HFmode);
2697 7 : 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 2 : rtx op0 = gen_reg_rtx (V8BFmode);
2861 2 : rtx op1 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[1]), <MODE>mode);
2862 4 : 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 6 : 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 4 :
2885 6 : emit_insn (gen_fnmav8bf4 (op0, op1, op2, op3));
2886 4 :
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 6 : 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 6 : rtx op3 = lowpart_subreg (V8BFmode, force_reg (<MODE>mode, operands[3]), <MODE>mode);
2905 4 :
2906 6 : 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 2 : && TARGET_MMX_WITH_SSE"
2925 1 : {
2926 3 : rtx op3 = gen_reg_rtx (V8HFmode);
2927 3 : rtx op2 = gen_reg_rtx (V8HFmode);
2928 3 : 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 9 : 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 2 : rtx op1 = gen_reg_rtx (V8HFmode);
3034 2 : rtx op0 = gen_reg_rtx (V4SImode);
3035 :
3036 8 : emit_insn (gen_movd_v2hf_to_sse (op1, operands[1]));
3037 :
3038 8 : emit_insn (gen_avx512fp16_fix<fixunssuffix>_truncv4si2 (op0, op1));
3039 6 :
3040 8 : 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 4 : = gen_mov<mov_to_sse_suffix>_<mmxintvecmodelower>_to_sse;
3055 8 : emit_insn (gen_movd_sse (op1, operands[1]));
3056 4 :
3057 12 : emit_insn (gen_float<floatunssuffix>v8hiv8hf2 (op0, op1));
3058 4 :
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 107 : emit_insn (gen_movq_v2si_to_sse (op1, operands[1]));
3075 :
3076 107 : emit_insn (gen_avx512fp16_float<floatunssuffix>v4siv4hf2 (op0, op1));
3077 105 :
3078 107 : 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 6 : emit_insn (gen_movd_v2hf_to_sse (op1, operands[1]));
3093 9 :
3094 6 : emit_insn (gen_avx512fp16_float_extend_phv4sf2 (op0, op1));
3095 14 :
3096 6 : emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
3097 10 : 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 1 : emit_insn (gen_movq_v2sf_to_sse (op1, operands[1]));
3111 0 :
3112 1 : emit_insn (gen_avx512fp16_truncv4sfv4hf2 (op0, op1));
3113 0 :
3114 1 : 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 35 : rtx op1 = gen_reg_rtx (V4SFmode);
3129 2 : rtx op0 = gen_reg_rtx (V4BFmode);
3130 33 :
3131 35 : emit_move_insn (op1, lowpart_subreg (V4SFmode,
3132 33 : 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 33 : (match_operand:MMXMODEI 1 "register_operand")))]
3169 : "TARGET_MMX_WITH_SSE"
3170 129 : "operands[2] = force_reg (<MODE>mode, CONST0_RTX (<MODE>mode));")
3171 33 :
3172 33 : (define_expand "neg<mode>2"
3173 : [(set (match_operand:VI_32 0 "register_operand")
3174 96 : (minus:VI_32
3175 : (match_dup 2)
3176 : (match_operand:VI_32 1 "register_operand")))]
3177 : "TARGET_SSE2"
3178 110 : "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 109 : (match_operand:V2QI 1 "register_operand" "0,Yw")))
3184 : (clobber (reg:CC FLAGS_REG))]
3185 225 : "!TARGET_PARTIAL_REG_STALL || optimize_size || TARGET_SSE2"
3186 131 : "#"
3187 122 : [(set_attr "isa" "*,sse2")
3188 13 : (set_attr "type" "multi")
3189 : (set_attr "mode" "QI,TI")
3190 : (set (attr "enabled")
3191 46 : (cond [(and (eq_attr "alternative" "0")
3192 : (and (match_test "TARGET_PARTIAL_REG_STALL")
3193 38146 : (not (match_test "optimize_function_for_size_p (cfun)"))))
3194 38147 : (symbol_ref "false")
3195 47 : ]
3196 5873 : (const_string "*")))])
3197 5874 :
3198 1 : (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 9 : "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
3204 9 : && reload_completed"
3205 9 : [(parallel
3206 9 : [(set (strict_low_part (match_dup 0))
3207 0 : (neg:QI (match_dup 1)))
3208 9 : (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 0 : "TARGET_SSE2 && reload_completed"
3231 : [(set (match_dup 0) (match_dup 2))
3232 0 : (set (match_dup 0)
3233 : (minus:V16QI (match_dup 0) (match_dup 1)))]
3234 3562 : {
3235 3571 : operands[2] = CONST0_RTX (V16QImode);
3236 0 : operands[1] = lowpart_subreg (V16QImode, operands[1], V2QImode);
3237 54 : operands[0] = lowpart_subreg (V16QImode, operands[0], V2QImode);
3238 108 : })
3239 :
3240 : (define_expand "mmx_<insn><mode>3"
3241 51 : [(set (match_operand:MMXMODEI8 0 "register_operand")
3242 : (plusminus:MMXMODEI8
3243 51 : (match_operand:MMXMODEI8 1 "register_mmxmem_operand")
3244 0 : (match_operand:MMXMODEI8 2 "register_mmxmem_operand")))]
3245 51 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3246 254 : "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
3247 :
3248 : (define_expand "<insn><mode>3"
3249 : [(set (match_operand:MMXMODEI 0 "register_operand")
3250 380 : (plusminus:MMXMODEI
3251 : (match_operand:MMXMODEI 1 "register_operand")
3252 126 : (match_operand:MMXMODEI 2 "register_operand")))]
3253 126 : "TARGET_MMX_WITH_SSE")
3254 254 :
3255 : (define_insn "*mmx_<insn><mode>3"
3256 : [(set (match_operand:MMXMODEI8 0 "register_operand" "=y,x,<Yv_Yw>")
3257 126 : (plusminus:MMXMODEI8
3258 : (match_operand:MMXMODEI8 1 "register_mmxmem_operand"
3259 10748 : "<comm>0,0,<Yv_Yw>")
3260 168 : (match_operand:MMXMODEI8 2 "register_mmxmem_operand"
3261 10748 : "ym,x,<Yv_Yw>")))]
3262 22290 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3263 128003 : && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
3264 56015 : "@
3265 35 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3266 10783 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3267 167576 : vp<plusminus_mnemonic><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3268 167576 : [(set_attr "isa" "*,sse2_noavx,avx")
3269 167576 : (set_attr "mmx_isa" "native,*,*")
3270 : (set_attr "type" "mmxadd,sseadd,sseadd")
3271 284703 : (set_attr "mode" "DI,TI,TI")])
3272 :
3273 173 : (define_insn "<insn><mode>3"
3274 173 : [(set (match_operand:VI_32 0 "register_operand" "=x,Yw")
3275 173 : (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 10428 : "TARGET_SSE2"
3279 5459 : "@
3280 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3281 : vp<plusminus_mnemonic><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3282 13684 : [(set_attr "isa" "noavx,avx")
3283 1698 : (set_attr "type" "sseadd")
3284 11986 : (set_attr "mode" "TI")])
3285 1698 :
3286 13684 : (define_insn "<insn>v2qi3"
3287 : [(set (match_operand:V2QI 0 "register_operand" "=?Q,x,Yw")
3288 1698 : (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 2194 : "!TARGET_PARTIAL_REG_STALL || optimize_size || TARGET_SSE2"
3293 768 : "#"
3294 560 : [(set_attr "isa" "*,sse2_noavx,avx")
3295 560 : (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 8005630 : (and (match_test "TARGET_PARTIAL_REG_STALL")
3300 7839 : (not (match_test "optimize_function_for_size_p (cfun)"))))
3301 7847 : (symbol_ref "false")
3302 172 : ]
3303 119844 : (const_string "*")))])
3304 7692 :
3305 17 : (define_split
3306 7709 : [(set (match_operand:V2QI 0 "general_reg_operand")
3307 : (plusminus:V2QI
3308 1871 : (match_operand:V2QI 1 "general_reg_operand")
3309 1871 : (match_operand:V2QI 2 "general_reg_operand")))
3310 15 : (clobber (reg:CC FLAGS_REG))]
3311 2002 : "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
3312 183 : && reload_completed"
3313 3880 : [(parallel
3314 960 : [(set (strict_low_part (match_dup 0))
3315 51 : (plusminus:QI (match_dup 1) (match_dup 2)))
3316 51 : (clobber (reg:CC FLAGS_REG))])
3317 960 : (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 168 : {
3331 168 : operands[5] = lowpart_subreg (HImode, operands[2], V2QImode);
3332 168 : operands[4] = lowpart_subreg (HImode, operands[1], V2QImode);
3333 168 : operands[3] = lowpart_subreg (HImode, operands[0], V2QImode);
3334 168 : operands[2] = lowpart_subreg (QImode, operands[2], V2QImode);
3335 168 : operands[1] = lowpart_subreg (QImode, operands[1], V2QImode);
3336 168 : operands[0] = lowpart_subreg (QImode, operands[0], V2QImode);
3337 : })
3338 :
3339 : (define_split
3340 168 : [(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 51 : "TARGET_SSE2 && reload_completed"
3346 : [(set (match_dup 0)
3347 51 : (plusminus:V16QI (match_dup 1) (match_dup 2)))]
3348 51 : {
3349 2989908 : operands[2] = lowpart_subreg (V16QImode, operands[2], V2QImode);
3350 1571628 : operands[1] = lowpart_subreg (V16QImode, operands[1], V2QImode);
3351 1418499 : operands[0] = lowpart_subreg (V16QImode, operands[0], V2QImode);
3352 1418448 : })
3353 77 :
3354 77 : (define_expand "mmx_<insn><mode>3"
3355 478 : [(set (match_operand:MMXMODE12 0 "register_operand")
3356 22 : (sat_plusminus:MMXMODE12
3357 504 : (match_operand:MMXMODE12 1 "register_mmxmem_operand")
3358 393 : (match_operand:MMXMODE12 2 "register_mmxmem_operand")))]
3359 444 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3360 208 : "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 278 : (sat_plusminus:MMXMODE12
3365 : (match_operand:MMXMODE12 1 "register_operand")
3366 2 : (match_operand:MMXMODE12 2 "register_operand")))]
3367 2 : "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 2 : (sat_plusminus:MMXMODE12
3372 : (match_operand:MMXMODE12 1 "register_mmxmem_operand" "<comm>0,0,Yw")
3373 97 : (match_operand:MMXMODE12 2 "register_mmxmem_operand" "ym,x,Yw")))]
3374 36 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3375 1811 : && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
3376 131 : "@
3377 68 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3378 34 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3379 1041 : vp<plusminus_mnemonic><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3380 1063 : [(set_attr "isa" "*,sse2_noavx,avx")
3381 26 : (set_attr "mmx_isa" "native,*,*")
3382 : (set_attr "type" "mmxadd,sseadd,sseadd")
3383 1 : (set_attr "mode" "DI,TI,TI")])
3384 :
3385 1324 : (define_insn "<insn><mode>3"
3386 39 : [(set (match_operand:VI_16_32 0 "register_operand" "=x,Yw")
3387 1324 : (sat_plusminus:VI_16_32
3388 1377 : (match_operand:VI_16_32 1 "register_operand" "<comm>0,Yw")
3389 999 : (match_operand:VI_16_32 2 "register_operand" "x,Yw")))]
3390 206 : "TARGET_SSE2"
3391 14 : "@
3392 378 : p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}
3393 17 : vp<plusminus_mnemonic><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3394 445 : [(set_attr "isa" "noavx,avx")
3395 445 : (set_attr "type" "sseadd")
3396 : (set_attr "mode" "TI")])
3397 46 :
3398 337 : (define_insn "mulv2si3"
3399 16097 : [(set (match_operand:V2SI 0 "register_operand" "=Yr,*x,v")
3400 14639 : (mult:V2SI
3401 14304 : (match_operand:V2SI 1 "register_operand" "%0,0,v")
3402 1462 : (match_operand:V2SI 2 "register_operand" "Yr,*x,v")))]
3403 7552 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
3404 637 : "@
3405 349027 : pmulld\t{%2, %0|%0, %2}
3406 347970 : pmulld\t{%2, %0|%0, %2}
3407 353407 : vpmulld\t{%2, %1, %0|%0, %1, %2}"
3408 6491 : [(set_attr "isa" "noavx,noavx,avx")
3409 : (set_attr "type" "sseimul")
3410 9596 : (set_attr "prefix_extra" "1")
3411 196 : (set_attr "prefix" "orig,orig,vex")
3412 524 : (set_attr "btver2_decode" "vector")
3413 0 : (set_attr "mode" "TI")])
3414 0 :
3415 0 : (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 3963 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3433 3985 : && ix86_binary_operator_ok (MULT, V4HImode, operands)"
3434 1474 : "@
3435 22 : pmullw\t{%2, %0|%0, %2}
3436 22 : pmullw\t{%2, %0|%0, %2}
3437 12240 : vpmullw\t{%2, %1, %0|%0, %1, %2}"
3438 12218 : [(set_attr "isa" "*,sse2_noavx,avx")
3439 : (set_attr "mmx_isa" "native,*,*")
3440 12218 : (set_attr "type" "mmxmul,ssemul,ssemul")
3441 : (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 : (match_operand:V2HI 2 "register_operand" "x,Yw")))]
3447 9922 : "TARGET_SSE2"
3448 2296 : "@
3449 : 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 : (set_attr "mode" "TI")])
3454 :
3455 405756 : (define_expand "mulv8qi3"
3456 405756 : [(set (match_operand:V8QI 0 "register_operand")
3457 405756 : (mult:V8QI (match_operand:V8QI 1 "register_operand")
3458 : (match_operand:V8QI 2 "register_operand")))]
3459 224632 : "TARGET_MMX_WITH_SSE"
3460 224991 : {
3461 359 : ix86_expand_vecop_qihi_partial (MULT, operands[0], operands[1], operands[2]);
3462 46060 : DONE;
3463 45701 : })
3464 45701 :
3465 45701 : (define_expand "mulv4qi3"
3466 45701 : [(set (match_operand:V4QI 0 "register_operand")
3467 45701 : (mult:V4QI (match_operand:V4QI 1 "register_operand")
3468 : (match_operand:V4QI 2 "register_operand")))]
3469 21961 : "TARGET_SSE2"
3470 22899 : {
3471 22899 : ix86_expand_vecop_qihi_partial (MULT, operands[0], operands[1], operands[2]);
3472 938 : DONE;
3473 : })
3474 42846 :
3475 : (define_expand "mmx_smulv4hi3_highpart"
3476 11 : [(set (match_operand:V4HI 0 "register_operand")
3477 : (truncate:V4HI
3478 11 : (lshiftrt:V4SI
3479 11 : (mult:V4SI
3480 : (sign_extend:V4SI
3481 : (match_operand:V4HI 1 "register_mmxmem_operand"))
3482 : (sign_extend:V4SI
3483 11 : (match_operand:V4HI 2 "register_mmxmem_operand")))
3484 : (const_int 16))))]
3485 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3486 56 : "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
3487 :
3488 38 : (define_insn "*mmx_smulv4hi3_highpart"
3489 22 : [(set (match_operand:V4HI 0 "register_operand" "=y,x,Yw")
3490 72 : (truncate:V4HI
3491 16 : (lshiftrt:V4SI
3492 : (mult:V4SI
3493 : (sign_extend:V4SI
3494 16 : (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 196 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3499 196 : && 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 27 : vpmulhw\t{%2, %1, %0|%0, %1, %2}"
3504 27 : [(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 248 : && ix86_binary_operator_ok (MULT, V4HImode, operands)"
3536 0 : "@
3537 1 : pmulhuw\t{%2, %0|%0, %2}
3538 1 : pmulhuw\t{%2, %0|%0, %2}
3539 5 : vpmulhuw\t{%2, %1, %0|%0, %1, %2}"
3540 5 : [(set_attr "isa" "*,sse2_noavx,avx")
3541 : (set_attr "mmx_isa" "native,*,*")
3542 1 : (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 17 : (truncate:V4HI
3548 : (lshiftrt:V4SI
3549 17 : (mult:V4SI
3550 17 : (any_extend:V4SI
3551 : (match_operand:V4HI 1 "register_operand"))
3552 : (any_extend:V4SI
3553 17 : (match_operand:V4HI 2 "register_operand")))
3554 : (const_int 16))))]
3555 : "TARGET_MMX_WITH_SSE")
3556 :
3557 : (define_insn "<s>mulv2hi3_highpart"
3558 1219 : [(set (match_operand:V2HI 0 "register_operand" "=x,Yw")
3559 : (truncate:V2HI
3560 1219 : (lshiftrt:V2SI
3561 1219 : (mult:V2SI
3562 : (any_extend:V2SI
3563 : (match_operand:V2HI 1 "register_operand" "%0,Yw"))
3564 : (any_extend:V2SI
3565 1219 : (match_operand:V2HI 2 "register_operand" "x,Yw")))
3566 : (const_int 16))))]
3567 10 : "TARGET_SSE2"
3568 0 : "@
3569 : pmulh<u>w\t{%2, %0|%0, %2}
3570 43 : vpmulh<u>w\t{%2, %1, %0|%0, %1, %2}"
3571 : [(set_attr "isa" "noavx,avx")
3572 43 : (set_attr "type" "ssemul")
3573 43 : (set_attr "mode" "TI")])
3574 43 :
3575 3690 : (define_expand "mmx_pmaddwd"
3576 3690 : [(set (match_operand:V2SI 0 "register_operand")
3577 : (plus:V2SI
3578 : (mult:V2SI
3579 2384 : (sign_extend:V2SI
3580 494 : (vec_select:V2HI
3581 2137 : (match_operand:V4HI 1 "register_mmxmem_operand")
3582 : (parallel [(const_int 0) (const_int 2)])))
3583 94 : (sign_extend:V2SI
3584 94 : (vec_select:V2HI
3585 : (match_operand:V4HI 2 "register_mmxmem_operand")
3586 94 : (parallel [(const_int 0) (const_int 2)]))))
3587 94 : (mult:V2SI
3588 94 : (sign_extend:V2SI
3589 : (vec_select:V2HI (match_dup 1)
3590 94 : (parallel [(const_int 1) (const_int 3)])))
3591 94 : (sign_extend:V2SI
3592 94 : (vec_select:V2HI (match_dup 2)
3593 : (parallel [(const_int 1) (const_int 3)]))))))]
3594 94 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3595 128 : "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
3596 94 :
3597 94 : (define_insn "*mmx_pmaddwd"
3598 : [(set (match_operand:V2SI 0 "register_operand" "=y,x,Yw")
3599 128 : (plus:V2SI
3600 94 : (mult:V2SI
3601 94 : (sign_extend:V2SI
3602 : (vec_select:V2HI
3603 94 : (match_operand:V4HI 1 "register_mmxmem_operand" "%0,0,Yw")
3604 94 : (parallel [(const_int 0) (const_int 2)])))
3605 94 : (sign_extend:V2SI
3606 : (vec_select:V2HI
3607 94 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw")
3608 94 : (parallel [(const_int 0) (const_int 2)]))))
3609 94 : (mult:V2SI
3610 34 : (sign_extend:V2SI
3611 94 : (vec_select:V2HI (match_dup 1)
3612 94 : (parallel [(const_int 1) (const_int 3)])))
3613 94 : (sign_extend:V2SI
3614 94 : (vec_select:V2HI (match_dup 2)
3615 346 : (parallel [(const_int 1) (const_int 3)]))))))]
3616 275 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3617 527 : && ix86_binary_operator_ok (MULT, V4HImode, operands)"
3618 433 : "@
3619 : pmaddwd\t{%2, %0|%0, %2}
3620 87 : pmaddwd\t{%2, %0|%0, %2}
3621 87 : vpmaddwd\t{%2, %1, %0|%0, %1, %2}"
3622 339 : [(set_attr "isa" "*,sse2_noavx,avx")
3623 : (set_attr "mmx_isa" "native,*,*")
3624 87 : (set_attr "type" "mmxmul,sseiadd,sseiadd")
3625 1650055 : (set_attr "c86_attr" "madd")
3626 1650055 : (set_attr "mode" "DI,TI,TI")])
3627 1650142 :
3628 1650048 : (define_expand "mmx_pmulhrwv4hi3"
3629 1649968 : [(set (match_operand:V4HI 0 "register_operand")
3630 1650048 : (truncate:V4HI
3631 1649968 : (lshiftrt:V4SI
3632 80 : (plus:V4SI
3633 1247155 : (mult:V4SI
3634 1247155 : (sign_extend:V4SI
3635 1247155 : (match_operand:V4HI 1 "nonimmediate_operand"))
3636 1247155 : (sign_extend:V4SI
3637 1247155 : (match_operand:V4HI 2 "nonimmediate_operand")))
3638 : (const_vector:V4SI [(const_int 32768) (const_int 32768)
3639 1116636 : (const_int 32768) (const_int 32768)]))
3640 1116636 : (const_int 16))))]
3641 1116636 : "TARGET_3DNOW"
3642 1116650 : "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
3643 1116636 :
3644 1116636 : (define_insn "*mmx_pmulhrwv4hi3"
3645 1116636 : [(set (match_operand:V4HI 0 "register_operand" "=y")
3646 1116650 : (truncate:V4HI
3647 1116636 : (lshiftrt:V4SI
3648 1116636 : (plus:V4SI
3649 1116636 : (mult:V4SI
3650 1116636 : (sign_extend:V4SI
3651 1116636 : (match_operand:V4HI 1 "nonimmediate_operand" "%0"))
3652 1116636 : (sign_extend:V4SI
3653 : (match_operand:V4HI 2 "nonimmediate_operand" "ym")))
3654 4810 : (const_vector:V4SI [(const_int 32768) (const_int 32768)
3655 4796 : (const_int 32768) (const_int 32768)]))
3656 : (const_int 16))))]
3657 4883 : "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V4HImode, operands)"
3658 8 : "pmulhrw\t{%2, %0|%0, %2}"
3659 : [(set_attr "type" "mmxmul")
3660 354 : (set_attr "prefix_extra" "1")
3661 1460 : (set_attr "mode" "DI")])
3662 1814 :
3663 1460 : (define_expand "sse2_umulv1siv1di3"
3664 354 : [(set (match_operand:V1DI 0 "register_operand")
3665 1460 : (mult:V1DI
3666 1460 : (zero_extend:V1DI
3667 : (vec_select:V1SI
3668 1424 : (match_operand:V2SI 1 "register_mmxmem_operand")
3669 1424 : (parallel [(const_int 0)])))
3670 1424 : (zero_extend:V1DI
3671 : (vec_select:V1SI
3672 1424 : (match_operand:V2SI 2 "register_mmxmem_operand")
3673 1424 : (parallel [(const_int 0)])))))]
3674 1424 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE2"
3675 1436 : "ix86_fixup_binary_operands_no_copy (MULT, V2SImode, operands);")
3676 1424 :
3677 : (define_insn "*sse2_umulv1siv1di3"
3678 373 : [(set (match_operand:V1DI 0 "register_operand" "=y,x,Yv")
3679 385 : (mult:V1DI
3680 : (zero_extend:V1DI
3681 242 : (vec_select:V1SI
3682 : (match_operand:V2SI 1 "register_mmxmem_operand" "%0,0,Yv")
3683 : (parallel [(const_int 0)])))
3684 373 : (zero_extend:V1DI
3685 12 : (vec_select:V1SI
3686 : (match_operand:V2SI 2 "register_mmxmem_operand" "ym,x,Yv")
3687 : (parallel [(const_int 0)])))))]
3688 65 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3689 65 : && TARGET_SSE2
3690 89 : && ix86_binary_operator_ok (MULT, V2SImode, operands)"
3691 1 : "@
3692 24 : pmuludq\t{%2, %0|%0, %2}
3693 24 : pmuludq\t{%2, %0|%0, %2}
3694 : vpmuludq\t{%2, %1, %0|%0, %1, %2}"
3695 : [(set_attr "isa" "*,sse2_noavx,avx")
3696 24 : (set_attr "mmx_isa" "native,*,*")
3697 : (set_attr "type" "mmxmul,ssemul,ssemul")
3698 95607 : (set_attr "mode" "DI,TI,TI")])
3699 95607 :
3700 95607 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3701 256 : ;;
3702 13034 : ;; Parallel integral shifts
3703 13290 : ;;
3704 13290 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3705 13034 :
3706 13034 : (define_insn "<code><mode>3"
3707 : [(set (match_operand:MMXMODE14 0 "register_operand" "=Yr,*x,Yv")
3708 1801 : (smaxmin:MMXMODE14
3709 1545 : (match_operand:MMXMODE14 1 "register_operand" "%0,0,Yv")
3710 : (match_operand:MMXMODE14 2 "register_operand" "Yr,*x,Yv")))]
3711 525 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
3712 : "@
3713 1451 : p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
3714 : p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
3715 688 : vp<maxmin_int><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3716 189 : [(set_attr "isa" "noavx,noavx,avx")
3717 32 : (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 109 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3737 543 : && (TARGET_SSE || TARGET_3DNOW_A)
3738 998 : && 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 169 : vp<maxmin_int>w\t{%2, %1, %0|%0, %1, %2}"
3743 407 : [(set_attr "isa" "*,sse2_noavx,avx")
3744 63 : (set_attr "mmx_isa" "native,*,*")
3745 364 : (set_attr "type" "mmxadd,sseiadd,sseiadd")
3746 0 : (set_attr "mode" "DI,TI,TI")])
3747 301 :
3748 : (define_expand "<code>v4hi3"
3749 63 : [(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 306 :
3755 : (define_insn "<code><mode>3"
3756 306 : [(set (match_operand:VI1_16_32 0 "register_operand" "=Yr,*x,Yv")
3757 306 : (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 106 : "TARGET_SSE4_1"
3761 306 : "@
3762 : p<maxmin_int>b\t{%2, %0|%0, %2}
3763 : p<maxmin_int>b\t{%2, %0|%0, %2}
3764 184 : vp<maxmin_int>b\t{%2, %1, %0|%0, %1, %2}"
3765 10 : [(set_attr "isa" "noavx,noavx,avx")
3766 18 : (set_attr "type" "sseiadd")
3767 : (set_attr "prefix_extra" "1")
3768 18 : (set_attr "prefix" "orig,orig,vex")
3769 18 : (set_attr "mode" "TI")])
3770 18 :
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 174 : "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 210218 : [(set (match_operand:MMXMODE24 0 "register_operand" "=Yr,*x,Yv")
3786 210218 : (umaxmin:MMXMODE24
3787 117599 : (match_operand:MMXMODE24 1 "register_operand" "%0,0,Yv")
3788 1593 : (match_operand:MMXMODE24 2 "register_operand" "Yr,*x,Yv")))]
3789 1819 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
3790 0 : "@
3791 125790 : p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
3792 125790 : p<maxmin_int><mmxvecsize>\t{%2, %0|%0, %2}
3793 125937 : vp<maxmin_int><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3794 280 : [(set_attr "isa" "noavx,noavx,avx")
3795 : (set_attr "type" "sseiadd")
3796 : (set_attr "prefix_extra" "1")
3797 221563 : (set_attr "prefix" "orig,orig,vex")
3798 221563 : (set_attr "mode" "TI")])
3799 221563 :
3800 : (define_expand "mmx_<code>v8qi3"
3801 : [(set (match_operand:V8QI 0 "register_operand")
3802 : (umaxmin:V8QI
3803 3757533 : (match_operand:V8QI 1 "register_mmxmem_operand")
3804 3757533 : (match_operand:V8QI 2 "register_mmxmem_operand")))]
3805 3757533 : "(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 1448095 : (define_insn "*mmx_<code>v8qi3"
3810 1448095 : [(set (match_operand:V8QI 0 "register_operand" "=y,x,Yw")
3811 1448139 : (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 280 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
3815 324 : && (TARGET_SSE || TARGET_3DNOW_A)
3816 4730546 : && ix86_binary_operator_ok (<CODE>, V8QImode, operands)"
3817 4730266 : "@
3818 : p<maxmin_int>b\t{%2, %0|%0, %2}
3819 : p<maxmin_int>b\t{%2, %0|%0, %2}
3820 290 : vp<maxmin_int>b\t{%2, %1, %0|%0, %1, %2}"
3821 1538547 : [(set_attr "isa" "*,sse2_noavx,avx")
3822 1538421 : (set_attr "mmx_isa" "native,*,*")
3823 1538421 : (set_attr "type" "mmxadd,sseiadd,sseiadd")
3824 0 : (set_attr "mode" "DI,TI,TI")])
3825 0 :
3826 : (define_expand "<code>v8qi3"
3827 2411 : [(set (match_operand:V8QI 0 "register_operand")
3828 2329 : (umaxmin:V8QI
3829 2329 : (match_operand:V8QI 1 "register_operand")
3830 : (match_operand:V8QI 2 "register_operand")))]
3831 : "TARGET_MMX_WITH_SSE")
3832 :
3833 1219 : (define_insn "<code><mode>3"
3834 1219 : [(set (match_operand:VI1_16_32 0 "register_operand" "=x,Yw")
3835 1219 : (umaxmin:VI1_16_32
3836 1219 : (match_operand:VI1_16_32 1 "register_operand" "%0,Yw")
3837 0 : (match_operand:VI1_16_32 2 "register_operand" "x,Yw")))]
3838 208 : "TARGET_SSE2"
3839 201 : "@
3840 : p<maxmin_int>b\t{%2, %0|%0, %2}
3841 : vp<maxmin_int>b\t{%2, %1, %0|%0, %1, %2}"
3842 38 : [(set_attr "isa" "noavx,avx")
3843 28 : (set_attr "type" "sseiadd")
3844 : (set_attr "mode" "TI")])
3845 :
3846 : (define_insn "<code>v2hi3"
3847 : [(set (match_operand:V2HI 0 "register_operand" "=Yr,*x,Yv")
3848 : (umaxmin:V2HI
3849 : (match_operand:V2HI 1 "register_operand" "%0,0,Yv")
3850 : (match_operand:V2HI 2 "register_operand" "Yr,*x,Yv")))]
3851 10 : "TARGET_SSE4_1"
3852 0 : "@
3853 : p<maxmin_int>w\t{%2, %0|%0, %2}
3854 : p<maxmin_int>w\t{%2, %0|%0, %2}
3855 0 : vp<maxmin_int>w\t{%2, %1, %0|%0, %1, %2}"
3856 0 : [(set_attr "isa" "noavx,noavx,avx")
3857 0 : (set_attr "type" "sseiadd")
3858 0 : (set_attr "prefix_extra" "1")
3859 0 : (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 106 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSSE3"
3867 62 : "@
3868 : pabs<mmxvecsize>\t{%1, %0|%0, %1}
3869 : %vpabs<mmxvecsize>\t{%1, %0|%0, %1}"
3870 400 : [(set_attr "mmx_isa" "native,*")
3871 400 : (set_attr "type" "sselog1")
3872 390 : (set_attr "prefix_rep" "0")
3873 390 : (set_attr "prefix_extra" "1")
3874 686 : (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 40 : "TARGET_SSSE3"
3888 48 : "%vpabs<mmxvecsize>\t{%1, %0|%0, %1}"
3889 : [(set_attr "type" "sselog1")
3890 : (set_attr "prefix_rep" "0")
3891 62 : (set_attr "prefix_extra" "1")
3892 62 : (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
3893 50 : (set_attr "mode" "TI")])
3894 50 :
3895 102 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3896 : ;;
3897 2132478 : ;; Parallel integral shifts
3898 : ;;
3899 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3900 :
3901 2132478 : (define_insn "mmx_ashr<mode>3"
3902 2132478 : [(set (match_operand:MMXMODE24 0 "register_operand" "=y,x,<Yv_Yw>")
3903 2132478 : (ashiftrt:MMXMODE24
3904 2132478 : (match_operand:MMXMODE24 1 "register_operand" "0,0,<Yv_Yw>")
3905 2132478 : (match_operand:DI 2 "nonmemory_operand" "yN,xN,<Yv_Yw>N")))]
3906 2134758 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3907 434 : "@
3908 1402 : psra<mmxvecsize>\t{%2, %0|%0, %2}
3909 1402 : psra<mmxvecsize>\t{%2, %0|%0, %2}
3910 4211 : vpsra<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3911 5613 : [(set_attr "isa" "*,sse2_noavx,avx")
3912 1402 : (set_attr "mmx_isa" "native,*,*")
3913 : (set_attr "type" "mmxshft,sseishft,sseishft")
3914 5166 : (set (attr "length_immediate")
3915 955 : (if_then_else (match_operand 2 "const_int_operand")
3916 931 : (const_string "1")
3917 1527 : (const_string "0")))
3918 : (set_attr "mode" "DI,TI,TI")])
3919 572 :
3920 572 : (define_insn_and_split "*mmx_ashr<mode>3_1"
3921 572 : [(set (match_operand:MMXMODE24 0 "register_operand")
3922 572 : (lt:MMXMODE24
3923 572 : (match_operand:MMXMODE24 1 "register_operand")
3924 : (match_operand:MMXMODE24 2 "const0_operand")))]
3925 7882 : "TARGET_MMX_WITH_SSE && ix86_pre_reload_split ()"
3926 : "#"
3927 100 : "&& 1"
3928 755 : [(set (match_dup 0) (ashiftrt:MMXMODE24 (match_dup 1) (match_dup 3)))]
3929 4456 : "operands[3] = gen_int_mode (<mmxscalarsize> - 1, DImode);")
3930 2795 :
3931 381 : (define_expand "ashr<mode>3"
3932 956 : [(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 655 : "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 26 : (match_operand:MMXMODE248 1 "register_operand" "0,0,<Yv_Yw>")
3942 : (match_operand:DI 2 "nonmemory_operand" "yN,xN,<Yv_Yw>N")))]
3943 5911 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
3944 13709 : "@
3945 26 : p<vshift><mmxvecsize>\t{%2, %0|%0, %2}
3946 : p<vshift><mmxvecsize>\t{%2, %0|%0, %2}
3947 64232 : vp<vshift><mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
3948 64232 : [(set_attr "isa" "*,sse2_noavx,avx")
3949 : (set_attr "mmx_isa" "native,*,*")
3950 : (set_attr "type" "mmxshft,sseishft,sseishft")
3951 64232 : (set (attr "length_immediate")
3952 : (if_then_else (match_operand 2 "const_int_operand")
3953 : (const_string "1")
3954 : (const_string "0")))
3955 : (set_attr "mode" "DI,TI,TI")])
3956 :
3957 : (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 0 : "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 48 : (define_expand "<insn><mode>3"
3969 48 : [(set (match_operand:MMXMODE24 0 "register_operand")
3970 : (any_lshift:MMXMODE24
3971 48 : (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 11 : (match_operand:V1SI 1 "register_operand" "0,Yw")
3979 45 : (match_operand:DI 2 "nonmemory_operand" "xN,YwN")))]
3980 3812 : "TARGET_SSE2"
3981 394 : "@
3982 11 : p<vshift>d\t{%2, %0|%0, %2}
3983 45 : vp<vshift>d\t{%2, %1, %0|%0, %1, %2}"
3984 846 : [(set_attr "isa" "noavx,avx")
3985 846 : (set_attr "type" "sseishft")
3986 : (set (attr "length_immediate")
3987 : (if_then_else (match_operand 2 "const_int_operand")
3988 846 : (const_string "1")
3989 : (const_string "0")))
3990 : (set_attr "mode" "TI")])
3991 :
3992 : (define_insn "<insn>v2hi3"
3993 : [(set (match_operand:V2HI 0 "register_operand" "=x,Yw")
3994 : (any_shift:V2HI
3995 : (match_operand:V2HI 1 "register_operand" "0,Yw")
3996 : (match_operand:DI 2 "nonmemory_operand" "xN,YwN")))]
3997 1086 : "TARGET_SSE2"
3998 92 : "@
3999 : p<vshift>w\t{%2, %0|%0, %2}
4000 : vp<vshift>w\t{%2, %1, %0|%0, %1, %2}"
4001 243 : [(set_attr "isa" "noavx,avx")
4002 243 : (set_attr "type" "sseishft")
4003 243 : (set (attr "length_immediate")
4004 : (if_then_else (match_operand 2 "const_int_operand")
4005 : (const_string "1")
4006 243 : (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 944 : "TARGET_SSE2 && ix86_pre_reload_split ()"
4015 : "#"
4016 : "&& 1"
4017 80 : [(set (match_dup 0) (ashiftrt:V2HI (match_dup 1) (match_dup 3)))]
4018 80 : "operands[3] = gen_int_mode (15, DImode);")
4019 :
4020 : (define_split
4021 80 : [(set (match_operand:V2HI 0 "register_operand")
4022 : (and:V2HI
4023 575452 : (lt:V2HI
4024 575452 : (match_operand:V2HI 1 "register_operand")
4025 1057010 : (match_operand:V2HI 2 "const0_operand"))
4026 1056930 : (match_operand:V2HI 3 "const1_operand")))]
4027 1056930 : "TARGET_SSE2 && ix86_pre_reload_split ()"
4028 575452 : [(set (match_dup 0) (lshiftrt:V2HI (match_dup 1) (match_dup 4)))]
4029 0 : "operands[4] = gen_int_mode (15, DImode);")
4030 5564 :
4031 984056 : (define_expand "<insn>v8qi3"
4032 978487 : [(set (match_operand:V8QI 0 "register_operand")
4033 984056 : (any_shift:V8QI (match_operand:V8QI 1 "register_operand")
4034 0 : (match_operand:DI 2 "nonmemory_operand")))]
4035 256777 : "TARGET_MMX_WITH_SSE"
4036 256869 : {
4037 581175 : ix86_expand_vecop_qihi_partial (<CODE>, operands[0],
4038 581078 : operands[1], operands[2]);
4039 581175 : DONE;
4040 : })
4041 3 :
4042 : (define_expand "<insn>v4qi3"
4043 1579500 : [(set (match_operand:V4QI 0 "register_operand")
4044 1579500 : (any_shift:V4QI (match_operand:V4QI 1 "register_operand")
4045 1579500 : (match_operand:DI 2 "nonmemory_operand")))]
4046 : "TARGET_SSE2"
4047 33 : {
4048 33 : ix86_expand_vecop_qihi_partial (<CODE>, operands[0],
4049 717929 : operands[1], operands[2]);
4050 717962 : DONE;
4051 717929 : })
4052 717929 :
4053 7 : (define_insn_and_split "<insn>v2qi3"
4054 0 : [(set (match_operand:V2QI 0 "register_operand" "=Q")
4055 7 : (any_shift:V2QI
4056 7 : (match_operand:V2QI 1 "register_operand" "0")
4057 7 : (match_operand:QI 2 "nonmemory_operand" "cI")))
4058 : (clobber (reg:CC FLAGS_REG))]
4059 631 : "!TARGET_PARTIAL_REG_STALL || optimize_size"
4060 12 : "#"
4061 284 : "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
4062 295 : && reload_completed"
4063 : [(parallel
4064 53 : [(set (zero_extract:HI (match_dup 3) (const_int 8) (const_int 8))
4065 : (subreg:HI
4066 188523 : (any_shift:QI
4067 188523 : (subreg:QI
4068 142 : (zero_extract:HI (match_dup 4)
4069 68527 : (const_int 8)
4070 132642 : (const_int 8)) 0)
4071 109 : (match_dup 2)) 0))
4072 132533 : (clobber (reg:CC FLAGS_REG))])
4073 63 : (parallel
4074 73 : [(set (strict_low_part (match_dup 0))
4075 20 : (any_shift:QI (match_dup 1) (match_dup 2)))
4076 : (clobber (reg:CC FLAGS_REG))])]
4077 50 : {
4078 50 : operands[4] = lowpart_subreg (HImode, operands[1], V2QImode);
4079 50 : operands[3] = lowpart_subreg (HImode, operands[0], V2QImode);
4080 50 : operands[1] = lowpart_subreg (QImode, operands[1], V2QImode);
4081 50 : operands[0] = lowpart_subreg (QImode, operands[0], V2QImode);
4082 : }
4083 : [(set_attr "type" "multi")
4084 : (set_attr "mode" "QI")])
4085 50 :
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 50 : operands[1], operands[2]);
4095 9 : DONE;
4096 : })
4097 :
4098 : (define_expand "v<insn>v4qi3"
4099 618 : [(set (match_operand:V4QI 0 "register_operand")
4100 : (any_shift:V4QI
4101 618 : (match_operand:V4QI 1 "register_operand")
4102 618 : (match_operand:V4QI 2 "register_operand")))]
4103 618 : "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 10 :
4110 : (define_expand "vec_shl_<mode>"
4111 10 : [(set (match_operand:V248FI 0 "register_operand")
4112 10 : (ashift:V1DI
4113 10 : (match_operand:V248FI 1 "nonimmediate_operand")
4114 : (match_operand:DI 2 "nonmemory_operand")))]
4115 : "TARGET_MMX_WITH_SSE"
4116 14 : {
4117 15 : rtx op0 = gen_reg_rtx (V1DImode);
4118 14 : rtx op1 = force_reg (<MODE>mode, operands[1]);
4119 :
4120 14 : emit_insn (gen_mmx_ashlv1di3
4121 16 : (op0, gen_lowpart (V1DImode, op1), operands[2]));
4122 14 : emit_move_insn (operands[0], gen_lowpart (<MODE>mode, op0));
4123 16 : DONE;
4124 3 : })
4125 3 :
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 5 : 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 639 : (op0, gen_lowpart (V1SImode, op1), operands[2]));
4138 4 : emit_move_insn (operands[0], gen_lowpart (<MODE>mode, op0));
4139 639 : DONE;
4140 636 : })
4141 636 :
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 1249 : {
4149 1249 : rtx op0 = gen_reg_rtx (V1DImode);
4150 1249 : rtx op1 = force_reg (<MODE>mode, operands[1]);
4151 :
4152 1249 : emit_insn (gen_mmx_lshrv1di3
4153 1490 : (op0, gen_lowpart (V1DImode, op1), operands[2]));
4154 1249 : emit_move_insn (operands[0], gen_lowpart (<MODE>mode, op0));
4155 1490 : DONE;
4156 241 : })
4157 241 :
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 241 : 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 1199 : (op0, gen_lowpart (V1SImode, op1), operands[2]));
4170 241 : emit_move_insn (operands[0], gen_lowpart (<MODE>mode, op0));
4171 1199 : DONE;
4172 958 : })
4173 958 :
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 164 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4186 105 : "ix86_fixup_binary_operands_no_copy (EQ, <MODE>mode, operands);")
4187 164 :
4188 164 : (define_insn "*mmx_eq<mode>3"
4189 164 : [(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 1954 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
4194 12048 : && ix86_binary_operator_ok (EQ, <MODE>mode, operands)"
4195 10402 : "@
4196 : pcmpeq<mmxvecsize>\t{%2, %0|%0, %2}
4197 : pcmpeq<mmxvecsize>\t{%2, %0|%0, %2}
4198 20371 : vpcmpeq<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
4199 20568 : [(set_attr "isa" "*,sse2_noavx,avx")
4200 : (set_attr "mmx_isa" "native,*,*")
4201 30591 : (set_attr "type" "mmxcmp,ssecmp,ssecmp")
4202 197 : (set_attr "mode" "DI,TI,TI")])
4203 197 :
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 900 : "TARGET_SSE2"
4210 1815 : "@
4211 : pcmpeq<mmxvecsize>\t{%2, %0|%0, %2}
4212 : vpcmpeq<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
4213 2090 : [(set_attr "isa" "noavx,avx")
4214 2090 : (set_attr "type" "ssecmp")
4215 : (set_attr "mode" "TI")])
4216 2090 :
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 2987 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4223 4273381 : "@
4224 : pcmpgt<mmxvecsize>\t{%2, %0|%0, %2}
4225 : pcmpgt<mmxvecsize>\t{%2, %0|%0, %2}
4226 14495 : vpcmpgt<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
4227 4287876 : [(set_attr "isa" "*,sse2_noavx,avx")
4228 4273381 : (set_attr "mmx_isa" "native,*,*")
4229 4287876 : (set_attr "type" "mmxcmp,ssecmp,ssecmp")
4230 4273381 : (set_attr "mode" "DI,TI,TI")])
4231 4273381 :
4232 4273381 : (define_insn "*gt<mode>3"
4233 : [(set (match_operand:VI_16_32 0 "register_operand" "=x,x")
4234 4273286 : (gt:VI_16_32
4235 4273286 : (match_operand:VI_16_32 1 "register_operand" "0,x")
4236 : (match_operand:VI_16_32 2 "register_operand" "x,x")))]
4237 4233543 : "TARGET_SSE2"
4238 4233116 : "@
4239 4233116 : pcmpgt<mmxvecsize>\t{%2, %0|%0, %2}
4240 4233116 : vpcmpgt<mmxvecsize>\t{%2, %1, %0|%0, %1, %2}"
4241 4237364 : [(set_attr "isa" "noavx,avx")
4242 4248 : (set_attr "type" "ssecmp")
4243 4940 : (set_attr "mode" "TI")])
4244 9188 :
4245 4940 : (define_insn "*xop_maskcmp<mode>3"
4246 : [(set (match_operand:MMXMODEI 0 "register_operand" "=x")
4247 4458 : (match_operator:MMXMODEI 1 "ix86_comparison_int_operator"
4248 : [(match_operand:MMXMODEI 2 "register_operand" "x")
4249 5108930 : (match_operand:MMXMODEI 3 "register_operand" "x")]))]
4250 5109099 : "TARGET_XOP"
4251 23485 : "vpcom%Y1<mmxvecsize>\t{%3, %2, %0|%0, %2, %3}"
4252 5108930 : [(set_attr "type" "sse4arg")
4253 5108930 : (set_attr "mode" "TI")])
4254 5108930 :
4255 19385 : (define_insn "*xop_maskcmp<mode>3"
4256 5786 : [(set (match_operand:VI_16_32 0 "register_operand" "=x")
4257 25171 : (match_operator:VI_16_32 1 "ix86_comparison_int_operator"
4258 : [(match_operand:VI_16_32 2 "register_operand" "x")
4259 5786 : (match_operand:VI_16_32 3 "register_operand" "x")]))]
4260 0 : "TARGET_XOP"
4261 5458 : "vpcom%Y1<mmxvecsize>\t{%3, %2, %0|%0, %2, %3}"
4262 : [(set_attr "type" "sse4arg")
4263 : (set_attr "mode" "TI")])
4264 3907 :
4265 3907 : (define_insn "*xop_maskcmp_uns<mode>3"
4266 : [(set (match_operand:MMXMODEI 0 "register_operand" "=x")
4267 3907 : (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 3367821 : "TARGET_XOP"
4271 13608 : "vpcom%Y1u<mmxvecsize>\t{%3, %2, %0|%0, %2, %3}"
4272 : [(set_attr "type" "sse4arg")
4273 : (set_attr "mode" "TI")])
4274 3380350 :
4275 3380350 : (define_insn "*xop_maskcmp_uns<mode>3"
4276 3367821 : [(set (match_operand:VI_16_32 0 "register_operand" "=x")
4277 3380350 : (match_operator:VI_16_32 1 "ix86_comparison_uns_operator"
4278 3367821 : [(match_operand:VI_16_32 2 "register_operand" "x")
4279 3367821 : (match_operand:VI_16_32 3 "register_operand" "x")]))]
4280 3367821 : "TARGET_XOP"
4281 3370740 : "vpcom%Y1u<mmxvecsize>\t{%3, %2, %0|%0, %2, %3}"
4282 3367821 : [(set_attr "type" "sse4arg")
4283 : (set_attr "mode" "TI")])
4284 2218494 :
4285 2218494 : (define_expand "vec_cmp<mode><mode>"
4286 2216714 : [(set (match_operand:MMXMODEI 0 "register_operand")
4287 2218494 : (match_operator:MMXMODEI 1 ""
4288 2216714 : [(match_operand:MMXMODEI 2 "register_operand")
4289 2216714 : (match_operand:MMXMODEI 3 "register_operand")]))]
4290 2216714 : "TARGET_MMX_WITH_SSE"
4291 853 : {
4292 19140 : bool ok = ix86_expand_int_vec_cmp (operands);
4293 19140 : gcc_assert (ok);
4294 3599949 : DONE;
4295 17088 : })
4296 32661 :
4297 : (define_expand "vec_cmp<mode><mode>"
4298 3594212 : [(set (match_operand:VI_16_32 0 "register_operand")
4299 3582008 : (match_operator:VI_16_32 1 ""
4300 3582008 : [(match_operand:VI_16_32 2 "register_operand")
4301 3582008 : (match_operand:VI_16_32 3 "register_operand")]))]
4302 3582008 : "TARGET_SSE2"
4303 3582127 : {
4304 119 : bool ok = ix86_expand_int_vec_cmp (operands);
4305 3085843 : gcc_assert (ok);
4306 3085843 : DONE;
4307 3085724 : })
4308 3085814 :
4309 3085724 : (define_expand "vec_cmpu<mode><mode>"
4310 3085814 : [(set (match_operand:MMXMODEI 0 "register_operand")
4311 3085814 : (match_operator:MMXMODEI 1 ""
4312 3085814 : [(match_operand:MMXMODEI 2 "register_operand")
4313 3085724 : (match_operand:MMXMODEI 3 "register_operand")]))]
4314 3085724 : "TARGET_MMX_WITH_SSE"
4315 3085919 : {
4316 3085919 : bool ok = ix86_expand_int_vec_cmp (operands);
4317 3085919 : gcc_assert (ok);
4318 3085919 : DONE;
4319 3085724 : })
4320 3085998 :
4321 : (define_expand "vec_cmpu<mode><mode>"
4322 3037713 : [(set (match_operand:VI_16_32 0 "register_operand")
4323 2901268 : (match_operator:VI_16_32 1 ""
4324 173633 : [(match_operand:VI_16_32 2 "register_operand")
4325 3210622 : (match_operand:VI_16_32 3 "register_operand")]))]
4326 : "TARGET_SSE2"
4327 7974 : {
4328 7974 : bool ok = ix86_expand_int_vec_cmp (operands);
4329 109 : gcc_assert (ok);
4330 269 : DONE;
4331 160 : })
4332 286 :
4333 160 : (define_expand "vcond_mask_<mode><mmxintvecmodelower>"
4334 286 : [(set (match_operand:MMXMODE124 0 "register_operand")
4335 286 : (vec_merge:MMXMODE124
4336 286 : (match_operand:MMXMODE124 1 "vector_or_const_vector_operand")
4337 : (match_operand:MMXMODE124 2 "vector_or_const_vector_operand")
4338 94 : (match_operand:<mmxintvecmode> 3 "register_operand")))]
4339 94 : "TARGET_MMX_WITH_SSE"
4340 396 : {
4341 302 : ix86_expand_sse_movcc (operands[0], operands[3],
4342 92 : operands[1], operands[2]);
4343 394 : DONE;
4344 : })
4345 9 :
4346 6 : (define_expand "vcond_mask_<mode><mode>"
4347 9 : [(set (match_operand:VI_16_32 0 "register_operand")
4348 6 : (vec_merge:VI_16_32
4349 3 : (match_operand:VI_16_32 1 "vector_or_const_vector_operand")
4350 6 : (match_operand:VI_16_32 2 "vector_or_const_vector_operand")
4351 : (match_operand:VI_16_32 3 "register_operand")))]
4352 2 : "TARGET_SSE2"
4353 128 : {
4354 126 : ix86_expand_sse_movcc (operands[0], operands[3],
4355 : operands[1], operands[2]);
4356 126 : DONE;
4357 : })
4358 33 :
4359 : (define_insn "mmx_pblendvb_v8qi"
4360 33 : [(set (match_operand:V8QI 0 "register_operand" "=Yr,*x,x")
4361 0 : (unspec:V8QI
4362 33 : [(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 1730 : "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 3578 : vpblendvb\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4371 3519 : [(set_attr "isa" "noavx,noavx,avx")
4372 59 : (set_attr "type" "ssemov")
4373 3578 : (set_attr "c86_attr" "blendv")
4374 59 : (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 0 : "TARGET_MMX_WITH_SSE && ix86_pre_reload_split ()"
4392 0 : "#"
4393 : "&& 1"
4394 : [(set (match_dup 6)
4395 6 : (eq:V8QI (match_dup 3) (match_dup 7)))
4396 6 : (set (match_dup 0)
4397 6 : (unspec:V8QI
4398 6 : [(match_dup 2)
4399 : (match_dup 1)
4400 : (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 10 : "TARGET_MMX_WITH_SSE && ix86_pre_reload_split ()"
4420 0 : "#"
4421 1 : "&& 1"
4422 0 : [(set (match_dup 6)
4423 34 : (eq:MMXMODE24 (match_dup 3) (match_dup 8)))
4424 30 : (set (match_dup 0)
4425 15 : (unspec:V8QI
4426 15 : [(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 1961 : "TARGET_SSE4_1"
4444 : "@
4445 : pblendvb\t{%3, %2, %0|%0, %2, %3}
4446 : pblendvb\t{%3, %2, %0|%0, %2, %3}
4447 1009 : vpblendvb\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4448 1018 : [(set_attr "isa" "noavx,noavx,avx")
4449 : (set_attr "type" "ssemov")
4450 1018 : (set_attr "c86_attr" "blendv")
4451 0 : (set_attr "prefix_extra" "1")
4452 9 : (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 36 : "TARGET_SSE2 && ix86_pre_reload_split ()"
4469 0 : "#"
4470 : "&& 1"
4471 : [(set (match_dup 6)
4472 30 : (eq:VI_16_32 (match_dup 3) (match_dup 7)))
4473 24 : (set (match_dup 0)
4474 12 : (unspec:VI_16_32
4475 24 : [(match_dup 2)
4476 : (match_dup 1)
4477 : (match_dup 6)]
4478 5642 : UNSPEC_BLENDV))]
4479 5660 : {
4480 7938 : operands[6] = gen_reg_rtx (<MODE>mode);
4481 7941 : operands[7] = force_reg (<MODE>mode, operands[4]);
4482 7926 : })
4483 7920 :
4484 7920 : (define_insn_and_split "*mmx_pblendvb_v4qi_2"
4485 7938 : [(set (match_operand:V4QI 0 "register_operand")
4486 7920 : (unspec:V4QI
4487 7920 : [(match_operand:V4QI 1 "register_operand")
4488 7920 : (match_operand:V4QI 2 "register_operand")
4489 7920 : (subreg:V4QI
4490 18 : (eq:V2HI
4491 7920 : (eq:V2HI
4492 : (match_operand:V2HI 3 "register_operand")
4493 6463 : (match_operand:V2HI 4 "nonmemory_operand"))
4494 6463 : (match_operand:V2HI 5 "const0_operand")) 0)]
4495 5 : UNSPEC_BLENDV))]
4496 6518 : "TARGET_SSE2 && ix86_pre_reload_split ()"
4497 5 : "#"
4498 15 : "&& 1"
4499 0 : [(set (match_dup 6)
4500 25 : (eq:V2HI (match_dup 3) (match_dup 8)))
4501 : (set (match_dup 0)
4502 5 : (unspec:V4QI
4503 : [(match_dup 2)
4504 851 : (match_dup 1)
4505 851 : (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 29064 : operands[8] = force_reg (V2HImode, operands[4]);
4511 29049 : })
4512 0 :
4513 776 : ;; XOP parallel XMM conditional moves
4514 797 : (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 174 : "TARGET_XOP && TARGET_MMX_WITH_SSE"
4521 204 : "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4522 : [(set_attr "type" "sse4arg")
4523 : (set_attr "mode" "TI")])
4524 404 :
4525 381 : (define_insn "*xop_pcmov_<mode>"
4526 23 : [(set (match_operand:V4F_64 0 "register_operand" "=x")
4527 407 : (if_then_else:V4F_64
4528 : (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 32 : "TARGET_XOP && TARGET_MMX_WITH_SSE"
4532 0 : "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4533 : [(set_attr "type" "sse4arg")
4534 : (set_attr "mode" "TI")])
4535 3 :
4536 3 : (define_insn "*xop_pcmov_<mode>"
4537 1 : [(set (match_operand:VI_16_32 0 "register_operand" "=x")
4538 3 : (if_then_else:VI_16_32
4539 1 : (match_operand:VI_16_32 3 "register_operand" "x")
4540 0 : (match_operand:VI_16_32 1 "register_operand" "x")
4541 1 : (match_operand:VI_16_32 2 "register_operand" "x")))]
4542 0 : "TARGET_XOP"
4543 144 : "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4544 : [(set_attr "type" "sse4arg")
4545 : (set_attr "mode" "TI")])
4546 243 :
4547 243 : (define_insn "*xop_pcmov_<mode>"
4548 : [(set (match_operand:V2F_32 0 "register_operand" "=x")
4549 243 : (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 3 : "TARGET_XOP"
4554 0 : "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4555 : [(set_attr "type" "sse4arg")
4556 : (set_attr "mode" "TI")])
4557 3 :
4558 3 : ;; XOP permute instructions
4559 : (define_insn "mmx_ppermv64"
4560 3 : [(set (match_operand:V8QI 0 "register_operand" "=x")
4561 268 : (unspec:V8QI
4562 268 : [(match_operand:V8QI 1 "register_operand" "x")
4563 : (match_operand:V8QI 2 "register_operand" "x")
4564 261 : (match_operand:V16QI 3 "nonimmediate_operand" "xm")]
4565 261 : UNSPEC_XOP_PERMUTE))]
4566 546 : "TARGET_XOP && TARGET_MMX_WITH_SSE"
4567 309 : "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4568 261 : [(set_attr "type" "sse4arg")
4569 : (set_attr "mode" "TI")])
4570 257 :
4571 257 : (define_insn "mmx_ppermv32"
4572 257 : [(set (match_operand:V4QI 0 "register_operand" "=x")
4573 257 : (unspec:V4QI
4574 257 : [(match_operand:V4QI 1 "register_operand" "x")
4575 : (match_operand:V4QI 2 "register_operand" "x")
4576 256 : (match_operand:V16QI 3 "nonimmediate_operand" "xm")]
4577 256 : UNSPEC_XOP_PERMUTE))]
4578 256 : "TARGET_XOP"
4579 256 : "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4580 : [(set_attr "type" "sse4arg")
4581 252 : (set_attr "mode" "TI")])
4582 :
4583 66 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4584 66 : ;;
4585 : ;; Parallel integral logical operations
4586 13969 : ;;
4587 14035 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4588 :
4589 10 : (define_expand "one_cmpl<mode>2"
4590 10 : [(set (match_operand:MMXMODEI 0 "register_operand")
4591 10 : (xor:MMXMODEI
4592 : (match_operand:MMXMODEI 1 "register_operand")
4593 10 : (match_dup 2)))]
4594 10 : "TARGET_MMX_WITH_SSE"
4595 69 : "operands[2] = force_reg (<MODE>mode, CONSTM1_RTX (<MODE>mode));")
4596 :
4597 10 : (define_insn "one_cmpl<mode>2"
4598 10 : [(set (match_operand:VI_16_32 0 "register_operand" "=?r,&x,&v")
4599 69 : (not:VI_16_32
4600 10 : (match_operand:VI_16_32 1 "register_operand" "0,x,v")))]
4601 10 : ""
4602 : "#"
4603 59 : [(set_attr "isa" "*,sse2,avx512vl")
4604 0 : (set_attr "type" "negnot,sselog1,sselog1")
4605 0 : (set_attr "mode" "SI,TI,TI")])
4606 :
4607 : (define_split
4608 2 : [(set (match_operand:VI_16_32 0 "general_reg_operand")
4609 13 : (not:VI_16_32
4610 2 : (match_operand:VI_16_32 1 "general_reg_operand")))]
4611 16 : "reload_completed"
4612 15 : [(set (match_dup 0)
4613 399373 : (not:SI (match_dup 1)))]
4614 37 : {
4615 39 : operands[1] = lowpart_subreg (SImode, operands[1], <MODE>mode);
4616 399389 : 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 0 : (not:VI_16_32
4622 : (match_operand:VI_16_32 1 "sse_reg_operand")))]
4623 33 : "TARGET_SSE2 && reload_completed"
4624 18 : [(set (match_dup 0) (match_dup 2))
4625 399309 : (set (match_dup 0)
4626 47 : (xor:V16QI
4627 47 : (match_dup 0) (match_dup 1)))]
4628 399374 : {
4629 42 : operands[2] = CONSTM1_RTX (V16QImode);
4630 18 : operands[1] = lowpart_subreg (V16QImode, operands[1], <MODE>mode);
4631 42 : operands[0] = lowpart_subreg (V16QImode, operands[0], <MODE>mode);
4632 0 : })
4633 24 :
4634 : (define_expand "andn<mode>3"
4635 18 : [(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 : (define_insn "mmx_andnot<mode>3"
4642 : [(set (match_operand:MMXMODEI 0 "register_operand" "=y,x,x,v")
4643 : (and:MMXMODEI
4644 0 : (not:MMXMODEI (match_operand:MMXMODEI 1 "register_operand" "0,0,x,v"))
4645 36 : (match_operand:MMXMODEI 2 "register_mmxmem_operand" "ym,x,x,v")))]
4646 206 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4647 613 : "@
4648 0 : pandn\t{%2, %0|%0, %2}
4649 36 : pandn\t{%2, %0|%0, %2}
4650 1670 : vpandn\t{%2, %1, %0|%0, %1, %2}
4651 1556 : vpandnd\t{%2, %1, %0|%0, %1, %2}"
4652 114 : [(set_attr "isa" "*,sse2_noavx,avx,avx512vl")
4653 1556 : (set_attr "mmx_isa" "native,*,*,*")
4654 : (set_attr "type" "mmxadd,sselog,sselog,sselog")
4655 15 : (set_attr "mode" "DI,TI,TI,TI")])
4656 15 :
4657 : (define_insn "*andnot<mode>3"
4658 85 : [(set (match_operand:VI_16_32 0 "register_operand" "=?&r,?r,x,x,v")
4659 85 : (and:VI_16_32
4660 85 : (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 13 : (clobber (reg:CC FLAGS_REG))]
4664 13 : ""
4665 : "#"
4666 100 : [(set_attr "isa" "*,bmi,sse2_noavx,avx,avx512vl")
4667 100 : (set_attr "type" "alu,bitmanip,sselog,sselog,sselog")
4668 100 : (set_attr "mode" "SI,SI,TI,TI,TI")])
4669 :
4670 : (define_split
4671 25 : [(set (match_operand:VI_16_32 0 "general_reg_operand")
4672 25 : (and:VI_16_32
4673 : (not:VI_16_32 (match_operand:VI_16_32 1 "general_reg_operand"))
4674 0 : (match_operand:VI_16_32 2 "general_reg_operand")))
4675 0 : (clobber (reg:CC FLAGS_REG))]
4676 1 : "TARGET_BMI && reload_completed"
4677 0 : [(parallel
4678 3 : [(set (match_dup 0)
4679 : (and:SI (not:SI (match_dup 1)) (match_dup 2)))
4680 : (clobber (reg:CC FLAGS_REG))])]
4681 0 : {
4682 0 : operands[2] = lowpart_subreg (SImode, operands[2], <MODE>mode);
4683 0 : 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 3 : [(set (match_dup 0)
4695 : (not:SI (match_dup 1)))
4696 120 : (parallel
4697 58 : [(set (match_dup 0)
4698 58 : (and:SI (match_dup 0) (match_dup 2)))
4699 120 : (clobber (reg:CC FLAGS_REG))])]
4700 3 : {
4701 3 : operands[2] = lowpart_subreg (SImode, operands[2], <MODE>mode);
4702 3 : 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 61 : "TARGET_SSE2 && reload_completed"
4713 : [(set (match_dup 0)
4714 58 : (and:V16QI (not:V16QI (match_dup 1)) (match_dup 2)))]
4715 58 : {
4716 2154 : operands[2] = lowpart_subreg (V16QImode, operands[2], <MODE>mode);
4717 2189 : operands[1] = lowpart_subreg (V16QImode, operands[1], <MODE>mode);
4718 134 : operands[0] = lowpart_subreg (V16QImode, operands[0], <MODE>mode);
4719 2055 : })
4720 111 :
4721 37 : (define_expand "mmx_<code><mode>3"
4722 136 : [(set (match_operand:MMXMODEI 0 "register_operand")
4723 : (any_logic:MMXMODEI
4724 2 : (match_operand:MMXMODEI 1 "register_mmxmem_operand")
4725 : (match_operand:MMXMODEI 2 "register_mmxmem_operand")))]
4726 58 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4727 70 : "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 438 : (any_logic:MMXMODEI
4732 : (match_operand:MMXMODEI 1 "register_operand")
4733 329 : (match_operand:MMXMODEI 2 "register_operand")))]
4734 329 : "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 294 : (any_logic:MMXMODEI
4739 : (match_operand:MMXMODEI 1 "register_mmxmem_operand" "%0,0,x,v")
4740 2113 : (match_operand:MMXMODEI 2 "register_mmxmem_operand" "ym,x,x,v")))]
4741 2080 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
4742 32962 : && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
4743 9083 : "@
4744 163 : p<logic>\t{%2, %0|%0, %2}
4745 777 : p<logic>\t{%2, %0|%0, %2}
4746 33713 : vp<logic>\t{%2, %1, %0|%0, %1, %2}
4747 34836 : vp<logic>d\t{%2, %1, %0|%0, %1, %2}"
4748 22563 : [(set_attr "isa" "*,sse2_noavx,avx,avx512vl")
4749 : (set_attr "mmx_isa" "native,*,*,*")
4750 40598 : (set_attr "type" "mmxadd,sselog,sselog,sselog")
4751 : (set_attr "mode" "DI,TI,TI,TI")])
4752 94 :
4753 5 : (define_expand "<code><mode>3"
4754 94 : [(set (match_operand:VI_16_32 0 "nonimmediate_operand")
4755 212 : (any_logic:VI_16_32
4756 94 : (match_operand:VI_16_32 1 "nonimmediate_operand")
4757 118 : (match_operand:VI_16_32 2 "nonimmediate_or_x86_64_const_vector_operand")))]
4758 113 : ""
4759 381 : "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 : (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 : (clobber (reg:CC FLAGS_REG))]
4767 3811 : "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
4768 33 : "#"
4769 1067 : [(set_attr "isa" "*,*,sse2_noavx,avx,avx512vl")
4770 1067 : (set_attr "type" "alu,alu,sselog,sselog,sselog")
4771 5962 : (set_attr "mode" "SI,SI,TI,TI,TI")])
4772 5962 :
4773 1499 : (define_split
4774 1842 : [(set (match_operand:VI_16_32 0 "nonimmediate_gr_operand")
4775 10026 : (any_logic:VI_16_32
4776 12277 : (match_operand:VI_16_32 1 "nonimmediate_gr_operand")
4777 101 : (match_operand:VI_16_32 2 "reg_or_const_vector_operand")))
4778 4198 : (clobber (reg:CC FLAGS_REG))]
4779 4220 : "reload_completed"
4780 62 : [(parallel
4781 968 : [(set (match_dup 0)
4782 340 : (any_logic:<mmxinsnmode> (match_dup 1) (match_dup 2)))
4783 340 : (clobber (reg:CC FLAGS_REG))])]
4784 1030 : {
4785 62 : if (!register_operand (operands[2], <MODE>mode))
4786 : {
4787 9 : HOST_WIDE_INT val = ix86_convert_const_vector_to_integer (operands[2],
4788 : <MODE>mode);
4789 9 : operands[2] = GEN_INT (val);
4790 : }
4791 : else
4792 53 : operands[2] = lowpart_subreg (<mmxinsnmode>mode, operands[2], <MODE>mode);
4793 62 : operands[1] = lowpart_subreg (<mmxinsnmode>mode, operands[1], <MODE>mode);
4794 62 : operands[0] = lowpart_subreg (<mmxinsnmode>mode, operands[0], <MODE>mode);
4795 : })
4796 :
4797 : (define_split
4798 62 : [(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 62 : (clobber (reg:CC FLAGS_REG))]
4803 340 : "TARGET_SSE2 && reload_completed"
4804 : [(set (match_dup 0)
4805 340 : (any_logic:V16QI (match_dup 1) (match_dup 2)))]
4806 340 : {
4807 943 : operands[2] = lowpart_subreg (V16QImode, operands[2], <MODE>mode);
4808 1554 : operands[1] = lowpart_subreg (V16QImode, operands[1], <MODE>mode);
4809 396 : operands[0] = lowpart_subreg (V16QImode, operands[0], <MODE>mode);
4810 916 : })
4811 598 :
4812 861 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4813 340 : ;;
4814 : ;; Parallel integral element swizzling
4815 : ;;
4816 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4817 340 :
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 4793 : (ss_truncate:V4QI
4824 : (match_operand:V4HI 2 "register_mmxmem_operand" "ym,x,Yw"))))]
4825 5138 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4826 0 : "@
4827 4793 : packsswb\t{%2, %0|%0, %2}
4828 : #
4829 286 : #"
4830 98 : "&& reload_completed
4831 46 : && SSE_REGNO_P (REGNO (operands[0]))"
4832 : [(const_int 0)]
4833 92 : "ix86_split_mmx_pack (operands, SS_TRUNCATE); DONE;"
4834 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4835 112 : (set_attr "type" "mmxshft,sselog,sselog")
4836 224 : (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 239 : UNSPEC_US_TRUNCATE))]
4846 5897 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4847 239 : "@
4848 0 : packuswb\t{%2, %0|%0, %2}
4849 239 : #
4850 1061 : #"
4851 2191 : "&& reload_completed
4852 565 : && SSE_REGNO_P (REGNO (operands[0]))"
4853 : [(const_int 0)]
4854 1130 : "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 368 : (set_attr "mode" "DI,TI,TI")])
4858 :
4859 : (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 886 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4867 0 : "@
4868 482 : packssdw\t{%2, %0|%0, %2}
4869 0 : #
4870 482 : #"
4871 112 : "&& reload_completed
4872 56 : && SSE_REGNO_P (REGNO (operands[0]))"
4873 : [(const_int 0)]
4874 112 : "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 2329 : [(set (match_operand:V4HI 0 "register_operand" "=Yr,*x,Yw")
4881 : (unspec:V4HI
4882 581078 : [(match_operand:V2SI 1 "register_operand" "0,0,Yw")
4883 : (match_operand:V2SI 2 "register_operand" "Yr,*x,Yw")]
4884 583407 : UNSPEC_US_TRUNCATE))]
4885 585731 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
4886 583407 : "#"
4887 583609 : "&& reload_completed"
4888 583425 : [(const_int 0)]
4889 583609 : "ix86_split_mmx_pack (operands, US_TRUNCATE); DONE;"
4890 2329 : [(set_attr "isa" "noavx,noavx,avx")
4891 393545 : (set_attr "type" "sselog")
4892 393545 : (set_attr "mode" "TI")])
4893 444406 :
4894 442077 : (define_insn_and_split "mmx_punpckhbw"
4895 527200 : [(set (match_operand:V8QI 0 "register_operand" "=y,x,Yw")
4896 527200 : (vec_select:V8QI
4897 527200 : (vec_concat:V16QI
4898 527200 : (match_operand:V8QI 1 "register_operand" "0,0,Yw")
4899 442077 : (match_operand:V8QI 2 "register_mmxmem_operand" "ym,x,Yw"))
4900 135060 : (parallel [(const_int 4) (const_int 12)
4901 471637 : (const_int 5) (const_int 13)
4902 42453 : (const_int 6) (const_int 14)
4903 41 : (const_int 7) (const_int 15)])))]
4904 1721 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4905 1616 : "@
4906 1610 : punpckhbw\t{%2, %0|%0, %2}
4907 1616 : #
4908 9669 : #"
4909 922 : "&& reload_completed
4910 430 : && SSE_REGNO_P (REGNO (operands[0]))"
4911 : [(const_int 0)]
4912 860 : "ix86_split_mmx_punpck (operands, true); DONE;"
4913 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4914 964 : (set_attr "type" "mmxcvt,sselog,sselog")
4915 1928 : (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 90 : (parallel [(const_int 2) (const_int 6)
4924 : (const_int 3) (const_int 7)])))]
4925 4061 : "TARGET_SSE2"
4926 90 : "#"
4927 568 : "&& reload_completed"
4928 : [(const_int 0)]
4929 13179 : "ix86_split_mmx_punpck (operands, true); DONE;"
4930 131 : [(set_attr "isa" "noavx,avx")
4931 2732 : (set_attr "type" "sselog")
4932 5464 : (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 101 : (parallel [(const_int 0) (const_int 8)
4941 : (const_int 1) (const_int 9)
4942 101 : (const_int 2) (const_int 10)
4943 101 : (const_int 3) (const_int 11)])))]
4944 7845 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4945 0 : "@
4946 : punpcklbw\t{%2, %0|%0, %k2}
4947 : #
4948 3493 : #"
4949 4457 : "&& reload_completed
4950 482 : && SSE_REGNO_P (REGNO (operands[0]))"
4951 : [(const_int 0)]
4952 964 : "ix86_split_mmx_punpck (operands, false); DONE;"
4953 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4954 478 : (set_attr "type" "mmxcvt,sselog,sselog")
4955 478 : (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 33 : (parallel [(const_int 0) (const_int 4)
4964 : (const_int 1) (const_int 5)])))]
4965 5315 : "TARGET_SSE2"
4966 33 : "#"
4967 765 : "&& reload_completed"
4968 : [(const_int 0)]
4969 17114 : "ix86_split_mmx_punpck (operands, false); DONE;"
4970 184 : [(set_attr "isa" "noavx,avx")
4971 3598 : (set_attr "type" "sselog")
4972 7196 : (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 5 : (parallel [(const_int 2) (const_int 6)
4981 : (const_int 3) (const_int 7)])))]
4982 15569 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
4983 5 : "@
4984 5 : punpckhwd\t{%2, %0|%0, %2}
4985 : #
4986 4550 : #"
4987 7282 : "&& reload_completed
4988 1366 : && SSE_REGNO_P (REGNO (operands[0]))"
4989 : [(const_int 0)]
4990 2732 : "ix86_split_mmx_punpck (operands, true); DONE;"
4991 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
4992 732 : (set_attr "type" "mmxcvt,sselog,sselog")
4993 732 : (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 95 : (parallel [(const_int 0) (const_int 4)
5002 : (const_int 1) (const_int 5)])))]
5003 20259 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5004 95 : "@
5005 95 : punpcklwd\t{%2, %0|%0, %k2}
5006 : #
5007 : #"
5008 3598 : "&& reload_completed
5009 1799 : && SSE_REGNO_P (REGNO (operands[0]))"
5010 : [(const_int 0)]
5011 7983 : "ix86_split_mmx_punpck (operands, false); DONE;"
5012 4385 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
5013 4394 : (set_attr "type" "mmxcvt,sselog,sselog")
5014 : (set_attr "mode" "DI,TI,TI")])
5015 :
5016 : (define_insn_and_split "mmx_punpckhdq"
5017 526412 : [(set (match_operand:V2SI 0 "register_operand" "=y,x,Yv")
5018 526412 : (vec_select:V2SI
5019 526412 : (vec_concat:V4SI
5020 526412 : (match_operand:V2SI 1 "register_operand" "0,0,Yv")
5021 : (match_operand:V2SI 2 "register_mmxmem_operand" "ym,x,Yv"))
5022 346387 : (parallel [(const_int 1)
5023 346263 : (const_int 3)])))]
5024 354390 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5025 124 : "@
5026 124 : punpckhdq\t{%2, %0|%0, %2}
5027 : #
5028 34952 : #"
5029 552 : "&& reload_completed
5030 35228 : && SSE_REGNO_P (REGNO (operands[0]))"
5031 276 : [(const_int 0)]
5032 222261 : "ix86_split_mmx_punpck (operands, true); DONE;"
5033 221985 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
5034 217419 : (set_attr "type" "mmxcvt,sselog,sselog")
5035 97 : (set_attr "mode" "DI,TI,TI")])
5036 97 :
5037 11402 : (define_insn_and_split "mmx_punpckldq"
5038 56041 : [(set (match_operand:V2SI 0 "register_operand" "=y,x,Yv")
5039 56041 : (vec_select:V2SI
5040 56041 : (vec_concat:V4SI
5041 : (match_operand:V2SI 1 "register_operand" "0,0,Yv")
5042 0 : (match_operand:V2SI 2 "register_mmxmem_operand" "ym,x,Yv"))
5043 14 : (parallel [(const_int 0)
5044 : (const_int 2)])))]
5045 14959 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5046 14 : "@
5047 14 : punpckldq\t{%2, %0|%0, %k2}
5048 : #
5049 2632 : #"
5050 3356 : "&& reload_completed
5051 362 : && SSE_REGNO_P (REGNO (operands[0]))"
5052 362 : [(const_int 0)]
5053 362 : "ix86_split_mmx_punpck (operands, false); DONE;"
5054 : [(set_attr "mmx_isa" "native,sse_noavx,avx")
5055 220 : (set_attr "type" "mmxcvt,sselog,sselog")
5056 220 : (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 9 : (const_int 2) (const_int 3)]))))]
5065 2602 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5066 3504 : "%vpmov<extsuffix>bw\t{%1, %0|%0, %1}"
5067 9 : [(set_attr "isa" "noavx,noavx,avx")
5068 9 : (set_attr "type" "ssemov")
5069 12957 : (set_attr "c86_attr" "vpmovx")
5070 12957 : (set_attr "prefix_extra" "1")
5071 : (set_attr "prefix" "orig,orig,maybe_evex")
5072 2770 : (set_attr "mode" "TI")])
5073 2770 :
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 5540 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5099 0 : "%vpmov<extsuffix>wd\t{%1, %0|%0, %1}"
5100 : [(set_attr "isa" "noavx,noavx,avx")
5101 : (set_attr "type" "ssemov")
5102 329 : (set_attr "c86_attr" "vpmovx")
5103 282 : (set_attr "prefix_extra" "1")
5104 47 : (set_attr "prefix" "orig,orig,maybe_evex")
5105 47 : (set_attr "mode" "TI")])
5106 47 :
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 191 : {
5113 191 : if (!TARGET_SSE4_1)
5114 : {
5115 174 : ix86_expand_sse_extend (operands[0], operands[1], <u_bool>);
5116 174 : DONE;
5117 : }
5118 :
5119 17 : rtx op1 = force_reg (V2HImode, operands[1]);
5120 17 : op1 = lowpart_subreg (V4HImode, op1, V2HImode);
5121 17 : emit_insn (gen_sse4_1_<code>v2hiv2si2 (operands[0], op1));
5122 17 : 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 564 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5132 0 : "%vpmov<extsuffix>bd\t{%1, %0|%0, %1}"
5133 : [(set_attr "isa" "noavx,noavx,avx")
5134 : (set_attr "type" "ssemov")
5135 388 : (set_attr "c86_attr" "vpmovx")
5136 180 : (set_attr "prefix_extra" "1")
5137 208 : (set_attr "prefix" "orig,orig,maybe_evex")
5138 208 : (set_attr "mode" "TI")])
5139 208 :
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 180 : "TARGET_SSE4_1"
5159 0 : "%vpmov<extsuffix>bw\t{%1, %0|%0, %1}"
5160 : [(set_attr "isa" "noavx,noavx,avx")
5161 : (set_attr "type" "ssemov")
5162 723 : (set_attr "c86_attr" "vpmovx")
5163 : (set_attr "prefix_extra" "1")
5164 723 : (set_attr "prefix" "orig,orig,maybe_evex")
5165 723 : (set_attr "mode" "TI")])
5166 116681 :
5167 115958 : (define_expand "<insn>v2qiv2hi2"
5168 3 : [(set (match_operand:V2HI 0 "register_operand")
5169 115961 : (any_extend:V2HI
5170 : (match_operand:V2QI 1 "register_operand")))]
5171 3 : "TARGET_SSE2"
5172 222 : {
5173 222 : if (!TARGET_SSE4_1)
5174 : {
5175 207 : ix86_expand_sse_extend (operands[0], operands[1], <u_bool>);
5176 8421 : DONE;
5177 : }
5178 :
5179 12 : rtx op1 = force_reg (V2QImode, operands[1]);
5180 8226 : op1 = lowpart_subreg (V4QImode, op1, V2QImode);
5181 8226 : emit_insn (gen_sse4_1_<code>v2qiv2hi2 (operands[0], op1));
5182 8226 : DONE;
5183 8214 : })
5184 8214 :
5185 8214 : (define_expand "trunc<mode><mmxhalfmodelower>2"
5186 2085 : [(set (match_operand:<mmxhalfmode> 0 "register_operand")
5187 10233 : (truncate:<mmxhalfmode>
5188 : (match_operand:VI2_32_64 1 "register_operand")))]
5189 2019 : "TARGET_AVX2"
5190 2042 : {
5191 2042 : if (TARGET_AVX512VL && TARGET_AVX512BW)
5192 2040 : emit_insn (gen_avx512vl_trunc<mode><mmxhalfmodelower>2 (operands[0], operands[1]));
5193 : else
5194 2021 : ix86_expand_trunc_with_avx2_noavx512f (operands[0], operands[1], <mmxbytemode>mode);
5195 859 : DONE;
5196 292 : })
5197 1128 :
5198 836 : (define_insn "avx512vl_trunc<mode><mmxhalfmodelower>2"
5199 938 : [(set (match_operand:<mmxhalfmode> 0 "register_operand" "=v")
5200 102 : (truncate:<mmxhalfmode>
5201 72 : (match_operand:VI2_32_64 1 "register_operand" "v")))]
5202 335 : "TARGET_AVX512VL && TARGET_AVX512BW"
5203 : "vpmovwb\t{%1, %0|%0, %1}"
5204 : [(set_attr "type" "ssemov")
5205 : (set_attr "prefix" "evex")
5206 73 : (set_attr "mode" "TI")])
5207 73 :
5208 425 : (define_mode_iterator V2QI_V2HI [V2QI V2HI])
5209 : (define_mode_attr v2qi_quad_v2hi_double
5210 352 : [(V2QI "V8QI") (V2HI "V4HI")])
5211 352 : (define_expand "truncv2si<mode>2"
5212 352 : [(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 39 : [(set_attr "type" "ssemov")
5231 15 : (set_attr "prefix" "evex")
5232 39 : (set_attr "mode" "TI")])
5233 :
5234 281 : ;; Pack/unpack vector modes
5235 : (define_mode_attr mmxpackmode
5236 335 : [(V4HI "V8QI") (V2SI "V4HI")])
5237 301 :
5238 335 : (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 723 : {
5244 723 : rtx op1 = gen_lowpart (<mmxpackmode>mode, operands[1]);
5245 723 : rtx op2 = gen_lowpart (<mmxpackmode>mode, operands[2]);
5246 723 : ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
5247 723 : 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 24 : {
5256 24 : rtx op1 = gen_lowpart (V4QImode, operands[1]);
5257 24 : rtx op2 = gen_lowpart (V4QImode, operands[2]);
5258 24 : ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
5259 24 : DONE;
5260 10 : })
5261 3 :
5262 10 : (define_mode_attr mmxunpackmode
5263 13 : [(V8QI "V4HI") (V4HI "V2SI")])
5264 10 :
5265 3 : (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 602 : "ix86_expand_sse_unpack (operands[0], operands[1], false, false); DONE;")
5270 :
5271 : (define_expand "vec_unpacks_hi_<mode>"
5272 : [(match_operand:<mmxunpackmode> 0 "register_operand")
5273 0 : (match_operand:MMXMODE12 1 "register_operand")]
5274 : "TARGET_MMX_WITH_SSE"
5275 602 : "ix86_expand_sse_unpack (operands[0], operands[1], false, true); DONE;")
5276 0 :
5277 0 : (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 900 : "ix86_expand_sse_unpack (operands[0], operands[1], true, false); DONE;")
5282 :
5283 451 : (define_expand "vec_unpacku_hi_<mode>"
5284 451 : [(match_operand:<mmxunpackmode> 0 "register_operand")
5285 451 : (match_operand:MMXMODE12 1 "register_operand")]
5286 : "TARGET_MMX_WITH_SSE"
5287 461 : "ix86_expand_sse_unpack (operands[0], operands[1], true, true); DONE;")
5288 :
5289 10 : (define_expand "vec_unpacks_lo_v4qi"
5290 10 : [(match_operand:V2HI 0 "register_operand")
5291 10 : (match_operand:V4QI 1 "register_operand")]
5292 : "TARGET_SSE2"
5293 75 : "ix86_expand_sse_unpack (operands[0], operands[1], false, false); DONE;")
5294 0 :
5295 75 : (define_expand "vec_unpacks_hi_v4qi"
5296 75 : [(match_operand:V2HI 0 "register_operand")
5297 75 : (match_operand:V4QI 1 "register_operand")]
5298 0 : "TARGET_SSE2"
5299 202 : "ix86_expand_sse_unpack (operands[0], operands[1], false, true); DONE;")
5300 71 :
5301 202 : (define_expand "vec_unpacku_lo_v4qi"
5302 273 : [(match_operand:V2HI 0 "register_operand")
5303 202 : (match_operand:V4QI 1 "register_operand")]
5304 71 : "TARGET_SSE2"
5305 10 : "ix86_expand_sse_unpack (operands[0], operands[1], true, false); DONE;")
5306 2384 :
5307 : (define_expand "vec_unpacku_hi_v4qi"
5308 2384 : [(match_operand:V2HI 0 "register_operand")
5309 0 : (match_operand:V4QI 1 "register_operand")]
5310 2384 : "TARGET_SSE2"
5311 10 : "ix86_expand_sse_unpack (operands[0], operands[1], true, true); DONE;")
5312 198 :
5313 : (define_insn "*mmx_pinsrd"
5314 198 : [(set (match_operand:V2SI 0 "register_operand" "=x,Yv")
5315 0 : (vec_merge:V2SI
5316 198 : (vec_duplicate:V2SI
5317 : (match_operand:SI 2 "nonimmediate_operand" "jrjm,rm"))
5318 61 : (match_operand:V2SI 1 "register_operand" "0,Yv")
5319 : (match_operand:SI 3 "const_int_operand")))]
5320 259 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE
5321 198 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
5322 259 : < GET_MODE_NUNITS (V2SImode))"
5323 98 : {
5324 52 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
5325 26 : switch (which_alternative)
5326 21 : {
5327 21 : case 1:
5328 0 : return "vpinsrd\t{%3, %2, %1, %0|%0, %1, %2, %3}";
5329 0 : case 0:
5330 21 : 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 0 : (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 63 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5352 406 : && (TARGET_SSE || TARGET_3DNOW_A)
5353 406 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
5354 15 : < GET_MODE_NUNITS (V4HImode))"
5355 251 : {
5356 41 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
5357 41 : switch (which_alternative)
5358 619 : {
5359 619 : case 3:
5360 : return "#";
5361 16 : case 2:
5362 1026 : 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 42 : (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 3 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
5393 3 : < GET_MODE_NUNITS (<MODE>mode))"
5394 : [(set (match_dup 0)
5395 3 : (vec_duplicate:V4FI_64 (match_dup 2)))
5396 : (set (match_dup 0)
5397 123 : (vec_merge:V4FI_64 (match_dup 1) (match_dup 0) (match_dup 3)))]
5398 126 : "operands[3] = GEN_INT (~INTVAL (operands[3]) & 0xf);")
5399 :
5400 : (define_insn "*mmx_pinsrb"
5401 126 : [(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 10 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
5409 10 : < GET_MODE_NUNITS (V8QImode))"
5410 15 : {
5411 28188 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
5412 1 : switch (which_alternative)
5413 28193 : {
5414 28194 : case 1:
5415 28187 : if (MEM_P (operands[2]))
5416 : return "vpinsrb\t{%3, %2, %1, %0|%0, %1, %2, %3}";
5417 7 : 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 2334 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5443 2334 : && (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 718 : pextrw\t{%2, %1, %0|%0, %1, %2}
5448 718 : vpextrw\t{%2, %1, %0|%0, %1, %2}"
5449 706 : [(set_attr "isa" "*,sse2,sse4_noavx,avx")
5450 718 : (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 14 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5464 0 : && (TARGET_SSE || TARGET_3DNOW_A)"
5465 8 : {
5466 8 : switch (which_alternative)
5467 : {
5468 1313 : case 0:
5469 1313 : case 1:
5470 1296 : return "%vpextrw\t{%2, %1, %k0|%k0, %1, %2}";
5471 1317 : 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 0 : (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 7132 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5501 7132 : && (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 5731 : [(set_attr "isa" "*,sse2")
5506 5731 : (set_attr "mmx_isa" "native,*")
5507 : (set_attr "type" "mmxcvt,sselog1")
5508 : (set_attr "c86_attr" "extr")
5509 : (set_attr "length_immediate" "1")
5510 : (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 0 : (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 2705 : "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 157 : vpextrb\t{%2, %1, %k0|%k0, %1, %2}
5523 157 : vpextrb\t{%2, %1, %0|%0, %1, %2}"
5524 121 : [(set_attr "isa" "noavx,noavx,avx,avx")
5525 157 : (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 4981 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5540 0 : "%vpextrb\t{%2, %1, %k0|%k0, %1, %2}"
5541 : [(set_attr "isa" "noavx,avx")
5542 : (set_attr "type" "sselog1")
5543 386 : (set_attr "c86_attr" "extr")
5544 386 : (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 2670 : "TARGET_SSSE3 && TARGET_MMX_WITH_SSE"
5556 281 : "@
5557 : pshufb\t{%2, %0|%0, %2}
5558 : vpshufb\t{%2, %1, %0|%0, %1, %2}"
5559 2919 : [(set_attr "isa" "noavx,avx")
5560 2919 : (set_attr "addr" "gpr16,*")
5561 2919 : (set_attr "type" "sselog1")
5562 2919 : (set_attr "prefix_extra" "1")
5563 2919 : (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 2721 : "TARGET_SSSE3"
5574 198 : "@
5575 : pshufb\t{%2, %0|%0, %2}
5576 : vpshufb\t{%2, %1, %0|%0, %1, %2}"
5577 : [(set_attr "isa" "noavx,avx")
5578 : (set_attr "addr" "gpr16,*")
5579 : (set_attr "type" "sselog1")
5580 : (set_attr "prefix_extra" "1")
5581 43851 : (set_attr "prefix" "orig,maybe_evex")
5582 43851 : (set_attr "btver2_decode" "vector")
5583 : (set_attr "mode" "TI")])
5584 11223 :
5585 11223 : (define_expand "mmx_pshufw"
5586 11223 : [(match_operand:V4HI 0 "register_operand")
5587 : (match_operand:V4HI 1 "register_mmxmem_operand")
5588 11139 : (match_operand:SI 2 "const_int_operand")]
5589 11139 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5590 11139 : && (TARGET_SSE || TARGET_3DNOW_A)"
5591 75 : {
5592 9500 : int mask = INTVAL (operands[2]);
5593 9500 : emit_insn (gen_mmx_pshufwv4hi_1 (operands[0], operands[1],
5594 9425 : GEN_INT ((mask >> 0) & 3),
5595 14977 : 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 417 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5610 0 : && (TARGET_SSE || TARGET_3DNOW_A)"
5611 6500 : {
5612 1164 : int mask = 0;
5613 1164 : mask |= INTVAL (operands[2]) << 0;
5614 13283 : mask |= INTVAL (operands[3]) << 2;
5615 13283 : mask |= INTVAL (operands[4]) << 4;
5616 10194 : mask |= INTVAL (operands[5]) << 6;
5617 9030 : operands[2] = GEN_INT (mask);
5618 19350 :
5619 1164 : switch (which_alternative)
5620 : {
5621 : case 0:
5622 : return "pshufw\t{%2, %1, %0|%0, %1, %2}";
5623 1164 : case 1:
5624 5572063 : return "%vpshuflw\t{%2, %1, %0|%0, %1, %2}";
5625 0 : default:
5626 0 : gcc_unreachable ();
5627 : }
5628 5570899 : }
5629 5570899 : [(set_attr "isa" "*,sse2")
5630 5570899 : (set_attr "mmx_isa" "native,*")
5631 5570899 : (set_attr "type" "mmxcvt,sselog1")
5632 5572847 : (set_attr "length_immediate" "1")
5633 5570899 : (set_attr "mode" "DI,TI")])
5634 5570899 :
5635 : (define_insn "*mmx_pshufd_1"
5636 16900 : [(set (match_operand:V2SI 0 "register_operand" "=Yv")
5637 16900 : (vec_select:V2SI
5638 : (match_operand:V2SI 1 "register_operand" "Yv")
5639 16900 : (parallel [(match_operand 2 "const_0_to_1_operand")
5640 16900 : (match_operand 3 "const_0_to_1_operand")])))]
5641 27124 : "TARGET_MMX_WITH_SSE"
5642 784 : {
5643 17684 : int mask = 0;
5644 17684 : mask |= INTVAL (operands[2]) << 0;
5645 17691 : mask |= INTVAL (operands[3]) << 2;
5646 791 : mask |= 2 << 4;
5647 17691 : mask |= 3 << 6;
5648 791 : operands[2] = GEN_INT (mask);
5649 7 :
5650 1808 : return "%vpshufd\t{%2, %1, %0|%0, %1, %2}";
5651 48 : }
5652 1053 : [(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 2953 : "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 6234 : vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
5668 6234 : [(set_attr "isa" "noavx,noavx,avx")
5669 : (set_attr "type" "ssemov")
5670 6234 : (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 1 : "TARGET_SSE4_1"
5683 : "@
5684 : pblendw\t{%3, %2, %0|%0, %2, %3}
5685 : pblendw\t{%3, %2, %0|%0, %2, %3}
5686 64 : vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
5687 64 : [(set_attr "isa" "noavx,noavx,avx")
5688 : (set_attr "type" "ssemov")
5689 163606 : (set_attr "c86_attr" "blend")
5690 : (set_attr "prefix_extra" "1")
5691 68808 : (set_attr "length_immediate" "1")
5692 68808 : (set_attr "prefix" "orig,orig,vex")
5693 : (set_attr "mode" "TI")])
5694 2319 :
5695 2319 : ;; Optimize V2SImode load from memory, swapping the elements and
5696 : ;; storing back into the memory into DImode rotate of the memory by 32.
5697 2319 : (define_split
5698 : [(set (match_operand:V2SI 0 "memory_operand")
5699 : (vec_select:V2SI (match_dup 0)
5700 : (parallel [(const_int 1) (const_int 0)])))]
5701 71 : "TARGET_64BIT && (TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())"
5702 71 : [(set (match_dup 0)
5703 : (rotate:DI (match_dup 0) (const_int 32)))]
5704 71 : "operands[0] = adjust_address (operands[0], DImode, 0);")
5705 :
5706 : (define_insn "mmx_pswapdv2si2"
5707 71 : [(set (match_operand:V2SI 0 "register_operand" "=y,Yv")
5708 : (vec_select:V2SI
5709 463306 : (match_operand:V2SI 1 "register_mmxmem_operand" "ym,Yv")
5710 : (parallel [(const_int 1) (const_int 0)])))]
5711 283299 : "TARGET_3DNOW_A"
5712 430370 : "@
5713 : pswapd\t{%1, %0|%0, %1}
5714 207359 : %vpshufd\t{$0xe1, %1, %0|%0, %1, 0xe1}";
5715 1283088 : [(set_attr "isa" "*,sse2")
5716 1373664 : (set_attr "mmx_isa" "native,*")
5717 1283088 : (set_attr "type" "mmxcvt,sselog1")
5718 12 : (set_attr "prefix_extra" "1,*")
5719 1283100 : (set_attr "length_immediate" "*,1")
5720 12 : (set_attr "mode" "DI,TI")])
5721 906414 :
5722 906414 : (define_insn "*vec_dupv4hi"
5723 : [(set (match_operand:V4HI 0 "register_operand" "=y,Yw")
5724 105860 : (vec_duplicate:V4HI
5725 105860 : (truncate:HI
5726 : (match_operand:SI 1 "register_operand" "0,Yw"))))]
5727 20506 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5728 20422 : && (TARGET_SSE || TARGET_3DNOW_A)"
5729 0 : "@
5730 : pshufw\t{$0, %0, %0|%0, %0, 0}
5731 : %vpshuflw\t{$0, %1, %0|%0, %1, 0}"
5732 252 : [(set_attr "isa" "*,sse2")
5733 252 : (set_attr "mmx_isa" "native,*")
5734 252 : (set_attr "type" "mmxcvt,sselog1")
5735 252 : (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 32 : "TARGET_MMX_WITH_SSE"
5743 75 : "%vpshuflw\t{$0, %1, %0|%0, %1, 0}"
5744 : [(set_attr "isa" "sse2")
5745 : (set_attr "type" "sselog1")
5746 14498 : (set_attr "length_immediate" "1")
5747 14498 : (set_attr "mode" "TI")])
5748 13274 :
5749 13274 : (define_insn "*vec_dupv2si"
5750 17949 : [(set (match_operand:V2SI 0 "register_operand" "=y,Yv")
5751 : (vec_duplicate:V2SI
5752 : (match_operand:SI 1 "register_operand" "0,Yv")))]
5753 10147 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
5754 1168 : "@
5755 : punpckldq\t%0, %0
5756 : %vpshufd\t{$0xe0, %1, %0|%0, %1, 0xe0}"
5757 61 : [(set_attr "isa" "*,sse2")
5758 61 : (set_attr "mmx_isa" "native,*")
5759 50 : (set_attr "type" "mmxcvt,sselog1")
5760 50 : (set_attr "prefix_data16" "*,1")
5761 61 : (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 266757 : "TARGET_MMX && !TARGET_SSE"
5770 : "@
5771 266757 : 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 202 : {
5782 202 : if (CONST_INT_P (operands[2]))
5783 200 : ix86_expand_vector_set (TARGET_MMX_WITH_SSE, operands[0], operands[1],
5784 200 : INTVAL (operands[2]));
5785 : else
5786 2 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
5787 202 : 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 30154 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5798 30154 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
5799 : "#"
5800 4832 : "&& reload_completed"
5801 2384 : [(set (match_dup 0) (match_dup 1))]
5802 369649 : "operands[1] = gen_lowpart (SImode, operands[1]);"
5803 367265 : [(set_attr "isa" "*,*,*,*,*,sse2")
5804 491221 : (set_attr "mmx_isa" "*,*,native,native,*,*")
5805 126340 : (set (attr "preferred_for_speed")
5806 123956 : (cond [(eq_attr "alternative" "5")
5807 : (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
5808 2384 : ]
5809 : (symbol_ref "true")))])
5810 :
5811 : (define_insn "*vec_extractv2si_0_zext_sse4"
5812 : [(set (match_operand:DI 0 "register_operand" "=r,x")
5813 9 : (zero_extend:DI
5814 : (vec_select:SI
5815 9 : (match_operand:V2SI 1 "register_operand" "x,x")
5816 9 : (parallel [(const_int 0)]))))]
5817 856 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE4_1"
5818 : "#"
5819 847 : [(set_attr "isa" "x64,*")
5820 : (set (attr "preferred_for_speed")
5821 : (cond [(eq_attr "alternative" "0")
5822 : (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
5823 : ]
5824 : (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 847 : && TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_FROM_VEC"
5834 : "#")
5835 :
5836 : (define_split
5837 : [(set (match_operand:DI 0 "register_operand")
5838 3121 : (zero_extend:DI
5839 3121 : (vec_select:SI
5840 : (match_operand:V2SI 1 "register_operand")
5841 2622 : (parallel [(const_int 0)]))))]
5842 396 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5843 396 : && TARGET_SSE2 && reload_completed"
5844 198 : [(set (match_dup 0) (zero_extend:DI (match_dup 1)))]
5845 198 : "operands[1] = gen_lowpart (SImode, operands[1]);")
5846 :
5847 1366 : ;; Avoid combining registers from different units in a single alternative,
5848 1564 : ;; see comment above inline_secondary_memory_needed function in i386.cc
5849 1366 : (define_insn "*vec_extractv2si_1"
5850 : [(set (match_operand:SI 0 "nonimmediate_operand" "=y,jrjm,rm,x,x,y,x,r")
5851 198 : (vec_select:SI
5852 : (match_operand:V2SI 1 "nonimmediate_operand" " 0,x, x ,x,0,o,o,o")
5853 : (parallel [(const_int 1)])))]
5854 19405 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5855 19405 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
5856 847 : "@
5857 : punpckhdq\t%0, %0
5858 847 : pextrd\t{$1, %1, %0|%0, %1, 1}
5859 209215 : vpextrd\t{$1, %1, %0|%0, %1, 1}
5860 209215 : %vpshufd\t{$0xe5, %1, %0|%0, %1, 0xe5}
5861 202100 : shufps\t{$0xe5, %0, %0|%0, %0, 0xe5}
5862 202100 : #
5863 407994 : #
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 62 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && reload_completed"
5886 61 : [(set (match_dup 0) (match_dup 1))]
5887 61 : "operands[1] = adjust_address (operands[1], SImode, 4);")
5888 :
5889 5365 : (define_insn "*vec_extractv2si_1_zext"
5890 5426 : [(set (match_operand:DI 0 "register_operand" "=jr,r")
5891 4095 : (zero_extend:DI
5892 4095 : (vec_select:SI
5893 5455 : (match_operand:V2SI 1 "register_operand" "x,x")
5894 : (parallel [(const_int 1)]))))]
5895 968 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
5896 968 : && 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 3972 : (set_attr "prefix" "maybe_vex")
5904 3972 : (set_attr "mode" "TI")])
5905 :
5906 1448 : (define_insn_and_split "*vec_extractv2si_zext_mem"
5907 1448 : [(set (match_operand:DI 0 "register_operand" "=y,x,r")
5908 2 : (zero_extend:DI
5909 1450 : (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 2 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_64BIT"
5913 1446 : "#"
5914 0 : "&& reload_completed"
5915 : [(set (match_dup 0) (zero_extend:DI (match_dup 1)))]
5916 0 : {
5917 2497 : operands[1] = adjust_address (operands[1], SImode, INTVAL (operands[2]) * 4);
5918 745 : }
5919 3242 : [(set_attr "isa" "*,sse2,*")
5920 2497 : (set_attr "mmx_isa" "native,*,*")])
5921 745 :
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 9565 : {
5928 9565 : ix86_expand_vector_extract (TARGET_MMX_WITH_SSE, operands[0],
5929 13049 : operands[1], INTVAL (operands[2]));
5930 9565 : DONE;
5931 3484 : })
5932 3484 :
5933 3484 : (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 18619 : {
5938 34449 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
5939 : operands[1]);
5940 18619 : DONE;
5941 : })
5942 :
5943 2 : (define_expand "vec_set<mode>"
5944 : [(match_operand:V4FI_64 0 "register_operand")
5945 2 : (match_operand:<mmxscalarmode> 1 "register_operand")
5946 2 : (match_operand 2 "vec_setm_mmx_operand")]
5947 2 : "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 7 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
5954 11 : DONE;
5955 4 : })
5956 4 :
5957 4 : (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 856 : {
5963 884 : ix86_expand_vector_extract (TARGET_MMX_WITH_SSE, operands[0],
5964 856 : operands[1], INTVAL (operands[2]));
5965 856 : DONE;
5966 : })
5967 1068 :
5968 : (define_expand "vec_initv4hihi"
5969 1068 : [(match_operand:V4HI 0 "register_operand")
5970 1068 : (match_operand 1)]
5971 1068 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE"
5972 3484 : {
5973 3489 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
5974 : operands[1]);
5975 3484 : DONE;
5976 : })
5977 :
5978 2 : (define_expand "vec_init<mode><mmxscalarmodelower>"
5979 0 : [(match_operand:V4F_64 0 "register_operand")
5980 2 : (match_operand 1)]
5981 2 : "TARGET_MMX_WITH_SSE"
5982 29 : {
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 0 : "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
5993 3 : {
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 29 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
5999 2 : DONE;
6000 27 : })
6001 27 :
6002 27 : (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 343 : {
6018 347 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
6019 : operands[1]);
6020 343 : DONE;
6021 : })
6022 :
6023 442 : (define_insn "*pinsrw"
6024 : [(set (match_operand:V2FI_32 0 "register_operand" "=x,YW,&x")
6025 442 : (vec_merge:V2FI_32
6026 442 : (vec_duplicate:V2FI_32
6027 442 : (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 7 : "TARGET_SSE2
6031 682 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
6032 7 : < GET_MODE_NUNITS (V2HImode))"
6033 538 : {
6034 61 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6035 63 : switch (which_alternative)
6036 1152 : {
6037 1152 : case 2:
6038 : return "#";
6039 1 : case 1:
6040 1826 : 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 61 : (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 1 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
6069 1 : < GET_MODE_NUNITS (<MODE>mode))"
6070 : [(set (match_dup 0)
6071 1 : (vec_duplicate:V2FI_32 (match_dup 2)))
6072 : (set (match_dup 0)
6073 232 : (vec_merge:V2FI_32 (match_dup 1) (match_dup 0) (match_dup 3)))]
6074 233 : "operands[3] = GEN_INT (~INTVAL (operands[3]) & 0x3);")
6075 :
6076 :
6077 233 : (define_insn "*pinsrb"
6078 : [(set (match_operand:V4QI 0 "register_operand" "=x,YW")
6079 1439488 : (vec_merge:V4QI
6080 : (vec_duplicate:V4QI
6081 1439488 : (match_operand:QI 2 "nonimmediate_operand" "jrjm,rm"))
6082 1439489 : (match_operand:V4QI 1 "register_operand" "0,YW")
6083 1439488 : (match_operand:SI 3 "const_int_operand")))]
6084 0 : "TARGET_SSE4_1
6085 1439488 : && ((unsigned) exact_log2 (INTVAL (operands[3]))
6086 0 : < GET_MODE_NUNITS (V4QImode))"
6087 78 : {
6088 1117230 : operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6089 93 : switch (which_alternative)
6090 93 : {
6091 93 : case 1:
6092 0 : if (MEM_P (operands[2]))
6093 15 : return "vpinsrb\t{%3, %2, %1, %0|%0, %1, %2, %3}";
6094 3041 : else
6095 3041 : return "vpinsrb\t{%3, %k2, %1, %0|%0, %1, %k2, %3}";
6096 0 : case 0:
6097 81 : if (MEM_P (operands[2]))
6098 81 : 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 0 : }
6104 0 : }
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 706 : "TARGET_SSE2"
6120 : "@
6121 : %vpextrw\t{%2, %1, %k0|%k0, %1, %2}
6122 : pextrw\t{%2, %1, %0|%0, %1, %2}
6123 18553 : vpextrw\t{%2, %1, %0|%0, %1, %2}"
6124 18553 : [(set_attr "isa" "*,sse4_noavx,avx")
6125 18380 : (set_attr "addr" "*,gpr16,*")
6126 36933 : (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 1296 : "TARGET_SSE2"
6138 102 : {
6139 85 : switch (which_alternative)
6140 : {
6141 3917 : case 0:
6142 3917 : return "%vpextrw\t{%2, %1, %k0|%k0, %1, %2}";
6143 3770 : case 1:
6144 7687 : 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 0 : (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 0 : (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 5775 : "TARGET_SSE2"
6173 : "%vpextrw\t{%2, %1, %k0|%k0, %1, %2}"
6174 : [(set_attr "type" "sselog1")
6175 : (set_attr "c86_attr" "extr")
6176 55845 : (set_attr "length_immediate" "1")
6177 55845 : (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 121 : "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 5252 : (set_attr "type" "sselog1")
6194 5252 : (set_attr "c86_attr" "extr")
6195 2862 : (set_attr "prefix_extra" "1")
6196 8114 : (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 386 : "TARGET_SSE4_1"
6207 0 : "%vpextrb\t{%2, %1, %k0|%k0, %1, %2}"
6208 : [(set_attr "isa" "noavx,avx")
6209 : (set_attr "type" "sselog1")
6210 14232 : (set_attr "c86_attr" "extr")
6211 14232 : (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 537 : {
6236 537 : ix86_expand_vector_extract (false, operands[0],
6237 537 : operands[1], INTVAL (operands[2]));
6238 537 : DONE;
6239 : })
6240 483 :
6241 : (define_expand "vec_setv4qi"
6242 483 : [(match_operand:V4QI 0 "register_operand")
6243 483 : (match_operand:QI 1 "register_operand")
6244 483 : (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 4324 : ix86_expand_vector_set_var (operands[0], operands[1], operands[2]);
6252 182 : DONE;
6253 4322 : })
6254 4502 :
6255 4322 : (define_expand "vec_extractv4qiqi"
6256 180 : [(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 78 : {
6261 78 : ix86_expand_vector_extract (false, operands[0],
6262 78 : operands[1], INTVAL (operands[2]));
6263 78 : DONE;
6264 : })
6265 0 :
6266 : (define_insn_and_split "*punpckwd"
6267 0 : [(set (match_operand:V2FI_32 0 "register_operand" "=x,Yw")
6268 0 : (vec_select:V2FI_32
6269 0 : (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 0 : "TARGET_SSE2"
6275 0 : "#"
6276 23 : "&& reload_completed"
6277 : [(set (match_dup 5)
6278 2002 : (vec_select:<mmxxmmmode>
6279 1822 : (match_dup 5)
6280 383 : (parallel [(match_dup 3) (match_dup 4)
6281 360 : (const_int 2) (const_int 3)
6282 5935 : (const_int 4) (const_int 5)
6283 5935 : (const_int 6) (const_int 7)])))]
6284 1040 : {
6285 1050 : rtx dest = lowpart_subreg (<mmxxmmmode>mode, operands[0], <MODE>mode);
6286 180 : rtx op1 = lowpart_subreg (<mmxxmmmode>mode, operands[1], <MODE>mode);
6287 180 : rtx op2 = lowpart_subreg (<mmxxmmmode>mode, operands[2], <MODE>mode);
6288 :
6289 180 : emit_insn (gen_vec_interleave_low<mmxxmmmodelower> (dest, op1, op2));
6290 :
6291 180 : static const int map[4] = { 0, 2, 1, 3 };
6292 :
6293 180 : int sel0 = map[INTVAL (operands[3])];
6294 180 : int sel1 = map[INTVAL (operands[4])];
6295 :
6296 180 : if (sel0 == 0 && sel1 == 1)
6297 69 : DONE;
6298 :
6299 111 : operands[3] = GEN_INT (sel0);
6300 111 : operands[4] = GEN_INT (sel1);
6301 111 : operands[5] = dest;
6302 : }
6303 : [(set_attr "isa" "noavx,avx")
6304 : (set_attr "type" "sselog")
6305 111 : (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 111 : (parallel [(match_operand 2 "const_0_to_1_operand")
6312 : (match_operand 3 "const_0_to_1_operand")])))]
6313 0 : "TARGET_SSE2"
6314 84 : {
6315 84 : int mask = 0;
6316 102 : mask |= INTVAL (operands[2]) << 0;
6317 1881 : mask |= INTVAL (operands[3]) << 2;
6318 1899 : mask |= 2 << 4;
6319 1737 : mask |= 3 << 6;
6320 1653 : operands[2] = GEN_INT (mask);
6321 3115 :
6322 147226 : return "%vpshuflw\t{%2, %1, %0|%0, %1, %2}";
6323 28350 : }
6324 15649 : [(set_attr "type" "sselog1")
6325 1251 : (set_attr "length_immediate" "1")
6326 1251 : (set_attr "mode" "TI")])
6327 147265 :
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 252 : "TARGET_SSE2"
6334 0 : "%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 50 : "TARGET_SSE2"
6344 66 : "%vpshuflw\t{$0, %1, %0|%0, %1, 0}"
6345 : [(set_attr "type" "sselog1")
6346 : (set_attr "length_immediate" "1")
6347 6669 : (set_attr "mode" "TI")])
6348 1074 :
6349 1019 : (define_expand "vec_init<mode><mmxscalarmodelower>"
6350 1019 : [(match_operand:V2FI_32 0 "register_operand")
6351 2093 : (match_operand 1)]
6352 1010 : "TARGET_SSE2"
6353 6078 : {
6354 7145 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
6355 5595 : operands[1]);
6356 1493 : DONE;
6357 5595 : })
6358 1010 :
6359 5595 : (define_expand "vec_initv4qiqi"
6360 5595 : [(match_operand:V2HI 0 "register_operand")
6361 758 : (match_operand 1)]
6362 758 : "TARGET_SSE2"
6363 5922 : {
6364 8525 : ix86_expand_vector_init (TARGET_MMX_WITH_SSE, operands[0],
6365 : operands[1]);
6366 8444 : DONE;
6367 4122 : })
6368 4074 :
6369 8606 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6370 : ;;
6371 408 : ;; Miscellaneous
6372 408 : ;;
6373 408 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6374 :
6375 : (define_expand "mmx_uavg<mode>3"
6376 : [(set (match_operand:MMXMODE12 0 "register_operand")
6377 : (truncate:MMXMODE12
6378 : (lshiftrt:<mmxdoublemode>
6379 16 : (plus:<mmxdoublemode>
6380 : (plus:<mmxdoublemode>
6381 16 : (zero_extend:<mmxdoublemode>
6382 16 : (match_operand:MMXMODE12 1 "register_mmxmem_operand"))
6383 16 : (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 343 : (const_int 1) (const_int 1)
6407 : (const_int 1) (const_int 1)]))
6408 343 : (const_int 1))))]
6409 549 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
6410 549 : && (TARGET_SSE || TARGET_3DNOW)
6411 206 : && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
6412 206 : {
6413 39 : switch (which_alternative)
6414 : {
6415 152 : case 2:
6416 152 : return "vpavgb\t{%2, %1, %0|%0, %1, %2}";
6417 167 : case 1:
6418 15 : case 0:
6419 152 : /* These two instructions have the same operation, but their encoding
6420 152 : is different. Prefer the one that is de facto standard. */
6421 15 : if (TARGET_SSE || TARGET_3DNOW_A)
6422 152 : return "pavgb\t{%2, %0|%0, %2}";
6423 152 : else
6424 0 : return "pavgusb\t{%2, %0|%0, %2}";
6425 152 : default:
6426 152 : gcc_unreachable ();
6427 : }
6428 152 : }
6429 : [(set_attr "isa" "*,sse2_noavx,avx")
6430 132 : (set_attr "mmx_isa" "native,*,*")
6431 132 : (set_attr "type" "mmxshft,sseiadd,sseiadd")
6432 : (set (attr "prefix_extra")
6433 : (if_then_else
6434 188 : (not (ior (match_test "TARGET_SSE")
6435 132 : (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 191290 : (plus:V4SI
6445 191290 : (plus:V4SI
6446 191290 : (zero_extend:V4SI
6447 191290 : (match_operand:V4HI 1 "register_mmxmem_operand" "%0,0,Yw"))
6448 191290 : (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 120 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
6454 120 : && (TARGET_SSE || TARGET_3DNOW_A)
6455 120 : && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
6456 12 : "@
6457 152 : pavgw\t{%2, %0|%0, %2}
6458 152 : pavgw\t{%2, %0|%0, %2}
6459 172 : vpavgw\t{%2, %1, %0|%0, %1, %2}"
6460 172 : [(set_attr "isa" "*,sse2_noavx,avx")
6461 152 : (set_attr "mmx_isa" "native,*,*")
6462 152 : (set_attr "type" "mmxshft,sseiadd,sseiadd")
6463 20 : (set_attr "mode" "DI,TI,TI")])
6464 :
6465 11161 : (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 62 : "operands[3] = CONST1_RTX(<mmxdoublemode>mode);")
6479 :
6480 : (define_insn "uavgv4qi3_ceil"
6481 : [(set (match_operand:V4QI 0 "register_operand" "=x,Yw")
6482 116 : (truncate:V4QI
6483 54 : (lshiftrt:V4HI
6484 54 : (plus:V4HI
6485 54 : (plus:V4HI
6486 : (zero_extend:V4HI
6487 62 : (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 30 : (const_int 1))))]
6493 5 : "TARGET_SSE2"
6494 700203 : "@
6495 700188 : pavgb\t{%2, %0|%0, %2}
6496 700188 : 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 222 : (define_insn "uavgv2qi3_ceil"
6502 222 : [(set (match_operand:V2QI 0 "register_operand" "=x,Yw")
6503 222 : (truncate:V2QI
6504 : (lshiftrt:V2HI
6505 222 : (plus:V2HI
6506 222 : (plus:V2HI
6507 : (zero_extend:V2HI
6508 222 : (match_operand:V2QI 1 "register_operand" "%0,Yw"))
6509 : (zero_extend:V2HI
6510 202 : (match_operand:V2QI 2 "register_operand" "x,Yw")))
6511 202 : (const_vector:V2HI [(const_int 1) (const_int 1)]))
6512 : (const_int 1))))]
6513 110 : "TARGET_SSE2"
6514 202 : "@
6515 : pavgb\t{%2, %0|%0, %2}
6516 : vpavgb\t{%2, %1, %0|%0, %1, %2}"
6517 20 : [(set_attr "isa" "noavx,avx")
6518 20 : (set_attr "type" "sseiadd")
6519 : (set_attr "mode" "TI")])
6520 :
6521 20 : (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 5 : "TARGET_SSE2"
6534 15 : "@
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 527 : UNSPEC_PSADBW))]
6546 527 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && (TARGET_SSE || TARGET_3DNOW_A)"
6547 890 : "ix86_fixup_binary_operands_no_copy (PLUS, V8QImode, operands);")
6548 :
6549 522 : (define_insn "*mmx_psadbw"
6550 522 : [(set (match_operand:V1DI 0 "register_operand" "=y,x,Yw")
6551 885 : (unspec:V1DI [(match_operand:V8QI 1 "register_mmxmem_operand" "%0,0,Yw")
6552 522 : (match_operand:V8QI 2 "register_mmxmem_operand" "ym,x,Yw")]
6553 522 : UNSPEC_PSADBW))]
6554 5999 : "(TARGET_MMX || TARGET_MMX_WITH_SSE) && (TARGET_SSE || TARGET_3DNOW_A)
6555 6362 : && ix86_binary_operator_ok (PLUS, V8QImode, operands)"
6556 4473 : "@
6557 522 : psadbw\t{%2, %0|%0, %2}
6558 522 : psadbw\t{%2, %0|%0, %2}
6559 837 : vpsadbw\t{%2, %1, %0|%0, %1, %2}"
6560 1000 : [(set_attr "isa" "*,sse2_noavx,avx")
6561 163 : (set_attr "mmx_isa" "native,*,*")
6562 836 : (set_attr "type" "mmxshft,sseiadd,sseiadd")
6563 0 : (set_attr "c86_attr" "sadbw")
6564 359 : (set_attr "mode" "DI,TI,TI")])
6565 338 :
6566 137 : (define_expand "reduc_<code>_scal_<mode>"
6567 120 : [(any_logic:MMXMODE12
6568 403 : (match_operand:<mmxscalarmode> 0 "register_operand")
6569 : (match_operand:MMXMODE12 1 "register_operand"))]
6570 : "TARGET_MMX_WITH_SSE"
6571 48 : {
6572 48 : rtx tmp = gen_reg_rtx (<MODE>mode);
6573 48 : ix86_expand_reduc (gen_<code><mode>3, tmp, operands[1]);
6574 48 : emit_insn (gen_vec_extract<mode><mmxscalarmodelower> (operands[0],
6575 : tmp, const0_rtx));
6576 48 : 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 30 : {
6585 30 : rtx tmp = gen_reg_rtx (V4QImode);
6586 30 : ix86_expand_reduc (gen_<code>v4qi3, tmp, operands[1]);
6587 30 : emit_insn (gen_vec_extractv4qiqi (operands[0], tmp, const0_rtx));
6588 30 : DONE;
6589 243 : })
6590 :
6591 243 : (define_expand "reduc_plus_scal_v8qi"
6592 243 : [(plus:V8QI
6593 243 : (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 231 : {
6612 231 : rtx tmp = gen_reg_rtx (V4HImode);
6613 231 : ix86_expand_reduc (gen_addv4hi3, tmp, operands[1]);
6614 231 : emit_insn (gen_vec_extractv4hihi (operands[0], tmp, const0_rtx));
6615 231 : DONE;
6616 5 : })
6617 :
6618 5 : (define_expand "reduc_<code>_scal_v4hi"
6619 5 : [(smaxmin:V4HI
6620 5 : (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 318 : })
6629 :
6630 318 : (define_expand "reduc_<code>_scal_v4qi"
6631 318 : [(smaxmin:V4QI
6632 318 : (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 16 : })
6641 :
6642 16 : (define_expand "reduc_<code>_scal_v4hi"
6643 16 : [(umaxmin:V4HI
6644 16 : (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 12 : })
6653 :
6654 12 : (define_expand "reduc_<code>_scal_v4qi"
6655 12 : [(umaxmin:V4QI
6656 12 : (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 45 : })
6665 :
6666 45 : (define_expand "reduc_plus_scal_v4qi"
6667 45 : [(plus:V4QI
6668 45 : (match_operand:QI 0 "register_operand")
6669 : (match_operand:V4QI 1 "register_operand"))]
6670 : "TARGET_SSE2"
6671 318 : {
6672 318 : rtx op1 = gen_reg_rtx (V16QImode);
6673 318 : emit_insn (gen_vec_setv4si_0 (lowpart_subreg (V4SImode, op1, V16QImode),
6674 : CONST0_RTX (V4SImode),
6675 : lowpart_subreg (SImode,
6676 1 : operands[1],
6677 22 : V4QImode)));
6678 319 : rtx tmp = gen_reg_rtx (V16QImode);
6679 341 : emit_move_insn (tmp, CONST0_RTX (V16QImode));
6680 318 : rtx tmp2 = gen_reg_rtx (V2DImode);
6681 340 : emit_insn (gen_sse2_psadbw (tmp2, op1, tmp));
6682 318 : tmp2 = gen_lowpart (V16QImode, tmp2);
6683 319 : emit_insn (gen_vec_extractv16qiqi (operands[0], tmp2, const0_rtx));
6684 318 : DONE;
6685 : })
6686 :
6687 : (define_expand "usadv8qi"
6688 15 : [(match_operand:V2SI 0 "register_operand")
6689 : (match_operand:V8QI 1 "register_operand")
6690 15 : (match_operand:V8QI 2 "register_operand")
6691 15 : (match_operand:V2SI 3 "register_operand")]
6692 : "TARGET_MMX_WITH_SSE"
6693 5 : {
6694 5 : rtx t1 = gen_reg_rtx (V1DImode);
6695 5 : rtx t2 = gen_reg_rtx (V2SImode);
6696 5 : emit_insn (gen_mmx_psadbw (t1, operands[1], operands[2]));
6697 20120 : convert_move (t2, t1, 0);
6698 5 : emit_insn (gen_addv2si3 (operands[0], t2, operands[3]));
6699 20120 : DONE;
6700 20115 : })
6701 20115 :
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 112 : if ((TARGET_AVX512VNNI && TARGET_AVX512VL)
6714 5 : || TARGET_AVXVNNI)
6715 105 : {
6716 110 : rtx op1 = lowpart_subreg (V16QImode, operands[1], V8QImode);
6717 5 : 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 9 : {
6753 9 : operands[1] = force_reg (V8QImode, operands[1]);
6754 9 : operands[2] = force_reg (V8QImode, operands[2]);
6755 9 : operands[3] = force_reg (V2SImode, operands[3]);
6756 :
6757 538025 : if (TARGET_AVXVNNIINT8)
6758 : {
6759 538021 : rtx op1 = lowpart_subreg (V16QImode, operands[1], V8QImode);
6760 538021 : rtx op2 = lowpart_subreg (V16QImode, operands[2], V8QImode);
6761 538021 : 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 4 : rtx op1 = gen_reg_rtx (V8HImode);
6770 4 : rtx op2 = gen_reg_rtx (V8HImode);
6771 4 : rtx op3 = gen_reg_rtx (V4SImode);
6772 4 : rtx op0 = gen_reg_rtx (V4SImode);
6773 4 : rtx op0_1 = gen_reg_rtx (V4SImode);
6774 :
6775 4 : emit_move_insn (op3, CONST0_RTX (V4SImode));
6776 4 : emit_insn (gen_extendv8qiv8hi2 (op1, operands[1]));
6777 4 : emit_insn (gen_extendv8qiv8hi2 (op2, operands[2]));
6778 4 : emit_insn (gen_sdot_prodv4siv8hi (op0, op1, op2, op3));
6779 :
6780 : /* vec_perm (op0, 2, 3, 0, 1); */
6781 4 : emit_insn (gen_sse2_pshufd (op0_1, op0, GEN_INT (78)));
6782 4 : emit_insn (gen_addv4si3 (op0, op0, op0_1));
6783 4 : emit_insn (gen_addv2si3 (operands[0], operands[3],
6784 : lowpart_subreg (V2SImode, op0, V4SImode)));
6785 : }
6786 9 : 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 152 : if (TARGET_AVXVNNIINT8)
6802 : {
6803 148 : rtx op1 = lowpart_subreg (V16QImode, operands[1], V8QImode);
6804 148 : rtx op2 = lowpart_subreg (V16QImode, operands[2], V8QImode);
6805 148 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6806 5 : rtx op0 = gen_reg_rtx (V4SImode);
6807 :
6808 5 : 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 4 : rtx op1 = gen_reg_rtx (V8HImode);
6814 4 : rtx op2 = gen_reg_rtx (V8HImode);
6815 4 : rtx op3 = gen_reg_rtx (V4SImode);
6816 4 : rtx op0 = gen_reg_rtx (V4SImode);
6817 4 : 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 16607 : rtx op1 = lowpart_subreg (V8HImode, operands[1], V4HImode);
6846 3 : rtx op2 = lowpart_subreg (V8HImode, operands[2], V4HImode);
6847 16607 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6848 16607 : rtx op0 = gen_reg_rtx (V4SImode);
6849 16604 :
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 9236 : rtx op1 = lowpart_subreg (V8HImode, operands[1], V4HImode);
6867 3 : rtx op2 = lowpart_subreg (V8HImode, operands[2], V4HImode);
6868 9236 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6869 9236 : rtx op0 = gen_reg_rtx (V4SImode);
6870 9233 :
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 14956 : rtx op1 = lowpart_subreg (V8HImode, operands[1], V4HImode);
6888 42 : rtx op2 = lowpart_subreg (V8HImode, operands[2], V4HImode);
6889 14956 : rtx op3 = lowpart_subreg (V4SImode, operands[3], V2SImode);
6890 14956 : rtx op0 = gen_reg_rtx (V4SImode);
6891 14914 :
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 111 : "(TARGET_MMX || TARGET_MMX_WITH_SSE)
6902 111 : && (TARGET_SSE || TARGET_3DNOW_A)"
6903 : "@
6904 : pmovmskb\t{%1, %0|%0, %1}
6905 : #
6906 109 : #"
6907 153 : "TARGET_SSE2 && reload_completed
6908 128999 : && SSE_REGNO_P (REGNO (operands[1]))"
6909 22 : [(set (match_dup 0)
6910 144679 : (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK))
6911 144679 : (set (match_dup 0)
6912 128868 : (zero_extend:SI (match_dup 2)))]
6913 5019 : {
6914 4997 : /* Generate SSE pmovmskb and zero-extend from QImode to SImode. */
6915 44 : 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 0 : }
6920 0 : [(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 17069 : (define_insn "*mmx_maskmovq"
6933 : [(set (mem:V8QI (match_operand:P 0 "register_operand" "D"))
6934 17069 : (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "y")
6935 17069 : (match_operand:V8QI 2 "register_operand" "y")
6936 17069 : (mem:V8QI (match_dup 0))]
6937 : UNSPEC_MASKMOV))]
6938 9 : "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 0 : (UNSPECV_FEMMS "TARGET_3DNOW")])
6949 0 :
6950 0 : (define_int_attr emms
6951 15 : [(UNSPECV_EMMS "emms")
6952 15 : (UNSPECV_FEMMS "femms")])
6953 0 :
6954 94546 : (define_expand "mmx_<emms>"
6955 94546 : [(parallel
6956 94546 : [(unspec_volatile [(const_int 0)] EMMS)
6957 94546 : (clobber (reg:XF ST0_REG))
6958 1848679917 : (clobber (reg:XF ST1_REG))
6959 : (clobber (reg:XF ST2_REG))
6960 : (clobber (reg:XF ST3_REG))
6961 : (clobber (reg:XF ST4_REG))
6962 1848679917 : (clobber (reg:XF ST5_REG))
6963 1848679917 : (clobber (reg:XF ST6_REG))
6964 1848679917 : (clobber (reg:XF ST7_REG))
6965 1848679917 : (clobber (reg:DI MM0_REG))
6966 1848679917 : (clobber (reg:DI MM1_REG))
6967 1848679917 : (clobber (reg:DI MM2_REG))
6968 1848679917 : (clobber (reg:DI MM3_REG))
6969 1848679917 : (clobber (reg:DI MM4_REG))
6970 : (clobber (reg:DI MM5_REG))
6971 1564131867 : (clobber (reg:DI MM6_REG))
6972 1564131867 : (clobber (reg:DI MM7_REG))])]
6973 : "TARGET_MMX || TARGET_MMX_WITH_SSE"
6974 139464006 : {
6975 139464006 : if (!TARGET_MMX)
6976 : {
6977 128206457 : emit_insn (gen_nop ());
6978 128206457 : DONE;
6979 128206456 : }
6980 : })
6981 :
6982 : (define_insn "*mmx_<emms>"
6983 8959901 : [(unspec_volatile [(const_int 0)] EMMS)
6984 8960020 : (clobber (reg:XF ST0_REG))
6985 8959901 : (clobber (reg:XF ST1_REG))
6986 : (clobber (reg:XF ST2_REG))
6987 : (clobber (reg:XF ST3_REG))
6988 : (clobber (reg:XF ST4_REG))
6989 619117 : (clobber (reg:XF ST5_REG))
6990 619117 : (clobber (reg:XF ST6_REG))
6991 619117 : (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 1485058 : (clobber (reg:DI MM3_REG))
6996 1485058 : (clobber (reg:DI MM4_REG))
6997 1485058 : (clobber (reg:DI MM5_REG))
6998 : (clobber (reg:DI MM6_REG))
6999 71610 : (clobber (reg:DI MM7_REG))]
7000 : ""
7001 147050 : "<emms>"
7002 147050 : [(set_attr "type" "mmx")
7003 147050 : (set_attr "modrm" "0")
7004 : (set_attr "memory" "none")])
7005 :
7006 : (define_insn "popcount<mode>2"
7007 74420 : [(set (match_operand:VI1_16_32_64 0 "register_operand" "=v")
7008 74420 : (popcount:VI1_16_32_64
7009 : (match_operand:VI1_16_32_64 1 "register_operand" "v")))]
7010 73534 : "TARGET_AVX512VL && TARGET_AVX512BITALG"
7011 73538 : "vpopcntb\t{%1, %0|%0, %1}")
7012 :
7013 50645 : (define_insn "popcount<mode>2"
7014 50669 : [(set (match_operand:VI2_32_64 0 "register_operand" "=v")
7015 50669 : (popcount:VI2_32_64
7016 50657 : (match_operand:VI2_32_64 1 "register_operand" "v")))]
7017 50667 : "TARGET_AVX512VL && TARGET_AVX512BITALG"
7018 50691 : "vpopcntw\t{%1, %0|%0, %1}")
7019 :
7020 50645 : (define_insn "popcountv2si2"
7021 50657 : [(set (match_operand:V2SI 0 "register_operand" "=v")
7022 12 : (popcount:V2SI
7023 50651 : (match_operand:V2SI 1 "register_operand" "v")))]
7024 50661 : "TARGET_AVX512VPOPCNTDQ && TARGET_AVX512VL && TARGET_MMX_WITH_SSE"
7025 50668 : "vpopcntd\t{%1, %0|%0, %1}")
7026 50645 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7027 : /* (content generated from coverage data) */
7028 : /* ... */
7029 : /* ... */
7030 : /* ... */
7031 : /* ... */
7032 : /* ... */
7033 : /* ... */
7034 4136438 : /* END: function "_Z8recog_63P7rtx_defP8rtx_insnPi" */
7035 : /* ... */
7036 : /* ... */
7037 : /* ... */
7038 4136438 : /* ... */
7039 4136438 : /* ... */
7040 4136438 : /* ... */
7041 4136438 : /* ... */
7042 4136438 : /* ... */
7043 4136438 : /* ... */
7044 : /* ... */
7045 3582008 : /* ... */
7046 3582008 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7047 3582008 : /* (content generated from coverage data) */
7048 3582008 : /* ... */
7049 3582008 : /* ... */
7050 3582008 : /* ... */
7051 3582008 : /* ... */
7052 3582008 : /* ... */
7053 3582008 : /* ... */
7054 3582008 : /* ... */
7055 3582008 : /* ... */
7056 3582008 : /* ... */
7057 3582008 : /* ... */
7058 3582008 : /* ... */
7059 3582008 : /* ... */
7060 3582008 : /* ... */
7061 : /* ... */
7062 3527218 : /* ... */
7063 3390166 : /* ... */
7064 108574 : /* ... */
7065 3635606 : /* ... */
7066 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7067 2110 : /* (content generated from coverage data) */
7068 2110 : /* ... */
7069 : /* ... */
7070 313 : /* ... */
7071 313 : /* ... */
7072 313 : /* ... */
7073 313 : /* ... */
7074 313 : /* ... */
7075 313 : /* ... */
7076 313 : /* ... */
7077 : /* ... */
7078 40 : /* ... */
7079 40 : /* ... */
7080 40 : /* ... */
7081 : /* ... */
7082 40 : /* ... */
7083 : /* ... */
7084 2 : /* ... */
7085 2 : /* ... */
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 0 : /* ... */
7781 0 : /* ... */
7782 0 : /* ... */
7783 0 : /* ... */
7784 : /* ... */
7785 0 : /* ... */
7786 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7787 : /* (content generated from coverage data) */
7788 : /* ... */
7789 : /* ... */
7790 : /* ... */
7791 : /* ... */
7792 : /* ... */
7793 : /* ... */
7794 : /* ... */
7795 : /* ... */
7796 : /* ... */
7797 : /* ... */
7798 : /* ... */
7799 : /* ... */
7800 : /* ... */
7801 454904756 : /* END: function "_Z19get_attr_prefix_rexP8rtx_insn" */
7802 : /* ... */
7803 454904756 : /* ... */
7804 : /* ... */
7805 454904756 : /* ... */
7806 : /* /home/worker/buildworker/tiber-lcov/build/gcc/config/i386/mmx.md not long enough */
7807 862741 : /* (content generated from coverage data) */
7808 862741 : /* ... */
7809 862741 : /* ... */
7810 862741 : /* ... */
7811 862741 : /* ... */
7812 : /* ... */
7813 : /* ... */
7814 : /* ... */
7815 : /* ... */
7816 : /* ... */
7817 797058 : /* ... */
|