Blame xlators/cluster/ec/src/ec-code-intel.c

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
}