Я не уверен, что имею правильные результаты после кода RIS C -V - PullRequest
3 голосов
/ 08 января 2020

У меня есть этот код RIS C -V, и вопрос в том, что может быть значением в x2 в конце (мы не знаем, что в x1).

ori X2, X0, 0xFFF
slli X2, X2, 12
ori X2, X2, 0xFFF
slli X2, X2, 8
ori X2, X2, 0xFF
xor X2, X2, X1
addi X2, X2, 1
and X2, X2, X1 

у меня были следующие результаты (x2 после каждого шага):

x2= 111 111 111
x2= 111 111 111 000 000 000 000
x2= 111 111 111 000 111 111 111
x2= 100 011 111 111 100 000 000
x2(*)=100 011 111 111 100 111 111 
x2(final)= (X2`(*)X1+X2X1`+1)=X2`(*)X1

и у меня есть 2 вопроса:

  1. - это то, что я сделал правильно ?
  2. Что я могу получить из последней строки, если я не знаю X1?

1 Ответ

2 голосов
/ 08 января 2020

Первые пять инструкций просто заканчивают тем, что устанавливают x2 в 0xffffffff, поэтому вы можете заменить их одной инструкцией addi x2, zero, -1 или просто псевдоинструкцией li x2, -1.

Три последние инструкции: :

xor X2, X2, X1
addi X2, X2, 1
and X2, X2, X1 

Значение, присвоенное x2, равно ((x1 ^ x2) + 1) & x1 . Поскольку a ^ b эквивалентно ~ a & b | a & ~ b , тогда это выражение может быть выражено как ((~ x1 & x2 | x1 & ~ x2) + 1) & x1 .

Как уже объяснено выше, x2 на данный момент 0xffffffff - все - так, результат ~ x1 & x2 равен jus ~ x1 и x1 & ~ x2 - это все 0s . Выражение выше может быть затем упрощено до (~ x1 + 1) & x1 .

Подводя итог, x2 присваивается результат побитового и между x1 и его дополнением до двух . Последние три инструкции можно было бы заменить на:

neg x2, x1
and x2, x2, x1

Возможно, вы не знаете x1, но вы знаете, что x2 содержит, в конце, результат (~ x1 + 1) & x1 .

...