Verified Commit bd56a93d authored by Recolic Keghart's avatar Recolic Keghart
Browse files

move dhelper/ehelpers to namespace

parent ddaf12ba
......@@ -75,47 +75,48 @@ extern DecodeInfo decoding;
#define id_src2 (&decoding.src2)
#define id_dest (&decoding.dest)
#define make_DHelper_funcname(name) concat(decode_, name)
#define make_DHelper(name) void make_DHelper_funcname(name) (vaddr_t *eip)
#define make_DHelper(name) void name (vaddr_t *eip)
typedef void (*DHelper) (vaddr_t *);
make_DHelper(I2E);
make_DHelper(I2a);
make_DHelper(I2r);
make_DHelper(SI2E);
make_DHelper(SI_E2G);
make_DHelper(I_E2G);
make_DHelper(I_G2E);
make_DHelper(I);
make_DHelper(r);
make_DHelper(E);
make_DHelper(setcc_E);
make_DHelper(gp7_E);
make_DHelper(test_I);
make_DHelper(SI);
make_DHelper(G2E);
make_DHelper(E2G);
make_DHelper(mov_I2r);
make_DHelper(mov_I2E);
make_DHelper(mov_G2E);
make_DHelper(mov_E2G);
make_DHelper(lea_M2G);
make_DHelper(gp2_1_E);
make_DHelper(gp2_cl2E);
make_DHelper(gp2_Ib2E);
make_DHelper(O2a);
make_DHelper(a2O);
make_DHelper(J);
make_DHelper(push_SI);
make_DHelper(in_I2a);
make_DHelper(in_dx2a);
make_DHelper(out_a2I);
make_DHelper(out_a2dx);
namespace DHelperImpl {
make_DHelper(I2E);
make_DHelper(I2a);
make_DHelper(I2r);
make_DHelper(SI2E);
make_DHelper(SI_E2G);
make_DHelper(I_E2G);
make_DHelper(I_G2E);
make_DHelper(I);
make_DHelper(r);
make_DHelper(E);
make_DHelper(setcc_E);
make_DHelper(gp7_E);
make_DHelper(test_I);
make_DHelper(SI);
make_DHelper(G2E);
make_DHelper(E2G);
make_DHelper(mov_I2r);
make_DHelper(mov_I2E);
make_DHelper(mov_G2E);
make_DHelper(mov_E2G);
make_DHelper(lea_M2G);
make_DHelper(gp2_1_E);
make_DHelper(gp2_cl2E);
make_DHelper(gp2_Ib2E);
make_DHelper(O2a);
make_DHelper(a2O);
make_DHelper(J);
make_DHelper(push_SI);
make_DHelper(in_I2a);
make_DHelper(in_dx2a);
make_DHelper(out_a2I);
make_DHelper(out_a2dx);
}
#endif
......@@ -3,8 +3,7 @@
#include "nemu.h"
#define make_EHelper_funcname(name) concat(exec_, name)
#define make_EHelper(name) void make_EHelper_funcname(name) (vaddr_t *eip)
#define make_EHelper(name) void name (vaddr_t *eip)
typedef void (*EHelper) (vaddr_t *);
#include "cpu/decode.h"
......
#include "cpu/exec.h"
namespace EHelperImpl {
make_EHelper(_2byte_esc);
make_EHelper(mov);
make_EHelper(push);
make_EHelper(pop);
......@@ -54,3 +58,5 @@ make_EHelper(operand_size);
make_EHelper(inv);
make_EHelper(nemu_trap);
}
\ No newline at end of file
......@@ -2,6 +2,7 @@
#include <util/util.h>
namespace EHelperImpl {
make_EHelper(add) {
rtl_sext(&t1, &id_dest->val, id_dest->width);
rtl_sext(&t2, &id_src->val, id_src->width);
......@@ -261,3 +262,5 @@ make_EHelper(idiv) {
print_asm_template1(idiv);
}
} // end namespace
\ No newline at end of file
......@@ -7,9 +7,9 @@ typedef struct {
int width; // ByteWidth. If width is 0, using its default value: OperandSize (2Byte or 4Byte)
} opcode_entry;
#define IDEXW(id, ex, w) {make_DHelper_funcname(id), make_EHelper_funcname(ex), w}
#define IDEXW(id, ex, w) {DHelperImpl::id, EHelperImpl::ex, w}
#define IDEX(id, ex) IDEXW(id, ex, 0)
#define EXW(ex, w) {NULL, make_EHelper_funcname(ex), w}
#define EXW(ex, w) {NULL, EHelperImpl::ex, w}
#define EX(ex) EXW(ex, 0)
#define EMPTY EX(inv)
......@@ -28,16 +28,15 @@ static inline void idex(vaddr_t *eip, opcode_entry *e) {
e->execute(eip);
}
static make_EHelper(2byte_esc);
#define make_group(name, item0, item1, item2, item3, item4, item5, item6, item7) \
static opcode_entry concat(opcode_table_, name) [8] = { \
/* 0x00 */ item0, item1, item2, item3, \
/* 0x04 */ item4, item5, item6, item7 \
}; \
static make_EHelper(name) { \
namespace EHelperImpl {static name { \
idex(eip, &concat(opcode_table_, name)[decoding.ext_opcode]); \
}
}}
/* 0x80, 0x81, 0x83 */
make_group(gp1,
......@@ -73,7 +72,7 @@ opcode_entry opcode_table [512] = {
/* 0x00 */ IDEXW(G2E,add,1),IDEX(G2E,add), IDEXW(E2G,add,1), IDEX(E2G,add),
/* 0x04 */ IDEXW(I2a,add,1), IDEX(I2a,add), EMPTY, EMPTY,
/* 0x08 */ IDEXW(G2E,or,1), IDEX(G2E,or), IDEXW(E2G,or,1), IDEX(E2G,or),
/* 0x0c */ IDEXW(I2a,or,1), IDEX(I2a,or), EMPTY, EX(2byte_esc),
/* 0x0c */ IDEXW(I2a,or,1), IDEX(I2a,or), EMPTY, EX(_2byte_esc),
/* 0x10 */ IDEXW(G2E,adc,1), IDEX(G2E,adc), IDEXW(E2G,adc,1), IDEX(E2G,adc),
/* 0x14 */ IDEXW(I2a,adc,1), IDEX(I2a,adc), EMPTY, EMPTY,
/* 0x18 */ IDEXW(G2E,sbb,1), IDEX(G2E,sbb), IDEXW(E2G,sbb,1), IDEX(E2G,sbb),
......@@ -203,186 +202,20 @@ opcode_entry opcode_table [512] = {
/* 0xfc */ EMPTY, EMPTY, EMPTY, EMPTY
};
///*
///* 0x80, 0x81, 0x83 */
//make_group(gp1,
// EMPTY, EMPTY, EMPTY, EMPTY,
// EMPTY, EMPTY, EMPTY, EMPTY)
//
// /* 0xc0, 0xc1, 0xd0, 0xd1, 0xd2, 0xd3 */
//make_group(gp2,
// EMPTY, EMPTY, EMPTY, EMPTY,
// EMPTY, EMPTY, EMPTY, EMPTY)
//
// /* 0xf6, 0xf7 */
//make_group(gp3,
// EMPTY, EMPTY, EMPTY, EMPTY,
// EMPTY, EMPTY, EMPTY, EMPTY)
//
// /* 0xfe */
//make_group(gp4,
// EMPTY, EMPTY, EMPTY, EMPTY,
// EMPTY, EMPTY, EMPTY, EMPTY)
//
// /* 0xff */
//make_group(gp5,
// EMPTY, EMPTY, EMPTY, EMPTY,
// EMPTY, EMPTY, EMPTY, EMPTY)
//
// /* 0x0f 0x01*/
//make_group(gp7,
// EMPTY, EMPTY, EMPTY, EMPTY,
// EMPTY, EMPTY, EMPTY, EMPTY)
//
///* TODO: Add more instructions!!! */
//
//opcode_entry opcode_table [512] = {
// /* 0x00 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x04 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x08 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x0c */ EMPTY, EMPTY, EMPTY, EX(2byte_esc),
// /* 0x10 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x14 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x18 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x1c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x20 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x24 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x28 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x2c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x30 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x34 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x38 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x3c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x40 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x44 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x48 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x4c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x50 */ IDEX(r, push), IDEX(r, push), IDEX(r, push), IDEX(r, push),
// /* 0x54 */ IDEX(r, push), IDEX(r, push), IDEX(r, push), IDEX(r, push),
// /* 0x58 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x5c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x60 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x64 */ EMPTY, EMPTY, EX(operand_size), EMPTY,
// /* 0x68 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x6c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x70 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x74 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x78 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x7c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x80 */ IDEXW(I2E, gp1, 1), IDEX(I2E, gp1), EMPTY, IDEX(SI2E, gp1),
// /* 0x84 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x88 */ IDEXW(mov_G2E, mov, 1), IDEX(mov_G2E, mov), IDEXW(mov_E2G, mov, 1), IDEX(mov_E2G, mov),
// /* 0x8c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x90 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x94 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x98 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x9c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xa0 */ IDEXW(O2a, mov, 1), IDEX(O2a, mov), IDEXW(a2O, mov, 1), IDEX(a2O, mov),
// /* 0xa4 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xa8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xac */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xb0 */ IDEXW(mov_I2r, mov, 1), IDEXW(mov_I2r, mov, 1), IDEXW(mov_I2r, mov, 1), IDEXW(mov_I2r, mov, 1),
// /* 0xb4 */ IDEXW(mov_I2r, mov, 1), IDEXW(mov_I2r, mov, 1), IDEXW(mov_I2r, mov, 1), IDEXW(mov_I2r, mov, 1),
// /* 0xb8 */ IDEX(mov_I2r, mov), IDEX(mov_I2r, mov), IDEX(mov_I2r, mov), IDEX(mov_I2r, mov),
// /* 0xbc */ IDEX(mov_I2r, mov), IDEX(mov_I2r, mov), IDEX(mov_I2r, mov), IDEX(mov_I2r, mov),
// /* 0xc0 */ IDEXW(gp2_Ib2E, gp2, 1), IDEX(gp2_Ib2E, gp2), IDEX(I, ret), EX(ret),
// /* 0xc4 */ EMPTY, EMPTY, IDEXW(mov_I2E, mov, 1), IDEX(mov_I2E, mov),
// /* 0xc8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xcc */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xd0 */ IDEXW(gp2_1_E, gp2, 1), IDEX(gp2_1_E, gp2), IDEXW(gp2_cl2E, gp2, 1), IDEX(gp2_cl2E, gp2),
// /* 0xd4 */ EMPTY, EMPTY, EX(nemu_trap), EMPTY,
// /* 0xd8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xdc */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xe0 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xe4 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xe8 */ IDEX(J, call), EMPTY, EMPTY, EMPTY,
// /* 0xec */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xf0 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xf4 */ EMPTY, EMPTY, IDEXW(E, gp3, 1), IDEX(E, gp3),
// /* 0xf8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xfc */ EMPTY, EMPTY, IDEXW(E, gp4, 1), IDEX(E, gp5),
//
// /*2 byte_opcode_table */
//
// /* 0x00 */ EMPTY, IDEX(gp7_E, gp7), EMPTY, EMPTY,
// /* 0x04 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x08 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x0c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x10 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x14 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x18 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x1c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x20 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x24 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x28 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x2c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x30 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x34 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x38 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x3c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x40 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x44 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x48 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x4c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x50 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x54 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x58 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x5c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x60 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x64 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x68 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x6c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x70 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x74 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x78 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x7c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x80 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x84 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x88 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x8c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x90 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x94 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x98 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0x9c */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xa0 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xa4 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xa8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xac */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xb0 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xb4 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xb8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xbc */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xc0 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xc4 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xc8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xcc */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xd0 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xd4 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xd8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xdc */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xe0 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xe4 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xe8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xec */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xf0 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xf4 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xf8 */ EMPTY, EMPTY, EMPTY, EMPTY,
// /* 0xfc */ EMPTY, EMPTY, EMPTY, EMPTY
//};
static make_EHelper(2byte_esc) {
static make_EHelper(_2byte_esc) {
uint32_t opcode = instr_fetch(eip, 1) | 0x100;
decoding.opcode = opcode;
set_width(opcode_table[opcode].width);
idex(eip, &opcode_table[opcode]);
}
make_EHelper(real) {
uint32_t opcode = instr_fetch(eip, 1);
decoding.opcode = opcode;
set_width(opcode_table[opcode].width);
idex(eip, &opcode_table[opcode]);
namespace EHelperImpl {
make_EHelper(real) {
uint32_t opcode = instr_fetch(eip, 1);
decoding.opcode = opcode;
set_width(opcode_table[opcode].width);
idex(eip, &opcode_table[opcode]);
}
}
static inline void update_eip(void) {
......@@ -399,7 +232,7 @@ void exec_wrapper(bool print_flag) {
#endif
decoding.seq_eip = ori_eip;
make_EHelper_funcname(real)(&decoding.seq_eip);
EHelperImpl::real(&decoding.seq_eip);
#ifdef DEBUG
int instr_len = decoding.seq_eip - ori_eip;
......
......@@ -9,6 +9,9 @@ void sign_extend_if_required(const Operand &dest, Operand &src) {
}
}
namespace EHelperImpl {
using vaddr_t = uint32_t;
make_EHelper(test) {
// `and` without write_back.
sign_extend_if_required(*id_dest, *id_src);
......@@ -93,3 +96,5 @@ make_EHelper(rol) {
print_asm_template1(rol);
}
} // end namespace ehelperimpl
\ No newline at end of file
#include "cpu/exec.h"
make_EHelper(real);
namespace EHelperImpl {
make_EHelper(real);
make_EHelper(operand_size) {
decoding.is_operand_size_16 = true;
make_EHelper_funcname(real)(eip);
decoding.is_operand_size_16 = false;
}
make_EHelper(operand_size) {
decoding.is_operand_size_16 = true;
EHelperImpl::real(eip);
decoding.is_operand_size_16 = false;
}
}
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment