aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2012-08-02 16:20:22 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2012-08-02 16:20:22 +0000
commitca26f665dd7204fa930dc7f6a936ac526cd66f74 (patch)
treeb69bf3d483cf99ad25f1bb911f848e36d4080b2d /gcc
parent8812aab189d4519c0bb3f853867a2e12af0b6504 (diff)
downloadgcc-ca26f665dd7204fa930dc7f6a936ac526cd66f74.zip
gcc-ca26f665dd7204fa930dc7f6a936ac526cd66f74.tar.gz
gcc-ca26f665dd7204fa930dc7f6a936ac526cd66f74.tar.bz2
arm.c (arm_gen_constant): Use UBFX for some AND operations when available.
* arm.c (arm_gen_constant): Use UBFX for some AND operations when available. From-SVN: r190088
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arm/arm.c25
2 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 973ae0d..578b0a0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2012-08-02 Richard Earnshaw <rearnsha@arm.com>
+
+ * arm.c (arm_gen_constant): Use UBFX for some AND operations when
+ available.
+
2012-08-02 Richard Guenther <rguenther@suse.de>
* tree-into-ssa.c (struct common_info_d): New struct.
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 701ab4c..00ccb92 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -2982,6 +2982,31 @@ arm_gen_constant (enum rtx_code code, enum machine_mode mode, rtx cond,
return 1;
}
+ /* On targets with UXTH/UBFX, we can deal with AND (2^N)-1 in a single
+ insn. */
+ if (code == AND && (i = exact_log2 (remainder + 1)) > 0
+ && (arm_arch_thumb2 || (i == 16 && arm_arch6 && mode == SImode)))
+ {
+ if (generate)
+ {
+ if (mode == SImode && i == 16)
+ /* Use UXTH in preference to UBFX, since on Thumb2 it's a
+ smaller insn. */
+ emit_constant_insn (cond,
+ gen_zero_extendhisi2
+ (target, gen_lowpart (HImode, source)));
+ else
+ /* Extz only supports SImode, but we can coerce the operands
+ into that mode. */
+ emit_constant_insn (cond,
+ gen_extzv_t2 (gen_lowpart (mode, target),
+ gen_lowpart (mode, source),
+ GEN_INT (i), const0_rtx));
+ }
+
+ return 1;
+ }
+
/* Calculate a few attributes that may be useful for specific
optimizations. */
/* Count number of leading zeros. */