/ externals / xbyak / test / cvt_test.cpp
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  }