| |
| #include <stdio.h> |
| |
| typedef unsigned long long int ULong; |
| |
| extern ULong lahf_1 ( void ); |
| asm("\n" |
| "lahf_1:\n" |
| "\tpushq $0\n" |
| "\tpopfq\n" |
| "\tmovabsq $0xFFFFFFFFFFFFFFFF, %rax\n" |
| "\tmovabsq $0x8765432112345678, %rdx\n" |
| "\tsubq %rax, %rdx\n" |
| "\t.byte 0x9F\n" /* lahf */ |
| "\tret\n" |
| ); |
| |
| extern ULong lahf_0 ( void ); |
| asm("\n" |
| "lahf_0:\n" |
| "\tpushq $0\n" |
| "\tpopfq\n" |
| "\tmovabsq $0x0, %rax\n" |
| "\tmovabsq $0x8765432112345678, %rdx\n" |
| "\tsubq %rax, %rdx\n" |
| "\t.byte 0x9F\n" /* lahf */ |
| "\tret\n" |
| ); |
| |
| extern ULong sahf_then_lahf ( ULong ); |
| asm("\n" |
| "sahf_then_lahf:\n" |
| "\tmovq %rdi, %rax\n" |
| "\t.byte 0x9E\n" /* sahf */ |
| "\tmovabsq $0, %rax\n" |
| "\t.byte 0x9F\n" /* lahf */ |
| "\tret\n" |
| ); |
| |
| int main ( void ) |
| { |
| ULong i; |
| printf("0x%llx\n", lahf_0()); |
| printf("0x%llx\n", lahf_1()); |
| for (i = 0; i < 255; i++) { |
| ULong x = sahf_then_lahf(i << 8); |
| printf("%llx -> %llx\n", i, x); |
| } |
| return 0; |
| } |