patches/gcc/4.3.0/170-x86-emit-cld.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Jan 13 20:46:01 2010 +0100 (2010-01-13)
changeset 1732 6b2ae7804c6f
parent 746 b150d6f590fc
permissions -rw-r--r--
debug/gdb: staticaly link to ncurses for the native gdb

Staticaly link the native gdb (the one that runs on the target,
not the cross one that runs on the host) to ncurses.
     1 Original patch from gentoo: gentoo/src/patchsets/gcc/4.3.0/gentoo/20_all_gcc-x86-emit-cld.patch
     2 bandaid for the cld issue.  to be dropped when gcc-4.3 goes stable.
     3 
     4 http://gcc.gnu.org/ml/gcc-patches/2008-03/msg00417.html
     5 
     6 2008-03-06  Uros Bizjak  <ubizjak@gmail.com>
     7 
     8 	* config/i386/i386.h (TARGET_CLD): New define.
     9 	(struct machine_function): Add needs_cld field.
    10 	(ix86_current_function_needs_cld): New define.
    11 	* config/i386/i386.md (UNSPEC_CLD): New unspec volatile constant.
    12 	("cld"): New isns pattern.
    13 	("strmov_singleop"): Set ix86_current_function_needs_cld flag.
    14 	("rep_mov"): Ditto.
    15 	("strset_singleop"): Ditto.
    16 	("rep_stos"): Ditto.
    17 	("cmpstrnqi_nz_1"): Ditto.
    18 	("cmpstrnqi_1"): Ditto.
    19 	("strlenqi_1"): Ditto.
    20 	* config/i386/i386.c (ix86_expand_prologue): Emit cld insn for
    21 	TARGET_CLD when ix86_current_function_needs_cld is set.
    22 
    23 diff -durN gcc-4.3.0.orig/gcc/config/i386/i386.c gcc-4.3.0/gcc/config/i386/i386.c
    24 --- gcc-4.3.0.orig/gcc/config/i386/i386.c	2008-02-21 13:30:00.000000000 +0100
    25 +++ gcc-4.3.0/gcc/config/i386/i386.c	2008-06-10 14:44:37.000000000 +0200
    26 @@ -6448,6 +6448,10 @@
    27  	emit_insn (gen_prologue_use (pic_offset_table_rtx));
    28        emit_insn (gen_blockage ());
    29      }
    30 +
    31 +  /* Emit cld instruction if stringops are used in the function.  */
    32 +  if (TARGET_CLD && ix86_current_function_needs_cld)
    33 +    emit_insn (gen_cld ());
    34  }
    35  
    36  /* Emit code to restore saved registers using MOV insns.  First register
    37 diff -durN gcc-4.3.0.orig/gcc/config/i386/i386.h gcc-4.3.0/gcc/config/i386/i386.h
    38 --- gcc-4.3.0.orig/gcc/config/i386/i386.h	2008-02-15 09:12:02.000000000 +0100
    39 +++ gcc-4.3.0/gcc/config/i386/i386.h	2008-06-10 14:44:37.000000000 +0200
    40 @@ -388,6 +388,7 @@
    41  
    42  extern int x86_prefetch_sse;
    43  
    44 +#define TARGET_CLD		1
    45  #define TARGET_ABM		x86_abm
    46  #define TARGET_CMPXCHG16B	x86_cmpxchg16b
    47  #define TARGET_POPCNT		x86_popcnt
    48 @@ -2443,8 +2444,9 @@
    49    int save_varrargs_registers;
    50    int accesses_prev_frame;
    51    int optimize_mode_switching[MAX_386_ENTITIES];
    52 -  /* Set by ix86_compute_frame_layout and used by prologue/epilogue expander to
    53 -     determine the style used.  */
    54 +  int needs_cld;
    55 +  /* Set by ix86_compute_frame_layout and used by prologue/epilogue
    56 +     expander to determine the style used.  */
    57    int use_fast_prologue_epilogue;
    58    /* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE has been computed
    59       for.  */
    60 @@ -2464,6 +2466,7 @@
    61  #define ix86_stack_locals (cfun->machine->stack_locals)
    62  #define ix86_save_varrargs_registers (cfun->machine->save_varrargs_registers)
    63  #define ix86_optimize_mode_switching (cfun->machine->optimize_mode_switching)
    64 +#define ix86_current_function_needs_cld (cfun->machine->needs_cld)
    65  #define ix86_tls_descriptor_calls_expanded_in_cfun \
    66    (cfun->machine->tls_descriptor_call_expanded_p)
    67  /* Since tls_descriptor_call_expanded is not cleared, even if all TLS
    68 diff -durN gcc-4.3.0.orig/gcc/config/i386/i386.md gcc-4.3.0/gcc/config/i386/i386.md
    69 --- gcc-4.3.0.orig/gcc/config/i386/i386.md	2008-02-06 12:34:00.000000000 +0100
    70 +++ gcc-4.3.0/gcc/config/i386/i386.md	2008-06-10 14:44:37.000000000 +0200
    71 @@ -205,6 +205,7 @@
    72     (UNSPECV_XCHG		12)
    73     (UNSPECV_LOCK		13)
    74     (UNSPECV_PROLOGUE_USE	14)
    75 +   (UNSPECV_CLD			15)
    76    ])
    77  
    78  ;; Constants to represent pcomtrue/pcomfalse variants
    79 @@ -18529,6 +18530,14 @@
    80  
    81  ;; Block operation instructions
    82  
    83 +(define_insn "cld"
    84 +  [(unspec_volatile [(const_int 0)] UNSPECV_CLD)]
    85 +  ""
    86 +  "cld"
    87 +  [(set_attr "length" "1")
    88 +   (set_attr "length_immediate" "0")
    89 +   (set_attr "modrm" "0")])
    90 +
    91  (define_expand "movmemsi"
    92    [(use (match_operand:BLK 0 "memory_operand" ""))
    93     (use (match_operand:BLK 1 "memory_operand" ""))
    94 @@ -18601,7 +18610,7 @@
    95  	      (set (match_operand 2 "register_operand" "")
    96  		   (match_operand 5 "" ""))])]
    97    "TARGET_SINGLE_STRINGOP || optimize_size"
    98 -  "")
    99 +  "ix86_current_function_needs_cld = 1;")
   100  
   101  (define_insn "*strmovdi_rex_1"
   102    [(set (mem:DI (match_operand:DI 2 "register_operand" "0"))
   103 @@ -18718,7 +18727,7 @@
   104  		   (match_operand 3 "memory_operand" ""))
   105  	      (use (match_dup 4))])]
   106    ""
   107 -  "")
   108 +  "ix86_current_function_needs_cld = 1;")
   109  
   110  (define_insn "*rep_movdi_rex64"
   111    [(set (match_operand:DI 2 "register_operand" "=c") (const_int 0))
   112 @@ -18878,7 +18887,7 @@
   113  	      (set (match_operand 0 "register_operand" "")
   114  		   (match_operand 3 "" ""))])]
   115    "TARGET_SINGLE_STRINGOP || optimize_size"
   116 -  "")
   117 +  "ix86_current_function_needs_cld = 1;")
   118  
   119  (define_insn "*strsetdi_rex_1"
   120    [(set (mem:DI (match_operand:DI 1 "register_operand" "0"))
   121 @@ -18972,7 +18981,7 @@
   122  	      (use (match_operand 3 "register_operand" ""))
   123  	      (use (match_dup 1))])]
   124    ""
   125 -  "")
   126 +  "ix86_current_function_needs_cld = 1;")
   127  
   128  (define_insn "*rep_stosdi_rex64"
   129    [(set (match_operand:DI 1 "register_operand" "=c") (const_int 0))
   130 @@ -19148,7 +19157,7 @@
   131  	      (clobber (match_operand 1 "register_operand" ""))
   132  	      (clobber (match_dup 2))])]
   133    ""
   134 -  "")
   135 +  "ix86_current_function_needs_cld = 1;")
   136  
   137  (define_insn "*cmpstrnqi_nz_1"
   138    [(set (reg:CC FLAGS_REG)
   139 @@ -19195,7 +19204,7 @@
   140  	      (clobber (match_operand 1 "register_operand" ""))
   141  	      (clobber (match_dup 2))])]
   142    ""
   143 -  "")
   144 +  "ix86_current_function_needs_cld = 1;")
   145  
   146  (define_insn "*cmpstrnqi_1"
   147    [(set (reg:CC FLAGS_REG)
   148 @@ -19264,7 +19273,7 @@
   149  	      (clobber (match_operand 1 "register_operand" ""))
   150  	      (clobber (reg:CC FLAGS_REG))])]
   151    ""
   152 -  "")
   153 +  "ix86_current_function_needs_cld = 1;")
   154  
   155  (define_insn "*strlenqi_1"
   156    [(set (match_operand:SI 0 "register_operand" "=&c")