]> gcc.gnu.org Git - gcc.git/commitdiff
i386: Handle sign-extract for QImode operations with high registers [PR78952]
authorUros Bizjak <ubizjak@gmail.com>
Thu, 20 Apr 2023 14:51:56 +0000 (16:51 +0200)
committerUros Bizjak <ubizjak@gmail.com>
Thu, 20 Apr 2023 14:52:39 +0000 (16:52 +0200)
Introduce extract_operator predicate to handle both, zero-extract and
sign-extract extract operations with expressions like:

    (subreg:QI
      (zero_extract:SWI248
        (match_operand 1 "int248_register_operand" "0")
(const_int 8)
(const_int 8)) 0)

As shown in the testcase, this will enable generation of QImode
instructions with high registers when signed arguments are used.

gcc/ChangeLog:

PR target/78952
* config/i386/predicates.md (extract_operator): New predicate.
* config/i386/i386.md (any_extract): Remove code iterator.
(*cmpqi_ext<mode>_1_mem_rex64): Use extract_operator predicate.
(*cmpqi_ext<mode>_1): Ditto.
(*cmpqi_ext<mode>_2): Ditto.
(*cmpqi_ext<mode>_3_mem_rex64): Ditto.
(*cmpqi_ext<mode>_3): Ditto.
(*cmpqi_ext<mode>_4): Ditto.
(*extzvqi_mem_rex64): Ditto.
(*extzvqi): Ditto.
(*insvqi_2): Ditto.
(*extendqi<SWI24:mode>_ext_1): Ditto.
(*addqi_ext<mode>_0): Ditto.
(*addqi_ext<mode>_1): Ditto.
(*addqi_ext<mode>_2): Ditto.
(*subqi_ext<mode>_0): Ditto.
(*subqi_ext<mode>_2): Ditto.
(*testqi_ext<mode>_1): Ditto.
(*testqi_ext<mode>_2): Ditto.
(*andqi_ext<mode>_0): Ditto.
(*andqi_ext<mode>_1): Ditto.
(*andqi_ext<mode>_1_cc): Ditto.
(*andqi_ext<mode>_2): Ditto.
(*<any_or:code>qi_ext<mode>_0): Ditto.
(*<any_or:code>qi_ext<mode>_1): Ditto.
(*<any_or:code>qi_ext<mode>_2): Ditto.
(*xorqi_ext<mode>_1_cc): Ditto.
(*negqi_ext<mode>_2): Ditto.
(*ashlqi_ext<mode>_2): Ditto.
(*<any_shiftrt:insn>qi_ext<mode>_2): Ditto.

gcc/testsuite/ChangeLog:

PR target/78952
* gcc.target/i386/pr78952-4.c: New test.

gcc/config/i386/i386.md
gcc/config/i386/predicates.md
gcc/testsuite/gcc.target/i386/pr78952-4.c [new file with mode: 0644]

index f8698ea903e06c39eaa883a5f4dadaecaa8688ae..d49f1cdc3fed72996ed558e342376ecac5dbe814 100644 (file)
 ;; Mapping of extend operators
 (define_code_iterator any_extend [sign_extend zero_extend])
 
