2010-12-01 4 views
0

J'ai un problème et je n'arrive pas à en prendre la tête, alors j'espérais que quelqu'un puisse m'aider.Fragment ARB Si/Else

J'écris un compilateur pour miniGLSL, et jusqu'ici tout va bien. Je suis au point où j'ai besoin de sortie vers un programme de fragment ARB, mais le problème est que l'ARB que je dois cibler ne supporte pas le branchement. (Vous trouverez une liste complète des instructions prises en charge ici http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html). Pour simuler if/else, j'ai utilisé le programme CMP comme suit (en supposant que 0 ou plus = true, sinon, false. // représente les commentaires comme # provoque un mauvais formatage ici):

if (a < b) 
    a = 1 + 1; 
    if (f < g) 
    c = 2 + 3; 
else 
    if (h < i) 
    b = 1 + 2; 
    else 
    d = 2 + 3; 

en fragment ARB:

TEMP cond1, cond2, cond3, tempvar1, tempvar2, tempvar3, tempvar4, a, b, c, d, e, f, g; 
//TOP IF 
//condition a < b 
SLT a, b, cond1; 
SUB cond1, 1.0, cond1; 

//Assign if true 
ADD 1.0, 1.0, tempvar1; 
CMP cond1, a, tempvar1, a; 

//Condition f < g 
SLT f, g, cond2; 
SUB cond2, 1.0, cond2; 
//if top level if was false, assign false, otherwise assign it to itself 
CMP cond1, -1.0, cond2, cond2; 
//Assignment 
ADD 2.0, 3.0, tempvar2; 
CMP cond2, c, tempvar2, c; 

//TOP ELSE 
//if h < i 
SLT h, i, cond2; 
SUB cond2, 1.0, cond2; 
//If top level if was true, make false 
CMP cond1, cond2, -1.0, cond2; 
CMP cond2, tempvar3, b, b; 
//Else 
//if top level if was true, and previous if was false, make true 

C'est sur le point où je reçois avant que je réalise mon code va commencer à vraiment laid. Chaque niveau de if/else va introduire des comparaisons continuellement empilées, et en plus, le dernier nécessite de réévaluer cond2, ou d'utiliser un autre registre. Je sais que je fais probablement quelque chose de mal ici, mais je ne sais pas quoi. J'ai essayé d'utiliser des compteurs, j'ai essayé d'ajouter le résultat des étapes précédentes du bloc if/else, anding, oring, etc. mais je ne trouve pas de bonne solution pour convertir les blocs if/else en assembly ARB qui ne fonctionne pas. t sur des piles de plus en plus grandes d'instructions CMP. Quelqu'un a-t-il une idée sur la façon de rendre cela plus simple afin que mon compilateur puisse le faire par programmation? Je ne suis pas inquiet pour l'optimisation à ce stade, je veux juste que ça marche.

Merci

Répondre

0

prennent csc467 à l'Université de Toronto parce que si vous êtes im dans votre classe lol.

Donc, c'est ainsi que je pense que cela devrait être mis en œuvre, j'ai juste pensé à ce sujet, donc je ne sais pas si son corrext.Exemple: si (a < b) a = 1 + 1; si (f < g) c = 2 + 3; sinon si (h < i) b = 1 + 2; sinon d = 2 + 3;

et de ce que je lis ici http://www.cs.uaf.edu/~olawlor/ref/gl/glfp/ vous pouvez retourner le signe d'une entrée, mais si ce ne est pas le cas, mon idée est des ordures

firstIf:

// calculer état SLT a, b , condition1; // calcule l'expression 1 + 1 cela ne modifie aucun des registres ADD 1, 1, temp;

cmp -état, temp, a, a // si la condition était vrai - (condition) = -1 // si vous stockez 1 + 1 dans un autre que vous amassez dans un

secondIf:

// calculer la condition SLT f, g, condition2;

// maintenant parce que vous aviez previus vous CONDITION1 besoin de les ajouter ensemble si les deux sont vrais // ne puis exécutez la morue

TEMP combinedCon1; TEMP temp2 = {2,0}; ADD condition1, condition2, combinedCon1;
SGE combinedCon1, temp2, combinedCon1 // si les deux subexpresiions additionnés == 2 // puis une autre 0

// calculer 2 + 3 ADD 2, 3, temp; // effectuer une affectation si combineCon1 == 1 CMP -combineCon1, temp, c, c;

// maintenant, vous pouvez faire d'autre avec l'instruction CMP suivent donc mêmes étapes que interchanger quelques choses,

donc par exemple si vous avez (« autre a = 2 »); son CMP-condition1, a, temp, a; au lieu de CMP-condition1, temp, a, a;

// si nous espérons que cela fonctionne si chaque fois que vous avez une autre condition imbriquée vous devez & & eux et utiliser le résultat dans une instruction CMP ..

Je pense que cela devrait fonctionner, pas sûr

Questions connexes