[llvm] 36dbe53 - [AArch64][ISel] Add clmul to pmullb/t lowering (#180568)

via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 12 00:40:54 PST 2026


Author: Matthew Devereau
Date: 2026-02-12T08:40:49Z
New Revision: 36dbe537c4ab22f638e2f55e48d6af58414a6d3e

URL: https://github.com/llvm/llvm-project/commit/36dbe537c4ab22f638e2f55e48d6af58414a6d3e
DIFF: https://github.com/llvm/llvm-project/commit/36dbe537c4ab22f638e2f55e48d6af58414a6d3e.diff

LOG: [AArch64][ISel] Add clmul to pmullb/t lowering (#180568)

Added: 
    

Modified: 
    llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
    llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
    llvm/test/CodeGen/AArch64/clmul-scalable.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index b8dead36925b9..028f2114d1d60 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -2002,7 +2002,7 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
       setPartialReduceMLAAction(MLAOps, MVT::nxv4i32, MVT::nxv8i16, Legal);
       setPartialReduceMLAAction(MLAOps, MVT::nxv8i16, MVT::nxv16i8, Legal);
 
-      setOperationAction(ISD::CLMUL, MVT::nxv16i8, Legal);
+      setOperationAction(ISD::CLMUL, {MVT::nxv16i8, MVT::nxv4i32}, Legal);
     }
 
     // Handle floating-point partial reduction
@@ -2015,6 +2015,10 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
     }
   }
 
