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")
|