patches/gcc/4.3.0/170-x86-emit-cld.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Sep 04 17:27:16 2009 +0200 (2009-09-04)
changeset 1512 439a6b292917
parent 746 b150d6f590fc
permissions -rw-r--r--
TODO: update

Add TODO list for m4, autoconf, automake and libtool.
Building our own versions would remove burden from the users
who have older versions on their distributions, and are not
ready/able/allowed to upgrade.
     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")