OSDN Git Service

* i386.md (all XFmode patterns except swapxf): Disable for 64bit.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Mar 2001 14:44:52 +0000 (14:44 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Mar 2001 14:44:52 +0000 (14:44 +0000)
* i386.md (x86_sahf_1): Disable for 64bit.
(popsi*, pophi*): Likewise.
(pushqi, pushhi): Likewise.
(movdi, pushdi): Likewise.
(zero extend DImode splitter): Likewise.
(adddi, minusdi splitter): Likewise.
(umulsidi): Likewise.
(umulsi): New.
(mulsidi): Disable for 64bit
(lshift:DI/ashift:DI): Disable for 64bit.
(loop patterns): Likewise.
(call_pop, call_value_pop expanders and patterns): Likewise.
(prologue_get_pc): Likewise.
(leave): Likewise.
(fcmovDI pattern and splitter): Likewise.
(movdfcc_1_rex64): New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40412 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.md

index cf724ab..7513089 100644 (file)
@@ -1,3 +1,24 @@
+Mon Mar 12 15:41:08 CET 2001  Jan Hubicka  <jh@suse.cz>
+
+       * i386.md (all XFmode patterns except swapxf): Disable for 64bit.
+
+       * i386.md (x86_sahf_1): Disable for 64bit.
+       (popsi*, pophi*): Likewise.
+       (pushqi, pushhi): Likewise.
+       (movdi, pushdi): Likewise.
+       (zero extend DImode splitter): Likewise.
+       (adddi, minusdi splitter): Likewise.
+       (umulsidi): Likewise.
+       (umulsi): New.
+       (mulsidi): Disable for 64bit
+       (lshift:DI/ashift:DI): Disable for 64bit.
+       (loop patterns): Likewise.
+       (call_pop, call_value_pop expanders and patterns): Likewise.
+       (prologue_get_pc): Likewise.
+       (leave): Likewise.
+       (fcmovDI pattern and splitter): Likewise.
+       (movdfcc_1_rex64): New.
+
 Mon Mar 12 15:16:36 CET 2001  Jan Hubicka  <jh@suse.cz>
 
        * i386.h (VALID_FP_MODE_P): XFmode is invalid on x86_64.
index b350729..735f472 100644 (file)
   [(set (reg:CC 17)
        (compare:CC (match_operand:XF 0 "cmp_fp_expander_operand" "")
                    (match_operand:XF 1 "cmp_fp_expander_operand" "")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "
 {
   ix86_compare_op0 = operands[0];
        (compare:CCFP
          (match_operand:XF 0 "register_operand" "f")
          (match_operand:XF 1 "register_operand" "f")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "fcmp")
    (set_attr "mode" "XF")])
          [(compare:CCFP
             (match_operand:XF 1 "register_operand" "f")
             (match_operand:XF 2 "register_operand" "f"))] 9))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "* return output_fp_compare (insn, operands, 2, 0);"
   [(set_attr "type" "multi")
    (set_attr "mode" "XF")])
 (define_insn "x86_sahf_1"
   [(set (reg:CC 17)
        (unspec:CC [(match_operand:HI 0 "register_operand" "a")] 10))]
-  ""
+  "!TARGET_64BIT"
   "sahf"
   [(set_attr "length" "1")
    (set_attr "athlon_decode" "vector")
    (set (reg:SI 7)
        (plus:SI (reg:SI 7) (const_int 4)))
    (set (reg:SI 6) (reg:SI 6))]
-  ""
+  "!TARGET_64BIT"
   "pop{l}\\t%0"
   [(set_attr "type" "pop")
    (set_attr "mode" "SI")])
        (mem:SI (reg:SI 7)))
    (set (reg:SI 7)
        (plus:SI (reg:SI 7) (const_int 4)))]
-  ""
+  "!TARGET_64BIT"
   "pop{l}\\t%0"
   [(set_attr "type" "pop")
    (set_attr "mode" "SI")])
 (define_insn "*pushhi2"
   [(set (match_operand:HI 0 "push_operand" "=<,<")
        (match_operand:HI 1 "general_no_elim_operand" "n,r*m"))]
-  ""
+  "!TARGET_64BIT"
   "@
    push{w}\\t{|WORD PTR }%1
    push{w}\\t%1"
        (mem:HI (reg:SI 7)))
    (set (reg:SI 7)
        (plus:SI (reg:SI 7) (const_int 2)))]
