fn w32 $area(w64 %0) {
  @entry0
    reserve %1 20 4;
    blit %1 %0 20;
    jmp @arm1;
  @arm1
    load w8 %2 %1 0;
    br.eq w8 %2 0 @case2 @arm3;
  @case2
    add w64 %3 %1 4;
    sload w32 %4 %3 0;
    sload w32 %5 %3 4;
    sload w32 %6 %3 8;
    add w32 %7 %4 %5;
    add w32 %8 %7 %6;
    ret %8;
  @arm3
    load w8 %9 %1 0;
    br.eq w8 %9 1 @case4 @arm5;
  @case4
    add w64 %10 %1 4;
    sload w32 %11 %10 0;
    sload w32 %12 %10 4;
    add w64 %13 %10 8;
    sload w32 %14 %13 0;
    sload w32 %15 %13 4;
    add w32 %16 %11 %12;
    mul w32 %17 %14 %15;
    add w32 %18 %16 %17;
    ret %18;
  @arm5
    jmp @case6;
  @case6
    ret 0;
}

fn w32 $partial(w64 %0) {
  @entry0
    reserve %1 20 4;
    blit %1 %0 20;
    jmp @arm1;
  @arm1
    load w8 %2 %1 0;
    br.eq w8 %2 0 @case2 @arm3;
  @case2
    add w64 %3 %1 4;
    sload w32 %4 %3 8;
    sload w32 %5 %3 0;
    sload w32 %6 %3 4;
    add w32 %7 %5 %6;
    add w32 %8 %7 %4;
    ret %8;
  @arm3
    load w8 %9 %1 0;
    br.eq w8 %9 1 @case4 @arm5;
  @case4
    add w64 %10 %1 4;
    sload w32 %11 %10 0;
    add w64 %12 %10 8;
    sload w32 %13 %12 0;
    add w64 %14 %10 8;
    sload w32 %15 %14 4;
    mul w32 %16 %13 %15;
    add w32 %17 %11 %16;
    ret %17;
  @arm5
    jmp @case6;
  @case6
    ret -1;
}

fn w32 $withPlaceholder(w64 %0) {
  @entry0
    reserve %1 20 4;
    blit %1 %0 20;
    jmp @arm1;
  @arm1
    load w8 %2 %1 0;
    br.eq w8 %2 0 @case2 @arm3;
  @case2
    add w64 %3 %1 4;
    sload w32 %4 %3 0;
    sload w32 %5 %3 8;
    add w32 %6 %4 %5;
    ret %6;
  @arm3
    load w8 %7 %1 0;
    br.eq w8 %7 1 @case4 @arm5;
  @case4
    add w64 %8 %1 4;
    add w64 %9 %8 8;
    sload w32 %10 %9 0;
    sload w32 %11 %9 4;
    mul w32 %12 %10 %11;
    ret %12;
  @arm5
    jmp @case6;
  @case6
    ret 0;
}

fn w32 $main() {
  @entry0
    reserve %0 20 4;
    store w8 0 %0 0;
    reserve %1 8 4;
    store w32 3 %1 0;
    store w32 4 %1 4;
    add w64 %2 %0 4;
    blit %2 %1 8;
    store w32 5 %0 12;
    reserve %3 20 4;
    store w8 1 %3 0;
    reserve %4 16 4;
    reserve %5 8 4;
    store w32 1 %5 0;
    store w32 2 %5 4;
    blit %4 %5 8;
    reserve %6 8 4;
    store w32 10 %6 0;
    store w32 20 %6 4;
    add w64 %7 %4 8;
    blit %7 %6 8;
    add w64 %8 %3 4;
    blit %8 %4 16;
    call w32 %9 $area(%0);
    br.eq w32 %9 12 @assert.ok2 @assert.fail1;
  @assert.fail1
    unreachable;
  @assert.ok2
    call w32 %10 $area(%3);
    br.eq w32 %10 203 @assert.ok4 @assert.fail3;
  @assert.fail3
    unreachable;
  @assert.ok4
    reserve %11 20 4;
    store w8 2 %11 0;
    call w32 %12 $area(%11);
    br.eq w32 %12 0 @assert.ok6 @assert.fail5;
  @assert.fail5
    unreachable;
  @assert.ok6
    call w32 %13 $partial(%0);
    br.eq w32 %13 12 @assert.ok8 @assert.fail7;
  @assert.fail7
    unreachable;
  @assert.ok8
    call w32 %14 $partial(%3);
    br.eq w32 %14 201 @assert.ok10 @assert.fail9;
  @assert.fail9
    unreachable;
  @assert.ok10
    reserve %15 20 4;
    store w8 2 %15 0;
    call w32 %16 $partial(%15);
    br.eq w32 %16 -1 @assert.ok12 @assert.fail11;
  @assert.fail11
    unreachable;
  @assert.ok12
    call w32 %17 $withPlaceholder(%0);
    br.eq w32 %17 8 @assert.ok14 @assert.fail13;
  @assert.fail13
    unreachable;
  @assert.ok14
    call w32 %18 $withPlaceholder(%3);
    br.eq w32 %18 200 @assert.ok16 @assert.fail15;
  @assert.fail15
    unreachable;
  @assert.ok16
    reserve %19 20 4;
    store w8 2 %19 0;
    call w32 %20 $withPlaceholder(%19);
    br.eq w32 %20 0 @assert.ok18 @assert.fail17;
  @assert.fail17
    unreachable;
  @assert.ok18
    ret 0;
}
