From: Sandra Loosemore Date: Sat, 3 Nov 2018 18:12:44 +0000 (-0400) Subject: re PR target/87079 (nios2 optimization for size - case of regression relatively to... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2eae232fc5a21f533ab7042475de7d6906248d14;p=gcc.git re PR target/87079 (nios2 optimization for size - case of regression relatively to 5.3.0) 2018-11-03 Sandra Loosemore PR target/87079 gcc/ * config/nios2/nios2.c (nios2_rtx_costs): Recognize sidi3 pattern. gcc/testsuite/ * gcc.target/nios2/pr87079-1.c: New. * gcc.target/nios2/pr87079-2.c: New. From-SVN: r265770 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5cf291da2d5..d10c48895d3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-11-03 Sandra Loosemore + + PR target/87079 + + * config/nios2/nios2.c (nios2_rtx_costs): Recognize sidi3 + pattern. + 2018-11-02 Aaron Sawdey * config/rs6000/rs6000-string.c (expand_strncmp_gpr_sequence): Pay diff --git a/gcc/config/nios2/nios2.c b/gcc/config/nios2/nios2.c index 78d58582929..e266924cfdb 100644 --- a/gcc/config/nios2/nios2.c +++ b/gcc/config/nios2/nios2.c @@ -1539,6 +1539,19 @@ nios2_rtx_costs (rtx x, machine_mode mode, *total = COSTS_N_INSNS (2); /* Latency adjustment. */ else *total = COSTS_N_INSNS (1); + if (TARGET_HAS_MULX && GET_MODE (x) == DImode) + { + enum rtx_code c0 = GET_CODE (XEXP (x, 0)); + enum rtx_code c1 = GET_CODE (XEXP (x, 1)); + if ((c0 == SIGN_EXTEND && c1 == SIGN_EXTEND) + || (c0 == ZERO_EXTEND && c1 == ZERO_EXTEND)) + /* This is the sidi3 pattern, which expands into 4 insns, + 2 multiplies and 2 moves. */ + { + *total = *total * 2 + COSTS_N_INSNS (2); + return true; + } + } return false; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a4d50614537..e728c1f6750 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2018-11-03 Sandra Loosemore + + PR target/87079 + + * gcc.target/nios2/pr87079-1.c: New. + * gcc.target/nios2/pr87079-2.c: New. + 2018-11-02 Rainer Orth * gcc.dg/compat/pr83487-1_y.c: Move dg-skip-if ... diff --git a/gcc/testsuite/gcc.target/nios2/pr87079-1.c b/gcc/testsuite/gcc.target/nios2/pr87079-1.c new file mode 100644 index 00000000000..67d5caad277 --- /dev/null +++ b/gcc/testsuite/gcc.target/nios2/pr87079-1.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-Os -mhw-div -mhw-mul -mhw-mulx" } */ + +#include +#include + +void foo(const uint8_t* str, uint32_t* res) +{ + uint32_t rdVal0, rdVal1, rdVal2; + rdVal0 = rdVal1 = rdVal2 = 0; + unsigned c; + for (;;) { + c = *str++; + unsigned dig = c - '0'; + if (dig > 9) + break; // non-digit + uint64_t x10; + + x10 = (uint64_t)rdVal0*10 + dig; + rdVal0 = (uint32_t)x10; + dig = (uint32_t)(x10 >> 32); + + x10 = (uint64_t)rdVal1*10 + dig; + rdVal1 = (uint32_t)x10; + dig = (uint32_t)(x10 >> 32); + + rdVal2 = rdVal2*10 + dig; + } + res[0] = rdVal0; + res[1] = rdVal1; + res[2] = rdVal2; +} + +/* { dg-final { scan-assembler-times "mulxuu\t" 2 } } */ diff --git a/gcc/testsuite/gcc.target/nios2/pr87079-2.c b/gcc/testsuite/gcc.target/nios2/pr87079-2.c new file mode 100644 index 00000000000..db2100ad33d --- /dev/null +++ b/gcc/testsuite/gcc.target/nios2/pr87079-2.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mhw-div -mhw-mul -mhw-mulx" } */ + +#include +#include + +void foo(const uint8_t* str, uint32_t* res) +{ + uint32_t rdVal0, rdVal1, rdVal2; + rdVal0 = rdVal1 = rdVal2 = 0; + unsigned c; + for (;;) { + c = *str++; + unsigned dig = c - '0'; + if (dig > 9) + break; // non-digit + uint64_t x10; + + x10 = (uint64_t)rdVal0*10 + dig; + rdVal0 = (uint32_t)x10; + dig = (uint32_t)(x10 >> 32); + + x10 = (uint64_t)rdVal1*10 + dig; + rdVal1 = (uint32_t)x10; + dig = (uint32_t)(x10 >> 32); + + rdVal2 = rdVal2*10 + dig; + } + res[0] = rdVal0; + res[1] = rdVal1; + res[2] = rdVal2; +} + +/* { dg-final { scan-assembler-times "mulxuu\t" 2 } } */