git-svn-id: http://svn.purei.org/purei/trunk@135 b36208d7-6611-0410-8bec-b1987f11c4a2

This commit is contained in:
jpd002 2007-03-27 13:18:18 +00:00
parent a386c1ed84
commit fc3bb74573
12 changed files with 446 additions and 45 deletions

View File

@ -4,8 +4,8 @@ Microsoft Visual Studio Solution File, Format Version 9.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Purei", "Purei.vcproj", "{DF7BEC15-DC00-4C86-94AF-72CA742590CC}"
ProjectSection(ProjectDependencies) = postProject
{CF8E8640-24C8-49F1-B510-CF5BB945F99C} = {CF8E8640-24C8-49F1-B510-CF5BB945F99C}
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A} = {9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}
{8AD44184-94A7-461B-8076-CE4455B7559A} = {8AD44184-94A7-461B-8076-CE4455B7559A}
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A} = {9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib-1.2.3", "..\zlib-1.2.3\zlib-1.2.3.vcproj", "{8AD44184-94A7-461B-8076-CE4455B7559A}"
@ -62,7 +62,8 @@ Global
{CF8E8640-24C8-49F1-B510-CF5BB945F99C}.Release|x64.Build.0 = Release|x64
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}.Debug|Win32.ActiveCfg = Debug|Win32
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}.Debug|Win32.Build.0 = Debug|Win32
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}.Debug|x64.ActiveCfg = Debug|Win32
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}.Debug|x64.ActiveCfg = Debug|x64
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}.Debug|x64.Build.0 = Debug|x64
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}.Debug+|Win32.ActiveCfg = Debug|Win32
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}.Debug+|Win32.Build.0 = Debug|Win32
{9B46B4A7-0FBD-44FD-8E9C-BC2CBA64643A}.Debug+|x64.ActiveCfg = Debug|Win32

View File

