diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2023-05-21 18:54:21 +0200 |
---|---|---|
committer | Georg-Johann Lay <avr@gjlay.de> | 2023-05-21 18:59:54 +0200 |
commit | dad3c18fbb481ab31f1586b8f980940fa55951b8 (patch) | |
tree | 7d099667cdc6c725c61f834bd401e5a47ef72b86 /gcc | |
parent | c09471fbc7588db2480f036aa56a2403d3c03ae5 (diff) | |
download | gcc-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.cc | 9 |
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); |