-;; Mapping of extract operators
-(define_code_iterator any_extract [sign_extract zero_extract])
-
 ;; Mapping of highpart multiply operators
 (define_code_iterator any_mul_highpart [smul_highpart umul_highpart])
 
        (compare
          (match_operand:QI 0 "norex_memory_operand" "Bn")
          (subreg:QI
-           (any_extract:SWI248
-             (match_operand 1 "int248_register_operand" "Q")
-             (const_int 8)
-             (const_int 8)) 0)))]
+           (match_operator:SWI248 2 "extract_operator"
+             [(match_operand 1 "int248_register_operand" "Q")
+              (const_int 8)
+              (const_int 8)]) 0)))]
   "TARGET_64BIT && reload_completed
    && ix86_match_ccmode (insn, CCmode)"
   "cmp{b}\t{%h1, %0|%0, %h1}"
        (compare
          (match_operand:QI 0 "nonimmediate_operand" "QBc,m")
          (subreg:QI
-           (any_extract:SWI248
-             (match_operand 1 "int248_register_operand" "Q,Q")
-             (const_int 8)
-             (const_int 8)) 0)))]
+           (match_operator:SWI248 2 "extract_operator"
+             [(match_operand 1 "int248_register_operand" "Q,Q")
+              (const_int 8)
+              (const_int 8)]) 0)))]
   "ix86_match_ccmode (insn, CCmode)"
   "cmp{b}\t{%h1, %0|%0, %h1}"
   [(set_attr "isa" "*,nox64")
        (match_operator 4 "compare_operator"
          [(match_dup 0)
           (subreg:QI
-            (any_extract:SWI248
-              (match_operand 2 "int248_register_operand")
-              (const_int 8)
-              (const_int 8)) 0)]))]
+            (match_operator:SWI248 5 "extract_operator"
+              [(match_operand 2 "int248_register_operand")
+               (const_int 8)
+               (const_int 8)]) 0)]))]
   "TARGET_64BIT
    && peep2_reg_dead_p (2, operands[0])"
   [(set (match_dup 3)
        (match_op_dup 4
          [(match_dup 1)
           (subreg:QI
-            (any_extract:SWI248
-              (match_dup 2)
-              (const_int 8)
-              (const_int 8)) 0)]))])
+            (match_op_dup 5
+              [(match_dup 2)
+               (const_int 8)
+               (const_int 8)]) 0)]))])
 
 (define_insn "*cmpqi_ext<mode>_2"
   [(set (reg FLAGS_REG)
        (compare
          (subreg:QI
-           (any_extract:SWI248
-             (match_operand 0 "int248_register_operand" "Q")
-             (const_int 8)
-             (const_int 8)) 0)
+           (match_operator:SWI248 2 "extract_operator"
+             [(match_operand 0 "int248_register_operand" "Q")
+              (const_int 8)
+              (const_int 8)]) 0)
          (match_operand:QI 1 "const0_operand")))]
   "ix86_match_ccmode (insn, CCNOmode)"
   "test{b}\t%h0, %h0"
   [(set (reg FLAGS_REG)
        (compare
          (subreg:QI
-           (any_extract:SWI248
-             (match_operand 0 "int248_register_operand" "Q")
-             (const_int 8)
-             (const_int 8)) 0)
+           (match_operator:SWI248 2 "extract_operator"
+             [(match_operand 0 "int248_register_operand" "Q")
+              (const_int 8)
+              (const_int 8)]) 0)
          (match_operand:QI 1 "norex_memory_operand" "Bn")))]
   "TARGET_64BIT && reload_completed
    && ix86_match_ccmode (insn, CCmode)"
   [(set (reg FLAGS_REG)
        (compare
          (subreg:QI
-           (any_extract:SWI248
-             (match_operand 0 "int248_register_operand" "Q,Q")
-             (const_int 8)
-             (const_int 8)) 0)
+           (match_operator:SWI248 2 "extract_operator"
+             [(match_operand 0 "int248_register_operand" "Q,Q")
+              (const_int 8)
+              (const_int 8)]) 0)
          (match_operand:QI 1 "general_operand" "QnBc,m")))]
   "ix86_match_ccmode (insn, CCmode)"
   "cmp{b}\t{%1, %h0|%h0, %1}"
    (set (match_operand 3 "flags_reg_operand")
        (match_operator 4 "compare_operator"
          [(subreg:QI
-            (any_extract:SWI248
-              (match_operand 2 "int248_register_operand")
-              (const_int 8)
-              (const_int 8)) 0)
+            (match_operator:SWI248 5 "extract_operator"
+              [(match_operand 2 "int248_register_operand")
+               (const_int 8)
+               (const_int 8)]) 0)
           (match_dup 0)]))]
   "TARGET_64BIT
    && peep2_reg_dead_p (2, operands[0])"
   [(set (match_dup 3)
        (match_op_dup 4
          [(subreg:QI
-            (any_extract:SWI248
-              (match_dup 2)
-              (const_int 8)
-              (const_int 8)) 0)
+            (match_op_dup 5
+              [(match_dup 2)
+               (const_int 8)
+               (const_int 8)]) 0)
           (match_dup 1)]))])
 
 (define_insn "*cmpqi_ext<mode>_4"
   [(set (reg FLAGS_REG)
        (compare
          (subreg:QI
-           (any_extract:SWI248
-             (match_operand 0 "int248_register_operand" "Q")
-             (const_int 8)
-             (const_int 8)) 0)
+           (match_operator:SWI248 2 "extract_operator"
+             [(match_operand 0 "int248_register_operand" "Q")
+              (const_int 8)
+              (const_int 8)]) 0)
          (subreg:QI
-           (any_extract:SWI248
-             (match_operand 1 "int248_register_operand" "Q")
-             (const_int 8)
-             (const_int 8)) 0)))]
+           (match_operator:SWI248 3 "extract_operator"
+             [(match_operand 1 "int248_register_operand" "Q")
+              (const_int 8)
+              (const_int 8)]) 0)))]
   "ix86_match_ccmode (insn, CCmode)"
   "cmp{b}\t{%h1, %h0|%h0, %h1}"
   [(set_attr "type" "icmp")
     operands[1] = copy_to_reg (operands[1]);
 })
 
