aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorRoger Sayle <roger@nextmovesoftware.com>2023-07-14 18:21:56 +0100
committerRoger Sayle <roger@nextmovesoftware.com>2023-07-14 18:21:56 +0100
commit43a0a5cd57eefd5a5bbead606ec4f6959af31802 (patch)
treef5fa165911e9d9098dcbc3c641022f37707fa3f4 /gcc/config
parentb5138df96a93d3b5070c88b8617eabd38cb24ab6 (diff)
downloadgcc-43a0a5cd57eefd5a5bbead606ec4f6959af31802.zip
gcc-43a0a5cd57eefd5a5bbead606ec4f6959af31802.tar.gz
gcc-43a0a5cd57eefd5a5bbead606ec4f6959af31802.tar.bz2
PR target/110588: Add *bt<mode>_setncqi_2 to generate btl on x86.
This patch resolves PR target/110588 to catch another case in combine where the i386 backend should be generating a btl instruction. This adds another define_insn_and_split to recognize the RTL representation for this case. I also noticed that two related define_insn_and_split weren't using the preferred string style for single statement preparation-statements, so I've reformatted these to be consistent in style with the new one. 2023-07-14 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog PR target/110588 * config/i386/i386.md (*bt<mode>_setcqi): Prefer string form preparation statement over braces for a single statement. (*bt<mode>_setncqi): Likewise. (*bt<mode>_setncqi_2): New define_insn_and_split. gcc/testsuite/ChangeLog PR target/110588 * gcc.target/i386/pr110588.c: New test case.
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/i386/i386.md29
1 files changed, 23 insertions, 6 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 89a7fb0..47ea050 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -16287,9 +16287,7 @@
(const_int 0)))
(set (match_dup 0)
(eq:QI (reg:CCC FLAGS_REG) (const_int 0)))]
-{
- operands[2] = lowpart_subreg (SImode, operands[2], QImode);
-})
+ "operands[2] = lowpart_subreg (SImode, operands[2], QImode);")
;; Help combine recognize bt followed by setnc
(define_insn_and_split "*bt<mode>_setncqi"
@@ -16310,9 +16308,7 @@
(const_int 0)))
(set (match_dup 0)
(ne:QI (reg:CCC FLAGS_REG) (const_int 0)))]
-{
- operands[2] = lowpart_subreg (SImode, operands[2], QImode);
-})
+ "operands[2] = lowpart_subreg (SImode, operands[2], QImode);")
(define_insn_and_split "*bt<mode>_setnc<mode>"
[(set (match_operand:SWI48 0 "register_operand")
@@ -16336,6 +16332,27 @@
operands[2] = lowpart_subreg (SImode, operands[2], QImode);
operands[3] = gen_reg_rtx (QImode);
})
+
+;; Help combine recognize bt followed by setnc (PR target/110588)
+(define_insn_and_split "*bt<mode>_setncqi_2"
+ [(set (match_operand:QI 0 "register_operand")
+ (eq:QI
+ (zero_extract:SWI48
+ (match_operand:SWI48 1 "register_operand")
+ (const_int 1)
+ (zero_extend:SI (match_operand:QI 2 "register_operand")))
+ (const_int 0)))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_USE_BT && ix86_pre_reload_split ()"
+ "#"
+ "&& 1"
+ [(set (reg:CCC FLAGS_REG)
+ (compare:CCC
+ (zero_extract:SWI48 (match_dup 1) (const_int 1) (match_dup 2))
+ (const_int 0)))
+ (set (match_dup 0)
+ (ne:QI (reg:CCC FLAGS_REG) (const_int 0)))]
+ "operands[2] = lowpart_subreg (SImode, operands[2], QImode);")
;; Store-flag instructions.