#include <stdio.h>
#define TESTINST_DROTR(instruction, in, SA) \
{ \
unsigned long long out; \
__asm__ __volatile__( \
"move $t0, $zero" "\n\t" \
"move $t1, %1" "\n\t" \
instruction" $t0, $t1, "#SA "\n\t" \
"move %0, $t0" "\n\t" \
: "=r" (out) \
: "r" (in) \
: "t0", "t1" \
); \
printf("%s :: in 0x%llx, out 0x%llx, SA %d\n", \
instruction, (long long) in, out, SA); \
}
#define TESTINST_DROTRV(instruction, in, SA) \
{ \
unsigned long long out; \
__asm__ __volatile__( \
"move $t0, $zero" "\n\t" \
"move $t1, %1" "\n\t" \
"move $t2, %2" "\n\t" \
instruction" $t0, $t1, $t2" "\n\t" \
"move %0, $t0" "\n\t" \
: "=r" (out) \
: "r" (in), "r" (SA) \
: "t0", "t1", "t2" \
); \
printf("%s :: in 0x%llx, out 0x%llx, SA %d\n", \
instruction, (long long) in, out, SA); \
}
#define TESTINST_DSWAP(instruction, in) \
{ \
unsigned long long out; \
__asm__ __volatile__( \
"move $t0, $0" "\n\t" \
"move $t1, $0" "\n\t" \
"move $t1, %1" "\n\t" \
instruction" $t0, $t1" "\n\t" \
"move %0, $t0" "\n\t" \
: "=r" (out) \
: "r" (in) \
: "t0", "t1" \
); \
printf("%s :: in 0x%llx, out 0x%llx\n", \
instruction, (long long) in, out); \
}
int main()
{
#if (__mips == 64) && (__mips_isa_rev >= 2)
printf("--- DROTR ---\n");
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 16);
TESTINST_DROTR("drotr", 0xffff0000ffffffff, 16);
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 8);
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 4);
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 5);
TESTINST_DROTR("drotr", 0x31415927ffffffff, 10);
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 4);
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 0);
TESTINST_DROTR("drotr", 0xeeeeffffffffffff, 16);
TESTINST_DROTR("drotr", 0x2000ffffffffbbbb, 31);
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 16);
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 0);
TESTINST_DROTR("drotr", 0x7fffffffffffffff, 16);
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 2);
TESTINST_DROTR("drotr", 0x2000ffffffffffff, 24);
TESTINST_DROTR("drotr", 0xfffffff31415927f, 16);
TESTINST_DROTR("drotr", 0xffffffffffff0008, 3);
TESTINST_DROTR("drotr", 0xffff0000ffffffff, 16);
TESTINST_DROTR("drotr", 0xff0000ffffffffff, 16);
TESTINST_DROTR("drotr", 0xfffffffff0000fff, 16);
printf("--- DROTR32 ---\n");
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 16);
TESTINST_DROTR("drotr32", 0xffff0000ffffffff, 16);
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 8);
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 4);
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 5);
TESTINST_DROTR("drotr32", 0x31415927ffffffff, 10);
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 4);
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 0);
TESTINST_DROTR("drotr32", 0xeeeeffffffffffff, 16);
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 31);
TESTINST_DROTR("drotr32", 0x2000ffffffffbbbb, 16);
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 0);
TESTINST_DROTR("drotr32", 0x7fffffffffffffff, 16);
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 2);
TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 24);
TESTINST_DROTR("drotr32", 0xfffffff31415927f, 16);
TESTINST_DROTR("drotr32", 0xffffffffffff0008, 3);
TESTINST_DROTR("drotr32", 0xffff0000ffffffff, 16);
TESTINST_DROTR("drotr32", 0xff0000ffffffffff, 16);
TESTINST_DROTR("drotr32", 0xfffffffff0000fff, 16);
printf("--- DROTRV ---\n");
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 16);
TESTINST_DROTRV("drotrv", 0xffff0000ffffffff, 16);
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 8);
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 4);
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 5);
TESTINST_DROTRV("drotrv", 0x31415927ffffffff, 10);
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 4);
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 0);
TESTINST_DROTRV("drotrv", 0xeeeeffffffffffff, 16);
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 31);
TESTINST_DROTRV("drotrv", 0x2000ffffffffbbbb, 16);
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 0);
TESTINST_DROTRV("drotrv", 0x7fffffffffffffff, 16);
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 2);
TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 24);
TESTINST_DROTRV("drotrv", 0xfffffff31415927f, 16);
TESTINST_DROTRV("drotrv", 0xffffffffffff0008, 3);
TESTINST_DROTRV("drotrv", 0xffff0000ffffffff, 16);
TESTINST_DROTRV("drotrv", 0xff0000ffffffffff, 16);
TESTINST_DROTRV("drotrv", 0xfffffffff0000fff, 16);
printf("--- DSBH ---\n");
TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("dsbh", 0xffff0000ffffffff);
TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("dsbh", 0x2000ffffeeeeffff);
TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("dsbh", 0x31415927ffffffff);
TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("dsbh", 0x2000ffffffccccff);
TESTINST_DSWAP("dsbh", 0xeeeeffffffffffff);
TESTINST_DSWAP("dsbh", 0x2000ffff0000ffff);
TESTINST_DSWAP("dsbh", 0x2000ffffffffbbbb);
TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("dsbh", 0x7fffffff5555ffff);
TESTINST_DSWAP("dsbh", 0x2000ffffff123123);
TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("dsbh", 0xfffffff31415927f);
TESTINST_DSWAP("dsbh", 0xffffffffffff0008);
TESTINST_DSWAP("dsbh", 0xffff0000ffff88ff);
TESTINST_DSWAP("dsbh", 0xff0000ffffffffff);
TESTINST_DSWAP("dsbh", 0xfff10ffff0000fff);
printf("--- DSHD ---\n");
TESTINST_DSWAP("dshd", 0x2002ffffffffffff);
TESTINST_DSWAP("dshd", 0xffff0000ffffffff);
TESTINST_DSWAP("dshd", 0x2000ffffffffffff);
TESTINST_DSWAP("dshd", 0x2000ffffffddddff);
TESTINST_DSWAP("dshd", 0x2000ffffffffeeee);
TESTINST_DSWAP("dshd", 0x31415927ffffffff);
TESTINST_DSWAP("dshd", 0x2000ffffffffaaaa);
TESTINST_DSWAP("dshd", 0x2000ffffffbbbbff);
TESTINST_DSWAP("dshd", 0xeeeeff33ff22ffff);
TESTINST_DSWAP("dshd", 0x2000ffffffffffff);
TESTINST_DSWAP("dshd", 0x2000ffffffffbbbb);
TESTINST_DSWAP("dshd", 0x2000ffffffffffff);
TESTINST_DSWAP("dshd", 0x7fffffffddddffff);
TESTINST_DSWAP("dshd", 0x2000ffffffff2222);
TESTINST_DSWAP("dshd", 0x2000ffffffffffff);
TESTINST_DSWAP("dshd", 0xfffffff31415927f);
TESTINST_DSWAP("dshd", 0xffffffffffff0008);
TESTINST_DSWAP("dshd", 0xffff0000ffffffff);
TESTINST_DSWAP("dshd", 0xff0000ffffffffff);
TESTINST_DSWAP("dshd", 0xfffffffff0000fff);
printf("--- WSBH ---\n");
TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("wsbh", 0xffff0000ffffffff);
TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("wsbh", 0x2000ffffeeeeffff);
TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("wsbh", 0x31415927ffffffff);
TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("wsbh", 0x2000ffffffccccff);
TESTINST_DSWAP("wsbh", 0xeeeeffffffffffff);
TESTINST_DSWAP("wsbh", 0x2000ffff0000ffff);
TESTINST_DSWAP("wsbh", 0x2000ffffffffbbbb);
TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("wsbh", 0x7fffffff5555ffff);
TESTINST_DSWAP("wsbh", 0x2000ffffff123123);
TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
TESTINST_DSWAP("wsbh", 0xfffffff31415927f);
TESTINST_DSWAP("wsbh", 0xffffffffffff0008);
TESTINST_DSWAP("wsbh", 0xffff0000ffff88ff);
TESTINST_DSWAP("wsbh", 0xff0000ffffffffff);
TESTINST_DSWAP("wsbh", 0xfff10ffff0000fff);
#else
printf("This test is testing mips64r2 instructions.\n");
#endif
return 0;
}