aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGeorg-Johann Lay <avr@gjlay.de>2023-05-21 18:54:21 +0200
committerGeorg-Johann Lay <avr@gjlay.de>2023-05-21 18:59:54 +0200
commitdad3c18fbb481ab31f1586b8f980940fa55951b8 (patch)
tree7d099667cdc6c725c61f834bd401e5a47ef72b86 /gcc
parentc09471fbc7588db2480f036aa56a2403d3c03ae5 (diff)
downloadgcc-dad3c18fbb481ab31f1586b8f980940fa55951b8.zip
gcc-dad3c18fbb481ab31f1586b8f980940fa55951b8.tar.gz
gcc-dad3c18fbb481ab31f1586b8f980940fa55951b8.tar.bz2
target/90622: __builtin_avr_insert bits: Use BLD/BST for one bit in place.
If just one bit is inserted in the same position like with: __builtin_avr_insert_bits (0xFFFFF2FF, src, dst); a BLD/BST sequence is better than XOR/AND/XOR. Thus, don't fold that case to the latter sequence. gcc/ PR target/90622 * config/avr/avr.cc (avr_fold_builtin) [AVR_BUILTIN_INSERT_BITS]: Don't fold to XOR / AND / XOR if just one bit is copied to the same position.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/avr/avr.cc9
1 files changed, 6 insertions, 3 deletions
diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index d5af40f..9fa50ca 100644
--- a/gcc/config/avr/avr.cc
+++ b/gcc/config/avr/avr.cc
@@ -14425,10 +14425,13 @@ avr_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *arg,
if (changed)
return build_call_expr (fndecl, 3, tmap, tbits, tval);
- /* If bits don't change their position we can use vanilla logic
- to merge the two arguments. */
+ /* If bits don't change their position, we can use vanilla logic
+ to merge the two arguments... */
- if (avr_map_metric (map, MAP_NONFIXED_0_7) == 0)
+ if (avr_map_metric (map, MAP_NONFIXED_0_7) == 0
+ // ...except when we are copying just one bit. In that
+ // case, BLD/BST is better than XOR/AND/XOR, see PR90622.
+ && avr_map_metric (map, MAP_FIXED_0_7) != 1)
{
int mask_f = avr_map_metric (map, MAP_MASK_PREIMAGE_F);
tree tres, tmask = build_int_cst (val_type, mask_f ^ 0xff);