xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-crypto.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -mattr=crypto -aarch64-neon-syntax=apple -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare <16 x i8> @llvm.aarch64.crypto.aese(<16 x i8> %data, <16 x i8> %key)
4*9880d681SAndroid Build Coastguard Workerdeclare <16 x i8> @llvm.aarch64.crypto.aesd(<16 x i8> %data, <16 x i8> %key)
5*9880d681SAndroid Build Coastguard Workerdeclare <16 x i8> @llvm.aarch64.crypto.aesmc(<16 x i8> %data)
6*9880d681SAndroid Build Coastguard Workerdeclare <16 x i8> @llvm.aarch64.crypto.aesimc(<16 x i8> %data)
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_aese(<16 x i8> %data, <16 x i8> %key) {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_aese:
10*9880d681SAndroid Build Coastguard Worker; CHECK: aese.16b v0, v1
11*9880d681SAndroid Build Coastguard Worker  %res = call <16 x i8> @llvm.aarch64.crypto.aese(<16 x i8> %data, <16 x i8> %key)
12*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %res
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_aesd(<16 x i8> %data, <16 x i8> %key) {
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_aesd:
17*9880d681SAndroid Build Coastguard Worker; CHECK: aesd.16b v0, v1
18*9880d681SAndroid Build Coastguard Worker  %res = call <16 x i8> @llvm.aarch64.crypto.aesd(<16 x i8> %data, <16 x i8> %key)
19*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %res
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_aesmc(<16 x i8> %data) {
23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_aesmc:
24*9880d681SAndroid Build Coastguard Worker; CHECK: aesmc.16b v0, v0
25*9880d681SAndroid Build Coastguard Worker %res = call <16 x i8> @llvm.aarch64.crypto.aesmc(<16 x i8> %data)
26*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %res
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_aesimc(<16 x i8> %data) {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_aesimc:
31*9880d681SAndroid Build Coastguard Worker; CHECK: aesimc.16b v0, v0
32*9880d681SAndroid Build Coastguard Worker %res = call <16 x i8> @llvm.aarch64.crypto.aesimc(<16 x i8> %data)
33*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %res
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.crypto.sha1c(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk)
37*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.crypto.sha1p(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk)
38*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.crypto.sha1m(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk)
39*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.crypto.sha1h(i32 %hash_e)
40*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.crypto.sha1su0(<4 x i32> %wk0_3, <4 x i32> %wk4_7, <4 x i32> %wk8_11)
41*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.crypto.sha1su1(<4 x i32> %wk0_3, <4 x i32> %wk12_15)
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha1c(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk) {
44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha1c:
45*9880d681SAndroid Build Coastguard Worker; CHECK: fmov [[HASH_E:s[0-9]+]], w0
46*9880d681SAndroid Build Coastguard Worker; CHECK: sha1c.4s q0, [[HASH_E]], v1
47*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha1c(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk)
48*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; <rdar://problem/14742333> Incomplete removal of unnecessary FMOV instructions in intrinsic SHA1
52*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha1c_in_a_row(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk) {
53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha1c_in_a_row:
54*9880d681SAndroid Build Coastguard Worker; CHECK: fmov [[HASH_E:s[0-9]+]], w0
55*9880d681SAndroid Build Coastguard Worker; CHECK: sha1c.4s q[[SHA1RES:[0-9]+]], [[HASH_E]], v1
56*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmov
57*9880d681SAndroid Build Coastguard Worker; CHECK: sha1c.4s q0, s[[SHA1RES]], v1
58*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha1c(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk)
59*9880d681SAndroid Build Coastguard Worker  %extract = extractelement <4 x i32> %res, i32 0
60*9880d681SAndroid Build Coastguard Worker  %res2 = call <4 x i32> @llvm.aarch64.crypto.sha1c(<4 x i32> %hash_abcd, i32 %extract, <4 x i32> %wk)
61*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res2
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha1p(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk) {
65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha1p:
66*9880d681SAndroid Build Coastguard Worker; CHECK: fmov [[HASH_E:s[0-9]+]], w0
67*9880d681SAndroid Build Coastguard Worker; CHECK: sha1p.4s q0, [[HASH_E]], v1
68*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha1p(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk)
69*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha1m(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk) {
73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha1m:
74*9880d681SAndroid Build Coastguard Worker; CHECK: fmov [[HASH_E:s[0-9]+]], w0
75*9880d681SAndroid Build Coastguard Worker; CHECK: sha1m.4s q0, [[HASH_E]], v1
76*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha1m(<4 x i32> %hash_abcd, i32 %hash_e, <4 x i32> %wk)
77*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sha1h(i32 %hash_e) {
81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha1h:
82*9880d681SAndroid Build Coastguard Worker; CHECK: fmov [[HASH_E:s[0-9]+]], w0
83*9880d681SAndroid Build Coastguard Worker; CHECK: sha1h [[RES:s[0-9]+]], [[HASH_E]]
84*9880d681SAndroid Build Coastguard Worker; CHECK: fmov w0, [[RES]]
85*9880d681SAndroid Build Coastguard Worker  %res = call i32 @llvm.aarch64.crypto.sha1h(i32 %hash_e)
86*9880d681SAndroid Build Coastguard Worker  ret i32 %res
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha1su0(<4 x i32> %wk0_3, <4 x i32> %wk4_7, <4 x i32> %wk8_11) {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha1su0:
91*9880d681SAndroid Build Coastguard Worker; CHECK: sha1su0.4s v0, v1, v2
92*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha1su0(<4 x i32> %wk0_3, <4 x i32> %wk4_7, <4 x i32> %wk8_11)
93*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha1su1(<4 x i32> %wk0_3, <4 x i32> %wk12_15) {
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha1su1:
98*9880d681SAndroid Build Coastguard Worker; CHECK: sha1su1.4s v0, v1
99*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha1su1(<4 x i32> %wk0_3, <4 x i32> %wk12_15)
100*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.crypto.sha256h(<4 x i32> %hash_abcd, <4 x i32> %hash_efgh, <4 x i32> %wk)
104*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.crypto.sha256h2(<4 x i32> %hash_efgh, <4 x i32> %hash_abcd, <4 x i32> %wk)
105*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.crypto.sha256su0(<4 x i32> %w0_3, <4 x i32> %w4_7)
106*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.crypto.sha256su1(<4 x i32> %w0_3, <4 x i32> %w8_11, <4 x i32> %w12_15)
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha256h(<4 x i32> %hash_abcd, <4 x i32> %hash_efgh, <4 x i32> %wk) {
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha256h:
110*9880d681SAndroid Build Coastguard Worker; CHECK: sha256h.4s q0, q1, v2
111*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha256h(<4 x i32> %hash_abcd, <4 x i32> %hash_efgh, <4 x i32> %wk)
112*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha256h2(<4 x i32> %hash_efgh, <4 x i32> %hash_abcd, <4 x i32> %wk) {
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha256h2:
117*9880d681SAndroid Build Coastguard Worker; CHECK: sha256h2.4s q0, q1, v2
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha256h2(<4 x i32> %hash_efgh, <4 x i32> %hash_abcd, <4 x i32> %wk)
120*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha256su0(<4 x i32> %w0_3, <4 x i32> %w4_7) {
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha256su0:
125*9880d681SAndroid Build Coastguard Worker; CHECK: sha256su0.4s v0, v1
126*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha256su0(<4 x i32> %w0_3, <4 x i32> %w4_7)
127*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_sha256su1(<4 x i32> %w0_3, <4 x i32> %w8_11, <4 x i32> %w12_15) {
131*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sha256su1:
132*9880d681SAndroid Build Coastguard Worker; CHECK: sha256su1.4s v0, v1, v2
133*9880d681SAndroid Build Coastguard Worker  %res = call <4 x i32> @llvm.aarch64.crypto.sha256su1(<4 x i32> %w0_3, <4 x i32> %w8_11, <4 x i32> %w12_15)
134*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
135*9880d681SAndroid Build Coastguard Worker}
136