patches/gcc/4.3.0/170-x86-emit-cld.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Jan 12 19:24:03 2010 +0100 (2010-01-12)
changeset 1761 88020b2c3246
parent 746 b150d6f590fc
permissions -rw-r--r--
scripts/functions: change handling of nochdir

- 'nochdir' must be the first option
- have systematic pushd/popd, even if nochdir
     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")