From 5f638ea86cd1ee29ab9942ba32ae87c12bb1fb0f Mon Sep 17 00:00:00 2001 From: Xavi Del Campo Date: Fri, 31 Jan 2020 22:24:08 +0100 Subject: [PATCH] Fixed redundant conditions --- tools/spasm/opcode.c | 710 +++++++++++++++++++++---------------------- 1 file changed, 355 insertions(+), 355 deletions(-) diff --git a/tools/spasm/opcode.c b/tools/spasm/opcode.c index a09c119..a44e5e3 100644 --- a/tools/spasm/opcode.c +++ b/tools/spasm/opcode.c @@ -92,7 +92,7 @@ struct {"syscall" ,INS_SYSCALL}, {"xor" ,INS_XOR}, {"xori" ,INS_XORI}, - + {"b" ,INS_B}, {"la" ,INS_LA}, {"li" ,INS_LI}, @@ -111,14 +111,14 @@ struct {"dh" ,INS_DH}, {"dw" ,INS_DW}, {"align" ,INS_ALIGN}, - + {NULL}, }; #define I_TYPE(op, rs, rt, imm) \ ( (((op) & 63) << 26) | (((rs) & 31) << 21) | (((rt) & 31) << 16) | \ ((imm) & 0xFFFF) ) - + #define J_TYPE(op, target) \ ( (((op) & 63) << 26) | ((target) & 0x3FFFFFF) ) @@ -143,7 +143,7 @@ void OUTBYTE(unsigned char b) { if(curPass>0) fputc(b, asmOut); - + curPc++; } @@ -154,7 +154,7 @@ void OUTHALF(unsigned short h) fputc(h&0xff, asmOut); fputc(h>>8, asmOut); } - + curPc += 2; } @@ -167,14 +167,14 @@ void OUTWORD(unsigned int w) fputc((w>>16)&0xff, asmOut); fputc(w>>24, asmOut); } - + curPc += 4; } void OUTINS(unsigned int instruction) -{ +{ OUTWORD(instruction); - + if(set_delay_slot) { OUTWORD(0); @@ -188,23 +188,23 @@ void OUTSTRING(char *string) { int stringt; int esc=0; - + if(*string == '"') stringt = 0; else if(*string == '\'') stringt = 1; else instruction_error("OUTSTRING . Not a string!"); - + string++; - + while(*string) { if(*string == '"') { if(stringt == 0 && !esc) break; - + OUTBYTE('"'); esc = 0; } @@ -212,7 +212,7 @@ void OUTSTRING(char *string) { if(stringt == 1 && !esc) break; - + OUTBYTE('\''); esc = 0; } @@ -222,7 +222,7 @@ void OUTSTRING(char *string) OUTBYTE('\n'); else OUTBYTE('n'); - + esc = 0; } else if(*string == 't') @@ -231,7 +231,7 @@ void OUTSTRING(char *string) OUTBYTE('\t'); else OUTBYTE('t'); - + esc = 0; } else if(*string == 'r') @@ -240,7 +240,7 @@ void OUTSTRING(char *string) OUTBYTE('\r'); else OUTBYTE('r'); - + esc = 0; } else if(*string == '\\') @@ -257,10 +257,10 @@ void OUTSTRING(char *string) { if(esc) instruction_error("Invalid escape sequence \\%c in string", *string); - + OUTBYTE(*string); } - + string++; } } @@ -274,23 +274,23 @@ unsigned int OUTSIZE(void) fseek(asmOut, pos, SEEK_SET); return r; } - + unsigned short compute_branch(unsigned int imm) -{ +{ unsigned int off = imm - (curPc + 4); //off >>= 2; - + if(curPass <= 0) return 0; - + if(off >= 0x20000 && off < -0x20000) instruction_error("Branch out of range. %04x", off); - + return (off>>2) & 0xFFFF; } unsigned int compute_jump(unsigned int imm) -{ +{ if(curPass <= 0) return 0; @@ -310,7 +310,7 @@ unsigned int compute_real_offset(unsigned int imm, unsigned int base, int i, unpredictable=0; unsigned short hipart; unsigned short lopart; - + if(!find_label_ok()) { if(cannotPredict.size == cannotPredict.pos) @@ -318,10 +318,10 @@ unsigned int compute_real_offset(unsigned int imm, unsigned int base, cannotPredict.size += 128; cannotPredict.el = realloc(cannotPredict.el, cannotPredict.size * sizeof(int)); } - + cannotPredict.el[cannotPredict.pos++] = curPc; } - + for(i = 0; i < cannotPredict.pos; i++) { if(curPc == cannotPredict.el[i]) @@ -330,7 +330,7 @@ unsigned int compute_real_offset(unsigned int imm, unsigned int base, break; } } - + if(!unpredictable && ((imm <= 0xFFFF) || (imm >= 0xFFFF8000 && imm <= 0xFFFFFFFF))) return I_TYPE(0, base, rt, imm); @@ -341,49 +341,49 @@ unsigned int compute_real_offset(unsigned int imm, unsigned int base, hipart = (imm >> 16); lopart = imm & 0xFFFF; int t=(*curIns == 'l') ? rt : 1; - + // lw at, $CAFEBABE(zero) -> lui at, $CAFE, ori at, at, $BABE, lw at, 0(at) // lw at, $CAFEBABE(v0) -> lui at, $CAFE, ori at, at, $BABE, lw at, 0(v0) - // sw at, $CAFEBABE -> - + // sw at, $CAFEBABE -> + if(base) { /*OUTINS( I_TYPE(15, 0, t, hipart)); // lui $t, (offset > 16) - + if(lopart || unpredictable) OUTINS( I_TYPE (13, t, t, lopart)); // ori $t, $t, offset & 0xffff - + OUTINS( R_TYPE (0, t, base, t, 0, 33) ); // add $t, $t, base return I_TYPE(0, t, rt, 0);*/ - + // SPASM is seriously broken regarding this.. return I_TYPE(0, base, rt, imm); } - + if(lopart >= 0x8000) hipart++; - + OUTINS( I_TYPE(15, 0, t, hipart)); // lui $t, (offset > 16) - + return I_TYPE(0, t, rt, lopart); // XX rt, lopart(rt) } void INS_ADD(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + // ADD rd, rs, rt -> rd = rs + rt - + if(insArgc == 2) { if(atoiT[1] == T_INTEGER) return INS_ADDI(); - + rd = insArgv[0]; rs = insArgv[0]; rt = insArgv[1]; @@ -392,26 +392,26 @@ void INS_ADD(void) { if(atoiT[2] == T_INTEGER) return INS_ADDI(); - + rd = insArgv[0]; rs = insArgv[1]; rt = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 32) ); } void INS_ADDI(void) { unsigned int rt, rs, imm; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + // ADDI rt, rs, imm -> rt = rs + imm; - + if(insArgc == 2) { rt = insArgv[0]; @@ -424,24 +424,24 @@ void INS_ADDI(void) rs = insArgv[1]; imm = insArgv[2]; } - + if(imm > 0x7FFF && imm < 0xFFFF0000) instruction_warning("Immediate is possibly out of range."); - + OUTINS( I_TYPE (8, rs, rt, imm) ); } void INS_ADDIU(void) { unsigned int rt, rs, imm; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + // ADDIU rt, rs, imm -> rt = rs + imm; - + if(insArgc == 2) { rt = insArgv[0]; @@ -454,29 +454,29 @@ void INS_ADDIU(void) rs = insArgv[1]; imm = insArgv[2]; } - + if(imm > 0x7FFF && imm < 0xFFFF0000) instruction_warning("Immediate is possibly out of range."); - + OUTINS( I_TYPE (9, rs, rt, imm) ); } void INS_ADDU(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + // ADDU rd, rs, rt -> rd = rs + rt - + if(insArgc == 2) { if(atoiT[1] == T_INTEGER) return INS_ADDIU(); - + rd = insArgv[0]; rs = insArgv[0]; rt = insArgv[1]; @@ -485,31 +485,31 @@ void INS_ADDU(void) { if(atoiT[2] == T_INTEGER) return INS_ADDIU(); - + rd = insArgv[0]; rs = insArgv[1]; rt = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 33) ); } void INS_AND(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + // AND rd, rs, rt -> rd = rs + rt - + if(insArgc == 2) { if(atoiT[1] == T_INTEGER) return INS_ANDI(); - + rd = insArgv[0]; rs = insArgv[0]; rt = insArgv[1]; @@ -518,26 +518,26 @@ void INS_AND(void) { if(atoiT[2] == T_INTEGER) return INS_ANDI(); - + rd = insArgv[0]; rs = insArgv[1]; rt = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 36) ); } void INS_ANDI(void) { unsigned int rt, rs, imm; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + // ANDI rt, rs, imm -> rt = rs + imm; - + if(insArgc == 2) { rt = insArgv[0]; @@ -550,223 +550,223 @@ void INS_ANDI(void) rs = insArgv[1]; imm = insArgv[2]; } - + if(imm > 0xFFFF) instruction_warning("Immediate is possibly out of range"); - + OUTINS( I_TYPE (12, rs, rt, imm) ); } void INS_BEQ(void) { unsigned int rt, rs, imm; - + if(insArgc != 3) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; rt = insArgv[1]; imm = insArgv[2]; - + OUTINS( I_TYPE(4, rs, rt, compute_branch(imm)) ); } void INS_BGEZ(void) { unsigned int rs, imm; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; imm = insArgv[1]; - + OUTINS( I_TYPE(1, rs, 1, compute_branch(imm)) ); } void INS_BGEZAL(void) { unsigned int rs, imm; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; imm = insArgv[1]; - + OUTINS( I_TYPE(1, rs, 17, compute_branch(imm)) ); } void INS_BGTZ(void) { unsigned int rs, imm; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; imm = insArgv[1]; - + OUTINS( I_TYPE(7, rs, 0, compute_branch(imm)) ); } void INS_BLEZ(void) { unsigned int rs, imm; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; imm = insArgv[1]; - + OUTINS( I_TYPE(6, rs, 0, compute_branch(imm)) ); } void INS_BLTZ(void) { unsigned int rs, imm; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; imm = insArgv[1]; - + OUTINS( I_TYPE(1, rs, 0, compute_branch(imm)) ); } void INS_BLTZAL(void) { unsigned int rs, imm; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; imm = insArgv[1]; - + OUTINS( I_TYPE(1, rs, 16, compute_branch(imm)) ); } void INS_BNE(void) { unsigned int rt, rs, imm; - + if(insArgc != 3) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; rt = insArgv[1]; imm = insArgv[2]; - + OUTINS( I_TYPE(5, rs, rt, compute_branch(imm)) ); } void INS_BREAK(void) { unsigned int imm = 0; - + if(insArgc > 1) instruction_error("Too many arguments"); - + if(insArgc == 1) imm = insArgv[0]; - + imm &= 0xFFFFF; - + OUTINS( (imm << 6) | 13 ); } void INS_CFC(void) { unsigned int rt, rd; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rt = insArgv[0]; rd = insArgv[1]; - + OUTINS ( R_TYPE(16 | copn, 2, rt, rd, 0, 0) ); } void INS_COP(void) { unsigned int cofun; - + if(insArgc != 1) instruction_error("Wrong number of arguments"); - + cofun = insArgv[0]; - + OUTINS( ( (16 | copn) << 26) | (1<<25) | (cofun & 0x1FFFFFF)); } void INS_CTC(void) { unsigned int rt, rd; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rt = insArgv[0]; rd = insArgv[1]; - + OUTINS ( R_TYPE(16 | copn, 6, rt, rd, 0, 0) ); } void INS_DIV(void) { unsigned int rs, rt; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; rt = insArgv[1]; - + OUTINS ( R_TYPE(0, rs, rt, 0, 0, 26)); } void INS_DIVU(void) { unsigned int rs, rt; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; rt = insArgv[1]; - + OUTINS ( R_TYPE(0, rs, rt, 0, 0, 27)); } void INS_J(void) -{ +{ if(insArgc != 1) instruction_error("Wrong number of arguments"); - + OUTINS ( J_TYPE(2, compute_jump(insArgv[0]))); } void INS_JAL(void) -{ +{ if(insArgc != 1) instruction_error("Wrong number of arguments"); - + OUTINS ( J_TYPE(3, compute_jump(insArgv[0]))); } void INS_JALR(void) { unsigned int rd, rs; - + if(insArgc < 1) instruction_error("Not enough arguments"); if(insArgc > 2) instruction_error("Too many arguments"); - + if(insArgc == 1) { rd = 31; // register ra @@ -777,7 +777,7 @@ void INS_JALR(void) rd = insArgv[0]; rs = insArgv[1]; } - + OUTINS ( R_TYPE(0, rs, 0, rd, 0, 9)); } @@ -785,21 +785,21 @@ void INS_JR(void) { if(insArgc != 1) instruction_error("Wrong number of arguments"); - + OUTINS ( R_TYPE(0, insArgv[0], 0, 0, 0, 8)); } void INS_LB(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -812,21 +812,21 @@ void INS_LB(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(32, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); -} - +} + void INS_LBU(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -839,21 +839,21 @@ void INS_LBU(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(36, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_LH(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -866,21 +866,21 @@ void INS_LH(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(33, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_LHU(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -893,29 +893,29 @@ void INS_LHU(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(37, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_LUI(void) -{ +{ if(insArgc != 2) instruction_error("Wrong number of arguments"); - + OUTINS(I_TYPE(15, 0, insArgv[0], insArgv[1])); } void INS_LW(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -928,21 +928,21 @@ void INS_LW(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(35, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_LWC(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -955,21 +955,21 @@ void INS_LWC(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(48 | copn, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_LWL(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -982,21 +982,21 @@ void INS_LWL(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(34, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_LWR(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -1009,7 +1009,7 @@ void INS_LWR(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(38, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } @@ -1017,7 +1017,7 @@ void INS_MFC(void) { if(insArgc != 2) instruction_error("Wrong number of arguments"); - + OUTINS(R_TYPE (16 | copn, 0, insArgv[0], insArgv[1], 0, 0)); } @@ -1025,7 +1025,7 @@ void INS_MFHI(void) { if(insArgc != 1) instruction_error("Wrong number of arguments"); - + OUTINS(R_TYPE(0, 0, 0, insArgv[0], 0, 16)); } @@ -1033,7 +1033,7 @@ void INS_MFLO(void) { if(insArgc != 1) instruction_error("Wrong number of arguments"); - + OUTINS(R_TYPE(0, 0, 0, insArgv[0], 0, 18)); } @@ -1041,7 +1041,7 @@ void INS_MTC(void) { if(insArgc != 2) instruction_error("Wrong number of arguments"); - + OUTINS(R_TYPE (16 | copn, 4, insArgv[0], insArgv[1], 0, 0)); } @@ -1049,7 +1049,7 @@ void INS_MTHI(void) { if(insArgc != 1) instruction_error("Wrong number of arguments"); - + OUTINS(R_TYPE(0, insArgv[0], 0, 0, 0, 17)); } @@ -1057,40 +1057,40 @@ void INS_MTLO(void) { if(insArgc != 1) instruction_error("Wrong number of arguments"); - + OUTINS(R_TYPE(0, insArgv[0], 0, 0, 0, 19)); } void INS_MULT(void) { unsigned int rs, rt; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; rt = insArgv[1]; - + OUTINS(R_TYPE(0, rs, rt, 0, 0, 24)); } void INS_MULTU(void) { unsigned int rs, rt; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rs = insArgv[0]; rt = insArgv[1]; - + OUTINS(R_TYPE(0, rs, rt, 0, 0, 25)); } void INS_NOR(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) @@ -1108,14 +1108,14 @@ void INS_NOR(void) rs = insArgv[1]; rt = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 39) ); } void INS_OR(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) @@ -1125,7 +1125,7 @@ void INS_OR(void) { if(atoiT[1] == T_INTEGER) return INS_ORI(); - + rd = insArgv[0]; rs = insArgv[0]; rt = insArgv[1]; @@ -1134,26 +1134,26 @@ void INS_OR(void) { if(atoiT[2] == T_INTEGER) return INS_ORI(); - + rd = insArgv[0]; rs = insArgv[1]; rt = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 37) ); } void INS_ORI(void) { unsigned int rt, rs, imm; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + // ANDI rt, rs, imm -> rt = rs + imm; - + if(insArgc == 2) { rt = insArgv[0]; @@ -1166,24 +1166,24 @@ void INS_ORI(void) rs = insArgv[1]; imm = insArgv[2]; } - + if(imm > 0xFFFF) instruction_warning("Immediate is possibly out of range"); - + OUTINS( I_TYPE (13, rs, rt, imm) ); } void INS_SB(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -1196,21 +1196,21 @@ void INS_SB(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(40, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_SH(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -1223,19 +1223,19 @@ void INS_SH(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(41, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_SLL(void) { unsigned int rd, rt, sa; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rd = insArgv[0]; @@ -1248,14 +1248,14 @@ void INS_SLL(void) rt = insArgv[1]; sa = insArgv[2]; } - + OUTINS(R_TYPE(0, 0, rt, rd, sa, 0)); } void INS_SLLV(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) @@ -1273,87 +1273,87 @@ void INS_SLLV(void) rt = insArgv[1]; rs = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 4) ); } void INS_SLT(void) { unsigned int rd, rs, rt; - + if(insArgc != 3) instruction_error("Wrong number of arguments"); if(atoiT[2] == T_INTEGER) return INS_SLTI(); - + rd = insArgv[0]; rs = insArgv[1]; rt = insArgv[2]; - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 42) ); } void INS_SLTI(void) { unsigned int imm, rs, rt; - + if(insArgc != 3) instruction_error("Wrong number of arguments"); rt = insArgv[0]; rs = insArgv[1]; imm = insArgv[2]; - + if(imm > 0x7FFF && imm < 0xFFFF8000) instruction_error("Immediate out of range."); - + OUTINS( I_TYPE (10, rs, rt, imm) ); } void INS_SLTIU(void) { unsigned int imm, rs, rt; - + if(insArgc != 3) instruction_error("Wrong number of arguments"); rt = insArgv[0]; rs = insArgv[1]; imm = insArgv[2]; - + if(imm > 0x7FFF && imm < 0xFFFF8000) instruction_error("Immediate out of range."); - + OUTINS( I_TYPE (11, rs, rt, imm) ); } void INS_SLTU(void) { unsigned int rd, rs, rt; - + if(insArgc != 3) instruction_error("Wrong number of arguments"); if(atoiT[2] == T_INTEGER) return INS_SLTIU(); - + rd = insArgv[0]; rs = insArgv[1]; rt = insArgv[2]; - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 43) ); } void INS_SRA(void) { unsigned int rd, rt, sa; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rd = insArgv[0]; @@ -1366,14 +1366,14 @@ void INS_SRA(void) rt = insArgv[1]; sa = insArgv[2]; } - + OUTINS(R_TYPE(0, 0, rt, rd, sa, 3)); } void INS_SRAV(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) @@ -1391,19 +1391,19 @@ void INS_SRAV(void) rt = insArgv[1]; rs = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 7) ); } void INS_SRL(void) { unsigned int rd, rt, sa; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rd = insArgv[0]; @@ -1416,14 +1416,14 @@ void INS_SRL(void) rt = insArgv[1]; sa = insArgv[2]; } - + OUTINS(R_TYPE(0, 0, rt, rd, sa, 2)); } void INS_SRLV(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) @@ -1441,25 +1441,25 @@ void INS_SRLV(void) rt = insArgv[1]; rs = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 6) ); } void INS_SUB(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - - + + if(insArgc == 2) { if(atoiT[1] == T_INTEGER) return INS_SUBI(); - + rd = insArgv[0]; rs = insArgv[0]; rt = insArgv[1]; @@ -1468,31 +1468,31 @@ void INS_SUB(void) { if(atoiT[2] == T_INTEGER) return INS_SUBI(); - + rd = insArgv[0]; rs = insArgv[1]; rt = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 34) ); } void INS_SUBU(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + // ADD rd, rs, rt -> rd = rs + rt - + if(insArgc == 2) { if(atoiT[1] == T_INTEGER) return INS_SUBIU(); - + rd = insArgv[0]; rs = insArgv[0]; rt = insArgv[1]; @@ -1501,26 +1501,26 @@ void INS_SUBU(void) { if(atoiT[2] == T_INTEGER) return INS_SUBIU(); - + rd = insArgv[0]; rs = insArgv[1]; rt = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 35) ); } void INS_SW(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -1533,21 +1533,21 @@ void INS_SW(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(43, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_SWC(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -1560,21 +1560,21 @@ void INS_SWC(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(56 | copn, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_SWL(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -1587,21 +1587,21 @@ void INS_SWL(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(42, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_SWR(void) { unsigned int base, rt, offset; - + SET_DIS_CHECK(); - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -1614,29 +1614,29 @@ void INS_SWR(void) offset = insArgv[1]; base = insArgv[2]; } - + OUTINS(R_TYPE(46, 0, 0, 0, 0, 0) | compute_real_offset(offset, base, rt)); } void INS_SYSCALL(void) { unsigned int imm = 0; - + if(insArgc > 1) instruction_error("Too many arguments"); - + if(insArgc == 1) imm = insArgv[0]; - + imm &= 0xFFFFF; - + OUTINS( (imm << 6) | 12 ); } void INS_XOR(void) { unsigned int rd, rs, rt; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) @@ -1646,7 +1646,7 @@ void INS_XOR(void) { if(atoiT[1] == T_INTEGER) return INS_XORI(); - + rd = insArgv[0]; rs = insArgv[0]; rt = insArgv[1]; @@ -1655,19 +1655,19 @@ void INS_XOR(void) { if(atoiT[2] == T_INTEGER) return INS_XORI(); - + rd = insArgv[0]; rs = insArgv[1]; rt = insArgv[2]; } - + OUTINS( R_TYPE (0, rs, rt, rd, 0, 38) ); } void INS_XORI(void) { unsigned int rt, rs, imm; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) @@ -1685,10 +1685,10 @@ void INS_XORI(void) rs = insArgv[1]; imm = insArgv[2]; } - + if(imm > 0xFFFF) instruction_warning("Immediate is possibly out of range"); - + OUTINS( I_TYPE (14, rs, rt, imm) ); } @@ -1697,12 +1697,12 @@ void INS_XORI(void) void INS_B(void) { unsigned int imm; - + if(insArgc != 1) instruction_error("Wrong number of arguments"); - + imm = insArgv[0]; - + OUTINS( I_TYPE(4, 0, 0, compute_branch(imm)) ); // <- beq zero, zero, imm } @@ -1710,13 +1710,13 @@ void INS_B(void) { unsigned int rd, imm; unsigned short lopart, hipart; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rd = insArgv[0]; imm = insArgv[1]; - + hipart = imm >> 16; lopart = imm & 0xFFFF; @@ -1726,7 +1726,7 @@ void INS_B(void) { if(lopart >= 0x8000) hipart++; - + OUTINS( I_TYPE(15, 0, rd, hipart)); // lui $rd, (imm > 16) OUTINS( I_TYPE (9, rd, rd, lopart)); // addiu $rd, $rd, imm & 0xffff } @@ -1738,13 +1738,13 @@ void INS_LI(void) unsigned int rd, imm; unsigned short lopart, hipart; int unpredictable=0; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rd = insArgv[0]; imm = insArgv[1]; - + hipart = imm >> 16; lopart = imm & 0xFFFF; @@ -1755,10 +1755,10 @@ void INS_LI(void) cannotPredict.size += 128; cannotPredict.el = realloc(cannotPredict.el, cannotPredict.size * sizeof(int)); } - + cannotPredict.el[cannotPredict.pos++] = curPc; } - + for(i = 0; i < cannotPredict.pos; i++) { if(curPc == cannotPredict.el[i]) @@ -1767,22 +1767,22 @@ void INS_LI(void) break; } } - - if(/*atoiT[1] == T_INTEGER &&*/ !unpredictable && imm >= 0 && imm <= 0xFFFF) + + if(/*atoiT[1] == T_INTEGER &&*/ !unpredictable && imm <= 0xFFFF) OUTINS(I_TYPE(13, 0, rd, lopart)); // ori $rd, $zero, imm else if(!unpredictable && !lopart) OUTINS(I_TYPE(15, 0, rd, hipart)); else - { + { // if(lopart >= 0x8000) // hipart++; - + OUTINS( I_TYPE(15, 0, rd, hipart)); // lui $rd, (imm > 16) // OUTINS( I_TYPE(9, rd, rd, lopart)); // addiu $rd, $rd, imm & 0xffff OUTINS( I_TYPE (13, rd, rd, lopart)); // ori $rd, $rd, imm & 0xffff } - + } void INS_LA(void) @@ -1791,13 +1791,13 @@ void INS_LA(void) unsigned int rd, imm; unsigned short lopart, hipart; int unpredictable=0; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rd = insArgv[0]; imm = insArgv[1]; - + hipart = imm >> 16; lopart = imm & 0xFFFF; @@ -1808,10 +1808,10 @@ void INS_LA(void) cannotPredict.size += 128; cannotPredict.el = realloc(cannotPredict.el, cannotPredict.size * sizeof(int)); } - + cannotPredict.el[cannotPredict.pos++] = curPc; } - + for(i = 0; i < cannotPredict.pos; i++) { if(curPc == cannotPredict.el[i]) @@ -1820,22 +1820,22 @@ void INS_LA(void) break; } } - - if(/*atoiT[1] == T_INTEGER &&*/ !unpredictable && imm >= 0 && imm <= 0xFFFF) + + if(/*atoiT[1] == T_INTEGER &&*/ !unpredictable && imm <= 0xFFFF) OUTINS(I_TYPE(13, 0, rd, lopart)); // ori $rd, $zero, imm //else if(!unpredictable && !lopart) // OUTINS(I_TYPE(15, 0, rd, hipart)); else - { + { if(lopart >= 0x8000) hipart++; - + OUTINS( I_TYPE(15, 0, rd, hipart)); // lui $rd, (imm > 16) OUTINS( I_TYPE(9, rd, rd, lopart)); // addiu $rd, $rd, imm & 0xffff // OUTINS( I_TYPE (13, rd, rd, lopart)); // ori $rd, $rd, imm & 0xffff } - + } /*void INS_LA(void) @@ -1851,28 +1851,28 @@ void INS_NOP(void) void INS_MOVE(void) { unsigned int rd, rs; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rd = insArgv[0]; rs = insArgv[1]; - + OUTINS( R_TYPE (0, rs, 0, rd, 0, 33) ); // addu $rd, $rs, $zero } void INS_SUBI(void) { -// just like ADDI, but switches the sign of the immediate - +// just like ADDI, but switches the sign of the immediate + unsigned int rt, rs, imm; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - - + + if(insArgc == 2) { rt = insArgv[0]; @@ -1885,22 +1885,22 @@ void INS_SUBI(void) rs = insArgv[1]; imm = -insArgv[2]; } - + if(imm > 0x7FFF && imm < 0xFFFF0000) instruction_warning("Immediate is possibly out of range"); - + OUTINS( I_TYPE (8, rs, rt, imm) ); } void INS_SUBIU(void) { unsigned int rt, rs, imm; - + if(insArgc < 2) instruction_error("Not enough arguments"); if(insArgc > 3) instruction_error("Too many arguments"); - + if(insArgc == 2) { rt = insArgv[0]; @@ -1913,23 +1913,23 @@ void INS_SUBIU(void) rs = insArgv[1]; imm = -insArgv[2]; } - + if(imm > 0x7FFF && imm < 0xFFFF0000) instruction_warning("Immediate is possibly out of range"); - + OUTINS( I_TYPE (9, rs, rt, imm) ); } void INS_BEQZ(void) { unsigned int rt, imm; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rt = insArgv[0]; imm = insArgv[1]; - + OUTINS( I_TYPE(4, rt, 0, compute_branch(imm)) ); // <- beq zero, rt, imm // OUTINS( I_TYPE(4, rs, rt, compute_branch(imm)) ); @@ -1938,36 +1938,36 @@ void INS_BEQZ(void) void INS_BNEZ(void) { unsigned int rt, imm; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + rt = insArgv[0]; imm = insArgv[1]; - + OUTINS( I_TYPE(5,rt, 0, compute_branch(imm)) ); // <- bne zero, rt, imm } void INS_BAL(void) { unsigned int imm; - + if(insArgc != 1) instruction_error("Wrong number of arguments"); - + imm = insArgv[0]; - + OUTINS( I_TYPE(1, 0, 17, compute_branch(imm)) ); //bgezal $zero, imm } void INS_ORG(void) -{ +{ if(insArgc != 1) instruction_error("Wrong number of arguments"); //if(!first_instruction) // instruction_error("ORG is not the first instruction"); - + curPc = insArgv[0]; startAddress = insArgv[0]; org_found = 1; @@ -1978,13 +1978,13 @@ void INS_INCBIN(void) FILE *f; char *path, *cp; int sz; - - + + if(insArgc != 1) instruction_error("Wrong number of arguments"); - + path = rawArgv[0]; - + if(*path == '"') { path++; @@ -1997,18 +1997,18 @@ void INS_INCBIN(void) if((cp = strrchr(path, '\''))) *cp = '\0'; } - + //printf("DEBUG(INCBIN): including %s\n", path); - + f = spasm_fopen(path, "rb"); - + if(!f) instruction_error("Could not open \"%s\"", path); - + fseek(f, 0, SEEK_END); sz = ftell(f); fseek(f, 0, SEEK_SET); - + if(curPass <= 0) curPc += sz; else @@ -2016,27 +2016,27 @@ void INS_INCBIN(void) for(;sz;sz--) OUTBYTE(fgetc(f)); } - + fclose(f); } void INS_DCB(void) { unsigned int num, value; - + if(insArgc != 2) instruction_error("Wrong number of arguments"); - + num = insArgv[0]; value = insArgv[1]; - + if(num & (1<<31)) { - instruction_warning("Negative number of values, ignoring instruction"); - + instruction_warning("Negative number of values, ignoring instruction"); + return; } - + if(curPass <= 0) curPc += num; else @@ -2049,7 +2049,7 @@ void INS_DCB(void) void INS_DB(void) { int i; - + for(i = 0; i < insArgc; i++) { if(rawArgv[i][0] == '"' || rawArgv[i][0] == '\'') @@ -2062,7 +2062,7 @@ void INS_DB(void) void INS_DH(void) { int i; - + for(i = 0; i < insArgc; i++) { if(rawArgv[i][0] == '"' || rawArgv[i][0] == '\'') @@ -2075,7 +2075,7 @@ void INS_DH(void) void INS_DW(void) { int i; - + for(i = 0; i < insArgc; i++) { if(rawArgv[i][0] == '"' || rawArgv[i][0] == '\'') @@ -2089,19 +2089,19 @@ void INS_ALIGN(void) { unsigned int unit; unsigned int delta; - + if(insArgc != 1) instruction_error("Wrong number of arguments"); - + unit = insArgv[0]; - + if(unit <= 0) instruction_error("Alignment unit cannot be equal to zero or negative"); - + if((curPc % unit)) { delta = (unit - (curPc % unit)) % unit; - + if(curPass <= 0) curPc += delta; else @@ -2121,15 +2121,15 @@ void INS_INCLUDE(void) char *path; char *cp; char *newtext; - + if(insArgc != 1) instruction_error("Wrong number of arguments"); - + if(curPass <= 0) { - + path = rawArgv[0]; - + if(*path == '"') { path++; @@ -2142,48 +2142,48 @@ void INS_INCLUDE(void) if((cp = strrchr(path, '\''))) *cp = '\0'; } - + f = spasm_fopen(path, "rb"); - + if(!f) instruction_error("Could not open %s", path); - + //printf("DEBUG(INCLUDE): Including %s, line %d\n", path, line_number); - + fseek(f, 0, SEEK_END); sz = ftell(f); fseek(f, 0, SEEK_SET); - + tsz = strlen(curText); - + newtext = malloc(sz + tsz + 1); - + for(i = 0, l = 1; l < line_number; i++) { if(curText[i] == '\n') l++; - + newtext[i] = curText[i]; } - + fread(&newtext[i], sizeof(char), sz, f); - + o = i+sz; - + if(newtext[i+sz-1] != '\n') { instruction_warning("No newline found at end of file %s", path); newtext[o++] = '\n'; } - - + + for(; curText[i] != '\n'; i++); - + i++; newtext[o] = '\0'; - + strcat(newtext, &curText[i]); - + free(curText); curText = newtext; } @@ -2191,24 +2191,24 @@ void INS_INCLUDE(void) void INS_BLANK(void) { - + } void *get_instruction(char *name) { int i; - - + + for(i = 0; instruction_table[i].name; i++) { //printf("name = ^%s$, iname = ^%s$\n", name, instruction_table[i].name); - + if(strcasecmp(name, instruction_table[i].name) == 0) { // printf("di sranron\n"); return instruction_table[i].func; } } - + return NULL; }