-  ""
+  "!TARGET_64BIT"
   "pop{w}\\t%0"
   [(set_attr "type" "pop")
    (set_attr "mode" "HI")])
 (define_insn "*pushqi2"
   [(set (match_operand:QI 0 "push_operand" "=<,<")
        (match_operand:QI 1 "nonmemory_no_elim_operand" "n,r"))]
-  ""
+  "!TARGET_64BIT"
   "@
    push{w}\\t{|word ptr }%1
    push{w}\\t%w1"
        (mem:QI (reg:SI 7)))
    (set (reg:SI 7)
        (plus:SI (reg:SI 7) (const_int 2)))]
-  ""
+  "!TARGET_64BIT"
   "pop{w}\\t%0"
   [(set_attr "type" "pop")
    (set_attr "mode" "HI")])
 (define_insn "*pushdi"
   [(set (match_operand:DI 0 "push_operand" "=<")
        (match_operand:DI 1 "general_no_elim_operand" "riF*m"))]
-  ""
+  "!TARGET_64BIT"
   "#")
 
 (define_insn "*movdi_2"
   [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o,!m*y,!*y")
        (match_operand:DI 1 "general_operand" "riFo,riF,*y,m"))]
-  "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
+  "!TARGET_64BIT
+   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
   "@
    #
    #
 (define_split
   [(set (match_operand:DI 0 "push_operand" "")
         (match_operand:DI 1 "general_operand" ""))]
-  "reload_completed && ! MMX_REG_P (operands[1])"
+  "reload_completed && ! MMX_REG_P (operands[1]) && !TARGET_64BIT"
   [(const_int 0)]
   "if (!ix86_split_long_move (operands)) abort (); DONE;")
 
 (define_expand "movxf"
   [(set (match_operand:XF 0 "nonimmediate_operand" "")
        (match_operand:XF 1 "general_operand" ""))]
-  ""
+  "!TARGET_64BIT"
   "ix86_expand_move (XFmode, operands); DONE;")
 
 (define_expand "movtf"
 ;;  handled elsewhere).
 
 (define_insn "*pushxf_nointeger"
-  [(set (match_operand:XF 0 "push_operand" "=<,<,<")
+  [(set (match_operand:XF 0 "push_operand" "=X,X,X")
        (match_operand:XF 1 "general_no_elim_operand" "f,Fo,*r"))]
-  "optimize_size"
+  "optimize_size && !TARGET_64BIT"
   "*
 {
   switch (which_alternative)
 
 (define_insn "*pushxf_integer"
   [(set (match_operand:XF 0 "push_operand" "=<,<")
-       (match_operand:XF 1 "general_no_elim_operand" "f#r,rFo#f"))]
-  "!optimize_size"
+       (match_operand:XF 1 "general_no_elim_operand" "f#r,ro#f"))]
+  "!optimize_size && !TARGET_64BIT"
   "*
 {
   switch (which_alternative)
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,*r,o")
        (match_operand:XF 1 "general_operand" "fm,f,G,*roF,F*r"))]
   "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
+   && !TARGET_64BIT
    && optimize_size
    && (reload_in_progress || reload_completed
        || GET_CODE (operands[1]) != CONST_DOUBLE
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,m,f#r,r#f,o")
        (match_operand:XF 1 "general_operand" "fm#r,f#r,G,roF#f,Fr#f"))]
   "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
+   && !TARGET_64BIT
    && !optimize_size
    && (reload_in_progress || reload_completed
        || GET_CODE (operands[1]) != CONST_DOUBLE
   [(set (match_operand:DI 0 "register_operand" "")
        (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
    (clobber (reg:CC 17))]
-  "reload_completed && true_regnum (operands[0]) == true_regnum (operands[1])"
+  "reload_completed && true_regnum (operands[0]) == true_regnum (operands[1])
+   && !TARGET_64BIT"
   [(set (match_dup 4) (const_int 0))]
   "split_di (&operands[0], 1, &operands[3], &operands[4]);")
 
 (define_expand "extendsfxf2"
   [(set (match_operand:XF 0 "nonimmediate_operand" "")
         (float_extend:XF (match_operand:SF 1 "nonimmediate_operand" "")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "
 {
   if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
 (define_insn "*extendsfxf2_1"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m")
         (float_extend:XF (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
-  "TARGET_80387
+  "TARGET_80387 && !TARGET_64BIT
    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
   "*
 {
 (define_expand "extenddfxf2"
   [(set (match_operand:XF 0 "nonimmediate_operand" "")
         (float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "
 {
   if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
 (define_insn "*extenddfxf2_1"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m")
         (float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "fm,f")))]
-  "TARGET_80387
+  "TARGET_80387 && !TARGET_64BIT
    && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
   "*
 {
                   (float_truncate:SF
                    (match_operand:XF 1 "register_operand" "")))
              (clobber (match_dup 2))])]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "operands[2] = assign_386_stack_local (SFmode, 0);")
 
 (define_insn "*truncxfsf2_1"
        (float_truncate:SF
         (match_operand:XF 1 "register_operand" "f,0")))
    (clobber (match_operand:SF 2 "memory_operand" "=m,m"))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "*
 {
   switch (which_alternative)
   [(set (match_operand:SF 0 "memory_operand" "=m")
        (float_truncate:SF
         (match_operand:XF 1 "register_operand" "f")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "*
 {
   if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "SF")])
 
-(define_insn "*truncxfsf2_2"
+(define_insn "*trunctfsf2_2"
   [(set (match_operand:SF 0 "nonimmediate_operand" "=m")
        (float_truncate:SF
         (match_operand:TF 1 "register_operand" "f")))]
                   (float_truncate:DF
                    (match_operand:XF 1 "register_operand" "")))
              (clobber (match_dup 2))])]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "operands[2] = assign_386_stack_local (DFmode, 0);")
 
 (define_insn "*truncxfdf2_1"
        (float_truncate:DF
         (match_operand:XF 1 "register_operand" "f,0")))
    (clobber (match_operand:DF 2 "memory_operand" "=m,m"))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "*
 {
   switch (which_alternative)
   [(set (match_operand:DF 0 "memory_operand" "=m")
        (float_truncate:DF
          (match_operand:XF 1 "register_operand" "f")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "*
 {
   if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
              (clobber (match_dup 3))
              (clobber (match_scratch:SI 4 ""))
              (clobber (match_scratch:XF 5 ""))])]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "operands[2] = assign_386_stack_local (SImode, 0);
    operands[3] = assign_386_stack_local (DImode, 1);")
 
              (clobber (match_dup 2))
              (clobber (match_dup 3))
              (clobber (match_scratch:SI 4 ""))])]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "operands[2] = assign_386_stack_local (SImode, 0);
    operands[3] = assign_386_stack_local (SImode, 1);")
 
 (define_insn "floathixf2"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (float:XF (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "@
    fild%z1\\t%1
    #"
 (define_insn "floatsixf2"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (float:XF (match_operand:SI 1 "nonimmediate_operand" "m,r")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "@
    fild%z1\\t%1
    #"
 (define_insn "floatdixf2"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (float:XF (match_operand:DI 1 "nonimmediate_operand" "m,r")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "@
    fild%z1\\t%1
    #"
        (plus:DI (match_operand:DI 1 "nonimmediate_operand" "")
                 (match_operand:DI 2 "general_operand" "")))
    (clobber (reg:CC 17))]
-  "reload_completed"
+  "reload_completed && !TARGET_64BIT"
   [(parallel [(set (reg:CC 17) (unspec:CC [(match_dup 1) (match_dup 2)] 12))
              (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))])
    (parallel [(set (match_dup 3)
   [(set (match_operand:XF 0 "register_operand" "")
        (plus:XF (match_operand:XF 1 "register_operand" "")
                 (match_operand:XF 2 "register_operand" "")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "")
 
 (define_expand "addtf3"
        (minus:DI (match_operand:DI 1 "nonimmediate_operand" "")
                  (match_operand:DI 2 "general_operand" "")))
    (clobber (reg:CC 17))]
-  "reload_completed"
+  "reload_completed && !TARGET_64BIT"
   [(parallel [(set (reg:CC 17) (compare:CC (match_dup 1) (match_dup 2)))
              (set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))])
    (parallel [(set (match_dup 3)
   [(set (match_operand:XF 0 "register_operand" "")
        (minus:XF (match_operand:XF 1 "register_operand" "")
                  (match_operand:XF 2 "register_operand" "")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "")
 
 (define_expand "subtf3"
    (set_attr "length_immediate" "0")
    (set_attr "mode" "QI")])
 
+(define_insn "umulsi3"
+  [(set (match_operand:SI 0 "register_operand" "=a")
+       (mult:SI (match_operand:SI 1 "register_operand" "%0")
+                (match_operand:SI 2 "nonimmediate_operand" "rm")))
+   (clobber (match_operand:SI 3 "register_operand" "=d"))
+   (clobber (reg:CC 17))]
+  ""
+  "mul{l}\\t%2"
+  [(set_attr "type" "imul")
+   (set_attr "ppro_uops" "few")
+   (set_attr "length_immediate" "0")
+   (set_attr "mode" "SI")])
+
+;; We can't use this pattern in 64bit mode, since it results in two separate 32bit registers
 (define_insn "umulsidi3"
   [(set (match_operand:DI 0 "register_operand" "=A")
        (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "%0"))
                 (zero_extend:DI (match_operand:SI 2 "nonimmediate_operand" "rm"))))
    (clobber (reg:CC 17))]
-  ""
+  "!TARGET_64BIT"
   "mul{l}\\t%2"
   [(set_attr "type" "imul")
    (set_attr "ppro_uops" "few")
        (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%0"))
                 (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "rm"))))
    (clobber (reg:CC 17))]
-  ""
+  "!TARGET_64BIT"
   "imul{l}\\t%2"
   [(set_attr "type" "imul")
    (set_attr "length_immediate" "0")
            (const_int 32))))
    (clobber (match_scratch:SI 3 "=a"))
    (clobber (reg:CC 17))]
-  ""
+  "!TARGET_64BIT"
   "mul{l}\\t%2"
   [(set_attr "type" "imul")
    (set_attr "ppro_uops" "few")
   [(set (match_operand:XF 0 "register_operand" "")
        (mult:XF (match_operand:XF 1 "register_operand" "")
                 (match_operand:XF 2 "register_operand" "")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "")
 
 (define_expand "multf3"
   [(set (match_operand:XF 0 "register_operand" "")
        (div:XF (match_operand:XF 1 "register_operand" "")
                (match_operand:XF 2 "register_operand" "")))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "")
 
 (define_expand "divtf3"
   [(parallel [(set (match_operand:XF 0 "nonimmediate_operand" "")
                   (neg:XF (match_operand:XF 1 "nonimmediate_operand" "")))
              (clobber (reg:CC 17))])]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "ix86_expand_unary_operator (NEG, XFmode, operands); DONE;")
 
 (define_expand "negtf2"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,rm#f")
        (neg:XF (match_operand:XF 1 "nonimmediate_operand" "0,0")))
    (clobber (reg:CC 17))]
-  "TARGET_80387 && ix86_unary_operator_ok (NEG, XFmode, operands)"
+  "TARGET_80387 && !TARGET_64BIT
+   && ix86_unary_operator_ok (NEG, XFmode, operands)"
   "#")
 
 (define_split
 (define_insn "*negxf2_1"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (neg:XF (match_operand:XF 1 "register_operand" "0")))]
-  "TARGET_80387 && reload_completed"
+  "TARGET_80387 && !TARGET_64BIT && reload_completed"
   "fchs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "XF")
   [(set (match_operand:XF 0 "register_operand" "=f")
        (neg:XF (float_extend:XF
                  (match_operand:DF 1 "register_operand" "0"))))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "fchs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "XF")
   [(set (match_operand:XF 0 "register_operand" "=f")
        (neg:XF (float_extend:XF
                  (match_operand:SF 1 "register_operand" "0"))))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "fchs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "XF")
   [(parallel [(set (match_operand:XF 0 "nonimmediate_operand" "")
                   (neg:XF (match_operand:XF 1 "nonimmediate_operand" "")))
              (clobber (reg:CC 17))])]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "ix86_expand_unary_operator (ABS, XFmode, operands); DONE;")
 
 (define_expand "abstf2"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,rm#f")
        (abs:XF (match_operand:XF 1 "nonimmediate_operand" "0,0")))
    (clobber (reg:CC 17))]
-  "TARGET_80387 && ix86_unary_operator_ok (ABS, XFmode, operands)"
+  "TARGET_80387 && !TARGET_64BIT
+   && ix86_unary_operator_ok (ABS, XFmode, operands)"
   "#")
 
 (define_split
 (define_insn "*absxf2_1"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (abs:XF (match_operand:XF 1 "register_operand" "0")))]
-  "TARGET_80387 && reload_completed"
+  "TARGET_80387 && !TARGET_64BIT && reload_completed"
   "fabs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "DF")])
   [(set (match_operand:XF 0 "register_operand" "=f")
        (abs:XF (float_extend:XF
          (match_operand:DF 1 "register_operand" "0"))))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "fabs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "XF")])
   [(set (match_operand:XF 0 "register_operand" "=f")
        (abs:XF (float_extend:XF
          (match_operand:SF 1 "register_operand" "0"))))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "fabs"
   [(set_attr "type" "fsgn")
    (set_attr "mode" "XF")])
                     (match_operand:QI 2 "nonmemory_operand" "Jc")))
    (clobber (match_scratch:SI 3 "=&r"))
    (clobber (reg:CC 17))]
-  "TARGET_CMOVE"
+  "!TARGET_64BIT && TARGET_CMOVE"
   "#"
   [(set_attr "type" "multi")])
 
        (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
                     (match_operand:QI 2 "nonmemory_operand" "Jc")))
    (clobber (reg:CC 17))]
-  ""
+  "!TARGET_64BIT"
   "#"
   [(set_attr "type" "multi")])
 
                     (match_operand:QI 2 "nonmemory_operand" "")))
    (clobber (match_scratch:SI 3 ""))
    (clobber (reg:CC 17))]
-  "TARGET_CMOVE && reload_completed"
+  "!TARGET_64BIT && TARGET_CMOVE && reload_completed"
   [(const_int 0)]
   "ix86_split_lshrdi (operands, operands[3]); DONE;")
 
        (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
                     (match_operand:QI 2 "nonmemory_operand" "")))
    (clobber (reg:CC 17))]
-  "reload_completed"
+  "!TARGET_64BIT && reload_completed"
   [(const_int 0)]
   "ix86_split_lshrdi (operands, NULL_RTX); DONE;")
 
    (use (match_operand 2 "" ""))        ; max iterations
    (use (match_operand 3 "" ""))        ; loop level 
    (use (match_operand 4 "" ""))]       ; label
-  "TARGET_USE_LOOP"
+  "TARGET_USE_LOOP && !TARGET_64BIT"
   "                                 
 {
   /* Only use cloop on innermost loops.  */
                 (const_int -1)))
    (clobber (match_scratch:SI 3 "=X,X,r"))
    (clobber (reg:CC 17))]
-  "TARGET_USE_LOOP"
+  "TARGET_USE_LOOP && !TARGET_64BIT"
   "*
 {
   if (which_alternative != 0)
                 (const_int -1)))
    (clobber (match_scratch:SI 2 ""))
    (clobber (reg:CC 17))]
