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