1208599Srdivacky#! /usr/bin/env perl
2208599Srdivacky# Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved.
3208599Srdivacky#
4208599Srdivacky# Licensed under the Apache License 2.0 (the "License").  You may not use
5208599Srdivacky# this file except in compliance with the License.  You can obtain a copy
6208599Srdivacky# in the file LICENSE in the source distribution or at
7208599Srdivacky# https://www.openssl.org/source/license.html
8208599Srdivacky
9208599Srdivacky
10208599Srdivacky# $output is the last argument if it looks like a file (it has an extension)
11208599Srdivacky# $flavour is the first argument if it doesn't look like a file
12208599Srdivacky$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
13208599Srdivacky$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
14208599Srdivacky
15208599Srdivacky$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
16208599Srdivacky( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
17208599Srdivacky( $xlate="${dir}perlasm/arm-xlate.pl" and -f $xlate) or
18208599Srdivackydie "can't locate arm-xlate.pl";
19208599Srdivacky
20208599Srdivackyopen OUT,"| \"$^X\" $xlate $flavour \"$output\""
21208599Srdivacky    or die "can't call $xlate: $!";
22208599Srdivacky*STDOUT=*OUT;
23208599Srdivacky
24208599Srdivacky$code.=<<___;
25208599Srdivacky#include "arm_arch.h"
26208599Srdivacky
27208599Srdivacky.text
28208599Srdivacky.arch	armv8-a+crypto
29208599Srdivacky
30208599Srdivacky.align	5
31208599Srdivacky.globl	_armv7_neon_probe
32208599Srdivacky.type	_armv7_neon_probe,%function
33212904Sdim_armv7_neon_probe:
34208599Srdivacky	orr	v15.16b, v15.16b, v15.16b
35208599Srdivacky	ret
36208599Srdivacky.size	_armv7_neon_probe,.-_armv7_neon_probe
37208599Srdivacky
38208599Srdivacky.globl	_armv7_tick
39208599Srdivacky.type	_armv7_tick,%function
40208599Srdivacky_armv7_tick:
41208599Srdivacky#ifdef	__APPLE__
42208599Srdivacky	mrs	x0, CNTPCT_EL0
43208599Srdivacky#else
44208599Srdivacky	mrs	x0, CNTVCT_EL0
45212904Sdim#endif
46212904Sdim	ret
47208599Srdivacky.size	_armv7_tick,.-_armv7_tick
48208599Srdivacky
49208599Srdivacky.globl	_armv8_aes_probe
50208599Srdivacky.type	_armv8_aes_probe,%function
51208599Srdivacky_armv8_aes_probe:
52208599Srdivacky	aese	v0.16b, v0.16b
53208599Srdivacky	ret
54208599Srdivacky.size	_armv8_aes_probe,.-_armv8_aes_probe
55208599Srdivacky
56208599Srdivacky.globl	_armv8_sha1_probe
57208599Srdivacky.type	_armv8_sha1_probe,%function
58208599Srdivacky_armv8_sha1_probe:
59208599Srdivacky	sha1h	s0, s0
60208599Srdivacky	ret
61208599Srdivacky.size	_armv8_sha1_probe,.-_armv8_sha1_probe
62208599Srdivacky
63208599Srdivacky.globl	_armv8_sha256_probe
64208599Srdivacky.type	_armv8_sha256_probe,%function
65208599Srdivacky_armv8_sha256_probe:
66208599Srdivacky	sha256su0	v0.4s, v0.4s
67208599Srdivacky	ret
68208599Srdivacky.size	_armv8_sha256_probe,.-_armv8_sha256_probe
69208599Srdivacky
70208599Srdivacky.globl	_armv8_pmull_probe
71208599Srdivacky.type	_armv8_pmull_probe,%function
72208599Srdivacky_armv8_pmull_probe:
73208599Srdivacky	pmull	v0.1q, v0.1d, v0.1d
74208599Srdivacky	ret
75208599Srdivacky.size	_armv8_pmull_probe,.-_armv8_pmull_probe
76208599Srdivacky
77208599Srdivacky.globl	_armv8_sha512_probe
78208599Srdivacky.type	_armv8_sha512_probe,%function
79208599Srdivacky_armv8_sha512_probe:
80208599Srdivacky	.long	0xcec08000	// sha512su0	v0.2d,v0.2d
81208599Srdivacky	ret
82208599Srdivacky.size	_armv8_sha512_probe,.-_armv8_sha512_probe
83208599Srdivacky
84208599Srdivacky.globl	_armv8_cpuid_probe
85208599Srdivacky.type	_armv8_cpuid_probe,%function
86_armv8_cpuid_probe:
87	mrs	x0, midr_el1
88	ret
89.size	_armv8_cpuid_probe,.-_armv8_cpuid_probe
90
91.globl	OPENSSL_cleanse
92.type	OPENSSL_cleanse,%function
93.align	5
94OPENSSL_cleanse:
95	cbz	x1,.Lret	// len==0?
96	cmp	x1,#15
97	b.hi	.Lot		// len>15
98	nop
99.Little:
100	strb	wzr,[x0],#1	// store byte-by-byte
101	subs	x1,x1,#1
102	b.ne	.Little
103.Lret:	ret
104
105.align	4
106.Lot:	tst	x0,#7
107	b.eq	.Laligned	// inp is aligned
108	strb	wzr,[x0],#1	// store byte-by-byte
109	sub	x1,x1,#1
110	b	.Lot
111
112.align	4
113.Laligned:
114	str	xzr,[x0],#8	// store word-by-word
115	sub	x1,x1,#8
116	tst	x1,#-8
117	b.ne	.Laligned	// len>=8
118	cbnz	x1,.Little	// len!=0?
119	ret
120.size	OPENSSL_cleanse,.-OPENSSL_cleanse
121
122.globl	CRYPTO_memcmp
123.type	CRYPTO_memcmp,%function
124.align	4
125CRYPTO_memcmp:
126	eor	w3,w3,w3
127	cbz	x2,.Lno_data	// len==0?
128	cmp	x2,#16
129	b.ne	.Loop_cmp
130	ldp	x8,x9,[x0]
131	ldp	x10,x11,[x1]
132	eor	x8,x8,x10
133	eor	x9,x9,x11
134	orr	x8,x8,x9
135	mov	x0,#1
136	cmp	x8,#0
137	csel	x0,xzr,x0,eq
138	ret
139
140.align	4
141.Loop_cmp:
142	ldrb	w4,[x0],#1
143	ldrb	w5,[x1],#1
144	eor	w4,w4,w5
145	orr	w3,w3,w4
146	subs	x2,x2,#1
147	b.ne	.Loop_cmp
148
149.Lno_data:
150	neg	w0,w3
151	lsr	w0,w0,#31
152	ret
153.size	CRYPTO_memcmp,.-CRYPTO_memcmp
154___
155
156print $code;
157close STDOUT or die "error closing STDOUT: $!";
158