// vim: set syntax=asm :

{{L}}non_linear:

{{L}}non_linear_loop_enter:
    sub     rdi,    40
{{L}}non_linear_loop:
    add     rdi,    40
    mov     rax,    [rdi]

    mov     r8, {{ jump_table | length }}
    cmp     rax, 0
    cmovl   rax, r8
    cmp     rax, {{ jump_table | length }}
    cmovg   rax, r8

{% if msvc %}
    lea     r8, [ offset {{L}}jmp_table ]
{% else %}
    lea     r8, [ rip + {{L}}jmp_table ]
{% endif %}
    movsxd  r9, dword ptr [ r8 + rax * 4 ]
    lea     r8, [ r8 + r9 ]
    jmp     r8

{{L}}jmp_table:
{% for j in jump_table %}
    {{long}}      {{L}}{{j}}-{{L}}jmp_table
{% endfor %}
    {{long}}      {{L}}unsupported-{{L}}jmp_table

{{L}}unsupported:
    mov     rax,    1
    jmp     {{L}}return


{{L}}done:
    mov     rax, 0
    jmp     {{L}}return

