如何转换"或"到SPARC组装?

时间:2017-01-26 08:00:57

标签: assembly sparc

我试图将以下行转换为SPARC程序集(使用否定逻辑):

if (i < a || i > b) {...}

但我一直坚持如何转换&#34;或&#34;按位或在SPARC中。我无法找到有用的文件来转换它。有人可以帮忙吗?谢谢。

(假设i位于$l0a位于$l1b位于$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指令之间?在使用否定逻辑时,这对我来说非常混乱。

2 个答案:

答案 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 < acond2 := i > b(谨防否定)。
所以它相当于if (i < a && i > b){ ... }

重点在于,cond1 || cond2如果cond1为假,则不构成分离,并不意味着分离是错误的,另一种情况可能是真的。 析取和连接运算符的absorption law反映在跳转方面的实现上。

在我的代码中,我没有指定评估的短路方面。可以提前评估条件(无短路)或仅在需要时(短路)评估条件。