OSDN Git Service

2009-05-18 H.J. Lu <hongjiu.lu@intel.com>
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.md
index 679d38a..2e28802 100644 (file)
 ;; See file "rtl.def" for documentation on define_insn, match_*, et. al.
 ;;
 ;; The special asm out single letter directives following a '%' are:
-;; 'z' mov%z1 would be movl, movw, or movb depending on the mode of
-;;     operands[1].
-;; 'L' Print the opcode suffix for a 32-bit integer opcode.
-;; 'W' Print the opcode suffix for a 16-bit integer opcode.
-;; 'B' Print the opcode suffix for an 8-bit integer opcode.
-;; 'Q' Print the opcode suffix for a 64-bit float opcode.
-;; 'S' Print the opcode suffix for a 32-bit float opcode.
-;; 'T' Print the opcode suffix for an 80-bit extended real XFmode float opcode.
-;; 'J' Print the appropriate jump operand.
-;;
-;; 'b' Print the QImode name of the register for the indicated operand.
-;;     %b0 would print %al if operands[0] is reg 0.
-;; 'w' Likewise, print the HImode name of the register.
-;; 'k' Likewise, print the SImode name of the register.
-;; 'h' Print the QImode name for a "high" register, either ah, bh, ch or dh.
-;; 'y' Print "st(0)" instead of "st" as a register.
+;; L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
+;; C -- print opcode suffix for set/cmov insn.
+;; c -- like C, but print reversed condition
+;; E,e -- likewise, but for compare-and-branch fused insn.
+;; F,f -- likewise, but for floating-point.
+;; O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
+;;      otherwise nothing
+;; R -- print the prefix for register names.
+;; z -- print the opcode suffix for the size of the current operand.
+;; Z -- likewise, with special suffixes for x87 instructions.
+;; * -- print a star (in certain assembler syntax)
+;; A -- print an absolute memory reference.
+;; w -- print the operand as if it's a "word" (HImode) even if it isn't.
+;; s -- print a shift double count, followed by the assemblers argument
+;;     delimiter.
+;; b -- print the QImode name of the register for the indicated operand.
+;;     %b0 would print %al if operands[0] is reg 0.
+;; w --  likewise, print the HImode name of the register.
+;; k --  likewise, print the SImode name of the register.
+;; q --  likewise, print the DImode name of the register.
+;; x --  likewise, print the V4SFmode name of the register.
+;; t --  likewise, print the V8SFmode name of the register.
+;; h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
+;; y -- print "st(0)" instead of "st" as a register.
+;; d -- print duplicated register operand for AVX instruction.
+;; D -- print condition for SSE cmp instruction.
+;; P -- if PIC, print an @PLT suffix.
+;; X -- don't print any sort of PIC '@' suffix for a symbol.
+;; & -- print some in-use local-dynamic symbol name.
+;; H -- print a memory address offset by 8; used for sse high-parts
+;; Y -- print condition for SSE5 com* instruction.
+;; + -- print a branch hint as 'cs' or 'ds' prefix
+;; ; -- print a semicolon (after prefixes due to bug in older gas).
 
 ;; UNSPEC usage:
 
 (include "constraints.md")
 
 \f
-;; Compare instructions.
+;; Compare and branch/compare and store instructions.
 
