1 #ifndef ASM_X86_INTERNAL_H
2 #warning Do not include this file directly
3 #else
4
asm_faddp(struct assembler_state_t * state)5 static inline void asm_faddp(struct assembler_state_t *state)
6 {
7 if (read_fpu_sub_tag(state->FPUTagWord, 0) == FPU_TAG_EMPTY)
8 {
9 fprintf(stderr, "asm_faddp: #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_faddp: #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
asm_faddp_stst(struct assembler_state_t * state,int index1,int index2)27 static inline void asm_faddp_stst(struct assembler_state_t *state, int index1, int index2)
28 {
29 if ((index1 != 0) || (index2 == 0))
30 {
31 fprintf(stderr, "asm_faddp_2: invalid opcode\n");
32 return;
33 }
34 if (read_fpu_sub_tag(state->FPUTagWord, index1) == FPU_TAG_EMPTY)
35 {
36 fprintf(stderr, "asm_faddp_2: #Stack underflow occurred\n");
37 write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
38 write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
39 } else if (read_fpu_sub_tag(state->FPUTagWord, index2) == FPU_TAG_EMPTY)
40 {
41 fprintf(stderr, "asm_faddp_2: #Stack underflow occurred\n");
42 write_fpu_status_exception_underflow(state->FPUStatusWord, 1);
43 write_fpu_status_conditioncode1(state->FPUStatusWord, 1);
44 } else {
45 FPU_TYPE temp;
46 write_fpu_st(state, index2, temp = read_fpu_st(state, index1) + read_fpu_st(state, index2));
47 if (fpclassify(temp) == FP_ZERO)
48 write_fpu_sub_tag(&state->FPUTagWord, index2, FPU_TAG_ZERO);
49 pop_fpu_sub_tag(&state->FPUTagWord);
50 write_fpu_status_top(state->FPUStatusWord, (read_fpu_status_top(state->FPUStatusWord)+1));
51 }
52 }
53
54 #endif
55