|
Packit Service |
e080da |
/*
|
|
Packit Service |
e080da |
Copyright (c) 2015 DataLab, s.l. <http://www.datalab.es>
|
|
Packit Service |
e080da |
This file is part of GlusterFS.
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
This file is licensed to you under your choice of the GNU Lesser
|
|
Packit Service |
e080da |
General Public License, version 3 or any later version (LGPLv3 or
|
|
Packit Service |
e080da |
later), or the GNU General Public License, version 2 (GPLv2), in all
|
|
Packit Service |
e080da |
cases as published by the Free Software Foundation.
|
|
Packit Service |
e080da |
*/
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
#include <inttypes.h>
|
|
Packit Service |
e080da |
#include <string.h>
|
|
Packit Service |
e080da |
#include <errno.h>
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
#include "ec-code-intel.h"
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_init(ec_code_intel_t *intel)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
memset(intel, 0, sizeof(ec_code_intel_t));
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_prefix(ec_code_intel_t *intel, uint8_t prefix)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
intel->prefix.data[intel->prefix.bytes++] = prefix;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_rex(ec_code_intel_t *intel, gf_boolean_t w)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
gf_boolean_t present = _gf_false;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
if (w) {
|
|
Packit Service |
e080da |
intel->rex.w = 1;
|
|
Packit Service |
e080da |
present = _gf_true;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
if (intel->modrm.present) {
|
|
Packit Service |
e080da |
if (intel->modrm.reg > 7) {
|
|
Packit Service |
e080da |
intel->modrm.reg &= 7;
|
|
Packit Service |
e080da |
intel->rex.r = 1;
|
|
Packit Service |
e080da |
present = _gf_true;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
if (intel->sib.present) {
|
|
Packit Service |
e080da |
if (intel->sib.index > 7) {
|
|
Packit Service |
e080da |
intel->sib.index &= 7;
|
|
Packit Service |
e080da |
intel->rex.x = 1;
|
|
Packit Service |
e080da |
present = _gf_true;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
if (intel->sib.base > 7) {
|
|
Packit Service |
e080da |
intel->sib.base &= 7;
|
|
Packit Service |
e080da |
intel->rex.b = 1;
|
|
Packit Service |
e080da |
present = _gf_true;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
} else if (intel->modrm.rm > 7) {
|
|
Packit Service |
e080da |
intel->modrm.rm &= 7;
|
|
Packit Service |
e080da |
intel->rex.b = 1;
|
|
Packit Service |
e080da |
present = _gf_true;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
} else if (intel->reg > 7) {
|
|
Packit Service |
e080da |
intel->reg &= 7;
|
|
Packit Service |
e080da |
intel->rex.b = 1;
|
|
Packit Service |
e080da |
present = _gf_true;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
intel->rex.present = present;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_vex(ec_code_intel_t *intel, gf_boolean_t w, gf_boolean_t l,
|
|
Packit Service |
e080da |
ec_code_vex_opcode_t opcode, ec_code_vex_prefix_t prefix,
|
|
Packit Service |
e080da |
uint32_t reg)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_rex(intel, w);
|
|
Packit Service |
e080da |
if (((intel->rex.w == 1) || (intel->rex.x == 0) || (intel->rex.b == 0)) ||
|
|
Packit Service |
e080da |
((opcode != VEX_OPCODE_NONE) && (opcode != VEX_OPCODE_0F))) {
|
|
Packit Service |
e080da |
intel->rex.present = _gf_false;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
intel->vex.bytes = 3;
|
|
Packit Service |
e080da |
intel->vex.data[0] = 0xC4;
|
|
Packit Service |
e080da |
intel->vex.data[1] = ((intel->rex.r << 7) | (intel->rex.x << 6) |
|
|
Packit Service |
e080da |
(intel->rex.b << 5) | opcode) ^
|
|
Packit Service |
e080da |
0xE0;
|
|
Packit Service |
e080da |
intel->vex.data[2] = (intel->rex.w << 7) | ((~reg & 0x0F) << 3) |
|
|
Packit Service |
e080da |
(l ? 0x04 : 0x00) | prefix;
|
|
Packit Service |
e080da |
} else {
|
|
Packit Service |
e080da |
intel->vex.bytes = 2;
|
|
Packit Service |
e080da |
intel->vex.data[0] = 0xC5;
|
|
Packit Service |
e080da |
intel->vex.data[1] = (intel->rex.r << 7) | ((~reg & 0x0F) << 3) |
|
|
Packit Service |
e080da |
(l ? 0x04 : 0x00) | prefix;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(ec_code_intel_t *intel, uint32_t rm, uint32_t reg)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
intel->modrm.present = _gf_true;
|
|
Packit Service |
e080da |
intel->modrm.mod = 3;
|
|
Packit Service |
e080da |
intel->modrm.rm = rm;
|
|
Packit Service |
e080da |
intel->modrm.reg = reg;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(ec_code_intel_t *intel, uint32_t reg,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t base, ec_code_intel_reg_t index,
|
|
Packit Service |
e080da |
uint32_t scale, int32_t offset)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
if (index == REG_SP) {
|
|
Packit Service |
e080da |
intel->invalid = _gf_true;
|
|
Packit Service |
e080da |
return;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
if ((index != REG_NULL) && (scale != 1) && (scale != 2) && (scale != 4) &&
|
|
Packit Service |
e080da |
(scale != 8)) {
|
|
Packit Service |
e080da |
intel->invalid = _gf_true;
|
|
Packit Service |
e080da |
return;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
scale >>= 1;
|
|
Packit Service |
e080da |
if (scale == 4) {
|
|
Packit Service |
e080da |
scale = 3;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
intel->modrm.present = _gf_true;
|
|
Packit Service |
e080da |
intel->modrm.reg = reg;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
intel->offset.value = offset;
|
|
Packit Service |
e080da |
if ((offset == 0) && (base != REG_BP)) {
|
|
Packit Service |
e080da |
intel->modrm.mod = 0;
|
|
Packit Service |
e080da |
intel->offset.bytes = 0;
|
|
Packit Service |
e080da |
} else if ((offset >= -128) && (offset <= 127)) {
|
|
Packit Service |
e080da |
intel->modrm.mod = 1;
|
|
Packit Service |
e080da |
intel->offset.bytes = 1;
|
|
Packit Service |
e080da |
} else {
|
|
Packit Service |
e080da |
intel->modrm.mod = 2;
|
|
Packit Service |
e080da |
intel->offset.bytes = 4;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
intel->modrm.rm = base;
|
|
Packit Service |
e080da |
if ((index != REG_NULL) || (base == REG_SP)) {
|
|
Packit Service |
e080da |
intel->modrm.rm = 4;
|
|
Packit Service |
e080da |
intel->sib.present = _gf_true;
|
|
Packit Service |
e080da |
intel->sib.index = index;
|
|
Packit Service |
e080da |
if (index == REG_NULL) {
|
|
Packit Service |
e080da |
intel->sib.index = 4;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
intel->sib.scale = scale;
|
|
Packit Service |
e080da |
intel->sib.base = base;
|
|
Packit Service |
e080da |
if (base == REG_NULL) {
|
|
Packit Service |
e080da |
intel->sib.base = 5;
|
|
Packit Service |
e080da |
intel->modrm.mod = 0;
|
|
Packit Service |
e080da |
intel->offset.bytes = 4;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
} else if (base == REG_NULL) {
|
|
Packit Service |
e080da |
intel->modrm.mod = 0;
|
|
Packit Service |
e080da |
intel->modrm.rm = 5;
|
|
Packit Service |
e080da |
intel->offset.bytes = 4;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_op_1(ec_code_intel_t *intel, uint8_t opcode, uint32_t reg)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
intel->reg = reg;
|
|
Packit Service |
e080da |
intel->opcode.bytes = 1;
|
|
Packit Service |
e080da |
intel->opcode.data[0] = opcode;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_op_2(ec_code_intel_t *intel, uint8_t opcode1, uint8_t opcode2,
|
|
Packit Service |
e080da |
uint32_t reg)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
intel->reg = reg;
|
|
Packit Service |
e080da |
intel->opcode.bytes = 2;
|
|
Packit Service |
e080da |
intel->opcode.data[0] = opcode1;
|
|
Packit Service |
e080da |
intel->opcode.data[1] = opcode2;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_immediate_1(ec_code_intel_t *intel, uint32_t value)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
intel->immediate.bytes = 1;
|
|
Packit Service |
e080da |
intel->immediate.value = value;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_immediate_2(ec_code_intel_t *intel, uint32_t value)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
intel->immediate.bytes = 2;
|
|
Packit Service |
e080da |
intel->immediate.value = value;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_immediate_4(ec_code_intel_t *intel, uint32_t value)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
intel->immediate.bytes = 4;
|
|
Packit Service |
e080da |
intel->immediate.value = value;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
static void
|
|
Packit Service |
e080da |
ec_code_intel_emit(ec_code_builder_t *builder, ec_code_intel_t *intel)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
uint8_t insn[15];
|
|
Packit Service |
e080da |
uint32_t i, count;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
if (intel->invalid) {
|
|
Packit Service |
e080da |
ec_code_error(builder, EINVAL);
|
|
Packit Service |
e080da |
return;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
count = 0;
|
|
Packit Service |
e080da |
for (i = 0; i < intel->prefix.bytes; i++) {
|
|
Packit Service |
e080da |
insn[count++] = intel->prefix.data[i];
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
for (i = 0; i < intel->vex.bytes; i++) {
|
|
Packit Service |
e080da |
insn[count++] = intel->vex.data[i];
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
if (intel->rex.present) {
|
|
Packit Service |
e080da |
insn[count++] = 0x40 | (intel->rex.w << 3) | (intel->rex.r << 2) |
|
|
Packit Service |
e080da |
(intel->rex.x << 1) | (intel->rex.b << 0);
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
for (i = 0; i < intel->opcode.bytes; i++) {
|
|
Packit Service |
e080da |
insn[count++] = intel->opcode.data[i];
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
if (intel->modrm.present) {
|
|
Packit Service |
e080da |
insn[count++] = (intel->modrm.mod << 6) | (intel->modrm.reg << 3) |
|
|
Packit Service |
e080da |
(intel->modrm.rm << 0);
|
|
Packit Service |
e080da |
if (intel->sib.present) {
|
|
Packit Service |
e080da |
insn[count++] = (intel->sib.scale << 6) | (intel->sib.index << 3) |
|
|
Packit Service |
e080da |
(intel->sib.base << 0);
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
for (i = 0; i < intel->offset.bytes; i++) {
|
|
Packit Service |
e080da |
insn[count++] = intel->offset.data[i];
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
for (i = 0; i < intel->immediate.bytes; i++) {
|
|
Packit Service |
e080da |
insn[count++] = intel->immediate.data[i];
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_emit(builder, insn, count);
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_push_r(ec_code_builder_t *builder, ec_code_intel_reg_t reg)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x50 | (reg & 7), reg);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_false);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_pop_r(ec_code_builder_t *builder, ec_code_intel_reg_t reg)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x58 | (reg & 7), reg);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_false);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_ret(ec_code_builder_t *builder, uint32_t size)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
if (size == 0) {
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0xC3, 0);
|
|
Packit Service |
e080da |
} else {
|
|
Packit Service |
e080da |
ec_code_intel_immediate_2(&intel, size);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0xC2, 0);
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_false);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_mov_r2r(ec_code_builder_t *builder, ec_code_intel_reg_t src,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(&intel, dst, src);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x89, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_true);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_mov_r2m(ec_code_builder_t *builder, ec_code_intel_reg_t src,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t base, ec_code_intel_reg_t index,
|
|
Packit Service |
e080da |
uint32_t scale, int32_t offset)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(&intel, src, base, index, scale, offset);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x89, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_true);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_mov_m2r(ec_code_builder_t *builder, ec_code_intel_reg_t base,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t index, uint32_t scale,
|
|
Packit Service |
e080da |
int32_t offset, ec_code_intel_reg_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(&intel, dst, base, index, scale, offset);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x8B, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_true);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_xor_r2r(ec_code_builder_t *builder, ec_code_intel_reg_t src,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(&intel, dst, src);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x31, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_true);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_xor_m2r(ec_code_builder_t *builder, ec_code_intel_reg_t base,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t index, uint32_t scale,
|
|
Packit Service |
e080da |
int32_t offset, ec_code_intel_reg_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(&intel, dst, base, index, scale, offset);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x33, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_true);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_add_i2r(ec_code_builder_t *builder, int32_t value,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t reg)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
if ((value >= -128) && (value < 128)) {
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(&intel, reg, 0);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x83, 0);
|
|
Packit Service |
e080da |
ec_code_intel_immediate_1(&intel, value);
|
|
Packit Service |
e080da |
} else {
|
|
Packit Service |
e080da |
if (reg == REG_AX) {
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x05, reg);
|
|
Packit Service |
e080da |
} else {
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(&intel, reg, 0);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x81, 0);
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
ec_code_intel_immediate_4(&intel, value);
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_true);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_test_i2r(ec_code_builder_t *builder, uint32_t value,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t reg)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
if (reg == REG_AX) {
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0xA9, reg);
|
|
Packit Service |
e080da |
} else {
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(&intel, reg, 0);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0xF7, 0);
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
ec_code_intel_immediate_4(&intel, value);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_true);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_jne(ec_code_builder_t *builder, uint32_t address)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
int32_t rel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
rel = address - builder->address - 2;
|
|
Packit Service |
e080da |
if ((rel >= -128) && (rel < 128)) {
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x75, 0);
|
|
Packit Service |
e080da |
ec_code_intel_immediate_1(&intel, rel);
|
|
Packit Service |
e080da |
} else {
|
|
Packit Service |
e080da |
rel -= 4;
|
|
Packit Service |
e080da |
ec_code_intel_op_2(&intel, 0x0F, 0x85, 0);
|
|
Packit Service |
e080da |
ec_code_intel_immediate_4(&intel, rel);
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_false);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_mov_sse2sse(ec_code_builder_t *builder, uint32_t src,
|
|
Packit Service |
e080da |
uint32_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_prefix(&intel, 0x66);
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(&intel, src, dst);
|
|
Packit Service |
e080da |
ec_code_intel_op_2(&intel, 0x0F, 0x6F, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_false);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_mov_sse2m(ec_code_builder_t *builder, uint32_t src,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t base, ec_code_intel_reg_t index,
|
|
Packit Service |
e080da |
uint32_t scale, int32_t offset)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_prefix(&intel, 0x66);
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(&intel, src, base, index, scale, offset);
|
|
Packit Service |
e080da |
ec_code_intel_op_2(&intel, 0x0F, 0x7F, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_false);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_mov_m2sse(ec_code_builder_t *builder, ec_code_intel_reg_t base,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t index, uint32_t scale,
|
|
Packit Service |
e080da |
int32_t offset, uint32_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_prefix(&intel, 0x66);
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(&intel, dst, base, index, scale, offset);
|
|
Packit Service |
e080da |
ec_code_intel_op_2(&intel, 0x0F, 0x6F, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_false);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_xor_sse2sse(ec_code_builder_t *builder, uint32_t src,
|
|
Packit Service |
e080da |
uint32_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_prefix(&intel, 0x66);
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(&intel, src, dst);
|
|
Packit Service |
e080da |
ec_code_intel_op_2(&intel, 0x0F, 0xEF, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_false);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_xor_m2sse(ec_code_builder_t *builder, ec_code_intel_reg_t base,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t index, uint32_t scale,
|
|
Packit Service |
e080da |
int32_t offset, uint32_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_prefix(&intel, 0x66);
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(&intel, dst, base, index, scale, offset);
|
|
Packit Service |
e080da |
ec_code_intel_op_2(&intel, 0x0F, 0xEF, 0);
|
|
Packit Service |
e080da |
ec_code_intel_rex(&intel, _gf_false);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_mov_avx2avx(ec_code_builder_t *builder, uint32_t src,
|
|
Packit Service |
e080da |
uint32_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(&intel, src, dst);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x6F, 0);
|
|
Packit Service |
e080da |
ec_code_intel_vex(&intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,
|
|
Packit Service |
e080da |
VEX_REG_NONE);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_mov_avx2m(ec_code_builder_t *builder, uint32_t src,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t base, ec_code_intel_reg_t index,
|
|
Packit Service |
e080da |
uint32_t scale, int32_t offset)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(&intel, src, base, index, scale, offset);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x7F, 0);
|
|
Packit Service |
e080da |
ec_code_intel_vex(&intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,
|
|
Packit Service |
e080da |
VEX_REG_NONE);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_mov_m2avx(ec_code_builder_t *builder, ec_code_intel_reg_t base,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t index, uint32_t scale,
|
|
Packit Service |
e080da |
int32_t offset, uint32_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(&intel, dst, base, index, scale, offset);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0x6F, 0);
|
|
Packit Service |
e080da |
ec_code_intel_vex(&intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,
|
|
Packit Service |
e080da |
VEX_REG_NONE);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_xor_avx2avx(ec_code_builder_t *builder, uint32_t src,
|
|
Packit Service |
e080da |
uint32_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_reg(&intel, src, dst);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0xEF, 0);
|
|
Packit Service |
e080da |
ec_code_intel_vex(&intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,
|
|
Packit Service |
e080da |
dst);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
void
|
|
Packit Service |
e080da |
ec_code_intel_op_xor_m2avx(ec_code_builder_t *builder, ec_code_intel_reg_t base,
|
|
Packit Service |
e080da |
ec_code_intel_reg_t index, uint32_t scale,
|
|
Packit Service |
e080da |
int32_t offset, uint32_t dst)
|
|
Packit Service |
e080da |
{
|
|
Packit Service |
e080da |
ec_code_intel_t intel;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_init(&intel;;
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_modrm_mem(&intel, dst, base, index, scale, offset);
|
|
Packit Service |
e080da |
ec_code_intel_op_1(&intel, 0xEF, 0);
|
|
Packit Service |
e080da |
ec_code_intel_vex(&intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,
|
|
Packit Service |
e080da |
dst);
|
|
Packit Service |
e080da |
|
|
Packit Service |
e080da |
ec_code_intel_emit(builder, &intel;;
|
|
Packit Service |
e080da |
}
|