aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2024-11-25 20:04:38 +0100
committerUros Bizjak <ubizjak@gmail.com>2024-11-25 20:07:06 +0100
commit551fd4d5c98859522dd21db6fbb39fceac3936b2 (patch)
tree39020bc664c8517a90802dcf0fc8e667be8a18d7
parent9afcbc2dd3cd2dfe90c91ddfa71a49e571ad5e61 (diff)
downloadgcc-551fd4d5c98859522dd21db6fbb39fceac3936b2.zip
gcc-551fd4d5c98859522dd21db6fbb39fceac3936b2.tar.gz
gcc-551fd4d5c98859522dd21db6fbb39fceac3936b2.tar.bz2
i386: Generalize x >> 32-y to x >> -y conversion with multiples of 32
Optimize also cases where immediate value is a multiple of 32 for 32-bit shifts (or multiple of 64 for 64-bit shifts). gcc/ChangeLog: * config/i386/i386.md (*ashl<mode>3_negcnt): For SImode shifts allow multiples of 32 (or multiples of 64 for DImode shifts) for immediate operand 3. (*ashl<mode>3_negcnt_1): Ditto. (*<insn><mode>3_negcnt): Ditto. (*<insn><mode>3_negcnt_1): Ditto.
-rw-r--r--gcc/config/i386/i386.md8
1 files changed, 4 insertions, 4 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 399a6a8..df78e4d 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -15906,7 +15906,7 @@
(match_operand 2 "int248_register_operand" "c,r")) 0)))
(clobber (reg:CC FLAGS_REG))]
"ix86_binary_operator_ok (ASHIFT, <MODE>mode, operands)
- && INTVAL (operands[3]) == <MODE_SIZE> * BITS_PER_UNIT
+ && (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
&& ix86_pre_reload_split ()"
"#"
"&& 1"
@@ -15936,7 +15936,7 @@
(match_operand:QI 2 "register_operand" "c,r"))))
(clobber (reg:CC FLAGS_REG))]
"ix86_binary_operator_ok (ASHIFT, <MODE>mode, operands)
- && INTVAL (operands[3]) == <MODE_SIZE> * BITS_PER_UNIT
+ && (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
&& ix86_pre_reload_split ()"
"#"
"&& 1"
@@ -16688,7 +16688,7 @@
(match_operand 2 "int248_register_operand" "c,r")) 0)))
(clobber (reg:CC FLAGS_REG))]
"ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
- && INTVAL (operands[3]) == <MODE_SIZE> * BITS_PER_UNIT
+ && (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
&& ix86_pre_reload_split ()"
"#"
"&& 1"
@@ -16718,7 +16718,7 @@
(match_operand:QI 2 "register_operand" "c,r"))))
(clobber (reg:CC FLAGS_REG))]
"ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
- && INTVAL (operands[3]) == <MODE_SIZE> * BITS_PER_UNIT
+ && (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
&& ix86_pre_reload_split ()"
"#"
"&& 1"