-;; All compare insns have expanders that save the operands away without
-;; actually generating RTL.  The bCOND or sCOND (emitted immediately
-;; after the cmp) will actually emit the cmpM.
+(define_expand "cbranchti4"
+  [(set (reg:CC FLAGS_REG)
+       (compare:CC (match_operand:TI 1 "nonimmediate_operand" "")
+                   (match_operand:TI 2 "x86_64_general_operand" "")))
+   (set (pc) (if_then_else
+              (match_operator 0 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)])
+              (label_ref (match_operand 3 "" ""))
+              (pc)))]
+  "TARGET_64BIT"
+{
+  if (MEM_P (operands[1]) && MEM_P (operands[2]))
+    operands[1] = force_reg (TImode, operands[1]);
+  ix86_compare_op0 = operands[1];
+  ix86_compare_op1 = operands[2];
+  ix86_expand_branch (GET_CODE (operands[0]), operands[3]);
+  DONE;
+})
+
+(define_expand "cbranchdi4"
+  [(set (reg:CC FLAGS_REG)
+       (compare:CC (match_operand:DI 1 "nonimmediate_operand" "")
+                   (match_operand:DI 2 "x86_64_general_operand" "")))
+   (set (pc) (if_then_else
+              (match_operator 0 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)])
+              (label_ref (match_operand 3 "" ""))
+              (pc)))]
+  ""
+{
+  if (MEM_P (operands[1]) && MEM_P (operands[2]))
+    operands[1] = force_reg (DImode, operands[1]);
+  ix86_compare_op0 = operands[1];
+  ix86_compare_op1 = operands[2];
+  ix86_expand_branch (GET_CODE (operands[0]), operands[3]);
+  DONE;
+})
 
-(define_expand "cmpti"
+(define_expand "cstoredi4"
   [(set (reg:CC FLAGS_REG)
-       (compare:CC (match_operand:TI 0 "nonimmediate_operand" "")
-                   (match_operand:TI 1 "x86_64_general_operand" "")))]
+       (compare:CC (match_operand:DI 2 "nonimmediate_operand" "")
+                   (match_operand:DI 3 "x86_64_general_operand" "")))
+   (set (match_operand:QI 0 "register_operand" "")
+              (match_operator 1 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)]))]
   "TARGET_64BIT"
 {
-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
-    operands[0] = force_reg (TImode, operands[0]);
-  ix86_compare_op0 = operands[0];
-  ix86_compare_op1 = operands[1];
+  if (MEM_P (operands[2]) && MEM_P (operands[3]))
+    operands[2] = force_reg (DImode, operands[2]);
+  ix86_compare_op0 = operands[2];
+  ix86_compare_op1 = operands[3];
+  ix86_expand_setcc (GET_CODE (operands[1]), operands[0]);
   DONE;
 })
 
-(define_expand "cmpdi"
+(define_expand "cbranchsi4"
   [(set (reg:CC FLAGS_REG)
-       (compare:CC (match_operand:DI 0 "nonimmediate_operand" "")
-                   (match_operand:DI 1 "x86_64_general_operand" "")))]
+       (compare:CC (match_operand:SI 1 "cmpsi_operand" "")
+                   (match_operand:SI 2 "general_operand" "")))
+   (set (pc) (if_then_else
+              (match_operator 0 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)])
+              (label_ref (match_operand 3 "" ""))
+              (pc)))]
   ""
 {
-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
-    operands[0] = force_reg (DImode, operands[0]);
-  ix86_compare_op0 = operands[0];
-  ix86_compare_op1 = operands[1];
+  if (MEM_P (operands[1]) && MEM_P (operands[2]))
+    operands[1] = force_reg (SImode, operands[1]);
+  ix86_compare_op0 = operands[1];
+  ix86_compare_op1 = operands[2];
+  ix86_expand_branch (GET_CODE (operands[0]), operands[3]);
   DONE;
 })
 
-(define_expand "cmpsi"
+(define_expand "cstoresi4"
   [(set (reg:CC FLAGS_REG)
-       (compare:CC (match_operand:SI 0 "cmpsi_operand" "")
-                   (match_operand:SI 1 "general_operand" "")))]
+       (compare:CC (match_operand:SI 2 "cmpsi_operand" "")
+                   (match_operand:SI 3 "general_operand" "")))
+   (set (match_operand:QI 0 "register_operand" "")
+              (match_operator 1 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)]))]
   ""
 {
-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
-    operands[0] = force_reg (SImode, operands[0]);
-  ix86_compare_op0 = operands[0];
-  ix86_compare_op1 = operands[1];
+  if (MEM_P (operands[2]) && MEM_P (operands[3]))
+    operands[2] = force_reg (SImode, operands[2]);
+  ix86_compare_op0 = operands[2];
+  ix86_compare_op1 = operands[3];
+  ix86_expand_setcc (GET_CODE (operands[1]), operands[0]);
   DONE;
 })
 
