1e1051a39Sopenharmony_ci#! /usr/bin/env perl
2e1051a39Sopenharmony_ci# Copyright 2010-2020 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci#
4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci# this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci$output = pop and open STDOUT,">$output";
11e1051a39Sopenharmony_ci
12e1051a39Sopenharmony_ciprint <<'___';
13e1051a39Sopenharmony_ci.text
14e1051a39Sopenharmony_ci
15e1051a39Sopenharmony_ci.set	noat
16e1051a39Sopenharmony_ci
17e1051a39Sopenharmony_ci.globl	OPENSSL_cpuid_setup
18e1051a39Sopenharmony_ci.ent	OPENSSL_cpuid_setup
19e1051a39Sopenharmony_ciOPENSSL_cpuid_setup:
20e1051a39Sopenharmony_ci	.frame	$30,0,$26
21e1051a39Sopenharmony_ci	.prologue 0
22e1051a39Sopenharmony_ci	ret	($26)
23e1051a39Sopenharmony_ci.end	OPENSSL_cpuid_setup
24e1051a39Sopenharmony_ci
25e1051a39Sopenharmony_ci.globl	OPENSSL_wipe_cpu
26e1051a39Sopenharmony_ci.ent	OPENSSL_wipe_cpu
27e1051a39Sopenharmony_ciOPENSSL_wipe_cpu:
28e1051a39Sopenharmony_ci	.frame	$30,0,$26
29e1051a39Sopenharmony_ci	.prologue 0
30e1051a39Sopenharmony_ci	clr	$1
31e1051a39Sopenharmony_ci	clr	$2
32e1051a39Sopenharmony_ci	clr	$3
33e1051a39Sopenharmony_ci	clr	$4
34e1051a39Sopenharmony_ci	clr	$5
35e1051a39Sopenharmony_ci	clr	$6
36e1051a39Sopenharmony_ci	clr	$7
37e1051a39Sopenharmony_ci	clr	$8
38e1051a39Sopenharmony_ci	clr	$16
39e1051a39Sopenharmony_ci	clr	$17
40e1051a39Sopenharmony_ci	clr	$18
41e1051a39Sopenharmony_ci	clr	$19
42e1051a39Sopenharmony_ci	clr	$20
43e1051a39Sopenharmony_ci	clr	$21
44e1051a39Sopenharmony_ci	clr	$22
45e1051a39Sopenharmony_ci	clr	$23
46e1051a39Sopenharmony_ci	clr	$24
47e1051a39Sopenharmony_ci	clr	$25
48e1051a39Sopenharmony_ci	clr	$27
49e1051a39Sopenharmony_ci	clr	$at
50e1051a39Sopenharmony_ci	clr	$29
51e1051a39Sopenharmony_ci	fclr	$f0
52e1051a39Sopenharmony_ci	fclr	$f1
53e1051a39Sopenharmony_ci	fclr	$f10
54e1051a39Sopenharmony_ci	fclr	$f11
55e1051a39Sopenharmony_ci	fclr	$f12
56e1051a39Sopenharmony_ci	fclr	$f13
57e1051a39Sopenharmony_ci	fclr	$f14
58e1051a39Sopenharmony_ci	fclr	$f15
59e1051a39Sopenharmony_ci	fclr	$f16
60e1051a39Sopenharmony_ci	fclr	$f17
61e1051a39Sopenharmony_ci	fclr	$f18
62e1051a39Sopenharmony_ci	fclr	$f19
63e1051a39Sopenharmony_ci	fclr	$f20
64e1051a39Sopenharmony_ci	fclr	$f21
65e1051a39Sopenharmony_ci	fclr	$f22
66e1051a39Sopenharmony_ci	fclr	$f23
67e1051a39Sopenharmony_ci	fclr	$f24
68e1051a39Sopenharmony_ci	fclr	$f25
69e1051a39Sopenharmony_ci	fclr	$f26
70e1051a39Sopenharmony_ci	fclr	$f27
71e1051a39Sopenharmony_ci	fclr	$f28
72e1051a39Sopenharmony_ci	fclr	$f29
73e1051a39Sopenharmony_ci	fclr	$f30
74e1051a39Sopenharmony_ci	mov	$sp,$0
75e1051a39Sopenharmony_ci	ret	($26)
76e1051a39Sopenharmony_ci.end	OPENSSL_wipe_cpu
77e1051a39Sopenharmony_ci
78e1051a39Sopenharmony_ci.globl	OPENSSL_atomic_add
79e1051a39Sopenharmony_ci.ent	OPENSSL_atomic_add
80e1051a39Sopenharmony_ciOPENSSL_atomic_add:
81e1051a39Sopenharmony_ci	.frame	$30,0,$26
82e1051a39Sopenharmony_ci	.prologue 0
83e1051a39Sopenharmony_ci1:	ldl_l	$0,0($16)
84e1051a39Sopenharmony_ci	addl	$0,$17,$1
85e1051a39Sopenharmony_ci	stl_c	$1,0($16)
86e1051a39Sopenharmony_ci	beq	$1,1b
87e1051a39Sopenharmony_ci	addl	$0,$17,$0
88e1051a39Sopenharmony_ci	ret	($26)
89e1051a39Sopenharmony_ci.end	OPENSSL_atomic_add
90e1051a39Sopenharmony_ci
91e1051a39Sopenharmony_ci.globl	OPENSSL_rdtsc
92e1051a39Sopenharmony_ci.ent	OPENSSL_rdtsc
93e1051a39Sopenharmony_ciOPENSSL_rdtsc:
94e1051a39Sopenharmony_ci	.frame	$30,0,$26
95e1051a39Sopenharmony_ci	.prologue 0
96e1051a39Sopenharmony_ci	rpcc	$0
97e1051a39Sopenharmony_ci	ret	($26)
98e1051a39Sopenharmony_ci.end	OPENSSL_rdtsc
99e1051a39Sopenharmony_ci
100e1051a39Sopenharmony_ci.globl	OPENSSL_cleanse
101e1051a39Sopenharmony_ci.ent	OPENSSL_cleanse
102e1051a39Sopenharmony_ciOPENSSL_cleanse:
103e1051a39Sopenharmony_ci	.frame	$30,0,$26
104e1051a39Sopenharmony_ci	.prologue 0
105e1051a39Sopenharmony_ci	beq	$17,.Ldone
106e1051a39Sopenharmony_ci	and	$16,7,$0
107e1051a39Sopenharmony_ci	bic	$17,7,$at
108e1051a39Sopenharmony_ci	beq	$at,.Little
109e1051a39Sopenharmony_ci	beq	$0,.Laligned
110e1051a39Sopenharmony_ci
111e1051a39Sopenharmony_ci.Little:
112e1051a39Sopenharmony_ci	subq	$0,8,$0
113e1051a39Sopenharmony_ci	ldq_u	$1,0($16)
114e1051a39Sopenharmony_ci	mov	$16,$2
115e1051a39Sopenharmony_ci.Lalign:
116e1051a39Sopenharmony_ci	mskbl	$1,$16,$1
117e1051a39Sopenharmony_ci	lda	$16,1($16)
118e1051a39Sopenharmony_ci	subq	$17,1,$17
119e1051a39Sopenharmony_ci	addq	$0,1,$0
120e1051a39Sopenharmony_ci	beq	$17,.Lout
121e1051a39Sopenharmony_ci	bne	$0,.Lalign
122e1051a39Sopenharmony_ci.Lout:	stq_u	$1,0($2)
123e1051a39Sopenharmony_ci	beq	$17,.Ldone
124e1051a39Sopenharmony_ci	bic	$17,7,$at
125e1051a39Sopenharmony_ci	beq	$at,.Little
126e1051a39Sopenharmony_ci
127e1051a39Sopenharmony_ci.Laligned:
128e1051a39Sopenharmony_ci	stq	$31,0($16)
129e1051a39Sopenharmony_ci	subq	$17,8,$17
130e1051a39Sopenharmony_ci	lda	$16,8($16)
131e1051a39Sopenharmony_ci	bic	$17,7,$at
132e1051a39Sopenharmony_ci	bne	$at,.Laligned
133e1051a39Sopenharmony_ci	bne	$17,.Little
134e1051a39Sopenharmony_ci.Ldone: ret	($26)
135e1051a39Sopenharmony_ci.end	OPENSSL_cleanse
136e1051a39Sopenharmony_ci
137e1051a39Sopenharmony_ci.globl	CRYPTO_memcmp
138e1051a39Sopenharmony_ci.ent	CRYPTO_memcmp
139e1051a39Sopenharmony_ciCRYPTO_memcmp:
140e1051a39Sopenharmony_ci	.frame	$30,0,$26
141e1051a39Sopenharmony_ci	.prologue 0
142e1051a39Sopenharmony_ci	xor	$0,$0,$0
143e1051a39Sopenharmony_ci	beq	$18,.Lno_data
144e1051a39Sopenharmony_ci
145e1051a39Sopenharmony_ci	xor	$1,$1,$1
146e1051a39Sopenharmony_ci	nop
147e1051a39Sopenharmony_ci.Loop_cmp:
148e1051a39Sopenharmony_ci	ldq_u	$2,0($16)
149e1051a39Sopenharmony_ci	subq	$18,1,$18
150e1051a39Sopenharmony_ci	ldq_u	$3,0($17)
151e1051a39Sopenharmony_ci	extbl	$2,$16,$2
152e1051a39Sopenharmony_ci	lda	$16,1($16)
153e1051a39Sopenharmony_ci	extbl	$3,$17,$3
154e1051a39Sopenharmony_ci	lda	$17,1($17)
155e1051a39Sopenharmony_ci	xor	$3,$2,$2
156e1051a39Sopenharmony_ci	or	$2,$0,$0
157e1051a39Sopenharmony_ci	bne	$18,.Loop_cmp
158e1051a39Sopenharmony_ci
159e1051a39Sopenharmony_ci	subq	$31,$0,$0
160e1051a39Sopenharmony_ci	srl	$0,63,$0
161e1051a39Sopenharmony_ci.Lno_data:
162e1051a39Sopenharmony_ci	ret	($26)
163e1051a39Sopenharmony_ci.end	CRYPTO_memcmp
164e1051a39Sopenharmony_ci___
165e1051a39Sopenharmony_ci{
166e1051a39Sopenharmony_cimy ($out,$cnt,$max)=("\$16","\$17","\$18");
167e1051a39Sopenharmony_cimy ($tick,$lasttick)=("\$19","\$20");
168e1051a39Sopenharmony_cimy ($diff,$lastdiff)=("\$21","\$22");
169e1051a39Sopenharmony_cimy ($v0,$ra,$sp,$zero)=("\$0","\$26","\$30","\$31");
170e1051a39Sopenharmony_ci
171e1051a39Sopenharmony_ciprint <<___;
172e1051a39Sopenharmony_ci.globl	OPENSSL_instrument_bus
173e1051a39Sopenharmony_ci.ent	OPENSSL_instrument_bus
174e1051a39Sopenharmony_ciOPENSSL_instrument_bus:
175e1051a39Sopenharmony_ci	.frame	$sp,0,$ra
176e1051a39Sopenharmony_ci	.prologue 0
177e1051a39Sopenharmony_ci	mov	$cnt,$v0
178e1051a39Sopenharmony_ci
179e1051a39Sopenharmony_ci	rpcc	$lasttick
180e1051a39Sopenharmony_ci	mov	0,$diff
181e1051a39Sopenharmony_ci
182e1051a39Sopenharmony_ci	ecb	($out)
183e1051a39Sopenharmony_ci	ldl_l	$tick,0($out)
184e1051a39Sopenharmony_ci	addl	$diff,$tick,$tick
185e1051a39Sopenharmony_ci	mov	$tick,$diff
186e1051a39Sopenharmony_ci	stl_c	$tick,0($out)
187e1051a39Sopenharmony_ci	stl	$diff,0($out)
188e1051a39Sopenharmony_ci
189e1051a39Sopenharmony_ci.Loop:	rpcc	$tick
190e1051a39Sopenharmony_ci	subq	$tick,$lasttick,$diff
191e1051a39Sopenharmony_ci	mov	$tick,$lasttick
192e1051a39Sopenharmony_ci
193e1051a39Sopenharmony_ci	ecb	($out)
194e1051a39Sopenharmony_ci	ldl_l	$tick,0($out)
195e1051a39Sopenharmony_ci	addl	$diff,$tick,$tick
196e1051a39Sopenharmony_ci	mov	$tick,$diff
197e1051a39Sopenharmony_ci	stl_c	$tick,0($out)
198e1051a39Sopenharmony_ci	stl	$diff,0($out)
199e1051a39Sopenharmony_ci
200e1051a39Sopenharmony_ci	subl	$cnt,1,$cnt
201e1051a39Sopenharmony_ci	lda	$out,4($out)
202e1051a39Sopenharmony_ci	bne	$cnt,.Loop
203e1051a39Sopenharmony_ci
204e1051a39Sopenharmony_ci	ret	($ra)
205e1051a39Sopenharmony_ci.end	OPENSSL_instrument_bus
206e1051a39Sopenharmony_ci
207e1051a39Sopenharmony_ci.globl	OPENSSL_instrument_bus2
208e1051a39Sopenharmony_ci.ent	OPENSSL_instrument_bus2
209e1051a39Sopenharmony_ciOPENSSL_instrument_bus2:
210e1051a39Sopenharmony_ci	.frame	$sp,0,$ra
211e1051a39Sopenharmony_ci	.prologue 0
212e1051a39Sopenharmony_ci	mov	$cnt,$v0
213e1051a39Sopenharmony_ci
214e1051a39Sopenharmony_ci	rpcc	$lasttick
215e1051a39Sopenharmony_ci	mov	0,$diff
216e1051a39Sopenharmony_ci
217e1051a39Sopenharmony_ci	ecb	($out)
218e1051a39Sopenharmony_ci	ldl_l	$tick,0($out)
219e1051a39Sopenharmony_ci	addl	$diff,$tick,$tick
220e1051a39Sopenharmony_ci	mov	$tick,$diff
221e1051a39Sopenharmony_ci	stl_c	$tick,0($out)
222e1051a39Sopenharmony_ci	stl	$diff,0($out)
223e1051a39Sopenharmony_ci
224e1051a39Sopenharmony_ci	rpcc	$tick
225e1051a39Sopenharmony_ci	subq	$tick,$lasttick,$diff
226e1051a39Sopenharmony_ci	mov	$tick,$lasttick
227e1051a39Sopenharmony_ci	mov	$diff,$lastdiff
228e1051a39Sopenharmony_ci.Loop2:
229e1051a39Sopenharmony_ci	ecb	($out)
230e1051a39Sopenharmony_ci	ldl_l	$tick,0($out)
231e1051a39Sopenharmony_ci	addl	$diff,$tick,$tick
232e1051a39Sopenharmony_ci	mov	$tick,$diff
233e1051a39Sopenharmony_ci	stl_c	$tick,0($out)
234e1051a39Sopenharmony_ci	stl	$diff,0($out)
235e1051a39Sopenharmony_ci
236e1051a39Sopenharmony_ci	subl	$max,1,$max
237e1051a39Sopenharmony_ci	beq	$max,.Ldone2
238e1051a39Sopenharmony_ci
239e1051a39Sopenharmony_ci	rpcc	$tick
240e1051a39Sopenharmony_ci	subq	$tick,$lasttick,$diff
241e1051a39Sopenharmony_ci	mov	$tick,$lasttick
242e1051a39Sopenharmony_ci	subq	$lastdiff,$diff,$tick
243e1051a39Sopenharmony_ci	mov	$diff,$lastdiff
244e1051a39Sopenharmony_ci	cmovne	$tick,1,$tick
245e1051a39Sopenharmony_ci	subl	$cnt,$tick,$cnt
246e1051a39Sopenharmony_ci	s4addq	$tick,$out,$out
247e1051a39Sopenharmony_ci	bne	$cnt,.Loop2
248e1051a39Sopenharmony_ci
249e1051a39Sopenharmony_ci.Ldone2:
250e1051a39Sopenharmony_ci	subl	$v0,$cnt,$v0
251e1051a39Sopenharmony_ci	ret	($ra)
252e1051a39Sopenharmony_ci.end	OPENSSL_instrument_bus2
253e1051a39Sopenharmony_ci___
254e1051a39Sopenharmony_ci}
255e1051a39Sopenharmony_ci
256e1051a39Sopenharmony_ciclose STDOUT or die "error closing STDOUT: $!";
257