-  "TARGET_USE_LOOP
+  "TARGET_USE_LOOP && !TARGET_64BIT
    && reload_completed
    && REGNO (operands[1]) != 2"
   [(parallel [(set (reg:CCZ 17)
                 (const_int -1)))
    (clobber (match_scratch:SI 3 ""))
    (clobber (reg:CC 17))]
-  "TARGET_USE_LOOP
+  "TARGET_USE_LOOP && !TARGET_64BIT
    && reload_completed
    && (! REG_P (operands[2])
        || ! rtx_equal_p (operands[1], operands[2]))"
              (set (reg:SI 7)
                   (plus:SI (reg:SI 7)
                            (match_operand:SI 3 "" "")))])]
-  ""
+  "!TARGET_64BIT"
   "
 {
   if (operands[3] == const0_rtx)
     current_function_uses_pic_offset_table = 1;
   if (! call_insn_operand (XEXP (operands[0], 0), Pmode))
     XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
+  if (TARGET_64BIT)
+    abort();
 }")
 
 (define_insn "*call_pop_0"
         (match_operand:SI 1 "" ""))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
                            (match_operand:SI 2 "immediate_operand" "")))]
-  ""
+  "!TARGET_64BIT"
   "*
 {
   if (SIBLING_CALL_P (insn))
         (match_operand:SI 1 "" ""))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
                            (match_operand:SI 2 "immediate_operand" "i")))]
