Первые пять инструкций просто заканчивают тем, что устанавливают 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
- все 1с - так, результат ~ x1 & x2 равен jus ~ x1 и x1 & ~ x2 - это все 0s . Выражение выше может быть затем упрощено до (~ x1 + 1) & x1 .
Подводя итог, x2
присваивается результат побитового и между x1
и его дополнением до двух . Последние три инструкции можно было бы заменить на:
neg x2, x1
and x2, x2, x1
Возможно, вы не знаете x1
, но вы знаете, что x2
содержит, в конце, результат (~ x1 + 1) & x1 .