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