blob: a924bf4cdf07a50b4ff0d3178914dd30e11a0368 [file] [edit]
; 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 - | FileCheck %s --check-prefixes=CHECK,CHECK-NEON
; RUN: llc -mtriple=aarch64-linux-unknown-gnu %s -o - -mattr=+aes | FileCheck %s --check-prefixes=CHECK,CHECK-AES
define <16 x i8> @clmul_v16i8_neon(<16 x i8> %x, <16 x i8> %y) {
; CHECK-LABEL: clmul_v16i8_neon:
; CHECK: // %bb.0:
; CHECK-NEXT: pmul v0.16b, v0.16b, v1.16b
; CHECK-NEXT: ret
%a = call <16 x i8> @llvm.clmul.v16i8(<16 x i8> %x, <16 x i8> %y)
ret <16 x i8> %a
}
define <8 x i8> @clmul_v8i8_neon(<8 x i8> %x, <8 x i8> %y) {
; CHECK-LABEL: clmul_v8i8_neon:
; CHECK: // %bb.0:
; CHECK-NEXT: pmul v0.8b, v0.8b, v1.8b
; CHECK-NEXT: ret
%a = call <8 x i8> @llvm.clmul.v8i8(<8 x i8> %x, <8 x i8> %y)
ret <8 x i8> %a
}
define <8 x i16> @clmul_v8i16_neon(<8 x i16> %x, <8 x i16> %y) {
; CHECK-LABEL: clmul_v8i16_neon:
; CHECK: // %bb.0:
; CHECK-NEXT: xtn v2.8b, v1.8h
; CHECK-NEXT: xtn v3.8b, v0.8h
; CHECK-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEXT: shrn v1.8b, v1.8h, #8
; CHECK-NEXT: rbit v4.8b, v2.8b
; CHECK-NEXT: rbit v5.8b, v3.8b
; CHECK-NEXT: pmul v0.8b, v0.8b, v2.8b
; CHECK-NEXT: pmul v1.8b, v3.8b, v1.8b
; CHECK-NEXT: pmul v2.8b, v3.8b, v2.8b
; CHECK-NEXT: pmul v4.8b, v5.8b, v4.8b
; CHECK-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEXT: rbit v4.8b, v4.8b
; CHECK-NEXT: ushr v1.8b, v4.8b, #1
; CHECK-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEXT: ushll v1.8h, v2.8b, #0
; CHECK-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEXT: ret
%a = call <8 x i16> @llvm.clmul.v8i16(<8 x i16> %x, <8 x i16> %y)
ret <8 x i16> %a
}
define <4 x i16> @clmul_v4i16_neon(<4 x i16> %x, <4 x i16> %y) {
; CHECK-NEON-LABEL: clmul_v4i16_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: // kill: def $d1 killed $d1 def $q1
; CHECK-NEON-NEXT: // kill: def $d0 killed $d0 def $q0
; CHECK-NEON-NEXT: xtn v2.8b, v1.8h
; CHECK-NEON-NEXT: xtn v3.8b, v0.8h
; CHECK-NEON-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEON-NEXT: shrn v1.8b, v1.8h, #8
; CHECK-NEON-NEXT: rbit v4.8b, v2.8b
; CHECK-NEON-NEXT: rbit v5.8b, v3.8b
; CHECK-NEON-NEXT: pmul v0.8b, v0.8b, v2.8b
; CHECK-NEON-NEXT: pmul v1.8b, v3.8b, v1.8b
; CHECK-NEON-NEXT: pmul v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: pmul v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: ushr v1.8b, v4.8b, #1
; CHECK-NEON-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: ushll v1.8h, v2.8b, #0
; CHECK-NEON-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEON-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: // kill: def $d0 killed $d0 killed $q0
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v4i16_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll v1.4s, v1.4h, #0
; CHECK-AES-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-AES-NEXT: ushll2 v2.2d, v1.4s, #0
; CHECK-AES-NEXT: ushll2 v3.2d, v0.4s, #0
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v4.1q, v3.2d, v2.2d
; CHECK-AES-NEXT: pmull v2.1q, v3.1d, v2.1d
; CHECK-AES-NEXT: pmull2 v3.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v2.d[1], v4.d[0]
; CHECK-AES-NEXT: mov v0.d[1], v3.d[0]
; CHECK-AES-NEXT: uzp1 v0.4s, v0.4s, v2.4s
; CHECK-AES-NEXT: xtn v0.4h, v0.4s
; CHECK-AES-NEXT: ret
%a = call <4 x i16> @llvm.clmul.v4i16(<4 x i16> %x, <4 x i16> %y)
ret <4 x i16> %a
}
define <4 x i32> @clmul_v4i32_neon(<4 x i32> %x, <4 x i32> %y) {
; CHECK-NEON-LABEL: clmul_v4i32_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: xtn v2.4h, v1.4s
; CHECK-NEON-NEXT: xtn v3.4h, v0.4s
; CHECK-NEON-NEXT: shrn v16.4h, v0.4s, #16
; CHECK-NEON-NEXT: shrn v17.4h, v1.4s, #16
; CHECK-NEON-NEXT: xtn v20.8b, v16.8h
; CHECK-NEON-NEXT: shrn v16.8b, v16.8h, #8
; CHECK-NEON-NEXT: rev16 v4.8b, v2.8b
; CHECK-NEON-NEXT: rev16 v5.8b, v3.8b
; CHECK-NEON-NEXT: xtn v0.8b, v2.8h
; CHECK-NEON-NEXT: xtn v21.8b, v17.8h
; CHECK-NEON-NEXT: xtn v1.8b, v3.8h
; CHECK-NEON-NEXT: shrn v2.8b, v2.8h, #8
; CHECK-NEON-NEXT: shrn v3.8b, v3.8h, #8
; CHECK-NEON-NEXT: shrn v17.8b, v17.8h, #8
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: rbit v5.8b, v5.8b
; CHECK-NEON-NEXT: rbit v22.8b, v0.8b
; CHECK-NEON-NEXT: rbit v23.8b, v21.8b
; CHECK-NEON-NEXT: rbit v24.8b, v1.8b
; CHECK-NEON-NEXT: pmul v16.8b, v16.8b, v0.8b
; CHECK-NEON-NEXT: pmul v25.8b, v20.8b, v2.8b
; CHECK-NEON-NEXT: pmul v17.8b, v1.8b, v17.8b
; CHECK-NEON-NEXT: pmul v2.8b, v1.8b, v2.8b
; CHECK-NEON-NEXT: xtn v6.8b, v4.8h
; CHECK-NEON-NEXT: xtn v7.8b, v5.8h
; CHECK-NEON-NEXT: shrn v5.8b, v5.8h, #8
; CHECK-NEON-NEXT: shrn v4.8b, v4.8h, #8
; CHECK-NEON-NEXT: pmul v23.8b, v24.8b, v23.8b
; CHECK-NEON-NEXT: rbit v18.8b, v6.8b
; CHECK-NEON-NEXT: rbit v19.8b, v7.8b
; CHECK-NEON-NEXT: pmul v5.8b, v5.8b, v6.8b
; CHECK-NEON-NEXT: pmul v4.8b, v7.8b, v4.8b
; CHECK-NEON-NEXT: pmul v6.8b, v7.8b, v6.8b
; CHECK-NEON-NEXT: rbit v7.8b, v23.8b
; CHECK-NEON-NEXT: pmul v18.8b, v19.8b, v18.8b
; CHECK-NEON-NEXT: rbit v19.8b, v20.8b
; CHECK-NEON-NEXT: eor v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: ushll v6.8h, v6.8b, #0
; CHECK-NEON-NEXT: ushr v7.8b, v7.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v18.8b
; CHECK-NEON-NEXT: pmul v19.8b, v19.8b, v22.8b
; CHECK-NEON-NEXT: ushr v5.8b, v18.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v19.8b
; CHECK-NEON-NEXT: pmul v19.8b, v3.8b, v21.8b
; CHECK-NEON-NEXT: pmul v3.8b, v3.8b, v0.8b
; CHECK-NEON-NEXT: eor v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: eor v5.8b, v25.8b, v16.8b
; CHECK-NEON-NEXT: eor v16.8b, v17.8b, v19.8b
; CHECK-NEON-NEXT: pmul v17.8b, v24.8b, v22.8b
; CHECK-NEON-NEXT: ushr v18.8b, v18.8b, #1
; CHECK-NEON-NEXT: eor v2.8b, v2.8b, v3.8b
; CHECK-NEON-NEXT: shll v4.8h, v4.8b, #8
; CHECK-NEON-NEXT: eor v5.8b, v18.8b, v5.8b
; CHECK-NEON-NEXT: pmul v18.8b, v20.8b, v0.8b
; CHECK-NEON-NEXT: eor v7.8b, v7.8b, v16.8b
; CHECK-NEON-NEXT: pmul v16.8b, v1.8b, v21.8b
; CHECK-NEON-NEXT: pmul v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: orr v4.16b, v6.16b, v4.16b
; CHECK-NEON-NEXT: rbit v6.8b, v17.8b
; CHECK-NEON-NEXT: shll v5.8h, v5.8b, #8
; CHECK-NEON-NEXT: shll v7.8h, v7.8b, #8
; CHECK-NEON-NEXT: ushll v17.8h, v18.8b, #0
; CHECK-NEON-NEXT: rev16 v4.8b, v4.8b
; CHECK-NEON-NEXT: ushll v16.8h, v16.8b, #0
; CHECK-NEON-NEXT: ushll v0.8h, v0.8b, #0
; CHECK-NEON-NEXT: ushr v3.8b, v6.8b, #1
; CHECK-NEON-NEXT: orr v5.16b, v17.16b, v5.16b
; CHECK-NEON-NEXT: orr v6.16b, v16.16b, v7.16b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: eor v1.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: eor v2.8b, v6.8b, v5.8b
; CHECK-NEON-NEXT: shll v1.8h, v1.8b, #8
; CHECK-NEON-NEXT: ushr v3.4h, v4.4h, #1
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: eor v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-NEON-NEXT: shll v1.4s, v2.4h, #16
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v4i32_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll2 v2.2d, v1.4s, #0
; CHECK-AES-NEXT: ushll2 v3.2d, v0.4s, #0
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v4.1q, v3.2d, v2.2d
; CHECK-AES-NEXT: pmull v2.1q, v3.1d, v2.1d
; CHECK-AES-NEXT: pmull2 v3.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v2.d[1], v4.d[0]
; CHECK-AES-NEXT: mov v0.d[1], v3.d[0]
; CHECK-AES-NEXT: uzp1 v0.4s, v0.4s, v2.4s
; CHECK-AES-NEXT: ret
%a = call <4 x i32> @llvm.clmul.v4i32(<4 x i32> %x, <4 x i32> %y)
ret <4 x i32> %a
}
define <2 x i32> @clmul_v2i32_neon(<2 x i32> %x, <2 x i32> %y) {
; CHECK-NEON-LABEL: clmul_v2i32_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: // kill: def $d1 killed $d1 def $q1
; CHECK-NEON-NEXT: // kill: def $d0 killed $d0 def $q0
; CHECK-NEON-NEXT: xtn v2.4h, v1.4s
; CHECK-NEON-NEXT: xtn v3.4h, v0.4s
; CHECK-NEON-NEXT: shrn v16.4h, v0.4s, #16
; CHECK-NEON-NEXT: shrn v17.4h, v1.4s, #16
; CHECK-NEON-NEXT: xtn v20.8b, v16.8h
; CHECK-NEON-NEXT: shrn v16.8b, v16.8h, #8
; CHECK-NEON-NEXT: rev16 v4.8b, v2.8b
; CHECK-NEON-NEXT: rev16 v5.8b, v3.8b
; CHECK-NEON-NEXT: xtn v0.8b, v2.8h
; CHECK-NEON-NEXT: xtn v21.8b, v17.8h
; CHECK-NEON-NEXT: xtn v1.8b, v3.8h
; CHECK-NEON-NEXT: shrn v2.8b, v2.8h, #8
; CHECK-NEON-NEXT: shrn v3.8b, v3.8h, #8
; CHECK-NEON-NEXT: shrn v17.8b, v17.8h, #8
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: rbit v5.8b, v5.8b
; CHECK-NEON-NEXT: rbit v22.8b, v0.8b
; CHECK-NEON-NEXT: rbit v23.8b, v21.8b
; CHECK-NEON-NEXT: rbit v24.8b, v1.8b
; CHECK-NEON-NEXT: pmul v16.8b, v16.8b, v0.8b
; CHECK-NEON-NEXT: pmul v25.8b, v20.8b, v2.8b
; CHECK-NEON-NEXT: pmul v17.8b, v1.8b, v17.8b
; CHECK-NEON-NEXT: pmul v2.8b, v1.8b, v2.8b
; CHECK-NEON-NEXT: xtn v6.8b, v4.8h
; CHECK-NEON-NEXT: xtn v7.8b, v5.8h
; CHECK-NEON-NEXT: shrn v5.8b, v5.8h, #8
; CHECK-NEON-NEXT: shrn v4.8b, v4.8h, #8
; CHECK-NEON-NEXT: pmul v23.8b, v24.8b, v23.8b
; CHECK-NEON-NEXT: rbit v18.8b, v6.8b
; CHECK-NEON-NEXT: rbit v19.8b, v7.8b
; CHECK-NEON-NEXT: pmul v5.8b, v5.8b, v6.8b
; CHECK-NEON-NEXT: pmul v4.8b, v7.8b, v4.8b
; CHECK-NEON-NEXT: pmul v6.8b, v7.8b, v6.8b
; CHECK-NEON-NEXT: rbit v7.8b, v23.8b
; CHECK-NEON-NEXT: pmul v18.8b, v19.8b, v18.8b
; CHECK-NEON-NEXT: rbit v19.8b, v20.8b
; CHECK-NEON-NEXT: eor v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: ushll v6.8h, v6.8b, #0
; CHECK-NEON-NEXT: ushr v7.8b, v7.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v18.8b
; CHECK-NEON-NEXT: pmul v19.8b, v19.8b, v22.8b
; CHECK-NEON-NEXT: ushr v5.8b, v18.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v19.8b
; CHECK-NEON-NEXT: pmul v19.8b, v3.8b, v21.8b
; CHECK-NEON-NEXT: pmul v3.8b, v3.8b, v0.8b
; CHECK-NEON-NEXT: eor v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: eor v5.8b, v25.8b, v16.8b
; CHECK-NEON-NEXT: eor v16.8b, v17.8b, v19.8b
; CHECK-NEON-NEXT: pmul v17.8b, v24.8b, v22.8b
; CHECK-NEON-NEXT: ushr v18.8b, v18.8b, #1
; CHECK-NEON-NEXT: eor v2.8b, v2.8b, v3.8b
; CHECK-NEON-NEXT: shll v4.8h, v4.8b, #8
; CHECK-NEON-NEXT: eor v5.8b, v18.8b, v5.8b
; CHECK-NEON-NEXT: pmul v18.8b, v20.8b, v0.8b
; CHECK-NEON-NEXT: eor v7.8b, v7.8b, v16.8b
; CHECK-NEON-NEXT: pmul v16.8b, v1.8b, v21.8b
; CHECK-NEON-NEXT: pmul v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: orr v4.16b, v6.16b, v4.16b
; CHECK-NEON-NEXT: rbit v6.8b, v17.8b
; CHECK-NEON-NEXT: shll v5.8h, v5.8b, #8
; CHECK-NEON-NEXT: shll v7.8h, v7.8b, #8
; CHECK-NEON-NEXT: ushll v17.8h, v18.8b, #0
; CHECK-NEON-NEXT: rev16 v4.8b, v4.8b
; CHECK-NEON-NEXT: ushll v16.8h, v16.8b, #0
; CHECK-NEON-NEXT: ushll v0.8h, v0.8b, #0
; CHECK-NEON-NEXT: ushr v3.8b, v6.8b, #1
; CHECK-NEON-NEXT: orr v5.16b, v17.16b, v5.16b
; CHECK-NEON-NEXT: orr v6.16b, v16.16b, v7.16b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: eor v1.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: eor v2.8b, v6.8b, v5.8b
; CHECK-NEON-NEXT: shll v1.8h, v1.8b, #8
; CHECK-NEON-NEXT: ushr v3.4h, v4.4h, #1
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: eor v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-NEON-NEXT: shll v1.4s, v2.4h, #16
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: // kill: def $d0 killed $d0 killed $q0
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v2i32_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v2.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v0.d[1], v2.d[0]
; CHECK-AES-NEXT: xtn v0.2s, v0.2d
; CHECK-AES-NEXT: ret
%a = call <2 x i32> @llvm.clmul.v2i32(<2 x i32> %x, <2 x i32> %y)
ret <2 x i32> %a
}
define <2 x i64> @clmul_v2i64_neon(<2 x i64> %x, <2 x i64> %y) {
; CHECK-NEON-LABEL: clmul_v2i64_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: sub sp, sp, #112
; CHECK-NEON-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x28, x27, [sp, #32] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x26, x25, [sp, #48] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x24, x23, [sp, #64] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill
; CHECK-NEON-NEXT: .cfi_def_cfa_offset 112
; CHECK-NEON-NEXT: .cfi_offset w19, -8
; CHECK-NEON-NEXT: .cfi_offset w20, -16
; CHECK-NEON-NEXT: .cfi_offset w21, -24
; CHECK-NEON-NEXT: .cfi_offset w22, -32
; CHECK-NEON-NEXT: .cfi_offset w23, -40
; CHECK-NEON-NEXT: .cfi_offset w24, -48
; CHECK-NEON-NEXT: .cfi_offset w25, -56
; CHECK-NEON-NEXT: .cfi_offset w26, -64
; CHECK-NEON-NEXT: .cfi_offset w27, -72
; CHECK-NEON-NEXT: .cfi_offset w28, -80
; CHECK-NEON-NEXT: .cfi_offset w30, -88
; CHECK-NEON-NEXT: .cfi_offset w29, -96
; CHECK-NEON-NEXT: movi v2.16b, #17
; CHECK-NEON-NEXT: movi v3.16b, #34
; CHECK-NEON-NEXT: movi v4.16b, #136
; CHECK-NEON-NEXT: movi v5.16b, #68
; CHECK-NEON-NEXT: and v6.16b, v1.16b, v2.16b
; CHECK-NEON-NEXT: and v7.16b, v0.16b, v3.16b
; CHECK-NEON-NEXT: and v16.16b, v1.16b, v3.16b
; CHECK-NEON-NEXT: and v17.16b, v0.16b, v2.16b
; CHECK-NEON-NEXT: and v18.16b, v1.16b, v4.16b
; CHECK-NEON-NEXT: and v19.16b, v0.16b, v5.16b
; CHECK-NEON-NEXT: and v1.16b, v1.16b, v5.16b
; CHECK-NEON-NEXT: and v0.16b, v0.16b, v4.16b
; CHECK-NEON-NEXT: fmov x10, d6
; CHECK-NEON-NEXT: fmov x5, d7
; CHECK-NEON-NEXT: fmov x18, d16
; CHECK-NEON-NEXT: fmov x16, d17
; CHECK-NEON-NEXT: fmov x19, d18
; CHECK-NEON-NEXT: fmov x20, d19
; CHECK-NEON-NEXT: mov x15, v6.d[1]
; CHECK-NEON-NEXT: mov x13, v17.d[1]
; CHECK-NEON-NEXT: mov x14, v18.d[1]
; CHECK-NEON-NEXT: mul x9, x5, x10
; CHECK-NEON-NEXT: mov x25, v19.d[1]
; CHECK-NEON-NEXT: fmov x30, d1
; CHECK-NEON-NEXT: fmov x23, d0
; CHECK-NEON-NEXT: mov x12, v7.d[1]
; CHECK-NEON-NEXT: mov x3, v16.d[1]
; CHECK-NEON-NEXT: mul x8, x16, x18
; CHECK-NEON-NEXT: mov x6, v1.d[1]
; CHECK-NEON-NEXT: mov x11, v0.d[1]
; CHECK-NEON-NEXT: mul x17, x20, x19
; CHECK-NEON-NEXT: mul x22, x16, x10
; CHECK-NEON-NEXT: stp x8, x9, [sp] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x8, x25, x14
; CHECK-NEON-NEXT: ldp d1, d0, [sp] // 16-byte Folded Reload
; CHECK-NEON-NEXT: fmov d6, x17
; CHECK-NEON-NEXT: mul x9, x13, x15
; CHECK-NEON-NEXT: fmov d17, x22
; CHECK-NEON-NEXT: mul x4, x23, x30
; CHECK-NEON-NEXT: mov v6.d[1], x8
; CHECK-NEON-NEXT: mul x21, x5, x19
; CHECK-NEON-NEXT: mov v17.d[1], x9
; CHECK-NEON-NEXT: mul x27, x20, x30
; CHECK-NEON-NEXT: fmov d7, x4
; CHECK-NEON-NEXT: mul x28, x23, x18
; CHECK-NEON-NEXT: fmov d16, x21
; CHECK-NEON-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x29, x5, x18
; CHECK-NEON-NEXT: fmov d18, x27
; CHECK-NEON-NEXT: mul x5, x5, x30
; CHECK-NEON-NEXT: fmov d19, x28
; CHECK-NEON-NEXT: ldp x28, x27, [sp, #32] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x30, x16, x30
; CHECK-NEON-NEXT: fmov d20, x29
; CHECK-NEON-NEXT: mul x18, x20, x18
; CHECK-NEON-NEXT: fmov d24, x5
; CHECK-NEON-NEXT: mul x20, x20, x10
; CHECK-NEON-NEXT: fmov d21, x30
; CHECK-NEON-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x16, x16, x19
; CHECK-NEON-NEXT: fmov d26, x18
; CHECK-NEON-NEXT: mul x19, x23, x19
; CHECK-NEON-NEXT: fmov d22, x20
; CHECK-NEON-NEXT: mul x10, x23, x10
; CHECK-NEON-NEXT: fmov d25, x16
; CHECK-NEON-NEXT: mul x1, x12, x15
; CHECK-NEON-NEXT: fmov d23, x19
; CHECK-NEON-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x2, x13, x3
; CHECK-NEON-NEXT: fmov d27, x10
; CHECK-NEON-NEXT: mul x0, x11, x6
; CHECK-NEON-NEXT: mov v0.d[1], x1
; CHECK-NEON-NEXT: mul x7, x12, x14
; CHECK-NEON-NEXT: mov v1.d[1], x2
; CHECK-NEON-NEXT: mul x24, x25, x6
; CHECK-NEON-NEXT: mov v7.d[1], x0
; CHECK-NEON-NEXT: mul x26, x11, x3
; CHECK-NEON-NEXT: mov v16.d[1], x7
; CHECK-NEON-NEXT: eor v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: mul x23, x12, x3
; CHECK-NEON-NEXT: mov v18.d[1], x24
; CHECK-NEON-NEXT: eor v1.16b, v6.16b, v7.16b
; CHECK-NEON-NEXT: mul x12, x12, x6
; CHECK-NEON-NEXT: mov v19.d[1], x26
; CHECK-NEON-NEXT: eor v6.16b, v17.16b, v16.16b
; CHECK-NEON-NEXT: mul x6, x13, x6
; CHECK-NEON-NEXT: eor v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: mov v20.d[1], x23
; CHECK-NEON-NEXT: ldp x24, x23, [sp, #64] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x3, x25, x3
; CHECK-NEON-NEXT: mov v24.d[1], x12
; CHECK-NEON-NEXT: eor v7.16b, v18.16b, v19.16b
; CHECK-NEON-NEXT: and v0.16b, v0.16b, v3.16b
; CHECK-NEON-NEXT: mul x25, x25, x15
; CHECK-NEON-NEXT: mov v21.d[1], x6
; CHECK-NEON-NEXT: mul x13, x13, x14
; CHECK-NEON-NEXT: eor v1.16b, v6.16b, v7.16b
; CHECK-NEON-NEXT: mov v26.d[1], x3
; CHECK-NEON-NEXT: mul x8, x11, x14
; CHECK-NEON-NEXT: mov v22.d[1], x25
; CHECK-NEON-NEXT: eor v16.16b, v21.16b, v20.16b
; CHECK-NEON-NEXT: and v1.16b, v1.16b, v2.16b
; CHECK-NEON-NEXT: mul x9, x11, x15
; CHECK-NEON-NEXT: ldp x26, x25, [sp, #48] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mov v25.d[1], x13
; CHECK-NEON-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: mov v23.d[1], x8
; CHECK-NEON-NEXT: mov v27.d[1], x9
; CHECK-NEON-NEXT: eor v18.16b, v25.16b, v24.16b
; CHECK-NEON-NEXT: eor v17.16b, v22.16b, v23.16b
; CHECK-NEON-NEXT: eor v19.16b, v26.16b, v27.16b
; CHECK-NEON-NEXT: eor v6.16b, v16.16b, v17.16b
; CHECK-NEON-NEXT: eor v7.16b, v18.16b, v19.16b
; CHECK-NEON-NEXT: and v2.16b, v6.16b, v5.16b
; CHECK-NEON-NEXT: and v3.16b, v7.16b, v4.16b
; CHECK-NEON-NEXT: orr v1.16b, v2.16b, v3.16b
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: add sp, sp, #112
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v2i64_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: pmull2 v2.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v0.d[1], v2.d[0]
; CHECK-AES-NEXT: ret
%a = call <2 x i64> @llvm.clmul.v2i64(<2 x i64> %x, <2 x i64> %y)
ret <2 x i64> %a
}
define <1 x i64> @clmul_v1i64_neon(<1 x i64> %x, <1 x i64> %y) {
; CHECK-NEON-LABEL: clmul_v1i64_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: movi v2.8b, #17
; CHECK-NEON-NEXT: movi v3.8b, #34
; CHECK-NEON-NEXT: movi v4.8b, #136
; CHECK-NEON-NEXT: movi v5.8b, #68
; CHECK-NEON-NEXT: and v6.8b, v1.8b, v2.8b
; CHECK-NEON-NEXT: and v7.8b, v0.8b, v3.8b
; CHECK-NEON-NEXT: and v16.8b, v1.8b, v3.8b
; CHECK-NEON-NEXT: and v17.8b, v0.8b, v2.8b
; CHECK-NEON-NEXT: fmov x8, d6
; CHECK-NEON-NEXT: fmov x9, d7
; CHECK-NEON-NEXT: and v6.8b, v1.8b, v4.8b
; CHECK-NEON-NEXT: and v7.8b, v0.8b, v5.8b
; CHECK-NEON-NEXT: and v1.8b, v1.8b, v5.8b
; CHECK-NEON-NEXT: and v0.8b, v0.8b, v4.8b
; CHECK-NEON-NEXT: fmov x11, d16
; CHECK-NEON-NEXT: fmov x12, d17
; CHECK-NEON-NEXT: fmov x14, d6
; CHECK-NEON-NEXT: mul x10, x9, x8
; CHECK-NEON-NEXT: fmov x15, d7
; CHECK-NEON-NEXT: fmov x17, d1
; CHECK-NEON-NEXT: fmov x18, d0
; CHECK-NEON-NEXT: mul x13, x12, x11
; CHECK-NEON-NEXT: mul x16, x15, x14
; CHECK-NEON-NEXT: fmov d0, x10
; CHECK-NEON-NEXT: mul x0, x18, x17
; CHECK-NEON-NEXT: fmov d1, x13
; CHECK-NEON-NEXT: mul x1, x9, x14
; CHECK-NEON-NEXT: fmov d6, x16
; CHECK-NEON-NEXT: mul x2, x12, x8
; CHECK-NEON-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: fmov d7, x0
; CHECK-NEON-NEXT: mul x3, x15, x17
; CHECK-NEON-NEXT: fmov d16, x1
; CHECK-NEON-NEXT: mul x4, x18, x11
; CHECK-NEON-NEXT: eor v1.8b, v6.8b, v7.8b
; CHECK-NEON-NEXT: fmov d17, x2
; CHECK-NEON-NEXT: mul x5, x9, x11
; CHECK-NEON-NEXT: fmov d18, x3
; CHECK-NEON-NEXT: eor v0.8b, v0.8b, v1.8b
; CHECK-NEON-NEXT: mul x9, x9, x17
; CHECK-NEON-NEXT: eor v16.8b, v17.8b, v16.8b
; CHECK-NEON-NEXT: fmov d6, x4
; CHECK-NEON-NEXT: mul x17, x12, x17
; CHECK-NEON-NEXT: and v0.8b, v0.8b, v3.8b
; CHECK-NEON-NEXT: fmov d7, x5
; CHECK-NEON-NEXT: mul x11, x15, x11
; CHECK-NEON-NEXT: eor v6.8b, v18.8b, v6.8b
; CHECK-NEON-NEXT: mul x15, x15, x8
; CHECK-NEON-NEXT: fmov d19, x17
; CHECK-NEON-NEXT: eor v1.8b, v16.8b, v6.8b
; CHECK-NEON-NEXT: mul x12, x12, x14
; CHECK-NEON-NEXT: fmov d21, x11
; CHECK-NEON-NEXT: mul x10, x18, x14
; CHECK-NEON-NEXT: eor v7.8b, v19.8b, v7.8b
; CHECK-NEON-NEXT: fmov d19, x9
; CHECK-NEON-NEXT: fmov d17, x15
; CHECK-NEON-NEXT: and v1.8b, v1.8b, v2.8b
; CHECK-NEON-NEXT: mul x8, x18, x8
; CHECK-NEON-NEXT: fmov d20, x12
; CHECK-NEON-NEXT: orr v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: fmov d18, x10
; CHECK-NEON-NEXT: fmov d22, x8
; CHECK-NEON-NEXT: eor v17.8b, v17.8b, v18.8b
; CHECK-NEON-NEXT: eor v18.8b, v20.8b, v19.8b
; CHECK-NEON-NEXT: eor v19.8b, v21.8b, v22.8b
; CHECK-NEON-NEXT: eor v6.8b, v7.8b, v17.8b
; CHECK-NEON-NEXT: eor v7.8b, v18.8b, v19.8b
; CHECK-NEON-NEXT: and v2.8b, v6.8b, v5.8b
; CHECK-NEON-NEXT: and v3.8b, v7.8b, v4.8b
; CHECK-NEON-NEXT: orr v1.8b, v2.8b, v3.8b
; CHECK-NEON-NEXT: orr v0.8b, v0.8b, v1.8b
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v1i64_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: // kill: def $d0 killed $d0 killed $q0
; CHECK-AES-NEXT: ret
%a = call <1 x i64> @llvm.clmul.v1i64(<1 x i64> %x, <1 x i64> %y)
ret <1 x i64> %a
}
define <1 x i128> @clmul_v1i128_neon(<1 x i128> %x, <1 x i128> %y) {
; CHECK-NEON-LABEL: clmul_v1i128_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: sub sp, sp, #352
; CHECK-NEON-NEXT: stp x29, x30, [sp, #256] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x28, x27, [sp, #272] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x26, x25, [sp, #288] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x24, x23, [sp, #304] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x22, x21, [sp, #320] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x20, x19, [sp, #336] // 16-byte Folded Spill
; CHECK-NEON-NEXT: .cfi_def_cfa_offset 352
; CHECK-NEON-NEXT: .cfi_offset w19, -8
; CHECK-NEON-NEXT: .cfi_offset w20, -16
; CHECK-NEON-NEXT: .cfi_offset w21, -24
; CHECK-NEON-NEXT: .cfi_offset w22, -32
; CHECK-NEON-NEXT: .cfi_offset w23, -40
; CHECK-NEON-NEXT: .cfi_offset w24, -48
; CHECK-NEON-NEXT: .cfi_offset w25, -56
; CHECK-NEON-NEXT: .cfi_offset w26, -64
; CHECK-NEON-NEXT: .cfi_offset w27, -72
; CHECK-NEON-NEXT: .cfi_offset w28, -80
; CHECK-NEON-NEXT: .cfi_offset w30, -88
; CHECK-NEON-NEXT: .cfi_offset w29, -96
; CHECK-NEON-NEXT: mov x9, x3
; CHECK-NEON-NEXT: and x3, x2, #0x1111111111111111
; CHECK-NEON-NEXT: and x20, x1, #0x2222222222222222
; CHECK-NEON-NEXT: and x10, x2, #0x2222222222222222
; CHECK-NEON-NEXT: and x12, x1, #0x1111111111111111
; CHECK-NEON-NEXT: mul x11, x20, x3
; CHECK-NEON-NEXT: rbit x13, x0
; CHECK-NEON-NEXT: and x30, x0, #0x2222222222222222
; CHECK-NEON-NEXT: and x19, x9, #0x2222222222222222
; CHECK-NEON-NEXT: mul x8, x12, x10
; CHECK-NEON-NEXT: and x15, x13, #0x2222222222222222
; CHECK-NEON-NEXT: and x17, x13, #0x1111111111111111
; CHECK-NEON-NEXT: and x4, x13, #0x4444444444444444
; CHECK-NEON-NEXT: mul x14, x20, x10
; CHECK-NEON-NEXT: and x13, x13, #0x8888888888888888
; CHECK-NEON-NEXT: mul x24, x30, x19
; CHECK-NEON-NEXT: stp x8, x11, [sp, #240] // 16-byte Folded Spill
; CHECK-NEON-NEXT: and x11, x2, #0x8888888888888888
; CHECK-NEON-NEXT: mul x8, x20, x11
; CHECK-NEON-NEXT: str x14, [sp, #88] // 8-byte Spill
; CHECK-NEON-NEXT: mul x27, x12, x11
; CHECK-NEON-NEXT: str x8, [sp, #232] // 8-byte Spill
; CHECK-NEON-NEXT: mul x8, x12, x3
; CHECK-NEON-NEXT: str x8, [sp, #224] // 8-byte Spill
; CHECK-NEON-NEXT: rbit x8, x2
; CHECK-NEON-NEXT: and x14, x8, #0x1111111111111111
; CHECK-NEON-NEXT: and x18, x8, #0x8888888888888888
; CHECK-NEON-NEXT: mul x16, x15, x14
; CHECK-NEON-NEXT: mul x5, x4, x18
; CHECK-NEON-NEXT: str x16, [sp, #216] // 8-byte Spill
; CHECK-NEON-NEXT: and x16, x8, #0x2222222222222222
; CHECK-NEON-NEXT: and x8, x8, #0x4444444444444444
; CHECK-NEON-NEXT: mul x6, x17, x16
; CHECK-NEON-NEXT: stp x5, x6, [sp, #200] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x6, x13, x8
; CHECK-NEON-NEXT: mul x5, x15, x18
; CHECK-NEON-NEXT: stp x5, x6, [sp, #184] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x6, x17, x14
; CHECK-NEON-NEXT: mul x5, x4, x8
; CHECK-NEON-NEXT: stp x5, x6, [sp, #168] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x5, x15, x16
; CHECK-NEON-NEXT: mul x15, x15, x8
; CHECK-NEON-NEXT: mul x8, x17, x8
; CHECK-NEON-NEXT: mul x6, x13, x16
; CHECK-NEON-NEXT: str x8, [sp, #128] // 8-byte Spill
; CHECK-NEON-NEXT: mul x8, x4, x16
; CHECK-NEON-NEXT: stp x5, x6, [sp, #152] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x8, x15, [sp, #136] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x8, x4, x14
; CHECK-NEON-NEXT: str x8, [sp, #104] // 8-byte Spill
; CHECK-NEON-NEXT: mul x8, x17, x18
; CHECK-NEON-NEXT: str x8, [sp, #120] // 8-byte Spill
; CHECK-NEON-NEXT: mul x8, x13, x18
; CHECK-NEON-NEXT: str x8, [sp, #96] // 8-byte Spill
; CHECK-NEON-NEXT: mul x8, x13, x14
; CHECK-NEON-NEXT: str x8, [sp, #112] // 8-byte Spill
; CHECK-NEON-NEXT: and x8, x2, #0x4444444444444444
; CHECK-NEON-NEXT: and x2, x0, #0x1111111111111111
; CHECK-NEON-NEXT: mul x25, x12, x8
; CHECK-NEON-NEXT: and x12, x1, #0x4444444444444444
; CHECK-NEON-NEXT: mul x18, x12, x11
; CHECK-NEON-NEXT: mul x6, x12, x8
; CHECK-NEON-NEXT: mul x22, x12, x3
; CHECK-NEON-NEXT: mul x23, x12, x10
; CHECK-NEON-NEXT: and x12, x1, #0x8888888888888888
; CHECK-NEON-NEXT: and x1, x0, #0x8888888888888888
; CHECK-NEON-NEXT: mul x29, x20, x8
; CHECK-NEON-NEXT: and x20, x0, #0x4444444444444444
; CHECK-NEON-NEXT: mul x14, x12, x8
; CHECK-NEON-NEXT: mul x15, x12, x10
; CHECK-NEON-NEXT: mul x4, x12, x11
; CHECK-NEON-NEXT: eor x18, x18, x14
; CHECK-NEON-NEXT: mul x5, x12, x3
; CHECK-NEON-NEXT: and x12, x9, #0x4444444444444444
; CHECK-NEON-NEXT: eor x15, x6, x15
; CHECK-NEON-NEXT: mul x28, x1, x12
; CHECK-NEON-NEXT: eor x4, x22, x4
; CHECK-NEON-NEXT: eor x22, x27, x29
; CHECK-NEON-NEXT: mul x26, x20, x12
; CHECK-NEON-NEXT: eor x5, x23, x5
; CHECK-NEON-NEXT: mul x13, x2, x12
; CHECK-NEON-NEXT: mul x12, x30, x12
; CHECK-NEON-NEXT: mul x16, x2, x19
; CHECK-NEON-NEXT: mul x17, x1, x19
; CHECK-NEON-NEXT: stp x13, x12, [sp, #48] // 16-byte Folded Spill
; CHECK-NEON-NEXT: and x12, x9, #0x8888888888888888
; CHECK-NEON-NEXT: mul x0, x20, x12
; CHECK-NEON-NEXT: mul x7, x30, x12
; CHECK-NEON-NEXT: eor x17, x26, x17
; CHECK-NEON-NEXT: mul x13, x1, x12
; CHECK-NEON-NEXT: mul x12, x2, x12
; CHECK-NEON-NEXT: mul x14, x1, x8
; CHECK-NEON-NEXT: str x12, [sp, #40] // 8-byte Spill
; CHECK-NEON-NEXT: mul x12, x20, x19
; CHECK-NEON-NEXT: and x19, x9, #0x1111111111111111
; CHECK-NEON-NEXT: mul x9, x30, x3
; CHECK-NEON-NEXT: mul x21, x20, x19
; CHECK-NEON-NEXT: stp x12, x13, [sp, #16] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x12, x30, x19
; CHECK-NEON-NEXT: str x9, [sp, #80] // 8-byte Spill
; CHECK-NEON-NEXT: mul x9, x30, x11
; CHECK-NEON-NEXT: mul x13, x2, x19
; CHECK-NEON-NEXT: eor x12, x16, x12
; CHECK-NEON-NEXT: eor x16, x0, x28
; CHECK-NEON-NEXT: mul x19, x1, x19
; CHECK-NEON-NEXT: eor x12, x12, x16
; CHECK-NEON-NEXT: str x9, [sp, #72] // 8-byte Spill
; CHECK-NEON-NEXT: and x12, x12, #0x2222222222222222
; CHECK-NEON-NEXT: mul x9, x30, x10
; CHECK-NEON-NEXT: ldp x28, x27, [sp, #272] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x13, x13, x7
; CHECK-NEON-NEXT: eor x13, x13, x17
; CHECK-NEON-NEXT: mul x0, x1, x10
; CHECK-NEON-NEXT: and x13, x13, #0x1111111111111111
; CHECK-NEON-NEXT: orr x12, x13, x12
; CHECK-NEON-NEXT: ldp x17, x13, [sp, #40] // 16-byte Folded Reload
; CHECK-NEON-NEXT: str x9, [sp, #64] // 8-byte Spill
; CHECK-NEON-NEXT: mul x9, x30, x8
; CHECK-NEON-NEXT: eor x13, x13, x24
; CHECK-NEON-NEXT: ldp x24, x23, [sp, #304] // 16-byte Folded Reload
; CHECK-NEON-NEXT: str x9, [sp, #32] // 8-byte Spill
; CHECK-NEON-NEXT: ldp x30, x9, [sp, #240] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x9, x30, x9
; CHECK-NEON-NEXT: eor x9, x9, x18
; CHECK-NEON-NEXT: ldp x30, x18, [sp, #224] // 16-byte Folded Reload
; CHECK-NEON-NEXT: and x9, x9, #0x2222222222222222
; CHECK-NEON-NEXT: eor x18, x30, x18
; CHECK-NEON-NEXT: ldp x29, x30, [sp, #256] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x18, x18, x15
; CHECK-NEON-NEXT: ldr x15, [sp, #88] // 8-byte Reload
; CHECK-NEON-NEXT: and x18, x18, #0x1111111111111111
; CHECK-NEON-NEXT: eor x6, x25, x15
; CHECK-NEON-NEXT: orr x9, x18, x9
; CHECK-NEON-NEXT: mul x15, x20, x8
; CHECK-NEON-NEXT: eor x18, x6, x4
; CHECK-NEON-NEXT: eor x4, x22, x5
; CHECK-NEON-NEXT: and x18, x18, #0x4444444444444444
; CHECK-NEON-NEXT: and x4, x4, #0x8888888888888888
; CHECK-NEON-NEXT: mul x5, x2, x10
; CHECK-NEON-NEXT: orr x18, x18, x4
; CHECK-NEON-NEXT: ldp x6, x4, [sp, #208] // 16-byte Folded Reload
; CHECK-NEON-NEXT: orr x9, x9, x18
; CHECK-NEON-NEXT: ldp x18, x16, [sp, #16] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x10, x20, x10
; CHECK-NEON-NEXT: ldp x26, x25, [sp, #288] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x4, x6, x4
; CHECK-NEON-NEXT: ldp x7, x6, [sp, #192] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x18, x18, x19
; CHECK-NEON-NEXT: eor x16, x21, x16
; CHECK-NEON-NEXT: mul x8, x2, x8
; CHECK-NEON-NEXT: eor x13, x13, x16
; CHECK-NEON-NEXT: ldr x16, [sp, #56] // 8-byte Reload
; CHECK-NEON-NEXT: eor x6, x6, x7
; CHECK-NEON-NEXT: ldp x19, x7, [sp, #176] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x16, x17, x16
; CHECK-NEON-NEXT: mul x17, x20, x11
; CHECK-NEON-NEXT: and x13, x13, #0x4444444444444444
; CHECK-NEON-NEXT: eor x16, x16, x18
; CHECK-NEON-NEXT: eor x18, x4, x6
; CHECK-NEON-NEXT: ldr x6, [sp, #152] // 8-byte Reload
; CHECK-NEON-NEXT: eor x7, x19, x7
; CHECK-NEON-NEXT: ldp x21, x19, [sp, #160] // 16-byte Folded Reload
; CHECK-NEON-NEXT: and x16, x16, #0x8888888888888888
; CHECK-NEON-NEXT: and x18, x18, #0x2222222222222222
; CHECK-NEON-NEXT: orr x13, x13, x16
; CHECK-NEON-NEXT: eor x19, x19, x21
; CHECK-NEON-NEXT: orr x12, x12, x13
; CHECK-NEON-NEXT: eor x14, x17, x14
; CHECK-NEON-NEXT: eor x4, x7, x19
; CHECK-NEON-NEXT: ldr x7, [sp, #128] // 8-byte Reload
; CHECK-NEON-NEXT: eor x9, x12, x9
; CHECK-NEON-NEXT: and x4, x4, #0x1111111111111111
; CHECK-NEON-NEXT: mul x21, x2, x3
; CHECK-NEON-NEXT: eor x6, x7, x6
; CHECK-NEON-NEXT: ldp x19, x7, [sp, #96] // 16-byte Folded Reload
; CHECK-NEON-NEXT: orr x16, x4, x18
; CHECK-NEON-NEXT: mul x2, x2, x11
; CHECK-NEON-NEXT: eor x7, x7, x19
; CHECK-NEON-NEXT: mul x19, x20, x3
; CHECK-NEON-NEXT: ldp x22, x20, [sp, #112] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x6, x6, x7
; CHECK-NEON-NEXT: ldr x7, [sp, #144] // 8-byte Reload
; CHECK-NEON-NEXT: and x6, x6, #0x4444444444444444
; CHECK-NEON-NEXT: mul x11, x1, x11
; CHECK-NEON-NEXT: eor x7, x20, x7
; CHECK-NEON-NEXT: ldr x20, [sp, #136] // 8-byte Reload
; CHECK-NEON-NEXT: eor x20, x20, x22
; CHECK-NEON-NEXT: eor x7, x7, x20
; CHECK-NEON-NEXT: eor x11, x19, x11
; CHECK-NEON-NEXT: and x7, x7, #0x8888888888888888
; CHECK-NEON-NEXT: ldp x20, x19, [sp, #336] // 16-byte Folded Reload
; CHECK-NEON-NEXT: orr x18, x6, x7
; CHECK-NEON-NEXT: orr x13, x16, x18
; CHECK-NEON-NEXT: ldr x18, [sp, #80] // 8-byte Reload
; CHECK-NEON-NEXT: mul x16, x1, x3
; CHECK-NEON-NEXT: rbit x13, x13
; CHECK-NEON-NEXT: eor x18, x5, x18
; CHECK-NEON-NEXT: eor x12, x18, x14
; CHECK-NEON-NEXT: eor x1, x9, x13, lsr #1
; CHECK-NEON-NEXT: eor x13, x15, x0
; CHECK-NEON-NEXT: and x9, x12, #0x2222222222222222
; CHECK-NEON-NEXT: ldp x14, x12, [sp, #64] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x10, x10, x16
; CHECK-NEON-NEXT: eor x8, x8, x14
; CHECK-NEON-NEXT: ldr x14, [sp, #32] // 8-byte Reload
; CHECK-NEON-NEXT: eor x12, x21, x12
; CHECK-NEON-NEXT: eor x12, x12, x13
; CHECK-NEON-NEXT: eor x8, x8, x11
; CHECK-NEON-NEXT: eor x14, x2, x14
; CHECK-NEON-NEXT: and x11, x12, #0x1111111111111111
; CHECK-NEON-NEXT: and x8, x8, #0x4444444444444444
; CHECK-NEON-NEXT: eor x10, x14, x10
; CHECK-NEON-NEXT: ldp x22, x21, [sp, #320] // 16-byte Folded Reload
; CHECK-NEON-NEXT: and x10, x10, #0x8888888888888888
; CHECK-NEON-NEXT: orr x9, x11, x9
; CHECK-NEON-NEXT: orr x8, x8, x10
; CHECK-NEON-NEXT: orr x0, x9, x8
; CHECK-NEON-NEXT: add sp, sp, #352
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v1i128_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: rbit x8, x2
; CHECK-AES-NEXT: rbit x9, x0
; CHECK-AES-NEXT: fmov d0, x3
; CHECK-AES-NEXT: fmov d1, x0
; CHECK-AES-NEXT: fmov d2, x2
; CHECK-AES-NEXT: fmov d3, x8
; CHECK-AES-NEXT: fmov d4, x9
; CHECK-AES-NEXT: pmull v0.1q, v1.1d, v0.1d
; CHECK-AES-NEXT: pmull v3.1q, v4.1d, v3.1d
; CHECK-AES-NEXT: fmov d4, x1
; CHECK-AES-NEXT: pmull v1.1q, v1.1d, v2.1d
; CHECK-AES-NEXT: pmull v4.1q, v4.1d, v2.1d
; CHECK-AES-NEXT: fmov x10, d0
; CHECK-AES-NEXT: fmov x8, d3
; CHECK-AES-NEXT: fmov x0, d1
; CHECK-AES-NEXT: fmov x9, d4
; CHECK-AES-NEXT: rbit x8, x8
; CHECK-AES-NEXT: eor x9, x10, x9
; CHECK-AES-NEXT: eor x1, x9, x8, lsr #1
; CHECK-AES-NEXT: ret
%a = call <1 x i128> @llvm.clmul.v1i128(<1 x i128> %x, <1 x i128> %y)
ret <1 x i128> %a
}
define <8 x i16> @clmul_v8i16_neon_zext(<8 x i8> %x, <8 x i8> %y) {
; CHECK-LABEL: clmul_v8i16_neon_zext:
; CHECK: // %bb.0:
; CHECK-NEXT: rbit v2.8b, v1.8b
; CHECK-NEXT: rbit v3.8b, v0.8b
; CHECK-NEXT: pmul v0.8b, v0.8b, v1.8b
; CHECK-NEXT: pmul v2.8b, v3.8b, v2.8b
; CHECK-NEXT: ushll v0.8h, v0.8b, #0
; CHECK-NEXT: rbit v2.8b, v2.8b
; CHECK-NEXT: ushr v1.8b, v2.8b, #1
; CHECK-NEXT: shll v1.8h, v1.8b, #8
; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEXT: ret
%zextx = zext <8 x i8> %x to <8 x i16>
%zexty = zext <8 x i8> %y to <8 x i16>
%a = call <8 x i16> @llvm.clmul.v8i16(<8 x i16> %zextx, <8 x i16> %zexty)
ret <8 x i16> %a
}
define <16 x i16> @clmul_v16i16_neon_zext(<16 x i8> %x, <16 x i8> %y) {
; CHECK-LABEL: clmul_v16i16_neon_zext:
; CHECK: // %bb.0:
; CHECK-NEXT: mov d2, v0.d[1]
; CHECK-NEXT: mov d3, v1.d[1]
; CHECK-NEXT: rbit v4.8b, v1.8b
; CHECK-NEXT: rbit v5.8b, v0.8b
; CHECK-NEXT: pmul v0.8b, v0.8b, v1.8b
; CHECK-NEXT: rbit v6.8b, v3.8b
; CHECK-NEXT: rbit v7.8b, v2.8b
; CHECK-NEXT: pmul v1.8b, v2.8b, v3.8b
; CHECK-NEXT: pmul v4.8b, v5.8b, v4.8b
; CHECK-NEXT: ushll v0.8h, v0.8b, #0
; CHECK-NEXT: pmul v5.8b, v7.8b, v6.8b
; CHECK-NEXT: ushll v1.8h, v1.8b, #0
; CHECK-NEXT: rbit v4.8b, v4.8b
; CHECK-NEXT: rbit v5.8b, v5.8b
; CHECK-NEXT: ushr v2.8b, v4.8b, #1
; CHECK-NEXT: ushr v3.8b, v5.8b, #1
; CHECK-NEXT: shll v2.8h, v2.8b, #8
; CHECK-NEXT: shll v3.8h, v3.8b, #8
; CHECK-NEXT: orr v0.16b, v0.16b, v2.16b
; CHECK-NEXT: orr v1.16b, v1.16b, v3.16b
; CHECK-NEXT: ret
%zextx = zext <16 x i8> %x to <16 x i16>
%zexty = zext <16 x i8> %y to <16 x i16>
%a = call <16 x i16> @llvm.clmul.v16i16(<16 x i16> %zextx, <16 x i16> %zexty)
ret <16 x i16> %a
}
define <4 x i32> @clmul_v4i32_neon_zext(<4 x i16> %x, <4 x i16> %y) {
; CHECK-NEON-LABEL: clmul_v4i32_neon_zext:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: // kill: def $d1 killed $d1 def $q1
; CHECK-NEON-NEXT: // kill: def $d0 killed $d0 def $q0
; CHECK-NEON-NEXT: rev16 v3.8b, v1.8b
; CHECK-NEON-NEXT: rev16 v4.8b, v0.8b
; CHECK-NEON-NEXT: movi v2.2d, #0000000000000000
; CHECK-NEON-NEXT: xtn v17.8b, v1.8h
; CHECK-NEON-NEXT: shrn v1.8b, v1.8h, #8
; CHECK-NEON-NEXT: rbit v3.8b, v3.8b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: xtn v18.8b, v2.8h
; CHECK-NEON-NEXT: rbit v19.8b, v17.8b
; CHECK-NEON-NEXT: shrn v2.8b, v2.8h, #8
; CHECK-NEON-NEXT: xtn v5.8b, v3.8h
; CHECK-NEON-NEXT: xtn v6.8b, v4.8h
; CHECK-NEON-NEXT: shrn v4.8b, v4.8h, #8
; CHECK-NEON-NEXT: shrn v3.8b, v3.8h, #8
; CHECK-NEON-NEXT: rbit v20.8b, v18.8b
; CHECK-NEON-NEXT: rbit v7.8b, v5.8b
; CHECK-NEON-NEXT: rbit v16.8b, v6.8b
; CHECK-NEON-NEXT: pmul v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: pmul v3.8b, v6.8b, v3.8b
; CHECK-NEON-NEXT: pmul v5.8b, v6.8b, v5.8b
; CHECK-NEON-NEXT: pmul v6.8b, v2.8b, v17.8b
; CHECK-NEON-NEXT: pmul v7.8b, v16.8b, v7.8b
; CHECK-NEON-NEXT: xtn v16.8b, v0.8h
; CHECK-NEON-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEON-NEXT: eor v3.8b, v3.8b, v4.8b
; CHECK-NEON-NEXT: pmul v4.8b, v20.8b, v19.8b
; CHECK-NEON-NEXT: ushll v5.8h, v5.8b, #0
; CHECK-NEON-NEXT: rbit v7.8b, v7.8b
; CHECK-NEON-NEXT: rbit v21.8b, v16.8b
; CHECK-NEON-NEXT: pmul v2.8b, v16.8b, v2.8b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: ushr v7.8b, v7.8b, #1
; CHECK-NEON-NEXT: pmul v20.8b, v21.8b, v20.8b
; CHECK-NEON-NEXT: pmul v19.8b, v21.8b, v19.8b
; CHECK-NEON-NEXT: ushr v4.8b, v4.8b, #1
; CHECK-NEON-NEXT: eor v3.8b, v7.8b, v3.8b
; CHECK-NEON-NEXT: pmul v7.8b, v18.8b, v1.8b
; CHECK-NEON-NEXT: pmul v18.8b, v0.8b, v18.8b
; CHECK-NEON-NEXT: rbit v20.8b, v20.8b
; CHECK-NEON-NEXT: pmul v0.8b, v0.8b, v17.8b
; CHECK-NEON-NEXT: pmul v1.8b, v16.8b, v1.8b
; CHECK-NEON-NEXT: shll v3.8h, v3.8b, #8
; CHECK-NEON-NEXT: eor v6.8b, v7.8b, v6.8b
; CHECK-NEON-NEXT: eor v2.8b, v2.8b, v18.8b
; CHECK-NEON-NEXT: ushr v7.8b, v20.8b, #1
; CHECK-NEON-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: orr v3.16b, v5.16b, v3.16b
; CHECK-NEON-NEXT: rbit v5.8b, v19.8b
; CHECK-NEON-NEXT: eor v4.8b, v4.8b, v6.8b
; CHECK-NEON-NEXT: eor v2.8b, v7.8b, v2.8b
; CHECK-NEON-NEXT: rev16 v3.8b, v3.8b
; CHECK-NEON-NEXT: ushr v1.8b, v5.8b, #1
; CHECK-NEON-NEXT: pmul v5.8b, v16.8b, v17.8b
; CHECK-NEON-NEXT: shll v4.8h, v4.8b, #8
; CHECK-NEON-NEXT: shll v2.8h, v2.8b, #8
; CHECK-NEON-NEXT: rbit v3.8b, v3.8b
; CHECK-NEON-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: eor v1.8b, v2.8b, v4.8b
; CHECK-NEON-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEON-NEXT: ushr v2.4h, v3.4h, #1
; CHECK-NEON-NEXT: ushll v3.8h, v5.8b, #0
; CHECK-NEON-NEXT: eor v1.8b, v2.8b, v1.8b
; CHECK-NEON-NEXT: orr v0.16b, v3.16b, v0.16b
; CHECK-NEON-NEXT: shll v1.4s, v1.4h, #16
; CHECK-NEON-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v4i32_neon_zext:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-AES-NEXT: ushll v1.4s, v1.4h, #0
; CHECK-AES-NEXT: ushll2 v2.2d, v1.4s, #0
; CHECK-AES-NEXT: ushll2 v3.2d, v0.4s, #0
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v4.1q, v3.2d, v2.2d
; CHECK-AES-NEXT: pmull v2.1q, v3.1d, v2.1d
; CHECK-AES-NEXT: pmull2 v3.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v2.d[1], v4.d[0]
; CHECK-AES-NEXT: mov v0.d[1], v3.d[0]
; CHECK-AES-NEXT: uzp1 v0.4s, v0.4s, v2.4s
; CHECK-AES-NEXT: ret
%zextx = zext <4 x i16> %x to <4 x i32>
%zexty = zext <4 x i16> %y to <4 x i32>
%a = call <4 x i32> @llvm.clmul.v4i32(<4 x i32> %zextx, <4 x i32> %zexty)
ret <4 x i32> %a
}
define <8 x i32> @clmul_v8i32_neon_zext(<8 x i16> %x, <8 x i16> %y) {
; CHECK-NEON-LABEL: clmul_v8i32_neon_zext:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: str d12, [sp, #-48]! // 8-byte Folded Spill
; CHECK-NEON-NEXT: stp d11, d10, [sp, #16] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill
; CHECK-NEON-NEXT: .cfi_def_cfa_offset 48
; CHECK-NEON-NEXT: .cfi_offset b8, -8
; CHECK-NEON-NEXT: .cfi_offset b9, -16
; CHECK-NEON-NEXT: .cfi_offset b10, -24
; CHECK-NEON-NEXT: .cfi_offset b11, -32
; CHECK-NEON-NEXT: .cfi_offset b12, -48
; CHECK-NEON-NEXT: mov d2, v0.d[1]
; CHECK-NEON-NEXT: mov d3, v1.d[1]
; CHECK-NEON-NEXT: rev16 v5.8b, v1.8b
; CHECK-NEON-NEXT: rev16 v6.8b, v0.8b
; CHECK-NEON-NEXT: movi v4.2d, #0000000000000000
; CHECK-NEON-NEXT: rev16 v7.8b, v3.8b
; CHECK-NEON-NEXT: rev16 v17.8b, v2.8b
; CHECK-NEON-NEXT: rbit v18.8b, v5.8b
; CHECK-NEON-NEXT: rbit v19.8b, v6.8b
; CHECK-NEON-NEXT: xtn v5.8b, v1.8h
; CHECK-NEON-NEXT: xtn v16.8b, v4.8h
; CHECK-NEON-NEXT: shrn v29.8b, v4.8h, #8
; CHECK-NEON-NEXT: xtn v6.8b, v0.8h
; CHECK-NEON-NEXT: shrn v4.8b, v0.8h, #8
; CHECK-NEON-NEXT: xtn v0.8b, v3.8h
; CHECK-NEON-NEXT: shrn v3.8b, v3.8h, #8
; CHECK-NEON-NEXT: rbit v20.8b, v7.8b
; CHECK-NEON-NEXT: rbit v17.8b, v17.8b
; CHECK-NEON-NEXT: xtn v21.8b, v18.8h
; CHECK-NEON-NEXT: xtn v22.8b, v19.8h
; CHECK-NEON-NEXT: shrn v7.8b, v1.8h, #8
; CHECK-NEON-NEXT: shrn v1.8b, v19.8h, #8
; CHECK-NEON-NEXT: shrn v18.8b, v18.8h, #8
; CHECK-NEON-NEXT: pmul v8.8b, v29.8b, v5.8b
; CHECK-NEON-NEXT: rbit v23.8b, v5.8b
; CHECK-NEON-NEXT: rbit v24.8b, v16.8b
; CHECK-NEON-NEXT: pmul v12.8b, v4.8b, v16.8b
; CHECK-NEON-NEXT: pmul v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: xtn v25.8b, v20.8h
; CHECK-NEON-NEXT: xtn v26.8b, v17.8h
; CHECK-NEON-NEXT: rbit v27.8b, v21.8b
; CHECK-NEON-NEXT: rbit v28.8b, v22.8b
; CHECK-NEON-NEXT: pmul v10.8b, v1.8b, v21.8b
; CHECK-NEON-NEXT: shrn v17.8b, v17.8h, #8
; CHECK-NEON-NEXT: pmul v18.8b, v22.8b, v18.8b
; CHECK-NEON-NEXT: shrn v20.8b, v20.8h, #8
; CHECK-NEON-NEXT: pmul v9.8b, v16.8b, v7.8b
; CHECK-NEON-NEXT: xtn v1.8b, v2.8h
; CHECK-NEON-NEXT: pmul v21.8b, v22.8b, v21.8b
; CHECK-NEON-NEXT: pmul v19.8b, v24.8b, v23.8b
; CHECK-NEON-NEXT: rbit v30.8b, v25.8b
; CHECK-NEON-NEXT: rbit v31.8b, v26.8b
; CHECK-NEON-NEXT: pmul v17.8b, v17.8b, v25.8b
; CHECK-NEON-NEXT: pmul v27.8b, v28.8b, v27.8b
; CHECK-NEON-NEXT: pmul v20.8b, v26.8b, v20.8b
; CHECK-NEON-NEXT: rbit v28.8b, v6.8b
; CHECK-NEON-NEXT: eor v18.8b, v18.8b, v10.8b
; CHECK-NEON-NEXT: eor v8.8b, v9.8b, v8.8b
; CHECK-NEON-NEXT: rbit v9.8b, v0.8b
; CHECK-NEON-NEXT: rbit v10.8b, v1.8b
; CHECK-NEON-NEXT: pmul v22.8b, v26.8b, v25.8b
; CHECK-NEON-NEXT: shrn v2.8b, v2.8h, #8
; CHECK-NEON-NEXT: pmul v30.8b, v31.8b, v30.8b
; CHECK-NEON-NEXT: ushll v21.8h, v21.8b, #0
; CHECK-NEON-NEXT: rbit v19.8b, v19.8b
; CHECK-NEON-NEXT: rbit v27.8b, v27.8b
; CHECK-NEON-NEXT: eor v17.8b, v20.8b, v17.8b
; CHECK-NEON-NEXT: pmul v11.8b, v28.8b, v24.8b
; CHECK-NEON-NEXT: pmul v25.8b, v24.8b, v9.8b
; CHECK-NEON-NEXT: pmul v31.8b, v6.8b, v29.8b
; CHECK-NEON-NEXT: pmul v7.8b, v6.8b, v7.8b
; CHECK-NEON-NEXT: pmul v24.8b, v10.8b, v24.8b
; CHECK-NEON-NEXT: ushll v22.8h, v22.8b, #0
; CHECK-NEON-NEXT: pmul v5.8b, v6.8b, v5.8b
; CHECK-NEON-NEXT: rbit v30.8b, v30.8b
; CHECK-NEON-NEXT: ushr v19.8b, v19.8b, #1
; CHECK-NEON-NEXT: ushr v27.8b, v27.8b, #1
; CHECK-NEON-NEXT: rbit v11.8b, v11.8b
; CHECK-NEON-NEXT: rbit v25.8b, v25.8b
; CHECK-NEON-NEXT: eor v31.8b, v31.8b, v12.8b
; CHECK-NEON-NEXT: eor v4.8b, v7.8b, v4.8b
; CHECK-NEON-NEXT: rbit v24.8b, v24.8b
; CHECK-NEON-NEXT: eor v19.8b, v19.8b, v8.8b
; CHECK-NEON-NEXT: ushll v5.8h, v5.8b, #0
; CHECK-NEON-NEXT: eor v18.8b, v27.8b, v18.8b
; CHECK-NEON-NEXT: ushr v20.8b, v30.8b, #1
; CHECK-NEON-NEXT: pmul v27.8b, v16.8b, v3.8b
; CHECK-NEON-NEXT: pmul v16.8b, v2.8b, v16.8b
; CHECK-NEON-NEXT: pmul v2.8b, v2.8b, v0.8b
; CHECK-NEON-NEXT: pmul v3.8b, v1.8b, v3.8b
; CHECK-NEON-NEXT: ushr v26.8b, v11.8b, #1
; CHECK-NEON-NEXT: shll v19.8h, v19.8b, #8
; CHECK-NEON-NEXT: shll v18.8h, v18.8b, #8
; CHECK-NEON-NEXT: eor v17.8b, v20.8b, v17.8b
; CHECK-NEON-NEXT: pmul v20.8b, v28.8b, v23.8b
; CHECK-NEON-NEXT: pmul v28.8b, v1.8b, v29.8b
; CHECK-NEON-NEXT: pmul v23.8b, v29.8b, v0.8b
; CHECK-NEON-NEXT: ushr v24.8b, v24.8b, #1
; CHECK-NEON-NEXT: eor v26.8b, v26.8b, v31.8b
; CHECK-NEON-NEXT: eor v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: pmul v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: shll v17.8h, v17.8b, #8
; CHECK-NEON-NEXT: orr v18.16b, v21.16b, v18.16b
; CHECK-NEON-NEXT: pmul v21.8b, v10.8b, v9.8b
; CHECK-NEON-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload
; CHECK-NEON-NEXT: rbit v20.8b, v20.8b
; CHECK-NEON-NEXT: ldp d11, d10, [sp, #16] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor v16.8b, v28.8b, v16.8b
; CHECK-NEON-NEXT: orr v17.16b, v22.16b, v17.16b
; CHECK-NEON-NEXT: eor v23.8b, v27.8b, v23.8b
; CHECK-NEON-NEXT: ushr v22.8b, v25.8b, #1
; CHECK-NEON-NEXT: rbit v21.8b, v21.8b
; CHECK-NEON-NEXT: rev16 v18.8b, v18.8b
; CHECK-NEON-NEXT: ushll v0.8h, v0.8b, #0
; CHECK-NEON-NEXT: ushr v7.8b, v20.8b, #1
; CHECK-NEON-NEXT: eor v16.8b, v24.8b, v16.8b
; CHECK-NEON-NEXT: rev16 v17.8b, v17.8b
; CHECK-NEON-NEXT: eor v20.8b, v22.8b, v23.8b
; CHECK-NEON-NEXT: shll v22.8h, v26.8b, #8
; CHECK-NEON-NEXT: ushr v3.8b, v21.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v18.8b
; CHECK-NEON-NEXT: eor v4.8b, v7.8b, v4.8b
; CHECK-NEON-NEXT: shll v7.8h, v16.8b, #8
; CHECK-NEON-NEXT: shll v6.8h, v20.8b, #8
; CHECK-NEON-NEXT: rbit v16.8b, v17.8b
; CHECK-NEON-NEXT: eor v1.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: eor v2.8b, v22.8b, v19.8b
; CHECK-NEON-NEXT: shll v4.8h, v4.8b, #8
; CHECK-NEON-NEXT: ushr v3.4h, v18.4h, #1
; CHECK-NEON-NEXT: eor v6.8b, v7.8b, v6.8b
; CHECK-NEON-NEXT: ushr v7.4h, v16.4h, #1
; CHECK-NEON-NEXT: shll v1.8h, v1.8b, #8
; CHECK-NEON-NEXT: eor v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: orr v3.16b, v5.16b, v4.16b
; CHECK-NEON-NEXT: eor v4.8b, v7.8b, v6.8b
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: shll v1.4s, v2.4h, #16
; CHECK-NEON-NEXT: ushll v2.4s, v3.4h, #0
; CHECK-NEON-NEXT: shll v3.4s, v4.4h, #16
; CHECK-NEON-NEXT: ushll v4.4s, v0.4h, #0
; CHECK-NEON-NEXT: orr v0.16b, v2.16b, v1.16b
; CHECK-NEON-NEXT: orr v1.16b, v4.16b, v3.16b
; CHECK-NEON-NEXT: ldr d12, [sp], #48 // 8-byte Folded Reload
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v8i32_neon_zext:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll2 v2.4s, v0.8h, #0
; CHECK-AES-NEXT: ushll2 v3.4s, v1.8h, #0
; CHECK-AES-NEXT: ushll v1.4s, v1.4h, #0
; CHECK-AES-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-AES-NEXT: ushll2 v4.2d, v3.4s, #0
; CHECK-AES-NEXT: ushll2 v5.2d, v2.4s, #0
; CHECK-AES-NEXT: ushll v3.2d, v3.2s, #0
; CHECK-AES-NEXT: ushll v2.2d, v2.2s, #0
; CHECK-AES-NEXT: ushll2 v6.2d, v1.4s, #0
; CHECK-AES-NEXT: ushll2 v7.2d, v0.4s, #0
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v16.1q, v5.2d, v4.2d
; CHECK-AES-NEXT: pmull v4.1q, v5.1d, v4.1d
; CHECK-AES-NEXT: pmull2 v5.1q, v2.2d, v3.2d
; CHECK-AES-NEXT: pmull v2.1q, v2.1d, v3.1d
; CHECK-AES-NEXT: pmull2 v3.1q, v7.2d, v6.2d
; CHECK-AES-NEXT: pmull v6.1q, v7.1d, v6.1d
; CHECK-AES-NEXT: mov v4.d[1], v16.d[0]
; CHECK-AES-NEXT: pmull2 v7.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v2.d[1], v5.d[0]
; CHECK-AES-NEXT: mov v6.d[1], v3.d[0]
; CHECK-AES-NEXT: mov v0.d[1], v7.d[0]
; CHECK-AES-NEXT: uzp1 v1.4s, v2.4s, v4.4s
; CHECK-AES-NEXT: uzp1 v0.4s, v0.4s, v6.4s
; CHECK-AES-NEXT: ret
%zextx = zext <8 x i16> %x to <8 x i32>
%zexty = zext <8 x i16> %y to <8 x i32>
%a = call <8 x i32> @llvm.clmul.v8i32(<8 x i32> %zextx, <8 x i32> %zexty)
ret <8 x i32> %a
}
define <2 x i64> @clmul_v2i64_neon_zext(<2 x i32> %x, <2 x i32> %y) {
; CHECK-NEON-LABEL: clmul_v2i64_neon_zext:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: movi v2.16b, #17
; CHECK-NEON-NEXT: movi v3.16b, #34
; CHECK-NEON-NEXT: ushll v4.2d, v0.2s, #0
; CHECK-NEON-NEXT: ushll v5.2d, v1.2s, #0
; CHECK-NEON-NEXT: movi v0.16b, #136
; CHECK-NEON-NEXT: movi v1.16b, #68
; CHECK-NEON-NEXT: and v6.16b, v5.16b, v2.16b
; CHECK-NEON-NEXT: and v7.16b, v4.16b, v3.16b
; CHECK-NEON-NEXT: and v16.16b, v5.16b, v3.16b
; CHECK-NEON-NEXT: and v17.16b, v4.16b, v2.16b
; CHECK-NEON-NEXT: and v18.16b, v5.16b, v0.16b
; CHECK-NEON-NEXT: and v19.16b, v4.16b, v1.16b
; CHECK-NEON-NEXT: and v5.16b, v5.16b, v1.16b
; CHECK-NEON-NEXT: and v4.16b, v4.16b, v0.16b
; CHECK-NEON-NEXT: xtn v6.2s, v6.2d
; CHECK-NEON-NEXT: xtn v7.2s, v7.2d
; CHECK-NEON-NEXT: xtn v16.2s, v16.2d
; CHECK-NEON-NEXT: xtn v17.2s, v17.2d
; CHECK-NEON-NEXT: xtn v18.2s, v18.2d
; CHECK-NEON-NEXT: xtn v19.2s, v19.2d
; CHECK-NEON-NEXT: xtn v5.2s, v5.2d
; CHECK-NEON-NEXT: xtn v4.2s, v4.2d
; CHECK-NEON-NEXT: umull v20.2d, v7.2s, v6.2s
; CHECK-NEON-NEXT: umull v28.2d, v7.2s, v16.2s
; CHECK-NEON-NEXT: umull v21.2d, v17.2s, v16.2s
; CHECK-NEON-NEXT: umull v22.2d, v19.2s, v18.2s
; CHECK-NEON-NEXT: umull v24.2d, v7.2s, v18.2s
; CHECK-NEON-NEXT: umull v23.2d, v4.2s, v5.2s
; CHECK-NEON-NEXT: umull v25.2d, v17.2s, v6.2s
; CHECK-NEON-NEXT: umull v26.2d, v19.2s, v5.2s
; CHECK-NEON-NEXT: umull v27.2d, v4.2s, v16.2s
; CHECK-NEON-NEXT: umull v7.2d, v7.2s, v5.2s
; CHECK-NEON-NEXT: umull v5.2d, v17.2s, v5.2s
; CHECK-NEON-NEXT: umull v16.2d, v19.2s, v16.2s
; CHECK-NEON-NEXT: umull v19.2d, v19.2s, v6.2s
; CHECK-NEON-NEXT: umull v17.2d, v17.2s, v18.2s
; CHECK-NEON-NEXT: umull v18.2d, v4.2s, v18.2s
; CHECK-NEON-NEXT: umull v4.2d, v4.2s, v6.2s
; CHECK-NEON-NEXT: eor v6.16b, v21.16b, v20.16b
; CHECK-NEON-NEXT: eor v20.16b, v22.16b, v23.16b
; CHECK-NEON-NEXT: eor v21.16b, v25.16b, v24.16b
; CHECK-NEON-NEXT: eor v22.16b, v26.16b, v27.16b
; CHECK-NEON-NEXT: eor v5.16b, v5.16b, v28.16b
; CHECK-NEON-NEXT: eor v7.16b, v17.16b, v7.16b
; CHECK-NEON-NEXT: eor v18.16b, v19.16b, v18.16b
; CHECK-NEON-NEXT: eor v4.16b, v16.16b, v4.16b
; CHECK-NEON-NEXT: eor v6.16b, v6.16b, v20.16b
; CHECK-NEON-NEXT: eor v16.16b, v21.16b, v22.16b
; CHECK-NEON-NEXT: eor v5.16b, v5.16b, v18.16b
; CHECK-NEON-NEXT: eor v4.16b, v7.16b, v4.16b
; CHECK-NEON-NEXT: and v3.16b, v6.16b, v3.16b
; CHECK-NEON-NEXT: and v2.16b, v16.16b, v2.16b
; CHECK-NEON-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-NEON-NEXT: and v0.16b, v4.16b, v0.16b
; CHECK-NEON-NEXT: orr v2.16b, v2.16b, v3.16b
; CHECK-NEON-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: orr v0.16b, v2.16b, v0.16b
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v2i64_neon_zext:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: pmull2 v2.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v0.d[1], v2.d[0]
; CHECK-AES-NEXT: ret
%zextx = zext <2 x i32> %x to <2 x i64>
%zexty = zext <2 x i32> %y to <2 x i64>
%a = call <2 x i64> @llvm.clmul.v2i64(<2 x i64> %zextx, <2 x i64> %zexty)
ret <2 x i64> %a
}
define <4 x i64> @clmul_v4i64_neon_zext(<4 x i32> %x, <4 x i32> %y) {
; CHECK-NEON-LABEL: clmul_v4i64_neon_zext:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: sub sp, sp, #80
; CHECK-NEON-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill
; CHECK-NEON-NEXT: .cfi_def_cfa_offset 80
; CHECK-NEON-NEXT: .cfi_offset b8, -8
; CHECK-NEON-NEXT: .cfi_offset b9, -16
; CHECK-NEON-NEXT: .cfi_offset b10, -24
; CHECK-NEON-NEXT: .cfi_offset b11, -32
; CHECK-NEON-NEXT: .cfi_offset b12, -40
; CHECK-NEON-NEXT: .cfi_offset b13, -48
; CHECK-NEON-NEXT: .cfi_offset b14, -56
; CHECK-NEON-NEXT: .cfi_offset b15, -64
; CHECK-NEON-NEXT: movi v2.16b, #17
; CHECK-NEON-NEXT: movi v3.16b, #34
; CHECK-NEON-NEXT: movi v4.16b, #136
; CHECK-NEON-NEXT: movi v5.16b, #68
; CHECK-NEON-NEXT: ushll2 v6.2d, v0.4s, #0
; CHECK-NEON-NEXT: ushll2 v7.2d, v1.4s, #0
; CHECK-NEON-NEXT: ushll v28.2d, v0.2s, #0
; CHECK-NEON-NEXT: ushll v29.2d, v1.2s, #0
; CHECK-NEON-NEXT: and v16.16b, v7.16b, v2.16b
; CHECK-NEON-NEXT: and v17.16b, v6.16b, v3.16b
; CHECK-NEON-NEXT: and v18.16b, v7.16b, v3.16b
; CHECK-NEON-NEXT: and v19.16b, v6.16b, v2.16b
; CHECK-NEON-NEXT: and v20.16b, v7.16b, v4.16b
; CHECK-NEON-NEXT: and v21.16b, v6.16b, v5.16b
; CHECK-NEON-NEXT: and v22.16b, v7.16b, v5.16b
; CHECK-NEON-NEXT: and v6.16b, v6.16b, v4.16b
; CHECK-NEON-NEXT: and v30.16b, v28.16b, v2.16b
; CHECK-NEON-NEXT: xtn v7.2s, v16.2d
; CHECK-NEON-NEXT: xtn v17.2s, v17.2d
; CHECK-NEON-NEXT: xtn v16.2s, v18.2d
; CHECK-NEON-NEXT: xtn v18.2s, v19.2d
; CHECK-NEON-NEXT: xtn v19.2s, v20.2d
; CHECK-NEON-NEXT: xtn v20.2s, v21.2d
; CHECK-NEON-NEXT: xtn v22.2s, v22.2d
; CHECK-NEON-NEXT: xtn v21.2s, v6.2d
; CHECK-NEON-NEXT: and v31.16b, v29.16b, v4.16b
; CHECK-NEON-NEXT: and v8.16b, v28.16b, v5.16b
; CHECK-NEON-NEXT: umull v6.2d, v17.2s, v7.2s
; CHECK-NEON-NEXT: umull v23.2d, v18.2s, v16.2s
; CHECK-NEON-NEXT: umull v24.2d, v20.2s, v19.2s
; CHECK-NEON-NEXT: umull v26.2d, v17.2s, v19.2s
; CHECK-NEON-NEXT: umull v25.2d, v21.2s, v22.2s
; CHECK-NEON-NEXT: umull v27.2d, v18.2s, v7.2s
; CHECK-NEON-NEXT: umull v9.2d, v18.2s, v22.2s
; CHECK-NEON-NEXT: umull v10.2d, v20.2s, v7.2s
; CHECK-NEON-NEXT: umull v11.2d, v21.2s, v19.2s
; CHECK-NEON-NEXT: umull v18.2d, v18.2s, v19.2s
; CHECK-NEON-NEXT: umull v7.2d, v21.2s, v7.2s
; CHECK-NEON-NEXT: eor v0.16b, v23.16b, v6.16b
; CHECK-NEON-NEXT: umull v23.2d, v20.2s, v22.2s
; CHECK-NEON-NEXT: eor v1.16b, v24.16b, v25.16b
; CHECK-NEON-NEXT: umull v24.2d, v21.2s, v16.2s
; CHECK-NEON-NEXT: eor v6.16b, v27.16b, v26.16b
; CHECK-NEON-NEXT: and v25.16b, v29.16b, v2.16b
; CHECK-NEON-NEXT: and v26.16b, v28.16b, v3.16b
; CHECK-NEON-NEXT: and v27.16b, v29.16b, v3.16b
; CHECK-NEON-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-NEON-NEXT: and v29.16b, v29.16b, v5.16b
; CHECK-NEON-NEXT: and v28.16b, v28.16b, v4.16b
; CHECK-NEON-NEXT: eor v23.16b, v23.16b, v24.16b
; CHECK-NEON-NEXT: xtn v24.2s, v25.2d
; CHECK-NEON-NEXT: xtn v25.2s, v26.2d
; CHECK-NEON-NEXT: xtn v26.2s, v27.2d
; CHECK-NEON-NEXT: xtn v27.2s, v30.2d
; CHECK-NEON-NEXT: xtn v30.2s, v31.2d
; CHECK-NEON-NEXT: xtn v31.2s, v8.2d
; CHECK-NEON-NEXT: xtn v29.2s, v29.2d
; CHECK-NEON-NEXT: xtn v28.2s, v28.2d
; CHECK-NEON-NEXT: umull v8.2d, v17.2s, v16.2s
; CHECK-NEON-NEXT: umull v17.2d, v17.2s, v22.2s
; CHECK-NEON-NEXT: umull v16.2d, v20.2s, v16.2s
; CHECK-NEON-NEXT: umull v19.2d, v25.2s, v24.2s
; CHECK-NEON-NEXT: eor v6.16b, v6.16b, v23.16b
; CHECK-NEON-NEXT: umull v20.2d, v27.2s, v26.2s
; CHECK-NEON-NEXT: umull v12.2d, v25.2s, v30.2s
; CHECK-NEON-NEXT: umull v15.2d, v25.2s, v26.2s
; CHECK-NEON-NEXT: umull v21.2d, v31.2s, v30.2s
; CHECK-NEON-NEXT: umull v22.2d, v28.2s, v29.2s
; CHECK-NEON-NEXT: umull v13.2d, v31.2s, v29.2s
; CHECK-NEON-NEXT: umull v14.2d, v28.2s, v26.2s
; CHECK-NEON-NEXT: umull v25.2d, v25.2s, v29.2s
; CHECK-NEON-NEXT: umull v29.2d, v27.2s, v29.2s
; CHECK-NEON-NEXT: umull v26.2d, v31.2s, v26.2s
; CHECK-NEON-NEXT: umull v31.2d, v31.2s, v24.2s
; CHECK-NEON-NEXT: umull v0.2d, v27.2s, v24.2s
; CHECK-NEON-NEXT: umull v27.2d, v27.2s, v30.2s
; CHECK-NEON-NEXT: umull v30.2d, v28.2s, v30.2s
; CHECK-NEON-NEXT: umull v24.2d, v28.2s, v24.2s
; CHECK-NEON-NEXT: eor v28.16b, v9.16b, v8.16b
; CHECK-NEON-NEXT: eor v8.16b, v10.16b, v11.16b
; CHECK-NEON-NEXT: eor v17.16b, v18.16b, v17.16b
; CHECK-NEON-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor v7.16b, v16.16b, v7.16b
; CHECK-NEON-NEXT: eor v16.16b, v20.16b, v19.16b
; CHECK-NEON-NEXT: eor v18.16b, v21.16b, v22.16b
; CHECK-NEON-NEXT: eor v0.16b, v0.16b, v12.16b
; CHECK-NEON-NEXT: eor v19.16b, v13.16b, v14.16b
; CHECK-NEON-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor v20.16b, v29.16b, v15.16b
; CHECK-NEON-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor v21.16b, v31.16b, v30.16b
; CHECK-NEON-NEXT: eor v22.16b, v27.16b, v25.16b
; CHECK-NEON-NEXT: ldr q25, [sp] // 16-byte Reload
; CHECK-NEON-NEXT: eor v24.16b, v26.16b, v24.16b
; CHECK-NEON-NEXT: eor v23.16b, v28.16b, v8.16b
; CHECK-NEON-NEXT: eor v7.16b, v17.16b, v7.16b
; CHECK-NEON-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor v1.16b, v25.16b, v1.16b
; CHECK-NEON-NEXT: eor v16.16b, v16.16b, v18.16b
; CHECK-NEON-NEXT: eor v0.16b, v0.16b, v19.16b
; CHECK-NEON-NEXT: eor v17.16b, v20.16b, v21.16b
; CHECK-NEON-NEXT: eor v18.16b, v22.16b, v24.16b
; CHECK-NEON-NEXT: and v6.16b, v6.16b, v2.16b
; CHECK-NEON-NEXT: and v19.16b, v23.16b, v5.16b
; CHECK-NEON-NEXT: and v1.16b, v1.16b, v3.16b
; CHECK-NEON-NEXT: and v7.16b, v7.16b, v4.16b
; CHECK-NEON-NEXT: and v3.16b, v16.16b, v3.16b
; CHECK-NEON-NEXT: and v0.16b, v0.16b, v2.16b
; CHECK-NEON-NEXT: and v2.16b, v17.16b, v5.16b
; CHECK-NEON-NEXT: and v4.16b, v18.16b, v4.16b
; CHECK-NEON-NEXT: orr v1.16b, v6.16b, v1.16b
; CHECK-NEON-NEXT: orr v5.16b, v19.16b, v7.16b
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-NEON-NEXT: orr v2.16b, v2.16b, v4.16b
; CHECK-NEON-NEXT: orr v1.16b, v1.16b, v5.16b
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v2.16b
; CHECK-NEON-NEXT: add sp, sp, #80
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v4i64_neon_zext:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll2 v2.2d, v0.4s, #0
; CHECK-AES-NEXT: ushll2 v3.2d, v1.4s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: ushll v4.2d, v1.2s, #0
; CHECK-AES-NEXT: pmull2 v5.1q, v2.2d, v3.2d
; CHECK-AES-NEXT: pmull v1.1q, v2.1d, v3.1d
; CHECK-AES-NEXT: pmull2 v2.1q, v0.2d, v4.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v4.1d
; CHECK-AES-NEXT: mov v1.d[1], v5.d[0]
; CHECK-AES-NEXT: mov v0.d[1], v2.d[0]
; CHECK-AES-NEXT: ret
%zextx = zext <4 x i32> %x to <4 x i64>
%zexty = zext <4 x i32> %y to <4 x i64>
%a = call <4 x i64> @llvm.clmul.v4i64(<4 x i64> %zextx, <4 x i64> %zexty)
ret <4 x i64> %a
}
define <1 x i128> @clmul_v1i128_neon_zext(<1 x i64> %x, <1 x i64> %y) {
; CHECK-NEON-LABEL: clmul_v1i128_neon_zext:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: sub sp, sp, #144
; CHECK-NEON-NEXT: stp x29, x30, [sp, #48] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x28, x27, [sp, #64] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x26, x25, [sp, #80] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x24, x23, [sp, #96] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x22, x21, [sp, #112] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x20, x19, [sp, #128] // 16-byte Folded Spill
; CHECK-NEON-NEXT: .cfi_def_cfa_offset 144
; CHECK-NEON-NEXT: .cfi_offset w19, -8
; CHECK-NEON-NEXT: .cfi_offset w20, -16
; CHECK-NEON-NEXT: .cfi_offset w21, -24
; CHECK-NEON-NEXT: .cfi_offset w22, -32
; CHECK-NEON-NEXT: .cfi_offset w23, -40
; CHECK-NEON-NEXT: .cfi_offset w24, -48
; CHECK-NEON-NEXT: .cfi_offset w25, -56
; CHECK-NEON-NEXT: .cfi_offset w26, -64
; CHECK-NEON-NEXT: .cfi_offset w27, -72
; CHECK-NEON-NEXT: .cfi_offset w28, -80
; CHECK-NEON-NEXT: .cfi_offset w30, -88
; CHECK-NEON-NEXT: .cfi_offset w29, -96
; CHECK-NEON-NEXT: // kill: def $d1 killed $d1 def $q1
; CHECK-NEON-NEXT: // kill: def $d0 killed $d0 def $q0
; CHECK-NEON-NEXT: fmov x2, d0
; CHECK-NEON-NEXT: fmov x3, d1
; CHECK-NEON-NEXT: and x17, x3, #0x1111111111111111
; CHECK-NEON-NEXT: and x15, x2, #0x2222222222222222
; CHECK-NEON-NEXT: and x13, x3, #0x2222222222222222
; CHECK-NEON-NEXT: and x11, x2, #0x1111111111111111
; CHECK-NEON-NEXT: mul x9, x15, x17
; CHECK-NEON-NEXT: and x12, x3, #0x8888888888888888
; CHECK-NEON-NEXT: and x16, x2, #0x4444444444444444
; CHECK-NEON-NEXT: and x1, x3, #0x4444444444444444
; CHECK-NEON-NEXT: and x14, x2, #0x8888888888888888
; CHECK-NEON-NEXT: mul x8, x11, x13
; CHECK-NEON-NEXT: rbit x3, x3
; CHECK-NEON-NEXT: rbit x2, x2
; CHECK-NEON-NEXT: and x5, x3, #0x1111111111111111
; CHECK-NEON-NEXT: and x6, x2, #0x2222222222222222
; CHECK-NEON-NEXT: and x19, x3, #0x2222222222222222
; CHECK-NEON-NEXT: and x20, x2, #0x1111111111111111
; CHECK-NEON-NEXT: and x22, x3, #0x8888888888888888
; CHECK-NEON-NEXT: and x23, x2, #0x4444444444444444
; CHECK-NEON-NEXT: and x3, x3, #0x4444444444444444
; CHECK-NEON-NEXT: and x2, x2, #0x8888888888888888
; CHECK-NEON-NEXT: mul x4, x16, x1
; CHECK-NEON-NEXT: stp x9, x8, [sp, #32] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x9, x16, x12
; CHECK-NEON-NEXT: ldp x18, x10, [sp, #32] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x8, x14, x1
; CHECK-NEON-NEXT: eor x10, x10, x18
; CHECK-NEON-NEXT: mul x7, x6, x5
; CHECK-NEON-NEXT: mul x21, x20, x19
; CHECK-NEON-NEXT: stp x8, x9, [sp, #16] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x8, x15, x12
; CHECK-NEON-NEXT: ldp x0, x18, [sp, #16] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x24, x23, x22
; CHECK-NEON-NEXT: eor x18, x18, x0
; CHECK-NEON-NEXT: mul x25, x2, x3
; CHECK-NEON-NEXT: eor x10, x10, x18
; CHECK-NEON-NEXT: str x8, [sp, #8] // 8-byte Spill
; CHECK-NEON-NEXT: and x10, x10, #0x2222222222222222
; CHECK-NEON-NEXT: mul x8, x11, x17
; CHECK-NEON-NEXT: ldr x0, [sp, #8] // 8-byte Reload
; CHECK-NEON-NEXT: mul x9, x14, x13
; CHECK-NEON-NEXT: mul x26, x6, x22
; CHECK-NEON-NEXT: eor x8, x8, x0
; CHECK-NEON-NEXT: eor x0, x21, x7
; CHECK-NEON-NEXT: mul x27, x20, x5
; CHECK-NEON-NEXT: eor x9, x4, x9
; CHECK-NEON-NEXT: eor x4, x24, x25
; CHECK-NEON-NEXT: mul x28, x23, x3
; CHECK-NEON-NEXT: eor x8, x8, x9
; CHECK-NEON-NEXT: eor x9, x0, x4
; CHECK-NEON-NEXT: and x9, x9, #0x2222222222222222
; CHECK-NEON-NEXT: and x8, x8, #0x1111111111111111
; CHECK-NEON-NEXT: mul x29, x2, x19
; CHECK-NEON-NEXT: orr x8, x8, x10
; CHECK-NEON-NEXT: eor x18, x27, x26
; CHECK-NEON-NEXT: ldp x26, x25, [sp, #80] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x30, x6, x19
; CHECK-NEON-NEXT: mul x6, x6, x3
; CHECK-NEON-NEXT: eor x0, x28, x29
; CHECK-NEON-NEXT: ldp x28, x27, [sp, #64] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x3, x20, x3
; CHECK-NEON-NEXT: eor x18, x18, x0
; CHECK-NEON-NEXT: and x18, x18, #0x1111111111111111
; CHECK-NEON-NEXT: mul x19, x23, x19
; CHECK-NEON-NEXT: orr x9, x18, x9
; CHECK-NEON-NEXT: mul x23, x23, x5
; CHECK-NEON-NEXT: eor x0, x3, x30
; CHECK-NEON-NEXT: ldp x29, x30, [sp, #48] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x20, x20, x22
; CHECK-NEON-NEXT: mul x22, x2, x22
; CHECK-NEON-NEXT: mul x2, x2, x5
; CHECK-NEON-NEXT: eor x4, x20, x6
; CHECK-NEON-NEXT: mul x5, x15, x13
; CHECK-NEON-NEXT: eor x3, x23, x22
; CHECK-NEON-NEXT: ldp x22, x21, [sp, #112] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x15, x15, x1
; CHECK-NEON-NEXT: ldp x24, x23, [sp, #96] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x2, x19, x2
; CHECK-NEON-NEXT: ldp x20, x19, [sp, #128] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x1, x11, x1
; CHECK-NEON-NEXT: mul x13, x16, x13
; CHECK-NEON-NEXT: mul x16, x16, x17
; CHECK-NEON-NEXT: eor x18, x1, x5
; CHECK-NEON-NEXT: mul x11, x11, x12
; CHECK-NEON-NEXT: mul x12, x14, x12
; CHECK-NEON-NEXT: mul x14, x14, x17
; CHECK-NEON-NEXT: eor x17, x0, x3
; CHECK-NEON-NEXT: eor x0, x4, x2
; CHECK-NEON-NEXT: and x17, x17, #0x4444444444444444
; CHECK-NEON-NEXT: and x0, x0, #0x8888888888888888
; CHECK-NEON-NEXT: eor x11, x11, x15
; CHECK-NEON-NEXT: orr x17, x17, x0
; CHECK-NEON-NEXT: eor x12, x16, x12
; CHECK-NEON-NEXT: orr x9, x9, x17
; CHECK-NEON-NEXT: rbit x9, x9
; CHECK-NEON-NEXT: eor x12, x18, x12
; CHECK-NEON-NEXT: eor x13, x13, x14
; CHECK-NEON-NEXT: and x12, x12, #0x4444444444444444
; CHECK-NEON-NEXT: eor x11, x11, x13
; CHECK-NEON-NEXT: lsr x1, x9, #1
; CHECK-NEON-NEXT: and x11, x11, #0x8888888888888888
; CHECK-NEON-NEXT: orr x9, x12, x11
; CHECK-NEON-NEXT: orr x0, x8, x9
; CHECK-NEON-NEXT: add sp, sp, #144
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v1i128_neon_zext:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: // kill: def $d1 killed $d1 def $q1
; CHECK-AES-NEXT: // kill: def $d0 killed $d0 def $q0
; CHECK-AES-NEXT: fmov x8, d0
; CHECK-AES-NEXT: fmov x9, d1
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: rbit x9, x9
; CHECK-AES-NEXT: rbit x8, x8
; CHECK-AES-NEXT: fmov d2, x9
; CHECK-AES-NEXT: fmov d3, x8
; CHECK-AES-NEXT: fmov x0, d0
; CHECK-AES-NEXT: pmull v2.1q, v3.1d, v2.1d
; CHECK-AES-NEXT: fmov x8, d2
; CHECK-AES-NEXT: rbit x8, x8
; CHECK-AES-NEXT: lsr x1, x8, #1
; CHECK-AES-NEXT: ret
%zextx = zext <1 x i64> %x to <1 x i128>
%zexty = zext <1 x i64> %y to <1 x i128>
%a = call <1 x i128> @llvm.clmul.v2i128(<1 x i128> %zextx, <1 x i128> %zexty)
ret <1 x i128> %a
}
define <2 x i128> @clmul_v2i128_neon_zext(<2 x i64> %x, <2 x i64> %y) {
; CHECK-NEON-LABEL: clmul_v2i128_neon_zext:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: sub sp, sp, #416
; CHECK-NEON-NEXT: stp x29, x30, [sp, #320] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x28, x27, [sp, #336] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x26, x25, [sp, #352] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x24, x23, [sp, #368] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x22, x21, [sp, #384] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x20, x19, [sp, #400] // 16-byte Folded Spill
; CHECK-NEON-NEXT: .cfi_def_cfa_offset 416
; CHECK-NEON-NEXT: .cfi_offset w19, -8
; CHECK-NEON-NEXT: .cfi_offset w20, -16
; CHECK-NEON-NEXT: .cfi_offset w21, -24
; CHECK-NEON-NEXT: .cfi_offset w22, -32
; CHECK-NEON-NEXT: .cfi_offset w23, -40
; CHECK-NEON-NEXT: .cfi_offset w24, -48
; CHECK-NEON-NEXT: .cfi_offset w25, -56
; CHECK-NEON-NEXT: .cfi_offset w26, -64
; CHECK-NEON-NEXT: .cfi_offset w27, -72
; CHECK-NEON-NEXT: .cfi_offset w28, -80
; CHECK-NEON-NEXT: .cfi_offset w30, -88
; CHECK-NEON-NEXT: .cfi_offset w29, -96
; CHECK-NEON-NEXT: fmov x8, d0
; CHECK-NEON-NEXT: fmov x10, d1
; CHECK-NEON-NEXT: and x12, x8, #0x2222222222222222
; CHECK-NEON-NEXT: and x15, x10, #0x8888888888888888
; CHECK-NEON-NEXT: and x17, x10, #0x4444444444444444
; CHECK-NEON-NEXT: and x11, x8, #0x8888888888888888
; CHECK-NEON-NEXT: mul x18, x12, x15
; CHECK-NEON-NEXT: and x9, x10, #0x1111111111111111
; CHECK-NEON-NEXT: and x14, x8, #0x1111111111111111
; CHECK-NEON-NEXT: and x16, x8, #0x4444444444444444
; CHECK-NEON-NEXT: and x13, x10, #0x2222222222222222
; CHECK-NEON-NEXT: mul x0, x11, x17
; CHECK-NEON-NEXT: rbit x10, x10
; CHECK-NEON-NEXT: rbit x8, x8
; CHECK-NEON-NEXT: mul x5, x12, x9
; CHECK-NEON-NEXT: mul x19, x14, x13
; CHECK-NEON-NEXT: stp x18, x0, [sp, #304] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x0, x14, x9
; CHECK-NEON-NEXT: mul x18, x16, x17
; CHECK-NEON-NEXT: mul x24, x16, x15
; CHECK-NEON-NEXT: stp x18, x0, [sp, #288] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x0, x11, x13
; CHECK-NEON-NEXT: mul x18, x12, x13
; CHECK-NEON-NEXT: mul x12, x12, x17
; CHECK-NEON-NEXT: stp x18, x0, [sp, #272] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x0, x14, x17
; CHECK-NEON-NEXT: mul x18, x16, x9
; CHECK-NEON-NEXT: mul x9, x11, x9
; CHECK-NEON-NEXT: stp x18, x0, [sp, #256] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x18, x11, x15
; CHECK-NEON-NEXT: and x11, x8, #0x2222222222222222
; CHECK-NEON-NEXT: str x9, [sp, #152] // 8-byte Spill
; CHECK-NEON-NEXT: and x9, x10, #0x1111111111111111
; CHECK-NEON-NEXT: stp x12, x18, [sp, #240] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x12, x14, x15
; CHECK-NEON-NEXT: and x15, x8, #0x8888888888888888
; CHECK-NEON-NEXT: mul x14, x16, x13
; CHECK-NEON-NEXT: and x13, x8, #0x1111111111111111
; CHECK-NEON-NEXT: and x8, x8, #0x4444444444444444
; CHECK-NEON-NEXT: str x12, [sp, #232] // 8-byte Spill
; CHECK-NEON-NEXT: mul x12, x11, x9
; CHECK-NEON-NEXT: stp x12, x14, [sp, #216] // 16-byte Folded Spill
; CHECK-NEON-NEXT: and x12, x10, #0x2222222222222222
; CHECK-NEON-NEXT: mul x14, x13, x12
; CHECK-NEON-NEXT: str x14, [sp, #208] // 8-byte Spill
; CHECK-NEON-NEXT: and x14, x10, #0x4444444444444444
; CHECK-NEON-NEXT: and x10, x10, #0x8888888888888888
; CHECK-NEON-NEXT: mul x16, x15, x14
; CHECK-NEON-NEXT: mul x17, x11, x10
; CHECK-NEON-NEXT: str x16, [sp, #200] // 8-byte Spill
; CHECK-NEON-NEXT: mul x16, x8, x14
; CHECK-NEON-NEXT: str x16, [sp, #168] // 8-byte Spill
; CHECK-NEON-NEXT: mul x16, x15, x12
; CHECK-NEON-NEXT: str x16, [sp, #160] // 8-byte Spill
; CHECK-NEON-NEXT: mul x16, x11, x12
; CHECK-NEON-NEXT: mul x11, x11, x14
; CHECK-NEON-NEXT: stp x16, x17, [sp, #176] // 16-byte Folded Spill
; CHECK-NEON-NEXT: str x11, [sp, #144] // 8-byte Spill
; CHECK-NEON-NEXT: mul x11, x13, x14
; CHECK-NEON-NEXT: str x11, [sp, #128] // 8-byte Spill
; CHECK-NEON-NEXT: mul x11, x8, x12
; CHECK-NEON-NEXT: str x11, [sp, #136] // 8-byte Spill
; CHECK-NEON-NEXT: mul x11, x8, x10
; CHECK-NEON-NEXT: mul x8, x8, x9
; CHECK-NEON-NEXT: str x8, [sp, #120] // 8-byte Spill
; CHECK-NEON-NEXT: mul x8, x13, x9
; CHECK-NEON-NEXT: mul x9, x15, x9
; CHECK-NEON-NEXT: stp x8, x11, [sp, #80] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x11, x13, x10
; CHECK-NEON-NEXT: mov x8, v0.d[1]
; CHECK-NEON-NEXT: mov x13, v1.d[1]
; CHECK-NEON-NEXT: mul x10, x15, x10
; CHECK-NEON-NEXT: and x28, x8, #0x8888888888888888
; CHECK-NEON-NEXT: and x6, x8, #0x4444444444444444
; CHECK-NEON-NEXT: rbit x15, x8
; CHECK-NEON-NEXT: stp x9, x11, [sp, #104] // 16-byte Folded Spill
; CHECK-NEON-NEXT: and x21, x13, #0x1111111111111111
; CHECK-NEON-NEXT: and x9, x8, #0x2222222222222222
; CHECK-NEON-NEXT: and x7, x13, #0x8888888888888888
; CHECK-NEON-NEXT: mul x11, x9, x21
; CHECK-NEON-NEXT: and x30, x13, #0x2222222222222222
; CHECK-NEON-NEXT: str x10, [sp, #96] // 8-byte Spill
; CHECK-NEON-NEXT: and x14, x13, #0x4444444444444444
; CHECK-NEON-NEXT: rbit x13, x13
; CHECK-NEON-NEXT: mul x10, x9, x7
; CHECK-NEON-NEXT: and x4, x8, #0x1111111111111111
; CHECK-NEON-NEXT: and x8, x15, #0x2222222222222222
; CHECK-NEON-NEXT: and x0, x13, #0x1111111111111111
; CHECK-NEON-NEXT: and x16, x13, #0x8888888888888888
; CHECK-NEON-NEXT: and x18, x13, #0x2222222222222222
; CHECK-NEON-NEXT: and x17, x13, #0x4444444444444444
; CHECK-NEON-NEXT: mul x2, x6, x7
; CHECK-NEON-NEXT: mul x29, x8, x17
; CHECK-NEON-NEXT: stp x10, x11, [sp, #48] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x10, x9, x30
; CHECK-NEON-NEXT: mul x9, x9, x14
; CHECK-NEON-NEXT: mul x11, x28, x14
; CHECK-NEON-NEXT: mul x3, x4, x21
; CHECK-NEON-NEXT: str x9, [sp, #192] // 8-byte Spill
; CHECK-NEON-NEXT: mul x9, x6, x14
; CHECK-NEON-NEXT: mul x1, x28, x30
; CHECK-NEON-NEXT: stp x9, x11, [sp, #32] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x9, x8, x0
; CHECK-NEON-NEXT: mul x11, x4, x14
; CHECK-NEON-NEXT: and x14, x15, #0x8888888888888888
; CHECK-NEON-NEXT: mul x23, x14, x18
; CHECK-NEON-NEXT: stp x9, x10, [sp, #64] // 16-byte Folded Spill
; CHECK-NEON-NEXT: and x10, x15, #0x1111111111111111
; CHECK-NEON-NEXT: mul x9, x8, x16
; CHECK-NEON-NEXT: mul x20, x10, x18
; CHECK-NEON-NEXT: mul x22, x14, x17
; CHECK-NEON-NEXT: str x9, [sp, #24] // 8-byte Spill
; CHECK-NEON-NEXT: mul x9, x8, x18
; CHECK-NEON-NEXT: and x8, x15, #0x4444444444444444
; CHECK-NEON-NEXT: mul x25, x8, x18
; CHECK-NEON-NEXT: mul x18, x4, x30
; CHECK-NEON-NEXT: stp x11, x9, [sp, #8] // 16-byte Folded Spill
; CHECK-NEON-NEXT: ldr x9, [sp, #312] // 8-byte Reload
; CHECK-NEON-NEXT: eor x11, x19, x5
; CHECK-NEON-NEXT: ldr x19, [sp, #152] // 8-byte Reload
; CHECK-NEON-NEXT: mul x26, x8, x17
; CHECK-NEON-NEXT: eor x9, x24, x9
; CHECK-NEON-NEXT: eor x15, x11, x9
; CHECK-NEON-NEXT: ldp x11, x9, [sp, #296] // 16-byte Folded Reload
; CHECK-NEON-NEXT: and x15, x15, #0x2222222222222222
; CHECK-NEON-NEXT: mul x27, x10, x17
; CHECK-NEON-NEXT: eor x11, x11, x9
; CHECK-NEON-NEXT: ldp x12, x9, [sp, #280] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x5, x6, x21
; CHECK-NEON-NEXT: eor x24, x9, x12
; CHECK-NEON-NEXT: ldp x12, x9, [sp, #264] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x11, x11, x24
; CHECK-NEON-NEXT: mul x17, x28, x7
; CHECK-NEON-NEXT: and x11, x11, #0x1111111111111111
; CHECK-NEON-NEXT: eor x24, x12, x9
; CHECK-NEON-NEXT: ldp x12, x9, [sp, #248] // 16-byte Folded Reload
; CHECK-NEON-NEXT: orr x11, x11, x15
; CHECK-NEON-NEXT: mul x4, x4, x7
; CHECK-NEON-NEXT: eor x13, x9, x12
; CHECK-NEON-NEXT: ldp x12, x9, [sp, #232] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x13, x24, x13
; CHECK-NEON-NEXT: eor x17, x5, x17
; CHECK-NEON-NEXT: eor x12, x12, x9
; CHECK-NEON-NEXT: ldr x9, [sp, #224] // 8-byte Reload
; CHECK-NEON-NEXT: eor x9, x9, x19
; CHECK-NEON-NEXT: mul x19, x8, x16
; CHECK-NEON-NEXT: eor x9, x12, x9
; CHECK-NEON-NEXT: and x12, x13, #0x4444444444444444
; CHECK-NEON-NEXT: and x9, x9, #0x8888888888888888
; CHECK-NEON-NEXT: mul x13, x8, x0
; CHECK-NEON-NEXT: orr x8, x12, x9
; CHECK-NEON-NEXT: ldp x15, x9, [sp, #48] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x19, x19, x22
; CHECK-NEON-NEXT: eor x9, x18, x9
; CHECK-NEON-NEXT: ldp x18, x12, [sp, #32] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x15, x3, x15
; CHECK-NEON-NEXT: ldp x5, x3, [sp, #80] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x12, x2, x12
; CHECK-NEON-NEXT: eor x18, x18, x1
; CHECK-NEON-NEXT: mul x1, x10, x0
; CHECK-NEON-NEXT: eor x9, x9, x12
; CHECK-NEON-NEXT: eor x12, x15, x18
; CHECK-NEON-NEXT: ldr x15, [sp, #72] // 8-byte Reload
; CHECK-NEON-NEXT: ldr x18, [sp, #8] // 8-byte Reload
; CHECK-NEON-NEXT: mul x10, x10, x16
; CHECK-NEON-NEXT: and x9, x9, #0x2222222222222222
; CHECK-NEON-NEXT: and x12, x12, #0x1111111111111111
; CHECK-NEON-NEXT: eor x15, x18, x15
; CHECK-NEON-NEXT: ldp x2, x18, [sp, #208] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x15, x15, x17
; CHECK-NEON-NEXT: mul x16, x14, x16
; CHECK-NEON-NEXT: orr x9, x12, x9
; CHECK-NEON-NEXT: and x15, x15, #0x4444444444444444
; CHECK-NEON-NEXT: eor x18, x2, x18
; CHECK-NEON-NEXT: ldr x2, [sp, #200] // 8-byte Reload
; CHECK-NEON-NEXT: mul x14, x14, x0
; CHECK-NEON-NEXT: eor x10, x10, x29
; CHECK-NEON-NEXT: eor x2, x3, x2
; CHECK-NEON-NEXT: ldr x3, [sp, #184] // 8-byte Reload
; CHECK-NEON-NEXT: eor x18, x18, x2
; CHECK-NEON-NEXT: eor x13, x13, x16
; CHECK-NEON-NEXT: mul x16, x28, x21
; CHECK-NEON-NEXT: eor x3, x5, x3
; CHECK-NEON-NEXT: ldp x24, x5, [sp, #160] // 16-byte Folded Reload
; CHECK-NEON-NEXT: and x17, x18, #0x2222222222222222
; CHECK-NEON-NEXT: eor x14, x25, x14
; CHECK-NEON-NEXT: eor x10, x10, x14
; CHECK-NEON-NEXT: ldp x22, x21, [sp, #384] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x5, x5, x24
; CHECK-NEON-NEXT: and x10, x10, #0x8888888888888888
; CHECK-NEON-NEXT: eor x2, x3, x5
; CHECK-NEON-NEXT: ldp x3, x0, [sp, #112] // 16-byte Folded Reload
; CHECK-NEON-NEXT: and x18, x2, #0x1111111111111111
; CHECK-NEON-NEXT: ldr x2, [sp, #128] // 8-byte Reload
; CHECK-NEON-NEXT: orr x17, x18, x17
; CHECK-NEON-NEXT: ldr x18, [sp, #176] // 8-byte Reload
; CHECK-NEON-NEXT: eor x18, x2, x18
; CHECK-NEON-NEXT: ldp x2, x5, [sp, #96] // 16-byte Folded Reload
; CHECK-NEON-NEXT: eor x0, x0, x2
; CHECK-NEON-NEXT: ldr x2, [sp, #144] // 8-byte Reload
; CHECK-NEON-NEXT: eor x18, x18, x0
; CHECK-NEON-NEXT: eor x2, x3, x2
; CHECK-NEON-NEXT: ldr x3, [sp, #136] // 8-byte Reload
; CHECK-NEON-NEXT: and x18, x18, #0x4444444444444444
; CHECK-NEON-NEXT: eor x3, x3, x5
; CHECK-NEON-NEXT: ldr x5, [sp, #64] // 8-byte Reload
; CHECK-NEON-NEXT: eor x0, x2, x3
; CHECK-NEON-NEXT: ldr x3, [sp, #24] // 8-byte Reload
; CHECK-NEON-NEXT: eor x5, x20, x5
; CHECK-NEON-NEXT: and x0, x0, #0x8888888888888888
; CHECK-NEON-NEXT: eor x1, x1, x3
; CHECK-NEON-NEXT: eor x3, x26, x23
; CHECK-NEON-NEXT: eor x2, x5, x19
; CHECK-NEON-NEXT: eor x1, x1, x3
; CHECK-NEON-NEXT: ldr x3, [sp, #16] // 8-byte Reload
; CHECK-NEON-NEXT: mul x5, x6, x30
; CHECK-NEON-NEXT: and x2, x2, #0x2222222222222222
; CHECK-NEON-NEXT: and x14, x1, #0x1111111111111111
; CHECK-NEON-NEXT: orr x18, x18, x0
; CHECK-NEON-NEXT: eor x3, x27, x3
; CHECK-NEON-NEXT: orr x14, x14, x2
; CHECK-NEON-NEXT: orr x17, x17, x18
; CHECK-NEON-NEXT: eor x13, x3, x13
; CHECK-NEON-NEXT: ldp x20, x19, [sp, #400] // 16-byte Folded Reload
; CHECK-NEON-NEXT: and x13, x13, #0x4444444444444444
; CHECK-NEON-NEXT: ldp x24, x23, [sp, #368] // 16-byte Folded Reload
; CHECK-NEON-NEXT: orr x10, x13, x10
; CHECK-NEON-NEXT: ldr x13, [sp, #192] // 8-byte Reload
; CHECK-NEON-NEXT: orr x0, x11, x8
; CHECK-NEON-NEXT: orr x10, x14, x10
; CHECK-NEON-NEXT: eor x14, x5, x16
; CHECK-NEON-NEXT: rbit x16, x17
; CHECK-NEON-NEXT: eor x13, x4, x13
; CHECK-NEON-NEXT: rbit x10, x10
; CHECK-NEON-NEXT: eor x13, x13, x14
; CHECK-NEON-NEXT: ldp x26, x25, [sp, #352] // 16-byte Folded Reload
; CHECK-NEON-NEXT: and x13, x13, #0x8888888888888888
; CHECK-NEON-NEXT: ldp x28, x27, [sp, #336] // 16-byte Folded Reload
; CHECK-NEON-NEXT: ldp x29, x30, [sp, #320] // 16-byte Folded Reload
; CHECK-NEON-NEXT: lsr x3, x10, #1
; CHECK-NEON-NEXT: orr x10, x15, x13
; CHECK-NEON-NEXT: lsr x1, x16, #1
; CHECK-NEON-NEXT: orr x2, x9, x10
; CHECK-NEON-NEXT: add sp, sp, #416
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmul_v2i128_neon_zext:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: fmov x10, d0
; CHECK-AES-NEXT: fmov x11, d1
; CHECK-AES-NEXT: mov x8, v0.d[1]
; CHECK-AES-NEXT: mov x9, v1.d[1]
; CHECK-AES-NEXT: mov d2, v1.d[1]
; CHECK-AES-NEXT: mov d3, v0.d[1]
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: rbit x11, x11
; CHECK-AES-NEXT: rbit x10, x10
; CHECK-AES-NEXT: rbit x8, x8
; CHECK-AES-NEXT: fmov d4, x11
; CHECK-AES-NEXT: fmov d5, x10
; CHECK-AES-NEXT: rbit x9, x9
; CHECK-AES-NEXT: fmov d6, x8
; CHECK-AES-NEXT: fmov x0, d0
; CHECK-AES-NEXT: pmull v1.1q, v3.1d, v2.1d
; CHECK-AES-NEXT: pmull v4.1q, v5.1d, v4.1d
; CHECK-AES-NEXT: fmov d5, x9
; CHECK-AES-NEXT: pmull v5.1q, v6.1d, v5.1d
; CHECK-AES-NEXT: fmov x2, d1
; CHECK-AES-NEXT: fmov x8, d4
; CHECK-AES-NEXT: fmov x9, d5
; CHECK-AES-NEXT: rbit x8, x8
; CHECK-AES-NEXT: lsr x1, x8, #1
; CHECK-AES-NEXT: rbit x9, x9
; CHECK-AES-NEXT: lsr x3, x9, #1
; CHECK-AES-NEXT: ret
%zextx = zext <2 x i64> %x to <2 x i128>
%zexty = zext <2 x i64> %y to <2 x i128>
%a = call <2 x i128> @llvm.clmul.v2i128(<2 x i128> %zextx, <2 x i128> %zexty)
ret <2 x i128> %a
}
define <16 x i8> @clmulr_v16i8_neon(<16 x i8> %a, <16 x i8> %b) nounwind {
; CHECK-LABEL: clmulr_v16i8_neon:
; CHECK: // %bb.0:
; CHECK-NEXT: rbit v1.16b, v1.16b
; CHECK-NEXT: rbit v0.16b, v0.16b
; CHECK-NEXT: pmul v0.16b, v0.16b, v1.16b
; CHECK-NEXT: rbit v0.16b, v0.16b
; CHECK-NEXT: ret
%a.ext = zext <16 x i8> %a to <16 x i16>
%b.ext = zext <16 x i8> %b to <16 x i16>
%clmul = call <16 x i16> @llvm.clmul.v16i16(<16 x i16> %a.ext, <16 x i16> %b.ext)
%res.ext = lshr <16 x i16> %clmul, splat (i16 7)
%res = trunc <16 x i16> %res.ext to <16 x i8>
ret <16 x i8> %res
}
define <8 x i8> @clmulr_v8i8_neon(<8 x i8> %a, <8 x i8> %b) nounwind {
; CHECK-LABEL: clmulr_v8i8_neon:
; CHECK: // %bb.0:
; CHECK-NEXT: rbit v1.8b, v1.8b
; CHECK-NEXT: rbit v0.8b, v0.8b
; CHECK-NEXT: pmul v0.8b, v0.8b, v1.8b
; CHECK-NEXT: rbit v0.8b, v0.8b
; CHECK-NEXT: ret
%a.ext = zext <8 x i8> %a to <8 x i16>
%b.ext = zext <8 x i8> %b to <8 x i16>
%clmul = call <8 x i16> @llvm.clmul.v16i16(<8 x i16> %a.ext, <8 x i16> %b.ext)
%res.ext = lshr <8 x i16> %clmul, splat (i16 7)
%res = trunc <8 x i16> %res.ext to <8 x i8>
ret <8 x i8> %res
}
define <8 x i16> @clmulr_v8i16_neon(<8 x i16> %a, <8 x i16> %b) nounwind {
; CHECK-LABEL: clmulr_v8i16_neon:
; CHECK: // %bb.0:
; CHECK-NEXT: rev16 v1.16b, v1.16b
; CHECK-NEXT: rev16 v0.16b, v0.16b
; CHECK-NEXT: rbit v1.16b, v1.16b
; CHECK-NEXT: rbit v0.16b, v0.16b
; CHECK-NEXT: xtn v2.8b, v1.8h
; CHECK-NEXT: xtn v3.8b, v0.8h
; CHECK-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEXT: shrn v1.8b, v1.8h, #8
; CHECK-NEXT: rbit v4.8b, v2.8b
; CHECK-NEXT: rbit v5.8b, v3.8b
; CHECK-NEXT: pmul v0.8b, v0.8b, v2.8b
; CHECK-NEXT: pmul v1.8b, v3.8b, v1.8b
; CHECK-NEXT: pmul v2.8b, v3.8b, v2.8b
; CHECK-NEXT: pmul v4.8b, v5.8b, v4.8b
; CHECK-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEXT: rbit v4.8b, v4.8b
; CHECK-NEXT: ushr v1.8b, v4.8b, #1
; CHECK-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEXT: ushll v1.8h, v2.8b, #0
; CHECK-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEXT: rev16 v0.16b, v0.16b
; CHECK-NEXT: rbit v0.16b, v0.16b
; CHECK-NEXT: ret
%a.ext = zext <8 x i16> %a to <8 x i32>
%b.ext = zext <8 x i16> %b to <8 x i32>
%clmul = call <8 x i32> @llvm.clmul.v8i32(<8 x i32> %a.ext, <8 x i32> %b.ext)
%res.ext = lshr <8 x i32> %clmul, splat (i32 15)
%res = trunc <8 x i32> %res.ext to <8 x i16>
ret <8 x i16> %res
}
define <4 x i16> @clmulr_v4i16_neon(<4 x i16> %a, <4 x i16> %b) nounwind {
; CHECK-NEON-LABEL: clmulr_v4i16_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: rev16 v1.8b, v1.8b
; CHECK-NEON-NEXT: rev16 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v1.8b, v1.8b
; CHECK-NEON-NEXT: rbit v0.8b, v0.8b
; CHECK-NEON-NEXT: xtn v2.8b, v1.8h
; CHECK-NEON-NEXT: xtn v3.8b, v0.8h
; CHECK-NEON-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEON-NEXT: shrn v1.8b, v1.8h, #8
; CHECK-NEON-NEXT: rbit v4.8b, v2.8b
; CHECK-NEON-NEXT: rbit v5.8b, v3.8b
; CHECK-NEON-NEXT: pmul v0.8b, v0.8b, v2.8b
; CHECK-NEON-NEXT: pmul v1.8b, v3.8b, v1.8b
; CHECK-NEON-NEXT: pmul v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: pmul v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: ushr v1.8b, v4.8b, #1
; CHECK-NEON-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: ushll v1.8h, v2.8b, #0
; CHECK-NEON-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEON-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: rev16 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v0.8b, v0.8b
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulr_v4i16_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll v1.4s, v1.4h, #0
; CHECK-AES-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-AES-NEXT: ushll2 v2.2d, v1.4s, #0
; CHECK-AES-NEXT: ushll2 v3.2d, v0.4s, #0
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v4.1q, v3.2d, v2.2d
; CHECK-AES-NEXT: pmull v2.1q, v3.1d, v2.1d
; CHECK-AES-NEXT: pmull2 v3.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v2.d[1], v4.d[0]
; CHECK-AES-NEXT: mov v0.d[1], v3.d[0]
; CHECK-AES-NEXT: uzp1 v0.4s, v0.4s, v2.4s
; CHECK-AES-NEXT: shrn v0.4h, v0.4s, #15
; CHECK-AES-NEXT: ret
%a.ext = zext <4 x i16> %a to <4 x i32>
%b.ext = zext <4 x i16> %b to <4 x i32>
%clmul = call <4 x i32> @llvm.clmul.v4i32(<4 x i32> %a.ext, <4 x i32> %b.ext)
%res.ext = lshr <4 x i32> %clmul, splat (i32 15)
%res = trunc <4 x i32> %res.ext to <4 x i16>
ret <4 x i16> %res
}
define <4 x i32> @clmulr_v4i32_neon(<4 x i32> %a, <4 x i32> %b) nounwind {
; CHECK-NEON-LABEL: clmulr_v4i32_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: rev32 v1.16b, v1.16b
; CHECK-NEON-NEXT: rev32 v0.16b, v0.16b
; CHECK-NEON-NEXT: rbit v1.16b, v1.16b
; CHECK-NEON-NEXT: rbit v2.16b, v0.16b
; CHECK-NEON-NEXT: xtn v0.4h, v1.4s
; CHECK-NEON-NEXT: xtn v3.4h, v2.4s
; CHECK-NEON-NEXT: shrn v16.4h, v2.4s, #16
; CHECK-NEON-NEXT: shrn v17.4h, v1.4s, #16
; CHECK-NEON-NEXT: xtn v20.8b, v16.8h
; CHECK-NEON-NEXT: shrn v16.8b, v16.8h, #8
; CHECK-NEON-NEXT: rev16 v4.8b, v0.8b
; CHECK-NEON-NEXT: rev16 v5.8b, v3.8b
; CHECK-NEON-NEXT: xtn v1.8b, v0.8h
; CHECK-NEON-NEXT: xtn v21.8b, v17.8h
; CHECK-NEON-NEXT: xtn v2.8b, v3.8h
; CHECK-NEON-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEON-NEXT: shrn v3.8b, v3.8h, #8
; CHECK-NEON-NEXT: shrn v17.8b, v17.8h, #8
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: rbit v5.8b, v5.8b
; CHECK-NEON-NEXT: rbit v22.8b, v1.8b
; CHECK-NEON-NEXT: rbit v23.8b, v21.8b
; CHECK-NEON-NEXT: rbit v24.8b, v2.8b
; CHECK-NEON-NEXT: pmul v16.8b, v16.8b, v1.8b
; CHECK-NEON-NEXT: pmul v25.8b, v20.8b, v0.8b
; CHECK-NEON-NEXT: pmul v17.8b, v2.8b, v17.8b
; CHECK-NEON-NEXT: pmul v0.8b, v2.8b, v0.8b
; CHECK-NEON-NEXT: xtn v6.8b, v4.8h
; CHECK-NEON-NEXT: xtn v7.8b, v5.8h
; CHECK-NEON-NEXT: shrn v5.8b, v5.8h, #8
; CHECK-NEON-NEXT: shrn v4.8b, v4.8h, #8
; CHECK-NEON-NEXT: pmul v23.8b, v24.8b, v23.8b
; CHECK-NEON-NEXT: rbit v18.8b, v6.8b
; CHECK-NEON-NEXT: rbit v19.8b, v7.8b
; CHECK-NEON-NEXT: pmul v5.8b, v5.8b, v6.8b
; CHECK-NEON-NEXT: pmul v4.8b, v7.8b, v4.8b
; CHECK-NEON-NEXT: pmul v6.8b, v7.8b, v6.8b
; CHECK-NEON-NEXT: rbit v7.8b, v23.8b
; CHECK-NEON-NEXT: pmul v18.8b, v19.8b, v18.8b
; CHECK-NEON-NEXT: rbit v19.8b, v20.8b
; CHECK-NEON-NEXT: eor v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: ushll v6.8h, v6.8b, #0
; CHECK-NEON-NEXT: ushr v7.8b, v7.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v18.8b
; CHECK-NEON-NEXT: pmul v19.8b, v19.8b, v22.8b
; CHECK-NEON-NEXT: ushr v5.8b, v18.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v19.8b
; CHECK-NEON-NEXT: pmul v19.8b, v3.8b, v21.8b
; CHECK-NEON-NEXT: pmul v3.8b, v3.8b, v1.8b
; CHECK-NEON-NEXT: eor v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: eor v5.8b, v25.8b, v16.8b
; CHECK-NEON-NEXT: eor v16.8b, v17.8b, v19.8b
; CHECK-NEON-NEXT: pmul v17.8b, v24.8b, v22.8b
; CHECK-NEON-NEXT: ushr v18.8b, v18.8b, #1
; CHECK-NEON-NEXT: eor v0.8b, v0.8b, v3.8b
; CHECK-NEON-NEXT: shll v4.8h, v4.8b, #8
; CHECK-NEON-NEXT: eor v5.8b, v18.8b, v5.8b
; CHECK-NEON-NEXT: pmul v18.8b, v20.8b, v1.8b
; CHECK-NEON-NEXT: eor v7.8b, v7.8b, v16.8b
; CHECK-NEON-NEXT: pmul v16.8b, v2.8b, v21.8b
; CHECK-NEON-NEXT: pmul v1.8b, v2.8b, v1.8b
; CHECK-NEON-NEXT: orr v4.16b, v6.16b, v4.16b
; CHECK-NEON-NEXT: rbit v6.8b, v17.8b
; CHECK-NEON-NEXT: shll v5.8h, v5.8b, #8
; CHECK-NEON-NEXT: shll v7.8h, v7.8b, #8
; CHECK-NEON-NEXT: ushll v17.8h, v18.8b, #0
; CHECK-NEON-NEXT: rev16 v4.8b, v4.8b
; CHECK-NEON-NEXT: ushll v16.8h, v16.8b, #0
; CHECK-NEON-NEXT: ushll v1.8h, v1.8b, #0
; CHECK-NEON-NEXT: ushr v3.8b, v6.8b, #1
; CHECK-NEON-NEXT: orr v5.16b, v17.16b, v5.16b
; CHECK-NEON-NEXT: orr v6.16b, v16.16b, v7.16b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: eor v0.8b, v3.8b, v0.8b
; CHECK-NEON-NEXT: eor v2.8b, v6.8b, v5.8b
; CHECK-NEON-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEON-NEXT: ushr v3.4h, v4.4h, #1
; CHECK-NEON-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: eor v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-NEON-NEXT: shll v1.4s, v2.4h, #16
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: rev32 v0.16b, v0.16b
; CHECK-NEON-NEXT: rbit v0.16b, v0.16b
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulr_v4i32_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: rev32 v1.16b, v1.16b
; CHECK-AES-NEXT: rev32 v0.16b, v0.16b
; CHECK-AES-NEXT: rbit v1.16b, v1.16b
; CHECK-AES-NEXT: rbit v0.16b, v0.16b
; CHECK-AES-NEXT: ushll2 v2.2d, v1.4s, #0
; CHECK-AES-NEXT: ushll2 v3.2d, v0.4s, #0
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v4.1q, v3.2d, v2.2d
; CHECK-AES-NEXT: pmull v2.1q, v3.1d, v2.1d
; CHECK-AES-NEXT: pmull2 v3.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v2.d[1], v4.d[0]
; CHECK-AES-NEXT: mov v0.d[1], v3.d[0]
; CHECK-AES-NEXT: uzp1 v0.4s, v0.4s, v2.4s
; CHECK-AES-NEXT: rev32 v0.16b, v0.16b
; CHECK-AES-NEXT: rbit v0.16b, v0.16b
; CHECK-AES-NEXT: ret
%a.ext = zext <4 x i32> %a to <4 x i64>
%b.ext = zext <4 x i32> %b to <4 x i64>
%clmul = call <4 x i64> @llvm.clmul.v4i64(<4 x i64> %a.ext, <4 x i64> %b.ext)
%res.ext = lshr <4 x i64> %clmul, splat (i64 31)
%res = trunc <4 x i64> %res.ext to <4 x i32>
ret <4 x i32> %res
}
define <2 x i32> @clmulr_v2i32_neon(<2 x i32> %a, <2 x i32> %b) nounwind {
; CHECK-NEON-LABEL: clmulr_v2i32_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: rev32 v1.8b, v1.8b
; CHECK-NEON-NEXT: rev32 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v1.8b, v1.8b
; CHECK-NEON-NEXT: rbit v2.8b, v0.8b
; CHECK-NEON-NEXT: xtn v0.4h, v1.4s
; CHECK-NEON-NEXT: xtn v3.4h, v2.4s
; CHECK-NEON-NEXT: shrn v16.4h, v2.4s, #16
; CHECK-NEON-NEXT: shrn v17.4h, v1.4s, #16
; CHECK-NEON-NEXT: xtn v20.8b, v16.8h
; CHECK-NEON-NEXT: shrn v16.8b, v16.8h, #8
; CHECK-NEON-NEXT: rev16 v4.8b, v0.8b
; CHECK-NEON-NEXT: rev16 v5.8b, v3.8b
; CHECK-NEON-NEXT: xtn v1.8b, v0.8h
; CHECK-NEON-NEXT: xtn v21.8b, v17.8h
; CHECK-NEON-NEXT: xtn v2.8b, v3.8h
; CHECK-NEON-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEON-NEXT: shrn v3.8b, v3.8h, #8
; CHECK-NEON-NEXT: shrn v17.8b, v17.8h, #8
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: rbit v5.8b, v5.8b
; CHECK-NEON-NEXT: rbit v22.8b, v1.8b
; CHECK-NEON-NEXT: rbit v23.8b, v21.8b
; CHECK-NEON-NEXT: rbit v24.8b, v2.8b
; CHECK-NEON-NEXT: pmul v16.8b, v16.8b, v1.8b
; CHECK-NEON-NEXT: pmul v25.8b, v20.8b, v0.8b
; CHECK-NEON-NEXT: pmul v17.8b, v2.8b, v17.8b
; CHECK-NEON-NEXT: pmul v0.8b, v2.8b, v0.8b
; CHECK-NEON-NEXT: xtn v6.8b, v4.8h
; CHECK-NEON-NEXT: xtn v7.8b, v5.8h
; CHECK-NEON-NEXT: shrn v5.8b, v5.8h, #8
; CHECK-NEON-NEXT: shrn v4.8b, v4.8h, #8
; CHECK-NEON-NEXT: pmul v23.8b, v24.8b, v23.8b
; CHECK-NEON-NEXT: rbit v18.8b, v6.8b
; CHECK-NEON-NEXT: rbit v19.8b, v7.8b
; CHECK-NEON-NEXT: pmul v5.8b, v5.8b, v6.8b
; CHECK-NEON-NEXT: pmul v4.8b, v7.8b, v4.8b
; CHECK-NEON-NEXT: pmul v6.8b, v7.8b, v6.8b
; CHECK-NEON-NEXT: rbit v7.8b, v23.8b
; CHECK-NEON-NEXT: pmul v18.8b, v19.8b, v18.8b
; CHECK-NEON-NEXT: rbit v19.8b, v20.8b
; CHECK-NEON-NEXT: eor v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: ushll v6.8h, v6.8b, #0
; CHECK-NEON-NEXT: ushr v7.8b, v7.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v18.8b
; CHECK-NEON-NEXT: pmul v19.8b, v19.8b, v22.8b
; CHECK-NEON-NEXT: ushr v5.8b, v18.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v19.8b
; CHECK-NEON-NEXT: pmul v19.8b, v3.8b, v21.8b
; CHECK-NEON-NEXT: pmul v3.8b, v3.8b, v1.8b
; CHECK-NEON-NEXT: eor v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: eor v5.8b, v25.8b, v16.8b
; CHECK-NEON-NEXT: eor v16.8b, v17.8b, v19.8b
; CHECK-NEON-NEXT: pmul v17.8b, v24.8b, v22.8b
; CHECK-NEON-NEXT: ushr v18.8b, v18.8b, #1
; CHECK-NEON-NEXT: eor v0.8b, v0.8b, v3.8b
; CHECK-NEON-NEXT: shll v4.8h, v4.8b, #8
; CHECK-NEON-NEXT: eor v5.8b, v18.8b, v5.8b
; CHECK-NEON-NEXT: pmul v18.8b, v20.8b, v1.8b
; CHECK-NEON-NEXT: eor v7.8b, v7.8b, v16.8b
; CHECK-NEON-NEXT: pmul v16.8b, v2.8b, v21.8b
; CHECK-NEON-NEXT: pmul v1.8b, v2.8b, v1.8b
; CHECK-NEON-NEXT: orr v4.16b, v6.16b, v4.16b
; CHECK-NEON-NEXT: rbit v6.8b, v17.8b
; CHECK-NEON-NEXT: shll v5.8h, v5.8b, #8
; CHECK-NEON-NEXT: shll v7.8h, v7.8b, #8
; CHECK-NEON-NEXT: ushll v17.8h, v18.8b, #0
; CHECK-NEON-NEXT: rev16 v4.8b, v4.8b
; CHECK-NEON-NEXT: ushll v16.8h, v16.8b, #0
; CHECK-NEON-NEXT: ushll v1.8h, v1.8b, #0
; CHECK-NEON-NEXT: ushr v3.8b, v6.8b, #1
; CHECK-NEON-NEXT: orr v5.16b, v17.16b, v5.16b
; CHECK-NEON-NEXT: orr v6.16b, v16.16b, v7.16b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: eor v0.8b, v3.8b, v0.8b
; CHECK-NEON-NEXT: eor v2.8b, v6.8b, v5.8b
; CHECK-NEON-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEON-NEXT: ushr v3.4h, v4.4h, #1
; CHECK-NEON-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: eor v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-NEON-NEXT: shll v1.4s, v2.4h, #16
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: rev32 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v0.8b, v0.8b
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulr_v2i32_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v2.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v0.d[1], v2.d[0]
; CHECK-AES-NEXT: shrn v0.2s, v0.2d, #31
; CHECK-AES-NEXT: ret
%a.ext = zext <2 x i32> %a to <2 x i64>
%b.ext = zext <2 x i32> %b to <2 x i64>
%clmul = call <2 x i64> @llvm.clmul.v2i64(<2 x i64> %a.ext, <2 x i64> %b.ext)
%res.ext = lshr <2 x i64> %clmul, splat (i64 31)
%res = trunc <2 x i64> %res.ext to <2 x i32>
ret <2 x i32> %res
}
define <2 x i64> @clmulr_v2i64_neon(<2 x i64> %a, <2 x i64> %b) nounwind {
; CHECK-NEON-LABEL: clmulr_v2i64_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: sub sp, sp, #112
; CHECK-NEON-NEXT: rev64 v2.16b, v1.16b
; CHECK-NEON-NEXT: rev64 v3.16b, v0.16b
; CHECK-NEON-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill
; CHECK-NEON-NEXT: movi v0.16b, #17
; CHECK-NEON-NEXT: movi v1.16b, #34
; CHECK-NEON-NEXT: stp x26, x25, [sp, #48] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x24, x23, [sp, #64] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEON-NEXT: rbit v4.16b, v2.16b
; CHECK-NEON-NEXT: rbit v5.16b, v3.16b
; CHECK-NEON-NEXT: movi v2.16b, #136
; CHECK-NEON-NEXT: movi v3.16b, #68
; CHECK-NEON-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x28, x27, [sp, #32] // 16-byte Folded Spill
; CHECK-NEON-NEXT: and v6.16b, v4.16b, v0.16b
; CHECK-NEON-NEXT: and v7.16b, v5.16b, v1.16b
; CHECK-NEON-NEXT: and v16.16b, v4.16b, v1.16b
; CHECK-NEON-NEXT: and v17.16b, v5.16b, v0.16b
; CHECK-NEON-NEXT: and v18.16b, v4.16b, v2.16b
; CHECK-NEON-NEXT: and v19.16b, v5.16b, v3.16b
; CHECK-NEON-NEXT: and v4.16b, v4.16b, v3.16b
; CHECK-NEON-NEXT: and v5.16b, v5.16b, v2.16b
; CHECK-NEON-NEXT: fmov x10, d6
; CHECK-NEON-NEXT: fmov x3, d7
; CHECK-NEON-NEXT: fmov x15, d16
; CHECK-NEON-NEXT: fmov x14, d17
; CHECK-NEON-NEXT: fmov x6, d18
; CHECK-NEON-NEXT: fmov x20, d19
; CHECK-NEON-NEXT: mov x12, v6.d[1]
; CHECK-NEON-NEXT: mov x17, v17.d[1]
; CHECK-NEON-NEXT: mov x16, v18.d[1]
; CHECK-NEON-NEXT: mul x9, x3, x10
; CHECK-NEON-NEXT: mov x25, v19.d[1]
; CHECK-NEON-NEXT: fmov x29, d4
; CHECK-NEON-NEXT: fmov x19, d5
; CHECK-NEON-NEXT: mov x1, v7.d[1]
; CHECK-NEON-NEXT: mov x4, v16.d[1]
; CHECK-NEON-NEXT: mul x8, x14, x15
; CHECK-NEON-NEXT: mov x21, v4.d[1]
; CHECK-NEON-NEXT: mov x11, v5.d[1]
; CHECK-NEON-NEXT: mul x13, x20, x6
; CHECK-NEON-NEXT: mul x23, x14, x10
; CHECK-NEON-NEXT: stp x8, x9, [sp] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x8, x25, x16
; CHECK-NEON-NEXT: ldp d5, d4, [sp] // 16-byte Folded Reload
; CHECK-NEON-NEXT: fmov d6, x13
; CHECK-NEON-NEXT: mul x9, x17, x12
; CHECK-NEON-NEXT: fmov d17, x23
; CHECK-NEON-NEXT: mul x18, x19, x29
; CHECK-NEON-NEXT: mov v6.d[1], x8
; CHECK-NEON-NEXT: mul x22, x3, x6
; CHECK-NEON-NEXT: mov v17.d[1], x9
; CHECK-NEON-NEXT: mul x27, x20, x29
; CHECK-NEON-NEXT: fmov d7, x18
; CHECK-NEON-NEXT: mul x28, x19, x15
; CHECK-NEON-NEXT: fmov d16, x22
; CHECK-NEON-NEXT: mul x30, x3, x15
; CHECK-NEON-NEXT: fmov d18, x27
; CHECK-NEON-NEXT: mul x3, x3, x29
; CHECK-NEON-NEXT: fmov d19, x28
; CHECK-NEON-NEXT: ldp x28, x27, [sp, #32] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x29, x14, x29
; CHECK-NEON-NEXT: fmov d20, x30
; CHECK-NEON-NEXT: mul x15, x20, x15
; CHECK-NEON-NEXT: fmov d24, x3
; CHECK-NEON-NEXT: mul x20, x20, x10
; CHECK-NEON-NEXT: fmov d21, x29
; CHECK-NEON-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x14, x14, x6
; CHECK-NEON-NEXT: fmov d26, x15
; CHECK-NEON-NEXT: mul x6, x19, x6
; CHECK-NEON-NEXT: fmov d22, x20
; CHECK-NEON-NEXT: mul x10, x19, x10
; CHECK-NEON-NEXT: fmov d25, x14
; CHECK-NEON-NEXT: mul x2, x1, x12
; CHECK-NEON-NEXT: fmov d23, x6
; CHECK-NEON-NEXT: mul x5, x17, x4
; CHECK-NEON-NEXT: fmov d27, x10
; CHECK-NEON-NEXT: mul x0, x11, x21
; CHECK-NEON-NEXT: mov v4.d[1], x2
; CHECK-NEON-NEXT: mul x7, x1, x16
; CHECK-NEON-NEXT: mov v5.d[1], x5
; CHECK-NEON-NEXT: mul x24, x25, x21
; CHECK-NEON-NEXT: mov v7.d[1], x0
; CHECK-NEON-NEXT: mul x26, x11, x4
; CHECK-NEON-NEXT: mov v16.d[1], x7
; CHECK-NEON-NEXT: eor v4.16b, v5.16b, v4.16b
; CHECK-NEON-NEXT: mul x19, x1, x4
; CHECK-NEON-NEXT: mov v18.d[1], x24
; CHECK-NEON-NEXT: eor v5.16b, v6.16b, v7.16b
; CHECK-NEON-NEXT: mul x1, x1, x21
; CHECK-NEON-NEXT: ldp x24, x23, [sp, #64] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mov v19.d[1], x26
; CHECK-NEON-NEXT: eor v6.16b, v17.16b, v16.16b
; CHECK-NEON-NEXT: mul x21, x17, x21
; CHECK-NEON-NEXT: eor v4.16b, v4.16b, v5.16b
; CHECK-NEON-NEXT: mov v20.d[1], x19
; CHECK-NEON-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x4, x25, x4
; CHECK-NEON-NEXT: mov v24.d[1], x1
; CHECK-NEON-NEXT: eor v7.16b, v18.16b, v19.16b
; CHECK-NEON-NEXT: and v1.16b, v4.16b, v1.16b
; CHECK-NEON-NEXT: mul x25, x25, x12
; CHECK-NEON-NEXT: mov v21.d[1], x21
; CHECK-NEON-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x13, x17, x16
; CHECK-NEON-NEXT: eor v5.16b, v6.16b, v7.16b
; CHECK-NEON-NEXT: mov v26.d[1], x4
; CHECK-NEON-NEXT: mul x8, x11, x16
; CHECK-NEON-NEXT: mov v22.d[1], x25
; CHECK-NEON-NEXT: eor v16.16b, v21.16b, v20.16b
; CHECK-NEON-NEXT: and v0.16b, v5.16b, v0.16b
; CHECK-NEON-NEXT: mul x9, x11, x12
; CHECK-NEON-NEXT: ldp x26, x25, [sp, #48] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mov v25.d[1], x13
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: mov v23.d[1], x8
; CHECK-NEON-NEXT: mov v27.d[1], x9
; CHECK-NEON-NEXT: eor v18.16b, v25.16b, v24.16b
; CHECK-NEON-NEXT: eor v17.16b, v22.16b, v23.16b
; CHECK-NEON-NEXT: eor v19.16b, v26.16b, v27.16b
; CHECK-NEON-NEXT: eor v6.16b, v16.16b, v17.16b
; CHECK-NEON-NEXT: eor v7.16b, v18.16b, v19.16b
; CHECK-NEON-NEXT: and v3.16b, v6.16b, v3.16b
; CHECK-NEON-NEXT: and v2.16b, v7.16b, v2.16b
; CHECK-NEON-NEXT: orr v1.16b, v3.16b, v2.16b
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: rev64 v0.16b, v0.16b
; CHECK-NEON-NEXT: rbit v0.16b, v0.16b
; CHECK-NEON-NEXT: add sp, sp, #112
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulr_v2i64_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: pmull2 v2.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: zip2 v1.2d, v0.2d, v2.2d
; CHECK-AES-NEXT: mov v3.16b, v0.16b
; CHECK-AES-NEXT: mov v3.d[1], v2.d[0]
; CHECK-AES-NEXT: add v0.2d, v1.2d, v1.2d
; CHECK-AES-NEXT: usra v0.2d, v3.2d, #63
; CHECK-AES-NEXT: ret
%a.ext = zext <2 x i64> %a to <2 x i128>
%b.ext = zext <2 x i64> %b to <2 x i128>
%clmul = call <2 x i128> @llvm.clmul.v2i128(<2 x i128> %a.ext, <2 x i128> %b.ext)
%res.ext = lshr <2 x i128> %clmul, splat (i128 63)
%res = trunc <2 x i128> %res.ext to <2 x i64>
ret <2 x i64> %res
}
define <1 x i64> @clmulr_v1i64_neon(<1 x i64> %a, <1 x i64> %b) nounwind {
; CHECK-NEON-LABEL: clmulr_v1i64_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: rev64 v2.8b, v1.8b
; CHECK-NEON-NEXT: rev64 v3.8b, v0.8b
; CHECK-NEON-NEXT: movi v0.8b, #17
; CHECK-NEON-NEXT: movi v1.8b, #34
; CHECK-NEON-NEXT: rbit v4.8b, v2.8b
; CHECK-NEON-NEXT: rbit v5.8b, v3.8b
; CHECK-NEON-NEXT: movi v2.8b, #136
; CHECK-NEON-NEXT: movi v3.8b, #68
; CHECK-NEON-NEXT: and v6.8b, v4.8b, v0.8b
; CHECK-NEON-NEXT: and v7.8b, v5.8b, v1.8b
; CHECK-NEON-NEXT: and v16.8b, v4.8b, v1.8b
; CHECK-NEON-NEXT: and v17.8b, v5.8b, v0.8b
; CHECK-NEON-NEXT: fmov x8, d6
; CHECK-NEON-NEXT: fmov x9, d7
; CHECK-NEON-NEXT: and v6.8b, v4.8b, v2.8b
; CHECK-NEON-NEXT: and v7.8b, v5.8b, v3.8b
; CHECK-NEON-NEXT: and v4.8b, v4.8b, v3.8b
; CHECK-NEON-NEXT: and v5.8b, v5.8b, v2.8b
; CHECK-NEON-NEXT: fmov x11, d16
; CHECK-NEON-NEXT: fmov x12, d17
; CHECK-NEON-NEXT: fmov x14, d6
; CHECK-NEON-NEXT: mul x10, x9, x8
; CHECK-NEON-NEXT: fmov x15, d7
; CHECK-NEON-NEXT: fmov x17, d4
; CHECK-NEON-NEXT: fmov x18, d5
; CHECK-NEON-NEXT: mul x13, x12, x11
; CHECK-NEON-NEXT: mul x16, x15, x14
; CHECK-NEON-NEXT: fmov d4, x10
; CHECK-NEON-NEXT: mul x0, x18, x17
; CHECK-NEON-NEXT: fmov d5, x13
; CHECK-NEON-NEXT: mul x1, x9, x14
; CHECK-NEON-NEXT: fmov d6, x16
; CHECK-NEON-NEXT: mul x2, x12, x8
; CHECK-NEON-NEXT: eor v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: fmov d7, x0
; CHECK-NEON-NEXT: mul x3, x15, x17
; CHECK-NEON-NEXT: fmov d16, x1
; CHECK-NEON-NEXT: mul x4, x18, x11
; CHECK-NEON-NEXT: eor v5.8b, v6.8b, v7.8b
; CHECK-NEON-NEXT: fmov d17, x2
; CHECK-NEON-NEXT: mul x5, x9, x11
; CHECK-NEON-NEXT: fmov d18, x3
; CHECK-NEON-NEXT: eor v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: mul x9, x9, x17
; CHECK-NEON-NEXT: eor v16.8b, v17.8b, v16.8b
; CHECK-NEON-NEXT: fmov d6, x4
; CHECK-NEON-NEXT: mul x17, x12, x17
; CHECK-NEON-NEXT: and v1.8b, v4.8b, v1.8b
; CHECK-NEON-NEXT: fmov d7, x5
; CHECK-NEON-NEXT: mul x11, x15, x11
; CHECK-NEON-NEXT: eor v6.8b, v18.8b, v6.8b
; CHECK-NEON-NEXT: mul x15, x15, x8
; CHECK-NEON-NEXT: fmov d19, x17
; CHECK-NEON-NEXT: eor v5.8b, v16.8b, v6.8b
; CHECK-NEON-NEXT: mul x12, x12, x14
; CHECK-NEON-NEXT: fmov d21, x11
; CHECK-NEON-NEXT: mul x10, x18, x14
; CHECK-NEON-NEXT: eor v7.8b, v19.8b, v7.8b
; CHECK-NEON-NEXT: fmov d19, x9
; CHECK-NEON-NEXT: fmov d17, x15
; CHECK-NEON-NEXT: and v0.8b, v5.8b, v0.8b
; CHECK-NEON-NEXT: mul x8, x18, x8
; CHECK-NEON-NEXT: fmov d20, x12
; CHECK-NEON-NEXT: orr v0.8b, v0.8b, v1.8b
; CHECK-NEON-NEXT: fmov d18, x10
; CHECK-NEON-NEXT: fmov d22, x8
; CHECK-NEON-NEXT: eor v17.8b, v17.8b, v18.8b
; CHECK-NEON-NEXT: eor v18.8b, v20.8b, v19.8b
; CHECK-NEON-NEXT: eor v19.8b, v21.8b, v22.8b
; CHECK-NEON-NEXT: eor v6.8b, v7.8b, v17.8b
; CHECK-NEON-NEXT: eor v7.8b, v18.8b, v19.8b
; CHECK-NEON-NEXT: and v3.8b, v6.8b, v3.8b
; CHECK-NEON-NEXT: and v2.8b, v7.8b, v2.8b
; CHECK-NEON-NEXT: orr v1.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: orr v0.8b, v0.8b, v1.8b
; CHECK-NEON-NEXT: rev64 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v0.8b, v0.8b
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulr_v1i64_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: pmull v1.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: ext v0.16b, v1.16b, v1.16b, #8
; CHECK-AES-NEXT: shl d0, d0, #1
; CHECK-AES-NEXT: usra d0, d1, #63
; CHECK-AES-NEXT: ret
%a.ext = zext <1 x i64> %a to <1 x i128>
%b.ext = zext <1 x i64> %b to <1 x i128>
%clmul = call <1 x i128> @llvm.clmul.v2i128(<1 x i128> %a.ext, <1 x i128> %b.ext)
%res.ext = lshr <1 x i128> %clmul, splat (i128 63)
%res = trunc <1 x i128> %res.ext to <1 x i64>
ret <1 x i64> %res
}
define <16 x i8> @clmulh_v16i8_neon(<16 x i8> %a, <16 x i8> %b) nounwind {
; CHECK-LABEL: clmulh_v16i8_neon:
; CHECK: // %bb.0:
; CHECK-NEXT: rbit v1.16b, v1.16b
; CHECK-NEXT: rbit v0.16b, v0.16b
; CHECK-NEXT: pmul v0.16b, v0.16b, v1.16b
; CHECK-NEXT: rbit v0.16b, v0.16b
; CHECK-NEXT: ushr v0.16b, v0.16b, #1
; CHECK-NEXT: ret
%a.ext = zext <16 x i8> %a to <16 x i16>
%b.ext = zext <16 x i8> %b to <16 x i16>
%clmul = call <16 x i16> @llvm.clmul.v16i16(<16 x i16> %a.ext, <16 x i16> %b.ext)
%res.ext = lshr <16 x i16> %clmul, splat (i16 8)
%res = trunc <16 x i16> %res.ext to <16 x i8>
ret <16 x i8> %res
}
define <8 x i8> @clmulh_v8i8_neon(<8 x i8> %a, <8 x i8> %b) nounwind {
; CHECK-LABEL: clmulh_v8i8_neon:
; CHECK: // %bb.0:
; CHECK-NEXT: rbit v1.8b, v1.8b
; CHECK-NEXT: rbit v0.8b, v0.8b
; CHECK-NEXT: pmul v0.8b, v0.8b, v1.8b
; CHECK-NEXT: rbit v0.8b, v0.8b
; CHECK-NEXT: ushr v0.8b, v0.8b, #1
; CHECK-NEXT: ret
%a.ext = zext <8 x i8> %a to <8 x i16>
%b.ext = zext <8 x i8> %b to <8 x i16>
%clmul = call <8 x i16> @llvm.clmul.v16i16(<8 x i16> %a.ext, <8 x i16> %b.ext)
%res.ext = lshr <8 x i16> %clmul, splat (i16 8)
%res = trunc <8 x i16> %res.ext to <8 x i8>
ret <8 x i8> %res
}
define <8 x i16> @clmulh_v8i16_neon(<8 x i16> %a, <8 x i16> %b) nounwind {
; CHECK-LABEL: clmulh_v8i16_neon:
; CHECK: // %bb.0:
; CHECK-NEXT: rev16 v1.16b, v1.16b
; CHECK-NEXT: rev16 v0.16b, v0.16b
; CHECK-NEXT: rbit v1.16b, v1.16b
; CHECK-NEXT: rbit v0.16b, v0.16b
; CHECK-NEXT: xtn v2.8b, v1.8h
; CHECK-NEXT: xtn v3.8b, v0.8h
; CHECK-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEXT: shrn v1.8b, v1.8h, #8
; CHECK-NEXT: rbit v4.8b, v2.8b
; CHECK-NEXT: rbit v5.8b, v3.8b
; CHECK-NEXT: pmul v0.8b, v0.8b, v2.8b
; CHECK-NEXT: pmul v1.8b, v3.8b, v1.8b
; CHECK-NEXT: pmul v2.8b, v3.8b, v2.8b
; CHECK-NEXT: pmul v4.8b, v5.8b, v4.8b
; CHECK-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEXT: rbit v4.8b, v4.8b
; CHECK-NEXT: ushr v1.8b, v4.8b, #1
; CHECK-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEXT: ushll v1.8h, v2.8b, #0
; CHECK-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEXT: rev16 v0.16b, v0.16b
; CHECK-NEXT: rbit v0.16b, v0.16b
; CHECK-NEXT: ushr v0.8h, v0.8h, #1
; CHECK-NEXT: ret
%a.ext = zext <8 x i16> %a to <8 x i32>
%b.ext = zext <8 x i16> %b to <8 x i32>
%clmul = call <8 x i32> @llvm.clmul.v8i32(<8 x i32> %a.ext, <8 x i32> %b.ext)
%res.ext = lshr <8 x i32> %clmul, splat (i32 16)
%res = trunc <8 x i32> %res.ext to <8 x i16>
ret <8 x i16> %res
}
define <4 x i16> @clmulh_v4i16_neon(<4 x i16> %a, <4 x i16> %b) nounwind {
; CHECK-NEON-LABEL: clmulh_v4i16_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: rev16 v1.8b, v1.8b
; CHECK-NEON-NEXT: rev16 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v1.8b, v1.8b
; CHECK-NEON-NEXT: rbit v0.8b, v0.8b
; CHECK-NEON-NEXT: xtn v2.8b, v1.8h
; CHECK-NEON-NEXT: xtn v3.8b, v0.8h
; CHECK-NEON-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEON-NEXT: shrn v1.8b, v1.8h, #8
; CHECK-NEON-NEXT: rbit v4.8b, v2.8b
; CHECK-NEON-NEXT: rbit v5.8b, v3.8b
; CHECK-NEON-NEXT: pmul v0.8b, v0.8b, v2.8b
; CHECK-NEON-NEXT: pmul v1.8b, v3.8b, v1.8b
; CHECK-NEON-NEXT: pmul v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: pmul v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: ushr v1.8b, v4.8b, #1
; CHECK-NEON-NEXT: eor v0.8b, v1.8b, v0.8b
; CHECK-NEON-NEXT: ushll v1.8h, v2.8b, #0
; CHECK-NEON-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEON-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: rev16 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v0.8b, v0.8b
; CHECK-NEON-NEXT: ushr v0.4h, v0.4h, #1
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulh_v4i16_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll v1.4s, v1.4h, #0
; CHECK-AES-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-AES-NEXT: ushll2 v2.2d, v1.4s, #0
; CHECK-AES-NEXT: ushll2 v3.2d, v0.4s, #0
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v4.1q, v3.2d, v2.2d
; CHECK-AES-NEXT: pmull v2.1q, v3.1d, v2.1d
; CHECK-AES-NEXT: pmull2 v3.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v2.d[1], v4.d[0]
; CHECK-AES-NEXT: mov v0.d[1], v3.d[0]
; CHECK-AES-NEXT: uzp1 v0.4s, v0.4s, v2.4s
; CHECK-AES-NEXT: shrn v0.4h, v0.4s, #16
; CHECK-AES-NEXT: ret
%a.ext = zext <4 x i16> %a to <4 x i32>
%b.ext = zext <4 x i16> %b to <4 x i32>
%clmul = call <4 x i32> @llvm.clmul.v4i32(<4 x i32> %a.ext, <4 x i32> %b.ext)
%res.ext = lshr <4 x i32> %clmul, splat (i32 16)
%res = trunc <4 x i32> %res.ext to <4 x i16>
ret <4 x i16> %res
}
define <4 x i32> @clmulh_v4i32_neon(<4 x i32> %a, <4 x i32> %b) nounwind {
; CHECK-NEON-LABEL: clmulh_v4i32_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: rev32 v1.16b, v1.16b
; CHECK-NEON-NEXT: rev32 v0.16b, v0.16b
; CHECK-NEON-NEXT: rbit v1.16b, v1.16b
; CHECK-NEON-NEXT: rbit v2.16b, v0.16b
; CHECK-NEON-NEXT: xtn v0.4h, v1.4s
; CHECK-NEON-NEXT: xtn v3.4h, v2.4s
; CHECK-NEON-NEXT: shrn v16.4h, v2.4s, #16
; CHECK-NEON-NEXT: shrn v17.4h, v1.4s, #16
; CHECK-NEON-NEXT: xtn v20.8b, v16.8h
; CHECK-NEON-NEXT: shrn v16.8b, v16.8h, #8
; CHECK-NEON-NEXT: rev16 v4.8b, v0.8b
; CHECK-NEON-NEXT: rev16 v5.8b, v3.8b
; CHECK-NEON-NEXT: xtn v1.8b, v0.8h
; CHECK-NEON-NEXT: xtn v21.8b, v17.8h
; CHECK-NEON-NEXT: xtn v2.8b, v3.8h
; CHECK-NEON-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEON-NEXT: shrn v3.8b, v3.8h, #8
; CHECK-NEON-NEXT: shrn v17.8b, v17.8h, #8
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: rbit v5.8b, v5.8b
; CHECK-NEON-NEXT: rbit v22.8b, v1.8b
; CHECK-NEON-NEXT: rbit v23.8b, v21.8b
; CHECK-NEON-NEXT: rbit v24.8b, v2.8b
; CHECK-NEON-NEXT: pmul v16.8b, v16.8b, v1.8b
; CHECK-NEON-NEXT: pmul v25.8b, v20.8b, v0.8b
; CHECK-NEON-NEXT: pmul v17.8b, v2.8b, v17.8b
; CHECK-NEON-NEXT: pmul v0.8b, v2.8b, v0.8b
; CHECK-NEON-NEXT: xtn v6.8b, v4.8h
; CHECK-NEON-NEXT: xtn v7.8b, v5.8h
; CHECK-NEON-NEXT: shrn v5.8b, v5.8h, #8
; CHECK-NEON-NEXT: shrn v4.8b, v4.8h, #8
; CHECK-NEON-NEXT: pmul v23.8b, v24.8b, v23.8b
; CHECK-NEON-NEXT: rbit v18.8b, v6.8b
; CHECK-NEON-NEXT: rbit v19.8b, v7.8b
; CHECK-NEON-NEXT: pmul v5.8b, v5.8b, v6.8b
; CHECK-NEON-NEXT: pmul v4.8b, v7.8b, v4.8b
; CHECK-NEON-NEXT: pmul v6.8b, v7.8b, v6.8b
; CHECK-NEON-NEXT: rbit v7.8b, v23.8b
; CHECK-NEON-NEXT: pmul v18.8b, v19.8b, v18.8b
; CHECK-NEON-NEXT: rbit v19.8b, v20.8b
; CHECK-NEON-NEXT: eor v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: ushll v6.8h, v6.8b, #0
; CHECK-NEON-NEXT: ushr v7.8b, v7.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v18.8b
; CHECK-NEON-NEXT: pmul v19.8b, v19.8b, v22.8b
; CHECK-NEON-NEXT: ushr v5.8b, v18.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v19.8b
; CHECK-NEON-NEXT: pmul v19.8b, v3.8b, v21.8b
; CHECK-NEON-NEXT: pmul v3.8b, v3.8b, v1.8b
; CHECK-NEON-NEXT: eor v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: eor v5.8b, v25.8b, v16.8b
; CHECK-NEON-NEXT: eor v16.8b, v17.8b, v19.8b
; CHECK-NEON-NEXT: pmul v17.8b, v24.8b, v22.8b
; CHECK-NEON-NEXT: ushr v18.8b, v18.8b, #1
; CHECK-NEON-NEXT: eor v0.8b, v0.8b, v3.8b
; CHECK-NEON-NEXT: shll v4.8h, v4.8b, #8
; CHECK-NEON-NEXT: eor v5.8b, v18.8b, v5.8b
; CHECK-NEON-NEXT: pmul v18.8b, v20.8b, v1.8b
; CHECK-NEON-NEXT: eor v7.8b, v7.8b, v16.8b
; CHECK-NEON-NEXT: pmul v16.8b, v2.8b, v21.8b
; CHECK-NEON-NEXT: pmul v1.8b, v2.8b, v1.8b
; CHECK-NEON-NEXT: orr v4.16b, v6.16b, v4.16b
; CHECK-NEON-NEXT: rbit v6.8b, v17.8b
; CHECK-NEON-NEXT: shll v5.8h, v5.8b, #8
; CHECK-NEON-NEXT: shll v7.8h, v7.8b, #8
; CHECK-NEON-NEXT: ushll v17.8h, v18.8b, #0
; CHECK-NEON-NEXT: rev16 v4.8b, v4.8b
; CHECK-NEON-NEXT: ushll v16.8h, v16.8b, #0
; CHECK-NEON-NEXT: ushll v1.8h, v1.8b, #0
; CHECK-NEON-NEXT: ushr v3.8b, v6.8b, #1
; CHECK-NEON-NEXT: orr v5.16b, v17.16b, v5.16b
; CHECK-NEON-NEXT: orr v6.16b, v16.16b, v7.16b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: eor v0.8b, v3.8b, v0.8b
; CHECK-NEON-NEXT: eor v2.8b, v6.8b, v5.8b
; CHECK-NEON-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEON-NEXT: ushr v3.4h, v4.4h, #1
; CHECK-NEON-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: eor v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-NEON-NEXT: shll v1.4s, v2.4h, #16
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: rev32 v0.16b, v0.16b
; CHECK-NEON-NEXT: rbit v0.16b, v0.16b
; CHECK-NEON-NEXT: ushr v0.4s, v0.4s, #1
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulh_v4i32_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: rev32 v1.16b, v1.16b
; CHECK-AES-NEXT: rev32 v0.16b, v0.16b
; CHECK-AES-NEXT: rbit v1.16b, v1.16b
; CHECK-AES-NEXT: rbit v0.16b, v0.16b
; CHECK-AES-NEXT: ushll2 v2.2d, v1.4s, #0
; CHECK-AES-NEXT: ushll2 v3.2d, v0.4s, #0
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v4.1q, v3.2d, v2.2d
; CHECK-AES-NEXT: pmull v2.1q, v3.1d, v2.1d
; CHECK-AES-NEXT: pmull2 v3.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v2.d[1], v4.d[0]
; CHECK-AES-NEXT: mov v0.d[1], v3.d[0]
; CHECK-AES-NEXT: uzp1 v0.4s, v0.4s, v2.4s
; CHECK-AES-NEXT: rev32 v0.16b, v0.16b
; CHECK-AES-NEXT: rbit v0.16b, v0.16b
; CHECK-AES-NEXT: ushr v0.4s, v0.4s, #1
; CHECK-AES-NEXT: ret
%a.ext = zext <4 x i32> %a to <4 x i64>
%b.ext = zext <4 x i32> %b to <4 x i64>
%clmul = call <4 x i64> @llvm.clmul.v4i64(<4 x i64> %a.ext, <4 x i64> %b.ext)
%res.ext = lshr <4 x i64> %clmul, splat (i64 32)
%res = trunc <4 x i64> %res.ext to <4 x i32>
ret <4 x i32> %res
}
define <2 x i32> @clmulh_v2i32_neon(<2 x i32> %a, <2 x i32> %b) nounwind {
; CHECK-NEON-LABEL: clmulh_v2i32_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: rev32 v1.8b, v1.8b
; CHECK-NEON-NEXT: rev32 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v1.8b, v1.8b
; CHECK-NEON-NEXT: rbit v2.8b, v0.8b
; CHECK-NEON-NEXT: xtn v0.4h, v1.4s
; CHECK-NEON-NEXT: xtn v3.4h, v2.4s
; CHECK-NEON-NEXT: shrn v16.4h, v2.4s, #16
; CHECK-NEON-NEXT: shrn v17.4h, v1.4s, #16
; CHECK-NEON-NEXT: xtn v20.8b, v16.8h
; CHECK-NEON-NEXT: shrn v16.8b, v16.8h, #8
; CHECK-NEON-NEXT: rev16 v4.8b, v0.8b
; CHECK-NEON-NEXT: rev16 v5.8b, v3.8b
; CHECK-NEON-NEXT: xtn v1.8b, v0.8h
; CHECK-NEON-NEXT: xtn v21.8b, v17.8h
; CHECK-NEON-NEXT: xtn v2.8b, v3.8h
; CHECK-NEON-NEXT: shrn v0.8b, v0.8h, #8
; CHECK-NEON-NEXT: shrn v3.8b, v3.8h, #8
; CHECK-NEON-NEXT: shrn v17.8b, v17.8h, #8
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: rbit v5.8b, v5.8b
; CHECK-NEON-NEXT: rbit v22.8b, v1.8b
; CHECK-NEON-NEXT: rbit v23.8b, v21.8b
; CHECK-NEON-NEXT: rbit v24.8b, v2.8b
; CHECK-NEON-NEXT: pmul v16.8b, v16.8b, v1.8b
; CHECK-NEON-NEXT: pmul v25.8b, v20.8b, v0.8b
; CHECK-NEON-NEXT: pmul v17.8b, v2.8b, v17.8b
; CHECK-NEON-NEXT: pmul v0.8b, v2.8b, v0.8b
; CHECK-NEON-NEXT: xtn v6.8b, v4.8h
; CHECK-NEON-NEXT: xtn v7.8b, v5.8h
; CHECK-NEON-NEXT: shrn v5.8b, v5.8h, #8
; CHECK-NEON-NEXT: shrn v4.8b, v4.8h, #8
; CHECK-NEON-NEXT: pmul v23.8b, v24.8b, v23.8b
; CHECK-NEON-NEXT: rbit v18.8b, v6.8b
; CHECK-NEON-NEXT: rbit v19.8b, v7.8b
; CHECK-NEON-NEXT: pmul v5.8b, v5.8b, v6.8b
; CHECK-NEON-NEXT: pmul v4.8b, v7.8b, v4.8b
; CHECK-NEON-NEXT: pmul v6.8b, v7.8b, v6.8b
; CHECK-NEON-NEXT: rbit v7.8b, v23.8b
; CHECK-NEON-NEXT: pmul v18.8b, v19.8b, v18.8b
; CHECK-NEON-NEXT: rbit v19.8b, v20.8b
; CHECK-NEON-NEXT: eor v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: ushll v6.8h, v6.8b, #0
; CHECK-NEON-NEXT: ushr v7.8b, v7.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v18.8b
; CHECK-NEON-NEXT: pmul v19.8b, v19.8b, v22.8b
; CHECK-NEON-NEXT: ushr v5.8b, v18.8b, #1
; CHECK-NEON-NEXT: rbit v18.8b, v19.8b
; CHECK-NEON-NEXT: pmul v19.8b, v3.8b, v21.8b
; CHECK-NEON-NEXT: pmul v3.8b, v3.8b, v1.8b
; CHECK-NEON-NEXT: eor v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: eor v5.8b, v25.8b, v16.8b
; CHECK-NEON-NEXT: eor v16.8b, v17.8b, v19.8b
; CHECK-NEON-NEXT: pmul v17.8b, v24.8b, v22.8b
; CHECK-NEON-NEXT: ushr v18.8b, v18.8b, #1
; CHECK-NEON-NEXT: eor v0.8b, v0.8b, v3.8b
; CHECK-NEON-NEXT: shll v4.8h, v4.8b, #8
; CHECK-NEON-NEXT: eor v5.8b, v18.8b, v5.8b
; CHECK-NEON-NEXT: pmul v18.8b, v20.8b, v1.8b
; CHECK-NEON-NEXT: eor v7.8b, v7.8b, v16.8b
; CHECK-NEON-NEXT: pmul v16.8b, v2.8b, v21.8b
; CHECK-NEON-NEXT: pmul v1.8b, v2.8b, v1.8b
; CHECK-NEON-NEXT: orr v4.16b, v6.16b, v4.16b
; CHECK-NEON-NEXT: rbit v6.8b, v17.8b
; CHECK-NEON-NEXT: shll v5.8h, v5.8b, #8
; CHECK-NEON-NEXT: shll v7.8h, v7.8b, #8
; CHECK-NEON-NEXT: ushll v17.8h, v18.8b, #0
; CHECK-NEON-NEXT: rev16 v4.8b, v4.8b
; CHECK-NEON-NEXT: ushll v16.8h, v16.8b, #0
; CHECK-NEON-NEXT: ushll v1.8h, v1.8b, #0
; CHECK-NEON-NEXT: ushr v3.8b, v6.8b, #1
; CHECK-NEON-NEXT: orr v5.16b, v17.16b, v5.16b
; CHECK-NEON-NEXT: orr v6.16b, v16.16b, v7.16b
; CHECK-NEON-NEXT: rbit v4.8b, v4.8b
; CHECK-NEON-NEXT: eor v0.8b, v3.8b, v0.8b
; CHECK-NEON-NEXT: eor v2.8b, v6.8b, v5.8b
; CHECK-NEON-NEXT: shll v0.8h, v0.8b, #8
; CHECK-NEON-NEXT: ushr v3.4h, v4.4h, #1
; CHECK-NEON-NEXT: orr v0.16b, v1.16b, v0.16b
; CHECK-NEON-NEXT: eor v2.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: ushll v0.4s, v0.4h, #0
; CHECK-NEON-NEXT: shll v1.4s, v2.4h, #16
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: rev32 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v0.8b, v0.8b
; CHECK-NEON-NEXT: ushr v0.2s, v0.2s, #1
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulh_v2i32_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: ushll v1.2d, v1.2s, #0
; CHECK-AES-NEXT: ushll v0.2d, v0.2s, #0
; CHECK-AES-NEXT: pmull2 v2.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: mov v0.d[1], v2.d[0]
; CHECK-AES-NEXT: shrn v0.2s, v0.2d, #32
; CHECK-AES-NEXT: ret
%a.ext = zext <2 x i32> %a to <2 x i64>
%b.ext = zext <2 x i32> %b to <2 x i64>
%clmul = call <2 x i64> @llvm.clmul.v2i64(<2 x i64> %a.ext, <2 x i64> %b.ext)
%res.ext = lshr <2 x i64> %clmul, splat (i64 32)
%res = trunc <2 x i64> %res.ext to <2 x i32>
ret <2 x i32> %res
}
define <2 x i64> @clmulh_v2i64_neon(<2 x i64> %a, <2 x i64> %b) nounwind {
; CHECK-NEON-LABEL: clmulh_v2i64_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: sub sp, sp, #112
; CHECK-NEON-NEXT: rev64 v2.16b, v1.16b
; CHECK-NEON-NEXT: rev64 v3.16b, v0.16b
; CHECK-NEON-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill
; CHECK-NEON-NEXT: movi v0.16b, #17
; CHECK-NEON-NEXT: movi v1.16b, #34
; CHECK-NEON-NEXT: stp x26, x25, [sp, #48] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x24, x23, [sp, #64] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEON-NEXT: rbit v4.16b, v2.16b
; CHECK-NEON-NEXT: rbit v5.16b, v3.16b
; CHECK-NEON-NEXT: movi v2.16b, #136
; CHECK-NEON-NEXT: movi v3.16b, #68
; CHECK-NEON-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill
; CHECK-NEON-NEXT: stp x28, x27, [sp, #32] // 16-byte Folded Spill
; CHECK-NEON-NEXT: and v6.16b, v4.16b, v0.16b
; CHECK-NEON-NEXT: and v7.16b, v5.16b, v1.16b
; CHECK-NEON-NEXT: and v16.16b, v4.16b, v1.16b
; CHECK-NEON-NEXT: and v17.16b, v5.16b, v0.16b
; CHECK-NEON-NEXT: and v18.16b, v4.16b, v2.16b
; CHECK-NEON-NEXT: and v19.16b, v5.16b, v3.16b
; CHECK-NEON-NEXT: and v4.16b, v4.16b, v3.16b
; CHECK-NEON-NEXT: and v5.16b, v5.16b, v2.16b
; CHECK-NEON-NEXT: fmov x10, d6
; CHECK-NEON-NEXT: fmov x3, d7
; CHECK-NEON-NEXT: fmov x15, d16
; CHECK-NEON-NEXT: fmov x14, d17
; CHECK-NEON-NEXT: fmov x6, d18
; CHECK-NEON-NEXT: fmov x20, d19
; CHECK-NEON-NEXT: mov x12, v6.d[1]
; CHECK-NEON-NEXT: mov x17, v17.d[1]
; CHECK-NEON-NEXT: mov x16, v18.d[1]
; CHECK-NEON-NEXT: mul x9, x3, x10
; CHECK-NEON-NEXT: mov x25, v19.d[1]
; CHECK-NEON-NEXT: fmov x29, d4
; CHECK-NEON-NEXT: fmov x19, d5
; CHECK-NEON-NEXT: mov x1, v7.d[1]
; CHECK-NEON-NEXT: mov x4, v16.d[1]
; CHECK-NEON-NEXT: mul x8, x14, x15
; CHECK-NEON-NEXT: mov x21, v4.d[1]
; CHECK-NEON-NEXT: mov x11, v5.d[1]
; CHECK-NEON-NEXT: mul x13, x20, x6
; CHECK-NEON-NEXT: mul x23, x14, x10
; CHECK-NEON-NEXT: stp x8, x9, [sp] // 16-byte Folded Spill
; CHECK-NEON-NEXT: mul x8, x25, x16
; CHECK-NEON-NEXT: ldp d5, d4, [sp] // 16-byte Folded Reload
; CHECK-NEON-NEXT: fmov d6, x13
; CHECK-NEON-NEXT: mul x9, x17, x12
; CHECK-NEON-NEXT: fmov d17, x23
; CHECK-NEON-NEXT: mul x18, x19, x29
; CHECK-NEON-NEXT: mov v6.d[1], x8
; CHECK-NEON-NEXT: mul x22, x3, x6
; CHECK-NEON-NEXT: mov v17.d[1], x9
; CHECK-NEON-NEXT: mul x27, x20, x29
; CHECK-NEON-NEXT: fmov d7, x18
; CHECK-NEON-NEXT: mul x28, x19, x15
; CHECK-NEON-NEXT: fmov d16, x22
; CHECK-NEON-NEXT: mul x30, x3, x15
; CHECK-NEON-NEXT: fmov d18, x27
; CHECK-NEON-NEXT: mul x3, x3, x29
; CHECK-NEON-NEXT: fmov d19, x28
; CHECK-NEON-NEXT: ldp x28, x27, [sp, #32] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x29, x14, x29
; CHECK-NEON-NEXT: fmov d20, x30
; CHECK-NEON-NEXT: mul x15, x20, x15
; CHECK-NEON-NEXT: fmov d24, x3
; CHECK-NEON-NEXT: mul x20, x20, x10
; CHECK-NEON-NEXT: fmov d21, x29
; CHECK-NEON-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x14, x14, x6
; CHECK-NEON-NEXT: fmov d26, x15
; CHECK-NEON-NEXT: mul x6, x19, x6
; CHECK-NEON-NEXT: fmov d22, x20
; CHECK-NEON-NEXT: mul x10, x19, x10
; CHECK-NEON-NEXT: fmov d25, x14
; CHECK-NEON-NEXT: mul x2, x1, x12
; CHECK-NEON-NEXT: fmov d23, x6
; CHECK-NEON-NEXT: mul x5, x17, x4
; CHECK-NEON-NEXT: fmov d27, x10
; CHECK-NEON-NEXT: mul x0, x11, x21
; CHECK-NEON-NEXT: mov v4.d[1], x2
; CHECK-NEON-NEXT: mul x7, x1, x16
; CHECK-NEON-NEXT: mov v5.d[1], x5
; CHECK-NEON-NEXT: mul x24, x25, x21
; CHECK-NEON-NEXT: mov v7.d[1], x0
; CHECK-NEON-NEXT: mul x26, x11, x4
; CHECK-NEON-NEXT: mov v16.d[1], x7
; CHECK-NEON-NEXT: eor v4.16b, v5.16b, v4.16b
; CHECK-NEON-NEXT: mul x19, x1, x4
; CHECK-NEON-NEXT: mov v18.d[1], x24
; CHECK-NEON-NEXT: eor v5.16b, v6.16b, v7.16b
; CHECK-NEON-NEXT: mul x1, x1, x21
; CHECK-NEON-NEXT: ldp x24, x23, [sp, #64] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mov v19.d[1], x26
; CHECK-NEON-NEXT: eor v6.16b, v17.16b, v16.16b
; CHECK-NEON-NEXT: mul x21, x17, x21
; CHECK-NEON-NEXT: eor v4.16b, v4.16b, v5.16b
; CHECK-NEON-NEXT: mov v20.d[1], x19
; CHECK-NEON-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x4, x25, x4
; CHECK-NEON-NEXT: mov v24.d[1], x1
; CHECK-NEON-NEXT: eor v7.16b, v18.16b, v19.16b
; CHECK-NEON-NEXT: and v1.16b, v4.16b, v1.16b
; CHECK-NEON-NEXT: mul x25, x25, x12
; CHECK-NEON-NEXT: mov v21.d[1], x21
; CHECK-NEON-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mul x13, x17, x16
; CHECK-NEON-NEXT: eor v5.16b, v6.16b, v7.16b
; CHECK-NEON-NEXT: mov v26.d[1], x4
; CHECK-NEON-NEXT: mul x8, x11, x16
; CHECK-NEON-NEXT: mov v22.d[1], x25
; CHECK-NEON-NEXT: eor v16.16b, v21.16b, v20.16b
; CHECK-NEON-NEXT: and v0.16b, v5.16b, v0.16b
; CHECK-NEON-NEXT: mul x9, x11, x12
; CHECK-NEON-NEXT: ldp x26, x25, [sp, #48] // 16-byte Folded Reload
; CHECK-NEON-NEXT: mov v25.d[1], x13
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: mov v23.d[1], x8
; CHECK-NEON-NEXT: mov v27.d[1], x9
; CHECK-NEON-NEXT: eor v18.16b, v25.16b, v24.16b
; CHECK-NEON-NEXT: eor v17.16b, v22.16b, v23.16b
; CHECK-NEON-NEXT: eor v19.16b, v26.16b, v27.16b
; CHECK-NEON-NEXT: eor v6.16b, v16.16b, v17.16b
; CHECK-NEON-NEXT: eor v7.16b, v18.16b, v19.16b
; CHECK-NEON-NEXT: and v3.16b, v6.16b, v3.16b
; CHECK-NEON-NEXT: and v2.16b, v7.16b, v2.16b
; CHECK-NEON-NEXT: orr v1.16b, v3.16b, v2.16b
; CHECK-NEON-NEXT: orr v0.16b, v0.16b, v1.16b
; CHECK-NEON-NEXT: rev64 v0.16b, v0.16b
; CHECK-NEON-NEXT: rbit v0.16b, v0.16b
; CHECK-NEON-NEXT: ushr v0.2d, v0.2d, #1
; CHECK-NEON-NEXT: add sp, sp, #112
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulh_v2i64_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: pmull2 v2.1q, v0.2d, v1.2d
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: zip2 v0.2d, v0.2d, v2.2d
; CHECK-AES-NEXT: ret
%a.ext = zext <2 x i64> %a to <2 x i128>
%b.ext = zext <2 x i64> %b to <2 x i128>
%clmul = call <2 x i128> @llvm.clmul.v2i128(<2 x i128> %a.ext, <2 x i128> %b.ext)
%res.ext = lshr <2 x i128> %clmul, splat (i128 64)
%res = trunc <2 x i128> %res.ext to <2 x i64>
ret <2 x i64> %res
}
define <1 x i64> @clmulh_v1i64_neon(<1 x i64> %a, <1 x i64> %b) nounwind {
; CHECK-NEON-LABEL: clmulh_v1i64_neon:
; CHECK-NEON: // %bb.0:
; CHECK-NEON-NEXT: rev64 v2.8b, v1.8b
; CHECK-NEON-NEXT: rev64 v3.8b, v0.8b
; CHECK-NEON-NEXT: movi v0.8b, #17
; CHECK-NEON-NEXT: movi v1.8b, #34
; CHECK-NEON-NEXT: rbit v4.8b, v2.8b
; CHECK-NEON-NEXT: rbit v5.8b, v3.8b
; CHECK-NEON-NEXT: movi v2.8b, #136
; CHECK-NEON-NEXT: movi v3.8b, #68
; CHECK-NEON-NEXT: and v6.8b, v4.8b, v0.8b
; CHECK-NEON-NEXT: and v7.8b, v5.8b, v1.8b
; CHECK-NEON-NEXT: and v16.8b, v4.8b, v1.8b
; CHECK-NEON-NEXT: and v17.8b, v5.8b, v0.8b
; CHECK-NEON-NEXT: fmov x8, d6
; CHECK-NEON-NEXT: fmov x9, d7
; CHECK-NEON-NEXT: and v6.8b, v4.8b, v2.8b
; CHECK-NEON-NEXT: and v7.8b, v5.8b, v3.8b
; CHECK-NEON-NEXT: and v4.8b, v4.8b, v3.8b
; CHECK-NEON-NEXT: and v5.8b, v5.8b, v2.8b
; CHECK-NEON-NEXT: fmov x11, d16
; CHECK-NEON-NEXT: fmov x12, d17
; CHECK-NEON-NEXT: fmov x14, d6
; CHECK-NEON-NEXT: mul x10, x9, x8
; CHECK-NEON-NEXT: fmov x15, d7
; CHECK-NEON-NEXT: fmov x17, d4
; CHECK-NEON-NEXT: fmov x18, d5
; CHECK-NEON-NEXT: mul x13, x12, x11
; CHECK-NEON-NEXT: mul x16, x15, x14
; CHECK-NEON-NEXT: fmov d4, x10
; CHECK-NEON-NEXT: mul x0, x18, x17
; CHECK-NEON-NEXT: fmov d5, x13
; CHECK-NEON-NEXT: mul x1, x9, x14
; CHECK-NEON-NEXT: fmov d6, x16
; CHECK-NEON-NEXT: mul x2, x12, x8
; CHECK-NEON-NEXT: eor v4.8b, v5.8b, v4.8b
; CHECK-NEON-NEXT: fmov d7, x0
; CHECK-NEON-NEXT: mul x3, x15, x17
; CHECK-NEON-NEXT: fmov d16, x1
; CHECK-NEON-NEXT: mul x4, x18, x11
; CHECK-NEON-NEXT: eor v5.8b, v6.8b, v7.8b
; CHECK-NEON-NEXT: fmov d17, x2
; CHECK-NEON-NEXT: mul x5, x9, x11
; CHECK-NEON-NEXT: fmov d18, x3
; CHECK-NEON-NEXT: eor v4.8b, v4.8b, v5.8b
; CHECK-NEON-NEXT: mul x9, x9, x17
; CHECK-NEON-NEXT: eor v16.8b, v17.8b, v16.8b
; CHECK-NEON-NEXT: fmov d6, x4
; CHECK-NEON-NEXT: mul x17, x12, x17
; CHECK-NEON-NEXT: and v1.8b, v4.8b, v1.8b
; CHECK-NEON-NEXT: fmov d7, x5
; CHECK-NEON-NEXT: mul x11, x15, x11
; CHECK-NEON-NEXT: eor v6.8b, v18.8b, v6.8b
; CHECK-NEON-NEXT: mul x15, x15, x8
; CHECK-NEON-NEXT: fmov d19, x17
; CHECK-NEON-NEXT: eor v5.8b, v16.8b, v6.8b
; CHECK-NEON-NEXT: mul x12, x12, x14
; CHECK-NEON-NEXT: fmov d21, x11
; CHECK-NEON-NEXT: mul x10, x18, x14
; CHECK-NEON-NEXT: eor v7.8b, v19.8b, v7.8b
; CHECK-NEON-NEXT: fmov d19, x9
; CHECK-NEON-NEXT: fmov d17, x15
; CHECK-NEON-NEXT: and v0.8b, v5.8b, v0.8b
; CHECK-NEON-NEXT: mul x8, x18, x8
; CHECK-NEON-NEXT: fmov d20, x12
; CHECK-NEON-NEXT: orr v0.8b, v0.8b, v1.8b
; CHECK-NEON-NEXT: fmov d18, x10
; CHECK-NEON-NEXT: fmov d22, x8
; CHECK-NEON-NEXT: eor v17.8b, v17.8b, v18.8b
; CHECK-NEON-NEXT: eor v18.8b, v20.8b, v19.8b
; CHECK-NEON-NEXT: eor v19.8b, v21.8b, v22.8b
; CHECK-NEON-NEXT: eor v6.8b, v7.8b, v17.8b
; CHECK-NEON-NEXT: eor v7.8b, v18.8b, v19.8b
; CHECK-NEON-NEXT: and v3.8b, v6.8b, v3.8b
; CHECK-NEON-NEXT: and v2.8b, v7.8b, v2.8b
; CHECK-NEON-NEXT: orr v1.8b, v3.8b, v2.8b
; CHECK-NEON-NEXT: orr v0.8b, v0.8b, v1.8b
; CHECK-NEON-NEXT: rev64 v0.8b, v0.8b
; CHECK-NEON-NEXT: rbit v0.8b, v0.8b
; CHECK-NEON-NEXT: ushr d0, d0, #1
; CHECK-NEON-NEXT: ret
;
; CHECK-AES-LABEL: clmulh_v1i64_neon:
; CHECK-AES: // %bb.0:
; CHECK-AES-NEXT: pmull v0.1q, v0.1d, v1.1d
; CHECK-AES-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; CHECK-AES-NEXT: // kill: def $d0 killed $d0 killed $q0
; CHECK-AES-NEXT: ret
%a.ext = zext <1 x i64> %a to <1 x i128>
%b.ext = zext <1 x i64> %b to <1 x i128>
%clmul = call <1 x i128> @llvm.clmul.v1i128(<1 x i128> %a.ext, <1 x i128> %b.ext)
%res.ext = lshr <1 x i128> %clmul, splat (i128 64)
%res = trunc <1 x i128> %res.ext to <1 x i64>
ret <1 x i64> %res
}