bltu
lyszt.net охоплює bltu та інші інструкції RISC-V більш детально.
Формат кодування
Опис
bltu виконує те саме розгалуження, що й blt, але читає обидва регістри як беззнакові. Назва означає branch if less than, unsigned (розгалуження, якщо менше, беззнакове). Розгалуження відбувається, коли rs1 менше за rs2, причому обидва значення читаються як невід'ємні числа від 0 приблизно до 4 мільярдів. Сторінка blt описує саме розгалуження. Ця сторінка пояснює, чому беззнакове читання має власну інструкцію.
Ті самі 32 біти представляють різні числа залежно від того, чи старший біт читається як знак, чи як частина значення. blt читає біти як знакові, а bltu — як беззнакові, і ці два читання розходяться. Регістр з усіма бітами, встановленими в 1, для blt дорівнює -1, дуже малому значенню, а для bltu — найбільшому можливому значенню. Вибір неправильної інструкції дає неправильний результат без жодного повідомлення про помилку.
bltu підходить для всього, що не може бути від'ємним, наприклад для адрес пам'яті, розмірів, лічильників і позицій. Порівняння адрес зі знаковим blt зазнає невдачі, щойно адреса стає достатньо великою, щоб мати встановлений старший біт, оскільки знакове читання робить її від'ємною.
Посібник RISC-V зазначає ту саму перевірку діапазону. Знакову межу масиву можна перевірити одним bltu, оскільки будь-який від'ємний індекс порівнюється як більший за будь-яку невід'ємну межу.
Один bltu перевіряє, що індекс перебуває в діапазоні: не менше 0 і менше за розмір n.
bltu i, n, ok
Якщо i від'ємний, його беззнакове читання — дуже велике число, і перевірка не проходить, тож одне беззнакове порівняння вловлює і випадок завеликого значення, і від'ємний випадок.
Приклад
li t0, 1 li t1, -1 bltu t0, t1, done # t1 read as unsigned is huge, so jump to 'done'
