rs1, rs2, labelif (rs1 < rs2) goto labelbltu is blt with one change: it compares the two values as unsigned. The name is branch if less than, unsigned. It jumps to the label when rs1 is below rs2 with both read as never-negative numbers (0 up to about 4 billion, no negatives). The blt page covers the branch itself; this page is about why the unsigned reading is a separate instruction.
The same 32 bits can mean two different numbers depending on whether the top bit is read as a negative sign or as part of the value. blt reads them as signed, bltu as unsigned, and the two genuinely disagree: a register whose bits are all 1s is -1 to blt (very small) but the largest possible value to bltu. Pick the wrong one and the comparison silently gives the wrong answer.
Use bltu for anything that cannot be negative: memory addresses, sizes, counts, positions. Comparing addresses with the signed blt is a classic hidden bug, because a large address has its top bit set and signed comparison mistakes it for negative.
There is a neat trick this enables. To check that an index is in range — at least 0 and below the size n — a single bltu i, n, ok does both at once. If i were negative, its unsigned reading would be enormous and fail the test automatically, so one unsigned comparison catches both the too-big and the negative cases.