












int icode=[
imem_error: INOP;#出现异常时,将icode设置成INOP,即认为这是一条nop指令
1: imem_icode;
];
int ifun=[
imem_error: FNONE;
1: imem_ifun;
];
bool need_regids=icode in {IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, IIRMOVQ, IRMMOVQ, IMRMOVQ};#当前指令是否需要寄存器
bool instr_valid=icode in{INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ};#当前指令是否是一个Y86-64的指令
bool need_valC=icode in {IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL};#当前指令是否需要一个常数

word srcA=[
icode in {IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ}:rA;
icode in {IPOPQ, IRET}:RRSP;
1:RNONE; #Don't need register
];
word srcB=[
icode in {IRRMOVQ,IMRMOVQ, IOPQ}:rB;
icode in {IPUSHQ, IRET, ICALL}:RRSP;
1:RNONE;
];
word dstE=[
icode in {IRRMOVQ} && Cnd:rB;
icode in {IIRMOVQ, IOPQ}:rB;
icode in {IPUSHQ, IPOPQ, ICALL, IRET}:RESP;
1:RNONE; #Don't write any register
];
word dstW=[
icode in {IMRMOVQ, IPOPQ}:rA;
1: RNONE;
];

word aluA=[
icoode in {IRRMOVQ, IOPQ}:valA;
icode in {IIRMOVQ, IRMMOVQ, IMRMOVQ}:valC;
icode in {ICALL, IPUSHQ}:-8;
icode in {IRET, IPOPQ}:8;
# Other instructions don't need ALU;
];
word aluB=[
icode in {IRMMOVQ, IMRMOVQ, IOPQ, ICALL, IPUSHQ, IRET, IPOPQ}:valB;
icode in {IRRMOVQ, IIRMOVQ}:0;
# Other instructions don't need ALU;
];
word alufun=[
icode == IOPQ: ifun;
1: ALUADD;
]; # ALU需要执行的操作
bool set_CC=icode in {IOPQ};# 是否需要修改CC

word mem_addr=[
icode in {IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ}:valE;
icode in {IPOPQ, IRET}:valA;
# Other instructions don't need address
];# 读写的地址
word mem_data=[
icode in {IRMMOVQ, IPUSHQ}:valA;#数据来自寄存器
icode==ICALL:valP;#数据来自PC
];# 写入的数据
#是读还是写
bool mem_read=icode in {IMRMOVQ, IPOPQ, IRET};
bool mem_write=icode in {IRMMOVQ, IPUSHQ, ICALL};
#对Stat的更新
word Stat=[
imem_error || dmem_error: SADR;
!instr_valid: SINS;
icode == IHALT: SHLT;
1: SAOK;
];


















本文详细探讨了《深入理解计算机系统》(CSAPP)第四章的内容,主要涵盖处理器的基本结构、指令执行流程、流水线技术以及现代处理器的优化策略。通过对这些核心概念的解析,帮助读者建立起对处理器体系结构的深入认识。
2810

被折叠的 条评论
为什么被折叠?



