Это шире, чем RIS C V - все языки ассемблера используют if-goto в качестве единственного условия.
If-goto используется в if
-then- else
операторах, for
, Циклы while
и do
и repeat
, а также для оценки &&
и ||
.
Операнды ||
могут быть разделены и работать по отдельности.
if ( a == 0 || a == b ) return 0;
можно перевести в форму if-goto следующим образом:
if ( a == 0 ) goto L1; // fall thru only if a!=0
if ( a != b ) goto L2; // fall thru only if a==b, branch if a!=b
L1:
return 0; // reaches here if either a==0 or else a==b
L2: // comes here if either a!=0 or else a!=b
Для соединения
if ( a == 0 && b == 0 ) return 0;
можно перевести в форму if-goto следующим образом:
if ( a != 0 ) goto L1; // fall thru only if a==0, branch if a!=0
if ( b != 0 ) goto L1; // fall thru only if b==0, branch if b!=0
return 0; // reaches here when both a==0 and b==0
L1: // comes here if either a!=0 or else b!=0
(Существуют, конечно, и другие возможные преобразования.)
Эти переводы в if-goto могут быть записаны довольно непосредственно в различных сборках. языки, используя сравнение и ветвление.
В RIS C V в приведенных выше переводах if-goto может использоваться инструкция равного ветвления (beq
) или неравного ветвления (bne
) с двумя операндами и label.
Для наборов команд, которые используют коды условий, мы пишем две инструкции, сравнение двух o операнды, за которыми следует условная ветвь для обозначения на равных или не равных в зависимости от ситуации.