Как написать "||" состояние в рис c -V? - PullRequest
1 голос
/ 06 марта 2020

Например, в C

if (a == 0 || a == b) return 0;

Я не знаю точно, как написать несколько условий в Ris c -v. Не могли бы вы, ребята, помочь мне разобраться?

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Это шире, чем 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 операнды, за которыми следует условная ветвь для обозначения на равных или не равных в зависимости от ситуации.

1 голос
/ 06 марта 2020

Просто чтобы прояснить: RIS C -V уже имеет несколько доступных C компиляторов (примеры включают G CC, LLVM и IAR), так что вы можете взять существующий код C и скомпилировать его для RIS C -V так же, как и для других целей, таких как ARM.

Если ваш вопрос действительно больше о том, как написать что-то подобное в сборке RIS C -V, что-то подобное может сработать (при условии, что находится в регистре a0, а b в a1):

  beqz a0, is_true;    # Jump to the is_true label if a == 0
  beq a0, a1, is_true; # Jump to the is_true label if a == b
  j is_false;          # Jump to the is_false label to continue the function
is_true:
  mv a0, x0;           # Load 0 into the return value register (x0 is hard-wired 0)
  ret;
is_false:
  # Continue the function...
...