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