-(define_insn "*extzvqi_mem_rex64"
-  [(set (match_operand:QI 0 "norex_memory_operand" "=Bn")
-       (subreg:QI
-         (zero_extract:SWI248
-           (match_operand 1 "int248_register_operand" "Q")
-           (const_int 8)
-           (const_int 8)) 0))]
-  "TARGET_64BIT && reload_completed"
-  "mov{b}\t{%h1, %0|%0, %h1}"
-  [(set_attr "type" "imov")
-   (set_attr "mode" "QI")])
-
 (define_insn "*extzv<mode>"
   [(set (match_operand:SWI248 0 "register_operand" "=R")
        (zero_extract:SWI248 (match_operand 1 "int248_register_operand" "Q")
   [(set_attr "type" "imovx")
    (set_attr "mode" "SI")])
 
+(define_insn "*extzvqi_mem_rex64"
+  [(set (match_operand:QI 0 "norex_memory_operand" "=Bn")
+       (subreg:QI
+         (match_operator:SWI248 2 "extract_operator"
+           [(match_operand 1 "int248_register_operand" "Q")
+            (const_int 8)
+            (const_int 8)]) 0))]
+  "TARGET_64BIT && reload_completed"
+  "mov{b}\t{%h1, %0|%0, %h1}"
+  [(set_attr "type" "imov")
+   (set_attr "mode" "QI")])
+
 (define_insn "*extzvqi"
   [(set (match_operand:QI 0 "nonimmediate_operand" "=QBc,?R,m")
        (subreg:QI
-         (zero_extract:SWI248
-           (match_operand 1 "int248_register_operand" "Q,Q,Q")
-           (const_int 8)
-           (const_int 8)) 0))]
+         (match_operator:SWI248 2 "extract_operator"
+           [(match_operand 1 "int248_register_operand" "Q,Q,Q")
+            (const_int 8)
+            (const_int 8)]) 0))]
   ""
 {
   switch (get_attr_type (insn))
 (define_peephole2
   [(set (match_operand:QI 0 "register_operand")
        (subreg:QI
-         (zero_extract:SWI248 (match_operand 1 "int248_register_operand")
-                              (const_int 8)
-                              (const_int 8)) 0))
+         (match_operator:SWI248 3 "extract_operator"
+           [(match_operand 1 "int248_register_operand")
+            (const_int 8)
+            (const_int 8)]) 0))
    (set (match_operand:QI 2 "norex_memory_operand") (match_dup 0))]
   "TARGET_64BIT
    && peep2_reg_dead_p (2, operands[0])"
   [(set (match_dup 2)
        (subreg:QI
-         (zero_extract:SWI248 (match_dup 1)
-                              (const_int 8)
-                              (const_int 8)) 0))])
+         (match_op_dup 3
+           [(match_dup 1)
+            (const_int 8)
+            (const_int 8)]) 0))])
 
 (define_expand "insv<mode>"
   [(set (zero_extract:SWI248 (match_operand:SWI248 0 "register_operand")
          (match_operand 0 "int248_register_operand" "+Q")
          (const_int 8)
          (const_int 8))
-       (any_extract:SWI248
-         (match_operand 1 "int248_register_operand" "Q")
-         (const_int 8)
-         (const_int 8)))]
+       (match_operator:SWI248 2 "extract_operator"
+         [(match_operand 1 "int248_register_operand" "Q")
+          (const_int 8)
+          (const_int 8)]))]
   ""
   "mov{b}\t{%h1, %h0|%h0, %h1}"
   [(set_attr "type" "imov")
   [(set (match_operand:SWI24 0 "register_operand" "=R")
        (sign_extend:SWI24
          (subreg:QI
-           (zero_extract:SWI248
-             (match_operand 1 "int248_register_operand" "Q")
-             (const_int 8)
-             (const_int 8)) 0)))]
+           (match_operator:SWI248 2 "extract_operator"
+             [(match_operand 1 "int248_register_operand" "Q")
+              (const_int 8)
+              (const_int 8)]) 0)))]
   ""
   "movs{b<SWI24:imodesuffix>|x}\t{%h1, %0|%0, %h1}"
    [(set_attr "type" "imovx")
   [(set (match_operand:QI 0 "nonimm_x64constmem_operand" "=QBc,m")
        (plus:QI
          (subreg:QI
-           (zero_extract:SWI248
-             (match_operand 2 "int248_register_operand" "Q,Q")
-             (const_int 8)
-             (const_int 8)) 0)
+           (match_operator:SWI248 3 "extract_operator"
+             [(match_operand 2 "int248_register_operand" "Q,Q")
+              (const_int 8)
+              (const_int 8)]) 0)
          (match_operand:QI 1 "nonimm_x64constmem_operand" "0,0")))
    (clobber (reg:CC FLAGS_REG))]
   ""
        (subreg:SWI248
          (plus:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "0,0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "0,0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (match_operand:QI 2 "general_x64constmem_operand" "QnBc,m")) 0))
    (clobber (reg:CC FLAGS_REG))]
   "/* FIXME: without this LRA can't reload this pattern, see PR82524.  */
        (subreg:SWI248
          (plus:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "%0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "%0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 2 "int248_register_operand" "Q")
-               (const_int 8)
-               (const_int 8)) 0)) 0))
+             (match_operator:SWI248 4 "extract_operator"
+               [(match_operand 2 "int248_register_operand" "Q")
+                (const_int 8)
+                (const_int 8)]) 0)) 0))
   (clobber (reg:CC FLAGS_REG))]
   "/* FIXME: without this LRA can't reload this pattern, see PR82524.  */
    rtx_equal_p (operands[0], operands[1])
        (minus:QI
          (match_operand:QI 1 "nonimm_x64constmem_operand" "0,0")
          (subreg:QI
-           (zero_extract:SWI248
-             (match_operand 2 "int248_register_operand" "Q,Q")
-             (const_int 8)
-             (const_int 8)) 0)))
+           (match_operator:SWI248 3 "extract_operator"
+             [(match_operand 2 "int248_register_operand" "Q,Q")
+              (const_int 8)
+              (const_int 8)]) 0)))
    (clobber (reg:CC FLAGS_REG))]
   ""
   "sub{b}\t{%h2, %0|%0, %h2}"
        (subreg:SWI248
          (minus:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 2 "int248_register_operand" "Q")
-               (const_int 8)
-               (const_int 8)) 0)) 0))
+             (match_operator:SWI248 4 "extract_operator"
+               [(match_operand 2 "int248_register_operand" "Q")
+                (const_int 8)
+                (const_int 8)]) 0)) 0))
   (clobber (reg:CC FLAGS_REG))]
   "/* FIXME: without this LRA can't reload this pattern, see PR82524.  */
    rtx_equal_p (operands[0], operands[1])"
        (compare
          (and:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 0 "int248_register_operand" "Q,Q")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 2 "extract_operator"
+               [(match_operand 0 "int248_register_operand" "Q,Q")
+                (const_int 8)
+                (const_int 8)]) 0)
            (match_operand:QI 1 "general_x64constmem_operand" "QnBc,m"))
          (const_int 0)))]
   "ix86_match_ccmode (insn, CCNOmode)"
        (compare
          (and:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 0 "int248_register_operand" "Q")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 2 "extract_operator"
+               [(match_operand 0 "int248_register_operand" "Q")
+                (const_int 8)
+                (const_int 8)]) 0)
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "Q")
-               (const_int 8)
-               (const_int 8)) 0))
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "Q")
+                (const_int 8)
+                (const_int 8)]) 0))
          (const_int 0)))]
   "ix86_match_ccmode (insn, CCNOmode)"
   "test{b}\t{%h1, %h0|%h0, %h1}"
   [(set (match_operand:QI 0 "nonimm_x64constmem_operand" "=QBc,m")
        (and:QI
          (subreg:QI
-           (zero_extract:SWI248
-             (match_operand 2 "int248_register_operand" "Q,Q")
-             (const_int 8)
-             (const_int 8)) 0)
+           (match_operator:SWI248 3 "extract_operator"
+             [(match_operand 2 "int248_register_operand" "Q,Q")
+              (const_int 8)
+              (const_int 8)]) 0)
          (match_operand:QI 1 "nonimm_x64constmem_operand" "0,0")))
    (clobber (reg:CC FLAGS_REG))]
   ""
        (subreg:SWI248
          (and:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "0,0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "0,0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (match_operand:QI 2 "general_x64constmem_operand" "QnBc,m")) 0))
    (clobber (reg:CC FLAGS_REG))]
   "/* FIXME: without this LRA can't reload this pattern, see PR82524.  */
        (compare
          (and:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "0,0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "0,0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (match_operand:QI 2 "general_x64constmem_operand" "QnBc,m"))
          (const_int 0)))
    (set (zero_extract:SWI248
        (subreg:SWI248
          (and:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_dup 1)
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_op_dup 3
+               [(match_dup 1)
+                (const_int 8)
+                (const_int 8)]) 0)
            (match_dup 2)) 0))]
   "ix86_match_ccmode (insn, CCNOmode)
    /* FIXME: without this LRA can't reload this pattern, see PR82524.  */
        (subreg:SWI248
          (and:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "%0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "%0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 2 "int248_register_operand" "Q")
-               (const_int 8)
-               (const_int 8)) 0)) 0))
+             (match_operator:SWI248 4 "extract_operator"
+               [(match_operand 2 "int248_register_operand" "Q")
+                (const_int 8)
+                (const_int 8)]) 0)) 0))
    (clobber (reg:CC FLAGS_REG))]
   "/* FIXME: without this LRA can't reload this pattern, see PR82524.  */
    rtx_equal_p (operands[0], operands[1])
   [(set (match_operand:QI 0 "nonimm_x64constmem_operand" "=QBc,m")
        (any_or:QI
          (subreg:QI
-           (zero_extract:SWI248
-             (match_operand 2 "int248_register_operand" "Q,Q")
-             (const_int 8)
-             (const_int 8)) 0)
+           (match_operator:SWI248 3 "extract_operator"
+             [(match_operand 2 "int248_register_operand" "Q,Q")
+              (const_int 8)
+              (const_int 8)]) 0)
          (match_operand:QI 1 "nonimm_x64constmem_operand" "0,0")))
    (clobber (reg:CC FLAGS_REG))]
   ""
        (subreg:SWI248
          (any_or:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "0,0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "0,0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (match_operand:QI 2 "general_x64constmem_operand" "QnBc,m")) 0))
    (clobber (reg:CC FLAGS_REG))]
   "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
        (subreg:SWI248
          (any_or:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "%0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "%0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 2 "int248_register_operand" "Q")
-               (const_int 8)
-               (const_int 8)) 0)) 0))
+             (match_operator:SWI248 4 "extract_operator"
+               [(match_operand 2 "int248_register_operand" "Q")
+                (const_int 8)
+                (const_int 8)]) 0)) 0))
    (clobber (reg:CC FLAGS_REG))]
   "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
    /* FIXME: without this LRA can't reload this pattern, see PR82524.  */
        (compare
          (xor:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "0,0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "0,0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (match_operand:QI 2 "general_x64constmem_operand" "QnBc,m"))
          (const_int 0)))
    (set (zero_extract:SWI248
        (subreg:SWI248
          (xor:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_dup 1)
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_op_dup 3
+               [(match_dup 1)
+                (const_int 8)
+                (const_int 8)]) 0)
          (match_dup 2)) 0))]
   "ix86_match_ccmode (insn, CCNOmode)
    /* FIXME: without this LRA can't reload this pattern, see PR82524.  */
        (subreg:SWI248
          (neg:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "0")
-               (const_int 8)
-               (const_int 8)) 0)) 0))
+             (match_operator:SWI248 2 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "0")
+                (const_int 8)
+                (const_int 8)]) 0)) 0))
    (clobber (reg:CC FLAGS_REG))]
   "/* FIXME: without this LRA can't reload this pattern, see PR82524.  */
    rtx_equal_p (operands[0], operands[1])"
        (subreg:SWI248
          (ashift:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (match_operand:QI 2 "nonmemory_operand" "cI")) 0))
   (clobber (reg:CC FLAGS_REG))]
   "/* FIXME: without this LRA can't reload this pattern, see PR82524.  */
        (subreg:SWI248
          (any_shiftrt:QI
            (subreg:QI
-             (zero_extract:SWI248
-               (match_operand 1 "int248_register_operand" "0")
-               (const_int 8)
-               (const_int 8)) 0)
+             (match_operator:SWI248 3 "extract_operator"
+               [(match_operand 1 "int248_register_operand" "0")
+                (const_int 8)
+                (const_int 8)]) 0)
            (match_operand:QI 2 "nonmemory_operand" "cI")) 0))
   (clobber (reg:CC FLAGS_REG))]
   "/* FIXME: without this LRA can't reload this pattern, see PR82524.  */
        (match_operator 1 "compare_operator"
          [(and:QI
             (subreg:QI
-              (zero_extract:SWI248 (match_operand 2 "int248_register_operand")
-                                   (const_int 8)
-                                   (const_int 8)) 0)
+              (match_operator:SWI248 4 "extract_operator"
+                [(match_operand 2 "int248_register_operand")
+                 (const_int 8)
+                 (const_int 8)]) 0)
             (match_operand 3 "const_int_operand"))
           (const_int 0)]))]
   "! TARGET_PARTIAL_REG_STALL
           (match_op_dup 1
             [(and:QI
                (subreg:QI
-                 (zero_extract:SWI248 (match_dup 2)
-                                      (const_int 8)
-                                      (const_int 8)) 0)
+                 (match_op_dup 4 [(match_dup 2)
+                                  (const_int 8)
+                                  (const_int 8)]) 0)
                (match_dup 3))
              (const_int 0)]))
       (set (zero_extract:SWI248 (match_dup 2)
           (subreg:SWI248
             (and:QI
               (subreg:QI
-                (zero_extract:SWI248 (match_dup 2)
-                                     (const_int 8)
-                                     (const_int 8)) 0)
+                (match_op_dup 4 [(match_dup 2)
+                                 (const_int 8)
+                                 (const_int 8)]) 0)
               (match_dup 3)) 0))])])
 
 ;; Don't do logical operations with memory inputs.
