4 #define addr_t unsigned long
13 asm ("movl %1, %%eax\n\t"
17 :"%eax" /* clobbered register */
22 void get_flags(addr_t * flags) {
33 void adc64(int * dst, int * src, addr_t * flags) {
34 int tmp_dst = *dst, tmp_src = *src;
35 addr_t tmp_flags = *flags;
39 // Some of the flags values are not copied out in a pushf, we save them here
40 addr_t flags_rsvd = *flags & ~0xfffe7fff;
50 : "=a"(tmp_dst),"=c"(tmp_flags)
51 : "b"(tmp_src),"c"(tmp_flags), "0"(tmp_dst)
61 void adc32(int * dst, int * src, addr_t * flags) {
62 int tmp_dst = *dst, tmp_src = *src;
63 addr_t tmp_flags = *flags;
74 : "=a"(tmp_dst),"=c"(tmp_flags)
75 : "b"(tmp_src),"c"(tmp_flags), "0"(tmp_dst)
84 int main(int argc, char ** argv) {
89 printf("sizeof ulong: %d\n", sizeof(unsigned long));
91 printf("Getting flags\n");
95 printf("Flags=0x%x\n", flags);
98 adc64(&dest, &src, &flags);
99 printf("Result=%d\n", dest);