+  if (Subtarget->hasSVEAES() &&
+      (Subtarget->isSVEAvailable() || Subtarget->hasSSVE_AES()))
+    setOperationAction(ISD::CLMUL, MVT::nxv2i64, Legal);
+
   // Handle non-aliasing elements mask
   if (Subtarget->hasSVE2() ||
       (Subtarget->hasSME() && Subtarget->isStreaming())) {

diff  --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
index 61db07493260c..2d24e22f682b9 100644
--- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
@@ -3993,6 +3993,9 @@ let Predicates = [HasSVE2_or_SME] in {
   defm PMULLB_ZZZ   : sve2_pmul_long<0b0, "pmullb", int_aarch64_sve_pmullb_pair>;
   defm PMULLT_ZZZ   : sve2_pmul_long<0b1, "pmullt", int_aarch64_sve_pmullt_pair>;
 
+  def : Pat<(nxv4i32 (clmul nxv4i32:$Rn, nxv4i32:$Rm)),
+            (TRN1_ZZZ_S (PMULLB_ZZZ_D $Rn, $Rm), (PMULLT_ZZZ_D $Rn, $Rm))>;
+
   // SVE2 bitwise shift and insert
   defm SRI_ZZI : sve2_int_bin_shift_imm_right<0b0, "sri", AArch64vsri>;
   defm SLI_ZZI : sve2_int_bin_shift_imm_left< 0b1, "sli", AArch64vsli>;
@@ -4252,6 +4255,10 @@ let Predicates = [HasSVEAES, HasNonStreamingSVE_or_SSVE_AES] in {
   // to NEON PMULL2 instruction.
   defm PMULLB_ZZZ_Q : sve2_wide_int_arith_pmul<0b00, 0b11010, "pmullb", int_aarch64_sve_pmullb_pair>;
   defm PMULLT_ZZZ_Q : sve2_wide_int_arith_pmul<0b00, 0b11011, "pmullt", int_aarch64_sve_pmullt_pair>;
+
+  // Use low 64 bits of PMULLB/T for nxv2i64 clmul
+  def : Pat<(nxv2i64 (clmul nxv2i64:$Rn, nxv2i64:$Rm)),
+            (TRN1_ZZZ_D (PMULLB_ZZZ_Q $Rn, $Rm), (PMULLT_ZZZ_Q $Rn, $Rm))>;
 }
 
 let Predicates = [HasSVESM4] in {

diff  --git a/llvm/test/CodeGen/AArch64/clmul-scalable.ll b/llvm/test/CodeGen/AArch64/clmul-scalable.ll
index 58dbba833f67b..df7b7542d6cac 100644
--- a/llvm/test/CodeGen/AArch64/clmul-scalable.ll
+++ b/llvm/test/CodeGen/AArch64/clmul-scalable.ll
@@ -1,5 +1,8 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
 ; RUN: llc -mtriple=aarch64-linux-unknown-gnu %s -o - -mattr=+sve | FileCheck %s --check-prefix=CHECK-SVE
+; RUN: llc -mtriple=aarch64-linux-unknown-gnu %s -o - -mattr=+sve,sve-aes | FileCheck %s --check-prefix=CHECK-SVE-AES
+; RUN: llc -mtriple=aarch64-linux-unknown-gnu %s -o - -mattr=+sme -force-streaming | FileCheck %s --check-prefix=CHECK-SME-STREAMING
+; RUN: llc -mtriple=aarch64-linux-unknown-gnu %s -o - -mattr=+sme,ssve-aes -force-streaming | FileCheck %s --check-prefix=CHECK-SME-STREAMING-SSVE-AES
 ; RUN: llc -mtriple=aarch64-linux-unknown-gnu %s -o - -mattr=+sve2 | FileCheck %s --check-prefix=CHECK-SVE2
 ; RUN: llc -mtriple=aarch64-linux-unknown-gnu %s -o - -mattr=+sve2-aes | FileCheck %s --check-prefix=CHECK-SVE2-AES
 
@@ -39,6 +42,51 @@ define <vscale x 16 x i8> @clmul_nxv16i8(<vscale x 16 x i8> %x, <vscale x 16 x i
 ; CHECK-SVE-NEXT:    eor z0.d, z1.d, z0.d
 ; CHECK-SVE-NEXT:    ret
 ;
+; CHECK-SVE-AES-LABEL: clmul_nxv16i8:
+; CHECK-SVE-AES:       // %bb.0:
+; CHECK-SVE-AES-NEXT:    mov z2.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z7.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z24.d, z1.d
+; CHECK-SVE-AES-NEXT:    ptrue p0.b
+; CHECK-SVE-AES-NEXT:    and z1.b, z1.b, #0x80
+; CHECK-SVE-AES-NEXT:    and z2.b, z2.b, #0x2
+; CHECK-SVE-AES-NEXT:    and z3.b, z3.b, #0x1
+; CHECK-SVE-AES-NEXT:    and z4.b, z4.b, #0x4
+; CHECK-SVE-AES-NEXT:    and z5.b, z5.b, #0x8
+; CHECK-SVE-AES-NEXT:    and z6.b, z6.b, #0x10
+; CHECK-SVE-AES-NEXT:    and z7.b, z7.b, #0x20
+; CHECK-SVE-AES-NEXT:    and z24.b, z24.b, #0x40
+; CHECK-SVE-AES-NEXT:    mul z2.b, p0/m, z2.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z3.b, p0/m, z3.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z4.b, p0/m, z4.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z5.b, p0/m, z5.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z6.b, p0/m, z6.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z7.b, p0/m, z7.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z24.b, p0/m, z24.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z0.b, p0/m, z0.b, z1.b
+; CHECK-SVE-AES-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z5.d
+; CHECK-SVE-AES-NEXT:    eor z4.d, z6.d, z7.d
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z24.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z1.d, z0.d
+; CHECK-SVE-AES-NEXT:    ret
+;
+; CHECK-SME-STREAMING-LABEL: clmul_nxv16i8:
+; CHECK-SME-STREAMING:       // %bb.0:
+; CHECK-SME-STREAMING-NEXT:    pmul z0.b, z0.b, z1.b
+; CHECK-SME-STREAMING-NEXT:    ret
+;
+; CHECK-SME-STREAMING-SSVE-AES-LABEL: clmul_nxv16i8:
+; CHECK-SME-STREAMING-SSVE-AES:       // %bb.0:
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmul z0.b, z0.b, z1.b
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    ret
+;
 ; CHECK-SVE2-LABEL: clmul_nxv16i8:
 ; CHECK-SVE2:       // %bb.0:
 ; CHECK-SVE2-NEXT:    pmul z0.b, z0.b, z1.b
@@ -120,6 +168,193 @@ define <vscale x 8 x i16> @clmul_nxv8i16(<vscale x 8 x i16> %x, <vscale x 8 x i1
 ; CHECK-SVE-NEXT:    eor z0.d, z1.d, z0.d
 ; CHECK-SVE-NEXT:    ret
 ;
+; CHECK-SVE-AES-LABEL: clmul_nxv8i16:
+; CHECK-SVE-AES:       // %bb.0:
+; CHECK-SVE-AES-NEXT:    mov z2.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SVE-AES-NEXT:    ptrue p0.h
+; CHECK-SVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z7.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z24.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z25.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z2.h, z2.h, #0x2
+; CHECK-SVE-AES-NEXT:    and z3.h, z3.h, #0x1
+; CHECK-SVE-AES-NEXT:    and z4.h, z4.h, #0x4
+; CHECK-SVE-AES-NEXT:    and z5.h, z5.h, #0x8
+; CHECK-SVE-AES-NEXT:    mov z26.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z27.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z6.h, z6.h, #0x10
+; CHECK-SVE-AES-NEXT:    and z7.h, z7.h, #0x20
+; CHECK-SVE-AES-NEXT:    and z24.h, z24.h, #0x80
+; CHECK-SVE-AES-NEXT:    mul z2.h, p0/m, z2.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z3.h, p0/m, z3.h, z0.h
+; CHECK-SVE-AES-NEXT:    and z25.h, z25.h, #0x100
+; CHECK-SVE-AES-NEXT:    mul z4.h, p0/m, z4.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z5.h, p0/m, z5.h, z0.h
+; CHECK-SVE-AES-NEXT:    mov z28.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z6.h, p0/m, z6.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z7.h, p0/m, z7.h, z0.h
+; CHECK-SVE-AES-NEXT:    and z26.h, z26.h, #0x800
+; CHECK-SVE-AES-NEXT:    mul z24.h, p0/m, z24.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z25.h, p0/m, z25.h, z0.h
+; CHECK-SVE-AES-NEXT:    and z27.h, z27.h, #0x1000
+; CHECK-SVE-AES-NEXT:    mov z29.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z30.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z28.h, z28.h, #0x40
+; CHECK-SVE-AES-NEXT:    mul z26.h, p0/m, z26.h, z0.h
+; CHECK-SVE-AES-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z5.d
+; CHECK-SVE-AES-NEXT:    mul z27.h, p0/m, z27.h, z0.h
+; CHECK-SVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z28.h, p0/m, z28.h, z0.h
+; CHECK-SVE-AES-NEXT:    and z29.h, z29.h, #0x200
+; CHECK-SVE-AES-NEXT:    and z30.h, z30.h, #0x2000
+; CHECK-SVE-AES-NEXT:    eor z6.d, z6.d, z7.d
+; CHECK-SVE-AES-NEXT:    eor z7.d, z24.d, z25.d
+; CHECK-SVE-AES-NEXT:    and z1.h, z1.h, #0x8000
+; CHECK-SVE-AES-NEXT:    and z4.h, z4.h, #0x400
+; CHECK-SVE-AES-NEXT:    and z5.h, z5.h, #0x4000
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    mul z29.h, p0/m, z29.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z30.h, p0/m, z30.h, z0.h
+; CHECK-SVE-AES-NEXT:    eor z24.d, z26.d, z27.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z6.d, z28.d
+; CHECK-SVE-AES-NEXT:    mul z4.h, p0/m, z4.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z5.h, p0/m, z5.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z0.h, p0/m, z0.h, z1.h
+; CHECK-SVE-AES-NEXT:    eor z6.d, z7.d, z29.d
+; CHECK-SVE-AES-NEXT:    eor z7.d, z24.d, z30.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    eor z2.d, z6.d, z4.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z7.d, z5.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z1.d, z2.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z3.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z1.d, z0.d
+; CHECK-SVE-AES-NEXT:    ret
+;
+; CHECK-SME-STREAMING-LABEL: clmul_nxv8i16:
+; CHECK-SME-STREAMING:       // %bb.0:
+; CHECK-SME-STREAMING-NEXT:    mov z2.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z2.h, z2.h, #0x2
+; CHECK-SME-STREAMING-NEXT:    and z3.h, z3.h, #0x1
+; CHECK-SME-STREAMING-NEXT:    and z4.h, z4.h, #0x8
+; CHECK-SME-STREAMING-NEXT:    and z5.h, z5.h, #0x4
+; CHECK-SME-STREAMING-NEXT:    and z6.h, z6.h, #0x20
+; CHECK-SME-STREAMING-NEXT:    mul z2.h, z0.h, z2.h
+; CHECK-SME-STREAMING-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-NEXT:    mul z4.h, z0.h, z4.h
+; CHECK-SME-STREAMING-NEXT:    mul z5.h, z0.h, z5.h
+; CHECK-SME-STREAMING-NEXT:    mul z6.h, z0.h, z6.h
+; CHECK-SME-STREAMING-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.h, z3.h, #0x10
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-NEXT:    and z4.h, z4.h, #0x80
+; CHECK-SME-STREAMING-NEXT:    and z5.h, z5.h, #0x40
+; CHECK-SME-STREAMING-NEXT:    mul z4.h, z0.h, z4.h
+; CHECK-SME-STREAMING-NEXT:    mul z5.h, z0.h, z5.h
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.h, z3.h, #0x200
+; CHECK-SME-STREAMING-NEXT:    and z6.h, z6.h, #0x100
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-NEXT:    mul z6.h, z0.h, z6.h
+; CHECK-SME-STREAMING-NEXT:    and z4.h, z4.h, #0x800
+; CHECK-SME-STREAMING-NEXT:    and z5.h, z5.h, #0x400
+; CHECK-SME-STREAMING-NEXT:    mul z4.h, z0.h, z4.h
+; CHECK-SME-STREAMING-NEXT:    mul z5.h, z0.h, z5.h
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.h, z3.h, #0x2000
+; CHECK-SME-STREAMING-NEXT:    and z6.h, z6.h, #0x1000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z1.h, z1.h, #0x4000
+; CHECK-SME-STREAMING-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-NEXT:    mul z4.h, z0.h, z6.h
+; CHECK-SME-STREAMING-NEXT:    and z5.h, z5.h, #0x8000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.h, z0.h, z5.h
+; CHECK-SME-STREAMING-NEXT:    mul z0.h, z0.h, z1.h
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z0.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    ret
+;
+; CHECK-SME-STREAMING-SSVE-AES-LABEL: clmul_nxv8i16:
+; CHECK-SME-STREAMING-SSVE-AES:       // %bb.0:
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z2.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z2.h, z2.h, #0x2
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z3.h, z3.h, #0x1
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z4.h, z4.h, #0x8
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z5.h, z5.h, #0x4
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z6.h, z6.h, #0x20
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z2.h, z0.h, z2.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z4.h, z0.h, z4.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z5.h, z0.h, z5.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z6.h, z0.h, z6.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z3.h, z3.h, #0x10
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z4.h, z4.h, #0x80
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z5.h, z5.h, #0x40
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z4.h, z0.h, z4.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z5.h, z0.h, z5.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z3.h, z3.h, #0x200
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z6.h, z6.h, #0x100
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z6.h, z0.h, z6.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z4.h, z4.h, #0x800
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z5.h, z5.h, #0x400
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z4.h, z0.h, z4.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z5.h, z0.h, z5.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z3.h, z3.h, #0x2000
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z6.h, z6.h, #0x1000
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z1.h, z1.h, #0x4000
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z4.h, z0.h, z6.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z5.h, z5.h, #0x8000
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z3.h, z0.h, z5.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z0.h, z0.h, z1.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z3.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z0.d, z2.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    ret
+;
 ; CHECK-SVE2-LABEL: clmul_nxv8i16:
 ; CHECK-SVE2:       // %bb.0:
 ; CHECK-SVE2-NEXT:    mov z2.d, z1.d
@@ -375,236 +610,163 @@ define <vscale x 4 x i32> @clmul_nxv4i32(<vscale x 4 x i32> %x, <vscale x 4 x i3
 ; CHECK-SVE-NEXT:    eor z0.d, z1.d, z0.d
 ; CHECK-SVE-NEXT:    ret
 ;
+; CHECK-SVE-AES-LABEL: clmul_nxv4i32:
+; CHECK-SVE-AES:       // %bb.0:
+; CHECK-SVE-AES-NEXT:    mov z2.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SVE-AES-NEXT:    ptrue p0.s
+; CHECK-SVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z7.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z24.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z25.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z2.s, z2.s, #0x2
+; CHECK-SVE-AES-NEXT:    and z3.s, z3.s, #0x1
+; CHECK-SVE-AES-NEXT:    mov z26.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z4.s, z4.s, #0x4
+; CHECK-SVE-AES-NEXT:    and z5.s, z5.s, #0x8
+; CHECK-SVE-AES-NEXT:    and z6.s, z6.s, #0x10
+; CHECK-SVE-AES-NEXT:    and z7.s, z7.s, #0x20
+; CHECK-SVE-AES-NEXT:    and z24.s, z24.s, #0x80
+; CHECK-SVE-AES-NEXT:    and z25.s, z25.s, #0x100
+; CHECK-SVE-AES-NEXT:    mul z2.s, p0/m, z2.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z3.s, p0/m, z3.s, z0.s
+; CHECK-SVE-AES-NEXT:    mov z27.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z4.s, p0/m, z4.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z5.s, p0/m, z5.s, z0.s
+; CHECK-SVE-AES-NEXT:    and z26.s, z26.s, #0x40
+; CHECK-SVE-AES-NEXT:    mul z6.s, p0/m, z6.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z7.s, p0/m, z7.s, z0.s
+; CHECK-SVE-AES-NEXT:    mov z28.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z24.s, p0/m, z24.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z25.s, p0/m, z25.s, z0.s
+; CHECK-SVE-AES-NEXT:    and z27.s, z27.s, #0x200
+; CHECK-SVE-AES-NEXT:    mul z26.s, p0/m, z26.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SVE-AES-NEXT:    eor z4.d, z4.d, z5.d
+; CHECK-SVE-AES-NEXT:    mov z29.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z28.s, z28.s, #0x8000
+; CHECK-SVE-AES-NEXT:    mul z27.s, p0/m, z27.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z5.d, z6.d, z7.d
+; CHECK-SVE-AES-NEXT:    mov z7.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z3.s, z3.s, #0x400
+; CHECK-SVE-AES-NEXT:    eor z6.d, z24.d, z25.d
+; CHECK-SVE-AES-NEXT:    mov z24.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z28.s, p0/m, z28.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z4.d
+; CHECK-SVE-AES-NEXT:    mov z25.d, z1.d
+; CHECK-SVE-AES-NEXT:    eor z4.d, z5.d, z26.d
+; CHECK-SVE-AES-NEXT:    and z7.s, z7.s, #0x800
+; CHECK-SVE-AES-NEXT:    mov z26.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z3.s, p0/m, z3.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z5.d, z6.d, z27.d
+; CHECK-SVE-AES-NEXT:    and z24.s, z24.s, #0x1000
+; CHECK-SVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z25.s, z25.s, #0x800000
+; CHECK-SVE-AES-NEXT:    mov z27.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z7.s, p0/m, z7.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z4.d
+; CHECK-SVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z24.s, p0/m, z24.s, z0.s
+; CHECK-SVE-AES-NEXT:    and z26.s, z26.s, #0x40000
+; CHECK-SVE-AES-NEXT:    and z29.s, z29.s, #0x100000
+; CHECK-SVE-AES-NEXT:    mul z25.s, p0/m, z25.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z3.d, z5.d, z3.d
+; CHECK-SVE-AES-NEXT:    and z6.s, z6.s, #0x2000
+; CHECK-SVE-AES-NEXT:    and z4.s, z4.s, #0x10000
+; CHECK-SVE-AES-NEXT:    and z27.s, z27.s, #0x1000000
+; CHECK-SVE-AES-NEXT:    mul z26.s, p0/m, z26.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z29.s, p0/m, z29.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z6.s, p0/m, z6.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z4.s, p0/m, z4.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z27.s, p0/m, z27.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z5.d, z7.d, z24.d
+; CHECK-SVE-AES-NEXT:    mov z24.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z7.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z3.s, z3.s, #0x20000
+; CHECK-SVE-AES-NEXT:    eor z5.d, z5.d, z6.d
+; CHECK-SVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z24.s, z24.s, #0x400000
+; CHECK-SVE-AES-NEXT:    and z7.s, z7.s, #0x4000
+; CHECK-SVE-AES-NEXT:    mul z3.s, p0/m, z3.s, z0.s
+; CHECK-SVE-AES-NEXT:    and z6.s, z6.s, #0x80000
+; CHECK-SVE-AES-NEXT:    mul z24.s, p0/m, z24.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z7.s, p0/m, z7.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z3.d
+; CHECK-SVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z6.s, p0/m, z6.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z24.d, z24.d, z25.d
+; CHECK-SVE-AES-NEXT:    mov z25.d, z1.d
+; CHECK-SVE-AES-NEXT:    eor z5.d, z5.d, z7.d
+; CHECK-SVE-AES-NEXT:    and z4.s, z4.s, #0x2000000
+; CHECK-SVE-AES-NEXT:    eor z3.d, z3.d, z26.d
+; CHECK-SVE-AES-NEXT:    mov z26.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z25.s, z25.s, #0x4000000
+; CHECK-SVE-AES-NEXT:    eor z7.d, z24.d, z27.d
+; CHECK-SVE-AES-NEXT:    mov z24.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z4.s, p0/m, z4.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z3.d, z3.d, z6.d
+; CHECK-SVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z26.s, z26.s, #0x200000
+; CHECK-SVE-AES-NEXT:    mov z27.d, z1.d
+; CHECK-SVE-AES-NEXT:    eor z5.d, z5.d, z28.d
+; CHECK-SVE-AES-NEXT:    mul z25.s, p0/m, z25.s, z0.s
+; CHECK-SVE-AES-NEXT:    and z24.s, z24.s, #0x20000000
+; CHECK-SVE-AES-NEXT:    and z6.s, z6.s, #0x8000000
+; CHECK-SVE-AES-NEXT:    eor z3.d, z3.d, z29.d
+; CHECK-SVE-AES-NEXT:    eor z4.d, z7.d, z4.d
+; CHECK-SVE-AES-NEXT:    mov z7.d, z1.d
+; CHECK-SVE-AES-NEXT:    mul z26.s, p0/m, z26.s, z0.s
+; CHECK-SVE-AES-NEXT:    and z27.s, z27.s, #0x40000000
+; CHECK-SVE-AES-NEXT:    mul z24.s, p0/m, z24.s, z0.s
+; CHECK-SVE-AES-NEXT:    and z1.s, z1.s, #0x80000000
+; CHECK-SVE-AES-NEXT:    mul z6.s, p0/m, z6.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z5.d
+; CHECK-SVE-AES-NEXT:    and z7.s, z7.s, #0x10000000
+; CHECK-SVE-AES-NEXT:    eor z4.d, z4.d, z25.d
+; CHECK-SVE-AES-NEXT:    mul z27.s, p0/m, z27.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z3.d, z3.d, z26.d
+; CHECK-SVE-AES-NEXT:    mul z7.s, p0/m, z7.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z4.d, z4.d, z6.d
+; CHECK-SVE-AES-NEXT:    mul z0.s, p0/m, z0.s, z1.s
+; CHECK-SVE-AES-NEXT:    eor z1.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z24.d, z27.d
+; CHECK-SVE-AES-NEXT:    eor z2.d, z4.d, z7.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z3.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z1.d, z2.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z1.d, z0.d
+; CHECK-SVE-AES-NEXT:    ret
+;
+; CHECK-SME-STREAMING-LABEL: clmul_nxv4i32:
+; CHECK-SME-STREAMING:       // %bb.0:
+; CHECK-SME-STREAMING-NEXT:    pmullt z2.d, z0.s, z1.s
+; CHECK-SME-STREAMING-NEXT:    pmullb z0.d, z0.s, z1.s
+; CHECK-SME-STREAMING-NEXT:    trn1 z0.s, z0.s, z2.s
+; CHECK-SME-STREAMING-NEXT:    ret
+;
+; CHECK-SME-STREAMING-SSVE-AES-LABEL: clmul_nxv4i32:
+; CHECK-SME-STREAMING-SSVE-AES:       // %bb.0:
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmullt z2.d, z0.s, z1.s
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmullb z0.d, z0.s, z1.s
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    trn1 z0.s, z0.s, z2.s
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    ret
+;
 ; CHECK-SVE2-LABEL: clmul_nxv4i32:
 ; CHECK-SVE2:       // %bb.0:
-; CHECK-SVE2-NEXT:    mov z2.d, z1.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z2.s, z2.s, #0x2
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x1
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x8
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x4
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x20
-; CHECK-SVE2-NEXT:    mul z2.s, z0.s, z2.s
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    eor z2.d, z3.d, z2.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x10
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x80
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x40
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x200
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x100
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x800
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x400
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x2000
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x1000
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x8000
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x4000
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x20000
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x10000
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x80000
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x40000
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x200000
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x100000
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x800000
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x400000
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x2000000
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x1000000
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x8000000
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x4000000
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x20000000
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x10000000
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    and z1.s, z1.s, #0x40000000
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x80000000
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    mul z0.s, z0.s, z1.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z0.d, z3.d
-; CHECK-SVE2-NEXT:    mov z0.d, z2.d
+; CHECK-SVE2-NEXT:    pmullt z2.d, z0.s, z1.s
+; CHECK-SVE2-NEXT:    pmullb z0.d, z0.s, z1.s
+; CHECK-SVE2-NEXT:    trn1 z0.s, z0.s, z2.s
 ; CHECK-SVE2-NEXT:    ret
 ;
 ; CHECK-SVE2-AES-LABEL: clmul_nxv4i32:
 ; CHECK-SVE2-AES:       // %bb.0:
-; CHECK-SVE2-AES-NEXT:    mov z2.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z2.s, z2.s, #0x2
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x1
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x8
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x4
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x20
-; CHECK-SVE2-AES-NEXT:    mul z2.s, z0.s, z2.s
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    eor z2.d, z3.d, z2.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x10
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x80
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x40
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x200
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x100
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x800
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x400
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x2000
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x1000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x8000
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x4000
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x20000
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x10000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x80000
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x40000
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x200000
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x100000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x800000
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x400000
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x2000000
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x1000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x8000000
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x4000000
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x20000000
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x10000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z1.s, z1.s, #0x40000000
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x80000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    mul z0.s, z0.s, z1.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z0.d, z2.d
+; CHECK-SVE2-AES-NEXT:    pmullt z2.d, z0.s, z1.s
+; CHECK-SVE2-AES-NEXT:    pmullb z0.d, z0.s, z1.s
+; CHECK-SVE2-AES-NEXT:    trn1 z0.s, z0.s, z2.s
 ; CHECK-SVE2-AES-NEXT:    ret
   %a = call <vscale x 4 x i32> @llvm.clmul.nxv4i32(<vscale x 4 x i32> %x, <vscale x 4 x i32> %y)
   ret <vscale x 4 x i32> %a
@@ -870,6 +1032,248 @@ define <vscale x 2 x i64> @clmul_nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i6
 ; CHECK-SVE-NEXT:    eor z0.d, z1.d, z0.d
 ; CHECK-SVE-NEXT:    ret
 ;
+; CHECK-SVE-AES-LABEL: clmul_nxv2i64:
+; CHECK-SVE-AES:       // %bb.0:
+; CHECK-SVE-AES-NEXT:    pmullt z2.q, z0.d, z1.d
+; CHECK-SVE-AES-NEXT:    pmullb z0.q, z0.d, z1.d
+; CHECK-SVE-AES-NEXT:    trn1 z0.d, z0.d, z2.d
+; CHECK-SVE-AES-NEXT:    ret
+;
+; CHECK-SME-STREAMING-LABEL: clmul_nxv2i64:
+; CHECK-SME-STREAMING:       // %bb.0:
+; CHECK-SME-STREAMING-NEXT:    mov z2.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z2.d, z2.d, #0x2
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x1
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x8
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x4
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x20
+; CHECK-SME-STREAMING-NEXT:    mul z2.d, z0.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x10
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x80
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x40
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x200
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x100
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x800
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x400
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x2000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x1000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x8000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x4000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x20000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x10000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x80000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x40000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x200000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x100000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x800000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x400000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x2000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x1000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x8000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x4000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x20000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x10000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x80000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x40000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x200000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x100000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x800000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x400000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x2000000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x1000000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x8000000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x4000000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x20000000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x10000000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x80000000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x40000000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x200000000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x100000000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x800000000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x400000000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x2000000000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x1000000000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x8000000000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x4000000000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x20000000000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x10000000000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x80000000000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x40000000000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x200000000000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x100000000000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x800000000000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x400000000000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x2000000000000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x1000000000000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z1.d, z1.d, #0x4000000000000000
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x8000000000000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    mul z0.d, z0.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z0.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    ret
+;
+; CHECK-SME-STREAMING-SSVE-AES-LABEL: clmul_nxv2i64:
+; CHECK-SME-STREAMING-SSVE-AES:       // %bb.0:
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmullt z2.q, z0.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmullb z0.q, z0.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    trn1 z0.d, z0.d, z2.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    ret
+;
 ; CHECK-SVE2-LABEL: clmul_nxv2i64:
 ; CHECK-SVE2:       // %bb.0:
 ; CHECK-SVE2-NEXT:    mov z2.d, z1.d
@@ -1100,230 +1504,9 @@ define <vscale x 2 x i64> @clmul_nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i6
 ;
 ; CHECK-SVE2-AES-LABEL: clmul_nxv2i64:
 ; CHECK-SVE2-AES:       // %bb.0:
-; CHECK-SVE2-AES-NEXT:    mov z2.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z2.d, z2.d, #0x2
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x1
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x8
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x4
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x20
-; CHECK-SVE2-AES-NEXT:    mul z2.d, z0.d, z2.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    eor z2.d, z3.d, z2.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x10
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x80
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x40
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x200
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x100
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x800
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x400
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x2000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x1000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x8000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x4000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x20000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x10000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x80000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x40000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x200000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x100000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x800000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x400000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x2000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x1000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x8000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x4000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x20000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x10000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x80000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x40000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x200000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x100000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x800000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x400000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x2000000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x1000000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x8000000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x4000000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x20000000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x10000000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x80000000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x40000000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x200000000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x100000000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x800000000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x400000000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x2000000000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x1000000000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x8000000000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x4000000000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x20000000000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x10000000000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x80000000000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x40000000000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x200000000000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x100000000000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x800000000000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x400000000000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x2000000000000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x1000000000000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z1.d, z1.d, #0x4000000000000000
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x8000000000000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    mul z0.d, z0.d, z1.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z0.d, z2.d
+; CHECK-SVE2-AES-NEXT:    pmullt z2.q, z0.d, z1.d
+; CHECK-SVE2-AES-NEXT:    pmullb z0.q, z0.d, z1.d
+; CHECK-SVE2-AES-NEXT:    trn1 z0.d, z0.d, z2.d
 ; CHECK-SVE2-AES-NEXT:    ret
   %a = call <vscale x 2 x i64> @llvm.clmul.nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i64> %y)
   ret <vscale x 2 x i64> %a
@@ -1361,6 +1544,45 @@ define <vscale x 16 x i8> @clmul_nxv16i8_zext(<vscale x 16 x i4> %x, <vscale x 1
 ; CHECK-SVE-NEXT:    eor z0.d, z1.d, z0.d
 ; CHECK-SVE-NEXT:    ret
 ;
+; CHECK-SVE-AES-LABEL: clmul_nxv16i8_zext:
+; CHECK-SVE-AES:       // %bb.0:
+; CHECK-SVE-AES-NEXT:    mov z2.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z0.b, z0.b, #0xf
+; CHECK-SVE-AES-NEXT:    and z1.b, z1.b, #0x8
+; CHECK-SVE-AES-NEXT:    ptrue p0.b
+; CHECK-SVE-AES-NEXT:    and z2.b, z2.b, #0x2
+; CHECK-SVE-AES-NEXT:    and z3.b, z3.b, #0x1
+; CHECK-SVE-AES-NEXT:    and z4.b, z4.b, #0x4
+; CHECK-SVE-AES-NEXT:    mul z1.b, p0/m, z1.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z2.b, p0/m, z2.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z3.b, p0/m, z3.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z4.b, p0/m, z4.b, z0.b
+; CHECK-SVE-AES-NEXT:    mul z0.b, z0.b, #0
+; CHECK-SVE-AES-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z0.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z2.d, z1.d
+; CHECK-SVE-AES-NEXT:    eor z2.d, z3.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z1.d, z2.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z1.d, z0.d
+; CHECK-SVE-AES-NEXT:    ret
+;
+; CHECK-SME-STREAMING-LABEL: clmul_nxv16i8_zext:
+; CHECK-SME-STREAMING:       // %bb.0:
+; CHECK-SME-STREAMING-NEXT:    and z0.b, z0.b, #0xf
+; CHECK-SME-STREAMING-NEXT:    and z1.b, z1.b, #0xf
+; CHECK-SME-STREAMING-NEXT:    pmul z0.b, z0.b, z1.b
+; CHECK-SME-STREAMING-NEXT:    ret
+;
+; CHECK-SME-STREAMING-SSVE-AES-LABEL: clmul_nxv16i8_zext:
+; CHECK-SME-STREAMING-SSVE-AES:       // %bb.0:
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z0.b, z0.b, #0xf
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z1.b, z1.b, #0xf
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmul z0.b, z0.b, z1.b
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    ret
+;
 ; CHECK-SVE2-LABEL: clmul_nxv16i8_zext:
 ; CHECK-SVE2:       // %bb.0:
 ; CHECK-SVE2-NEXT:    and z0.b, z0.b, #0xf
@@ -1426,6 +1648,127 @@ define <vscale x 8 x i16> @clmul_nxv8i16_zext(<vscale x 8 x i8> %x, <vscale x 8
 ; CHECK-SVE-NEXT:    eor z0.d, z1.d, z0.d
 ; CHECK-SVE-NEXT:    ret
 ;
+; CHECK-SVE-AES-LABEL: clmul_nxv8i16_zext:
+; CHECK-SVE-AES:       // %bb.0:
+; CHECK-SVE-AES-NEXT:    mov z2.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z7.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z24.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z0.h, z0.h, #0xff
+; CHECK-SVE-AES-NEXT:    and z1.h, z1.h, #0x80
+; CHECK-SVE-AES-NEXT:    and z2.h, z2.h, #0x2
+; CHECK-SVE-AES-NEXT:    and z3.h, z3.h, #0x1
+; CHECK-SVE-AES-NEXT:    and z4.h, z4.h, #0x4
+; CHECK-SVE-AES-NEXT:    and z5.h, z5.h, #0x8
+; CHECK-SVE-AES-NEXT:    and z6.h, z6.h, #0x10
+; CHECK-SVE-AES-NEXT:    and z7.h, z7.h, #0x20
+; CHECK-SVE-AES-NEXT:    and z24.h, z24.h, #0x40
+; CHECK-SVE-AES-NEXT:    ptrue p0.h
+; CHECK-SVE-AES-NEXT:    mul z2.h, p0/m, z2.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z3.h, p0/m, z3.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z4.h, p0/m, z4.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z5.h, p0/m, z5.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z6.h, p0/m, z6.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z7.h, p0/m, z7.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z24.h, p0/m, z24.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z1.h, p0/m, z1.h, z0.h
+; CHECK-SVE-AES-NEXT:    mul z0.h, z0.h, #0
+; CHECK-SVE-AES-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z5.d
+; CHECK-SVE-AES-NEXT:    eor z4.d, z6.d, z7.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z1.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z5.d, z0.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z24.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z1.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z4.d, z5.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z1.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z2.d, z1.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z3.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z1.d, z0.d
+; CHECK-SVE-AES-NEXT:    ret
+;
+; CHECK-SME-STREAMING-LABEL: clmul_nxv8i16_zext:
+; CHECK-SME-STREAMING:       // %bb.0:
+; CHECK-SME-STREAMING-NEXT:    mov z2.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z0.h, z0.h, #0xff
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z2.h, z2.h, #0x2
+; CHECK-SME-STREAMING-NEXT:    and z3.h, z3.h, #0x1
+; CHECK-SME-STREAMING-NEXT:    and z4.h, z4.h, #0x8
+; CHECK-SME-STREAMING-NEXT:    and z5.h, z5.h, #0x4
+; CHECK-SME-STREAMING-NEXT:    and z6.h, z6.h, #0x20
+; CHECK-SME-STREAMING-NEXT:    mul z2.h, z0.h, z2.h
+; CHECK-SME-STREAMING-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-NEXT:    mul z4.h, z0.h, z4.h
+; CHECK-SME-STREAMING-NEXT:    mul z5.h, z0.h, z5.h
+; CHECK-SME-STREAMING-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.h, z3.h, #0x10
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z4.h, z0.h, z6.h
+; CHECK-SME-STREAMING-NEXT:    and z1.h, z1.h, #0x40
+; CHECK-SME-STREAMING-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-NEXT:    and z5.h, z5.h, #0x80
+; CHECK-SME-STREAMING-NEXT:    mul z1.h, z0.h, z1.h
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z3.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.h, z0.h, z5.h
+; CHECK-SME-STREAMING-NEXT:    mul z0.h, z0.h, #0
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z1.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    mov z0.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    ret
+;
+; CHECK-SME-STREAMING-SSVE-AES-LABEL: clmul_nxv8i16_zext:
+; CHECK-SME-STREAMING-SSVE-AES:       // %bb.0:
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z2.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z0.h, z0.h, #0xff
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z2.h, z2.h, #0x2
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z3.h, z3.h, #0x1
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z4.h, z4.h, #0x8
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z5.h, z5.h, #0x4
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z6.h, z6.h, #0x20
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z2.h, z0.h, z2.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z4.h, z0.h, z4.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z5.h, z0.h, z5.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z3.h, z3.h, #0x10
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z4.h, z0.h, z6.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z1.h, z1.h, #0x40
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z3.h, z0.h, z3.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z5.h, z5.h, #0x80
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z1.h, z0.h, z1.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z3.d, z4.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z3.h, z0.h, z5.h
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mul z0.h, z0.h, #0
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z1.d, z3.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    mov z0.d, z2.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    ret
+;
 ; CHECK-SVE2-LABEL: clmul_nxv8i16_zext:
 ; CHECK-SVE2:       // %bb.0:
 ; CHECK-SVE2-NEXT:    mov z2.d, z1.d
@@ -1595,144 +1938,127 @@ define <vscale x 4 x i32> @clmul_nxv4i32_zext(<vscale x 4 x i16> %x, <vscale x 4
 ; CHECK-SVE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
 ; CHECK-SVE-NEXT:    ret
 ;
+; CHECK-SVE-AES-LABEL: clmul_nxv4i32_zext:
+; CHECK-SVE-AES:       // %bb.0:
+; CHECK-SVE-AES-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-SVE-AES-NEXT:    addvl sp, sp, #-1
+; CHECK-SVE-AES-NEXT:    str z8, [sp] // 16-byte Folded Spill
+; CHECK-SVE-AES-NEXT:    .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG
+; CHECK-SVE-AES-NEXT:    .cfi_offset w29, -16
+; CHECK-SVE-AES-NEXT:    .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 16
+; CHECK-SVE-AES-NEXT:    mov z2.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z3.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z5.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z6.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z7.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z24.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z25.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z26.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z27.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z28.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z29.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z30.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z31.d, z1.d
+; CHECK-SVE-AES-NEXT:    mov z8.d, z1.d
+; CHECK-SVE-AES-NEXT:    and z0.s, z0.s, #0xffff
+; CHECK-SVE-AES-NEXT:    and z2.s, z2.s, #0x2
+; CHECK-SVE-AES-NEXT:    and z3.s, z3.s, #0x1
+; CHECK-SVE-AES-NEXT:    and z4.s, z4.s, #0x4
+; CHECK-SVE-AES-NEXT:    and z5.s, z5.s, #0x8
+; CHECK-SVE-AES-NEXT:    and z6.s, z6.s, #0x10
+; CHECK-SVE-AES-NEXT:    and z7.s, z7.s, #0x20
+; CHECK-SVE-AES-NEXT:    and z24.s, z24.s, #0x40
+; CHECK-SVE-AES-NEXT:    and z25.s, z25.s, #0x80
+; CHECK-SVE-AES-NEXT:    and z26.s, z26.s, #0x100
+; CHECK-SVE-AES-NEXT:    and z27.s, z27.s, #0x200
+; CHECK-SVE-AES-NEXT:    and z28.s, z28.s, #0x400
+; CHECK-SVE-AES-NEXT:    and z29.s, z29.s, #0x800
+; CHECK-SVE-AES-NEXT:    and z30.s, z30.s, #0x1000
+; CHECK-SVE-AES-NEXT:    and z31.s, z31.s, #0x2000
+; CHECK-SVE-AES-NEXT:    and z8.s, z8.s, #0x4000
+; CHECK-SVE-AES-NEXT:    and z1.s, z1.s, #0x8000
+; CHECK-SVE-AES-NEXT:    ptrue p0.s
+; CHECK-SVE-AES-NEXT:    mul z2.s, p0/m, z2.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z3.s, p0/m, z3.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z4.s, p0/m, z4.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z5.s, p0/m, z5.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z6.s, p0/m, z6.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z7.s, p0/m, z7.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z24.s, p0/m, z24.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z25.s, p0/m, z25.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z26.s, p0/m, z26.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z27.s, p0/m, z27.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SVE-AES-NEXT:    mul z28.s, p0/m, z28.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z29.s, p0/m, z29.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z5.d
+; CHECK-SVE-AES-NEXT:    mul z30.s, p0/m, z30.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z31.s, p0/m, z31.s, z0.s
+; CHECK-SVE-AES-NEXT:    eor z4.d, z6.d, z7.d
+; CHECK-SVE-AES-NEXT:    mul z8.s, p0/m, z8.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z1.s, p0/m, z1.s, z0.s
+; CHECK-SVE-AES-NEXT:    mul z0.s, z0.s, #0
+; CHECK-SVE-AES-NEXT:    eor z5.d, z25.d, z26.d
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z24.d
+; CHECK-SVE-AES-NEXT:    eor z6.d, z29.d, z30.d
+; CHECK-SVE-AES-NEXT:    eor z4.d, z5.d, z27.d
+; CHECK-SVE-AES-NEXT:    eor z7.d, z0.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    eor z5.d, z6.d, z31.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z4.d, z28.d
+; CHECK-SVE-AES-NEXT:    eor z6.d, z7.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z4.d, z5.d, z8.d
+; CHECK-SVE-AES-NEXT:    ldr z8, [sp] // 16-byte Folded Reload
+; CHECK-SVE-AES-NEXT:    eor z2.d, z2.d, z3.d
+; CHECK-SVE-AES-NEXT:    eor z5.d, z6.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z4.d, z1.d
+; CHECK-SVE-AES-NEXT:    eor z3.d, z5.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z2.d, z1.d
+; CHECK-SVE-AES-NEXT:    eor z2.d, z3.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z1.d, z1.d, z2.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z2.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z1.d, z0.d
+; CHECK-SVE-AES-NEXT:    eor z0.d, z0.d, z6.d
+; CHECK-SVE-AES-NEXT:    addvl sp, sp, #1
+; CHECK-SVE-AES-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
+; CHECK-SVE-AES-NEXT:    ret
+;
+; CHECK-SME-STREAMING-LABEL: clmul_nxv4i32_zext:
+; CHECK-SME-STREAMING:       // %bb.0:
+; CHECK-SME-STREAMING-NEXT:    and z0.s, z0.s, #0xffff
+; CHECK-SME-STREAMING-NEXT:    and z1.s, z1.s, #0xffff
+; CHECK-SME-STREAMING-NEXT:    pmullt z2.d, z0.s, z1.s
+; CHECK-SME-STREAMING-NEXT:    pmullb z0.d, z0.s, z1.s
+; CHECK-SME-STREAMING-NEXT:    trn1 z0.s, z0.s, z2.s
+; CHECK-SME-STREAMING-NEXT:    ret
+;
+; CHECK-SME-STREAMING-SSVE-AES-LABEL: clmul_nxv4i32_zext:
+; CHECK-SME-STREAMING-SSVE-AES:       // %bb.0:
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z0.s, z0.s, #0xffff
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z1.s, z1.s, #0xffff
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmullt z2.d, z0.s, z1.s
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmullb z0.d, z0.s, z1.s
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    trn1 z0.s, z0.s, z2.s
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    ret
+;
 ; CHECK-SVE2-LABEL: clmul_nxv4i32_zext:
 ; CHECK-SVE2:       // %bb.0:
-; CHECK-SVE2-NEXT:    mov z2.d, z1.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
 ; CHECK-SVE2-NEXT:    and z0.s, z0.s, #0xffff
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z2.s, z2.s, #0x2
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x1
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x8
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x4
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x20
-; CHECK-SVE2-NEXT:    mul z2.s, z0.s, z2.s
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    eor z2.d, z3.d, z2.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x10
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x80
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x40
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x200
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x100
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    and z4.s, z4.s, #0x800
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x400
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-NEXT:    and z3.s, z3.s, #0x2000
-; CHECK-SVE2-NEXT:    and z6.s, z6.s, #0x1000
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-NEXT:    and z1.s, z1.s, #0x4000
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-NEXT:    mul z4.s, z0.s, z6.s
-; CHECK-SVE2-NEXT:    and z5.s, z5.s, #0x8000
-; CHECK-SVE2-NEXT:    mul z1.s, z0.s, z1.s
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
-; CHECK-SVE2-NEXT:    mul z3.s, z0.s, z5.s
-; CHECK-SVE2-NEXT:    mul z0.s, z0.s, #0
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z1.d, z3.d
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-NEXT:    mov z0.d, z2.d
+; CHECK-SVE2-NEXT:    and z1.s, z1.s, #0xffff
+; CHECK-SVE2-NEXT:    pmullt z2.d, z0.s, z1.s
+; CHECK-SVE2-NEXT:    pmullb z0.d, z0.s, z1.s
+; CHECK-SVE2-NEXT:    trn1 z0.s, z0.s, z2.s
 ; CHECK-SVE2-NEXT:    ret
 ;
 ; CHECK-SVE2-AES-LABEL: clmul_nxv4i32_zext:
 ; CHECK-SVE2-AES:       // %bb.0:
-; CHECK-SVE2-AES-NEXT:    mov z2.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
 ; CHECK-SVE2-AES-NEXT:    and z0.s, z0.s, #0xffff
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z2.s, z2.s, #0x2
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x1
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x8
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x4
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x20
-; CHECK-SVE2-AES-NEXT:    mul z2.s, z0.s, z2.s
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    eor z2.d, z3.d, z2.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x10
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x80
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x40
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x200
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x100
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z6.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    and z4.s, z4.s, #0x800
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x400
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z4.s
-; CHECK-SVE2-AES-NEXT:    mul z5.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.s, z3.s, #0x2000
-; CHECK-SVE2-AES-NEXT:    and z6.s, z6.s, #0x1000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z1.s, z1.s, #0x4000
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z3.s
-; CHECK-SVE2-AES-NEXT:    mul z4.s, z0.s, z6.s
-; CHECK-SVE2-AES-NEXT:    and z5.s, z5.s, #0x8000
-; CHECK-SVE2-AES-NEXT:    mul z1.s, z0.s, z1.s
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z3.s, z0.s, z5.s
-; CHECK-SVE2-AES-NEXT:    mul z0.s, z0.s, #0
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z1.d, z3.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    mov z0.d, z2.d
+; CHECK-SVE2-AES-NEXT:    and z1.s, z1.s, #0xffff
+; CHECK-SVE2-AES-NEXT:    pmullt z2.d, z0.s, z1.s
+; CHECK-SVE2-AES-NEXT:    pmullb z0.d, z0.s, z1.s
+; CHECK-SVE2-AES-NEXT:    trn1 z0.s, z0.s, z2.s
 ; CHECK-SVE2-AES-NEXT:    ret
   %zextx = zext <vscale x 4 x i16> %x to <vscale x 4 x i32>
   %zexty = zext <vscale x 4 x i16> %y to <vscale x 4 x i32>
@@ -1960,6 +2286,158 @@ define <vscale x 2 x i64> @clmul_nxv2i64_zext(<vscale x 2 x i32> %x, <vscale x 2
 ; CHECK-SVE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
 ; CHECK-SVE-NEXT:    ret
 ;
+; CHECK-SVE-AES-LABEL: clmul_nxv2i64_zext:
+; CHECK-SVE-AES:       // %bb.0:
+; CHECK-SVE-AES-NEXT:    and z0.d, z0.d, #0xffffffff
+; CHECK-SVE-AES-NEXT:    and z1.d, z1.d, #0xffffffff
+; CHECK-SVE-AES-NEXT:    pmullt z2.q, z0.d, z1.d
+; CHECK-SVE-AES-NEXT:    pmullb z0.q, z0.d, z1.d
+; CHECK-SVE-AES-NEXT:    trn1 z0.d, z0.d, z2.d
+; CHECK-SVE-AES-NEXT:    ret
+;
+; CHECK-SME-STREAMING-LABEL: clmul_nxv2i64_zext:
+; CHECK-SME-STREAMING:       // %bb.0:
+; CHECK-SME-STREAMING-NEXT:    mov z2.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z0.d, z0.d, #0xffffffff
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z2.d, z2.d, #0x2
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x1
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x8
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x4
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x20
+; CHECK-SME-STREAMING-NEXT:    mul z2.d, z0.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    eor z2.d, z3.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x10
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x80
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x40
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x200
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x100
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x800
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x400
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x2000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x1000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x8000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x4000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x20000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x10000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x80000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x40000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x200000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x100000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x800000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x400000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x2000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x1000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z4.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z6.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z4.d, z4.d, #0x8000000
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x4000000
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mul z5.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mov z3.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    mov z6.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z3.d, z3.d, #0x20000000
+; CHECK-SME-STREAMING-NEXT:    and z6.d, z6.d, #0x10000000
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
+; CHECK-SME-STREAMING-NEXT:    mov z5.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    and z1.d, z1.d, #0x40000000
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z4.d, z0.d, z6.d
+; CHECK-SME-STREAMING-NEXT:    and z5.d, z5.d, #0x80000000
+; CHECK-SME-STREAMING-NEXT:    mul z1.d, z0.d, z1.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    mul z3.d, z0.d, z5.d
+; CHECK-SME-STREAMING-NEXT:    mul z0.d, z0.d, #0
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z1.d, z3.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
+; CHECK-SME-STREAMING-NEXT:    mov z0.d, z2.d
+; CHECK-SME-STREAMING-NEXT:    ret
+;
+; CHECK-SME-STREAMING-SSVE-AES-LABEL: clmul_nxv2i64_zext:
+; CHECK-SME-STREAMING-SSVE-AES:       // %bb.0:
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z0.d, z0.d, #0xffffffff
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    and z1.d, z1.d, #0xffffffff
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmullt z2.q, z0.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    pmullb z0.q, z0.d, z1.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    trn1 z0.d, z0.d, z2.d
+; CHECK-SME-STREAMING-SSVE-AES-NEXT:    ret
+;
 ; CHECK-SVE2-LABEL: clmul_nxv2i64_zext:
 ; CHECK-SVE2:       // %bb.0:
 ; CHECK-SVE2-NEXT:    mov z2.d, z1.d
@@ -2096,136 +2574,11 @@ define <vscale x 2 x i64> @clmul_nxv2i64_zext(<vscale x 2 x i32> %x, <vscale x 2
 ;
 ; CHECK-SVE2-AES-LABEL: clmul_nxv2i64_zext:
 ; CHECK-SVE2-AES:       // %bb.0:
-; CHECK-SVE2-AES-NEXT:    mov z2.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
 ; CHECK-SVE2-AES-NEXT:    and z0.d, z0.d, #0xffffffff
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z2.d, z2.d, #0x2
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x1
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x8
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x4
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x20
-; CHECK-SVE2-AES-NEXT:    mul z2.d, z0.d, z2.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    eor z2.d, z3.d, z2.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x10
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x80
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x40
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z3.d, z6.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x200
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x100
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x800
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x400
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x2000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x1000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x8000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x4000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x20000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x10000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x80000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x40000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x200000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x100000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x800000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x400000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x2000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x1000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z4.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z6.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z4.d, z4.d, #0x8000000
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x4000000
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mul z5.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z6.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mov z3.d, z1.d
-; CHECK-SVE2-AES-NEXT:    mov z6.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z3.d, z3.d, #0x20000000
-; CHECK-SVE2-AES-NEXT:    and z6.d, z6.d, #0x10000000
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z5.d, z4.d
-; CHECK-SVE2-AES-NEXT:    mov z5.d, z1.d
-; CHECK-SVE2-AES-NEXT:    and z1.d, z1.d, #0x40000000
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z4.d, z0.d, z6.d
-; CHECK-SVE2-AES-NEXT:    and z5.d, z5.d, #0x80000000
-; CHECK-SVE2-AES-NEXT:    mul z1.d, z0.d, z1.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z4.d, z3.d
-; CHECK-SVE2-AES-NEXT:    mul z3.d, z0.d, z5.d
-; CHECK-SVE2-AES-NEXT:    mul z0.d, z0.d, #0
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z1.d, z3.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    eor3 z2.d, z2.d, z0.d, z0.d
-; CHECK-SVE2-AES-NEXT:    mov z0.d, z2.d
+; CHECK-SVE2-AES-NEXT:    and z1.d, z1.d, #0xffffffff
+; CHECK-SVE2-AES-NEXT:    pmullt z2.q, z0.d, z1.d
+; CHECK-SVE2-AES-NEXT:    pmullb z0.q, z0.d, z1.d
+; CHECK-SVE2-AES-NEXT:    trn1 z0.d, z0.d, z2.d
 ; CHECK-SVE2-AES-NEXT:    ret
   %zextx = zext <vscale x 2 x i32> %x to <vscale x 2 x i64>
   %zexty = zext <vscale x 2 x i32> %y to <vscale x 2 x i64>


        


More information about the llvm-commits mailing list