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