#include <stdio.h> #include "const.h" #include "macro_int.h" typedef enum { ADD=0, ADDI, ADDIU, ADDU, CLO, CLZ, DADD, DADDI, DADDIU, DADDU, DCLO, DCLZ, DDIV, DDIVU, DIV, DIVU, DMULT, DMULTU, DSUB, DSUBU, MADD, MADDU, MSUB, MSUBU, MUL, MULT, MULTU, MOVN, MOVZ, SEB, SEH, SLT, SLTI, SLTIU, SLTU, SUB, SUBU } arithmetic_op; int main() { arithmetic_op op; int i; init_reg_val2(); for (op = ADD; op <= SUBU; op++) { for (i = 0; i < N; i++) { switch(op) { case ADD: /* If either GPR rt or GPR rs does not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST1("add $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); break; case ADDI: /* If GPR rs does not contain a sign-extended 32-bit value (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST2("addi $t0, $t1, 0xff", reg_val1[i], 0xff, t0, t1); TEST2("addi $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3); TEST2("addi $a0, $a1, 0x0", reg_val1[i], 0x0, a0, a1); TEST2("addi $s0, $s1, 0x23", reg_val1[i], 0x23, s0, s1); break; case ADDIU: /* If GPR rs does not contain a sign-extended 32-bit value (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST2("addiu $t0, $t1, 0xff", reg_val1[i], 0xff, t0, t1); TEST2("addiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3); TEST2("addiu $a0, $a1, 0x0", reg_val1[i], 0x0, a0, a1); TEST2("addiu $s0, $s1, 0x23", reg_val1[i], 0x23, s0, s1); break; case ADDU: /* If either GPR rt or GPR rs does not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST1("addu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); break; case CLO: /* If GPR rs does not contain a sign-extended 32-bit value (bits 63..31 equal), then the results of the operation are UNPREDICTABLE. */ TEST3("clo $t0, $t1", reg_val1[i], t0, t1); break; case CLZ: /* If GPR rs does not contain a sign-extended 32-bit value (bits 63..31 equal), then the results of the operation are UNPREDICTABLE. */ TEST3("clz $t0, $t1", reg_val1[i], t0, t1); break; case DADD: /* If the addition results in 64-bit 2âs complement arithmetic overflow, then the destination register is not modified and an IntegerOverflow exception occurs. */ TEST1("dadd $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); break; case DADDI: /* If the addition results in 64-bit 2âs complement arithmetic overflow, then the destination register is not modified and an Integer Overflow exception occurs. */ TEST2("daddi $t0, $t1, 0xff", reg_val1[i], 0xff, t0, t1); TEST2("daddi $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3); TEST2("daddi $a0, $a1, 0x0", reg_val1[i], 0x0, a0, a1); TEST2("daddi $s0, $s1, 0x23", reg_val1[i], 0x23, s0, s1); TEST2("daddi $t0, $t1, 0xff", reg_val2[i], 0xff, t0, t1); TEST2("daddi $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3); TEST2("daddi $a0, $a1, 0x0", reg_val2[i], 0x0, a0, a1); TEST2("daddi $s0, $s1, 0x23", reg_val2[i], 0x23, s0, s1); break; case DADDIU: /* No Integer Overflow exception occurs under any circumstances. */ TEST2("daddiu $t0, $t1, 0xff", reg_val1[i], 0xff, t0, t1); TEST2("daddiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3); TEST2("daddiu $a0, $a1, 0x0", reg_val1[i], 0x0, a0, a1); TEST2("daddiu $s0, $s1, 0x23", reg_val1[i], 0x23, s0, s1); TEST2("daddiu $t0, $t1, 0xff", reg_val2[i], 0xff, t0, t1); TEST2("daddiu $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3); TEST2("daddiu $a0, $a1, 0x0", reg_val2[i], 0x0, a0, a1); TEST2("daddiu $s0, $s1, 0x23", reg_val2[i], 0x23, s0, s1); break; case DADDU: /* No Integer Overflow exception occurs under any circumstances. */ TEST1("daddu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); TEST1("daddu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1], s0, s1, s2); break; case DCLO: /* No arithmetic exception occurs under any circumstances. */ TEST3("dclo $t0, $t1", reg_val1[i], t0, t1); TEST3("dclo $v0, $v1", reg_val2[i], v0, v1); break; case DCLZ: /* No arithmetic exception occurs under any circumstances. */ TEST3("dclz $t0, $t1", reg_val1[i], t0, t1); TEST3("dclz $v0, $v1", reg_val2[i], v0, v1); break; case DDIV: /* If the divisor in GPR rt is zero, the arithmetic result value is UNPREDICTABLE. */ if (reg_val1[N-i-1] != 0) TEST4("ddiv $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); if (reg_val2[N-i-1] != 0) TEST4("ddiv $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1); break; case DDIVU: /* If the divisor in GPR rt is zero, the arithmetic result value is UNPREDICTABLE. */ if (reg_val1[N-i-1] != 0) TEST4("ddivu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); if (reg_val2[N-i-1] != 0) TEST4("ddivu $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1); break; case DIV: /* If either GPR rt or GPR rs does not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. If the divisor in GPR rt is zero, the arithmetic result value is UNPREDICTABLE. */ if (reg_val1[N-i-1] != 0) TEST4("div $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); break; case DIVU: /* If either GPR rt or GPR rs does not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. If the divisor in GPR rt is zero, the arithmetic result value is UNPREDICTABLE. */ if (reg_val1[N-i-1] != 0) TEST4("divu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); break; case DMULT: /* No arithmetic exception occurs under any circumstances. */ TEST4("dmult $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); TEST4("dmult $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1); break; case DMULTU: /* No arithmetic exception occurs under any circumstances. */ TEST4("dmultu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); TEST4("dmultu $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1); break; case DSUB: /* If the subtraction results in 64-bit 2âs complement arithmetic overflow, then the destination register is not modified and an Integer Overflow exception occurs. */ TEST1("dsub $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); break; case DSUBU: /* No Integer Overflow exception occurs under any circumstances. */ TEST1("dsubu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); TEST1("dsubu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1], s0, s1, s2); break; case MADD: /* If GPRs rs or rt do not contain sign-extended 32-bit values (bits 63..31 equal), then the results of the operation are UNPREDICTABLE. */ TEST5("madd $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); break; case MADDU: /* If GPRs rs or rt do not contain sign-extended 32-bit values (bits 63..31 equal), then the results of the operation are UNPREDICTABLE. */ TEST5("maddu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); break; case MSUB: /* If GPR rs or rt do not contain a sign-extended 32-bit value (bits 63..31 equal), then the results of the operation are UNPREDICTABLE. */ TEST5("msub $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); break; case MSUBU: /* If GPRs rs or rt do not contain sign-extended 32-bit values (bits 63..31 equal), then the results of the operation are UNPREDICTABLE. This instruction does not provide the capability of writing directly to a target GPR. */ TEST5("msubu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); break; case MUL: /* On 64-bit processors, if either GPR rt or GPR rs does not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST1("mul $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); break; case MULT: /* On 64-bit processors, if either GPR rt or GPR rs does not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST4("mult $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); break; case MULTU: /* On 64-bit processors, if either GPR rt or GPR rs does not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST4("multu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1); break; case MOVN: /* The arithmetic comparison does not cause an Integer Overflow exception. */ TEST1("movn $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); TEST1("movn $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1], s0, s1, s2); break; case MOVZ: /* The arithmetic comparison does not cause an Integer Overflow exception. */ TEST1("movz $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); TEST1("movz $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1], s0, s1, s2); break; case SEB: #if (__mips==64) && (__mips_isa_rev>=2) /* If GPR rt does not contain a sign-extended 32-bit value (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST3("seb $t0, $t1", reg_val1[i], t0, t1); #endif break; case SEH: #if (__mips==64) && (__mips_isa_rev>=2) /* If GPR rt does not contain a sign-extended 32-bit value (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST3("seh $t0, $t1", reg_val1[i], t0, t1); #endif break; case SLT: /* The arithmetic comparison does not cause an Integer Overflow exception. */ TEST1("slt $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); break; case SLTI: /* The arithmetic comparison does not cause an Integer Overflow exception. */ TEST2("slti $t0, $t1, 0xff", reg_val1[i], 0xff, t0, t1); TEST2("slti $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3); TEST2("slti $a0, $a1, 0x0", reg_val1[i], 0x0, a0, a1); TEST2("slti $s0, $s1, 0x23", reg_val1[i], 0x23, s0, s1); TEST2("slti $t0, $t1, 0xff", reg_val2[i], 0xff, t0, t1); TEST2("slti $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3); TEST2("slti $a0, $a1, 0x0", reg_val2[i], 0x0, a0, a1); TEST2("slti $s0, $s1, 0x23", reg_val2[i], 0x23, s0, s1); break; case SLTIU: /* The arithmetic comparison does not cause an Integer Overflow exception. */ TEST2("sltiu $t0, $t1, 0xff", reg_val1[i], 0xff, t0, t1); TEST2("sltiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3); TEST2("sltiu $a0, $a1, 0x0", reg_val1[i], 0x0, a0, a1); TEST2("sltiu $s0, $s1, 0x23", reg_val1[i], 0x23, s0, s1); TEST2("sltiu $t0, $t1, 0xff", reg_val2[i], 0xff, t0, t1); TEST2("sltiu $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3); TEST2("sltiu $a0, $a1, 0x0", reg_val2[i], 0x0, a0, a1); TEST2("sltiu $s0, $s1, 0x23", reg_val2[i], 0x23, s0, s1); break; case SLTU: /* The arithmetic comparison does not cause an Integer Overflow exception. */ TEST1("sltu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); TEST1("sltu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1], s0, s1, s2); break; case SUB: /* On 64-bit processors, if either GPR rt or GPR rs does not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ if (i < 8 || (i > 15 && i < 22)) TEST1("sub $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); break; case SUBU: /* On 64-bit processors, if either GPR rt or GPR rs does not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is UNPREDICTABLE. */ TEST1("subu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1], t0, t1, t2); break; default: printf("Error!\n"); break; } } } return 0; }