-(define_expand "cmphi"
+(define_expand "cbranchhi4"
   [(set (reg:CC FLAGS_REG)
-       (compare:CC (match_operand:HI 0 "nonimmediate_operand" "")
-                   (match_operand:HI 1 "general_operand" "")))]
+       (compare:CC (match_operand:HI 1 "nonimmediate_operand" "")
+                   (match_operand:HI 2 "general_operand" "")))
+   (set (pc) (if_then_else
+              (match_operator 0 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)])
+              (label_ref (match_operand 3 "" ""))
+              (pc)))]
   ""
 {
-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
-    operands[0] = force_reg (HImode, operands[0]);
-  ix86_compare_op0 = operands[0];
-  ix86_compare_op1 = operands[1];
+  if (MEM_P (operands[1]) && MEM_P (operands[2]))
+    operands[1] = force_reg (HImode, operands[1]);
+  ix86_compare_op0 = operands[1];
+  ix86_compare_op1 = operands[2];
+  ix86_expand_branch (GET_CODE (operands[0]), operands[3]);
   DONE;
 })
 
-(define_expand "cmpqi"
+(define_expand "cstorehi4"
   [(set (reg:CC FLAGS_REG)
-       (compare:CC (match_operand:QI 0 "nonimmediate_operand" "")
-                   (match_operand:QI 1 "general_operand" "")))]
-  "TARGET_QIMODE_MATH"
+       (compare:CC (match_operand:HI 2 "nonimmediate_operand" "")
+                   (match_operand:HI 3 "general_operand" "")))
+   (set (match_operand:QI 0 "register_operand" "")
+              (match_operator 1 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)]))]
+  ""
 {
-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
-    operands[0] = force_reg (QImode, operands[0]);
-  ix86_compare_op0 = operands[0];
-  ix86_compare_op1 = operands[1];
+  if (MEM_P (operands[2]) && MEM_P (operands[3]))
+    operands[2] = force_reg (HImode, operands[2]);
+  ix86_compare_op0 = operands[2];
+  ix86_compare_op1 = operands[3];
+  ix86_expand_setcc (GET_CODE (operands[1]), operands[0]);
   DONE;
 })
 
+
+(define_expand "cbranchqi4"
+  [(set (reg:CC FLAGS_REG)
+       (compare:CC (match_operand:QI 1 "nonimmediate_operand" "")
+                   (match_operand:QI 2 "general_operand" "")))
+   (set (pc) (if_then_else
+              (match_operator 0 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)])
+              (label_ref (match_operand 3 "" ""))
+              (pc)))]
+  ""
+{
+  if (MEM_P (operands[1]) && MEM_P (operands[2]))
+    operands[1] = force_reg (QImode, operands[1]);
+  ix86_compare_op0 = operands[1];
+  ix86_compare_op1 = operands[2];
+  ix86_expand_branch (GET_CODE (operands[0]), operands[3]);
+  DONE;
+})
+
+
+(define_expand "cstoreqi4"
+  [(set (reg:CC FLAGS_REG)
+       (compare:CC (match_operand:QI 2 "nonimmediate_operand" "")
+                   (match_operand:QI 3 "general_operand" "")))
+   (set (match_operand:QI 0 "register_operand" "")
+              (match_operator 1 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)]))]
+  ""
+{
+  if (MEM_P (operands[2]) && MEM_P (operands[3]))
+    operands[2] = force_reg (QImode, operands[2]);
+  ix86_compare_op0 = operands[2];
+  ix86_compare_op1 = operands[3];
+  ix86_expand_setcc (GET_CODE (operands[1]), operands[0]);
+  DONE;
+})
+
+
 (define_insn "cmpdi_ccno_1_rex64"
   [(set (reg FLAGS_REG)
        (compare (match_operand:DI 0 "nonimmediate_operand" "r,?mr")
 ;; which would allow mix and match FP modes on the compares.  Which is what
 ;; the old patterns did, but with many more of them.
 
-(define_expand "cmpxf"
+(define_expand "cbranchxf4"
+  [(set (reg:CC FLAGS_REG)
+       (compare:CC (match_operand:XF 1 "nonmemory_operand" "")
+                   (match_operand:XF 2 "nonmemory_operand" "")))
+   (set (pc) (if_then_else
+              (match_operator 0 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)])
+              (label_ref (match_operand 3 "" ""))
+              (pc)))]
+  "TARGET_80387"
+{
+  ix86_compare_op0 = operands[1];
+  ix86_compare_op1 = operands[2];
+  ix86_expand_branch (GET_CODE (operands[0]), operands[3]);
+  DONE;
+})
+
+(define_expand "cstorexf4"
   [(set (reg:CC FLAGS_REG)
-       (compare:CC (match_operand:XF 0 "nonmemory_operand" "")
-                   (match_operand:XF 1 "nonmemory_operand" "")))]
+       (compare:CC (match_operand:XF 2 "nonmemory_operand" "")
+                   (match_operand:XF 3 "nonmemory_operand" "")))
+   (set (match_operand:QI 0 "register_operand" "")
+              (match_operator 1 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)]))]
   "TARGET_80387"
 {
-  ix86_compare_op0 = operands[0];
-  ix86_compare_op1 = operands[1];
+  ix86_compare_op0 = operands[2];
+  ix86_compare_op1 = operands[3];
+  ix86_expand_setcc (GET_CODE (operands[1]), operands[0]);
   DONE;
 })
 
