Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ***** SFLOAT32 DIVIDE **************************************************
- ; Function: SFLOAT32Div
- ; Input: SFLOAT32 |r23|r22|r21|r20|, SFLOAT32 |r19|r18|r17|r16|
- ; Output: SFLOAT32 |r27|r26|r25|r24|
- ; Destroys: SREG, r2, r18, r19, r24 ... r27
- ; Calls: None
- ; Cycles: 426 ... 456
- ; Bytes: 116
- ; Description: ?
- SFLOAT32Div:
- 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 ; ^
- sub r23, r19 ; add exponents together
- subi r23, -128 ; add the offset of 127 plus upto 1 shift to normalize
- clr r2 ; clear r2 for calculating carries later
- sub r19, r19 ; clear r19 for shifting remainder and clear carry
- ldi r24, 25 ; initialize loop counter
- SFLOAT32Div_loop:
- rol r25 ;
- rol r26 ;
- rol r27 ;
- dec r24 ;
- breq SFLOAT32Div_Normalize ;
- sub r20, r16 ;
- sbc r21, r17 ;
- sbc r22, r18 ;
- sbc r19, r2 ;
- brcc SFLOAT32Div_NNeg ;
- add r20, r16 ;
- adc r21, r17 ;
- adc r22, r18 ;
- adc r19, r2 ;
- lsl r20 ;
- rol r21 ;
- rol r22 ;
- rol r19 ;
- rjmp SFLOAT32Div_Loop ;
- SFLOAT32Div_NNeg:
- lsl r20 ;
- rol r21 ;
- rol r22 ;
- rol r19 ;
- sec
- rjmp SFLOAT32Div_Loop ;
- SFLOAT32Div_Normalize:
- dec r23 ;
- lsl r25 ;
- rol r26 ;
- rol r27 ;
- brcc SFLOAT32Div_Normalize ;
- brts SFLOAT32Div_Sign ;
- clc ;
- SFLOAT32Div_Sign:
- mov r22, r27 ;
- mov r21, r26 ;
- mov r20, r25 ;
- ror r23 ;
- ror r22 ;
- ror r21 ;
- ror r20 ;
- ret ; return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement