211 lines
5.6 KiB
C
211 lines
5.6 KiB
C
/* Instruction Set definition for Y86-64 Architecture */
|
|
/* Revisions:
|
|
2013-10-25:
|
|
Extended all data widths and addresses to 64 bits
|
|
Changed all 'l' instructions to 'q'
|
|
Changed registers name from e-form to r-form
|
|
Added registers %r8 to %r14
|
|
2009-03-11:
|
|
Changed RNONE to be 0xF
|
|
Changed J_XX and jump_t to C_XX and cond_t; take_branch to cond_holds
|
|
Expanded RRMOVL to include conditional moves
|
|
*/
|
|
|
|
/**************** Registers *************************/
|
|
|
|
/* REG_NONE is a special one to indicate no register */
|
|
typedef enum { REG_RAX, REG_RCX, REG_RDX, REG_RBX,
|
|
REG_RSP, REG_RBP, REG_RSI, REG_RDI,
|
|
REG_R8, REG_R9, REG_R10, REG_R11,
|
|
REG_R12, REG_R13, REG_R14, REG_NONE=0xF, REG_ERR } reg_id_t;
|
|
|
|
/* Find register ID given its name */
|
|
reg_id_t find_register(char *name);
|
|
/* Return name of register given its ID */
|
|
char *reg_name(reg_id_t id);
|
|
|
|
/**************** Instruction Encoding **************/
|
|
|
|
/* Different argument types */
|
|
typedef enum { R_ARG, M_ARG, I_ARG, NO_ARG } arg_t;
|
|
|
|
/* Different instruction types */
|
|
typedef enum { I_HALT, I_NOP, I_RRMOVQ, I_IRMOVQ, I_RMMOVQ, I_MRMOVQ,
|
|
I_ALU, I_JMP, I_CALL, I_RET, I_PUSHQ, I_POPQ,
|
|
I_IADDQ, I_POP2 } itype_t;
|
|
|
|
/* Different ALU operations */
|
|
typedef enum { A_ADD, A_SUB, A_AND, A_XOR, A_NONE } alu_t;
|
|
|
|
/* Default function code */
|
|
typedef enum { F_NONE } fun_t;
|
|
|
|
/* Return name of operation given its ID */
|
|
char op_name(alu_t op);
|
|
|
|
/* Different Jump conditions */
|
|
typedef enum { C_YES, C_LE, C_L, C_E, C_NE, C_GE, C_G } cond_t;
|
|
|
|
/* Pack itype and function into single byte */
|
|
#define HPACK(hi,lo) ((((hi)&0xF)<<4)|((lo)&0xF))
|
|
|
|
/* Unpack byte */
|
|
#define HI4(byte) (((byte)>>4)&0xF)
|
|
#define LO4(byte) ((byte)&0xF)
|
|
|
|
/* Get the opcode out of one byte instruction field */
|
|
#define GET_ICODE(instr) HI4(instr)
|
|
|
|
/* Get the ALU/JMP function out of one byte instruction field */
|
|
#define GET_FUN(instr) LO4(instr)
|
|
|
|
/* Return name of instruction given it's byte encoding */
|
|
char *iname(int instr);
|
|
|
|
/**************** Truth Values **************/
|
|
typedef enum { FALSE, TRUE } bool_t;
|
|
|
|
/* Table used to encode information about instructions */
|
|
typedef struct {
|
|
char *name;
|
|
unsigned char code; /* Byte code for instruction+op */
|
|
int bytes;
|
|
arg_t arg1;
|
|
int arg1pos;
|
|
int arg1hi; /* 0/1 for register argument, # bytes for allocation */
|
|
arg_t arg2;
|
|
int arg2pos;
|
|
int arg2hi; /* 0/1 */
|
|
} instr_t, *instr_ptr;
|
|
|
|
instr_ptr find_instr(char *name);
|
|
|
|
/* Return invalid instruction for error handling purposes */
|
|
instr_ptr bad_instr();
|
|
|
|
/*********** Implementation of Memory *****************/
|
|
typedef unsigned char byte_t;
|
|
typedef long long int word_t;
|
|
typedef long long unsigned uword_t;
|
|
|
|
/* Represent a memory as an array of bytes */
|
|
typedef struct {
|
|
int len;
|
|
word_t maxaddr;
|
|
byte_t *contents;
|
|
} mem_rec, *mem_t;
|
|
|
|
/* Create a memory with len bytes */
|
|
mem_t init_mem(int len);
|
|
void free_mem(mem_t m);
|
|
|
|
/* Set contents of memory to 0 */
|
|
void clear_mem(mem_t m);
|
|
|
|
/* Make a copy of a memory */
|
|
mem_t copy_mem(mem_t oldm);
|
|
/* Print the differences between two memories */
|
|
bool_t diff_mem(mem_t oldm, mem_t newm, FILE *outfile);
|
|
|
|
/* How big should the memory be? */
|
|
#ifdef BIG_MEM
|
|
#define MEM_SIZE (1<<16)
|
|
#else
|
|
#define MEM_SIZE (1<<13)
|
|
#endif
|
|
|
|
/*** In the following functions, a return value of 1 means success ***/
|
|
|
|
/* Load memory from .yo file. Return number of bytes read */
|
|
int load_mem(mem_t m, FILE *infile, int report_error);
|
|
|
|
/* Get byte from memory */
|
|
bool_t get_byte_val(mem_t m, word_t pos, byte_t *dest);
|
|
|
|
/* Get 8 bytes from memory */
|
|
bool_t get_word_val(mem_t m, word_t pos, word_t *dest);
|
|
|
|
/* Set byte in memory */
|
|
bool_t set_byte_val(mem_t m, word_t pos, byte_t val);
|
|
|
|
/* Set 8 bytes in memory */
|
|
bool_t set_word_val(mem_t m, word_t pos, word_t val);
|
|
|
|
/* Print contents of memory */
|
|
void dump_memory(FILE *outfile, mem_t m, word_t pos, int cnt);
|
|
|
|
/********** Implementation of Register File *************/
|
|
|
|
mem_t init_reg();
|
|
void free_reg(mem_t t);
|
|
|
|
/* Make a copy of a register file */
|
|
mem_t copy_reg(mem_t oldr);
|
|
/* Print the differences between two register files */
|
|
bool_t diff_reg(mem_t oldr, mem_t newr, FILE *outfile);
|
|
|
|
|
|
word_t get_reg_val(mem_t r, reg_id_t id);
|
|
void set_reg_val(mem_t r, reg_id_t id, word_t val);
|
|
void dump_reg(FILE *outfile, mem_t r);
|
|
|
|
|
|
|
|
/* **************** ALU Function **********************/
|
|
|
|
/* Compute ALU operation */
|
|
word_t compute_alu(alu_t op, word_t arg1, word_t arg2);
|
|
|
|
typedef unsigned char cc_t;
|
|
|
|
#define GET_ZF(cc) (((cc) >> 2)&0x1)
|
|
#define GET_SF(cc) (((cc) >> 1)&0x1)
|
|
#define GET_OF(cc) (((cc) >> 0)&0x1)
|
|
|
|
#define PACK_CC(z,s,o) (((z)<<2)|((s)<<1)|((o)<<0))
|
|
|
|
#define DEFAULT_CC PACK_CC(1,0,0)
|
|
|
|
/* Compute condition code. */
|
|
cc_t compute_cc(alu_t op, word_t arg1, word_t arg2);
|
|
|
|
/* Generated printed form of condition code */
|
|
char *cc_name(cc_t c);
|
|
|
|
/* **************** Status types *******************/
|
|
|
|
typedef enum
|
|
{STAT_BUB, STAT_AOK, STAT_HLT, STAT_ADR, STAT_INS, STAT_PIP } stat_t;
|
|
|
|
/* Describe Status */
|
|
char *stat_name(stat_t e);
|
|
|
|
/* **************** ISA level implementation *********/
|
|
|
|
typedef struct {
|
|
word_t pc;
|
|
mem_t r;
|
|
mem_t m;
|
|
cc_t cc;
|
|
} state_rec, *state_ptr;
|
|
|
|
state_ptr new_state(int memlen);
|
|
void free_state(state_ptr s);
|
|
|
|
state_ptr copy_state(state_ptr s);
|
|
bool_t diff_state(state_ptr olds, state_ptr news, FILE *outfile);
|
|
|
|
/* Determine if condition satisified */
|
|
bool_t cond_holds(cc_t cc, cond_t bcond);
|
|
|
|
/* Execute single instruction. Return status. */
|
|
stat_t step_state(state_ptr s, FILE *error_file);
|
|
|
|
/************************ Interface Functions *************/
|
|
|
|
#ifdef HAS_GUI
|
|
void report_line(word_t line_no, word_t addr, char *hexcode, char *line);
|
|
void signal_register_update(reg_id_t r, word_t val);
|
|
|
|
#endif
|