|
|
1.1 root 1: /*---------------------------------------------------------------------------+
2: | reg_constant.c |
3: | |
4: | All of the constant FPU_REGs |
5: | |
6: | Copyright (C) 1992 W. Metzenthen, 22 Parker St, Ormond, Vic 3163, |
7: | Australia. E-mail [email protected] |
8: | |
9: | |
10: +---------------------------------------------------------------------------*/
11:
12: #include "fpu_system.h"
13: #include "fpu_emu.h"
14: #include "status_w.h"
15: #include "reg_constant.h"
16:
17:
18: FPU_REG CONST_1 = { SIGN_POS, TW_Valid, EXP_BIAS,
19: 0x00000000, 0x80000000 };
20: FPU_REG CONST_2 = { SIGN_POS, TW_Valid, EXP_BIAS+1,
21: 0x00000000, 0x80000000 };
22: FPU_REG CONST_HALF = { SIGN_POS, TW_Valid, EXP_BIAS-1,
23: 0x00000000, 0x80000000 };
24: FPU_REG CONST_L2T = { SIGN_POS, TW_Valid, EXP_BIAS+1,
25: 0xcd1b8afe, 0xd49a784b };
26: FPU_REG CONST_L2E = { SIGN_POS, TW_Valid, EXP_BIAS,
27: 0x5c17f0bc, 0xb8aa3b29 };
28: FPU_REG CONST_PI = { SIGN_POS, TW_Valid, EXP_BIAS+1,
29: 0x2168c235, 0xc90fdaa2 };
30: FPU_REG CONST_PI2 = { SIGN_POS, TW_Valid, EXP_BIAS,
31: 0x2168c235, 0xc90fdaa2 };
32: FPU_REG CONST_PI4 = { SIGN_POS, TW_Valid, EXP_BIAS-1,
33: 0x2168c235, 0xc90fdaa2 };
34: FPU_REG CONST_LG2 = { SIGN_POS, TW_Valid, EXP_BIAS-2,
35: 0xfbcff799, 0x9a209a84 };
36: FPU_REG CONST_LN2 = { SIGN_POS, TW_Valid, EXP_BIAS-1,
37: 0xd1cf79ac, 0xb17217f7 };
38:
39: /* Only the sign (and tag) is used in internal zeroes */
40: FPU_REG CONST_Z = { SIGN_POS, TW_Zero, 0, 0x0, 0x0 };
41:
42: /* Only the sign and significand (and tag) are used in internal NaNs */
43: /* The 80486 never generates one of these
44: FPU_REG CONST_SNAN = { SIGN_POS, TW_NaN, EXP_OVER, 0x00000001, 0x80000000 };
45: */
46: /* This is the real indefinite QNaN */
47: FPU_REG CONST_QNaN = { SIGN_NEG, TW_NaN, EXP_OVER, 0x00000000, 0xC0000000 };
48:
49: /* Only the sign (and tag) is used in internal infinities */
50: FPU_REG CONST_INF = { SIGN_POS, TW_Infinity, EXP_OVER, 0x00000000, 0x80000000 };
51:
52:
53:
54: static void fld_const(FPU_REG *c)
55: {
56: FPU_REG *st_new_ptr;
57:
58: if ( STACK_OVERFLOW )
59: {
60: stack_overflow();
61: return;
62: }
63: push();
64: reg_move(c, FPU_st0_ptr);
65: status_word &= ~SW_C1;
66: }
67:
68:
69: static void fld1()
70: {
71: fld_const(&CONST_1);
72: }
73:
74: static void fldl2t()
75: {
76: fld_const(&CONST_L2T);
77: }
78:
79: static void fldl2e()
80: {
81: fld_const(&CONST_L2E);
82: }
83:
84: static void fldpi()
85: {
86: fld_const(&CONST_PI);
87: }
88:
89: static void fldlg2()
90: {
91: fld_const(&CONST_LG2);
92: }
93:
94: static void fldln2()
95: {
96: fld_const(&CONST_LN2);
97: }
98:
99: static void fldz()
100: {
101: fld_const(&CONST_Z);
102: }
103:
104: static FUNC constants_table[] = {
105: fld1, fldl2t, fldl2e, fldpi, fldlg2, fldln2, fldz, Un_impl
106: };
107:
108: void fconst()
109: {
110: (constants_table[FPU_rm])();
111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.