Support for SPARC T4 MONT[MUL|SQR] instructions.
[openssl.git] / crypto / c64xpluscpuid.pl
1 #!/usr/bin/env perl
2 #
3
4 while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
5 open STDOUT,">$output";
6
7 $code.=<<___;
8         .text
9
10         .asg    B3,RA
11
12         .global _OPENSSL_rdtsc
13 _OPENSSL_rdtsc:
14         .asmfunc
15         B       RA
16         MVC     TSCL,B0
17         MVC     TSCH,B1
18   [!B0] MVC     B0,TSCL         ; start TSC
19         MV      B0,A4
20         MV      B1,A5
21         .endasmfunc
22
23         .global _OPENSSL_cleanse
24 _OPENSSL_cleanse:
25         .asmfunc
26         ZERO    A3:A2
27 ||      ZERO    B2
28 ||      SHRU    B4,3,B0         ; is length >= 8
29 ||      ADD     1,A4,B6
30   [!B0] BNOP    RA
31 ||      ZERO    A1
32 ||      ZERO    B1
33    [B0] MVC     B0,ILC
34 ||[!B0] CMPLT   0,B4,A1
35 ||[!B0] CMPLT   1,B4,B1
36    [A1] STB     A2,*A4++[2]
37 || [B1] STB     B2,*B6++[2]
38 ||[!B0] CMPLT   2,B4,A1
39 ||[!B0] CMPLT   3,B4,B1
40    [A1] STB     A2,*A4++[2]
41 || [B1] STB     B2,*B6++[2]
42 ||[!B0] CMPLT   4,B4,A1
43 ||[!B0] CMPLT   5,B4,B1
44    [A1] STB     A2,*A4++[2]
45 || [B1] STB     B2,*B6++[2]
46 ||[!B0] CMPLT   6,B4,A1
47    [A1] STB     A2,*A4++[2]
48
49         SPLOOP  1
50         STNDW   A3:A2,*A4++
51 ||      SUB     B4,8,B4
52         SPKERNEL
53
54         MV      B4,B0           ; remaining bytes
55 ||      ADD     1,A4,B6
56 ||      BNOP    RA
57    [B0] CMPLT   0,B0,A1
58 || [B0] CMPLT   1,B0,B1
59    [A1] STB     A2,*A4++[2]
60 || [B1] STB     B2,*B6++[2]
61 || [B0] CMPLT   2,B0,A1
62 || [B0] CMPLT   3,B0,B1
63    [A1] STB     A2,*A4++[2]
64 || [B1] STB     B2,*B6++[2]
65 || [B0] CMPLT   4,B0,A1
66 || [B0] CMPLT   5,B0,B1
67    [A1] STB     A2,*A4++[2]
68 || [B1] STB     B2,*B6++[2]
69 || [B0] CMPLT   6,B0,A1
70    [A1] STB     A2,*A4++[2]
71         .endasmfunc
72
73         .global _OPENSSL_atomic_add
74 _OPENSSL_atomic_add:
75         .asmfunc
76         MV      A4,B0
77 atomic_add?:
78         LL      *B0,B5
79         NOP     4
80         ADD     B4,B5,B5
81         SL      B5,*B0
82         CMTL    *B0,B1
83         NOP     4
84   [!B1] B       atomic_add?
85    [B1] BNOP    RA,4
86         MV      B5,A4
87         .endasmfunc
88
89         .global _OPENSSL_wipe_cpu
90 _OPENSSL_wipe_cpu:
91         .asmfunc
92         ZERO    A0
93 ||      ZERO    B0
94 ||      ZERO    A1
95 ||      ZERO    B1
96         ZERO    A3:A2
97 ||      MVD     B0,B2
98 ||      ZERO    A4
99 ||      ZERO    B4
100 ||      ZERO    A5
101 ||      ZERO    B5
102 ||      BNOP    RA
103         ZERO    A7:A6
104 ||      ZERO    B7:B6
105 ||      ZERO    A8
106 ||      ZERO    B8
107 ||      ZERO    A9
108 ||      ZERO    B9
109         ZERO    A17:A16
110 ||      ZERO    B17:B16
111 ||      ZERO    A18
112 ||      ZERO    B18
113 ||      ZERO    A19
114 ||      ZERO    B19
115         ZERO    A21:A20
116 ||      ZERO    B21:B20
117 ||      ZERO    A22
118 ||      ZERO    B22
119 ||      ZERO    A23
120 ||      ZERO    B23
121         ZERO    A25:A24
122 ||      ZERO    B25:B24
123 ||      ZERO    A26
124 ||      ZERO    B26
125 ||      ZERO    A27
126 ||      ZERO    B27
127         ZERO    A29:A28
128 ||      ZERO    B29:B28
129 ||      ZERO    A30
130 ||      ZERO    B30
131 ||      ZERO    A31
132 ||      ZERO    B31
133         .endasmfunc
134
135 CLFLUSH .macro  CONTROL,ADDR,LEN
136         B       passthrough?
137 ||      STW     ADDR,*CONTROL[0]
138         STW     LEN,*CONTROL[1]
139 spinlock?:
140         LDW     *CONTROL[1],A0
141         NOP     3
142 passthrough?:
143         NOP
144   [A0]  BNOP    spinlock?,5
145         .endm
146
147         .global _OPENSSL_instrument_bus
148 _OPENSSL_instrument_bus:
149         .asmfunc
150         MV      B4,B0                   ; reassign sizeof(output)
151 ||      MV      A4,B4                   ; reassign output
152 ||      MVK     0x00004030,A3
153         MV      B0,A4                   ; return value
154 ||      MVK     1,A1
155 ||      MVKH    0x01840000,A3           ; L1DWIBAR
156         MVC     TSCL,B8                 ; collect 1st tick
157 ||      MVK     0x00004010,A5
158         MV      B8,B9                   ; lasttick = tick
159 ||      MVK     0,B7                    ; lastdiff = 0
160 ||      MVKH    0x01840000,A5           ; L2WIBAR
161         CLFLUSH A3,B4,A1                ; write-back and invalidate L1D line
162         CLFLUSH A5,B4,A1                ; write-back and invalidate L2 line
163         LL      *B4,B5
164         NOP     4
165         ADD     B7,B5,B5
166         SL      B5,*B4
167         CMTL    *B4,B1
168         NOP     4
169         STW     B5,*B4
170 bus_loop1?:
171         MVC     TSCL,B8
172 || [B0] SUB     B0,1,B0
173         SUB     B8,B9,B7                ; lastdiff = tick - lasttick
174 ||      MV      B8,B9                   ; lasttick = tick
175         CLFLUSH A3,B4,A1                ; write-back and invalidate L1D line
176         CLFLUSH A5,B4,A1                ; write-back and invalidate L2 line
177         LL      *B4,B5
178         NOP     4
179         ADD     B7,B5,B5
180         SL      B5,*B4
181         CMTL    *B4,B1
182         STW     B5,*B4                  ; [!B1] is removed to flatten samples
183 ||      ADDK    4,B4
184 || [B0] BNOP    bus_loop1?,5
185
186         BNOP    RA,5
187         .endasmfunc
188
189         .global _OPENSSL_instrument_bus2
190 _OPENSSL_instrument_bus2:
191         .asmfunc
192         MV      A6,B0                   ; reassign max
193 ||      MV      B4,A6                   ; reassing sizeof(output)
194 ||      MVK     0x00004030,A3
195         MV      A4,B4                   ; reassign output
196 ||      MVK     0,A4                    ; return value
197 ||      MVK     1,A1
198 ||      MVKH    0x01840000,A3           ; L1DWIBAR
199
200         MVC     TSCL,B8                 ; collect 1st tick
201 ||      MVK     0x00004010,A5
202         MV      B8,B9                   ; lasttick = tick
203 ||      MVK     0,B7                    ; lastdiff = 0
204 ||      MVKH    0x01840000,A5           ; L2WIBAR
205         CLFLUSH A3,B4,A1                ; write-back and invalidate L1D line
206         CLFLUSH A5,B4,A1                ; write-back and invalidate L2 line
207         LL      *B4,B5
208         NOP     4
209         ADD     B7,B5,B5
210         SL      B5,*B4
211         CMTL    *B4,B1
212         NOP     4
213         STW     B5,*B4
214
215         MVC     TSCL,B8                 ; collect 1st diff
216         SUB     B8,B9,B7                ; lastdiff = tick - lasttick
217 ||      MV      B8,B9                   ; lasttick = tick
218 ||      SUB     B0,1,B0
219 bus_loop2?:
220         CLFLUSH A3,B4,A1                ; write-back and invalidate L1D line
221         CLFLUSH A5,B4,A1                ; write-back and invalidate L2 line
222         LL      *B4,B5
223         NOP     4
224         ADD     B7,B5,B5
225         SL      B5,*B4
226         CMTL    *B4,B1
227         STW     B5,*B4                  ; [!B1] is removed to flatten samples
228 ||[!B0] BNOP    bus_loop2_done?,2
229 ||      SUB     B0,1,B0
230         MVC     TSCL,B8
231         SUB     B8,B9,B8
232 ||      MV      B8,B9
233         CMPEQ   B8,B7,B2
234 ||      MV      B8,B7
235   [!B2] ADDAW   B4,1,B4
236 ||[!B2] ADDK    1,A4
237         CMPEQ   A4,A6,A2
238   [!A2] BNOP    bus_loop2?,5
239
240 bus_loop2_done?:
241         BNOP    RA,5
242         .endasmfunc
243 ___
244
245 print $code;
246 close STDOUT;