index b4d9ab40ab93c4a92de796dd805263efca4a5c73..3f934277a57124e757c05b109998eae2181fe8b2 100644 (file)
 (define_predicate "compare_operator"
   (match_code "compare"))
 
+(define_predicate "extract_operator"
+  (match_code "zero_extract,sign_extract"))
+
 ;; Return true if OP is a memory operand, aligned to
 ;; less than its natural alignment.
 (define_predicate "misaligned_operand"
diff --git a/gcc/testsuite/gcc.target/i386/pr78952-4.c b/gcc/testsuite/gcc.target/i386/pr78952-4.c
new file mode 100644 (file)
index 0000000..c7bd63c
--- /dev/null
@@ -0,0 +1,48 @@
+/* PR target/78952 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -masm=att" } */
+/* { dg-final { scan-assembler-not "mov\[sz\]bl" } } */
+/* { dg-final { scan-assembler-not "movb" } } */
+
+struct S1
+{
+  signed char pad1;
+  signed char val;
+  signed short pad2;
+};
+
+struct S1 test_and (struct S1 a, struct S1 b)
+{
+  a.val &= b.val;
+
+  return a;
+}
+
+/* { dg-final { scan-assembler "\[ \t\]andb" } } */
+
+struct S1 test_or (struct S1 a, struct S1 b)
+{
+  a.val |= b.val;
+
+  return a;
+}
+
+/* { dg-final { scan-assembler "\[ \t\]orb" } } */
+
+struct S1 test_xor (struct S1 a, struct S1 b)
+{
+  a.val ^= b.val;
+
+  return a;
+}
+
+/* { dg-final { scan-assembler "\[ \t\]xorb" } } */
+
+struct S1 test_add (struct S1 a, struct S1 b)
+{
+  a.val += b.val;
+
+  return a;
+}
+
+/* { dg-final { scan-assembler "\[ \t\]addb" } } */
This page took 0.14066 seconds and 5 git commands to generate.