#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;
}