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