












int icode=[
imem_error: INOP;
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};
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;
];
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;
];
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;
];
word aluB=[
icode in {IRMMOVQ, IMRMOVQ, IOPQ, ICALL, IPUSHQ, IRET, IPOPQ}:valB;
icode in {IRRMOVQ, IIRMOVQ}:0;
];
word alufun=[
icode == IOPQ: ifun;
1: ALUADD;
];
bool set_CC=icode in {IOPQ};

word mem_addr=[
icode in {IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ}:valE;
icode in {IPOPQ, IRET}:valA;
];
word mem_data=[
icode in {IRMMOVQ, IPUSHQ}:valA;
icode==ICALL:valP;
];
bool mem_read=icode in {IMRMOVQ, IPOPQ, IRET};
bool mem_write=icode in {IRMMOVQ, IPUSHQ, ICALL};
word Stat=[
imem_error || dmem_error: SADR;
!instr_valid: SINS;
icode == IHALT: SHLT;
1: SAOK;
];

















