encode: Use macro for OPC_SEG mask

This commit is contained in:
Alexis Engelke
2021-01-07 10:20:00 +01:00
parent dfb28c923d
commit 018a954b4c

View File

@@ -27,9 +27,11 @@ enum {
OPC_REXB = 1 << 26, OPC_REXB = 1 << 26,
OPC_REX = 1 << 29, OPC_REX = 1 << 29,
OPC_67 = 1 << 30, OPC_67 = 1 << 30,
OPC_SEG = (1l << 31) | (1l << 32) | (1l << 33),
}; };
#define OPC_SEG_IDX 31
#define OPC_SEG_MSK (0x7l << OPC_SEG_IDX)
static bool op_mem(FeOp op) { return op < 0; } static bool op_mem(FeOp op) { return op < 0; }
static bool op_reg(FeOp op) { return op >= 0; } static bool op_reg(FeOp op) { return op >= 0; }
static bool op_reg_gpl(FeOp op) { return (op & ~0xf) == 0x100; } static bool op_reg_gpl(FeOp op) { return (op & ~0xf) == 0x100; }
@@ -56,7 +58,7 @@ opc_size(uint64_t opc)
{ {
if (opc & OPC_VEX) return 0; // TODO: support VEX encoding if (opc & OPC_VEX) return 0; // TODO: support VEX encoding
unsigned res = 1; unsigned res = 1;
if (opc & OPC_SEG) res++; if (opc & OPC_SEG_MSK) res++;
if (opc & OPC_67) res++; if (opc & OPC_67) res++;
if (opc & OPC_66) res++; if (opc & OPC_66) res++;
if (opc & OPC_F2) res++; if (opc & OPC_F2) res++;
@@ -73,8 +75,8 @@ int
enc_opc(uint8_t** restrict buf, uint64_t opc) enc_opc(uint8_t** restrict buf, uint64_t opc)
{ {
if (opc & OPC_VEX) return -1; // TODO: support VEX encoding if (opc & OPC_VEX) return -1; // TODO: support VEX encoding
if (opc & OPC_SEG) if (opc & OPC_SEG_MSK)
*(*buf)++ = (0x65643e362e2600 >> (8 * ((opc >> 31) & 7))) & 0xff; *(*buf)++ = (0x65643e362e2600 >> (8 * ((opc >> OPC_SEG_IDX) & 7))) & 0xff;
if (opc & OPC_67) *(*buf)++ = 0x67; if (opc & OPC_67) *(*buf)++ = 0x67;
if (opc & OPC_66) *(*buf)++ = 0x66; if (opc & OPC_66) *(*buf)++ = 0x66;
if (opc & OPC_F2) *(*buf)++ = 0xF2; if (opc & OPC_F2) *(*buf)++ = 0xF2;
@@ -307,7 +309,7 @@ fe_enc64_impl(uint8_t** restrict buf, uint64_t mnem, FeOp op0, FeOp op1,
if (UNLIKELY(mnem & FE_ADDR32)) if (UNLIKELY(mnem & FE_ADDR32))
opc |= OPC_67; opc |= OPC_67;
if (UNLIKELY(mnem & FE_SEG_MASK)) if (UNLIKELY(mnem & FE_SEG_MASK))
opc |= (mnem & FE_SEG_MASK) << (31 - 16); opc |= (mnem & FE_SEG_MASK) << (OPC_SEG_IDX - 16);
if (ei->immctl && ei->immctl != 3) if (ei->immctl && ei->immctl != 3)
imm = ops[ei->immidx]; imm = ops[ei->immidx];