MIPS/resources/2021/soft/func/inst/inst_test.h
2021-06-18 15:43:51 +08:00

1293 lines
25 KiB
C

// file name: inst_test.h
#include <cpu_cde.h>
#define TEST_LUI(in_a, ref_base) \
lui a0, ref_base; \
lui t0, in_a; \
addu a0, a0, t1; \
addu t1, t1, t2; \
bne t0, a0, inst_error; \
nop
/* 2 */
#define TEST_ADDU(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
addu v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 3 */
#define TEST_ADDIU(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
addiu v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 4 */
#define TEST_BEQ(in_a, in_b, back_flag, front_flag, b_flag_ref, f_flag_ref) \
lui v0, 0x0; \
lui v1, 0x0; \
b 2000f; \
nop; \
1000:; \
LI (v0, back_flag); \
beq t1, t0, 3000f; \
nop; \
b 4000f; \
nop; \
nop; \
2000:; \
LI (t0, in_a); \
LI (t1, in_b); \
beq t0, t1, 1000b; \
nop; \
b 4000f; \
nop; \
nop; \
3000:; \
LI (v1, front_flag); \
4000:; \
LI (s5, b_flag_ref); \
LI (s6, f_flag_ref); \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 5 */
#define TEST_BNE(in_a, in_b, back_flag, front_flag, b_flag_ref, f_flag_ref) \
lui v0, 0x0; \
lui v1, 0x0; \
b 2000f; \
nop; \
1000:; \
LI (v0, back_flag); \
bne t1, t0, 3000f; \
nop; \
b 4000f; \
nop; \
nop; \
2000:; \
LI (t0, in_a); \
LI (t1, in_b); \
bne t0, t1, 1000b; \
nop; \
b 4000f; \
nop; \
nop; \
3000:; \
LI (v1, front_flag); \
4000:; \
LI (s5, b_flag_ref); \
LI (s6, f_flag_ref); \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 6 */
#define TEST_LW(data, base_addr, offset, offset_align, ref) \
LI (t1, data); \
LI (t0, base_addr); \
LI (v1, ref); \
sw t1, offset_align(t0); \
addiu a0, t0, 4; \
addiu a1, t0, -8; \
sw a0, offset_align(a0); \
sw a1, offset_align(a1); \
lw v0, offset(t0); \
lw a2, offset_align(a0); \
lw a0, offset_align(a1); \
lw a2, offset_align(a1); \
bne v0, v1, inst_error; \
nop
/* 7 */
#define TEST_OR(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
or v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 8 */
#define TEST_SLT(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
slt v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 9 */
#define TEST_SLTI(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
slti v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 10 */
#define TEST_SLTIU(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
sltiu v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 11 */
#define TEST_SLL(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
sll v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 12 */
#define TEST_SW(data, base_addr, offset, offset_align, ref) \
LI (t1, data); \
LI (t0, base_addr); \
LI (v1, ref); \
sw t1, offset(t0); \
addiu a0, t0, 4; \
addiu a1, t0, -4; \
sw a0, offset(a0); \
sw a1, offset(a1); \
lw v0, offset_align(t0); \
lw a2, offset(a0); \
lw a0, offset(a1); \
lw a2, offset(a1); \
bne v0, v1, inst_error; \
nop
/* 13 */
#define TEST_J(back_flag, front_flag, b_flag_ref, f_flag_ref) \
lui v0, 0x0; \
lui v1, 0x0; \
b 2000f; \
nop; \
1000:; \
LI (v0, back_flag); \
j 3000f; \
nop; \
b 4000f; \
nop; \
nop; \
2000:; \
j 1000b; \
nop; \
b 4000f; \
nop; \
nop; \
3000:; \
LI (v1, front_flag); \
4000:; \
LI (s5, b_flag_ref); \
LI (s6, f_flag_ref); \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 14 */
#define TEST_JAL(back_flag, front_flag, b_flag_ref, f_flag_ref) \
addu s7, zero, $31; \
lui v0, 0x0; \
lui v1, 0x0; \
jal 2000f; \
nop; \
1000:; \
addu a1, ra, zero; \
LI (v0, back_flag); \
1001:; \
jal 3000f; \
nop; \
b 4000f; \
nop; \
nop; \
2000:; \
addu a0, ra, zero; \
jal 1000b; \
nop; \
b 4000f; \
nop; \
nop; \
3000:; \
addu a2, ra, zero; \
LI (v1, front_flag); \
4000:; \
addu $31, zero, s7; \
LI (s5, b_flag_ref); \
LI (s6, f_flag_ref); \
bne v0, s5, inst_error; \
nop; \
addiu a2, a2, 0x18; \
bne v1, s6, inst_error; \
nop; \
bne a2, a1, inst_error; \
nop
/* 15 */
#define TEST_JR(back_flag, front_flag, b_flag_ref, f_flag_ref) \
lui v0, 0x0; \
lui v1, 0x0; \
la t0, 1000f; \
la t1, 3000f; \
b 2000f; \
nop; \
1000:; \
LI (v0, back_flag); \
jr t1; \
nop; \
b 4000f; \
nop; \
nop; \
2000:; \
jr t0; \
nop; \
b 4000f; \
nop; \
nop; \
3000:; \
LI (v1, front_flag); \
4000:; \
LI (s5, b_flag_ref); \
LI (s6, f_flag_ref); \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 16 */
#define TEST_BEQ_DS(op, dest, ...) \
addiu s5, zero, 0x1; \
beq s5, zero, 1000f; \
op dest , ##__VA_ARGS__; \
op s6 , ##__VA_ARGS__; \
bne dest, s6, inst_error; \
nop; \
beq s5, s5, 2000f; \
op s7 , ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
bne s7, s6, inst_error; \
nop
/* 17 */
#define TEST_BNE_DS(op, dest, ...) \
addiu s5, zero, 0x1; \
bne s5, s5, 1000f; \
op dest, ##__VA_ARGS__; \
op s6, ##__VA_ARGS__; \
bne dest, s6, inst_error; \
nop; \
bne s5, zero, 2000f; \
op s7, ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
bne s7, s6, inst_error; \
nop
/* 18 */
#define TEST_J_DS(op, dest, ...) \
op s6, ##__VA_ARGS__; \
j 2000f; \
op dest, ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
bne dest, s6, inst_error; \
nop
/* 19 */
#define TEST_JAL_DS(op, dest, ...) \
addu s7, zero, $31; \
op s6, ##__VA_ARGS__; \
jal 2000f; \
op dest, ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
addu $31, zero, s7; \
bne dest, s6, inst_error; \
nop
/* 20 */
#define TEST_JR_DS(op, dest, ...) \
la s5, 2000f; \
op s6, ##__VA_ARGS__; \
jr s5; \
op dest, ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
bne dest, s6, inst_error; \
nop
/* 21 */
#define TEST_ADD(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
add v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 22 */
#define TEST_ADDI(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
addi v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 23 */
#define TEST_SUB(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
sub v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 24 */
#define TEST_SUBU(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
subu v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 25 */
#define TEST_SLTU(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
sltu v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 26 */
#define TEST_AND(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
and v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 27 */
#define TEST_ANDI(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
andi v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 28 */
#define TEST_NOR(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
nor v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 29 */
#define TEST_ORI(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
ori v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 30 */
#define TEST_XOR(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
xor v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 31 */
#define TEST_XORI(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
xori v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 32 */
#define TEST_SLLV(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
sllv v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 33 */
#define TEST_SRA(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
sra v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 34 */
#define TEST_SRAV(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
srav v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 35 */
#define TEST_SRL(in_a, in_b, ref) \
LI (t0, in_a); \
LI (v1, ref); \
srl v0, t0, in_b; \
bne v0, v1, inst_error; \
nop
/* 36 */
#define TEST_SRLV(in_a, in_b, ref) \
LI (t0, in_a); \
LI (t1, in_b); \
LI (v1, ref); \
srlv v0, t0, t1; \
bne v0, v1, inst_error; \
nop
/* 37 */
#define TEST_BGEZ(in_a, back_flag, front_flag, b_flag_ref, f_flag_ref) \
li v0, 0x0; \
li v1, 0x0; \
b 2000f; \
nop; \
1000:; \
li v0, back_flag; \
bgez t0, 3000f; \
nop; \
b 4000f; \
nop; \
nop; \
2000:; \
li t0, in_a; \
bgez t0, 1000b; \
nop; \
b 4000f; \
nop; \
nop; \
3000:; \
li v1, front_flag; \
4000:; \
li s5, b_flag_ref; \
li s6, f_flag_ref; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 38 */
#define TEST_BGTZ(in_a, back_flag, front_flag, b_flag_ref, f_flag_ref) \
li v0, 0x0; \
li v1, 0x0; \
b 2000f; \
nop; \
1000:; \
li v0, back_flag; \
bgtz t0, 3000f; \
nop; \
b 4000f; \
nop; \
nop; \
2000:; \
li t0, in_a; \
bgtz t0, 1000b; \
nop; \
b 4000f; \
nop; \
nop; \
3000:; \
li v1, front_flag; \
4000:; \
li s5, b_flag_ref; \
li s6, f_flag_ref; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 39 */
#define TEST_BLEZ(in_a, back_flag, front_flag, b_flag_ref, f_flag_ref) \
li v0, 0x0; \
li v1, 0x0; \
b 2000f; \
nop; \
1000:; \
li v0, back_flag; \
blez t0, 3000f; \
nop; \
b 4000f; \
nop; \
nop; \
2000:; \
li t0, in_a; \
blez t0, 1000b; \
nop; \
b 4000f; \
nop; \
nop; \
3000:; \
li v1, front_flag; \
4000:; \
li s5, b_flag_ref; \
li s6, f_flag_ref; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 40 */
#define TEST_BLTZ(in_a, back_flag, front_flag, b_flag_ref, f_flag_ref) \
li v0, 0x0; \
li v1, 0x0; \
b 2000f; \
nop; \
1000:; \
li v0, back_flag; \
bltz t0, 3000f; \
nop; \
b 4000f; \
nop; \
2000:; \
li t0, in_a; \
bltz t0, 1000b; \
nop; \
b 4000f; \
nop; \
3000:; \
li v1, front_flag; \
4000:; \
li s5, b_flag_ref; \
li s6, f_flag_ref; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 41 */
#define TEST_BLTZAL(in_a, back_flag, front_flag, b_flag_ref, f_flag_ref) \
addu s7, zero, $31; \
li v0, 0x0; \
li v1, 0x0; \
b 2000f; \
nop; \
1000:; \
addu a0, ra, zero; \
li v0, back_flag; \
bltzal t0, 3000f; \
nop; \
1001:; \
b 4000f; \
nop; \
2000:; \
li t0, in_a; \
bltzal t0, 1000b; \
nop; \
2001:; \
addu a0, ra, zero; \
la a1, 1001b; \
b 4000f; \
nop; \
3000:; \
addu a1, ra, zero; \
li v1, front_flag; \
4000:; \
addu $31, zero, s7; \
li s5, b_flag_ref; \
li s6, f_flag_ref; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop; \
la s5, 1001b; \
la s6, 2001b; \
bne a0, s6, inst_error; \
nop; \
bne a1, s5, inst_error; \
nop
/* 42 */
#define TEST_BGEZAL(in_a, back_flag, front_flag, b_flag_ref, f_flag_ref) \
addu s7, zero, $31; \
li v0, 0x0; \
li v1, 0x0; \
b 2000f; \
nop; \
1000:; \
addu a0, ra, zero; \
li v0, back_flag; \
bgezal t0, 3000f; \
nop; \
1001:; \
b 4000f; \
nop; \
2000:; \
li t0, in_a; \
bgezal t0, 1000b; \
nop; \
2001:; \
addu a0, ra, zero; \
la a1, 1001b; \
b 4000f; \
nop; \
3000:; \
addu a1, ra, zero; \
li v1, front_flag; \
4000:; \
addu $31, zero, s7; \
li s5, b_flag_ref; \
li s6, f_flag_ref; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop; \
la s5, 1001b; \
la s6, 2001b; \
bne a0, s6, inst_error; \
nop; \
bne a1, s5, inst_error; \
nop
/* 43 */
#define TEST_JALR(back_flag, front_flag, b_flag_ref, f_flag_ref) \
addu s7, zero, $31; \
li v0, 0x0; \
li v1, 0x0; \
la t0, 1000f; \
la t1, 3000f; \
b 2000f; \
nop; \
1000:; \
addu a0, ra, zero; \
li v0, back_flag; \
jalr t1; \
nop; \
1001:; \
b 4000f; \
nop; \
2000:; \
jalr t0; \
nop; \
2001:; \
b 4000f; \
nop; \
3000:; \
addu a1, ra, zero; \
li v1, front_flag; \
4000:; \
addu $31, zero, s7; \
li s5, b_flag_ref; \
li s6, f_flag_ref; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop; \
la s5, 1001b; \
la s6, 2001b; \
bne a0, s6, inst_error; \
nop; \
bne a1, s5, inst_error; \
nop
/* 44 */
#define TEST_DIV(in_a, in_b, ref_lo, ref_hi) \
li t0, in_a; \
li t1, in_b; \
div zero, t0, t1; \
mflo s5; \
mfhi s6; \
li v0, ref_lo; \
li v1, ref_hi; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 45 */
#define TEST_DIVU(in_a, in_b, ref_lo, ref_hi) \
li t0, in_a; \
li t1, in_b; \
divu zero, t0, t1; \
mflo s5; \
mfhi s6; \
li v0, ref_lo; \
li v1, ref_hi; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 46 */
#define TEST_MULT(in_a, in_b, ref_lo, ref_hi) \
li t0, in_a; \
li t1, in_b; \
mult t0, t1; \
mflo s5; \
mfhi s6; \
li v0, ref_lo; \
li v1, ref_hi; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 47 */
#define TEST_MULTU(in_a, in_b, ref_lo, ref_hi) \
li t0, in_a; \
li t1, in_b; \
multu t0, t1; \
mflo s5; \
mfhi s6; \
li v0, ref_lo; \
li v1, ref_hi; \
bne v0, s5, inst_error; \
nop; \
bne v1, s6, inst_error; \
nop
/* 48 */
#define TEST_MFHI(in_a, ref) \
li t0, in_a; \
mthi t0; \
mfhi v0; \
li s5, ref; \
bne v0, s5, inst_error; \
nop
/* 49 */
#define TEST_MFLO(in_a, ref) \
li t0, in_a; \
mtlo t0; \
mflo v0; \
li s5, ref; \
bne v0, s5, inst_error; \
nop
/* 50 */
#define TEST_MTHI(in_a, ref) \
li t0, in_a; \
mthi t0; \
mfhi v0; \
li s5, ref; \
bne v0, s5, inst_error; \
nop
/* 51 */
#define TEST_MTLO(in_a, ref) \
li t0, in_a; \
mtlo t0; \
mflo v0; \
li s5, ref; \
bne v0, s5, inst_error; \
nop
/* 52 */
#define TEST_BGEZ_DS(op, dest, ...) \
li a0, 0x80000000; \
bgez a0, 1000f; \
op dest , ##__VA_ARGS__; \
op s6 , ##__VA_ARGS__; \
bne dest, s6, inst_error; \
nop; \
bgez zero, 2000f; \
op s7 , ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
bne s7, s6, inst_error; \
nop
#define TEST_BGEZ_DS_MD(...) \
li a0, 0x80000000; \
li v0, 0; \
li v1, 0; \
bgez a0, 1000f; \
##__VA_ARGS__; \
mflo v0; \
mtlo a0; \
##__VA_ARGS__; \
mflo s6; \
bne v0, s6, inst_error; \
nop; \
mtlo a0; \
bgez zero, 2000f; \
##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
mflo v1; \
bne v1, s6, inst_error; \
nop
/* 53 */
#define TEST_BGTZ_DS(op, dest, ...) \
li a0, 0x80000000; \
li a1, 0x7fffffff; \
bgtz a0, 1000f; \
op dest, ##__VA_ARGS__; \
op s6, ##__VA_ARGS__; \
bne dest, s6, inst_error; \
nop; \
bgtz a1, 2000f; \
op s7, ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
bne s7, s6, inst_error; \
nop
#define TEST_BGTZ_DS_MD(...) \
li a0, 0x80000000; \
li a1, 0x7fffffff; \
li v0, 0; \
li v1, 0; \
bgtz a0, 1000f; \
##__VA_ARGS__; \
mflo v0; \
mtlo a0; \
##__VA_ARGS__; \
mflo s6; \
bne v0, s6, inst_error; \
nop; \
mtlo a0; \
bgtz a1, 2000f; \
##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
mflo v1; \
bne v1, s6, inst_error; \
nop
/* 54 */
#define TEST_BLEZ_DS(op, dest, ...) \
li a0, 0x7fffffff; \
blez a0, 1000f; \
op dest , ##__VA_ARGS__; \
op s6 , ##__VA_ARGS__; \
bne dest, s6, inst_error; \
nop; \
blez zero, 2000f; \
op s7 , ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
bne s7, s6, inst_error; \
nop
#define TEST_BLEZ_DS_MD(...) \
li a0, 0x7fffffff; \
li v0, 0; \
li v1, 0; \
blez a0, 1000f; \
##__VA_ARGS__; \
mflo v0; \
mtlo a0; \
##__VA_ARGS__; \
mflo s6; \
bne v0, s6, inst_error; \
nop; \
mtlo a0; \
blez zero, 2000f; \
##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
mflo v1; \
bne v1, s6, inst_error; \
nop
/* 55 */
#define TEST_BLTZ_DS(op, dest, ...) \
li a0, 0x80000000; \
li a1, 0x7fffffff; \
bltz a1, 1000f; \
op dest , ##__VA_ARGS__; \
op s6 , ##__VA_ARGS__; \
bne dest, s6, inst_error; \
nop; \
bltz a0, 2000f; \
op s7 , ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
bne s7, s6, inst_error; \
nop
#define TEST_BLTZ_DS_MD(...) \
li a0, 0x80000000; \
li a1, 0x7fffffff; \
li v0, 0; \
li v1, 0; \
bltz a1, 1000f; \
##__VA_ARGS__; \
mflo v0; \
mtlo a0; \
##__VA_ARGS__; \
mflo s6; \
bne v0, s6, inst_error; \
nop; \
mtlo a0; \
bltz a0, 2000f; \
##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
mflo v1; \
bne v1, s6, inst_error; \
nop
/* 56 */
#define TEST_BLTZAL_DS(op, dest, ...) \
addu s7, zero, $31; \
li a0, 0x80000000; \
li a1, 0x7fffffff; \
bltzal a1, 1000f; \
op dest , ##__VA_ARGS__; \
op s6 , ##__VA_ARGS__; \
bne dest, s6, inst_error; \
nop; \
bltzal a0, 2000f; \
op s5 , ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
addu $31, zero, s7; \
bne s5, s6, inst_error; \
nop
#define TEST_BLTZAL_DS_MD(...) \
addu s7, zero, $31; \
li a0, 0x80000000; \
li a1, 0x7fffffff; \
li v0, 0; \
li v1, 0; \
bltzal a1, 1000f; \
##__VA_ARGS__; \
mflo v0; \
mtlo a0; \
##__VA_ARGS__; \
mflo s6; \
bne v0, s6, inst_error; \
nop; \
mtlo a0; \
bltzal a0, 2000f; \
##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
addu $31, zero, s7; \
mflo v1; \
bne v1, s6, inst_error; \
nop
/* 57 */
#define TEST_BGEZAL_DS(op, dest, ...) \
addu s7, zero, $31; \
li a0, 0x80000000; \
bgezal a0, 1000f; \
op dest , ##__VA_ARGS__; \
op s6 , ##__VA_ARGS__; \
bne dest, s6, inst_error; \
nop; \
bgezal zero, 2000f; \
op s5 , ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
addu $31, zero, s7; \
bne s5, s6, inst_error; \
nop
#define TEST_BGEZAL_DS_MD(...) \
addu s7, zero, $31; \
li a0, 0x80000000; \
li v0, 0; \
li v1, 0; \
bgezal a0, 1000f; \
##__VA_ARGS__; \
mflo v0; \
mtlo a0; \
##__VA_ARGS__; \
mflo s6; \
bne v0, s6, inst_error; \
nop; \
mtlo a0; \
bgezal zero, 2000f; \
##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
addu $31, zero, s7; \
mflo v1; \
bne v1, s6, inst_error; \
nop
/* 58 */
#define TEST_JALR_DS(op, dest, ...) \
addu s7, zero, $31; \
la a0, 2000f; \
op s6, ##__VA_ARGS__; \
jalr a0; \
op dest, ##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
addu $31, zero, s7; \
bne dest, s6, inst_error; \
nop
#define TEST_JALR_DS_MD(...) \
addu s7, zero, $31; \
la a0, 2000f; \
li v0, 0; \
li v1, 0; \
## ##__VA_ARGS__; \
mflo s6; \
mtlo a0; \
jalr a0; \
##__VA_ARGS__; \
1000: ; \
b inst_error; \
nop; \
2000: ; \
addu $31, zero, s7; \
mflo v1; \
bne v1, s6, inst_error; \
nop
/* 59 */
#define TEST_LB(data, base_addr, offset, offset_align, ref) \
LI (t1, data); \
LI (t0, base_addr); \
LI (v1, ref); \
sw t1, offset_align(t0); \
addiu a0, t0, 4; \
addiu a1, t0, -8; \
sw a0, offset_align(a0); \
sw a1, offset_align(a1); \
lb v0, offset(t0); \
lw a1, offset_align(a0); \
lw a0, offset_align(a1); \
lw a2, offset_align(a1); \
bne v0, v1, inst_error; \
nop
/* 60 */
#define TEST_LBU(data, base_addr, offset, offset_align, ref) \
LI (t1, data); \
LI (t0, base_addr); \
LI (v1, ref); \
sw t1, offset_align(t0); \
addiu a0, t0, 4; \
addiu a1, t0, -8; \
sw a0, offset_align(a0); \
sw a1, offset_align(a1); \
lbu v0, offset(t0); \
lw a1, offset_align(a0); \
lw a0, offset_align(a1); \
lw a2, offset_align(a1); \
bne v0, v1, inst_error; \
nop
/* 61 */
#define TEST_LH(data, base_addr, offset, offset_align, ref) \
LI (t1, data); \
LI (t0, base_addr); \
LI (v1, ref); \
sw t1, offset_align(t0); \
addiu a0, t0, 4; \
addiu a1, t0, -8; \
sw a0, offset_align(a0); \
sw a1, offset_align(a1); \
lh v0, offset(t0); \
lw a1, offset_align(a0); \
lw a0, offset_align(a1); \
lw a2, offset_align(a1); \
bne v0, v1, inst_error; \
nop
/* 62 */
#define TEST_LHU(data, base_addr, offset, offset_align, ref) \
LI (t1, data); \
LI (t0, base_addr); \
LI (v1, ref); \
sw t1, offset_align(t0); \
addiu a0, t0, 4; \
addiu a1, t0, -8; \
sw a0, offset_align(a0); \
sw a1, offset_align(a1); \
lhu v0, offset(t0); \
lw a1, offset_align(a0); \
lw a0, offset_align(a1); \
lw a2, offset_align(a1); \
bne v0, v1, inst_error; \
nop
/* 63 */
#define TEST_SB(init_data, data, base_addr, offset, offset_align, ref) \
LI (t2, init_data); \
LI (t1, data); \
LI (t0, base_addr); \
LI (v1, ref); \
sw t2, offset_align(t0); \
sb t1, offset(t0); \
addiu a0, t0, 4; \
addiu a1, t0, -4; \
sw a0, offset_align(a0); \
sw a1, offset_align(a1); \
lw v0, offset_align(t0); \
lw a0, offset_align(a1); \
lw a1, offset_align(a0); \
lw a2, offset_align(a1); \
bne v0, v1, inst_error; \
nop
/* 64 */
#define TEST_SH(init_data, data, base_addr, offset, offset_align, ref) \
LI (t2, init_data); \
LI (t1, data); \
LI (t0, base_addr); \
LI (v1, ref); \
sw t2, offset_align(t0); \
sh t1, offset(t0); \
addiu a0, t0, 4; \
addiu a1, t0, -4; \
sw a0, offset_align(a0); \
sw a1, offset_align(a1); \
lw v0, offset_align(t0); \
lw a0, offset_align(a1); \
lw a1, offset_align(a0); \
lw a2, offset_align(a1); \
bne v0, v1, inst_error; \
nop
/*65*/
/*66*/
/*67*/
#define TEST_ADD_OV_PRE(in_a, in_b, ref) \
li v0, ref; \
li v1, ref; \
li a0, in_a; \
li a1, in_b
/*68*/
#define TEST_ADDI_OV_PRE(in_a, in_b, ref) \
li v0, ref; \
li v1, ref; \
li a0, in_b;\
li a0, in_a
/*69*/
#define TEST_SUB_OV_PRE(in_a, in_b, ref) \
li v0, ref; \
li v1, ref; \
li a0, in_a; \
li a1, in_b
/*70*/
#define TEST_LW_ADEL(data, base_addr, offset, offset_align, ref) \
li v0, ref; \
li v1, ref; \
li a0, base_addr; \
li a1, data; \
addiu a3, a0, offset; \
sw a1, offset_align(a0)
/*71*/
#define TEST_LH_ADEL(data, base_addr, offset, offset_align, ref) \
li v0, ref; \
li v1, ref; \
li a0, base_addr; \
li a1, data; \
addiu a3, a0, offset; \
sw a1, offset_align(a0)
/*72*/
#define TEST_LHU_ADEL(data, base_addr, offset, offset_align, ref) \
li v0, ref; \
li v1, ref; \
li a0, base_addr; \
li a1, data; \
addiu a3, a0, offset; \
sw a1, offset_align(a0)
/*73*/
#define TEST_SW_ADES(data, base_addr, offset, offset_align, ref) \
li v0, ref; \
li v1, ref; \
li a0, base_addr; \
li a1, data; \
addiu a3, a0, offset; \
sw v0, offset_align(a0)
/*74*/
#define TEST_SH_ADES(data, base_addr, offset, offset_align, ref) \
li v0, ref; \
li v1, ref; \
li a0, base_addr; \
li a1, data; \
addiu a3, a0, offset; \
sw v0, offset_align(a0)
/*75*/
#define TEST_FT_ADEL(addr) \
li s4, addr; \
li a3, addr;
/*76*/
#define TEST_RI_EX(inst) \
.word inst
/*77*/
#define TEST_SOFT_INT_EX(cause_init) \
li a3, 0x0040ff01; \
li v0, 0xffffffff; \
li v1, cause_init; \
mtc0 zero, c0_count; \
mtc0 v0, c0_compare; \
mtc0 a3, c0_status; \
nop; \
mtc0 v1, c0_cause; \
1: b 1b; \
nop