1/* Kldexpf.s 1.2 86/01/03 */ 2 3#include "SYS.h" 4 5/* @(*)Kldexpf.s 4.2 (Berkeley) 12/21/80 6 * Tahoe 2/2/83 7 * 8 * float Kldexpf (op_most, op_least, exp, hfs) 9 * 10 * Ldexp returns value*2**exp, if that result is in range. 11 * If underflow occurs, it returns zero. If overflow occurs, 12 * it returns a value of appropriate sign and largest 13 * possible magnitude. In case of either overflow or underflow, 14 * the external int "errno" is set to ERANGE. Note that errno is 15 * not modified if no error occurs, so if you intend to test it 16 * after you use Kldexpf, you had better set it to something 17 * other than ERANGE first (zero is a reasonable value to use). 18 */ 19 20#include "fp.h" 21#include "Kfp.h" 22 23 .text 24ENTRY(Kldexpf, R2) 25 movl 4(fp),r0 /* Fetch "value" */ 26 movl 8(fp),r1 27 28 andl3 $EXPMASK,r0,r2 /* r2 := shifted biased exponent */ 29 jeql ld1 /* If it's zero, we're done */ 30 shar $EXPSHIFT,r2,r2 /* shift to get value of exponent */ 31 32 addl2 12(fp),r2 /* r2 := new biased exponent */ 33 jleq under /* if it's <= 0, we have an underflow */ 34 cmpl r2,$256 /* Otherwise check if it's too big */ 35 jgeq over /* jump if overflow */ 36/* 37 * Construct the result and return 38 */ 39 andl2 $0!EXPMASK,r0 /* clear old exponent */ 40 shal $EXPSHIFT,r2,r2 /* Put the exponent back in the result */ 41 orl2 r2,r0 42ld1: ret 43/* 44 * Underflow 45 */ 46under: clrl r0 /* Result is zero */ 47 clrl r1 48 orl2 $HFS_UNDF,*16(fp) 49 jmp err /* Join general error code */ 50/* 51 * Overflow 52 */ 53over: movl huge0,r0 /* Largest possible floating magnitude */ 54 movl huge1,r1 55 orl2 $HFS_OVF,*16(fp) 56 orl2 $SIGNBIT,r0 /* If arg < 0, make result negative */ 57 58err: orl2 $HFS_RANGE,*16(fp) /* Indicate range error */ 59 ret 60 61 .data 62huge0: .long 0x7fffffff 63huge1: .long 0xffffffff 64