A small layout enhancement in the Linux kernel build script.
/trunk/scripts/build/kernel/linux.sh | 3 2 1 0 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
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.
4 http://gcc.gnu.org/ml/gcc-patches/2008-03/msg00417.html
6 2008-03-06 Uros Bizjak <ubizjak@gmail.com>
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.
15 ("strset_singleop"): 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.
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 ());
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 ());
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
42 extern int x86_prefetch_sse;
45 #define TARGET_ABM x86_abm
46 #define TARGET_CMPXCHG16B x86_cmpxchg16b
47 #define TARGET_POPCNT x86_popcnt
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. */
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
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
74 (UNSPECV_PROLOGUE_USE 14)
78 ;; Constants to represent pcomtrue/pcomfalse variants
79 @@ -18529,6 +18530,14 @@
81 ;; Block operation instructions
84 + [(unspec_volatile [(const_int 0)] UNSPECV_CLD)]
87 + [(set_attr "length" "1")
88 + (set_attr "length_immediate" "0")
89 + (set_attr "modrm" "0")])
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"
99 + "ix86_current_function_needs_cld = 1;")
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))])]
108 + "ix86_current_function_needs_cld = 1;")
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"
117 + "ix86_current_function_needs_cld = 1;")
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))])]
126 + "ix86_current_function_needs_cld = 1;")
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))])]
135 + "ix86_current_function_needs_cld = 1;")
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))])]
144 + "ix86_current_function_needs_cld = 1;")
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))])]
153 + "ix86_current_function_needs_cld = 1;")
155 (define_insn "*strlenqi_1"
156 [(set (match_operand:SI 0 "register_operand" "=&c")