-  ""
+  "!TARGET_64BIT"
   "*
 {
   if (constant_call_address_operand (operands[0], Pmode))
              (set (reg:SI 7)
                   (plus:SI (reg:SI 7)
                            (match_operand:SI 4 "" "")))])]
-  ""
+  "!TARGET_64BIT"
   "
 {
   if (operands[4] == const0_rtx)
 (define_insn "prologue_get_pc"
   [(set (match_operand:SI 0 "register_operand" "=r")
     (unspec_volatile:SI [(plus:SI (pc) (match_operand 1 "" ""))] 2))]
-  ""
+  "!TARGET_64BIT"
   "*
 {
   if (GET_CODE (operands[1]) == LABEL_REF)
 (define_insn "leave"
   [(set (reg:SI 7) (reg:SI 6))
    (set (reg:SI 6) (mem:SI (pre_dec:SI (reg:SI 7))))]
-  ""
+  "!TARGET_64BIT"
   "leave"
   [(set_attr "length_immediate" "0")
    (set_attr "length" "1")
        (match_operator:XF 3 "binary_fp_operator"
                        [(match_operand:XF 1 "register_operand" "%0")
                         (match_operand:XF 2 "register_operand" "f")]))]
-  "TARGET_80387 && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'"
+  "TARGET_80387 && !TARGET_64BIT
+   && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (if_then_else (match_operand:XF 3 "mult_operator" "") 
        (match_operator:XF 3 "binary_fp_operator"
                        [(match_operand:XF 1 "register_operand" "0,f")
                         (match_operand:XF 2 "register_operand" "f,0")]))]
-  "TARGET_80387
+  "TARGET_80387 && !TARGET_64BIT
    && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
        (match_operator:XF 3 "binary_fp_operator"
           [(float:XF (match_operand:SI 1 "nonimmediate_operand" "m,?r"))
            (match_operand:XF 2 "register_operand" "0,0")]))]
