1 #ifndef ASM_X86_INTERNAL_H
2 #warning Do not include this file directly
3 #else
4 
asm_addl(struct assembler_state_t * state,const uint32_t src,uint32_t * dst)5 static inline void asm_addl(struct assembler_state_t *state, const uint32_t src, uint32_t *dst)
6 {
7 	uint32_t tmp = *dst + src;
8 
9 	write_cf(state->eflags, tmp < *dst); /* unsigned overflow */
10 	if ((*dst & 0x80000000) == (src & 0x80000000))
11 		write_of(state->eflags, (src & 0x80000000) != (tmp & 0x80000000)); /* signed overflow */
12 	else
13 		write_of(state->eflags, 0);
14 
15 	write_sf(state->eflags, tmp & 0x80000000);
16 	write_zf(state->eflags, !tmp);
17 #ifdef X86_PF
18 	asm_update_pf(state->eflags, tmp);
19 #endif
20 #ifdef X86_AF
21 	asm_updae_af(state->eflags, tmp, *dst);
22 #endif
23 
24 	*dst = tmp;
25 }
asm_addw(struct assembler_state_t * state,const uint16_t src,uint16_t * dst)26 static inline void asm_addw(struct assembler_state_t *state, const uint16_t src, uint16_t *dst)
27 {
28 	uint16_t tmp = *dst + src;
29 
30 	write_cf(state->eflags, tmp < *dst); /* unsigned overflow */
31 	if ((*dst & 0x8000) == (src & 0x8000))
32 		write_of(state->eflags, (src & 0x8000) != (tmp & 0x8000)); /* signed overflow */
33 	else
34 		write_of(state->eflags, 0);
35 
36 	write_sf(state->eflags, tmp & 0x8000);
37 	write_zf(state->eflags, !tmp);
38 #ifdef X86_PF
39 	asm_update_pf(state->eflags, tmp);
40 #endif
41 #ifdef X86_AF
42 	asm_update_af(state->eflags, tmp, *dst);
43 #endif
44 
45 	*dst = tmp;
46 }
asm_addb(struct assembler_state_t * state,const uint8_t src,uint8_t * dst)47 static inline void asm_addb(struct assembler_state_t *state, const uint8_t src, uint8_t *dst)
48 {
49 	uint8_t tmp = *dst + src;
50 
51 	write_cf(state->eflags, tmp < *dst); /* unsigned overflow */
52 	if ((*dst & 0x80) == (src & 0x80))
53 		write_of(state->eflags, (src & 0x80) != (tmp & 0x80)); /* signed overflow */
54 	else
55 		write_of(state->eflags, 0);
56 
57 	write_sf(state->eflags, tmp & 0x80);
58 	write_zf(state->eflags, !tmp);
59 #ifdef X86_PF
60 	asm_update_pf(state->eflags, tmp);
61 #endif
62 #ifdef X86_AF
63 	asm_update_af(state->eflags, tmp, *dst);
64 #endif
65 
66 	*dst = tmp;
67 }
68 
69 #endif
70