@ -1,11 +1,123 @@
#include "MIPSAssembler.h"
#include "MIPS.h"
#include <boost/tokenizer.hpp>
#include <boost/function.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/bind.hpp>
#include "lexical_cast_ex.h"
using namespace boost;
using namespace std;
struct RtRsImm
{
typedef void (CMIPSAssembler::*AssemblerFunctionType) (unsigned int, unsigned int, uint16);
RtRsImm(AssemblerFunctionType Assembler) :
m_Assembler(Assembler)
{
}
void operator ()(tokenizer<>& Tokens, tokenizer<>::iterator& itToken, CMIPSAssembler* pAssembler)
{
unsigned int nRT, nRS;
uint16 nImm;
if(itToken == Tokens.end()) throw exception();
nRT = CMIPSAssembler::GetRegisterIndex((*(++itToken)).c_str());
if(itToken == Tokens.end()) throw exception();
nRS = CMIPSAssembler::GetRegisterIndex((*(++itToken)).c_str());
if(itToken == Tokens.end()) throw exception();
nImm = lexical_cast_hex<string>((*(++itToken)).c_str());
if(nRT == -1) throw exception();
if(nRS == -1) throw exception();
bind(m_Assembler, pAssembler, _1, _2, _3)(nRT, nRS, nImm);
}
AssemblerFunctionType m_Assembler;
};
struct RtRsSa
{
typedef void (CMIPSAssembler::*AssemblerFunctionType) (unsigned int, unsigned int, unsigned int);
RtRsSa(AssemblerFunctionType Assembler) :
m_Assembler(Assembler)
{
}
void operator()(tokenizer<>& Tokens, tokenizer<>::iterator& itToken, CMIPSAssembler* pAssembler)
{
unsigned int nRT, nRS, nSA;
if(itToken == Tokens.end()) throw exception();
nRT = CMIPSAssembler::GetRegisterIndex((*(++itToken)).c_str());
if(itToken == Tokens.end()) throw exception();
nRS = CMIPSAssembler::GetRegisterIndex((*(++itToken)).c_str());
if(itToken == Tokens.end()) throw exception();
nSA = lexical_cast<unsigned int>((*(++itToken)).c_str());
if(nRT == -1) throw exception();
if(nRS == -1) throw exception();
bind(m_Assembler, pAssembler, _1, _2, _3)(nRT, nRS, nSA);
}
AssemblerFunctionType m_Assembler;
};
struct Instruction
{
Instruction(const char* sMnemonic) :
m_sMnemonic(sMnemonic)
{
}
const char* m_sMnemonic;
virtual void Invoke(tokenizer<>&, tokenizer<>::iterator&, CMIPSAssembler*) = 0;
};
template <typename Functor>
struct SpecInstruction : public Instruction
{
SpecInstruction(const char* sMnemonic, const Functor& Parser) :
Instruction(sMnemonic),
m_Parser(Parser)
{
}
virtual void Invoke(tokenizer<>& Tokens, tokenizer<>::iterator& itToken, CMIPSAssembler* pAssembler)
{
m_Parser(Tokens, itToken, pAssembler);
}
Functor m_Parser;
};
SpecInstruction<RtRsImm> Instruction_ADDIU = SpecInstruction<RtRsImm>("ADDIU", RtRsImm(&CMIPSAssembler::ADDIU));
SpecInstruction<RtRsSa> Instruction_SLL = SpecInstruction<RtRsSa>("SLL", RtRsSa(&CMIPSAssembler::SLL));
SpecInstruction<RtRsSa> Instruction_SRA = SpecInstruction<RtRsSa>("SRA", RtRsSa(&CMIPSAssembler::SRA));
Instruction* Instrs[] =
{
&Instruction_ADDIU,
&Instruction_SLL,
&Instruction_SRA,
NULL,
};
CMIPSAssembler::CMIPSAssembler(uint32* pPtr)
{
m_pPtr = pPtr;
@ -336,24 +448,21 @@ void CMIPSAssembler::AssembleString(const char* sCode)
//First token must be the instruction mnemonic
sMnemonic = (*itToken).c_str();
if(!strcmp(sMnemonic, "ADDIU"))
bool nFound(false);
for(unsigned int i = 0; Instrs[i] != NULL; i++)
{
unsigned int nRT, nRS;
uint16 nImm;
if(!strcmp(Instrs[i]->m_sMnemonic, sMnemonic))
{
Instrs[i]->Invoke(Tokens, itToken, this);
nFound = true;
break;
}
}
if(itToken == Tokens.end()) throw exception();
nRT = GetRegisterIndex((*(++itToken)).c_str());
if(itToken == Tokens.end()) throw exception();
nRS = GetRegisterIndex((*(++itToken)).c_str());
if(itToken == Tokens.end()) throw exception();
nImm = lexical_cast_hex<string>((*(++itToken)).c_str());
if(nRT == -1) throw exception();
if(nRS == -1) throw exception();
ADDIU(nRT, nRS, nImm);
if(nFound == false)
{
throw runtime_error("Invalid mnemonic specified.");
}
}

View File

