首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARB片段If/Else

ARB片段If/Else
EN

Stack Overflow用户
提问于 2010-12-02 07:42:32
回答 1查看 532关注 0票数 0

我有一个问题,我似乎不能理解它,所以我希望这里有人能帮我解决。

我正在为miniGLSL编写一个编译器,到目前为止一切顺利。我需要输出到一个ARB片段程序,但问题是,我必须针对的ARB不支持分支。(支持的指令的完整列表可以在http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html中找到)。

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

代码语言:javascript
复制
if (a < b)
  a = 1 + 1;
  if (f < g)
    c = 2 + 3;
else
  if (h < i)
    b = 1 + 2;
  else
    d = 2 + 3;

转换为ARB片段:

代码语言:javascript
复制
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语句堆栈来说并不是真正的解决方案。有没有人知道如何让它变得更简单,这样我的编译器就能以编程的方式输出它?在这一点上,我并不太担心优化,我只想让它正常工作。

谢谢

EN

回答 1

Stack Overflow用户

发布于 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指令中使用结果。

我想这应该行得通,我不确定

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4330288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档