/* Copyright (c) 2015 DataLab, s.l. This file is part of GlusterFS. This file is licensed to you under your choice of the GNU Lesser General Public License, version 3 or any later version (LGPLv3 or later), or the GNU General Public License, version 2 (GPLv2), in all cases as published by the Free Software Foundation. */ #ifndef __EC_CODE_INTEL_H__ #define __EC_CODE_INTEL_H__ #include "ec-code.h" #define VEX_REG_NONE 0 enum _ec_code_intel_reg; typedef enum _ec_code_intel_reg ec_code_intel_reg_t; enum _ec_code_vex_prefix; typedef enum _ec_code_vex_prefix ec_code_vex_prefix_t; enum _ec_code_vex_opcode; typedef enum _ec_code_vex_opcode ec_code_vex_opcode_t; struct _ec_code_intel_buffer; typedef struct _ec_code_intel_buffer ec_code_intel_buffer_t; struct _ec_code_intel_sib; typedef struct _ec_code_intel_sib ec_code_intel_sib_t; struct _ec_code_intel_modrm; typedef struct _ec_code_intel_modrm ec_code_intel_modrm_t; struct _ec_code_intel_rex; typedef struct _ec_code_intel_rex ec_code_intel_rex_t; struct _ec_code_intel; typedef struct _ec_code_intel ec_code_intel_t; enum _ec_code_intel_reg { REG_NULL = -1, REG_AX, REG_CX, REG_DX, REG_BX, REG_SP, REG_BP, REG_SI, REG_DI, REG_8, REG_9, REG_10, REG_11, REG_12, REG_13, REG_14, REG_15 }; enum _ec_code_vex_prefix { VEX_PREFIX_NONE = 0, VEX_PREFIX_66, VEX_PREFIX_F3, VEX_PREFIX_F2 }; enum _ec_code_vex_opcode { VEX_OPCODE_NONE = 0, VEX_OPCODE_0F, VEX_OPCODE_0F_38, VEX_OPCODE_0F_3A }; struct _ec_code_intel_buffer { uint32_t bytes; union { uint8_t data[4]; uint32_t value; }; }; struct _ec_code_intel_sib { gf_boolean_t present; uint32_t base; uint32_t index; uint32_t scale; }; struct _ec_code_intel_modrm { gf_boolean_t present; uint32_t mod; uint32_t rm; uint32_t reg; }; struct _ec_code_intel_rex { gf_boolean_t present; uint32_t w; uint32_t r; uint32_t x; uint32_t b; }; struct _ec_code_intel { gf_boolean_t invalid; ec_code_intel_buffer_t prefix; ec_code_intel_buffer_t opcode; ec_code_intel_buffer_t offset; ec_code_intel_buffer_t immediate; ec_code_intel_buffer_t vex; ec_code_intel_rex_t rex; ec_code_intel_modrm_t modrm; ec_code_intel_sib_t sib; uint32_t reg; }; void ec_code_intel_op_push_r(ec_code_builder_t *builder, ec_code_intel_reg_t reg); void ec_code_intel_op_pop_r(ec_code_builder_t *builder, ec_code_intel_reg_t reg); void ec_code_intel_op_ret(ec_code_builder_t *builder, uint32_t size); void ec_code_intel_op_mov_r2r(ec_code_builder_t *builder, ec_code_intel_reg_t src, ec_code_intel_reg_t dst); void ec_code_intel_op_mov_r2m(ec_code_builder_t *builder, ec_code_intel_reg_t src, ec_code_intel_reg_t base, ec_code_intel_reg_t index, uint32_t scale, int32_t offset); void ec_code_intel_op_mov_m2r(ec_code_builder_t *builder, ec_code_intel_reg_t base, ec_code_intel_reg_t index, uint32_t scale, int32_t offset, ec_code_intel_reg_t dst); void ec_code_intel_op_xor_r2r(ec_code_builder_t *builder, ec_code_intel_reg_t src, ec_code_intel_reg_t dst); void ec_code_intel_op_xor_m2r(ec_code_builder_t *builder, ec_code_intel_reg_t base, ec_code_intel_reg_t index, uint32_t scale, int32_t offset, ec_code_intel_reg_t dst); void ec_code_intel_op_add_i2r(ec_code_builder_t *builder, int32_t value, ec_code_intel_reg_t reg); void ec_code_intel_op_test_i2r(ec_code_builder_t *builder, uint32_t value, ec_code_intel_reg_t reg); void ec_code_intel_op_jne(ec_code_builder_t *builder, uint32_t address); void ec_code_intel_op_mov_sse2sse(ec_code_builder_t *builder, uint32_t src, uint32_t dst); void ec_code_intel_op_mov_sse2m(ec_code_builder_t *builder, uint32_t src, ec_code_intel_reg_t base, ec_code_intel_reg_t index, uint32_t scale, int32_t offset); void ec_code_intel_op_mov_m2sse(ec_code_builder_t *builder, ec_code_intel_reg_t base, ec_code_intel_reg_t index, uint32_t scale, int32_t offset, uint32_t dst); void ec_code_intel_op_xor_sse2sse(ec_code_builder_t *builder, uint32_t src, uint32_t dst); void ec_code_intel_op_xor_m2sse(ec_code_builder_t *builder, ec_code_intel_reg_t base, ec_code_intel_reg_t index, uint32_t scale, int32_t offset, uint32_t dst); void ec_code_intel_op_mov_avx2avx(ec_code_builder_t *builder, uint32_t src, uint32_t dst); void ec_code_intel_op_mov_avx2m(ec_code_builder_t *builder, uint32_t src, ec_code_intel_reg_t base, ec_code_intel_reg_t index, uint32_t scale, int32_t offset); void ec_code_intel_op_mov_m2avx(ec_code_builder_t *builder, ec_code_intel_reg_t base, ec_code_intel_reg_t index, uint32_t scale, int32_t offset, uint32_t dst); void ec_code_intel_op_xor_avx2avx(ec_code_builder_t *builder, uint32_t src, uint32_t dst); void ec_code_intel_op_xor_m2avx(ec_code_builder_t *builder, ec_code_intel_reg_t base, ec_code_intel_reg_t index, uint32_t scale, int32_t offset, uint32_t dst); #endif /* __EC_CODE_INTEL_H__ */