@ -49,6 +49,23 @@ CMipsTestEngine::CValueSet* CMipsTestEngine::GetInput(unsigned int nId)
return (itInput != m_InputsById.end()) ? (itInput->second) : (NULL);
}
CMipsTestEngine::CValueSet* CMipsTestEngine::GetOutput(unsigned int nInputId, unsigned int nInstanceId)
{
for(OutputsType::iterator itOutput(m_Outputs.begin());
itOutput != m_Outputs.end(); itOutput++)
{
if(
(itOutput->GetInputId() == nInputId) &&
(itOutput->GetInstanceId() == nInstanceId)
)
{
return &(*itOutput);
}
}
return NULL;
}
CMipsTestEngine::CInstance* CMipsTestEngine::GetInstance(unsigned int nId)
{
InstancesByIdMapType::iterator itInstance;
@ -144,6 +161,16 @@ unsigned int CMipsTestEngine::CValueSet::GetInstanceId() const
return m_nInstanceId;
}
CMipsTestEngine::CValueSet::ValueIterator CMipsTestEngine::CValueSet::GetValuesBegin() const
{
return m_Values.begin();
}
CMipsTestEngine::CValueSet::ValueIterator CMipsTestEngine::CValueSet::GetValuesEnd() const
{
return m_Values.end();
}
void CMipsTestEngine::CValueSet::AssembleLoad(CMIPSAssembler& Assembler)
{
for(ValueListType::iterator itValue(m_Values.begin());
@ -258,17 +285,25 @@ void CMipsTestEngine::CRegisterValue::AssembleLoad(CMIPSAssembler& Assembler)
nHalf[2] = (m_nValue1 >> 0) & 0xFFFF;
nHalf[3] = (m_nValue1 >> 16) & 0xFFFF;
Assembler.LUI(m_nRegister, nHalf[1]);
Assembler.ORI(m_nRegister, m_nRegister, nHalf[0]);
nSignExtension = ((m_nValue0 & 0x80000000) == 0) ? (0x00000000) : (0xFFFFFFFF);
if(m_nValue1 != nSignExtension)
{
Assembler.DSRL(m_nRegister, m_nRegister, 4);
Assembler.ORI(m_nRegister, m_nRegister, nHalf[2]);
Assembler.DSRL(m_nRegister, m_nRegister, 4);
Assembler.ORI(m_nRegister, m_nRegister, nHalf[3]);
Assembler.ADDIU(m_nRegister, 0, 0x0000);
for(int i = 3; i >= 0; i--)
{
Assembler.ORI(m_nRegister, m_nRegister, nHalf[i]);
if(i != 0)
{
Assembler.DSLL(m_nRegister, m_nRegister, 16);
}
}
}
else
{
Assembler.LUI(m_nRegister, nHalf[1]);
Assembler.ORI(m_nRegister, m_nRegister, nHalf[0]);
}
}
}
@ -287,3 +322,10 @@ bool CMipsTestEngine::CRegisterValue::Verify(CMIPS& Context)
return true;
}
string CMipsTestEngine::CRegisterValue::GetString() const
{
return string(CMIPS::m_sGPRName[m_nRegister]) +
": 0x" + lexical_cast_hex<string>(m_nValue1, 8) +
" 0x" + lexical_cast_hex<string>(m_nValue0, 8);
}

View File

@ -12,39 +12,48 @@ public:
class CValue
{
public:
virtual ~CValue();
virtual void AssembleLoad(CMIPSAssembler&) = 0;
virtual bool Verify(CMIPS&) = 0;
virtual ~CValue();
virtual void AssembleLoad(CMIPSAssembler&) = 0;
virtual bool Verify(CMIPS&) = 0;
virtual std::string GetString() const = 0;
};
class CRegisterValue : public CValue
{
public:
CRegisterValue(Framework::Xml::CNode*);
virtual ~CRegisterValue();
virtual void AssembleLoad(CMIPSAssembler&);
virtual bool Verify(CMIPS&);
CRegisterValue(Framework::Xml::CNode*);
virtual ~CRegisterValue();
virtual void AssembleLoad(CMIPSAssembler&);
virtual bool Verify(CMIPS&);
virtual std::string GetString() const;
private:
unsigned int m_nRegister;
unsigned int m_nValue0;
unsigned int m_nValue1;
unsigned int m_nRegister;
unsigned int m_nValue0;
unsigned int m_nValue1;
};
class CValueSet
{
private:
typedef boost::ptr_list<CValue> ValueListType;
public:
typedef ValueListType::const_iterator ValueIterator;
CValueSet(Framework::Xml::CNode*);
virtual ~CValueSet();
unsigned int GetInputId() const;
unsigned int GetInstanceId() const;
ValueIterator GetValuesBegin() const;
ValueIterator GetValuesEnd() const;
void AssembleLoad(CMIPSAssembler&);
bool Verify(CMIPS&);
private:
typedef boost::ptr_list<CValue> ValueListType;
unsigned int m_nInputId;
unsigned int m_nInstanceId;
@ -77,6 +86,7 @@ public:
OutputsType::iterator GetOutputsEnd();
CValueSet* GetInput(unsigned int);
CValueSet* GetOutput(unsigned int, unsigned int);
CInstance* GetInstance(unsigned int);
private:

Binary file not shown.

View File

@ -94,7 +94,7 @@ BEGIN
MENUITEM "&Functions\tCtrl+F", ID_VIEW_FUNCTIONS
MENUITEM "&ELF File Information", ID_VIEW_ELF
MENUITEM "OS Events", ID_VIEW_OSEVENTS
MENUITEM "Test Engine Console", ID_VIEW_TESTENGINECONSOLE
MENUITEM "Test Engine Console\tCtrl+T", ID_VIEW_TESTENGINECONSOLE
MENUITEM SEPARATOR
MENUITEM "EmotionEngine View\tAlt+1", ID_VIEW_EEVIEW
MENUITEM "Vector Unit 1 View\tAlt+3", ID_VIEW_VU1VIEW

View File

@ -2,6 +2,8 @@
#include "win32/Rect.h"
#include <boost/filesystem/operations.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/bind.hpp>
#include <boost/algorithm/string.hpp>
#include "string_cast.h"
#include "../PS2VM.h"
@ -38,8 +40,10 @@ m_pTestAllButton(NULL)
m_pInstructionList->GetHeader()->InsertItem(_T("Error"), 100);
m_pTestAllButton = new Win32::CButton(_T("Test All"), m_hWnd, Win32::CRect(0, 0, 1, 1));
m_pDescriptionEdit = new Win32::CEdit(m_hWnd, Win32::CRect(0, 0, 1, 1), NULL, ES_READONLY | ES_MULTILINE | WS_VSCROLL);
m_Layout.InsertObject(new Win32::CLayoutWindow(1, 1, 1, 1, m_pInstructionList));
m_Layout.InsertObject(new Win32::CLayoutWindow(1, 1, 1, 1, m_pDescriptionEdit));
{
CHorizontalLayout* pTempLayout(new CHorizontalLayout());
@ -83,7 +87,10 @@ long CTestEngineWnd::OnNotify(WPARAM wParam, NMHDR* pHdr)
switch(pMsg->code)
{
case NM_DBLCLK:
OnItemDblClick();
ProcessListEvent(bind(&CTestEngineWnd::OnItemDblClick, this, _1, _2));
break;
case TVN_SELCHANGED:
ProcessListEvent(bind(&CTestEngineWnd::OnListSelChange, this, _1, _2));
break;
}
}
@ -109,6 +116,9 @@ void CTestEngineWnd::Test(INSTRUCTION& Instruction)
nFailed = nSuccess = nError = nTotal = 0;
//Delete all existing nodes
m_pInstructionList->GetTreeView()->DeleteChildren(Instruction.nTreeItem);
for(CMipsTestEngine::OutputsType::iterator itOutput(Engine.GetOutputsBegin());
itOutput != Engine.GetOutputsEnd(); itOutput++)
{
@ -259,7 +269,7 @@ void CTestEngineWnd::RefreshInstructionList()
}
}
void CTestEngineWnd::OnItemDblClick()
void CTestEngineWnd::ProcessListEvent(ListMessageHandlerType Handler)
{
Win32::CTreeView* pTreeView(m_pInstructionList->GetTreeView());
HTREEITEM nItem(pTreeView->GetSelection());
@ -283,11 +293,23 @@ void CTestEngineWnd::OnItemDblClick()
const INSTRUCTION::TestCaseType& TestCase(itTestCase->second);
Handler(&Instruction, &TestCase);
}
else
{
//Instruction
}
}
void CTestEngineWnd::OnItemDblClick(const INSTRUCTION* pInstruction, const INSTRUCTION::TestCaseType* pTestCase)
{
if(pTestCase != NULL)
{
try
{
CMipsTestEngine Engine(("./tests/" + Instruction.sName + ".xml").c_str());
CMipsTestEngine::CValueSet* pInput(Engine.GetInput(TestCase.first));
CMipsTestEngine::CInstance* pInstance(Engine.GetInstance(TestCase.second));
CMipsTestEngine Engine(("./tests/" + pInstruction->sName + ".xml").c_str());
CMipsTestEngine::CValueSet* pInput(Engine.GetInput(pTestCase->first));
CMipsTestEngine::CInstance* pInstance(Engine.GetInstance(pTestCase->second));
if((pInput != NULL) && (pInstance != NULL))
{
@ -311,3 +333,44 @@ void CTestEngineWnd::OnItemDblClick()
//Instruction
}
}
void CTestEngineWnd::OnListSelChange(const INSTRUCTION* pInstruction, const INSTRUCTION::TestCaseType* pTestCase)
{
if(pTestCase != NULL)
{
try
{
CMipsTestEngine Engine(("./tests/" + pInstruction->sName + ".xml").c_str());
CMipsTestEngine::CValueSet* pInput(Engine.GetInput(pTestCase->first));
CMipsTestEngine::CValueSet* pOutput(Engine.GetOutput(pTestCase->first, pTestCase->second));
CMipsTestEngine::CInstance* pInstance(Engine.GetInstance(pTestCase->second));
if((pInput != NULL) && (pInstance != NULL) && (pOutput != NULL))
{
tstring sText;
for(CMipsTestEngine::CValueSet::ValueIterator itValue(pInput->GetValuesBegin());
itValue != pInput->GetValuesEnd(); itValue++)
{
sText += string_cast<tstring>(itValue->GetString()) + _T("\r\n");
}
sText += _T("\r\n") + algorithm::trim_copy(string_cast<tstring>(pInstance->GetSource())) + _T("\r\n\r\n");
for(CMipsTestEngine::CValueSet::ValueIterator itValue(pOutput->GetValuesBegin());
itValue != pOutput->GetValuesEnd(); itValue++)
{
sText += string_cast<tstring>(itValue->GetString()) + _T("\r\n");
}
m_pDescriptionEdit->SetText(sText.c_str());
}
}
catch(const exception& Exception)
{
m_pDescriptionEdit->SetText(
(_T("Error occured while trying to assemble the test case: \r\n\r\n") +
string_cast<tstring>(Exception.what())).c_str());
}
}
}

View File

@ -4,6 +4,7 @@
#include "DebuggerChildWnd.h"
#include "win32/ColumnTreeView.h"
#include "win32/Button.h"
#include "win32/Edit.h"
#include "win32/Layouts.h"
#include "../MipsTestEngine.h"
#include <map>
@ -34,6 +35,7 @@ private:
};
typedef std::map<unsigned int, INSTRUCTION> InstructionByIdMapType;
typedef boost::function<void (const INSTRUCTION*, const INSTRUCTION::TestCaseType*)> ListMessageHandlerType;
void TestAll();
void Test(INSTRUCTION&);
@ -41,9 +43,12 @@ private:
void RefreshLayout();
void RefreshInstructionMap();
void RefreshInstructionList();
void OnItemDblClick();
void ProcessListEvent(ListMessageHandlerType);
void OnItemDblClick(const INSTRUCTION*, const INSTRUCTION::TestCaseType*);
void OnListSelChange(const INSTRUCTION*, const INSTRUCTION::TestCaseType*);
Framework::Win32::CColumnTreeView* m_pInstructionList;
Framework::Win32::CEdit* m_pDescriptionEdit;
Framework::Win32::CButton* m_pTestAllButton;
Framework::CVerticalLayout m_Layout;
InstructionByIdMapType m_InstructionsById;

View File

@ -46,8 +46,8 @@
</ValueSet>
<ValueSet InputId="1" InstanceId="2">
<Register Name="T0" Value0="0x00000000" />
<Register Name="T1" Value0="0xFFFF7FFF" Value1="0xFFFFFFFF" />
<Register Name="T0" Value0="0x00000001" />
<Register Name="T1" Value0="0xFFFF8001" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="0" InstanceId="3">

34
tests/LUI.xml Normal file
View File

@ -0,0 +1,34 @@
<Test>
<Inputs>
<ValueSet InputId="0">
<Register Name="T0" Value0="0xFFFF0256" />
</ValueSet>
</Inputs>
<Instances>
<Instance Id="0">
LUI T0, 0x0800
</Instance>
<Instance Id="1">
LUI T0, 0x8000
</Instance>
</Instances>
<Outputs>
<ValueSet InputId="0" InstanceId="0">
<Register Name="T0" Value0="0x08000000" />
</ValueSet>
<ValueSet InputId="0" InstanceId="1">
<Register Name="T0" Value0="0x80000000" Value1="0xFFFFFFFF" />
</ValueSet>
</Outputs>
</Test>

View File

@ -0,0 +1,64 @@
<Test>
<Inputs>
<ValueSet InputId="0">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0xDEADBEEF" Value1="0xFFFFFFFF" />
</ValueSet>
</Inputs>
<Instances>
<Instance Id="0">
SLL T1, T0, 0
</Instance>
<Instance Id="1">
SLL T1, T0, 4
</Instance>
<Instance Id="2">
SLL T1, T0, 8
</Instance>
<Instance Id="3">
SLL T1, T0, 16
</Instance>
<Instance Id="4">
SLL T1, T0, 32
</Instance>
</Instances>
<Outputs>
<ValueSet InputId="0" InstanceId="0">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0x808080FF" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="0" InstanceId="1">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0x08080FF0" />
</ValueSet>
<ValueSet InputId="0" InstanceId="2">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0x8080FF00" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="0" InstanceId="3">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0x80FF0000" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="0" InstanceId="4">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0x808080FF" Value1="0xFFFFFFFF" />
</ValueSet>
</Outputs>
</Test>

73
tests/SRA.xml Normal file
View File

@ -0,0 +1,73 @@
<Test>
<Inputs>
<ValueSet InputId="0">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0xDEADBEEF" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="1">
<Register Name="T0" Value0="0x008080FF" />
<Register Name="T1" Value0="0xDEADBEEF" Value1="0xFFFFFFFF" />
</ValueSet>
</Inputs>
<Instances>
<Instance Id="0">
SRA T1, T0, 0
</Instance>
<Instance Id="1">
SRA T1, T0, 4
</Instance>
<Instance Id="2">
SRA T1, T0, 8
</Instance>
<Instance Id="3">
SRA T1, T0, 16
</Instance>
<Instance Id="4">
SRA T1, T0, 32
</Instance>
</Instances>
<Outputs>
<ValueSet InputId="0" InstanceId="0">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0x808080FF" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="0" InstanceId="1">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0xF808080F" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="0" InstanceId="2">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0xFF808080" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="0" InstanceId="3">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0xFFFF8080" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="0" InstanceId="4">
<Register Name="T0" Value0="0x808080FF" Value1="0xFFFFFFFF" />
<Register Name="T1" Value0="0x808080FF" Value1="0xFFFFFFFF" />
</ValueSet>
<ValueSet InputId="1" InstanceId="3">
<Register Name="T0" Value0="0x008080FF" />
<Register Name="T1" Value0="0x00000080" />
</ValueSet>
</Outputs>
</Test>