#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;
}