diff options
author | Hongren (Zenithal) Zheng <i@zenithal.me> | 2022-05-14 00:02:44 +0800 |
---|---|---|
committer | Pauli <pauli@openssl.org> | 2022-09-05 10:20:30 +1000 |
commit | 61170642b1ad084ae4f52e43d39c5c1e471b323a (patch) | |
tree | 87f37610c290f876cc05de4cb3fd7496aca48d7f /crypto/riscv32cpuid.pl | |
parent | 42ee6e7be43c57136d71e5612fed22a06f7f5d0e (diff) | |
download | openssl-new-61170642b1ad084ae4f52e43d39c5c1e471b323a.tar.gz |
Add RISC-V 32 cpuid support
Mainly from #17640
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/18308)
Diffstat (limited to 'crypto/riscv32cpuid.pl')
-rw-r--r-- | crypto/riscv32cpuid.pl | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/crypto/riscv32cpuid.pl b/crypto/riscv32cpuid.pl new file mode 100644 index 0000000000..20694e7de7 --- /dev/null +++ b/crypto/riscv32cpuid.pl @@ -0,0 +1,88 @@ +#! /usr/bin/env perl +# Copyright 2022 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html + + +# $output is the last argument if it looks like a file (it has an extension) +# $flavour is the first argument if it doesn't look like a file +$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; +$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; + +$output and open STDOUT,">$output"; + +{ +my ($in_a,$in_b,$len,$x,$temp1,$temp2) = ('a0','a1','a2','t0','t1','t2'); +$code.=<<___; +################################################################################ +# int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len) +################################################################################ +.text +.balign 16 +.globl CRYPTO_memcmp +.type CRYPTO_memcmp,\@function +CRYPTO_memcmp: + li $x,0 + beqz $len,2f # len == 0 +1: + lbu $temp1,0($in_a) + lbu $temp2,0($in_b) + addi $in_a,$in_a,1 + addi $in_b,$in_b,1 + addi $len,$len,-1 + xor $temp1,$temp1,$temp2 + or $x,$x,$temp1 + bgtz $len,1b +2: + mv a0,$x + ret +___ +} +{ +my ($ptr,$len,$temp1,$temp2) = ('a0','a1','t0','t1'); +$code.=<<___; +################################################################################ +# void OPENSSL_cleanse(void *ptr, size_t len) +################################################################################ +.text +.balign 16 +.globl OPENSSL_cleanse +.type OPENSSL_cleanse,\@function +OPENSSL_cleanse: + beqz $len,2f # len == 0, return + srli $temp1,$len,4 + bnez $temp1,3f # len > 15 + +1: # Store <= 15 individual bytes + sb x0,0($ptr) + addi $ptr,$ptr,1 + addi $len,$len,-1 + bnez $len,1b +2: + ret + +3: # Store individual bytes until we are aligned + andi $temp1,$ptr,0x3 + beqz $temp1,4f + sb x0,0($ptr) + addi $ptr,$ptr,1 + addi $len,$len,-1 + j 3b + +4: # Store aligned words + li $temp2,4 +4: + sw x0,0($ptr) + addi $ptr,$ptr,4 + addi $len,$len,-4 + bge $len,$temp2,4b # if len>=4 loop + bnez $len,1b # if len<4 and len != 0, store remaining bytes + ret +___ +} + +print $code; +close STDOUT or die "error closing STDOUT: $!"; |