When using vanilla ARB_v_p, the proprietary driver will squish both the available ADDRESS regs into the first hardware reg in the X and Y components.
To use an address reg as an index into consts, the CONST_SRC is set to (const_base + offset) and INDEX_CONST is set.
It is similar for inputs, INPUT_SRC is set to the offset value and INDEX_INPUT is set.
To access the second address reg use ADDR_REG_SELECT_1. A particular component of the address regs is selected with ADDR_SWZ.
Only one address register can be accessed per instruction, but you may use the address reg as an index into both consts and inputs in the same instruction as long as the swizzles also match.
Conditional execution of an instruction is enabled by setting COND_TEST_ENABLE, and selecting the condition which will allow the test to pass with COND_{FL,LT,...}. It is possible to swizzle the values in the condition register, which allows for testing against an individual component.
Conditional branching is achieved by using the condition tests described above. There doesn't appear to be dedicated looping instructions, but this can be done using a temp reg + conditional branching.
Subroutines may be uploaded before the main program itself, but the first executed instruction is determined by the PROGRAM_START_ID FIFO command.