URL
https://opencores.org/ocsvn/forwardcom/forwardcom/trunk
Subversion Repositories forwardcom
[/] [forwardcom/] [libraries/] [multiply_int_light.as] - Rev 96
Go to most recent revision | Compare with Previous | Blame | View Log
/**************************** multiply_int_light.as *************************** Author: Agner Fog* date created: 2021-05-26* Last modified: 2021-05-26* Version: 1.11* Project: ForwardCom library libc_light.li* Description: multiply_int: multiply two 32-bit signed integers* This function is for small CPUs with limited capabilities and no multiplication instruction** Copyright 2021 GNU General Public License http://www.gnu.org/licenses*****************************************************************************/code section execute_multiply_int function public reguse=1,0// multiplies two 32 bit signed integers. no overflow check// input r0, r1: factors// save r1, r2, r3int64 sp -= 3*8int64 [sp] = r1int64 [sp+8] = r2int64 [sp+0x10] = r3// get signsint32 r2 = r0 < 0 // sign of r0int32 r0 = -r0, mask = r2 // abs(r0)int32 r3 = r1 < 0 // sign of r1int32 r1 = -r1, mask = r3 // abs(r1)int r3 ^= r2 // sign of product// get the smallest factor in r1if (uint32 r1 > r0) {int32 r2 = r1int32 r1 = r0int32 r0 = r2}int32 r2 = 0 // summation of r0 multiplied by each bit in r1while (int32 r1 != 0) { // multiplication loopuint32 r2 += r0, mask = r1 // add r0 if bit 0 of r1uint32 r1 >>= 1uint32 r0 <<= 1}int32 r0 = r3 ? -r2 : r2 // apply sign// restore r2, r3int64 r1 = [sp]int64 r2 = [sp+8]int64 r3 = [sp+0x10]int64 sp += 3*8returncode end
Go to most recent revision | Compare with Previous | Blame | View Log
