• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include "const.h"
3 #include "macro_int.h"
4 
5 typedef enum {
6    ADD=0,  ADDI,   ADDIU,  ADDU,
7    CLO,    CLZ,    DADD,   DADDI,
8    DADDIU, DADDU,  DCLO,   DCLZ,
9    DDIV,   DDIVU,  DIV,    DIVU,
10    DMULT,  DMULTU, DSUB,   DSUBU,
11    MADD,   MADDU,  MSUB,   MSUBU,
12    MUL,    MULT,   MULTU,  MOVN,
13    MOVZ,   SEB,    SEH,    SLT,
14    SLTI,   SLTIU,  SLTU,   SUB,
15    SUBU
16 } arithmetic_op;
17 
main()18 int main()
19 {
20    arithmetic_op op;
21    int i;
22    init_reg_val2();
23 
24    for (op = ADD; op <= SUBU; op++) {
25       for (i = 0; i < N; i++) {
26          switch(op) {
27             case ADD:
28                /* If either GPR rt or GPR rs does not contain sign-extended
29                   32-bit values (bits 63..31 equal), then the result of the
30                   operation is UNPREDICTABLE. */
31                TEST1("add $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
32                                           t0, t1, t2);
33                break;
34 
35             case ADDI:
36                /* If GPR rs does not contain a sign-extended 32-bit
37                   value (bits 63..31 equal), then the result of the operation
38                   is UNPREDICTABLE. */
39                TEST2("addi $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
40                TEST2("addi $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
41                TEST2("addi $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
42                TEST2("addi $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
43                break;
44 
45             case ADDIU:
46                /* If GPR rs does not contain a sign-extended 32-bit
47                   value (bits 63..31 equal), then the result of the operation
48                   is UNPREDICTABLE. */
49                TEST2("addiu $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
50                TEST2("addiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
51                TEST2("addiu $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
52                TEST2("addiu $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
53                break;
54 
55             case ADDU:
56                /* If either GPR rt or GPR rs does not contain sign-extended
57                   32-bit values (bits 63..31 equal), then the result of the
58                   operation is UNPREDICTABLE. */
59                TEST1("addu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
60                                            t0, t1, t2);
61                break;
62 
63             case CLO:
64                /* If GPR rs does not contain a sign-extended 32-bit
65                   value (bits 63..31 equal), then the results of the operation
66                   are UNPREDICTABLE. */
67                TEST3("clo $t0, $t1", reg_val1[i], t0, t1);
68                break;
69 
70             case CLZ:
71                /* If GPR rs does not contain a sign-extended 32-bit
72                   value (bits 63..31 equal), then the results of the operation
73                   are UNPREDICTABLE. */
74                TEST3("clz $t0, $t1", reg_val1[i], t0, t1);
75                break;
76 
77             case DADD:
78                /* If the addition results in 64-bit 2âs complement arithmetic
79                   overflow, then the destination register is not modified and
80                   an IntegerOverflow exception occurs. */
81                TEST1("dadd $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
82                                            t0, t1, t2);
83                break;
84 
85             case DADDI:
86                /* If the addition results in 64-bit 2âs complement arithmetic
87                   overflow, then the destination register is not modified and
88                   an Integer Overflow exception occurs. */
89                TEST2("daddi $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
90                TEST2("daddi $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
91                TEST2("daddi $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
92                TEST2("daddi $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
93                TEST2("daddi $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
94                TEST2("daddi $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
95                TEST2("daddi $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
96                TEST2("daddi $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
97                break;
98 
99             case DADDIU:
100                /* No Integer Overflow exception occurs under any
101                   circumstances. */
102                TEST2("daddiu $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
103                TEST2("daddiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
104                TEST2("daddiu $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
105                TEST2("daddiu $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
106                TEST2("daddiu $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
107                TEST2("daddiu $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
108                TEST2("daddiu $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
109                TEST2("daddiu $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
110                break;
111 
112             case DADDU:
113                /* No Integer Overflow exception occurs under any
114                   circumstances. */
115                TEST1("daddu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
116                                             t0, t1, t2);
117                TEST1("daddu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
118                                             s0, s1, s2);
119                break;
120 
121             case DCLO:
122                /* No arithmetic exception occurs under any circumstances. */
123                TEST3("dclo $t0, $t1", reg_val1[i], t0, t1);
124                TEST3("dclo $v0, $v1", reg_val2[i], v0, v1);
125                break;
126 
127             case DCLZ:
128                /* No arithmetic exception occurs under any circumstances. */
129                TEST3("dclz $t0, $t1", reg_val1[i], t0, t1);
130                TEST3("dclz $v0, $v1", reg_val2[i], v0, v1);
131                break;
132 
133             case DDIV:
134                /* If the divisor in GPR rt is zero, the arithmetic result value
135                   is UNPREDICTABLE. */
136                if (reg_val1[N-i-1] != 0)
137                   TEST4("ddiv $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
138 
139                if (reg_val2[N-i-1] != 0)
140                   TEST4("ddiv $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
141 
142                break;
143 
144             case DDIVU:
145                /* If the divisor in GPR rt is zero, the arithmetic result value
146                   is UNPREDICTABLE. */
147                if (reg_val1[N-i-1] != 0)
148                   TEST4("ddivu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
149 
150                if (reg_val2[N-i-1] != 0)
151                   TEST4("ddivu $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
152 
153                break;
154 
155             case DIV:
156                /* If either GPR rt or GPR rs does not contain sign-extended
157                   32-bit values (bits 63..31 equal), then the result of the
158                   operation is UNPREDICTABLE.
159                   If the divisor in GPR rt is zero, the arithmetic result
160                   value is UNPREDICTABLE. */
161                if (reg_val1[N-i-1] != 0)
162                   TEST4("div $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
163 
164                break;
165 
166             case DIVU:
167                /* If either GPR rt or GPR rs does not contain sign-extended
168                   32-bit values (bits 63..31 equal), then the result of the
169                   operation is UNPREDICTABLE.
170                   If the divisor in GPR rt is zero, the arithmetic result
171                   value is UNPREDICTABLE. */
172                if (reg_val1[N-i-1] != 0)
173                   TEST4("divu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
174 
175                break;
176 
177             case DMULT:
178                /* No arithmetic exception occurs under any circumstances. */
179                TEST4("dmult $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
180                TEST4("dmult $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
181                break;
182 
183             case DMULTU:
184                /* No arithmetic exception occurs under any circumstances. */
185                TEST4("dmultu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
186                TEST4("dmultu $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
187                break;
188 
189             case DSUB:
190                /* If the subtraction results in 64-bit 2âs complement
191                   arithmetic overflow, then the destination register is not
192                   modified and an Integer Overflow exception occurs. */
193                TEST1("dsub $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
194                                            t0, t1, t2);
195                break;
196 
197             case DSUBU:
198                /* No Integer Overflow exception occurs under any
199                   circumstances. */
200                TEST1("dsubu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
201                                             t0, t1, t2);
202                TEST1("dsubu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
203                                             s0, s1, s2);
204                break;
205 
206             case MADD:
207                /* If GPRs rs or rt do not contain sign-extended 32-bit
208                   values (bits 63..31 equal), then the results of the operation
209                   are UNPREDICTABLE. */
210                TEST5("madd $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
211                break;
212 
213             case MADDU:
214                /* If GPRs rs or rt do not contain sign-extended 32-bit
215                   values (bits 63..31 equal), then the results of the operation
216                   are UNPREDICTABLE. */
217                TEST5("maddu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
218                break;
219 
220             case MSUB:
221                /* If GPR rs or rt do not contain a sign-extended 32-bit
222                   value (bits 63..31 equal), then the results of the operation
223                   are UNPREDICTABLE. */
224                TEST5("msub $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
225                break;
226 
227             case MSUBU:
228                /* If GPRs rs or rt do not contain sign-extended 32-bit
229                   values (bits 63..31 equal), then the results of the operation
230                   are UNPREDICTABLE.
231                   This instruction does not provide the capability of writing
232                   directly to a target GPR. */
233                TEST5("msubu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
234                break;
235 
236             case MUL:
237                /* On 64-bit processors, if either GPR rt or GPR rs does not
238                   contain sign-extended 32-bit values (bits 63..31 equal), then
239                   the result of the operation is UNPREDICTABLE. */
240                TEST1("mul $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
241                                           t0, t1, t2);
242                break;
243 
244             case MULT:
245                /* On 64-bit processors, if either GPR rt or GPR rs does not
246                   contain sign-extended 32-bit values (bits 63..31 equal), then
247                   the result of the operation is UNPREDICTABLE. */
248                TEST4("mult $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
249                break;
250 
251             case MULTU:
252                /* On 64-bit processors, if either GPR rt or GPR rs does not
253                   contain sign-extended 32-bit values (bits 63..31 equal), then
254                   the result of the operation is UNPREDICTABLE. */
255                TEST4("multu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
256                break;
257 
258             case MOVN:
259                /* The arithmetic comparison does not cause an Integer Overflow
260                   exception. */
261                TEST1("movn $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
262                                            t0, t1, t2);
263                TEST1("movn $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
264                                            s0, s1, s2);
265                break;
266 
267             case MOVZ:
268                /* The arithmetic comparison does not cause an Integer Overflow
269                   exception. */
270                TEST1("movz $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
271                                            t0, t1, t2);
272                TEST1("movz $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
273                                            s0, s1, s2);
274                break;
275 
276             case SEB:
277 #if (__mips==64) && (__mips_isa_rev>=2)
278                /* If GPR rt does not contain a sign-extended 32-bit
279                   value (bits 63..31 equal), then the result of the operation
280                   is UNPREDICTABLE. */
281                TEST3("seb $t0, $t1", reg_val1[i], t0, t1);
282 #endif
283                break;
284 
285             case SEH:
286 #if (__mips==64) && (__mips_isa_rev>=2)
287                /* If GPR rt does not contain a sign-extended 32-bit
288                   value (bits 63..31 equal), then the result of the operation
289                   is UNPREDICTABLE. */
290                TEST3("seh $t0, $t1", reg_val1[i], t0, t1);
291 #endif
292                break;
293 
294             case SLT:
295                /* The arithmetic comparison does not cause an Integer Overflow
296                   exception. */
297                TEST1("slt $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
298                                           t0, t1, t2);
299                break;
300 
301             case SLTI:
302                /* The arithmetic comparison does not cause an Integer Overflow
303                   exception. */
304                TEST2("slti $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
305                TEST2("slti $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
306                TEST2("slti $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
307                TEST2("slti $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
308                TEST2("slti $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
309                TEST2("slti $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
310                TEST2("slti $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
311                TEST2("slti $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
312                break;
313 
314             case SLTIU:
315                /* The arithmetic comparison does not cause an Integer Overflow
316                   exception. */
317                TEST2("sltiu $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
318                TEST2("sltiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
319                TEST2("sltiu $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
320                TEST2("sltiu $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
321                TEST2("sltiu $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
322                TEST2("sltiu $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
323                TEST2("sltiu $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
324                TEST2("sltiu $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
325                break;
326 
327             case SLTU:
328                /* The arithmetic comparison does not cause an Integer Overflow
329                   exception. */
330                TEST1("sltu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
331                                            t0, t1, t2);
332                TEST1("sltu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
333                                            s0, s1, s2);
334                break;
335 
336             case SUB:
337                /* On 64-bit processors, if either GPR rt or GPR rs does not
338                   contain sign-extended 32-bit values (bits 63..31 equal), then
339                   the result of the operation is UNPREDICTABLE. */
340                if (i < 8 || (i > 15 && i < 22))
341                   TEST1("sub $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
342                                              t0, t1, t2);
343                break;
344 
345             case SUBU:
346                /* On 64-bit processors, if either GPR rt or GPR rs does not
347                   contain sign-extended 32-bit values (bits 63..31 equal), then
348                   the result of the operation is UNPREDICTABLE. */
349                TEST1("subu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
350                                            t0, t1, t2);
351                break;
352 
353             default:
354                printf("Error!\n");
355                break;
356          }
357       }
358    }
359    return 0;
360 }
361