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