gcc/ChangeLog:

                PR target/113729

               * config/i386/i386.md (*ashlqi3_1_zext<mode><nf_name>):

               New define_insn.

               (*ashlhi3_1_zext<mode><nf_name>): Ditto.

               (*<insn>qi3_1_zext<mode><nf_name>): Ditto.

               (*<insn>hi3_1_zext<mode><nf_name>): Ditto.

               (*<insn>qi3_1_zext<mode><nf_name>): Ditto.

               (*<insn>hi3_1_zext<mode><nf_name>): Ditto.



gcc/testsuite/ChangeLog:



               * gcc.target/i386/pr113729.c: Add testcase for shift and
rotate.

---

 gcc/config/i386/i386.md                  | 66 ++++++++++++++++++++++++

 gcc/testsuite/gcc.target/i386/pr113729.c | 62 ++++++++++++++++++++++

 2 files changed, 128 insertions(+)



diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index
944ec55a61d..260482a7305 100644

--- a/gcc/config/i386/i386.md

+++ b/gcc/config/i386/i386.md

@@ -15928,6 +15928,28 @@

   [(set_attr "type" "ishiftx")

    (set_attr "mode" "SI")])



+(define_insn "*ashlqi3_1_zext<mode><nf_name>"

+  [(set (match_operand:SWI248x 0 "register_operand" "=r")

+             (zero_extend:SWI248x

+               (ashift:QI (match_operand:QI 1 "nonimmediate_operand" "rm")

+                                 (match_operand:QI 2 "nonmemory_operand"
"cI"))))]

+  "TARGET_APX_NDD && <nf_condition>"

+  "<nf_prefix>sal{b}\t{%2, %1, %b0|%b0, %1, %2}"

+  [(set_attr "type" "ishiftx")

+   (set_attr "has_nf" "1")

+   (set_attr "mode" "QI")])

+

+(define_insn "*ashlhi3_1_zext<mode><nf_name>"

+  [(set (match_operand:SWI48x 0 "register_operand" "=r")

+             (zero_extend:SWI48x

+               (ashift:HI (match_operand:HI 1 "nonimmediate_operand" "rm")

+                                 (match_operand:QI 2 "nonmemory_operand"
"cI"))))]

+  "TARGET_APX_NDD && <nf_condition>"

+  "<nf_prefix>sal{w}\t{%2, %1, %w0|%w0, %1, %2}"

+  [(set_attr "type" "ishiftx")

+   (set_attr "has_nf" "1")

+   (set_attr "mode" "HI")])

