diff options
| author | Sonicadvance1 <sonicadvance1@gmail.com> | 2010-03-29 09:26:19 +0000 |
|---|---|---|
| committer | Sonicadvance1 <sonicadvance1@gmail.com> | 2010-03-29 09:26:19 +0000 |
| commit | 85a1b2af455157e38a40faa427909f950e9d41d2 (patch) | |
| tree | ab8b482a6330f79d362d74e929f49565cc4d7daf /Source/TestSuite/ASM/source/asm_tables.cpp | |
| parent | a8865d21b32f50b45f48cd1f8e4d1cafc5486585 (diff) | |
This should largely go unnoticed
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5251 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/TestSuite/ASM/source/asm_tables.cpp')
| -rw-r--r-- | Source/TestSuite/ASM/source/asm_tables.cpp | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/Source/TestSuite/ASM/source/asm_tables.cpp b/Source/TestSuite/ASM/source/asm_tables.cpp new file mode 100644 index 0000000000..150256f831 --- /dev/null +++ b/Source/TestSuite/ASM/source/asm_tables.cpp @@ -0,0 +1,177 @@ +#include "asm_tables.h" +#include "Init.h" +#include "Helpers.h" + +// Limited Test, Later have a test that will pass all possible variables +u32 inval_table[][2] = { + {0,0}, + {1,1}, + {300,0}, + {1,0}, + {0xffff,0}, + {0xffffffff,0}, + {0x80000000,0}, + {0x80000000,1}, + {0x80000000,2}, + {0x7fffffff,0}, + {0x7fffffff,1}, + {0x7fffffff,2}, + {0,1}, + {0,0xffff}, + {0,0xffffffff}, + {0,0x80000000}, + {1,0x80000000}, + {2,0x80000000}, + {0,0x7fffffff}, + {1,0x7fffffff}, + {2,0x7fffffff}, + {654321,0}, + {4653321,0}, + {0,300}, + {1024,8}, + {8,1024}, + {0xffff,0xffff}, + {0xffffffff,0xffffffff} +}; +void Print(const char* text) +{ + printf(text); + fprintf(f, text); +} +void ShowModifies(u32 inst) +{ + u32 mod = instructions[inst].Modifies; + if(mod == 0) + { + Print("NONE"); + return; + } + if(mod & MOD_CR0) + Print("CR0 "); + if(mod & MOD_CR1) + Print("CR1 "); + if(mod & MOD_SR) + Print("SR "); + if(mod & MOD_XER) + Print("XER "); +} +void RunInstruction(u32 inst) +{ + u32 inval1, inval2, inval3; + + u32 outval = 0; + + // CR0 + u32 cr1 = 0, cr2 = 0; + + //CR1 + u32 cr11 = 0, cr12 = 0; + + //XER + u32 xer1 = 0, xer2 = 0; + + bool modCR0 = instructions[inst].Modifies & MOD_CR0; + bool modCR1 = instructions[inst].Modifies & MOD_CR1; + bool modXER = instructions[inst].Modifies & MOD_XER; + + if(instructions[inst].numInput != 3) + { + Print("Don't support Input not 3 yet~!\n"); + fclose(f); + return; + } + if(instructions[inst].type != TYPE_INTEGER) + { + Print("Types other than TYPE_INTEGER not supported yet!\n"); + fclose(f); + return; + } + char temp[32]; + sprintf(temp, "logs/%s.dolphin.jit.log", instructions[inst].name); + f = fopen(temp, "wb"); + if (!f) + printf("unable to open output file\n"); + + printf("%s: InputNum: %d Modifies(flags): ", instructions[inst].name, instructions[inst].numInput); + fprintf(f, "%s: InputNum: %d Modifies(flags): ", instructions[inst].name, instructions[inst].numInput); + ShowModifies(inst); + Print("\n"); + + for (unsigned int i = 0; i < sizeof(inval_table)/(sizeof(int)*2); i++) + { + inval1 = inval_table[i][0]; + inval2 = inval_table[i][1]; + + // Show our input values and where we are at on the array + printf("\x1b[%i;0H", i); + printf("%07i: %08x,%08x",i, inval1,inval2); + + // Get flags before + if(modCR0) + cr1 = GetCR0(); + if(modCR1) + cr11 = GetCR(1); + if(modXER) + xer1 = GetXER(); + + //Actually call instruction + instructions[inst].Call(&outval, &inval1, &inval2, 0); + + // Get flags after + if(modCR0) + cr2 = GetCR0(); + if(modCR1) + cr12 = GetCR(1); + if(modXER) + xer2 = GetXER(); + + // Print out value + printf(":o=%08x\n\t", outval); + + // show off flag changes + if(modCR0) + printf("CR0:(%08x ~ %08x)", cr1,cr2); + if(modCR1) + printf("CR1:(%08x ~ %08x)", cr11,cr12); + if(modXER) + printf("XER:(%08x ~ %08x)", xer1, xer2); + + + // same in the file + fprintf(f, ":i=%08x, %08x:o=%08x\n\t", inval1,inval2, outval); + if(modCR0) + fprintf(f, "CR0:(%08x ~ %08x)", cr1,cr2); + if(modCR1) + fprintf(f, "CR1:(%08x ~ %08x)", cr11,cr12); + if(modXER) + fprintf(f, "XER:(%08x ~ %08x)", xer1, xer2); + + // see the difference in flags if any + if(modCR0) + { + u32 cr_diff = cr2&~cr1; + if (cr_diff) { + printf(" CR0D:%08x",cr_diff); + fprintf(f, " CR0D:%08x",cr_diff); + } + } + if(modCR1) + { + u32 cr1_diff = cr12&~cr11; + if (cr1_diff) { + printf(" CR1D:%08x",cr1_diff); + fprintf(f, " CR1D:%08x",cr1_diff); + } + } + if(modXER) + { + u32 xer_diff = xer2&~xer1; + if (xer_diff) { + printf(" XERD:%08x",xer_diff); + fprintf(f, " XERD:%08x",xer_diff); + } + } + fprintf(f,"\n"); + } + fclose(f); +}
\ No newline at end of file |
