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