在 2025/1/21 下午12:59, Xi Ruoyao 写道:
On Tue, 2025-01-21 at 11:46 +0800, Lulu Cheng wrote:
在 2025/1/18 下午7:33, Xi Ruoyao 写道:
/* snip */
   ;; This code iterator allows unsigned and signed division to be generated
   ;; from the same template.
@@ -3083,39 +3084,6 @@ (define_expand "rotl<mode>3"
         }
     });
-;; The following templates were added to generate "bstrpick.d + alsl.d"
-;; instruction pairs.
-;; It is required that the values of const_immalsl_operand and
-;; immediate_operand must have the following correspondence:
-;;
-;; (immediate_operand >> const_immalsl_operand) == 0xffffffff
-
-(define_insn "zero_extend_ashift"
-  [(set (match_operand:DI 0 "register_operand" "=r")
-       (and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
-                          (match_operand 2 "const_immalsl_operand" ""))
-               (match_operand 3 "immediate_operand" "")))]
-  "TARGET_64BIT
-   && ((INTVAL (operands[3]) >> INTVAL (operands[2])) == 0xffffffff)"
-  "bstrpick.d\t%0,%1,31,0\n\talsl.d\t%0,%0,$r0,%2"
-  [(set_attr "type" "arith")
-   (set_attr "mode" "DI")
-   (set_attr "insn_count" "2")])
-
-(define_insn "bstrpick_alsl_paired"
-  [(set (match_operand:DI 0 "register_operand" "=&r")
-       (plus:DI
-         (and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
-                            (match_operand 2 "const_immalsl_operand" ""))
-                 (match_operand 3 "immediate_operand" ""))
-         (match_operand:DI 4 "register_operand" "r")))]
-  "TARGET_64BIT
-   && ((INTVAL (operands[3]) >> INTVAL (operands[2])) == 0xffffffff)"
-  "bstrpick.d\t%0,%1,31,0\n\talsl.d\t%0,%0,%4,%2"
-  [(set_attr "type" "arith")
-   (set_attr "mode" "DI")
-   (set_attr "insn_count" "2")])
-
Hi,

In LoongArch, the microarchitecture has performed instruction fusion on
bstrpick.d+alsl.d.

This modification may cause the two instructions to not be close together.

So I think these two templates cannot be deleted. I will test the impact
of this patch on the spec today.
Oops.  I guess we can salvage it with TARGET_SCHED_MACRO_FUSION_P and
TARGET_SCHED_MACRO_FUSION_PAIR_P.  And I'd like to know more details:

1. Is the fusion applying to all bstrpick.d + alsl.d, or only bstrpick.d
rd, rs, 31, 0?
2. Is the fusion also applying to bstrpick.d + slli.d, or we really have
to write the strange "alsl.d rd, rs, r0, shamt" instruction?

Currently, command fusion can only be done in the following situations:

bstrpick.d rd, rs, 31, 0 + alsl.d rd1,rj,rk,shamt and "rd = rj"

Reply via email to