unpack.c
Upload User: acmefrp
Upload Date: 2010-03-06
Package Size: 23768k
Code Size: 6k
Category:

OS Develop

Development Platform:

C/C++

  1. #ifdef sccsid
  2. static char     sccsid[] = "@(#)unpack.c 1.1 92/07/30 Copyr 1987 Sun Micro";
  3. #endif
  4. /*
  5.  * Copyright (c) 1988 by Sun Microsystems, Inc. 
  6.  */
  7. /* Unpack procedures for Sparc FPU simulator. */
  8. #include <machine/fpu/fpu_simulator.h>
  9. #include <machine/fpu/globals.h>
  10. PRIVATE void
  11. unpackinteger(pu, x)
  12. unpacked *pu; /* unpacked result */
  13. int x; /* packed integer */
  14. {
  15. unsigned ux;
  16. pu->sticky = pu->rounded = 0;
  17. if (x == 0) {
  18. pu->sign = 0;
  19. pu->fpclass = fp_zero;
  20. } else {
  21. (*pu).sign = x < 0;
  22. (*pu).fpclass = fp_normal;
  23. (*pu).exponent = INTEGER_BIAS;
  24. if (x<0) ux = -x; else ux = x;
  25. (*pu).significand[0] = ux>>15;
  26. (*pu).significand[1] = (ux&0x7fff)<<17;
  27. (*pu).significand[2] = 0;
  28. (*pu).significand[3] = 0;
  29. fpu_normalize(pu);
  30. }
  31. }
  32. void
  33. unpacksingle(pfpsd, pu, x)
  34. fp_simd_type *pfpsd; /* simulator data */
  35. unpacked *pu; /* unpacked result */
  36. single_type x; /* packed single */
  37. {
  38. unsigned U;
  39. pu->sticky = pu->rounded = 0;
  40. U = x.significand;
  41. (*pu).sign = x.sign;
  42. pu->significand[1] = 0;
  43. pu->significand[2] = 0;
  44. pu->significand[3] = 0;
  45. if (x.exponent == 0) { /* zero or sub */
  46. if (x.significand == 0) { /* zero */
  47. pu->fpclass = fp_zero;
  48. return;
  49. } else { /* subnormal */
  50. pu->fpclass = fp_normal;
  51. pu->exponent = -SINGLE_BIAS-6;
  52. pu->significand[0]=U;
  53. fpu_normalize(pu);
  54. return;
  55. }
  56. } else if (x.exponent == 0xff) { /* inf or nan */
  57. if (x.significand == 0) { /* inf */
  58. pu->fpclass = fp_infinity;
  59. return;
  60. } else { /* nan */
  61. if ((U & 0x400000) != 0) { /* quiet */
  62. pu->fpclass = fp_quiet;
  63. } else { /* signaling */
  64. pu->fpclass = fp_signaling;
  65. fpu_set_exception(pfpsd, fp_invalid);
  66. }
  67. pu->significand[0] = 0x18000 | (U >> 7);
  68. (*pu).significand[1]=((U&0x7f)<<25);
  69. return;
  70. }
  71. }
  72. (*pu).exponent = x.exponent - SINGLE_BIAS;
  73. (*pu).fpclass = fp_normal;
  74. (*pu).significand[0]=0x10000|(U>>7);
  75. (*pu).significand[1]=((U&0x7f)<<25);
  76. }
  77. void
  78. unpackdouble(pfpsd, pu, x, y)
  79. fp_simd_type *pfpsd; /* simulator data */
  80. unpacked *pu; /* unpacked result */
  81. double_type x; /* packed double */
  82. unsigned y;
  83. {
  84. unsigned U;
  85. pu->sticky = pu->rounded = 0;
  86. U = x.significand;
  87. (*pu).sign = x.sign;
  88. pu->significand[1] = y;
  89. pu->significand[2] = 0;
  90. pu->significand[3] = 0;
  91. if (x.exponent == 0) { /* zero or sub */
  92. if ((x.significand == 0) && (y == 0)) { /* zero */
  93. pu->fpclass = fp_zero;
  94. return;
  95. } else { /* subnormal */
  96. pu->fpclass = fp_normal;
  97. pu->exponent = -DOUBLE_BIAS-3;
  98. pu->significand[0] = U;
  99. fpu_normalize(pu);
  100. return;
  101. }
  102. } else if (x.exponent == 0x7ff) { /* inf or nan */
  103. if ((U|y) == 0) { /* inf */
  104. pu->fpclass = fp_infinity;
  105. return;
  106. } else { /* nan */
  107. if ((U & 0x80000) != 0) { /* quiet */
  108. pu->fpclass = fp_quiet;
  109. } else { /* signaling */
  110. pu->fpclass = fp_signaling;
  111. fpu_set_exception(pfpsd, fp_invalid);
  112. }
  113. pu->significand[0] = 0x18000 | (U >> 4);
  114. (*pu).significand[1]=((U&0xf)<<28)|(y>>4);
  115. (*pu).significand[2]=((y&0xf)<<28);
  116. return;
  117. }
  118. }
  119. (*pu).exponent = x.exponent - DOUBLE_BIAS;
  120. (*pu).fpclass = fp_normal;
  121. (*pu).significand[0]=0x10000|(U>>4);
  122. (*pu).significand[1]=((U&0xf)<<28)|(y>>4);
  123. (*pu).significand[2]=((y&0xf)<<28);
  124. }
  125. PRIVATE void
  126. unpackextended(pfpsd, pu, x, y, z, w)
  127. fp_simd_type *pfpsd; /* simulator data */
  128. unpacked *pu; /* unpacked result */
  129. extended_type x; /* packed extended */
  130. unsigned y, z, w;
  131. {
  132. unsigned U;
  133. pu->sticky = pu->rounded = 0;
  134. U = x.significand;
  135. (*pu).sign = x.sign;
  136. (*pu).fpclass = fp_normal;
  137. (*pu).exponent = x.exponent - EXTENDED_BIAS;
  138. (*pu).significand[0] = (x.exponent==0)? U:0x10000|U;
  139. (*pu).significand[1] = y;
  140. (*pu).significand[2] = z;
  141. (*pu).significand[3] = w;
  142. if (x.exponent < 0x7fff) { /* zero, normal, or subnormal */
  143. if ((z|y|w|pu->significand[0]) == 0) { /* zero */
  144. pu->fpclass = fp_zero;
  145. return;
  146. } else { /* normal or subnormal */
  147. if (x.exponent==0) {
  148. fpu_normalize(pu);
  149. pu->exponent += 1;
  150. }
  151. return;
  152. }
  153. } else { /* inf or nan */
  154. if ((U|z|y|w) == 0) { /* inf */
  155. pu->fpclass = fp_infinity;
  156. return;
  157. } else { /* nan */
  158. if ((U & 0x00008000) != 0) { /* quiet */
  159. pu->fpclass = fp_quiet;
  160. } else { /* signaling */
  161. pu->fpclass = fp_signaling;
  162. fpu_set_exception(pfpsd, fp_invalid);
  163. }
  164. pu->significand[0] |= 0x8000; /* make quiet */
  165. return;
  166. }
  167. }
  168. }
  169. void
  170. _fp_unpack(pfpsd, pu, n, dtype)
  171. fp_simd_type *pfpsd; /* simulator data */
  172. unpacked *pu; /* unpacked result */
  173. unsigned n; /* register where data starts */
  174. enum fp_op_type dtype; /* type of datum */
  175. {
  176. freg_type f, fy, fz, fw;
  177. switch ((int) dtype) {
  178. case fp_op_integer:
  179. pfpsd->fp_current_read_freg(&f, n, pfpsd);
  180. unpackinteger(pu, f.int_reg);
  181. break;
  182. case fp_op_single:
  183. pfpsd->fp_current_read_freg(&f, n, pfpsd);
  184. unpacksingle(pfpsd, pu, f.single_reg);
  185. break;
  186. case fp_op_double:
  187. pfpsd->fp_current_read_freg(&f, DOUBLE_E(n), pfpsd);
  188. pfpsd->fp_current_read_freg(&fy, DOUBLE_F(n), pfpsd);
  189. unpackdouble(pfpsd, pu, f.double_reg, fy.unsigned_reg);
  190. break;
  191. case fp_op_extended:
  192. pfpsd->fp_current_read_freg(&f,  EXTENDED_E(n), pfpsd);
  193. pfpsd->fp_current_read_freg(&fy, EXTENDED_F(n), pfpsd);
  194. pfpsd->fp_current_read_freg(&fz, EXTENDED_G(n), pfpsd);
  195. pfpsd->fp_current_read_freg(&fw, EXTENDED_H(n), pfpsd);
  196. unpackextended(pfpsd, pu, f.extended_reg, fy.unsigned_reg,
  197. fz.unsigned_reg, fw.unsigned_reg);
  198. break;
  199. }
  200. }
  201. void
  202. _fp_unpack_word(pfpsd, pu, n)
  203. fp_simd_type *pfpsd; /* simulator data */
  204. unsigned *pu; /* unpacked result */
  205. unsigned n; /* register where data starts */
  206. {
  207. pfpsd->fp_current_read_freg(pu, n, pfpsd);
  208. }