-(define_expand "cmp<mode>"
+(define_expand "cbranch<mode>4"
   [(set (reg:CC FLAGS_REG)
-       (compare:CC (match_operand:MODEF 0 "cmp_fp_expander_operand" "")
-                   (match_operand:MODEF 1 "cmp_fp_expander_operand" "")))]
+       (compare:CC (match_operand:MODEF 1 "cmp_fp_expander_operand" "")
+                   (match_operand:MODEF 2 "cmp_fp_expander_operand" "")))
+   (set (pc) (if_then_else
+              (match_operator 0 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)])
+              (label_ref (match_operand 3 "" ""))
+              (pc)))]
   "TARGET_80387 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
 {
-  ix86_compare_op0 = operands[0];
-  ix86_compare_op1 = operands[1];
+  ix86_compare_op0 = operands[1];
+  ix86_compare_op1 = operands[2];
+  ix86_expand_branch (GET_CODE (operands[0]), operands[3]);
   DONE;
 })
 
-(define_expand "cmpcc"
+(define_expand "cstore<mode>4"
   [(set (reg:CC FLAGS_REG)
-        (compare:CC (match_operand 0 "flags_reg_operand" "")
-                    (match_operand 1 "general_operand" "")))]
+       (compare:CC (match_operand:MODEF 2 "cmp_fp_expander_operand" "")
+                   (match_operand:MODEF 3 "cmp_fp_expander_operand" "")))
+   (set (match_operand:QI 0 "register_operand" "")
+              (match_operator 1 "comparison_operator"
+               [(reg:CC FLAGS_REG)
+                (const_int 0)]))]
+  "TARGET_80387 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
+{
+  ix86_compare_op0 = operands[2];
+  ix86_compare_op1 = operands[3];
+  ix86_expand_setcc (GET_CODE (operands[1]), operands[0]);
+  DONE;
+})
+
+(define_expand "cbranchcc4"
+  [(set (pc) (if_then_else
+              (match_operator 0 "comparison_operator"
+               [(match_operand 1 "flags_reg_operand" "")
+                (match_operand 2 "const0_operand" "")])
+              (label_ref (match_operand 3 "" ""))
+              (pc)))]
+  ""
+{
+  ix86_compare_op0 = operands[1];
+  ix86_compare_op1 = operands[2];
+  ix86_expand_branch (GET_CODE (operands[0]), operands[3]);
+  DONE;
+})
+
+(define_expand "cstorecc4"
+  [(set (match_operand:QI 0 "register_operand" "")
+              (match_operator 1 "comparison_operator"
+               [(match_operand 2 "flags_reg_operand" "")
+                (match_operand 3 "const0_operand" "")]))]
   ""
 {
-  ix86_compare_op0 = operands[0];
-  ix86_compare_op1 = operands[1];
+  ix86_compare_op0 = operands[2];
+  ix86_compare_op1 = operands[3];
+  ix86_expand_setcc (GET_CODE (operands[1]), operands[0]);
   DONE;
 })
 
