1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "const.h"
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "macro_int.h"
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef enum {
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ADD=0,  ADDI,   ADDIU,  ADDU,
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   CLO,    CLZ,    DADD,   DADDI,
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   DADDIU, DADDU,  DCLO,   DCLZ,
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   DDIV,   DDIVU,  DIV,    DIVU,
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   DMULT,  DMULTU, DSUB,   DSUBU,
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   MADD,   MADDU,  MSUB,   MSUBU,
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   MUL,    MULT,   MULTU,  MOVN,
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   MOVZ,   SEB,    SEH,    SLT,
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   SLTI,   SLTIU,  SLTU,   SUB,
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   SUBU
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} arithmetic_op;
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main()
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   arithmetic_op op;
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int i;
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   init_reg_val2();
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   for (op = ADD; op <= SUBU; op++) {
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      for (i = 0; i < N; i++) {
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch(op) {
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ADD:
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If either GPR rt or GPR rs does not contain sign-extended
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  32-bit values (bits 63..31 equal), then the result of the
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  operation is UNPREDICTABLE. */
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("add $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          t0, t1, t2);
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ADDI:
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPR rs does not contain a sign-extended 32-bit
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  value (bits 63..31 equal), then the result of the operation
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  is UNPREDICTABLE. */
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("addi $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("addi $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("addi $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("addi $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ADDIU:
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPR rs does not contain a sign-extended 32-bit
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  value (bits 63..31 equal), then the result of the operation
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  is UNPREDICTABLE. */
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("addiu $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("addiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("addiu $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("addiu $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ADDU:
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If either GPR rt or GPR rs does not contain sign-extended
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  32-bit values (bits 63..31 equal), then the result of the
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  operation is UNPREDICTABLE. */
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("addu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           t0, t1, t2);
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case CLO:
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPR rs does not contain a sign-extended 32-bit
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  value (bits 63..31 equal), then the results of the operation
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  are UNPREDICTABLE. */
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST3("clo $t0, $t1", reg_val1[i], t0, t1);
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case CLZ:
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPR rs does not contain a sign-extended 32-bit
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  value (bits 63..31 equal), then the results of the operation
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  are UNPREDICTABLE. */
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST3("clz $t0, $t1", reg_val1[i], t0, t1);
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DADD:
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If the addition results in 64-bit 2âs complement arithmetic
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  overflow, then the destination register is not modified and
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  an IntegerOverflow exception occurs. */
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("dadd $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           t0, t1, t2);
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DADDI:
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If the addition results in 64-bit 2âs complement arithmetic
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  overflow, then the destination register is not modified and
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  an Integer Overflow exception occurs. */
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddi $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddi $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddi $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddi $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddi $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddi $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddi $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddi $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DADDIU:
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* No Integer Overflow exception occurs under any
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  circumstances. */
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddiu $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddiu $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddiu $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddiu $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddiu $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddiu $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("daddiu $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DADDU:
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* No Integer Overflow exception occurs under any
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  circumstances. */
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("daddu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            t0, t1, t2);
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("daddu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            s0, s1, s2);
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DCLO:
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* No arithmetic exception occurs under any circumstances. */
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST3("dclo $t0, $t1", reg_val1[i], t0, t1);
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST3("dclo $v0, $v1", reg_val2[i], v0, v1);
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DCLZ:
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* No arithmetic exception occurs under any circumstances. */
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST3("dclz $t0, $t1", reg_val1[i], t0, t1);
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST3("dclz $v0, $v1", reg_val2[i], v0, v1);
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DDIV:
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If the divisor in GPR rt is zero, the arithmetic result value
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  is UNPREDICTABLE. */
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (reg_val1[N-i-1] != 0)
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  TEST4("ddiv $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (reg_val2[N-i-1] != 0)
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  TEST4("ddiv $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DDIVU:
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If the divisor in GPR rt is zero, the arithmetic result value
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  is UNPREDICTABLE. */
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (reg_val1[N-i-1] != 0)
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  TEST4("ddivu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (reg_val2[N-i-1] != 0)
151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  TEST4("ddivu $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DIV:
156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If either GPR rt or GPR rs does not contain sign-extended
157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  32-bit values (bits 63..31 equal), then the result of the
158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  operation is UNPREDICTABLE.
159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  If the divisor in GPR rt is zero, the arithmetic result
160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  value is UNPREDICTABLE. */
161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (reg_val1[N-i-1] != 0)
162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  TEST4("div $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DIVU:
167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If either GPR rt or GPR rs does not contain sign-extended
168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  32-bit values (bits 63..31 equal), then the result of the
169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  operation is UNPREDICTABLE.
170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  If the divisor in GPR rt is zero, the arithmetic result
171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  value is UNPREDICTABLE. */
172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (reg_val1[N-i-1] != 0)
173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  TEST4("divu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DMULT:
178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* No arithmetic exception occurs under any circumstances. */
179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST4("dmult $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST4("dmult $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DMULTU:
184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* No arithmetic exception occurs under any circumstances. */
185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST4("dmultu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST4("dmultu $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DSUB:
190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If the subtraction results in 64-bit 2âs complement
191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  arithmetic overflow, then the destination register is not
192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  modified and an Integer Overflow exception occurs. */
193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("dsub $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           t0, t1, t2);
195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DSUBU:
198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* No Integer Overflow exception occurs under any
199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  circumstances. */
200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("dsubu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            t0, t1, t2);
202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("dsubu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            s0, s1, s2);
204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MADD:
207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPRs rs or rt do not contain sign-extended 32-bit
208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  values (bits 63..31 equal), then the results of the operation
209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  are UNPREDICTABLE. */
210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST5("madd $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MADDU:
214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPRs rs or rt do not contain sign-extended 32-bit
215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  values (bits 63..31 equal), then the results of the operation
216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  are UNPREDICTABLE. */
217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST5("maddu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MSUB:
221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPR rs or rt do not contain a sign-extended 32-bit
222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  value (bits 63..31 equal), then the results of the operation
223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  are UNPREDICTABLE. */
224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST5("msub $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MSUBU:
228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPRs rs or rt do not contain sign-extended 32-bit
229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  values (bits 63..31 equal), then the results of the operation
230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  are UNPREDICTABLE.
231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  This instruction does not provide the capability of writing
232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  directly to a target GPR. */
233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST5("msubu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MUL:
237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* On 64-bit processors, if either GPR rt or GPR rs does not
238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  contain sign-extended 32-bit values (bits 63..31 equal), then
239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  the result of the operation is UNPREDICTABLE. */
240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("mul $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          t0, t1, t2);
242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MULT:
245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* On 64-bit processors, if either GPR rt or GPR rs does not
246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  contain sign-extended 32-bit values (bits 63..31 equal), then
247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  the result of the operation is UNPREDICTABLE. */
248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST4("mult $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MULTU:
252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* On 64-bit processors, if either GPR rt or GPR rs does not
253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  contain sign-extended 32-bit values (bits 63..31 equal), then
254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  the result of the operation is UNPREDICTABLE. */
255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST4("multu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MOVN:
259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* The arithmetic comparison does not cause an Integer Overflow
260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  exception. */
261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("movn $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           t0, t1, t2);
263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("movn $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           s0, s1, s2);
265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MOVZ:
268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* The arithmetic comparison does not cause an Integer Overflow
269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  exception. */
270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("movz $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           t0, t1, t2);
272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("movz $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           s0, s1, s2);
274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SEB:
277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if (__mips==64) && (__mips_isa_rev>=2)
278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPR rt does not contain a sign-extended 32-bit
279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  value (bits 63..31 equal), then the result of the operation
280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  is UNPREDICTABLE. */
281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST3("seb $t0, $t1", reg_val1[i], t0, t1);
282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SEH:
286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if (__mips==64) && (__mips_isa_rev>=2)
287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If GPR rt does not contain a sign-extended 32-bit
288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  value (bits 63..31 equal), then the result of the operation
289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  is UNPREDICTABLE. */
290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST3("seh $t0, $t1", reg_val1[i], t0, t1);
291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SLT:
295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* The arithmetic comparison does not cause an Integer Overflow
296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  exception. */
297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("slt $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          t0, t1, t2);
299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SLTI:
302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* The arithmetic comparison does not cause an Integer Overflow
303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  exception. */
304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("slti $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("slti $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("slti $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("slti $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("slti $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("slti $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("slti $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("slti $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SLTIU:
315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* The arithmetic comparison does not cause an Integer Overflow
316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  exception. */
317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("sltiu $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("sltiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("sltiu $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("sltiu $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("sltiu $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("sltiu $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("sltiu $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST2("sltiu $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SLTU:
328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* The arithmetic comparison does not cause an Integer Overflow
329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  exception. */
330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("sltu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           t0, t1, t2);
332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("sltu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           s0, s1, s2);
334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SUB:
337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* On 64-bit processors, if either GPR rt or GPR rs does not
338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  contain sign-extended 32-bit values (bits 63..31 equal), then
339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  the result of the operation is UNPREDICTABLE. */
340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (i < 8 || (i > 15 && i < 22))
341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  TEST1("sub $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             t0, t1, t2);
343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SUBU:
346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* On 64-bit processors, if either GPR rt or GPR rs does not
347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  contain sign-extended 32-bit values (bits 63..31 equal), then
348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  the result of the operation is UNPREDICTABLE. */
349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TEST1("subu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           t0, t1, t2);
351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("Error!\n");
355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
361