From 2972d9e239024a39831f47c9c73c4e88eb7c8235 Mon Sep 17 00:00:00 2001 From: Daniel Schloms <39174065+danielschloms@users.noreply.github.com> Date: Thu, 29 Aug 2024 14:56:05 +0200 Subject: [PATCH] Fix off-by-one error in `get_shiftamount` (#9) per "The RISC-V Instruction Set Manual Volume I Unprivileged Architecture Version 20240411", Sec. 33.11.6. Vector Single-Width Shift Instructions --- src/vpu/softvector-element.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vpu/softvector-element.cpp b/src/vpu/softvector-element.cpp index b9ef450..a6a3372 100644 --- a/src/vpu/softvector-element.cpp +++ b/src/vpu/softvector-element.cpp @@ -57,6 +57,7 @@ inline SVElement u_mul_u(const SVElement& target, const SVElement& op1, const SV inline size_t get_shiftamount(size_t target_width_bits, const uint8_t* rhs) { size_t numberofbits = 0; size_t shiftamount = 0; + target_width_bits >>= 1; while(target_width_bits) { target_width_bits = target_width_bits >> 1; shiftamount |= rhs[numberofbits/8] & (1 << numberofbits); @@ -68,6 +69,7 @@ inline size_t get_shiftamount(size_t target_width_bits, const uint8_t* rhs) { inline size_t get_shiftamount(size_t target_width_bits, uint64_t rhs) { size_t numberofbits = 0; size_t shiftamount = 0; + target_width_bits >>= 1; while(target_width_bits) { target_width_bits = target_width_bits >> 1; shiftamount |= rhs & (1 << numberofbits);