+
 ;; FP compares, step 1:
 ;; Set the FP condition codes.
 ;;
     ;
   else
     {
-      int slot = virtuals_instantiated ? SLOT_TEMP : SLOT_VIRTUAL;
+      enum ix86_stack_slot slot = (virtuals_instantiated
+                                  ? SLOT_TEMP
+                                  : SLOT_VIRTUAL);
       rtx temp = assign_386_stack_local (SFmode, slot);
       emit_insn (gen_truncdfsf2_with_temp (operands[0], operands[1], temp));
       DONE;
     }
   else
     {
-      int slot = virtuals_instantiated ? SLOT_TEMP : SLOT_VIRTUAL;
+     enum ix86_stack_slot slot = (virtuals_instantiated
+                                 ? SLOT_TEMP
+                                 : SLOT_VIRTUAL);
       operands[2] = assign_386_stack_local (<MODE>mode, slot);
     }
 })
   "TARGET_80387
    && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
        || TARGET_MIX_SSE_I387)"
-  "fild%z1\t%1"
+  "fild%Z1\t%1"
   [(set_attr "type" "fmov")
    (set_attr "mode" "<MODE>")
    (set_attr "fp_int_src" "true")])
   "TARGET_SSE2 && TARGET_MIX_SSE_I387
    && TARGET_USE_VECTOR_CONVERTS && optimize_function_for_speed_p (cfun)"
   "@
-   fild%z1\t%1
+   fild%Z1\t%1
    #"
   [(set_attr "type" "fmov,sseicvt")
    (set_attr "mode" "<MODE>,<ssevecmode>")
    && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_MIX_SSE_I387
    && (TARGET_INTER_UNIT_CONVERSIONS || optimize_function_for_size_p (cfun))"
   "@
-   fild%z1\t%1
+   fild%Z1\t%1
    %vcvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %d0|%d0, %1}
    %vcvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "fmov,sseicvt,sseicvt")
    && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_MIX_SSE_I387
    && !(TARGET_INTER_UNIT_CONVERSIONS || optimize_function_for_size_p (cfun))"
   "@
-   fild%z1\t%1
+   fild%Z1\t%1
    %vcvtsi2s<MODEF:ssemodefsuffix><SSEMODEI24:rex64suffix>\t{%1, %d0|%d0, %1}"
   [(set_attr "type" "fmov,sseicvt")
    (set_attr "prefix" "orig,maybe_vex")
   "TARGET_80387
    && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, <SSEMODEI24:MODE>mode)"
   "@
-   fild%z1\t%1
+   fild%Z1\t%1
    #"
   [(set_attr "type" "fmov,multi")
    (set_attr "mode" "<X87MODEF:MODE>")
          (match_operand:SSEMODEI24 1 "memory_operand" "m")))]
   "TARGET_80387
    && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, <SSEMODEI24:MODE>mode)"
-  "fild%z1\t%1"
+  "fild%Z1\t%1"
   [(set_attr "type" "fmov")
    (set_attr "mode" "<X87MODEF:MODE>")
    (set_attr "fp_int_src" "true")])
     }
   else
     {
-      int slot = virtuals_instantiated ? SLOT_TEMP : SLOT_VIRTUAL;
+      enum ix86_stack_slot slot = (virtuals_instantiated
+                                  ? SLOT_TEMP
+                                  : SLOT_VIRTUAL);
       operands[2] = assign_386_stack_local (DImode, slot);
     }
 })
 ;; to avoid partial register stalls.  Otherwise do things the setcc+movzx
 ;; way, which can later delete the movzx if only QImode is needed.
 
