diff options
author | Richard Sandiford <rsandifo@nildram.co.uk> | 2007-12-19 09:54:24 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2007-12-19 09:54:24 +0000 |
commit | 38ae7651154a39bdeb2638762fa70c042e3d24b6 (patch) | |
tree | 04d822382e376ca18a5a67555814561e947a2f3c /gcc/final.c | |
parent | 43779dea9bb2f3cfbb680330d8324a486c450565 (diff) | |
download | gcc-38ae7651154a39bdeb2638762fa70c042e3d24b6.zip gcc-38ae7651154a39bdeb2638762fa70c042e3d24b6.tar.gz gcc-38ae7651154a39bdeb2638762fa70c042e3d24b6.tar.bz2 |
rtl.def (SUBREG): Update comments.
gcc/
* rtl.def (SUBREG): Update comments.
* rtl.h (reg_attrs): Be explicit about the type of offset used.
(set_reg_attrs_from_mem): Rename to...
(set_reg_attrs_from_value): ...this.
(adjust_reg_mode, byte_lowpart_offset): Declare.
* emit-rtl.c (byte_lowpart_offset): New function.
(update_reg_offset): Remove special offset handling for big-endian
targets.
(gen_rtx_REG_offset, gen_reg_rtx_offset): Explicitly say that the
offset parameter is added to REG_OFFSET.
(adjust_reg_mode): New function.
(set_reg_attrs_for_mem): Rename to...
(set_reg_attrs_for_value): ...this and generalize to all values.
If the register is a lowpart of the value, adjust the offset
accordingly.
(set_reg_attrs_for_parm): Update after the above renaming.
(set_reg_attrs_for_decl_rtl): New function, split out from
set_decl_incoming_rtl. Set the offset of plain REGs to the
offset of the REG's mode from the decl's. Assert that all
subregs are lowparts and handle their inner registers in the
same way as plain REGs.
(set_decl_rtl, set_incoming_decl_rtl): Use reg_attrs_for_decl_rtl.
(subreg_lowpart_offset): Explicitly say that the returned offset
is a SUBREG_BYTE.
* combine.c (do_SUBST_MODE, try_combine, undo_all): Use adjust_reg_mode
instead of PUT_MODE.
* final.c (alter_subreg): Fix/update argument to gen_rtx_REG_offset.
* config/ia64/ia64.c (ia64_expand_load_address): Likewise.
* regclass.c (reg_scan_mark_refs): Use set_reg_attrs_from_value.
* reload.c (find_reloads_subreg_address): Call set_mem_offset
when offseting a MEM.
* var-tracking.c (offset_valid_for_tracked_p): Delete.
(mode_for_reg_attrs): Replace with...
(track_loc_p): ...this new function. Return the mode and offset
to the caller, checking that the latter is valid. If the rtx is
a paradoxical lowpart of the decl, use the decl's mode instead.
Do the same when storing to a register that contains the entire decl.
(var_lowpart): Use byte_lowpart_offset rather than
subreg_lowpart_offset when adjusting the offset attribute.
(count_uses, add_uses, add_stores): Use track_reg_p instead of
REG_EXPR, MEM_EXPR, REG_OFFSET, INT_MEM_OFFSET, track_expr_p,
offset_valid_for_tracked_p and mode_for_reg_attrs. Generate
lowparts for MEMs as well as REGs.
(vt_add_function_parameters): When obtaining the information from
the decl_rtl, adjust the offset to match incoming. Use track_loc_p
and var_lowpart.
From-SVN: r131055
Diffstat (limited to 'gcc/final.c')
-rw-r--r-- | gcc/final.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/final.c b/gcc/final.c index 654f847..72edbc0 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -2763,8 +2763,15 @@ alter_subreg (rtx *xp) else if (REG_P (y)) { /* Simplify_subreg can't handle some REG cases, but we have to. */ - unsigned int regno = subreg_regno (x); - *xp = gen_rtx_REG_offset (y, GET_MODE (x), regno, SUBREG_BYTE (x)); + unsigned int regno; + HOST_WIDE_INT offset; + + regno = subreg_regno (x); + if (subreg_lowpart_p (x)) + offset = byte_lowpart_offset (GET_MODE (x), GET_MODE (y)); + else + offset = SUBREG_BYTE (x); + *xp = gen_rtx_REG_offset (y, GET_MODE (x), regno, offset); } } |