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