xref: /freebsd/crypto/openssl/crypto/armv4cpuid.pl (revision 81ad6265)
1#! /usr/bin/env perl
2# Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved.
3#
4# Licensed under the OpenSSL license (the "License").  You may not use
5# this file except in compliance with the License.  You can obtain a copy
6# in the file LICENSE in the source distribution or at
7# https://www.openssl.org/source/license.html
8
9
10$flavour = shift;
11$output  = shift;
12
13$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
14( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
15( $xlate="${dir}perlasm/arm-xlate.pl" and -f $xlate) or
16die "can't locate arm-xlate.pl";
17
18open OUT,"| \"$^X\" $xlate $flavour $output";
19*STDOUT=*OUT;
20
21$code.=<<___;
22#include "arm_arch.h"
23
24.text
25#if defined(__thumb2__) && !defined(__APPLE__)
26.syntax	unified
27.thumb
28#else
29.code	32
30#undef	__thumb2__
31#endif
32
33.align	5
34.global	OPENSSL_atomic_add
35.type	OPENSSL_atomic_add,%function
36OPENSSL_atomic_add:
37#if __ARM_ARCH__>=6
38.Ladd:	ldrex	r2,[r0]
39	add	r3,r2,r1
40	strex	r2,r3,[r0]
41	cmp	r2,#0
42	bne	.Ladd
43	mov	r0,r3
44	bx	lr
45#else
46	stmdb	sp!,{r4-r6,lr}
47	ldr	r2,.Lspinlock
48	adr	r3,.Lspinlock
49	mov	r4,r0
50	mov	r5,r1
51	add	r6,r3,r2	@ &spinlock
52	b	.+8
53.Lspin:	bl	sched_yield
54	mov	r0,#-1
55	swp	r0,r0,[r6]
56	cmp	r0,#0
57	bne	.Lspin
58
59	ldr	r2,[r4]
60	add	r2,r2,r5
61	str	r2,[r4]
62	str	r0,[r6]		@ release spinlock
63	ldmia	sp!,{r4-r6,lr}
64	tst	lr,#1
65	moveq	pc,lr
66	.word	0xe12fff1e	@ bx	lr
67#endif
68.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
69
70.global	OPENSSL_cleanse
71.type	OPENSSL_cleanse,%function
72OPENSSL_cleanse:
73	eor	ip,ip,ip
74	cmp	r1,#7
75#ifdef	__thumb2__
76	itt	hs
77#endif
78	subhs	r1,r1,#4
79	bhs	.Lot
80	cmp	r1,#0
81	beq	.Lcleanse_done
82.Little:
83	strb	ip,[r0],#1
84	subs	r1,r1,#1
85	bhi	.Little
86	b	.Lcleanse_done
87
88.Lot:	tst	r0,#3
89	beq	.Laligned
90	strb	ip,[r0],#1
91	sub	r1,r1,#1
92	b	.Lot
93.Laligned:
94	str	ip,[r0],#4
95	subs	r1,r1,#4
96	bhs	.Laligned
97	adds	r1,r1,#4
98	bne	.Little
99.Lcleanse_done:
100#if __ARM_ARCH__>=5
101	bx	lr
102#else
103	tst	lr,#1
104	moveq	pc,lr
105	.word	0xe12fff1e	@ bx	lr
106#endif
107.size	OPENSSL_cleanse,.-OPENSSL_cleanse
108
109.global	CRYPTO_memcmp
110.type	CRYPTO_memcmp,%function
111.align	4
112CRYPTO_memcmp:
113	eor	ip,ip,ip
114	cmp	r2,#0
115	beq	.Lno_data
116	stmdb	sp!,{r4,r5}
117
118.Loop_cmp:
119	ldrb	r4,[r0],#1
120	ldrb	r5,[r1],#1
121	eor	r4,r4,r5
122	orr	ip,ip,r4
123	subs	r2,r2,#1
124	bne	.Loop_cmp
125
126	ldmia	sp!,{r4,r5}
127.Lno_data:
128	rsb	r0,ip,#0
129	mov	r0,r0,lsr#31
130#if __ARM_ARCH__>=5
131	bx	lr
132#else
133	tst	lr,#1
134	moveq	pc,lr
135	.word	0xe12fff1e	@ bx	lr
136#endif
137.size	CRYPTO_memcmp,.-CRYPTO_memcmp
138
139#if __ARM_MAX_ARCH__>=7
140.arch	armv7-a
141.fpu	neon
142
143.align	5
144.global	_armv7_neon_probe
145.type	_armv7_neon_probe,%function
146_armv7_neon_probe:
147	vorr	q0,q0,q0
148	bx	lr
149.size	_armv7_neon_probe,.-_armv7_neon_probe
150
151.global	_armv7_tick
152.type	_armv7_tick,%function
153_armv7_tick:
154#ifdef	__APPLE__
155	mrrc	p15,0,r0,r1,c14		@ CNTPCT
156#else
157	mrrc	p15,1,r0,r1,c14		@ CNTVCT
158#endif
159	bx	lr
160.size	_armv7_tick,.-_armv7_tick
161
162.global	_armv8_aes_probe
163.type	_armv8_aes_probe,%function
164_armv8_aes_probe:
165#if defined(__thumb2__) && !defined(__APPLE__)
166	.byte	0xb0,0xff,0x00,0x03	@ aese.8	q0,q0
167#else
168	.byte	0x00,0x03,0xb0,0xf3	@ aese.8	q0,q0
169#endif
170	bx	lr
171.size	_armv8_aes_probe,.-_armv8_aes_probe
172
173.global	_armv8_sha1_probe
174.type	_armv8_sha1_probe,%function
175_armv8_sha1_probe:
176#if defined(__thumb2__) && !defined(__APPLE__)
177	.byte	0x00,0xef,0x40,0x0c	@ sha1c.32	q0,q0,q0
178#else
179	.byte	0x40,0x0c,0x00,0xf2	@ sha1c.32	q0,q0,q0
180#endif
181	bx	lr
182.size	_armv8_sha1_probe,.-_armv8_sha1_probe
183
184.global	_armv8_sha256_probe
185.type	_armv8_sha256_probe,%function
186_armv8_sha256_probe:
187#if defined(__thumb2__) && !defined(__APPLE__)
188	.byte	0x00,0xff,0x40,0x0c	@ sha256h.32	q0,q0,q0
189#else
190	.byte	0x40,0x0c,0x00,0xf3	@ sha256h.32	q0,q0,q0
191#endif
192	bx	lr
193.size	_armv8_sha256_probe,.-_armv8_sha256_probe
194.global	_armv8_pmull_probe
195.type	_armv8_pmull_probe,%function
196_armv8_pmull_probe:
197#if defined(__thumb2__) && !defined(__APPLE__)
198	.byte	0xa0,0xef,0x00,0x0e	@ vmull.p64	q0,d0,d0
199#else
200	.byte	0x00,0x0e,0xa0,0xf2	@ vmull.p64	q0,d0,d0
201#endif
202	bx	lr
203.size	_armv8_pmull_probe,.-_armv8_pmull_probe
204#endif
205
206.global	OPENSSL_wipe_cpu
207.type	OPENSSL_wipe_cpu,%function
208OPENSSL_wipe_cpu:
209#if __ARM_MAX_ARCH__>=7
210	ldr	r0,.LOPENSSL_armcap
211	adr	r1,.LOPENSSL_armcap
212	ldr	r0,[r1,r0]
213#ifdef	__APPLE__
214	ldr	r0,[r0]
215#endif
216#endif
217	eor	r2,r2,r2
218	eor	r3,r3,r3
219	eor	ip,ip,ip
220#if __ARM_MAX_ARCH__>=7
221	tst	r0,#1
222	beq	.Lwipe_done
223	veor	q0, q0, q0
224	veor	q1, q1, q1
225	veor	q2, q2, q2
226	veor	q3, q3, q3
227	veor	q8, q8, q8
228	veor	q9, q9, q9
229	veor	q10, q10, q10
230	veor	q11, q11, q11
231	veor	q12, q12, q12
232	veor	q13, q13, q13
233	veor	q14, q14, q14
234	veor	q15, q15, q15
235.Lwipe_done:
236#endif
237	mov	r0,sp
238#if __ARM_ARCH__>=5
239	bx	lr
240#else
241	tst	lr,#1
242	moveq	pc,lr
243	.word	0xe12fff1e	@ bx	lr
244#endif
245.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
246
247.global	OPENSSL_instrument_bus
248.type	OPENSSL_instrument_bus,%function
249OPENSSL_instrument_bus:
250	eor	r0,r0,r0
251#if __ARM_ARCH__>=5
252	bx	lr
253#else
254	tst	lr,#1
255	moveq	pc,lr
256	.word	0xe12fff1e	@ bx	lr
257#endif
258.size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
259
260.global	OPENSSL_instrument_bus2
261.type	OPENSSL_instrument_bus2,%function
262OPENSSL_instrument_bus2:
263	eor	r0,r0,r0
264#if __ARM_ARCH__>=5
265	bx	lr
266#else
267	tst	lr,#1
268	moveq	pc,lr
269	.word	0xe12fff1e	@ bx	lr
270#endif
271.size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
272
273.align	5
274#if __ARM_MAX_ARCH__>=7
275.LOPENSSL_armcap:
276.word	OPENSSL_armcap_P-.
277#endif
278#if __ARM_ARCH__>=6
279.align	5
280#else
281.Lspinlock:
282.word	atomic_add_spinlock-.Lspinlock
283.align	5
284
285.data
286.align	2
287atomic_add_spinlock:
288.word	0
289#endif
290
291.comm	OPENSSL_armcap_P,4,4
292.hidden	OPENSSL_armcap_P
293___
294
295print $code;
296close STDOUT or die "error closing STDOUT: $!";
297