Computer instructions are normally executed sequentially. Sequence control instructions transfer execution to a different place in the program. They are used for implementing control structures, such as if statements and while statements, and subprograms.
There are two types of sequence control instructions.
| Instruction | Operation | |
|---|---|---|
| b | label | branch to label unconditionally |
| beq | Rs1, Rcs2, label | branch to label if Rs1 == Rcs2 |
| ble | Rs1, Rcs2, label | branch to label if Rs1 <= Rcs2 |
| blt | Rs1, Rcs2, label | branch to label if Rs1 < Rcs2 |
| bge | Rs1, Rcs2, label | branch to label if greater than or equal |
| bgt | Rs1, Rcs2, label | branch to label if Rs1 > Rcs2 |
| bne | Rs1, Rcs2, label | branch to label Rs1 != Rcs2 |
| beqz | Rs, label | branch to label if Rs == 0 |
| blez | Rs, label | branch to label if Rs <= 0 |
| bltz | Rs, label | branch to label if Rs < 0 |
| bgez | Rs, label | branch to label if Rs >= 0 |
| bgtz | Rs, label | branch to label if Rs > 0 |
| bnez | Rs, label | branch to label if Rs != 0 |
| bleu | Rs1, Rcs2, label | branch to label if Rs1 <= Rcs2 unsigned |
| bltu | Rs1, Rcs2, label | branch to label if Rs1 < Rcs2 unsigned |
| bgeu | Rs1, Rcs2, label | branch to label if Rs1 >= Rcs2 unsigned |
| bgtu | Rs1, Rcs2, label | branch to label if Rs1 > Rcs2 unsigned |
| bltzal | Rs, label | branch to label if Rs < 0 and link |
| bgezal | Rs, label | branch to label if Rs >= 0 and link |
| bc1t | label | branch to label if the FP coprocessor flag is true |
| bc1f | label | branch to label if the FP coprocessor flag is false |
The bltzal and bgezal instructions save the
address of the following instruction in $ra.
They can be used for conditional subprogram calls.
The bc1t and bc1f instructions test the
floating point coprocessor flag, which is set or cleared by floating
point compare instructions.
| Instruction | Operation | |
|---|---|---|
| b | label | branch to label unconditionally |
| beq | Rs1, Rcs2, label | branch to label if Rs1 == Rcs2 |
| ble | Rs1, Rcs2, label | branch to label if Rs1 <= Rcs2 |
| blt | Rs1, Rcs2, label | branch to label if Rs1 < Rcs2 |
| bge | Rs1, Rcs2, label | branch to label if Rs1 >= Rcs2 |
| bgt | Rs1, Rcs2, label | branch to label if Rs1 > Rcs2 |
| bne | Rs1, Rcs2, label | branch to label if Rs1 != Rcs2 |
| beqz | Rs, label | branch to label if Rs == 0 |
| blez | Rs, label | branch to label if Rs <= 0 |
| bltz | Rs, label | branch to label if Rs < 0 |
| bgez | Rs, label | branch to label if Rs >= 0 |
| bgtz | Rs, label | branch to label if Rs > 0 |
| bnez | Rs, label | branch to label if Rs != 0 |
| Instruction | Operation | |
|---|---|---|
| j | addr | unconditional jump |
| jr | Rtarg | unconditional jump |
| jal | addr | subprogram call |
| jalr | Rsave, Rtarg | subprogram call |
Rtarg indicates a register that contains the target address of a register jump. Subprogram returns are accomplished by using $ra for Rtarg.
Rsave indicates a register that receives the return address of a jalr instruction. This operand is optional. If it is omitted $ra receives the return address.