Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ***** SFLOAT32 MULTIPLY ************************************************
- ; Function: SFLOAT32Mul
- ; Input: SFLOAT32 |r23|r22|r21|r20|, SFLOAT32 |r19|r18|r17|r16|
- ; Output: SFLOAT32 |r23|r22|r21|r20|
- ; Destroys: SREG, r0, r1, r2, r18, r19, r24 ... r29
- ; Calls: None
- ; Cycles: 81 ... 87
- ; Bytes: 136
- ; Description: Returns product of arguments with last bit floored.
- ; Note that overflows/underflows are not handled!
- SFLOAT32Mul:
- clr r2 ; clear r2 for calculating carries later
- clt ; clear test bit for storing sign later
- eor r23, r19 ; xor leading bytes to xor sign bits
- sbrc r23, 7 ; skip if sign bit is cleared
- set ; store sign bit in test bit
- eor r23, r19 ; xor leading bytes to restore argument
- lsl r22 ; shift the lsb of exponent into carry
- rol r23 ; rotate carry into leading byte s.t. it is the entire exponent
- sec ; set carry to rotate into 2nd byte
- ror r22 ; rotate carry s.t. msb of mantissa is a '1'
- lsl r18 ; repeat above for 2nd argument
- rol r19 ; ^
- sec ; ^
- ror r18 ; ^
- mul r22, r18 ; A3 * B3
- movw r28, r0 ;
- mul r21, r17 ; A2 * B2
- movw r26, r0 ;
- mul r20, r16 ; A1 * B1
- movw r24, r0 ;
- mul r21, r16 ; A2 * B1
- add r25, r0 ;
- adc r26, r1 ;
- adc r27, r2 ;
- adc r28, r2 ;
- adc r29, r2 ;
- mul r20, r17 ; A1 * B2
- add r25, r0 ;
- adc r26, r1 ;
- adc r27, r2 ;
- adc r28, r2 ;
- adc r29, r2 ;
- mul r22, r16 ; A3 * B1
- add r26, r0 ;
- adc r27, r1 ;
- adc r28, r2 ;
- adc r29, r2 ;
- mul r20, r18 ; A1 * B3
- add r26, r0 ;
- adc r27, r1 ;
- adc r28, r2 ;
- adc r29, r2 ;
- mul r22, r17 ; A3 * B2
- add r27, r0 ;
- adc r28, r1 ;
- adc r29, r2 ;
- mul r21, r18 ; A2 * B3
- add r27, r0 ;
- adc r28, r1 ;
- adc r29, r2 ;
- add r23, r19 ; add exponents together
- subi r23, 125 ; subtract the offset of 127 minus upto 2 shifts to normalize
- SFLOAT32Mul_Normalize:
- dec r23 ; decrement exponent due to shift
- lsl r26 ; shift unnormalized mantissa left
- rol r27 ; ^
- rol r28 ; ^
- rol r29 ; ^
- brcc SFLOAT32Mul_Normalize ; shift until leading '1' of mantissa is removed
- mov r22, r29 ; move unformated mantissa to result
- mov r21, r28 ; ^
- mov r20, r27 ; ^
- brts SFLOAT32Mul_Sign ; branch if the sign bit must be set
- clc ; otherwise clear carry
- SFLOAT32Mul_Sign:
- ror r23 ; rotate carry into msb and format mantissa
- ror r22 ; ^
- ror r21 ; ^
- ror r20 ; ^
- ret ; return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement