| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476 |
- #ifdef WIN32
- #pragma warning(disable:4786)
- #endif
- #include "vs1.0_inst.h"
- #include <stdio.h>
- #include <string>
- #include <map>
- #include <string.h>
- #include "nvparse_errors.h"
- #include "nvparse_externs.h"
- std::string vs10_transstring;
- #if 0
- VS10Reg::VS10Reg()
- {
- type = 0;
- index = 0;
- sign = 0;
- mask = 0;
- }
- VS10Reg::VS10Reg(const VS10Reg &r)
- {
- type = r.type;
- index = r.index;
- sign = r.sign;
- mask = r.mask;
- }
- VS10Reg& VS10Reg::operator=(const VS10Reg &r)
- {
- if ( this != &r )
- {
- type = r.type;
- index = r.index;
- sign = r.sign;
- mask = r.mask;
- }
- return *this;
- }
- #endif
- void VS10Reg::Init()
- {
- type = 0;
- index = -1;
- sign = 0;
- mask[0] = 'j';
- mask[1] = 'j';
- mask[2] = 'j';
- mask[3] = 'j';
- }
- int VS10Reg::ValidateIndex()
- {
- switch( type )
- {
- case TYPE_TEMPORARY_REG:
- if ( index < 0 || index > 11 ) return 0;
- else return 1;
- break;
- case TYPE_VERTEX_ATTRIB_REG:
- if ( index < 0 || index > 15 ) return 0;
- else return 1;
- break;
- case TYPE_ADDRESS_REG:
- if ( index != 0 ) return 0;
- else return 1;
- break;
- case TYPE_CONSTANT_MEM_REG:
- if ( index < 0 || index > 95 ) return 0;
- else return 1;
- break;
- case TYPE_CONSTANT_A0_REG:
- case TYPE_CONSTANT_A0_OFFSET_REG:
- return 1;
- break;
- case TYPE_POSITION_RESULT_REG:
- return 1;
- break;
- case TYPE_COLOR_RESULT_REG:
- if ( index < 0 || index > 1 ) return 0;
- else return 1;
- break;
- case TYPE_TEXTURE_RESULT_REG:
- if ( index < 0 || index > 3 ) return 0;
- else return 1;
- break;
- case TYPE_FOG_RESULT_REG:
- return 1;
- break;
- case TYPE_POINTS_RESULT_REG:
- return 1;
- break;
- default:
- errors.set( "VS10Reg::ValidateIndex() Internal Error: unknown register type\n" );
- return 1;
- }
- return 1;
- }
- void VS10Reg::Translate()
- {
- char str[16];
- if ( sign == -1 )
- vs10_transstring.append( "-" );
-
- switch ( type )
- {
- case TYPE_TEMPORARY_REG:
- sprintf( str, "R%d", index );
- vs10_transstring.append( str );
- break;
- case TYPE_VERTEX_ATTRIB_REG:
- sprintf( str, "v[%d]", index );
- vs10_transstring.append( str );
- break;
- case TYPE_ADDRESS_REG:
- sprintf( str, "A%d", index );
- vs10_transstring.append( str );
- break;
- case TYPE_CONSTANT_MEM_REG:
- sprintf( str, "c[%d]", index );
- vs10_transstring.append( str );
- break;
- case TYPE_CONSTANT_A0_REG:
- vs10_transstring.append( "c[ A0.x ]" );
- break;
- case TYPE_CONSTANT_A0_OFFSET_REG:
- sprintf( str, "c[ A0.x + %d ]", index );
- vs10_transstring.append( str );
- break;
- case TYPE_POSITION_RESULT_REG:
- vs10_transstring.append( "o[HPOS]" );
- break;
- case TYPE_COLOR_RESULT_REG:
- sprintf( str, "o[COL%d]", index );
- vs10_transstring.append( str );
- break;
- case TYPE_TEXTURE_RESULT_REG:
- sprintf( str, "o[TEX%d]", index );
- vs10_transstring.append( str );
- break;
- case TYPE_FOG_RESULT_REG:
- vs10_transstring.append( "o[FOGC]" );
- break;
- case TYPE_POINTS_RESULT_REG:
- vs10_transstring.append( "o[PSIZ]" );
- break;
- default:
- errors.set( "VS10Reg::Translate() Internal Error: unknown register type\n" );
- }
- if ( mask[0] != 0 )
- {
- str[0] = '.';
- strncpy( str+1, mask, 4 );
- str[5] = 0;
- vs10_transstring.append( str );
- }
- }
- VS10Inst::~VS10Inst()
- {
- if (comment != NULL ) delete [] comment;
- }
- VS10Inst::VS10Inst()
- {
- line = -1;
- instid = -1;
- dst.Init();
- src[0].Init();
- src[1].Init();
- src[2].Init();
- comment = NULL;
- }
- VS10Inst::VS10Inst( int currline )
- {
- line = currline;
- instid = -1;
- dst.Init();
- src[0].Init();
- src[1].Init();
- src[2].Init();
- comment = NULL;
- }
- VS10Inst::VS10Inst( const VS10Inst &inst )
- {
- line = inst.line;
- instid = inst.instid;
- dst = inst.dst;
- src[0] = inst.src[0];
- src[1] = inst.src[1];
- src[2] = inst.src[2];
- if ( inst.comment == NULL )
- comment = NULL;
- else
- {
- comment = new char[strlen(inst.comment)+1];
- strcpy( comment, inst.comment );
- }
- }
- VS10Inst& VS10Inst::operator=(const VS10Inst &inst)
- {
- if ( this != &inst )
- {
- line = inst.line;
- instid = inst.instid;
- dst = inst.dst;
- src[0] = inst.src[0];
- src[1] = inst.src[1];
- src[2] = inst.src[2];
- if ( inst.comment == NULL )
- comment = NULL;
- else
- {
- comment = new char[strlen(inst.comment)+1];
- strcpy( comment, inst.comment );
- }
- }
- return *this;
- }
- VS10Inst::VS10Inst(int currline, int inst)
- {
- line = currline;
- instid = inst;
- dst.Init();
- src[0].Init();
- src[1].Init();
- src[2].Init();
- comment = NULL;
- }
- VS10Inst::VS10Inst(int currline, int inst, char *cmt)
- {
- line = currline;
- instid = inst;
- dst.Init();
- src[0].Init();
- src[1].Init();
- src[2].Init();
- comment = cmt;
- }
- VS10Inst::VS10Inst(int currline, int inst, VS10Reg dreg, VS10Reg src0)
- {
- line = currline;
- instid = inst;
- dst = dreg;
- src[0] = src0;
- src[1].Init();
- src[2].Init();
- comment = NULL;
- }
- VS10Inst::VS10Inst(int currline, int inst, VS10Reg dreg, VS10Reg src0, VS10Reg src1)
- {
- line = currline;
- instid = inst;
- dst = dreg;
- src[0] = src0;
- src[1] = src1;
- src[2].Init();
- comment = NULL;
- }
- VS10Inst::VS10Inst(int currline, int inst, VS10Reg dreg, VS10Reg src0, VS10Reg src1, VS10Reg src2)
- {
- line = currline;
- instid = inst;
- dst = dreg;
- src[0] = src0;
- src[1] = src1;
- src[2] = src2;
- comment = NULL;
- }
- void VS10Inst::Validate( int &vsflag )
- {
- // Handle comments, noops, and newlines.
- if ( instid == VS10_COMMENT || instid == VS10_NOP || instid == -1 ) return;
- // Handle the header case.
- if ( instid == VS10_HEADER )
- {
- if ( vsflag == 0 )
- {
- vsflag = 1;
- return;
- }
- else
- {
- char temp[128];
- sprintf( temp, "(%d) Error: vs.1.0 token already encountered\n", line );
- errors.set( temp );
- return;
- }
- }
- // Validate register indices are valid.
- ValidateRegIndices();
- // Verify destination masking is valid.
- ValidateDestMask();
- // Verify source swizzling is valid.
- ValidateSrcMasks();
- // Verify destination register is writable.
- ValidateDestWritable();
- // Verify source registers are readable.
- ValidateSrcReadable();
- // Verify not reading from multiple vertex attributes or constants
- ValidateReadPorts();
- }
- void VS10Inst::ValidateRegIndices()
- {
- char temp[256];
- int result;
- // Destination register.
- result = dst.ValidateIndex();
- if ( !result )
- {
- sprintf( temp, "(%d) Error: destination register index out of range\n", line );
- errors.set( temp );
- }
- // Source register.
- result = src[0].ValidateIndex();
- if ( !result )
- {
- sprintf( temp, "(%d) Error: source register index out of range\n", line );
- errors.set( temp );
- }
- switch( instid )
- {
- // Vector operations.
- case VS10_MOV:
- case VS10_LIT:
- break;
- // Unary operations.
- case VS10_FRC:
- break;
- // Scalar operations.
- case VS10_EXP:
- case VS10_EXPP:
- case VS10_LOG:
- case VS10_LOGP:
- case VS10_RCP:
- case VS10_RSQ:
- break;
-
- // Binary operations.
- case VS10_ADD:
- case VS10_DP3:
- case VS10_DP4:
- case VS10_DST:
- case VS10_SGE:
- case VS10_SLT:
- case VS10_SUB:
- case VS10_MAX:
- case VS10_MIN:
- case VS10_MUL:
- result = src[1].ValidateIndex();
- if ( !result )
- {
- sprintf( temp, "(%d) Error: second source register index out of range\n", line );
- errors.set( temp );
- }
- break;
- case VS10_M3X2:
- case VS10_M3X3:
- case VS10_M3X4:
- case VS10_M4X3:
- case VS10_M4X4:
- {
- result = src[1].ValidateIndex();
- if ( !result )
- {
- sprintf( temp, "(%d) Error: second source register index out of range\n", line );
- errors.set( temp );
- }
- int orig;
- orig = src[1].index;
- switch( instid )
- {
- case VS10_M3X2:
- src[1].index = src[1].index + 1;
- break;
- case VS10_M3X3:
- case VS10_M4X3:
- src[1].index = src[1].index + 2;
- break;
- case VS10_M3X4:
- case VS10_M4X4:
- src[1].index = src[1].index + 3;
- break;
- }
- result = src[1].ValidateIndex();
- src[1].index = orig;
- if ( !result )
- {
- sprintf( temp, "(%d) Error: macro expansion produces source register index out of range\n", line );
- errors.set( temp );
- }
- }
- break;
- // Trinary operations.
- case VS10_MAD:
- result = src[1].ValidateIndex();
- if ( !result )
- {
- sprintf( temp, "(%d) Error: second source register index out of range\n", line );
- errors.set( temp );
- }
- result = src[2].ValidateIndex();
- if ( !result )
- {
- sprintf( temp, "(%d) Error: third source register index out of range\n", line );
- errors.set( temp );
- }
- break;
- default:
- errors.set( "VS10Inst::ValidateRegIndices() Internal Error: unknown instruction type\n" );
- break;
- }
- }
- void VS10Inst::ValidateDestMask()
- {
- char temp[256];
- typedef std::map<char, int> MyMap;
- typedef MyMap::value_type MyPair;
- static const MyPair pairs[] =
- {
- MyPair('x',1),
- MyPair('y',2),
- MyPair('z',3),
- MyPair('w',4),
- };
- static const MyMap swizzleMap(pairs, pairs+(sizeof(pairs)/sizeof(pairs[0])));
- if ( dst.mask[0] == 0 ) return;
- int i = 1;
- while ( i < 4 && dst.mask[i] != 0 )
- {
- MyMap::const_iterator lastMaskIt = swizzleMap.find(dst.mask[i-1]);
- MyMap::const_iterator curMaskIt = swizzleMap.find(dst.mask[i]);
- if (lastMaskIt == swizzleMap.end() || curMaskIt == swizzleMap.end() ||
- lastMaskIt->second >= curMaskIt->second)
- // if ( dst.mask[i-1] >= dst.mask[i] )
- {
- char mask[5];
- strncpy( mask, dst.mask, 4 );
- mask[4] = 0;
- sprintf( temp, "(%d) Error: destination register has invalid mask: %s\n", line, mask );
- errors.set( temp );
- break;
- }
- i++;
- }
- }
- void VS10Inst::ValidateSrcMasks()
- {
- char temp[256];
- char mask[5];
- int len;
- int i;
- switch( instid )
- {
- // Vector operations.
- case VS10_MOV:
- case VS10_LIT:
- strncpy( mask, src[0].mask, 4 );
- mask[4] = 0;
- len = strlen( mask );
- if ( len != 1 )
- {
- for ( i = len; i < 4; i++ )
- src[0].mask[i] = src[0].mask[len-1];
- }
- break;
- // Unary operations.
- case VS10_FRC:
- strncpy( mask, src[0].mask, 4 );
- mask[4] = 0;
- len = strlen( mask );
- if ( len != 1 )
- {
- for ( i = len; i < 4; i++ )
- src[0].mask[i] = src[0].mask[len-1];
- }
- break;
- // Scalar operations.
- case VS10_EXP:
- case VS10_EXPP:
- case VS10_LOG:
- case VS10_LOGP:
- strncpy( mask, src[0].mask, 4 );
- mask[4] = 0;
- len = strlen( mask );
- if( len != 1 )
- {
- sprintf( temp, "(%d) Error: source register has invalid mask: %s\n", line, mask );
- errors.set( temp );
- }
- break;
- case VS10_RCP:
- case VS10_RSQ:
- strncpy( mask, src[0].mask, 4 );
- mask[4] = 0;
- len = strlen( mask );
- if( len != 0 && len != 1 )
- {
- sprintf( temp, "(%d) Error: source register has invalid mask: %s\n", line, mask );
- errors.set( temp );
- }
- if ( len == 0 )
- {
- strcpy( src[0].mask, "w" );
- }
- break;
-
- // Binary operations.
- case VS10_ADD:
- case VS10_DP3:
- case VS10_DP4:
- case VS10_DST:
- case VS10_SGE:
- case VS10_SLT:
- case VS10_SUB:
- case VS10_M3X2:
- case VS10_M3X3:
- case VS10_M3X4:
- case VS10_M4X3:
- case VS10_M4X4:
- case VS10_MAX:
- case VS10_MIN:
- case VS10_MUL:
- strncpy( mask, src[0].mask, 4 );
- mask[4] = 0;
- len = strlen( mask );
- if ( len != 0 && len != 1 )
- {
- for ( i = len; i < 4; i++ )
- src[0].mask[i] = src[0].mask[len-1];
- }
- strncpy( mask, src[1].mask, 4 );
- mask[4] = 0;
- len = strlen( mask );
- if ( len != 0 && len != 1 )
- {
- for ( i = len; i < 4; i++ )
- src[1].mask[i] = src[1].mask[len-1];
- }
- break;
- // Trinary operations.
- case VS10_MAD:
- strncpy( mask, src[0].mask, 4 );
- mask[4] = 0;
- len = strlen( mask );
- if ( len != 0 && len != 1 )
- {
- for ( i = len; i < 4; i++ )
- src[0].mask[i] = src[0].mask[len-1];
- }
- strncpy( mask, src[1].mask, 4 );
- mask[4] = 0;
- len = strlen( mask );
- if ( len != 0 && len != 1 )
- {
- for ( i = len; i < 4; i++ )
- src[1].mask[i] = src[1].mask[len-1];
- }
- strncpy( mask, src[2].mask, 4 );
- mask[4] = 0;
- len = strlen( mask );
- if ( len != 0 && len != 1 )
- {
- for ( i = len; i < 4; i++ )
- src[2].mask[i] = src[2].mask[len-1];
- }
- break;
- default:
- errors.set( "VS10Inst::ValidateSrcMasks() Internal Error: unknown instruction type\n" );
- break;
- }
- }
- void VS10Inst::ValidateDestWritable()
- {
- char temp[256];
- switch ( dst.type )
- {
- case TYPE_TEMPORARY_REG:
- case TYPE_POSITION_RESULT_REG:
- case TYPE_COLOR_RESULT_REG:
- case TYPE_TEXTURE_RESULT_REG:
- case TYPE_FOG_RESULT_REG:
- case TYPE_POINTS_RESULT_REG:
- break;
- case TYPE_VERTEX_ATTRIB_REG:
- case TYPE_CONSTANT_MEM_REG:
- case TYPE_CONSTANT_A0_REG:
- case TYPE_CONSTANT_A0_OFFSET_REG:
- sprintf( temp, "(%d) Error: destination register is not writable\n", line );
- errors.set( temp );
- break;
- case TYPE_ADDRESS_REG:
- if ( instid != VS10_MOV )
- {
- sprintf( temp, "(%d) Error: destination register is not writable using this instruction\n", line );
- errors.set( temp );
- }
- break;
- default:
- errors.set( "VS10Inst::ValidateDestWritable() Internal Error: unknown register type\n" );
- }
- if ( instid == VS10_FRC && dst.type != TYPE_TEMPORARY_REG )
- {
- sprintf( temp, "(%d) Error: destination register must be a temporary register\n", line );
- errors.set( temp );
- }
- }
- void VS10Inst::ValidateSrcReadable()
- {
- char temp[256];
- // Source register.
- switch( src[0].type )
- {
- case TYPE_TEMPORARY_REG:
- case TYPE_VERTEX_ATTRIB_REG:
- case TYPE_CONSTANT_MEM_REG:
- case TYPE_CONSTANT_A0_REG:
- case TYPE_CONSTANT_A0_OFFSET_REG:
- break;
- case TYPE_ADDRESS_REG:
- case TYPE_POSITION_RESULT_REG:
- case TYPE_COLOR_RESULT_REG:
- case TYPE_TEXTURE_RESULT_REG:
- case TYPE_FOG_RESULT_REG:
- case TYPE_POINTS_RESULT_REG:
- sprintf( temp, "(%d) Error: source register is not readable\n", line );
- errors.set( temp );
- break;
- default:
- errors.set( "VS10Inst::ValidateSrcReadable() Internal Error: unknown register type\n" );
- }
-
- switch( instid )
- {
- // Vector operations.
- case VS10_MOV:
- case VS10_LIT:
- break;
- // Unary operations.
- case VS10_FRC:
- break;
- // Scalar operations.
- case VS10_EXP:
- case VS10_EXPP:
- case VS10_LOG:
- case VS10_LOGP:
- case VS10_RCP:
- case VS10_RSQ:
- break;
-
- // Binary operations.
- case VS10_ADD:
- case VS10_DP3:
- case VS10_DP4:
- case VS10_DST:
- case VS10_SGE:
- case VS10_SLT:
- case VS10_SUB:
- case VS10_M3X2:
- case VS10_M3X3:
- case VS10_M3X4:
- case VS10_M4X3:
- case VS10_M4X4:
- case VS10_MAX:
- case VS10_MIN:
- case VS10_MUL:
- switch( src[1].type )
- {
- case TYPE_TEMPORARY_REG:
- case TYPE_VERTEX_ATTRIB_REG:
- case TYPE_CONSTANT_MEM_REG:
- case TYPE_CONSTANT_A0_REG:
- case TYPE_CONSTANT_A0_OFFSET_REG:
- break;
- case TYPE_ADDRESS_REG:
- case TYPE_POSITION_RESULT_REG:
- case TYPE_COLOR_RESULT_REG:
- case TYPE_TEXTURE_RESULT_REG:
- case TYPE_FOG_RESULT_REG:
- case TYPE_POINTS_RESULT_REG:
- sprintf( temp, "(%d) Error: second source register is not readable\n", line );
- errors.set( temp );
- break;
- default:
- errors.set( "VS10Inst::ValidateSrcReadable() Internal Error: unknown register type\n" );
- }
- break;
- // Trinary operations.
- case VS10_MAD:
- switch( src[1].type )
- {
- case TYPE_TEMPORARY_REG:
- case TYPE_VERTEX_ATTRIB_REG:
- case TYPE_CONSTANT_MEM_REG:
- case TYPE_CONSTANT_A0_REG:
- case TYPE_CONSTANT_A0_OFFSET_REG:
- break;
- case TYPE_ADDRESS_REG:
- case TYPE_POSITION_RESULT_REG:
- case TYPE_COLOR_RESULT_REG:
- case TYPE_TEXTURE_RESULT_REG:
- case TYPE_FOG_RESULT_REG:
- case TYPE_POINTS_RESULT_REG:
- sprintf( temp, "(%d) Error: second source register is not readable\n", line );
- errors.set( temp );
- break;
- default:
- errors.set( "VS10Inst::ValidateSrcReadable() Internal Error: unknown register type\n" );
- }
- switch( src[2].type )
- {
- case TYPE_TEMPORARY_REG:
- case TYPE_VERTEX_ATTRIB_REG:
- case TYPE_CONSTANT_MEM_REG:
- case TYPE_CONSTANT_A0_REG:
- case TYPE_CONSTANT_A0_OFFSET_REG:
- break;
- case TYPE_ADDRESS_REG:
- case TYPE_POSITION_RESULT_REG:
- case TYPE_COLOR_RESULT_REG:
- case TYPE_TEXTURE_RESULT_REG:
- case TYPE_FOG_RESULT_REG:
- case TYPE_POINTS_RESULT_REG:
- sprintf( temp, "(%d) Error: third source register is not readable\n", line );
- errors.set( temp );
- break;
- default:
- errors.set( "VS10Inst::ValidateSrcReadable() Internal Error: unknown register type\n" );
- }
- break;
- default:
- errors.set( "VS10Inst::ValidateSrcReadable() Internal Error: unknown register type\n" );
- break;
- }
- }
- void VS10Inst::ValidateReadPorts()
- {
- int constidx[3];
- int attribidx[3];
- int i;
- int acount;
- int ccount;
- char temp[256];
- switch( instid )
- {
- // Vector operations.
- case VS10_MOV:
- case VS10_LIT:
- break;
- // Unary operations.
- case VS10_FRC:
- break;
- // Scalar operations.
- case VS10_EXP:
- case VS10_EXPP:
- case VS10_LOG:
- case VS10_LOGP:
- case VS10_RCP:
- case VS10_RSQ:
- break;
-
- // Binary operations.
- case VS10_ADD:
- case VS10_DP3:
- case VS10_DP4:
- case VS10_DST:
- case VS10_SGE:
- case VS10_SLT:
- case VS10_SUB:
- case VS10_M3X2:
- case VS10_M3X3:
- case VS10_M3X4:
- case VS10_M4X3:
- case VS10_M4X4:
- case VS10_MAX:
- case VS10_MIN:
- case VS10_MUL:
- acount = 0;
- ccount = 0;
- for ( i = 0; i < 2; i++ )
- {
- switch( src[i].type )
- {
- case TYPE_VERTEX_ATTRIB_REG:
- attribidx[acount] = src[i].index;
- acount++;
- break;
- case TYPE_CONSTANT_MEM_REG:
- constidx[ccount] = src[i].index;
- ccount++;
- break;
- case TYPE_CONSTANT_A0_REG:
- constidx[ccount] = 100 + src[i].index;
- ccount++;
- break;
- case TYPE_CONSTANT_A0_OFFSET_REG:
- constidx[ccount] = 200 + src[i].index;
- ccount++;
- break;
- case TYPE_TEMPORARY_REG:
- case TYPE_ADDRESS_REG:
- case TYPE_POSITION_RESULT_REG:
- case TYPE_COLOR_RESULT_REG:
- case TYPE_TEXTURE_RESULT_REG:
- case TYPE_FOG_RESULT_REG:
- case TYPE_POINTS_RESULT_REG:
- break;
- default:
- errors.set( "VS10Inst::ValidateReadPorts() Internal Error: unknown register type\n" );
- }
- }
- if ( acount == 2 )
- {
- if ( attribidx[0] != attribidx[1] )
- {
- sprintf( temp, "(%d) Error: multiple unique attribute registers accessed in this instruction\n", line );
- errors.set( temp );
- }
- }
- else if ( ccount == 2 )
- {
- if ( constidx[0] != constidx[1] )
- {
- sprintf( temp, "(%d) Error: multiple unique constant registers accessed in this instruction\n", line );
- errors.set( temp );
- }
- }
- break;
- // Trinary operations.
- case VS10_MAD:
- acount = 0;
- ccount = 0;
- for ( i = 0; i < 3; i++ )
- {
- switch( src[i].type )
- {
- case TYPE_VERTEX_ATTRIB_REG:
- attribidx[acount] = src[i].index;
- acount++;
- break;
- case TYPE_CONSTANT_MEM_REG:
- constidx[ccount] = src[i].index;
- ccount++;
- break;
- case TYPE_CONSTANT_A0_REG:
- constidx[ccount] = 100 + src[i].index;
- ccount++;
- break;
- case TYPE_CONSTANT_A0_OFFSET_REG:
- constidx[ccount] = 200 + src[i].index;
- ccount++;
- break;
- case TYPE_TEMPORARY_REG:
- case TYPE_ADDRESS_REG:
- case TYPE_POSITION_RESULT_REG:
- case TYPE_COLOR_RESULT_REG:
- case TYPE_TEXTURE_RESULT_REG:
- case TYPE_FOG_RESULT_REG:
- case TYPE_POINTS_RESULT_REG:
- break;
- default:
- errors.set( "VS10Inst::ValidateReadPorts() Internal Error: unknown register type\n" );
- }
- }
- if ( acount == 3 )
- {
- if ( attribidx[0] != attribidx[1] || attribidx[1] != attribidx[2] )
- {
- sprintf( temp, "(%d) Error: multiple unique attribute registers accessed in this instruction\n", line );
- errors.set( temp );
- }
- }
- else if ( acount == 2 )
- {
- if ( attribidx[0] != attribidx[1] )
- {
- sprintf( temp, "(%d) Error: multiple unique attribute registers accessed in this instruction\n", line );
- errors.set( temp );
- }
- }
- else if ( ccount == 3 )
- {
- if ( constidx[0] != constidx[1] || constidx[1] != constidx[2] )
- {
- sprintf( temp, "(%d) Error: multiple unique constant registers accessed in this instruction\n", line );
- errors.set( temp );
- }
- }
- else if ( ccount == 2 )
- {
- if ( constidx[0] != constidx[1] )
- {
- sprintf( temp, "(%d) Error: multiple unique constant registers accessed in this instruction\n", line );
- errors.set( temp );
- }
- }
- break;
- default:
- errors.set( "VS10Inst::ValidateSrcReadable() Internal Error: unknown register type\n" );
- break;
- }
- }
- int VS10Inst::Translate()
- {
- int flag;
- int ninstr = 0;
- #if DEBUGGING_PURPOSES
- char mystr[16];
- if ( instid == VS10_HEADER )
- {
- sprintf( mystr, "%d:\tvs.1.0 (skip)\n", line );
- vs10_transstring.append( mystr );
- return 0;
- }
- sprintf( mystr, "%d:\t", line );
- vs10_transstring.append( mystr );
- #endif
- switch( instid )
- {
- case VS10_ADD:
- vs10_transstring.append( "ADD " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- ninstr = 1;
- break;
- case VS10_DP3:
- vs10_transstring.append( "DP3 " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- ninstr = 1;
- break;
- case VS10_DP4:
- vs10_transstring.append( "DP4 " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- ninstr = 1;
- break;
- case VS10_DST:
- vs10_transstring.append( "DST " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- ninstr = 1;
- break;
- case VS10_EXP:
- vs10_transstring.append( "EXP " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- ninstr = 1;
- break;
- case VS10_EXPP:
- vs10_transstring.append( "EXP " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- ninstr = 1;
- break;
- case VS10_FRC:
- char temp[128];
- sprintf( temp, "(%d) Error: FRC built-in macro not yet supported.\n", line );
- errors.set( temp );
- ninstr = 0;
- break;
- case VS10_LIT:
- vs10_transstring.append( "LIT " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- ninstr = 1;
- break;
- case VS10_LOG:
- vs10_transstring.append( "LOG " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- ninstr = 1;
- break;
- case VS10_LOGP:
- vs10_transstring.append( "LOG " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- ninstr = 1;
- break;
- case VS10_M3X2:
- case VS10_M3X3:
- case VS10_M3X4:
- if ( dst.mask[0] != 0 )
- {
- ninstr = 0;
- int i = 0;
- while ( i < 4 && dst.mask[i] != 0 )
- {
- if ( dst.mask[i] == 'x' )
- {
- char oldval;
- vs10_transstring.append( "DP3 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".x, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- if ( dst.mask[i] == 'y' )
- {
- char oldval;
- int oldindex;
- vs10_transstring.append( "DP3 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".y, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 1;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- if ( dst.mask[i] == 'z' && (instid == VS10_M3X3 || instid == VS10_M3X4) )
- {
- char oldval;
- int oldindex;
- vs10_transstring.append( "DP3 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".z, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 2;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- if ( dst.mask[i] == 'w' && instid == VS10_M3X4 )
- {
- char oldval;
- int oldindex;
- vs10_transstring.append( "DP3 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".w, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 3;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- i++;
- }
- return ninstr;
- }
- else
- {
- ninstr = 0;
- char oldval;
- int oldindex;
- vs10_transstring.append( "DP3 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".x, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- vs10_transstring.append( ";\n" );
- ninstr++;
- vs10_transstring.append( "DP3 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".y, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 1;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- if ( instid == VS10_M3X3 || instid == VS10_M3X4 )
- {
- vs10_transstring.append( "DP3 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".z, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 2;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- if ( instid == VS10_M3X4 )
- {
- vs10_transstring.append( "DP3 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".w, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 3;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- return ninstr;
- }
- break;
- case VS10_M4X3:
- case VS10_M4X4:
- if ( dst.mask[0] != 0 )
- {
- ninstr = 0;
- int i = 0;
- while ( i < 4 && dst.mask[i] != 0 )
- {
- if ( dst.mask[i] == 'x' )
- {
- char oldval;
- vs10_transstring.append( "DP4 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".x, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- if ( dst.mask[i] == 'y' )
- {
- char oldval;
- int oldindex;
- vs10_transstring.append( "DP4 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".y, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 1;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- if ( dst.mask[i] == 'z' )
- {
- char oldval;
- int oldindex;
- vs10_transstring.append( "DP4 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".z, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 2;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- if ( dst.mask[i] == 'w' && instid == VS10_M4X4 )
- {
- char oldval;
- int oldindex;
- vs10_transstring.append( "DP4 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".w, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 3;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- i++;
- }
- return ninstr;
- }
- else
- {
- ninstr = 0;
- char oldval;
- int oldindex;
- vs10_transstring.append( "DP4 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".x, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- vs10_transstring.append( ";\n" );
- ninstr++;
- vs10_transstring.append( "DP4 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".y, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 1;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- vs10_transstring.append( "DP4 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".z, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 2;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- if ( instid == VS10_M4X4 )
- {
- vs10_transstring.append( "DP4 " );
- oldval = dst.mask[0];
- dst.mask[0] = 0;
- dst.Translate();
- dst.mask[0] = oldval;
- vs10_transstring.append( ".w, " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- oldindex = src[1].index;
- src[1].index = src[1].index + 3;
- src[1].Translate();
- src[1].index = oldindex;
- vs10_transstring.append( ";\n" );
- ninstr++;
- }
- return ninstr;
- }
- break;
- case VS10_MAD:
- vs10_transstring.append( "MAD " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- vs10_transstring.append( ", " );
- src[2].Translate();
- ninstr = 1;
- break;
- case VS10_MAX:
- vs10_transstring.append( "MAX " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- ninstr = 1;
- break;
- case VS10_MIN:
- vs10_transstring.append( "MIN " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- ninstr = 1;
- break;
- case VS10_MOV:
- if ( dst.type == TYPE_ADDRESS_REG )
- vs10_transstring.append( "ARL " );
- else
- vs10_transstring.append( "MOV " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- ninstr = 1;
- break;
- case VS10_MUL:
- vs10_transstring.append( "MUL " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- ninstr = 1;
- break;
- case VS10_NOP:
- return 0;
- break;
- case VS10_RCP:
- vs10_transstring.append( "RCP " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- ninstr = 1;
- break;
- case VS10_RSQ:
- vs10_transstring.append( "RSQ " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- ninstr = 1;
- break;
- case VS10_SGE:
- vs10_transstring.append( "SGE " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- ninstr = 1;
- break;
- case VS10_SLT:
- vs10_transstring.append( "SLT " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- src[1].Translate();
- ninstr = 1;
- break;
- case VS10_SUB:
- vs10_transstring.append( "ADD " );
- dst.Translate();
- vs10_transstring.append( ", " );
- src[0].Translate();
- vs10_transstring.append( ", " );
- flag = src[1].sign;
- if ( flag == -1 ) src[1].sign = 1;
- else src[1].sign = -1;
- src[1].Translate();
- src[1].sign = flag;
- ninstr = 1;
- break;
- case VS10_COMMENT:
- vs10_transstring.append( comment );
- return 0;
- break;
- case VS10_HEADER:
- //vs10_transstring.append( "!!VP1.0\n" );
- return 0;
- break;
- case -1:
- vs10_transstring.append( "\n" );
- return 0;
- default:
- errors.set( "VS10Inst::Translate() Internal Error: unknown instruction type\n" );
- }
- vs10_transstring.append( ";\n" );
- return ninstr;
- }
|