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;
];