blob: 0158652255ffc244d90b70e75cdfd53c060f865d [file] [log] [blame]
#include <stdio.h>
typedef unsigned long long int ULong;
typedef unsigned int UInt;
__attribute__((noinline))
void do_andn64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg1, ULong arg2 )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"andn %2, %3, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=r" (flag) : "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"andn %2, %3, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=r" (flag) : "m" (arg1), "r" (arg2) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_andn32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg1, UInt arg2 )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"andn %2, %3, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=r" (flag) : "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"andn %2, %3, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=r" (flag) : "m" (arg1), "r" (arg2) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_mulx64 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2,
ULong arg1, ULong arg2 )
{
ULong tem1, tem2, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"movabsq $0x5555555555555555, %1" "\n\t"
"movq %4, %%rdx" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %2" "\n\t"
"popfq" "\n\t"
"mulx %5, %1, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %3" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem1), "=&r" (tem2), "=&r" (flag1), "=r" (flag2)
: "g" (arg1), "r" (arg2) : "cc", "rdx"
);
*res1 = tem1;
*res2 = tem2;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"movabsq $0x5555555555555555, %1" "\n\t"
"movq %4, %%rdx" "\n\t"
"pushfq" "\n\t"
"popq %2" "\n\t"
"mulx %5, %1, %0" "\n\t"
"pushfq" "\n\t"
"popq %3" "\n"
: "=&r" (tem1), "=&r" (tem2), "=&r" (flag3), "=r" (flag4)
: "g" (arg1), "m" (arg2) : "cc", "rdx"
);
if (*res1 != tem1 || *res2 != tem2)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_mulx32 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2,
UInt arg1, UInt arg2 )
{
ULong tem1, tem2, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"movabsq $0x5555555555555555, %1" "\n\t"
"movl %4, %%edx" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %2" "\n\t"
"popfq" "\n\t"
"mulx %5, %k1, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %3" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem1), "=&r" (tem2), "=&r" (flag1), "=r" (flag2)
: "g" (arg1), "r" (arg2) : "cc", "rdx"
);
*res1 = tem1;
*res2 = tem2;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"movabsq $0x5555555555555555, %1" "\n\t"
"movl %4, %%edx" "\n\t"
"pushfq" "\n\t"
"popq %2" "\n\t"
"mulx %5, %k1, %k0" "\n\t"
"pushfq" "\n\t"
"popq %3" "\n"
: "=&r" (tem1), "=&r" (tem2), "=&r" (flag3), "=r" (flag4)
: "g" (arg1), "m" (arg2) : "cc", "rdx"
);
if (*res1 != tem1 || *res2 != tem2)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_sarx64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"sarx %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"sarx %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_sarx32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"sarx %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"sarx %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_shlx64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"shlx %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"shlx %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_shlx32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"shlx %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"shlx %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_shrx64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"shrx %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"shrx %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_shrx32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"shrx %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"shrx %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_rorx64 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2, ULong arg )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"rorx $12, %3, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2) : "r" (arg) : "cc"
);
*res1 = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"rorx $67, %3, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4) : "m" (arg) : "cc"
);
*res2 = tem;
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_rorx32 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2, UInt arg )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"rorx $12, %3, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2) : "r" (arg) : "cc"
);
*res1 = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"rorx $67, %3, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4) : "m" (arg) : "cc"
);
*res2 = tem;
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_blsi64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsi %2, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsi %2, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_blsi32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsi %2, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsi %2, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_blsmsk64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsmsk %2, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsmsk %2, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_blsmsk32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsmsk %2, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsmsk %2, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_blsr64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsr %2, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsr %2, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_blsr32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsr %2, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"blsr %2, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_bextr64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res,
ULong arg1, ULong arg2 )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"bextr %2, %3, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"bextr %2, %3, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_bextr32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res,
UInt arg1, UInt arg2 )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"bextr %2, %3, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"bextr %2, %3, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_bzhi64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res,
ULong arg1, ULong arg2 )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"bzhi %2, %3, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"bzhi %2, %3, %0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_bzhi32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res,
UInt arg1, UInt arg2 )
{
ULong tem, flag;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"bzhi %2, %3, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
*flags = flag & 0x8d5;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"bzhi %2, %3, %k0" "\n\t"
"pushfq" "\n\t"
"popq %1" "\n"
: "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc"
);
if (*res != tem || *flags != (flag & 0x8d5))
printf ("Difference between r and m variants\n");
}
__attribute__((noinline))
void do_pdep64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"pdep %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"pdep %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "m" (arg1), "r" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_pdep32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"pdep %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"pdep %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "m" (arg1), "r" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_pext64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"pext %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"pext %3, %4, %0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "m" (arg1), "r" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
__attribute__((noinline))
void do_pext32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
{
ULong tem, flag1, flag2, flag3, flag4;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"pext %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag1), "=r" (flag2)
: "r" (arg1), "r" (arg2) : "cc"
);
*res = tem;
__asm__ __volatile__(
"movabsq $0x5555555555555555, %0" "\n\t"
"pushfq" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"movq (%%rsp), %1" "\n\t"
"popfq" "\n\t"
"pext %3, %4, %k0" "\n\t"
"pushfq" "\n\t"
"movq (%%rsp), %2" "\n\t"
"xorq $0x8d5, (%%rsp)" "\n\t"
"popfq" "\n"
: "=&r" (tem), "=&r" (flag3), "=r" (flag4)
: "m" (arg1), "r" (arg2) : "cc"
);
if (*res != tem)
printf ("Difference between r and m variants\n");
if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
printf ("Flags changed\n");
}
int main ( void )
{
ULong w1, w2;
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
UInt flags;
do_andn64(&flags, &res, w1, w2);
printf("andn64 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
UInt flags;
do_andn32(&flags, &res, w1, w2);
printf("andn32 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res1, res2;
do_mulx64(&res1, &res2, w1, w2);
printf("mulx64 %016llx %016llx -> %016llx %016llx\n", w1, w2, res1, res2);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res1, res2;
do_mulx32(&res1, &res2, w1, w2);
printf("mulx32 %016llx %016llx -> %016llx %016llx\n", w1, w2, res1, res2);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_sarx64(&res, w1, w2);
printf("sarx64 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_sarx32(&res, w1, w2);
printf("sarx32 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_shlx64(&res, w1, w2);
printf("shlx64 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_shlx32(&res, w1, w2);
printf("shlx32 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_shrx64(&res, w1, w2);
printf("shrx64 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_shrx32(&res, w1, w2);
printf("shrx32 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
while (1) {
ULong res1, res2;
do_rorx64(&res1, &res2, w1);
printf("rorx64 %016llx -> %016llx %016llx\n", w1, res1, res2);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
while (1) {
ULong res1, res2;
do_rorx32(&res1, &res2, w1);
printf("rorx32 %016llx -> %016llx %016llx\n", w1, res1, res2);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
while (1) {
ULong res;
UInt flags;
do_blsi64(&flags, &res, w1);
printf("blsi64 %016llx -> %016llx %04x\n", w1, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
while (1) {
ULong res;
UInt flags;
do_blsi32(&flags, &res, w1);
printf("blsi32 %016llx -> %016llx %04x\n", w1, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
while (1) {
ULong res;
UInt flags;
do_blsmsk64(&flags, &res, w1);
printf("blsmsk64 %016llx -> %016llx %04x\n", w1, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
while (1) {
ULong res;
UInt flags;
do_blsmsk32(&flags, &res, w1);
printf("blsmsk32 %016llx -> %016llx %04x\n", w1, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
while (1) {
ULong res;
UInt flags;
do_blsr64(&flags, &res, w1);
printf("blsr64 %016llx -> %016llx %04x\n", w1, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
while (1) {
ULong res;
UInt flags;
do_blsr32(&flags, &res, w1);
printf("blsr32 %016llx -> %016llx %04x\n", w1, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
UInt flags;
do_bextr64(&flags, &res, w1, w2);
printf("bextr64 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
UInt flags;
do_bextr32(&flags, &res, w1, w2);
printf("bextr32 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
UInt flags;
do_bzhi64(&flags, &res, w1, w2);
printf("bzhi64 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
UInt flags;
do_bzhi32(&flags, &res, w1, w2);
printf("bzhi32 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_pdep64(&res, w1, w2);
printf("pdep64 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_pdep32(&res, w1, w2);
printf("pdep32 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_pext64(&res, w1, w2);
printf("pext64 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
w1 = 0xFEDC192837475675ULL;
w2 = 0x57657438291CDEF0ULL;
while (1) {
ULong res;
do_pext32(&res, w1, w2);
printf("pext32 %016llx %016llx -> %016llx\n", w1, w2, res);
if (w1 == 0) break;
w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
}
return 0;
}