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