check imm of mov(Operand, imm)

This commit is contained in:
MITSUNARI Shigeo 2015-08-16 06:49:44 +09:00
parent 93aae57298
commit f03bbc298d
3 changed files with 22 additions and 4 deletions

View file

@ -30,5 +30,22 @@ CYBOZU_TEST_AUTO(compOperand)
CYBOZU_TEST_ASSERT(ptr[eax] == ptr[eax]); CYBOZU_TEST_ASSERT(ptr[eax] == ptr[eax]);
CYBOZU_TEST_ASSERT(dword[eax] != ptr[eax]); CYBOZU_TEST_ASSERT(dword[eax] != ptr[eax]);
CYBOZU_TEST_ASSERT(ptr[eax] != ptr[eax+3]); CYBOZU_TEST_ASSERT(ptr[eax] != ptr[eax+3]);
CYBOZU_TEST_ASSERT(ptr[eax] != ptr[eax+3]); }
}
#ifdef XBYAK64
CYBOZU_TEST_AUTO(mov_const)
{
struct Code : Xbyak::CodeGenerator {
Code()
{
CYBOZU_TEST_NO_EXCEPTION(mov(dword[eax], -1));
CYBOZU_TEST_NO_EXCEPTION(mov(dword[eax], 0x7fffffff));
CYBOZU_TEST_NO_EXCEPTION(mov(dword[eax], -0x7fffffff));
CYBOZU_TEST_NO_EXCEPTION(mov(dword[eax], 0xabcd1234));
CYBOZU_TEST_NO_EXCEPTION(mov(dword[eax], 0xffffffff));
CYBOZU_TEST_EXCEPTION(mov(dword[eax], 0x100000000ull), Xbyak::Error);
CYBOZU_TEST_EXCEPTION(mov(dword[eax], -0x80000000ull), Xbyak::Error);
}
} code;
}
#endif

View file

@ -100,7 +100,7 @@ namespace Xbyak {
enum { enum {
DEFAULT_MAX_CODE_SIZE = 4096, DEFAULT_MAX_CODE_SIZE = 4096,
VERSION = 0x4850 /* 0xABCD = A.BC(D) */ VERSION = 0x4851 /* 0xABCD = A.BC(D) */
}; };
#ifndef MIE_INTEGER_TYPE_DEFINED #ifndef MIE_INTEGER_TYPE_DEFINED
@ -1866,6 +1866,7 @@ public:
} else if (op.isMEM()) { } else if (op.isMEM()) {
opModM(static_cast<const Address&>(op), Reg(0, Operand::REG, op.getBit()), B11000110); opModM(static_cast<const Address&>(op), Reg(0, Operand::REG, op.getBit()), B11000110);
int size = op.getBit() / 8; if (size > 4) size = 4; int size = op.getBit() / 8; if (size > 4) size = 4;
if (0xffffffff < imm && imm <= ~uint64(0x7fffffffu)) throw Error(ERR_OFFSET_IS_TOO_BIG);
db(static_cast<uint32>(imm), size); db(static_cast<uint32>(imm), size);
} else { } else {
throw Error(ERR_BAD_COMBINATION); throw Error(ERR_BAD_COMBINATION);

View file

@ -1,4 +1,4 @@
const char *getVersionString() const { return "4.85"; } const char *getVersionString() const { return "4.851"; }
void packssdw(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x6B); } void packssdw(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x6B); }
void packsswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x63); } void packsswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x63); }
void packuswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x67); } void packuswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x67); }