fn w32 $dispatch(w64 %0) {
  @entry0
    reserve %1 12 4;
    blit %1 %0 12 4;
    jmp @arm1;
  @arm1
    load w8 %2 %1 0;
    br.eq w8 %2 0 @case2 @arm3;
  @case2
    add w64 %3 %1 4;
    load w8 %4 %3 0;
    br.eq w8 %4 0 @nest4 @arm3;
  @arm3
    load w8 %6 %1 0;
    br.eq w8 %6 0 @case6 @arm7;
  @nest4
    sload w32 %5 %3 4;
    jmp @case5;
  @case5
    ret %5;
  @case6
    add w64 %7 %1 4;
    load w8 %8 %7 0;
    br.eq w8 %8 1 @nest8 @arm7;
  @arm7
    load w8 %11 %1 0;
    br.eq w8 %11 0 @case10 @arm11;
  @nest8
    sload w32 %9 %7 4;
    jmp @case9;
  @case9
    sub w32 %10 0 %9;
    ret %10;
  @case10
    add w64 %12 %1 4;
    load w8 %13 %12 0;
    br.eq w8 %13 2 @nest12 @arm11;
  @arm11
    load w8 %16 %1 0;
    br.eq w8 %16 0 @case14 @arm15;
  @nest12
    sload w32 %14 %12 4;
    jmp @case13;
  @case13
    mul w32 %15 %14 2;
    ret %15;
  @case14
    add w64 %17 %1 4;
    load w8 %18 %17 0;
    br.eq w8 %18 3 @nest16 @arm15;
  @arm15
    load w8 %21 %1 0;
    br.eq w8 %21 1 @case18 @arm19;
  @nest16
    sload w32 %19 %17 4;
    jmp @case17;
  @case17
    mul w32 %20 %19 3;
    ret %20;
  @case18
    add w64 %22 %1 4;
    load w8 %23 %22 0;
    br.eq w8 %23 0 @nest20 @arm19;
  @arm19
    load w8 %24 %1 0;
    br.eq w8 %24 1 @case22 @arm23;
  @nest20
    jmp @case21;
  @case21
    ret 100;
  @case22
    add w64 %25 %1 4;
    load w8 %26 %25 0;
    br.eq w8 %26 1 @nest24 @arm23;
  @arm23
    jmp @else26;
  @nest24
    jmp @case25;
  @case25
    ret 200;
  @else26
    ret 0;
}

fn w32 $moveOnly(w64 %0) {
  @entry0
    reserve %1 12 4;
    blit %1 %0 12 4;
    jmp @arm1;
  @arm1
    load w8 %2 %1 0;
    br.eq w8 %2 0 @case2 @arm3;
  @case2
    add w64 %3 %1 4;
    load w8 %4 %3 0;
    br.eq w8 %4 0 @nest4 @arm3;
  @arm3
    load w8 %7 %1 0;
    br.eq w8 %7 0 @case6 @arm7;
  @nest4
    sload w32 %5 %3 4;
    jmp @case5;
  @case5
    add w32 %6 %5 10;
    ret %6;
  @case6
    add w64 %8 %1 4;
    load w8 %9 %8 0;
    br.eq w8 %9 1 @nest8 @arm7;
  @arm7
    jmp @else10;
  @nest8
    sload w32 %10 %8 4;
    jmp @case9;
  @case9
    add w32 %11 %10 20;
    ret %11;
  @else10
    ret -1;
}

fn w32 $main() {
  @entry0
    reserve %0 12 4;
    store w8 0 %0 0;
    store w8 0 %0 4;
    store w32 5 %0 8;
    call w32 %1 $dispatch(%0);
    br.eq w32 %1 5 @assert.ok2 @assert.fail1;
  @assert.fail1
    unreachable;
  @assert.ok2
    reserve %2 12 4;
    store w8 0 %2 0;
    store w8 1 %2 4;
    store w32 3 %2 8;
    call w32 %3 $dispatch(%2);
    br.eq w32 %3 -3 @assert.ok4 @assert.fail3;
  @assert.fail3
    unreachable;
  @assert.ok4
    reserve %4 12 4;
    store w8 0 %4 0;
    store w8 2 %4 4;
    store w32 7 %4 8;
    call w32 %5 $dispatch(%4);
    br.eq w32 %5 14 @assert.ok6 @assert.fail5;
  @assert.fail5
    unreachable;
  @assert.ok6
    reserve %6 12 4;
    store w8 0 %6 0;
    store w8 3 %6 4;
    store w32 4 %6 8;
    call w32 %7 $dispatch(%6);
    br.eq w32 %7 12 @assert.ok8 @assert.fail7;
  @assert.fail7
    unreachable;
  @assert.ok8
    reserve %8 12 4;
    store w8 1 %8 0;
    store w8 0 %8 4;
    call w32 %9 $dispatch(%8);
    br.eq w32 %9 100 @assert.ok10 @assert.fail9;
  @assert.fail9
    unreachable;
  @assert.ok10
    reserve %10 12 4;
    store w8 1 %10 0;
    store w8 1 %10 4;
    call w32 %11 $dispatch(%10);
    br.eq w32 %11 200 @assert.ok12 @assert.fail11;
  @assert.fail11
    unreachable;
  @assert.ok12
    reserve %12 12 4;
    store w8 1 %12 0;
    store w8 2 %12 4;
    call w32 %13 $dispatch(%12);
    br.eq w32 %13 0 @assert.ok14 @assert.fail13;
  @assert.fail13
    unreachable;
  @assert.ok14
    reserve %14 12 4;
    store w8 2 %14 0;
    call w32 %15 $dispatch(%14);
    br.eq w32 %15 0 @assert.ok16 @assert.fail15;
  @assert.fail15
    unreachable;
  @assert.ok16
    reserve %16 12 4;
    store w8 0 %16 0;
    store w8 0 %16 4;
    store w32 5 %16 8;
    call w32 %17 $moveOnly(%16);
    br.eq w32 %17 15 @assert.ok18 @assert.fail17;
  @assert.fail17
    unreachable;
  @assert.ok18
    reserve %18 12 4;
    store w8 0 %18 0;
    store w8 1 %18 4;
    store w32 3 %18 8;
    call w32 %19 $moveOnly(%18);
    br.eq w32 %19 23 @assert.ok20 @assert.fail19;
  @assert.fail19
    unreachable;
  @assert.ok20
    reserve %20 12 4;
    store w8 0 %20 0;
    store w8 2 %20 4;
    store w32 1 %20 8;
    call w32 %21 $moveOnly(%20);
    br.eq w32 %21 -1 @assert.ok22 @assert.fail21;
  @assert.fail21
    unreachable;
  @assert.ok22
    reserve %22 12 4;
    store w8 2 %22 0;
    call w32 %23 $moveOnly(%22);
    br.eq w32 %23 -1 @assert.ok24 @assert.fail23;
  @assert.fail23
    unreachable;
  @assert.ok24
    ret 0;
}
