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