54 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			54 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*---------------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								 |  reg_convert.c                                                            |
							 | 
						||
| 
								 | 
							
								 |                                                                           |
							 | 
						||
| 
								 | 
							
								 |  Convert register representation.                                         |
							 | 
						||
| 
								 | 
							
								 |                                                                           |
							 | 
						||
| 
								 | 
							
								 | Copyright (C) 1992,1993,1994,1996,1997                                    |
							 | 
						||
| 
								 | 
							
								 |                  W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
							 | 
						||
| 
								 | 
							
								 |                  E-mail   billm@suburbia.net                              |
							 | 
						||
| 
								 | 
							
								 |                                                                           |
							 | 
						||
| 
								 | 
							
								 |                                                                           |
							 | 
						||
| 
								 | 
							
								 +---------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "exception.h"
							 | 
						||
| 
								 | 
							
								#include "fpu_emu.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int FPU_to_exp16(FPU_REG const *a, FPU_REG *x)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  int sign = getsign(a);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  *(long long *)&(x->sigl) = *(const long long *)&(a->sigl);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Set up the exponent as a 16 bit quantity. */
							 | 
						||
| 
								 | 
							
								  setexponent16(x, exponent(a));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if ( exponent16(x) == EXP_UNDER )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      /* The number is a de-normal or pseudodenormal. */
							 | 
						||
| 
								 | 
							
								      /* We only deal with the significand and exponent. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (x->sigh & 0x80000000)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
									  /* Is a pseudodenormal. */
							 | 
						||
| 
								 | 
							
									  /* This is non-80486 behaviour because the number
							 | 
						||
| 
								 | 
							
									     loses its 'denormal' identity. */
							 | 
						||
| 
								 | 
							
									  addexponent(x, 1);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
									  /* Is a denormal. */
							 | 
						||
| 
								 | 
							
									  addexponent(x, 1);
							 | 
						||
| 
								 | 
							
									  FPU_normalize_nuo(x);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if ( !(x->sigh & 0x80000000) )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      EXCEPTION(EX_INTERNAL | 0x180);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return sign;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |