1bc3d5698SJohn Baldwin/* Do not modify. This file is auto-generated from arm64cpuid.pl. */
2bc3d5698SJohn Baldwin#include "arm_arch.h"
3bc3d5698SJohn Baldwin
4bc3d5698SJohn Baldwin.text
5bc3d5698SJohn Baldwin.arch	armv8-a+crypto
6bc3d5698SJohn Baldwin
7bc3d5698SJohn Baldwin.align	5
8bc3d5698SJohn Baldwin.globl	_armv7_neon_probe
9bc3d5698SJohn Baldwin.type	_armv7_neon_probe,%function
10bc3d5698SJohn Baldwin_armv7_neon_probe:
11bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
12bc3d5698SJohn Baldwin	orr	v15.16b, v15.16b, v15.16b
13bc3d5698SJohn Baldwin	ret
14bc3d5698SJohn Baldwin.size	_armv7_neon_probe,.-_armv7_neon_probe
15bc3d5698SJohn Baldwin
16bc3d5698SJohn Baldwin.globl	_armv7_tick
17bc3d5698SJohn Baldwin.type	_armv7_tick,%function
18bc3d5698SJohn Baldwin_armv7_tick:
19bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
20bc3d5698SJohn Baldwin#ifdef	__APPLE__
21bc3d5698SJohn Baldwin	mrs	x0, CNTPCT_EL0
22bc3d5698SJohn Baldwin#else
23bc3d5698SJohn Baldwin	mrs	x0, CNTVCT_EL0
24bc3d5698SJohn Baldwin#endif
25bc3d5698SJohn Baldwin	ret
26bc3d5698SJohn Baldwin.size	_armv7_tick,.-_armv7_tick
27bc3d5698SJohn Baldwin
28bc3d5698SJohn Baldwin.globl	_armv8_aes_probe
29bc3d5698SJohn Baldwin.type	_armv8_aes_probe,%function
30bc3d5698SJohn Baldwin_armv8_aes_probe:
31bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
32bc3d5698SJohn Baldwin	aese	v0.16b, v0.16b
33bc3d5698SJohn Baldwin	ret
34bc3d5698SJohn Baldwin.size	_armv8_aes_probe,.-_armv8_aes_probe
35bc3d5698SJohn Baldwin
36bc3d5698SJohn Baldwin.globl	_armv8_sha1_probe
37bc3d5698SJohn Baldwin.type	_armv8_sha1_probe,%function
38bc3d5698SJohn Baldwin_armv8_sha1_probe:
39bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
40bc3d5698SJohn Baldwin	sha1h	s0, s0
41bc3d5698SJohn Baldwin	ret
42bc3d5698SJohn Baldwin.size	_armv8_sha1_probe,.-_armv8_sha1_probe
43bc3d5698SJohn Baldwin
44bc3d5698SJohn Baldwin.globl	_armv8_sha256_probe
45bc3d5698SJohn Baldwin.type	_armv8_sha256_probe,%function
46bc3d5698SJohn Baldwin_armv8_sha256_probe:
47bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
48bc3d5698SJohn Baldwin	sha256su0	v0.4s, v0.4s
49bc3d5698SJohn Baldwin	ret
50bc3d5698SJohn Baldwin.size	_armv8_sha256_probe,.-_armv8_sha256_probe
51bc3d5698SJohn Baldwin
52bc3d5698SJohn Baldwin.globl	_armv8_pmull_probe
53bc3d5698SJohn Baldwin.type	_armv8_pmull_probe,%function
54bc3d5698SJohn Baldwin_armv8_pmull_probe:
55bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
56bc3d5698SJohn Baldwin	pmull	v0.1q, v0.1d, v0.1d
57bc3d5698SJohn Baldwin	ret
58bc3d5698SJohn Baldwin.size	_armv8_pmull_probe,.-_armv8_pmull_probe
59bc3d5698SJohn Baldwin
60bc3d5698SJohn Baldwin.globl	_armv8_sha512_probe
61bc3d5698SJohn Baldwin.type	_armv8_sha512_probe,%function
62bc3d5698SJohn Baldwin_armv8_sha512_probe:
63bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
64bc3d5698SJohn Baldwin.long	0xcec08000	// sha512su0	v0.2d,v0.2d
65bc3d5698SJohn Baldwin	ret
66bc3d5698SJohn Baldwin.size	_armv8_sha512_probe,.-_armv8_sha512_probe
67bc3d5698SJohn Baldwin
68c0855eaaSJohn Baldwin.globl	_armv8_cpuid_probe
69c0855eaaSJohn Baldwin.type	_armv8_cpuid_probe,%function
70c0855eaaSJohn Baldwin_armv8_cpuid_probe:
71bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
72c0855eaaSJohn Baldwin	mrs	x0, midr_el1
73c0855eaaSJohn Baldwin	ret
74c0855eaaSJohn Baldwin.size	_armv8_cpuid_probe,.-_armv8_cpuid_probe
75c0855eaaSJohn Baldwin
76bc3d5698SJohn Baldwin.globl	OPENSSL_cleanse
77bc3d5698SJohn Baldwin.type	OPENSSL_cleanse,%function
78bc3d5698SJohn Baldwin.align	5
79bc3d5698SJohn BaldwinOPENSSL_cleanse:
80bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
81bc3d5698SJohn Baldwin	cbz	x1,.Lret	// len==0?
82bc3d5698SJohn Baldwin	cmp	x1,#15
83bc3d5698SJohn Baldwin	b.hi	.Lot		// len>15
84bc3d5698SJohn Baldwin	nop
85bc3d5698SJohn Baldwin.Little:
86bc3d5698SJohn Baldwin	strb	wzr,[x0],#1	// store byte-by-byte
87bc3d5698SJohn Baldwin	subs	x1,x1,#1
88bc3d5698SJohn Baldwin	b.ne	.Little
89bc3d5698SJohn Baldwin.Lret:	ret
90bc3d5698SJohn Baldwin
91bc3d5698SJohn Baldwin.align	4
92bc3d5698SJohn Baldwin.Lot:	tst	x0,#7
93bc3d5698SJohn Baldwin	b.eq	.Laligned	// inp is aligned
94bc3d5698SJohn Baldwin	strb	wzr,[x0],#1	// store byte-by-byte
95bc3d5698SJohn Baldwin	sub	x1,x1,#1
96bc3d5698SJohn Baldwin	b	.Lot
97bc3d5698SJohn Baldwin
98bc3d5698SJohn Baldwin.align	4
99bc3d5698SJohn Baldwin.Laligned:
100bc3d5698SJohn Baldwin	str	xzr,[x0],#8	// store word-by-word
101bc3d5698SJohn Baldwin	sub	x1,x1,#8
102bc3d5698SJohn Baldwin	tst	x1,#-8
103bc3d5698SJohn Baldwin	b.ne	.Laligned	// len>=8
104bc3d5698SJohn Baldwin	cbnz	x1,.Little	// len!=0?
105bc3d5698SJohn Baldwin	ret
106bc3d5698SJohn Baldwin.size	OPENSSL_cleanse,.-OPENSSL_cleanse
107bc3d5698SJohn Baldwin
108bc3d5698SJohn Baldwin.globl	CRYPTO_memcmp
109bc3d5698SJohn Baldwin.type	CRYPTO_memcmp,%function
110bc3d5698SJohn Baldwin.align	4
111bc3d5698SJohn BaldwinCRYPTO_memcmp:
112bd9588bcSAndrew Turner	AARCH64_VALID_CALL_TARGET
113bc3d5698SJohn Baldwin	eor	w3,w3,w3
114bc3d5698SJohn Baldwin	cbz	x2,.Lno_data	// len==0?
115bc3d5698SJohn Baldwin	cmp	x2,#16
116bc3d5698SJohn Baldwin	b.ne	.Loop_cmp
117bc3d5698SJohn Baldwin	ldp	x8,x9,[x0]
118bc3d5698SJohn Baldwin	ldp	x10,x11,[x1]
119bc3d5698SJohn Baldwin	eor	x8,x8,x10
120bc3d5698SJohn Baldwin	eor	x9,x9,x11
121bc3d5698SJohn Baldwin	orr	x8,x8,x9
122bc3d5698SJohn Baldwin	mov	x0,#1
123bc3d5698SJohn Baldwin	cmp	x8,#0
124bc3d5698SJohn Baldwin	csel	x0,xzr,x0,eq
125bc3d5698SJohn Baldwin	ret
126bc3d5698SJohn Baldwin
127bc3d5698SJohn Baldwin.align	4
128bc3d5698SJohn Baldwin.Loop_cmp:
129bc3d5698SJohn Baldwin	ldrb	w4,[x0],#1
130bc3d5698SJohn Baldwin	ldrb	w5,[x1],#1
131bc3d5698SJohn Baldwin	eor	w4,w4,w5
132bc3d5698SJohn Baldwin	orr	w3,w3,w4
133bc3d5698SJohn Baldwin	subs	x2,x2,#1
134bc3d5698SJohn Baldwin	b.ne	.Loop_cmp
135bc3d5698SJohn Baldwin
136bc3d5698SJohn Baldwin.Lno_data:
137bc3d5698SJohn Baldwin	neg	w0,w3
138bc3d5698SJohn Baldwin	lsr	w0,w0,#31
139bc3d5698SJohn Baldwin	ret
140bc3d5698SJohn Baldwin.size	CRYPTO_memcmp,.-CRYPTO_memcmp
141