1e7be843bSPierre Pronchery#! /usr/bin/env perl 2*88b8b7f0SEnji Cooper# Copyright 2022-2025 The OpenSSL Project Authors. All Rights Reserved. 3e7be843bSPierre Pronchery# 4e7be843bSPierre Pronchery# Licensed under the Apache License 2.0 (the "License"). You may not use 5e7be843bSPierre Pronchery# this file except in compliance with the License. You can obtain a copy 6e7be843bSPierre Pronchery# in the file LICENSE in the source distribution or at 7e7be843bSPierre Pronchery# https://www.openssl.org/source/license.html 8e7be843bSPierre Pronchery 9e7be843bSPierre Pronchery 10e7be843bSPierre Pronchery# $output is the last argument if it looks like a file (it has an extension) 11e7be843bSPierre Pronchery# $flavour is the first argument if it doesn't look like a file 12e7be843bSPierre Pronchery$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; 13e7be843bSPierre Pronchery$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; 14e7be843bSPierre Pronchery 15e7be843bSPierre Pronchery$output and open STDOUT,">$output"; 16e7be843bSPierre Pronchery 17e7be843bSPierre Pronchery{ 18e7be843bSPierre Proncherymy ($in_a,$in_b,$len,$x,$temp1,$temp2) = ('a0','a1','a2','t0','t1','t2'); 19e7be843bSPierre Pronchery$code.=<<___; 20e7be843bSPierre Pronchery################################################################################ 21e7be843bSPierre Pronchery# int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len) 22e7be843bSPierre Pronchery################################################################################ 23e7be843bSPierre Pronchery.text 24e7be843bSPierre Pronchery.balign 16 25e7be843bSPierre Pronchery.globl CRYPTO_memcmp 26e7be843bSPierre Pronchery.type CRYPTO_memcmp,\@function 27e7be843bSPierre ProncheryCRYPTO_memcmp: 28e7be843bSPierre Pronchery li $x,0 29e7be843bSPierre Pronchery beqz $len,2f # len == 0 30e7be843bSPierre Pronchery1: 31e7be843bSPierre Pronchery lbu $temp1,0($in_a) 32e7be843bSPierre Pronchery lbu $temp2,0($in_b) 33e7be843bSPierre Pronchery addi $in_a,$in_a,1 34e7be843bSPierre Pronchery addi $in_b,$in_b,1 35e7be843bSPierre Pronchery addi $len,$len,-1 36e7be843bSPierre Pronchery xor $temp1,$temp1,$temp2 37e7be843bSPierre Pronchery or $x,$x,$temp1 38e7be843bSPierre Pronchery bgtz $len,1b 39e7be843bSPierre Pronchery2: 40e7be843bSPierre Pronchery mv a0,$x 41e7be843bSPierre Pronchery ret 42e7be843bSPierre Pronchery___ 43e7be843bSPierre Pronchery} 44e7be843bSPierre Pronchery{ 45e7be843bSPierre Proncherymy ($ptr,$len,$temp1,$temp2) = ('a0','a1','t0','t1'); 46e7be843bSPierre Pronchery$code.=<<___; 47e7be843bSPierre Pronchery################################################################################ 48e7be843bSPierre Pronchery# void OPENSSL_cleanse(void *ptr, size_t len) 49e7be843bSPierre Pronchery################################################################################ 50e7be843bSPierre Pronchery.text 51e7be843bSPierre Pronchery.balign 16 52e7be843bSPierre Pronchery.globl OPENSSL_cleanse 53e7be843bSPierre Pronchery.type OPENSSL_cleanse,\@function 54e7be843bSPierre ProncheryOPENSSL_cleanse: 55e7be843bSPierre Pronchery beqz $len,2f # len == 0, return 56e7be843bSPierre Pronchery srli $temp1,$len,4 57e7be843bSPierre Pronchery bnez $temp1,3f # len > 15 58e7be843bSPierre Pronchery 59e7be843bSPierre Pronchery1: # Store <= 15 individual bytes 60e7be843bSPierre Pronchery sb x0,0($ptr) 61e7be843bSPierre Pronchery addi $ptr,$ptr,1 62e7be843bSPierre Pronchery addi $len,$len,-1 63e7be843bSPierre Pronchery bnez $len,1b 64e7be843bSPierre Pronchery2: 65e7be843bSPierre Pronchery ret 66e7be843bSPierre Pronchery 67e7be843bSPierre Pronchery3: # Store individual bytes until we are aligned 68e7be843bSPierre Pronchery andi $temp1,$ptr,0x7 69e7be843bSPierre Pronchery beqz $temp1,4f 70e7be843bSPierre Pronchery sb x0,0($ptr) 71e7be843bSPierre Pronchery addi $ptr,$ptr,1 72e7be843bSPierre Pronchery addi $len,$len,-1 73e7be843bSPierre Pronchery j 3b 74e7be843bSPierre Pronchery 75e7be843bSPierre Pronchery4: # Store aligned dwords 76e7be843bSPierre Pronchery li $temp2,8 77e7be843bSPierre Pronchery4: 78e7be843bSPierre Pronchery sd x0,0($ptr) 79e7be843bSPierre Pronchery addi $ptr,$ptr,8 80e7be843bSPierre Pronchery addi $len,$len,-8 81e7be843bSPierre Pronchery bge $len,$temp2,4b # if len>=8 loop 82e7be843bSPierre Pronchery bnez $len,1b # if len<8 and len != 0, store remaining bytes 83e7be843bSPierre Pronchery ret 84e7be843bSPierre Pronchery___ 85e7be843bSPierre Pronchery} 86e7be843bSPierre Pronchery 87e7be843bSPierre Pronchery{ 88e7be843bSPierre Proncherymy ($ret) = ('a0'); 89e7be843bSPierre Pronchery$code .= <<___; 90e7be843bSPierre Pronchery################################################################################ 91e7be843bSPierre Pronchery# size_t riscv_vlen_asm(void) 92e7be843bSPierre Pronchery# Return VLEN (i.e. the length of a vector register in bits). 93e7be843bSPierre Pronchery.p2align 3 94e7be843bSPierre Pronchery.globl riscv_vlen_asm 95e7be843bSPierre Pronchery.type riscv_vlen_asm,\@function 96e7be843bSPierre Proncheryriscv_vlen_asm: 97*88b8b7f0SEnji Cooper # 0xc22 is CSR vlenb 98*88b8b7f0SEnji Cooper csrr $ret, 0xc22 99e7be843bSPierre Pronchery slli $ret, $ret, 3 100e7be843bSPierre Pronchery ret 101e7be843bSPierre Pronchery.size riscv_vlen_asm,.-riscv_vlen_asm 102e7be843bSPierre Pronchery___ 103e7be843bSPierre Pronchery} 104e7be843bSPierre Pronchery 105e7be843bSPierre Proncheryprint $code; 106e7be843bSPierre Proncheryclose STDOUT or die "error closing STDOUT: $!"; 107