Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/i386/mmx.md @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | 3bfb6c00c1e0 |
children | b7f97abdc517 |
comparison
equal
deleted
inserted
replaced
52:c156f1bd5cd9 | 55:77e2b8dfacca |
---|---|
1 ;; GCC machine description for MMX and 3dNOW! instructions | 1 ;; GCC machine description for MMX and 3dNOW! instructions |
2 ;; Copyright (C) 2005, 2007, 2008 | 2 ;; Copyright (C) 2005, 2007, 2008, 2009 |
3 ;; Free Software Foundation, Inc. | 3 ;; Free Software Foundation, Inc. |
4 ;; | 4 ;; |
5 ;; This file is part of GCC. | 5 ;; This file is part of GCC. |
6 ;; | 6 ;; |
7 ;; GCC is free software; you can redistribute it and/or modify | 7 ;; GCC is free software; you can redistribute it and/or modify |
83 %vmovq\t{%1, %0|%0, %1} | 83 %vmovq\t{%1, %0|%0, %1} |
84 %vmovq\t{%1, %0|%0, %1} | 84 %vmovq\t{%1, %0|%0, %1} |
85 %vmovq\t{%1, %0|%0, %1}" | 85 %vmovq\t{%1, %0|%0, %1}" |
86 [(set_attr "type" "imov,imov,mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,ssemov,ssemov") | 86 [(set_attr "type" "imov,imov,mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,ssemov,ssemov") |
87 (set_attr "unit" "*,*,*,*,*,mmx,mmx,*,*,*,*,*") | 87 (set_attr "unit" "*,*,*,*,*,mmx,mmx,*,*,*,*,*") |
88 (set_attr "prefix_rep" "*,*,*,*,*,1,1,*,1,*,*,*") | |
89 (set_attr "prefix_data16" "*,*,*,*,*,*,*,*,*,1,1,1") | |
90 (set (attr "prefix_rex") | |
91 (if_then_else (eq_attr "alternative" "8,9") | |
92 (symbol_ref "x86_extended_reg_mentioned_p (insn)") | |
93 (const_string "*"))) | |
88 (set (attr "prefix") | 94 (set (attr "prefix") |
89 (if_then_else (eq_attr "alternative" "7,8,9,10,11") | 95 (if_then_else (eq_attr "alternative" "7,8,9,10,11") |
90 (const_string "maybe_vex") | 96 (const_string "maybe_vex") |
91 (const_string "orig"))) | 97 (const_string "orig"))) |
92 (set_attr "mode" "DI")]) | 98 (set_attr "mode" "DI")]) |
109 vmovq\t{%1, %0|%0, %1} | 115 vmovq\t{%1, %0|%0, %1} |
110 # | 116 # |
111 #" | 117 #" |
112 [(set_attr "type" "mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,*,*") | 118 [(set_attr "type" "mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,*,*") |
113 (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*") | 119 (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*") |
120 (set_attr "prefix_rep" "*,*,*,1,1,*,*,*,*,*") | |
114 (set (attr "prefix") | 121 (set (attr "prefix") |
115 (if_then_else (eq_attr "alternative" "5,6,7") | 122 (if_then_else (eq_attr "alternative" "5,6,7") |
116 (const_string "vex") | 123 (const_string "vex") |
117 (const_string "orig"))) | 124 (const_string "orig"))) |
118 (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,DI,DI,DI")]) | 125 (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,DI,DI,DI")]) |
139 movlps\t{%1, %0|%0, %1} | 146 movlps\t{%1, %0|%0, %1} |
140 # | 147 # |
141 #" | 148 #" |
142 [(set_attr "type" "mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,sselog1,ssemov,ssemov,ssemov,*,*") | 149 [(set_attr "type" "mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,sselog1,ssemov,ssemov,ssemov,*,*") |
143 (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*,*,*,*,*") | 150 (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*,*,*,*,*") |
151 (set_attr "prefix_rep" "*,*,*,1,1,*,1,*,*,*,*,*,*,*") | |
152 (set_attr "prefix_data16" "*,*,*,*,*,*,*,1,*,*,*,*,*,*") | |
144 (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) | 153 (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) |
145 | 154 |
146 (define_expand "movv2sf" | 155 (define_expand "movv2sf" |
147 [(set (match_operand:V2SF 0 "nonimmediate_operand" "") | 156 [(set (match_operand:V2SF 0 "nonimmediate_operand" "") |
148 (match_operand:V2SF 1 "nonimmediate_operand" ""))] | 157 (match_operand:V2SF 1 "nonimmediate_operand" ""))] |
173 vmovlps\t{%1, %0|%0, %1} | 182 vmovlps\t{%1, %0|%0, %1} |
174 vmovq\t{%1, %0|%0, %1} | 183 vmovq\t{%1, %0|%0, %1} |
175 vmovq\t{%1, %0|%0, %1}" | 184 vmovq\t{%1, %0|%0, %1}" |
176 [(set_attr "type" "imov,imov,mmx,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,sselog1,ssemov,ssemov,ssemov,ssemov") | 185 [(set_attr "type" "imov,imov,mmx,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,sselog1,ssemov,ssemov,ssemov,ssemov") |
177 (set_attr "unit" "*,*,*,*,*,mmx,mmx,*,*,*,*,*,*") | 186 (set_attr "unit" "*,*,*,*,*,mmx,mmx,*,*,*,*,*,*") |
187 (set_attr "prefix_rep" "*,*,*,*,*,1,1,*,*,*,*,*,*") | |
188 (set_attr "length_vex" "*,*,*,*,*,*,*,*,*,*,*,4,4") | |
178 (set (attr "prefix") | 189 (set (attr "prefix") |
179 (if_then_else (eq_attr "alternative" "7,8,9,10,11,12") | 190 (if_then_else (eq_attr "alternative" "7,8,9,10,11,12") |
180 (const_string "vex") | 191 (const_string "vex") |
181 (const_string "orig"))) | 192 (const_string "orig"))) |
182 (set_attr "mode" "DI,DI,DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) | 193 (set_attr "mode" "DI,DI,DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) |
202 movlps\t{%1, %0|%0, %1} | 213 movlps\t{%1, %0|%0, %1} |
203 movd\t{%1, %0|%0, %1} | 214 movd\t{%1, %0|%0, %1} |
204 movd\t{%1, %0|%0, %1}" | 215 movd\t{%1, %0|%0, %1}" |
205 [(set_attr "type" "imov,imov,mmx,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,sselog1,ssemov,ssemov,ssemov,ssemov") | 216 [(set_attr "type" "imov,imov,mmx,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,sselog1,ssemov,ssemov,ssemov,ssemov") |
206 (set_attr "unit" "*,*,*,*,*,mmx,mmx,*,*,*,*,*,*") | 217 (set_attr "unit" "*,*,*,*,*,mmx,mmx,*,*,*,*,*,*") |
218 (set_attr "prefix_rep" "*,*,*,*,*,1,1,*,*,*,*,*,*") | |
207 (set_attr "mode" "DI,DI,DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) | 219 (set_attr "mode" "DI,DI,DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) |
208 | 220 |
209 (define_insn "*movv2sf_internal_avx" | 221 (define_insn "*movv2sf_internal_avx" |
210 [(set (match_operand:V2SF 0 "nonimmediate_operand" | 222 [(set (match_operand:V2SF 0 "nonimmediate_operand" |
211 "=!?y,!?y ,m ,!y ,*Y2,*x,*x,*x,m ,r ,m") | 223 "=!?y,!?y ,m ,!y ,*Y2,*x,*x,*x,m ,r ,m") |
225 vmovlps\t{%1, %0|%0, %1} | 237 vmovlps\t{%1, %0|%0, %1} |
226 # | 238 # |
227 #" | 239 #" |
228 [(set_attr "type" "mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,ssemov,*,*") | 240 [(set_attr "type" "mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,ssemov,*,*") |
229 (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*,*") | 241 (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*,*") |
242 (set_attr "prefix_rep" "*,*,*,1,1,*,*,*,*,*,*") | |
230 (set (attr "prefix") | 243 (set (attr "prefix") |
231 (if_then_else (eq_attr "alternative" "5,6,7,8") | 244 (if_then_else (eq_attr "alternative" "5,6,7,8") |
232 (const_string "vex") | 245 (const_string "vex") |
233 (const_string "orig"))) | 246 (const_string "orig"))) |
234 (set_attr "mode" "DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) | 247 (set_attr "mode" "DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) |
252 movlps\t{%1, %0|%0, %1} | 265 movlps\t{%1, %0|%0, %1} |
253 # | 266 # |
254 #" | 267 #" |
255 [(set_attr "type" "mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,ssemov,*,*") | 268 [(set_attr "type" "mmx,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,ssemov,*,*") |
256 (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*,*") | 269 (set_attr "unit" "*,*,*,mmx,mmx,*,*,*,*,*,*") |
270 (set_attr "prefix_rep" "*,*,*,1,1,*,*,*,*,*,*") | |
257 (set_attr "mode" "DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) | 271 (set_attr "mode" "DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]) |
258 | 272 |
259 ;; %%% This multiword shite has got to go. | 273 ;; %%% This multiword shite has got to go. |
260 (define_split | 274 (define_split |
261 [(set (match_operand:MMXMODE 0 "nonimmediate_operand" "") | 275 [(set (match_operand:MMXMODE 0 "nonimmediate_operand" "") |
311 (plus:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0") | 325 (plus:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0") |
312 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] | 326 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] |
313 "TARGET_3DNOW && ix86_binary_operator_ok (PLUS, V2SFmode, operands)" | 327 "TARGET_3DNOW && ix86_binary_operator_ok (PLUS, V2SFmode, operands)" |
314 "pfadd\t{%2, %0|%0, %2}" | 328 "pfadd\t{%2, %0|%0, %2}" |
315 [(set_attr "type" "mmxadd") | 329 [(set_attr "type" "mmxadd") |
330 (set_attr "prefix_extra" "1") | |
316 (set_attr "mode" "V2SF")]) | 331 (set_attr "mode" "V2SF")]) |
317 | 332 |
318 (define_expand "mmx_subv2sf3" | 333 (define_expand "mmx_subv2sf3" |
319 [(set (match_operand:V2SF 0 "register_operand" "") | 334 [(set (match_operand:V2SF 0 "register_operand" "") |
320 (minus:V2SF (match_operand:V2SF 1 "register_operand" "") | 335 (minus:V2SF (match_operand:V2SF 1 "register_operand" "") |
336 "TARGET_3DNOW && !(MEM_P (operands[0]) && MEM_P (operands[1]))" | 351 "TARGET_3DNOW && !(MEM_P (operands[0]) && MEM_P (operands[1]))" |
337 "@ | 352 "@ |
338 pfsub\t{%2, %0|%0, %2} | 353 pfsub\t{%2, %0|%0, %2} |
339 pfsubr\t{%1, %0|%0, %1}" | 354 pfsubr\t{%1, %0|%0, %1}" |
340 [(set_attr "type" "mmxadd") | 355 [(set_attr "type" "mmxadd") |
356 (set_attr "prefix_extra" "1") | |
341 (set_attr "mode" "V2SF")]) | 357 (set_attr "mode" "V2SF")]) |
342 | 358 |
343 (define_expand "mmx_mulv2sf3" | 359 (define_expand "mmx_mulv2sf3" |
344 [(set (match_operand:V2SF 0 "register_operand" "") | 360 [(set (match_operand:V2SF 0 "register_operand" "") |
345 (mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "") | 361 (mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "") |
352 (mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0") | 368 (mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0") |
353 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] | 369 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] |
354 "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V2SFmode, operands)" | 370 "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V2SFmode, operands)" |
355 "pfmul\t{%2, %0|%0, %2}" | 371 "pfmul\t{%2, %0|%0, %2}" |
356 [(set_attr "type" "mmxmul") | 372 [(set_attr "type" "mmxmul") |
373 (set_attr "prefix_extra" "1") | |
357 (set_attr "mode" "V2SF")]) | 374 (set_attr "mode" "V2SF")]) |
358 | 375 |
359 ;; ??? For !flag_finite_math_only, the representation with SMIN/SMAX | 376 ;; ??? For !flag_finite_math_only, the representation with SMIN/SMAX |
360 ;; isn't really correct, as those rtl operators aren't defined when | 377 ;; isn't really correct, as those rtl operators aren't defined when |
361 ;; applied to NaNs. Hopefully the optimizers won't get too smart on us. | 378 ;; applied to NaNs. Hopefully the optimizers won't get too smart on us. |
379 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] | 396 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] |
380 "TARGET_3DNOW && flag_finite_math_only | 397 "TARGET_3DNOW && flag_finite_math_only |
381 && ix86_binary_operator_ok (<CODE>, V2SFmode, operands)" | 398 && ix86_binary_operator_ok (<CODE>, V2SFmode, operands)" |
382 "pf<maxminfprefix>\t{%2, %0|%0, %2}" | 399 "pf<maxminfprefix>\t{%2, %0|%0, %2}" |
383 [(set_attr "type" "mmxadd") | 400 [(set_attr "type" "mmxadd") |
401 (set_attr "prefix_extra" "1") | |
384 (set_attr "mode" "V2SF")]) | 402 (set_attr "mode" "V2SF")]) |
385 | 403 |
386 (define_insn "*mmx_<code>v2sf3" | 404 (define_insn "*mmx_<code>v2sf3" |
387 [(set (match_operand:V2SF 0 "register_operand" "=y") | 405 [(set (match_operand:V2SF 0 "register_operand" "=y") |
388 (smaxmin:V2SF | 406 (smaxmin:V2SF |
389 (match_operand:V2SF 1 "register_operand" "0") | 407 (match_operand:V2SF 1 "register_operand" "0") |
390 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] | 408 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] |
391 "TARGET_3DNOW" | 409 "TARGET_3DNOW" |
392 "pf<maxminfprefix>\t{%2, %0|%0, %2}" | 410 "pf<maxminfprefix>\t{%2, %0|%0, %2}" |
393 [(set_attr "type" "mmxadd") | 411 [(set_attr "type" "mmxadd") |
412 (set_attr "prefix_extra" "1") | |
394 (set_attr "mode" "V2SF")]) | 413 (set_attr "mode" "V2SF")]) |
395 | 414 |
396 (define_insn "mmx_rcpv2sf2" | 415 (define_insn "mmx_rcpv2sf2" |
397 [(set (match_operand:V2SF 0 "register_operand" "=y") | 416 [(set (match_operand:V2SF 0 "register_operand" "=y") |
398 (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")] | 417 (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")] |
399 UNSPEC_PFRCP))] | 418 UNSPEC_PFRCP))] |
400 "TARGET_3DNOW" | 419 "TARGET_3DNOW" |
401 "pfrcp\t{%1, %0|%0, %1}" | 420 "pfrcp\t{%1, %0|%0, %1}" |
402 [(set_attr "type" "mmx") | 421 [(set_attr "type" "mmx") |
422 (set_attr "prefix_extra" "1") | |
403 (set_attr "mode" "V2SF")]) | 423 (set_attr "mode" "V2SF")]) |
404 | 424 |
405 (define_insn "mmx_rcpit1v2sf3" | 425 (define_insn "mmx_rcpit1v2sf3" |
406 [(set (match_operand:V2SF 0 "register_operand" "=y") | 426 [(set (match_operand:V2SF 0 "register_operand" "=y") |
407 (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0") | 427 (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0") |
408 (match_operand:V2SF 2 "nonimmediate_operand" "ym")] | 428 (match_operand:V2SF 2 "nonimmediate_operand" "ym")] |
409 UNSPEC_PFRCPIT1))] | 429 UNSPEC_PFRCPIT1))] |
410 "TARGET_3DNOW" | 430 "TARGET_3DNOW" |
411 "pfrcpit1\t{%2, %0|%0, %2}" | 431 "pfrcpit1\t{%2, %0|%0, %2}" |
412 [(set_attr "type" "mmx") | 432 [(set_attr "type" "mmx") |
433 (set_attr "prefix_extra" "1") | |
413 (set_attr "mode" "V2SF")]) | 434 (set_attr "mode" "V2SF")]) |
414 | 435 |
415 (define_insn "mmx_rcpit2v2sf3" | 436 (define_insn "mmx_rcpit2v2sf3" |
416 [(set (match_operand:V2SF 0 "register_operand" "=y") | 437 [(set (match_operand:V2SF 0 "register_operand" "=y") |
417 (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0") | 438 (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0") |
418 (match_operand:V2SF 2 "nonimmediate_operand" "ym")] | 439 (match_operand:V2SF 2 "nonimmediate_operand" "ym")] |
419 UNSPEC_PFRCPIT2))] | 440 UNSPEC_PFRCPIT2))] |
420 "TARGET_3DNOW" | 441 "TARGET_3DNOW" |
421 "pfrcpit2\t{%2, %0|%0, %2}" | 442 "pfrcpit2\t{%2, %0|%0, %2}" |
422 [(set_attr "type" "mmx") | 443 [(set_attr "type" "mmx") |
444 (set_attr "prefix_extra" "1") | |
423 (set_attr "mode" "V2SF")]) | 445 (set_attr "mode" "V2SF")]) |
424 | 446 |
425 (define_insn "mmx_rsqrtv2sf2" | 447 (define_insn "mmx_rsqrtv2sf2" |
426 [(set (match_operand:V2SF 0 "register_operand" "=y") | 448 [(set (match_operand:V2SF 0 "register_operand" "=y") |
427 (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")] | 449 (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")] |
428 UNSPEC_PFRSQRT))] | 450 UNSPEC_PFRSQRT))] |
429 "TARGET_3DNOW" | 451 "TARGET_3DNOW" |
430 "pfrsqrt\t{%1, %0|%0, %1}" | 452 "pfrsqrt\t{%1, %0|%0, %1}" |
431 [(set_attr "type" "mmx") | 453 [(set_attr "type" "mmx") |
454 (set_attr "prefix_extra" "1") | |
432 (set_attr "mode" "V2SF")]) | 455 (set_attr "mode" "V2SF")]) |
433 | 456 |
434 (define_insn "mmx_rsqit1v2sf3" | 457 (define_insn "mmx_rsqit1v2sf3" |
435 [(set (match_operand:V2SF 0 "register_operand" "=y") | 458 [(set (match_operand:V2SF 0 "register_operand" "=y") |
436 (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0") | 459 (unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0") |
437 (match_operand:V2SF 2 "nonimmediate_operand" "ym")] | 460 (match_operand:V2SF 2 "nonimmediate_operand" "ym")] |
438 UNSPEC_PFRSQIT1))] | 461 UNSPEC_PFRSQIT1))] |
439 "TARGET_3DNOW" | 462 "TARGET_3DNOW" |
440 "pfrsqit1\t{%2, %0|%0, %2}" | 463 "pfrsqit1\t{%2, %0|%0, %2}" |
441 [(set_attr "type" "mmx") | 464 [(set_attr "type" "mmx") |
465 (set_attr "prefix_extra" "1") | |
442 (set_attr "mode" "V2SF")]) | 466 (set_attr "mode" "V2SF")]) |
443 | 467 |
444 (define_insn "mmx_haddv2sf3" | 468 (define_insn "mmx_haddv2sf3" |
445 [(set (match_operand:V2SF 0 "register_operand" "=y") | 469 [(set (match_operand:V2SF 0 "register_operand" "=y") |
446 (vec_concat:V2SF | 470 (vec_concat:V2SF |
455 (parallel [(const_int 0)])) | 479 (parallel [(const_int 0)])) |
456 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))] | 480 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))] |
457 "TARGET_3DNOW" | 481 "TARGET_3DNOW" |
458 "pfacc\t{%2, %0|%0, %2}" | 482 "pfacc\t{%2, %0|%0, %2}" |
459 [(set_attr "type" "mmxadd") | 483 [(set_attr "type" "mmxadd") |
484 (set_attr "prefix_extra" "1") | |
460 (set_attr "mode" "V2SF")]) | 485 (set_attr "mode" "V2SF")]) |
461 | 486 |
462 (define_insn "mmx_hsubv2sf3" | 487 (define_insn "mmx_hsubv2sf3" |
463 [(set (match_operand:V2SF 0 "register_operand" "=y") | 488 [(set (match_operand:V2SF 0 "register_operand" "=y") |
464 (vec_concat:V2SF | 489 (vec_concat:V2SF |
473 (parallel [(const_int 0)])) | 498 (parallel [(const_int 0)])) |
474 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))] | 499 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))] |
475 "TARGET_3DNOW_A" | 500 "TARGET_3DNOW_A" |
476 "pfnacc\t{%2, %0|%0, %2}" | 501 "pfnacc\t{%2, %0|%0, %2}" |
477 [(set_attr "type" "mmxadd") | 502 [(set_attr "type" "mmxadd") |
503 (set_attr "prefix_extra" "1") | |
478 (set_attr "mode" "V2SF")]) | 504 (set_attr "mode" "V2SF")]) |
479 | 505 |
480 (define_insn "mmx_addsubv2sf3" | 506 (define_insn "mmx_addsubv2sf3" |
481 [(set (match_operand:V2SF 0 "register_operand" "=y") | 507 [(set (match_operand:V2SF 0 "register_operand" "=y") |
482 (vec_merge:V2SF | 508 (vec_merge:V2SF |
486 (minus:V2SF (match_dup 1) (match_dup 2)) | 512 (minus:V2SF (match_dup 1) (match_dup 2)) |
487 (const_int 1)))] | 513 (const_int 1)))] |
488 "TARGET_3DNOW_A" | 514 "TARGET_3DNOW_A" |
489 "pfpnacc\t{%2, %0|%0, %2}" | 515 "pfpnacc\t{%2, %0|%0, %2}" |
490 [(set_attr "type" "mmxadd") | 516 [(set_attr "type" "mmxadd") |
517 (set_attr "prefix_extra" "1") | |
491 (set_attr "mode" "V2SF")]) | 518 (set_attr "mode" "V2SF")]) |
492 | 519 |
493 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 520 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
494 ;; | 521 ;; |
495 ;; Parallel single-precision floating point comparisons | 522 ;; Parallel single-precision floating point comparisons |
508 (eq:V2SI (match_operand:V2SF 1 "nonimmediate_operand" "%0") | 535 (eq:V2SI (match_operand:V2SF 1 "nonimmediate_operand" "%0") |
509 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] | 536 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] |
510 "TARGET_3DNOW && ix86_binary_operator_ok (EQ, V2SFmode, operands)" | 537 "TARGET_3DNOW && ix86_binary_operator_ok (EQ, V2SFmode, operands)" |
511 "pfcmpeq\t{%2, %0|%0, %2}" | 538 "pfcmpeq\t{%2, %0|%0, %2}" |
512 [(set_attr "type" "mmxcmp") | 539 [(set_attr "type" "mmxcmp") |
540 (set_attr "prefix_extra" "1") | |
513 (set_attr "mode" "V2SF")]) | 541 (set_attr "mode" "V2SF")]) |
514 | 542 |
515 (define_insn "mmx_gtv2sf3" | 543 (define_insn "mmx_gtv2sf3" |
516 [(set (match_operand:V2SI 0 "register_operand" "=y") | 544 [(set (match_operand:V2SI 0 "register_operand" "=y") |
517 (gt:V2SI (match_operand:V2SF 1 "register_operand" "0") | 545 (gt:V2SI (match_operand:V2SF 1 "register_operand" "0") |
518 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] | 546 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] |
519 "TARGET_3DNOW" | 547 "TARGET_3DNOW" |
520 "pfcmpgt\t{%2, %0|%0, %2}" | 548 "pfcmpgt\t{%2, %0|%0, %2}" |
521 [(set_attr "type" "mmxcmp") | 549 [(set_attr "type" "mmxcmp") |
550 (set_attr "prefix_extra" "1") | |
522 (set_attr "mode" "V2SF")]) | 551 (set_attr "mode" "V2SF")]) |
523 | 552 |
524 (define_insn "mmx_gev2sf3" | 553 (define_insn "mmx_gev2sf3" |
525 [(set (match_operand:V2SI 0 "register_operand" "=y") | 554 [(set (match_operand:V2SI 0 "register_operand" "=y") |
526 (ge:V2SI (match_operand:V2SF 1 "register_operand" "0") | 555 (ge:V2SI (match_operand:V2SF 1 "register_operand" "0") |
527 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] | 556 (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] |
528 "TARGET_3DNOW" | 557 "TARGET_3DNOW" |
529 "pfcmpge\t{%2, %0|%0, %2}" | 558 "pfcmpge\t{%2, %0|%0, %2}" |
530 [(set_attr "type" "mmxcmp") | 559 [(set_attr "type" "mmxcmp") |
560 (set_attr "prefix_extra" "1") | |
531 (set_attr "mode" "V2SF")]) | 561 (set_attr "mode" "V2SF")]) |
532 | 562 |
533 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 563 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
534 ;; | 564 ;; |
535 ;; Parallel single-precision floating point conversion operations | 565 ;; Parallel single-precision floating point conversion operations |
540 [(set (match_operand:V2SI 0 "register_operand" "=y") | 570 [(set (match_operand:V2SI 0 "register_operand" "=y") |
541 (fix:V2SI (match_operand:V2SF 1 "nonimmediate_operand" "ym")))] | 571 (fix:V2SI (match_operand:V2SF 1 "nonimmediate_operand" "ym")))] |
542 "TARGET_3DNOW" | 572 "TARGET_3DNOW" |
543 "pf2id\t{%1, %0|%0, %1}" | 573 "pf2id\t{%1, %0|%0, %1}" |
544 [(set_attr "type" "mmxcvt") | 574 [(set_attr "type" "mmxcvt") |
575 (set_attr "prefix_extra" "1") | |
545 (set_attr "mode" "V2SF")]) | 576 (set_attr "mode" "V2SF")]) |
546 | 577 |
547 (define_insn "mmx_pf2iw" | 578 (define_insn "mmx_pf2iw" |
548 [(set (match_operand:V2SI 0 "register_operand" "=y") | 579 [(set (match_operand:V2SI 0 "register_operand" "=y") |
549 (sign_extend:V2SI | 580 (sign_extend:V2SI |
551 (fix:V2SI | 582 (fix:V2SI |
552 (match_operand:V2SF 1 "nonimmediate_operand" "ym")))))] | 583 (match_operand:V2SF 1 "nonimmediate_operand" "ym")))))] |
553 "TARGET_3DNOW_A" | 584 "TARGET_3DNOW_A" |
554 "pf2iw\t{%1, %0|%0, %1}" | 585 "pf2iw\t{%1, %0|%0, %1}" |
555 [(set_attr "type" "mmxcvt") | 586 [(set_attr "type" "mmxcvt") |
587 (set_attr "prefix_extra" "1") | |
556 (set_attr "mode" "V2SF")]) | 588 (set_attr "mode" "V2SF")]) |
557 | 589 |
558 (define_insn "mmx_pi2fw" | 590 (define_insn "mmx_pi2fw" |
559 [(set (match_operand:V2SF 0 "register_operand" "=y") | 591 [(set (match_operand:V2SF 0 "register_operand" "=y") |
560 (float:V2SF | 592 (float:V2SF |
562 (truncate:V2HI | 594 (truncate:V2HI |
563 (match_operand:V2SI 1 "nonimmediate_operand" "ym")))))] | 595 (match_operand:V2SI 1 "nonimmediate_operand" "ym")))))] |
564 "TARGET_3DNOW_A" | 596 "TARGET_3DNOW_A" |
565 "pi2fw\t{%1, %0|%0, %1}" | 597 "pi2fw\t{%1, %0|%0, %1}" |
566 [(set_attr "type" "mmxcvt") | 598 [(set_attr "type" "mmxcvt") |
599 (set_attr "prefix_extra" "1") | |
567 (set_attr "mode" "V2SF")]) | 600 (set_attr "mode" "V2SF")]) |
568 | 601 |
569 (define_insn "mmx_floatv2si2" | 602 (define_insn "mmx_floatv2si2" |
570 [(set (match_operand:V2SF 0 "register_operand" "=y") | 603 [(set (match_operand:V2SF 0 "register_operand" "=y") |
571 (float:V2SF (match_operand:V2SI 1 "nonimmediate_operand" "ym")))] | 604 (float:V2SF (match_operand:V2SI 1 "nonimmediate_operand" "ym")))] |
572 "TARGET_3DNOW" | 605 "TARGET_3DNOW" |
573 "pi2fd\t{%1, %0|%0, %1}" | 606 "pi2fd\t{%1, %0|%0, %1}" |
574 [(set_attr "type" "mmxcvt") | 607 [(set_attr "type" "mmxcvt") |
608 (set_attr "prefix_extra" "1") | |
575 (set_attr "mode" "V2SF")]) | 609 (set_attr "mode" "V2SF")]) |
576 | 610 |
577 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 611 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
578 ;; | 612 ;; |
579 ;; Parallel single-precision floating point element swizzling | 613 ;; Parallel single-precision floating point element swizzling |
585 (vec_select:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "ym") | 619 (vec_select:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "ym") |
586 (parallel [(const_int 1) (const_int 0)])))] | 620 (parallel [(const_int 1) (const_int 0)])))] |
587 "TARGET_3DNOW_A" | 621 "TARGET_3DNOW_A" |
588 "pswapd\t{%1, %0|%0, %1}" | 622 "pswapd\t{%1, %0|%0, %1}" |
589 [(set_attr "type" "mmxcvt") | 623 [(set_attr "type" "mmxcvt") |
624 (set_attr "prefix_extra" "1") | |
590 (set_attr "mode" "V2SF")]) | 625 (set_attr "mode" "V2SF")]) |
591 | 626 |
592 (define_insn "*vec_dupv2sf" | 627 (define_insn "*vec_dupv2sf" |
593 [(set (match_operand:V2SF 0 "register_operand" "=y") | 628 [(set (match_operand:V2SF 0 "register_operand" "=y") |
594 (vec_duplicate:V2SF | 629 (vec_duplicate:V2SF |
885 (const_int 32768) (const_int 32768)])) | 920 (const_int 32768) (const_int 32768)])) |
886 (const_int 16))))] | 921 (const_int 16))))] |
887 "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V4HImode, operands)" | 922 "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V4HImode, operands)" |
888 "pmulhrw\t{%2, %0|%0, %2}" | 923 "pmulhrw\t{%2, %0|%0, %2}" |
889 [(set_attr "type" "mmxmul") | 924 [(set_attr "type" "mmxmul") |
925 (set_attr "prefix_extra" "1") | |
890 (set_attr "mode" "DI")]) | 926 (set_attr "mode" "DI")]) |
891 | 927 |
892 (define_expand "sse2_umulv1siv1di3" | 928 (define_expand "sse2_umulv1siv1di3" |
893 [(set (match_operand:V1DI 0 "register_operand" "") | 929 [(set (match_operand:V1DI 0 "register_operand" "") |
894 (mult:V1DI | 930 (mult:V1DI |
963 (match_operand:MMXMODE24 1 "register_operand" "0") | 999 (match_operand:MMXMODE24 1 "register_operand" "0") |
964 (match_operand:SI 2 "nonmemory_operand" "yN")))] | 1000 (match_operand:SI 2 "nonmemory_operand" "yN")))] |
965 "TARGET_MMX" | 1001 "TARGET_MMX" |
966 "psra<mmxvecsize>\t{%2, %0|%0, %2}" | 1002 "psra<mmxvecsize>\t{%2, %0|%0, %2}" |
967 [(set_attr "type" "mmxshft") | 1003 [(set_attr "type" "mmxshft") |
1004 (set (attr "length_immediate") | |
1005 (if_then_else (match_operand 2 "const_int_operand" "") | |
1006 (const_string "1") | |
1007 (const_string "0"))) | |
968 (set_attr "mode" "DI")]) | 1008 (set_attr "mode" "DI")]) |
969 | 1009 |
970 (define_insn "mmx_lshr<mode>3" | 1010 (define_insn "mmx_lshr<mode>3" |
971 [(set (match_operand:MMXMODE248 0 "register_operand" "=y") | 1011 [(set (match_operand:MMXMODE248 0 "register_operand" "=y") |
972 (lshiftrt:MMXMODE248 | 1012 (lshiftrt:MMXMODE248 |
973 (match_operand:MMXMODE248 1 "register_operand" "0") | 1013 (match_operand:MMXMODE248 1 "register_operand" "0") |
974 (match_operand:SI 2 "nonmemory_operand" "yN")))] | 1014 (match_operand:SI 2 "nonmemory_operand" "yN")))] |
975 "TARGET_MMX" | 1015 "TARGET_MMX" |
976 "psrl<mmxvecsize>\t{%2, %0|%0, %2}" | 1016 "psrl<mmxvecsize>\t{%2, %0|%0, %2}" |
977 [(set_attr "type" "mmxshft") | 1017 [(set_attr "type" "mmxshft") |
1018 (set (attr "length_immediate") | |
1019 (if_then_else (match_operand 2 "const_int_operand" "") | |
1020 (const_string "1") | |
1021 (const_string "0"))) | |
978 (set_attr "mode" "DI")]) | 1022 (set_attr "mode" "DI")]) |
979 | 1023 |
980 (define_insn "mmx_ashl<mode>3" | 1024 (define_insn "mmx_ashl<mode>3" |
981 [(set (match_operand:MMXMODE248 0 "register_operand" "=y") | 1025 [(set (match_operand:MMXMODE248 0 "register_operand" "=y") |
982 (ashift:MMXMODE248 | 1026 (ashift:MMXMODE248 |
983 (match_operand:MMXMODE248 1 "register_operand" "0") | 1027 (match_operand:MMXMODE248 1 "register_operand" "0") |
984 (match_operand:SI 2 "nonmemory_operand" "yN")))] | 1028 (match_operand:SI 2 "nonmemory_operand" "yN")))] |
985 "TARGET_MMX" | 1029 "TARGET_MMX" |
986 "psll<mmxvecsize>\t{%2, %0|%0, %2}" | 1030 "psll<mmxvecsize>\t{%2, %0|%0, %2}" |
987 [(set_attr "type" "mmxshft") | 1031 [(set_attr "type" "mmxshft") |
1032 (set (attr "length_immediate") | |
1033 (if_then_else (match_operand 2 "const_int_operand" "") | |
1034 (const_string "1") | |
1035 (const_string "0"))) | |
988 (set_attr "mode" "DI")]) | 1036 (set_attr "mode" "DI")]) |
989 | 1037 |
990 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 1038 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
991 ;; | 1039 ;; |
992 ;; Parallel integral comparisons | 1040 ;; Parallel integral comparisons |
1037 [(set_attr "type" "mmxadd") | 1085 [(set_attr "type" "mmxadd") |
1038 (set_attr "mode" "DI")]) | 1086 (set_attr "mode" "DI")]) |
1039 | 1087 |
1040 (define_expand "mmx_<code><mode>3" | 1088 (define_expand "mmx_<code><mode>3" |
1041 [(set (match_operand:MMXMODEI 0 "register_operand" "") | 1089 [(set (match_operand:MMXMODEI 0 "register_operand" "") |
1042 (plogic:MMXMODEI | 1090 (any_logic:MMXMODEI |
1043 (match_operand:MMXMODEI 1 "nonimmediate_operand" "") | 1091 (match_operand:MMXMODEI 1 "nonimmediate_operand" "") |
1044 (match_operand:MMXMODEI 2 "nonimmediate_operand" "")))] | 1092 (match_operand:MMXMODEI 2 "nonimmediate_operand" "")))] |
1045 "TARGET_MMX" | 1093 "TARGET_MMX" |
1046 "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);") | 1094 "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);") |
1047 | 1095 |
1048 (define_insn "*mmx_<code><mode>3" | 1096 (define_insn "*mmx_<code><mode>3" |
1049 [(set (match_operand:MMXMODEI 0 "register_operand" "=y") | 1097 [(set (match_operand:MMXMODEI 0 "register_operand" "=y") |
1050 (plogic:MMXMODEI | 1098 (any_logic:MMXMODEI |
1051 (match_operand:MMXMODEI 1 "nonimmediate_operand" "%0") | 1099 (match_operand:MMXMODEI 1 "nonimmediate_operand" "%0") |
1052 (match_operand:MMXMODEI 2 "nonimmediate_operand" "ym")))] | 1100 (match_operand:MMXMODEI 2 "nonimmediate_operand" "ym")))] |
1053 "TARGET_MMX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 1101 "TARGET_MMX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
1054 "p<plogicprefix>\t{%2, %0|%0, %2}" | 1102 "p<logicprefix>\t{%2, %0|%0, %2}" |
1055 [(set_attr "type" "mmxadd") | 1103 [(set_attr "type" "mmxadd") |
1056 (set_attr "mode" "DI")]) | 1104 (set_attr "mode" "DI")]) |
1057 | 1105 |
1058 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 1106 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1059 ;; | 1107 ;; |
1206 return "pinsrw\t{%3, %2, %0|%0, %2, %3}"; | 1254 return "pinsrw\t{%3, %2, %0|%0, %2, %3}"; |
1207 else | 1255 else |
1208 return "pinsrw\t{%3, %k2, %0|%0, %k2, %3}"; | 1256 return "pinsrw\t{%3, %k2, %0|%0, %k2, %3}"; |
1209 } | 1257 } |
1210 [(set_attr "type" "mmxcvt") | 1258 [(set_attr "type" "mmxcvt") |
1259 (set_attr "length_immediate" "1") | |
1211 (set_attr "mode" "DI")]) | 1260 (set_attr "mode" "DI")]) |
1212 | 1261 |
1213 (define_insn "mmx_pextrw" | 1262 (define_insn "mmx_pextrw" |
1214 [(set (match_operand:SI 0 "register_operand" "=r") | 1263 [(set (match_operand:SI 0 "register_operand" "=r") |
1215 (zero_extend:SI | 1264 (zero_extend:SI |
1217 (match_operand:V4HI 1 "register_operand" "y") | 1266 (match_operand:V4HI 1 "register_operand" "y") |
1218 (parallel [(match_operand:SI 2 "const_0_to_3_operand" "n")]))))] | 1267 (parallel [(match_operand:SI 2 "const_0_to_3_operand" "n")]))))] |
1219 "TARGET_SSE || TARGET_3DNOW_A" | 1268 "TARGET_SSE || TARGET_3DNOW_A" |
1220 "pextrw\t{%2, %1, %0|%0, %1, %2}" | 1269 "pextrw\t{%2, %1, %0|%0, %1, %2}" |
1221 [(set_attr "type" "mmxcvt") | 1270 [(set_attr "type" "mmxcvt") |
1271 (set_attr "length_immediate" "1") | |
1222 (set_attr "mode" "DI")]) | 1272 (set_attr "mode" "DI")]) |
1223 | 1273 |
1224 (define_expand "mmx_pshufw" | 1274 (define_expand "mmx_pshufw" |
1225 [(match_operand:V4HI 0 "register_operand" "") | 1275 [(match_operand:V4HI 0 "register_operand" "") |
1226 (match_operand:V4HI 1 "nonimmediate_operand" "") | 1276 (match_operand:V4HI 1 "nonimmediate_operand" "") |
1254 operands[2] = GEN_INT (mask); | 1304 operands[2] = GEN_INT (mask); |
1255 | 1305 |
1256 return "pshufw\t{%2, %1, %0|%0, %1, %2}"; | 1306 return "pshufw\t{%2, %1, %0|%0, %1, %2}"; |
1257 } | 1307 } |
1258 [(set_attr "type" "mmxcvt") | 1308 [(set_attr "type" "mmxcvt") |
1309 (set_attr "length_immediate" "1") | |
1259 (set_attr "mode" "DI")]) | 1310 (set_attr "mode" "DI")]) |
1260 | 1311 |
1261 (define_insn "mmx_pswapdv2si2" | 1312 (define_insn "mmx_pswapdv2si2" |
1262 [(set (match_operand:V2SI 0 "register_operand" "=y") | 1313 [(set (match_operand:V2SI 0 "register_operand" "=y") |
1263 (vec_select:V2SI | 1314 (vec_select:V2SI |
1264 (match_operand:V2SI 1 "nonimmediate_operand" "ym") | 1315 (match_operand:V2SI 1 "nonimmediate_operand" "ym") |
1265 (parallel [(const_int 1) (const_int 0)])))] | 1316 (parallel [(const_int 1) (const_int 0)])))] |
1266 "TARGET_3DNOW_A" | 1317 "TARGET_3DNOW_A" |
1267 "pswapd\t{%1, %0|%0, %1}" | 1318 "pswapd\t{%1, %0|%0, %1}" |
1268 [(set_attr "type" "mmxcvt") | 1319 [(set_attr "type" "mmxcvt") |
1320 (set_attr "prefix_extra" "1") | |
1269 (set_attr "mode" "DI")]) | 1321 (set_attr "mode" "DI")]) |
1270 | 1322 |
1271 (define_insn "*vec_dupv4hi" | 1323 (define_insn "*vec_dupv4hi" |
1272 [(set (match_operand:V4HI 0 "register_operand" "=y") | 1324 [(set (match_operand:V4HI 0 "register_operand" "=y") |
1273 (vec_duplicate:V4HI | 1325 (vec_duplicate:V4HI |
1274 (truncate:HI | 1326 (truncate:HI |
1275 (match_operand:SI 1 "register_operand" "0"))))] | 1327 (match_operand:SI 1 "register_operand" "0"))))] |
1276 "TARGET_SSE || TARGET_3DNOW_A" | 1328 "TARGET_SSE || TARGET_3DNOW_A" |
1277 "pshufw\t{$0, %0, %0|%0, %0, 0}" | 1329 "pshufw\t{$0, %0, %0|%0, %0, 0}" |
1278 [(set_attr "type" "mmxcvt") | 1330 [(set_attr "type" "mmxcvt") |
1331 (set_attr "length_immediate" "1") | |
1279 (set_attr "mode" "DI")]) | 1332 (set_attr "mode" "DI")]) |
1280 | 1333 |
1281 (define_insn "*vec_dupv2si" | 1334 (define_insn "*vec_dupv2si" |
1282 [(set (match_operand:V2SI 0 "register_operand" "=y") | 1335 [(set (match_operand:V2SI 0 "register_operand" "=y") |
1283 (vec_duplicate:V2SI | 1336 (vec_duplicate:V2SI |
1346 unpckhps\t%0, %0 | 1399 unpckhps\t%0, %0 |
1347 # | 1400 # |
1348 # | 1401 # |
1349 #" | 1402 #" |
1350 [(set_attr "type" "mmxcvt,sselog1,sselog1,sselog1,mmxmov,ssemov,imov") | 1403 [(set_attr "type" "mmxcvt,sselog1,sselog1,sselog1,mmxmov,ssemov,imov") |
1404 (set_attr "length_immediate" "*,*,1,*,*,*,*") | |
1351 (set_attr "mode" "DI,TI,TI,V4SF,SI,SI,SI")]) | 1405 (set_attr "mode" "DI,TI,TI,V4SF,SI,SI,SI")]) |
1352 | 1406 |
1353 (define_split | 1407 (define_split |
1354 [(set (match_operand:SI 0 "register_operand" "") | 1408 [(set (match_operand:SI 0 "register_operand" "") |
1355 (vec_select:SI | 1409 (vec_select:SI |
1493 return "pavgb\t{%2, %0|%0, %2}"; | 1547 return "pavgb\t{%2, %0|%0, %2}"; |
1494 else | 1548 else |
1495 return "pavgusb\t{%2, %0|%0, %2}"; | 1549 return "pavgusb\t{%2, %0|%0, %2}"; |
1496 } | 1550 } |
1497 [(set_attr "type" "mmxshft") | 1551 [(set_attr "type" "mmxshft") |
1552 (set (attr "prefix_extra") | |
1553 (if_then_else | |
1554 (eq (symbol_ref "(TARGET_SSE || TARGET_3DNOW_A)") (const_int 0)) | |
1555 (const_string "1") | |
1556 (const_string "*"))) | |
1498 (set_attr "mode" "DI")]) | 1557 (set_attr "mode" "DI")]) |
1499 | 1558 |
1500 (define_expand "mmx_uavgv4hi3" | 1559 (define_expand "mmx_uavgv4hi3" |
1501 [(set (match_operand:V4HI 0 "register_operand" "") | 1560 [(set (match_operand:V4HI 0 "register_operand" "") |
1502 (truncate:V4HI | 1561 (truncate:V4HI |
1582 ;; @@@ check ordering of operands in intel/nonintel syntax | 1641 ;; @@@ check ordering of operands in intel/nonintel syntax |
1583 "maskmovq\t{%2, %1|%1, %2}" | 1642 "maskmovq\t{%2, %1|%1, %2}" |
1584 [(set_attr "type" "mmxcvt") | 1643 [(set_attr "type" "mmxcvt") |
1585 (set_attr "mode" "DI")]) | 1644 (set_attr "mode" "DI")]) |
1586 | 1645 |
1587 (define_insn "mmx_emms" | 1646 (define_expand "mmx_emms" |
1588 [(unspec_volatile [(const_int 0)] UNSPECV_EMMS) | 1647 [(match_par_dup 0 [(const_int 0)])] |
1589 (clobber (reg:XF ST0_REG)) | 1648 "TARGET_MMX" |
1590 (clobber (reg:XF ST1_REG)) | 1649 { |
1591 (clobber (reg:XF ST2_REG)) | 1650 int regno; |
1592 (clobber (reg:XF ST3_REG)) | 1651 |
1593 (clobber (reg:XF ST4_REG)) | 1652 operands[0] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (17)); |
1594 (clobber (reg:XF ST5_REG)) | 1653 |
1595 (clobber (reg:XF ST6_REG)) | 1654 XVECEXP (operands[0], 0, 0) |
1596 (clobber (reg:XF ST7_REG)) | 1655 = gen_rtx_UNSPEC_VOLATILE (VOIDmode, gen_rtvec (1, const0_rtx), |
1597 (clobber (reg:DI MM0_REG)) | 1656 UNSPECV_EMMS); |
1598 (clobber (reg:DI MM1_REG)) | 1657 |
1599 (clobber (reg:DI MM2_REG)) | 1658 for (regno = 0; regno < 8; regno++) |
1600 (clobber (reg:DI MM3_REG)) | 1659 { |
1601 (clobber (reg:DI MM4_REG)) | 1660 XVECEXP (operands[0], 0, regno + 1) |
1602 (clobber (reg:DI MM5_REG)) | 1661 = gen_rtx_CLOBBER (VOIDmode, |
1603 (clobber (reg:DI MM6_REG)) | 1662 gen_rtx_REG (XFmode, FIRST_STACK_REG + regno)); |
1604 (clobber (reg:DI MM7_REG))] | 1663 |
1664 XVECEXP (operands[0], 0, regno + 9) | |
1665 = gen_rtx_CLOBBER (VOIDmode, | |
1666 gen_rtx_REG (DImode, FIRST_MMX_REG + regno)); | |
1667 } | |
1668 }) | |
1669 | |
1670 (define_insn "*mmx_emms" | |
1671 [(match_parallel 0 "emms_operation" | |
1672 [(unspec_volatile [(const_int 0)] UNSPECV_EMMS)])] | |
1605 "TARGET_MMX" | 1673 "TARGET_MMX" |
1606 "emms" | 1674 "emms" |
1607 [(set_attr "type" "mmx") | 1675 [(set_attr "type" "mmx") |
1608 (set_attr "memory" "unknown")]) | 1676 (set_attr "modrm" "0") |
1609 | 1677 (set_attr "memory" "none")]) |
1610 (define_insn "mmx_femms" | 1678 |
1611 [(unspec_volatile [(const_int 0)] UNSPECV_FEMMS) | 1679 (define_expand "mmx_femms" |
1612 (clobber (reg:XF ST0_REG)) | 1680 [(match_par_dup 0 [(const_int 0)])] |
1613 (clobber (reg:XF ST1_REG)) | 1681 "TARGET_3DNOW" |
1614 (clobber (reg:XF ST2_REG)) | 1682 { |
1615 (clobber (reg:XF ST3_REG)) | 1683 int regno; |
1616 (clobber (reg:XF ST4_REG)) | 1684 |
1617 (clobber (reg:XF ST5_REG)) | 1685 operands[0] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (17)); |
1618 (clobber (reg:XF ST6_REG)) | 1686 |
1619 (clobber (reg:XF ST7_REG)) | 1687 XVECEXP (operands[0], 0, 0) |
1620 (clobber (reg:DI MM0_REG)) | 1688 = gen_rtx_UNSPEC_VOLATILE (VOIDmode, gen_rtvec (1, const0_rtx), |
1621 (clobber (reg:DI MM1_REG)) | 1689 UNSPECV_FEMMS); |
1622 (clobber (reg:DI MM2_REG)) | 1690 |
1623 (clobber (reg:DI MM3_REG)) | 1691 for (regno = 0; regno < 8; regno++) |
1624 (clobber (reg:DI MM4_REG)) | 1692 { |
1625 (clobber (reg:DI MM5_REG)) | 1693 XVECEXP (operands[0], 0, regno + 1) |
1626 (clobber (reg:DI MM6_REG)) | 1694 = gen_rtx_CLOBBER (VOIDmode, |
1627 (clobber (reg:DI MM7_REG))] | 1695 gen_rtx_REG (XFmode, FIRST_STACK_REG + regno)); |
1696 | |
1697 XVECEXP (operands[0], 0, regno + 9) | |
1698 = gen_rtx_CLOBBER (VOIDmode, | |
1699 gen_rtx_REG (DImode, FIRST_MMX_REG + regno)); | |
1700 } | |
1701 }) | |
1702 | |
1703 (define_insn "*mmx_femms" | |
1704 [(match_parallel 0 "emms_operation" | |
1705 [(unspec_volatile [(const_int 0)] UNSPECV_FEMMS)])] | |
1628 "TARGET_3DNOW" | 1706 "TARGET_3DNOW" |
1629 "femms" | 1707 "femms" |
1630 [(set_attr "type" "mmx") | 1708 [(set_attr "type" "mmx") |
1709 (set_attr "modrm" "0") | |
1631 (set_attr "memory" "none")]) | 1710 (set_attr "memory" "none")]) |