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