-  "TARGET_80387 && TARGET_USE_FIOP"
+  "TARGET_80387 && !TARGET_64BIT && TARGET_USE_FIOP"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
        (match_operator:XF 3 "binary_fp_operator"
          [(match_operand:XF 1 "register_operand" "0,0")
           (float:XF (match_operand:SI 2 "nonimmediate_operand" "m,?r"))]))]
-  "TARGET_80387 && TARGET_USE_FIOP"
+  "TARGET_80387 && !TARGET_64BIT && TARGET_USE_FIOP"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
        (match_operator:XF 3 "binary_fp_operator"
           [(float_extend:XF (match_operand:SF 1 "nonimmediate_operand" "fm,0"))
            (match_operand:XF 2 "register_operand" "0,f")]))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
          [(match_operand:XF 1 "register_operand" "0,f")
           (float_extend:XF
            (match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
        (match_operator:XF 3 "binary_fp_operator"
           [(float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "fm,0"))
            (match_operand:XF 2 "register_operand" "0,f")]))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
          [(match_operand:XF 1 "register_operand" "0,f")
           (float_extend:XF
            (match_operand:DF 2 "nonimmediate_operand" "fm,0"))]))]
-  "TARGET_80387"
+  "TARGET_80387 && !TARGET_64BIT"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
 (define_insn "sqrtxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (sqrt:XF (match_operand:XF 1 "register_operand" "0")))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && !TARGET_64BIT
    && (TARGET_IEEE_FP || flag_unsafe_math_optimizations) "
   "fsqrt"
   [(set_attr "type" "fpspc")
   [(set (match_operand:XF 0 "register_operand" "=f")
        (sqrt:XF (float_extend:XF
                  (match_operand:DF 1 "register_operand" "0"))))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387"
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && !TARGET_64BIT"
   "fsqrt"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")
   [(set (match_operand:XF 0 "register_operand" "=f")
        (sqrt:XF (float_extend:XF
                  (match_operand:SF 1 "register_operand" "0"))))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387"
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && !TARGET_64BIT"
   "fsqrt"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")
 (define_insn "sinxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")] 1))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && !TARGET_64BIT
    && flag_unsafe_math_optimizations"
   "fsin"
   [(set_attr "type" "fpspc")
 (define_insn "cosxf2"
   [(set (match_operand:XF 0 "register_operand" "=f")
        (unspec:XF [(match_operand:XF 1 "register_operand" "0")] 2))]
-  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387 
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
    && flag_unsafe_math_optimizations"
   "fcos"
   [(set_attr "type" "fpspc")
                                [(reg 17) (const_int 0)])
                      (match_operand:DF 2 "nonimmediate_operand" "f,0,rm,0")
                      (match_operand:DF 3 "nonimmediate_operand" "0,f,0,rm")))]
