diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1996-09-18 17:33:30 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1996-09-18 17:33:30 -0400 |
commit | c3741733dbd0155d869ebfc9ead24a0d885fe27c (patch) | |
tree | 52516c1602716a565b8e43ab513e03371ce93427 /gcc | |
parent | 1bfce0b8a46ff6168f742199cb0d36523ffca611 (diff) | |
download | gcc-c3741733dbd0155d869ebfc9ead24a0d885fe27c.zip gcc-c3741733dbd0155d869ebfc9ead24a0d885fe27c.tar.gz gcc-c3741733dbd0155d869ebfc9ead24a0d885fe27c.tar.bz2 |
(alpha_emit_set_long_const): Save one instruction when -O2 and high
word == low word.
From-SVN: r12740
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/alpha/alpha.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index ddc64d9..4360b56 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -981,7 +981,7 @@ alpha_emit_set_long_const (target, c) = (flag_expensive_optimizations && rtx_equal_function_value_matters ? 0 : target); HOST_WIDE_INT d1, d2, d3, d4; - rtx r; + rtx r1, r2; /* Decompose the entire word */ d1 = ((c & 0xffff) ^ 0x8000) - 0x8000; @@ -997,29 +997,36 @@ alpha_emit_set_long_const (target, c) /* Construct the high word */ if (d3 == 0) - r = copy_to_suggested_reg (GEN_INT (d4), subtarget, DImode); + r1 = copy_to_suggested_reg (GEN_INT (d4), subtarget, DImode); else if (d4 == 0) - r = copy_to_suggested_reg (GEN_INT (d3), subtarget, DImode); + r1 = copy_to_suggested_reg (GEN_INT (d3), subtarget, DImode); else - r = expand_binop (DImode, add_optab, GEN_INT (d3), GEN_INT (d4), - subtarget, 0, OPTAB_WIDEN); + r1 = expand_binop (DImode, add_optab, GEN_INT (d3), GEN_INT (d4), + subtarget, 0, OPTAB_WIDEN); /* Shift it into place */ - r = expand_binop (DImode, ashl_optab, r, GEN_INT (32), - subtarget, 0, OPTAB_WIDEN); + r2 = expand_binop (DImode, ashl_optab, r1, GEN_INT (32), + subtarget, 0, OPTAB_WIDEN); - /* Add in the low word */ - if (d2 != 0) - r = expand_binop (DImode, add_optab, r, GEN_INT (d2), - subtarget, 0, OPTAB_WIDEN); - if (d1 != 0) - r = expand_binop (DImode, add_optab, r, GEN_INT (d1), - subtarget, 0, OPTAB_WIDEN); + if (subtarget == 0 && d1 == d3 && d2 == d4) + r1 = expand_binop (DImode, add_optab, r1, r2, subtarget, 0, OPTAB_WIDEN); + else + { + r1 = r2; + + /* Add in the low word */ + if (d2 != 0) + r1 = expand_binop (DImode, add_optab, r1, GEN_INT (d2), + subtarget, 0, OPTAB_WIDEN); + if (d1 != 0) + r1 = expand_binop (DImode, add_optab, r1, GEN_INT (d1), + subtarget, 0, OPTAB_WIDEN); + } if (subtarget == 0) - r = copy_to_suggested_reg(r, target, DImode); + r1 = copy_to_suggested_reg(r1, target, DImode); - return r; + return r1; } #endif /* HOST_BITS_PER_WIDE_INT == 64 */ |