1b35637a050d995634a21a126d37957f7bcee03a6petarj#include <stdio.h> 2b35637a050d995634a21a126d37957f7bcee03a6petarj 3b35637a050d995634a21a126d37957f7bcee03a6petarj#define TESTINST_DROTR(instruction, in, SA) \ 4b35637a050d995634a21a126d37957f7bcee03a6petarj{ \ 5b35637a050d995634a21a126d37957f7bcee03a6petarj unsigned long long out; \ 6b35637a050d995634a21a126d37957f7bcee03a6petarj __asm__ __volatile__( \ 7b35637a050d995634a21a126d37957f7bcee03a6petarj "move $t0, $zero" "\n\t" \ 8b35637a050d995634a21a126d37957f7bcee03a6petarj "move $t1, %1" "\n\t" \ 9b35637a050d995634a21a126d37957f7bcee03a6petarj instruction" $t0, $t1, "#SA "\n\t" \ 10b35637a050d995634a21a126d37957f7bcee03a6petarj "move %0, $t0" "\n\t" \ 11b35637a050d995634a21a126d37957f7bcee03a6petarj : "=r" (out) \ 12b35637a050d995634a21a126d37957f7bcee03a6petarj : "r" (in) \ 13b35637a050d995634a21a126d37957f7bcee03a6petarj : "t0", "t1" \ 14b35637a050d995634a21a126d37957f7bcee03a6petarj ); \ 15b35637a050d995634a21a126d37957f7bcee03a6petarj printf("%s :: in 0x%llx, out 0x%llx, SA %d\n", \ 16b35637a050d995634a21a126d37957f7bcee03a6petarj instruction, (long long) in, out, SA); \ 17b35637a050d995634a21a126d37957f7bcee03a6petarj} 18b35637a050d995634a21a126d37957f7bcee03a6petarj 19b35637a050d995634a21a126d37957f7bcee03a6petarj#define TESTINST_DROTRV(instruction, in, SA) \ 20b35637a050d995634a21a126d37957f7bcee03a6petarj{ \ 21b35637a050d995634a21a126d37957f7bcee03a6petarj unsigned long long out; \ 22b35637a050d995634a21a126d37957f7bcee03a6petarj __asm__ __volatile__( \ 23b35637a050d995634a21a126d37957f7bcee03a6petarj "move $t0, $zero" "\n\t" \ 24b35637a050d995634a21a126d37957f7bcee03a6petarj "move $t1, %1" "\n\t" \ 25b35637a050d995634a21a126d37957f7bcee03a6petarj "move $t2, %2" "\n\t" \ 26b35637a050d995634a21a126d37957f7bcee03a6petarj instruction" $t0, $t1, $t2" "\n\t" \ 27b35637a050d995634a21a126d37957f7bcee03a6petarj "move %0, $t0" "\n\t" \ 28b35637a050d995634a21a126d37957f7bcee03a6petarj : "=r" (out) \ 29b35637a050d995634a21a126d37957f7bcee03a6petarj : "r" (in), "r" (SA) \ 30b35637a050d995634a21a126d37957f7bcee03a6petarj : "t0", "t1", "t2" \ 31b35637a050d995634a21a126d37957f7bcee03a6petarj ); \ 32b35637a050d995634a21a126d37957f7bcee03a6petarj printf("%s :: in 0x%llx, out 0x%llx, SA %d\n", \ 33b35637a050d995634a21a126d37957f7bcee03a6petarj instruction, (long long) in, out, SA); \ 34b35637a050d995634a21a126d37957f7bcee03a6petarj} 35b35637a050d995634a21a126d37957f7bcee03a6petarj 36b35637a050d995634a21a126d37957f7bcee03a6petarj#define TESTINST_DSWAP(instruction, in) \ 37b35637a050d995634a21a126d37957f7bcee03a6petarj{ \ 38b35637a050d995634a21a126d37957f7bcee03a6petarj unsigned long long out; \ 39b35637a050d995634a21a126d37957f7bcee03a6petarj __asm__ __volatile__( \ 40b35637a050d995634a21a126d37957f7bcee03a6petarj "move $t0, $0" "\n\t" \ 41b35637a050d995634a21a126d37957f7bcee03a6petarj "move $t1, $0" "\n\t" \ 42b35637a050d995634a21a126d37957f7bcee03a6petarj "move $t1, %1" "\n\t" \ 43b35637a050d995634a21a126d37957f7bcee03a6petarj instruction" $t0, $t1" "\n\t" \ 44b35637a050d995634a21a126d37957f7bcee03a6petarj "move %0, $t0" "\n\t" \ 45b35637a050d995634a21a126d37957f7bcee03a6petarj : "=r" (out) \ 46b35637a050d995634a21a126d37957f7bcee03a6petarj : "r" (in) \ 47b35637a050d995634a21a126d37957f7bcee03a6petarj : "t0", "t1" \ 48b35637a050d995634a21a126d37957f7bcee03a6petarj ); \ 49b35637a050d995634a21a126d37957f7bcee03a6petarj printf("%s :: in 0x%llx, out 0x%llx\n", \ 50b35637a050d995634a21a126d37957f7bcee03a6petarj instruction, (long long) in, out); \ 51b35637a050d995634a21a126d37957f7bcee03a6petarj} 52b35637a050d995634a21a126d37957f7bcee03a6petarj 53b35637a050d995634a21a126d37957f7bcee03a6petarjint main() 54b35637a050d995634a21a126d37957f7bcee03a6petarj{ 55b35637a050d995634a21a126d37957f7bcee03a6petarj#if (__mips == 64) && (__mips_isa_rev >= 2) 56b35637a050d995634a21a126d37957f7bcee03a6petarj printf("--- DROTR ---\n"); 57b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 16); 58b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0xffff0000ffffffff, 16); 59b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 8); 60b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 4); 61b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 5); 62b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x31415927ffffffff, 10); 63b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 4); 64b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 0); 65b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0xeeeeffffffffffff, 16); 66b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffbbbb, 31); 67b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 16); 68b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 0); 69b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x7fffffffffffffff, 16); 70b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 2); 71b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0x2000ffffffffffff, 24); 72b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0xfffffff31415927f, 16); 73b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0xffffffffffff0008, 3); 74b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0xffff0000ffffffff, 16); 75b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0xff0000ffffffffff, 16); 76b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr", 0xfffffffff0000fff, 16); 77b35637a050d995634a21a126d37957f7bcee03a6petarj 78b35637a050d995634a21a126d37957f7bcee03a6petarj printf("--- DROTR32 ---\n"); 79b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 16); 80b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0xffff0000ffffffff, 16); 81b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 8); 82b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 4); 83b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 5); 84b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x31415927ffffffff, 10); 85b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 4); 86b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 0); 87b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0xeeeeffffffffffff, 16); 88b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 31); 89b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffbbbb, 16); 90b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 0); 91b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x7fffffffffffffff, 16); 92b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 2); 93b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 24); 94b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0xfffffff31415927f, 16); 95b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0xffffffffffff0008, 3); 96b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0xffff0000ffffffff, 16); 97b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0xff0000ffffffffff, 16); 98b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTR("drotr32", 0xfffffffff0000fff, 16); 99b35637a050d995634a21a126d37957f7bcee03a6petarj 100b35637a050d995634a21a126d37957f7bcee03a6petarj printf("--- DROTRV ---\n"); 101b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 16); 102b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0xffff0000ffffffff, 16); 103b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 8); 104b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 4); 105b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 5); 106b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x31415927ffffffff, 10); 107b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 4); 108b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 0); 109b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0xeeeeffffffffffff, 16); 110b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 31); 111b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffbbbb, 16); 112b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 0); 113b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x7fffffffffffffff, 16); 114b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 2); 115b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 24); 116b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0xfffffff31415927f, 16); 117b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0xffffffffffff0008, 3); 118b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0xffff0000ffffffff, 16); 119b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0xff0000ffffffffff, 16); 120b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DROTRV("drotrv", 0xfffffffff0000fff, 16); 121b35637a050d995634a21a126d37957f7bcee03a6petarj 122b35637a050d995634a21a126d37957f7bcee03a6petarj printf("--- DSBH ---\n"); 123b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffffffffff); 124b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0xffff0000ffffffff); 125b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffffffffff); 126b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffeeeeffff); 127b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffffffffff); 128b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x31415927ffffffff); 129b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffffffffff); 130b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffffccccff); 131b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0xeeeeffffffffffff); 132b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffff0000ffff); 133b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffffffbbbb); 134b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffffffffff); 135b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x7fffffff5555ffff); 136b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffff123123); 137b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0x2000ffffffffffff); 138b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0xfffffff31415927f); 139b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0xffffffffffff0008); 140b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0xffff0000ffff88ff); 141b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0xff0000ffffffffff); 142b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dsbh", 0xfff10ffff0000fff); 143b35637a050d995634a21a126d37957f7bcee03a6petarj 144b35637a050d995634a21a126d37957f7bcee03a6petarj printf("--- DSHD ---\n"); 145b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2002ffffffffffff); 146b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0xffff0000ffffffff); 147b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffffffff); 148b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffddddff); 149b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffffeeee); 150b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x31415927ffffffff); 151b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffffaaaa); 152b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffbbbbff); 153b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0xeeeeff33ff22ffff); 154b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffffffff); 155b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffffbbbb); 156b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffffffff); 157b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x7fffffffddddffff); 158b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffff2222); 159b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0x2000ffffffffffff); 160b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0xfffffff31415927f); 161b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0xffffffffffff0008); 162b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0xffff0000ffffffff); 163b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0xff0000ffffffffff); 164b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("dshd", 0xfffffffff0000fff); 165b35637a050d995634a21a126d37957f7bcee03a6petarj 166b35637a050d995634a21a126d37957f7bcee03a6petarj printf("--- WSBH ---\n"); 167b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffffffffff); 168b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0xffff0000ffffffff); 169b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffffffffff); 170b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffeeeeffff); 171b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffffffffff); 172b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x31415927ffffffff); 173b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffffffffff); 174b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffffccccff); 175b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0xeeeeffffffffffff); 176b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffff0000ffff); 177b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffffffbbbb); 178b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffffffffff); 179b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x7fffffff5555ffff); 180b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffff123123); 181b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0x2000ffffffffffff); 182b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0xfffffff31415927f); 183b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0xffffffffffff0008); 184b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0xffff0000ffff88ff); 185b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0xff0000ffffffffff); 186b35637a050d995634a21a126d37957f7bcee03a6petarj TESTINST_DSWAP("wsbh", 0xfff10ffff0000fff); 187b35637a050d995634a21a126d37957f7bcee03a6petarj#else 188b35637a050d995634a21a126d37957f7bcee03a6petarj printf("This test is testing mips64r2 instructions.\n"); 189b35637a050d995634a21a126d37957f7bcee03a6petarj#endif 190b35637a050d995634a21a126d37957f7bcee03a6petarj 191b35637a050d995634a21a126d37957f7bcee03a6petarj return 0; 192b35637a050d995634a21a126d37957f7bcee03a6petarj} 193