1
2#include <stdio.h>
3
4typedef unsigned long long int ULong;
5
6extern ULong lahf_1 ( void );
7asm("\n"
8"lahf_1:\n"
9"\tpushq $0\n"
10"\tpopfq\n"
11"\tmovabsq $0xFFFFFFFFFFFFFFFF, %rax\n"
12"\tmovabsq $0x8765432112345678, %rdx\n"
13"\tsubq %rax, %rdx\n"
14"\t.byte 0x9F\n" /* lahf */
15"\tret\n"
16);
17
18extern ULong lahf_0 ( void );
19asm("\n"
20"lahf_0:\n"
21"\tpushq $0\n"
22"\tpopfq\n"
23"\tmovabsq $0x0, %rax\n"
24"\tmovabsq $0x8765432112345678, %rdx\n"
25"\tsubq %rax, %rdx\n"
26"\t.byte 0x9F\n" /* lahf */
27"\tret\n"
28);
29
30extern ULong sahf_then_lahf ( ULong );
31asm("\n"
32"sahf_then_lahf:\n"
33"\tmovq %rdi, %rax\n"
34"\t.byte 0x9E\n" /* sahf */
35"\tmovabsq $0, %rax\n"
36"\t.byte 0x9F\n" /* lahf */
37"\tret\n"
38);
39
40int main ( void )
41{
42   ULong i;
43   printf("0x%llx\n", lahf_0());
44   printf("0x%llx\n", lahf_1());
45   for (i = 0; i < 255; i++) {
46      ULong x = sahf_then_lahf(i << 8);
47      printf("%llx -> %llx\n", i, x);
48   }
49   return 0;
50}
51