if_acmpne <label><label> is a label name. To define the location of the label, use the <label> name followed by a colon:
<label>:<label> then becomes associated the address of the following instruction. Labels can only be assigned one location in a method. On the other hand, a single <label> can be the target of multiple branch instructions.
Stack Before
Description After value1 ... value2 ...
if_acmpne pops the top two object references off the stack and compares them. If the two object references are not equal (i.e. if they refer to different objects), execution branches to the address (pc + branchoffset), where pc is the address of the if_acmpne opcode in the bytecode and branchoffset is a 16-bit signed integer parameter following the if_acmpne opcode in the bytecode. If the object references refer to the same object, execution continues at the next instruction.
If you are using Jasmin, branchoffset is computed for you from the address of <label>.
Example
aload_1 ; push the object reference in local variable 1 onto stack aload_2 ; push the object reference in local variable 2 onto stack if_acmpne Label ; if the two references on the stack differ, jump to Label return ; return if local variables 1 and 2 are the same object Label: ; execution continues here if local variables 1 and 2 refer to the different objectsBytecode
Type | Description |
u1 | if_acmpne opcode = 0xA6 (166) |
s2 | branchoffset |
if_icmpne, if_icmplt, if_icmpgt, if_icmple, if_icmpge
Notes
Addresses are measured in bytes from the start of the bytecode (i.e. address 0 is the first byte in the bytecode of the currently executing method).