#ifdef X64
# define PREFIX_EVEX_z 0x000800000
# define R(reg) opnd_create_reg(DR_REG_##reg)
# define Xh(reg) opnd_create_reg_partial(DR_REG_##reg, OPSZ_8)
# define Yh(reg) opnd_create_reg_partial(DR_REG_##reg, OPSZ_16)
# define Zh(reg) opnd_create_reg_partial(DR_REG_##reg, OPSZ_32)
# define M(b, i, s, d, sz) opnd_create_base_disp(DR_REG_##b, DR_REG_##i, s, d, sz)
enum {
Z = 1,
};
# define HANDLE_FLAGS(instr, flags) \
do { \
if (flags & Z) { \
instr_set_prefix_flag(instr, PREFIX_EVEX_z); \
} \
} while (0)
# if VERBOSE
# define PRINT_TEST_NAME(name)
# else
# define PRINT_TEST_NAME(x)
# endif
# define ENC3(name, opc, flags, arg1, arg2, arg3) \
do { \
instr_t *instr = INSTR_CREATE_##opc(dc, arg1, arg2, arg3); \
PRINT_TEST_NAME(name); \
HANDLE_FLAGS(instr, flags); \
test_instr_encode(dc, instr, sizeof(name)); \
if (memcmp(buf, name, sizeof(name))) { \
dr_printf("memcmp mismatch\n"); \
} \
} while (0)
# define ENC4(name, opc, flags, arg1, arg2, arg3, arg4) \
do { \
instr_t *instr = INSTR_CREATE_##opc(dc, arg1, arg2, arg3, arg4); \
PRINT_TEST_NAME(name); \
HANDLE_FLAGS(instr, flags); \
test_instr_encode(dc, instr, sizeof(name)); \
if (memcmp(buf, name, sizeof(name))) { \
dr_printf("memcmp mismatch\n"); \
} \
} while (0)
#endif