1/* Copyright (c) 2002 Michael Stumpf <mistumpf@de.pepperl-fuchs.com> 2 Copyright (c) 2006 Dmitry Xmelkov 3 All rights reserved. 4 5 Redistribution and use in source and binary forms, with or without 6 modification, are permitted provided that the following conditions are met: 7 8 * Redistributions of source code must retain the above copyright 9 notice, this list of conditions and the following disclaimer. 10 * Redistributions in binary form must reproduce the above copyright 11 notice, this list of conditions and the following disclaimer in 12 the documentation and/or other materials provided with the 13 distribution. 14 * Neither the name of the copyright holders nor the names of 15 contributors may be used to endorse or promote products derived 16 from this software without specific prior written permission. 17 18 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 22 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 POSSIBILITY OF SUCH DAMAGE. */ 29 30/* $Id: fp_mintl.S 1173 2007-01-14 15:04:40Z dmix $ */ 31 32#include "fp32def.h" 33#include "asmdef.h" 34 35/* float __fp_mintl (<non-standart>); 36 Normalize value by shifting to left (only left) and merge parts of 37 float value. Mainly, this function is intended for integral values, 38 as a last stage of functions floor(), floatsisf(). Its functionality 39 is very restricted: no subnormals, no rounding, no Inf/NaN. 40 41 Input: 42 T - sign 43 rA3 - exponent 44 rA2.rA1.rA0 - mantissa 45 Output: 46 rA3.rA2.rA1.rA0 - float value 47 48 Notes: 49 * Underflow of exponent is NOT checked: result would undefined. 50 * In zero case mantissa must be 0. 51 * Sign bit is set in any case. -0.0 is possible. 52 * Shifts are optimized for speed. 53 */ 54 55ENTRY __fp_mintl 56 57 tst rA2 58 brne .L_bm 59 tst rA1 60 breq 1f 61 ; mantissa is 0x00XXXX 62 subi rA3, 8 63 or rA2, rA1 ; to obtain N flag (rA2 was 0) 64 mov rA1, rA0 65 rjmp .L_a0 66 ; mantissa is 0x0000XX 671: tst rA0 68 brne 2f 69 clr rA3 70 rjmp .L_sign 71 ; low mantissa byte != 0 722: subi rA3, 16 73 or rA2, rA0 ; to obtain N flag (rA2 was 0) 74 ldi rA1, 0 75.L_a0: ldi rA0, 0 76.L_bm: brmi .L_pack ; N flag is from rA2 77 ; shift to left (1..7 positions) 78.Loop: dec rA3 79 lsl rA0 80 rol rA1 81 rol rA2 82 brpl .Loop 83.L_pack: 84 lsl rA2 85 lsr rA3 86 ror rA2 87.L_sign: 88 bld rA3, 7 ; sign 89 ret 90ENDFUNC 91