mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 16:36:21 +00:00
193 lines
8.4 KiB
C
193 lines
8.4 KiB
C
#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;
|
|
}
|