+

 (define_insn "*ashlsi3_1_zext"

   [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")

               (zero_extend:DI

@@ -17412,6 +17434,28 @@

   [(set_attr "type" "ishiftx")

    (set_attr "mode" "SI")])



+(define_insn "*<insn>qi3_1_zext<mode><nf_name>"

+  [(set (match_operand:SWI248x 0 "register_operand" "=r")

+             (zero_extend:SWI248x

+               (any_shiftrt:QI (match_operand:QI 1 "nonimmediate_operand"
"rm")

+                                             (match_operand:QI 2
"nonmemory_operand" "cI"))))]

+  "TARGET_APX_NDD && <nf_condition>"

+  "<nf_prefix><shift>{b}\t{%2, %1, %b0|%b0, %1, %2}"

+  [(set_attr "type" "ishift")

+   (set_attr "has_nf" "1")

+   (set_attr "mode" "QI")])

+

+(define_insn "*<insn>hi3_1_zext<mode><nf_name>"

+  [(set (match_operand:SWI48x 0 "register_operand" "=r")

+             (zero_extend:SWI48x

+               (any_shiftrt:HI (match_operand:HI 1 "nonimmediate_operand"
"rm")

+                                             (match_operand:QI 2
"nonmemory_operand" "cI"))))]

+  "TARGET_APX_NDD && <nf_condition>"

+  "<nf_prefix><shift>{w}\t{%2, %1, %w0|%w0, %1, %2}"

+  [(set_attr "type" "ishift")

+   (set_attr "has_nf" "1")

+   (set_attr "mode" "HI")])

+

 (define_insn "*<insn>si3_1_zext"

   [(set (match_operand:DI 0 "register_operand" "=r,r,r,?k")

               (zero_extend:DI

@@ -18170,6 +18214,28 @@

   [(set_attr "type" "rotatex")

    (set_attr "mode" "SI")])



+(define_insn "*<insn>qi3_1_zext<mode><nf_name>"

+  [(set (match_operand:SWI248x 0 "register_operand" "=r")

+             (zero_extend:SWI248x

+               (any_rotate:QI (match_operand:QI 1 "nonimmediate_operand"
"rm")

+                                           (match_operand:QI 2
"nonmemory_operand" "cI"))))]

+  "TARGET_APX_NDD && <nf_condition>"

+  "<nf_prefix><rotate>{b}\t{%2, %1, %b0|%b0, %1, %2}"

+  [(set_attr "type" "rotate")

+   (set_attr "has_nf" "1")

+   (set_attr "mode" "QI")])

+

+(define_insn "*<insn>hi3_1_zext<mode><nf_name>"

+  [(set (match_operand:SWI48x 0 "register_operand" "=r")

+             (zero_extend:SWI48x

+               (any_rotate:HI (match_operand:HI 1 "nonimmediate_operand"
"rm")

+                                           (match_operand:QI 2
"nonmemory_operand" "cI"))))]

+  "TARGET_APX_NDD && <nf_condition>"

+  "<nf_prefix><rotate>{w}\t{%2, %1, %w0|%w0, %1, %2}"

+  [(set_attr "type" "rotate")

+   (set_attr "has_nf" "1")

+   (set_attr "mode" "HI")])

+

 (define_insn "*<insn>si3_1_zext"

   [(set (match_operand:DI 0 "register_operand" "=r,r,r")

               (zero_extend:DI

diff --git a/gcc/testsuite/gcc.target/i386/pr113729.c
b/gcc/testsuite/gcc.target/i386/pr113729.c

index a49adcd7d6b..fa5def5ebf6 100644

--- a/gcc/testsuite/gcc.target/i386/pr113729.c

+++ b/gcc/testsuite/gcc.target/i386/pr113729.c

@@ -71,3 +71,65 @@ F (int, char, xor, ^)  F (int64_t, char, xor, ^)  F
(int, short, xor, ^)  F (int64_t, short, xor, ^)

+

+#define F2(TYPE1,TYPE2, OP_NAME, OP, IMM)  \

+TYPE1                                                                 \

+__attribute__ ((noipa))                                  \

+f2_##OP_NAME##_##TYPE1##_##TYPE2 (TYPE2 a) \

+{
\

+  unsigned TYPE2 b = a OP IMM;                                \

+  return b;                                                         \

+}

+

+/* ashlqi3_1_zext<mode> */

+F2 (short, char, shl, <<, 7)

+F2 (int, char, shl, <<, 6)

+F2 (int64_t, char, shl, <<, 7)

+F2 (int, short, shl, <<, 6)

+F2 (int64_t, short, shl, <<, 3)

+

+/* ashrqi3_1_zext<mode> */

+F2 (short, char, sar, >>, 7)

+F2 (int, char, sar, >>, 6)

+F2 (int64_t, char, sar, >>, 7)

+F2 (int, short, sar, >>, 6)

+F2 (int64_t, short, sar, >>, 3)

+

+#define F3(TYPE1,TYPE2, OP_NAME, OP, IMM)          \

+TYPE1
            \

+__attribute__ ((noipa))
\

+f3_##OP_NAME##_##TYPE1##_##TYPE2 (TYPE2 a)  \

+{
                  \

+  TYPE2 b = a OP IMM;
\

+  return b;
            \

+}

+

+/* lshrhi3_1_zext<mode> */

+F3 (short, uint8_t, shr, >>, 7)

+F3 (int, uint8_t, shr, >>, 6)

+F3 (int64_t, uint8_t, shr, >>, 7)

+F3 (int, uint16_t, shr, >>, 6)

+F3 (int64_t, uint16_t, shr, >>, 3)

+

+#define F4(TYPE1,TYPE2, OP_NAME, OP1, OP2, IMM1)
     \

+TYPE1
                                               \

+__attribute__ ((noipa))
                                   \

+foo4_##OP_NAME##_##TYPE1##_##TYPE2 (unsigned TYPE2 a)               \

+{
                                                     \

+  unsigned TYPE2 b = (a OP1 IMM1 | a OP2 (8 * sizeof(TYPE2) - IMM1)); \

+  return b;
                                              \

+}

+

+/* rotrqi3_1_zext<mode> */

+F4 (short, char, ror, >>, <<, 1)

+F4 (int, char, ror, >>, <<, 1)

+F4 (long, char, ror, >>, <<, 1)

+F4 (int, short, ror, >>, <<, 1)

+F4 (long, short, ror, >>, <<, 1)

+

+/* rotlqi3_1_zext<mode> */

+F4 (short, char, rol, <<, >>, 1)

+F4 (int, char, rol, <<, >>, 1)

+F4 (long, char, rol, <<, >>, 1)

+F4 (int, short, rol, <<, >>, 1)

+F4 (long, short, rol, <<, >>, 1)

--

2.31.1

Reply via email to