/* * Copyright (C) 2024 Michael Brown . * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * * You can also choose to distribute this program under the terms of * the Unmodified Binary Distribution Licence (as given in the file * COPYING.UBDL), provided that you have satisfied its requirements. */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) /** @file * * Byte swapping * */ .section ".note.GNU-stack", "", @progbits .text /** * Find first (i.e. least significant) set bit * * @v value Value * @ret lsb Least significant bit set in value (LSB=1), or zero */ .section ".text.riscv_ffs" .globl riscv_ffs riscv_ffs: beqz a0, 2f mv t0, a0 li a0, ( __riscv_xlen + 1 ) 1: slli t0, t0, 1 addi a0, a0, -1 bnez t0, 1b 2: ret .size riscv_ffs, . - riscv_ffs /** * Find last (i.e. most significant) set bit * * @v value Value * @ret msb Most significant bit set in value (LSB=1), or zero */ .section ".text.riscv_fls" .globl riscv_fls riscv_fls: beqz a0, 2f mv t0, a0 li a0, __riscv_xlen bltz t0, 2f 1: slli t0, t0, 1 addi a0, a0, -1 bgez t0, 1b 2: ret .size riscv_fls, . - riscv_fls