diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-02-25 01:28:23 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-02-25 01:28:23 +0000 |
commit | 0b9fb855e0a1057589cfb9d30b1587b9ead455b8 (patch) | |
tree | 2b0b275b06929f00674510261f56680efde60513 /gcc/config/i386 | |
parent | 8b44d4fe1d96686dea199854a6ddc25281645b86 (diff) | |
download | gcc-0b9fb855e0a1057589cfb9d30b1587b9ead455b8.tar.gz |
* config/i386/i386.c (ix86_set_move_mem_attrs): New function.
(ix86_set_move_mem_attrs_1): Likewise.
* config/i386/i386-protos.h (ix86_set_move_mem_attrs): New declaration.
* config/i386/i386.md (movstrsi): Call it.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40046 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/i386')
-rw-r--r-- | gcc/config/i386/i386-protos.h | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 47 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 13 |
3 files changed, 62 insertions, 4 deletions
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 72ea6d99eaa..1b24df82124 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -1,6 +1,6 @@ /* Definitions of target machine for GNU compiler for IA-32. - Copyright (C) 1988, 1992, 1994, 1995, 1996, 1996, 1997, 1998, 1999, 2000 - Free Software Foundation, Inc. + Copyright (C) 1988, 1992, 1994, 1995, 1996, 1996, 1997, 1998, 1999, + 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. @@ -152,6 +152,8 @@ extern rtx ix86_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int)) #endif +extern void ix86_set_move_mem_attrs PARAMS ((rtx, rtx, rtx, rtx, rtx)); + #ifdef TREE_CODE extern int ix86_valid_decl_attribute_p PARAMS ((tree, tree, tree, tree)); extern int ix86_valid_type_attribute_p PARAMS ((tree, tree, tree, tree)); diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index e90cc0da6c1..32ae6d4984a 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -507,6 +507,7 @@ static int ix86_nsaved_regs PARAMS((void)); static void ix86_emit_save_regs PARAMS((void)); static void ix86_emit_restore_regs_using_mov PARAMS ((rtx, int)); static void ix86_emit_epilogue_esp_adjustment PARAMS((int)); +static void ix86_set_move_mem_attrs_1 PARAMS ((rtx, rtx, rtx, rtx, rtx)); static void ix86_sched_reorder_pentium PARAMS((rtx *, rtx *)); static void ix86_sched_reorder_ppro PARAMS((rtx *, rtx *)); static HOST_WIDE_INT ix86_GOT_alias_set PARAMS ((void)); @@ -7363,6 +7364,52 @@ ix86_variable_issue (dump, sched_verbose, insn, can_issue_more) } } +/* Walk through INSNS and look for MEM references whose address is DSTREG or + SRCREG and set the memory attribute to those of DSTREF and SRCREF, as + appropriate. */ + +void +ix86_set_move_mem_attrs (insns, dstref, srcref, dstreg, srcreg) + rtx insns; + rtx dstref, srcref, dstreg, srcreg; +{ + rtx insn; + + for (insn = insns; insn != 0 ; insn = NEXT_INSN (insn)) + if (INSN_P (insn)) + ix86_set_move_mem_attrs_1 (PATTERN (insn), dstref, srcref, + dstreg, srcreg); +} + +/* Subroutine of above to actually do the updating by recursively walking + the rtx. */ + +static void +ix86_set_move_mem_attrs_1 (x, dstref, srcref, dstreg, srcreg) + rtx x; + rtx dstref, srcref, dstreg, srcreg; +{ + enum rtx_code code = GET_CODE (x); + const char *format_ptr = GET_RTX_FORMAT (code); + int i, j; + + if (code == MEM && XEXP (x, 0) == dstreg) + MEM_COPY_ATTRIBUTES (x, dstref); + else if (code == MEM && XEXP (x, 0) == srcreg) + MEM_COPY_ATTRIBUTES (x, srcref); + + for (i = 0; i < GET_RTX_LENGTH (code); i++, format_ptr++) + { + if (*format_ptr == 'e') + ix86_set_move_mem_attrs_1 (XEXP (x, i), dstref, srcref, + dstreg, srcreg); + else if (*format_ptr == 'E') + for (j = XVECLEN (x, i) - 1; j >= 0; j--) + ix86_set_move_mem_attrs_1 (XVECEXP (x, i, j), dstref, srcreg, + dstreg, srcreg); + } +} + /* Compute the alignment given to a constant that is being placed in memory. EXP is the constant and ALIGN is the alignment that the object would ordinarily have. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 350af1cedbd..2fad7e137b4 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -1,5 +1,5 @@ ;; GCC machine description for IA-32. -;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 ;; Free Software Foundation, Inc. ;; Mostly by William Schelter. ;; @@ -11122,6 +11122,9 @@ rtx srcreg, destreg, countreg; int align = 0; int count = -1; + rtx insns; + + start_sequence (); if (GET_CODE (operands[3]) == CONST_INT) align = INTVAL (operands[3]); @@ -11136,7 +11139,7 @@ destreg = copy_to_mode_reg (Pmode, XEXP (operands[0], 0)); srcreg = copy_to_mode_reg (Pmode, XEXP (operands[1], 0)); - emit_insn (gen_cld()); + emit_insn (gen_cld ()); /* When optimizing for size emit simple rep ; movsb instruction for counts not divisible by 4. */ @@ -11288,6 +11291,12 @@ LABEL_NUSES (label) = 1; } } + + insns = get_insns (); + end_sequence (); + + ix86_set_move_mem_attrs (insns, operands[0], operands[1], destreg, srcreg); + emit_insns (insns); DONE; }") |