cvt_test.cpp
1 #define XBYAK_NO_OP_NAMES 2 #include <xbyak/xbyak.h> 3 #include <cybozu/inttype.hpp> 4 #include <cybozu/test.hpp> 5 6 using namespace Xbyak; 7 using namespace Xbyak::util; 8 9 #ifdef XBYAK64 10 const struct Ptn { 11 const Reg8 *reg8; 12 Reg16 reg16; 13 Reg32 reg32; 14 Reg64 reg64; 15 } tbl[] = { 16 { &al, ax, eax, rax }, 17 { &bl, bx, ebx, rbx }, 18 { &cl, cx, ecx, rcx }, 19 { &dl, dx, edx, rdx }, 20 { &sil, si, esi, rsi }, 21 { &dil, di, edi, rdi }, 22 { &bpl, bp, ebp, rbp }, 23 { &spl, sp, esp, rsp }, 24 { &r8b, r8w, r8d, r8 }, 25 { &r9b, r9w, r9d, r9 }, 26 { &r10b, r10w, r10d, r10 }, 27 { &r11b, r11w, r11d, r11 }, 28 { &r12b, r12w, r12d, r12 }, 29 { &r13b, r13w, r13d, r13 }, 30 { &r14b, r14w, r14d, r14 }, 31 { &r15b, r15w, r15d, r15 }, 32 }; 33 #else 34 const struct Ptn { 35 const Reg8 *reg8; 36 Reg16 reg16; 37 Reg32 reg32; 38 } tbl[] = { 39 { &al, ax, eax }, 40 { &bl, bx, ebx }, 41 { &cl, cx, ecx }, 42 { &dl, dx, edx }, 43 { 0, si, esi }, 44 { 0, di, edi }, 45 { 0, bp, ebp }, 46 { 0, sp, esp }, 47 }; 48 #endif 49 50 CYBOZU_TEST_AUTO(cvt) 51 { 52 for (size_t i = 0; i < sizeof(tbl) / sizeof(tbl[0]); i++) { 53 if (tbl[i].reg8) { 54 CYBOZU_TEST_ASSERT(tbl[i].reg8->cvt8() == *tbl[i].reg8); 55 CYBOZU_TEST_ASSERT(tbl[i].reg8->cvt16() == tbl[i].reg16); 56 CYBOZU_TEST_ASSERT(tbl[i].reg8->cvt32() == tbl[i].reg32); 57 CYBOZU_TEST_ASSERT(tbl[i].reg16.cvt8() == *tbl[i].reg8); 58 CYBOZU_TEST_ASSERT(tbl[i].reg32.cvt8() == *tbl[i].reg8); 59 } 60 CYBOZU_TEST_ASSERT(tbl[i].reg16.cvt16() == tbl[i].reg16); 61 CYBOZU_TEST_ASSERT(tbl[i].reg16.cvt32() == tbl[i].reg32); 62 CYBOZU_TEST_ASSERT(tbl[i].reg32.cvt16() == tbl[i].reg16); 63 CYBOZU_TEST_ASSERT(tbl[i].reg32.cvt32() == tbl[i].reg32); 64 #ifdef XBYAK64 65 if (tbl[i].reg8) { 66 CYBOZU_TEST_ASSERT(tbl[i].reg64.cvt8() == *tbl[i].reg8); 67 CYBOZU_TEST_ASSERT(tbl[i].reg8->cvt64() == tbl[i].reg64); 68 } 69 CYBOZU_TEST_ASSERT(tbl[i].reg64.cvt16() == tbl[i].reg16); 70 CYBOZU_TEST_ASSERT(tbl[i].reg64.cvt32() == tbl[i].reg32); 71 CYBOZU_TEST_ASSERT(tbl[i].reg64.cvt64() == tbl[i].reg64); 72 CYBOZU_TEST_ASSERT(tbl[i].reg16.cvt64() == tbl[i].reg64); 73 CYBOZU_TEST_ASSERT(tbl[i].reg32.cvt64() == tbl[i].reg64); 74 #endif 75 } 76 { 77 const Reg8 errTbl[] = { 78 ah, bh, ch, dh 79 }; 80 for (size_t i = 0; i < sizeof(errTbl) / sizeof(errTbl[0]); i++) { 81 CYBOZU_TEST_EXCEPTION(errTbl[i].cvt16(), std::exception); 82 } 83 } 84 #ifdef XBYAK32 85 { 86 const Reg16 errTbl[] = { 87 si, di, bp, sp 88 }; 89 for (size_t i = 0; i < sizeof(errTbl) / sizeof(errTbl[0]); i++) { 90 CYBOZU_TEST_EXCEPTION(errTbl[i].cvt8(), std::exception); 91 } 92 } 93 #endif 94 } 95 96 CYBOZU_TEST_AUTO(changeBit) 97 { 98 using namespace Xbyak::util; 99 #ifdef XBYAK64 100 const size_t N = 7; 101 const Reg* tbl[][N] = { 102 { &al, &ax, &eax, &rax, &xmm0, &ymm0, &zmm0 }, 103 { &cl, &cx, &ecx, &rcx, &xmm1, &ymm1, &zmm1 }, 104 { &dl, &dx, &edx, &rdx, &xmm2, &ymm2, &zmm2 }, 105 { &bl, &bx, &ebx, &rbx, &xmm3, &ymm3, &zmm3 }, 106 { &spl, &sp, &esp, &rsp, &xmm4, &ymm4, &zmm4 }, 107 { &bpl, &bp, &ebp, &rbp, &xmm5, &ymm5, &zmm5 }, 108 { &sil, &si, &esi, &rsi, &xmm6, &ymm6, &zmm6 }, 109 { &dil, &di, &edi, &rdi, &xmm7, &ymm7, &zmm7 }, 110 { &r8b, &r8w, &r8d, &r8, &xmm8, &ymm8, &zmm8 }, 111 { &r15b, &r15w, &r15d, &r15, &xmm15, &ymm15, &zmm15 }, 112 { &r16b, &r16w, &r16d, &r16, &xmm16, &ymm16, &zmm16 }, 113 { &r31b, &r31w, &r31d, &r31, &xmm31, &ymm31, &zmm31 }, 114 }; 115 const int bitTbl[N] = { 8, 16, 32, 64, 128, 256, 512 }; 116 #else 117 const size_t N = 6; 118 const Reg* tbl[][N] = { 119 { &al, &ax, &eax, &xmm0, &ymm0, &zmm0 }, 120 { &cl, &cx, &ecx, &xmm1, &ymm1, &zmm1 }, 121 { &dl, &dx, &edx, &xmm2, &ymm2, &zmm2 }, 122 { &bl, &bx, &ebx, &xmm3, &ymm3, &zmm3 }, 123 { 0, &sp, &esp, &xmm4, &ymm4, &zmm4 }, 124 { 0, &bp, &ebp, &xmm5, &ymm5, &zmm5 }, 125 { 0, &si, &esi, &xmm6, &ymm6, &zmm6 }, 126 { 0, &di, &edi, &xmm7, &ymm7, &zmm7 }, 127 }; 128 const int bitTbl[N] = { 8, 16, 32, 128, 256, 512 }; 129 #endif 130 131 for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) { 132 for (size_t j = 0; j < N; j++) { 133 const Reg *r1 = tbl[i][j]; 134 if (r1 == 0) continue; 135 for (size_t k = 0; k < N; k++) { 136 if (tbl[i][k]) { 137 CYBOZU_TEST_ASSERT(*tbl[i][k] == r1->changeBit(bitTbl[k])); 138 // printf("%s->changeBit(%d)=%s %s\n", r1->toString(), bitTbl[k], r1->changeBit(bitTbl[k]).toString(), tbl[i][k]->toString()); 139 } else { 140 CYBOZU_TEST_EXCEPTION(r1->changeBit(bitTbl[k]), std::exception); 141 } 142 } 143 } 144 } 145 #ifdef XBYAK64 146 const Reg8 *special8bitTbl[] = { &ah, &bh, &ch, &dh }; 147 for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(special8bitTbl); i++) { 148 CYBOZU_TEST_EXCEPTION(special8bitTbl[i]->changeBit(16), std::exception); 149 } 150 #endif 151 }