我试图将以下行转换为SPARC程序集(使用否定逻辑):
if (i < a || i > b) {...}
但我一直坚持如何转换&#34;或&#34;按位或在SPARC中。我无法找到有用的文件来转换它。有人可以帮忙吗?谢谢。
(假设i
位于$l0
,a
位于$l1
,b
位于$l2
)
编辑:
以下是我的尝试:
cmp %l0, %l1 ! compare i with a
bge end_if ! negative logic test to end if statement
nop
cmp %l0, %l2 ! compare i with b
ble end_if ! negative logic test to end if statement
nop
if:
/*do something*/
end_if:
/*statements*/
更具体的问题是如何使用&#34;或&#34;两个cmp
指令之间?在使用否定逻辑时,这对我来说非常混乱。
答案 0 :(得分:2)
您的代码:
cmp %l0, %l1 ! compare i with a
bge end_if ! negative logic test to end if statement
nop
cmp %l0, %l2 ! compare i with b
ble end_if ! negative logic test to end if statement
nop
if:
/*do something*/
end_if:
/*statements*/
是AND。必须满足这两个子条件才能达到“做某事”的代码。
(一些布尔逻辑可能有助于解释:!(a ^ b) = !a v !b
注意:组合操作会发生变化!)
对于OR,您必须使用不同的逻辑:
test condition1
jump_if_true doit
test condition2
jmp_if_true doit ; *1) this branch and
jmp dont_doit ; this jmp can be optimized
do_it:
/* do if-part */
jmp endif
dont_do_it
/* do else-part */
endif:
现在你可以优化最后2次跳转到一次
test condition1
jump_if_true doit
test condition2
jmp_if_not_true dont_doit ; inverted to remove the 2nd jump
doit:
/* do if-part */
jmp endif
dont_doit
/* do else-part */
endif:
答案 1 :(得分:1)
您可以轻松检查if (cond1 || cond2) { ... }
是否等同于
if (cond1) goto if_code
if (cond2) goto if_code
goto other_code
if_code:
...
other_code:
并且if (cond1 && cond2) { ... }
相当于
if ( ! cond1) goto other_code
if ( ! cond2) goto other_code
if_code:
...
other_code:
您的实施与第二种模式匹配cond1 := i < a
和cond2 := i > b
(谨防否定)。
所以它相当于if (i < a && i > b){ ... }
。
重点在于,cond1 || cond2
如果cond1
为假,则不构成分离,并不意味着分离是错误的,另一种情况可能是真的。
析取和连接运算符的absorption law反映在跳转方面的实现上。
在我的代码中,我没有指定评估的短路方面。可以提前评估条件(无短路)或仅在需要时(短路)评估条件。