Update documentation for keymgmt export utils
[openssl.git] / crypto / riscv32cpuid.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 $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
13 $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
14
15 $output and open STDOUT,">$output";
16
17 {
18 my ($in_a,$in_b,$len,$x,$temp1,$temp2) = ('a0','a1','a2','t0','t1','t2');
19 $code.=<<___;
20 ################################################################################
21 # int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len)
22 ################################################################################
23 .text
24 .balign 16
25 .globl CRYPTO_memcmp
26 .type   CRYPTO_memcmp,\@function
27 CRYPTO_memcmp:
28     li      $x,0
29     beqz    $len,2f   # len == 0
30 1:
31     lbu     $temp1,0($in_a)
32     lbu     $temp2,0($in_b)
33     addi    $in_a,$in_a,1
34     addi    $in_b,$in_b,1
35     addi    $len,$len,-1
36     xor     $temp1,$temp1,$temp2
37     or      $x,$x,$temp1
38     bgtz    $len,1b
39 2:
40     mv      a0,$x
41     ret
42 ___
43 }
44 {
45 my ($ptr,$len,$temp1,$temp2) = ('a0','a1','t0','t1');
46 $code.=<<___;
47 ################################################################################
48 # void OPENSSL_cleanse(void *ptr, size_t len)
49 ################################################################################
50 .text
51 .balign 16
52 .globl OPENSSL_cleanse
53 .type   OPENSSL_cleanse,\@function
54 OPENSSL_cleanse:
55     beqz    $len,2f         # len == 0, return
56     srli    $temp1,$len,4
57     bnez    $temp1,3f       # len > 15
58
59 1:  # Store <= 15 individual bytes
60     sb      x0,0($ptr)
61     addi    $ptr,$ptr,1
62     addi    $len,$len,-1
63     bnez    $len,1b
64 2:
65     ret
66
67 3:  # Store individual bytes until we are aligned
68     andi    $temp1,$ptr,0x3
69     beqz    $temp1,4f
70     sb      x0,0($ptr)
71     addi    $ptr,$ptr,1
72     addi    $len,$len,-1
73     j       3b
74
75 4:  # Store aligned words
76     li      $temp2,4
77 4:
78     sw      x0,0($ptr)
79     addi    $ptr,$ptr,4
80     addi    $len,$len,-4
81     bge     $len,$temp2,4b  # if len>=4 loop
82     bnez    $len,1b         # if len<4 and len != 0, store remaining bytes
83     ret
84 ___
85 }
86
87 print $code;
88 close STDOUT or die "error closing STDOUT: $!";