#include using namespace Xbyak; using namespace Xbyak::util; #ifdef XBYAK64 const struct Ptn { const Reg8 *reg8; Reg16 reg16; Reg32 reg32; Reg64 reg64; } tbl[] = { { &al, ax, eax, rax }, { &bl, bx, ebx, rbx }, { &cl, cx, ecx, rcx }, { &dl, dx, edx, rdx }, { &sil, si, esi, rsi }, { &dil, di, edi, rdi }, { &bpl, bp, ebp, rbp }, { &spl, sp, esp, rsp }, { &r8b, r8w, r8d, r8 }, { &r9b, r9w, r9d, r9 }, { &r10b, r10w, r10d, r10 }, { &r11b, r11w, r11d, r11 }, { &r12b, r12w, r12d, r12 }, { &r13b, r13w, r13d, r13 }, { &r14b, r14w, r14d, r14 }, { &r15b, r15w, r15d, r15 }, }; #else const struct Ptn { const Reg8 *reg8; Reg16 reg16; Reg32 reg32; } tbl[] = { { &al, ax, eax }, { &bl, bx, ebx }, { &cl, cx, ecx }, { &dl, dx, edx }, { 0, si, esi }, { 0, di, edi }, { 0, bp, ebp }, { 0, sp, esp }, }; #endif int errNum = 0; int testNum = 0; template void verify(const T& x, const T& y) { if (x != y) { printf("ERR %s %s\n", x.toString(), y.toString()); errNum++; } testNum++; } #define verifyExp(state) \ { \ bool isOK = false; \ try { \ state; \ } catch (const Xbyak::Error& e) { \ if ((int)e == ERR_CANT_CONVERT) { \ isOK = true; \ } \ } \ if (!isOK) { \ printf("ERR " #state "\n"); \ errNum++; \ } \ testNum++; \ } int main() try { for (size_t i = 0; i < sizeof(tbl) / sizeof(tbl[0]); i++) { if (tbl[i].reg8) { verify(tbl[i].reg8->cvt8(), *tbl[i].reg8); verify(tbl[i].reg8->cvt16(), tbl[i].reg16); verify(tbl[i].reg8->cvt32(), tbl[i].reg32); verify(tbl[i].reg16.cvt8(), *tbl[i].reg8); verify(tbl[i].reg32.cvt8(), *tbl[i].reg8); } verify(tbl[i].reg16.cvt16(), tbl[i].reg16); verify(tbl[i].reg16.cvt32(), tbl[i].reg32); verify(tbl[i].reg32.cvt16(), tbl[i].reg16); verify(tbl[i].reg32.cvt32(), tbl[i].reg32); #ifdef XBYAK64 if (tbl[i].reg8) { verify(tbl[i].reg64.cvt8(), *tbl[i].reg8); verify(tbl[i].reg8->cvt64(), tbl[i].reg64); } verify(tbl[i].reg64.cvt16(), tbl[i].reg16); verify(tbl[i].reg64.cvt32(), tbl[i].reg32); verify(tbl[i].reg64.cvt64(), tbl[i].reg64); verify(tbl[i].reg16.cvt64(), tbl[i].reg64); verify(tbl[i].reg32.cvt64(), tbl[i].reg64); #endif } { const Reg8 errTbl[] = { ah, bh, ch, dh }; for (size_t i = 0; i < sizeof(errTbl) / sizeof(errTbl[0]); i++) { verifyExp(errTbl[i].cvt16()); } } #ifdef XBYAK32 { const Reg16 errTbl[] = { si, di, bp, sp }; for (size_t i = 0; i < sizeof(errTbl) / sizeof(errTbl[0]); i++) { verifyExp(errTbl[i].cvt8()); } } #endif printf("test=%d(err=%d)\n", testNum, errNum); } catch (std::exception& e) { printf("ERR %s\n", e.what()); }