diff options
author | James Greenhalgh <james.greenhalgh@arm.com> | 2014-07-31 15:32:44 +0000 |
---|---|---|
committer | James Greenhalgh <jgreenhalgh@gcc.gnu.org> | 2014-07-31 15:32:44 +0000 |
commit | 22756ccf24db934dd8913ff5965ddcdca2eb61ed (patch) | |
tree | 66eaa4191309d1b9929def578ac52c50e2b14c23 /gcc | |
parent | 988fa69392bb0edcece6db817ef5a3dfb09907fa (diff) | |
download | gcc-22756ccf24db934dd8913ff5965ddcdca2eb61ed.zip gcc-22756ccf24db934dd8913ff5965ddcdca2eb61ed.tar.gz gcc-22756ccf24db934dd8913ff5965ddcdca2eb61ed.tar.bz2 |
[AArch64_be] Don't fold reduction intrinsics.
gcc/
* config/aarch64/aarch64-builtins.c
(aarch64_gimple_fold_builtin): Don't fold reduction operations for
BYTES_BIG_ENDIAN.
From-SVN: r213379
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-builtins.c | 14 |
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0ebfba..b2b6aa5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2014-07-31 James Greenhalgh <james.greenhalgh@arm.com> + * config/aarch64/aarch64-builtins.c + (aarch64_gimple_fold_builtin): Don't fold reduction operations for + BYTES_BIG_ENDIAN. + +2014-07-31 James Greenhalgh <james.greenhalgh@arm.com> + * config/aarch64/aarch64.c (aarch64_simd_vect_par_cnst_half): Vary the generated mask based on BYTES_BIG_ENDIAN. (aarch64_simd_check_vect_par_cnst_half): New. diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c index fee17ec..58db77e 100644 --- a/gcc/config/aarch64/aarch64-builtins.c +++ b/gcc/config/aarch64/aarch64-builtins.c @@ -1383,6 +1383,20 @@ aarch64_gimple_fold_builtin (gimple_stmt_iterator *gsi) tree call = gimple_call_fn (stmt); tree fndecl; gimple new_stmt = NULL; + + /* The operations folded below are reduction operations. These are + defined to leave their result in the 0'th element (from the perspective + of GCC). The architectural instruction we are folding will leave the + result in the 0'th element (from the perspective of the architecture). + For big-endian systems, these perspectives are not aligned. + + It is therefore wrong to perform this fold on big-endian. There + are some tricks we could play with shuffling, but the mid-end is + inconsistent in the way it treats reduction operations, so we will + end up in difficulty. Until we fix the ambiguity - just bail out. */ + if (BYTES_BIG_ENDIAN) + return false; + if (call) { fndecl = gimple_call_fndecl (stmt); |