aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHongyu Wang <hongyu.wang@intel.com>2025-03-31 16:39:23 +0800
committerHongyu Wang <hongyu.wang@intel.com>2025-04-03 11:03:57 +0800
commit2488843477b3dcfeef76f8512ff6d9e8f3b58dca (patch)
tree113dada9b8eb258ec203ab44e767915a13dbd039 /gcc
parent4590a31f81ae18e0d887c1a56f510d22754f31ed (diff)
downloadgcc-2488843477b3dcfeef76f8512ff6d9e8f3b58dca.zip
gcc-2488843477b3dcfeef76f8512ff6d9e8f3b58dca.tar.gz
gcc-2488843477b3dcfeef76f8512ff6d9e8f3b58dca.tar.bz2
APX: Emit nf variant for rotl splitter with mask [PR 119539]
For spiltter after *<rotate_insn><mode>3_mask it now splits the pattern to *<rotate_insn><mode>3_mask with flag reg clobber, and it doesn't generate nf variant of rotate. Directly emit nf pattern when TARGET_APX_NF enabled in these define_insn_and_split. gcc/ChangeLog: PR target/119539 * config/i386/i386.md (*<insn><mode>3_mask): Emit NF variant of rotate when APX_NF enabled, and use force_lowpart_subreg. (*<insn><mode>3_mask_1): Likewise. gcc/testsuite/ChangeLog: PR target/119539 * gcc.target/i386/apx-nf-pr119539.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/i386/i386.md22
-rw-r--r--gcc/testsuite/gcc.target/i386/apx-nf-pr119539.c6
2 files changed, 25 insertions, 3 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index f7f790d..d6b2f29 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -18153,8 +18153,15 @@
(match_dup 2)))
(clobber (reg:CC FLAGS_REG))])]
{
- operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
- operands[2] = gen_lowpart (QImode, operands[2]);
+ operands[2] = force_lowpart_subreg (QImode, operands[2],
+ GET_MODE (operands[2]));
+ if (TARGET_APX_NF)
+ {
+ emit_move_insn (operands[0],
+ gen_rtx_<CODE> (<MODE>mode, operands[1],
+ operands[2]));
+ DONE;
+ }
})
(define_split
@@ -18192,7 +18199,16 @@
[(set (match_dup 0)
(any_rotate:SWI (match_dup 1)
(match_dup 2)))
- (clobber (reg:CC FLAGS_REG))])])
+ (clobber (reg:CC FLAGS_REG))])]
+{
+ if (TARGET_APX_NF)
+ {
+ emit_move_insn (operands[0],
+ gen_rtx_<CODE> (<MODE>mode, operands[1],
+ operands[2]));
+ DONE;
+ }
+})
(define_split
[(set (match_operand:SWI 0 "register_operand")
diff --git a/gcc/testsuite/gcc.target/i386/apx-nf-pr119539.c b/gcc/testsuite/gcc.target/i386/apx-nf-pr119539.c
new file mode 100644
index 0000000..5dfec55
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/apx-nf-pr119539.c
@@ -0,0 +1,6 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-mapx-features=nf -march=x86-64 -O2" } */
+/* { dg-final { scan-assembler-times "\{nf\} rol" 2 } } */
+
+long int f1 (int x) { return ~(1ULL << (x & 0x3f)); }
+long int f2 (char x) { return ~(1ULL << (x & 0x3f)); }