我有一个问题,我似乎不能理解它,所以我希望这里有人能帮我解决。
我正在为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块、ARB、on等前几个阶段的结果,但我找不到一个好的解决方案来将if/else块转换为ARB片段汇编,这对于越来越大的CMP语句堆栈来说并不是真正的解决方案。有没有人知道如何让它变得更简单,这样我的编译器就能以编程的方式输出它?在这一点上,我并不太担心优化,我只想让它正常工作。
谢谢
发布于 2010-12-02 13:17:59
如果你是班上的同学,你会在密歇根大学学习csc467。
所以这就是我认为应该如何实现的,我只是考虑了一下,所以不确定它是否正确。
例如:如果(a < b) a=1+1,如果(f < g) c=2+3,否则(h < i) b=1+2,否则d=2+ 3;
从我在这里读到的,http://www.cs.uaf.edu/~olawlor/ref/gl/glfp/,你可以翻转输入的符号,但如果不是这样,那么我的想法就是垃圾
firstIf:
//计算条件SLT a,b,condition1;
//计算表达式条件它不会改变任何寄存器加1 ,1,temp;cmp -condition,temp,a,a //如果条件为真-( 1+1 )= -1 <0 //因此您将条件存储在1+1中,否则将a存储在
secondIf:
//计算条件SLT f,g,condition2;
//现在,因为您有以前condition1,所以如果两者都为真,则需要将它们相加//然后才执行cod
临时combinedCon1;临时temp2 = {2.0};添加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;
//所以希望这能起作用,所以每次你有另一个嵌套的条件时,你必须&&它们,并在CMP指令中使用结果。
我想这应该行得通,我不确定
https://stackoverflow.com/questions/4330288
复制相似问题