mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 16:36:21 +00:00
375 lines
18 KiB
C
375 lines
18 KiB
C
#include <stdio.h>
|
|
#include "const.h"
|
|
|
|
const float reg_val_f[] = {
|
|
-347856.475, 356047.56, -1.0, 23.04,
|
|
1752, 0.0024575, 0.00000001, -248562.76,
|
|
1384.6, -7.2945676, 1000000000, -5786.47,
|
|
-347856.475, 356047.56, -1.0, 23.04,
|
|
0, 456.2489562, 3, -1,
|
|
-45786.476, 456.2489562, 34.00046, 45786.476,
|
|
0, 456.2489562, 3, -1,
|
|
1384.6, -7.2945676, 1000000000, -5786.47,
|
|
1752, 0.0024575, 0.00000001, -248562.76,
|
|
-45786.476, 456.2489562, 34.00046, 45786.476,
|
|
1752065, 107, -45667.24, -7.2945676,
|
|
-347856.475, 356047.56, -1.0, 23.04,
|
|
-347856.475, 356047.56, -1.0, 23.04,
|
|
1752, 0.0024575, 0.00000001, -248562.76,
|
|
1384.6, -7.2945676, 1000000000, -5786.47,
|
|
-347856.475, 356047.56, -1.0, 23.04,
|
|
0, 456.2489562, 3, -1,
|
|
-45786.476, 456.2489562, 34.00046, 45786.476,
|
|
0, 456.2489562, 3, -1,
|
|
1384.6, -7.2945676, 1000000000, -5786.47,
|
|
1752, 0.0024575, 0.00000001, -248562.76,
|
|
-45786.476, 456.2489562, 34.00046, 45786.476,
|
|
1752065, 107, -45667.24, -7.2945676,
|
|
-347856.475, 356047.56, -1.0, 23.04
|
|
};
|
|
|
|
const float fs1_f[] = {
|
|
0, 456.2489562, 3, -1,
|
|
1384.6, -7.2945676, 1000000000, -5786.47,
|
|
1752, 0.0024575, 0.00000001, -248562.76,
|
|
-45786.476, 456.2489562, 34.00046, 45786.476,
|
|
1752065, 107, -45667.24, -7.2945676,
|
|
-347856.475, 356047.56, -1.0, 23.04
|
|
};
|
|
|
|
const double fs2_f[] = {
|
|
0, 456.2489562, 3, -1,
|
|
-7.2945676, 1384.6, 1000000000, -5786.47,
|
|
1752, 0.0024575, -248562.76, 0.00000001,
|
|
-45786.476, 45786.476, 456.2489562, 34.00046,
|
|
1752065, 107, -45667.24, -7.2945676,
|
|
-347856.475, 23.04 -1.0, 356047.56
|
|
};
|
|
|
|
#if defined(__mips_hard_float)
|
|
#define TEST1(mem) \
|
|
{ \
|
|
unsigned long long out; \
|
|
__asm__ __volatile__( \
|
|
".set noreorder" "\n\t" \
|
|
".set nomacro" "\n\t" \
|
|
"move $t0, %1" "\n\t" \
|
|
"mtc1 $t0, $f0" "\n\t" \
|
|
"mov.s $f1, $f0" "\n\t" \
|
|
"mfc1 $t1, $f1" "\n\t" \
|
|
"move %0, $t1" "\n\t" \
|
|
".set reorder" "\n\t" \
|
|
".set macro" "\n\t" \
|
|
: "=r" (out) \
|
|
: "r" (mem) \
|
|
: "t0", "t1", "$f0", "$f1" \
|
|
); \
|
|
printf("mtc1, mov.s, mfc1 :: mem: 0x%llx out: 0x%llx\n", \
|
|
(long long)mem, out); \
|
|
}
|
|
|
|
#define TEST2(mem) \
|
|
{ \
|
|
unsigned long long out; \
|
|
__asm__ __volatile__( \
|
|
".set noreorder" "\n\t" \
|
|
".set nomacro" "\n\t" \
|
|
"move $t0, %1" "\n\t" \
|
|
"dmtc1 $t0, $f2" "\n\t" \
|
|
"mov.d $f0, $f2" "\n\t" \
|
|
"dmfc1 $t1, $f0" "\n\t" \
|
|
"move %0, $t1" "\n\t" \
|
|
".set reorder" "\n\t" \
|
|
".set macro" "\n\t" \
|
|
: "=r" (out) \
|
|
: "r" (mem) \
|
|
: "t0", "t1", "$f0", "$f2" \
|
|
); \
|
|
printf("dmtc1, mov.d, dmfc1 :: mem: 0x%llx out: 0x%llx\n", \
|
|
(long long)mem, out); \
|
|
}
|
|
|
|
/* movX.s fd, fs */
|
|
#define TEST3(instruction, FD, FS, cc, offset) \
|
|
{ \
|
|
unsigned int out; \
|
|
__asm__ __volatile__( \
|
|
"li $t0, 1" "\n\t" \
|
|
"move $t1, %1" "\n\t" \
|
|
"mtc1 $t0, $f0" "\n\t" \
|
|
"mtc1 $t1, $f2" "\n\t" \
|
|
"dmtc1 $zero, $"#FD "\n\t" \
|
|
"dmtc1 $zero, $"#FS "\n\t" \
|
|
"c.eq.s $f0, $f2" "\n\t" \
|
|
"move $t0, %2" "\n\t" \
|
|
"lwc1 $"#FS", "#offset"($t0)" "\n\t" \
|
|
instruction "\n\t" \
|
|
"mfc1 %0, $"#FD "\n\t" \
|
|
: "=r" (out) \
|
|
: "r" (cc), "r" (reg_val_f) \
|
|
: "t0", "t1", "$"#FD, "$"#FS, "$f0", "$f2" \
|
|
); \
|
|
printf("%s :: out: 0x%x, cc: %d\n", \
|
|
instruction, out, cc); \
|
|
}
|
|
|
|
/* movX.d fd, fs */
|
|
#define TEST3d(instruction, FD, FS, cc, offset) \
|
|
{ \
|
|
unsigned long long out; \
|
|
__asm__ __volatile__( \
|
|
"li $t0, 1" "\n\t" \
|
|
"move $t1, %1" "\n\t" \
|
|
"mtc1 $t0, $f0" "\n\t" \
|
|
"mtc1 $t1, $f2" "\n\t" \
|
|
"dmtc1 $zero, $"#FD "\n\t" \
|
|
"c.eq.s $f0, $f2" "\n\t" \
|
|
"move $t0, %2" "\n\t" \
|
|
"ldc1 $"#FS", "#offset"($t0)" "\n\t" \
|
|
instruction "\n\t" \
|
|
"dmfc1 %0, $"#FD "\n\t" \
|
|
: "=r" (out) \
|
|
: "r" (cc), "r" (reg_val_f) \
|
|
: "t0", "t1", "$"#FD, "$"#FS, "$f0", "$f2" \
|
|
); \
|
|
printf("%s :: out: 0x%llx, cc: %d\n", \
|
|
instruction, out, cc); \
|
|
}
|
|
|
|
/* movX.s fd, fs, rt */
|
|
#define TEST4(instruction, offset, RTval, FD, FS, RT) \
|
|
{ \
|
|
unsigned int out; \
|
|
__asm__ __volatile__( \
|
|
"move $"#RT", %2" "\n\t" \
|
|
"dmtc1 $zero, $"#FD "\n\t" \
|
|
"dmtc1 $zero, $"#FS "\n\t" \
|
|
"move $t0, %1" "\n\t" \
|
|
"lwc1 $"#FS", "#offset"($t0)" "\n\t" \
|
|
instruction "\n\t" \
|
|
"mfc1 %0, $"#FD"\n\t" \
|
|
: "=r" (out) \
|
|
: "r" (reg_val_f), "r" (RTval) \
|
|
: "t0", #RT, "$"#FD, "$"#FS \
|
|
); \
|
|
printf("%s :: out: 0x%x\n", instruction, out); \
|
|
}
|
|
|
|
/* movX.d fd, fs, rt */
|
|
#define TEST4d(instruction, offset, RTval, FD, FS, RT) \
|
|
{ \
|
|
unsigned long long out; \
|
|
__asm__ __volatile__( \
|
|
"move $"#RT", %2" "\n\t" \
|
|
"dmtc1 $zero, $"#FD "\n\t" \
|
|
"dmtc1 $zero, $"#FS "\n\t" \
|
|
"move $t0, %1" "\n\t" \
|
|
"ldc1 $"#FS", "#offset"($t0)" "\n\t" \
|
|
instruction "\n\t" \
|
|
"dmfc1 %0, $"#FD "\n\t" \
|
|
: "=r" (out) \
|
|
: "r" (reg_val_f), "r" (RTval) \
|
|
: #RT, "t0", "$"#FD, "$"#FS \
|
|
); \
|
|
printf("%s :: out: 0x%llx\n", instruction, out); \
|
|
}
|
|
|
|
/* movf, movt */
|
|
#define TEST5(instruction, RDval, RSval, RD, RS) \
|
|
{ \
|
|
unsigned long out; \
|
|
__asm__ __volatile__( \
|
|
"c.eq.s %3, %4" "\n\t" \
|
|
"move $"#RD", %1" "\n\t" \
|
|
"move $"#RS", %2" "\n\t" \
|
|
instruction" $"#RD", $"#RS", $fcc0" "\n\t" \
|
|
"move %0, $"#RD "\n\t" \
|
|
: "=r" (out) \
|
|
: "r" (RDval), "r" (RSval), "f" (fs1_f[i]), "f" (fs2_f[i]) \
|
|
: #RD, #RS \
|
|
); \
|
|
printf("%s :: RDval: 0x%x, RSval: 0x%x, out: 0x%lx\n", \
|
|
instruction, RDval, RSval, out); \
|
|
}
|
|
#endif
|
|
|
|
int main()
|
|
{
|
|
#if defined(__mips_hard_float)
|
|
int i;
|
|
init_reg_val2();
|
|
|
|
for (i = 0; i < N; i++) {
|
|
TEST1(reg_val1[i]);
|
|
TEST2(reg_val1[i]);
|
|
TEST1(reg_val2[i]);
|
|
TEST2(reg_val2[i]);
|
|
}
|
|
|
|
printf("--- MOVF.S ---\n");
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 1, 0);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 1, 8);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 1, 16);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 1, 24);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 1, 32)
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 1, 40)
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 1, 48)
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 1, 56)
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 0, 0);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 0, 8);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 0, 16);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 0, 24);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 0, 32);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 0, 40);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 0, 48);
|
|
TEST3("movf.s $f4, $f6, $fcc0", f4, f6, 0, 56);
|
|
|
|
printf("--- MOVF.D ---\n");
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 1, 0);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 1, 8);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 1, 16);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 1, 24);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 1, 32);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 1, 40)
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 1, 48)
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 1, 56)
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 0, 0);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 0, 8);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 0, 16);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 0, 24);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 0, 32);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 0, 40);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 0, 48);
|
|
TEST3d("movf.d $f4, $f6, $fcc0", f4, f6, 0, 56);
|
|
|
|
printf("--- MOVN.S ---\n");
|
|
TEST4("movn.s $f0, $f2, $11", 0, 0, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 0, 1, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 8, 0xffff, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 16, -1, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 16, 5, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 24, 0, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 24, 0, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 32, 5, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 32, 125487, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 40, 68, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 40, -122544, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 48, 0, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 48, 0, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 56, 0xffffffff, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 56, 0x80000000, f0, f2, 11);
|
|
TEST4("movn.s $f0, $f2, $11", 64, 0x7fffffff, f0, f2, 11);
|
|
|
|
printf("--- MOVN.D ---\n");
|
|
TEST4d("movn.d $f0, $f2, $11", 0, 0, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 0, 1, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 8, 0xffff, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 8, -1, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 16, 5, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 24, 0, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 24, 0, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 32, 5, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 32, 125487, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 40, 68, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 40, -122544, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 48, 0, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 48, 0, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 56, 0xffffffff, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 56, 0x80000000, f0, f2, 11);
|
|
TEST4d("movn.d $f0, $f2, $11", 64, 0x7fffffff, f0, f2, 11);
|
|
|
|
printf("--- MOVT.S ---\n");
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 1, 0);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 1, 0);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 1, 8);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 1, 16);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 1, 24);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 1, 32);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 1, 40)
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 1, 48)
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 1, 56)
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 0, 0);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 0, 8);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 0, 16);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 0, 24);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 0, 32);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 0, 40);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 0, 48);
|
|
TEST3("movt.s $f4, $f6, $fcc0", f4, f6, 0, 56);
|
|
|
|
printf("--- MOVT.D ---\n");
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 1, 0);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 1, 0);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 1, 8);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 1, 16);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 1, 24);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 1, 32);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 1, 40)
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 1, 48)
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 1, 56)
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 0, 0);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 0, 8);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 0, 16);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 0, 24);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 0, 32);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 0, 40);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 0, 48);
|
|
TEST3d("movt.d $f4, $f6, $fcc0", f4, f6, 0, 56);
|
|
|
|
printf("--- MOVZ.S ---\n");
|
|
TEST4("movz.s $f0, $f2, $11", 0, 0, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 8, 1, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 8, 0xffff, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 16, -1, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 16, 5, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 24, 0, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 24, 0, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 32, 5, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 32, 125487, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 40, 68, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 40, -122544, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 48, 0, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 48, 0, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 56, 0xffffffff, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 56, 0x80000000, f0, f2, 11);
|
|
TEST4("movz.s $f0, $f2, $11", 64, 0x7fffffff, f0, f2, 11);
|
|
|
|
printf("--- MOVZ.D ---\n");
|
|
TEST4d("movz.d $f0, $f2, $11", 0, 0, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 0, 1, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 8, 0xffff, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 16, -1, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 16, 5, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 24, 0, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 24, 0, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 32, 5, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 32, 125487, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 40, 68, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 40, -122544, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 48, 0, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 48, 0, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 56, 0xffffffff, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 56, 0x80000000, f0, f2, 11);
|
|
TEST4d("movz.d $f0, $f2, $11", 64, 0x7fffffff, f0, f2, 11);
|
|
|
|
printf("--- MOVF --- if FPConditionalCode(cc) == 0 then "
|
|
"out = RSval else out = RDval\n");
|
|
for (i = 0; i < 24; i++) {
|
|
TEST5("movf", 0xaaaaaaaa, 0x80000000, t0, t1);
|
|
TEST5("movf", 0xccccffff, 0xffffffff, t1, t2);
|
|
TEST5("movf", 0xffffaaaa, 0xaaaaffff, t3, t1);
|
|
TEST5("movf", 0x0, 0xffffffff, t3, t0);
|
|
}
|
|
|
|
printf("--- MOVT --- if FPConditionalCode(cc) == 1 then "
|
|
"out = RSval else out = RDval\n");
|
|
for (i = 0; i < 24; i++) {
|
|
TEST5("movt", 0x0, 0xffffffff, t0, t1);
|
|
TEST5("movt", 0x11111111, 0xeeeeffff, t1, t2);
|
|
TEST5("movt", 0x5555ffff, 0xffffffff, t3, t1);
|
|
TEST5("movt", 0xeeeeeeee, 0xffffeeee, t3, t0);
|
|
}
|
|
#endif
|
|
return 0;
|
|
}
|