-(define_expand "s<code>"
-  [(set (match_operand:QI 0 "register_operand" "")
-        (int_cond:QI (reg:CC FLAGS_REG) (const_int 0)))]
-  ""
-  "if (ix86_expand_setcc (<CODE>, operands[0])) DONE; else FAIL;")
-
-(define_expand "s<code>"
-  [(set (match_operand:QI 0 "register_operand" "")
-        (fp_cond:QI (reg:CC FLAGS_REG) (const_int 0)))]
-  "TARGET_80387 || TARGET_SSE"
-  "if (ix86_expand_setcc (<CODE>, operands[0])) DONE; else FAIL;")
-
 (define_insn "*setcc_1"
   [(set (match_operand:QI 0 "nonimmediate_operand" "=qm")
        (match_operator:QI 1 "ix86_comparison_operator"
 ;; Basic conditional jump instructions.
 ;; We ignore the overflow flag for signed branch instructions.
 
-;; For all bCOND expanders, also expand the compare or test insn that
-;; generates reg FLAGS_REG.  Generate an equality comparison if `beq' or `bne'.
-
-(define_expand "b<code>"
-  [(set (pc)
-       (if_then_else (int_cond:CC (reg:CC FLAGS_REG)
-                                  (const_int 0))
-                     (label_ref (match_operand 0 ""))
-                     (pc)))]
-  ""
-  "ix86_expand_branch (<CODE>, operands[0]); DONE;")
-
-(define_expand "b<code>"
-  [(set (pc)
-       (if_then_else (fp_cond:CC (reg:CC FLAGS_REG)
-                                 (const_int 0))
-                     (label_ref (match_operand 0 ""))
-                     (pc)))]
-  "TARGET_80387 || TARGET_SSE_MATH"
-  "ix86_expand_branch (<CODE>, operands[0]); DONE;")
-
 (define_insn "*jcc_1"
   [(set (pc)
        (if_then_else (match_operator 1 "ix86_comparison_operator"
    (set_attr "length_immediate" "0")
    (set_attr "modrm" "0")])
 
-;; Align to 16-byte boundary, max skip in op0.  Used to avoid
+;; Pad to 16-byte boundary, max skip in op0.  Used to avoid
 ;; branch prediction penalty for the third jump in a 16-byte
 ;; block on K8.
 
-(define_insn "align"
+(define_insn "pad"
   [(unspec_volatile [(match_operand 0 "" "")] UNSPECV_ALIGN)]
   ""
 {
-#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
-  ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file, 4, (int)INTVAL (operands[0]));
+#ifdef ASM_OUTPUT_MAX_SKIP_PAD
+  ASM_OUTPUT_MAX_SKIP_PAD (asm_out_file, 4, (int)INTVAL (operands[0]));
 #else
   /* It is tempting to use ASM_OUTPUT_ALIGN here, but we don't want to do that.
      The align insn is used to avoid 3 jump instructions in the row to improve
     emit_insn (gen_fxam<mode>2_i387_with_temp (scratch, operands[1]));
   else
     {
-      int slot = virtuals_instantiated ? SLOT_TEMP : SLOT_VIRTUAL;
+      enum ix86_stack_slot slot = (virtuals_instantiated
+                                  ? SLOT_TEMP
+                                  : SLOT_VIRTUAL);
       rtx temp = assign_386_stack_local (<MODE>mode, slot);
 
       emit_move_insn (temp, operands[1]);
        (match_operator 1 "compare_operator"
          [(match_operand 2 "register_operand" "")
           (match_operand 3 "const_int_operand" "")]))]
-  "(((!TARGET_FUSE_CMP_AND_BRANCH || optimize_size)
+  "(((!TARGET_FUSE_CMP_AND_BRANCH || optimize_insn_for_size_p ())
      && incdec_operand (operands[3], GET_MODE (operands[3])))
     || (!TARGET_FUSE_CMP_AND_BRANCH
        && INTVAL (operands[3]) == 128))
     emit_insn (gen_stack_protect_test_si (flags, operands[0], operands[1]));
 #endif
 
-  ix86_compare_op0 = flags;
-  ix86_compare_op1 = const0_rtx;
-  emit_jump_insn (gen_beq (operands[2]));
+  emit_jump_insn (gen_cbranchcc4 (gen_rtx_EQ (VOIDmode, flags, const0_rtx),
+                                 flags, const0_rtx, operands[2]));
   DONE;
 })