| #include <stdint.h> |
| #include <string.h> |
| #include <stdio.h> |
| |
| char buf1[64], buf2[64]; |
| |
| int |
| main (void) |
| { |
| unsigned long rdi, rsi, rcx, rax; |
| uintptr_t b1 = (uintptr_t) buf1, b2 = (uintptr_t) buf2; |
| |
| if (b1 > 0xffffffffULL || b2 > 0xffffffffULL) |
| return 0; |
| |
| b1 += 0x100000000ULL; |
| b2 += 0xfff00000000ULL; |
| memcpy (buf1, "abcde", 4); |
| asm volatile ("addr32 rep movsb" |
| : "=D" (rdi), "=S" (rsi), "=c" (rcx) |
| : "D" (b2), "S" (b1), "c" (0x100000004ULL) |
| : "memory"); |
| if (memcmp (buf2, "abcd", 5) != 0 |
| || rdi != (uintptr_t) buf2 + 4 |
| || rsi != (uintptr_t) buf1 + 4 |
| || rcx) |
| fprintf (stderr, "addr32 rep movsb wrong\n"); |
| |
| rax = 0x751234560000ULL + (' ' << 8) + '0'; |
| asm volatile ("addr32 rep stosw" |
| : "=D" (rdi), "=c" (rcx), "+a" (rax) |
| : "D" (b2), "c" (0x100000003ULL) |
| : "memory"); |
| if (memcmp (buf2, "0 0 0 ", 7) != 0 |
| || rdi != (uintptr_t) buf2 + 6 |
| || rcx |
| || rax != 0x751234560000ULL + (' ' << 8) + '0') |
| fprintf (stderr, "addr32 rep stosw wrong\n"); |
| |
| asm volatile ("addr32 lodsl" |
| : "=S" (rsi), "=a" (rax) |
| : "S" (b2), "a" (2ULL)); |
| if (rsi != (uintptr_t) buf2 + 4 |
| || rax != 0x20302030ULL) |
| fprintf (stderr, "addr32 lodsl wrong\n"); |
| |
| memcpy (buf1, "abcdefghijklmno", 16); |
| memcpy (buf2, "abcdefghijklmnO", 16); |
| asm volatile ("addr32 repe cmpsb" |
| : "=D" (rdi), "=S" (rsi), "=c" (rcx) |
| : "D" (b2), "S" (b1), "c" (0x100000020ULL)); |
| if (rdi != (uintptr_t) buf2 + 15 |
| || rsi != (uintptr_t) buf1 + 15 |
| || rcx != 17ULL) |
| fprintf (stderr, "addr32 repe cmpsb wrong\n"); |
| |
| memcpy (buf2, "ababababababababcdab", 20); |
| rax = 0x123450000ULL + ('d' << 8) + 'c'; |
| asm volatile ("addr32 repne scasw" |
| : "=D" (rdi), "=c" (rcx), "+a" (rax) |
| : "D" (b2), "c" (0x100000020ULL)); |
| if (rdi != (uintptr_t) buf2 + 18 |
| || rcx != 23ULL |
| || rax != 0x123450000ULL + ('d' << 8) + 'c') |
| fprintf (stderr, "addr32 repne scasw wrong\n"); |
| |
| rax = 0x543210000ULL + ('b' << 8) + 'a'; |
| asm volatile ("addr32 repe scasw" |
| : "=D" (rdi), "=c" (rcx), "+a" (rax) |
| : "D" (b2), "c" (0x100000020ULL)); |
| if (rdi != (uintptr_t) buf2 + 18 |
| || rcx != 23ULL |
| || rax != 0x543210000ULL + ('b' << 8) + 'a') |
| fprintf (stderr, "addr32 repe scasw wrong\n"); |
| |
| return 0; |
| } |