aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorRoger Sayle <roger@nextmovesoftware.com>2023-10-30 16:21:28 +0000
committerRoger Sayle <roger@nextmovesoftware.com>2023-10-30 16:21:28 +0000
commita3da9adeb457d4f01c4e695a9621f90c2e2a5e68 (patch)
tree12eb744747aca917c307b4871a1acc96f589444e /libcpp
parent31cc9824d1cd5e0f7fa145d0831a923479333cd6 (diff)
downloadgcc-a3da9adeb457d4f01c4e695a9621f90c2e2a5e68.zip
gcc-a3da9adeb457d4f01c4e695a9621f90c2e2a5e68.tar.gz
gcc-a3da9adeb457d4f01c4e695a9621f90c2e2a5e68.tar.bz2
ARC: Convert (signed<<31)>>31 to -(signed&1) without barrel shifter.
This patch optimizes PR middle-end/101955 for the ARC backend. On ARC CPUs with a barrel shifter, using two shifts is optimal as: asl_s r0,r0,31 asr_s r0,r0,31 but without a barrel shifter, GCC -O2 -mcpu=em currently generates: and r2,r0,1 ror r2,r2 add.f 0,r2,r2 sbc r0,r0,r0 with this patch, we now generate the smaller, faster and non-flags clobbering: bmsk_s r0,r0,0 neg_s r0,r0 2023-10-30 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog PR middle-end/101955 * config/arc/arc.md (*extvsi_1_0): New define_insn_and_split to convert sign extract of the least significant bit into an AND $1 then a NEG when !TARGET_BARREL_SHIFTER. gcc/testsuite/ChangeLog PR middle-end/101955 * gcc.target/arc/pr101955.c: New test case.
Diffstat (limited to 'libcpp')
0 files changed, 0 insertions, 0 deletions