diff options
| author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2015-08-03 11:12:00 +0000 |
|---|---|---|
| committer | Szabolcs Nagy <nsz@gcc.gnu.org> | 2015-08-03 11:12:00 +0000 |
| commit | 1f71aee9c1b36a44509adc8f9134ccc17f2989a2 (patch) | |
| tree | 4134c3cb8212aeb873c25d8f28aaa1d13b4aea52 /gcc/config/arm/arm.c | |
| parent | 2ab320ad365da31f2d02b57d2f03bc291ab64bb9 (diff) | |
| download | gcc-1f71aee9c1b36a44509adc8f9134ccc17f2989a2.zip gcc-1f71aee9c1b36a44509adc8f9134ccc17f2989a2.tar.gz gcc-1f71aee9c1b36a44509adc8f9134ccc17f2989a2.tar.bz2 | |
[ARM] PR target/66731 Fix vnmul insn with -frounding-math
gcc:
PR target/66731
* config/arm/vfp.md (negmuldf3_vfp): Add new pattern.
(negmulsf3_vfp): Likewise.
(muldf3negdf_vfp): Disable for -frounding-math.
(mulsf3negsf_vfp): Likewise.
* config/arm/arm.c (arm_new_rtx_costs): Fix NEG cost for VNMUL,
fix MULT cost with -frounding-math.
gcc/testsuite:
PR target/66731
* gcc.target/arm/vnmul-1.c: New.
* gcc.target/arm/vnmul-2.c: New.
* gcc.target/arm/vnmul-3.c: New.
* gcc.target/arm/vnmul-4.c: New.
From-SVN: r226496
Diffstat (limited to 'gcc/config/arm/arm.c')
| -rw-r--r-- | gcc/config/arm/arm.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index ae37fc7..1ea9e27 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -10181,7 +10181,7 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code, { rtx op0 = XEXP (x, 0); - if (GET_CODE (op0) == NEG) + if (GET_CODE (op0) == NEG && !flag_rounding_math) op0 = XEXP (op0, 0); if (speed_p) @@ -10255,6 +10255,13 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code, if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT && (mode == SFmode || !TARGET_VFP_SINGLE)) { + if (GET_CODE (XEXP (x, 0)) == MULT) + { + /* VNMUL. */ + *cost = rtx_cost (XEXP (x, 0), mode, NEG, 0, speed_p); + return true; + } + if (speed_p) *cost += extra_cost->fp[mode != SFmode].neg; |
