public void OpRRITest()
{
var Results = new Queue<int>();
var InstructionNames = new[] { "addi", "addiu", "andi", "ori", "xori" };
var Numbers = new int[] { 0, 0, 1, -99999, 77777, -1, 0x12345678, unchecked((int)0x87654321), int.MaxValue, int.MaxValue - 1, int.MinValue, int.MinValue + 1 };
int ResultOffset = 17;
int InputOffset = 0;
foreach (var instructionName in InstructionNames)
{
for (int n = 0; n < Numbers.Length; n++)
{
string Assembly = "";
for (int m = 0; m < Numbers.Length; m++)
{
CpuThreadState.GPR[InputOffset + m] = Numbers[m];
Assembly += String.Format(
"{0} r{1}, r{2}, {3}\n",
instructionName,
m + ResultOffset,
n + InputOffset,
(Numbers[m] & 0xFFFF)
);
}
//Console.WriteLine("{0}", Assembly);
ExecuteAssembly(Assembly);
for (int m = 0; m < Numbers.Length; m++)
{
Results.Enqueue(CpuThreadState.GPR[m + ResultOffset]);
}
}
}
var ExpectedLines = new Queue<string>(stringToLines(@"
addi.0: 0,0,1,31073,12241,-1,22136,17185,-1,-2,0,1,
addi.0: 0,0,1,31073,12241,-1,22136,17185,-1,-2,0,1,
addi.1: 1,1,2,31074,12242,0,22137,17186,0,-1,1,2,
addi.-99999: -99999,-99999,-99998,-68926,-87758,-100000,-77863,-82814,-100000,-100001,-99999,-99998,
addi.77777: 77777,77777,77778,108850,90018,77776,99913,94962,77776,77775,77777,77778,
addi.-1: -1,-1,0,31072,12240,-2,22135,17184,-2,-3,-1,0,
addi.305419896: 305419896,305419896,305419897,305450969,305432137,305419895,305442032,305437081,305419895,305419894,305419896,305419897,
addi.-2023406815: -2023406815,-2023406815,-2023406814,-2023375742,-2023394574,-2023406816,-2023384679,-2023389630,-2023406816,-2023406817,-2023406815,-2023406814,
addi.2147483647: 2147483647,2147483647,-2147483648,-2147452576,-2147471408,2147483646,-2147461513,-2147466464,2147483646,2147483645,2147483647,-2147483648,
addi.2147483646: 2147483646,2147483646,2147483647,-2147452577,-2147471409,2147483645,-2147461514,-2147466465,2147483645,2147483644,2147483646,2147483647,
addi.-2147483648: -2147483648,-2147483648,-2147483647,-2147452575,-2147471407,2147483647,-2147461512,-2147466463,2147483647,2147483646,-2147483648,-2147483647,
addi.-2147483647: -2147483647,-2147483647,-2147483646,-2147452574,-2147471406,-2147483648,-2147461511,-2147466462,-2147483648,2147483647,-2147483647,-2147483646,
addiu.0: 0,0,1,31073,12241,-1,22136,17185,-1,-2,0,1,
addiu.0: 0,0,1,31073,12241,-1,22136,17185,-1,-2,0,1,
addiu.1: 1,1,2,31074,12242,0,22137,17186,0,-1,1,2,
addiu.-99999: -99999,-99999,-99998,-68926,-87758,-100000,-77863,-82814,-100000,-100001,-99999,-99998,
addiu.77777: 77777,77777,77778,108850,90018,77776,99913,94962,77776,77775,77777,77778,
addiu.-1: -1,-1,0,31072,12240,-2,22135,17184,-2,-3,-1,0,
addiu.305419896: 305419896,305419896,305419897,305450969,305432137,305419895,305442032,305437081,305419895,305419894,305419896,305419897,
addiu.-2023406815: -2023406815,-2023406815,-2023406814,-2023375742,-2023394574,-2023406816,-2023384679,-2023389630,-2023406816,-2023406817,-2023406815,-2023406814,
addiu.2147483647: 2147483647,2147483647,-2147483648,-2147452576,-2147471408,2147483646,-2147461513,-2147466464,2147483646,2147483645,2147483647,-2147483648,
addiu.2147483646: 2147483646,2147483646,2147483647,-2147452577,-2147471409,2147483645,-2147461514,-2147466465,2147483645,2147483644,2147483646,2147483647,
addiu.-2147483648: -2147483648,-2147483648,-2147483647,-2147452575,-2147471407,2147483647,-2147461512,-2147466463,2147483647,2147483646,-2147483648,-2147483647,
addiu.-2147483647: -2147483647,-2147483647,-2147483646,-2147452574,-2147471406,-2147483648,-2147461511,-2147466462,-2147483648,2147483647,-2147483647,-2147483646,
andi.0: 0,0,0,0,0,0,0,0,0,0,0,0,
andi.0: 0,0,0,0,0,0,0,0,0,0,0,0,
andi.1: 0,0,1,1,1,1,0,1,1,0,0,1,
andi.-99999: 0,0,1,31073,10561,31073,20576,16673,31073,31072,0,1,
andi.77777: 0,0,1,10561,12241,12241,1616,769,12241,12240,0,1,
andi.-1: 0,0,1,31073,12241,65535,22136,17185,65535,65534,0,1,
andi.305419896: 0,0,0,20576,1616,22136,22136,16928,22136,22136,0,0,
andi.-2023406815: 0,0,1,16673,769,17185,16928,17185,17185,17184,0,1,
andi.2147483647: 0,0,1,31073,12241,65535,22136,17185,65535,65534,0,1,
andi.2147483646: 0,0,0,31072,12240,65534,22136,17184,65534,65534,0,0,
andi.-2147483648: 0,0,0,0,0,0,0,0,0,0,0,0,
andi.-2147483647: 0,0,1,1,1,1,0,1,1,0,0,1,
ori.0: 0,0,1,31073,12241,65535,22136,17185,65535,65534,0,1,
ori.0: 0,0,1,31073,12241,65535,22136,17185,65535,65534,0,1,
ori.1: 1,1,1,31073,12241,65535,22137,17185,65535,65535,1,1,
ori.-99999: -99999,-99999,-99999,-99999,-98319,-65537,-98439,-99487,-65537,-65537,-99999,-99999,
ori.77777: 77777,77777,77777,98289,77777,131071,98297,94193,131071,131071,77777,77777,
ori.-1: -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
ori.305419896: 305419896,305419896,305419897,305430393,305430521,305463295,305419896,305420153,305463295,305463294,305419896,305419897,
ori.-2023406815: -2023406815,-2023406815,-2023406815,-2023392415,-2023395343,-2023358465,-2023401607,-2023406815,-2023358465,-2023358465,-2023406815,-2023406815,
ori.2147483647: 2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,
ori.2147483646: 2147483646,2147483646,2147483647,2147483647,2147483647,2147483647,2147483646,2147483647,2147483647,2147483646,2147483646,2147483647,
ori.-2147483648: -2147483648,-2147483648,-2147483647,-2147452575,-2147471407,-2147418113,-2147461512,-2147466463,-2147418113,-2147418114,-2147483648,-2147483647,
ori.-2147483647: -2147483647,-2147483647,-2147483647,-2147452575,-2147471407,-2147418113,-2147461511,-2147466463,-2147418113,-2147418113,-2147483647,-2147483647,
xori.0: 0,0,1,31073,12241,65535,22136,17185,65535,65534,0,1,
xori.0: 0,0,1,31073,12241,65535,22136,17185,65535,65534,0,1,
xori.1: 1,1,0,31072,12240,65534,22137,17184,65534,65535,1,0,
xori.-99999: -99999,-99999,-100000,-131072,-108880,-96610,-119015,-116160,-96610,-96609,-99999,-100000,
xori.77777: 77777,77777,77776,87728,65536,118830,96681,93424,118830,118831,77777,77776,
xori.-1: -1,-1,-2,-31074,-12242,-65536,-22137,-17186,-65536,-65535,-1,-2,
xori.305419896: 305419896,305419896,305419897,305409817,305428905,305441159,305397760,305403225,305441159,305441158,305419896,305419897,
xori.-2023406815: -2023406815,-2023406815,-2023406816,-2023409088,-2023396112,-2023375650,-2023418535,-2023424000,-2023375650,-2023375649,-2023406815,-2023406816,
xori.2147483647: 2147483647,2147483647,2147483646,2147452574,2147471406,2147418112,2147461511,2147466462,2147418112,2147418113,2147483647,2147483646,
xori.2147483646: 2147483646,2147483646,2147483647,2147452575,2147471407,2147418113,2147461510,2147466463,2147418113,2147418112,2147483646,2147483647,
xori.-2147483648: -2147483648,-2147483648,-2147483647,-2147452575,-2147471407,-2147418113,-2147461512,-2147466463,-2147418113,-2147418114,-2147483648,-2147483647,
xori.-2147483647: -2147483647,-2147483647,-2147483648,-2147452576,-2147471408,-2147418114,-2147461511,-2147466464,-2147418114,-2147418113,-2147483647,-2147483648,
"));
foreach (var instructionName in InstructionNames)
{
foreach (var LeftNumber in Numbers)
{
var Line = String.Format("{0}.{1}: ", instructionName, LeftNumber);
foreach (var RightNumber in Numbers)
{
Line += String.Format("{0},", Results.Dequeue());
}
//Console.WriteLine(Line);
Assert.AreEqual(ExpectedLines.Dequeue(), Line);
}
}
}