Raise an error on syscall failure in tls_retry_write_records
[openssl.git] / crypto / loongarch64cpuid.pl
1 #! /usr/bin/env perl
2 # Copyright 2022 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 is the last argument if it looks like a file (it has an extension)
11 # $flavour is the first argument if it doesn't look like a file
12 ($zero,$ra,$tp,$sp)=map("\$r$_",(0..3));
13 ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$r$_",(4..11));
14 ($t0,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$t8,$t9)=map("\$r$_",(12..21));
15 ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7)=map("\$r$_",(23..30));
16 ($vr0,$vr1,$vr2,$vr3,$vr4,$vr5,$vr6,$vr7,$vr8,$vr9,$vr10,$vr11,$vr12,$vr13,$vr14,$vr15,$vr16,$vr17,$vr18,$vr19)=map("\$vr$_",(0..19));
17 ($fp)=map("\$r$_",(22));
18
19
20 for (@ARGV) {   $output=$_ if (/\w[\w\-]*\.\w+$/);      }
21 open STDOUT,">$output";
22 while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
23 open STDOUT,">$output";
24
25 {
26 my ($in_a,$in_b,$len,$m,$temp1,$temp2) = ($a0,$a1,$a2,$t0,$t1,$t2);
27 $code.=<<___;
28 ################################################################################
29 # int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len)
30 ################################################################################
31 .text
32 .balign 16
33 .globl CRYPTO_memcmp
34 .type   CRYPTO_memcmp,\@function
35 CRYPTO_memcmp:
36     li.d    $m,0
37     beqz    $len,2f   # len == 0
38 1:
39     ld.bu   $temp1,$in_a,0
40     ld.bu   $temp2,$in_b,0
41     addi.d  $in_a,$in_a,1
42     addi.d  $in_b,$in_b,1
43     addi.d  $len,$len,-1
44     xor     $temp1,$temp1,$temp2
45     or      $m,$m,$temp1
46     blt     $zero,$len,1b
47 2:
48     move    $a0,$m
49     jr      $ra
50 ___
51 }
52 {
53 my ($ptr,$len,$temp1,$temp2) = ($a0,$a1,$t0,$t1);
54 $code.=<<___;
55 ################################################################################
56 # void OPENSSL_cleanse(void *ptr, size_t len)
57 ################################################################################
58 .text
59 .balign 16
60 .globl OPENSSL_cleanse
61 .type   OPENSSL_cleanse,\@function
62 OPENSSL_cleanse:
63     beqz    $len,2f         # len == 0, return
64     srli.d  $temp1,$len,4
65     bnez    $temp1,3f       # len > 15
66
67 1:  # Store <= 15 individual bytes
68     st.b    $zero,$ptr,0
69     addi.d  $ptr,$ptr,1
70     addi.d  $len,$len,-1
71     bnez    $len,1b
72 2:
73     jr      $ra
74
75 3:  # Store individual bytes until we are aligned
76     andi    $temp1,$ptr,0x7
77     beqz    $temp1,4f
78     st.b    $zero,$ptr,0
79     addi.d  $ptr,$ptr,1
80     addi.d  $len,$len,-1
81     b       3b
82
83 4:  # Store aligned dwords
84     li.d    $temp2,8
85 4:
86     st.d    $zero,$ptr,0
87     addi.d  $ptr,$ptr,8
88     addi.d  $len,$len,-8
89     bge     $len,$temp2,4b  # if len>=8 loop
90     bnez    $len,1b         # if len<8 and len != 0, store remaining bytes
91     jr      $ra
92 ___
93 }
94 {
95 $code.=<<___;
96 ################################################################################
97 # uint32_t OPENSSL_rdtsc(void)
98 ################################################################################
99 .text
100 .balign 16
101 .globl OPENSSL_rdtsc
102 .type   OPENSSL_rdtsc,\@function
103 OPENSSL_rdtsc:
104     move    $a0,$zero
105     jr      $ra
106 ___
107 }
108
109 $code =~ s/\`([^\`]*)\`/eval($1)/gem;
110
111 print $code;
112
113 close STDOUT or die "error closing STDOUT: $!";