-  "TARGET_CMOVE
+  "TARGET_CMOVE && !TARGET_64BIT
    && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
   "@
    fcmov%F1\\t{%2, %0|%0, %2}
   [(set_attr "type" "fcmov,fcmov,multi,multi")
    (set_attr "mode" "DF")])
 
+(define_insn "*movdfcc_1_rex64"
+  [(set (match_operand:DF 0 "register_operand" "=f,f,&r,&r")
+       (if_then_else:DF (match_operator 1 "fcmov_comparison_operator" 
+                               [(reg 17) (const_int 0)])
+                     (match_operand:DF 2 "nonimmediate_operand" "f,0,rm,0")
+                     (match_operand:DF 3 "nonimmediate_operand" "0,f,0,rm")))]
+  "TARGET_CMOVE && TARGET_64BIT
+   && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
+  "@
+   fcmov%F1\\t{%2, %0|%0, %2}
+   fcmov%f1\\t{%3, %0|%0, %3}
+   cmov%C1\\t{%2, %0|%0, %2}
+   cmov%c1\\t{%3, %0|%0, %3}"
+  [(set_attr "type" "fcmov,fcmov,icmov,icmov")
+   (set_attr "mode" "DF")])
+
 (define_split
   [(set (match_operand:DF 0 "register_operand" "")
        (if_then_else:DF (match_operator 1 "fcmov_comparison_operator" 
                                [(match_operand 4 "" "") (const_int 0)])
                      (match_operand:DF 2 "nonimmediate_operand" "")
                      (match_operand:DF 3 "nonimmediate_operand" "")))]
-  "!ANY_FP_REG_P (operands[0]) && reload_completed"
+  "!ANY_FP_REG_P (operands[0]) && reload_completed && !TARGET_64BIT"
   [(set (match_dup 2)
        (if_then_else:SI (match_op_dup 1 [(match_dup 4) (const_int 0)])
                      (match_dup 5)
        (if_then_else:XF (match_operand 1 "comparison_operator" "")
                         (match_operand:XF 2 "register_operand" "")
                         (match_operand:XF 3 "register_operand" "")))]
-  "TARGET_CMOVE"
+  "TARGET_CMOVE && !TARGET_64BIT"
   "if (! ix86_expand_fp_movcc (operands)) FAIL; DONE;")
 
 (define_expand "movtfcc"
                                [(reg 17) (const_int 0)])
                      (match_operand:XF 2 "register_operand" "f,0")
                      (match_operand:XF 3 "register_operand" "0,f")))]
-  "TARGET_CMOVE"
+  "TARGET_CMOVE && !TARGET_64BIT"
   "@
    fcmov%F1\\t{%2, %0|%0, %2}
    fcmov%f1\\t{%3, %0|%0, %3}"
              (match_operand:SI 2 "" "")))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
                            (match_operand:SI 3 "immediate_operand" "")))]
-  ""
+  "!TARGET_64BIT"
   "*
 {
   if (SIBLING_CALL_P (insn))
              (match_operand:SI 2 "" "")))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
                            (match_operand:SI 3 "immediate_operand" "i")))]
-  ""
+  "!TARGET_64BIT"
   "*
 {
   if (constant_call_address_operand (operands[1], QImode))