// vim: ft=arm

.non_linear:

.non_linear_loop_entry:
    sub     r0, #20

.non_linear_loop:
    add     r0, #20
    ldm     r0, { r2, r3, r4, r5, r6 }

    cmp     r2, #{{ jump_table | length }}
    movgt   r2, #{{ jump_table | length }}
    cmp     r2, #0
    movlt   r2, #{{ jump_table | length }}

    add     pc, pc, r2, LSL#2
    nop     // pc in Rn above is start of the add instruction + 8, hence a nop is needed
            // This is A32 asm, for T32/Thump2 use nop.w and b.w to avoid problems.
{% for j in jump_table %}
    b .{{j}}
{% endfor %}
    b .unsupported


.unsupported:
    mov         r0,     #1
    b           .return

.done:
    mov         r0,     #0
    b           .return

.clear:
{% for r in range(4, 16) %}
    veor    q{{r}}, q{{r}}, q{{r}}
{% endfor %}
    b           .non_linear_loop
