mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-09 00:46:12 +00:00
361 lines
16 KiB
C
361 lines
16 KiB
C
#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;
|
|
}
|