patches/gcc/4.3.0/275-x86-emit-cld.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Jul 28 21:08:01 2008 +0000 (2008-07-28)
changeset 746 b150d6f590fc
parent 552 patches/gcc/4.3.0/275-gcc-x86-emit-cld.patch@4edbcdb17e3d
permissions -rw-r--r--
Third go at renaming patches to contain neither the package name nor the package version.
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")