OSDN Git Service

ee93e71bed4ded9f3a0a1e3b3cd63f521c0ef84a
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.md
1 ;; GCC machine description for IA-32 and x86-64.
2 ;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 ;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 ;; Free Software Foundation, Inc.
5 ;; Mostly by William Schelter.
6 ;; x86_64 support added by Jan Hubicka
7 ;;
8 ;; This file is part of GCC.
9 ;;
10 ;; GCC is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 3, or (at your option)
13 ;; any later version.
14 ;;
15 ;; GCC is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;; GNU General Public License for more details.
19 ;;
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GCC; see the file COPYING3.  If not see
22 ;; <http://www.gnu.org/licenses/>.  */
23 ;;
24 ;; The original PO technology requires these to be ordered by speed,
25 ;; so that assigner will pick the fastest.
26 ;;
27 ;; See file "rtl.def" for documentation on define_insn, match_*, et. al.
28 ;;
29 ;; The special asm out single letter directives following a '%' are:
30 ;; L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
31 ;; C -- print opcode suffix for set/cmov insn.
32 ;; c -- like C, but print reversed condition
33 ;; F,f -- likewise, but for floating-point.
34 ;; O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
35 ;;      otherwise nothing
36 ;; R -- print the prefix for register names.
37 ;; z -- print the opcode suffix for the size of the current operand.
38 ;; Z -- likewise, with special suffixes for x87 instructions.
39 ;; * -- print a star (in certain assembler syntax)
40 ;; A -- print an absolute memory reference.
41 ;; w -- print the operand as if it's a "word" (HImode) even if it isn't.
42 ;; s -- print a shift double count, followed by the assemblers argument
43 ;;      delimiter.
44 ;; b -- print the QImode name of the register for the indicated operand.
45 ;;      %b0 would print %al if operands[0] is reg 0.
46 ;; w --  likewise, print the HImode name of the register.
47 ;; k --  likewise, print the SImode name of the register.
48 ;; q --  likewise, print the DImode name of the register.
49 ;; x --  likewise, print the V4SFmode name of the register.
50 ;; t --  likewise, print the V8SFmode name of the register.
51 ;; h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
52 ;; y -- print "st(0)" instead of "st" as a register.
53 ;; d -- print duplicated register operand for AVX instruction.
54 ;; D -- print condition for SSE cmp instruction.
55 ;; P -- if PIC, print an @PLT suffix.
56 ;; p -- print raw symbol name.
57 ;; X -- don't print any sort of PIC '@' suffix for a symbol.
58 ;; & -- print some in-use local-dynamic symbol name.
59 ;; H -- print a memory address offset by 8; used for sse high-parts
60 ;; Y -- print condition for XOP pcom* instruction.
61 ;; + -- print a branch hint as 'cs' or 'ds' prefix
62 ;; ; -- print a semicolon (after prefixes due to bug in older gas).
63 ;; @ -- print a segment register of thread base pointer load
64
65 ;; UNSPEC usage:
66
67 (define_c_enum "unspec" [
68   ;; Relocation specifiers
69   UNSPEC_GOT
70   UNSPEC_GOTOFF
71   UNSPEC_GOTPCREL
72   UNSPEC_GOTTPOFF
73   UNSPEC_TPOFF
74   UNSPEC_NTPOFF
75   UNSPEC_DTPOFF
76   UNSPEC_GOTNTPOFF
77   UNSPEC_INDNTPOFF
78   UNSPEC_PLTOFF
79   UNSPEC_MACHOPIC_OFFSET
80   UNSPEC_PCREL
81
82   ;; Prologue support
83   UNSPEC_STACK_ALLOC
84   UNSPEC_SET_GOT
85   UNSPEC_REG_SAVE
86   UNSPEC_DEF_CFA
87   UNSPEC_SET_RIP
88   UNSPEC_SET_GOT_OFFSET
89   UNSPEC_MEMORY_BLOCKAGE
90   UNSPEC_STACK_CHECK
91
92   ;; TLS support
93   UNSPEC_TP
94   UNSPEC_TLS_GD
95   UNSPEC_TLS_LD_BASE
96   UNSPEC_TLSDESC
97   UNSPEC_TLS_IE_SUN
98
99   ;; Other random patterns
100   UNSPEC_SCAS
101   UNSPEC_FNSTSW
102   UNSPEC_SAHF
103   UNSPEC_PARITY
104   UNSPEC_FSTCW
105   UNSPEC_ADD_CARRY
106   UNSPEC_FLDCW
107   UNSPEC_REP
108   UNSPEC_LD_MPIC        ; load_macho_picbase
109   UNSPEC_TRUNC_NOOP
110   UNSPEC_DIV_ALREADY_SPLIT
111   UNSPEC_CALL_NEEDS_VZEROUPPER
112   UNSPEC_PAUSE
113
114   ;; For SSE/MMX support:
115   UNSPEC_FIX_NOTRUNC
116   UNSPEC_MASKMOV
117   UNSPEC_MOVMSK
118   UNSPEC_MOVNT
119   UNSPEC_MOVU
120   UNSPEC_RCP
121   UNSPEC_RSQRT
122   UNSPEC_SFENCE
123   UNSPEC_PFRCP
124   UNSPEC_PFRCPIT1
125   UNSPEC_PFRCPIT2
126   UNSPEC_PFRSQRT
127   UNSPEC_PFRSQIT1
128   UNSPEC_MFENCE
129   UNSPEC_LFENCE
130   UNSPEC_PSADBW
131   UNSPEC_LDDQU
132   UNSPEC_MS_TO_SYSV_CALL
133
134   ;; Generic math support
135   UNSPEC_COPYSIGN
136   UNSPEC_IEEE_MIN       ; not commutative
137   UNSPEC_IEEE_MAX       ; not commutative
138
139   ;; x87 Floating point
140   UNSPEC_SIN
141   UNSPEC_COS
142   UNSPEC_FPATAN
143   UNSPEC_FYL2X
144   UNSPEC_FYL2XP1
145   UNSPEC_FRNDINT
146   UNSPEC_FIST
147   UNSPEC_F2XM1
148   UNSPEC_TAN
149   UNSPEC_FXAM
150
151   ;; x87 Rounding
152   UNSPEC_FRNDINT_FLOOR
153   UNSPEC_FRNDINT_CEIL
154   UNSPEC_FRNDINT_TRUNC
155   UNSPEC_FRNDINT_MASK_PM
156   UNSPEC_FIST_FLOOR
157   UNSPEC_FIST_CEIL
158
159   ;; x87 Double output FP
160   UNSPEC_SINCOS_COS
161   UNSPEC_SINCOS_SIN
162   UNSPEC_XTRACT_FRACT
163   UNSPEC_XTRACT_EXP
164   UNSPEC_FSCALE_FRACT
165   UNSPEC_FSCALE_EXP
166   UNSPEC_FPREM_F
167   UNSPEC_FPREM_U
168   UNSPEC_FPREM1_F
169   UNSPEC_FPREM1_U
170
171   UNSPEC_C2_FLAG
172   UNSPEC_FXAM_MEM
173
174   ;; SSP patterns
175   UNSPEC_SP_SET
176   UNSPEC_SP_TEST
177   UNSPEC_SP_TLS_SET
178   UNSPEC_SP_TLS_TEST
179
180   ;; SSSE3
181   UNSPEC_PSHUFB
182   UNSPEC_PSIGN
183   UNSPEC_PALIGNR
184
185   ;; For SSE4A support
186   UNSPEC_EXTRQI
187   UNSPEC_EXTRQ
188   UNSPEC_INSERTQI
189   UNSPEC_INSERTQ
190
191   ;; For SSE4.1 support
192   UNSPEC_BLENDV
193   UNSPEC_INSERTPS
194   UNSPEC_DP
195   UNSPEC_MOVNTDQA
196   UNSPEC_MPSADBW
197   UNSPEC_PHMINPOSUW
198   UNSPEC_PTEST
199   UNSPEC_ROUND
200
201   ;; For SSE4.2 support
202   UNSPEC_CRC32
203   UNSPEC_PCMPESTR
204   UNSPEC_PCMPISTR
205
206   ;; For FMA4 support
207   UNSPEC_FMADDSUB
208   UNSPEC_XOP_UNSIGNED_CMP
209   UNSPEC_XOP_TRUEFALSE
210   UNSPEC_XOP_PERMUTE
211   UNSPEC_FRCZ
212
213   ;; For AES support
214   UNSPEC_AESENC
215   UNSPEC_AESENCLAST
216   UNSPEC_AESDEC
217   UNSPEC_AESDECLAST
218   UNSPEC_AESIMC
219   UNSPEC_AESKEYGENASSIST
220
221   ;; For PCLMUL support
222   UNSPEC_PCLMUL
223
224   ;; For AVX support
225   UNSPEC_PCMP
226   UNSPEC_VPERMIL
227   UNSPEC_VPERMIL2
228   UNSPEC_VPERMIL2F128
229   UNSPEC_CAST
230   UNSPEC_VTESTP
231   UNSPEC_VCVTPH2PS
232   UNSPEC_VCVTPS2PH
233
234   ;; For BMI support
235   UNSPEC_BEXTR
236
237   ;; For RDRAND support
238   UNSPEC_RDRAND
239 ])
240
241 (define_c_enum "unspecv" [
242   UNSPECV_BLOCKAGE
243   UNSPECV_STACK_PROBE
244   UNSPECV_PROBE_STACK_RANGE
245   UNSPECV_EMMS
246   UNSPECV_LDMXCSR
247   UNSPECV_STMXCSR
248   UNSPECV_FEMMS
249   UNSPECV_CLFLUSH
250   UNSPECV_ALIGN
251   UNSPECV_MONITOR
252   UNSPECV_MWAIT
253   UNSPECV_CMPXCHG
254   UNSPECV_XCHG
255   UNSPECV_LOCK
256   UNSPECV_PROLOGUE_USE
257   UNSPECV_CLD
258   UNSPECV_NOPS
259   UNSPECV_VZEROALL
260   UNSPECV_VZEROUPPER
261   UNSPECV_RDTSC
262   UNSPECV_RDTSCP
263   UNSPECV_RDPMC
264   UNSPECV_LLWP_INTRINSIC
265   UNSPECV_SLWP_INTRINSIC
266   UNSPECV_LWPVAL_INTRINSIC
267   UNSPECV_LWPINS_INTRINSIC
268   UNSPECV_RDFSBASE
269   UNSPECV_RDGSBASE
270   UNSPECV_WRFSBASE
271   UNSPECV_WRGSBASE
272   UNSPECV_SPLIT_STACK_RETURN
273 ])
274
275 ;; Constants to represent rounding modes in the ROUND instruction
276 (define_constants
277   [(ROUND_FLOOR                 0x1)
278    (ROUND_CEIL                  0x2)
279    (ROUND_TRUNC                 0x3)
280    (ROUND_MXCSR                 0x4)
281    (ROUND_NO_EXC                0x8)
282   ])
283
284 ;; Constants to represent pcomtrue/pcomfalse variants
285 (define_constants
286   [(PCOM_FALSE                  0)
287    (PCOM_TRUE                   1)
288    (COM_FALSE_S                 2)
289    (COM_FALSE_P                 3)
290    (COM_TRUE_S                  4)
291    (COM_TRUE_P                  5)
292   ])
293
294 ;; Constants used in the XOP pperm instruction
295 (define_constants
296   [(PPERM_SRC                   0x00)   /* copy source */
297    (PPERM_INVERT                0x20)   /* invert source */
298    (PPERM_REVERSE               0x40)   /* bit reverse source */
299    (PPERM_REV_INV               0x60)   /* bit reverse & invert src */
300    (PPERM_ZERO                  0x80)   /* all 0's */
301    (PPERM_ONES                  0xa0)   /* all 1's */
302    (PPERM_SIGN                  0xc0)   /* propagate sign bit */
303    (PPERM_INV_SIGN              0xe0)   /* invert & propagate sign */
304    (PPERM_SRC1                  0x00)   /* use first source byte */
305    (PPERM_SRC2                  0x10)   /* use second source byte */
306    ])
307
308 ;; Registers by name.
309 (define_constants
310   [(AX_REG                       0)
311    (DX_REG                       1)
312    (CX_REG                       2)
313    (BX_REG                       3)
314    (SI_REG                       4)
315    (DI_REG                       5)
316    (BP_REG                       6)
317    (SP_REG                       7)
318    (ST0_REG                      8)
319    (ST1_REG                      9)
320    (ST2_REG                     10)
321    (ST3_REG                     11)
322    (ST4_REG                     12)
323    (ST5_REG                     13)
324    (ST6_REG                     14)
325    (ST7_REG                     15)
326    (FLAGS_REG                   17)
327    (FPSR_REG                    18)
328    (FPCR_REG                    19)
329    (XMM0_REG                    21)
330    (XMM1_REG                    22)
331    (XMM2_REG                    23)
332    (XMM3_REG                    24)
333    (XMM4_REG                    25)
334    (XMM5_REG                    26)
335    (XMM6_REG                    27)
336    (XMM7_REG                    28)
337    (MM0_REG                     29)
338    (MM1_REG                     30)
339    (MM2_REG                     31)
340    (MM3_REG                     32)
341    (MM4_REG                     33)
342    (MM5_REG                     34)
343    (MM6_REG                     35)
344    (MM7_REG                     36)
345    (R8_REG                      37)
346    (R9_REG                      38)
347    (R10_REG                     39)
348    (R11_REG                     40)
349    (R12_REG                     41)
350    (R13_REG                     42)
351    (XMM8_REG                    45)
352    (XMM9_REG                    46)
353    (XMM10_REG                   47)
354    (XMM11_REG                   48)
355    (XMM12_REG                   49)
356    (XMM13_REG                   50)
357    (XMM14_REG                   51)
358    (XMM15_REG                   52)
359   ])
360
361 ;; Insns whose names begin with "x86_" are emitted by gen_FOO calls
362 ;; from i386.c.
363
364 ;; In C guard expressions, put expressions which may be compile-time
365 ;; constants first.  This allows for better optimization.  For
366 ;; example, write "TARGET_64BIT && reload_completed", not
367 ;; "reload_completed && TARGET_64BIT".
368
369 \f
370 ;; Processor type.
371 (define_attr "cpu" "none,pentium,pentiumpro,geode,k6,athlon,k8,core2,corei7,
372                     atom,generic64,amdfam10,bdver1,bdver2,btver1"
373   (const (symbol_ref "ix86_schedule")))
374
375 ;; A basic instruction type.  Refinements due to arguments to be
376 ;; provided in other attributes.
377 (define_attr "type"
378   "other,multi,
379    alu,alu1,negnot,imov,imovx,lea,
380    incdec,ishift,ishift1,rotate,rotate1,imul,idiv,
381    icmp,test,ibr,setcc,icmov,
382    push,pop,call,callv,leave,
383    str,bitmanip,
384    fmov,fop,fsgn,fmul,fdiv,fpspc,fcmov,fcmp,fxch,fistp,fisttp,frndint,
385    sselog,sselog1,sseiadd,sseiadd1,sseishft,sseishft1,sseimul,
386    sse,ssemov,sseadd,ssemul,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt,ssediv,sseins,
387    ssemuladd,sse4arg,lwp,
388    mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft"
389   (const_string "other"))
390
391 ;; Main data type used by the insn
392 (define_attr "mode"
393   "unknown,none,QI,HI,SI,DI,TI,OI,SF,DF,XF,TF,V8SF,V4DF,V4SF,V2DF,V2SF,V1DF"
394   (const_string "unknown"))
395
396 ;; The CPU unit operations uses.
397 (define_attr "unit" "integer,i387,sse,mmx,unknown"
398   (cond [(eq_attr "type" "fmov,fop,fsgn,fmul,fdiv,fpspc,fcmov,fcmp,fxch,fistp,fisttp,frndint")
399            (const_string "i387")
400          (eq_attr "type" "sselog,sselog1,sseiadd,sseiadd1,sseishft,sseishft1,sseimul,
401                           sse,ssemov,sseadd,ssemul,ssecmp,ssecomi,ssecvt,
402                           ssecvt1,sseicvt,ssediv,sseins,ssemuladd,sse4arg")
403            (const_string "sse")
404          (eq_attr "type" "mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft")
405            (const_string "mmx")
406          (eq_attr "type" "other")
407            (const_string "unknown")]
408          (const_string "integer")))
409
410 ;; The (bounding maximum) length of an instruction immediate.
411 (define_attr "length_immediate" ""
412   (cond [(eq_attr "type" "incdec,setcc,icmov,str,lea,other,multi,idiv,leave,
413                           bitmanip")
414            (const_int 0)
415          (eq_attr "unit" "i387,sse,mmx")
416            (const_int 0)
417          (eq_attr "type" "alu,alu1,negnot,imovx,ishift,rotate,ishift1,rotate1,
418                           imul,icmp,push,pop")
419            (symbol_ref "ix86_attr_length_immediate_default (insn, true)")
420          (eq_attr "type" "imov,test")
421            (symbol_ref "ix86_attr_length_immediate_default (insn, false)")
422          (eq_attr "type" "call")
423            (if_then_else (match_operand 0 "constant_call_address_operand" "")
424              (const_int 4)
425              (const_int 0))
426          (eq_attr "type" "callv")
427            (if_then_else (match_operand 1 "constant_call_address_operand" "")
428              (const_int 4)
429              (const_int 0))
430          ;; We don't know the size before shorten_branches.  Expect
431          ;; the instruction to fit for better scheduling.
432          (eq_attr "type" "ibr")
433            (const_int 1)
434          ]
435          (symbol_ref "/* Update immediate_length and other attributes! */
436                       gcc_unreachable (),1")))
437
438 ;; The (bounding maximum) length of an instruction address.
439 (define_attr "length_address" ""
440   (cond [(eq_attr "type" "str,other,multi,fxch")
441            (const_int 0)
442          (and (eq_attr "type" "call")
443               (match_operand 0 "constant_call_address_operand" ""))
444              (const_int 0)
445          (and (eq_attr "type" "callv")
446               (match_operand 1 "constant_call_address_operand" ""))
447              (const_int 0)
448          ]
449          (symbol_ref "ix86_attr_length_address_default (insn)")))
450
451 ;; Set when length prefix is used.
452 (define_attr "prefix_data16" ""
453   (cond [(eq_attr "type" "ssemuladd,sse4arg,sseiadd1,ssecvt1")
454            (const_int 0)
455          (eq_attr "mode" "HI")
456            (const_int 1)
457          (and (eq_attr "unit" "sse") (eq_attr "mode" "V2DF,TI"))
458            (const_int 1)
459         ]
460         (const_int 0)))
461
462 ;; Set when string REP prefix is used.
463 (define_attr "prefix_rep" ""
464   (cond [(eq_attr "type" "ssemuladd,sse4arg,sseiadd1,ssecvt1")
465            (const_int 0)
466          (and (eq_attr "unit" "sse") (eq_attr "mode" "SF,DF"))
467            (const_int 1)
468         ]
469         (const_int 0)))
470
471 ;; Set when 0f opcode prefix is used.
472 (define_attr "prefix_0f" ""
473   (if_then_else
474     (ior (eq_attr "type" "imovx,setcc,icmov,bitmanip")
475          (eq_attr "unit" "sse,mmx"))
476     (const_int 1)
477     (const_int 0)))
478
479 ;; Set when REX opcode prefix is used.
480 (define_attr "prefix_rex" ""
481   (cond [(eq (symbol_ref "TARGET_64BIT") (const_int 0))
482            (const_int 0)
483          (and (eq_attr "mode" "DI")
484               (and (eq_attr "type" "!push,pop,call,callv,leave,ibr")
485                    (eq_attr "unit" "!mmx")))
486            (const_int 1)
487          (and (eq_attr "mode" "QI")
488               (ne (symbol_ref "x86_extended_QIreg_mentioned_p (insn)")
489                   (const_int 0)))
490            (const_int 1)
491          (ne (symbol_ref "x86_extended_reg_mentioned_p (insn)")
492              (const_int 0))
493            (const_int 1)
494          (and (eq_attr "type" "imovx")
495               (match_operand:QI 1 "ext_QIreg_operand" ""))
496            (const_int 1)
497         ]
498         (const_int 0)))
499
500 ;; There are also additional prefixes in 3DNOW, SSSE3.
501 ;; ssemuladd,sse4arg default to 0f24/0f25 and DREX byte,
502 ;; sseiadd1,ssecvt1 to 0f7a with no DREX byte.
503 ;; 3DNOW has 0f0f prefix, SSSE3 and SSE4_{1,2} 0f38/0f3a.
504 (define_attr "prefix_extra" ""
505   (cond [(eq_attr "type" "ssemuladd,sse4arg")
506            (const_int 2)
507          (eq_attr "type" "sseiadd1,ssecvt1")
508            (const_int 1)
509         ]
510         (const_int 0)))
511
512 ;; Prefix used: original, VEX or maybe VEX.
513 (define_attr "prefix" "orig,vex,maybe_vex"
514   (if_then_else (eq_attr "mode" "OI,V8SF,V4DF")
515     (const_string "vex")
516     (const_string "orig")))
517
518 ;; VEX W bit is used.
519 (define_attr "prefix_vex_w" "" (const_int 0))
520
521 ;; The length of VEX prefix
522 ;; Only instructions with 0f prefix can have 2 byte VEX prefix,
523 ;; 0f38/0f3a prefixes can't.  In i386.md 0f3[8a] is
524 ;; still prefix_0f 1, with prefix_extra 1.
525 (define_attr "length_vex" ""
526   (if_then_else (and (eq_attr "prefix_0f" "1")
527                      (eq_attr "prefix_extra" "0"))
528     (if_then_else (eq_attr "prefix_vex_w" "1")
529       (symbol_ref "ix86_attr_length_vex_default (insn, true, true)")
530       (symbol_ref "ix86_attr_length_vex_default (insn, true, false)"))
531     (if_then_else (eq_attr "prefix_vex_w" "1")
532       (symbol_ref "ix86_attr_length_vex_default (insn, false, true)")
533       (symbol_ref "ix86_attr_length_vex_default (insn, false, false)"))))
534
535 ;; Set when modrm byte is used.
536 (define_attr "modrm" ""
537   (cond [(eq_attr "type" "str,leave")
538            (const_int 0)
539          (eq_attr "unit" "i387")
540            (const_int 0)
541          (and (eq_attr "type" "incdec")
542               (and (eq (symbol_ref "TARGET_64BIT") (const_int 0))
543                    (ior (match_operand:SI 1 "register_operand" "")
544                         (match_operand:HI 1 "register_operand" ""))))
545            (const_int 0)
546          (and (eq_attr "type" "push")
547               (not (match_operand 1 "memory_operand" "")))
548            (const_int 0)
549          (and (eq_attr "type" "pop")
550               (not (match_operand 0 "memory_operand" "")))
551            (const_int 0)
552          (and (eq_attr "type" "imov")
553               (and (not (eq_attr "mode" "DI"))
554                    (ior (and (match_operand 0 "register_operand" "")
555                              (match_operand 1 "immediate_operand" ""))
556                         (ior (and (match_operand 0 "ax_reg_operand" "")
557                                   (match_operand 1 "memory_displacement_only_operand" ""))
558                              (and (match_operand 0 "memory_displacement_only_operand" "")
559                                   (match_operand 1 "ax_reg_operand" ""))))))
560            (const_int 0)
561          (and (eq_attr "type" "call")
562               (match_operand 0 "constant_call_address_operand" ""))
563              (const_int 0)
564          (and (eq_attr "type" "callv")
565               (match_operand 1 "constant_call_address_operand" ""))
566              (const_int 0)
567          (and (eq_attr "type" "alu,alu1,icmp,test")
568               (match_operand 0 "ax_reg_operand" ""))
569              (symbol_ref "(get_attr_length_immediate (insn) <= (get_attr_mode (insn) != MODE_QI))")
570          ]
571          (const_int 1)))
572
573 ;; The (bounding maximum) length of an instruction in bytes.
574 ;; ??? fistp and frndint are in fact fldcw/{fistp,frndint}/fldcw sequences.
575 ;; Later we may want to split them and compute proper length as for
576 ;; other insns.
577 (define_attr "length" ""
578   (cond [(eq_attr "type" "other,multi,fistp,frndint")
579            (const_int 16)
580          (eq_attr "type" "fcmp")
581            (const_int 4)
582          (eq_attr "unit" "i387")
583            (plus (const_int 2)
584                  (plus (attr "prefix_data16")
585                        (attr "length_address")))
586          (ior (eq_attr "prefix" "vex")
587               (and (eq_attr "prefix" "maybe_vex")
588                     (ne (symbol_ref "TARGET_AVX") (const_int 0))))
589            (plus (attr "length_vex")
590                  (plus (attr "length_immediate")
591                        (plus (attr "modrm")
592                              (attr "length_address"))))]
593          (plus (plus (attr "modrm")
594                      (plus (attr "prefix_0f")
595                            (plus (attr "prefix_rex")
596                                  (plus (attr "prefix_extra")
597                                        (const_int 1)))))
598                (plus (attr "prefix_rep")
599                      (plus (attr "prefix_data16")
600                            (plus (attr "length_immediate")
601                                  (attr "length_address")))))))
602
603 ;; The `memory' attribute is `none' if no memory is referenced, `load' or
604 ;; `store' if there is a simple memory reference therein, or `unknown'
605 ;; if the instruction is complex.
606
607 (define_attr "memory" "none,load,store,both,unknown"
608   (cond [(eq_attr "type" "other,multi,str,lwp")
609            (const_string "unknown")
610          (eq_attr "type" "lea,fcmov,fpspc")
611            (const_string "none")
612          (eq_attr "type" "fistp,leave")
613            (const_string "both")
614          (eq_attr "type" "frndint")
615            (const_string "load")
616          (eq_attr "type" "push")
617            (if_then_else (match_operand 1 "memory_operand" "")
618              (const_string "both")
619              (const_string "store"))
620          (eq_attr "type" "pop")
621            (if_then_else (match_operand 0 "memory_operand" "")
622              (const_string "both")
623              (const_string "load"))
624          (eq_attr "type" "setcc")
625            (if_then_else (match_operand 0 "memory_operand" "")
626              (const_string "store")
627              (const_string "none"))
628          (eq_attr "type" "icmp,test,ssecmp,ssecomi,mmxcmp,fcmp")
629            (if_then_else (ior (match_operand 0 "memory_operand" "")
630                               (match_operand 1 "memory_operand" ""))
631              (const_string "load")
632              (const_string "none"))
633          (eq_attr "type" "ibr")
634            (if_then_else (match_operand 0 "memory_operand" "")
635              (const_string "load")
636              (const_string "none"))
637          (eq_attr "type" "call")
638            (if_then_else (match_operand 0 "constant_call_address_operand" "")
639              (const_string "none")
640              (const_string "load"))
641          (eq_attr "type" "callv")
642            (if_then_else (match_operand 1 "constant_call_address_operand" "")
643              (const_string "none")
644              (const_string "load"))
645          (and (eq_attr "type" "alu1,negnot,ishift1,sselog1")
646               (match_operand 1 "memory_operand" ""))
647            (const_string "both")
648          (and (match_operand 0 "memory_operand" "")
649               (match_operand 1 "memory_operand" ""))
650            (const_string "both")
651          (match_operand 0 "memory_operand" "")
652            (const_string "store")
653          (match_operand 1 "memory_operand" "")
654            (const_string "load")
655          (and (eq_attr "type"
656                  "!alu1,negnot,ishift1,
657                    imov,imovx,icmp,test,bitmanip,
658                    fmov,fcmp,fsgn,
659                    sse,ssemov,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt,sselog1,
660                    sseiadd1,mmx,mmxmov,mmxcmp,mmxcvt")
661               (match_operand 2 "memory_operand" ""))
662            (const_string "load")
663          (and (eq_attr "type" "icmov,ssemuladd,sse4arg")
664               (match_operand 3 "memory_operand" ""))
665            (const_string "load")
666         ]
667         (const_string "none")))
668
669 ;; Indicates if an instruction has both an immediate and a displacement.
670
671 (define_attr "imm_disp" "false,true,unknown"
672   (cond [(eq_attr "type" "other,multi")
673            (const_string "unknown")
674          (and (eq_attr "type" "icmp,test,imov,alu1,ishift1,rotate1")
675               (and (match_operand 0 "memory_displacement_operand" "")
676                    (match_operand 1 "immediate_operand" "")))
677            (const_string "true")
678          (and (eq_attr "type" "alu,ishift,rotate,imul,idiv")
679               (and (match_operand 0 "memory_displacement_operand" "")
680                    (match_operand 2 "immediate_operand" "")))
681            (const_string "true")
682         ]
683         (const_string "false")))
684
685 ;; Indicates if an FP operation has an integer source.
686
687 (define_attr "fp_int_src" "false,true"
688   (const_string "false"))
689
690 ;; Defines rounding mode of an FP operation.
691
692 (define_attr "i387_cw" "trunc,floor,ceil,mask_pm,uninitialized,any"
693   (const_string "any"))
694
695 ;; Define attribute to classify add/sub insns that consumes carry flag (CF)
696 (define_attr "use_carry" "0,1" (const_string "0"))
697
698 ;; Define attribute to indicate unaligned ssemov insns
699 (define_attr "movu" "0,1" (const_string "0"))
700
701 ;; Used to control the "enabled" attribute on a per-instruction basis.
702 (define_attr "isa" "base,noavx,avx"
703   (const_string "base"))
704
705 (define_attr "enabled" ""
706   (cond [(eq_attr "isa" "noavx") (symbol_ref "!TARGET_AVX")
707          (eq_attr "isa" "avx") (symbol_ref "TARGET_AVX")
708         ]
709         (const_int 1)))
710
711 ;; Describe a user's asm statement.
712 (define_asm_attributes
713   [(set_attr "length" "128")
714    (set_attr "type" "multi")])
715
716 (define_code_iterator plusminus [plus minus])
717
718 (define_code_iterator sat_plusminus [ss_plus us_plus ss_minus us_minus])
719
720 ;; Base name for define_insn
721 (define_code_attr plusminus_insn
722   [(plus "add") (ss_plus "ssadd") (us_plus "usadd")
723    (minus "sub") (ss_minus "sssub") (us_minus "ussub")])
724
725 ;; Base name for insn mnemonic.
726 (define_code_attr plusminus_mnemonic
727   [(plus "add") (ss_plus "adds") (us_plus "addus")
728    (minus "sub") (ss_minus "subs") (us_minus "subus")])
729 (define_code_attr plusminus_carry_mnemonic
730   [(plus "adc") (minus "sbb")])
731
732 ;; Mark commutative operators as such in constraints.
733 (define_code_attr comm [(plus "%") (ss_plus "%") (us_plus "%")
734                         (minus "") (ss_minus "") (us_minus "")])
735
736 ;; Mapping of signed max and min
737 (define_code_iterator smaxmin [smax smin])
738
739 ;; Mapping of unsigned max and min
740 (define_code_iterator umaxmin [umax umin])
741
742 ;; Base name for integer and FP insn mnemonic
743 (define_code_attr maxmin_int [(smax "maxs") (smin "mins")
744                               (umax "maxu") (umin "minu")])
745 (define_code_attr maxmin_float [(smax "max") (smin "min")])
746
747 ;; Mapping of logic operators
748 (define_code_iterator any_logic [and ior xor])
749 (define_code_iterator any_or [ior xor])
750
751 ;; Base name for insn mnemonic.
752 (define_code_attr logic [(and "and") (ior "or") (xor "xor")])
753
754 ;; Mapping of shift-right operators
755 (define_code_iterator any_shiftrt [lshiftrt ashiftrt])
756
757 ;; Base name for define_insn
758 (define_code_attr shiftrt_insn [(lshiftrt "lshr") (ashiftrt "ashr")])
759
760 ;; Base name for insn mnemonic.
761 (define_code_attr shiftrt [(lshiftrt "shr") (ashiftrt "sar")])
762
763 ;; Mapping of rotate operators
764 (define_code_iterator any_rotate [rotate rotatert])
765
766 ;; Base name for define_insn
767 (define_code_attr rotate_insn [(rotate "rotl") (rotatert "rotr")])
768
769 ;; Base name for insn mnemonic.
770 (define_code_attr rotate [(rotate "rol") (rotatert "ror")])
771
772 ;; Mapping of abs neg operators
773 (define_code_iterator absneg [abs neg])
774
775 ;; Base name for x87 insn mnemonic.
776 (define_code_attr absneg_mnemonic [(abs "abs") (neg "chs")])
777
778 ;; Used in signed and unsigned widening multiplications.
779 (define_code_iterator any_extend [sign_extend zero_extend])
780
781 ;; Various insn prefixes for signed and unsigned operations.
782 (define_code_attr u [(sign_extend "") (zero_extend "u")
783                      (div "") (udiv "u")])
784 (define_code_attr s [(sign_extend "s") (zero_extend "u")])
785
786 ;; Used in signed and unsigned divisions.
787 (define_code_iterator any_div [div udiv])
788
789 ;; Instruction prefix for signed and unsigned operations.
790 (define_code_attr sgnprefix [(sign_extend "i") (zero_extend "")
791                              (div "i") (udiv "")])
792
793 ;; All integer modes.
794 (define_mode_iterator SWI1248x [QI HI SI DI])
795
796 ;; All integer modes without QImode.
797 (define_mode_iterator SWI248x [HI SI DI])
798
799 ;; All integer modes without QImode and HImode.
800 (define_mode_iterator SWI48x [SI DI])
801
802 ;; All integer modes without SImode and DImode.
803 (define_mode_iterator SWI12 [QI HI])
804
805 ;; All integer modes without DImode.
806 (define_mode_iterator SWI124 [QI HI SI])
807
808 ;; All integer modes without QImode and DImode.
809 (define_mode_iterator SWI24 [HI SI])
810
811 ;; Single word integer modes.
812 (define_mode_iterator SWI [QI HI SI (DI "TARGET_64BIT")])
813
814 ;; Single word integer modes without QImode.
815 (define_mode_iterator SWI248 [HI SI (DI "TARGET_64BIT")])
816
817 ;; Single word integer modes without QImode and HImode.
818 (define_mode_iterator SWI48 [SI (DI "TARGET_64BIT")])
819
820 ;; All math-dependant single and double word integer modes.
821 (define_mode_iterator SDWIM [(QI "TARGET_QIMODE_MATH")
822                              (HI "TARGET_HIMODE_MATH")
823                              SI DI (TI "TARGET_64BIT")])
824
825 ;; Math-dependant single word integer modes.
826 (define_mode_iterator SWIM [(QI "TARGET_QIMODE_MATH")
827                             (HI "TARGET_HIMODE_MATH")
828                             SI (DI "TARGET_64BIT")])
829
830 ;; Math-dependant integer modes without DImode.
831 (define_mode_iterator SWIM124 [(QI "TARGET_QIMODE_MATH")
832                                (HI "TARGET_HIMODE_MATH")
833                                SI])
834
835 ;; Math-dependant single word integer modes without QImode.
836 (define_mode_iterator SWIM248 [(HI "TARGET_HIMODE_MATH")
837                                SI (DI "TARGET_64BIT")])
838
839 ;; Double word integer modes.
840 (define_mode_iterator DWI [(DI "!TARGET_64BIT")
841                            (TI "TARGET_64BIT")])
842
843 ;; Double word integer modes as mode attribute.
844 (define_mode_attr DWI [(SI "DI") (DI "TI")])
845 (define_mode_attr dwi [(SI "di") (DI "ti")])
846
847 ;; Half mode for double word integer modes.
848 (define_mode_iterator DWIH [(SI "!TARGET_64BIT")
849                             (DI "TARGET_64BIT")])
850
851 ;; Instruction suffix for integer modes.
852 (define_mode_attr imodesuffix [(QI "b") (HI "w") (SI "l") (DI "q")])
853
854 ;; Pointer size prefix for integer modes (Intel asm dialect)
855 (define_mode_attr iptrsize [(QI "BYTE")
856                             (HI "WORD")
857                             (SI "DWORD")
858                             (DI "QWORD")])
859
860 ;; Register class for integer modes.
861 (define_mode_attr r [(QI "q") (HI "r") (SI "r") (DI "r")])
862
863 ;; Immediate operand constraint for integer modes.
864 (define_mode_attr i [(QI "n") (HI "n") (SI "e") (DI "e")])
865
866 ;; General operand constraint for word modes.
867 (define_mode_attr g [(QI "qmn") (HI "rmn") (SI "rme") (DI "rme")])
868
869 ;; Immediate operand constraint for double integer modes.
870 (define_mode_attr di [(SI "nF") (DI "e")])
871
872 ;; Immediate operand constraint for shifts.
873 (define_mode_attr S [(QI "I") (HI "I") (SI "I") (DI "J") (TI "O")])
874
875 ;; General operand predicate for integer modes.
876 (define_mode_attr general_operand
877         [(QI "general_operand")
878          (HI "general_operand")
879          (SI "x86_64_general_operand")
880          (DI "x86_64_general_operand")
881          (TI "x86_64_general_operand")])
882
883 ;; General sign/zero extend operand predicate for integer modes.
884 (define_mode_attr general_szext_operand
885         [(QI "general_operand")
886          (HI "general_operand")
887          (SI "x86_64_szext_general_operand")
888          (DI "x86_64_szext_general_operand")])
889
890 ;; Immediate operand predicate for integer modes.
891 (define_mode_attr immediate_operand
892         [(QI "immediate_operand")
893          (HI "immediate_operand")
894          (SI "x86_64_immediate_operand")
895          (DI "x86_64_immediate_operand")])
896
897 ;; Nonmemory operand predicate for integer modes.
898 (define_mode_attr nonmemory_operand
899         [(QI "nonmemory_operand")
900          (HI "nonmemory_operand")
901          (SI "x86_64_nonmemory_operand")
902          (DI "x86_64_nonmemory_operand")])
903
904 ;; Operand predicate for shifts.
905 (define_mode_attr shift_operand
906         [(QI "nonimmediate_operand")
907          (HI "nonimmediate_operand")
908          (SI "nonimmediate_operand")
909          (DI "shiftdi_operand")
910          (TI "register_operand")])
911
912 ;; Operand predicate for shift argument.
913 (define_mode_attr shift_immediate_operand
914         [(QI "const_1_to_31_operand")
915          (HI "const_1_to_31_operand")
916          (SI "const_1_to_31_operand")
917          (DI "const_1_to_63_operand")])
918
919 ;; Input operand predicate for arithmetic left shifts.
920 (define_mode_attr ashl_input_operand
921         [(QI "nonimmediate_operand")
922          (HI "nonimmediate_operand")
923          (SI "nonimmediate_operand")
924          (DI "ashldi_input_operand")
925          (TI "reg_or_pm1_operand")])
926
927 ;; SSE and x87 SFmode and DFmode floating point modes
928 (define_mode_iterator MODEF [SF DF])
929
930 ;; All x87 floating point modes
931 (define_mode_iterator X87MODEF [SF DF XF])
932
933 ;; SSE instruction suffix for various modes
934 (define_mode_attr ssemodesuffix
935   [(SF "ss") (DF "sd")
936    (V8SF "ps") (V4DF "pd")
937    (V4SF "ps") (V2DF "pd")
938    (V16QI "b") (V8HI "w") (V4SI "d") (V2DI "q")])
939
940 ;; SSE vector suffix for floating point modes
941 (define_mode_attr ssevecmodesuffix [(SF "ps") (DF "pd")])
942
943 ;; SSE vector mode corresponding to a scalar mode
944 (define_mode_attr ssevecmode
945   [(QI "V16QI") (HI "V8HI") (SI "V4SI") (DI "V2DI") (SF "V4SF") (DF "V2DF")])
946
947 ;; Instruction suffix for REX 64bit operators.
948 (define_mode_attr rex64suffix [(SI "") (DI "{q}")])
949
950 ;; This mode iterator allows :P to be used for patterns that operate on
951 ;; pointer-sized quantities.  Exactly one of the two alternatives will match.
952 (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
953
954 ;; This mode iterator allows :PTR to be used for patterns that operate on
955 ;; ptr_mode sized quantities.
956 (define_mode_iterator PTR
957   [(SI "ptr_mode == SImode") (DI "ptr_mode == DImode")])
958 \f
959 ;; Scheduling descriptions
960
961 (include "pentium.md")
962 (include "ppro.md")
963 (include "k6.md")
964 (include "athlon.md")
965 (include "bdver1.md")
966 (include "geode.md")
967 (include "atom.md")
968 (include "core2.md")
969
970 \f
971 ;; Operand and operator predicates and constraints
972
973 (include "predicates.md")
974 (include "constraints.md")
975
976 \f
977 ;; Compare and branch/compare and store instructions.
978
979 (define_expand "cbranch<mode>4"
980   [(set (reg:CC FLAGS_REG)
981         (compare:CC (match_operand:SDWIM 1 "nonimmediate_operand" "")
982                     (match_operand:SDWIM 2 "<general_operand>" "")))
983    (set (pc) (if_then_else
984                (match_operator 0 "ordered_comparison_operator"
985                 [(reg:CC FLAGS_REG) (const_int 0)])
986                (label_ref (match_operand 3 "" ""))
987                (pc)))]
988   ""
989 {
990   if (MEM_P (operands[1]) && MEM_P (operands[2]))
991     operands[1] = force_reg (<MODE>mode, operands[1]);
992   ix86_expand_branch (GET_CODE (operands[0]),
993                       operands[1], operands[2], operands[3]);
994   DONE;
995 })
996
997 (define_expand "cstore<mode>4"
998   [(set (reg:CC FLAGS_REG)
999         (compare:CC (match_operand:SWIM 2 "nonimmediate_operand" "")
1000                     (match_operand:SWIM 3 "<general_operand>" "")))
1001    (set (match_operand:QI 0 "register_operand" "")
1002         (match_operator 1 "ordered_comparison_operator"
1003           [(reg:CC FLAGS_REG) (const_int 0)]))]
1004   ""
1005 {
1006   if (MEM_P (operands[2]) && MEM_P (operands[3]))
1007     operands[2] = force_reg (<MODE>mode, operands[2]);
1008   ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1009                      operands[2], operands[3]);
1010   DONE;
1011 })
1012
1013 (define_expand "cmp<mode>_1"
1014   [(set (reg:CC FLAGS_REG)
1015         (compare:CC (match_operand:SWI48 0 "nonimmediate_operand" "")
1016                     (match_operand:SWI48 1 "<general_operand>" "")))])
1017
1018 (define_insn "*cmp<mode>_ccno_1"
1019   [(set (reg FLAGS_REG)
1020         (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>,?m<r>")
1021                  (match_operand:SWI 1 "const0_operand" "")))]
1022   "ix86_match_ccmode (insn, CCNOmode)"
1023   "@
1024    test{<imodesuffix>}\t%0, %0
1025    cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1026   [(set_attr "type" "test,icmp")
1027    (set_attr "length_immediate" "0,1")
1028    (set_attr "mode" "<MODE>")])
1029
1030 (define_insn "*cmp<mode>_1"
1031   [(set (reg FLAGS_REG)
1032         (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
1033                  (match_operand:SWI 1 "<general_operand>" "<r><i>,<r>m")))]
1034   "ix86_match_ccmode (insn, CCmode)"
1035   "cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1036   [(set_attr "type" "icmp")
1037    (set_attr "mode" "<MODE>")])
1038
1039 (define_insn "*cmp<mode>_minus_1"
1040   [(set (reg FLAGS_REG)
1041         (compare
1042           (minus:SWI (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
1043                      (match_operand:SWI 1 "<general_operand>" "<r><i>,<r>m"))
1044           (const_int 0)))]
1045   "ix86_match_ccmode (insn, CCGOCmode)"
1046   "cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1047   [(set_attr "type" "icmp")
1048    (set_attr "mode" "<MODE>")])
1049
1050 (define_insn "*cmpqi_ext_1"
1051   [(set (reg FLAGS_REG)
1052         (compare
1053           (match_operand:QI 0 "general_operand" "Qm")
1054           (subreg:QI
1055             (zero_extract:SI
1056               (match_operand 1 "ext_register_operand" "Q")
1057               (const_int 8)
1058               (const_int 8)) 0)))]
1059   "!TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1060   "cmp{b}\t{%h1, %0|%0, %h1}"
1061   [(set_attr "type" "icmp")
1062    (set_attr "mode" "QI")])
1063
1064 (define_insn "*cmpqi_ext_1_rex64"
1065   [(set (reg FLAGS_REG)
1066         (compare
1067           (match_operand:QI 0 "register_operand" "Q")
1068           (subreg:QI
1069             (zero_extract:SI
1070               (match_operand 1 "ext_register_operand" "Q")
1071               (const_int 8)
1072               (const_int 8)) 0)))]
1073   "TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1074   "cmp{b}\t{%h1, %0|%0, %h1}"
1075   [(set_attr "type" "icmp")
1076    (set_attr "mode" "QI")])
1077
1078 (define_insn "*cmpqi_ext_2"
1079   [(set (reg FLAGS_REG)
1080         (compare
1081           (subreg:QI
1082             (zero_extract:SI
1083               (match_operand 0 "ext_register_operand" "Q")
1084               (const_int 8)
1085               (const_int 8)) 0)
1086           (match_operand:QI 1 "const0_operand" "")))]
1087   "ix86_match_ccmode (insn, CCNOmode)"
1088   "test{b}\t%h0, %h0"
1089   [(set_attr "type" "test")
1090    (set_attr "length_immediate" "0")
1091    (set_attr "mode" "QI")])
1092
1093 (define_expand "cmpqi_ext_3"
1094   [(set (reg:CC FLAGS_REG)
1095         (compare:CC
1096           (subreg:QI
1097             (zero_extract:SI
1098               (match_operand 0 "ext_register_operand" "")
1099               (const_int 8)
1100               (const_int 8)) 0)
1101           (match_operand:QI 1 "immediate_operand" "")))])
1102
1103 (define_insn "*cmpqi_ext_3_insn"
1104   [(set (reg FLAGS_REG)
1105         (compare
1106           (subreg:QI
1107             (zero_extract:SI
1108               (match_operand 0 "ext_register_operand" "Q")
1109               (const_int 8)
1110               (const_int 8)) 0)
1111           (match_operand:QI 1 "general_operand" "Qmn")))]
1112   "!TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1113   "cmp{b}\t{%1, %h0|%h0, %1}"
1114   [(set_attr "type" "icmp")
1115    (set_attr "modrm" "1")
1116    (set_attr "mode" "QI")])
1117
1118 (define_insn "*cmpqi_ext_3_insn_rex64"
1119   [(set (reg FLAGS_REG)
1120         (compare
1121           (subreg:QI
1122             (zero_extract:SI
1123               (match_operand 0 "ext_register_operand" "Q")
1124               (const_int 8)
1125               (const_int 8)) 0)
1126           (match_operand:QI 1 "nonmemory_operand" "Qn")))]
1127   "TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1128   "cmp{b}\t{%1, %h0|%h0, %1}"
1129   [(set_attr "type" "icmp")
1130    (set_attr "modrm" "1")
1131    (set_attr "mode" "QI")])
1132
1133 (define_insn "*cmpqi_ext_4"
1134   [(set (reg FLAGS_REG)
1135         (compare
1136           (subreg:QI
1137             (zero_extract:SI
1138               (match_operand 0 "ext_register_operand" "Q")
1139               (const_int 8)
1140               (const_int 8)) 0)
1141           (subreg:QI
1142             (zero_extract:SI
1143               (match_operand 1 "ext_register_operand" "Q")
1144               (const_int 8)
1145               (const_int 8)) 0)))]
1146   "ix86_match_ccmode (insn, CCmode)"
1147   "cmp{b}\t{%h1, %h0|%h0, %h1}"
1148   [(set_attr "type" "icmp")
1149    (set_attr "mode" "QI")])
1150
1151 ;; These implement float point compares.
1152 ;; %%% See if we can get away with VOIDmode operands on the actual insns,
1153 ;; which would allow mix and match FP modes on the compares.  Which is what
1154 ;; the old patterns did, but with many more of them.
1155
1156 (define_expand "cbranchxf4"
1157   [(set (reg:CC FLAGS_REG)
1158         (compare:CC (match_operand:XF 1 "nonmemory_operand" "")
1159                     (match_operand:XF 2 "nonmemory_operand" "")))
1160    (set (pc) (if_then_else
1161               (match_operator 0 "ix86_fp_comparison_operator"
1162                [(reg:CC FLAGS_REG)
1163                 (const_int 0)])
1164               (label_ref (match_operand 3 "" ""))
1165               (pc)))]
1166   "TARGET_80387"
1167 {
1168   ix86_expand_branch (GET_CODE (operands[0]),
1169                       operands[1], operands[2], operands[3]);
1170   DONE;
1171 })
1172
1173 (define_expand "cstorexf4"
1174   [(set (reg:CC FLAGS_REG)
1175         (compare:CC (match_operand:XF 2 "nonmemory_operand" "")
1176                     (match_operand:XF 3 "nonmemory_operand" "")))
1177    (set (match_operand:QI 0 "register_operand" "")
1178               (match_operator 1 "ix86_fp_comparison_operator"
1179                [(reg:CC FLAGS_REG)
1180                 (const_int 0)]))]
1181   "TARGET_80387"
1182 {
1183   ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1184                      operands[2], operands[3]);
1185   DONE;
1186 })
1187
1188 (define_expand "cbranch<mode>4"
1189   [(set (reg:CC FLAGS_REG)
1190         (compare:CC (match_operand:MODEF 1 "cmp_fp_expander_operand" "")
1191                     (match_operand:MODEF 2 "cmp_fp_expander_operand" "")))
1192    (set (pc) (if_then_else
1193               (match_operator 0 "ix86_fp_comparison_operator"
1194                [(reg:CC FLAGS_REG)
1195                 (const_int 0)])
1196               (label_ref (match_operand 3 "" ""))
1197               (pc)))]
1198   "TARGET_80387 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
1199 {
1200   ix86_expand_branch (GET_CODE (operands[0]),
1201                       operands[1], operands[2], operands[3]);
1202   DONE;
1203 })
1204
1205 (define_expand "cstore<mode>4"
1206   [(set (reg:CC FLAGS_REG)
1207         (compare:CC (match_operand:MODEF 2 "cmp_fp_expander_operand" "")
1208                     (match_operand:MODEF 3 "cmp_fp_expander_operand" "")))
1209    (set (match_operand:QI 0 "register_operand" "")
1210               (match_operator 1 "ix86_fp_comparison_operator"
1211                [(reg:CC FLAGS_REG)
1212                 (const_int 0)]))]
1213   "TARGET_80387 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
1214 {
1215   ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1216                      operands[2], operands[3]);
1217   DONE;
1218 })
1219
1220 (define_expand "cbranchcc4"
1221   [(set (pc) (if_then_else
1222               (match_operator 0 "comparison_operator"
1223                [(match_operand 1 "flags_reg_operand" "")
1224                 (match_operand 2 "const0_operand" "")])
1225               (label_ref (match_operand 3 "" ""))
1226               (pc)))]
1227   ""
1228 {
1229   ix86_expand_branch (GET_CODE (operands[0]),
1230                       operands[1], operands[2], operands[3]);
1231   DONE;
1232 })
1233
1234 (define_expand "cstorecc4"
1235   [(set (match_operand:QI 0 "register_operand" "")
1236               (match_operator 1 "comparison_operator"
1237                [(match_operand 2 "flags_reg_operand" "")
1238                 (match_operand 3 "const0_operand" "")]))]
1239   ""
1240 {
1241   ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1242                      operands[2], operands[3]);
1243   DONE;
1244 })
1245
1246
1247 ;; FP compares, step 1:
1248 ;; Set the FP condition codes.
1249 ;;
1250 ;; CCFPmode     compare with exceptions
1251 ;; CCFPUmode    compare with no exceptions
1252
1253 ;; We may not use "#" to split and emit these, since the REG_DEAD notes
1254 ;; used to manage the reg stack popping would not be preserved.
1255
1256 (define_insn "*cmpfp_0"
1257   [(set (match_operand:HI 0 "register_operand" "=a")
1258         (unspec:HI
1259           [(compare:CCFP
1260              (match_operand 1 "register_operand" "f")
1261              (match_operand 2 "const0_operand" ""))]
1262         UNSPEC_FNSTSW))]
1263   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1264    && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1265   "* return output_fp_compare (insn, operands, false, false);"
1266   [(set_attr "type" "multi")
1267    (set_attr "unit" "i387")
1268    (set (attr "mode")
1269      (cond [(match_operand:SF 1 "" "")
1270               (const_string "SF")
1271             (match_operand:DF 1 "" "")
1272               (const_string "DF")
1273            ]
1274            (const_string "XF")))])
1275
1276 (define_insn_and_split "*cmpfp_0_cc"
1277   [(set (reg:CCFP FLAGS_REG)
1278         (compare:CCFP
1279           (match_operand 1 "register_operand" "f")
1280           (match_operand 2 "const0_operand" "")))
1281    (clobber (match_operand:HI 0 "register_operand" "=a"))]
1282   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1283    && TARGET_SAHF && !TARGET_CMOVE
1284    && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1285   "#"
1286   "&& reload_completed"
1287   [(set (match_dup 0)
1288         (unspec:HI
1289           [(compare:CCFP (match_dup 1)(match_dup 2))]
1290         UNSPEC_FNSTSW))
1291    (set (reg:CC FLAGS_REG)
1292         (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1293   ""
1294   [(set_attr "type" "multi")
1295    (set_attr "unit" "i387")
1296    (set (attr "mode")
1297      (cond [(match_operand:SF 1 "" "")
1298               (const_string "SF")
1299             (match_operand:DF 1 "" "")
1300               (const_string "DF")
1301            ]
1302            (const_string "XF")))])
1303
1304 (define_insn "*cmpfp_xf"
1305   [(set (match_operand:HI 0 "register_operand" "=a")
1306         (unspec:HI
1307           [(compare:CCFP
1308              (match_operand:XF 1 "register_operand" "f")
1309              (match_operand:XF 2 "register_operand" "f"))]
1310           UNSPEC_FNSTSW))]
1311   "TARGET_80387"
1312   "* return output_fp_compare (insn, operands, false, false);"
1313   [(set_attr "type" "multi")
1314    (set_attr "unit" "i387")
1315    (set_attr "mode" "XF")])
1316
1317 (define_insn_and_split "*cmpfp_xf_cc"
1318   [(set (reg:CCFP FLAGS_REG)
1319         (compare:CCFP
1320           (match_operand:XF 1 "register_operand" "f")
1321           (match_operand:XF 2 "register_operand" "f")))
1322    (clobber (match_operand:HI 0 "register_operand" "=a"))]
1323   "TARGET_80387
1324    && TARGET_SAHF && !TARGET_CMOVE"
1325   "#"
1326   "&& reload_completed"
1327   [(set (match_dup 0)
1328         (unspec:HI
1329           [(compare:CCFP (match_dup 1)(match_dup 2))]
1330         UNSPEC_FNSTSW))
1331    (set (reg:CC FLAGS_REG)
1332         (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1333   ""
1334   [(set_attr "type" "multi")
1335    (set_attr "unit" "i387")
1336    (set_attr "mode" "XF")])
1337
1338 (define_insn "*cmpfp_<mode>"
1339   [(set (match_operand:HI 0 "register_operand" "=a")
1340         (unspec:HI
1341           [(compare:CCFP
1342              (match_operand:MODEF 1 "register_operand" "f")
1343              (match_operand:MODEF 2 "nonimmediate_operand" "fm"))]
1344           UNSPEC_FNSTSW))]
1345   "TARGET_80387"
1346   "* return output_fp_compare (insn, operands, false, false);"
1347   [(set_attr "type" "multi")
1348    (set_attr "unit" "i387")
1349    (set_attr "mode" "<MODE>")])
1350
1351 (define_insn_and_split "*cmpfp_<mode>_cc"
1352   [(set (reg:CCFP FLAGS_REG)
1353         (compare:CCFP
1354           (match_operand:MODEF 1 "register_operand" "f")
1355           (match_operand:MODEF 2 "nonimmediate_operand" "fm")))
1356    (clobber (match_operand:HI 0 "register_operand" "=a"))]
1357   "TARGET_80387
1358    && TARGET_SAHF && !TARGET_CMOVE"
1359   "#"
1360   "&& reload_completed"
1361   [(set (match_dup 0)
1362         (unspec:HI
1363           [(compare:CCFP (match_dup 1)(match_dup 2))]
1364         UNSPEC_FNSTSW))
1365    (set (reg:CC FLAGS_REG)
1366         (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1367   ""
1368   [(set_attr "type" "multi")
1369    (set_attr "unit" "i387")
1370    (set_attr "mode" "<MODE>")])
1371
1372 (define_insn "*cmpfp_u"
1373   [(set (match_operand:HI 0 "register_operand" "=a")
1374         (unspec:HI
1375           [(compare:CCFPU
1376              (match_operand 1 "register_operand" "f")
1377              (match_operand 2 "register_operand" "f"))]
1378           UNSPEC_FNSTSW))]
1379   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1380    && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1381   "* return output_fp_compare (insn, operands, false, true);"
1382   [(set_attr "type" "multi")
1383    (set_attr "unit" "i387")
1384    (set (attr "mode")
1385      (cond [(match_operand:SF 1 "" "")
1386               (const_string "SF")
1387             (match_operand:DF 1 "" "")
1388               (const_string "DF")
1389            ]
1390            (const_string "XF")))])
1391
1392 (define_insn_and_split "*cmpfp_u_cc"
1393   [(set (reg:CCFPU FLAGS_REG)
1394         (compare:CCFPU
1395           (match_operand 1 "register_operand" "f")
1396           (match_operand 2 "register_operand" "f")))
1397    (clobber (match_operand:HI 0 "register_operand" "=a"))]
1398   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1399    && TARGET_SAHF && !TARGET_CMOVE
1400    && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1401   "#"
1402   "&& reload_completed"
1403   [(set (match_dup 0)
1404         (unspec:HI
1405           [(compare:CCFPU (match_dup 1)(match_dup 2))]
1406         UNSPEC_FNSTSW))
1407    (set (reg:CC FLAGS_REG)
1408         (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1409   ""
1410   [(set_attr "type" "multi")
1411    (set_attr "unit" "i387")
1412    (set (attr "mode")
1413      (cond [(match_operand:SF 1 "" "")
1414               (const_string "SF")
1415             (match_operand:DF 1 "" "")
1416               (const_string "DF")
1417            ]
1418            (const_string "XF")))])
1419
1420 (define_insn "*cmpfp_<mode>"
1421   [(set (match_operand:HI 0 "register_operand" "=a")
1422         (unspec:HI
1423           [(compare:CCFP
1424              (match_operand 1 "register_operand" "f")
1425              (match_operator 3 "float_operator"
1426                [(match_operand:SWI24 2 "memory_operand" "m")]))]
1427           UNSPEC_FNSTSW))]
1428   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1429    && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
1430    && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
1431   "* return output_fp_compare (insn, operands, false, false);"
1432   [(set_attr "type" "multi")
1433    (set_attr "unit" "i387")
1434    (set_attr "fp_int_src" "true")
1435    (set_attr "mode" "<MODE>")])
1436
1437 (define_insn_and_split "*cmpfp_<mode>_cc"
1438   [(set (reg:CCFP FLAGS_REG)
1439         (compare:CCFP
1440           (match_operand 1 "register_operand" "f")
1441           (match_operator 3 "float_operator"
1442             [(match_operand:SWI24 2 "memory_operand" "m")])))
1443    (clobber (match_operand:HI 0 "register_operand" "=a"))]
1444   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1445    && TARGET_SAHF && !TARGET_CMOVE
1446    && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
1447    && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
1448   "#"
1449   "&& reload_completed"
1450   [(set (match_dup 0)
1451         (unspec:HI
1452           [(compare:CCFP
1453              (match_dup 1)
1454              (match_op_dup 3 [(match_dup 2)]))]
1455         UNSPEC_FNSTSW))
1456    (set (reg:CC FLAGS_REG)
1457         (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1458   ""
1459   [(set_attr "type" "multi")
1460    (set_attr "unit" "i387")
1461    (set_attr "fp_int_src" "true")
1462    (set_attr "mode" "<MODE>")])
1463
1464 ;; FP compares, step 2
1465 ;; Move the fpsw to ax.
1466
1467 (define_insn "x86_fnstsw_1"
1468   [(set (match_operand:HI 0 "register_operand" "=a")
1469         (unspec:HI [(reg:CCFP FPSR_REG)] UNSPEC_FNSTSW))]
1470   "TARGET_80387"
1471   "fnstsw\t%0"
1472   [(set (attr "length") (symbol_ref "ix86_attr_length_address_default (insn) + 2"))
1473    (set_attr "mode" "SI")
1474    (set_attr "unit" "i387")])
1475
1476 ;; FP compares, step 3
1477 ;; Get ax into flags, general case.
1478
1479 (define_insn "x86_sahf_1"
1480   [(set (reg:CC FLAGS_REG)
1481         (unspec:CC [(match_operand:HI 0 "register_operand" "a")]
1482                    UNSPEC_SAHF))]
1483   "TARGET_SAHF"
1484 {
1485 #ifndef HAVE_AS_IX86_SAHF
1486   if (TARGET_64BIT)
1487     return ASM_BYTE "0x9e";
1488   else
1489 #endif
1490   return "sahf";
1491 }
1492   [(set_attr "length" "1")
1493    (set_attr "athlon_decode" "vector")
1494    (set_attr "amdfam10_decode" "direct")
1495    (set_attr "bdver1_decode" "direct")
1496    (set_attr "mode" "SI")])
1497
1498 ;; Pentium Pro can do steps 1 through 3 in one go.
1499 ;; comi*, ucomi*, fcomi*, ficomi*,fucomi* (i387 instructions set condition codes)
1500 (define_insn "*cmpfp_i_mixed"
1501   [(set (reg:CCFP FLAGS_REG)
1502         (compare:CCFP (match_operand 0 "register_operand" "f,x")
1503                       (match_operand 1 "nonimmediate_operand" "f,xm")))]
1504   "TARGET_MIX_SSE_I387
1505    && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1506    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1507   "* return output_fp_compare (insn, operands, true, false);"
1508   [(set_attr "type" "fcmp,ssecomi")
1509    (set_attr "prefix" "orig,maybe_vex")
1510    (set (attr "mode")
1511      (if_then_else (match_operand:SF 1 "" "")
1512         (const_string "SF")
1513         (const_string "DF")))
1514    (set (attr "prefix_rep")
1515         (if_then_else (eq_attr "type" "ssecomi")
1516                       (const_string "0")
1517                       (const_string "*")))
1518    (set (attr "prefix_data16")
1519         (cond [(eq_attr "type" "fcmp")
1520                  (const_string "*")
1521                (eq_attr "mode" "DF")
1522                  (const_string "1")
1523               ]
1524               (const_string "0")))
1525    (set_attr "athlon_decode" "vector")
1526    (set_attr "amdfam10_decode" "direct")
1527    (set_attr "bdver1_decode" "double")])
1528
1529 (define_insn "*cmpfp_i_sse"
1530   [(set (reg:CCFP FLAGS_REG)
1531         (compare:CCFP (match_operand 0 "register_operand" "x")
1532                       (match_operand 1 "nonimmediate_operand" "xm")))]
1533   "TARGET_SSE_MATH
1534    && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1535    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1536   "* return output_fp_compare (insn, operands, true, false);"
1537   [(set_attr "type" "ssecomi")
1538    (set_attr "prefix" "maybe_vex")
1539    (set (attr "mode")
1540      (if_then_else (match_operand:SF 1 "" "")
1541         (const_string "SF")
1542         (const_string "DF")))
1543    (set_attr "prefix_rep" "0")
1544    (set (attr "prefix_data16")
1545         (if_then_else (eq_attr "mode" "DF")
1546                       (const_string "1")
1547                       (const_string "0")))
1548    (set_attr "athlon_decode" "vector")
1549    (set_attr "amdfam10_decode" "direct")
1550    (set_attr "bdver1_decode" "double")])
1551
1552 (define_insn "*cmpfp_i_i387"
1553   [(set (reg:CCFP FLAGS_REG)
1554         (compare:CCFP (match_operand 0 "register_operand" "f")
1555                       (match_operand 1 "register_operand" "f")))]
1556   "X87_FLOAT_MODE_P (GET_MODE (operands[0]))
1557    && TARGET_CMOVE
1558    && !(SSE_FLOAT_MODE_P (GET_MODE (operands[0])) && TARGET_SSE_MATH)
1559    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1560   "* return output_fp_compare (insn, operands, true, false);"
1561   [(set_attr "type" "fcmp")
1562    (set (attr "mode")
1563      (cond [(match_operand:SF 1 "" "")
1564               (const_string "SF")
1565             (match_operand:DF 1 "" "")
1566               (const_string "DF")
1567            ]
1568            (const_string "XF")))
1569    (set_attr "athlon_decode" "vector")
1570    (set_attr "amdfam10_decode" "direct")
1571    (set_attr "bdver1_decode" "double")])
1572
1573 (define_insn "*cmpfp_iu_mixed"
1574   [(set (reg:CCFPU FLAGS_REG)
1575         (compare:CCFPU (match_operand 0 "register_operand" "f,x")
1576                        (match_operand 1 "nonimmediate_operand" "f,xm")))]
1577   "TARGET_MIX_SSE_I387
1578    && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1579    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1580   "* return output_fp_compare (insn, operands, true, true);"
1581   [(set_attr "type" "fcmp,ssecomi")
1582    (set_attr "prefix" "orig,maybe_vex")
1583    (set (attr "mode")
1584      (if_then_else (match_operand:SF 1 "" "")
1585         (const_string "SF")
1586         (const_string "DF")))
1587    (set (attr "prefix_rep")
1588         (if_then_else (eq_attr "type" "ssecomi")
1589                       (const_string "0")
1590                       (const_string "*")))
1591    (set (attr "prefix_data16")
1592         (cond [(eq_attr "type" "fcmp")
1593                  (const_string "*")
1594                (eq_attr "mode" "DF")
1595                  (const_string "1")
1596               ]
1597               (const_string "0")))
1598    (set_attr "athlon_decode" "vector")
1599    (set_attr "amdfam10_decode" "direct")
1600    (set_attr "bdver1_decode" "double")])
1601
1602 (define_insn "*cmpfp_iu_sse"
1603   [(set (reg:CCFPU FLAGS_REG)
1604         (compare:CCFPU (match_operand 0 "register_operand" "x")
1605                        (match_operand 1 "nonimmediate_operand" "xm")))]
1606   "TARGET_SSE_MATH
1607    && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1608    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1609   "* return output_fp_compare (insn, operands, true, true);"
1610   [(set_attr "type" "ssecomi")
1611    (set_attr "prefix" "maybe_vex")
1612    (set (attr "mode")
1613      (if_then_else (match_operand:SF 1 "" "")
1614         (const_string "SF")
1615         (const_string "DF")))
1616    (set_attr "prefix_rep" "0")
1617    (set (attr "prefix_data16")
1618         (if_then_else (eq_attr "mode" "DF")
1619                       (const_string "1")
1620                       (const_string "0")))
1621    (set_attr "athlon_decode" "vector")
1622    (set_attr "amdfam10_decode" "direct")
1623    (set_attr "bdver1_decode" "double")])
1624
1625 (define_insn "*cmpfp_iu_387"
1626   [(set (reg:CCFPU FLAGS_REG)
1627         (compare:CCFPU (match_operand 0 "register_operand" "f")
1628                        (match_operand 1 "register_operand" "f")))]
1629   "X87_FLOAT_MODE_P (GET_MODE (operands[0]))
1630    && TARGET_CMOVE
1631    && !(SSE_FLOAT_MODE_P (GET_MODE (operands[0])) && TARGET_SSE_MATH)
1632    && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1633   "* return output_fp_compare (insn, operands, true, true);"
1634   [(set_attr "type" "fcmp")
1635    (set (attr "mode")
1636      (cond [(match_operand:SF 1 "" "")
1637               (const_string "SF")
1638             (match_operand:DF 1 "" "")
1639               (const_string "DF")
1640            ]
1641            (const_string "XF")))
1642    (set_attr "athlon_decode" "vector")
1643    (set_attr "amdfam10_decode" "direct")
1644    (set_attr "bdver1_decode" "direct")])
1645 \f
1646 ;; Push/pop instructions.
1647
1648 (define_insn "*push<mode>2"
1649   [(set (match_operand:DWI 0 "push_operand" "=<")
1650         (match_operand:DWI 1 "general_no_elim_operand" "riF*o"))]
1651   ""
1652   "#"
1653   [(set_attr "type" "multi")
1654    (set_attr "mode" "<MODE>")])
1655
1656 (define_split
1657   [(set (match_operand:TI 0 "push_operand" "")
1658         (match_operand:TI 1 "general_operand" ""))]
1659   "TARGET_64BIT && reload_completed
1660    && !SSE_REG_P (operands[1])"
1661   [(const_int 0)]
1662   "ix86_split_long_move (operands); DONE;")
1663
1664 (define_insn "*pushdi2_rex64"
1665   [(set (match_operand:DI 0 "push_operand" "=<,!<")
1666         (match_operand:DI 1 "general_no_elim_operand" "re*m,n"))]
1667   "TARGET_64BIT"
1668   "@
1669    push{q}\t%1
1670    #"
1671   [(set_attr "type" "push,multi")
1672    (set_attr "mode" "DI")])
1673
1674 ;; Convert impossible pushes of immediate to existing instructions.
1675 ;; First try to get scratch register and go through it.  In case this
1676 ;; fails, push sign extended lower part first and then overwrite
1677 ;; upper part by 32bit move.
1678 (define_peephole2
1679   [(match_scratch:DI 2 "r")
1680    (set (match_operand:DI 0 "push_operand" "")
1681         (match_operand:DI 1 "immediate_operand" ""))]
1682   "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
1683    && !x86_64_immediate_operand (operands[1], DImode)"
1684   [(set (match_dup 2) (match_dup 1))
1685    (set (match_dup 0) (match_dup 2))])
1686
1687 ;; We need to define this as both peepholer and splitter for case
1688 ;; peephole2 pass is not run.
1689 ;; "&& 1" is needed to keep it from matching the previous pattern.
1690 (define_peephole2
1691   [(set (match_operand:DI 0 "push_operand" "")
1692         (match_operand:DI 1 "immediate_operand" ""))]
1693   "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
1694    && !x86_64_immediate_operand (operands[1], DImode) && 1"
1695   [(set (match_dup 0) (match_dup 1))
1696    (set (match_dup 2) (match_dup 3))]
1697 {
1698   split_double_mode (DImode, &operands[1], 1, &operands[2], &operands[3]);
1699
1700   operands[1] = gen_lowpart (DImode, operands[2]);
1701   operands[2] = gen_rtx_MEM (SImode, gen_rtx_PLUS (DImode, stack_pointer_rtx,
1702                                                    GEN_INT (4)));
1703 })
1704
1705 (define_split
1706   [(set (match_operand:DI 0 "push_operand" "")
1707         (match_operand:DI 1 "immediate_operand" ""))]
1708   "TARGET_64BIT && ((optimize > 0 && flag_peephole2)
1709                     ? epilogue_completed : reload_completed)
1710    && !symbolic_operand (operands[1], DImode)
1711    && !x86_64_immediate_operand (operands[1], DImode)"
1712   [(set (match_dup 0) (match_dup 1))
1713    (set (match_dup 2) (match_dup 3))]
1714 {
1715   split_double_mode (DImode, &operands[1], 1, &operands[2], &operands[3]);
1716
1717   operands[1] = gen_lowpart (DImode, operands[2]);
1718   operands[2] = gen_rtx_MEM (SImode, gen_rtx_PLUS (DImode, stack_pointer_rtx,
1719                                                    GEN_INT (4)));
1720 })
1721
1722 (define_split
1723   [(set (match_operand:DI 0 "push_operand" "")
1724         (match_operand:DI 1 "general_operand" ""))]
1725   "!TARGET_64BIT && reload_completed
1726    && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))"
1727   [(const_int 0)]
1728   "ix86_split_long_move (operands); DONE;")
1729
1730 (define_insn "*pushsi2"
1731   [(set (match_operand:SI 0 "push_operand" "=<")
1732         (match_operand:SI 1 "general_no_elim_operand" "ri*m"))]
1733   "!TARGET_64BIT"
1734   "push{l}\t%1"
1735   [(set_attr "type" "push")
1736    (set_attr "mode" "SI")])
1737
1738 ;; emit_push_insn when it calls move_by_pieces requires an insn to
1739 ;; "push a byte/word".  But actually we use pushl, which has the effect
1740 ;; of rounding the amount pushed up to a word.
1741
1742 ;; For TARGET_64BIT we always round up to 8 bytes.
1743 (define_insn "*push<mode>2_rex64"
1744   [(set (match_operand:SWI124 0 "push_operand" "=X")
1745         (match_operand:SWI124 1 "nonmemory_no_elim_operand" "r<i>"))]
1746   "TARGET_64BIT"
1747   "push{q}\t%q1"
1748   [(set_attr "type" "push")
1749    (set_attr "mode" "DI")])
1750
1751 (define_insn "*push<mode>2"
1752   [(set (match_operand:SWI12 0 "push_operand" "=X")
1753         (match_operand:SWI12 1 "nonmemory_no_elim_operand" "rn"))]
1754   "!TARGET_64BIT"
1755   "push{l}\t%k1"
1756   [(set_attr "type" "push")
1757    (set_attr "mode" "SI")])
1758
1759 (define_insn "*push<mode>2_prologue"
1760   [(set (match_operand:P 0 "push_operand" "=<")
1761         (match_operand:P 1 "general_no_elim_operand" "r<i>*m"))
1762    (clobber (mem:BLK (scratch)))]
1763   ""
1764   "push{<imodesuffix>}\t%1"
1765   [(set_attr "type" "push")
1766    (set_attr "mode" "<MODE>")])
1767
1768 (define_insn "*pop<mode>1"
1769   [(set (match_operand:P 0 "nonimmediate_operand" "=r*m")
1770         (match_operand:P 1 "pop_operand" ">"))]
1771   ""
1772   "pop{<imodesuffix>}\t%0"
1773   [(set_attr "type" "pop")
1774    (set_attr "mode" "<MODE>")])
1775
1776 (define_insn "*pop<mode>1_epilogue"
1777   [(set (match_operand:P 0 "nonimmediate_operand" "=r*m")
1778         (match_operand:P 1 "pop_operand" ">"))
1779    (clobber (mem:BLK (scratch)))]
1780   ""
1781   "pop{<imodesuffix>}\t%0"
1782   [(set_attr "type" "pop")
1783    (set_attr "mode" "<MODE>")])
1784 \f
1785 ;; Move instructions.
1786
1787 (define_expand "movoi"
1788   [(set (match_operand:OI 0 "nonimmediate_operand" "")
1789         (match_operand:OI 1 "general_operand" ""))]
1790   "TARGET_AVX"
1791   "ix86_expand_move (OImode, operands); DONE;")
1792
1793 (define_expand "movti"
1794   [(set (match_operand:TI 0 "nonimmediate_operand" "")
1795         (match_operand:TI 1 "nonimmediate_operand" ""))]
1796   "TARGET_64BIT || TARGET_SSE"
1797 {
1798   if (TARGET_64BIT)
1799     ix86_expand_move (TImode, operands);
1800   else if (push_operand (operands[0], TImode))
1801     ix86_expand_push (TImode, operands[1]);
1802   else
1803     ix86_expand_vector_move (TImode, operands);
1804   DONE;
1805 })
1806
1807 ;; This expands to what emit_move_complex would generate if we didn't
1808 ;; have a movti pattern.  Having this avoids problems with reload on
1809 ;; 32-bit targets when SSE is present, but doesn't seem to be harmful
1810 ;; to have around all the time.
1811 (define_expand "movcdi"
1812   [(set (match_operand:CDI 0 "nonimmediate_operand" "")
1813         (match_operand:CDI 1 "general_operand" ""))]
1814   ""
1815 {
1816   if (push_operand (operands[0], CDImode))
1817     emit_move_complex_push (CDImode, operands[0], operands[1]);
1818   else
1819     emit_move_complex_parts (operands[0], operands[1]);
1820   DONE;
1821 })
1822
1823 (define_expand "mov<mode>"
1824   [(set (match_operand:SWI1248x 0 "nonimmediate_operand" "")
1825         (match_operand:SWI1248x 1 "general_operand" ""))]
1826   ""
1827   "ix86_expand_move (<MODE>mode, operands); DONE;")
1828
1829 (define_insn "*mov<mode>_xor"
1830   [(set (match_operand:SWI48 0 "register_operand" "=r")
1831         (match_operand:SWI48 1 "const0_operand" ""))
1832    (clobber (reg:CC FLAGS_REG))]
1833   "reload_completed"
1834   "xor{l}\t%k0, %k0"
1835   [(set_attr "type" "alu1")
1836    (set_attr "mode" "SI")
1837    (set_attr "length_immediate" "0")])
1838
1839 (define_insn "*mov<mode>_or"
1840   [(set (match_operand:SWI48 0 "register_operand" "=r")
1841         (match_operand:SWI48 1 "const_int_operand" ""))
1842    (clobber (reg:CC FLAGS_REG))]
1843   "reload_completed
1844    && operands[1] == constm1_rtx"
1845   "or{<imodesuffix>}\t{%1, %0|%0, %1}"
1846   [(set_attr "type" "alu1")
1847    (set_attr "mode" "<MODE>")
1848    (set_attr "length_immediate" "1")])
1849
1850 (define_insn "*movoi_internal_avx"
1851   [(set (match_operand:OI 0 "nonimmediate_operand" "=x,x,m")
1852         (match_operand:OI 1 "vector_move_operand" "C,xm,x"))]
1853   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1854 {
1855   switch (which_alternative)
1856     {
1857     case 0:
1858       return standard_sse_constant_opcode (insn, operands[1]);
1859     case 1:
1860     case 2:
1861       if (misaligned_operand (operands[0], OImode)
1862           || misaligned_operand (operands[1], OImode))
1863         return "vmovdqu\t{%1, %0|%0, %1}";
1864       else
1865         return "vmovdqa\t{%1, %0|%0, %1}";
1866     default:
1867       gcc_unreachable ();
1868     }
1869 }
1870   [(set_attr "type" "sselog1,ssemov,ssemov")
1871    (set_attr "prefix" "vex")
1872    (set_attr "mode" "OI")])
1873
1874 (define_insn "*movti_internal_rex64"
1875   [(set (match_operand:TI 0 "nonimmediate_operand" "=!r,o,x,x,xm")
1876         (match_operand:TI 1 "general_operand" "riFo,riF,C,xm,x"))]
1877   "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1878 {
1879   switch (which_alternative)
1880     {
1881     case 0:
1882     case 1:
1883       return "#";
1884     case 2:
1885       return standard_sse_constant_opcode (insn, operands[1]);
1886     case 3:
1887     case 4:
1888       /* TDmode values are passed as TImode on the stack.  Moving them
1889          to stack may result in unaligned memory access.  */
1890       if (misaligned_operand (operands[0], TImode)
1891           || misaligned_operand (operands[1], TImode))
1892         {
1893           if (get_attr_mode (insn) == MODE_V4SF)
1894             return "%vmovups\t{%1, %0|%0, %1}";
1895           else
1896             return "%vmovdqu\t{%1, %0|%0, %1}";
1897         }
1898       else
1899         {
1900           if (get_attr_mode (insn) == MODE_V4SF)
1901             return "%vmovaps\t{%1, %0|%0, %1}";
1902           else
1903             return "%vmovdqa\t{%1, %0|%0, %1}";
1904         }
1905     default:
1906       gcc_unreachable ();
1907     }
1908 }
1909   [(set_attr "type" "*,*,sselog1,ssemov,ssemov")
1910    (set_attr "prefix" "*,*,maybe_vex,maybe_vex,maybe_vex")
1911    (set (attr "mode")
1912         (cond [(eq_attr "alternative" "2,3")
1913                  (if_then_else
1914                    (ne (symbol_ref "optimize_function_for_size_p (cfun)")
1915                        (const_int 0))
1916                    (const_string "V4SF")
1917                    (const_string "TI"))
1918                (eq_attr "alternative" "4")
1919                  (if_then_else
1920                    (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
1921                             (const_int 0))
1922                         (ne (symbol_ref "optimize_function_for_size_p (cfun)")
1923                             (const_int 0)))
1924                    (const_string "V4SF")
1925                    (const_string "TI"))]
1926                (const_string "DI")))])
1927
1928 (define_split
1929   [(set (match_operand:TI 0 "nonimmediate_operand" "")
1930         (match_operand:TI 1 "general_operand" ""))]
1931   "reload_completed
1932    && !SSE_REG_P (operands[0]) && !SSE_REG_P (operands[1])"
1933   [(const_int 0)]
1934   "ix86_split_long_move (operands); DONE;")
1935
1936 (define_insn "*movti_internal_sse"
1937   [(set (match_operand:TI 0 "nonimmediate_operand" "=x,x,m")
1938         (match_operand:TI 1 "vector_move_operand" "C,xm,x"))]
1939   "TARGET_SSE && !TARGET_64BIT
1940    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1941 {
1942   switch (which_alternative)
1943     {
1944     case 0:
1945       return standard_sse_constant_opcode (insn, operands[1]);
1946     case 1:
1947     case 2:
1948       /* TDmode values are passed as TImode on the stack.  Moving them
1949          to stack may result in unaligned memory access.  */
1950       if (misaligned_operand (operands[0], TImode)
1951           || misaligned_operand (operands[1], TImode))
1952         {
1953           if (get_attr_mode (insn) == MODE_V4SF)
1954             return "%vmovups\t{%1, %0|%0, %1}";
1955           else
1956             return "%vmovdqu\t{%1, %0|%0, %1}";
1957         }
1958       else
1959         {
1960           if (get_attr_mode (insn) == MODE_V4SF)
1961             return "%vmovaps\t{%1, %0|%0, %1}";
1962           else
1963             return "%vmovdqa\t{%1, %0|%0, %1}";
1964         }
1965     default:
1966       gcc_unreachable ();
1967     }
1968 }
1969   [(set_attr "type" "sselog1,ssemov,ssemov")
1970    (set_attr "prefix" "maybe_vex")
1971    (set (attr "mode")
1972         (cond [(ior (eq (symbol_ref "TARGET_SSE2") (const_int 0))
1973                     (ne (symbol_ref "optimize_function_for_size_p (cfun)")
1974                         (const_int 0)))
1975                  (const_string "V4SF")
1976                (and (eq_attr "alternative" "2")
1977                     (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
1978                         (const_int 0)))
1979                  (const_string "V4SF")]
1980               (const_string "TI")))])
1981
1982 (define_insn "*movdi_internal_rex64"
1983   [(set (match_operand:DI 0 "nonimmediate_operand"
1984           "=r,r  ,r,m ,!o,*y,m*y,?*y,?r ,?*Ym,*x,m ,*x,*x,?r ,?*Yi,?*x,?*Ym")
1985         (match_operand:DI 1 "general_operand"
1986           "Z ,rem,i,re,n ,C ,*y ,m  ,*Ym,r   ,C ,*x,*x,m ,*Yi,r   ,*Ym,*x"))]
1987   "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1988 {
1989   switch (get_attr_type (insn))
1990     {
1991     case TYPE_SSECVT:
1992       if (SSE_REG_P (operands[0]))
1993         return "movq2dq\t{%1, %0|%0, %1}";
1994       else
1995         return "movdq2q\t{%1, %0|%0, %1}";
1996
1997     case TYPE_SSEMOV:
1998       if (get_attr_mode (insn) == MODE_TI)
1999         return "%vmovdqa\t{%1, %0|%0, %1}";
2000       /* Handle broken assemblers that require movd instead of movq.  */
2001       if (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))
2002         return "%vmovd\t{%1, %0|%0, %1}";
2003       else
2004         return "%vmovq\t{%1, %0|%0, %1}";
2005
2006     case TYPE_MMXMOV:
2007       /* Handle broken assemblers that require movd instead of movq.  */
2008       if (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))
2009         return "movd\t{%1, %0|%0, %1}";
2010       else
2011         return "movq\t{%1, %0|%0, %1}";
2012
2013     case TYPE_SSELOG1:
2014       return standard_sse_constant_opcode (insn, operands[1]);
2015
2016     case TYPE_MMX:
2017       return "pxor\t%0, %0";
2018
2019     case TYPE_MULTI:
2020       return "#";
2021
2022     case TYPE_LEA:
2023       return "lea{q}\t{%a1, %0|%0, %a1}";
2024
2025     default:
2026       gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
2027       if (get_attr_mode (insn) == MODE_SI)
2028         return "mov{l}\t{%k1, %k0|%k0, %k1}";
2029       else if (which_alternative == 2)
2030         return "movabs{q}\t{%1, %0|%0, %1}";
2031       else
2032         return "mov{q}\t{%1, %0|%0, %1}";
2033     }
2034 }
2035   [(set (attr "type")
2036      (cond [(eq_attr "alternative" "4")
2037               (const_string "multi")
2038             (eq_attr "alternative" "5")
2039               (const_string "mmx")
2040             (eq_attr "alternative" "6,7,8,9")
2041               (const_string "mmxmov")
2042             (eq_attr "alternative" "10")
2043               (const_string "sselog1")
2044             (eq_attr "alternative" "11,12,13,14,15")
2045               (const_string "ssemov")
2046             (eq_attr "alternative" "16,17")
2047               (const_string "ssecvt")
2048             (match_operand 1 "pic_32bit_operand" "")
2049               (const_string "lea")
2050            ]
2051            (const_string "imov")))
2052    (set (attr "modrm")
2053      (if_then_else
2054        (and (eq_attr "alternative" "2") (eq_attr "type" "imov"))
2055          (const_string "0")
2056          (const_string "*")))
2057    (set (attr "length_immediate")
2058      (if_then_else
2059        (and (eq_attr "alternative" "2") (eq_attr "type" "imov"))
2060          (const_string "8")
2061          (const_string "*")))
2062    (set (attr "prefix_rex")
2063      (if_then_else (eq_attr "alternative" "8,9")
2064        (const_string "1")
2065        (const_string "*")))
2066    (set (attr "prefix_data16")
2067      (if_then_else (eq_attr "alternative" "11")
2068        (const_string "1")
2069        (const_string "*")))
2070    (set (attr "prefix")
2071      (if_then_else (eq_attr "alternative" "10,11,12,13,14,15")
2072        (const_string "maybe_vex")
2073        (const_string "orig")))
2074    (set_attr "mode" "SI,DI,DI,DI,SI,DI,DI,DI,DI,DI,TI,DI,TI,DI,DI,DI,DI,DI")])
2075
2076 ;; Convert impossible stores of immediate to existing instructions.
2077 ;; First try to get scratch register and go through it.  In case this
2078 ;; fails, move by 32bit parts.
2079 (define_peephole2
2080   [(match_scratch:DI 2 "r")
2081    (set (match_operand:DI 0 "memory_operand" "")
2082         (match_operand:DI 1 "immediate_operand" ""))]
2083   "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
2084    && !x86_64_immediate_operand (operands[1], DImode)"
2085   [(set (match_dup 2) (match_dup 1))
2086    (set (match_dup 0) (match_dup 2))])
2087
2088 ;; We need to define this as both peepholer and splitter for case
2089 ;; peephole2 pass is not run.
2090 ;; "&& 1" is needed to keep it from matching the previous pattern.
2091 (define_peephole2
2092   [(set (match_operand:DI 0 "memory_operand" "")
2093         (match_operand:DI 1 "immediate_operand" ""))]
2094   "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
2095    && !x86_64_immediate_operand (operands[1], DImode) && 1"
2096   [(set (match_dup 2) (match_dup 3))
2097    (set (match_dup 4) (match_dup 5))]
2098   "split_double_mode (DImode, &operands[0], 2, &operands[2], &operands[4]);")
2099
2100 (define_split
2101   [(set (match_operand:DI 0 "memory_operand" "")
2102         (match_operand:DI 1 "immediate_operand" ""))]
2103   "TARGET_64BIT && ((optimize > 0 && flag_peephole2)
2104                     ? epilogue_completed : reload_completed)
2105    && !symbolic_operand (operands[1], DImode)
2106    && !x86_64_immediate_operand (operands[1], DImode)"
2107   [(set (match_dup 2) (match_dup 3))
2108    (set (match_dup 4) (match_dup 5))]
2109   "split_double_mode (DImode, &operands[0], 2, &operands[2], &operands[4]);")
2110
2111 (define_insn "*movdi_internal"
2112   [(set (match_operand:DI 0 "nonimmediate_operand"
2113           "=r  ,o  ,*y,m*y,*y,*Y2,m  ,*Y2,*Y2,*x,m ,*x,*x,?*Y2,?*Ym")
2114         (match_operand:DI 1 "general_operand"
2115           "riFo,riF,C ,*y ,m ,C  ,*Y2,*Y2,m  ,C ,*x,*x,m ,*Ym ,*Y2"))]
2116   "!TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
2117 {
2118   switch (get_attr_type (insn))
2119     {
2120     case TYPE_SSECVT:
2121       if (SSE_REG_P (operands[0]))
2122         return "movq2dq\t{%1, %0|%0, %1}";
2123       else
2124         return "movdq2q\t{%1, %0|%0, %1}";
2125
2126     case TYPE_SSEMOV:
2127       switch (get_attr_mode (insn))
2128         {
2129         case MODE_TI:
2130           return "%vmovdqa\t{%1, %0|%0, %1}";
2131         case MODE_DI:
2132            return "%vmovq\t{%1, %0|%0, %1}";
2133         case MODE_V4SF:
2134           return "movaps\t{%1, %0|%0, %1}";
2135         case MODE_V2SF:
2136           return "movlps\t{%1, %0|%0, %1}";
2137         default:
2138           gcc_unreachable ();
2139         }
2140
2141     case TYPE_MMXMOV:
2142       return "movq\t{%1, %0|%0, %1}";
2143
2144     case TYPE_SSELOG1:
2145       return standard_sse_constant_opcode (insn, operands[1]);
2146
2147     case TYPE_MMX:
2148       return "pxor\t%0, %0";
2149
2150     case TYPE_MULTI:
2151       return "#";
2152
2153     default:
2154       gcc_unreachable ();
2155     }
2156 }
2157   [(set (attr "isa")
2158      (if_then_else (eq_attr "alternative" "9,10,11,12")
2159        (const_string "noavx")
2160        (const_string "*")))
2161    (set (attr "type")
2162      (cond [(eq_attr "alternative" "0,1")
2163               (const_string "multi")
2164             (eq_attr "alternative" "2")
2165               (const_string "mmx")
2166             (eq_attr "alternative" "3,4")
2167               (const_string "mmxmov")
2168             (eq_attr "alternative" "5,9")
2169               (const_string "sselog1")
2170             (eq_attr "alternative" "13,14")
2171               (const_string "ssecvt")
2172            ]
2173            (const_string "ssemov")))
2174    (set (attr "prefix")
2175      (if_then_else (eq_attr "alternative" "5,6,7,8")
2176        (const_string "maybe_vex")
2177        (const_string "orig")))
2178    (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,TI,DI,V4SF,V2SF,V4SF,V2SF,DI,DI")])
2179
2180 (define_split
2181   [(set (match_operand:DI 0 "nonimmediate_operand" "")
2182         (match_operand:DI 1 "general_operand" ""))]
2183   "!TARGET_64BIT && reload_completed
2184    && !(MMX_REG_P (operands[0]) || SSE_REG_P (operands[0]))
2185    && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))"
2186   [(const_int 0)]
2187   "ix86_split_long_move (operands); DONE;")
2188
2189 (define_insn "*movsi_internal"
2190   [(set (match_operand:SI 0 "nonimmediate_operand"
2191                         "=r,m ,*y,*y,?rm,?*y,*x,*x,?r ,m ,?*Yi,*x")
2192         (match_operand:SI 1 "general_operand"
2193                         "g ,re,C ,*y,*y ,rm ,C ,*x,*Yi,*x,r   ,m "))]
2194   "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2195 {
2196   switch (get_attr_type (insn))
2197     {
2198     case TYPE_SSELOG1:
2199       return standard_sse_constant_opcode (insn, operands[1]);
2200
2201     case TYPE_SSEMOV:
2202       switch (get_attr_mode (insn))
2203         {
2204         case MODE_TI:
2205           return "%vmovdqa\t{%1, %0|%0, %1}";
2206         case MODE_V4SF:
2207           return "%vmovaps\t{%1, %0|%0, %1}";
2208         case MODE_SI:
2209           return "%vmovd\t{%1, %0|%0, %1}";
2210         case MODE_SF:
2211           return "%vmovss\t{%1, %0|%0, %1}";
2212         default:
2213           gcc_unreachable ();
2214         }
2215
2216     case TYPE_MMX:
2217       return "pxor\t%0, %0";
2218
2219     case TYPE_MMXMOV:
2220       if (get_attr_mode (insn) == MODE_DI)
2221         return "movq\t{%1, %0|%0, %1}";
2222       return "movd\t{%1, %0|%0, %1}";
2223
2224     case TYPE_LEA:
2225       return "lea{l}\t{%a1, %0|%0, %a1}";
2226
2227     default:
2228       gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
2229       return "mov{l}\t{%1, %0|%0, %1}";
2230     }
2231 }
2232   [(set (attr "type")
2233      (cond [(eq_attr "alternative" "2")
2234               (const_string "mmx")
2235             (eq_attr "alternative" "3,4,5")
2236               (const_string "mmxmov")
2237             (eq_attr "alternative" "6")
2238               (const_string "sselog1")
2239             (eq_attr "alternative" "7,8,9,10,11")
2240               (const_string "ssemov")
2241             (match_operand 1 "pic_32bit_operand" "")
2242               (const_string "lea")
2243            ]
2244            (const_string "imov")))
2245    (set (attr "prefix")
2246      (if_then_else (eq_attr "alternative" "0,1,2,3,4,5")
2247        (const_string "orig")
2248        (const_string "maybe_vex")))
2249    (set (attr "prefix_data16")
2250      (if_then_else (and (eq_attr "type" "ssemov") (eq_attr "mode" "SI"))
2251        (const_string "1")
2252        (const_string "*")))
2253    (set (attr "mode")
2254      (cond [(eq_attr "alternative" "2,3")
2255               (const_string "DI")
2256             (eq_attr "alternative" "6,7")
2257               (if_then_else
2258                 (eq (symbol_ref "TARGET_SSE2") (const_int 0))
2259                 (const_string "V4SF")
2260                 (const_string "TI"))
2261             (and (eq_attr "alternative" "8,9,10,11")
2262                  (eq (symbol_ref "TARGET_SSE2") (const_int 0)))
2263               (const_string "SF")
2264            ]
2265            (const_string "SI")))])
2266
2267 (define_insn "*movhi_internal"
2268   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m")
2269         (match_operand:HI 1 "general_operand" "r,rn,rm,rn"))]
2270   "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2271 {
2272   switch (get_attr_type (insn))
2273     {
2274     case TYPE_IMOVX:
2275       /* movzwl is faster than movw on p2 due to partial word stalls,
2276          though not as fast as an aligned movl.  */
2277       return "movz{wl|x}\t{%1, %k0|%k0, %1}";
2278     default:
2279       if (get_attr_mode (insn) == MODE_SI)
2280         return "mov{l}\t{%k1, %k0|%k0, %k1}";
2281       else
2282         return "mov{w}\t{%1, %0|%0, %1}";
2283     }
2284 }
2285   [(set (attr "type")
2286      (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
2287                 (const_int 0))
2288               (const_string "imov")
2289             (and (eq_attr "alternative" "0")
2290                  (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2291                           (const_int 0))
2292                       (eq (symbol_ref "TARGET_HIMODE_MATH")
2293                           (const_int 0))))
2294               (const_string "imov")
2295             (and (eq_attr "alternative" "1,2")
2296                  (match_operand:HI 1 "aligned_operand" ""))
2297               (const_string "imov")
2298             (and (ne (symbol_ref "TARGET_MOVX")
2299                      (const_int 0))
2300                  (eq_attr "alternative" "0,2"))
2301               (const_string "imovx")
2302            ]
2303            (const_string "imov")))
2304     (set (attr "mode")
2305       (cond [(eq_attr "type" "imovx")
2306                (const_string "SI")
2307              (and (eq_attr "alternative" "1,2")
2308                   (match_operand:HI 1 "aligned_operand" ""))
2309                (const_string "SI")
2310              (and (eq_attr "alternative" "0")
2311                   (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2312                            (const_int 0))
2313                        (eq (symbol_ref "TARGET_HIMODE_MATH")
2314                            (const_int 0))))
2315                (const_string "SI")
2316             ]
2317             (const_string "HI")))])
2318
2319 ;; Situation is quite tricky about when to choose full sized (SImode) move
2320 ;; over QImode moves.  For Q_REG -> Q_REG move we use full size only for
2321 ;; partial register dependency machines (such as AMD Athlon), where QImode
2322 ;; moves issue extra dependency and for partial register stalls machines
2323 ;; that don't use QImode patterns (and QImode move cause stall on the next
2324 ;; instruction).
2325 ;;
2326 ;; For loads of Q_REG to NONQ_REG we use full sized moves except for partial
2327 ;; register stall machines with, where we use QImode instructions, since
2328 ;; partial register stall can be caused there.  Then we use movzx.
2329 (define_insn "*movqi_internal"
2330   [(set (match_operand:QI 0 "nonimmediate_operand" "=q,q ,q ,r,r ,?r,m")
2331         (match_operand:QI 1 "general_operand"      " q,qn,qm,q,rn,qm,qn"))]
2332   "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2333 {
2334   switch (get_attr_type (insn))
2335     {
2336     case TYPE_IMOVX:
2337       gcc_assert (ANY_QI_REG_P (operands[1]) || MEM_P (operands[1]));
2338       return "movz{bl|x}\t{%1, %k0|%k0, %1}";
2339     default:
2340       if (get_attr_mode (insn) == MODE_SI)
2341         return "mov{l}\t{%k1, %k0|%k0, %k1}";
2342       else
2343         return "mov{b}\t{%1, %0|%0, %1}";
2344     }
2345 }
2346   [(set (attr "type")
2347      (cond [(and (eq_attr "alternative" "5")
2348                  (not (match_operand:QI 1 "aligned_operand" "")))
2349               (const_string "imovx")
2350             (ne (symbol_ref "optimize_function_for_size_p (cfun)")
2351                 (const_int 0))
2352               (const_string "imov")
2353             (and (eq_attr "alternative" "3")
2354                  (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2355                           (const_int 0))
2356                       (eq (symbol_ref "TARGET_QIMODE_MATH")
2357                           (const_int 0))))
2358               (const_string "imov")
2359             (eq_attr "alternative" "3,5")
2360               (const_string "imovx")
2361             (and (ne (symbol_ref "TARGET_MOVX")
2362                      (const_int 0))
2363                  (eq_attr "alternative" "2"))
2364               (const_string "imovx")
2365            ]
2366            (const_string "imov")))
2367    (set (attr "mode")
2368       (cond [(eq_attr "alternative" "3,4,5")
2369                (const_string "SI")
2370              (eq_attr "alternative" "6")
2371                (const_string "QI")
2372              (eq_attr "type" "imovx")
2373                (const_string "SI")
2374              (and (eq_attr "type" "imov")
2375                   (and (eq_attr "alternative" "0,1")
2376                        (and (ne (symbol_ref "TARGET_PARTIAL_REG_DEPENDENCY")
2377                                 (const_int 0))
2378                             (and (eq (symbol_ref "optimize_function_for_size_p (cfun)")
2379                                      (const_int 0))
2380                                  (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2381                                      (const_int 0))))))
2382                (const_string "SI")
2383              ;; Avoid partial register stalls when not using QImode arithmetic
2384              (and (eq_attr "type" "imov")
2385                   (and (eq_attr "alternative" "0,1")
2386                        (and (ne (symbol_ref "TARGET_PARTIAL_REG_STALL")
2387                                 (const_int 0))
2388                             (eq (symbol_ref "TARGET_QIMODE_MATH")
2389                                 (const_int 0)))))
2390                (const_string "SI")
2391            ]
2392            (const_string "QI")))])
2393
2394 ;; Stores and loads of ax to arbitrary constant address.
2395 ;; We fake an second form of instruction to force reload to load address
2396 ;; into register when rax is not available
2397 (define_insn "*movabs<mode>_1"
2398   [(set (mem:SWI1248x (match_operand:DI 0 "x86_64_movabs_operand" "i,r"))
2399         (match_operand:SWI1248x 1 "nonmemory_operand" "a,er"))]
2400   "TARGET_64BIT && ix86_check_movabs (insn, 0)"
2401   "@
2402    movabs{<imodesuffix>}\t{%1, %P0|%P0, %1}
2403    mov{<imodesuffix>}\t{%1, %a0|%a0, %1}"
2404   [(set_attr "type" "imov")
2405    (set_attr "modrm" "0,*")
2406    (set_attr "length_address" "8,0")
2407    (set_attr "length_immediate" "0,*")
2408    (set_attr "memory" "store")
2409    (set_attr "mode" "<MODE>")])
2410
2411 (define_insn "*movabs<mode>_2"
2412   [(set (match_operand:SWI1248x 0 "register_operand" "=a,r")
2413         (mem:SWI1248x (match_operand:DI 1 "x86_64_movabs_operand" "i,r")))]
2414   "TARGET_64BIT && ix86_check_movabs (insn, 1)"
2415   "@
2416    movabs{<imodesuffix>}\t{%P1, %0|%0, %P1}
2417    mov{<imodesuffix>}\t{%a1, %0|%0, %a1}"
2418   [(set_attr "type" "imov")
2419    (set_attr "modrm" "0,*")
2420    (set_attr "length_address" "8,0")
2421    (set_attr "length_immediate" "0")
2422    (set_attr "memory" "load")
2423    (set_attr "mode" "<MODE>")])
2424
2425 (define_insn "*swap<mode>"
2426   [(set (match_operand:SWI48 0 "register_operand" "+r")
2427         (match_operand:SWI48 1 "register_operand" "+r"))
2428    (set (match_dup 1)
2429         (match_dup 0))]
2430   ""
2431   "xchg{<imodesuffix>}\t%1, %0"
2432   [(set_attr "type" "imov")
2433    (set_attr "mode" "<MODE>")
2434    (set_attr "pent_pair" "np")
2435    (set_attr "athlon_decode" "vector")
2436    (set_attr "amdfam10_decode" "double")
2437    (set_attr "bdver1_decode" "double")])
2438
2439 (define_insn "*swap<mode>_1"
2440   [(set (match_operand:SWI12 0 "register_operand" "+r")
2441         (match_operand:SWI12 1 "register_operand" "+r"))
2442    (set (match_dup 1)
2443         (match_dup 0))]
2444   "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
2445   "xchg{l}\t%k1, %k0"
2446   [(set_attr "type" "imov")
2447    (set_attr "mode" "SI")
2448    (set_attr "pent_pair" "np")
2449    (set_attr "athlon_decode" "vector")
2450    (set_attr "amdfam10_decode" "double")
2451    (set_attr "bdver1_decode" "double")])
2452
2453 ;; Not added amdfam10_decode since TARGET_PARTIAL_REG_STALL
2454 ;; is disabled for AMDFAM10
2455 (define_insn "*swap<mode>_2"
2456   [(set (match_operand:SWI12 0 "register_operand" "+<r>")
2457         (match_operand:SWI12 1 "register_operand" "+<r>"))
2458    (set (match_dup 1)
2459         (match_dup 0))]
2460   "TARGET_PARTIAL_REG_STALL"
2461   "xchg{<imodesuffix>}\t%1, %0"
2462   [(set_attr "type" "imov")
2463    (set_attr "mode" "<MODE>")
2464    (set_attr "pent_pair" "np")
2465    (set_attr "athlon_decode" "vector")])
2466
2467 (define_expand "movstrict<mode>"
2468   [(set (strict_low_part (match_operand:SWI12 0 "nonimmediate_operand" ""))
2469         (match_operand:SWI12 1 "general_operand" ""))]
2470   ""
2471 {
2472   if (TARGET_PARTIAL_REG_STALL && optimize_function_for_speed_p (cfun))
2473     FAIL;
2474   if (GET_CODE (operands[0]) == SUBREG
2475       && GET_MODE_CLASS (GET_MODE (SUBREG_REG (operands[0]))) != MODE_INT)
2476     FAIL;
2477   /* Don't generate memory->memory moves, go through a register */
2478   if (MEM_P (operands[0]) && MEM_P (operands[1]))
2479     operands[1] = force_reg (<MODE>mode, operands[1]);
2480 })
2481
2482 (define_insn "*movstrict<mode>_1"
2483   [(set (strict_low_part
2484           (match_operand:SWI12 0 "nonimmediate_operand" "+<r>m,<r>"))
2485         (match_operand:SWI12 1 "general_operand" "<r>n,m"))]
2486   "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
2487    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
2488   "mov{<imodesuffix>}\t{%1, %0|%0, %1}"
2489   [(set_attr "type" "imov")
2490    (set_attr "mode" "<MODE>")])
2491
2492 (define_insn "*movstrict<mode>_xor"
2493   [(set (strict_low_part (match_operand:SWI12 0 "register_operand" "+<r>"))
2494         (match_operand:SWI12 1 "const0_operand" ""))
2495    (clobber (reg:CC FLAGS_REG))]
2496   "reload_completed"
2497   "xor{<imodesuffix>}\t%0, %0"
2498   [(set_attr "type" "alu1")
2499    (set_attr "mode" "<MODE>")
2500    (set_attr "length_immediate" "0")])
2501
2502 (define_insn "*mov<mode>_extv_1"
2503   [(set (match_operand:SWI24 0 "register_operand" "=R")
2504         (sign_extract:SWI24 (match_operand 1 "ext_register_operand" "Q")
2505                             (const_int 8)
2506                             (const_int 8)))]
2507   ""
2508   "movs{bl|x}\t{%h1, %k0|%k0, %h1}"
2509   [(set_attr "type" "imovx")
2510    (set_attr "mode" "SI")])
2511
2512 (define_insn "*movqi_extv_1_rex64"
2513   [(set (match_operand:QI 0 "register_operand" "=Q,?R")
2514         (sign_extract:QI (match_operand 1 "ext_register_operand" "Q,Q")
2515                          (const_int 8)
2516                          (const_int 8)))]
2517   "TARGET_64BIT"
2518 {
2519   switch (get_attr_type (insn))
2520     {
2521     case TYPE_IMOVX:
2522       return "movs{bl|x}\t{%h1, %k0|%k0, %h1}";
2523     default:
2524       return "mov{b}\t{%h1, %0|%0, %h1}";
2525     }
2526 }
2527   [(set (attr "type")
2528      (if_then_else (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2529                         (ne (symbol_ref "TARGET_MOVX")
2530                             (const_int 0)))
2531         (const_string "imovx")
2532         (const_string "imov")))
2533    (set (attr "mode")
2534      (if_then_else (eq_attr "type" "imovx")
2535         (const_string "SI")
2536         (const_string "QI")))])
2537
2538 (define_insn "*movqi_extv_1"
2539   [(set (match_operand:QI 0 "nonimmediate_operand" "=Qm,?r")
2540         (sign_extract:QI (match_operand 1 "ext_register_operand" "Q,Q")
2541                          (const_int 8)
2542                          (const_int 8)))]
2543   "!TARGET_64BIT"
2544 {
2545   switch (get_attr_type (insn))
2546     {
2547     case TYPE_IMOVX:
2548       return "movs{bl|x}\t{%h1, %k0|%k0, %h1}";
2549     default:
2550       return "mov{b}\t{%h1, %0|%0, %h1}";
2551     }
2552 }
2553   [(set (attr "type")
2554      (if_then_else (and (match_operand:QI 0 "register_operand" "")
2555                         (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2556                              (ne (symbol_ref "TARGET_MOVX")
2557                                  (const_int 0))))
2558         (const_string "imovx")
2559         (const_string "imov")))
2560    (set (attr "mode")
2561      (if_then_else (eq_attr "type" "imovx")
2562         (const_string "SI")
2563         (const_string "QI")))])
2564
2565 (define_insn "*mov<mode>_extzv_1"
2566   [(set (match_operand:SWI48 0 "register_operand" "=R")
2567         (zero_extract:SWI48 (match_operand 1 "ext_register_operand" "Q")
2568                             (const_int 8)
2569                             (const_int 8)))]
2570   ""
2571   "movz{bl|x}\t{%h1, %k0|%k0, %h1}"
2572   [(set_attr "type" "imovx")
2573    (set_attr "mode" "SI")])
2574
2575 (define_insn "*movqi_extzv_2_rex64"
2576   [(set (match_operand:QI 0 "register_operand" "=Q,?R")
2577         (subreg:QI
2578           (zero_extract:SI (match_operand 1 "ext_register_operand" "Q,Q")
2579                            (const_int 8)
2580                            (const_int 8)) 0))]
2581   "TARGET_64BIT"
2582 {
2583   switch (get_attr_type (insn))
2584     {
2585     case TYPE_IMOVX:
2586       return "movz{bl|x}\t{%h1, %k0|%k0, %h1}";
2587     default:
2588       return "mov{b}\t{%h1, %0|%0, %h1}";
2589     }
2590 }
2591   [(set (attr "type")
2592      (if_then_else (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2593                         (ne (symbol_ref "TARGET_MOVX")
2594                             (const_int 0)))
2595         (const_string "imovx")
2596         (const_string "imov")))
2597    (set (attr "mode")
2598      (if_then_else (eq_attr "type" "imovx")
2599         (const_string "SI")
2600         (const_string "QI")))])
2601
2602 (define_insn "*movqi_extzv_2"
2603   [(set (match_operand:QI 0 "nonimmediate_operand" "=Qm,?R")
2604         (subreg:QI
2605           (zero_extract:SI (match_operand 1 "ext_register_operand" "Q,Q")
2606                            (const_int 8)
2607                            (const_int 8)) 0))]
2608   "!TARGET_64BIT"
2609 {
2610   switch (get_attr_type (insn))
2611     {
2612     case TYPE_IMOVX:
2613       return "movz{bl|x}\t{%h1, %k0|%k0, %h1}";
2614     default:
2615       return "mov{b}\t{%h1, %0|%0, %h1}";
2616     }
2617 }
2618   [(set (attr "type")
2619      (if_then_else (and (match_operand:QI 0 "register_operand" "")
2620                         (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2621                              (ne (symbol_ref "TARGET_MOVX")
2622                                  (const_int 0))))
2623         (const_string "imovx")
2624         (const_string "imov")))
2625    (set (attr "mode")
2626      (if_then_else (eq_attr "type" "imovx")
2627         (const_string "SI")
2628         (const_string "QI")))])
2629
2630 (define_expand "mov<mode>_insv_1"
2631   [(set (zero_extract:SWI48 (match_operand 0 "ext_register_operand" "")
2632                             (const_int 8)
2633                             (const_int 8))
2634         (match_operand:SWI48 1 "nonmemory_operand" ""))])
2635
2636 (define_insn "*mov<mode>_insv_1_rex64"
2637   [(set (zero_extract:SWI48x (match_operand 0 "ext_register_operand" "+Q")
2638                              (const_int 8)
2639                              (const_int 8))
2640         (match_operand:SWI48x 1 "nonmemory_operand" "Qn"))]
2641   "TARGET_64BIT"
2642   "mov{b}\t{%b1, %h0|%h0, %b1}"
2643   [(set_attr "type" "imov")
2644    (set_attr "mode" "QI")])
2645
2646 (define_insn "*movsi_insv_1"
2647   [(set (zero_extract:SI (match_operand 0 "ext_register_operand" "+Q")
2648                          (const_int 8)
2649                          (const_int 8))
2650         (match_operand:SI 1 "general_operand" "Qmn"))]
2651   "!TARGET_64BIT"
2652   "mov{b}\t{%b1, %h0|%h0, %b1}"
2653   [(set_attr "type" "imov")
2654    (set_attr "mode" "QI")])
2655
2656 (define_insn "*movqi_insv_2"
2657   [(set (zero_extract:SI (match_operand 0 "ext_register_operand" "+Q")
2658                          (const_int 8)
2659                          (const_int 8))
2660         (lshiftrt:SI (match_operand:SI 1 "register_operand" "Q")
2661                      (const_int 8)))]
2662   ""
2663   "mov{b}\t{%h1, %h0|%h0, %h1}"
2664   [(set_attr "type" "imov")
2665    (set_attr "mode" "QI")])
2666 \f
2667 ;; Floating point push instructions.
2668
2669 (define_insn "*pushtf"
2670   [(set (match_operand:TF 0 "push_operand" "=<,<,<")
2671         (match_operand:TF 1 "general_no_elim_operand" "x,Fo,*r"))]
2672   "TARGET_SSE2"
2673 {
2674   /* This insn should be already split before reg-stack.  */
2675   gcc_unreachable ();
2676 }
2677   [(set_attr "type" "multi")
2678    (set_attr "unit" "sse,*,*")
2679    (set_attr "mode" "TF,SI,SI")])
2680
2681 ;; %%% Kill this when call knows how to work this out.
2682 (define_split
2683   [(set (match_operand:TF 0 "push_operand" "")
2684         (match_operand:TF 1 "sse_reg_operand" ""))]
2685   "TARGET_SSE2 && reload_completed"
2686   [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -16)))
2687    (set (mem:TF (reg:P SP_REG)) (match_dup 1))])
2688
2689 (define_insn "*pushxf"
2690   [(set (match_operand:XF 0 "push_operand" "=<,<")
2691         (match_operand:XF 1 "general_no_elim_operand" "f,ro"))]
2692   "optimize_function_for_speed_p (cfun)"
2693 {
2694   /* This insn should be already split before reg-stack.  */
2695   gcc_unreachable ();
2696 }
2697   [(set_attr "type" "multi")
2698    (set_attr "unit" "i387,*")
2699    (set_attr "mode" "XF,SI")])
2700
2701 ;; Size of pushxf is 3 (for sub) + 2 (for fstp) + memory operand size.
2702 ;; Size of pushxf using integer instructions is 3+3*memory operand size
2703 ;; Pushing using integer instructions is longer except for constants
2704 ;; and direct memory references (assuming that any given constant is pushed
2705 ;; only once, but this ought to be handled elsewhere).
2706
2707 (define_insn "*pushxf_nointeger"
2708   [(set (match_operand:XF 0 "push_operand" "=<,<")
2709         (match_operand:XF 1 "general_no_elim_operand" "f,*rFo"))]
2710   "optimize_function_for_size_p (cfun)"
2711 {
2712   /* This insn should be already split before reg-stack.  */
2713   gcc_unreachable ();
2714 }
2715   [(set_attr "type" "multi")
2716    (set_attr "unit" "i387,*")
2717    (set_attr "mode" "XF,SI")])
2718
2719 ;; %%% Kill this when call knows how to work this out.
2720 (define_split
2721   [(set (match_operand:XF 0 "push_operand" "")
2722         (match_operand:XF 1 "fp_register_operand" ""))]
2723   "reload_completed"
2724   [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
2725    (set (mem:XF (reg:P SP_REG)) (match_dup 1))]
2726   "operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));")
2727
2728 (define_insn "*pushdf_rex64"
2729   [(set (match_operand:DF 0 "push_operand" "=<,<,<")
2730         (match_operand:DF 1 "general_no_elim_operand" "f,Yd*rFm,Y2"))]
2731   "TARGET_64BIT"
2732 {
2733   /* This insn should be already split before reg-stack.  */
2734   gcc_unreachable ();
2735 }
2736   [(set_attr "type" "multi")
2737    (set_attr "unit" "i387,*,*")
2738    (set_attr "mode" "DF,DI,DF")])
2739
2740 ;; Size of pushdf is 3 (for sub) + 2 (for fstp) + memory operand size.
2741 ;; Size of pushdf using integer instructions is 2+2*memory operand size
2742 ;; On the average, pushdf using integers can be still shorter.
2743
2744 (define_insn "*pushdf"
2745   [(set (match_operand:DF 0 "push_operand" "=<,<,<")
2746         (match_operand:DF 1 "general_no_elim_operand" "f,Yd*rFo,Y2"))]
2747   "!TARGET_64BIT"
2748 {
2749   /* This insn should be already split before reg-stack.  */
2750   gcc_unreachable ();
2751 }
2752   [(set_attr "type" "multi")
2753    (set_attr "unit" "i387,*,*")
2754    (set_attr "mode" "DF,DI,DF")])
2755
2756 ;; %%% Kill this when call knows how to work this out.
2757 (define_split
2758   [(set (match_operand:DF 0 "push_operand" "")
2759         (match_operand:DF 1 "any_fp_register_operand" ""))]
2760   "reload_completed"
2761   [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -8)))
2762    (set (mem:DF (reg:P SP_REG)) (match_dup 1))])
2763
2764 (define_insn "*pushsf_rex64"
2765   [(set (match_operand:SF 0 "push_operand" "=X,X,X")
2766         (match_operand:SF 1 "nonmemory_no_elim_operand" "f,rF,x"))]
2767   "TARGET_64BIT"
2768 {
2769   /* Anything else should be already split before reg-stack.  */
2770   gcc_assert (which_alternative == 1);
2771   return "push{q}\t%q1";
2772 }
2773   [(set_attr "type" "multi,push,multi")
2774    (set_attr "unit" "i387,*,*")
2775    (set_attr "mode" "SF,DI,SF")])
2776
2777 (define_insn "*pushsf"
2778   [(set (match_operand:SF 0 "push_operand" "=<,<,<")
2779         (match_operand:SF 1 "general_no_elim_operand" "f,rFm,x"))]
2780   "!TARGET_64BIT"
2781 {
2782   /* Anything else should be already split before reg-stack.  */
2783   gcc_assert (which_alternative == 1);
2784   return "push{l}\t%1";
2785 }
2786   [(set_attr "type" "multi,push,multi")
2787    (set_attr "unit" "i387,*,*")
2788    (set_attr "mode" "SF,SI,SF")])
2789
2790 ;; %%% Kill this when call knows how to work this out.
2791 (define_split
2792   [(set (match_operand:SF 0 "push_operand" "")
2793         (match_operand:SF 1 "any_fp_register_operand" ""))]
2794   "reload_completed"
2795   [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
2796    (set (mem:SF (reg:P SP_REG)) (match_dup 1))]
2797   "operands[2] = GEN_INT (-GET_MODE_SIZE (<P:MODE>mode));")
2798
2799 (define_split
2800   [(set (match_operand:SF 0 "push_operand" "")
2801         (match_operand:SF 1 "memory_operand" ""))]
2802   "reload_completed
2803    && (operands[2] = find_constant_src (insn))"
2804   [(set (match_dup 0) (match_dup 2))])
2805
2806 (define_split
2807   [(set (match_operand 0 "push_operand" "")
2808         (match_operand 1 "general_operand" ""))]
2809   "reload_completed
2810    && (GET_MODE (operands[0]) == TFmode
2811        || GET_MODE (operands[0]) == XFmode
2812        || GET_MODE (operands[0]) == DFmode)
2813    && !ANY_FP_REG_P (operands[1])"
2814   [(const_int 0)]
2815   "ix86_split_long_move (operands); DONE;")
2816 \f
2817 ;; Floating point move instructions.
2818
2819 (define_expand "movtf"
2820   [(set (match_operand:TF 0 "nonimmediate_operand" "")
2821         (match_operand:TF 1 "nonimmediate_operand" ""))]
2822   "TARGET_SSE2"
2823 {
2824   ix86_expand_move (TFmode, operands);
2825   DONE;
2826 })
2827
2828 (define_expand "mov<mode>"
2829   [(set (match_operand:X87MODEF 0 "nonimmediate_operand" "")
2830         (match_operand:X87MODEF 1 "general_operand" ""))]
2831   ""
2832   "ix86_expand_move (<MODE>mode, operands); DONE;")
2833
2834 (define_insn "*movtf_internal"
2835   [(set (match_operand:TF 0 "nonimmediate_operand" "=x,m,x,?*r ,!o")
2836         (match_operand:TF 1 "general_operand"      "xm,x,C,*roF,F*r"))]
2837   "TARGET_SSE2
2838    && !(MEM_P (operands[0]) && MEM_P (operands[1]))
2839    && (!can_create_pseudo_p ()
2840        || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
2841        || GET_CODE (operands[1]) != CONST_DOUBLE
2842        || (optimize_function_for_size_p (cfun)
2843            && standard_sse_constant_p (operands[1])
2844            && !memory_operand (operands[0], TFmode))
2845        || (!TARGET_MEMORY_MISMATCH_STALL
2846            && memory_operand (operands[0], TFmode)))"
2847 {
2848   switch (which_alternative)
2849     {
2850     case 0:
2851     case 1:
2852       /* Handle misaligned load/store since we
2853          don't have movmisaligntf pattern. */
2854       if (misaligned_operand (operands[0], TFmode)
2855           || misaligned_operand (operands[1], TFmode))
2856         {
2857           if (get_attr_mode (insn) == MODE_V4SF)
2858             return "%vmovups\t{%1, %0|%0, %1}";
2859           else
2860             return "%vmovdqu\t{%1, %0|%0, %1}";
2861         }
2862       else
2863         {
2864           if (get_attr_mode (insn) == MODE_V4SF)
2865             return "%vmovaps\t{%1, %0|%0, %1}";
2866           else
2867             return "%vmovdqa\t{%1, %0|%0, %1}";
2868         }
2869
2870     case 2:
2871       return standard_sse_constant_opcode (insn, operands[1]);
2872
2873     case 3:
2874     case 4:
2875         return "#";
2876
2877     default:
2878       gcc_unreachable ();
2879     }
2880 }
2881   [(set_attr "type" "ssemov,ssemov,sselog1,*,*")
2882    (set_attr "prefix" "maybe_vex,maybe_vex,maybe_vex,*,*")
2883    (set (attr "mode")
2884         (cond [(eq_attr "alternative" "0,2")
2885                  (if_then_else
2886                    (ne (symbol_ref "optimize_function_for_size_p (cfun)")
2887                        (const_int 0))
2888                    (const_string "V4SF")
2889                    (const_string "TI"))
2890                (eq_attr "alternative" "1")
2891                  (if_then_else
2892                    (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
2893                             (const_int 0))
2894                         (ne (symbol_ref "optimize_function_for_size_p (cfun)")
2895                             (const_int 0)))
2896                    (const_string "V4SF")
2897                    (const_string "TI"))]
2898                (const_string "DI")))])
2899
2900 ;; Possible store forwarding (partial memory) stall in alternative 4.
2901 (define_insn "*movxf_internal"
2902   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,?Yx*r ,!o")
2903         (match_operand:XF 1 "general_operand"      "fm,f,G,Yx*roF,FYx*r"))]
2904   "!(MEM_P (operands[0]) && MEM_P (operands[1]))
2905    && (!can_create_pseudo_p ()
2906        || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
2907        || GET_CODE (operands[1]) != CONST_DOUBLE
2908        || (optimize_function_for_size_p (cfun)
2909            && standard_80387_constant_p (operands[1]) > 0
2910            && !memory_operand (operands[0], XFmode))
2911        || (!TARGET_MEMORY_MISMATCH_STALL
2912            && memory_operand (operands[0], XFmode)))"
2913 {
2914   switch (which_alternative)
2915     {
2916     case 0:
2917     case 1:
2918       return output_387_reg_move (insn, operands);
2919
2920     case 2:
2921       return standard_80387_constant_opcode (operands[1]);
2922
2923     case 3:
2924     case 4:
2925       return "#";
2926
2927     default:
2928       gcc_unreachable ();
2929     }
2930 }
2931   [(set_attr "type" "fmov,fmov,fmov,multi,multi")
2932    (set_attr "mode" "XF,XF,XF,SI,SI")])
2933
2934 (define_insn "*movdf_internal_rex64"
2935   [(set (match_operand:DF 0 "nonimmediate_operand"
2936                 "=f,m,f,?r,?m,?r,!o,Y2*x,Y2*x,Y2*x,m   ,Yi,r ")
2937         (match_operand:DF 1 "general_operand"
2938                 "fm,f,G,rm,r ,F ,F ,C   ,Y2*x,m   ,Y2*x,r ,Yi"))]
2939   "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))
2940    && (!can_create_pseudo_p ()
2941        || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
2942        || GET_CODE (operands[1]) != CONST_DOUBLE
2943        || (optimize_function_for_size_p (cfun)
2944            && ((!(TARGET_SSE2 && TARGET_SSE_MATH)
2945                 && standard_80387_constant_p (operands[1]) > 0)
2946                || (TARGET_SSE2 && TARGET_SSE_MATH
2947                    && standard_sse_constant_p (operands[1]))))
2948        || memory_operand (operands[0], DFmode))"
2949 {
2950   switch (which_alternative)
2951     {
2952     case 0:
2953     case 1:
2954       return output_387_reg_move (insn, operands);
2955
2956     case 2:
2957       return standard_80387_constant_opcode (operands[1]);
2958
2959     case 3:
2960     case 4:
2961       return "mov{q}\t{%1, %0|%0, %1}";
2962
2963     case 5:
2964       return "movabs{q}\t{%1, %0|%0, %1}";
2965
2966     case 6:
2967       return "#";
2968
2969     case 7:
2970       return standard_sse_constant_opcode (insn, operands[1]);
2971
2972     case 8:
2973     case 9:
2974     case 10:
2975       switch (get_attr_mode (insn))
2976         {
2977         case MODE_V2DF:
2978           if (!TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
2979             return "%vmovapd\t{%1, %0|%0, %1}";
2980         case MODE_V4SF:
2981           return "%vmovaps\t{%1, %0|%0, %1}";
2982
2983         case MODE_DI:
2984           return "%vmovq\t{%1, %0|%0, %1}";
2985         case MODE_DF:
2986           if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
2987             return "vmovsd\t{%1, %0, %0|%0, %0, %1}";
2988           return "%vmovsd\t{%1, %0|%0, %1}";
2989         case MODE_V1DF:
2990           return "%vmovlpd\t{%1, %d0|%d0, %1}";
2991         case MODE_V2SF:
2992           return "%vmovlps\t{%1, %d0|%d0, %1}";
2993         default:
2994           gcc_unreachable ();
2995         }
2996
2997     case 11:
2998     case 12:
2999       /* Handle broken assemblers that require movd instead of movq.  */
3000       return "%vmovd\t{%1, %0|%0, %1}";
3001
3002     default:
3003       gcc_unreachable();
3004     }
3005 }
3006   [(set_attr "type" "fmov,fmov,fmov,imov,imov,imov,multi,sselog1,ssemov,ssemov,ssemov,ssemov,ssemov")
3007    (set (attr "modrm")
3008      (if_then_else
3009        (and (eq_attr "alternative" "5") (eq_attr "type" "imov"))
3010          (const_string "0")
3011          (const_string "*")))
3012    (set (attr "length_immediate")
3013      (if_then_else
3014        (and (eq_attr "alternative" "5") (eq_attr "type" "imov"))
3015          (const_string "8")
3016          (const_string "*")))
3017    (set (attr "prefix")
3018      (if_then_else (eq_attr "alternative" "0,1,2,3,4,5,6")
3019        (const_string "orig")
3020        (const_string "maybe_vex")))
3021    (set (attr "prefix_data16")
3022      (if_then_else (eq_attr "mode" "V1DF")
3023        (const_string "1")
3024        (const_string "*")))
3025    (set (attr "mode")
3026         (cond [(eq_attr "alternative" "0,1,2")
3027                  (const_string "DF")
3028                (eq_attr "alternative" "3,4,5,6,11,12")
3029                  (const_string "DI")
3030
3031                /* xorps is one byte shorter.  */
3032                (eq_attr "alternative" "7")
3033                  (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3034                             (const_int 0))
3035                           (const_string "V4SF")
3036                         (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
3037                             (const_int 0))
3038                           (const_string "TI")
3039                        ]
3040                        (const_string "V2DF"))
3041
3042                /* For architectures resolving dependencies on
3043                   whole SSE registers use APD move to break dependency
3044                   chains, otherwise use short move to avoid extra work.
3045
3046                   movaps encodes one byte shorter.  */
3047                (eq_attr "alternative" "8")
3048                  (cond
3049                    [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3050                         (const_int 0))
3051                       (const_string "V4SF")
3052                     (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
3053                         (const_int 0))
3054                       (const_string "V2DF")
3055                    ]
3056                    (const_string "DF"))
3057                /* For architectures resolving dependencies on register
3058                   parts we may avoid extra work to zero out upper part
3059                   of register.  */
3060                (eq_attr "alternative" "9")
3061                  (if_then_else
3062                    (ne (symbol_ref "TARGET_SSE_SPLIT_REGS")
3063                        (const_int 0))
3064                    (const_string "V1DF")
3065                    (const_string "DF"))
3066               ]
3067               (const_string "DF")))])
3068
3069 ;; Possible store forwarding (partial memory) stall in alternative 4.
3070 (define_insn "*movdf_internal"
3071   [(set (match_operand:DF 0 "nonimmediate_operand"
3072                 "=f,m,f,?Yd*r ,!o   ,Y2*x,Y2*x,Y2*x,m  ")
3073         (match_operand:DF 1 "general_operand"
3074                 "fm,f,G,Yd*roF,FYd*r,C   ,Y2*x,m   ,Y2*x"))]
3075   "!TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))
3076    && (!can_create_pseudo_p ()
3077        || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
3078        || GET_CODE (operands[1]) != CONST_DOUBLE
3079        || (optimize_function_for_size_p (cfun)
3080            && ((!(TARGET_SSE2 && TARGET_SSE_MATH)
3081                 && standard_80387_constant_p (operands[1]) > 0)
3082                || (TARGET_SSE2 && TARGET_SSE_MATH
3083                    && standard_sse_constant_p (operands[1])))
3084            && !memory_operand (operands[0], DFmode))
3085        || (!TARGET_MEMORY_MISMATCH_STALL
3086            && memory_operand (operands[0], DFmode)))"
3087 {
3088   switch (which_alternative)
3089     {
3090     case 0:
3091     case 1:
3092       return output_387_reg_move (insn, operands);
3093
3094     case 2:
3095       return standard_80387_constant_opcode (operands[1]);
3096
3097     case 3:
3098     case 4:
3099       return "#";
3100
3101     case 5:
3102       return standard_sse_constant_opcode (insn, operands[1]);
3103
3104     case 6:
3105     case 7:
3106     case 8:
3107       switch (get_attr_mode (insn))
3108         {
3109         case MODE_V2DF:
3110           if (!TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
3111             return "%vmovapd\t{%1, %0|%0, %1}";
3112         case MODE_V4SF:
3113           return "%vmovaps\t{%1, %0|%0, %1}";
3114
3115         case MODE_DI:
3116           return "%vmovq\t{%1, %0|%0, %1}";
3117         case MODE_DF:
3118           if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
3119             return "vmovsd\t{%1, %0, %0|%0, %0, %1}";
3120           return "%vmovsd\t{%1, %0|%0, %1}";
3121         case MODE_V1DF:
3122           return "%vmovlpd\t{%1, %d0|%d0, %1}";
3123         case MODE_V2SF:
3124           return "%vmovlps\t{%1, %d0|%d0, %1}";
3125         default:
3126           gcc_unreachable ();
3127         }
3128
3129     default:
3130       gcc_unreachable ();
3131     }
3132 }
3133   [(set_attr "type" "fmov,fmov,fmov,multi,multi,sselog1,ssemov,ssemov,ssemov")
3134    (set (attr "prefix")
3135      (if_then_else (eq_attr "alternative" "0,1,2,3,4")
3136        (const_string "orig")
3137        (const_string "maybe_vex")))
3138    (set (attr "prefix_data16")
3139      (if_then_else (eq_attr "mode" "V1DF")
3140        (const_string "1")
3141        (const_string "*")))
3142    (set (attr "mode")
3143         (cond [(eq_attr "alternative" "0,1,2")
3144                  (const_string "DF")
3145                (eq_attr "alternative" "3,4")
3146                  (const_string "SI")
3147
3148                /* For SSE1, we have many fewer alternatives.  */
3149                (eq (symbol_ref "TARGET_SSE2") (const_int 0))
3150                  (if_then_else
3151                    (eq_attr "alternative" "5,6")
3152                    (const_string "V4SF")
3153                    (const_string "V2SF"))
3154
3155                /* xorps is one byte shorter.  */
3156                (eq_attr "alternative" "5")
3157                  (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3158                             (const_int 0))
3159                           (const_string "V4SF")
3160                         (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
3161                             (const_int 0))
3162                           (const_string "TI")
3163                        ]
3164                        (const_string "V2DF"))
3165
3166                /* For architectures resolving dependencies on
3167                   whole SSE registers use APD move to break dependency
3168                   chains, otherwise use short move to avoid extra work.
3169
3170                   movaps encodes one byte shorter.  */
3171                (eq_attr "alternative" "6")
3172                  (cond
3173                    [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3174                         (const_int 0))
3175                       (const_string "V4SF")
3176                     (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
3177                         (const_int 0))
3178                       (const_string "V2DF")
3179                    ]
3180                    (const_string "DF"))
3181                /* For architectures resolving dependencies on register
3182                   parts we may avoid extra work to zero out upper part
3183                   of register.  */
3184                (eq_attr "alternative" "7")
3185                  (if_then_else
3186                    (ne (symbol_ref "TARGET_SSE_SPLIT_REGS")
3187                        (const_int 0))
3188                    (const_string "V1DF")
3189                    (const_string "DF"))
3190               ]
3191               (const_string "DF")))])
3192
3193 (define_insn "*movsf_internal"
3194   [(set (match_operand:SF 0 "nonimmediate_operand"
3195           "=f,m,f,?r ,?m,x,x,x,m,!*y,!m,!*y,?Yi,?r,!*Ym,!r")
3196         (match_operand:SF 1 "general_operand"
3197           "fm,f,G,rmF,Fr,C,x,m,x,m  ,*y,*y ,r  ,Yi,r   ,*Ym"))]
3198   "!(MEM_P (operands[0]) && MEM_P (operands[1]))
3199    && (!can_create_pseudo_p ()
3200        || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
3201        || GET_CODE (operands[1]) != CONST_DOUBLE
3202        || (optimize_function_for_size_p (cfun)
3203            && ((!TARGET_SSE_MATH
3204                 && standard_80387_constant_p (operands[1]) > 0)
3205                || (TARGET_SSE_MATH
3206                    && standard_sse_constant_p (operands[1]))))
3207        || memory_operand (operands[0], SFmode))"
3208 {
3209   switch (which_alternative)
3210     {
3211     case 0:
3212     case 1:
3213       return output_387_reg_move (insn, operands);
3214
3215     case 2:
3216       return standard_80387_constant_opcode (operands[1]);
3217
3218     case 3:
3219     case 4:
3220       return "mov{l}\t{%1, %0|%0, %1}";
3221
3222     case 5:
3223       return standard_sse_constant_opcode (insn, operands[1]);
3224
3225     case 6:
3226       if (get_attr_mode (insn) == MODE_V4SF)
3227         return "%vmovaps\t{%1, %0|%0, %1}";
3228       if (TARGET_AVX)
3229         return "vmovss\t{%1, %0, %0|%0, %0, %1}";
3230
3231     case 7:
3232     case 8:
3233       return "%vmovss\t{%1, %0|%0, %1}";
3234
3235     case 9:
3236     case 10:
3237     case 14:
3238     case 15:
3239       return "movd\t{%1, %0|%0, %1}";
3240
3241     case 11:
3242       return "movq\t{%1, %0|%0, %1}";
3243
3244     case 12:
3245     case 13:
3246       return "%vmovd\t{%1, %0|%0, %1}";
3247
3248     default:
3249       gcc_unreachable ();
3250     }
3251 }
3252   [(set_attr "type" "fmov,fmov,fmov,imov,imov,sselog1,ssemov,ssemov,ssemov,mmxmov,mmxmov,mmxmov,ssemov,ssemov,mmxmov,mmxmov")
3253    (set (attr "prefix")
3254      (if_then_else (eq_attr "alternative" "5,6,7,8,12,13")
3255        (const_string "maybe_vex")
3256        (const_string "orig")))
3257    (set (attr "mode")
3258         (cond [(eq_attr "alternative" "3,4,9,10")
3259                  (const_string "SI")
3260                (eq_attr "alternative" "5")
3261                  (if_then_else
3262                    (and (and (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
3263                                  (const_int 0))
3264                              (ne (symbol_ref "TARGET_SSE2")
3265                                  (const_int 0)))
3266                         (eq (symbol_ref "optimize_function_for_size_p (cfun)")
3267                             (const_int 0)))
3268                    (const_string "TI")
3269                    (const_string "V4SF"))
3270                /* For architectures resolving dependencies on
3271                   whole SSE registers use APS move to break dependency
3272                   chains, otherwise use short move to avoid extra work.
3273
3274                   Do the same for architectures resolving dependencies on
3275                   the parts.  While in DF mode it is better to always handle
3276                   just register parts, the SF mode is different due to lack
3277                   of instructions to load just part of the register.  It is
3278                   better to maintain the whole registers in single format
3279                   to avoid problems on using packed logical operations.  */
3280                (eq_attr "alternative" "6")
3281                  (if_then_else
3282                    (ior (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
3283                             (const_int 0))
3284                         (ne (symbol_ref "TARGET_SSE_SPLIT_REGS")
3285                             (const_int 0)))
3286                    (const_string "V4SF")
3287                    (const_string "SF"))
3288                (eq_attr "alternative" "11")
3289                  (const_string "DI")]
3290                (const_string "SF")))])
3291
3292 (define_split
3293   [(set (match_operand 0 "any_fp_register_operand" "")
3294         (match_operand 1 "memory_operand" ""))]
3295   "reload_completed
3296    && (GET_MODE (operands[0]) == TFmode
3297        || GET_MODE (operands[0]) == XFmode
3298        || GET_MODE (operands[0]) == DFmode
3299        || GET_MODE (operands[0]) == SFmode)
3300    && (operands[2] = find_constant_src (insn))"
3301   [(set (match_dup 0) (match_dup 2))]
3302 {
3303   rtx c = operands[2];
3304   int r = REGNO (operands[0]);
3305
3306   if ((SSE_REGNO_P (r) && !standard_sse_constant_p (c))
3307       || (FP_REGNO_P (r) && standard_80387_constant_p (c) < 1))
3308     FAIL;
3309 })
3310
3311 (define_split
3312   [(set (match_operand 0 "any_fp_register_operand" "")
3313         (float_extend (match_operand 1 "memory_operand" "")))]
3314   "reload_completed
3315    && (GET_MODE (operands[0]) == TFmode
3316        || GET_MODE (operands[0]) == XFmode
3317        || GET_MODE (operands[0]) == DFmode)
3318    && (operands[2] = find_constant_src (insn))"
3319   [(set (match_dup 0) (match_dup 2))]
3320 {
3321   rtx c = operands[2];
3322   int r = REGNO (operands[0]);
3323
3324   if ((SSE_REGNO_P (r) && !standard_sse_constant_p (c))
3325       || (FP_REGNO_P (r) && standard_80387_constant_p (c) < 1))
3326     FAIL;
3327 })
3328
3329 ;; Split the load of -0.0 or -1.0 into fldz;fchs or fld1;fchs sequence
3330 (define_split
3331   [(set (match_operand:X87MODEF 0 "fp_register_operand" "")
3332         (match_operand:X87MODEF 1 "immediate_operand" ""))]
3333   "reload_completed
3334    && (standard_80387_constant_p (operands[1]) == 8
3335        || standard_80387_constant_p (operands[1]) == 9)"
3336   [(set (match_dup 0)(match_dup 1))
3337    (set (match_dup 0)
3338         (neg:X87MODEF (match_dup 0)))]
3339 {
3340   REAL_VALUE_TYPE r;
3341
3342   REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
3343   if (real_isnegzero (&r))
3344     operands[1] = CONST0_RTX (<MODE>mode);
3345   else
3346     operands[1] = CONST1_RTX (<MODE>mode);
3347 })
3348
3349 (define_split
3350   [(set (match_operand 0 "nonimmediate_operand" "")
3351         (match_operand 1 "general_operand" ""))]
3352   "reload_completed
3353    && (GET_MODE (operands[0]) == TFmode
3354        || GET_MODE (operands[0]) == XFmode
3355        || GET_MODE (operands[0]) == DFmode)
3356    && !(ANY_FP_REG_P (operands[0]) || ANY_FP_REG_P (operands[1]))"
3357   [(const_int 0)]
3358   "ix86_split_long_move (operands); DONE;")
3359
3360 (define_insn "swapxf"
3361   [(set (match_operand:XF 0 "register_operand" "+f")
3362         (match_operand:XF 1 "register_operand" "+f"))
3363    (set (match_dup 1)
3364         (match_dup 0))]
3365   "TARGET_80387"
3366 {
3367   if (STACK_TOP_P (operands[0]))
3368     return "fxch\t%1";
3369   else
3370     return "fxch\t%0";
3371 }
3372   [(set_attr "type" "fxch")
3373    (set_attr "mode" "XF")])
3374
3375 (define_insn "*swap<mode>"
3376   [(set (match_operand:MODEF 0 "fp_register_operand" "+f")
3377         (match_operand:MODEF 1 "fp_register_operand" "+f"))
3378    (set (match_dup 1)
3379         (match_dup 0))]
3380   "TARGET_80387 || reload_completed"
3381 {
3382   if (STACK_TOP_P (operands[0]))
3383     return "fxch\t%1";
3384   else
3385     return "fxch\t%0";
3386 }
3387   [(set_attr "type" "fxch")
3388    (set_attr "mode" "<MODE>")])
3389 \f
3390 ;; Zero extension instructions
3391
3392 (define_expand "zero_extendsidi2"
3393   [(set (match_operand:DI 0 "nonimmediate_operand" "")
3394         (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
3395   ""
3396 {
3397   if (!TARGET_64BIT)
3398     {
3399       emit_insn (gen_zero_extendsidi2_1 (operands[0], operands[1]));
3400       DONE;
3401     }
3402 })
3403
3404 (define_insn "*zero_extendsidi2_rex64"
3405   [(set (match_operand:DI 0 "nonimmediate_operand"  "=r,o,?*Ym,?*y,?*Yi,*Y2")
3406         (zero_extend:DI
3407          (match_operand:SI 1 "nonimmediate_operand" "rm,0,r   ,m  ,r   ,m")))]
3408   "TARGET_64BIT"
3409   "@
3410    mov\t{%k1, %k0|%k0, %k1}
3411    #
3412    movd\t{%1, %0|%0, %1}
3413    movd\t{%1, %0|%0, %1}
3414    %vmovd\t{%1, %0|%0, %1}
3415    %vmovd\t{%1, %0|%0, %1}"
3416   [(set_attr "type" "imovx,imov,mmxmov,mmxmov,ssemov,ssemov")
3417    (set_attr "prefix" "orig,*,orig,orig,maybe_vex,maybe_vex")
3418    (set_attr "prefix_0f" "0,*,*,*,*,*")
3419    (set_attr "mode" "SI,DI,DI,DI,TI,TI")])
3420
3421 (define_split
3422   [(set (match_operand:DI 0 "memory_operand" "")
3423         (zero_extend:DI (match_dup 0)))]
3424   "TARGET_64BIT"
3425   [(set (match_dup 4) (const_int 0))]
3426   "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3427
3428 ;; %%% Kill me once multi-word ops are sane.
3429 (define_insn "zero_extendsidi2_1"
3430   [(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?o,?*Ym,?*y,?*Yi,*Y2")
3431         (zero_extend:DI
3432          (match_operand:SI 1 "nonimmediate_operand" "0,rm,r ,r   ,m  ,r   ,m")))
3433    (clobber (reg:CC FLAGS_REG))]
3434   "!TARGET_64BIT"
3435   "@
3436    #
3437    #
3438    #
3439    movd\t{%1, %0|%0, %1}
3440    movd\t{%1, %0|%0, %1}
3441    %vmovd\t{%1, %0|%0, %1}
3442    %vmovd\t{%1, %0|%0, %1}"
3443   [(set_attr "type" "multi,multi,multi,mmxmov,mmxmov,ssemov,ssemov")
3444    (set_attr "prefix" "*,*,*,orig,orig,maybe_vex,maybe_vex")
3445    (set_attr "mode" "SI,SI,SI,DI,DI,TI,TI")])
3446
3447 (define_split
3448   [(set (match_operand:DI 0 "register_operand" "")
3449         (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
3450    (clobber (reg:CC FLAGS_REG))]
3451   "!TARGET_64BIT && reload_completed
3452    && true_regnum (operands[0]) == true_regnum (operands[1])"
3453   [(set (match_dup 4) (const_int 0))]
3454   "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3455
3456 (define_split
3457   [(set (match_operand:DI 0 "nonimmediate_operand" "")
3458         (zero_extend:DI (match_operand:SI 1 "general_operand" "")))
3459    (clobber (reg:CC FLAGS_REG))]
3460   "!TARGET_64BIT && reload_completed
3461    && !(MMX_REG_P (operands[0]) || SSE_REG_P (operands[0]))"
3462   [(set (match_dup 3) (match_dup 1))
3463    (set (match_dup 4) (const_int 0))]
3464   "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3465
3466 (define_insn "zero_extend<mode>di2"
3467   [(set (match_operand:DI 0 "register_operand" "=r")
3468         (zero_extend:DI
3469          (match_operand:SWI12 1 "nonimmediate_operand" "<r>m")))]
3470   "TARGET_64BIT"
3471   "movz{<imodesuffix>l|x}\t{%1, %k0|%k0, %1}"
3472   [(set_attr "type" "imovx")
3473    (set_attr "mode" "SI")])
3474
3475 (define_expand "zero_extendhisi2"
3476   [(set (match_operand:SI 0 "register_operand" "")
3477         (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
3478   ""
3479 {
3480   if (TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
3481     {
3482       operands[1] = force_reg (HImode, operands[1]);
3483       emit_insn (gen_zero_extendhisi2_and (operands[0], operands[1]));
3484       DONE;
3485     }
3486 })
3487
3488 (define_insn_and_split "zero_extendhisi2_and"
3489   [(set (match_operand:SI 0 "register_operand" "=r")
3490         (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))
3491    (clobber (reg:CC FLAGS_REG))]
3492   "TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)"
3493   "#"
3494   "&& reload_completed"
3495   [(parallel [(set (match_dup 0) (and:SI (match_dup 0) (const_int 65535)))
3496               (clobber (reg:CC FLAGS_REG))])]
3497   ""
3498   [(set_attr "type" "alu1")
3499    (set_attr "mode" "SI")])
3500
3501 (define_insn "*zero_extendhisi2_movzwl"
3502   [(set (match_operand:SI 0 "register_operand" "=r")
3503         (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
3504   "!TARGET_ZERO_EXTEND_WITH_AND
3505    || optimize_function_for_size_p (cfun)"
3506   "movz{wl|x}\t{%1, %0|%0, %1}"
3507   [(set_attr "type" "imovx")
3508    (set_attr "mode" "SI")])
3509
3510 (define_expand "zero_extendqi<mode>2"
3511   [(parallel
3512     [(set (match_operand:SWI24 0 "register_operand" "")
3513           (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "")))
3514      (clobber (reg:CC FLAGS_REG))])])
3515
3516 (define_insn "*zero_extendqi<mode>2_and"
3517   [(set (match_operand:SWI24 0 "register_operand" "=r,?&q")
3518         (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "0,qm")))
3519    (clobber (reg:CC FLAGS_REG))]
3520   "TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)"
3521   "#"
3522   [(set_attr "type" "alu1")
3523    (set_attr "mode" "<MODE>")])
3524
3525 ;; When source and destination does not overlap, clear destination
3526 ;; first and then do the movb
3527 (define_split
3528   [(set (match_operand:SWI24 0 "register_operand" "")
3529         (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "")))
3530    (clobber (reg:CC FLAGS_REG))]
3531   "reload_completed
3532    && (TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
3533    && ANY_QI_REG_P (operands[0])
3534    && (ANY_QI_REG_P (operands[1]) || MEM_P (operands[1]))
3535    && !reg_overlap_mentioned_p (operands[0], operands[1])"
3536   [(set (strict_low_part (match_dup 2)) (match_dup 1))]
3537 {
3538   operands[2] = gen_lowpart (QImode, operands[0]);
3539   ix86_expand_clear (operands[0]);
3540 })
3541
3542 (define_insn "*zero_extendqi<mode>2_movzbl_and"
3543   [(set (match_operand:SWI24 0 "register_operand" "=r,r")
3544         (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "qm,0")))
3545    (clobber (reg:CC FLAGS_REG))]
3546   "!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun)"
3547   "#"
3548   [(set_attr "type" "imovx,alu1")
3549    (set_attr "mode" "<MODE>")])
3550
3551 ;; For the movzbl case strip only the clobber
3552 (define_split
3553   [(set (match_operand:SWI24 0 "register_operand" "")
3554         (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "")))
3555    (clobber (reg:CC FLAGS_REG))]
3556   "reload_completed
3557    && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))
3558    && (!REG_P (operands[1]) || ANY_QI_REG_P (operands[1]))"
3559   [(set (match_dup 0)
3560         (zero_extend:SWI24 (match_dup 1)))])
3561
3562 ; zero extend to SImode to avoid partial register stalls
3563 (define_insn "*zero_extendqi<mode>2_movzbl"
3564   [(set (match_operand:SWI24 0 "register_operand" "=r")
3565         (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "qm")))]
3566   "reload_completed
3567    && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))"
3568   "movz{bl|x}\t{%1, %k0|%k0, %1}"
3569   [(set_attr "type" "imovx")
3570    (set_attr "mode" "SI")])
3571
3572 ;; Rest is handled by single and.
3573 (define_split
3574   [(set (match_operand:SWI24 0 "register_operand" "")
3575         (zero_extend:SWI24 (match_operand:QI 1 "register_operand" "")))
3576    (clobber (reg:CC FLAGS_REG))]
3577   "reload_completed
3578    && true_regnum (operands[0]) == true_regnum (operands[1])"
3579   [(parallel [(set (match_dup 0) (and:SWI24 (match_dup 0) (const_int 255)))
3580               (clobber (reg:CC FLAGS_REG))])])
3581 \f
3582 ;; Sign extension instructions
3583
3584 (define_expand "extendsidi2"
3585   [(set (match_operand:DI 0 "register_operand" "")
3586         (sign_extend:DI (match_operand:SI 1 "register_operand" "")))]
3587   ""
3588 {
3589   if (!TARGET_64BIT)
3590     {
3591       emit_insn (gen_extendsidi2_1 (operands[0], operands[1]));
3592       DONE;
3593     }
3594 })
3595
3596 (define_insn "*extendsidi2_rex64"
3597   [(set (match_operand:DI 0 "register_operand" "=*a,r")
3598         (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "*0,rm")))]
3599   "TARGET_64BIT"
3600   "@
3601    {cltq|cdqe}
3602    movs{lq|x}\t{%1, %0|%0, %1}"
3603   [(set_attr "type" "imovx")
3604    (set_attr "mode" "DI")
3605    (set_attr "prefix_0f" "0")
3606    (set_attr "modrm" "0,1")])
3607
3608 (define_insn "extendsidi2_1"
3609   [(set (match_operand:DI 0 "nonimmediate_operand" "=*A,r,?r,?*o")
3610         (sign_extend:DI (match_operand:SI 1 "register_operand" "0,0,r,r")))
3611    (clobber (reg:CC FLAGS_REG))
3612    (clobber (match_scratch:SI 2 "=X,X,X,&r"))]
3613   "!TARGET_64BIT"
3614   "#")
3615
3616 ;; Extend to memory case when source register does die.
3617 (define_split
3618   [(set (match_operand:DI 0 "memory_operand" "")
3619         (sign_extend:DI (match_operand:SI 1 "register_operand" "")))
3620    (clobber (reg:CC FLAGS_REG))
3621    (clobber (match_operand:SI 2 "register_operand" ""))]
3622   "(reload_completed
3623     && dead_or_set_p (insn, operands[1])
3624     && !reg_mentioned_p (operands[1], operands[0]))"
3625   [(set (match_dup 3) (match_dup 1))
3626    (parallel [(set (match_dup 1) (ashiftrt:SI (match_dup 1) (const_int 31)))
3627               (clobber (reg:CC FLAGS_REG))])
3628    (set (match_dup 4) (match_dup 1))]
3629   "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3630
3631 ;; Extend to memory case when source register does not die.
3632 (define_split
3633   [(set (match_operand:DI 0 "memory_operand" "")
3634         (sign_extend:DI (match_operand:SI 1 "register_operand" "")))
3635    (clobber (reg:CC FLAGS_REG))
3636    (clobber (match_operand:SI 2 "register_operand" ""))]
3637   "reload_completed"
3638   [(const_int 0)]
3639 {
3640   split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);
3641
3642   emit_move_insn (operands[3], operands[1]);
3643
3644   /* Generate a cltd if possible and doing so it profitable.  */
3645   if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
3646       && true_regnum (operands[1]) == AX_REG
3647       && true_regnum (operands[2]) == DX_REG)
3648     {
3649       emit_insn (gen_ashrsi3_cvt (operands[2], operands[1], GEN_INT (31)));
3650     }
3651   else
3652     {
3653       emit_move_insn (operands[2], operands[1]);
3654       emit_insn (gen_ashrsi3_cvt (operands[2], operands[2], GEN_INT (31)));
3655     }
3656   emit_move_insn (operands[4], operands[2]);
3657   DONE;
3658 })
3659
3660 ;; Extend to register case.  Optimize case where source and destination
3661 ;; registers match and cases where we can use cltd.
3662 (define_split
3663   [(set (match_operand:DI 0 "register_operand" "")
3664         (sign_extend:DI (match_operand:SI 1 "register_operand" "")))
3665    (clobber (reg:CC FLAGS_REG))
3666    (clobber (match_scratch:SI 2 ""))]
3667   "reload_completed"
3668   [(const_int 0)]
3669 {
3670   split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);
3671
3672   if (true_regnum (operands[3]) != true_regnum (operands[1]))
3673     emit_move_insn (operands[3], operands[1]);
3674
3675   /* Generate a cltd if possible and doing so it profitable.  */
3676   if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
3677       && true_regnum (operands[3]) == AX_REG
3678       && true_regnum (operands[4]) == DX_REG)
3679     {
3680       emit_insn (gen_ashrsi3_cvt (operands[4], operands[3], GEN_INT (31)));
3681       DONE;
3682     }
3683
3684   if (true_regnum (operands[4]) != true_regnum (operands[1]))
3685     emit_move_insn (operands[4], operands[1]);
3686
3687   emit_insn (gen_ashrsi3_cvt (operands[4], operands[4], GEN_INT (31)));
3688   DONE;
3689 })
3690
3691 (define_insn "extend<mode>di2"
3692   [(set (match_operand:DI 0 "register_operand" "=r")
3693         (sign_extend:DI
3694          (match_operand:SWI12 1 "nonimmediate_operand" "<r>m")))]
3695   "TARGET_64BIT"
3696   "movs{<imodesuffix>q|x}\t{%1, %0|%0, %1}"
3697   [(set_attr "type" "imovx")
3698    (set_attr "mode" "DI")])
3699
3700 (define_insn "extendhisi2"
3701   [(set (match_operand:SI 0 "register_operand" "=*a,r")
3702         (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "*0,rm")))]
3703   ""
3704 {
3705   switch (get_attr_prefix_0f (insn))
3706     {
3707     case 0:
3708       return "{cwtl|cwde}";
3709     default:
3710       return "movs{wl|x}\t{%1, %0|%0, %1}";
3711     }
3712 }
3713   [(set_attr "type" "imovx")
3714    (set_attr "mode" "SI")
3715    (set (attr "prefix_0f")
3716      ;; movsx is short decodable while cwtl is vector decoded.
3717      (if_then_else (and (eq_attr "cpu" "!k6")
3718                         (eq_attr "alternative" "0"))
3719         (const_string "0")
3720         (const_string "1")))
3721    (set (attr "modrm")
3722      (if_then_else (eq_attr "prefix_0f" "0")
3723         (const_string "0")
3724         (const_string "1")))])
3725
3726 (define_insn "*extendhisi2_zext"
3727   [(set (match_operand:DI 0 "register_operand" "=*a,r")
3728         (zero_extend:DI
3729          (sign_extend:SI
3730           (match_operand:HI 1 "nonimmediate_operand" "*0,rm"))))]
3731   "TARGET_64BIT"
3732 {
3733   switch (get_attr_prefix_0f (insn))
3734     {
3735     case 0:
3736       return "{cwtl|cwde}";
3737     default:
3738       return "movs{wl|x}\t{%1, %k0|%k0, %1}";
3739     }
3740 }
3741   [(set_attr "type" "imovx")
3742    (set_attr "mode" "SI")
3743    (set (attr "prefix_0f")
3744      ;; movsx is short decodable while cwtl is vector decoded.
3745      (if_then_else (and (eq_attr "cpu" "!k6")
3746                         (eq_attr "alternative" "0"))
3747         (const_string "0")
3748         (const_string "1")))
3749    (set (attr "modrm")
3750      (if_then_else (eq_attr "prefix_0f" "0")
3751         (const_string "0")
3752         (const_string "1")))])
3753
3754 (define_insn "extendqisi2"
3755   [(set (match_operand:SI 0 "register_operand" "=r")
3756         (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm")))]
3757   ""
3758   "movs{bl|x}\t{%1, %0|%0, %1}"
3759    [(set_attr "type" "imovx")
3760     (set_attr "mode" "SI")])
3761
3762 (define_insn "*extendqisi2_zext"
3763   [(set (match_operand:DI 0 "register_operand" "=r")
3764         (zero_extend:DI
3765           (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm"))))]
3766   "TARGET_64BIT"
3767   "movs{bl|x}\t{%1, %k0|%k0, %1}"
3768    [(set_attr "type" "imovx")
3769     (set_attr "mode" "SI")])
3770
3771 (define_insn "extendqihi2"
3772   [(set (match_operand:HI 0 "register_operand" "=*a,r")
3773         (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "*0,qm")))]
3774   ""
3775 {
3776   switch (get_attr_prefix_0f (insn))
3777     {
3778     case 0:
3779       return "{cbtw|cbw}";
3780     default:
3781       return "movs{bw|x}\t{%1, %0|%0, %1}";
3782     }
3783 }
3784   [(set_attr "type" "imovx")
3785    (set_attr "mode" "HI")
3786    (set (attr "prefix_0f")
3787      ;; movsx is short decodable while cwtl is vector decoded.
3788      (if_then_else (and (eq_attr "cpu" "!k6")
3789                         (eq_attr "alternative" "0"))
3790         (const_string "0")
3791         (const_string "1")))
3792    (set (attr "modrm")
3793      (if_then_else (eq_attr "prefix_0f" "0")
3794         (const_string "0")
3795         (const_string "1")))])
3796 \f
3797 ;; Conversions between float and double.
3798
3799 ;; These are all no-ops in the model used for the 80387.
3800 ;; So just emit moves.
3801
3802 ;; %%% Kill these when call knows how to work out a DFmode push earlier.
3803 (define_split
3804   [(set (match_operand:DF 0 "push_operand" "")
3805         (float_extend:DF (match_operand:SF 1 "fp_register_operand" "")))]
3806   "reload_completed"
3807   [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -8)))
3808    (set (mem:DF (reg:P SP_REG)) (float_extend:DF (match_dup 1)))])
3809
3810 (define_split
3811   [(set (match_operand:XF 0 "push_operand" "")
3812         (float_extend:XF (match_operand:MODEF 1 "fp_register_operand" "")))]
3813   "reload_completed"
3814   [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
3815    (set (mem:XF (reg:P SP_REG)) (float_extend:XF (match_dup 1)))]
3816   "operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));")
3817
3818 (define_expand "extendsfdf2"
3819   [(set (match_operand:DF 0 "nonimmediate_operand" "")
3820         (float_extend:DF (match_operand:SF 1 "general_operand" "")))]
3821   "TARGET_80387 || (TARGET_SSE2 && TARGET_SSE_MATH)"
3822 {
3823   /* ??? Needed for compress_float_constant since all fp constants
3824      are TARGET_LEGITIMATE_CONSTANT_P.  */
3825   if (GET_CODE (operands[1]) == CONST_DOUBLE)
3826     {
3827       if ((!TARGET_SSE2 || TARGET_MIX_SSE_I387)
3828           && standard_80387_constant_p (operands[1]) > 0)
3829         {
3830           operands[1] = simplify_const_unary_operation
3831             (FLOAT_EXTEND, DFmode, operands[1], SFmode);
3832           emit_move_insn_1 (operands[0], operands[1]);
3833           DONE;
3834         }
3835       operands[1] = validize_mem (force_const_mem (SFmode, operands[1]));
3836     }
3837 })
3838
3839 /* For converting SF(xmm2) to DF(xmm1), use the following code instead of
3840    cvtss2sd:
3841       unpcklps xmm2,xmm2   ; packed conversion might crash on signaling NaNs
3842       cvtps2pd xmm2,xmm1
3843    We do the conversion post reload to avoid producing of 128bit spills
3844    that might lead to ICE on 32bit target.  The sequence unlikely combine
3845    anyway.  */
3846 (define_split
3847   [(set (match_operand:DF 0 "register_operand" "")
3848         (float_extend:DF
3849           (match_operand:SF 1 "nonimmediate_operand" "")))]
3850   "TARGET_USE_VECTOR_FP_CONVERTS
3851    && optimize_insn_for_speed_p ()
3852    && reload_completed && SSE_REG_P (operands[0])"
3853    [(set (match_dup 2)
3854          (float_extend:V2DF
3855            (vec_select:V2SF
3856              (match_dup 3)
3857              (parallel [(const_int 0) (const_int 1)]))))]
3858 {
3859   operands[2] = simplify_gen_subreg (V2DFmode, operands[0], DFmode, 0);
3860   operands[3] = simplify_gen_subreg (V4SFmode, operands[0], DFmode, 0);
3861   /* Use movss for loading from memory, unpcklps reg, reg for registers.
3862      Try to avoid move when unpacking can be done in source.  */
3863   if (REG_P (operands[1]))
3864     {
3865       /* If it is unsafe to overwrite upper half of source, we need
3866          to move to destination and unpack there.  */
3867       if ((ORIGINAL_REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
3868            || PSEUDO_REGNO_BYTES (ORIGINAL_REGNO (operands[1])) > 4)
3869           && true_regnum (operands[0]) != true_regnum (operands[1]))
3870         {
3871           rtx tmp = gen_rtx_REG (SFmode, true_regnum (operands[0]));
3872           emit_move_insn (tmp, operands[1]);
3873         }
3874       else
3875         operands[3] = simplify_gen_subreg (V4SFmode, operands[1], SFmode, 0);
3876       emit_insn (gen_vec_interleave_lowv4sf (operands[3], operands[3],
3877                                              operands[3]));
3878     }
3879   else
3880     emit_insn (gen_vec_setv4sf_0 (operands[3],
3881                                   CONST0_RTX (V4SFmode), operands[1]));
3882 })
3883
3884 (define_insn "*extendsfdf2_mixed"
3885   [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m,x")
3886         (float_extend:DF
3887           (match_operand:SF 1 "nonimmediate_operand" "fm,f,xm")))]
3888   "TARGET_SSE2 && TARGET_MIX_SSE_I387"
3889 {
3890   switch (which_alternative)
3891     {
3892     case 0:
3893     case 1:
3894       return output_387_reg_move (insn, operands);
3895
3896     case 2:
3897       return "%vcvtss2sd\t{%1, %d0|%d0, %1}";
3898
3899     default:
3900       gcc_unreachable ();
3901     }
3902 }
3903   [(set_attr "type" "fmov,fmov,ssecvt")
3904    (set_attr "prefix" "orig,orig,maybe_vex")
3905    (set_attr "mode" "SF,XF,DF")])
3906
3907 (define_insn "*extendsfdf2_sse"
3908   [(set (match_operand:DF 0 "nonimmediate_operand" "=x")
3909         (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "xm")))]
3910   "TARGET_SSE2 && TARGET_SSE_MATH"
3911   "%vcvtss2sd\t{%1, %d0|%d0, %1}"
3912   [(set_attr "type" "ssecvt")
3913    (set_attr "prefix" "maybe_vex")
3914    (set_attr "mode" "DF")])
3915
3916 (define_insn "*extendsfdf2_i387"
3917   [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m")
3918         (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
3919   "TARGET_80387"
3920   "* return output_387_reg_move (insn, operands);"
3921   [(set_attr "type" "fmov")
3922    (set_attr "mode" "SF,XF")])
3923
3924 (define_expand "extend<mode>xf2"
3925   [(set (match_operand:XF 0 "nonimmediate_operand" "")
3926         (float_extend:XF (match_operand:MODEF 1 "general_operand" "")))]
3927   "TARGET_80387"
3928 {
3929   /* ??? Needed for compress_float_constant since all fp constants
3930      are TARGET_LEGITIMATE_CONSTANT_P.  */
3931   if (GET_CODE (operands[1]) == CONST_DOUBLE)
3932     {
3933       if (standard_80387_constant_p (operands[1]) > 0)
3934         {
3935           operands[1] = simplify_const_unary_operation
3936             (FLOAT_EXTEND, XFmode, operands[1], <MODE>mode);
3937           emit_move_insn_1 (operands[0], operands[1]);
3938           DONE;
3939         }
3940       operands[1] = validize_mem (force_const_mem (<MODE>mode, operands[1]));
3941     }