1 #ifndef ASM_X86_INTERNAL_H
2 #warning Do not include this file directly
3 #else
4
asm_fcoms(struct assembler_state_t * state,float data)5 static inline void asm_fcoms(struct assembler_state_t *state, float data)
6 {
7 int tag = read_fpu_sub_tag(state->FPUTagWord, 0);
8 if (tag == FPU_TAG_EMPTY)
9 {
10 fprintf(stderr, "asm_fcoms: #Stack underflow occurred\n");
11 write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
12 write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
13 } if (tag == FPU_TAG_SPECIAL)
14 {
15 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
16 write_fpu_status_conditioncode2(state->FPUStatusWord, 1);
17 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
18 } else {
19 switch (fpclassify(data))
20 {
21 case FP_NAN:
22 case FP_INFINITE:
23 case FP_SUBNORMAL:
24 default:
25 {
26 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
27 write_fpu_status_conditioncode2(state->FPUStatusWord, 1);
28 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
29 break;
30 }
31 case FP_ZERO:
32 case FP_NORMAL:
33 {
34 FPU_TYPE st0 = read_fpu_st(state, 0);
35 if (st0 > data)
36 {
37 write_fpu_status_conditioncode0(state->FPUStatusWord, 0);
38 write_fpu_status_conditioncode3(state->FPUStatusWord, 0);
39 } else if (st0 < data)
40 {
41 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
42 write_fpu_status_conditioncode3(state->FPUStatusWord, 0);
43 } else {
44 write_fpu_status_conditioncode0(state->FPUStatusWord, 0);
45 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
46 }
47 write_fpu_status_conditioncode2(state->FPUStatusWord, 0);
48 break;
49 }
50 }
51 }
52 }
asm_fcomd(struct assembler_state_t * state,double data)53 static inline void asm_fcomd(struct assembler_state_t *state, double data)
54 {
55 int tag = read_fpu_sub_tag(state->FPUTagWord, 0);
56 if (tag == FPU_TAG_EMPTY)
57 {
58 fprintf(stderr, "asm_fcoms: #Stack underflow occurred\n");
59 write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
60 write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
61 } if (tag == FPU_TAG_SPECIAL)
62 {
63 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
64 write_fpu_status_conditioncode2(state->FPUStatusWord, 1);
65 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
66 } else {
67 switch (fpclassify(data))
68 {
69 case FP_NAN:
70 case FP_INFINITE:
71 case FP_SUBNORMAL:
72 default:
73 {
74 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
75 write_fpu_status_conditioncode2(state->FPUStatusWord, 1);
76 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
77 break;
78 }
79 case FP_ZERO:
80 case FP_NORMAL:
81 {
82 FPU_TYPE st0 = read_fpu_st(state, 0);
83 if (st0 > data)
84 {
85 write_fpu_status_conditioncode0(state->FPUStatusWord, 0);
86 write_fpu_status_conditioncode3(state->FPUStatusWord, 0);
87 } else if (st0 < data)
88 {
89 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
90 write_fpu_status_conditioncode3(state->FPUStatusWord, 0);
91 } else {
92 write_fpu_status_conditioncode0(state->FPUStatusWord, 0);
93 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
94 }
95 write_fpu_status_conditioncode2(state->FPUStatusWord, 0);
96 break;
97 }
98 }
99 }
100
101 }
102
asm_fcom_st(struct assembler_state_t * state,int index)103 static inline void asm_fcom_st(struct assembler_state_t *state, int index)
104 {
105 int tag1 = read_fpu_sub_tag(state->FPUTagWord, 0);
106 int tag2 = read_fpu_sub_tag(state->FPUTagWord, index);
107
108 if (tag1 == FPU_TAG_EMPTY)
109 {
110 fprintf(stderr, "asm_fcom: #Stack underflow occurred\n");
111 write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
112 write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
113 } else if (tag2 == FPU_TAG_EMPTY)
114 {
115 fprintf(stderr, "asm_fcom: #Stack underflow occurred\n");
116 write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
117 write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
118 } else {
119 if ((tag1==FPU_TAG_SPECIAL)||(tag2==FPU_TAG_SPECIAL))
120 {
121 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
122 write_fpu_status_conditioncode2(state->FPUStatusWord, 1);
123 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
124 } else {
125 FPU_TYPE st0 = read_fpu_st(state, 0);
126 FPU_TYPE data = read_fpu_st(state, index);
127
128 if (st0 > data)
129 {
130 write_fpu_status_conditioncode0(state->FPUStatusWord, 0);
131 write_fpu_status_conditioncode3(state->FPUStatusWord, 0);
132 } else if (st0 < data)
133 {
134 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
135 write_fpu_status_conditioncode3(state->FPUStatusWord, 0);
136 } else {
137 write_fpu_status_conditioncode0(state->FPUStatusWord, 0);
138 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
139 }
140 write_fpu_status_conditioncode2(state->FPUStatusWord, 0);
141 }
142 }
143 }
144
asm_fcom(struct assembler_state_t * state)145 static inline void asm_fcom(struct assembler_state_t *state)
146 {
147 int tag1 = read_fpu_sub_tag(state->FPUTagWord, 0);
148 int tag2 = read_fpu_sub_tag(state->FPUTagWord, 1);
149
150 if (tag1 == FPU_TAG_EMPTY)
151 {
152 fprintf(stderr, "asm_fcom: #Stack underflow occurred\n");
153 write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
154 write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
155 } else if (tag2 == FPU_TAG_EMPTY)
156 {
157 fprintf(stderr, "asm_fcom: #Stack underflow occurred\n");
158 write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
159 write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
160 } else {
161 if ((tag1==FPU_TAG_SPECIAL)||(tag2==FPU_TAG_SPECIAL))
162 {
163 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
164 write_fpu_status_conditioncode2(state->FPUStatusWord, 1);
165 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
166 } else {
167 FPU_TYPE st0 = read_fpu_st(state, 0);
168 FPU_TYPE data = read_fpu_st(state, 1);
169
170 if (st0 > data)
171 {
172 write_fpu_status_conditioncode0(state->FPUStatusWord, 0);
173 write_fpu_status_conditioncode3(state->FPUStatusWord, 0);
174 } else if (st0 < data)
175 {
176 write_fpu_status_conditioncode0(state->FPUStatusWord, 1);
177 write_fpu_status_conditioncode3(state->FPUStatusWord, 0);
178 } else {
179 write_fpu_status_conditioncode0(state->FPUStatusWord, 0);
180 write_fpu_status_conditioncode3(state->FPUStatusWord, 1);
181 }
182 write_fpu_status_conditioncode2(state->FPUStatusWord, 0);
183 }
184 }
185 }
186 #endif
187