; 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 define @clmul_nxv16i8( %x, %y) { ; CHECK-SVE-LABEL: clmul_nxv16i8: ; CHECK-SVE: // %bb.0: ; CHECK-SVE-NEXT: movprfx z2, z1 ; CHECK-SVE-NEXT: and z2.b, z2.b, #0x2 ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.b, z3.b, #0x1 ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.b, z4.b, #0x4 ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.b, z5.b, #0x8 ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.b, z6.b, #0x10 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.b, z7.b, #0x20 ; CHECK-SVE-NEXT: ptrue p0.b ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.b, z24.b, #0x40 ; CHECK-SVE-NEXT: and z1.b, z1.b, #0x80 ; CHECK-SVE-NEXT: mul z2.b, p0/m, z2.b, z0.b ; CHECK-SVE-NEXT: mul z3.b, p0/m, z3.b, z0.b ; CHECK-SVE-NEXT: mul z4.b, p0/m, z4.b, z0.b ; CHECK-SVE-NEXT: mul z5.b, p0/m, z5.b, z0.b ; CHECK-SVE-NEXT: mul z6.b, p0/m, z6.b, z0.b ; CHECK-SVE-NEXT: mul z7.b, p0/m, z7.b, z0.b ; CHECK-SVE-NEXT: mul z24.b, p0/m, z24.b, z0.b ; CHECK-SVE-NEXT: mul z0.b, p0/m, z0.b, z1.b ; CHECK-SVE-NEXT: eor z2.d, z3.d, z2.d ; CHECK-SVE-NEXT: eor z3.d, z4.d, z5.d ; CHECK-SVE-NEXT: eor z4.d, z6.d, z7.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: eor z3.d, z4.d, z24.d ; CHECK-SVE-NEXT: eor z1.d, z2.d, z3.d ; 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: movprfx z2, z1 ; CHECK-SVE-AES-NEXT: and z2.b, z2.b, #0x2 ; CHECK-SVE-AES-NEXT: movprfx z3, z1 ; CHECK-SVE-AES-NEXT: and z3.b, z3.b, #0x1 ; CHECK-SVE-AES-NEXT: movprfx z4, z1 ; CHECK-SVE-AES-NEXT: and z4.b, z4.b, #0x4 ; CHECK-SVE-AES-NEXT: movprfx z5, z1 ; CHECK-SVE-AES-NEXT: and z5.b, z5.b, #0x8 ; CHECK-SVE-AES-NEXT: movprfx z6, z1 ; CHECK-SVE-AES-NEXT: and z6.b, z6.b, #0x10 ; CHECK-SVE-AES-NEXT: movprfx z7, z1 ; CHECK-SVE-AES-NEXT: and z7.b, z7.b, #0x20 ; CHECK-SVE-AES-NEXT: ptrue p0.b ; CHECK-SVE-AES-NEXT: movprfx z24, z1 ; CHECK-SVE-AES-NEXT: and z24.b, z24.b, #0x40 ; CHECK-SVE-AES-NEXT: and z1.b, z1.b, #0x80 ; 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 ; CHECK-SVE2-NEXT: ret ; ; CHECK-SVE2-AES-LABEL: clmul_nxv16i8: ; CHECK-SVE2-AES: // %bb.0: ; CHECK-SVE2-AES-NEXT: pmul z0.b, z0.b, z1.b ; CHECK-SVE2-AES-NEXT: ret %a = call @llvm.clmul.nxv16i8( %x, %y) ret %a } define @clmul_nxv8i16( %x, %y) { ; CHECK-SVE-LABEL: clmul_nxv8i16: ; CHECK-SVE: // %bb.0: ; CHECK-SVE-NEXT: movprfx z2, z1 ; CHECK-SVE-NEXT: and z2.h, z2.h, #0x2 ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.h, z3.h, #0x1 ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.h, z4.h, #0x4 ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.h, z5.h, #0x8 ; CHECK-SVE-NEXT: ptrue p0.h ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.h, z6.h, #0x10 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.h, z7.h, #0x20 ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.h, z24.h, #0x80 ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.h, z25.h, #0x100 ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.h, z26.h, #0x800 ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.h, z27.h, #0x1000 ; CHECK-SVE-NEXT: mul z2.h, p0/m, z2.h, z0.h ; CHECK-SVE-NEXT: mul z3.h, p0/m, z3.h, z0.h ; CHECK-SVE-NEXT: mul z4.h, p0/m, z4.h, z0.h ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.h, z28.h, #0x40 ; CHECK-SVE-NEXT: mul z5.h, p0/m, z5.h, z0.h ; CHECK-SVE-NEXT: mul z6.h, p0/m, z6.h, z0.h ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.h, z29.h, #0x200 ; CHECK-SVE-NEXT: mul z7.h, p0/m, z7.h, z0.h ; CHECK-SVE-NEXT: mul z24.h, p0/m, z24.h, z0.h ; CHECK-SVE-NEXT: movprfx z30, z1 ; CHECK-SVE-NEXT: and z30.h, z30.h, #0x2000 ; CHECK-SVE-NEXT: mul z25.h, p0/m, z25.h, z0.h ; CHECK-SVE-NEXT: mul z26.h, p0/m, z26.h, z0.h ; CHECK-SVE-NEXT: mul z27.h, p0/m, z27.h, z0.h ; CHECK-SVE-NEXT: eor z2.d, z3.d, z2.d ; CHECK-SVE-NEXT: mul z28.h, p0/m, z28.h, z0.h ; CHECK-SVE-NEXT: eor z3.d, z4.d, z5.d ; CHECK-SVE-NEXT: mul z29.h, p0/m, z29.h, z0.h ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.h, z4.h, #0x400 ; CHECK-SVE-NEXT: mul z30.h, p0/m, z30.h, z0.h ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.h, z5.h, #0x4000 ; CHECK-SVE-NEXT: eor z6.d, z6.d, z7.d ; CHECK-SVE-NEXT: eor z7.d, z24.d, z25.d ; CHECK-SVE-NEXT: and z1.h, z1.h, #0x8000 ; CHECK-SVE-NEXT: eor z24.d, z26.d, z27.d ; CHECK-SVE-NEXT: mul z4.h, p0/m, z4.h, z0.h ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: mul z5.h, p0/m, z5.h, z0.h ; CHECK-SVE-NEXT: eor z3.d, z6.d, z28.d ; CHECK-SVE-NEXT: eor z6.d, z7.d, z29.d ; CHECK-SVE-NEXT: mul z0.h, p0/m, z0.h, z1.h ; CHECK-SVE-NEXT: eor z7.d, z24.d, z30.d ; CHECK-SVE-NEXT: eor z1.d, z2.d, z3.d ; CHECK-SVE-NEXT: eor z2.d, z6.d, z4.d ; CHECK-SVE-NEXT: eor z3.d, z7.d, z5.d ; CHECK-SVE-NEXT: eor z1.d, z1.d, z2.d ; CHECK-SVE-NEXT: eor z0.d, z3.d, z0.d ; 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: movprfx z2, z1 ; CHECK-SVE-AES-NEXT: and z2.h, z2.h, #0x2 ; CHECK-SVE-AES-NEXT: movprfx z3, z1 ; CHECK-SVE-AES-NEXT: and z3.h, z3.h, #0x1 ; CHECK-SVE-AES-NEXT: movprfx z4, z1 ; CHECK-SVE-AES-NEXT: and z4.h, z4.h, #0x4 ; CHECK-SVE-AES-NEXT: movprfx z5, z1 ; CHECK-SVE-AES-NEXT: and z5.h, z5.h, #0x8 ; CHECK-SVE-AES-NEXT: ptrue p0.h ; CHECK-SVE-AES-NEXT: movprfx z6, z1 ; CHECK-SVE-AES-NEXT: and z6.h, z6.h, #0x10 ; CHECK-SVE-AES-NEXT: movprfx z7, z1 ; CHECK-SVE-AES-NEXT: and z7.h, z7.h, #0x20 ; CHECK-SVE-AES-NEXT: movprfx z24, z1 ; CHECK-SVE-AES-NEXT: and z24.h, z24.h, #0x80 ; CHECK-SVE-AES-NEXT: movprfx z25, z1 ; CHECK-SVE-AES-NEXT: and z25.h, z25.h, #0x100 ; CHECK-SVE-AES-NEXT: movprfx z26, z1 ; CHECK-SVE-AES-NEXT: and z26.h, z26.h, #0x800 ; CHECK-SVE-AES-NEXT: movprfx z27, z1 ; CHECK-SVE-AES-NEXT: and z27.h, z27.h, #0x1000 ; 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: movprfx z28, z1 ; CHECK-SVE-AES-NEXT: and z28.h, z28.h, #0x40 ; 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: movprfx z29, z1 ; CHECK-SVE-AES-NEXT: and z29.h, z29.h, #0x200 ; 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: movprfx z30, z1 ; CHECK-SVE-AES-NEXT: and z30.h, z30.h, #0x2000 ; CHECK-SVE-AES-NEXT: mul z25.h, p0/m, z25.h, z0.h ; CHECK-SVE-AES-NEXT: mul z26.h, p0/m, z26.h, z0.h ; CHECK-SVE-AES-NEXT: mul z27.h, p0/m, z27.h, z0.h ; CHECK-SVE-AES-NEXT: eor z2.d, z3.d, z2.d ; CHECK-SVE-AES-NEXT: mul z28.h, p0/m, z28.h, z0.h ; CHECK-SVE-AES-NEXT: eor z3.d, z4.d, z5.d ; CHECK-SVE-AES-NEXT: mul z29.h, p0/m, z29.h, z0.h ; CHECK-SVE-AES-NEXT: movprfx z4, z1 ; CHECK-SVE-AES-NEXT: and z4.h, z4.h, #0x400 ; CHECK-SVE-AES-NEXT: mul z30.h, p0/m, z30.h, z0.h ; CHECK-SVE-AES-NEXT: movprfx z5, z1 ; CHECK-SVE-AES-NEXT: and z5.h, z5.h, #0x4000 ; 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: eor z24.d, z26.d, z27.d ; CHECK-SVE-AES-NEXT: mul z4.h, p0/m, z4.h, z0.h ; CHECK-SVE-AES-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-AES-NEXT: mul z5.h, p0/m, z5.h, z0.h ; CHECK-SVE-AES-NEXT: eor z3.d, z6.d, z28.d ; CHECK-SVE-AES-NEXT: eor z6.d, z7.d, z29.d ; CHECK-SVE-AES-NEXT: mul z0.h, p0/m, z0.h, z1.h ; 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: trn1 z2.b, z1.b, z0.b ; CHECK-SME-STREAMING-NEXT: trn2 z3.b, z0.b, z1.b ; CHECK-SME-STREAMING-NEXT: pmullb z0.h, z0.b, z1.b ; CHECK-SME-STREAMING-NEXT: pmul z1.b, z3.b, z2.b ; CHECK-SME-STREAMING-NEXT: eorbt z1.b, z1.b, z1.b ; CHECK-SME-STREAMING-NEXT: eortb z0.b, z0.b, z1.b ; 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: trn1 z2.b, z1.b, z0.b ; CHECK-SME-STREAMING-SSVE-AES-NEXT: trn2 z3.b, z0.b, z1.b ; CHECK-SME-STREAMING-SSVE-AES-NEXT: pmullb z0.h, z0.b, z1.b ; CHECK-SME-STREAMING-SSVE-AES-NEXT: pmul z1.b, z3.b, z2.b ; CHECK-SME-STREAMING-SSVE-AES-NEXT: eorbt z1.b, z1.b, z1.b ; CHECK-SME-STREAMING-SSVE-AES-NEXT: eortb z0.b, z0.b, z1.b ; CHECK-SME-STREAMING-SSVE-AES-NEXT: ret ; ; CHECK-SVE2-LABEL: clmul_nxv8i16: ; CHECK-SVE2: // %bb.0: ; CHECK-SVE2-NEXT: trn1 z2.b, z1.b, z0.b ; CHECK-SVE2-NEXT: trn2 z3.b, z0.b, z1.b ; CHECK-SVE2-NEXT: pmullb z0.h, z0.b, z1.b ; CHECK-SVE2-NEXT: pmul z1.b, z3.b, z2.b ; CHECK-SVE2-NEXT: eorbt z1.b, z1.b, z1.b ; CHECK-SVE2-NEXT: eortb z0.b, z0.b, z1.b ; CHECK-SVE2-NEXT: ret ; ; CHECK-SVE2-AES-LABEL: clmul_nxv8i16: ; CHECK-SVE2-AES: // %bb.0: ; CHECK-SVE2-AES-NEXT: trn1 z2.b, z1.b, z0.b ; CHECK-SVE2-AES-NEXT: trn2 z3.b, z0.b, z1.b ; CHECK-SVE2-AES-NEXT: pmullb z0.h, z0.b, z1.b ; CHECK-SVE2-AES-NEXT: pmul z1.b, z3.b, z2.b ; CHECK-SVE2-AES-NEXT: eorbt z1.b, z1.b, z1.b ; CHECK-SVE2-AES-NEXT: eortb z0.b, z0.b, z1.b ; CHECK-SVE2-AES-NEXT: ret %a = call @llvm.clmul.nxv8i16( %x, %y) ret %a } define @clmul_nxv4i32( %x, %y) { ; CHECK-SVE-LABEL: clmul_nxv4i32: ; CHECK-SVE: // %bb.0: ; CHECK-SVE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CHECK-SVE-NEXT: addvl sp, sp, #-1 ; CHECK-SVE-NEXT: str z8, [sp] // 16-byte Folded Spill ; CHECK-SVE-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG ; CHECK-SVE-NEXT: .cfi_offset w29, -16 ; CHECK-SVE-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 16 ; CHECK-SVE-NEXT: movprfx z2, z1 ; CHECK-SVE-NEXT: and z2.s, z2.s, #0x2 ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.s, z3.s, #0x1 ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.s, z4.s, #0x4 ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.s, z5.s, #0x8 ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.s, z6.s, #0x10 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.s, z7.s, #0x20 ; CHECK-SVE-NEXT: ptrue p0.s ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.s, z24.s, #0x40 ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.s, z25.s, #0x80 ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.s, z26.s, #0x100 ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.s, z27.s, #0x200 ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.s, z29.s, #0x800 ; CHECK-SVE-NEXT: mul z2.s, p0/m, z2.s, z0.s ; CHECK-SVE-NEXT: mul z3.s, p0/m, z3.s, z0.s ; CHECK-SVE-NEXT: movprfx z30, z1 ; CHECK-SVE-NEXT: and z30.s, z30.s, #0x400000 ; CHECK-SVE-NEXT: mul z4.s, p0/m, z4.s, z0.s ; CHECK-SVE-NEXT: mul z5.s, p0/m, z5.s, z0.s ; CHECK-SVE-NEXT: movprfx z31, z1 ; CHECK-SVE-NEXT: and z31.s, z31.s, #0x800000 ; CHECK-SVE-NEXT: mul z6.s, p0/m, z6.s, z0.s ; CHECK-SVE-NEXT: mul z7.s, p0/m, z7.s, z0.s ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.s, z28.s, #0x400 ; CHECK-SVE-NEXT: mul z24.s, p0/m, z24.s, z0.s ; CHECK-SVE-NEXT: mul z25.s, p0/m, z25.s, z0.s ; CHECK-SVE-NEXT: movprfx z8, z1 ; CHECK-SVE-NEXT: and z8.s, z8.s, #0x2000000 ; CHECK-SVE-NEXT: mul z26.s, p0/m, z26.s, z0.s ; CHECK-SVE-NEXT: eor z2.d, z3.d, z2.d ; CHECK-SVE-NEXT: mul z27.s, p0/m, z27.s, z0.s ; CHECK-SVE-NEXT: eor z3.d, z4.d, z5.d ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.s, z5.s, #0x1000 ; CHECK-SVE-NEXT: mul z29.s, p0/m, z29.s, z0.s ; CHECK-SVE-NEXT: eor z4.d, z6.d, z7.d ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.s, z6.s, #0x10000 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.s, z7.s, #0x20000 ; CHECK-SVE-NEXT: mul z30.s, p0/m, z30.s, z0.s ; CHECK-SVE-NEXT: mul z31.s, p0/m, z31.s, z0.s ; CHECK-SVE-NEXT: eor z25.d, z25.d, z26.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: mul z5.s, p0/m, z5.s, z0.s ; CHECK-SVE-NEXT: eor z3.d, z4.d, z24.d ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.s, z4.s, #0x2000 ; CHECK-SVE-NEXT: mul z6.s, p0/m, z6.s, z0.s ; CHECK-SVE-NEXT: mul z7.s, p0/m, z7.s, z0.s ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.s, z24.s, #0x40000 ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.s, z26.s, #0x1000000 ; CHECK-SVE-NEXT: mul z28.s, p0/m, z28.s, z0.s ; CHECK-SVE-NEXT: mul z8.s, p0/m, z8.s, z0.s ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: eor z3.d, z25.d, z27.d ; CHECK-SVE-NEXT: mul z4.s, p0/m, z4.s, z0.s ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.s, z25.s, #0x4000 ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.s, z27.s, #0x80000 ; CHECK-SVE-NEXT: mul z24.s, p0/m, z24.s, z0.s ; CHECK-SVE-NEXT: mul z26.s, p0/m, z26.s, z0.s ; CHECK-SVE-NEXT: eor z5.d, z29.d, z5.d ; CHECK-SVE-NEXT: eor z6.d, z6.d, z7.d ; CHECK-SVE-NEXT: eor z7.d, z30.d, z31.d ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.s, z29.s, #0x8000 ; CHECK-SVE-NEXT: movprfx z30, z1 ; CHECK-SVE-NEXT: and z30.s, z30.s, #0x100000 ; CHECK-SVE-NEXT: mul z25.s, p0/m, z25.s, z0.s ; CHECK-SVE-NEXT: mul z27.s, p0/m, z27.s, z0.s ; CHECK-SVE-NEXT: movprfx z31, z1 ; CHECK-SVE-NEXT: and z31.s, z31.s, #0x4000000 ; CHECK-SVE-NEXT: eor z4.d, z5.d, z4.d ; CHECK-SVE-NEXT: eor z5.d, z6.d, z24.d ; CHECK-SVE-NEXT: eor z3.d, z3.d, z28.d ; CHECK-SVE-NEXT: eor z6.d, z7.d, z26.d ; CHECK-SVE-NEXT: mul z29.s, p0/m, z29.s, z0.s ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.s, z7.s, #0x200000 ; CHECK-SVE-NEXT: mul z30.s, p0/m, z30.s, z0.s ; CHECK-SVE-NEXT: mul z31.s, p0/m, z31.s, z0.s ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.s, z24.s, #0x8000000 ; CHECK-SVE-NEXT: eor z4.d, z4.d, z25.d ; CHECK-SVE-NEXT: eor z5.d, z5.d, z27.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: eor z6.d, z6.d, z8.d ; CHECK-SVE-NEXT: mul z7.s, p0/m, z7.s, z0.s ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.s, z3.s, #0x10000000 ; CHECK-SVE-NEXT: mul z24.s, p0/m, z24.s, z0.s ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.s, z25.s, #0x20000000 ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.s, z26.s, #0x40000000 ; CHECK-SVE-NEXT: eor z4.d, z4.d, z29.d ; CHECK-SVE-NEXT: eor z5.d, z5.d, z30.d ; CHECK-SVE-NEXT: and z1.s, z1.s, #0x80000000 ; CHECK-SVE-NEXT: eor z6.d, z6.d, z31.d ; CHECK-SVE-NEXT: mul z3.s, p0/m, z3.s, z0.s ; CHECK-SVE-NEXT: ldr z8, [sp] // 16-byte Folded Reload ; CHECK-SVE-NEXT: mul z25.s, p0/m, z25.s, z0.s ; CHECK-SVE-NEXT: mul z26.s, p0/m, z26.s, z0.s ; CHECK-SVE-NEXT: eor z2.d, z2.d, z4.d ; CHECK-SVE-NEXT: eor z4.d, z5.d, z7.d ; CHECK-SVE-NEXT: mul z0.s, p0/m, z0.s, z1.s ; CHECK-SVE-NEXT: eor z5.d, z6.d, z24.d ; CHECK-SVE-NEXT: eor z1.d, z2.d, z4.d ; CHECK-SVE-NEXT: eor z2.d, z5.d, z3.d ; CHECK-SVE-NEXT: eor z3.d, z25.d, z26.d ; CHECK-SVE-NEXT: eor z1.d, z1.d, z2.d ; CHECK-SVE-NEXT: eor z0.d, z3.d, z0.d ; CHECK-SVE-NEXT: eor z0.d, z1.d, z0.d ; CHECK-SVE-NEXT: addvl sp, sp, #1 ; CHECK-SVE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload ; CHECK-SVE-NEXT: ret ; ; CHECK-SVE-AES-LABEL: clmul_nxv4i32: ; 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: movprfx z2, z1 ; CHECK-SVE-AES-NEXT: and z2.s, z2.s, #0x2 ; CHECK-SVE-AES-NEXT: movprfx z3, z1 ; CHECK-SVE-AES-NEXT: and z3.s, z3.s, #0x1 ; CHECK-SVE-AES-NEXT: movprfx z4, z1 ; CHECK-SVE-AES-NEXT: and z4.s, z4.s, #0x4 ; CHECK-SVE-AES-NEXT: movprfx z5, z1 ; CHECK-SVE-AES-NEXT: and z5.s, z5.s, #0x8 ; CHECK-SVE-AES-NEXT: movprfx z6, z1 ; CHECK-SVE-AES-NEXT: and z6.s, z6.s, #0x10 ; CHECK-SVE-AES-NEXT: movprfx z7, z1 ; CHECK-SVE-AES-NEXT: and z7.s, z7.s, #0x20 ; CHECK-SVE-AES-NEXT: ptrue p0.s ; CHECK-SVE-AES-NEXT: movprfx z24, z1 ; CHECK-SVE-AES-NEXT: and z24.s, z24.s, #0x40 ; CHECK-SVE-AES-NEXT: movprfx z25, z1 ; CHECK-SVE-AES-NEXT: and z25.s, z25.s, #0x80 ; CHECK-SVE-AES-NEXT: movprfx z26, z1 ; CHECK-SVE-AES-NEXT: and z26.s, z26.s, #0x100 ; CHECK-SVE-AES-NEXT: movprfx z27, z1 ; CHECK-SVE-AES-NEXT: and z27.s, z27.s, #0x200 ; CHECK-SVE-AES-NEXT: movprfx z29, z1 ; CHECK-SVE-AES-NEXT: and z29.s, z29.s, #0x800 ; 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: movprfx z30, z1 ; CHECK-SVE-AES-NEXT: and z30.s, z30.s, #0x400000 ; 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: movprfx z31, z1 ; CHECK-SVE-AES-NEXT: and z31.s, z31.s, #0x800000 ; 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: movprfx z28, z1 ; CHECK-SVE-AES-NEXT: and z28.s, z28.s, #0x400 ; 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: movprfx z8, z1 ; CHECK-SVE-AES-NEXT: and z8.s, z8.s, #0x2000000 ; 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: mul z27.s, p0/m, z27.s, z0.s ; CHECK-SVE-AES-NEXT: eor z3.d, z4.d, z5.d ; CHECK-SVE-AES-NEXT: movprfx z5, z1 ; CHECK-SVE-AES-NEXT: and z5.s, z5.s, #0x1000 ; CHECK-SVE-AES-NEXT: mul z29.s, p0/m, z29.s, z0.s ; CHECK-SVE-AES-NEXT: eor z4.d, z6.d, z7.d ; CHECK-SVE-AES-NEXT: movprfx z6, z1 ; CHECK-SVE-AES-NEXT: and z6.s, z6.s, #0x10000 ; CHECK-SVE-AES-NEXT: movprfx z7, z1 ; CHECK-SVE-AES-NEXT: and z7.s, z7.s, #0x20000 ; 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 z25.d, z25.d, z26.d ; CHECK-SVE-AES-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-AES-NEXT: mul z5.s, p0/m, z5.s, z0.s ; CHECK-SVE-AES-NEXT: eor z3.d, z4.d, z24.d ; CHECK-SVE-AES-NEXT: movprfx z4, z1 ; CHECK-SVE-AES-NEXT: and z4.s, z4.s, #0x2000 ; 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: movprfx z24, z1 ; CHECK-SVE-AES-NEXT: and z24.s, z24.s, #0x40000 ; CHECK-SVE-AES-NEXT: movprfx z26, z1 ; CHECK-SVE-AES-NEXT: and z26.s, z26.s, #0x1000000 ; CHECK-SVE-AES-NEXT: mul z28.s, p0/m, z28.s, z0.s ; CHECK-SVE-AES-NEXT: mul z8.s, p0/m, z8.s, z0.s ; CHECK-SVE-AES-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-AES-NEXT: eor z3.d, z25.d, z27.d ; CHECK-SVE-AES-NEXT: mul z4.s, p0/m, z4.s, z0.s ; CHECK-SVE-AES-NEXT: movprfx z25, z1 ; CHECK-SVE-AES-NEXT: and z25.s, z25.s, #0x4000 ; CHECK-SVE-AES-NEXT: movprfx z27, z1 ; CHECK-SVE-AES-NEXT: and z27.s, z27.s, #0x80000 ; CHECK-SVE-AES-NEXT: mul z24.s, p0/m, z24.s, z0.s ; CHECK-SVE-AES-NEXT: mul z26.s, p0/m, z26.s, z0.s ; CHECK-SVE-AES-NEXT: eor z5.d, z29.d, z5.d ; CHECK-SVE-AES-NEXT: eor z6.d, z6.d, z7.d ; CHECK-SVE-AES-NEXT: eor z7.d, z30.d, z31.d ; CHECK-SVE-AES-NEXT: movprfx z29, z1 ; CHECK-SVE-AES-NEXT: and z29.s, z29.s, #0x8000 ; CHECK-SVE-AES-NEXT: movprfx z30, z1 ; CHECK-SVE-AES-NEXT: and z30.s, z30.s, #0x100000 ; CHECK-SVE-AES-NEXT: mul z25.s, p0/m, z25.s, z0.s ; CHECK-SVE-AES-NEXT: mul z27.s, p0/m, z27.s, z0.s ; CHECK-SVE-AES-NEXT: movprfx z31, z1 ; CHECK-SVE-AES-NEXT: and z31.s, z31.s, #0x4000000 ; CHECK-SVE-AES-NEXT: eor z4.d, z5.d, z4.d ; CHECK-SVE-AES-NEXT: eor z5.d, z6.d, z24.d ; CHECK-SVE-AES-NEXT: eor z3.d, z3.d, z28.d ; CHECK-SVE-AES-NEXT: eor z6.d, z7.d, z26.d ; CHECK-SVE-AES-NEXT: mul z29.s, p0/m, z29.s, z0.s ; CHECK-SVE-AES-NEXT: movprfx z7, z1 ; CHECK-SVE-AES-NEXT: and z7.s, z7.s, #0x200000 ; 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: movprfx z24, z1 ; CHECK-SVE-AES-NEXT: and z24.s, z24.s, #0x8000000 ; CHECK-SVE-AES-NEXT: eor z4.d, z4.d, z25.d ; CHECK-SVE-AES-NEXT: eor z5.d, z5.d, z27.d ; CHECK-SVE-AES-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-AES-NEXT: eor z6.d, z6.d, z8.d ; CHECK-SVE-AES-NEXT: mul z7.s, p0/m, z7.s, z0.s ; CHECK-SVE-AES-NEXT: movprfx z3, z1 ; CHECK-SVE-AES-NEXT: and z3.s, z3.s, #0x10000000 ; CHECK-SVE-AES-NEXT: mul z24.s, p0/m, z24.s, z0.s ; CHECK-SVE-AES-NEXT: movprfx z25, z1 ; CHECK-SVE-AES-NEXT: and z25.s, z25.s, #0x20000000 ; CHECK-SVE-AES-NEXT: movprfx z26, z1 ; CHECK-SVE-AES-NEXT: and z26.s, z26.s, #0x40000000 ; CHECK-SVE-AES-NEXT: eor z4.d, z4.d, z29.d ; CHECK-SVE-AES-NEXT: eor z5.d, z5.d, z30.d ; CHECK-SVE-AES-NEXT: and z1.s, z1.s, #0x80000000 ; CHECK-SVE-AES-NEXT: eor z6.d, z6.d, z31.d ; CHECK-SVE-AES-NEXT: mul z3.s, p0/m, z3.s, z0.s ; CHECK-SVE-AES-NEXT: ldr z8, [sp] // 16-byte Folded Reload ; 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: eor z2.d, z2.d, z4.d ; CHECK-SVE-AES-NEXT: eor z4.d, z5.d, z7.d ; CHECK-SVE-AES-NEXT: mul z0.s, p0/m, z0.s, z1.s ; CHECK-SVE-AES-NEXT: eor z5.d, z6.d, z24.d ; CHECK-SVE-AES-NEXT: eor z1.d, z2.d, z4.d ; CHECK-SVE-AES-NEXT: eor z2.d, z5.d, z3.d ; CHECK-SVE-AES-NEXT: eor z3.d, z25.d, z26.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: 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: ; 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: 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: 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 @llvm.clmul.nxv4i32( %x, %y) ret %a } define @clmul_nxv2i64( %x, %y) { ; CHECK-SVE-LABEL: clmul_nxv2i64: ; CHECK-SVE: // %bb.0: ; CHECK-SVE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CHECK-SVE-NEXT: addvl sp, sp, #-1 ; CHECK-SVE-NEXT: str z8, [sp] // 16-byte Folded Spill ; CHECK-SVE-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG ; CHECK-SVE-NEXT: .cfi_offset w29, -16 ; CHECK-SVE-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 16 ; CHECK-SVE-NEXT: movprfx z2, z1 ; CHECK-SVE-NEXT: and z2.d, z2.d, #0x2 ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.d, z3.d, #0x1 ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.d, z4.d, #0x4 ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.d, z5.d, #0x8 ; CHECK-SVE-NEXT: ptrue p0.d ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.d, z6.d, #0x10 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.d, z7.d, #0x20 ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.d, z24.d, #0x80 ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.d, z25.d, #0x100 ; CHECK-SVE-NEXT: mul z2.d, p0/m, z2.d, z0.d ; CHECK-SVE-NEXT: mul z3.d, p0/m, z3.d, z0.d ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x40 ; CHECK-SVE-NEXT: mul z4.d, p0/m, z4.d, z0.d ; CHECK-SVE-NEXT: mul z5.d, p0/m, z5.d, z0.d ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.d, z27.d, #0x200 ; CHECK-SVE-NEXT: mul z6.d, p0/m, z6.d, z0.d ; CHECK-SVE-NEXT: mul z7.d, p0/m, z7.d, z0.d ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.d, z28.d, #0x800 ; CHECK-SVE-NEXT: mul z24.d, p0/m, z24.d, z0.d ; CHECK-SVE-NEXT: mul z25.d, p0/m, z25.d, z0.d ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.d, z29.d, #0x1000 ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: mul z27.d, p0/m, z27.d, z0.d ; CHECK-SVE-NEXT: eor z2.d, z3.d, z2.d ; CHECK-SVE-NEXT: eor z3.d, z4.d, z5.d ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.d, z4.d, #0x400 ; CHECK-SVE-NEXT: mul z28.d, p0/m, z28.d, z0.d ; CHECK-SVE-NEXT: mul z29.d, p0/m, z29.d, z0.d ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.d, z5.d, #0x2000 ; CHECK-SVE-NEXT: eor z6.d, z6.d, z7.d ; CHECK-SVE-NEXT: eor z7.d, z24.d, z25.d ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.d, z25.d, #0x10000 ; CHECK-SVE-NEXT: movprfx z30, z1 ; CHECK-SVE-NEXT: and z30.d, z30.d, #0x80000000 ; CHECK-SVE-NEXT: mul z4.d, p0/m, z4.d, z0.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.d, z3.d, #0x4000 ; CHECK-SVE-NEXT: mul z5.d, p0/m, z5.d, z0.d ; CHECK-SVE-NEXT: eor z6.d, z6.d, z26.d ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x20000 ; CHECK-SVE-NEXT: eor z7.d, z7.d, z27.d ; CHECK-SVE-NEXT: eor z24.d, z28.d, z29.d ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.d, z27.d, #0x400000 ; CHECK-SVE-NEXT: mul z3.d, p0/m, z3.d, z0.d ; CHECK-SVE-NEXT: mul z25.d, p0/m, z25.d, z0.d ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.d, z29.d, #0x80000 ; CHECK-SVE-NEXT: eor z2.d, z2.d, z6.d ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.d, z6.d, #0x800000 ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: eor z4.d, z7.d, z4.d ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.d, z7.d, #0x40000 ; CHECK-SVE-NEXT: eor z5.d, z24.d, z5.d ; CHECK-SVE-NEXT: mul z27.d, p0/m, z27.d, z0.d ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.d, z24.d, #0x40000000 ; CHECK-SVE-NEXT: mul z29.d, p0/m, z29.d, z0.d ; CHECK-SVE-NEXT: mul z6.d, p0/m, z6.d, z0.d ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.d, z28.d, #0x8000 ; CHECK-SVE-NEXT: movprfx z31, z1 ; CHECK-SVE-NEXT: and z31.d, z31.d, #0x100000 ; CHECK-SVE-NEXT: eor z2.d, z2.d, z4.d ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.d, z4.d, #0x1000000 ; CHECK-SVE-NEXT: mul z7.d, p0/m, z7.d, z0.d ; CHECK-SVE-NEXT: eor z3.d, z5.d, z3.d ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.d, z5.d, #0x20000000 ; CHECK-SVE-NEXT: eor z25.d, z25.d, z26.d ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x2000000 ; CHECK-SVE-NEXT: mul z24.d, p0/m, z24.d, z0.d ; CHECK-SVE-NEXT: mul z28.d, p0/m, z28.d, z0.d ; CHECK-SVE-NEXT: mul z4.d, p0/m, z4.d, z0.d ; CHECK-SVE-NEXT: eor z6.d, z27.d, z6.d ; CHECK-SVE-NEXT: mul z30.d, p0/m, z30.d, z0.d ; CHECK-SVE-NEXT: mul z5.d, p0/m, z5.d, z0.d ; CHECK-SVE-NEXT: eor z7.d, z25.d, z7.d ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.d, z25.d, #0x4000000 ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.d, z27.d, #0x100000000 ; CHECK-SVE-NEXT: mul z31.d, p0/m, z31.d, z0.d ; CHECK-SVE-NEXT: eor z3.d, z3.d, z28.d ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.d, z28.d, #0x400000000 ; CHECK-SVE-NEXT: movprfx z8, z1 ; CHECK-SVE-NEXT: and z8.d, z8.d, #0x800000000000000 ; CHECK-SVE-NEXT: eor z4.d, z6.d, z4.d ; CHECK-SVE-NEXT: eor z6.d, z7.d, z29.d ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.d, z7.d, #0x200000 ; CHECK-SVE-NEXT: eor z5.d, z5.d, z24.d ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.d, z24.d, #0x8000000 ; CHECK-SVE-NEXT: mul z25.d, p0/m, z25.d, z0.d ; CHECK-SVE-NEXT: mul z27.d, p0/m, z27.d, z0.d ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.d, z29.d, #0x200000000 ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: mul z7.d, p0/m, z7.d, z0.d ; CHECK-SVE-NEXT: eor z4.d, z4.d, z26.d ; CHECK-SVE-NEXT: eor z6.d, z6.d, z31.d ; CHECK-SVE-NEXT: eor z5.d, z5.d, z30.d ; CHECK-SVE-NEXT: mul z24.d, p0/m, z24.d, z0.d ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x10000000 ; CHECK-SVE-NEXT: mul z29.d, p0/m, z29.d, z0.d ; CHECK-SVE-NEXT: mul z28.d, p0/m, z28.d, z0.d ; CHECK-SVE-NEXT: movprfx z30, z1 ; CHECK-SVE-NEXT: and z30.d, z30.d, #0x200000000000000 ; CHECK-SVE-NEXT: eor z4.d, z4.d, z25.d ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.d, z25.d, #0x800000000000 ; CHECK-SVE-NEXT: movprfx z31, z1 ; CHECK-SVE-NEXT: and z31.d, z31.d, #0x400000000000000 ; CHECK-SVE-NEXT: eor z5.d, z5.d, z27.d ; CHECK-SVE-NEXT: eor z3.d, z6.d, z7.d ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.d, z6.d, #0x800000000 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.d, z7.d, #0x2000000000 ; CHECK-SVE-NEXT: mul z30.d, p0/m, z30.d, z0.d ; CHECK-SVE-NEXT: eor z4.d, z4.d, z24.d ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.d, z24.d, #0x4000000000 ; CHECK-SVE-NEXT: mul z25.d, p0/m, z25.d, z0.d ; CHECK-SVE-NEXT: eor z5.d, z5.d, z29.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.d, z3.d, #0x400000000000 ; CHECK-SVE-NEXT: mul z6.d, p0/m, z6.d, z0.d ; CHECK-SVE-NEXT: mul z7.d, p0/m, z7.d, z0.d ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.d, z29.d, #0x100000000000000 ; CHECK-SVE-NEXT: eor z4.d, z4.d, z26.d ; CHECK-SVE-NEXT: mul z24.d, p0/m, z24.d, z0.d ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x8000000000 ; CHECK-SVE-NEXT: eor z5.d, z5.d, z28.d ; CHECK-SVE-NEXT: movprfx z27, z0 ; CHECK-SVE-NEXT: mul z27.d, p0/m, z27.d, z3.d ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.d, z28.d, #0x1000000000000 ; CHECK-SVE-NEXT: mul z29.d, p0/m, z29.d, z0.d ; CHECK-SVE-NEXT: mul z31.d, p0/m, z31.d, z0.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z4.d ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.d, z4.d, #0x10000000000 ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: eor z3.d, z5.d, z6.d ; CHECK-SVE-NEXT: mul z28.d, p0/m, z28.d, z0.d ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.d, z5.d, #0x2000000000000 ; CHECK-SVE-NEXT: eor z6.d, z7.d, z24.d ; CHECK-SVE-NEXT: eor z24.d, z27.d, z25.d ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.d, z7.d, #0x20000000000 ; CHECK-SVE-NEXT: mul z4.d, p0/m, z4.d, z0.d ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.d, z27.d, #0x4000000000000 ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.d, z25.d, #0x1000000000 ; CHECK-SVE-NEXT: mul z5.d, p0/m, z5.d, z0.d ; CHECK-SVE-NEXT: mul z8.d, p0/m, z8.d, z0.d ; CHECK-SVE-NEXT: eor z6.d, z6.d, z26.d ; CHECK-SVE-NEXT: eor z24.d, z24.d, z28.d ; CHECK-SVE-NEXT: mul z7.d, p0/m, z7.d, z0.d ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x40000000000 ; CHECK-SVE-NEXT: mul z27.d, p0/m, z27.d, z0.d ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.d, z28.d, #0x8000000000000 ; CHECK-SVE-NEXT: mul z25.d, p0/m, z25.d, z0.d ; CHECK-SVE-NEXT: eor z4.d, z6.d, z4.d ; CHECK-SVE-NEXT: eor z5.d, z24.d, z5.d ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.d, z6.d, #0x80000000000 ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.d, z24.d, #0x10000000000000 ; CHECK-SVE-NEXT: mul z28.d, p0/m, z28.d, z0.d ; CHECK-SVE-NEXT: eor z4.d, z4.d, z7.d ; CHECK-SVE-NEXT: eor z5.d, z5.d, z27.d ; CHECK-SVE-NEXT: eor z7.d, z29.d, z30.d ; CHECK-SVE-NEXT: mul z6.d, p0/m, z6.d, z0.d ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.d, z27.d, #0x100000000000 ; CHECK-SVE-NEXT: mul z24.d, p0/m, z24.d, z0.d ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.d, z29.d, #0x20000000000000 ; CHECK-SVE-NEXT: movprfx z30, z1 ; CHECK-SVE-NEXT: and z30.d, z30.d, #0x1000000000000000 ; CHECK-SVE-NEXT: eor z3.d, z3.d, z25.d ; CHECK-SVE-NEXT: eor z4.d, z4.d, z26.d ; CHECK-SVE-NEXT: eor z5.d, z5.d, z28.d ; CHECK-SVE-NEXT: eor z7.d, z7.d, z31.d ; CHECK-SVE-NEXT: mul z27.d, p0/m, z27.d, z0.d ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x200000000000 ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.d, z28.d, #0x40000000000000 ; CHECK-SVE-NEXT: mul z29.d, p0/m, z29.d, z0.d ; CHECK-SVE-NEXT: mul z30.d, p0/m, z30.d, z0.d ; CHECK-SVE-NEXT: movprfx z31, z1 ; CHECK-SVE-NEXT: and z31.d, z31.d, #0x2000000000000000 ; CHECK-SVE-NEXT: eor z4.d, z4.d, z6.d ; CHECK-SVE-NEXT: eor z5.d, z5.d, z24.d ; CHECK-SVE-NEXT: eor z6.d, z7.d, z8.d ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: mul z28.d, p0/m, z28.d, z0.d ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.d, z7.d, #0x80000000000000 ; CHECK-SVE-NEXT: mul z31.d, p0/m, z31.d, z0.d ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.d, z24.d, #0x4000000000000000 ; CHECK-SVE-NEXT: and z1.d, z1.d, #0x8000000000000000 ; CHECK-SVE-NEXT: eor z4.d, z4.d, z27.d ; CHECK-SVE-NEXT: eor z5.d, z5.d, z29.d ; CHECK-SVE-NEXT: eor z6.d, z6.d, z30.d ; CHECK-SVE-NEXT: mul z7.d, p0/m, z7.d, z0.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: ldr z8, [sp] // 16-byte Folded Reload ; CHECK-SVE-NEXT: mul z24.d, p0/m, z24.d, z0.d ; CHECK-SVE-NEXT: mul z0.d, p0/m, z0.d, z1.d ; CHECK-SVE-NEXT: eor z3.d, z4.d, z26.d ; CHECK-SVE-NEXT: eor z4.d, z5.d, z28.d ; CHECK-SVE-NEXT: eor z5.d, z6.d, z31.d ; CHECK-SVE-NEXT: eor z1.d, z2.d, z3.d ; CHECK-SVE-NEXT: eor z2.d, z4.d, z7.d ; CHECK-SVE-NEXT: eor z3.d, z5.d, z24.d ; CHECK-SVE-NEXT: eor z1.d, z1.d, z2.d ; CHECK-SVE-NEXT: eor z0.d, z3.d, z0.d ; CHECK-SVE-NEXT: eor z0.d, z1.d, z0.d ; CHECK-SVE-NEXT: addvl sp, sp, #1 ; CHECK-SVE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload ; 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: trn1 z2.s, z1.s, z0.s ; CHECK-SME-STREAMING-NEXT: trn2 z3.s, z0.s, z1.s ; CHECK-SME-STREAMING-NEXT: pmullb z0.d, z0.s, z1.s ; CHECK-SME-STREAMING-NEXT: pmullt z4.d, z3.s, z2.s ; CHECK-SME-STREAMING-NEXT: pmullb z2.d, z3.s, z2.s ; CHECK-SME-STREAMING-NEXT: trn1 z1.s, z2.s, z4.s ; CHECK-SME-STREAMING-NEXT: eorbt z1.s, z1.s, z1.s ; CHECK-SME-STREAMING-NEXT: eortb z0.s, z0.s, z1.s ; 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: trn1 z2.s, z1.s, z0.s ; CHECK-SVE2-NEXT: trn2 z3.s, z0.s, z1.s ; CHECK-SVE2-NEXT: pmullb z0.d, z0.s, z1.s ; CHECK-SVE2-NEXT: pmullt z4.d, z3.s, z2.s ; CHECK-SVE2-NEXT: pmullb z2.d, z3.s, z2.s ; CHECK-SVE2-NEXT: trn1 z1.s, z2.s, z4.s ; CHECK-SVE2-NEXT: eorbt z1.s, z1.s, z1.s ; CHECK-SVE2-NEXT: eortb z0.s, z0.s, z1.s ; CHECK-SVE2-NEXT: ret ; ; CHECK-SVE2-AES-LABEL: clmul_nxv2i64: ; CHECK-SVE2-AES: // %bb.0: ; 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 @llvm.clmul.nxv2i64( %x, %y) ret %a } ; TODO: fix ; define @clmul_nxv1i128( %x, %y) { ; %a = call @llvm.clmul.nxv1i128( %x, %y) ; ret %a ; } define @clmul_nxv16i8_zext( %x, %y) { ; CHECK-SVE-LABEL: clmul_nxv16i8_zext: ; CHECK-SVE: // %bb.0: ; CHECK-SVE-NEXT: and z0.b, z0.b, #0xf ; CHECK-SVE-NEXT: movprfx z2, z1 ; CHECK-SVE-NEXT: and z2.b, z2.b, #0x2 ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.b, z3.b, #0x1 ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.b, z4.b, #0x4 ; CHECK-SVE-NEXT: and z1.b, z1.b, #0x8 ; CHECK-SVE-NEXT: ptrue p0.b ; CHECK-SVE-NEXT: mul z2.b, p0/m, z2.b, z0.b ; CHECK-SVE-NEXT: mul z3.b, p0/m, z3.b, z0.b ; CHECK-SVE-NEXT: mul z4.b, p0/m, z4.b, z0.b ; CHECK-SVE-NEXT: mul z0.b, p0/m, z0.b, z1.b ; CHECK-SVE-NEXT: eor z1.d, z3.d, z2.d ; CHECK-SVE-NEXT: eor z0.d, z4.d, z0.d ; 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: and z0.b, z0.b, #0xf ; CHECK-SVE-AES-NEXT: movprfx z2, z1 ; CHECK-SVE-AES-NEXT: and z2.b, z2.b, #0x2 ; CHECK-SVE-AES-NEXT: movprfx z3, z1 ; CHECK-SVE-AES-NEXT: and z3.b, z3.b, #0x1 ; CHECK-SVE-AES-NEXT: movprfx z4, z1 ; CHECK-SVE-AES-NEXT: and z4.b, z4.b, #0x4 ; CHECK-SVE-AES-NEXT: and z1.b, z1.b, #0x8 ; CHECK-SVE-AES-NEXT: ptrue p0.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, p0/m, z0.b, z1.b ; CHECK-SVE-AES-NEXT: eor z1.d, z3.d, z2.d ; CHECK-SVE-AES-NEXT: eor z0.d, z4.d, z0.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 ; CHECK-SVE2-NEXT: and z1.b, z1.b, #0xf ; CHECK-SVE2-NEXT: pmul z0.b, z0.b, z1.b ; CHECK-SVE2-NEXT: ret ; ; CHECK-SVE2-AES-LABEL: clmul_nxv16i8_zext: ; CHECK-SVE2-AES: // %bb.0: ; CHECK-SVE2-AES-NEXT: and z0.b, z0.b, #0xf ; CHECK-SVE2-AES-NEXT: and z1.b, z1.b, #0xf ; CHECK-SVE2-AES-NEXT: pmul z0.b, z0.b, z1.b ; CHECK-SVE2-AES-NEXT: ret %zextx = zext %x to %zexty = zext %y to %a = call @llvm.clmul.nxv16i8( %zextx, %zexty) ret %a } define @clmul_nxv8i16_zext( %x, %y) { ; CHECK-SVE-LABEL: clmul_nxv8i16_zext: ; CHECK-SVE: // %bb.0: ; CHECK-SVE-NEXT: and z0.h, z0.h, #0xff ; CHECK-SVE-NEXT: movprfx z2, z1 ; CHECK-SVE-NEXT: and z2.h, z2.h, #0x2 ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.h, z3.h, #0x1 ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.h, z4.h, #0x4 ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.h, z5.h, #0x8 ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.h, z6.h, #0x10 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.h, z7.h, #0x20 ; CHECK-SVE-NEXT: ptrue p0.h ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.h, z24.h, #0x40 ; CHECK-SVE-NEXT: and z1.h, z1.h, #0x80 ; CHECK-SVE-NEXT: mul z2.h, p0/m, z2.h, z0.h ; CHECK-SVE-NEXT: mul z3.h, p0/m, z3.h, z0.h ; CHECK-SVE-NEXT: mul z4.h, p0/m, z4.h, z0.h ; CHECK-SVE-NEXT: mul z5.h, p0/m, z5.h, z0.h ; CHECK-SVE-NEXT: mul z6.h, p0/m, z6.h, z0.h ; CHECK-SVE-NEXT: mul z7.h, p0/m, z7.h, z0.h ; CHECK-SVE-NEXT: mul z24.h, p0/m, z24.h, z0.h ; CHECK-SVE-NEXT: mul z0.h, p0/m, z0.h, z1.h ; CHECK-SVE-NEXT: eor z2.d, z3.d, z2.d ; CHECK-SVE-NEXT: eor z3.d, z4.d, z5.d ; CHECK-SVE-NEXT: eor z4.d, z6.d, z7.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: eor z3.d, z4.d, z24.d ; CHECK-SVE-NEXT: eor z1.d, z2.d, z3.d ; 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: and z0.h, z0.h, #0xff ; CHECK-SVE-AES-NEXT: movprfx z2, z1 ; CHECK-SVE-AES-NEXT: and z2.h, z2.h, #0x2 ; CHECK-SVE-AES-NEXT: movprfx z3, z1 ; CHECK-SVE-AES-NEXT: and z3.h, z3.h, #0x1 ; CHECK-SVE-AES-NEXT: movprfx z4, z1 ; CHECK-SVE-AES-NEXT: and z4.h, z4.h, #0x4 ; CHECK-SVE-AES-NEXT: movprfx z5, z1 ; CHECK-SVE-AES-NEXT: and z5.h, z5.h, #0x8 ; CHECK-SVE-AES-NEXT: movprfx z6, z1 ; CHECK-SVE-AES-NEXT: and z6.h, z6.h, #0x10 ; CHECK-SVE-AES-NEXT: movprfx z7, z1 ; CHECK-SVE-AES-NEXT: and z7.h, z7.h, #0x20 ; CHECK-SVE-AES-NEXT: ptrue p0.h ; CHECK-SVE-AES-NEXT: movprfx z24, z1 ; CHECK-SVE-AES-NEXT: and z24.h, z24.h, #0x40 ; CHECK-SVE-AES-NEXT: and z1.h, z1.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: 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 z0.h, p0/m, z0.h, z1.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: 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_nxv8i16_zext: ; CHECK-SME-STREAMING: // %bb.0: ; CHECK-SME-STREAMING-NEXT: and z0.h, z0.h, #0xff ; CHECK-SME-STREAMING-NEXT: and z1.h, z1.h, #0xff ; CHECK-SME-STREAMING-NEXT: pmullb z0.h, z0.b, z1.b ; 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: and z0.h, z0.h, #0xff ; CHECK-SME-STREAMING-SSVE-AES-NEXT: and z1.h, z1.h, #0xff ; CHECK-SME-STREAMING-SSVE-AES-NEXT: pmullb z0.h, z0.b, z1.b ; CHECK-SME-STREAMING-SSVE-AES-NEXT: ret ; ; CHECK-SVE2-LABEL: clmul_nxv8i16_zext: ; CHECK-SVE2: // %bb.0: ; CHECK-SVE2-NEXT: and z0.h, z0.h, #0xff ; CHECK-SVE2-NEXT: and z1.h, z1.h, #0xff ; CHECK-SVE2-NEXT: pmullb z0.h, z0.b, z1.b ; CHECK-SVE2-NEXT: ret ; ; CHECK-SVE2-AES-LABEL: clmul_nxv8i16_zext: ; CHECK-SVE2-AES: // %bb.0: ; CHECK-SVE2-AES-NEXT: and z0.h, z0.h, #0xff ; CHECK-SVE2-AES-NEXT: and z1.h, z1.h, #0xff ; CHECK-SVE2-AES-NEXT: pmullb z0.h, z0.b, z1.b ; CHECK-SVE2-AES-NEXT: ret %zextx = zext %x to %zexty = zext %y to %a = call @llvm.clmul.nxv8i16( %zextx, %zexty) ret %a } define @clmul_nxv4i32_zext( %x, %y) { ; CHECK-SVE-LABEL: clmul_nxv4i32_zext: ; CHECK-SVE: // %bb.0: ; CHECK-SVE-NEXT: and z0.s, z0.s, #0xffff ; CHECK-SVE-NEXT: movprfx z2, z1 ; CHECK-SVE-NEXT: and z2.s, z2.s, #0x2 ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.s, z3.s, #0x1 ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.s, z4.s, #0x4 ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.s, z5.s, #0x8 ; CHECK-SVE-NEXT: ptrue p0.s ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.s, z6.s, #0x10 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.s, z7.s, #0x20 ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.s, z24.s, #0x80 ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.s, z25.s, #0x100 ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.s, z26.s, #0x800 ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.s, z27.s, #0x1000 ; CHECK-SVE-NEXT: mul z2.s, p0/m, z2.s, z0.s ; CHECK-SVE-NEXT: mul z3.s, p0/m, z3.s, z0.s ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.s, z28.s, #0x40 ; CHECK-SVE-NEXT: mul z4.s, p0/m, z4.s, z0.s ; CHECK-SVE-NEXT: mul z5.s, p0/m, z5.s, z0.s ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.s, z29.s, #0x200 ; CHECK-SVE-NEXT: mul z6.s, p0/m, z6.s, z0.s ; CHECK-SVE-NEXT: mul z7.s, p0/m, z7.s, z0.s ; CHECK-SVE-NEXT: movprfx z30, z1 ; CHECK-SVE-NEXT: and z30.s, z30.s, #0x2000 ; CHECK-SVE-NEXT: mul z24.s, p0/m, z24.s, z0.s ; CHECK-SVE-NEXT: mul z25.s, p0/m, z25.s, z0.s ; CHECK-SVE-NEXT: mul z26.s, p0/m, z26.s, z0.s ; CHECK-SVE-NEXT: mul z27.s, p0/m, z27.s, z0.s ; CHECK-SVE-NEXT: eor z2.d, z3.d, z2.d ; CHECK-SVE-NEXT: eor z3.d, z4.d, z5.d ; CHECK-SVE-NEXT: mul z28.s, p0/m, z28.s, z0.s ; CHECK-SVE-NEXT: mul z29.s, p0/m, z29.s, z0.s ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.s, z4.s, #0x400 ; CHECK-SVE-NEXT: mul z30.s, p0/m, z30.s, z0.s ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.s, z5.s, #0x4000 ; CHECK-SVE-NEXT: eor z6.d, z6.d, z7.d ; CHECK-SVE-NEXT: eor z7.d, z24.d, z25.d ; CHECK-SVE-NEXT: and z1.s, z1.s, #0x8000 ; CHECK-SVE-NEXT: eor z24.d, z26.d, z27.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: mul z4.s, p0/m, z4.s, z0.s ; CHECK-SVE-NEXT: mul z5.s, p0/m, z5.s, z0.s ; CHECK-SVE-NEXT: eor z3.d, z6.d, z28.d ; CHECK-SVE-NEXT: eor z6.d, z7.d, z29.d ; CHECK-SVE-NEXT: mul z0.s, p0/m, z0.s, z1.s ; CHECK-SVE-NEXT: eor z7.d, z24.d, z30.d ; CHECK-SVE-NEXT: eor z1.d, z2.d, z3.d ; CHECK-SVE-NEXT: eor z2.d, z6.d, z4.d ; CHECK-SVE-NEXT: eor z3.d, z7.d, z5.d ; CHECK-SVE-NEXT: eor z1.d, z1.d, z2.d ; CHECK-SVE-NEXT: eor z0.d, z3.d, z0.d ; CHECK-SVE-NEXT: eor z0.d, z1.d, z0.d ; CHECK-SVE-NEXT: ret ; ; CHECK-SVE-AES-LABEL: clmul_nxv4i32_zext: ; CHECK-SVE-AES: // %bb.0: ; CHECK-SVE-AES-NEXT: and z0.s, z0.s, #0xffff ; CHECK-SVE-AES-NEXT: movprfx z2, z1 ; CHECK-SVE-AES-NEXT: and z2.s, z2.s, #0x2 ; CHECK-SVE-AES-NEXT: movprfx z3, z1 ; CHECK-SVE-AES-NEXT: and z3.s, z3.s, #0x1 ; CHECK-SVE-AES-NEXT: movprfx z4, z1 ; CHECK-SVE-AES-NEXT: and z4.s, z4.s, #0x4 ; CHECK-SVE-AES-NEXT: movprfx z5, z1 ; CHECK-SVE-AES-NEXT: and z5.s, z5.s, #0x8 ; CHECK-SVE-AES-NEXT: ptrue p0.s ; CHECK-SVE-AES-NEXT: movprfx z6, z1 ; CHECK-SVE-AES-NEXT: and z6.s, z6.s, #0x10 ; CHECK-SVE-AES-NEXT: movprfx z7, z1 ; CHECK-SVE-AES-NEXT: and z7.s, z7.s, #0x20 ; CHECK-SVE-AES-NEXT: movprfx z24, z1 ; CHECK-SVE-AES-NEXT: and z24.s, z24.s, #0x80 ; CHECK-SVE-AES-NEXT: movprfx z25, z1 ; CHECK-SVE-AES-NEXT: and z25.s, z25.s, #0x100 ; CHECK-SVE-AES-NEXT: movprfx z26, z1 ; CHECK-SVE-AES-NEXT: and z26.s, z26.s, #0x800 ; CHECK-SVE-AES-NEXT: movprfx z27, z1 ; CHECK-SVE-AES-NEXT: and z27.s, z27.s, #0x1000 ; 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: movprfx z28, z1 ; CHECK-SVE-AES-NEXT: and z28.s, z28.s, #0x40 ; 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: movprfx z29, z1 ; CHECK-SVE-AES-NEXT: and z29.s, z29.s, #0x200 ; 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: movprfx z30, z1 ; CHECK-SVE-AES-NEXT: and z30.s, z30.s, #0x2000 ; 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: eor z3.d, z4.d, z5.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: movprfx z4, z1 ; CHECK-SVE-AES-NEXT: and z4.s, z4.s, #0x400 ; CHECK-SVE-AES-NEXT: mul z30.s, p0/m, z30.s, z0.s ; CHECK-SVE-AES-NEXT: movprfx z5, z1 ; CHECK-SVE-AES-NEXT: and z5.s, z5.s, #0x4000 ; 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.s, z1.s, #0x8000 ; CHECK-SVE-AES-NEXT: eor z24.d, z26.d, z27.d ; CHECK-SVE-AES-NEXT: eor z2.d, z2.d, z3.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: eor z3.d, z6.d, z28.d ; CHECK-SVE-AES-NEXT: eor z6.d, z7.d, z29.d ; CHECK-SVE-AES-NEXT: mul z0.s, p0/m, z0.s, z1.s ; 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_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: and z0.s, z0.s, #0xffff ; 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: and z0.s, z0.s, #0xffff ; 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 %x to %zexty = zext %y to %a = call @llvm.clmul.nxv4i32( %zextx, %zexty) ret %a } define @clmul_nxv2i64_zext( %x, %y) { ; CHECK-SVE-LABEL: clmul_nxv2i64_zext: ; CHECK-SVE: // %bb.0: ; CHECK-SVE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CHECK-SVE-NEXT: addvl sp, sp, #-1 ; CHECK-SVE-NEXT: str z8, [sp] // 16-byte Folded Spill ; CHECK-SVE-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG ; CHECK-SVE-NEXT: .cfi_offset w29, -16 ; CHECK-SVE-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 16 ; CHECK-SVE-NEXT: and z0.d, z0.d, #0xffffffff ; CHECK-SVE-NEXT: movprfx z2, z1 ; CHECK-SVE-NEXT: and z2.d, z2.d, #0x2 ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.d, z3.d, #0x1 ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.d, z4.d, #0x4 ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.d, z5.d, #0x8 ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.d, z6.d, #0x10 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.d, z7.d, #0x20 ; CHECK-SVE-NEXT: ptrue p0.d ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.d, z24.d, #0x80 ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.d, z25.d, #0x100 ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x40 ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.d, z27.d, #0x200 ; CHECK-SVE-NEXT: mul z2.d, p0/m, z2.d, z0.d ; CHECK-SVE-NEXT: mul z3.d, p0/m, z3.d, z0.d ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.d, z29.d, #0x20000 ; CHECK-SVE-NEXT: mul z4.d, p0/m, z4.d, z0.d ; CHECK-SVE-NEXT: mul z5.d, p0/m, z5.d, z0.d ; CHECK-SVE-NEXT: movprfx z30, z1 ; CHECK-SVE-NEXT: and z30.d, z30.d, #0x40000 ; CHECK-SVE-NEXT: mul z6.d, p0/m, z6.d, z0.d ; CHECK-SVE-NEXT: mul z7.d, p0/m, z7.d, z0.d ; CHECK-SVE-NEXT: movprfx z31, z1 ; CHECK-SVE-NEXT: and z31.d, z31.d, #0x1000000 ; CHECK-SVE-NEXT: mul z24.d, p0/m, z24.d, z0.d ; CHECK-SVE-NEXT: mul z25.d, p0/m, z25.d, z0.d ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.d, z28.d, #0x400 ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: eor z2.d, z3.d, z2.d ; CHECK-SVE-NEXT: mul z27.d, p0/m, z27.d, z0.d ; CHECK-SVE-NEXT: eor z3.d, z4.d, z5.d ; CHECK-SVE-NEXT: movprfx z5, z1 ; CHECK-SVE-NEXT: and z5.d, z5.d, #0x800 ; CHECK-SVE-NEXT: mul z29.d, p0/m, z29.d, z0.d ; CHECK-SVE-NEXT: eor z4.d, z6.d, z7.d ; CHECK-SVE-NEXT: movprfx z6, z1 ; CHECK-SVE-NEXT: and z6.d, z6.d, #0x1000 ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.d, z7.d, #0x10000 ; CHECK-SVE-NEXT: eor z24.d, z24.d, z25.d ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.d, z25.d, #0x400000 ; CHECK-SVE-NEXT: mul z30.d, p0/m, z30.d, z0.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: mul z5.d, p0/m, z5.d, z0.d ; CHECK-SVE-NEXT: mul z31.d, p0/m, z31.d, z0.d ; CHECK-SVE-NEXT: eor z3.d, z4.d, z26.d ; CHECK-SVE-NEXT: movprfx z4, z1 ; CHECK-SVE-NEXT: and z4.d, z4.d, #0x800000 ; CHECK-SVE-NEXT: mul z6.d, p0/m, z6.d, z0.d ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x2000 ; CHECK-SVE-NEXT: mul z7.d, p0/m, z7.d, z0.d ; CHECK-SVE-NEXT: mul z25.d, p0/m, z25.d, z0.d ; CHECK-SVE-NEXT: movprfx z8, z1 ; CHECK-SVE-NEXT: and z8.d, z8.d, #0x2000000 ; CHECK-SVE-NEXT: mul z28.d, p0/m, z28.d, z0.d ; CHECK-SVE-NEXT: mul z4.d, p0/m, z4.d, z0.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: eor z3.d, z24.d, z27.d ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.d, z24.d, #0x4000 ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.d, z27.d, #0x80000 ; CHECK-SVE-NEXT: eor z5.d, z5.d, z6.d ; CHECK-SVE-NEXT: eor z6.d, z7.d, z29.d ; CHECK-SVE-NEXT: movprfx z7, z1 ; CHECK-SVE-NEXT: and z7.d, z7.d, #0x8000 ; CHECK-SVE-NEXT: mul z8.d, p0/m, z8.d, z0.d ; CHECK-SVE-NEXT: movprfx z29, z1 ; CHECK-SVE-NEXT: and z29.d, z29.d, #0x4000000 ; CHECK-SVE-NEXT: eor z3.d, z3.d, z28.d ; CHECK-SVE-NEXT: eor z4.d, z25.d, z4.d ; CHECK-SVE-NEXT: mul z24.d, p0/m, z24.d, z0.d ; CHECK-SVE-NEXT: mul z27.d, p0/m, z27.d, z0.d ; CHECK-SVE-NEXT: movprfx z25, z1 ; CHECK-SVE-NEXT: and z25.d, z25.d, #0x100000 ; CHECK-SVE-NEXT: eor z5.d, z5.d, z26.d ; CHECK-SVE-NEXT: eor z6.d, z6.d, z30.d ; CHECK-SVE-NEXT: mul z7.d, p0/m, z7.d, z0.d ; CHECK-SVE-NEXT: movprfx z26, z1 ; CHECK-SVE-NEXT: and z26.d, z26.d, #0x200000 ; CHECK-SVE-NEXT: mul z29.d, p0/m, z29.d, z0.d ; CHECK-SVE-NEXT: eor z4.d, z4.d, z31.d ; CHECK-SVE-NEXT: movprfx z28, z1 ; CHECK-SVE-NEXT: and z28.d, z28.d, #0x8000000 ; CHECK-SVE-NEXT: eor z2.d, z2.d, z3.d ; CHECK-SVE-NEXT: mul z25.d, p0/m, z25.d, z0.d ; CHECK-SVE-NEXT: eor z5.d, z5.d, z24.d ; CHECK-SVE-NEXT: eor z6.d, z6.d, z27.d ; CHECK-SVE-NEXT: mul z26.d, p0/m, z26.d, z0.d ; CHECK-SVE-NEXT: movprfx z3, z1 ; CHECK-SVE-NEXT: and z3.d, z3.d, #0x10000000 ; CHECK-SVE-NEXT: movprfx z24, z1 ; CHECK-SVE-NEXT: and z24.d, z24.d, #0x20000000 ; CHECK-SVE-NEXT: eor z4.d, z4.d, z8.d ; CHECK-SVE-NEXT: mul z28.d, p0/m, z28.d, z0.d ; CHECK-SVE-NEXT: movprfx z27, z1 ; CHECK-SVE-NEXT: and z27.d, z27.d, #0x40000000 ; CHECK-SVE-NEXT: eor z5.d, z5.d, z7.d ; CHECK-SVE-NEXT: and z1.d, z1.d, #0x80000000 ; CHECK-SVE-NEXT: ldr z8, [sp] // 16-byte Folded Reload ; CHECK-SVE-NEXT: eor z6.d, z6.d, z25.d ; CHECK-SVE-NEXT: mul z3.d, p0/m, z3.d, z0.d ; CHECK-SVE-NEXT: mul z24.d, p0/m, z24.d, z0.d ; CHECK-SVE-NEXT: eor z4.d, z4.d, z29.d ; CHECK-SVE-NEXT: mul z27.d, p0/m, z27.d, z0.d ; CHECK-SVE-NEXT: eor z2.d, z2.d, z5.d ; CHECK-SVE-NEXT: mul z0.d, p0/m, z0.d, z1.d ; CHECK-SVE-NEXT: eor z5.d, z6.d, z26.d ; CHECK-SVE-NEXT: eor z4.d, z4.d, z28.d ; CHECK-SVE-NEXT: eor z1.d, z2.d, z5.d ; CHECK-SVE-NEXT: eor z2.d, z4.d, z3.d ; CHECK-SVE-NEXT: eor z3.d, z24.d, z27.d ; CHECK-SVE-NEXT: eor z1.d, z1.d, z2.d ; CHECK-SVE-NEXT: eor z0.d, z3.d, z0.d ; CHECK-SVE-NEXT: eor z0.d, z1.d, z0.d ; CHECK-SVE-NEXT: addvl sp, sp, #1 ; 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: and z0.d, z0.d, #0xffffffff ; CHECK-SME-STREAMING-NEXT: and z1.d, z1.d, #0xffffffff ; CHECK-SME-STREAMING-NEXT: pmullb z0.d, z0.s, z1.s ; 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: pmullb z0.d, z0.s, z1.s ; CHECK-SME-STREAMING-SSVE-AES-NEXT: ret ; ; CHECK-SVE2-LABEL: clmul_nxv2i64_zext: ; CHECK-SVE2: // %bb.0: ; CHECK-SVE2-NEXT: and z0.d, z0.d, #0xffffffff ; CHECK-SVE2-NEXT: and z1.d, z1.d, #0xffffffff ; CHECK-SVE2-NEXT: pmullb z0.d, z0.s, z1.s ; CHECK-SVE2-NEXT: ret ; ; CHECK-SVE2-AES-LABEL: clmul_nxv2i64_zext: ; CHECK-SVE2-AES: // %bb.0: ; CHECK-SVE2-AES-NEXT: and z0.d, z0.d, #0xffffffff ; CHECK-SVE2-AES-NEXT: and z1.d, z1.d, #0xffffffff ; CHECK-SVE2-AES-NEXT: pmullb z0.d, z0.s, z1.s ; CHECK-SVE2-AES-NEXT: ret %zextx = zext %x to %zexty = zext %y to %a = call @llvm.clmul.nxv2i64( %zextx, %zexty) ret %a } ; TODO: fix ; define @clmul_nxv1i128_zext( %x, %y) { ; %zextx = zext %x to ; %zexty = zext %y to ; %a = call @llvm.clmul.nxv1i128( %zextx, %zexty) ; ret %a ; }