ARB片段If / Else

时间:2010-12-01 23:42:32

标签: compiler-construction assembly compiler-theory

我有一个问题,我似乎无法绕过它,所以我希望有人可以帮助我。

我正在为miniGLSL编写一个编译器,到目前为止一直很好。我正处于需要输出到ARB片段程序的位置,但问题是,我必须定位的ARB不支持分支。 (可在此处http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html)找到支持说明的完整列表。

为了模拟if / else,我一直在使用CMP程序,如下所示(假设0或更大= true,否则,false。//表示注释为#会导致格式错误):

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

进入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

这是关于在我意识到我的代码开始变得非常难看之前我所处的位置。 if / else的每个级别将引入连续堆叠比较,此外,最后的其他要求我重新评估cond2,或使用另一个寄存器。我知道我可能在这里做错了,但我不确定是什么。我尝试过使用计数器,尝试添加if / else块前面阶段的结果,anding,oring等等但是我找不到一个很好的解决方案来解决如何将if / else块转换成ARB片段程序集的问题。确实在越来越多的CMP语句堆栈上。有没有人知道如何使这更简单,所以我的编译器可以以编程方式输出?我现在并不担心优化问题,我只想让它发挥作用。

由于

1 个答案:

答案 0 :(得分:0)

如果你是你的班级大声笑,

正在uoft引用csc467。

所以这就是我认为应该如何实现的,我只是考虑了它,所以不确定它的相关文件。

例如: if(a&lt; b)   a = 1 + 1;   如果(f

从我在这里阅读http://www.cs.uaf.edu/~olawlor/ref/gl/glfp/ 你可以翻转一个输入的符号,但如果不是这样,那么我的想法就是垃圾

firstIf:

//计算条件 SLT a,b,condition1;

//计算表达式1 + 1它不会改变任何寄存器 ADD 1,1,temp; cmp -condition,temp,a,a //如果condition为true - (condition)= -1&lt; 0                                 //所以你将1 + 1存储在一个

中存储a的其他地方

secondIf:

//计算条件 SLT f,g,condition2;

//现在,因为你有previus condition1,如果两者都是真的,你需要将它们加在一起 //然后才执行cod

TEMP combinedCon1; TEMP temp2 = {2.0}; ADD condition1,condition2,combinedCon1;
SGE combinedCon1,temp2,combinedCon1 //如果两个子表达式加在一起== 2 //那么1其他0

//计算2 + 3 ADD 2,3,temp;

//如果combineCon1 == 1,则执行赋值 CMP -combineCon1,temp,c,c;

//现在你可以用CMP指令做其他事情,所以按照相同的步骤只交换一些东西,

所以例如,如果你有(“否则a = 2”);它的CMP -condition1,a,temp,a; 而不是CMP -condition1,temp,a,a;

//所以希望这样可行,所以每当你有另一个嵌套条件时,你必须&amp;&amp;它们并在CMP指令中使用结果..

我认为这应该有用,不确定