From: Paweł Sikora Date: Mon, 10 Mar 2008 12:05:36 +0000 (+0000) Subject: - support -mcld option (generate cld instruction in fn. prologue). X-Git-Tag: auto/th/gcc-4_3_1-1~29 X-Git-Url: http://git.pld-linux.org/?a=commitdiff_plain;h=6068e7992c0da162620d382d8332a7c39fde8312;p=packages%2Fgcc.git - support -mcld option (generate cld instruction in fn. prologue). Changed files: gcc-explicit_cld.patch -> 1.1 --- diff --git a/gcc-explicit_cld.patch b/gcc-explicit_cld.patch new file mode 100644 index 0000000..7d3a25c --- /dev/null +++ b/gcc-explicit_cld.patch @@ -0,0 +1,175 @@ +This patch adds back generation of cld instructions when stringops are +used in the function. cld insn is emitted as unspec volatile at the +end of function prologue. Currently, patched gcc emits cld when +"-mcld" is added to compile flags. + +2008-03-06 Uros Bizjak + + * config/i386/i386.h (TARGET_CLD): New define. + (struct machine_function): Add needs_cld field. + (ix86_current_function_needs_cld): New define. + * config/i386/i386.md (UNSPEC_CLD): New unspec volatile constant. + ("cld"): New isns pattern. + ("strmov_singleop"): Set ix86_current_function_needs_cld flag. + ("rep_mov"): Ditto. + ("strset_singleop"): Ditto. + ("rep_stos"): Ditto. + ("cmpstrnqi_nz_1"): Ditto. + ("cmpstrnqi_1"): Ditto. + ("strlenqi_1"): Ditto. + * config/i386/i386.opt (mcld): New option. + * config/i386/i386.c (ix86_expand_prologue): Emit cld insn for + TARGET_CLD when ix86_current_function_needs_cld is set. + +Index: gcc/config/i386/i386.h +=================================================================== +--- gcc/config/i386/i386.h (revision 132966) ++++ gcc/config/i386/i386.h (working copy) +@@ -388,6 +388,7 @@ extern unsigned int ix86_arch_features[X + + extern int x86_prefetch_sse; + ++#define TARGET_CLD x86_cld + #define TARGET_ABM x86_abm + #define TARGET_CMPXCHG16B x86_cmpxchg16b + #define TARGET_POPCNT x86_popcnt +@@ -2446,8 +2447,9 @@ struct machine_function GTY(()) + int save_varrargs_registers; + int accesses_prev_frame; + int optimize_mode_switching[MAX_386_ENTITIES]; +- /* Set by ix86_compute_frame_layout and used by prologue/epilogue expander to +- determine the style used. */ ++ int needs_cld; ++ /* Set by ix86_compute_frame_layout and used by prologue/epilogue ++ expander to determine the style used. */ + int use_fast_prologue_epilogue; + /* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE has been computed + for. */ +@@ -2467,6 +2469,7 @@ struct machine_function GTY(()) + #define ix86_stack_locals (cfun->machine->stack_locals) + #define ix86_save_varrargs_registers (cfun->machine->save_varrargs_registers) + #define ix86_optimize_mode_switching (cfun->machine->optimize_mode_switching) ++#define ix86_current_function_needs_cld (cfun->machine->needs_cld) + #define ix86_tls_descriptor_calls_expanded_in_cfun \ + (cfun->machine->tls_descriptor_call_expanded_p) + /* Since tls_descriptor_call_expanded is not cleared, even if all TLS +Index: gcc/config/i386/i386.md +=================================================================== +--- gcc/config/i386/i386.md (revision 132966) ++++ gcc/config/i386/i386.md (working copy) +@@ -205,6 +205,7 @@ + (UNSPECV_XCHG 12) + (UNSPECV_LOCK 13) + (UNSPECV_PROLOGUE_USE 14) ++ (UNSPECV_CLD 15) + ]) + + ;; Constants to represent pcomtrue/pcomfalse variants +@@ -18519,6 +18520,14 @@ + + ;; Block operation instructions + ++(define_insn "cld" ++ [(unspec_volatile [(const_int 0)] UNSPECV_CLD)] ++ "" ++ "cld" ++ [(set_attr "length" "1") ++ (set_attr "length_immediate" "0") ++ (set_attr "modrm" "0")]) ++ + (define_expand "movmemsi" + [(use (match_operand:BLK 0 "memory_operand" "")) + (use (match_operand:BLK 1 "memory_operand" "")) +@@ -18591,7 +18600,7 @@ + (set (match_operand 2 "register_operand" "") + (match_operand 5 "" ""))])] + "TARGET_SINGLE_STRINGOP || optimize_size" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*strmovdi_rex_1" + [(set (mem:DI (match_operand:DI 2 "register_operand" "0")) +@@ -18708,7 +18717,7 @@ + (match_operand 3 "memory_operand" "")) + (use (match_dup 4))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*rep_movdi_rex64" + [(set (match_operand:DI 2 "register_operand" "=c") (const_int 0)) +@@ -18868,7 +18877,7 @@ + (set (match_operand 0 "register_operand" "") + (match_operand 3 "" ""))])] + "TARGET_SINGLE_STRINGOP || optimize_size" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*strsetdi_rex_1" + [(set (mem:DI (match_operand:DI 1 "register_operand" "0")) +@@ -18962,7 +18971,7 @@ + (use (match_operand 3 "register_operand" "")) + (use (match_dup 1))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*rep_stosdi_rex64" + [(set (match_operand:DI 1 "register_operand" "=c") (const_int 0)) +@@ -19138,7 +19147,7 @@ + (clobber (match_operand 1 "register_operand" "")) + (clobber (match_dup 2))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*cmpstrnqi_nz_1" + [(set (reg:CC FLAGS_REG) +@@ -19185,7 +19194,7 @@ + (clobber (match_operand 1 "register_operand" "")) + (clobber (match_dup 2))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*cmpstrnqi_1" + [(set (reg:CC FLAGS_REG) +@@ -19254,7 +19263,7 @@ + (clobber (match_operand 1 "register_operand" "")) + (clobber (reg:CC FLAGS_REG))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*strlenqi_1" + [(set (match_operand:SI 0 "register_operand" "=&c") +Index: gcc/config/i386/i386.opt +=================================================================== +--- gcc/config/i386/i386.opt (revision 132966) ++++ gcc/config/i386/i386.opt (working copy) +@@ -250,6 +250,10 @@ Support SSE5 built-in functions and code + + ;; Instruction support + ++mcld ++Target Report RejectNegative Var(x86_cld) ++Generate cld instruction in the function prologue. ++ + mabm + Target Report RejectNegative Var(x86_abm) + Support code generation of Advanced Bit Manipulation (ABM) instructions. +Index: gcc/config/i386/i386.c +=================================================================== +--- gcc/config/i386/i386.c (revision 132966) ++++ gcc/config/i386/i386.c (working copy) +@@ -6498,6 +6498,10 @@ ix86_expand_prologue (void) + emit_insn (gen_prologue_use (pic_offset_table_rtx)); + emit_insn (gen_blockage ()); + } ++ ++ /* Emit cld instruction if stringops are used in the function. */ ++ if (TARGET_CLD && ix86_current_function_needs_cld) ++ emit_insn (gen_cld ()); + } + + /* Emit code to restore saved registers using MOV insns. First register