1 #ifndef ASM_X86_INTERNAL_H
2 #warning Do not include this file directly
3 #else
4 
asm_fmulp(struct assembler_state_t * state)5 static inline void asm_fmulp(struct assembler_state_t *state)
6 {
7 	if (read_fpu_sub_tag(state->FPUTagWord, 0) == FPU_TAG_EMPTY)
8 	{
9 		fprintf(stderr, "asm_fmulp: #Stack underflow occurred\n");
10 		write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
11 		write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
12 	} else if (read_fpu_sub_tag(state->FPUTagWord, 1) == FPU_TAG_EMPTY)
13 	{
14 		fprintf(stderr, "asm_fmulp: #Stack underflow occurred\n");
15 		write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
16 		write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
17 	} else {
18 		FPU_TYPE temp;
19 		write_fpu_st(state, 1, temp = read_fpu_st(state, 0) * read_fpu_st(state, 1));
20 		if (fpclassify(temp) == FP_ZERO)
21 			write_fpu_sub_tag(&state->FPUTagWord, 1, FPU_TAG_ZERO);
22 		pop_fpu_sub_tag(&state->FPUTagWord);
23 		write_fpu_status_top(state->FPUStatusWord, (read_fpu_status_top(state->FPUStatusWord)+1));
24 	}
25 }
26 
27 #define asm_fmulp_st(state,index) asm_fmulp_stst(state, 0, index)
asm_fmulp_stst(struct assembler_state_t * state,int index1,int index2)28 static inline void asm_fmulp_stst(struct assembler_state_t *state, int index1, int index2)
29 {
30 	if ((index1 != 0) || (index2 == 0))
31 	{
32 		fprintf(stderr, "asm_fmulp_st: invalid opcode\n");
33 		return;
34 	}
35 	if (read_fpu_sub_tag(state->FPUTagWord, index1) == FPU_TAG_EMPTY)
36 	{
37 		fprintf(stderr, "asm_fmulp_st: #Stack underflow occurred\n");
38 		write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
39 		write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
40 	} else if (read_fpu_sub_tag(state->FPUTagWord, index2) == FPU_TAG_EMPTY)
41 	{
42 		fprintf(stderr, "asm_fmulp_st: #Stack underflow occurred\n");
43 		write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
44 		write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
45 	} else {
46 		FPU_TYPE temp;
47 		write_fpu_st(state, index2, temp = read_fpu_st(state, index1) * read_fpu_st(state, index2));
48 		if (fpclassify(temp) == FP_ZERO)
49 			write_fpu_sub_tag(&state->FPUTagWord, index2, FPU_TAG_ZERO);
50 		pop_fpu_sub_tag(&state->FPUTagWord);
51 		write_fpu_status_top(state->FPUStatusWord, (read_fpu_status_top(state->FPUStatusWord)+1));
52 	}
53 }
54 
55 #endif
56