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