126 lines
2.6 KiB
C++
126 lines
2.6 KiB
C++
|
#include <xbyak/xbyak.h>
|
||
|
|
||
|
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<class T>
|
||
|
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());
|
||
|
}
|