diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2023-07-13 18:32:15 +0200 |
---|---|---|
committer | Uros Bizjak <ubizjak@gmail.com> | 2023-07-13 18:32:15 +0200 |
commit | 337649c1660211db733c1ba34ae260b8c66a3578 (patch) | |
tree | 394867ef32fb83e7266b1be462e5b7f0a6b704af /gcc | |
parent | ad71cd89d327d5bf05d17bfa8f92cdaf71dbf751 (diff) | |
download | gcc-337649c1660211db733c1ba34ae260b8c66a3578.zip gcc-337649c1660211db733c1ba34ae260b8c66a3578.tar.gz gcc-337649c1660211db733c1ba34ae260b8c66a3578.tar.bz2 |
alpha: Fix computation mode in alpha_emit_set_long_cost [PR106966]
PR target/106966
gcc/ChangeLog:
* config/alpha/alpha.cc (alpha_emit_set_long_const):
Always use DImode when constructing long const.
gcc/testsuite/ChangeLog:
* gcc.target/alpha/pr106966.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/alpha/alpha.cc | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/alpha/pr106966.c | 13 |
2 files changed, 19 insertions, 1 deletions
diff --git a/gcc/config/alpha/alpha.cc b/gcc/config/alpha/alpha.cc index 360b50e..beeab06 100644 --- a/gcc/config/alpha/alpha.cc +++ b/gcc/config/alpha/alpha.cc @@ -2070,6 +2070,8 @@ static rtx alpha_emit_set_long_const (rtx target, HOST_WIDE_INT c1) { HOST_WIDE_INT d1, d2, d3, d4; + machine_mode mode = GET_MODE (target); + rtx orig_target = target; /* Decompose the entire word */ @@ -2082,6 +2084,9 @@ alpha_emit_set_long_const (rtx target, HOST_WIDE_INT c1) d4 = ((c1 & 0xffffffff) ^ 0x80000000) - 0x80000000; gcc_assert (c1 == d4); + if (mode != DImode) + target = gen_lowpart (DImode, target); + /* Construct the high word */ if (d4) { @@ -2101,7 +2106,7 @@ alpha_emit_set_long_const (rtx target, HOST_WIDE_INT c1) if (d1) emit_move_insn (target, gen_rtx_PLUS (DImode, target, GEN_INT (d1))); - return target; + return orig_target; } /* Given an integral CONST_INT or CONST_VECTOR, return the low 64 bits. */ diff --git a/gcc/testsuite/gcc.target/alpha/pr106966.c b/gcc/testsuite/gcc.target/alpha/pr106966.c new file mode 100644 index 0000000..7145c20 --- /dev/null +++ b/gcc/testsuite/gcc.target/alpha/pr106966.c @@ -0,0 +1,13 @@ +/* PR target/106906 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mbuild-constants" } */ + +void +do_console (unsigned short *vga) +{ + vga[0] = 'H'; + vga[1] = 'e'; + vga[2] = 'l'; + vga[3] = 'l'; + vga[4] = 'o'; +} |